@hivecast/canvas (1.1.33)
Installation
@hivecast:registry=npm install @hivecast/canvas@1.1.33"@hivecast/canvas": "1.1.33"About this package
Canvas
HiveCast live-component canvas package: application.
The application header identifies Canvas but carries no duplicate action. An empty canvas offers Open Chat from the working surface when navigation is available.
Design direction: a compositional working surface
Owner: existing Canvas/application owner, joined with Shell context, renderer, language/session and source-domain owners.
Status: the following September 10 design elaboration is CANDIDATE, not a claim that a dynamic-document product is delivered. The manifest below describes the existing declared package surface; it is not proof of the new experience.
Source basis: documentation inspected at HiveCast-AI/hivecast-projects@9da8296c603d0ec25fd2dc9c723b8b24c9673613; no Canvas runtime or browser journey was executed for this documentation change.
Canvas can be a working context containing live component occurrences, authored notes, artifacts, exact native references, tools and qualified results. Chat may help construct or discuss that context; it need not be the primary workspace. A document/outline and a spatial canvas are possible presentations of a composition, not competing owners for its sources.
This aligns with the existing architectural graph model, projection contract and Director/Shell/workbench design. Keep those definitions at their existing homes; Canvas specializes their interaction, not their authority model.
The founder requested selective low-hanging assimilation from dynamic-document prior art, not a pivot to Embark or a new universal document platform. The source/reuse ledger and cleanup handoff (docs/architecture/research-custody/ARCHITECTURAL-PERSPECTIVES.md, removed in fae11e283) record the scope, evidence limits and deferred work. Similarity of direction is not proof that the current Canvas already implements the full experience, and no external code was imported or license-reviewed by this change.
Related exploratory journeys: pull an answer into the workspace, compare a design without rewinding the work, and keep the recipe and builds, not a running-instance snapshot. They develop this candidate direction through the existing Canvas/component owners, not a new document engine or a claim that these interactions are delivered.
Distinguish what is being edited
| Thing at hand | Competent owner / meaning |
|---|---|
| Authored note or explanation | Existing authoring/document owner; original prose is not necessarily a projection |
| Arrangement, focus, selection and occurrence state | Existing Canvas/application and Shell presentation responsibilities, explicitly allocated |
| Referenced Task, Selection, package or activation | Its existing native owner; a displayed copy does not acquire mutation authority |
| Query or report result | Qualified derived value with source pins, grain, coverage and derivation |
| Program and evaluation state | Existing language/invocation/session owner; no Canvas-specific interpreter |
| External change | Explicit typed command to the competent owner, with relevant revision/idempotency and receipt semantics |
A component's location on a canvas does not determine actor parentage, logical subject identity, release membership or physical placement. Recursively compose ordinary contexts and components, not the privileged root Shell. Two appearances can share a native source while retaining different occurrence identity and local view state.
Small capabilities worth reusing
Start with an authored note beside a native reference and an inspectable result. Gradually add a second presentation, a local parameter or a reusable computation only when it improves the real task. The person should not need to author a complete graph or schema before making a note.
A structured mention resolves to a native reference and declared source perspective, not a display label or a guessed NATS address. Ambiguous text remains informal or explicitly unresolved until bound. Suggested links and agent-generated prose are untrusted input, not authorization to call tools or admit effects.
A result stays usable as a structured, source-qualified value. A table, graph, narrative and headless agent operation consume that value; they do not reconstruct it by scraping each other's DOM. Embedding several isolated widgets is not by itself compositional dataflow. Cross-source combination needs published contracts, explicit adapters and qualified joins—not an assumed universal schema.
Use native deterministic operations where adequate. When evaluation is needed, reuse the existing canonical Omega/shared execution direction, exact library/artifact owners and admitted effects. Do not introduce a Document VM, another formula language, a second session daemon, or a mandatory Logos wrapper for a simple note. A graph value, the program over it and an admitted execution remain distinct.
AI can help explain, assemble or revise a useful tool. Routine filtering and recomputation need not require an inference on every interaction. Measure construction cost, reuse, errors and rework before claiming savings. Inline explanations of stale, unsupported or conflicted values can make a tool understandable without turning every action into chat; an explanation remains different from verified acceptance.
Temporal and effect policy
| Mode or action | Required interpretation |
|---|---|
| Pinned | Evaluate or present against a declared retained source basis |
| Live | Refresh authorized reads with freshness, coverage and subscription lifetime visible |
| What-if | Use explicit hypothetical inputs; never present the outcome as observed source state |
| Reopen | Restore the view and identify any unsupported retained state; not automatic replay of effects |
| Rerun | A separate admitted invocation with exact input and execution identity |
| Share/copy | Share the composition or add an occurrence under explicit policy; do not copy grants, credentials or source actors |
| Undo | Reverse authored/presentation edits where supported; external effect reversal requires its own admitted compensation |
A frozen decision record can sit beside a live comparison, but a historical receipt must not be rewritten using today's Selection or activation. Reading, pure recomputation, metered inference and mutation cannot all be one automatic refresh operation. Revoked access invalidates future reads/actions according to the enforcing owner's policy; caches and aggregates must not leak hidden source data. Renderer/program code retains its exact artifact and permitted-port constraints.
Bounded architecture review sheet
Optional next presentation slice, after the documentation packet is useful; not a new R1 gate or an active assignment. The existing Canvas/Shell owner must recheck implementation and custody before undertaking it. Do not dispatch a duplicate Director/Logos worker or reopen accepted increments.
Use an Inference/Selection review packet already produced by cleanup C1/C2 (docs/architecture/research-custody/ARCHITECTURAL-PERSPECTIVES.md, removed in fae11e283). First show one authored explanation, an exact native reference, one qualified result and two presentations of that same result. Keep all source operations read-only. An unavailable source should leave the note and native reference understandable, not silently substitute another provider or actor.
Walk the concrete interaction before adding a new test or abstraction, using the current owner's applicable development and proof rules. The visible acceptance is that selecting the same item in two presentations preserves native identity; changing to an activation explicitly changes grain; the reader can inspect source pins and coverage; pinned/live/what-if are distinguishable; and historical answerer attribution survives a current Selection change. An explicitly labeled fixture can demonstrate a view rule but cannot establish installed-product behavior.
Opening, closing, rearranging or duplicating the sheet must not invoke paid inference, restart/uninstall source actors or grant access. Do not map view removal blindly to the existing canvas.delete operation: inspect its native semantics and the exact target before choosing any binding. A later source-changing control requires separate scoped work and the existing owner-command, revision, idempotency, effect and reobservation contracts.
The first missing seam might be qualified headless results, exact reference binding, a renderer, or persistence of the note. Name the observed gap and reuse its existing owner; do not assume all are absent and build a new editor/runtime/store at once. General collaborative editing, template marketplaces, arbitrary executable documents and external prototype code assimilation remain deferred.
Commands
The browser surface exposes the complete shared component lifecycle. In addition to preview,
adoption and status, component.adoption.rollback reverses a committed adoption through the same
AdoptionSagaExecutor, and component.binding.restore cold-restores an exact frozen binding,
captured state and presentation attributes through ComponentSurfaceHost.resumeComponentBinding.
Neither operation introduces a Canvas-specific loader or adoption path.
Manifest convergence preserves a component's last successfully captured state when a later capture
is refused, but only while the binding revision and artifact digest are unchanged. The row keeps the
current refusal and marks the retained summary as last-known-good; a successful capture replaces it
and clears the marker. Adoption and rollback therefore cannot inherit state from a different artifact.
Manifest publication uses system.blackboard.state.compare-and-set with an opaque revision fence. A
Canvas tab must complete a verified read before it can publish; transport failure is not a missing
record. Concurrent tabs may leave one contender for the next convergence tick, but a stale write
cannot erase another tab's addition or replace a newer removal tombstone. During rolling upgrades,
an old tab's revisioned state.upsert is routed through the same fence so its edit is either saved or
kept for the next convergence pass; legacy unconditional manifest writes remain refused. The hosted blackboard keys
the same session and surface independently under each verified authority root.
While a local manifest change is waiting for that fenced write, Canvas keeps the plain-language status “Not saved yet. Keep this tab open.” visible and asks before the tab unloads. The status and unload guard clear only after the compare-and-set succeeds; a competing revision leaves both in place for the ordinary retry.
Cold restoration reopens that fenced Canvas manifest, then resolves the exact frozen artifact through the Matrix component byte source; it does not rebuild source or substitute a synthetic snapshot.
pnpm install
pnpm build
pnpm test
hive-pm validate .
Manifest
{
"schema": "matrix.package/v3",
"name": "@hivecast/canvas",
"version": "0.1.16",
"description": "Canvas — a live component surface: agent-authored components render, compose, and stay addressable on the bus",
"displayName": "Canvas",
"namespace": "applications.canvas",
"archetype": "application",
"root": {
"type": "CanvasRoot",
"export": "CanvasRoot",
"mount": "applications.canvas",
"displayName": "Canvas",
"description": "Application service and module provider",
"accepts": [
"component.describe",
"component.module.get",
"canvas.add",
"canvas.list",
"canvas.delete"
],
"emits": []
},
"runtime": {
"language": "typescript",
"entry": "dist/index.js",
"factory": {
"kind": "factory",
"export": "createStandaloneCanvas",
"instance": {
"id": "RUNTIME-CANVAS",
"class": "service",
"rootKind": "package-root",
"mount": "applications.canvas",
"autoStart": true
}
}
},
"components": [
{
"type": "CanvasPageElement",
"export": "CanvasPageElement",
"mount": "page",
"surface": "browser",
"accepts": [
"canvas.describe-surface"
],
"emits": [],
"displayName": "Canvas Page",
"description": "Application surface for canvas"
}
],
"browser": {
"entry": "dist/browser.js",
"elements": [
{
"tagName": "hivecast-canvas-page",
"component": "CanvasPageElement"
}
]
},
"interfaces": [
{
"interface": "canvas.application/v1",
"description": "Operations exported by the Canvas application.",
"actor": "CanvasRoot",
"operations": [
"component.describe",
"component.module.get",
"canvas.add",
"canvas.list",
"canvas.delete"
]
},
{
"interface": "canvas.surface/v1",
"description": "Controls the Canvas application surface.",
"actor": "CanvasPageElement",
"operations": [
"canvas.describe-surface"
]
}
],
"events": [],
"intents": [],
"configuration": {
"schema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"defaults": {}
},
"busAccess": {
"exports": [
{
"capability": "canvas.application",
"mount": "applications.canvas",
"interfaces": [
"canvas.application/v1",
"canvas.surface/v1"
],
"operations": [
"component.describe",
"component.module.get",
"canvas.add",
"canvas.list",
"canvas.delete",
"canvas.describe-surface"
],
"description": "Run and control the Canvas application."
}
],
"imports": []
},
"placement": {
"cardinality": "named-instance",
"tolerance": "same-authority",
"preferences": [],
"failover": "manual"
},
"lifecycle": {
"class": "session",
"startup": "auto",
"restartMaximum": "on-failure",
"supervision": {
"strategies": [
"one-for-one"
],
"maxRestarts": 5,
"withinMilliseconds": 60000,
"mayEscalate": true
}
},
"storage": {
"domains": [],
"durablePaths": []
},
"permissions": {
"fsPolicy": "none",
"network": false,
"subprocess": false,
"env": false
},
"webapp": {
"appName": "canvas",
"displayName": "Canvas",
"description": "Live component canvas — tell chat to build components here",
"routePrefix": "/apps/canvas",
"shells": [
"platform",
"edge"
],
"navigation": {
"group": "workspace",
"order": 26
},
"ui": {
"kind": "web-component",
"tagName": "hivecast-canvas-page",
"moduleId": "@hivecast/canvas@0.1.19/dist/browser.js",
"sha256": "sha256:963a00b745f105796ab31d77878beda7cb82c2f1b4dd613163ff1e182f27c52c"
},
"backingService": {
"mount": "applications.canvas",
"interface": "canvas.application/v1"
}
}
}
Application presentation
The application uses the shared @open-matrix/hivecast-brand/application-header
header with its name, description and icon from matrix.package.json. Existing
application actions keep their handlers; Console primary forms remain available
through console.submit. Colours, typography and layout tokens inherit the
ui-kit theme in both light and dark mode. New styles use --mx-* tokens;
pnpm check:application-styles prevents growth of remaining literal styles.
Dependencies
Dependencies
| ID | Version |
|---|---|
| @open-matrix/component-surface | 1.1.33 |
| @open-matrix/contracts | 1.1.33 |
| @open-matrix/core | 1.1.33 |
| @open-matrix/hivecast-brand | 1.1.33 |
Development Dependencies
| ID | Version |
|---|---|
| @open-matrix/browser-host | 1.1.33 |
| @open-matrix/hive-pm | 1.1.33 |
| @open-matrix/system-platform | 1.1.33 |
| @types/node | ^25.0.10 |
| esbuild | ^0.27.3 |
| tsx | ^4.15.6 |
| typescript | ^5.7.0 |