pmx-canvas 0.11.0 → 0.12.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.
Files changed (300) hide show
  1. package/.github/extensions/pmx-canvas/extension.mjs +4 -1
  2. package/.github/extensions/pmx-canvas/runtime.json +1 -1
  3. package/.github/extensions/pmx-canvas/tools.json +440 -18
  4. package/CHANGELOG.md +51 -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 +267 -0
  11. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/evals.json +1168 -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 +1839 -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 +301 -0
  26. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/tours-and-recording.md +117 -0
  27. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/workbench-workflows.md +908 -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-p8dtp6va.js → abnfDiagram-N423BO3Z-cwtsds5d.js} +1 -1
  33. package/dist/canvas/chunks/architecture-TIHT7OUA-x63cwejs.js +1 -0
  34. package/dist/canvas/chunks/{architectureDiagram-T3A2C74G-5jhmxrzf.js → architectureDiagram-T3A2C74G-b4xc9tpz.js} +3 -3
  35. package/dist/canvas/chunks/{blockDiagram-VBNYF7ZC-pw1fa9yb.js → blockDiagram-VBNYF7ZC-ahp3yxxs.js} +7 -7
  36. package/dist/canvas/chunks/{c4Diagram-5PPSVZJV-x07nq0tt.js → c4Diagram-5PPSVZJV-nappnay7.js} +4 -4
  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-nm39npq0.js → cose-bilkent-JH36ORCC-a428syda.js} +1 -1
  40. package/dist/canvas/chunks/cynefin-VYW2F7L2-8v6jxfz8.js +1 -0
  41. package/dist/canvas/chunks/{cynefinDiagram-MW4NZA55-vdxrwahz.js → cynefinDiagram-MW4NZA55-nspsqebj.js} +1 -1
  42. package/dist/canvas/chunks/{dagre-VZM6K2ZE-bqdm7wpd.js → dagre-VZM6K2ZE-8y6177fh.js} +2 -2
  43. package/dist/canvas/chunks/{diagram-7IWD3JNH-gs5gpr93.js → diagram-7IWD3JNH-vym028wn.js} +4 -4
  44. package/dist/canvas/chunks/{diagram-B4RE2ZJO-cgwjg47s.js → diagram-B4RE2ZJO-jddqb8sy.js} +1 -1
  45. package/dist/canvas/chunks/{diagram-LBJQPF4R-w3vahpav.js → diagram-LBJQPF4R-bjwbpkrn.js} +1 -1
  46. package/dist/canvas/chunks/{diagram-Q27KOJAE-42837z6h.js → diagram-Q27KOJAE-j6ph6hcx.js} +2 -2
  47. package/dist/canvas/chunks/{diagram-UB23O5K3-4fz83q59.js → diagram-UB23O5K3-p09w8jej.js} +1 -1
  48. package/dist/canvas/chunks/{ebnfDiagram-BXEA7PRR-zphtgegj.js → ebnfDiagram-BXEA7PRR-j975ycq5.js} +1 -1
  49. package/dist/canvas/chunks/{erDiagram-JOGREHBK-zvbbdxp4.js → erDiagram-JOGREHBK-sxp6hjn8.js} +5 -5
  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-282jzycm.js → ganttDiagram-PKOTCBZU-4tv230y2.js} +2 -2
  53. package/dist/canvas/chunks/gitGraph-TEB2WS4Q-macbhand.js +1 -0
  54. package/dist/canvas/chunks/{gitGraphDiagram-DS77QQ5N-vqqy6p1b.js → gitGraphDiagram-DS77QQ5N-mqgmnw9g.js} +1 -1
  55. package/dist/canvas/chunks/{index-wgv7en21.js → index-037z5dz2.js} +2 -2
  56. package/dist/canvas/chunks/{index-w2mra17t.js → index-081n3har.js} +1 -1
  57. package/dist/canvas/chunks/{index-353m7b0p.js → index-5n03dmb9.js} +1 -1
  58. package/dist/canvas/chunks/{index-yw8h9vha.js → index-60pgzdqe.js} +1 -1
  59. package/dist/canvas/chunks/index-8g1vb57n.js +2 -0
  60. package/dist/canvas/chunks/{index-vv56h019.js → index-8rjes9r6.js} +1 -1
  61. package/dist/canvas/chunks/{index-nprm96xp.js → index-9022d1n9.js} +1 -1
  62. package/dist/canvas/chunks/{index-194m3hc3.js → index-9b02042t.js} +1 -1
  63. package/dist/canvas/chunks/{index-0rk4gp1g.js → index-ap4q4vez.js} +1 -1
  64. package/dist/canvas/chunks/{index-rh7nv68n.js → index-dyp2nhd3.js} +1 -1
  65. package/dist/canvas/chunks/index-frvta4tm.js +2 -0
  66. package/dist/canvas/chunks/{index-s4j678gj.js → index-h9ycj8n2.js} +1 -1
  67. package/dist/canvas/chunks/{index-fjtdggjn.js → index-mergmj97.js} +2 -2
  68. package/dist/canvas/chunks/index-nwsya6dj.js +301 -0
  69. package/dist/canvas/chunks/{index-3cy1bzwh.js → index-nz8qbd1p.js} +1 -1
  70. package/dist/canvas/chunks/{index-d3b3gqe9.js → index-qhfrazv3.js} +1 -1
  71. package/dist/canvas/chunks/{index-6qmsnxwy.js → index-v119nznk.js} +4 -4
  72. package/dist/canvas/chunks/{index-r2fyc9w1.js → index-vpt37m3d.js} +6 -6
  73. package/dist/canvas/chunks/{index-qj8fxwsf.js → index-y9ma6azy.js} +1 -1
  74. package/dist/canvas/chunks/{index-tb1wf525.js → index-zx0j3a2z.js} +26 -26
  75. package/dist/canvas/chunks/info-DKCQHKI2-a0ykzs9z.js +1 -0
  76. package/dist/canvas/chunks/{infoDiagram-6WML65LV-v1yvggqj.js → infoDiagram-6WML65LV-qv97qq6a.js} +2 -2
  77. package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-p9306gh0.js +70 -0
  78. package/dist/canvas/chunks/{journeyDiagram-NVQOT4AX-zjcffveh.js → journeyDiagram-NVQOT4AX-sv67zats.js} +5 -5
  79. package/dist/canvas/chunks/{kanban-definition-27J2QSJJ-dakqtfp1.js → kanban-definition-27J2QSJJ-k2pfam6p.js} +1 -1
  80. package/dist/canvas/chunks/{mermaid.core-j2geswrd.js → mermaid.core-83r0fdce.js} +4 -4
  81. package/dist/canvas/chunks/{mindmap-definition-FAOFIHXS-142xhr3k.js → mindmap-definition-FAOFIHXS-vg2newm1.js} +1 -1
  82. package/dist/canvas/chunks/packet-7NZHBO7P-tqnabcdv.js +1 -0
  83. package/dist/canvas/chunks/{pegDiagram-VL7TDLO6-5wvk7vsd.js → pegDiagram-VL7TDLO6-k2h7zc5n.js} +1 -1
  84. package/dist/canvas/chunks/pie-RZYD4A2V-wke6gyhe.js +1 -0
  85. package/dist/canvas/chunks/{pieDiagram-7S7Q4E2Y-ztdhwycc.js → pieDiagram-7S7Q4E2Y-hg169p1v.js} +2 -2
  86. package/dist/canvas/chunks/{quadrantDiagram-CIZ2JOQS-c5p9gmg6.js → quadrantDiagram-CIZ2JOQS-bxtvsq0b.js} +5 -5
  87. package/dist/canvas/chunks/radar-I7S5WNFK-w7ka0drw.js +1 -0
  88. package/dist/canvas/chunks/railroad-3IZDKUUU-y3vg318x.js +1 -0
  89. package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-6hqvcz3c.js +1 -0
  90. package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-vcae260m.js +1 -0
  91. package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-0dbyme23.js +1 -0
  92. package/dist/canvas/chunks/{railroadDiagram-AXF67PYL-xkmqkjwf.js → railroadDiagram-AXF67PYL-njyhcp4p.js} +1 -1
  93. package/dist/canvas/chunks/{requirementDiagram-LRYGKXZP-9wm2dyaw.js → requirementDiagram-LRYGKXZP-2z6v09gm.js} +4 -4
  94. package/dist/canvas/chunks/{sankeyDiagram-W5VNT64P-2w19etgb.js → sankeyDiagram-W5VNT64P-15mzam0e.js} +1 -1
  95. package/dist/canvas/chunks/{sequenceDiagram-SI44F4Z6-0jn0vwmz.js → sequenceDiagram-SI44F4Z6-rbshyd2c.js} +12 -12
  96. package/dist/canvas/chunks/{sizeCapture-X5ZJPWSS-x75epwdq.js → sizeCapture-X5ZJPWSS-sg26xwts.js} +1 -1
  97. package/dist/canvas/chunks/{stateDiagram-OKZ733FA-schjpy6d.js → stateDiagram-OKZ733FA-6eahp98e.js} +1 -1
  98. package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-tty0ggn5.js +1 -0
  99. package/dist/canvas/chunks/{swimlanes-SLNWSIFB-gkw4xce3.js → swimlanes-SLNWSIFB-ze5db10t.js} +1 -1
  100. package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-thze75gq.js +8 -0
  101. package/dist/canvas/chunks/{timeline-definition-Z64GVDOM-x7nkcy01.js → timeline-definition-Z64GVDOM-vnp7jyy8.js} +3 -3
  102. package/dist/canvas/chunks/treeView-QDETBFTQ-6ysffnm6.js +1 -0
  103. package/dist/canvas/chunks/treemap-6X3UGDF4-m3h9p066.js +1 -0
  104. package/dist/canvas/chunks/vennDiagram-T6HMQDX7-0qrnb7mj.js +34 -0
  105. package/dist/canvas/chunks/wardley-OPB4EBWU-dp37drwx.js +1 -0
  106. package/dist/canvas/chunks/{wardleyDiagram-T6FBY63Y-t1j52t9r.js → wardleyDiagram-T6FBY63Y-8nxg8wqt.js} +4 -4
  107. package/dist/canvas/chunks/{xychartDiagram-ELKLHX3M-38t16pme.js → xychartDiagram-ELKLHX3M-nj921e7s.js} +5 -5
  108. package/dist/canvas/global.css +94 -1
  109. package/dist/canvas/index.js +154 -145
  110. package/dist/canvas/mcp-app.html +600 -498
  111. package/dist/json-render/index.css +1 -1
  112. package/dist/types/client/canvas/BoardMoveDialog.d.ts +2 -0
  113. package/dist/types/client/canvas/EdgeEditor.d.ts +19 -0
  114. package/dist/types/client/canvas/GroupNavigation.d.ts +2 -0
  115. package/dist/types/client/canvas/TextPrompt.d.ts +4 -0
  116. package/dist/types/client/nodes/PromptNode.d.ts +1 -0
  117. package/dist/types/client/nodes/ViewerFrame.d.ts +1 -1
  118. package/dist/types/client/nodes/WorkCard.d.ts +7 -0
  119. package/dist/types/client/nodes/use-ax-surface-bridge.d.ts +1 -0
  120. package/dist/types/client/state/canvas-store.d.ts +15 -0
  121. package/dist/types/client/state/human-store.d.ts +2 -0
  122. package/dist/types/client/state/intent-bridge.d.ts +4 -2
  123. package/dist/types/client/state/relation-store.d.ts +11 -0
  124. package/dist/types/client/types.d.ts +1 -1
  125. package/dist/types/json-render/catalog.d.ts +2 -2
  126. package/dist/types/server/agent-presence.d.ts +1 -0
  127. package/dist/types/server/ax-interaction.d.ts +1 -0
  128. package/dist/types/server/ax-state-manager.d.ts +10 -2
  129. package/dist/types/server/board-local.d.ts +4 -0
  130. package/dist/types/server/board-move.d.ts +38 -0
  131. package/dist/types/server/canvas-db.d.ts +12 -2
  132. package/dist/types/server/canvas-operations.d.ts +5 -6
  133. package/dist/types/server/canvas-provenance.d.ts +1 -1
  134. package/dist/types/server/canvas-serialization.d.ts +1 -0
  135. package/dist/types/server/canvas-state.d.ts +84 -20
  136. package/dist/types/server/card-relocation.d.ts +6 -0
  137. package/dist/types/server/context-reads.d.ts +3 -1
  138. package/dist/types/server/human-presence.d.ts +1 -1
  139. package/dist/types/server/index.d.ts +16 -5
  140. package/dist/types/server/intent-registry.d.ts +8 -4
  141. package/dist/types/server/knowledge-lifecycle.d.ts +4 -2
  142. package/dist/types/server/mutation-history.d.ts +7 -5
  143. package/dist/types/server/operations/registry.d.ts +2 -0
  144. package/dist/types/server/trace-manager.d.ts +1 -0
  145. package/dist/types/shared/ax-kinds.d.ts +6 -0
  146. package/dist/types/shared/ax-surface-protocol.d.ts +8 -0
  147. package/dist/types/shared/human-presence.d.ts +1 -0
  148. package/dist/types/shared/lifecycle-status.d.ts +2 -0
  149. package/docs/RELEASE.md +21 -14
  150. package/docs/agent-plugin.md +22 -2
  151. package/docs/amp-plugin.md +270 -0
  152. package/docs/cli.md +42 -3
  153. package/docs/design/GuestName.dc.html +50 -0
  154. package/docs/design/PluginLogo.svg +7 -0
  155. package/docs/design/WorkCards.dc.html +39 -0
  156. package/docs/design/canvas.json +16 -0
  157. package/docs/design/plugin-logo.png +0 -0
  158. package/docs/design.md +111 -8
  159. package/docs/evals/agents-md-sections.md +38 -0
  160. package/docs/http-api.md +128 -10
  161. package/docs/mcp.md +61 -9
  162. package/docs/node-types.md +71 -1
  163. package/docs/plans/plan-009-tech-debt-backlog.md +1 -1
  164. package/docs/plans/plan-019-post-0.9-roadmap.md +44 -20
  165. package/docs/plans/plan-020-wave-5-work-planning.md +553 -0
  166. package/docs/product-vision-2026-09.md +33 -17
  167. package/docs/sdk.md +18 -0
  168. package/package.json +6 -3
  169. package/plugins/pmx-canvas/assets/preview.png +0 -0
  170. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/extension.mjs +4 -1
  171. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
  172. package/plugins/pmx-canvas/plugin.json +2 -2
  173. package/plugins/pmx-canvas/runtime.json +1 -1
  174. package/plugins/pmx-canvas/tools.json +440 -18
  175. package/skills/data-analysis/SKILL.md +13 -26
  176. package/skills/frontend-design/LICENSE.txt +177 -0
  177. package/skills/frontend-design/SKILL.md +3 -0
  178. package/skills/pmx-canvas/SKILL.md +248 -842
  179. package/skills/pmx-canvas/evals/evals.json +110 -5
  180. package/skills/pmx-canvas/references/full-reference.md +142 -28
  181. package/skills/pmx-canvas/references/html-primitives.md +7 -0
  182. package/skills/pmx-canvas/references/installing-pmx-canvas.md +61 -11
  183. package/skills/pmx-canvas/references/tours-and-recording.md +39 -6
  184. package/skills/pmx-canvas/references/workbench-workflows.md +908 -0
  185. package/skills/pmx-canvas-testing/SKILL.md +7 -5
  186. package/skills/published-consumer-e2e/SKILL.md +25 -8
  187. package/skills/published-consumer-e2e/scripts/run-published-consumer-e2e.sh +51 -75
  188. package/skills/web-artifacts-builder/LICENSE.txt +202 -0
  189. package/skills/web-artifacts-builder/SKILL.md +6 -0
  190. package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +2 -2
  191. package/skills/web-artifacts-builder/scripts/init-artifact.sh +8 -8
  192. package/src/cli/commands/apps.ts +1 -0
  193. package/src/cli/commands/boards.ts +30 -0
  194. package/src/client/App.tsx +20 -4
  195. package/src/client/canvas/AttentionHistory.tsx +10 -2
  196. package/src/client/canvas/BoardMoveDialog.tsx +225 -0
  197. package/src/client/canvas/CanvasNode.tsx +45 -2
  198. package/src/client/canvas/CanvasViewport.tsx +38 -9
  199. package/src/client/canvas/ContextMenu.tsx +34 -12
  200. package/src/client/canvas/EdgeEditor.tsx +149 -0
  201. package/src/client/canvas/EdgeLayer.tsx +87 -16
  202. package/src/client/canvas/ExpandedNodeOverlay.tsx +4 -0
  203. package/src/client/canvas/GroupNavigation.tsx +85 -0
  204. package/src/client/canvas/RelationsPanel.tsx +9 -0
  205. package/src/client/canvas/SelectionBar.tsx +21 -0
  206. package/src/client/canvas/SessionPanel.tsx +35 -1
  207. package/src/client/canvas/TextPrompt.tsx +18 -1
  208. package/src/client/canvas/TopBar.tsx +30 -0
  209. package/src/client/canvas/canvas-area.ts +1 -1
  210. package/src/client/nodes/ExtAppFrame.tsx +26 -10
  211. package/src/client/nodes/MarkdownNode.tsx +6 -7
  212. package/src/client/nodes/PromptNode.tsx +32 -3
  213. package/src/client/nodes/StatusNode.tsx +12 -0
  214. package/src/client/nodes/StatusSummary.tsx +11 -0
  215. package/src/client/nodes/ViewerFrame.tsx +21 -10
  216. package/src/client/nodes/WorkCard.tsx +175 -0
  217. package/src/client/nodes/use-ax-surface-bridge.ts +18 -14
  218. package/src/client/state/attention-bridge.ts +5 -0
  219. package/src/client/state/attention-store.ts +1 -0
  220. package/src/client/state/canvas-store.ts +185 -15
  221. package/src/client/state/human-store.ts +22 -2
  222. package/src/client/state/intent-bridge.ts +19 -5
  223. package/src/client/state/relation-store.ts +127 -1
  224. package/src/client/theme/global.css +94 -1
  225. package/src/client/types.ts +1 -0
  226. package/src/mcp/server.ts +13 -3
  227. package/src/server/agent-presence.ts +43 -23
  228. package/src/server/ax-flow-loop.ts +6 -0
  229. package/src/server/ax-gate-ttl.ts +8 -1
  230. package/src/server/ax-interaction.ts +16 -10
  231. package/src/server/ax-state-manager.ts +17 -4
  232. package/src/server/ax-wait.ts +20 -6
  233. package/src/server/board-export.ts +19 -6
  234. package/src/server/board-local.ts +20 -0
  235. package/src/server/board-move.ts +297 -0
  236. package/src/server/canvas-db.ts +262 -160
  237. package/src/server/canvas-operations.ts +139 -109
  238. package/src/server/canvas-schema.ts +21 -0
  239. package/src/server/canvas-serialization.ts +2 -0
  240. package/src/server/canvas-state.ts +792 -159
  241. package/src/server/card-relocation.ts +53 -0
  242. package/src/server/code-graph.ts +4 -3
  243. package/src/server/context-reads.ts +83 -55
  244. package/src/server/demo-state.json +35 -15
  245. package/src/server/file-watcher.ts +30 -10
  246. package/src/server/human-presence.ts +18 -5
  247. package/src/server/index.ts +35 -15
  248. package/src/server/intent-registry.ts +43 -5
  249. package/src/server/knowledge-lifecycle.ts +32 -9
  250. package/src/server/lifecycle-status.ts +29 -1
  251. package/src/server/mcp-app-runtime.ts +26 -7
  252. package/src/server/mutation-history.ts +37 -8
  253. package/src/server/operations/composites.ts +6 -3
  254. package/src/server/operations/mcp-contracts.ts +15 -0
  255. package/src/server/operations/mcp.ts +36 -9
  256. package/src/server/operations/ops/annotation.ts +22 -1
  257. package/src/server/operations/ops/ax-await.ts +1 -0
  258. package/src/server/operations/ops/ax-timeline.ts +28 -2
  259. package/src/server/operations/ops/batch.ts +25 -11
  260. package/src/server/operations/ops/boards.ts +44 -3
  261. package/src/server/operations/ops/nodes.ts +70 -0
  262. package/src/server/operations/ops/query.ts +32 -3
  263. package/src/server/operations/ops/snapshots.ts +1 -0
  264. package/src/server/operations/registry.ts +49 -4
  265. package/src/server/server.ts +62 -16
  266. package/src/server/tour-control.ts +37 -12
  267. package/src/server/trace-manager.ts +4 -0
  268. package/src/server/web-artifacts/scripts/bundle-artifact.sh +2 -2
  269. package/src/server/web-artifacts/scripts/init-artifact.sh +8 -8
  270. package/src/shared/agent-context.ts +7 -1
  271. package/src/shared/auto-arrange.ts +5 -4
  272. package/src/shared/ax-kinds.ts +13 -0
  273. package/src/shared/ax-surface-protocol.ts +22 -0
  274. package/src/shared/human-presence.ts +1 -0
  275. package/src/shared/lifecycle-status.ts +2 -0
  276. package/dist/canvas/chunks/architecture-TIHT7OUA-9tffvpsv.js +0 -1
  277. package/dist/canvas/chunks/classDiagram-JCYQIIEL-nc6g5x1r.js +0 -1
  278. package/dist/canvas/chunks/classDiagram-v2-OCEON4UE-0qnbpwvh.js +0 -1
  279. package/dist/canvas/chunks/cynefin-VYW2F7L2-ys8p46ts.js +0 -1
  280. package/dist/canvas/chunks/eventmodeling-45OFAUF4-v9q6dn4c.js +0 -1
  281. package/dist/canvas/chunks/flowDiagram-UKHOOZJN-yrr5z8tc.js +0 -1
  282. package/dist/canvas/chunks/gitGraph-TEB2WS4Q-kdwb8m0a.js +0 -1
  283. package/dist/canvas/chunks/index-1r72hdzb.js +0 -301
  284. package/dist/canvas/chunks/index-g3pwnqeb.js +0 -2
  285. package/dist/canvas/chunks/index-rft2hcz5.js +0 -2
  286. package/dist/canvas/chunks/info-DKCQHKI2-wpzs6sz3.js +0 -1
  287. package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-5hnq1a9p.js +0 -70
  288. package/dist/canvas/chunks/packet-7NZHBO7P-xn439f0s.js +0 -1
  289. package/dist/canvas/chunks/pie-RZYD4A2V-0kf16rwh.js +0 -1
  290. package/dist/canvas/chunks/radar-I7S5WNFK-0g2pz36t.js +0 -1
  291. package/dist/canvas/chunks/railroad-3IZDKUUU-fcaran6j.js +0 -1
  292. package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-wgdya41q.js +0 -1
  293. package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-gy07a4ka.js +0 -1
  294. package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-ewk6wtkh.js +0 -1
  295. package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-k8sfp2e7.js +0 -1
  296. package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-nqysw67j.js +0 -8
  297. package/dist/canvas/chunks/treeView-QDETBFTQ-cesw6gp0.js +0 -1
  298. package/dist/canvas/chunks/treemap-6X3UGDF4-zdv4knp9.js +0 -1
  299. package/dist/canvas/chunks/vennDiagram-T6HMQDX7-x8dqn9yf.js +0 -34
  300. package/dist/canvas/chunks/wardley-OPB4EBWU-44pdddez.js +0 -1
@@ -0,0 +1,301 @@
1
+ # Installing PMX Canvas
2
+
3
+ Use this reference when the `pmx-canvas` skill is installed but the `pmx-canvas` command is not available yet.
4
+
5
+ ## Prerequisites and version
6
+
7
+ The examples pin **PMX Canvas 0.12.1**, which requires **Bun >=1.4.4** even when
8
+ installed through npm: the CLI runs through Bun, not Node. Check `bun --version`
9
+ first. If missing or older, follow the [Bun installation instructions](https://bun.sh/docs/installation)
10
+ with the user's authorization. Ensure Bun is on the MCP host's PATH as well as the
11
+ interactive shell's; use an absolute `bun`/`bunx` executable path if needed.
12
+
13
+ Bun 1.4.4 fixes the Brotli decoder vulnerability CVE-2026-111497. Updating the
14
+ PMX package does not update Bun; upgrade the runtime and restart existing PMX/MCP
15
+ processes. Development and build tooling should use Node 24.22.1 or a newer patched
16
+ release on a supported Node line.
17
+
18
+ Install/configure only when requested. After an intentional runtime upgrade, sync the
19
+ skill from that installed package and restart existing server/MCP processes as described
20
+ in `SKILL.md`. Do not pair newer checkout guidance with an older runtime unknowingly.
21
+
22
+ ## Install from npm
23
+
24
+ ```bash
25
+ npm install -g pmx-canvas@0.12.1
26
+ pmx-canvas --version
27
+ ```
28
+
29
+ Without a global install, use `bunx pmx-canvas@0.12.1` in place of `pmx-canvas` in
30
+ the commands below. Do not use unpinned `bunx pmx-canvas` for a version-specific check.
31
+
32
+ ## Choose the workspace and target
33
+
34
+ Select an existing absolute root and a dedicated free port. These shell examples use
35
+ POSIX syntax; supply equivalent environment variables on other platforms.
36
+
37
+ ```bash
38
+ export PMX_CANVAS_WORKSPACE_ROOT=/absolute/path/to/project
39
+ export PMX_CANVAS_PORT=14313 # Example only: choose a free port for this workspace.
40
+ unset PMX_CANVAS_URL # A stale URL overrides the environment's CLI port target.
41
+ ```
42
+
43
+ Use **both root and port**. Root pinning alone does not align the CLI, MCP, and browser
44
+ if a server falls back to another port. Without an explicit root, MCP may attach to a
45
+ different workspace on the preferred port. `PMX_CANVAS_ALLOW_WORKSPACE_SPLIT=1` opts
46
+ out of that heuristic but is not a substitute for checking the actual target.
47
+
48
+ For server startup, precedence is `--port`, then `PMX_WEB_CANVAS_PORT`, then
49
+ `PMX_CANVAS_PORT` (then `PORT` in Amp orbs), then the default 4313. For CLI queries and
50
+ mutations, explicit `--server-url`/`--port` override environment targeting; otherwise
51
+ `PMX_CANVAS_URL` wins over `PMX_CANVAS_PORT`. URL targeting does not set the bind port.
52
+
53
+ ## Start the server
54
+
55
+ On an ordinary local machine:
56
+
57
+ ```bash
58
+ pmx-canvas serve --daemon --no-open --port="$PMX_CANVAS_PORT" --wait-ms=20000
59
+ ```
60
+
61
+ In a managed environment, use the host's supervised-service mechanism with foreground
62
+ `pmx-canvas serve --no-open --port=<chosen-port>`, passing the selected environment.
63
+ Do not daemonize inside a supervisor or rely on `nohup`, background shell jobs, or tmux
64
+ to survive an orb restart. In an Amp orb, prefer declared services with
65
+ `amp orb services ensure`; otherwise use `amp orb service start` with the foreground
66
+ command. Use the host's authenticated portal/preview for remote viewing, not a raw
67
+ loopback URL. Verify health below before opening the workbench or making writes.
68
+
69
+ CLI query/mutation commands do not auto-start a server; `serve` or `--mcp` does.
70
+
71
+ ## From a local checkout (development)
72
+
73
+ ```bash
74
+ git clone https://github.com/pskoett/pmx-canvas.git
75
+ cd pmx-canvas
76
+ bun install
77
+ bun run build
78
+ bun run src/cli/index.ts --version
79
+ ```
80
+
81
+ This uses the checked-out source, not necessarily the published package. Follow
82
+ that checkout's `package.json` Bun requirement and bundled skill. Set the same root/port
83
+ environment above; substitute `bun run /absolute/path/to/pmx-canvas/src/cli/index.ts`
84
+ for `pmx-canvas` in startup and verification commands. The target workspace can be
85
+ different from the source checkout. Build the client before browser verification.
86
+
87
+ ## MCP Config
88
+
89
+ For agents that support MCP, configure the pinned package as a stdio server. Replace
90
+ the root and port with your selections; ensure the port is dedicated to this workspace.
91
+ The empty URL overrides a stale inherited value (empty is treated as unset). If the host
92
+ discards empty env values, remove `PMX_CANVAS_URL` from its launch environment instead.
93
+
94
+ ```json
95
+ {
96
+ "mcpServers": {
97
+ "canvas": {
98
+ "command": "bunx",
99
+ "args": ["pmx-canvas@0.12.1", "--mcp"],
100
+ "env": {
101
+ "PMX_CANVAS_WORKSPACE_ROOT": "/absolute/path/to/project",
102
+ "PMX_CANVAS_PORT": "14313",
103
+ "PMX_CANVAS_URL": ""
104
+ }
105
+ }
106
+ }
107
+ }
108
+ ```
109
+
110
+ If you are using a local checkout instead of the published package, point the command at the CLI entry:
111
+
112
+ ```json
113
+ {
114
+ "mcpServers": {
115
+ "canvas": {
116
+ "command": "bun",
117
+ "args": ["run", "/absolute/path/to/pmx-canvas/src/cli/index.ts", "--mcp"],
118
+ "env": {
119
+ "PMX_CANVAS_WORKSPACE_ROOT": "/absolute/path/to/project",
120
+ "PMX_CANVAS_PORT": "14313",
121
+ "PMX_CANVAS_URL": ""
122
+ }
123
+ }
124
+ }
125
+ }
126
+ ```
127
+
128
+ Restart the host's MCP process after changing configuration. Inspect startup output for
129
+ fallback ports; do not assume the configured port is the one the MCP server bound.
130
+
131
+ ## Amp: connect the agent separately from the portal
132
+
133
+ PMX ships an opt-in directory plugin with board binding and receipt-based steering, or
134
+ you can configure raw MCP for active polling. The portal is the human's browser UI;
135
+ neither opening it nor configuring raw MCP installs the plugin. Choose one integration
136
+ for the task rather than creating duplicate writers.
137
+
138
+ ### Amp plugin: bound threads
139
+
140
+ When installation is requested, copy the complete installed package directory
141
+ `node_modules/pmx-canvas/dist/amp-plugin/pmx-canvas` to the project's
142
+ `.amp/plugins/pmx-canvas`. Inspect existing plugin files and preserve local changes;
143
+ replacement needs owner approval. Reload Amp plugins and load the qualified
144
+ `pmx-canvas:pmx-canvas` skill. Approve its workspace MCP command through the normal
145
+ human trust flow, never by bypassing it. No global plugin installation is implied.
146
+
147
+ Use `pmx_canvas_session { action: "open" }` to start/reconnect and verify the service,
148
+ then `bind` with an existing explicit `boardId`. `status` reports the binding and
149
+ shared active board; `unbind` removes only this thread's binding. Binding does not
150
+ open a board, change sharing, or create an access-control boundary.
151
+
152
+ Bound MCP tool calls route to that board with identity `amp:<thread-id>`, even when
153
+ the human views another board or Home. Use `canvas_query` for context and full
154
+ `canvas_node` reads for needed content. CLI calls and MCP resource reads are not
155
+ intercepted. Do not navigate the shared workbench through bound calls, override the
156
+ destination, or open the board to make a write work. A missing board or changed
157
+ binding fails instead of silently targeting the visible board; a binding change
158
+ during a turn requires a new turn.
159
+
160
+ At turn start, return the supplied context token through
161
+ `pmx_canvas_delivery { action: "receive", token }`. Reception records the delivered
162
+ map, not full card reads, understanding or approval. For a steering token, receive it,
163
+ read the relevant content, act, verify the result, and only then call
164
+ `pmx_canvas_delivery { action: "acknowledge", token }`. Do not acknowledge failed or
165
+ unverified work. Uncertain sends require human resolution, not blind retries or
166
+ deleting the transport journal.
167
+
168
+ Addressed steering can start an idle thread or queue into a busy turn only while
169
+ the plugin executor is awake. It does not wake a sleeping orb or hold a keep-alive
170
+ lease. A raw MCP polling test does not prove this native delivery path.
171
+
172
+ **Context ranking** and **Jev advice** are separate opt-ins, both off by default.
173
+ Their Amp commands require separate human confirmation for the current binding and
174
+ disclose data sent to TypeSafe Jev and the invoking thread's inference billing.
175
+ Ranking reorders optional summaries; advice suggests formats or review order without
176
+ creating output or verifying work. One consent never enables the other. Rebinding
177
+ does not carry either consent. Respect deterministic fallback and report it rather
178
+ than retrying with another provider. See the
179
+ [plugin contract](https://github.com/pskoett/pmx-canvas/blob/main/docs/amp-plugin.md)
180
+ for request fields, retry identities and native acceptance limits.
181
+
182
+ ### Raw MCP: active polling
183
+
184
+ Configure MCP inside the orb or runner where Amp executes, not only on the user's
185
+ laptop. Merge this into that workspace's
186
+ `.amp/settings.json`, preserving other settings (Amp does not use the generic `.mcp.json`):
187
+
188
+ ```json
189
+ {
190
+ "amp.mcpServers": {
191
+ "canvas": {
192
+ "command": "bunx",
193
+ "args": ["pmx-canvas@0.12.1", "--mcp"],
194
+ "includeTools": ["canvas_*"],
195
+ "env": {
196
+ "PMX_CANVAS_WORKSPACE_ROOT": "/absolute/path/to/project",
197
+ "PMX_CANVAS_PORT": "14313",
198
+ "PMX_CANVAS_URL": "",
199
+ "PMX_CANVAS_AGENT_SOURCE": "amp"
200
+ }
201
+ }
202
+ }
203
+ }
204
+ ```
205
+
206
+ Replace root and port with the **existing portal service's actual workspace and local
207
+ listening port**. A supervised service may use an assigned `PORT`, not 4313 or 14313;
208
+ inspect its status/logs and `/health`. Do not put the public portal URL in the stdio
209
+ command or copy another test run's absolute paths. Use an absolute executable path if
210
+ the MCP process cannot find Bun. The `canvas_*` filter exposes the Canvas tool family.
211
+
212
+ ### Workspace trust is a human approval
213
+
214
+ Run `amp mcp doctor` from this workspace to distinguish `awaiting approval` from a
215
+ missing executable or connection failure. A new workspace MCP command requires the
216
+ user to review and approve it. Give the user this command to run in that workspace's
217
+ orb Terminal or runner terminal (replace `canvas` if the configured server name differs):
218
+
219
+ ```bash
220
+ amp mcp approve canvas
221
+ ```
222
+
223
+ The agent must not run this approval itself or move the command to global settings or
224
+ `--mcp-config` to bypass workspace trust. Approval authorizes execution of this MCP
225
+ command; it is not a new Canvas import consent or permission to mutate arbitrary boards.
226
+ After approval, reload MCP connections (`reload_mcp` in Amp) and require `connected`.
227
+ Discover `canvas` tools with `tool_search`; the full unfiltered 0.12.1 server has 25 tools,
228
+ including `canvas_help`. If still absent, inspect the server status, command/PATH and target instead
229
+ of reinstalling blindly. See [Amp MCP documentation](https://ampcode.com/docs/customize/mcp).
230
+
231
+ ### Verify native tools, then steering
232
+
233
+ 1. Check `/health` for the expected package version and canonical workspace. Through
234
+ Amp's discovered tools, read `canvas_board { action: "get" }` and
235
+ `canvas_query { action: "context" }`; verify the board matches the visible portal.
236
+ A CLI smoke check or SDK-spawned MCP client does not establish native Amp discovery.
237
+ 2. For a requested end-to-end check, use a disposable board. Pin a known card in the
238
+ portal and require a native context read to return that card as pinned. Use one
239
+ stable presence/steering identity (`amp` above, or a unique source per independent
240
+ agent); reuse any adapter-owned session instead of attaching a duplicate.
241
+ 3. Send a fresh browser message addressed to that identity. The running agent claims
242
+ it with `canvas_ax_delivery` using the same `consumer`, reads the relevant card,
243
+ signals intent, and performs the requested edit through native Canvas tools.
244
+ 4. Verify the visible result in the browser before marking the message delivered for
245
+ that consumer. A subsequent claim should omit it. Detach only test-owned sessions.
246
+
247
+ This raw-MCP check proves an **active agent can poll and act**, not automatic wake-up
248
+ of an idle Amp thread, background polling, or automatic agent launch for imports. An MCP connection
249
+ does not install a steering pump. Only configure a pump/host integration when requested;
250
+ its startup backlog rules are in the main skill. Tool discovery and resource reads also
251
+ do not establish Amp support for native MCP Skills-extension discovery or activation.
252
+
253
+ ## Verify the actual target before writes
254
+
255
+ For the local target selected above:
256
+
257
+ ```bash
258
+ pmx-canvas --version
259
+ curl --fail --silent --show-error "http://localhost:${PMX_CANVAS_PORT}/health"
260
+ pmx-canvas serve status --port="$PMX_CANVAS_PORT"
261
+ ```
262
+
263
+ Require healthy `ok`, the expected running `version`, and a **`workspace`** matching the
264
+ intended canonical absolute root (resolve symlinks on both paths). Inspect persistence
265
+ health too. `serve status` checks a local port, not an arbitrary `PMX_CANVAS_URL`.
266
+ When deliberately targeting a URL or a fallback port, fetch `/health` there instead,
267
+ then align CLI, MCP, and browser to it. Never print a credential-bearing URL.
268
+ On mismatch, stop: leave the other server alone, choose a free port, and repeat.
269
+
270
+ Only after confirming the target:
271
+
272
+ ```bash
273
+ pmx-canvas layout
274
+ pmx-canvas open
275
+ ```
276
+
277
+ Inside an orb, open the registered portal rather than asking the user to open localhost.
278
+
279
+ ## Disposable smoke verification
280
+
281
+ `smoke` creates/searches/removes a temporary node and can leave history/activity records.
282
+ It reports the workspace but does **not** compare it with your intended root. Do not run
283
+ it on a valuable board as an identity check. Use a new disposable workspace and its own
284
+ free port, start it with the appropriate startup method above, and verify `/health` first:
285
+
286
+ ```bash
287
+ export PMX_CANVAS_WORKSPACE_ROOT="$(mktemp -d)"
288
+ export PMX_CANVAS_PORT=14314 # Choose another free port.
289
+ unset PMX_CANVAS_URL
290
+ # Start this workspace's server, then verify its actual health workspace/version.
291
+ # Only after that verification succeeds:
292
+ pmx-canvas smoke
293
+ ```
294
+
295
+ Inspect the JSON report and exit status: health, MCP initialize, node lifecycle, and
296
+ validation should pass; failures exit 1. Version skew is reported in details and is not
297
+ necessarily a failing check. Smoke proves neither `tools/list` discovery nor browser
298
+ rendering: verify those separately when testing the complete onboarding experience.
299
+ Stop only the test server (service-manager stop, or `serve stop --port=<test-port>` for
300
+ your local daemon) before removing its disposable directory. Never clear a user's board
301
+ or stop an unrelated listener to make a smoke test pass.
@@ -0,0 +1,117 @@
1
+ # Tours and recording
2
+
3
+ Tours use the existing board cards as presentation content. Interactive presentation and
4
+ deterministic capture share this one stop model; recording does not create a second deck.
5
+
6
+ ## Author a tour
7
+
8
+ Persist a tour with `canvas_view { action: "set-tour", tour: { stops: [...] } }` and read it with
9
+ `canvas_view { action: "get-tour" }`. A stop has exactly one target:
10
+
11
+ ```json
12
+ {
13
+ "stops": [
14
+ { "target": { "nodeId": "overview-group" }, "duration": 1.5, "padding": 60 },
15
+ { "target": { "nodeId": "detail-note" }, "duration": 2, "easing": "ease-in-out", "pullback": 0.7 },
16
+ { "target": { "viewport": { "x": 80, "y": 100, "scale": 0.5 } }, "duration": 1 }
17
+ ]
18
+ }
19
+ ```
20
+
21
+ - `nodeId` may identify a card or group. Its persisted position and size determine the camera.
22
+ - `rect` is a world-space box `{ x, y, width, height }` (top-left corner plus size).
23
+ - An explicit viewport is `{ x, y, scale }`, with positive `scale`. Translation is screen-space:
24
+ `screen = world * scale + offset`.
25
+ - `duration` is transition time in seconds (default 1; zero jumps). Valid values are 0–3600.
26
+ - `padding` is screen pixels around a node or rect target (default 40).
27
+ - `easing` is `linear`, `ease-in-out` (default), or `ease-out`.
28
+ - `pullback` is 0–4 (default 0). It zooms out during the move without changing either endpoint.
29
+ - A tour contains at most 1000 stops.
30
+
31
+ Open `/workbench?present=1` for chrome-free viewing. Right, Down, or Space advances; Left or Up
32
+ goes back; Escape or **Exit presentation** exits. Right-drag pans and interrupts an ongoing
33
+ transition without editing cards. Stops do not auto-advance. A missing node target reports an
34
+ error and may be skipped. Camera rendering and free pan are viewer-local, but human Back/Next
35
+ and arrow keys advance the target board's shared cursor for its presenting viewers; Exit leaves
36
+ presentation for those viewers. `present: false` does not isolate viewers of the same board.
37
+ Deterministic capture uses its own viewer and ignores live navigation. Recording hides the exit control.
38
+
39
+ Tours are board-scoped, persist with that board and its snapshots, participate in undo, and clear
40
+ with the board. Setting `tour: null` resets to a derived tour: groups ordered by y, then x, then
41
+ ID. A saved `{ "stops": [] }` intentionally has no stops; it does not enable group derivation.
42
+ Preserve the tour of each board when working across boards and target the intended board before
43
+ setting or reading it.
44
+
45
+ ## Drive a tour
46
+
47
+ The server keeps board-local in-memory tour cursors, not one workspace-wide cursor.
48
+ `canvas_view { action: "tour-go", stop: 0 }` starts presenting in workbenches showing the
49
+ target board; `step: "next" | "previous"` moves relative to that board's cursor
50
+ (a human's arrow keys move the same cursor) and clamps at the ends. Pass
51
+ `present: false` to move only viewers already presenting. `canvas_view { action: "tour-exit" }`
52
+ exits presentation on the target board. `get-tour` reports `position` (the current stop, or null).
53
+ Bound background calls do not navigate the human's visible board. Cursors are not durable:
54
+ tour edits or activation changes can invalidate them, so read `get-tour` rather than assuming
55
+ a previous stop survives reopening a board.
56
+
57
+ `canvas_view { action: "move", nodeId | rect | viewport, duration, easing, padding, pullback }`
58
+ eases the camera without a tour. Outside a presentation the end camera becomes the board
59
+ viewport. Tour steps and moves never enter undo history, never count as agent writes, and are
60
+ allowed under a scope fence. Viewers with reduced motion jump instead of animating; a
61
+ deterministic capture ignores both.
62
+
63
+ If another viewer's camera must stay unchanged, do not send `tour-go`, `tour-exit` or `move`,
64
+ or use the human shared navigation controls. Author stops and capture them in the separate
65
+ recording viewer instead. Verify isolation with another viewer already presenting, not only
66
+ an ordinary canvas tab.
67
+
68
+ ### Optional presenter ordering fence
69
+
70
+ `tour-go` and `tour-exit` accept `presenter: { clientId, intent, catalogEpoch, boardGeneration }`.
71
+ Use a distinct `clientId` per document, an increasing positive safe-integer `intent` per gesture,
72
+ and the actual server activation's epoch and nonnegative safe-integer generation. Ordinary
73
+ agent calls may omit this object. It orders requests; it is not authorization or viewer isolation.
74
+
75
+ A stale activation, duplicate/older intent, or presenter-bearing call on a background board
76
+ returns `{ ok: true, superseded: true }` with no navigation event or cursor change.
77
+ Ordinary unfenced background calls still target their own board, not the visible one.
78
+ Do not claim navigation from `ok: true` alone. Applied results
79
+ and events carry `catalogEpoch`, `boardGeneration` and `sequence`; presenter-aware clients use
80
+ these to reject stale acknowledgements and events. A structurally valid newer intent is claimed
81
+ before resolving the stop, so even a missing newer stop supersedes older requests.
82
+
83
+ This is latest-intent-wins, not FIFO: reversed relative Next requests can coalesce. Separate
84
+ documents remain independent, and reload does not cancel an old document's pending request.
85
+ An activation retains at most 4096 document IDs; a new ID beyond that returns 409 rather than
86
+ evicting an ordering record. Switching boards resets the capacity but old activation stamps stay stale.
87
+ The SDK accepts `goToTourStop(step, { presenter })` and `exitTour(presenter)`; fenced go can return
88
+ `{ superseded: true }`, while exit returns void. Do not infer applied exit from that void return.
89
+
90
+ ## Capture prerequisites and behavior
91
+
92
+ Start and verify the matching PMX daemon first: its `/health` workspace and version must match the
93
+ installation and workspace used by the CLI/MCP host. Capture is a local CLI/file operation. It
94
+ requires Bun with WebView support and Chrome (or `--chrome-path`); MP4 encoding additionally
95
+ requires ffmpeg. Recording starts a separate Chrome session; it does not capture the native host's
96
+ Browser pane. Use a new output path because existing output and frame paths are refused.
97
+
98
+ Capture the saved or derived tour:
99
+
100
+ ```bash
101
+ pmx-canvas record --mode deterministic --present --fps 30 --resolution 1920x1080 --output tour.mp4
102
+ ```
103
+
104
+ Use `--tour-file tour.json` in deterministic mode to try the same model without changing the
105
+ board. Resolution defaults to 1280x720 and FPS to 30 (valid 1–120). Deterministic mode resolves
106
+ target geometry once and emits `max(1, ceil(duration * fps))` frames per stop, including each
107
+ endpoint. Duplicate a stop to hold it. It makes camera timing deterministic, not iframe animation,
108
+ late fonts/network assets, or concurrent board edits.
109
+
110
+ Realtime mode instead needs one stopping rule: `--duration SECONDS` or `--stop-on-signal`. It
111
+ samples the live board and repeats frames when capture is slow to preserve wall-clock duration.
112
+ Capture has no audio and does not move other viewers' cameras or replace an existing automation
113
+ session.
114
+
115
+ An `.mp4` output uses ffmpeg/H.264. Frames and `recording.json` remain in `<output>.frames`; if
116
+ ffmpeg is unavailable, the command reports and returns the PNG sequence directory. Any other
117
+ output path is itself a PNG sequence directory. Encoding failures retain the frames and fail.