pmx-canvas 0.8.2 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/extensions/pmx-canvas/runtime.json +1 -1
- package/.github/extensions/pmx-canvas/tools.json +601 -22
- package/CHANGELOG.md +59 -0
- package/Readme.md +131 -532
- package/dist/canvas/global.css +2724 -476
- package/dist/canvas/index.js +168 -107
- package/dist/canvas/mcp-app.html +2899 -596
- package/dist/json-render/index.js +20 -20
- package/dist/types/client/canvas/BarHint.d.ts +12 -2
- package/dist/types/client/canvas/BoardLinkDialog.d.ts +3 -1
- package/dist/types/client/canvas/BoardPinButton.d.ts +10 -0
- package/dist/types/client/canvas/BoardSwitcher.d.ts +1 -1
- package/dist/types/client/canvas/CanvasViewport.d.ts +1 -1
- package/dist/types/client/canvas/CommandBar.d.ts +3 -4
- package/dist/types/client/canvas/ConnectionBanner.d.ts +2 -1
- package/dist/types/client/canvas/ContextChip.d.ts +3 -0
- package/dist/types/client/canvas/CrossBoardReferences.d.ts +5 -0
- package/dist/types/client/canvas/EdgeLayer.d.ts +14 -3
- package/dist/types/client/canvas/EmptyState.d.ts +4 -4
- package/dist/types/client/canvas/HomeGraphView.d.ts +2 -0
- package/dist/types/client/canvas/HomeMapView.d.ts +1 -0
- package/dist/types/client/canvas/HomeReviewView.d.ts +6 -0
- package/dist/types/client/canvas/HomeView.d.ts +9 -7
- package/dist/types/client/canvas/KnowledgeDialog.d.ts +4 -0
- package/dist/types/client/canvas/LifecycleChrome.d.ts +5 -0
- package/dist/types/client/canvas/LifecycleFields.d.ts +7 -0
- package/dist/types/client/canvas/LifecyclePanel.d.ts +1 -0
- package/dist/types/client/canvas/MemoryInspector.d.ts +7 -0
- package/dist/types/client/canvas/NearPinLayer.d.ts +14 -0
- package/dist/types/client/canvas/NodeContextMark.d.ts +40 -7
- package/dist/types/client/canvas/RelationPresetsDialog.d.ts +4 -0
- package/dist/types/client/canvas/RelationsPanel.d.ts +4 -0
- package/dist/types/client/canvas/SessionPanel.d.ts +2 -0
- package/dist/types/client/canvas/canvas-area.d.ts +1 -1
- package/dist/types/client/canvas/graph-geometry.d.ts +27 -0
- package/dist/types/client/canvas/graph-model.d.ts +37 -0
- package/dist/types/client/canvas/memory-layout.d.ts +23 -0
- package/dist/types/client/canvas/use-chrome-height.d.ts +2 -0
- package/dist/types/client/canvas/use-focus-trap.d.ts +1 -0
- package/dist/types/client/canvas/use-memory-graph.d.ts +8 -0
- package/dist/types/client/canvas/use-pan-zoom.d.ts +4 -1
- package/dist/types/client/icons.d.ts +0 -10
- package/dist/types/client/nodes/AxStepControls.d.ts +1 -1
- package/dist/types/client/nodes/InlineMarkdownEditor.d.ts +4 -4
- package/dist/types/client/nodes/MarkdownNode.d.ts +5 -1
- package/dist/types/client/nodes/McpAppNode.d.ts +4 -4
- package/dist/types/client/nodes/viewer-runtime-state.d.ts +1 -1
- package/dist/types/client/state/boards-store.d.ts +81 -9
- package/dist/types/client/state/canvas-store.d.ts +14 -1
- package/dist/types/client/state/context-chip-store.d.ts +22 -0
- package/dist/types/client/state/context-status-store.d.ts +35 -0
- package/dist/types/client/state/human-store.d.ts +2 -1
- package/dist/types/client/state/intent-bridge.d.ts +11 -8
- package/dist/types/client/state/knowledge-store.d.ts +22 -0
- package/dist/types/client/state/near-pin-store.d.ts +44 -1
- package/dist/types/client/state/presence-store.d.ts +4 -4
- package/dist/types/client/state/presentation.d.ts +28 -0
- package/dist/types/client/state/relation-store.d.ts +10 -0
- package/dist/types/client/state/session-store.d.ts +41 -2
- package/dist/types/client/state/workspace-settings.d.ts +7 -0
- package/dist/types/client/types.d.ts +13 -1
- package/dist/types/client/utils/keyboard.d.ts +2 -0
- package/dist/types/client/utils/time-ago.d.ts +4 -0
- package/dist/types/mcp/context-uri-template.d.ts +3 -1
- package/dist/types/server/agent-presence.d.ts +10 -3
- package/dist/types/server/ax-context.d.ts +1 -1
- package/dist/types/server/canvas-db.d.ts +30 -7
- package/dist/types/server/canvas-operations.d.ts +24 -2
- package/dist/types/server/canvas-provenance.d.ts +22 -2
- package/dist/types/server/canvas-serialization.d.ts +2 -0
- package/dist/types/server/canvas-state.d.ts +93 -15
- package/dist/types/server/canvas-validation.d.ts +1 -1
- package/dist/types/server/context-brief.d.ts +94 -6
- package/dist/types/server/context-reads.d.ts +33 -7
- package/dist/types/server/edit-summary.d.ts +20 -0
- package/dist/types/server/index.d.ts +71 -10
- package/dist/types/server/knowledge-lifecycle.d.ts +221 -0
- package/dist/types/server/lifecycle-status.d.ts +10 -0
- package/dist/types/server/memory-graph.d.ts +9 -0
- package/dist/types/server/mutation-history.d.ts +2 -0
- package/dist/types/server/operations/ops/ax-shared.d.ts +1 -1
- package/dist/types/server/operations/ops/boards.d.ts +2 -1
- package/dist/types/server/operations/ops/lifecycle.d.ts +2 -0
- package/dist/types/server/operations/ops/memory-graph.d.ts +2 -0
- package/dist/types/server/operations/ops/nodes.d.ts +5 -0
- package/dist/types/server/operations/ops/query.d.ts +23 -0
- package/dist/types/server/operations/registry.d.ts +1 -0
- package/dist/types/server/placement.d.ts +7 -0
- package/dist/types/server/scope-fence.d.ts +2 -1
- package/dist/types/server/spatial-analysis.d.ts +6 -3
- package/dist/types/server/tour-control.d.ts +32 -0
- package/dist/types/server/wiki-links.d.ts +14 -0
- package/dist/types/server/workbench-auth.d.ts +2 -0
- package/dist/types/shared/agent-context.d.ts +2 -0
- package/dist/types/shared/agent-presence.d.ts +15 -12
- package/dist/types/shared/auto-arrange.d.ts +1 -0
- package/dist/types/shared/boards.d.ts +4 -4
- package/dist/types/shared/knowledge-lifecycle.d.ts +41 -0
- package/dist/types/shared/knowledge-presets.d.ts +6 -0
- package/dist/types/shared/lifecycle-status.d.ts +24 -0
- package/dist/types/shared/memory-graph.d.ts +53 -0
- package/dist/types/shared/relations.d.ts +68 -0
- package/dist/types/shared/semantic-attention.d.ts +2 -0
- package/dist/types/shared/tour.d.ts +38 -0
- package/dist/types/shared/workspace-settings.d.ts +11 -0
- package/docs/RELEASE.md +21 -3
- package/docs/adr-001-bun-only-runtime.md +7 -1
- package/docs/adr-002-shared-product-separate-runtimes.md +93 -0
- package/docs/api-reference.md +109 -0
- package/docs/ax-host-adapter-contract.md +1 -1
- package/docs/ax-state-contract.md +5 -4
- package/docs/cli.md +153 -15
- package/docs/demos/pmx-canvas-demo.mp4 +0 -0
- package/docs/design/AgentContext.dc.html +3 -3
- package/docs/design/BoardPins.dc.html +37 -22
- package/docs/design/Categories.dc.html +208 -0
- package/docs/design/CategoryEditor.dc.html +33 -0
- package/docs/design/Chrome.dc.html +52 -9
- package/docs/design/ContextChip.dc.html +224 -0
- package/docs/design/ContextChip600.dc.html +136 -0
- package/docs/design/EmptyState.dc.html +45 -0
- package/docs/design/Flows.dc.html +23 -1
- package/docs/design/HeaderMarks.dc.html +183 -0
- package/docs/design/Home.dc.html +19 -1
- package/docs/design/HomeGraph.dc.html +86 -202
- package/docs/design/HomeMap.dc.html +23 -1
- package/docs/design/HomeTeam.dc.html +32 -14
- package/docs/design/Lifecycle.dc.html +22 -0
- package/docs/design/Lifecycle600.dc.html +18 -0
- package/docs/design/LifecycleVariants.dc.html +157 -0
- package/docs/design/LinkAuthorship.dc.html +139 -0
- package/docs/design/LinksChanged.dc.html +203 -0
- package/docs/design/LinksOptions.dc.html +137 -0
- package/docs/design/LinksOptions600.dc.html +134 -0
- package/docs/design/NearPin.dc.html +9 -10
- package/docs/design/Pane600.dc.html +4 -3
- package/docs/design/Relations.dc.html +3 -2
- package/docs/design/Restore.dc.html +152 -0
- package/docs/design/SeeChange.dc.html +267 -0
- package/docs/design/Uses.dc.html +12 -6
- package/docs/design/canvas.json +146 -19
- package/docs/design.md +449 -16
- package/docs/environment.md +0 -1
- package/docs/evals/curation-effect.md +128 -0
- package/docs/http-api.md +459 -37
- package/docs/mcp.md +146 -18
- package/docs/node-types.md +58 -3
- package/docs/plans/design-gaps-2026-10-08.md +53 -0
- package/docs/plans/plan-009-tech-debt-backlog.md +379 -0
- package/docs/plans/plan-016-context-made-visible-wave-1.md +150 -5
- package/docs/plans/plan-017-knowledge-categories-and-lifecycle.md +175 -0
- package/docs/plans/plan-018-connected-memory-wave-2.md +594 -0
- package/docs/plans/plan-019-post-0.9-roadmap.md +198 -0
- package/docs/product-context-vision-2026-09.md +17 -1
- package/docs/product-vision-2026-09.md +1082 -43
- package/docs/product-vision-review-2026-09.md +13 -1
- package/docs/screenshots/workbench-live-dark.png +0 -0
- package/docs/screenshots/workbench-live-light.png +0 -0
- package/docs/sdk.md +62 -2
- package/package.json +1 -1
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/plugin.json +1 -1
- package/plugins/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/tools.json +601 -22
- package/skills/pmx-canvas/SKILL.md +216 -42
- package/skills/pmx-canvas/evals/evals.json +224 -0
- package/skills/pmx-canvas/references/full-reference.md +120 -21
- package/skills/pmx-canvas/references/github-copilot-app-adapter.md +2 -2
- package/skills/pmx-canvas/references/importing-context.md +132 -0
- package/skills/pmx-canvas/references/installing-pmx-canvas.md +6 -6
- package/skills/pmx-canvas/references/tours-and-recording.md +16 -1
- package/skills/pmx-canvas-testing/SKILL.md +20 -0
- package/src/cli/agent.ts +2 -0
- package/src/cli/commands/ax.ts +12 -0
- package/src/cli/commands/boards.ts +88 -11
- package/src/cli/commands/edges.ts +28 -0
- package/src/cli/commands/groups.ts +7 -0
- package/src/cli/commands/nodes.ts +1 -0
- package/src/cli/commands/query.ts +34 -2
- package/src/cli/commands/record.ts +199 -48
- package/src/cli/index.ts +6 -1
- package/src/client/App.tsx +177 -70
- package/src/client/canvas/AttentionHistory.tsx +0 -2
- package/src/client/canvas/BarHint.tsx +40 -2
- package/src/client/canvas/BoardCopyDialog.tsx +1 -1
- package/src/client/canvas/BoardFolderDialog.tsx +7 -7
- package/src/client/canvas/BoardLinkDialog.tsx +138 -33
- package/src/client/canvas/BoardPinButton.tsx +33 -0
- package/src/client/canvas/BoardSwitcher.tsx +26 -40
- package/src/client/canvas/CanvasNode.tsx +360 -237
- package/src/client/canvas/CanvasViewport.tsx +45 -7
- package/src/client/canvas/CommandBar.tsx +29 -23
- package/src/client/canvas/CommandPalette.tsx +5 -12
- package/src/client/canvas/ConnectionBanner.tsx +3 -3
- package/src/client/canvas/ContextChip.tsx +296 -0
- package/src/client/canvas/ContextMenu.tsx +63 -5
- package/src/client/canvas/CrossBoardReferences.tsx +60 -0
- package/src/client/canvas/EdgeLayer.tsx +339 -76
- package/src/client/canvas/EmptyState.tsx +33 -18
- package/src/client/canvas/ExpandedNodeOverlay.tsx +72 -40
- package/src/client/canvas/ExternalWriters.tsx +57 -42
- package/src/client/canvas/HomeGraphView.tsx +942 -0
- package/src/client/canvas/HomeMapView.tsx +641 -0
- package/src/client/canvas/HomeReviewView.tsx +167 -0
- package/src/client/canvas/HomeView.tsx +687 -160
- package/src/client/canvas/IntentLayer.tsx +19 -12
- package/src/client/canvas/KnowledgeDialog.tsx +488 -0
- package/src/client/canvas/LifecycleChrome.tsx +133 -0
- package/src/client/canvas/LifecycleFields.tsx +91 -0
- package/src/client/canvas/LifecyclePanel.tsx +543 -0
- package/src/client/canvas/MemoryInspector.tsx +104 -0
- package/src/client/canvas/Minimap.tsx +3 -3
- package/src/client/canvas/NearPinLayer.tsx +187 -0
- package/src/client/canvas/NodeContextMark.tsx +175 -97
- package/src/client/canvas/Presentation.tsx +23 -57
- package/src/client/canvas/RelationPresetsDialog.tsx +413 -0
- package/src/client/canvas/RelationsPanel.tsx +82 -0
- package/src/client/canvas/SelectionBar.tsx +3 -6
- package/src/client/canvas/SessionPanel.tsx +90 -50
- package/src/client/canvas/SessionReceipt.tsx +311 -39
- package/src/client/canvas/ShortcutOverlay.tsx +1 -1
- package/src/client/canvas/SnapshotPanel.tsx +27 -36
- package/src/client/canvas/ToolRail.tsx +367 -192
- package/src/client/canvas/TopBar.tsx +354 -124
- package/src/client/canvas/canvas-area.ts +10 -3
- package/src/client/canvas/graph-geometry.ts +195 -0
- package/src/client/canvas/graph-model.ts +254 -0
- package/src/client/canvas/memory-layout.ts +106 -0
- package/src/client/canvas/use-chrome-height.ts +20 -0
- package/src/client/canvas/use-focus-trap.ts +31 -5
- package/src/client/canvas/use-memory-graph.ts +58 -0
- package/src/client/canvas/use-node-drag.ts +2 -1
- package/src/client/canvas/use-pan-zoom.ts +64 -7
- package/src/client/icons.tsx +0 -63
- package/src/client/mcp-app/style.css +0 -6
- package/src/client/nodes/AxStepControls.tsx +74 -50
- package/src/client/nodes/BoardNode.tsx +5 -1
- package/src/client/nodes/ContextNode.tsx +18 -11
- package/src/client/nodes/ExtAppFrame.tsx +6 -3
- package/src/client/nodes/FileNode.tsx +46 -42
- package/src/client/nodes/HtmlNode.tsx +32 -0
- package/src/client/nodes/ImageNode.tsx +1 -1
- package/src/client/nodes/InlineFormatBar.tsx +6 -9
- package/src/client/nodes/InlineMarkdownEditor.tsx +56 -17
- package/src/client/nodes/MarkdownNode.tsx +377 -109
- package/src/client/nodes/McpAppNode.tsx +50 -20
- package/src/client/nodes/MdFormatBar.tsx +21 -18
- package/src/client/nodes/PromptNode.tsx +1 -1
- package/src/client/nodes/ResponseNode.tsx +1 -1
- package/src/client/nodes/viewer-runtime-state.ts +54 -22
- package/src/client/state/attention-bridge.ts +64 -15
- package/src/client/state/boards-store.ts +193 -39
- package/src/client/state/canvas-store.ts +99 -12
- package/src/client/state/context-chip-store.ts +70 -0
- package/src/client/state/context-status-store.ts +53 -0
- package/src/client/state/human-store.ts +13 -7
- package/src/client/state/intent-bridge.ts +51 -30
- package/src/client/state/knowledge-store.ts +43 -0
- package/src/client/state/near-pin-store.ts +115 -6
- package/src/client/state/presence-store.ts +7 -10
- package/src/client/state/presentation.ts +91 -0
- package/src/client/state/relation-store.ts +81 -0
- package/src/client/state/session-store.ts +144 -18
- package/src/client/state/sse-bridge.ts +235 -32
- package/src/client/state/workspace-settings.ts +11 -0
- package/src/client/theme/global.css +2724 -476
- package/src/client/types.ts +12 -0
- package/src/client/utils/keyboard.ts +10 -0
- package/src/client/utils/time-ago.ts +14 -0
- package/src/json-render/renderer/index.tsx +31 -0
- package/src/mcp/canvas-app.ts +12 -2
- package/src/mcp/context-uri-template.ts +7 -4
- package/src/mcp/server.ts +63 -41
- package/src/mcp/workbench-app.ts +39 -6
- package/src/server/agent-presence.ts +128 -28
- package/src/server/ax-context.ts +27 -13
- package/src/server/board-export.ts +12 -1
- package/src/server/canvas-db.ts +331 -42
- package/src/server/canvas-operations.ts +195 -83
- package/src/server/canvas-provenance.ts +53 -22
- package/src/server/canvas-serialization.ts +2 -0
- package/src/server/canvas-state.ts +950 -122
- package/src/server/canvas-validation.ts +9 -2
- package/src/server/context-brief.ts +345 -38
- package/src/server/context-reads.ts +178 -30
- package/src/server/demo-state.json +355 -24
- package/src/server/edit-summary.ts +74 -0
- package/src/server/html-surface.ts +8 -1
- package/src/server/index.ts +181 -11
- package/src/server/knowledge-lifecycle.ts +304 -0
- package/src/server/lifecycle-status.ts +232 -0
- package/src/server/memory-graph.ts +166 -0
- package/src/server/mutation-history.ts +18 -6
- package/src/server/operations/composites.ts +32 -11
- package/src/server/operations/http.ts +7 -2
- package/src/server/operations/index.ts +4 -0
- package/src/server/operations/mcp.ts +26 -1
- package/src/server/operations/ops/ax-presence.ts +1 -1
- package/src/server/operations/ops/ax-read.ts +57 -6
- package/src/server/operations/ops/ax-timeline.ts +28 -2
- package/src/server/operations/ops/backup.ts +5 -3
- package/src/server/operations/ops/batch.ts +35 -4
- package/src/server/operations/ops/boards.ts +188 -47
- package/src/server/operations/ops/canvas-wire.ts +31 -1
- package/src/server/operations/ops/edges.ts +36 -2
- package/src/server/operations/ops/groups.ts +6 -1
- package/src/server/operations/ops/lifecycle.ts +262 -0
- package/src/server/operations/ops/memory-graph.ts +45 -0
- package/src/server/operations/ops/nodes.ts +107 -24
- package/src/server/operations/ops/query.ts +281 -68
- package/src/server/operations/ops/snapshots.ts +73 -1
- package/src/server/operations/ops/validate.ts +5 -1
- package/src/server/operations/ops/viewport.ts +97 -3
- package/src/server/operations/registry.ts +74 -25
- package/src/server/placement.ts +29 -0
- package/src/server/scope-fence.ts +78 -6
- package/src/server/server.ts +115 -16
- package/src/server/spatial-analysis.ts +48 -23
- package/src/server/tour-control.ts +82 -0
- package/src/server/wiki-links.ts +137 -0
- package/src/server/workbench-auth.ts +11 -0
- package/src/shared/agent-context.ts +3 -0
- package/src/shared/agent-presence.ts +15 -15
- package/src/shared/auto-arrange.ts +2 -0
- package/src/shared/boards.ts +4 -4
- package/src/shared/knowledge-lifecycle.ts +22 -0
- package/src/shared/knowledge-presets.ts +80 -0
- package/src/shared/lifecycle-status.ts +26 -0
- package/src/shared/memory-graph.ts +74 -0
- package/src/shared/relations.ts +98 -0
- package/src/shared/semantic-attention.ts +15 -1
- package/src/shared/tour.ts +23 -5
- package/src/shared/workspace-settings.ts +13 -0
- package/dist/types/client/canvas/ContextPinBar.d.ts +0 -1
- package/dist/types/client/canvas/FocusFieldLayer.d.ts +0 -1
- package/dist/types/client/canvas/kind-colors.d.ts +0 -3
- package/dist/types/server/agent-context.d.ts +0 -22
- package/src/client/canvas/ContextPinBar.tsx +0 -25
package/docs/mcp.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# MCP reference
|
|
2
2
|
|
|
3
3
|
PMX Canvas ships an MCP stdio server with **24 tools**, **15 static canvas
|
|
4
|
-
resources**, and
|
|
4
|
+
resources**, and two canvas resource templates, plus per-skill resources at
|
|
5
5
|
`canvas://skills/<name>` and the `skill://{name}/{+path}` template. The server emits
|
|
6
6
|
`notifications/resources/updated` when canvas state changes — humans pin
|
|
7
7
|
nodes in the browser, agents are notified immediately.
|
|
@@ -16,11 +16,54 @@ nodes in the browser, agents are notified immediately.
|
|
|
16
16
|
> (23 tools: 17 composites plus 6 standalones). The current import workflow
|
|
17
17
|
> adds `canvas_import` (24 tools: 18 composites plus 6 standalones). **Prefer the composites.**
|
|
18
18
|
|
|
19
|
+
## Knowledge lifecycle data
|
|
20
|
+
|
|
21
|
+
`canvas_board` adds `knowledge-list`, `category-set` (`category`), `category-remove` (`id`), and `folder-set`
|
|
22
|
+
(`path`, nullable `categoryId`, nullable `lifecycleOverride`). These workspace actions never
|
|
23
|
+
open a board. `relation-preset-set` (`preset: {id, name, vocabulary}`) and `relation-preset-remove`
|
|
24
|
+
(`id`) manage the shared Home template library without rewriting boards or connection kinds.
|
|
25
|
+
Category removal refuses explicit folder assignments (including empty folders), naming the folders to reassign or clear first; it never clears inherited policies. Unknown IDs are 404; missing/blank IDs are invalid input. `canvas_node` adds `lifecycle-get` (`id`, optional `board`), `lifecycle-set`
|
|
26
|
+
(`id`, nullable `lifecycleOverride`), `review` (`id`, `outcome`, `evidence`, `applied`), and
|
|
27
|
+
`lifecycle-restore` (`id`, `evidence`). Writes accept `expectedBoardId` and obey scope/edit locks.
|
|
28
|
+
See [the canonical fields and semantics](http-api.md#knowledge-lifecycle-data-plan-017-slice-1).
|
|
29
|
+
Effective reads include qualification: due reasons, unknown/retired, separate clocks and source warnings.
|
|
30
|
+
Retired cards leave briefs and pinned context, but direct reads/search retain them marked retired.
|
|
31
|
+
Never mark applied without actually applying an outcome; only successful evidence-backed
|
|
32
|
+
retain/revise/externalize with a matching `expectedContentRevision` validates. Capture that revision
|
|
33
|
+
from the card content you actually checked: missing or stale preconditions refuse the review.
|
|
34
|
+
For dependencies, capture `qualification.observations` with the checked sources and send it as
|
|
35
|
+
`expectedSources`. Missing, changed or unavailable sources refuse validation; do not refresh the
|
|
36
|
+
tokens without rechecking the evidence. Brief `lifecycle` snapshots update qualification independently
|
|
37
|
+
of the content cursor; `complete: false` requires rechecking cached cards before reuse.
|
|
38
|
+
Records retain the reviewed revision; content persistence failure adds no record.
|
|
39
|
+
Restore never validates and only explicit restore reverses retirement.
|
|
40
|
+
Newly authored cards start fresh, with no synthetic review. Medium first expires at
|
|
41
|
+
creation plus its cadence; Fast/Slow at a later use/resumed session. Use
|
|
42
|
+
`data.contentOrigin: "imported"` when creating historical text. Imports and existing
|
|
43
|
+
undated cards keep unknown freshness; edits never reset it. Groups and board portals
|
|
44
|
+
need an explicit lifecycle override for factual decay, but still carry source warnings.
|
|
45
|
+
Moving/unfiling a board checks both the active scope and the target board's stored global
|
|
46
|
+
scope or writer territory. Opening Home or another board cannot bypass the target's fence.
|
|
47
|
+
|
|
48
|
+
`canvas_edge` add/update accept open `kind` and `reason`; update null clears either.
|
|
49
|
+
`canvas_board` update accepts `relationVocabulary: [{kind, ink, directed}]`.
|
|
50
|
+
Use `derived-from`, `contradicts`, `supersedes` source → dependent, and `depends-on`
|
|
51
|
+
dependent → prerequisite. Other relations and wiki/portal links do not imply validation dependencies.
|
|
52
|
+
Provenance may record source revision/observation separately from retrieval time, plus an inert
|
|
53
|
+
recipe for a human-requested refresh. Reading or regenerating never validates.
|
|
54
|
+
|
|
55
|
+
Create a board portal with `canvas_node { action: "add", type: "board", data: { boardId: "<target-board-id>" } }`
|
|
56
|
+
on its source board. It appears as a `portal` edge in `canvas://graph`, independently of folder membership.
|
|
57
|
+
|
|
19
58
|
## Board tours
|
|
20
59
|
|
|
21
60
|
`canvas_view { action: "get-tour" }` returns `{ tour, derived }`, using group
|
|
22
61
|
reading order when there is no saved tour. `canvas_view { action: "set-tour",
|
|
23
62
|
tour: { stops: [...] } }` persists an ordered tour; `tour: null` resets it.
|
|
63
|
+
`canvas_view { action: "tour-go", stop: 0 }` (or `step: "next" | "previous"`)
|
|
64
|
+
presents a stop in the workbench, `"tour-exit"` leaves presentation, and
|
|
65
|
+
`canvas_view { action: "move", nodeId | rect | viewport, duration, easing, padding, pullback }`
|
|
66
|
+
eases the camera. None of these enter undo history.
|
|
24
67
|
See the [tour model and CLI walkthrough](cli.md#tour-and-presentation) for stop
|
|
25
68
|
fields. Recording is a local CLI operation; no remote recording/file-writing
|
|
26
69
|
tool is added.
|
|
@@ -240,13 +283,13 @@ its `action` to the same operation the legacy tool used, so results are identica
|
|
|
240
283
|
| Composite | `action` values | Replaced (removed in v0.3.0) |
|
|
241
284
|
|-----------|-----------------|----------|
|
|
242
285
|
| `canvas_import` | `list` · `read` · `submit` · `unavailable` | Agent half of human-consented document import; request, cancel, and commit remain human-only HTTP/SDK actions |
|
|
243
|
-
| `canvas_node` | `add` · `get` · `update` · `remove`
|
|
286
|
+
| `canvas_node` | `add` · `get` · `update` · `remove` · `lifecycle-get` · `lifecycle-set` · `review` · `lifecycle-restore` | Node CRUD, effective lifecycle, audited reviews and explicit retirement restore |
|
|
244
287
|
| `canvas_render` | `describe-schema` · `validate` · `add-json-render` · `stream-json-render` · `add-graph` · `workboard` | `canvas_describe_schema`, `canvas_validate_spec`, `canvas_add_json_render_node`, `canvas_stream_json_render_node`, `canvas_add_graph_node` |
|
|
245
288
|
| `canvas_edge` | `add` · `update` · `remove` | `canvas_add_edge`, `canvas_update_edge`, `canvas_remove_edge` |
|
|
246
289
|
| `canvas_group` | `create` · `add` · `ungroup` | `canvas_create_group`, `canvas_group_nodes`, `canvas_ungroup` |
|
|
247
290
|
| `canvas_history` | `undo` · `redo` | `canvas_undo`, `canvas_redo` |
|
|
248
|
-
| `canvas_view` | `arrange` · `focus` · `fit` · `clear` · `remove-annotation` · `get-tour` · `set-tour` | `canvas_arrange`, `canvas_focus_node`, `canvas_fit_view`, `canvas_clear`, `canvas_remove_annotation` |
|
|
249
|
-
| `canvas_query` | `context` · `search` · `layout` · `validate` |
|
|
291
|
+
| `canvas_view` | `arrange` · `focus` · `fit` · `clear` · `remove-annotation` · `get-tour` · `set-tour` · `tour-go` · `tour-exit` · `move` | `canvas_arrange`, `canvas_focus_node`, `canvas_fit_view`, `canvas_clear`, `canvas_remove_annotation` |
|
|
292
|
+
| `canvas_query` | `context` · `graph` · `search` · `layout` · `validate` | Budgeted context and summary-only connected memory; the others replace `canvas_search`, `canvas_get_layout`, `canvas_validate` |
|
|
250
293
|
| `canvas_webview` | `status` · `start` · `stop` · `resize` · `evaluate` | `canvas_webview_status`, `canvas_webview_start`, `canvas_webview_stop`, `canvas_resize`, `canvas_evaluate` |
|
|
251
294
|
| `canvas_app` | `open-mcp-app` · `diagram` · `build-artifact` | `canvas_open_mcp_app`, `canvas_add_diagram`, `canvas_build_web_artifact` |
|
|
252
295
|
| `canvas_ax_state` | `get` · `set-focus` · `set-policy` · `report-capability` · `presence` · `set-presence` | `canvas_get_ax`, `canvas_set_ax_focus`, `canvas_set_ax_policy`, `canvas_report_host_capability` |
|
|
@@ -255,11 +298,16 @@ its `action` to the same operation the legacy tool used, so results are identica
|
|
|
255
298
|
| `canvas_ax_timeline` | `read` · `record-event` · `add-evidence` · `send-steering` · `reads` · `read-status` | `canvas_get_ax_timeline`, `canvas_record_ax_event`, `canvas_add_evidence`, `canvas_send_steering` (`reads` is the context read log; `read-status` is per node: last read, by whom, at which content revision) |
|
|
256
299
|
| `canvas_ax_delivery` | `claim` (long-polls with `timeoutMs`) · `mark` | `canvas_claim_ax_delivery`, `canvas_mark_ax_delivery` |
|
|
257
300
|
| `canvas_intent` | `signal` · `update` · `clear` | _(new — Ghost Cursor of Intent; no legacy standalone tool)_ |
|
|
258
|
-
| `canvas_board` | `list` · `get` · `create` · `create-from` · `open` · `update`
|
|
259
|
-
| `canvas_snapshot` | `save` · `list` · `restore` · `delete` · `gc` · `diff` | `canvas_snapshot` (legacy save tool), `canvas_list_snapshots`, `canvas_restore`, `canvas_delete_snapshot`, `canvas_gc_snapshots`, `canvas_diff` — removed in v0.4.0 after one deprecated minor |
|
|
301
|
+
| `canvas_board` | `list` · `get` · `create` · `create-from` · `open` · `update` · `pin` · `unpin` · `knowledge-list` · `category-set` · `category-remove` · `folder-set` · `relation-preset-set` · `relation-preset-remove` | Boards and explicit workspace category/folder/shared-preset data |
|
|
302
|
+
| `canvas_snapshot` | `save` · `list` · `restore` · `restore-node` · `delete` · `gc` · `diff` | `canvas_snapshot` (legacy save tool), `canvas_list_snapshots`, `canvas_restore`, `canvas_delete_snapshot`, `canvas_gc_snapshots`, `canvas_diff` — removed in v0.4.0 after one deprecated minor |
|
|
303
|
+
|
|
304
|
+
For receipt-safe single-card Undo, use `canvas_snapshot { action: "restore-node", id,
|
|
305
|
+
nodeId, preserveHumanEdits: true }`. The server skips a card whose latest editor is human,
|
|
306
|
+
returning `restored: false, skipped: "human-edit"`; only `restored: true` means it restored
|
|
307
|
+
the content. Omitting the option permits an explicit restore over human content.
|
|
260
308
|
|
|
261
|
-
Board
|
|
262
|
-
"<id>",
|
|
309
|
+
Board folders are nested folder paths: `canvas_board { action: "update", id:
|
|
310
|
+
"<id>", folder: "Engineering/Canvas/Decisions" }`. Use `folder: ""` to
|
|
263
311
|
unfile a board. Moving preserves its ID and content; list results expose the
|
|
264
312
|
full path for navigating the memory library.
|
|
265
313
|
|
|
@@ -273,17 +321,56 @@ of the first markdown card. Humans can change the designation using **Set as REA
|
|
|
273
321
|
clicking **README** clears it. Read-only tasks leave the board unchanged.
|
|
274
322
|
|
|
275
323
|
`canvas_board { action: "create-from" }` accepts `sourceBoardId`, `name`, optional
|
|
276
|
-
`
|
|
324
|
+
`folder`, `nodeIds`, `includeReadme`, `includeStructure`, and `preview`. Preview
|
|
277
325
|
first: `prompt`, `response`, `trace`, and `mcp-app` are not reusable. Creation is
|
|
278
326
|
transactional and inactive, assigns fresh node/edge IDs, and copies no pins, AX
|
|
279
327
|
state, or history. Groups and the designated README are opt-in.
|
|
280
328
|
|
|
329
|
+
The copy records `previousBoardId` for its source. Board `update` accepts
|
|
330
|
+
`mapPosition: { x, y }` or `null` to persist/reset a Home Map position.
|
|
331
|
+
`canvas_edge { action: "add", from, to, toBoardId, type }` connects the open
|
|
332
|
+
board's source card to a card on another board without opening the target.
|
|
333
|
+
|
|
334
|
+
### Connected memory discovery
|
|
335
|
+
|
|
336
|
+
`canvas_query { action: "graph", focus: "pins", depth: 2 }` and
|
|
337
|
+
`canvas://graph{?focus,depth}` read connected-memory summaries for Home,
|
|
338
|
+
links/backlinks, and brief discovery. The tool accepts `projection: "full" | "boards"`
|
|
339
|
+
(default `full`); `boards` returns compact board-only summaries. The resource
|
|
340
|
+
uses the default full projection. Omit focus for the whole library, or use
|
|
341
|
+
a board ID, a JSON qualified node key `["board-id","card-id"]` (board key:
|
|
342
|
+
`["board-id",null]`), or `pins`. Depth is an integer 0–4, default 2;
|
|
343
|
+
traversal is undirected and includes membership hops. Explicit 0 is valid; empty
|
|
344
|
+
depth values are rejected. URL-encode resource focus.
|
|
345
|
+
The result has `nodes`, `edges`, `unresolvedLinks: [{ source, ref }]`, `focus`,
|
|
346
|
+
and `depth`. Every node is `summaryOnly: true`, with summary at most 280
|
|
347
|
+
characters. Reads count links seen on each owning board only when that node's
|
|
348
|
+
incident relations are complete. A focused node with `linksComplete: false`
|
|
349
|
+
does not acknowledge omitted links. Card nodes carry their captured `linksRevision`,
|
|
350
|
+
so later changes are not acknowledged by an earlier delivered graph.
|
|
351
|
+
`canvas://ax-context` and `pmx-current-context` deliver excerpts and annotation
|
|
352
|
+
anchors, not complete incident relations; neither marks those relations seen.
|
|
353
|
+
Single-card and layout reads record delivered content, not incident relations.
|
|
354
|
+
Use a complete graph or brief relation entry to acknowledge those relations.
|
|
355
|
+
Reads never mark full card content read or
|
|
356
|
+
switch the workbench. Pull needed cards in full separately.
|
|
357
|
+
No new tool is added: the tool count stays 24.
|
|
358
|
+
|
|
281
359
|
Library search is `canvas_query { action: "search", query: "auth", scope:
|
|
282
360
|
"library" }`. It returns board/card IDs and never switches the active board.
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
361
|
+
Exact and whole-term matches rank ahead of embedded substrings; substring discovery
|
|
362
|
+
still works, so `V2 platform` precedes `TV2 pictures` for `V2` without dropping the latter.
|
|
363
|
+
|
|
364
|
+
Search also accepts intersecting `boardId` and `folder` filters. Folder includes
|
|
365
|
+
exact and descendant paths, with `""` for unfiled boards. Filters default omitted
|
|
366
|
+
scope to library; explicit `scope: "active"` remains constrained to the active
|
|
367
|
+
board. Filtering happens before ranking/limit, and unknown selections return no
|
|
368
|
+
results. These are selectors, not board switches.
|
|
369
|
+
|
|
370
|
+
To author static cards on a new board without interrupting the human, create the
|
|
371
|
+
board and pass its id as `destinationBoardId` to `canvas_node { action: "add" }`.
|
|
372
|
+
For active-board operations, call `canvas_board { action: "open", id: "<returned-board-id>" }`
|
|
373
|
+
and verify `activeBoardId` before writing. Opening changes the shared workbench the human sees and the target of
|
|
287
374
|
subsequent writes; it is not a private agent selection. Another participant can
|
|
288
375
|
switch it later, so recheck after interruptions. `id: null` opens Home. Deletion
|
|
289
376
|
remains human-only.
|
|
@@ -312,6 +399,34 @@ board: "<id>" }` or `canvas_node { action: "get", id: "<node-id>", board:
|
|
|
312
399
|
"<id>" }`. Unknown boards error, and full inactive-board reads resolve stored
|
|
313
400
|
blob references.
|
|
314
401
|
|
|
402
|
+
`canvas_node { action: "add", type: "markdown", destinationBoardId: "<id>",
|
|
403
|
+
requestId: "<logical-operation-id>", content: "..." }` creates on that board without
|
|
404
|
+
opening it. `expectedBoardId` still guards the active board. `requestId` is optional;
|
|
405
|
+
reuse it only for identical retries, and use a new id for intentional identical new
|
|
406
|
+
content. Receipts persist across restart and return the original creation payload
|
|
407
|
+
even after the node is deleted; mismatched reuse fails. Either field restricts creation
|
|
408
|
+
to static markdown/status/context/ledger/trace/diff/mermaid/plain-html nodes. Runtime
|
|
409
|
+
types, primitives, intents and membership mutations fail explicitly. Both boards'
|
|
410
|
+
scope fences apply conservatively. Batch entries support these fields and named refs;
|
|
411
|
+
this does not add inactive-board update/remove support. See [the full creation/retry
|
|
412
|
+
contract](http-api.md#nodes).
|
|
413
|
+
|
|
414
|
+
`canvas_group { action: "create" }` and `canvas_edge { action: "add" }` accept
|
|
415
|
+
the same `destinationBoardId`, `requestId` and active `expectedBoardId` guard.
|
|
416
|
+
Create cards, group their IDs and connect them in one `canvas_batch` using named
|
|
417
|
+
refs, without switching the human's board. Groups resolve children on the
|
|
418
|
+
destination and preserve positions unless `childLayout` is supplied. Edge source
|
|
419
|
+
ownership uses `destinationBoardId`; `toBoardId` remains an independent cross-board
|
|
420
|
+
target. Retry receipts preserve edits/removals and survive restart. This extends
|
|
421
|
+
creation, not background update/remove operations; runtime and intent restrictions
|
|
422
|
+
on static node creation remain in force.
|
|
423
|
+
|
|
424
|
+
`canvas_node { action: "update" }` accepts `expectedBoardId` and `expectedContentRevision`
|
|
425
|
+
to refuse stale writes. Ordinary updates change the card only. File-backed Markdown may opt
|
|
426
|
+
into `persistFile: true` with both preconditions and top-level `content` to save the existing
|
|
427
|
+
workspace `.md` file and card together. In this mode, `data` accepts only the `rendered` preview;
|
|
428
|
+
refused saves change neither. See [the file-save contract](http-api.md#nodes).
|
|
429
|
+
|
|
315
430
|
For Mermaid nodes, `canvas_node` actions `add` and `update` accept
|
|
316
431
|
`data: { fit: "contain" | "none" }`. Contain is the default, shrinking overflow
|
|
317
432
|
uniformly; none keeps 100% with scrolling. Use Open as site for 100% without
|
|
@@ -461,8 +576,8 @@ migrating an older integration.
|
|
|
461
576
|
|
|
462
577
|
## Resources
|
|
463
578
|
|
|
464
|
-
There are 15 static canvas resources below and
|
|
465
|
-
`canvas://context{?budget,consumer,since}`. Bundled skills add the static
|
|
579
|
+
There are 15 static canvas resources below and two URI-template resources,
|
|
580
|
+
`canvas://context{?budget,consumer,since}` and `canvas://graph{?focus,depth}`. Bundled skills add the static
|
|
466
581
|
`canvas://skills/<name>` resources and a separate `skill://{name}/{+path}` file
|
|
467
582
|
template; those dynamic package entries are not part of the core count.
|
|
468
583
|
|
|
@@ -470,13 +585,14 @@ template; those dynamic package entries are not part of the core count.
|
|
|
470
585
|
|----------|-------------|
|
|
471
586
|
| `canvas://pinned-context` | Content of pinned nodes + nearby unpinned neighbors |
|
|
472
587
|
| `canvas://context{?budget,consumer,since}` | Budgeted cross-board brief with a durable consumer cursor |
|
|
588
|
+
| `canvas://graph{?focus,depth}` | Summary-only library or focused board/card graph; undirected membership-inclusive depth 0–4 (default 2) |
|
|
473
589
|
| `canvas://ax` | PMX AX state: focus, work items, approval gates, review annotations |
|
|
474
590
|
| `canvas://ax-context` | Agent-readable pinned and focused AX context, plus a compact `delivery` lead block (`pendingSteering` newest-first + `totalPending`/`omittedPending` counts), timeline summary, and host capability |
|
|
475
591
|
| `canvas://ax-work` | Canvas-bound AX work: work items, approval gates, review annotations, elicitations, mode requests, and tool/prompt policy |
|
|
476
592
|
| `canvas://ax-timeline` | Bounded AX timeline: recent agent-events, evidence, and steering messages |
|
|
477
593
|
| `canvas://ax-pending-steering` | Undelivered steering an adapterless MCP client can claim, act on, and mark delivered |
|
|
478
594
|
| `canvas://ax-delivery` | Steering delivery state (delivered flag) for diagnostics |
|
|
479
|
-
| `canvas://boards` | Boards with README summaries, resolved links/backlinks, target titles, and the open board id |
|
|
595
|
+
| `canvas://boards` | Boards with README summaries, resolved links/backlinks, target titles, a layout `preview` (cards as 0–1 rectangles), `mapChars` (the rough size of a pinned board's map), and the open board id |
|
|
480
596
|
| `canvas://schema` | Running-server create schemas and json-render catalog metadata |
|
|
481
597
|
| `canvas://layout` | Full canvas state (all nodes, edges, viewport) |
|
|
482
598
|
| `canvas://summary` | Compact overview: counts, pinned titles, viewport |
|
|
@@ -489,7 +605,19 @@ Read context at the start of work. For the cross-board brief, use a stable,
|
|
|
489
605
|
unique `consumer` per agent/adapter only when durable incremental delivery is
|
|
490
606
|
wanted. Omitting both `consumer` and `since` starts from the beginning; explicit
|
|
491
607
|
`since` does not update a cursor. The budget is UTF-16 code units (default
|
|
492
|
-
16,000; maximum 100,000), not model tokens.
|
|
608
|
+
16,000; maximum 100,000), not model tokens. The brief is a map, not a dump: an
|
|
609
|
+
`overview` of the open board (README summary, folder, links and backlinks), then each card as
|
|
610
|
+
its title and a short summary (`summaryOnly`), with why it was pinned and its relations (edges to
|
|
611
|
+
and from other cards); pinned cards lead, then the cards near each pin, then what changed.
|
|
612
|
+
On a later read, a card that changed since the cursor says what changed in `changes`
|
|
613
|
+
(`["text"]`, `["links"]` or both), and a relation drawn or changed since then ends with
|
|
614
|
+
`(new, by codex)` / `(changed, by a person)`; generated code-graph links are never marked.
|
|
615
|
+
Boards pinned into the working set (`canvas_board { action: "pin" }`) arrive as maps too (reason
|
|
616
|
+
`pinned-board`): the board's summary and relations, and its pinned cards as summaries. Pull
|
|
617
|
+
what you need in full with `canvas_node { action: "get", board, id, full: true }`; a summary
|
|
618
|
+
does not mark a card read, a full pull does. A first read larger than the budget carries the
|
|
619
|
+
overview and pins, then cards oldest first, and returns `cursor.next`; a `consumer` continues
|
|
620
|
+
from it automatically, otherwise pass it as `since` to read on. If an entry is
|
|
493
621
|
truncated, follow its source board/card IDs with `canvas_board get` and
|
|
494
622
|
`canvas_node { action: "get", board, id, full: true }` rather than inferring the missing text.
|
|
495
623
|
Full node reads record only that node's delivered content revision; compact metadata
|
|
@@ -581,7 +709,7 @@ changes:
|
|
|
581
709
|
- AX timeline mutations (agent-events, evidence, steering) notify
|
|
582
710
|
`canvas://ax-timeline` and `canvas://ax-context`
|
|
583
711
|
- All mutations notify `canvas://layout`, `canvas://summary`,
|
|
584
|
-
`canvas://spatial-context`, `canvas://history`,
|
|
712
|
+
`canvas://spatial-context`, `canvas://history`, `canvas://code-graph`, and `canvas://graph`
|
|
585
713
|
|
|
586
714
|
This closes the human-to-agent loop: spatial curation in the browser becomes
|
|
587
715
|
an immediate signal in the agent's context.
|
package/docs/node-types.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Node types
|
|
2
2
|
|
|
3
|
-
`board` is a native text-only link. Set `data.boardId` to the durable target ID.
|
|
3
|
+
`board` is a native text-only link. Set `data.boardId` to the durable target ID. Its header pin pins the
|
|
4
|
+
linked board into the agent's working set (`canvas_board { action: "pin" }`), not the portal card.
|
|
4
5
|
Titles resolve from that ID, so renames and folder moves are safe; deleted
|
|
5
6
|
targets render explicitly as missing. It is not an iframe or a cross-board card
|
|
6
7
|
edge. Static exports lock the card and intentionally do not embed the target
|
|
@@ -50,8 +51,14 @@ conversation rendering and are not created through public APIs.
|
|
|
50
51
|
Full node reads expose server-owned `createdBy`, `lastEditedBy`, and
|
|
51
52
|
`contentRevision`. Authors distinguish human, agent, system, and unknown;
|
|
52
53
|
legacy nodes remain unknown. The revision advances on semantic content changes,
|
|
53
|
-
including group membership and undo, but not moves or resizes.
|
|
54
|
-
|
|
54
|
+
including group membership and undo, but not moves or resizes. Links are tracked
|
|
55
|
+
apart: `linksRevision` advances on both ends when a link is added, retyped,
|
|
56
|
+
relabelled or removed, and never advances `contentRevision`. Each edge carries
|
|
57
|
+
the `revision`, `changedBy` and `changedAt` of its latest such change — its author
|
|
58
|
+
until someone changes it again — and the `createdBy` and `createdAt` of whoever first
|
|
59
|
+
drew it (generated code-graph and board-map edges carry none). Undoing a deletion
|
|
60
|
+
restores the link with its original author. These fields describe provenance, not permission, and
|
|
61
|
+
caller-supplied author fields are ignored.
|
|
55
62
|
|
|
56
63
|
## Choosing the right visual tier
|
|
57
64
|
|
|
@@ -64,6 +71,12 @@ that fits the work — each step adds capability and bundle weight.
|
|
|
64
71
|
| 2 | `html` | You have/can write self-contained HTML+JS (Chart.js, D3, custom widgets, interactive demos) | None — sandboxed iframe |
|
|
65
72
|
| 3 | `web-artifact` | You need a full React/Tailwind app with shadcn components, routing, or shared state | Build step |
|
|
66
73
|
|
|
74
|
+
## Markdown tasks
|
|
75
|
+
|
|
76
|
+
Tick a task directly on its card, including quoted and nested tasks. A card click changes
|
|
77
|
+
only that task's `[ ]` or `[x]` marker, preserving the rest of the source exactly.
|
|
78
|
+
Task-shaped text in code examples and raw HTML checkboxes are not Markdown task controls.
|
|
79
|
+
|
|
67
80
|
## File nodes
|
|
68
81
|
|
|
69
82
|
File nodes display project files with line numbers and language detection.
|
|
@@ -223,6 +236,17 @@ canvas_render({
|
|
|
223
236
|
`outline`. Older saved specs using `label` or status variants such as
|
|
224
237
|
`success`/`warning` are normalized during validation.
|
|
225
238
|
|
|
239
|
+
Replacing a JSON form's spec keeps its existing card title unless a non-empty title is
|
|
240
|
+
explicitly supplied, and reloads the viewer for the new spec. The viewer uses bundled IBM
|
|
241
|
+
Plex Sans and Mono fonts, including hosted viewers and offline exports.
|
|
242
|
+
During embedded JSON/graph refreshes, the previous viewer stays visible until its replacement
|
|
243
|
+
has restored its tab-local state and committed the new UI; document load alone is not readiness.
|
|
244
|
+
After document load, runtime readiness waits up to 10 seconds and retries a failed
|
|
245
|
+
handoff once, keeping the last painted document. If that retry fails, the error
|
|
246
|
+
toast and history say **Reload to retry**. A later healthy authored update can recover.
|
|
247
|
+
This readiness limit is not an overall network-load timeout.
|
|
248
|
+
Authored spec revisions still reset drafts to the spec's initial state.
|
|
249
|
+
|
|
226
250
|
Specs preserve top-level `state` and element-level `repeat`, `watch`, and
|
|
227
251
|
`slots`. Use `$bindState` with JSON Pointer paths for editable form values;
|
|
228
252
|
`$state` only reads a value. Nested repeats can use `statePath: { "$item": "tasks" }`
|
|
@@ -379,6 +403,10 @@ canvas_node({
|
|
|
379
403
|
A fragment without `<html>`/`<head>` is wrapped in a full document
|
|
380
404
|
automatically. Default size is 720×640.
|
|
381
405
|
|
|
406
|
+
Changing a mounted HTML card's `data.axCapabilities` reboots its iframe bridge, including
|
|
407
|
+
late enable and disable/re-enable. Emits from the old document are rejected; enabling AX
|
|
408
|
+
still cannot exceed the HTML node's capability ceiling.
|
|
409
|
+
|
|
382
410
|
Presentation mode is opt-in. Raw HTML nodes do not show the browser `Present`
|
|
383
411
|
button unless callers set `presentation: true`; prefer the `presentation`
|
|
384
412
|
primitive when the user explicitly asks for a PowerPoint-like deck, pitch,
|
|
@@ -518,6 +546,33 @@ canvas_group({ action: 'create', title: 'Auth Module', childIds: ['node-1', 'nod
|
|
|
518
546
|
|
|
519
547
|
All edges support labels, styles (solid/dashed/dotted), and animation.
|
|
520
548
|
|
|
549
|
+
Native edges optionally carry `toBoardId`: `from` belongs to the open source
|
|
550
|
+
board and `to` identifies a card on that target board. These connections appear
|
|
551
|
+
in the visible source card footer with readable board/card titles; missing
|
|
552
|
+
targets are disabled. The human **More** menu opens a remote-card picker.
|
|
553
|
+
Auto-arrange remains local. Static exports omit remote lines but retain explicit
|
|
554
|
+
external connection evidence.
|
|
555
|
+
|
|
556
|
+
Markdown saves bind `[[Board]]`, `[[Board#Card]]`, and either form with `|alias`
|
|
557
|
+
to durable board/card IDs in server-owned `data.wikiLinks`. Exact IDs take
|
|
558
|
+
precedence; name/title matches must be unique. Saved bindings survive renames;
|
|
559
|
+
ambiguous or missing targets stay explicit and never guess or silently retarget.
|
|
560
|
+
Rendering follows saved bindings: unresolved links stay unresolved until an explicit
|
|
561
|
+
save, and Undo or restore preserves the binding.
|
|
562
|
+
Relation and target-availability updates refresh the Markdown preview without replacing
|
|
563
|
+
an unsaved document or Source draft or its selection. Saving a file-backed draft also
|
|
564
|
+
rejects an older in-flight draft render.
|
|
565
|
+
Legacy Markdown without a binding record gets a one-time persisted backfill;
|
|
566
|
+
saved empty or unresolved records are not reinterpreted on reads.
|
|
567
|
+
Code spans and fenced code are ignored. An unresolved board-only link offers a
|
|
568
|
+
human Create dialog: it creates exactly the authored board name and re-saves
|
|
569
|
+
the source using its captured board and revision, refusing a stale source.
|
|
570
|
+
Wiki links, backlinks, portals, native edges, and create-from's `previousBoardId`
|
|
571
|
+
share the Home/agent memory projection. Native edges also carry open `kind` and `reason`,
|
|
572
|
+
independently of their line type. Boards may set `relationVocabulary: [{kind, ink, directed}]`.
|
|
573
|
+
Explicit dependency relations or provenance sources drive downstream review; ordinary navigation
|
|
574
|
+
does not. See [lifecycle and source contracts](http-api.md#knowledge-lifecycle-data-plan-017-slice-1).
|
|
575
|
+
|
|
521
576
|
| Type | Use case |
|
|
522
577
|
|------|----------|
|
|
523
578
|
| `flow` | Sequential steps, data flow |
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Design gaps — drawn, not built (audit 2026-10-08)
|
|
2
|
+
|
|
3
|
+
Every drawing in `docs/design/` for waves 0 and 1 (plus the 600 px reference) was compared with
|
|
4
|
+
the code, element by element. Waves 0 and 1 were thought done; these items were drawn and never
|
|
5
|
+
built. Wave 2+ drawings are out of scope (not built by plan). Spot-checked items are marked ✓.
|
|
6
|
+
|
|
7
|
+
## Wave 0 — the foundation (shipped in 0.8.0, these were missed)
|
|
8
|
+
|
|
9
|
+
| # | Drawing | Gap | Size |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| 1 | Chrome §7 | Rail Settings menu — **built 2026-10-08**; the drawing now keeps the Eraser beside Text note (13 tools) | done |
|
|
12
|
+
| 2 | Chrome §9 | Section labels: a markdown node shown as a heading — no titlebar, no footer, controls on hover. Not built. | M |
|
|
13
|
+
| 3 | Chrome §10 | Floating-chrome lane: fit and focus keep a 44 px lane clear at the top; the Updates pill is a small rounded "Updates 1" chip, not today's uppercase edge tab. Fit/focus only clear the bottom chrome ✓, so titles land under the pill. | M |
|
|
14
|
+
| 4 | Tokens §4 | Type scale with an 11 px floor: 66 sizes below 11 px remain in global.css ✓, more inline. | M |
|
|
15
|
+
| 5 | Tokens §4 | Radii and elevation tokens barely used (174 raw radii; `--e-2` used once); ~15 chrome surfaces hard-code black shadows, so Daylight/Sepia shadows are not ink-tinted; glows remain on active/neighbour/search-match nodes. | M |
|
|
16
|
+
| 6 | TokenSystem / Main / Themes | Harbor palette drift (`--c-panel-soft`, `--c-text-soft`, `--c-dim`, an accent-blue dot grid instead of neutral); `--c-on-accent` missing (`--c-contrast-fg` used); High-contrast `muted` #aaa vs #ccc. | S |
|
|
17
|
+
| 7 | Main / HeaderMarks | Node header: a fill behind every titlebar (drawn: fill only when pinned); title in `--c-text-soft` (drawn: `--c-text`). | S |
|
|
18
|
+
| 8 | Types1 / Types3 | Per-type foundation pass not done: markdown footer into ⋯; status (sentence case, progress bar, time); context (rows, one-line token meter); ledger (time column, UI font); trace (10 px card, running in agent violet); file (toolbar into the header, 12 px code); group label (sentence case, "3 nodes"); prompt key-hint chip; response role labels and violet agent turns; board "not found" relink state. | L |
|
|
19
|
+
| 9 | Raw colours | 12 raw `rgba()` colours in node renderers; the hex guard skips `rgba()`. | S |
|
|
20
|
+
|
|
21
|
+
## Wave 1 — context made visible (in progress)
|
|
22
|
+
|
|
23
|
+
Already tracked: NearPin tethers and drag preview; Home pinned-boards panel; BoardPins category
|
|
24
|
+
glyphs (move 13).
|
|
25
|
+
|
|
26
|
+
| # | Drawing | Gap | Size |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| 10 | NearPin §3 | The moment it changes: the chip pulses once on drop, fades on leaving, and one Updates entry says "'X' is now near 'Y' — the agent gets its title and summary" / "…left… — it is out of the agent's brief". Not built. | M |
|
|
29
|
+
| 11 | NearPin §2 | Hover card actions "Pin to put it first" and "Show pins". The hint has text only. | S |
|
|
30
|
+
| 12 | HeaderMarks / LinksChanged | The amber word is "changed", not "changed since read" ✓; its hint should name what changed ("text changed · 1 new link"). | S |
|
|
31
|
+
| 13 | AgentContext / HeaderMarks | **Decided 2026-10-08: pinned cards only.** "Read" only accumulates and the agent reads across boards, so on unpinned cards it would soon mark everything; the receipt and the dim-untouched lens answer "what did it read". The drawings show "read" on cards the agent read without a pin ("read anyway") and near + read / near + changed together. Today read state shows only on pinned cards, and design.md says "the one state chip (near, or the read state)". | M |
|
|
32
|
+
| 14 | LinksChanged | **Decided 2026-10-08:** link authorship stays until a person edits or relabels the link, shown as a small ✦ on the label with the author's identity in the hint (the agent today, the person once boards are shared); "not seen by" stays as built. Waiting for the drawing. The drawing keeps "by <agent>" on a link until you edit it; the build clears it once a read carries either end (matching "not seen by"). | S |
|
|
33
|
+
| 15 | LinksChanged | The brief marks changed cards "links changed" / "text changed, links changed" and new relations "(new, by Pepe)"; a pinned card is never sent as "changed"; a person's removed link writes an Updates entry. **Built 2026-10-10:** changed and pinned entries carry `changes` (`text`/`links`), relations drawn or changed since the cursor end "(new, by …)" / "(changed, by …)", a removed link writes "Link removed · “A” – “B” (type)". A person shows as "by a person": edges record no human name, so "by Pepe" waits for shared boards (hosted version, vision Part 4). | M |
|
|
34
|
+
| 16 | ContextChip / 600 | Panel tags carry eye / eye-off / warn icons (text only today); the 600 px sheet drops "near <pin>" and shortens the caption; at 600 px the agent chip shrinks to a 24 px violet initial placed after the summary. | S |
|
|
35
|
+
| 17 | AgentContext | "Suggested" state (dashed violet node, Accept / Dismiss, lens count, receipt row) — absent. Not named in wave 1's function list. **Dropped 2026-10-10** by the maintainer: the agent changes the canvas directly, and asks and suggestions go through the composer. | L |
|
|
36
|
+
| 18 | AgentContext | Edited: violet bar for the session and "see change" (diff + undo); receipt: "Tell <agent>" on changed lines, Undo on Edited, per-edit descriptions, header "What <agent> did · This session · start–end"; a live per-session lens count. **Built 2026-10-10:** the header, "Tell <agent>", Undo on Edited (via `snapshot.restore-node`), per-edit descriptions, "See change" (Before / Now + Undo this card, on the receipt line; its open view awaits a drawing), the violet session bar, and the live count in the agent chip. | M |
|
|
37
|
+
| 19 | Home | Beyond the pinned-boards panel: library tree with counts and pins, "Library · N boards", breadcrumb + folder README, "New board here", board cards (thumbnail, README line, "18 cards", "↔ 4 links"), a board-details pane (in context, README, pinned cards, links, Open). "nodes" should read "cards". **Built 2026-10-10:** tree with counts and pin dots, pinned boards with ≈ tokens, breadcrumb, "New board here", "+ New folder", subfolder cards with "N in context", board cards (thumbnail, README line, cards, ↔ links), details pane (in-context switch, README, pinned cards, links, Open board, ⋯ move/rename/create from/delete), "cards" not "nodes". Not built: the folder's README line (no folder README exists yet) and the Map/Graph tabs (wave 2). | L |
|
|
38
|
+
| 20 | Pane600 | Minimap off by default under 700 px (always on today ✓); agent activity summary "Claude · 4 read · 1 edited" in the top bar; Home at 600 px ("In context: 3 boards ≈ 21k tokens", details as a bottom sheet). **Built 2026-10-10:** Home at 600 px (in-context banner, folder picker, subfolder chips, board rows, details bottom sheet) and the activity summary in the agent chip (at ≤ 760 px the chip shows only its initial, per ContextChip600). | M |
|
|
39
|
+
| 21 | Context | Command-bar chips prefixed with ✦ ✓ — ✦ now means "an agent wrote this", so the pinned-context chips say the wrong thing; drawn as a plain blue chip with title + ×. | S |
|
|
40
|
+
|
|
41
|
+
## Stale code found on the way
|
|
42
|
+
|
|
43
|
+
- `global.css` `.node-title`: `min-width: 9ch` is cancelled by the next line, `min-width: 0` ✓.
|
|
44
|
+
- A `global.css` comment still describes the context chip as a "share of its budget… clipped".
|
|
45
|
+
- `CommandBar.tsx` comment says "gold ✦ chips".
|
|
46
|
+
|
|
47
|
+
## Suggested order
|
|
48
|
+
|
|
49
|
+
1. Small, unambiguous wave-1 fixes before 0.9.0: 12, 16, 21, the stale code; 20's minimap default.
|
|
50
|
+
2. Decide 13 and 14 (design session draws the answer if needed).
|
|
51
|
+
3. Close wave 1: 10, 11, 15, 18, the tracked tethers, and the Home redesign (19, 20) together.
|
|
52
|
+
4. A wave-0 pass after 0.9.0: 2, 3, 7, then the token sweep (4, 5, 6, 9), then per-type (8).
|
|
53
|
+
5. "Suggested" (17) needs a function first; plan it with wave 5 (agent output as nodes).
|