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,20 @@
1
+ import { canvasState } from './canvas-state.js';
2
+
3
+ /** Board-owned runtime state, discarded with its owner rather than on navigation. */
4
+ export function createBoardLocal<T>(create: () => T, dispose?: (value: T) => void) {
5
+ // Hoisted for canvas-state's mutation-history dependency; access the owner only on read.
6
+ const values = new WeakMap<object, T>();
7
+ return {
8
+ get current(): T {
9
+ const owner = canvasState.boardIdentity;
10
+ let value = values.get(owner);
11
+ if (value === undefined) {
12
+ value = create();
13
+ values.set(owner, value);
14
+ const created = value;
15
+ canvasState.onBoardDispose(() => dispose?.(created));
16
+ }
17
+ return value;
18
+ },
19
+ };
20
+ }
@@ -0,0 +1,297 @@
1
+ import type { ActorAttribution } from './attribution.js';
2
+ import { createEmptyAxState } from './ax-state.js';
3
+ import type { CanvasBoard, PersistedCanvasState } from './canvas-db.js';
4
+ import type { CanvasNodeState } from './canvas-state.js';
5
+ import type { DocumentImport } from './document-import.js';
6
+ import { OperationError } from './operations/types.js';
7
+
8
+ export interface BoardMoveInput {
9
+ sourceBoardId: string;
10
+ nodeIds: string[];
11
+ name: string;
12
+ expectedRevision: number;
13
+ requestId: string;
14
+ preview?: boolean;
15
+ }
16
+
17
+ export interface BoardMovePreview {
18
+ sourceBoardId: string;
19
+ nodeIds: string[];
20
+ affectedBoardIds: string[];
21
+ readmeNodeId: string | null;
22
+ pinnedNodeIds: string[];
23
+ liveTaskNodeIds: string[];
24
+ attachmentIds: string[];
25
+ blockers: string[];
26
+ notices: string[];
27
+ }
28
+
29
+ export interface BoardMoveResult {
30
+ sourceBoardId: string;
31
+ destinationBoardId: string;
32
+ portalId: string;
33
+ nodeIds: string[];
34
+ affectedBoardIds: string[];
35
+ }
36
+
37
+ export interface MoveBoard {
38
+ board: CanvasBoard;
39
+ state: PersistedCanvasState;
40
+ }
41
+
42
+ function record(value: unknown): Record<string, unknown> | undefined {
43
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
44
+ ? (value as Record<string, unknown>)
45
+ : undefined;
46
+ }
47
+
48
+ function strings(value: unknown): string[] {
49
+ return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : [];
50
+ }
51
+
52
+ function attachmentId(node: CanvasNodeState): string | undefined {
53
+ const value = node.data.attachmentId ?? record(node.data.source)?.attachmentId;
54
+ return typeof value === 'string' ? value : undefined;
55
+ }
56
+
57
+ /** Pure relocation plan. Preview and commit run the same checks on a consistent library view. */
58
+ export function prepareBoardMove(
59
+ input: BoardMoveInput,
60
+ library: Map<string, MoveBoard>,
61
+ destinationId: string,
62
+ portalId: string,
63
+ imports: DocumentImport[],
64
+ runtimeBlockers: ReadonlyMap<string, string>,
65
+ actor: ActorAttribution,
66
+ at: string,
67
+ ): { preview: BoardMovePreview; states: Map<string, PersistedCanvasState> } {
68
+ const source = library.get(input.sourceBoardId);
69
+ if (!source) throw new OperationError('Source board not found.', 404);
70
+ if (input.expectedRevision !== (source.state.revisionState?.revision ?? 0))
71
+ throw new OperationError('The source board changed. Preview the move again.', 409);
72
+ if (!input.nodeIds.length) throw new OperationError('Select at least one card to move.');
73
+ const nodes = new Map(source.state.nodes.map((node) => [node.id, node]));
74
+ const moving = new Set<string>();
75
+ const include = (id: string) => {
76
+ if (moving.has(id)) return;
77
+ const node = nodes.get(id);
78
+ if (!node) throw new OperationError(`Selected card "${id}" no longer exists.`, 409);
79
+ moving.add(id);
80
+ if (node.type === 'group') {
81
+ for (const child of strings(node.data.children)) include(child);
82
+ for (const child of nodes.values()) if (child.data.parentGroup === id) include(child.id);
83
+ }
84
+ };
85
+ for (const id of input.nodeIds) include(id);
86
+ const blockers = new Set<string>();
87
+ const movedAttachments = new Set<string>();
88
+ const liveTasks: string[] = [];
89
+ const blocks = (id: string, reason: string) => blockers.add(`${id}: ${reason}`);
90
+ for (const node of source.state.nodes) {
91
+ const moves = moving.has(node.id);
92
+ const data = node.data;
93
+ if (moves) {
94
+ const runtime = runtimeBlockers.get(node.id);
95
+ if (runtime) blocks(node.id, runtime);
96
+ if (
97
+ data.streamStatus === 'open' ||
98
+ data._activeResponseId ||
99
+ (['prompt', 'response'].includes(node.type) &&
100
+ ['pending', 'sending', 'streaming'].includes(String(data.threadStatus ?? data.status)))
101
+ )
102
+ blocks(node.id, 'finish the active producer before moving this card');
103
+ if (
104
+ (node.type === 'context' && node.id === 'context-main') ||
105
+ (node.type === 'status' && node.id === 'status-main')
106
+ )
107
+ blocks(node.id, 'this presentation is owned by the host adapter');
108
+ if (data.appSessionId || data.transportConfig || data.sessionStatus === 'reconnecting')
109
+ blocks(node.id, 'the external app binding cannot be relocated without reconnecting');
110
+ if (data.workboard || data.axStep || data.axFlow || data.axFlowId)
111
+ blocks(node.id, 'materialized task/flow controls retain authority on this board');
112
+ if (node.type === 'status' && typeof data.workItemId === 'string') liveTasks.push(node.id);
113
+ const attachment = attachmentId(node);
114
+ if (attachment) movedAttachments.add(attachment);
115
+ if (
116
+ ['html', 'json-render', 'graph', 'mcp-app'].includes(node.type) &&
117
+ /ax[.:](work|approval|flow|elicitation|mode)|data-ax-|\/api\/canvas\/ax/.test(JSON.stringify(data))
118
+ )
119
+ blocks(node.id, 'embedded action targets cannot retain their board authority after this move');
120
+ }
121
+ // Declared local bindings are not opaque strings to rewrite. Both ends must move together.
122
+ const local = [
123
+ ...strings(data.embeddedNodeIds),
124
+ ...strings(data.contextNodeIds),
125
+ data.embeddedNodeId,
126
+ data.embeddedGraphId,
127
+ data.sourceNodeId,
128
+ data.promptNodeId,
129
+ data.responseNodeId,
130
+ data.parentNodeId,
131
+ ].filter((id): id is string => typeof id === 'string');
132
+ for (const text of [data.url, data.html, data.content, ...strings(data.embeddedUrls)]) {
133
+ if (typeof text !== 'string') continue;
134
+ for (const match of text.matchAll(/\/api\/canvas\/[^\s"'<>]+/g)) {
135
+ const url = new URL(match[0].replaceAll('&amp;', '&'), 'http://canvas.local');
136
+ let target =
137
+ url.pathname === '/api/canvas/json-render/view' || url.pathname === '/api/canvas/file-bytes'
138
+ ? url.searchParams.get('nodeId')
139
+ : url.pathname.match(/^\/api\/canvas\/image\/(.+)$/)?.[1];
140
+ if (url.pathname.startsWith('/api/canvas/surface/')) {
141
+ try {
142
+ target = decodeURIComponent(url.pathname.slice('/api/canvas/surface/'.length));
143
+ } catch {
144
+ // Malformed examples in authored text cannot resolve to a surface.
145
+ continue;
146
+ }
147
+ }
148
+ if (target) local.push(target);
149
+ }
150
+ }
151
+ for (const id of local)
152
+ if (moving.has(id) !== moves)
153
+ blocks(node.id, `include both ends of the local viewer/content reference to "${id}"`);
154
+ }
155
+ for (const node of source.state.nodes) {
156
+ const attachment = attachmentId(node);
157
+ if (attachment && movedAttachments.has(attachment) && !moving.has(node.id))
158
+ blocks(node.id, 'include every card sharing this attachment/import');
159
+ }
160
+ for (const job of imports) {
161
+ if (!movedAttachments.has(job.attachmentId) && !job.committedNodeIds.some((id) => moving.has(id))) continue;
162
+ if (job.status === 'requested' || job.status === 'drafted')
163
+ blocks(job.id, 'finish or cancel the document import first');
164
+ if (!movedAttachments.has(job.attachmentId) || job.committedNodeIds.some((id) => !moving.has(id)))
165
+ blocks(job.id, 'include the original attachment and every imported section');
166
+ }
167
+ for (const stop of source.state.tour?.stops ?? []) {
168
+ if ('nodeId' in stop.target && moving.has(stop.target.nodeId))
169
+ blocks(stop.target.nodeId, 'a source-board tour targets this card; remove that stop before moving');
170
+ }
171
+ const ax = source.state.ax ?? createEmptyAxState();
172
+ for (const item of [...ax.workItems, ...ax.approvalGates, ...ax.elicitations, ...ax.modeRequests]) {
173
+ for (const id of item.nodeIds)
174
+ if (moving.has(id)) blocks(id, `board-owned work/approval/input record "${item.id}" anchors this card`);
175
+ }
176
+ for (const review of ax.reviewAnnotations)
177
+ if (review.nodeId && moving.has(review.nodeId))
178
+ blocks(review.nodeId, `board-local review annotation "${review.id}" anchors this card`);
179
+
180
+ const states = new Map<string, PersistedCanvasState>();
181
+ const destination: PersistedCanvasState = {
182
+ version: 1,
183
+ theme: source.state.theme,
184
+ viewport: { x: 0, y: 0, scale: 1 },
185
+ nodes: [],
186
+ edges: [],
187
+ contextPins: [],
188
+ contextPinMeta: {},
189
+ annotations: [],
190
+ ax: createEmptyAxState(),
191
+ };
192
+ const locate = (boardId: string, cardId: string) =>
193
+ boardId === input.sourceBoardId && moving.has(cardId) ? destinationId : boardId;
194
+ for (const [boardId, entry] of library) {
195
+ const state = structuredClone(entry.state);
196
+ const prior = JSON.stringify(state);
197
+ state.edges = state.edges.flatMap((edge) => {
198
+ const owner = locate(boardId, edge.from);
199
+ const target = locate(edge.toBoardId ?? boardId, edge.to);
200
+ const next = { ...edge };
201
+ if (target === owner) delete next.toBoardId;
202
+ else next.toBoardId = target;
203
+ if (owner === destinationId) {
204
+ destination.edges.push(next);
205
+ return [];
206
+ }
207
+ return [next];
208
+ });
209
+ state.nodes = state.nodes.flatMap((node) => {
210
+ const data = node.data;
211
+ for (const link of Array.isArray(data.wikiLinks) ? data.wikiLinks : []) {
212
+ const target = record(record(link)?.target);
213
+ if (target?.boardId === input.sourceBoardId && typeof target.cardId === 'string' && moving.has(target.cardId))
214
+ target.boardId = destinationId;
215
+ }
216
+ const provenance = record(data.provenance);
217
+ for (const target of Array.isArray(provenance?.sources) ? provenance.sources : []) {
218
+ const ref = record(target);
219
+ if (ref?.boardId === input.sourceBoardId && typeof ref.cardId === 'string' && moving.has(ref.cardId))
220
+ ref.boardId = destinationId;
221
+ }
222
+ if (boardId !== input.sourceBoardId) return [node];
223
+ if (!moving.has(node.id)) {
224
+ if (node.type === 'group') data.children = strings(data.children).filter((id) => !moving.has(id));
225
+ return [node];
226
+ }
227
+ if (typeof data.parentGroup === 'string' && !moving.has(data.parentGroup)) delete data.parentGroup;
228
+ if (node.type === 'status' && typeof data.workItemId === 'string') data.workItemBoardId ??= input.sourceBoardId;
229
+ destination.nodes.push(node);
230
+ if (state.contextPins.includes(node.id)) {
231
+ destination.contextPins.push(node.id);
232
+ const meta = state.contextPinMeta?.[node.id];
233
+ if (meta) destination.contextPinMeta![node.id] = meta;
234
+ }
235
+ return [];
236
+ });
237
+ if (boardId === input.sourceBoardId) {
238
+ state.contextPins = state.contextPins.filter((id) => !moving.has(id));
239
+ for (const id of moving) if (state.contextPinMeta) delete state.contextPinMeta[id];
240
+ if (state.ax) {
241
+ state.ax.focus.nodeIds = state.ax.focus.nodeIds.filter((id) => !moving.has(id));
242
+ if (state.ax.focus.primaryNodeId && moving.has(state.ax.focus.primaryNodeId))
243
+ state.ax.focus.primaryNodeId = null;
244
+ }
245
+ }
246
+ if (prior !== JSON.stringify(state) || boardId === input.sourceBoardId) states.set(boardId, state);
247
+ }
248
+ const revision =
249
+ Math.max(
250
+ source.state.revisionState?.revision ?? 0,
251
+ ...destination.nodes.flatMap((node) => [node.contentRevision ?? 0, node.linksRevision ?? 0]),
252
+ ...destination.edges.map((edge) => edge.revision ?? 0),
253
+ ) + 1;
254
+ const selected = [...moving].map((id) => nodes.get(id)!);
255
+ states.get(input.sourceBoardId)!.nodes.push({
256
+ id: portalId,
257
+ type: 'board',
258
+ data: { boardId: destinationId, title: input.name },
259
+ position: {
260
+ x: Math.min(...selected.map((node) => node.position.x)),
261
+ y: Math.min(...selected.map((node) => node.position.y)),
262
+ },
263
+ size: { width: 360, height: 200 },
264
+ zIndex: Math.max(...selected.map((node) => node.zIndex)),
265
+ collapsed: false,
266
+ pinned: false,
267
+ createdBy: actor,
268
+ lastEditedBy: actor,
269
+ contentRevision: revision,
270
+ contentChangedAt: at,
271
+ freshnessStartedAt: at,
272
+ });
273
+ states.set(destinationId, destination);
274
+ for (const state of states.values()) {
275
+ const floor = Math.max(state.revisionState?.revision ?? 0, revision) + 1;
276
+ state.revisionState = { revision: floor, floor, tombstones: [] };
277
+ }
278
+ return {
279
+ states,
280
+ preview: {
281
+ sourceBoardId: input.sourceBoardId,
282
+ nodeIds: [...moving].sort(),
283
+ affectedBoardIds: [...states.keys()].filter((id) => id !== destinationId).sort(),
284
+ readmeNodeId:
285
+ source.board.readmeNodeId && moving.has(source.board.readmeNodeId) ? source.board.readmeNodeId : null,
286
+ pinnedNodeIds: destination.contextPins,
287
+ liveTaskNodeIds: liveTasks,
288
+ attachmentIds: [...movedAttachments],
289
+ blockers: [...blockers],
290
+ notices: [
291
+ 'Moves the original cards and leaves a portal. This is not a copy.',
292
+ 'Pre-move Undo/Redo is cleared on affected boards. Older snapshots remain inspectable but cannot be restored across the move.',
293
+ 'Board-space annotations stay on the source. Live tasks keep their original owner.',
294
+ ],
295
+ },
296
+ };
297
+ }