pmx-canvas 0.11.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 (298) 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 +440 -18
  4. package/CHANGELOG.md +37 -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-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 +16 -2
  151. package/docs/amp-plugin.md +271 -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 +3 -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 +232 -842
  179. package/skills/pmx-canvas/evals/evals.json +26 -3
  180. package/skills/pmx-canvas/references/full-reference.md +80 -20
  181. package/skills/pmx-canvas/references/html-primitives.md +7 -0
  182. package/skills/pmx-canvas/references/installing-pmx-canvas.md +6 -6
  183. package/skills/pmx-canvas/references/tours-and-recording.md +29 -2
  184. package/skills/pmx-canvas/references/workbench-workflows.md +900 -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/init-artifact.sh +2 -2
  191. package/src/cli/commands/apps.ts +1 -0
  192. package/src/cli/commands/boards.ts +30 -0
  193. package/src/client/App.tsx +20 -4
  194. package/src/client/canvas/AttentionHistory.tsx +10 -2
  195. package/src/client/canvas/BoardMoveDialog.tsx +225 -0
  196. package/src/client/canvas/CanvasNode.tsx +45 -2
  197. package/src/client/canvas/CanvasViewport.tsx +38 -9
  198. package/src/client/canvas/ContextMenu.tsx +34 -12
  199. package/src/client/canvas/EdgeEditor.tsx +149 -0
  200. package/src/client/canvas/EdgeLayer.tsx +87 -16
  201. package/src/client/canvas/ExpandedNodeOverlay.tsx +4 -0
  202. package/src/client/canvas/GroupNavigation.tsx +85 -0
  203. package/src/client/canvas/RelationsPanel.tsx +9 -0
  204. package/src/client/canvas/SelectionBar.tsx +21 -0
  205. package/src/client/canvas/SessionPanel.tsx +35 -1
  206. package/src/client/canvas/TextPrompt.tsx +18 -1
  207. package/src/client/canvas/TopBar.tsx +30 -0
  208. package/src/client/canvas/canvas-area.ts +1 -1
  209. package/src/client/nodes/ExtAppFrame.tsx +26 -10
  210. package/src/client/nodes/MarkdownNode.tsx +6 -7
  211. package/src/client/nodes/PromptNode.tsx +32 -3
  212. package/src/client/nodes/StatusNode.tsx +12 -0
  213. package/src/client/nodes/StatusSummary.tsx +11 -0
  214. package/src/client/nodes/ViewerFrame.tsx +21 -10
  215. package/src/client/nodes/WorkCard.tsx +175 -0
  216. package/src/client/nodes/use-ax-surface-bridge.ts +18 -14
  217. package/src/client/state/attention-bridge.ts +5 -0
  218. package/src/client/state/attention-store.ts +1 -0
  219. package/src/client/state/canvas-store.ts +185 -15
  220. package/src/client/state/human-store.ts +22 -2
  221. package/src/client/state/intent-bridge.ts +19 -5
  222. package/src/client/state/relation-store.ts +127 -1
  223. package/src/client/theme/global.css +94 -1
  224. package/src/client/types.ts +1 -0
  225. package/src/mcp/server.ts +13 -3
  226. package/src/server/agent-presence.ts +43 -23
  227. package/src/server/ax-flow-loop.ts +6 -0
  228. package/src/server/ax-gate-ttl.ts +8 -1
  229. package/src/server/ax-interaction.ts +16 -10
  230. package/src/server/ax-state-manager.ts +17 -4
  231. package/src/server/ax-wait.ts +20 -6
  232. package/src/server/board-export.ts +19 -6
  233. package/src/server/board-local.ts +20 -0
  234. package/src/server/board-move.ts +297 -0
  235. package/src/server/canvas-db.ts +249 -158
  236. package/src/server/canvas-operations.ts +139 -109
  237. package/src/server/canvas-schema.ts +21 -0
  238. package/src/server/canvas-serialization.ts +2 -0
  239. package/src/server/canvas-state.ts +792 -159
  240. package/src/server/card-relocation.ts +53 -0
  241. package/src/server/code-graph.ts +4 -3
  242. package/src/server/context-reads.ts +83 -55
  243. package/src/server/demo-state.json +35 -15
  244. package/src/server/file-watcher.ts +30 -10
  245. package/src/server/human-presence.ts +18 -5
  246. package/src/server/index.ts +35 -15
  247. package/src/server/intent-registry.ts +43 -5
  248. package/src/server/knowledge-lifecycle.ts +32 -9
  249. package/src/server/lifecycle-status.ts +29 -1
  250. package/src/server/mcp-app-runtime.ts +26 -7
  251. package/src/server/mutation-history.ts +37 -8
  252. package/src/server/operations/composites.ts +6 -3
  253. package/src/server/operations/mcp-contracts.ts +15 -0
  254. package/src/server/operations/mcp.ts +36 -9
  255. package/src/server/operations/ops/annotation.ts +22 -1
  256. package/src/server/operations/ops/ax-await.ts +1 -0
  257. package/src/server/operations/ops/ax-timeline.ts +28 -2
  258. package/src/server/operations/ops/batch.ts +25 -11
  259. package/src/server/operations/ops/boards.ts +44 -3
  260. package/src/server/operations/ops/nodes.ts +70 -0
  261. package/src/server/operations/ops/query.ts +32 -3
  262. package/src/server/operations/ops/snapshots.ts +1 -0
  263. package/src/server/operations/registry.ts +49 -4
  264. package/src/server/server.ts +62 -16
  265. package/src/server/tour-control.ts +37 -12
  266. package/src/server/trace-manager.ts +4 -0
  267. package/src/server/web-artifacts/scripts/init-artifact.sh +2 -2
  268. package/src/shared/agent-context.ts +7 -1
  269. package/src/shared/auto-arrange.ts +5 -4
  270. package/src/shared/ax-kinds.ts +13 -0
  271. package/src/shared/ax-surface-protocol.ts +22 -0
  272. package/src/shared/human-presence.ts +1 -0
  273. package/src/shared/lifecycle-status.ts +2 -0
  274. package/dist/canvas/chunks/architecture-TIHT7OUA-9tffvpsv.js +0 -1
  275. package/dist/canvas/chunks/classDiagram-JCYQIIEL-nc6g5x1r.js +0 -1
  276. package/dist/canvas/chunks/classDiagram-v2-OCEON4UE-0qnbpwvh.js +0 -1
  277. package/dist/canvas/chunks/cynefin-VYW2F7L2-ys8p46ts.js +0 -1
  278. package/dist/canvas/chunks/eventmodeling-45OFAUF4-v9q6dn4c.js +0 -1
  279. package/dist/canvas/chunks/flowDiagram-UKHOOZJN-yrr5z8tc.js +0 -1
  280. package/dist/canvas/chunks/gitGraph-TEB2WS4Q-kdwb8m0a.js +0 -1
  281. package/dist/canvas/chunks/index-1r72hdzb.js +0 -301
  282. package/dist/canvas/chunks/index-g3pwnqeb.js +0 -2
  283. package/dist/canvas/chunks/index-rft2hcz5.js +0 -2
  284. package/dist/canvas/chunks/info-DKCQHKI2-wpzs6sz3.js +0 -1
  285. package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-5hnq1a9p.js +0 -70
  286. package/dist/canvas/chunks/packet-7NZHBO7P-xn439f0s.js +0 -1
  287. package/dist/canvas/chunks/pie-RZYD4A2V-0kf16rwh.js +0 -1
  288. package/dist/canvas/chunks/radar-I7S5WNFK-0g2pz36t.js +0 -1
  289. package/dist/canvas/chunks/railroad-3IZDKUUU-fcaran6j.js +0 -1
  290. package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-wgdya41q.js +0 -1
  291. package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-gy07a4ka.js +0 -1
  292. package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-ewk6wtkh.js +0 -1
  293. package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-k8sfp2e7.js +0 -1
  294. package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-nqysw67j.js +0 -8
  295. package/dist/canvas/chunks/treeView-QDETBFTQ-cesw6gp0.js +0 -1
  296. package/dist/canvas/chunks/treemap-6X3UGDF4-zdv4knp9.js +0 -1
  297. package/dist/canvas/chunks/vennDiagram-T6HMQDX7-x8dqn9yf.js +0 -34
  298. package/dist/canvas/chunks/wardley-OPB4EBWU-44pdddez.js +0 -1
package/docs/RELEASE.md CHANGED
@@ -25,8 +25,11 @@ single source of truth for the release dance — see also
25
25
 
26
26
  ## Pre-flight gates
27
27
 
28
- Run these locally before tagging. They mirror what `publish.yml`
29
- re-runs in CI; a failure here means the publish workflow will also fail.
28
+ Run these locally before tagging. `test.yml` runs the client and browser suites.
29
+ For tag releases, `publish.yml` requires a successful Test run for the exact
30
+ tagged commit, then reruns build, typecheck, unit tests and release smoke.
31
+ Publish does not rerun the client or browser suites. A green remote run does
32
+ not clear an unresolved local failure.
30
33
 
31
34
  ```bash
32
35
  bun install --frozen-lockfile
@@ -35,7 +38,7 @@ bun run build
35
38
  bun test tests/unit # 200+ tests, all green
36
39
  bun run test:web-canvas # Playwright E2E, all green
37
40
  bun run test:e2e-cli # fresh-workspace CLI eval
38
- bun run release:check # bundles + lints
41
+ bun run release:check # build + typecheck + lint + unit + client + browser tests
39
42
  bun run release:smoke # packs + boots from a clean dir
40
43
  bun run pack:dry-run # confirms the tarball shape
41
44
  ```
@@ -179,8 +182,10 @@ git push origin v0.1.6
179
182
  It will:
180
183
 
181
184
  1. Verify the tag matches `package.json` version.
182
- 2. Re-run typecheck / build / unit / E2E / pack.
183
- 3. `npm publish --access public --provenance` using the `NPM_TOKEN`
185
+ 2. Require a successful Test workflow run for the exact tagged commit.
186
+ 3. Re-run build, typecheck, unit tests and release smoke (pack and clean-consumer checks).
187
+ Browser E2E is covered by Test, not rerun by Publish.
188
+ 4. `npm publish --access public --provenance` using the `NPM_TOKEN`
184
189
  secret. Provenance attestations are signed via sigstore and visible
185
190
  on the npm package page.
186
191
 
@@ -203,24 +208,26 @@ Every release since 0.3.0 has been retested against **stale** skill mirrors:
203
208
  consumer workspaces (e.g. `personalclaude`) carry copies of the pmx-canvas
204
209
  skills under `.github/`, `.codex/`, `.claude/`, and `.agents/`, and testers
205
210
  repeatedly had to sync them mid-cycle before results were trustworthy. After
206
- publishing, update the installed package in the consumer workspace and re-sync
207
- its four mirrors from `<global npm root>/pmx-canvas/skills/` so the first test
208
- pass runs against the released skills, not the previous version's guidance.
211
+ publishing, update the installed package in the consumer workspace and check
212
+ its installed skill copies against that package before trusting skill-guided results.
209
213
 
210
- This is now one command in the consumer workspace (added post-0.4.3):
214
+ Start with drift detection, which does not overwrite local changes:
211
215
 
212
216
  ```bash
213
- pmx-canvas skills sync --yes # refreshes every INSTALLED skill copy from the package
214
217
  pmx-canvas skills sync --check # drift detection only (exit 1 when stale)
215
218
  ```
216
219
 
217
220
  It discovers the skill copies already installed in the workspace (whatever
218
- agent layout owns them — no host list is assumed) and compares/replaces
221
+ agent layout owns them — no host list is assumed) and compares
219
222
  **whole trees** — `references/`, `evals/`, fixtures — not `SKILL.md` hashes
220
223
  alone (the 0.3.x–0.4.x cycles repeatedly hit drift where the hash matched but
221
- supporting files were stale). Also re-run
222
- `pmx-canvas copilot install-extension --yes` in repos that use the Copilot
223
- adapter so the panel picks up new open-URL behavior.
224
+ supporting files were stale). Review the differences and preserve local edits.
225
+ Only run `pmx-canvas skills sync --yes` after the owner approves replacing the
226
+ affected copies; it replaces all drifted installed copies of `pmx-canvas`,
227
+ `pmx-canvas-testing` and `pmx-canvas-orchestration`. For a clean release-guidance
228
+ check without that approval, use a disposable consumer workspace.
229
+ Updating the Copilot adapter with `pmx-canvas copilot install-extension --yes`
230
+ likewise requires approval to replace its installed files.
224
231
 
225
232
  ## GitHub release
226
233
 
@@ -1,5 +1,9 @@
1
1
  # PMX Canvas agent plugin
2
2
 
3
+ PMX Canvas is a collaborative canvas where you and your AI agent collect evidence, analyze findings,
4
+ and develop ideas together. Pin material as context for your agent, then ask it to add findings,
5
+ comparisons, or diagrams to the board for you to review, present, and build on.
6
+
3
7
  `plugins/pmx-canvas/` is a self-contained [Agent Plugins 1.0](https://agent-plugins.org/)
4
8
  package. It contains only PMX Canvas: the portable MCP server configuration and a native
5
9
  canvas extension for the GitHub Copilot app. It does not include frame integrations,
@@ -97,6 +101,14 @@ Use the exact version from `runtime.json` and the port from the panel's `status`
97
101
  `PMX_CANVAS_PORT` selects a preferred port; `PMX_CANVAS_URL` targets an existing server.
98
102
  An explicit URL that fails ownership checks is reported rather than silently replaced.
99
103
 
104
+ ## Context and steering delivery
105
+
106
+ The Copilot adapter reads AX context and marks steering delivery with the same `copilot`
107
+ consumer identity. Its next context excludes instructions and pickups already delivered to
108
+ Copilot. A different consumer can still see them pending; that is not a failed Copilot receipt.
109
+ The delivery mark records handoff to the host, not proof that the requested action succeeded.
110
+ This is separate from the Amp plugin's explicit context receipt and action acknowledgment.
111
+
100
112
  ## Package maintenance
101
113
 
102
114
  The plugin's adapter copies are generated from `.github/extensions/pmx-canvas/`:
@@ -116,8 +128,10 @@ The portable root contains `plugin.json`, `mcp.json`, `start-mcp.mjs`, `tools.js
116
128
  `runtime.json`, and license notices for the bundled dependencies. Copilot auto-discovers the native adapter at
117
129
  `com.github.copilot/extensions/pmx-canvas/extension.mjs`.
118
130
 
119
- The marketplace preview is copied from `docs/screenshot.png` to `assets/preview.png` on each
120
- plugin build. The manifest's `extensions.com.github.copilot.logo` points to that packaged PNG.
131
+ The plugin logo is copied from `docs/design/plugin-logo.png` to `assets/preview.png` on each
132
+ plugin build. It is a 512 × 512 export of the PMX Focus Field brand mark, not a canvas screenshot.
133
+ The marketplace requires that image path; the manifest's `extensions.com.github.copilot.logo`
134
+ points to it. The editable source and regeneration command are in [the design guide](design.md#plugin-logo).
121
135
 
122
136
  Publishing a repository package does not register it in a curated marketplace or make it
123
137
  Featured in the Copilot app. Those are separate submission and review steps.
@@ -0,0 +1,271 @@
1
+ # Amp plugin, context and steering
2
+
3
+ The Wave 5 Amp plugin opens the workspace Canvas and binds each Amp thread to an existing board.
4
+ Bound MCP calls read and edit that board while the human views another board or Home. Bound
5
+ threads receive context at turn start and addressed steering can wake an idle thread.
6
+ People can set a self-reported cursor name in Canvas. Optional Jev context ranking and on-demand
7
+ format/review advice are off by default, with separate human consent.
8
+
9
+ ## Install locally
10
+
11
+ Requires Bun >=1.4.4 and Amp with directory-plugin skills. The tested baseline is
12
+ `0.0.1793119929-g574f34` (2026-10-27). Source: `plugins/amp/`; build: `bun run build:plugin`.
13
+ The npm package includes the generated directory at `dist/amp-plugin/pmx-canvas`.
14
+
15
+ Copy that complete directory to your project's `.amp/plugins/pmx-canvas`. For an installed
16
+ package, copy from `node_modules/pmx-canvas/dist/amp-plugin/pmx-canvas`. Do not overwrite an
17
+ existing plugin or locally edited skills: inspect the differences and approve replacement first.
18
+ Reload Amp plugins. Nothing is installed in a personal or workspace-global plugin repository.
19
+
20
+ Amp registers `pmx-canvas:pmx-canvas`, `pmx-canvas:pmx-canvas-testing` and
21
+ `pmx-canvas:pmx-canvas-orchestration`. They are generated copies of the existing PMX skills,
22
+ not separate authoring sources. The main skill bundles MCP and gates its tools until loaded.
23
+ Approve the workspace MCP command through Amp's normal trust flow. A Portal alone does not
24
+ prove native MCP discovery. `canvas_connect_workspace` accepts only this executor's directory.
25
+
26
+ ## Commands and session tool
27
+
28
+ | Command | Effect |
29
+ |---|---|
30
+ | PMX Canvas: Open | Start/reconnect, verify workspace, version and bundle stamp, then open the Amp Portal. |
31
+ | PMX Canvas: Bind | Choose an existing board for this thread, without opening or editing it. |
32
+ | PMX Canvas: Status | Read service identity, binding, whether its board exists, and the shared active board. Does not start a service. |
33
+ | PMX Canvas: Unbind | Remove only this thread's binding. Works while the server is down. |
34
+ | PMX Canvas: Resolve pending steering | Inspect uncertain sends, then explicitly retry or dismiss with human confirmation. |
35
+ | PMX Canvas: Context ranking | Enable Jev after human confirmation for this binding, or turn it off. |
36
+ | PMX Canvas: Jev advice | Separately enable on-demand format/review advice after human confirmation, or turn it off. |
37
+
38
+ Agents use `pmx_canvas_session` with `action: "open" | "bind" | "status" | "unbind"`.
39
+ Bind requires an explicit `boardId`. Invocation thread identity comes from Amp, never model input.
40
+
41
+ Each binding stores workspace, thread, board and stable consumer ID `amp:<thread-id>` in
42
+ `.pmx-canvas/amp-bindings/<thread-id>.json`. Keep this runtime directory out of Git. Separate files
43
+ prevent one thread's update from overwriting another's. Bindings survive plugin reload and
44
+ service restart. Missing boards are reported, never silently rebound. Board navigation and
45
+ moving cards do not change a binding. Unbind is idempotent.
46
+ Each binding also has an incarnation ID. Repeating Bind to the same board keeps it; unbinding
47
+ and binding again invalidates old receipts, even for the same board. Installations created
48
+ before this delivery increment must Unbind, then Bind again.
49
+
50
+ **Bindings route PMX MCP tool calls.** The plugin supplies `targetBoardId` and the authenticated
51
+ `amp:<thread-id>` identity before invocation. Conflicting destinations and nested overrides fail;
52
+ missing/deleted boards never fall back to the visible board. Batches, delayed operations, approval
53
+ waits, undo history and file watchers retain their board ownership across human navigation.
54
+ An active turn retains the binding it started with or first used. If that binding changes or
55
+ disappears, subsequent Canvas calls fail until a new turn starts, including after plugin reload.
56
+
57
+ Open still displays the shared workbench. There is no private per-thread browser. Bound calls
58
+ cannot navigate the shared workbench, restore the workspace backup, or control/capture its shared
59
+ WebView. Board deletion remains an unscoped human library action. Tour/camera commands affect
60
+ only their target board; they reach the browser only when
61
+ that board is visible. CLI calls and MCP resource reads are **not** intercepted by the plugin;
62
+ use routed MCP query tools for bound-board context.
63
+
64
+ A binding is routing, not an access-control or privacy boundary. Board-owned metadata updates
65
+ must name the bound board. Catalog reads, board creation, board pins, workspace settings and
66
+ knowledge categories keep their workspace scope and existing permission checks. AX timeline,
67
+ evidence and addressed steering/delivery are workspace-wide; a steering wait can wake on a message
68
+ sent from another board, while its `pendingActivity` contains only the bound board's work/gates.
69
+ Cross-board relation targets remain explicit.
70
+
71
+ ## Automatic delivery
72
+
73
+ At `agent.start`, the plugin prepares a context map with a 12,000-character JSON budget.
74
+ Preparation records no reads and advances no cursor. The agent returns the supplied token to
75
+ `pmx_canvas_delivery { action: "receive", token }` to confirm reception. This records the
76
+ delivered map and complete links, never full card-content reads. Omitted or clipped changes
77
+ remain beyond the saved cursor. Pull a card with the existing MCP tools to read its full content.
78
+ The plugin keeps its own per-thread, per-board cursor, separate from other readers' cursors.
79
+
80
+ While the plugin executor is awake, it checks persisted bindings every five seconds for steering
81
+ addressed exactly to `amp:<thread-id>`. Broadcasts and messages for other consumers are excluded
82
+ before the queue limit. It appends the instruction through Amp's native thread API: an idle
83
+ thread starts a turn; a busy thread receives queued steering, which Amp can inject into the
84
+ current turn after a tool returns without another `agent.start`. This does not wake a sleeping
85
+ orb, hold a keep-alive lease, or create a scheduler. Scanning resumes when the plugin runs again.
86
+ The pump scans successive pages of 50 messages so unacknowledged instructions cannot hide later
87
+ ones. Instructions over 32,000 characters are not clipped or sent: they appear as `blocked-size`
88
+ in Resolve pending steering, where a human can dismiss them and send a shorter instruction.
89
+
90
+ The agent first receives the steering token, then acts and verifies the result, then calls
91
+ `pmx_canvas_delivery { action: "acknowledge", token }`. Host acceptance, reception and action
92
+ acknowledgment are separate states. An action that failed or was not verified must not be
93
+ acknowledged as successful. The plugin cannot itself certify the agent's work.
94
+
95
+ Each thread has a SQLite transport journal beside its binding. A send is reserved durably before
96
+ calling Amp, preventing duplicate pumps from sending the same instruction. An interrupted or
97
+ timed-out send remains **uncertain**, not automatically retried. Reconciliation checks the last
98
+ 200 transcript messages for the exact user-message payload; finding it confirms acceptance,
99
+ not action completion. Absence does not prove non-delivery. Status exposes pending tokens and
100
+ polling errors; Resolve pending steering requires human confirmation because retrying an
101
+ uncertain send can duplicate an instruction. Dismiss closes delivery without claiming success.
102
+ Journals retain packet identities across reloads; do not delete them to retry a message.
103
+ Receipt identities also survive Canvas's 5,000-row diagnostic retention. A retry whose original
104
+ read has expired is refused rather than counted again; start a new turn for fresh context.
105
+ Stop cancels receipt and acknowledgment requests before a pending discovery can initiate a write.
106
+
107
+ Queued steering with an obsolete binding or completed packet is cancelled at turn start.
108
+ Finish or dismiss pending steering before binding to another board. Unbind stops delivery;
109
+ the human can still dismiss a pending packet after unbinding or deleting its board.
110
+ No exactly-once action-execution guarantee is made.
111
+
112
+ ## Runtime boundaries
113
+
114
+ The plugin reuses exact-version PMX runtime discovery and refuses a foreign workspace. Startup
115
+ prefers the project's installed matching-version package, then the pinned registry runtime if
116
+ the package is absent. An installed version mismatch fails instead of downloading another copy.
117
+ In an orb it probes the actual ports returned by `amp orb services ensure`, including custom
118
+ ports. If those services do not include Canvas, it creates a supervised Canvas service. The
119
+ connection hint in `.pmx-canvas/amp-server.json` is revalidated against workspace health on reuse.
120
+ It never holds an orb keep-alive lease. Outside an orb it uses the existing local PMX daemon
121
+ launcher. `PMX_CANVAS_URL` is an explicit target, not a fallback. An unavailable explicit target
122
+ fails rather than starting a second server. Version mismatch or a missing/unknown bundle stamp
123
+ also fails, including at MCP connection and subsequent requests.
124
+
125
+ **Release limitation:** the published `0.11.0` runtime lacks the required bundle stamp. This
126
+ foundation is verified with the locally packed package, not registry-only startup. A compatible
127
+ release is required before recommending the registry fallback. No publication is part of this
128
+ increment.
129
+
130
+ Amp supplies the Portal URL and access controls. Open does not change sharing or multiplayer.
131
+
132
+ ## Optional context relevance
133
+
134
+ **Context ranking** is off by default. Its human-only confirmation explains that your current
135
+ prompt and optional summaries go to TypeSafe Jev through Amp, using the invoking thread's
136
+ inference billing. Consent applies to the current thread/board binding, survives reload,
137
+ and does not carry to a new binding. Repeating the command disables it. Session Status reports
138
+ `contextRanking: "off" | "jev"`. Enabling cannot opt an already-started preparation into inference.
139
+ Existing prepared packets remain byte-identical on retries. An interrupted ranking attempt is
140
+ durably claimed: another delivery instance or a reload falls back without submitting it again.
141
+
142
+ Context ranking only reorders optional summaries already admitted by the context compiler:
143
+ `near`, `linked` and `folder`. Explicit pins, pinned boards, human instructions, changes,
144
+ title-only discovery entries and lifecycle-qualified pins are not candidates. No new sources
145
+ are fetched. No content is removed, no omission is hidden, and no cursor or receipt is advanced
146
+ by ranking. Existing workspace/binding boundaries still apply; relevance is not authorization.
147
+ The compiler's omitted content cannot be recovered by this ranker. This changes order, not
148
+ content membership or full-content read accounting. It does not reduce the compiled brief's
149
+ size. The ranking report adds delivery metadata, and ranking makes a separate billed inference
150
+ request; no recall, token-saving or cost-saving claim is made.
151
+
152
+ Each fresh preparation uses at most one batch of 20 questions. Inputs are bounded to 2,000
153
+ UTF-16 units of the current prompt, 160 per title and 600 per summary; serialized decision
154
+ state cannot exceed 24,000 units. Later candidates keep their original positions. Scores use
155
+ three levels: unrelated, background, directly useful. Sort descending with stable ties; no
156
+ confidence threshold is treated as proof. The delivery includes the model version, ranked and
157
+ eligible counts, clipping flag, or fallback reason. Missing API, unavailable provider, invalid
158
+ answers, oversized input or a three-second timeout retain deterministic order, with no retry
159
+ or substitute provider. The host API cannot cancel a timed-out inference call; late results
160
+ are ignored and may still be billed. Production enablement is never changed by evaluations.
161
+
162
+ ## On-demand output and review advice
163
+
164
+ `pmx_canvas_advice` operates only on facts the agent supplies. **Jev advice** requires its own
165
+ human confirmation per binding; enabling Context ranking does not enable advice. Status reports
166
+ `jevAdvice: "off" | "jev"`. Consent survives reload, but rebinding disables it. The confirmation
167
+ discloses the supplied text, TypeSafe provider and invoking thread's inference billing.
168
+
169
+ Every request requires `requestId` (1–100 characters), `task` (1–2,000), and `action`:
170
+
171
+ - `representation`: requires `summary` (up to 12,000 characters); optional `explicitFormat`
172
+ (1–80) preserves the user's exact choice without inference, even when advice is off or the
173
+ format is unsupported. Otherwise Jev suggests Markdown, Mermaid, graph, json-render, HTML,
174
+ image or diff. The deterministic fallback is Markdown.
175
+ - `review`: requires 1–20 `changes`, each with a unique `id` (1–160), `title` (up to 160)
176
+ and `summary` (up to 600). Scores order changes by review urgency with stable ties. Every ID
177
+ is retained; the fallback preserves input order. A single change needs no inference.
178
+
179
+ Lengths are UTF-16 units. Serialized decision state is limited to 24,000 units, with one
180
+ three-second inference attempt per logical request. Invalid results, missing providers and
181
+ timeouts return an explicit fallback, never another provider or automatic retry. Reuse the
182
+ same `requestId` and identical input to retry, including across plugin reloads. Reusing an ID
183
+ with different input fails. An interrupted or concurrent retry freezes the durable fallback
184
+ rather than risking another billed call. Completed responses are immutable. Turning advice
185
+ off affects new requests; a retry can still return its previously completed result.
186
+
187
+ Advice creates no output, fetches no source, records no read and verifies no work. The main
188
+ agent must create and verify the actual result. A review priority is not a correctness or
189
+ security verdict. Responses report `mode` (`explicit`, `jev`, or `fallback`), the selected
190
+ format or ordered IDs, and the actual model or fallback reason.
191
+
192
+ ### Reproduce the native decision evaluation
193
+
194
+ In a source checkout, temporarily register `scripts/eval-amp-context.ts` through a root plugin
195
+ file in `.amp/plugins/` that re-exports its default export. Load that file with Amp's plugin
196
+ loader and call its `evaluate_canvas_context` tool. Remove the temporary plugin and reload
197
+ afterward. This development harness is not bundled into the production plugin.
198
+
199
+ The harness sends four fixed fictional pairs in both candidate orders, never workspace data.
200
+ Expected ordering is authored in `tests/fixtures/context-relevance.ts`, independently of model
201
+ scores. It compares against the unchanged compiler order, checks unchanged contents and pins,
202
+ and writes model version, input size and elapsed time to `.amp/in/artifacts/jev-context-*.json`.
203
+ It includes semantic relevance and misleading source instructions. A passing small diagnostic
204
+ set is not evidence of general task improvement or prompt-injection immunity. The decision
205
+ API exposes no billed cost, so the report does not invent one.
206
+
207
+ The same harness exposes `evaluate_canvas_advice`: four fictional representation cases and
208
+ two review pairs in both orders, with expectations in `tests/fixtures/jev-advice.ts`. It compares
209
+ against Markdown and unchanged review order, checks unchanged inputs, and saves
210
+ `.amp/in/artifacts/jev-advice-*.json`. Neither evaluator changes production consent. These
211
+ diagnostics do not establish rendered output quality or replace native human opt-in acceptance.
212
+
213
+ ## Collaboration and names
214
+
215
+ Use Amp's existing thread access, multiplayer and Portal controls to share. Canvas adds no
216
+ account, guest token or permission picker. Amp's [Portal access documentation](https://ampcode.com/docs/orbs/portals#access-and-lifecycle)
217
+ describes the current controls and workspace restrictions. The installed CLI also exposes
218
+ `amp orb portal access`; its presence is not evidence of an external guest completing the flow.
219
+ Sharing a Portal exposes its port, including other boards and APIs available there, not just
220
+ the current board URL. Only share a workspace whose contents are appropriate for the audience.
221
+ Public Portal access does not grant access to the Amp thread or its review tools.
222
+
223
+ Open **Your name** at the end of the Canvas top bar. Enter up to 40 characters and choose
224
+ **Save name**. Other participants see the name on your cursor. Cancel, Escape or blank input
225
+ keeps the existing name. The name is saved in this browser when storage is available and
226
+ survives reload and reconnect. Renaming does not change the visitor's tab ID; two people may
227
+ choose the same name without merging their presence. A name is self-reported, not verified
228
+ identity, attribution to an Amp account, or an access grant. Naming makes no access-control
229
+ request and does not change thread or Portal sharing.
230
+
231
+ This control is available in the HTTP workbench, including an Amp Portal, not an MCP-hosted
232
+ workbench or an agent-view tab. An initial `?name=` still works; saving a name removes that
233
+ parameter so a reload cannot overwrite the saved choice.
234
+
235
+ **Acceptance boundary:** two browsers inside the owning orb can verify Canvas collaboration,
236
+ but Amp routes those Portal requests directly to the service without external authentication.
237
+ That does not verify an outside guest's sign-in, public access, or revocation. Test those
238
+ separately with fictional data and the owner's approved sharing scope.
239
+
240
+ ## Verification
241
+
242
+ `bun test tests/unit/amp-plugin.test.ts` checks bindings and workspace safety through the
243
+ registered session tool. `bun run typecheck` checks against the pinned published Amp types.
244
+ `tests/unit/amp-delivery.test.ts` checks receipt accounting, clipped context, wrong recipients,
245
+ competing pumps, interrupted sends/receipts and restart against real Canvas HTTP and SQLite.
246
+ `tests/unit/boards-api.test.ts` checks concurrent HTTP routing, restart persistence, nested
247
+ identity, waits and refusal paths. `tests/e2e/boards.pw.ts` checks visible-board isolation,
248
+ reconnect and opening the populated target board. These do not substitute for native hooks.
249
+ After `bun run build:plugin`, verify a fresh copied package with `amp plugins list` and
250
+ `amp skill info pmx-canvas:pmx-canvas`, then reload the actual host and test discovery and
251
+ `pmx_canvas_session`. Test native MCP trust separately from an SDK handshake.
252
+
253
+ Native acceptance includes open, bind, reload, status, unbind, a foreign-workspace refusal,
254
+ two independent thread bindings, persisted boards after service restart, and a rendered Portal.
255
+ Actual orb pause/resume and a second live Amp thread must be reported separately from simulated
256
+ thread contexts or process restarts. Do not call the entire Wave 5 integration verified from
257
+ these foundation checks.
258
+ Delivery acceptance also requires an actually idle thread to wake from addressed Canvas steering,
259
+ receive its context, edit the bound board, show the rendered result and acknowledge only afterward.
260
+
261
+ Native acceptance on Amp `0.0.1793405518-gc59f01` verified idle wake, busy delivery into the
262
+ current turn, bound MCP routing through `code_exec`, rendered edits before acknowledgment,
263
+ receipt retries, reload and end-of-turn journal cleanup. Wrong-recipient steering stayed pending.
264
+ Obsolete queued-packet cancellation and sleeping-orb resume were not exercised; startup
265
+ cancellation guards have unit coverage, not native cancellation acceptance.
266
+
267
+ Independent-orb Jev diagnostics on `jev-1.14.0` passed 8/8 context cases against 4/8 unchanged
268
+ order, and two advice runs each passed 8/8 against a 3/8 deterministic baseline. These are small
269
+ fictional diagnostics, not general quality, latency or cost benchmarks. Native disabled advice,
270
+ explicit format, receipt idempotency and reload were exercised. Human-confirmed enablement,
271
+ enabled next-turn ranking and native advice revocation/rebinding remain acceptance checks.
package/docs/cli.md CHANGED
@@ -333,6 +333,24 @@ pmx-canvas batch --file ./canvas-ops.json
333
333
  See [HTTP API → batch](http-api.md#batch-operations) for the operation
334
334
  schema; the same JSON works for the CLI batch file.
335
335
 
336
+ Authored [work cards](node-types.md#work-cards) use structured `data` through batch:
337
+
338
+ ```bash
339
+ pmx-canvas batch --json '[{"op":"node.add","args":{"type":"status","title":"Verify","data":{"workState":"todo","detail":"Run browser checks"}}}]'
340
+ pmx-canvas batch --json '[{"op":"node.update","args":{"id":"<card-id>","data":{"workState":"done","progress":null}}}]'
341
+ ```
342
+
343
+ The ordinary `node add --data` flag is for graph series, not general node data.
344
+
345
+ Present an existing task read-only on its active board:
346
+
347
+ ```bash
348
+ pmx-canvas batch --json '[{"op":"node.add","args":{"type":"status","data":{"workItemId":"<task-id>"}}}]'
349
+ ```
350
+
351
+ Do not send title, detail, work state or progress; these follow the task. Removing the card
352
+ does not cancel work. Update the task through `ax work update`, not a card patch.
353
+
336
354
  ## Web artifacts
337
355
 
338
356
  ```bash
@@ -405,6 +423,8 @@ pmx-canvas board pin <board-id> --reason "Q4 rests on it" # join the agent's wor
405
423
  pmx-canvas board unpin <board-id>
406
424
  pmx-canvas board from <source-id> "Follow-up" --preview
407
425
  pmx-canvas board from <source-id> "Follow-up" --nodes id1,id2 --readme --structure
426
+ pmx-canvas board move-selection <source-id> "Follow-up" --nodes id1,id2 --revision 42 --request move-123 --preview
427
+ pmx-canvas board move-selection <source-id> "Follow-up" --nodes id1,id2 --revision 42 --request move-123
408
428
  ```
409
429
 
410
430
  Commands write to the board open in the workbench. `board open` switches the
@@ -418,6 +438,15 @@ cards are retained automatically. `--readme` carries the designated README. The
418
438
  does not inherit pins, AX state, or mutation history. Its `previousBoardId`
419
439
  records the source board.
420
440
 
441
+ `board move-selection` moves the original cards instead. Read `board get <source-id>`
442
+ for `contentRevision`, pass it as `--revision`, and preview first. Group selections
443
+ include descendants. Keep `--request` and all other inputs unchanged when retrying an
444
+ interrupted commit; a recorded success returns the same destination after restart.
445
+ The operation leaves a portal but does not open the destination. It preserves pins,
446
+ relations and review/read history, and refuses the whole selection if bindings cannot
447
+ move safely. Pre-move Undo/Redo clears; old snapshots remain inspectable but cannot
448
+ restore across the move. See the [move contract](http-api.md#move-original-cards-to-a-new-board).
449
+
421
450
  ## Connected memory
422
451
 
423
452
  ```bash
@@ -643,9 +672,19 @@ reports annotation targets and bounds; it does not describe whether the human
643
672
  drew an arrow, line, circle, or other shape. Inspect `.annotation-layer path` or
644
673
  take a screenshot when the drawn form matters.
645
674
 
646
- Humans draw with the rail's Annotate popover (pen / text) and remove marks with its eraser.
647
- If an agent already knows the annotation ID from context, it can remove it through
648
- MCP with `canvas_view { action: "remove-annotation", id }`.
675
+ Humans and agents share pen, text and whole-mark erasing. CLI agents use the
676
+ existing batch command:
677
+
678
+ ```bash
679
+ pmx-canvas batch --json '[{"op":"annotation.add","args":{"id":"question-b","type":"text","points":[{"x":160,"y":320}],"text":"Use option B?"}}]'
680
+ pmx-canvas batch --json '[{"op":"annotation.remove","args":{"id":"question-b"}}]'
681
+ ```
682
+
683
+ For freehand ink, omit `type` and supply at least two points in canvas world
684
+ coordinates. [Annotation defaults and retry rules](http-api.md#annotations) are
685
+ shared across transports. Layout/context reads include text notes as well as mark
686
+ IDs and bounds. The human can answer in the external agent host's composer;
687
+ neither Sessions nor PMX's composer is required.
649
688
 
650
689
  ## When to reach for the CLI
651
690
 
@@ -0,0 +1,50 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Guest name: existing presence, self-reported names</title>
6
+ <script src="./support.js"></script>
7
+ </head>
8
+ <body>
9
+ <x-dc>
10
+ <helmet><style>
11
+ body { margin:0; background:#081524; }
12
+ .states { display:flex; gap:24px; padding:24px; font:13px/1.4 'IBM Plex Sans',sans-serif; }
13
+ .state { width:600px; height:600px; background:var(--bg); color:var(--text); }
14
+ .dark { --bg:#081524; --panel:#0b192b; --soft:#0f1d31; --line:#1b2c44; --text:#e6eef7; --muted:#8ea3bd; --accent:#4BBCFF; }
15
+ .light { --bg:#f7f8fa; --panel:#ffffff; --soft:#eff2f6; --line:#d5dce5; --text:#172b44; --muted:#536a83; --accent:#1A7ABF; }
16
+ .bar { height:44px; display:flex; align-items:center; gap:8px; padding:0 14px; background:var(--soft); border-bottom:1px solid var(--line); }
17
+ .board { flex:1; } .context { color:var(--muted); font-size:12px; }
18
+ .initial { width:28px; height:28px; border:1px solid var(--line); border-radius:50%; background:var(--soft); color:var(--text); font:600 12px 'IBM Plex Sans',sans-serif; }
19
+ .dialog { box-sizing:border-box; width:440px; margin:90px auto 0; padding:14px; background:var(--panel); border:1px solid var(--line); border-radius:12px; display:flex; flex-direction:column; gap:10px; box-shadow:0 18px 60px #0003; }
20
+ .title { font-weight:600; } .description { color:var(--muted); font-size:12px; }
21
+ input { box-sizing:border-box; width:100%; padding:8px 10px; border:1px solid var(--accent); border-radius:8px; background:var(--bg); color:var(--text); font:13px/1.4 'IBM Plex Mono',monospace; }
22
+ .actions { display:flex; justify-content:flex-end; gap:8px; }
23
+ .actions button { min-height:36px; padding:8px 14px; border:1px solid var(--line); border-radius:7px; background:var(--soft); color:var(--text); font:600 12px 'IBM Plex Sans',sans-serif; }
24
+ .actions .save { background:var(--accent); border-color:var(--accent); color:var(--bg); }
25
+ .cursor { margin:55px 0 0 60px; color:var(--muted); } .cursor span { background:var(--soft); padding:3px 6px; border:1px solid var(--line); border-radius:4px; font-size:11px; }
26
+ .note { padding:20px; color:var(--muted); font-size:12px; }
27
+ </style></helmet>
28
+ <div class="states">
29
+ <section class="state dark">
30
+ <div class="bar"><span class="board">Field notes ▾</span><span class="context">Nothing in context</span><span>⋯</span><button class="initial" aria-label="Your name: guest-4a8c">G</button></div>
31
+ <div class="dialog" role="dialog" aria-label="Your name on this canvas">
32
+ <div class="title">Your name on this canvas</div>
33
+ <div class="description">Shown on your cursor. Self-reported, not a verified identity or an access grant. Saved in this browser.</div>
34
+ <input aria-label="Your name on this canvas" placeholder="e.g. Alex" maxlength="40" value="Alex">
35
+ <div class="actions"><button>Cancel</button><button class="save">Save name</button></div>
36
+ </div>
37
+ <div class="note">Optional entry. Escape or Cancel keeps the current name. Up to 40 characters. No sharing or permission controls.</div>
38
+ </section>
39
+ <section class="state light">
40
+ <div class="bar"><span class="board">Field notes ▾</span><span class="context">Nothing in context</span><span>⋯</span><button class="initial" aria-label="Your name: Sam">S</button></div>
41
+ <div class="cursor">➤ <span>Alex</span></div>
42
+ <div class="note">The other browser sees Alex on the existing cursor tag. A rename keeps the same visitor ID; equal names never combine visitors. The 28px button stays at the end of the bar at 600, 1024 and 1920px.</div>
43
+ </section>
44
+ </div>
45
+ </x-dc>
46
+ <script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":1272,"height":648}}'>
47
+ class Component extends DCLogic { renderVals() { return {}; } }
48
+ </script>
49
+ </body>
50
+ </html>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 64 64">
2
+ <rect width="64" height="64" rx="14" fill="#081524"/>
3
+ <rect x="8" y="8" width="48" height="48" rx="7" fill="none" stroke="#4BBCFF" stroke-width="2.2" opacity="0.35"/>
4
+ <rect x="16" y="16" width="32" height="32" rx="5" fill="none" stroke="#4BBCFF" stroke-width="2.2" opacity="0.6"/>
5
+ <rect x="24" y="24" width="16" height="16" rx="3" fill="none" stroke="#4BBCFF" stroke-width="2.2"/>
6
+ <rect x="29" y="29" width="6" height="6" rx="1" fill="#4BBCFF"/>
7
+ </svg>
@@ -0,0 +1,39 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head><meta charset="utf-8"><title>Work cards · in-card editing</title><script src="./support.js"></script></head>
4
+ <body><x-dc><helmet>
5
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap">
6
+ <style>
7
+ body{margin:0}.work-design{box-sizing:border-box;width:1440px;min-height:980px;padding:48px;background:#081524;color:#e6eef7;font:13px/1.6 'IBM Plex Sans',sans-serif}.work-design h1{font-size:28px;margin:0}.work-design p{color:#8ea3bd}.work-design .examples{display:flex;gap:40px;align-items:flex-start;margin:32px 0}.work-design .card{box-sizing:border-box;width:360px;background:#0f1d31;border:1px solid #1b2c44;border-radius:10px;box-shadow:0 1px 2px #0006;padding:16px}.work-design h2{font-size:15px;margin:0 0 16px}.work-design .state{font-weight:600}.work-design .detail{white-space:pre-wrap}.work-design label{display:flex;flex-direction:column;gap:4px;margin:12px 0}.work-design input,.work-design select,.work-design textarea,.work-design button{box-sizing:border-box;font:inherit;color:inherit;background:#081524;border:1px solid #1b2c44;border-radius:6px;padding:8px}.work-design textarea{min-height:80px}.work-design footer{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}.work-design .primary{background:#4BBCFF;color:#081524}.work-design .states{display:flex;gap:24px}.work-design .blocked{color:#f4c542}.work-design .done{color:#2fd07f}.work-design small{color:#8ea3bd}.work-design .error{color:#f4c542}
8
+ </style></helmet>
9
+ <main class="work-design">
10
+ <h1>Work cards · edit inside the card</h1>
11
+ <p>Option A selected 2026-10-27. Ordinary status nodes with an explicitly authored work state. No session or execution controls.</p>
12
+ <div class="examples">
13
+ <section><h2>Read</h2><article class="card"><h2>3. Verify</h2><div class="state">◐ In progress</div><p class="detail">Run the browser checks.</p><small>60% complete</small><footer><button>Edit</button></footer></article></section>
14
+ <section><h2>Edit / create</h2><article class="card"><h2>3. Verify</h2><form><label>Title<input value="3. Verify"></label><label>Work state<select><option>In progress</option><option>To do</option><option>Blocked</option><option>Done</option><option>Cancelled</option></select></label><label>Detail<textarea>Run the browser checks.</textarea></label><label>Progress (%) · optional<input type="number" min="0" max="100" value="60"></label><footer><button type="button">Cancel</button><button type="button" class="primary">Save</button></footer></form></article></section>
15
+ <section><h2>Refused save</h2><article class="card"><h2>Draft stays editable</h2><p class="error">Could not save. Your draft is still here. Check the connection or whether the card changed.</p><p>Save is disabled while a request is pending. A stale content revision is refused, never silently overwritten.</p></article></section>
16
+ </div>
17
+ <div class="states"><span>○ To do</span><span>◐ In progress</span><span class="blocked">⧗ Blocked</span><span class="done">✓ Done</span><span>× Cancelled</span></div>
18
+ <p>New work card in the canvas menu creates a status node in To do. Edit opens this form. The card grows locally while editing; saved geometry stays unchanged. Cancel discards the draft. Escape cancels inside the form. Saving changes authored data only, never creates a session or task.</p>
19
+ <p>Work state is independent of progress. Done does not invent a percentage. Progress can be cleared. Agent activity remains violet and context remains blue; an authored In progress state is neutral.</p>
20
+ <p>At 600 px, the same card and form fit the canvas. Focus view uses the same controls. Existing phase/tool status indicators keep their non-work behavior.</p>
21
+ <h2>Read-only live cards · selected 2026-10-27</h2>
22
+ <p>In the session task row, Show on board creates a separate live presentation. Once present, the action reads Show card and focuses it. No conversion of ordinary planning cards.</p>
23
+ <div class="examples">
24
+ <section><h2>Session task row</h2><article class="card"><h2>Verify the change</h2><p>Run the browser checks.</p><div class="state">◐ In progress</div><footer><button>Show on board</button></footer></article></section>
25
+ <section><h2>Live presentation</h2><article class="card"><h2>Verify the change</h2><small>↗ Live task · reviewer · Read-only</small><div class="state">◐ In progress</div><p>Run the browser checks.</p></article></section>
26
+ <section><h2>Missing reference</h2><article class="card"><h2>Task unavailable</h2><div class="blocked">⚠ Task unavailable</div><p>The linked task is no longer on this board.</p><small>Read-only · removing this card does not cancel work.</small></article></section>
27
+ </div>
28
+ <p>Live title, detail, state and attribution follow the task record. No Edit, progress percentage or approval controls. Ending a session keeps the task and its presentation; deleting a presentation never cancels the task. Focus mode uses the same read-only content.</p>
29
+ <h2>Move to new board · Wave 5</h2>
30
+ <p>Selection bar: Move to new board (icon + hover hint at narrow widths). Group menu: Move to new board. Use the existing text-prompt modal shell, 540 px maximum width, 16 px viewport margin, 14 px padding, 8 px gaps, 17 px heading. At 600 px the same 540 px dialog scrolls inside the viewport; at 1920 px it stays centered and bounded. Keep the canvas behind it.</p>
31
+ <div class="examples">
32
+ <section><h2>Name</h2><article class="card" style="width:400px"><h2>Move to new board</h2><p>Move the original cards, including group contents. Leave a portal on this board.</p><label>New board name<input value="Follow-up"></label><footer><button>Cancel</button><button class="primary">Preview move</button></footer></article></section>
33
+ <section><h2>Review</h2><article class="card" style="width:400px"><h2>Move to new board</h2><label>New board name<input value="Follow-up" readonly></label><p>4 cards · 2 pinned · 3 affected boards</p><p>README moves with the cards. Live tasks keep their original owner. Content, relations and review history are preserved; moving does not validate or read content.</p><p class="error">⚠ History boundary: pre-move Undo/Redo is cleared on affected boards. Older snapshots remain inspectable, but cannot be restored across the move.</p><p>Board-space annotations stay here. The new board opens after the move.</p><footer><button>Cancel</button><button class="primary">Move and open</button></footer></article></section>
34
+ <section><h2>Blocked / uncertain reply</h2><article class="card" style="width:400px"><h2>Move to new board</h2><p class="error">⚠ Cannot move this selection</p><p>live-chart: finish the active stream before moving this card.</p><p>No cards moved. Close, resolve the listed bindings and preview again.</p><footer><button>Close</button></footer><hr><p>If the reply is interrupted, keep the original request and show Retry move. Never silently create a second board. A board switch or closing the dialog cancels the delayed navigation, not a committed move.</p></article></section>
35
+ </div>
36
+ <p>Before moving, save or cancel local card drafts. Capture the board and selection when opening. Preview is read-only; commit rechecks current state. No copy checkbox or reverse move. Escape closes the dialog; pending requests do not steal later navigation. Buttons use the existing palette accent; warnings use amber with a glyph and words.</p>
37
+ </main></x-dc>
38
+ <script type="text/x-dc" data-dc-script data-props='{"$preview":{"width":1440,"height":2400}}'>class Component extends DCLogic { renderVals() { return {}; } }</script>
39
+ </body></html>
@@ -2,6 +2,20 @@
2
2
  "v": 3,
3
3
  "attachments": {},
4
4
  "boards": {
5
+ "GuestName.dc.html": {
6
+ "h": 648,
7
+ "title": "Guest name entry and existing presence",
8
+ "w": 1272,
9
+ "x": 9120,
10
+ "y": 5960
11
+ },
12
+ "WorkCards.dc.html": {
13
+ "h": 2400,
14
+ "title": "Work cards — in-card editing (selected 2026-10-27)",
15
+ "w": 1440,
16
+ "x": 7600,
17
+ "y": 5960
18
+ },
5
19
  "AgentContext.dc.html": {
6
20
  "h": 1500,
7
21
  "title": "What the agent did with context",
@@ -377,6 +391,8 @@
377
391
  "Relations.dc.html",
378
392
  "Flows.dc.html",
379
393
  "Uses.dc.html",
394
+ "WorkCards.dc.html",
395
+ "GuestName.dc.html",
380
396
  "Vision.dc.html",
381
397
  "AgentContext.dc.html",
382
398
  "Themes.dc.html",
Binary file