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.
- package/.github/extensions/pmx-canvas/extension.mjs +4 -1
- package/.github/extensions/pmx-canvas/runtime.json +1 -1
- package/.github/extensions/pmx-canvas/tools.json +440 -18
- package/CHANGELOG.md +51 -0
- package/dist/amp-plugin/pmx-canvas/LICENSE +21 -0
- package/dist/amp-plugin/pmx-canvas/THIRD_PARTY_LICENSES.txt +331 -0
- package/dist/amp-plugin/pmx-canvas/index.js +5445 -0
- package/dist/amp-plugin/pmx-canvas/runtime.json +3 -0
- package/dist/amp-plugin/pmx-canvas/shared-runtime.mjs +194 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/SKILL.md +267 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/evals.json +1168 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/jwt.ts +17 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/login.ts +12 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/middleware.ts +13 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/routes/auth.ts +13 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/investigation-board/src/handlers/users.ts +27 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/mcp.json +36 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/ax-html-control-surface.md +101 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/codex-app-adapter.md +151 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/excalidraw-diagram-authoring.md +150 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/full-reference.md +1839 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/github-copilot-app-adapter.md +223 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/html-primitives.md +139 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/importing-context.md +132 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/installing-pmx-canvas.md +301 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/tours-and-recording.md +117 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/workbench-workflows.md +908 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas-orchestration/SKILL.md +141 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas-testing/SKILL.md +266 -0
- package/dist/amp-plugin/pmx-canvas/start-mcp.mjs +14857 -0
- package/dist/amp-plugin/pmx-canvas/tools.json +10963 -0
- package/dist/canvas/chunks/{abnfDiagram-N423BO3Z-p8dtp6va.js → abnfDiagram-N423BO3Z-cwtsds5d.js} +1 -1
- package/dist/canvas/chunks/architecture-TIHT7OUA-x63cwejs.js +1 -0
- package/dist/canvas/chunks/{architectureDiagram-T3A2C74G-5jhmxrzf.js → architectureDiagram-T3A2C74G-b4xc9tpz.js} +3 -3
- package/dist/canvas/chunks/{blockDiagram-VBNYF7ZC-pw1fa9yb.js → blockDiagram-VBNYF7ZC-ahp3yxxs.js} +7 -7
- package/dist/canvas/chunks/{c4Diagram-5PPSVZJV-x07nq0tt.js → c4Diagram-5PPSVZJV-nappnay7.js} +4 -4
- package/dist/canvas/chunks/classDiagram-JCYQIIEL-k1j2xc1t.js +1 -0
- package/dist/canvas/chunks/classDiagram-v2-OCEON4UE-33x08xf2.js +1 -0
- package/dist/canvas/chunks/{cose-bilkent-JH36ORCC-nm39npq0.js → cose-bilkent-JH36ORCC-a428syda.js} +1 -1
- package/dist/canvas/chunks/cynefin-VYW2F7L2-8v6jxfz8.js +1 -0
- package/dist/canvas/chunks/{cynefinDiagram-MW4NZA55-vdxrwahz.js → cynefinDiagram-MW4NZA55-nspsqebj.js} +1 -1
- package/dist/canvas/chunks/{dagre-VZM6K2ZE-bqdm7wpd.js → dagre-VZM6K2ZE-8y6177fh.js} +2 -2
- package/dist/canvas/chunks/{diagram-7IWD3JNH-gs5gpr93.js → diagram-7IWD3JNH-vym028wn.js} +4 -4
- package/dist/canvas/chunks/{diagram-B4RE2ZJO-cgwjg47s.js → diagram-B4RE2ZJO-jddqb8sy.js} +1 -1
- package/dist/canvas/chunks/{diagram-LBJQPF4R-w3vahpav.js → diagram-LBJQPF4R-bjwbpkrn.js} +1 -1
- package/dist/canvas/chunks/{diagram-Q27KOJAE-42837z6h.js → diagram-Q27KOJAE-j6ph6hcx.js} +2 -2
- package/dist/canvas/chunks/{diagram-UB23O5K3-4fz83q59.js → diagram-UB23O5K3-p09w8jej.js} +1 -1
- package/dist/canvas/chunks/{ebnfDiagram-BXEA7PRR-zphtgegj.js → ebnfDiagram-BXEA7PRR-j975ycq5.js} +1 -1
- package/dist/canvas/chunks/{erDiagram-JOGREHBK-zvbbdxp4.js → erDiagram-JOGREHBK-sxp6hjn8.js} +5 -5
- package/dist/canvas/chunks/eventmodeling-45OFAUF4-xzfgn6xg.js +1 -0
- package/dist/canvas/chunks/flowDiagram-UKHOOZJN-2nsmkskb.js +1 -0
- package/dist/canvas/chunks/{ganttDiagram-PKOTCBZU-282jzycm.js → ganttDiagram-PKOTCBZU-4tv230y2.js} +2 -2
- package/dist/canvas/chunks/gitGraph-TEB2WS4Q-macbhand.js +1 -0
- package/dist/canvas/chunks/{gitGraphDiagram-DS77QQ5N-vqqy6p1b.js → gitGraphDiagram-DS77QQ5N-mqgmnw9g.js} +1 -1
- package/dist/canvas/chunks/{index-wgv7en21.js → index-037z5dz2.js} +2 -2
- package/dist/canvas/chunks/{index-w2mra17t.js → index-081n3har.js} +1 -1
- package/dist/canvas/chunks/{index-353m7b0p.js → index-5n03dmb9.js} +1 -1
- package/dist/canvas/chunks/{index-yw8h9vha.js → index-60pgzdqe.js} +1 -1
- package/dist/canvas/chunks/index-8g1vb57n.js +2 -0
- package/dist/canvas/chunks/{index-vv56h019.js → index-8rjes9r6.js} +1 -1
- package/dist/canvas/chunks/{index-nprm96xp.js → index-9022d1n9.js} +1 -1
- package/dist/canvas/chunks/{index-194m3hc3.js → index-9b02042t.js} +1 -1
- package/dist/canvas/chunks/{index-0rk4gp1g.js → index-ap4q4vez.js} +1 -1
- package/dist/canvas/chunks/{index-rh7nv68n.js → index-dyp2nhd3.js} +1 -1
- package/dist/canvas/chunks/index-frvta4tm.js +2 -0
- package/dist/canvas/chunks/{index-s4j678gj.js → index-h9ycj8n2.js} +1 -1
- package/dist/canvas/chunks/{index-fjtdggjn.js → index-mergmj97.js} +2 -2
- package/dist/canvas/chunks/index-nwsya6dj.js +301 -0
- package/dist/canvas/chunks/{index-3cy1bzwh.js → index-nz8qbd1p.js} +1 -1
- package/dist/canvas/chunks/{index-d3b3gqe9.js → index-qhfrazv3.js} +1 -1
- package/dist/canvas/chunks/{index-6qmsnxwy.js → index-v119nznk.js} +4 -4
- package/dist/canvas/chunks/{index-r2fyc9w1.js → index-vpt37m3d.js} +6 -6
- package/dist/canvas/chunks/{index-qj8fxwsf.js → index-y9ma6azy.js} +1 -1
- package/dist/canvas/chunks/{index-tb1wf525.js → index-zx0j3a2z.js} +26 -26
- package/dist/canvas/chunks/info-DKCQHKI2-a0ykzs9z.js +1 -0
- package/dist/canvas/chunks/{infoDiagram-6WML65LV-v1yvggqj.js → infoDiagram-6WML65LV-qv97qq6a.js} +2 -2
- package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-p9306gh0.js +70 -0
- package/dist/canvas/chunks/{journeyDiagram-NVQOT4AX-zjcffveh.js → journeyDiagram-NVQOT4AX-sv67zats.js} +5 -5
- package/dist/canvas/chunks/{kanban-definition-27J2QSJJ-dakqtfp1.js → kanban-definition-27J2QSJJ-k2pfam6p.js} +1 -1
- package/dist/canvas/chunks/{mermaid.core-j2geswrd.js → mermaid.core-83r0fdce.js} +4 -4
- package/dist/canvas/chunks/{mindmap-definition-FAOFIHXS-142xhr3k.js → mindmap-definition-FAOFIHXS-vg2newm1.js} +1 -1
- package/dist/canvas/chunks/packet-7NZHBO7P-tqnabcdv.js +1 -0
- package/dist/canvas/chunks/{pegDiagram-VL7TDLO6-5wvk7vsd.js → pegDiagram-VL7TDLO6-k2h7zc5n.js} +1 -1
- package/dist/canvas/chunks/pie-RZYD4A2V-wke6gyhe.js +1 -0
- package/dist/canvas/chunks/{pieDiagram-7S7Q4E2Y-ztdhwycc.js → pieDiagram-7S7Q4E2Y-hg169p1v.js} +2 -2
- package/dist/canvas/chunks/{quadrantDiagram-CIZ2JOQS-c5p9gmg6.js → quadrantDiagram-CIZ2JOQS-bxtvsq0b.js} +5 -5
- package/dist/canvas/chunks/radar-I7S5WNFK-w7ka0drw.js +1 -0
- package/dist/canvas/chunks/railroad-3IZDKUUU-y3vg318x.js +1 -0
- package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-6hqvcz3c.js +1 -0
- package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-vcae260m.js +1 -0
- package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-0dbyme23.js +1 -0
- package/dist/canvas/chunks/{railroadDiagram-AXF67PYL-xkmqkjwf.js → railroadDiagram-AXF67PYL-njyhcp4p.js} +1 -1
- package/dist/canvas/chunks/{requirementDiagram-LRYGKXZP-9wm2dyaw.js → requirementDiagram-LRYGKXZP-2z6v09gm.js} +4 -4
- package/dist/canvas/chunks/{sankeyDiagram-W5VNT64P-2w19etgb.js → sankeyDiagram-W5VNT64P-15mzam0e.js} +1 -1
- package/dist/canvas/chunks/{sequenceDiagram-SI44F4Z6-0jn0vwmz.js → sequenceDiagram-SI44F4Z6-rbshyd2c.js} +12 -12
- package/dist/canvas/chunks/{sizeCapture-X5ZJPWSS-x75epwdq.js → sizeCapture-X5ZJPWSS-sg26xwts.js} +1 -1
- package/dist/canvas/chunks/{stateDiagram-OKZ733FA-schjpy6d.js → stateDiagram-OKZ733FA-6eahp98e.js} +1 -1
- package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-tty0ggn5.js +1 -0
- package/dist/canvas/chunks/{swimlanes-SLNWSIFB-gkw4xce3.js → swimlanes-SLNWSIFB-ze5db10t.js} +1 -1
- package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-thze75gq.js +8 -0
- package/dist/canvas/chunks/{timeline-definition-Z64GVDOM-x7nkcy01.js → timeline-definition-Z64GVDOM-vnp7jyy8.js} +3 -3
- package/dist/canvas/chunks/treeView-QDETBFTQ-6ysffnm6.js +1 -0
- package/dist/canvas/chunks/treemap-6X3UGDF4-m3h9p066.js +1 -0
- package/dist/canvas/chunks/vennDiagram-T6HMQDX7-0qrnb7mj.js +34 -0
- package/dist/canvas/chunks/wardley-OPB4EBWU-dp37drwx.js +1 -0
- package/dist/canvas/chunks/{wardleyDiagram-T6FBY63Y-t1j52t9r.js → wardleyDiagram-T6FBY63Y-8nxg8wqt.js} +4 -4
- package/dist/canvas/chunks/{xychartDiagram-ELKLHX3M-38t16pme.js → xychartDiagram-ELKLHX3M-nj921e7s.js} +5 -5
- package/dist/canvas/global.css +94 -1
- package/dist/canvas/index.js +154 -145
- package/dist/canvas/mcp-app.html +600 -498
- package/dist/json-render/index.css +1 -1
- package/dist/types/client/canvas/BoardMoveDialog.d.ts +2 -0
- package/dist/types/client/canvas/EdgeEditor.d.ts +19 -0
- package/dist/types/client/canvas/GroupNavigation.d.ts +2 -0
- package/dist/types/client/canvas/TextPrompt.d.ts +4 -0
- package/dist/types/client/nodes/PromptNode.d.ts +1 -0
- package/dist/types/client/nodes/ViewerFrame.d.ts +1 -1
- package/dist/types/client/nodes/WorkCard.d.ts +7 -0
- package/dist/types/client/nodes/use-ax-surface-bridge.d.ts +1 -0
- package/dist/types/client/state/canvas-store.d.ts +15 -0
- package/dist/types/client/state/human-store.d.ts +2 -0
- package/dist/types/client/state/intent-bridge.d.ts +4 -2
- package/dist/types/client/state/relation-store.d.ts +11 -0
- package/dist/types/client/types.d.ts +1 -1
- package/dist/types/json-render/catalog.d.ts +2 -2
- package/dist/types/server/agent-presence.d.ts +1 -0
- package/dist/types/server/ax-interaction.d.ts +1 -0
- package/dist/types/server/ax-state-manager.d.ts +10 -2
- package/dist/types/server/board-local.d.ts +4 -0
- package/dist/types/server/board-move.d.ts +38 -0
- package/dist/types/server/canvas-db.d.ts +12 -2
- package/dist/types/server/canvas-operations.d.ts +5 -6
- package/dist/types/server/canvas-provenance.d.ts +1 -1
- package/dist/types/server/canvas-serialization.d.ts +1 -0
- package/dist/types/server/canvas-state.d.ts +84 -20
- package/dist/types/server/card-relocation.d.ts +6 -0
- package/dist/types/server/context-reads.d.ts +3 -1
- package/dist/types/server/human-presence.d.ts +1 -1
- package/dist/types/server/index.d.ts +16 -5
- package/dist/types/server/intent-registry.d.ts +8 -4
- package/dist/types/server/knowledge-lifecycle.d.ts +4 -2
- package/dist/types/server/mutation-history.d.ts +7 -5
- package/dist/types/server/operations/registry.d.ts +2 -0
- package/dist/types/server/trace-manager.d.ts +1 -0
- package/dist/types/shared/ax-kinds.d.ts +6 -0
- package/dist/types/shared/ax-surface-protocol.d.ts +8 -0
- package/dist/types/shared/human-presence.d.ts +1 -0
- package/dist/types/shared/lifecycle-status.d.ts +2 -0
- package/docs/RELEASE.md +21 -14
- package/docs/agent-plugin.md +22 -2
- package/docs/amp-plugin.md +270 -0
- package/docs/cli.md +42 -3
- package/docs/design/GuestName.dc.html +50 -0
- package/docs/design/PluginLogo.svg +7 -0
- package/docs/design/WorkCards.dc.html +39 -0
- package/docs/design/canvas.json +16 -0
- package/docs/design/plugin-logo.png +0 -0
- package/docs/design.md +111 -8
- package/docs/evals/agents-md-sections.md +38 -0
- package/docs/http-api.md +128 -10
- package/docs/mcp.md +61 -9
- package/docs/node-types.md +71 -1
- package/docs/plans/plan-009-tech-debt-backlog.md +1 -1
- package/docs/plans/plan-019-post-0.9-roadmap.md +44 -20
- package/docs/plans/plan-020-wave-5-work-planning.md +553 -0
- package/docs/product-vision-2026-09.md +33 -17
- package/docs/sdk.md +18 -0
- package/package.json +6 -3
- package/plugins/pmx-canvas/assets/preview.png +0 -0
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/extension.mjs +4 -1
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/plugin.json +2 -2
- package/plugins/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/tools.json +440 -18
- package/skills/data-analysis/SKILL.md +13 -26
- package/skills/frontend-design/LICENSE.txt +177 -0
- package/skills/frontend-design/SKILL.md +3 -0
- package/skills/pmx-canvas/SKILL.md +248 -842
- package/skills/pmx-canvas/evals/evals.json +110 -5
- package/skills/pmx-canvas/references/full-reference.md +142 -28
- package/skills/pmx-canvas/references/html-primitives.md +7 -0
- package/skills/pmx-canvas/references/installing-pmx-canvas.md +61 -11
- package/skills/pmx-canvas/references/tours-and-recording.md +39 -6
- package/skills/pmx-canvas/references/workbench-workflows.md +908 -0
- package/skills/pmx-canvas-testing/SKILL.md +7 -5
- package/skills/published-consumer-e2e/SKILL.md +25 -8
- package/skills/published-consumer-e2e/scripts/run-published-consumer-e2e.sh +51 -75
- package/skills/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/web-artifacts-builder/SKILL.md +6 -0
- package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +2 -2
- package/skills/web-artifacts-builder/scripts/init-artifact.sh +8 -8
- package/src/cli/commands/apps.ts +1 -0
- package/src/cli/commands/boards.ts +30 -0
- package/src/client/App.tsx +20 -4
- package/src/client/canvas/AttentionHistory.tsx +10 -2
- package/src/client/canvas/BoardMoveDialog.tsx +225 -0
- package/src/client/canvas/CanvasNode.tsx +45 -2
- package/src/client/canvas/CanvasViewport.tsx +38 -9
- package/src/client/canvas/ContextMenu.tsx +34 -12
- package/src/client/canvas/EdgeEditor.tsx +149 -0
- package/src/client/canvas/EdgeLayer.tsx +87 -16
- package/src/client/canvas/ExpandedNodeOverlay.tsx +4 -0
- package/src/client/canvas/GroupNavigation.tsx +85 -0
- package/src/client/canvas/RelationsPanel.tsx +9 -0
- package/src/client/canvas/SelectionBar.tsx +21 -0
- package/src/client/canvas/SessionPanel.tsx +35 -1
- package/src/client/canvas/TextPrompt.tsx +18 -1
- package/src/client/canvas/TopBar.tsx +30 -0
- package/src/client/canvas/canvas-area.ts +1 -1
- package/src/client/nodes/ExtAppFrame.tsx +26 -10
- package/src/client/nodes/MarkdownNode.tsx +6 -7
- package/src/client/nodes/PromptNode.tsx +32 -3
- package/src/client/nodes/StatusNode.tsx +12 -0
- package/src/client/nodes/StatusSummary.tsx +11 -0
- package/src/client/nodes/ViewerFrame.tsx +21 -10
- package/src/client/nodes/WorkCard.tsx +175 -0
- package/src/client/nodes/use-ax-surface-bridge.ts +18 -14
- package/src/client/state/attention-bridge.ts +5 -0
- package/src/client/state/attention-store.ts +1 -0
- package/src/client/state/canvas-store.ts +185 -15
- package/src/client/state/human-store.ts +22 -2
- package/src/client/state/intent-bridge.ts +19 -5
- package/src/client/state/relation-store.ts +127 -1
- package/src/client/theme/global.css +94 -1
- package/src/client/types.ts +1 -0
- package/src/mcp/server.ts +13 -3
- package/src/server/agent-presence.ts +43 -23
- package/src/server/ax-flow-loop.ts +6 -0
- package/src/server/ax-gate-ttl.ts +8 -1
- package/src/server/ax-interaction.ts +16 -10
- package/src/server/ax-state-manager.ts +17 -4
- package/src/server/ax-wait.ts +20 -6
- package/src/server/board-export.ts +19 -6
- package/src/server/board-local.ts +20 -0
- package/src/server/board-move.ts +297 -0
- package/src/server/canvas-db.ts +262 -160
- package/src/server/canvas-operations.ts +139 -109
- package/src/server/canvas-schema.ts +21 -0
- package/src/server/canvas-serialization.ts +2 -0
- package/src/server/canvas-state.ts +792 -159
- package/src/server/card-relocation.ts +53 -0
- package/src/server/code-graph.ts +4 -3
- package/src/server/context-reads.ts +83 -55
- package/src/server/demo-state.json +35 -15
- package/src/server/file-watcher.ts +30 -10
- package/src/server/human-presence.ts +18 -5
- package/src/server/index.ts +35 -15
- package/src/server/intent-registry.ts +43 -5
- package/src/server/knowledge-lifecycle.ts +32 -9
- package/src/server/lifecycle-status.ts +29 -1
- package/src/server/mcp-app-runtime.ts +26 -7
- package/src/server/mutation-history.ts +37 -8
- package/src/server/operations/composites.ts +6 -3
- package/src/server/operations/mcp-contracts.ts +15 -0
- package/src/server/operations/mcp.ts +36 -9
- package/src/server/operations/ops/annotation.ts +22 -1
- package/src/server/operations/ops/ax-await.ts +1 -0
- package/src/server/operations/ops/ax-timeline.ts +28 -2
- package/src/server/operations/ops/batch.ts +25 -11
- package/src/server/operations/ops/boards.ts +44 -3
- package/src/server/operations/ops/nodes.ts +70 -0
- package/src/server/operations/ops/query.ts +32 -3
- package/src/server/operations/ops/snapshots.ts +1 -0
- package/src/server/operations/registry.ts +49 -4
- package/src/server/server.ts +62 -16
- package/src/server/tour-control.ts +37 -12
- package/src/server/trace-manager.ts +4 -0
- package/src/server/web-artifacts/scripts/bundle-artifact.sh +2 -2
- package/src/server/web-artifacts/scripts/init-artifact.sh +8 -8
- package/src/shared/agent-context.ts +7 -1
- package/src/shared/auto-arrange.ts +5 -4
- package/src/shared/ax-kinds.ts +13 -0
- package/src/shared/ax-surface-protocol.ts +22 -0
- package/src/shared/human-presence.ts +1 -0
- package/src/shared/lifecycle-status.ts +2 -0
- package/dist/canvas/chunks/architecture-TIHT7OUA-9tffvpsv.js +0 -1
- package/dist/canvas/chunks/classDiagram-JCYQIIEL-nc6g5x1r.js +0 -1
- package/dist/canvas/chunks/classDiagram-v2-OCEON4UE-0qnbpwvh.js +0 -1
- package/dist/canvas/chunks/cynefin-VYW2F7L2-ys8p46ts.js +0 -1
- package/dist/canvas/chunks/eventmodeling-45OFAUF4-v9q6dn4c.js +0 -1
- package/dist/canvas/chunks/flowDiagram-UKHOOZJN-yrr5z8tc.js +0 -1
- package/dist/canvas/chunks/gitGraph-TEB2WS4Q-kdwb8m0a.js +0 -1
- package/dist/canvas/chunks/index-1r72hdzb.js +0 -301
- package/dist/canvas/chunks/index-g3pwnqeb.js +0 -2
- package/dist/canvas/chunks/index-rft2hcz5.js +0 -2
- package/dist/canvas/chunks/info-DKCQHKI2-wpzs6sz3.js +0 -1
- package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-5hnq1a9p.js +0 -70
- package/dist/canvas/chunks/packet-7NZHBO7P-xn439f0s.js +0 -1
- package/dist/canvas/chunks/pie-RZYD4A2V-0kf16rwh.js +0 -1
- package/dist/canvas/chunks/radar-I7S5WNFK-0g2pz36t.js +0 -1
- package/dist/canvas/chunks/railroad-3IZDKUUU-fcaran6j.js +0 -1
- package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-wgdya41q.js +0 -1
- package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-gy07a4ka.js +0 -1
- package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-ewk6wtkh.js +0 -1
- package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-k8sfp2e7.js +0 -1
- package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-nqysw67j.js +0 -8
- package/dist/canvas/chunks/treeView-QDETBFTQ-cesw6gp0.js +0 -1
- package/dist/canvas/chunks/treemap-6X3UGDF4-zdv4knp9.js +0 -1
- package/dist/canvas/chunks/vennDiagram-T6HMQDX7-x8dqn9yf.js +0 -34
- 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('&', '&'), '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
|
+
}
|