@hivecast/canvas (1.1.33)

Published 2026-10-24 11:38:17 +00:00 by hivecast-admin

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
Details
npm
2026-10-24 11:38:17 +00:00
2
latest
394 KiB
Assets (1)
Versions (20) View all
1.1.33 2026-10-24
1.1.32 2026-10-24
1.1.2 2026-09-22
1.1.1 2026-09-22
0.1.19 2026-09-22