pmx-canvas 0.6.4 → 0.7.0

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.
Files changed (204) hide show
  1. package/.github/extensions/pmx-canvas/extension.mjs +67 -3
  2. package/CHANGELOG.md +73 -0
  3. package/Readme.md +35 -5
  4. package/dist/canvas/global.css +498 -28
  5. package/dist/canvas/index.js +110 -95
  6. package/dist/canvas/mermaid-entry.js +258 -258
  7. package/dist/types/cli/agent.d.ts +4 -0
  8. package/dist/types/cli/commands/backup.d.ts +1 -0
  9. package/dist/types/cli/commands/boards.d.ts +1 -0
  10. package/dist/types/cli/commands/export.d.ts +1 -0
  11. package/dist/types/cli/commands/record.d.ts +12 -0
  12. package/dist/types/client/canvas/BoardCopyDialog.d.ts +5 -0
  13. package/dist/types/client/canvas/BoardFolderDialog.d.ts +7 -0
  14. package/dist/types/client/canvas/BoardLinkDialog.d.ts +3 -0
  15. package/dist/types/client/canvas/BoardSwitcher.d.ts +8 -0
  16. package/dist/types/client/canvas/ExportDialog.d.ts +7 -0
  17. package/dist/types/client/canvas/HomeView.d.ts +9 -0
  18. package/dist/types/client/canvas/Presentation.d.ts +13 -0
  19. package/dist/types/client/canvas/use-node-drag.d.ts +2 -1
  20. package/dist/types/client/nodes/AttachmentNode.d.ts +6 -0
  21. package/dist/types/client/nodes/BoardNode.d.ts +5 -0
  22. package/dist/types/client/nodes/McpAppNode.d.ts +24 -1
  23. package/dist/types/client/state/boards-store.d.ts +79 -0
  24. package/dist/types/client/state/canvas-store.d.ts +2 -0
  25. package/dist/types/client/state/intent-bridge.d.ts +1 -0
  26. package/dist/types/client/state/presentation.d.ts +3 -0
  27. package/dist/types/client/state/session-store.d.ts +7 -0
  28. package/dist/types/client/types.d.ts +2 -2
  29. package/dist/types/json-render/catalog.d.ts +3 -3
  30. package/dist/types/json-render/charts/definitions.d.ts +1 -1
  31. package/dist/types/json-render/server.d.ts +8 -0
  32. package/dist/types/mcp/canvas-access.d.ts +10 -3
  33. package/dist/types/mcp/context-uri-template.d.ts +6 -0
  34. package/dist/types/server/agent-presence.d.ts +1 -1
  35. package/dist/types/server/attribution.d.ts +11 -0
  36. package/dist/types/server/ax-context.d.ts +3 -1
  37. package/dist/types/server/ax-interaction.d.ts +2 -2
  38. package/dist/types/server/ax-state.d.ts +13 -3
  39. package/dist/types/server/backup.d.ts +36 -0
  40. package/dist/types/server/board-export.d.ts +45 -0
  41. package/dist/types/server/canvas-db.d.ts +65 -9
  42. package/dist/types/server/canvas-operations.d.ts +45 -0
  43. package/dist/types/server/canvas-provenance.d.ts +1 -1
  44. package/dist/types/server/canvas-schema.d.ts +1 -0
  45. package/dist/types/server/canvas-state.d.ts +146 -3
  46. package/dist/types/server/canvas-validation.d.ts +3 -0
  47. package/dist/types/server/context-brief.d.ts +111 -0
  48. package/dist/types/server/context-reads.d.ts +55 -0
  49. package/dist/types/server/document-import.d.ts +66 -0
  50. package/dist/types/server/html-surface.d.ts +1 -1
  51. package/dist/types/server/index.d.ts +107 -4
  52. package/dist/types/server/mutation-history.d.ts +1 -0
  53. package/dist/types/server/operations/invoker.d.ts +2 -0
  54. package/dist/types/server/operations/mcp.d.ts +7 -1
  55. package/dist/types/server/operations/ops/app.d.ts +2 -0
  56. package/dist/types/server/operations/ops/ax-shared.d.ts +2 -2
  57. package/dist/types/server/operations/ops/backup.d.ts +2 -0
  58. package/dist/types/server/operations/ops/boards.d.ts +10 -0
  59. package/dist/types/server/operations/ops/export.d.ts +2 -0
  60. package/dist/types/server/operations/ops/imports.d.ts +2 -0
  61. package/dist/types/server/operations/ops/json-render.d.ts +2 -0
  62. package/dist/types/server/operations/ops/nodes.d.ts +4 -2
  63. package/dist/types/server/operations/ops/query.d.ts +2 -0
  64. package/dist/types/server/operations/registry.d.ts +9 -1
  65. package/dist/types/server/operations/types.d.ts +1 -1
  66. package/dist/types/server/server.d.ts +1 -0
  67. package/dist/types/server/trace-manager.d.ts +7 -0
  68. package/dist/types/server/web-artifacts.d.ts +3 -0
  69. package/dist/types/server/webpage-node.d.ts +22 -1
  70. package/dist/types/server/workbench-auth.d.ts +3 -0
  71. package/dist/types/shared/boards.d.ts +6 -0
  72. package/dist/types/shared/tour.d.ts +72 -0
  73. package/docs/RELEASE.md +5 -0
  74. package/docs/cli.md +157 -0
  75. package/docs/http-api.md +277 -6
  76. package/docs/mcp.md +96 -7
  77. package/docs/node-types.md +106 -0
  78. package/docs/plans/plan-010-attributed-ask-answers.md +39 -0
  79. package/docs/plans/plan-011-context-read-instrumentation.md +54 -0
  80. package/docs/plans/plan-012-many-boards-stage-1.md +98 -0
  81. package/docs/plans/plan-013-static-board-export.md +47 -0
  82. package/docs/plans/plan-014-connected-board-memory.md +140 -0
  83. package/docs/product-vision-2026-09.md +118 -18
  84. package/docs/sdk.md +50 -0
  85. package/package.json +1 -1
  86. package/skills/pmx-canvas/SKILL.md +62 -5
  87. package/skills/pmx-canvas/references/full-reference.md +44 -8
  88. package/skills/pmx-canvas/references/github-copilot-app-adapter.md +3 -0
  89. package/skills/pmx-canvas/references/installing-pmx-canvas.md +4 -4
  90. package/skills/pmx-canvas-orchestration/SKILL.md +5 -0
  91. package/skills/pmx-canvas-testing/SKILL.md +4 -0
  92. package/src/cli/agent.ts +9 -0
  93. package/src/cli/commands/ax.ts +13 -0
  94. package/src/cli/commands/backup.ts +66 -0
  95. package/src/cli/commands/boards.ts +71 -0
  96. package/src/cli/commands/export.ts +30 -0
  97. package/src/cli/commands/nodes.ts +14 -1
  98. package/src/cli/commands/pins.ts +6 -2
  99. package/src/cli/commands/pump.ts +3 -0
  100. package/src/cli/commands/query.ts +33 -7
  101. package/src/cli/commands/record.ts +218 -0
  102. package/src/cli/commands/view.ts +7 -5
  103. package/src/cli/index.ts +21 -9
  104. package/src/client/App.tsx +28 -4
  105. package/src/client/canvas/AgentPresenceLayer.tsx +1 -1
  106. package/src/client/canvas/BoardCopyDialog.tsx +153 -0
  107. package/src/client/canvas/BoardFolderDialog.tsx +120 -0
  108. package/src/client/canvas/BoardLinkDialog.tsx +93 -0
  109. package/src/client/canvas/BoardSwitcher.tsx +149 -0
  110. package/src/client/canvas/CanvasNode.tsx +8 -0
  111. package/src/client/canvas/CanvasViewport.tsx +3 -0
  112. package/src/client/canvas/CommandPalette.tsx +107 -4
  113. package/src/client/canvas/ContextMenu.tsx +4 -0
  114. package/src/client/canvas/ExpandedNodeOverlay.tsx +3 -0
  115. package/src/client/canvas/ExportDialog.tsx +197 -0
  116. package/src/client/canvas/HomeView.tsx +277 -0
  117. package/src/client/canvas/IntentLayer.tsx +9 -2
  118. package/src/client/canvas/Presentation.tsx +108 -0
  119. package/src/client/canvas/SessionPanel.tsx +28 -1
  120. package/src/client/canvas/ToolRail.tsx +38 -3
  121. package/src/client/canvas/TopBar.tsx +49 -7
  122. package/src/client/canvas/import-files.ts +19 -1
  123. package/src/client/canvas/kind-colors.ts +1 -0
  124. package/src/client/canvas/use-node-drag.ts +8 -3
  125. package/src/client/icons.tsx +2 -0
  126. package/src/client/mermaid-entry.ts +39 -0
  127. package/src/client/nodes/AttachmentNode.tsx +148 -0
  128. package/src/client/nodes/BoardNode.tsx +35 -0
  129. package/src/client/nodes/FileNode.tsx +6 -0
  130. package/src/client/nodes/HtmlNode.tsx +12 -13
  131. package/src/client/nodes/MarkdownNode.tsx +47 -19
  132. package/src/client/nodes/McpAppNode.tsx +105 -13
  133. package/src/client/nodes/MermaidNode.tsx +3 -2
  134. package/src/client/nodes/ax-node-actions.ts +2 -5
  135. package/src/client/nodes/use-ax-surface-bridge.ts +1 -1
  136. package/src/client/state/boards-store.ts +167 -0
  137. package/src/client/state/canvas-store.ts +22 -0
  138. package/src/client/state/intent-bridge.ts +30 -2
  139. package/src/client/state/intent-store.ts +5 -1
  140. package/src/client/state/node-factory.ts +1 -0
  141. package/src/client/state/presentation.ts +7 -0
  142. package/src/client/state/session-store.ts +8 -0
  143. package/src/client/state/sse-bridge.ts +52 -5
  144. package/src/client/theme/global.css +498 -28
  145. package/src/client/types.ts +2 -0
  146. package/src/json-render/server.ts +45 -9
  147. package/src/mcp/canvas-access.ts +59 -22
  148. package/src/mcp/context-uri-template.ts +28 -0
  149. package/src/mcp/server.ts +122 -15
  150. package/src/server/agent-context.ts +116 -29
  151. package/src/server/agent-presence.ts +15 -9
  152. package/src/server/attribution.ts +29 -0
  153. package/src/server/ax-context.ts +4 -2
  154. package/src/server/ax-interaction.ts +1 -0
  155. package/src/server/ax-state-manager.ts +72 -3
  156. package/src/server/ax-state.ts +41 -0
  157. package/src/server/backup.ts +178 -0
  158. package/src/server/board-export.ts +686 -0
  159. package/src/server/canvas-db.ts +612 -105
  160. package/src/server/canvas-operations.ts +183 -31
  161. package/src/server/canvas-provenance.ts +1 -0
  162. package/src/server/canvas-schema.ts +22 -0
  163. package/src/server/canvas-state.ts +812 -48
  164. package/src/server/canvas-validation.ts +9 -1
  165. package/src/server/context-brief.ts +372 -0
  166. package/src/server/context-reads.ts +238 -0
  167. package/src/server/demo-state.json +670 -9
  168. package/src/server/document-import.ts +223 -0
  169. package/src/server/html-primitives.ts +199 -91
  170. package/src/server/html-surface.ts +8 -3
  171. package/src/server/index.ts +243 -5
  172. package/src/server/mutation-history.ts +10 -13
  173. package/src/server/operations/composites.ts +29 -5
  174. package/src/server/operations/http.ts +9 -3
  175. package/src/server/operations/index.ts +8 -0
  176. package/src/server/operations/invoker.ts +14 -3
  177. package/src/server/operations/mcp.ts +50 -11
  178. package/src/server/operations/ops/app.ts +15 -0
  179. package/src/server/operations/ops/ax-read.ts +10 -6
  180. package/src/server/operations/ops/ax-timeline.ts +75 -0
  181. package/src/server/operations/ops/backup.ts +134 -0
  182. package/src/server/operations/ops/batch.ts +20 -4
  183. package/src/server/operations/ops/boards.ts +351 -0
  184. package/src/server/operations/ops/export.ts +74 -0
  185. package/src/server/operations/ops/ext-app.ts +4 -0
  186. package/src/server/operations/ops/groups.ts +14 -7
  187. package/src/server/operations/ops/imports.ts +220 -0
  188. package/src/server/operations/ops/json-render.ts +37 -5
  189. package/src/server/operations/ops/nodes.ts +99 -21
  190. package/src/server/operations/ops/query.ts +206 -9
  191. package/src/server/operations/ops/viewport.ts +32 -0
  192. package/src/server/operations/registry.ts +129 -31
  193. package/src/server/operations/types.ts +1 -1
  194. package/src/server/scope-fence.ts +1 -1
  195. package/src/server/server.ts +155 -8
  196. package/src/server/spatial-analysis.ts +9 -17
  197. package/src/server/trace-manager.ts +19 -0
  198. package/src/server/web-artifacts.ts +11 -3
  199. package/src/server/webpage-node.ts +173 -13
  200. package/src/server/workbench-auth.ts +11 -0
  201. package/src/server/workboard.ts +3 -3
  202. package/src/shared/boards.ts +18 -0
  203. package/src/shared/node-sizes.ts +1 -0
  204. package/src/shared/tour.ts +87 -0
@@ -418,14 +418,77 @@ async function startPanelServer(instanceId, ctx, pmx) {
418
418
  return { server, url: `http://127.0.0.1:${port}/`, entry };
419
419
  }
420
420
 
421
- async function getAxContext(baseUrl, workspaceRoot, input = {}) {
421
+ async function getAxContext(baseUrl, workspaceRoot, input = {}, options = {}) {
422
422
  const resolved = baseUrl
423
423
  ? { ok: true, baseUrl }
424
424
  : await resolvePmxServer({ input, session: { workingDirectory: workspaceRoot } }, { autoStart: false });
425
425
  if (!resolved.ok || !resolved.baseUrl) {
426
426
  return { ok: false, error: resolved.error ?? "PMX Canvas server is unavailable." };
427
427
  }
428
- return await fetchJson(resolved.baseUrl, "/api/canvas/ax/context", { timeoutMs: 2_000 });
428
+ // A proxied read is one this extension records itself with what it actually
429
+ // injected (after truncation), so the server does not record it again.
430
+ const headers = { "x-pmx-source": "copilot", ...(options.proxied ? { "x-pmx-proxied-read": "1" } : {}) };
431
+ return await fetchJson(resolved.baseUrl, "/api/canvas/ax/context", { headers, timeoutMs: 2_000 });
432
+ }
433
+
434
+ function deliveredPinnedIds(pinnedNodeIds, payloadText) {
435
+ const pinned = new Set(pinnedNodeIds);
436
+ const delivered = new Set();
437
+ const objectStarts = [];
438
+ let inString = false;
439
+ let escaped = false;
440
+ for (let index = 0; index < payloadText.length; index += 1) {
441
+ const character = payloadText[index];
442
+ if (inString) {
443
+ if (escaped) escaped = false;
444
+ else if (character === "\\") escaped = true;
445
+ else if (character === '"') inString = false;
446
+ continue;
447
+ }
448
+ if (character === '"') {
449
+ inString = true;
450
+ } else if (character === "{") {
451
+ objectStarts.push(index);
452
+ } else if (character === "}" && objectStarts.length > 0) {
453
+ const start = objectStarts.pop();
454
+ try {
455
+ const value = JSON.parse(payloadText.slice(start, index + 1));
456
+ if (value && !Array.isArray(value) && typeof value === "object" &&
457
+ Object.hasOwn(value, "id") && typeof value.id === "string" && pinned.has(value.id)) {
458
+ delivered.add(value.id);
459
+ }
460
+ } catch {
461
+ // An inner object may be complete even when its containing object was clipped.
462
+ }
463
+ }
464
+ }
465
+ return pinnedNodeIds.filter((id) => delivered.has(id));
466
+ }
467
+
468
+ /** Records what the per-prompt hook injected, so delivery is measured on what Copilot received. */
469
+ async function recordInjectedContext(baseUrl, context, injected) {
470
+ const pinnedNodeIds = Array.isArray(context?.pinned?.nodeIds) ? context.pinned.nodeIds : [];
471
+ const text = injected ?? "";
472
+ try {
473
+ await fetchJson(baseUrl, "/api/canvas/ax/context-reads", {
474
+ method: "POST",
475
+ headers: { "Content-Type": "application/json", "x-pmx-source": "copilot" },
476
+ body: JSON.stringify({
477
+ channel: "adapter",
478
+ resource: "copilot:prompt-context",
479
+ source: "copilot",
480
+ consumer: "copilot",
481
+ boardId: context.boardId,
482
+ pinnedNodeIds,
483
+ // Same rule as the server (context-reads.ts): a node object with that id, not a bare id list.
484
+ deliveredNodeIds: deliveredPinnedIds(pinnedNodeIds, text),
485
+ bytes: Buffer.byteLength(text, "utf-8"),
486
+ }),
487
+ timeoutMs: 1_500,
488
+ });
489
+ } catch {
490
+ // Instrumentation must never block the prompt.
491
+ }
429
492
  }
430
493
 
431
494
  async function getAxStatus(ctx) {
@@ -860,8 +923,9 @@ copilotSession = await joinSession({
860
923
  void postPresence(workspaceRoot, { attached: true, phase: "thinking", detail: null });
861
924
  const resolved = await resolvePmxServer({ input: {}, session: { workingDirectory: workspaceRoot } }, { autoStart: false });
862
925
  if (!resolved.ok || !resolved.baseUrl) return undefined;
863
- const context = await getAxContext(resolved.baseUrl, workspaceRoot, {});
926
+ const context = await getAxContext(resolved.baseUrl, workspaceRoot, {}, { proxied: true });
864
927
  const additionalContext = formatAdditionalContext(context, resolved.baseUrl);
928
+ void recordInjectedContext(resolved.baseUrl, context, additionalContext);
865
929
  return additionalContext ? { additionalContext } : undefined;
866
930
  },
867
931
  },
package/CHANGELOG.md CHANGED
@@ -3,6 +3,79 @@
3
3
  All notable changes to `pmx-canvas` are documented here. This project follows
4
4
  [Semantic Versioning](https://semver.org/).
5
5
 
6
+ ## [Unreleased]
7
+
8
+ ## [0.7.0] - 2026-09-29
9
+
10
+ ### Highlights
11
+
12
+ - Keep your work in named boards, organized into nested folders and connected by board links.
13
+ - Search across your library and give agents source-labelled context from related boards.
14
+ - Turn document attachments into reviewable Markdown using your connected agent's tools.
15
+ - Share a board as a standalone HTML file and back up the whole library.
16
+
17
+ ### Breaking
18
+
19
+ - The database migrates to multi-board storage and cannot be opened by older versions. Before downgrading, restore the automatic `canvas.db.pre-boards` copy or a pre-upgrade backup; changes made after migration are not in that copy.
20
+
21
+ ### Changed
22
+
23
+ - The canvas database now stores many named boards. On first start your current board becomes a board named after the workspace, every old snapshot becomes a board of its own, and a copy of the old file is kept as `canvas.db.pre-boards` (older versions cannot open the migrated file).
24
+ - Agent context and search now read chart values, diagram labels and structured card text instead of raw renderer configuration.
25
+ - Questions, approvals and mode requests record who asked and answered them, including self-answers; this attribution describes the writer and does not grant permission.
26
+
27
+ ### Added
28
+
29
+ - Sort boards into categories on Home; each category is its own section you can fold away, and boards migrated from old snapshots start in a folded "From old snapshots" section.
30
+ - Export a board as one HTML file anyone can open without installing anything, from **Export** in the top bar or `pmx-canvas export`; the dialog lists what goes into the file first, and local file contents stay out unless you include them.
31
+ - Back up every board with `pmx-canvas backup`, schedule server-run copies with `pmx-canvas backup schedule --every 24h`, and bring a backup back with `pmx-canvas restore` (the replaced file is kept); Home has no backup button.
32
+ - The top bar shows the open board; click it to switch to a recent board, create a new one, or go Home, where you can open, rename, and delete boards (deleting asks first).
33
+ - Agents can list, read and create boards with `canvas_board`, `canvas://boards`, `pmx-canvas board list|create|rename`, and the `/api/canvas/boards` routes; only you open, switch or delete a board.
34
+ - Agent writes go to the board you have open; on Home, an agent's first write opens your most recent board, or creates one if there are none.
35
+ - The canvas now records which context each agent reads and whether your pinned nodes were in it, readable with `pmx-canvas ax reads`, `canvas_ax_timeline { action: "reads" }`, or `GET /api/canvas/ax/context-reads`.
36
+ - Designate a Markdown card as a board README, add text-only board-link cards, inspect outgoing links and backlinks, and search cards across the library without switching boards.
37
+ - Preview and create an inactive board from selected reusable cards and optional groups/README; copied cards receive fresh IDs and omit pins, AX state and history.
38
+ - Read a character-bounded cross-board brief with source IDs over MCP, HTTP, CLI or SDK; a durable cursor is used only when a stable consumer ID is supplied.
39
+ - Attach PDF and Office originals up to 20 MiB, explicitly ask the connected agent to draft source-linked Markdown, and review it before adding it to the board; Canvas does not bundle conversion or launch an agent automatically.
40
+
41
+ ### Known limitations
42
+
43
+ - Document extraction depends on the connected agent's available tools; remote byte transfer, OCR, unreadable charts, and some host formats may be unavailable.
44
+ - A graph map, direct card-to-card edges across boards, and wiki-link syntax are not implemented.
45
+
46
+ ### Fixed
47
+
48
+ - Snapshots can only be read, restored, renamed or deleted on their owning board.
49
+ - Slow file imports no longer land on a board opened after the drop, and rapid board switches keep their intended order.
50
+ - Recent boards remain correctly ordered when multiple opens happen within one millisecond.
51
+ - HTTP board switching and deletion require the trusted workbench token, not just the UI marker.
52
+ - `pmx-canvas pump` no longer crashes when its command exits without reading the steer; the exit code decides, as intended.
53
+ - A change the server refuses in the browser now shows a toast with the reason instead of failing silently.
54
+ - Webpage nodes refuse redirects that move a public page onto a private or loopback address, and never fetch link-local (cloud metadata) addresses.
55
+
56
+ ### Internal
57
+
58
+ - The e2e gate now checks that every node type paints in a 600 px Chromium pane, the width of the agent-host panels the workbench lives in.
59
+
60
+ ## [0.6.5] - 2026-09-26
61
+
62
+ ### Added
63
+
64
+ - Present saved board tours or derive stops from groups, with keyboard navigation and optional local PNG/MP4 capture using the same camera path.
65
+ - Creation responses report requested and applied sizes, including group fitting, across HTTP, MCP, and batches.
66
+ - JSON-render warns when unbound form values would be ignored.
67
+
68
+ ### Fixed
69
+
70
+ - Workboards use equal-width columns across narrow and wide frames.
71
+ - Embedded HTML and JSON-render updates keep the previous frame visible until the replacement is ready.
72
+ - Explicitly empty HTML primitive fields omit their sections instead of inserting example content.
73
+ - Mermaid diagrams fit overflowing content without enlarging small diagrams; authored sizes and optional natural scrolling are preserved.
74
+ - Titlebar clicks select nodes without adding a selection after a drag.
75
+ - Detached agents expire promptly, workers roll up under their parent, and camera operations no longer claim writer activity.
76
+ - Unchanged and worker sessions do not replace useful receipts or reopen the panel.
77
+ - Ghosts finish their rendered settle animation before removal, and tour-only changes create distinct snapshots.
78
+
6
79
  ## [0.6.4] - 2026-09-24
7
80
 
8
81
  ### Added
package/Readme.md CHANGED
@@ -18,6 +18,12 @@ structured panel into place as they generate it — not as a separate tooling
18
18
  project. Pin what matters and the agent reads your spatial curation as
19
19
  structured context.
20
20
 
21
+ **The board is the presentation.** Click **Present** to step through a saved tour
22
+ (or groups in reading order), with chrome hidden and smooth camera moves.
23
+ Optionally capture that same tour with
24
+ `pmx-canvas record --mode deterministic --present --output tour.mp4`. See the
25
+ [tour model and CLI walkthrough](docs/cli.md#tour-and-presentation).
26
+
21
27
  <p align="center">
22
28
  <img src="docs/screenshots/workbench-live-dark.png" alt="Live multi-agent workbench — dark theme: two agents on the board, review cards, an architecture diagram, and the writers pill" width="49%" />
23
29
  <img src="docs/screenshots/workbench-live-light.png" alt="Live multi-agent workbench — light theme" width="49%" />
@@ -35,6 +41,15 @@ in real time. Either side adds material; the human curates spatial structure
35
41
  `canvas://pinned-context` and acts on it. Spatial arrangement is
36
42
  communication — proximity means relatedness, pinning means *focus here*.
37
43
 
44
+ The database holds many named boards. **Home is the library view, not a board**:
45
+ it lists recent boards and nested category paths (up to eight 60-character
46
+ segments). Empty folders are not independent objects; they exist only while a
47
+ board is filed beneath them. Only a human opens/switches or deletes a board.
48
+ Agents may list, read, create, rename, categorize, search, and create an inactive
49
+ board from selected reusable cards without disturbing the board in view. Home
50
+ provides a copy-preview dialog; an open board's command palette offers a
51
+ board-link picker. Neither depends on native browser prompts.
52
+
38
53
  ## Main features
39
54
 
40
55
  ### 01 / Curate
@@ -67,6 +82,14 @@ the canvas is the union of its [built-in node types](docs/node-types.md) and
67
82
  **whatever your agent's harness already has access to** — MCP servers, CLIs,
68
83
  file reads, web fetch, anything on its toolbelt.
69
84
 
85
+ Dropping a PDF or Office document attaches the original (up to 20 MiB). It does
86
+ not bundle a converter or automatically launch an agent. After you explicitly
87
+ request agent-assisted import and consent to processing by the connected host's
88
+ tools/model provider, the agent fetches the controlled bytes, returns Markdown
89
+ sections with references and warnings, and you review before adding them to the
90
+ board. Remote hosts may require manual transfer; OCR, charts, and host format
91
+ support are not guaranteed.
92
+
70
93
  JSON-render panels support bound form state, nested repeats, watchers, and Card
71
94
  header/footer slots. Form edits remain viewer-local until explicitly submitted;
72
95
  see [JSON-render nodes](docs/node-types.md#json-render-nodes). Authored iframe cards
@@ -170,15 +193,21 @@ and the `pmx-canvas-orchestration` skill documents the choreography.
170
193
 
171
194
  Spatial state auto-saves to `.pmx-canvas/canvas.db` (debounced ~500 ms) —
172
195
  git-committable, shareable across machines, and survives both browser
173
- refresh and server restart. Named [snapshots](docs/mcp.md), full
196
+ refresh and server restart. Autosave is not a backup: `pmx-canvas backup` and
197
+ its optional server-run schedule copy the whole board library, while restore
198
+ keeps the replaced database. Backup and scheduling are backend/CLI operations;
199
+ there is no Home backup button. A board can also be exported as a self-contained
200
+ HTML file. Export previews what is included, omits local file contents unless
201
+ explicitly requested, and locks board-link cards because an exported file has
202
+ no live target library (the target title is not embedded). Named [snapshots](docs/mcp.md), full
174
203
  undo/redo, and an auto-detected code graph (JS/TS, Python, Go, Rust) make
175
204
  the canvas durable rather than throwaway. Stop the server before committing
176
205
  the DB so SQLite WAL data is checkpointed into the file.
177
206
 
178
207
  ### 07 / Any agent
179
208
 
180
- Harness-agnostic. Drive the canvas from [MCP](docs/mcp.md) (22 tools,
181
- 14 resources, change notifications), the [CLI](docs/cli.md), the
209
+ Harness-agnostic. Drive the canvas from [MCP](docs/mcp.md) (24 tools,
210
+ 15 static canvas resources plus one context resource template, change notifications), the [CLI](docs/cli.md), the
182
211
  [HTTP API](docs/http-api.md), or the [Bun SDK](docs/sdk.md) — all
183
212
  [environment variables documented here](docs/environment.md). Works with
184
213
  Claude Code, the GitHub Copilot app and CLI, Codex, Amp, Cursor, Windsurf, or
@@ -372,7 +401,7 @@ services:
372
401
  ```bash
373
402
  # .agents/setup — install the CLI (pin the exact version: a fresh orb running
374
403
  # @latest can silently pick up a newer release than the one you validated)
375
- npm install -g pmx-canvas@0.6.4
404
+ npm install -g pmx-canvas@0.7.0
376
405
  ```
377
406
 
378
407
  The server binds the portal-assigned `$PORT` automatically (gated on the
@@ -438,7 +467,8 @@ paths, screenshots, or logs are attached automatically.
438
467
  the three-tier visual matrix (json-render → html → web-artifact)
439
468
  - **[CLI reference](docs/cli.md)** — full command surface, daemon mode,
440
469
  watch streams, WebView automation
441
- - **[MCP reference](docs/mcp.md)** — 22 tools, 14 core resources plus bundled
470
+ - **[MCP reference](docs/mcp.md)** — 24 tools, 15 static canvas resources, one
471
+ context resource template, plus bundled
442
472
  skill resources, Skills extension, change notifications, node-type routing
443
473
  - **[HTTP API](docs/http-api.md)** — REST endpoints, SSE, batch operations
444
474
  - **[AX host-adapter contract](docs/ax-host-adapter-contract.md)** — how native