pmx-canvas 0.10.0 → 0.12.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 (343) hide show
  1. package/.github/extensions/pmx-canvas/extension.mjs +3 -1
  2. package/.github/extensions/pmx-canvas/runtime.json +1 -1
  3. package/.github/extensions/pmx-canvas/tools.json +688 -128
  4. package/CHANGELOG.md +69 -0
  5. package/dist/amp-plugin/pmx-canvas/LICENSE +21 -0
  6. package/dist/amp-plugin/pmx-canvas/THIRD_PARTY_LICENSES.txt +331 -0
  7. package/dist/amp-plugin/pmx-canvas/index.js +5445 -0
  8. package/dist/amp-plugin/pmx-canvas/runtime.json +3 -0
  9. package/dist/amp-plugin/pmx-canvas/shared-runtime.mjs +194 -0
  10. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/SKILL.md +251 -0
  11. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/evals.json +1086 -0
  12. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/jwt.ts +17 -0
  13. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/login.ts +12 -0
  14. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/middleware.ts +13 -0
  15. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/routes/auth.ts +13 -0
  16. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/investigation-board/src/handlers/users.ts +27 -0
  17. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/mcp.json +36 -0
  18. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/ax-html-control-surface.md +101 -0
  19. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/codex-app-adapter.md +151 -0
  20. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/excalidraw-diagram-authoring.md +150 -0
  21. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/full-reference.md +1785 -0
  22. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/github-copilot-app-adapter.md +223 -0
  23. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/html-primitives.md +139 -0
  24. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/importing-context.md +132 -0
  25. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/installing-pmx-canvas.md +251 -0
  26. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/tours-and-recording.md +111 -0
  27. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/workbench-workflows.md +900 -0
  28. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas-orchestration/SKILL.md +141 -0
  29. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas-testing/SKILL.md +266 -0
  30. package/dist/amp-plugin/pmx-canvas/start-mcp.mjs +14857 -0
  31. package/dist/amp-plugin/pmx-canvas/tools.json +10963 -0
  32. package/dist/canvas/chunks/abnfDiagram-N423BO3Z-cwtsds5d.js +1 -0
  33. package/dist/canvas/chunks/architecture-TIHT7OUA-x63cwejs.js +1 -0
  34. package/dist/canvas/chunks/architectureDiagram-T3A2C74G-b4xc9tpz.js +36 -0
  35. package/dist/canvas/chunks/blockDiagram-VBNYF7ZC-ahp3yxxs.js +132 -0
  36. package/dist/canvas/chunks/c4Diagram-5PPSVZJV-nappnay7.js +10 -0
  37. package/dist/canvas/chunks/classDiagram-JCYQIIEL-k1j2xc1t.js +1 -0
  38. package/dist/canvas/chunks/classDiagram-v2-OCEON4UE-33x08xf2.js +1 -0
  39. package/dist/canvas/chunks/cose-bilkent-JH36ORCC-a428syda.js +1 -0
  40. package/dist/canvas/chunks/cynefin-VYW2F7L2-8v6jxfz8.js +1 -0
  41. package/dist/canvas/chunks/cynefinDiagram-MW4NZA55-nspsqebj.js +62 -0
  42. package/dist/canvas/chunks/dagre-VZM6K2ZE-8y6177fh.js +4 -0
  43. package/dist/canvas/chunks/diagram-7IWD3JNH-vym028wn.js +30 -0
  44. package/dist/canvas/chunks/diagram-B4RE2ZJO-jddqb8sy.js +3 -0
  45. package/dist/canvas/chunks/diagram-LBJQPF4R-bjwbpkrn.js +24 -0
  46. package/dist/canvas/chunks/diagram-Q27KOJAE-j6ph6hcx.js +24 -0
  47. package/dist/canvas/chunks/diagram-UB23O5K3-p09w8jej.js +41 -0
  48. package/dist/canvas/chunks/ebnfDiagram-BXEA7PRR-j975ycq5.js +1 -0
  49. package/dist/canvas/chunks/erDiagram-JOGREHBK-sxp6hjn8.js +85 -0
  50. package/dist/canvas/chunks/eventmodeling-45OFAUF4-xzfgn6xg.js +1 -0
  51. package/dist/canvas/chunks/flowDiagram-UKHOOZJN-2nsmkskb.js +1 -0
  52. package/dist/canvas/chunks/ganttDiagram-PKOTCBZU-4tv230y2.js +292 -0
  53. package/dist/canvas/chunks/gitGraph-TEB2WS4Q-macbhand.js +1 -0
  54. package/dist/canvas/chunks/gitGraphDiagram-DS77QQ5N-mqgmnw9g.js +106 -0
  55. package/dist/canvas/chunks/index-037z5dz2.js +232 -0
  56. package/dist/canvas/chunks/index-081n3har.js +207 -0
  57. package/dist/canvas/chunks/index-5n03dmb9.js +2 -0
  58. package/dist/canvas/chunks/index-5tv8v1hk.js +1 -0
  59. package/dist/canvas/chunks/index-60pgzdqe.js +157 -0
  60. package/dist/canvas/chunks/index-6ceya556.js +332 -0
  61. package/dist/canvas/chunks/index-8g1vb57n.js +2 -0
  62. package/dist/canvas/chunks/index-8rjes9r6.js +2 -0
  63. package/dist/canvas/chunks/index-9022d1n9.js +16 -0
  64. package/dist/canvas/chunks/index-9b02042t.js +2 -0
  65. package/dist/canvas/chunks/index-ap4q4vez.js +2 -0
  66. package/dist/canvas/chunks/index-dyp2nhd3.js +2 -0
  67. package/dist/canvas/chunks/index-frvta4tm.js +2 -0
  68. package/dist/canvas/chunks/index-gf4e0et4.js +2 -0
  69. package/dist/canvas/chunks/index-h9ycj8n2.js +2 -0
  70. package/dist/canvas/chunks/index-hj99nz1f.js +1 -0
  71. package/dist/canvas/chunks/index-mergmj97.js +2 -0
  72. package/dist/canvas/chunks/index-nwsya6dj.js +301 -0
  73. package/dist/canvas/chunks/index-nz8qbd1p.js +2 -0
  74. package/dist/canvas/chunks/index-qhfrazv3.js +2 -0
  75. package/dist/canvas/chunks/index-v119nznk.js +4 -0
  76. package/dist/canvas/chunks/index-vpt37m3d.js +89 -0
  77. package/dist/canvas/chunks/index-y9ma6azy.js +2 -0
  78. package/dist/canvas/chunks/index-zx0j3a2z.js +179 -0
  79. package/dist/canvas/chunks/info-DKCQHKI2-a0ykzs9z.js +1 -0
  80. package/dist/canvas/chunks/infoDiagram-6WML65LV-qv97qq6a.js +2 -0
  81. package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-p9306gh0.js +70 -0
  82. package/dist/canvas/chunks/journeyDiagram-NVQOT4AX-sv67zats.js +139 -0
  83. package/dist/canvas/chunks/kanban-definition-27J2QSJJ-k2pfam6p.js +89 -0
  84. package/dist/canvas/chunks/katex-dmg8k4zm.js +257 -0
  85. package/dist/canvas/chunks/mermaid.core-83r0fdce.js +12 -0
  86. package/dist/canvas/chunks/mindmap-definition-FAOFIHXS-vg2newm1.js +96 -0
  87. package/dist/canvas/chunks/packet-7NZHBO7P-tqnabcdv.js +1 -0
  88. package/dist/canvas/chunks/pegDiagram-VL7TDLO6-k2h7zc5n.js +1 -0
  89. package/dist/canvas/chunks/pie-RZYD4A2V-wke6gyhe.js +1 -0
  90. package/dist/canvas/chunks/pieDiagram-7S7Q4E2Y-hg169p1v.js +39 -0
  91. package/dist/canvas/chunks/quadrantDiagram-CIZ2JOQS-bxtvsq0b.js +7 -0
  92. package/dist/canvas/chunks/radar-I7S5WNFK-w7ka0drw.js +1 -0
  93. package/dist/canvas/chunks/railroad-3IZDKUUU-y3vg318x.js +1 -0
  94. package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-6hqvcz3c.js +1 -0
  95. package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-vcae260m.js +1 -0
  96. package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-0dbyme23.js +1 -0
  97. package/dist/canvas/chunks/railroadDiagram-AXF67PYL-njyhcp4p.js +1 -0
  98. package/dist/canvas/chunks/requirementDiagram-LRYGKXZP-2z6v09gm.js +84 -0
  99. package/dist/canvas/chunks/sankeyDiagram-W5VNT64P-15mzam0e.js +40 -0
  100. package/dist/canvas/chunks/sequenceDiagram-SI44F4Z6-rbshyd2c.js +162 -0
  101. package/dist/canvas/chunks/sizeCapture-X5ZJPWSS-sg26xwts.js +1 -0
  102. package/dist/canvas/chunks/stateDiagram-OKZ733FA-6eahp98e.js +1 -0
  103. package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-tty0ggn5.js +1 -0
  104. package/dist/canvas/chunks/swimlanes-SLNWSIFB-ze5db10t.js +1 -0
  105. package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-thze75gq.js +8 -0
  106. package/dist/canvas/chunks/timeline-definition-Z64GVDOM-vnp7jyy8.js +120 -0
  107. package/dist/canvas/chunks/treeView-QDETBFTQ-6ysffnm6.js +1 -0
  108. package/dist/canvas/chunks/treemap-6X3UGDF4-m3h9p066.js +1 -0
  109. package/dist/canvas/chunks/vennDiagram-T6HMQDX7-0qrnb7mj.js +34 -0
  110. package/dist/canvas/chunks/wardley-OPB4EBWU-dp37drwx.js +1 -0
  111. package/dist/canvas/chunks/wardleyDiagram-T6FBY63Y-8nxg8wqt.js +78 -0
  112. package/dist/canvas/chunks/xychartDiagram-ELKLHX3M-nj921e7s.js +7 -0
  113. package/dist/canvas/global.css +483 -230
  114. package/dist/canvas/index.js +158 -219
  115. package/dist/canvas/mcp-app.html +4301 -548
  116. package/dist/canvas/mermaid-entry.js +338 -338
  117. package/dist/canvas/surface-theme.css +6 -6
  118. package/dist/json-render/index.css +1 -1
  119. package/dist/json-render/index.js +49 -49
  120. package/dist/types/client/canvas/BarHint.d.ts +5 -3
  121. package/dist/types/client/canvas/BoardMoveDialog.d.ts +2 -0
  122. package/dist/types/client/canvas/CanvasNode.d.ts +0 -11
  123. package/dist/types/client/canvas/EdgeEditor.d.ts +19 -0
  124. package/dist/types/client/canvas/EdgeLayer.d.ts +1 -2
  125. package/dist/types/client/canvas/GroupNavigation.d.ts +2 -0
  126. package/dist/types/client/canvas/TextPrompt.d.ts +4 -0
  127. package/dist/types/client/canvas/auto-fit.d.ts +4 -5
  128. package/dist/types/client/mermaid-entry.d.ts +1 -2
  129. package/dist/types/client/mermaid-render.d.ts +1 -0
  130. package/dist/types/client/nodes/BoardNode.d.ts +1 -1
  131. package/dist/types/client/nodes/ExtAppFrame.d.ts +7 -90
  132. package/dist/types/client/nodes/McpAppNode.d.ts +1 -25
  133. package/dist/types/client/nodes/MermaidNode.d.ts +1 -8
  134. package/dist/types/client/nodes/PromptNode.d.ts +1 -0
  135. package/dist/types/client/nodes/ViewerFrame.d.ts +29 -0
  136. package/dist/types/client/nodes/ViewerHost.d.ts +6 -0
  137. package/dist/types/client/nodes/WorkCard.d.ts +7 -0
  138. package/dist/types/client/nodes/iframe-document-url.d.ts +3 -9
  139. package/dist/types/client/nodes/primitive-copy.d.ts +5 -0
  140. package/dist/types/client/nodes/use-ax-surface-bridge.d.ts +1 -0
  141. package/dist/types/client/nodes/use-iframe-content-height.d.ts +1 -1
  142. package/dist/types/client/nodes/use-surface-frame.d.ts +4 -6
  143. package/dist/types/client/nodes/viewer-runtime-state.d.ts +2 -1
  144. package/dist/types/client/state/canvas-store.d.ts +18 -1
  145. package/dist/types/client/state/human-store.d.ts +2 -0
  146. package/dist/types/client/state/intent-bridge.d.ts +5 -2
  147. package/dist/types/client/state/presentation.d.ts +17 -6
  148. package/dist/types/client/state/relation-store.d.ts +11 -0
  149. package/dist/types/client/types.d.ts +1 -1
  150. package/dist/types/json-render/catalog.d.ts +2 -2
  151. package/dist/types/json-render/server.d.ts +2 -1
  152. package/dist/types/server/agent-presence.d.ts +1 -0
  153. package/dist/types/server/ax-interaction.d.ts +1 -0
  154. package/dist/types/server/ax-state-manager.d.ts +10 -2
  155. package/dist/types/server/board-local.d.ts +4 -0
  156. package/dist/types/server/board-move.d.ts +38 -0
  157. package/dist/types/server/canvas-db.d.ts +12 -2
  158. package/dist/types/server/canvas-operations.d.ts +5 -6
  159. package/dist/types/server/canvas-provenance.d.ts +1 -1
  160. package/dist/types/server/canvas-serialization.d.ts +1 -0
  161. package/dist/types/server/canvas-state.d.ts +86 -20
  162. package/dist/types/server/card-relocation.d.ts +6 -0
  163. package/dist/types/server/context-reads.d.ts +3 -1
  164. package/dist/types/server/human-presence.d.ts +1 -1
  165. package/dist/types/server/index.d.ts +26 -10
  166. package/dist/types/server/intent-registry.d.ts +8 -4
  167. package/dist/types/server/knowledge-lifecycle.d.ts +4 -2
  168. package/dist/types/server/mutation-history.d.ts +7 -5
  169. package/dist/types/server/operations/ops/boards.d.ts +0 -1
  170. package/dist/types/server/operations/registry.d.ts +2 -0
  171. package/dist/types/server/tour-control.d.ts +13 -3
  172. package/dist/types/server/trace-manager.d.ts +1 -0
  173. package/dist/types/shared/ax-kinds.d.ts +6 -0
  174. package/dist/types/shared/ax-surface-protocol.d.ts +8 -9
  175. package/dist/types/shared/human-presence.d.ts +1 -0
  176. package/dist/types/shared/lifecycle-status.d.ts +2 -0
  177. package/dist/types/shared/tour.d.ts +8 -0
  178. package/docs/RELEASE.md +21 -14
  179. package/docs/agent-plugin.md +16 -2
  180. package/docs/amp-plugin.md +271 -0
  181. package/docs/cli.md +42 -3
  182. package/docs/design/Chrome.dc.html +32 -6
  183. package/docs/design/GuestName.dc.html +50 -0
  184. package/docs/design/PluginLogo.svg +7 -0
  185. package/docs/design/Types1.dc.html +3 -2
  186. package/docs/design/Types2.dc.html +1 -1
  187. package/docs/design/Types3.dc.html +1 -1
  188. package/docs/design/WorkCards.dc.html +39 -0
  189. package/docs/design/Zoom.dc.html +37 -60
  190. package/docs/design/canvas.json +17 -1
  191. package/docs/design/plugin-logo.png +0 -0
  192. package/docs/design.md +280 -12
  193. package/docs/evals/agents-md-sections.md +38 -0
  194. package/docs/http-api.md +179 -11
  195. package/docs/mcp.md +69 -9
  196. package/docs/node-types.md +109 -4
  197. package/docs/plans/plan-009-tech-debt-backlog.md +3 -3
  198. package/docs/plans/plan-019-post-0.9-roadmap.md +327 -31
  199. package/docs/plans/plan-020-wave-5-work-planning.md +553 -0
  200. package/docs/product-vision-2026-09.md +42 -17
  201. package/docs/sdk.md +18 -0
  202. package/package.json +7 -4
  203. package/plugins/pmx-canvas/assets/preview.png +0 -0
  204. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/extension.mjs +3 -1
  205. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
  206. package/plugins/pmx-canvas/plugin.json +2 -2
  207. package/plugins/pmx-canvas/runtime.json +1 -1
  208. package/plugins/pmx-canvas/tools.json +688 -128
  209. package/skills/data-analysis/SKILL.md +13 -26
  210. package/skills/frontend-design/LICENSE.txt +177 -0
  211. package/skills/frontend-design/SKILL.md +3 -0
  212. package/skills/pmx-canvas/SKILL.md +232 -849
  213. package/skills/pmx-canvas/evals/evals.json +26 -3
  214. package/skills/pmx-canvas/references/full-reference.md +89 -24
  215. package/skills/pmx-canvas/references/html-primitives.md +7 -0
  216. package/skills/pmx-canvas/references/installing-pmx-canvas.md +6 -6
  217. package/skills/pmx-canvas/references/tours-and-recording.md +29 -2
  218. package/skills/pmx-canvas/references/workbench-workflows.md +900 -0
  219. package/skills/pmx-canvas-testing/SKILL.md +7 -5
  220. package/skills/published-consumer-e2e/SKILL.md +25 -8
  221. package/skills/published-consumer-e2e/scripts/run-published-consumer-e2e.sh +51 -77
  222. package/skills/web-artifacts-builder/LICENSE.txt +202 -0
  223. package/skills/web-artifacts-builder/SKILL.md +6 -0
  224. package/skills/web-artifacts-builder/scripts/init-artifact.sh +2 -2
  225. package/src/cli/commands/apps.ts +1 -0
  226. package/src/cli/commands/boards.ts +30 -0
  227. package/src/client/App.tsx +20 -4
  228. package/src/client/canvas/AttentionHistory.tsx +10 -2
  229. package/src/client/canvas/BarHint.tsx +6 -3
  230. package/src/client/canvas/BoardMoveDialog.tsx +225 -0
  231. package/src/client/canvas/CanvasNode.tsx +79 -49
  232. package/src/client/canvas/CanvasViewport.tsx +42 -14
  233. package/src/client/canvas/ContextMenu.tsx +97 -15
  234. package/src/client/canvas/EdgeEditor.tsx +149 -0
  235. package/src/client/canvas/EdgeLayer.tsx +441 -174
  236. package/src/client/canvas/ExpandedNodeOverlay.tsx +5 -2
  237. package/src/client/canvas/GroupNavigation.tsx +85 -0
  238. package/src/client/canvas/Presentation.tsx +53 -3
  239. package/src/client/canvas/RelationsPanel.tsx +9 -0
  240. package/src/client/canvas/SelectionBar.tsx +21 -0
  241. package/src/client/canvas/SessionPanel.tsx +35 -1
  242. package/src/client/canvas/TextPrompt.tsx +18 -1
  243. package/src/client/canvas/TopBar.tsx +54 -9
  244. package/src/client/canvas/auto-fit.ts +9 -11
  245. package/src/client/canvas/canvas-area.ts +2 -2
  246. package/src/client/canvas/use-focus-trap.ts +6 -1
  247. package/src/client/mermaid-entry.ts +6 -20
  248. package/src/client/mermaid-render.ts +39 -0
  249. package/src/client/nodes/AxStepControls.tsx +45 -69
  250. package/src/client/nodes/BoardNode.tsx +65 -9
  251. package/src/client/nodes/ContextNode.tsx +88 -396
  252. package/src/client/nodes/ExtAppFrame.tsx +302 -1465
  253. package/src/client/nodes/FileNode.tsx +92 -81
  254. package/src/client/nodes/HtmlNode.tsx +8 -36
  255. package/src/client/nodes/LedgerNode.tsx +31 -17
  256. package/src/client/nodes/MarkdownNode.tsx +14 -24
  257. package/src/client/nodes/McpAppNode.tsx +48 -154
  258. package/src/client/nodes/MermaidNode.tsx +80 -69
  259. package/src/client/nodes/PromptNode.tsx +44 -17
  260. package/src/client/nodes/ResponseNode.tsx +8 -6
  261. package/src/client/nodes/StatusNode.tsx +34 -7
  262. package/src/client/nodes/StatusSummary.tsx +16 -3
  263. package/src/client/nodes/TraceNode.tsx +8 -8
  264. package/src/client/nodes/ViewerFrame.tsx +273 -0
  265. package/src/client/nodes/ViewerHost.tsx +41 -0
  266. package/src/client/nodes/WebpageNode.tsx +22 -24
  267. package/src/client/nodes/WorkCard.tsx +175 -0
  268. package/src/client/nodes/iframe-document-url.ts +20 -27
  269. package/src/client/nodes/primitive-copy.ts +97 -0
  270. package/src/client/nodes/use-ax-surface-bridge.ts +18 -14
  271. package/src/client/nodes/use-iframe-content-height.ts +34 -10
  272. package/src/client/nodes/use-surface-frame.ts +22 -11
  273. package/src/client/nodes/viewer-runtime-state.ts +41 -35
  274. package/src/client/state/attention-bridge.ts +5 -0
  275. package/src/client/state/attention-store.ts +1 -0
  276. package/src/client/state/canvas-store.ts +202 -26
  277. package/src/client/state/human-store.ts +22 -2
  278. package/src/client/state/intent-bridge.ts +20 -5
  279. package/src/client/state/presentation.ts +135 -15
  280. package/src/client/state/relation-store.ts +127 -1
  281. package/src/client/state/sse-bridge.ts +18 -19
  282. package/src/client/theme/global.css +483 -230
  283. package/src/client/theme/surface-theme.css +6 -6
  284. package/src/client/types.ts +1 -0
  285. package/src/json-render/charts/tufte-components.tsx +44 -2
  286. package/src/json-render/renderer/index.css +62 -2
  287. package/src/json-render/renderer/index.tsx +31 -7
  288. package/src/json-render/server.ts +3 -2
  289. package/src/mcp/server.ts +13 -3
  290. package/src/server/agent-presence.ts +43 -23
  291. package/src/server/ax-flow-loop.ts +6 -0
  292. package/src/server/ax-gate-ttl.ts +8 -1
  293. package/src/server/ax-interaction.ts +16 -10
  294. package/src/server/ax-state-manager.ts +17 -4
  295. package/src/server/ax-wait.ts +20 -6
  296. package/src/server/board-export.ts +54 -30
  297. package/src/server/board-local.ts +20 -0
  298. package/src/server/board-move.ts +297 -0
  299. package/src/server/canvas-db.ts +249 -158
  300. package/src/server/canvas-geometry.ts +1 -0
  301. package/src/server/canvas-operations.ts +139 -109
  302. package/src/server/canvas-schema.ts +21 -0
  303. package/src/server/canvas-serialization.ts +2 -0
  304. package/src/server/canvas-state.ts +797 -159
  305. package/src/server/card-relocation.ts +53 -0
  306. package/src/server/code-graph.ts +4 -3
  307. package/src/server/context-reads.ts +83 -55
  308. package/src/server/demo-state.json +140 -114
  309. package/src/server/file-watcher.ts +30 -10
  310. package/src/server/html-primitives.ts +3 -9
  311. package/src/server/html-surface.ts +8 -0
  312. package/src/server/human-presence.ts +18 -5
  313. package/src/server/index.ts +54 -24
  314. package/src/server/intent-registry.ts +43 -5
  315. package/src/server/knowledge-lifecycle.ts +32 -9
  316. package/src/server/lifecycle-status.ts +29 -1
  317. package/src/server/mcp-app-runtime.ts +26 -7
  318. package/src/server/mutation-history.ts +37 -8
  319. package/src/server/operations/composites.ts +6 -3
  320. package/src/server/operations/mcp-contracts.ts +32 -2
  321. package/src/server/operations/mcp.ts +36 -9
  322. package/src/server/operations/ops/annotation.ts +22 -1
  323. package/src/server/operations/ops/ax-await.ts +1 -0
  324. package/src/server/operations/ops/ax-timeline.ts +28 -2
  325. package/src/server/operations/ops/batch.ts +25 -11
  326. package/src/server/operations/ops/boards.ts +45 -6
  327. package/src/server/operations/ops/nodes.ts +70 -0
  328. package/src/server/operations/ops/query.ts +32 -3
  329. package/src/server/operations/ops/snapshots.ts +1 -0
  330. package/src/server/operations/ops/viewport.ts +11 -9
  331. package/src/server/operations/registry.ts +49 -4
  332. package/src/server/server.ts +69 -75
  333. package/src/server/tour-control.ts +97 -12
  334. package/src/server/trace-manager.ts +4 -0
  335. package/src/server/web-artifacts/scripts/init-artifact.sh +2 -2
  336. package/src/shared/agent-context.ts +7 -1
  337. package/src/shared/auto-arrange.ts +5 -4
  338. package/src/shared/ax-kinds.ts +13 -0
  339. package/src/shared/ax-surface-protocol.ts +20 -9
  340. package/src/shared/content-height-reporter.ts +4 -3
  341. package/src/shared/human-presence.ts +1 -0
  342. package/src/shared/lifecycle-status.ts +2 -0
  343. package/src/shared/tour.ts +8 -0
@@ -536,8 +536,8 @@
536
536
  {
537
537
  "id": 22,
538
538
  "name": "tour-authoring-and-capture",
539
- "prompt": "Turn the Overview group and the Results card into a presentation tour, then tell me how to capture it deterministically at 1920x1080. I want a one-second overview move, a zero-duration jump to Results, and no changes to another viewer's camera.",
540
- "expected_output": "Targets the intended board, resolves the real group/card IDs, persists one tour with canvas_view set-tour, and uses valid node targets with durations 1 and 0. Explains that presentation is viewer-local and does not auto-advance. Gives deterministic record guidance using the same saved tour, --resolution 1920x1080, --present, and a new output path after verifying the matching daemon/workspace and Chrome/Bun WebView prerequisites. Does not invent a separate recording timeline or use realtime --duration.",
539
+ "prompt": "On the current board, turn the Overview group and the Results card into a presentation tour, then tell me how to capture it deterministically at 1920x1080. I want a one-second overview move, a zero-duration jump to Results, and no changes to another viewer's camera. That viewer is already presenting.",
540
+ "expected_output": "Verifies the current board, resolves the real group/card IDs, persists one tour with canvas_view set-tour, and uses valid node targets with durations 1 and 0. Distinguishes viewer-local rendering/free pan and isolated recording from shared tour navigation and exit. Does not call tour-go, tour-exit or move, switch boards, or use human Next/Back controls. Explains that present:false still advances viewers already presenting. Gives deterministic record guidance using the same saved tour, --resolution 1920x1080, --present, and a new output path after verifying the matching daemon/workspace and Chrome/Bun WebView prerequisites. Does not invent a separate recording timeline or use realtime --duration.",
541
541
  "assertions": [
542
542
  {
543
543
  "name": "persists-valid-shared-tour-model",
@@ -556,7 +556,30 @@
556
556
  },
557
557
  {
558
558
  "name": "preserves-viewer-camera",
559
- "description": "States that the presentation/capture camera is local and stops advance manually, rather than moving another viewer's camera",
559
+ "description": "Keeps the already-presenting viewer unchanged by avoiding shared tour-go/tour-exit/move, board switching and human navigation; distinguishes isolated capture from the shared cursor and does not treat present:false as isolation",
560
+ "type": "output_check"
561
+ }
562
+ ]
563
+ },
564
+ {
565
+ "id": 44,
566
+ "name": "presenter-superseded-is-not-applied-navigation",
567
+ "prompt": "In a disposable board, verify optional presenter ordering. Send a valid go with intent 2, then an exit with intent 1 for the same document and activation. Repeat with a stale activation. Include an independent-document control and an ordinary unfenced call. Can ok:true or the SDK exit return prove the stale command ran?",
568
+ "expected_output": "Reads the actual activation stamps and uses positive safe-integer intents with independent document IDs. Checks applied delivery stamps and cursor/event behavior. Older intent and stale activation return ok:true,superseded:true without a navigation event or cursor change. Independent and unfenced controls still apply. Explains that the fence orders requests, does not grant authority or isolate viewers, and that SDK exit returns void while fenced go may return superseded:true. Does not count eval definitions as executed evidence.",
569
+ "assertions": [
570
+ {
571
+ "name": "checks-superseded-side-effects",
572
+ "description": "Observes no navigation event or cursor change for stale intent and activation, rather than treating ok:true as applied navigation",
573
+ "type": "output_check"
574
+ },
575
+ {
576
+ "name": "positive-controls-and-stamps",
577
+ "description": "Verifies applied epoch/generation/sequence for the newer request and exercises independent-document and unfenced calls without inventing mandatory presenter credentials",
578
+ "type": "output_check"
579
+ },
580
+ {
581
+ "name": "sdk-return-boundary",
582
+ "description": "Distinguishes fenced go's superseded result from exit's void return and avoids claiming viewer isolation or authority from the fence",
560
583
  "type": "output_check"
561
584
  }
562
585
  ]
@@ -349,7 +349,7 @@ The CLI targets `http://localhost:4313` by default. Override with `PMX_CANVAS_UR
349
349
  | Type | Purpose | When to use |
350
350
  |------|---------|-------------|
351
351
  | `markdown` | Rich formatted content | Explanations, documentation, notes, findings |
352
- | `status` | Compact color-coded indicator | Progress tracking, build/test results, task state |
352
+ | `status` | Compact status or deliberately authored work card | Work plans with `data.workState`; phase/tool status without it |
353
353
  | `file` | Live file viewer (auto-watches) | Show source code with live updates on file change |
354
354
  | `image` | Image display | Screenshots, diagrams, charts |
355
355
  | `context` | Context card | Key context the human should see |
@@ -419,6 +419,9 @@ contract). Their meaning comes from the node **type** and value instead: a `stat
419
419
  `waiting` — e.g. `review` → green, `running` → accent; an unrecognized phase renders gray), and a
420
420
  `trace` node from its `status` field (`success` → green, `failed` → red, `running` → accent). To
421
421
  color an arbitrary region, group the nodes and set the group's `color`.
422
+ Authored status cards with `data.workState` instead use the work-state glyph and label:
423
+ blocked uses the warning token, done the success token, and cancelled the muted token.
424
+ Do not set arbitrary colors to encode work state.
422
425
 
423
426
  When you do set a color (group/graph), use this palette consistently to convey meaning:
424
427
  - **Green** (`#22c55e`) — success, done, healthy
@@ -455,9 +458,9 @@ enforce conditional requirements. Non-registry tools use `tools/list` instead.
455
458
  | `canvas_edge` | `add` · `update` · `remove` | Connect / edit / disconnect nodes |
456
459
  | `canvas_group` | `create` · `add` · `ungroup` | Manage spatial group containers |
457
460
  | `canvas_history` | `undo` · `redo` | Time travel through the mutation ring buffer |
458
- | `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 workspace categories/folder properties/shared relation templates; knowledge writes never open a board. Template edits/deletion never rewrite boards or connections. `category-remove` takes `id` and refuses explicit folder assignments, including empty folders; reassign or clear them first. |
461
+ | `canvas_board` | `list` · `get` · `create` · `create-from` · `move-selection` · `open` · `update` · `pin` · `unpin` · `knowledge-list` · `category-set` · `category-remove` · `folder-set` · `relation-preset-set` · `relation-preset-remove` | Boards and workspace categories/folder properties/shared relation templates; knowledge writes never open a board. Template edits/deletion never rewrite boards or connections. `category-remove` takes `id` and refuses explicit folder assignments, including empty folders; reassign or clear them first. |
459
462
  | `canvas_snapshot` | `save` · `list` · `restore` · `restore-node` · `delete` · `gc` · `diff` | Named snapshots: save/list/restore/delete, garbage-collect old ones, diff current canvas vs a snapshot (`diff` takes `snapshot`, not `id`); `restore-node` puts one card (`nodeId`) back to its content in snapshot `id` |
460
- | `canvas_view` | `arrange` · `focus` · `fit` · `clear` · `remove-annotation` · `get-tour` · `set-tour` · `tour-go` · `tour-exit` · `move` | Auto-arrange, pan-to-node, fit viewport, clear the board, delete annotations, read/persist ordered presentation stops (`tour: null` derives group order), present a stop / exit, ease the camera to a node, rect or viewport (never an undo step) |
463
+ | `canvas_view` | `arrange` · `focus` · `fit` · `clear` · `add-annotation` · `remove-annotation` · `get-tour` · `set-tour` · `tour-go` · `tour-exit` · `move` | Auto-arrange, pan-to-node, fit viewport, clear the board, draw/write/erase annotations, read/persist ordered presentation stops (`tour: null` derives group order), present a stop / exit, ease the camera to a node, rect or viewport (never an undo step) |
461
464
  | `canvas_query` | `context` · `graph` · `search` · `layout` · `validate` | Read the budgeted brief or summary-only connected memory graph, find nodes, read full layout, or **`validate`** collisions / containment / dangling edges |
462
465
  | `canvas_app` | `open-mcp-app` · `diagram` · `build-artifact` | Hosted MCP apps, the Excalidraw diagram preset, and bundled web artifacts (folds `canvas_open_mcp_app` / `canvas_add_diagram` / `canvas_build_web_artifact`) |
463
466
  | `canvas_webview` | `status` · `start` · `stop` · `resize` · `evaluate` | Headless Bun.WebView automation for the workbench (folds the `canvas_webview_*` / `canvas_resize` / `canvas_evaluate` tools) |
@@ -498,6 +501,18 @@ group structure are optional; fresh IDs are allocated; pins, AX state, and
498
501
  history are not copied; the source remains unchanged and the new board inactive.
499
502
  The new board records `previousBoardId` pointing to its source.
500
503
 
504
+ For an identity-preserving move, use `canvas_board` action `move-selection`, not
505
+ copy/delete. Read the active source board's `contentRevision` with `get`. Preview
506
+ with `sourceBoardId`, `nodeIds`, `name`, `expectedRevision: contentRevision`,
507
+ `requestId` and `preview: true`; inspect blockers and notices before committing
508
+ with the same inputs without `preview`. Retry an uncertain response with the same
509
+ request ID and inputs. Group descendants move together; unsafe bindings refuse
510
+ the entire move. Cards retain identities, pins, relations and review history,
511
+ without new validation or read evidence. The source stays open with a portal to
512
+ the new board. Pre-move Undo/Redo is cleared on affected boards; older snapshots
513
+ remain inspectable but cannot be restored across the move. Open the returned
514
+ `destinationBoardId` only when navigation is wanted.
515
+
501
516
  ### Connected memory (wave 2)
502
517
 
503
518
  Home Folders, Map and Graph, wiki links/backlinks, and brief discovery share one
@@ -555,10 +570,15 @@ Once the board list has loaded, all workbench context-pin writes send the captur
555
570
  `expectedBoardId`; a server-side board switch returns 409 instead of changing
556
571
  another board's pins. Receipt pin actions require reopening the owning board.
557
572
 
558
- Embedded JSON/graph runtime readiness waits up to 10 seconds after document load
559
- and retries a failed handoff once while retaining the last painted document.
560
- After another failure, the error toast/history say **Reload to retry**; a later
561
- healthy authored update can recover. This is not an overall network-load timeout.
573
+ Embedded previews mount automatically near the viewport at every zoom and remain
574
+ mounted to preserve arbitrary app state. There is no lifetime preview cap. Mermaid renders
575
+ inline, without an iframe. JSON/graph viewers inherit all nine named canvas themes
576
+ and keep form drafts when the theme changes. During replacement, the pending
577
+ document temporarily coexists with its painted predecessor.
578
+
579
+ A network load or missing JSON runtime times out after 10 seconds and offers a
580
+ visible **Retry**, retaining the last painted document during replacement.
581
+ An already mounted offscreen runtime may wait for paint without being timed out.
562
582
 
563
583
  Native edge add accepts optional `toBoardId`: `from` is on the open source board,
564
584
  `to` is a card on the target board. CLI: `pmx-canvas edge add --from <source> --to <target>
@@ -697,8 +717,33 @@ delete+recreate; preserves edges, pins, position)
697
717
 
698
718
  **`canvas_node { action: "get", id }`** — Get a single node's full data by `id`.
699
719
 
700
- **`canvas_view { action: "remove-annotation", id }`** — Remove a human-drawn annotation by `id`. Use when
701
- context gives you the annotation ID; use WebView first if you need to identify a mark by shape or location.
720
+ **`canvas_view { action: "add-annotation", points, … }`** — Draw freehand ink with at least two
721
+ world-coordinate points, or set `type: "text"`, `text` and one point to write a note.
722
+ `width` is stroke width (default 4, clamped to 1–24) or font size (default 24,
723
+ clamped to 1–96). `color` defaults to `currentColor`, the theme's annotation ink;
724
+ explicit colors must be `#rrggbb`. Text is trimmed to 240 characters, labels to 160.
725
+ Bounds and creation time are server-derived.
726
+
727
+ Freehand points render as straight segments with round caps/joins, without automatic
728
+ smoothing. Sample curves densely for smooth-looking outlines and loops. Cursor updates
729
+ through `canvas_ax_state { action: "set-presence", cursor: { x, y } }` are separate,
730
+ ephemeral presence, not drawing gestures; reuse your writer identity without attaching
731
+ a session. An annotation appears complete on creation, not as a streaming stroke.
732
+ See [Shared ink and questions](workbench-workflows.md#shared-ink-and-questions).
733
+
734
+ Use an explicit `id` for retries: equal normalized content returns the existing mark
735
+ without another Undo entry, while different content conflicts. After erasing or Undo,
736
+ adding the ID creates a mark again; this is not a durable creation receipt.
737
+
738
+ **`canvas_view { action: "remove-annotation", id }`** — Erase a whole human or agent mark,
739
+ not the underlying card. An absent mark returns not-found. Context gives you IDs;
740
+ inspect the canvas first when identifying a mark by shape or location.
741
+ CLI and MCP batches accept `annotation.add` / `annotation.remove` with the same arguments.
742
+
743
+ Humans and agents share this layer. Use marks when helpful, not for every task.
744
+ The human may answer in the external agent host's composer; no PMX session,
745
+ PMX composer or reply card is required. Marks are not approval gates, and drawing
746
+ or erasing does not answer a question or execute a loop. Existing scope fences apply.
702
747
 
703
748
  **`canvas_node { action: "update", id, refresh: true }`** — Re-fetch the URL stored on a `webpage` node
704
749
  - `id` (required): webpage node to refresh
@@ -957,17 +1002,17 @@ below operates on the live canvas state through the `canvas_webview` composite.
957
1002
  Useful workbench selectors:
958
1003
  - Nodes: `.canvas-node`, `.canvas-node.active`, `.canvas-node.context-pinned`, `.canvas-node.group-node`
959
1004
  - Node internals: `.node-title`, `.node-titlebar`, `.node-body`, `.node-type-badge`, `.node-controls`
960
- - Annotations: `.annotation-layer path` renders human-drawn freehand ink. Use WebView
961
- to inspect or screenshot annotation shapes; MCP/context resources only expose compact
962
- annotation target summaries, not the raw visual shape. Humans can remove marks with
963
- the eraser in the rail's Annotate popover; agents can remove a known annotation ID with
964
- `canvas_view { action: "remove-annotation" }`.
1005
+ - Annotations: `.annotation-layer path` renders shared freehand ink; `.annotation-layer text`
1006
+ renders text notes. Use WebView to inspect or screenshot shapes; MCP/context resources
1007
+ expose IDs, text, labels, targets and bounds, not raw stroke geometry. Humans use the
1008
+ rail's Draw / Text note / Eraser tools; agents use `canvas_view` actions
1009
+ `add-annotation` / `remove-annotation` on the same layer.
965
1010
  - Canvas chrome (rail-chrome-v2): `.tool-rail`, `.top-bar` (`.connection-dot`, `.agent-chip`,
966
1011
  `.gate-badge`, `.context-chip`, `.external-indicator`, `.start-session-btn`),
967
1012
  `.connection-banner`, `.canvas-region`, `.session-panel`, `.command-bar`, `.selection-bar`,
968
1013
  `.activity-feed`, `.writers-sheet`, `.session-receipt`, `.snapshot-panel` (the History
969
1014
  drawer), `.minimap`, `.empty-state`, `.command-palette`, `.expanded-overlay-panel`.
970
- - Presence: `.agent-cursor` (attached agent), `.human-cursor` (other tabs), `.scope-fence`,
1015
+ - Presence: `.agent-cursor` (attached or external agent), `.human-cursor` (other tabs), `.scope-fence`,
971
1016
  `.canvas-node.agent-mutating` (shimmer), `.node-yield-pill`.
972
1017
  - Groups: `.canvas-node.group-node` with `.group-name-pill`, `.group-actions`, `.group-chip`
973
1018
  (collapsed); `.drop-pill` while a dragged node would join/leave a group; `.edge-hint-pill`
@@ -1444,7 +1489,7 @@ The `canvas://spatial-context` resource reveals how the human has organized info
1444
1489
  This implies sequence or priority.
1445
1490
  - **Pinned neighborhoods** — For each pinned node, nearby unpinned nodes are listed. These
1446
1491
  are the human's implicit context — things they consider related to what they pinned.
1447
- - **Annotations** — Human-drawn markup is summarized by target/bounds only, e.g. an
1492
+ - **Annotations** — Shared markup is summarized by ID, label, text, target and bounds, e.g. an
1448
1493
  annotation over a node or empty canvas region. Use WebView (`canvas_webview { action: "start" }` +
1449
1494
  `canvas_webview { action: "evaluate" }`/`canvas_screenshot`) when you need to see whether the mark is an
1450
1495
  arrow, line, circle, or other drawn shape. Remove known annotations with
@@ -1570,15 +1615,35 @@ Show system components and how they interact:
1570
1615
 
1571
1616
  ### Task Plan with Dependencies
1572
1617
 
1573
- Track work items and their relationships:
1618
+ Show useful work deliberately, not a card per task or event. Ordinary work cards are authored
1619
+ node data, not AX work items. They require no session and create no approval or execution.
1620
+
1621
+ 1. Create a `status` node with `data.workState`: `todo`, `in-progress`, `blocked`, `done` or
1622
+ `cancelled`. Use string `data.detail` for context and optional `data.progress` from 0 to 100.
1623
+ Progress is independent of state: Done does not imply 100%; `null` clears progress.
1624
+ 2. Update the same card through `canvas_node { action: "update", id, data: { ... } }`.
1625
+ Include `expectedBoardId` and `expectedContentRevision` when an edit depends on a prior read.
1626
+ 3. Connect steps, dependencies, alternatives and intentional loops with existing relations.
1627
+ A drawn loop does not execute. Group distinct phases when useful, then inspect readability.
1628
+ 4. Humans use **New work card** from the background menu and **Edit/Save/Cancel** inside the card.
1629
+ Drafts and pending/refused saves survive focus-mode open/close, but not a page reload.
1630
+ The editor's temporary growth does not resize the saved card.
1631
+
1632
+ MCP creation:
1633
+
1634
+ ```json
1635
+ {"action":"add","type":"status","title":"Verify","data":{"workState":"todo","detail":"Run browser checks"}}
1636
+ ```
1637
+
1638
+ CLI creation uses structured batch data, not `node add --data` (that flag is for graph series):
1639
+
1640
+ ```bash
1641
+ pmx-canvas batch --json '[{"op":"node.add","args":{"type":"status","title":"Verify","data":{"workState":"todo","detail":"Run browser checks"}}}]'
1642
+ ```
1574
1643
 
1575
- 1. Create `status` nodes for each task
1576
- 2. Color-code: green=done, yellow=in-progress, red=blocked, gray=queued, blue=ready/available
1577
- 3. Connect with `depends-on` edges — use `dashed` style for blocked dependencies, `solid` for
1578
- satisfied ones
1579
- 4. Update status nodes as work progresses using `canvas_node { action: "update" }`
1580
- 5. Arrange with `flow` layout to show the dependency chain left-to-right
1581
- 6. Group related tasks if the plan has distinct phases
1644
+ Without `data.workState`, status cards retain their phase/tool display. Session-task linking
1645
+ is not provided by these authored cards. Questions can be drawn or written beside the plan;
1646
+ the human can answer in the external agent host's composer, without a PMX reply card.
1582
1647
 
1583
1648
  ### Code Exploration
1584
1649
 
@@ -110,6 +110,13 @@ agent.
110
110
  - `interaction-prototype` exposes live controls and copyable config for implementation tuning.
111
111
  - Tell the human which copy/export button to use, then ask them to paste the result back if you need to act on edits.
112
112
 
113
+ The card menu also offers **Copy JSON** for non-presentation HTML primitives. Open the viewer
114
+ first: this reads its current interactive state, preferring the expanded frame when present,
115
+ not a stale export of saved node data. The reply is bound to the frame source, document token
116
+ and request ID; the parent workbench requests clipboard access from the human's click.
117
+ Clipboard permission or host limitations can still refuse the copy and show an error.
118
+ This does not persist edits, support arbitrary raw HTML, or replace the per-format buttons above.
119
+
113
120
  ## Sandbox And Persistence
114
121
 
115
122
  - Primitive output runs inside the existing HTML iframe sandbox with scripts allowed but no same-origin access.
@@ -4,7 +4,7 @@ Use this reference when the `pmx-canvas` skill is installed but the `pmx-canvas`
4
4
 
5
5
  ## Prerequisites and version
6
6
 
7
- The examples pin **PMX Canvas 0.10.0**, which requires **Bun >=1.4.4** even when
7
+ The examples pin **PMX Canvas 0.12.0**, which requires **Bun >=1.4.4** even when
8
8
  installed through npm: the CLI runs through Bun, not Node. Check `bun --version`
9
9
  first. If missing or older, follow the [Bun installation instructions](https://bun.sh/docs/installation)
10
10
  with the user's authorization. Ensure Bun is on the MCP host's PATH as well as the
@@ -22,11 +22,11 @@ in `SKILL.md`. Do not pair newer checkout guidance with an older runtime unknowi
22
22
  ## Install from npm
23
23
 
24
24
  ```bash
25
- npm install -g pmx-canvas@0.10.0
25
+ npm install -g pmx-canvas@0.12.0
26
26
  pmx-canvas --version
27
27
  ```
28
28
 
29
- Without a global install, use `bunx pmx-canvas@0.10.0` in place of `pmx-canvas` in
29
+ Without a global install, use `bunx pmx-canvas@0.12.0` in place of `pmx-canvas` in
30
30
  the commands below. Do not use unpinned `bunx pmx-canvas` for a version-specific check.
31
31
 
32
32
  ## Choose the workspace and target
@@ -96,7 +96,7 @@ discards empty env values, remove `PMX_CANVAS_URL` from its launch environment i
96
96
  "mcpServers": {
97
97
  "canvas": {
98
98
  "command": "bunx",
99
- "args": ["pmx-canvas@0.10.0", "--mcp"],
99
+ "args": ["pmx-canvas@0.12.0", "--mcp"],
100
100
  "env": {
101
101
  "PMX_CANVAS_WORKSPACE_ROOT": "/absolute/path/to/project",
102
102
  "PMX_CANVAS_PORT": "14313",
@@ -140,7 +140,7 @@ Amp executes, not only on the user's laptop. Merge this into that workspace's
140
140
  "amp.mcpServers": {
141
141
  "canvas": {
142
142
  "command": "bunx",
143
- "args": ["pmx-canvas@0.10.0", "--mcp"],
143
+ "args": ["pmx-canvas@0.12.0", "--mcp"],
144
144
  "includeTools": ["canvas_*"],
145
145
  "env": {
146
146
  "PMX_CANVAS_WORKSPACE_ROOT": "/absolute/path/to/project",
@@ -174,7 +174,7 @@ The agent must not run this approval itself or move the command to global settin
174
174
  `--mcp-config` to bypass workspace trust. Approval authorizes execution of this MCP
175
175
  command; it is not a new Canvas import consent or permission to mutate arbitrary boards.
176
176
  After approval, reload MCP connections (`reload_mcp` in Amp) and require `connected`.
177
- Discover `canvas` tools with `tool_search`; the full unfiltered 0.10.0 server has 25 tools,
177
+ Discover `canvas` tools with `tool_search`; the full unfiltered 0.12.0 server has 25 tools,
178
178
  including `canvas_help`. If still absent, inspect the server status, command/PATH and target instead
179
179
  of reinstalling blindly. See [Amp MCP documentation](https://ampcode.com/docs/customize/mcp).
180
180
 
@@ -31,8 +31,10 @@ Persist a tour with `canvas_view { action: "set-tour", tour: { stops: [...] } }`
31
31
  Open `/workbench?present=1` for chrome-free viewing. Right, Down, or Space advances; Left or Up
32
32
  goes back; Escape or **Exit presentation** exits. Right-drag pans and interrupts an ongoing
33
33
  transition without editing cards. Stops do not auto-advance. A missing node target reports an
34
- error and may be skipped. The presentation camera is local to that viewer while board content
35
- continues to update. Recording hides the exit control.
34
+ error and may be skipped. Camera rendering and free pan are viewer-local, but human Back/Next
35
+ and arrow keys advance the shared cursor for all presenting viewers; Exit leaves presentation
36
+ everywhere. `present: false` does not isolate navigation from another presenting viewer.
37
+ Deterministic capture uses its own viewer and ignores live navigation. Recording hides the exit control.
36
38
 
37
39
  Tours are board-scoped, persist with that board and its snapshots, participate in undo, and clear
38
40
  with the board. Setting `tour: null` resets to a derived tour: groups ordered by y, then x, then
@@ -54,6 +56,31 @@ viewport. Tour steps and moves never enter undo history, never count as agent wr
54
56
  allowed under a scope fence. Viewers with reduced motion jump instead of animating; a
55
57
  deterministic capture ignores both.
56
58
 
59
+ If another viewer's camera must stay unchanged, do not send `tour-go`, `tour-exit` or `move`,
60
+ or use the human shared navigation controls. Author stops and capture them in the separate
61
+ recording viewer instead. Verify isolation with another viewer already presenting, not only
62
+ an ordinary canvas tab.
63
+
64
+ ### Optional presenter ordering fence
65
+
66
+ `tour-go` and `tour-exit` accept `presenter: { clientId, intent, catalogEpoch, boardGeneration }`.
67
+ Use a distinct `clientId` per document, an increasing positive safe-integer `intent` per gesture,
68
+ and the actual server activation's epoch and nonnegative safe-integer generation. Ordinary
69
+ agent calls may omit this object. It orders requests; it is not authorization or viewer isolation.
70
+
71
+ A stale activation or duplicate/older intent returns `{ ok: true, superseded: true }` with no
72
+ navigation event or cursor change. Do not claim navigation from `ok: true` alone. Applied results
73
+ and events carry `catalogEpoch`, `boardGeneration` and `sequence`; presenter-aware clients use
74
+ these to reject stale acknowledgements and events. A structurally valid newer intent is claimed
75
+ before resolving the stop, so even a missing newer stop supersedes older requests.
76
+
77
+ This is latest-intent-wins, not FIFO: reversed relative Next requests can coalesce. Separate
78
+ documents remain independent, and reload does not cancel an old document's pending request.
79
+ An activation retains at most 4096 document IDs; a new ID beyond that returns 409 rather than
80
+ evicting an ordering record. Switching boards resets the capacity but old activation stamps stay stale.
81
+ The SDK accepts `goToTourStop(step, { presenter })` and `exitTour(presenter)`; fenced go can return
82
+ `{ superseded: true }`, while exit returns void. Do not infer applied exit from that void return.
83
+
57
84
  ## Capture prerequisites and behavior
58
85
 
59
86
  Start and verify the matching PMX daemon first: its `/health` workspace and version must match the