pmx-canvas 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/extensions/pmx-canvas/extension.mjs +3 -1
- package/.github/extensions/pmx-canvas/runtime.json +1 -1
- package/.github/extensions/pmx-canvas/tools.json +688 -128
- package/CHANGELOG.md +69 -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 +251 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/evals.json +1086 -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 +1785 -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 +251 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/tours-and-recording.md +111 -0
- package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/workbench-workflows.md +900 -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-cwtsds5d.js +1 -0
- package/dist/canvas/chunks/architecture-TIHT7OUA-x63cwejs.js +1 -0
- package/dist/canvas/chunks/architectureDiagram-T3A2C74G-b4xc9tpz.js +36 -0
- package/dist/canvas/chunks/blockDiagram-VBNYF7ZC-ahp3yxxs.js +132 -0
- package/dist/canvas/chunks/c4Diagram-5PPSVZJV-nappnay7.js +10 -0
- 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-a428syda.js +1 -0
- package/dist/canvas/chunks/cynefin-VYW2F7L2-8v6jxfz8.js +1 -0
- package/dist/canvas/chunks/cynefinDiagram-MW4NZA55-nspsqebj.js +62 -0
- package/dist/canvas/chunks/dagre-VZM6K2ZE-8y6177fh.js +4 -0
- package/dist/canvas/chunks/diagram-7IWD3JNH-vym028wn.js +30 -0
- package/dist/canvas/chunks/diagram-B4RE2ZJO-jddqb8sy.js +3 -0
- package/dist/canvas/chunks/diagram-LBJQPF4R-bjwbpkrn.js +24 -0
- package/dist/canvas/chunks/diagram-Q27KOJAE-j6ph6hcx.js +24 -0
- package/dist/canvas/chunks/diagram-UB23O5K3-p09w8jej.js +41 -0
- package/dist/canvas/chunks/ebnfDiagram-BXEA7PRR-j975ycq5.js +1 -0
- package/dist/canvas/chunks/erDiagram-JOGREHBK-sxp6hjn8.js +85 -0
- 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-4tv230y2.js +292 -0
- package/dist/canvas/chunks/gitGraph-TEB2WS4Q-macbhand.js +1 -0
- package/dist/canvas/chunks/gitGraphDiagram-DS77QQ5N-mqgmnw9g.js +106 -0
- package/dist/canvas/chunks/index-037z5dz2.js +232 -0
- package/dist/canvas/chunks/index-081n3har.js +207 -0
- package/dist/canvas/chunks/index-5n03dmb9.js +2 -0
- package/dist/canvas/chunks/index-5tv8v1hk.js +1 -0
- package/dist/canvas/chunks/index-60pgzdqe.js +157 -0
- package/dist/canvas/chunks/index-6ceya556.js +332 -0
- package/dist/canvas/chunks/index-8g1vb57n.js +2 -0
- package/dist/canvas/chunks/index-8rjes9r6.js +2 -0
- package/dist/canvas/chunks/index-9022d1n9.js +16 -0
- package/dist/canvas/chunks/index-9b02042t.js +2 -0
- package/dist/canvas/chunks/index-ap4q4vez.js +2 -0
- package/dist/canvas/chunks/index-dyp2nhd3.js +2 -0
- package/dist/canvas/chunks/index-frvta4tm.js +2 -0
- package/dist/canvas/chunks/index-gf4e0et4.js +2 -0
- package/dist/canvas/chunks/index-h9ycj8n2.js +2 -0
- package/dist/canvas/chunks/index-hj99nz1f.js +1 -0
- package/dist/canvas/chunks/index-mergmj97.js +2 -0
- package/dist/canvas/chunks/index-nwsya6dj.js +301 -0
- package/dist/canvas/chunks/index-nz8qbd1p.js +2 -0
- package/dist/canvas/chunks/index-qhfrazv3.js +2 -0
- package/dist/canvas/chunks/index-v119nznk.js +4 -0
- package/dist/canvas/chunks/index-vpt37m3d.js +89 -0
- package/dist/canvas/chunks/index-y9ma6azy.js +2 -0
- package/dist/canvas/chunks/index-zx0j3a2z.js +179 -0
- package/dist/canvas/chunks/info-DKCQHKI2-a0ykzs9z.js +1 -0
- package/dist/canvas/chunks/infoDiagram-6WML65LV-qv97qq6a.js +2 -0
- package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-p9306gh0.js +70 -0
- package/dist/canvas/chunks/journeyDiagram-NVQOT4AX-sv67zats.js +139 -0
- package/dist/canvas/chunks/kanban-definition-27J2QSJJ-k2pfam6p.js +89 -0
- package/dist/canvas/chunks/katex-dmg8k4zm.js +257 -0
- package/dist/canvas/chunks/mermaid.core-83r0fdce.js +12 -0
- package/dist/canvas/chunks/mindmap-definition-FAOFIHXS-vg2newm1.js +96 -0
- package/dist/canvas/chunks/packet-7NZHBO7P-tqnabcdv.js +1 -0
- package/dist/canvas/chunks/pegDiagram-VL7TDLO6-k2h7zc5n.js +1 -0
- package/dist/canvas/chunks/pie-RZYD4A2V-wke6gyhe.js +1 -0
- package/dist/canvas/chunks/pieDiagram-7S7Q4E2Y-hg169p1v.js +39 -0
- package/dist/canvas/chunks/quadrantDiagram-CIZ2JOQS-bxtvsq0b.js +7 -0
- 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-njyhcp4p.js +1 -0
- package/dist/canvas/chunks/requirementDiagram-LRYGKXZP-2z6v09gm.js +84 -0
- package/dist/canvas/chunks/sankeyDiagram-W5VNT64P-15mzam0e.js +40 -0
- package/dist/canvas/chunks/sequenceDiagram-SI44F4Z6-rbshyd2c.js +162 -0
- package/dist/canvas/chunks/sizeCapture-X5ZJPWSS-sg26xwts.js +1 -0
- package/dist/canvas/chunks/stateDiagram-OKZ733FA-6eahp98e.js +1 -0
- package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-tty0ggn5.js +1 -0
- package/dist/canvas/chunks/swimlanes-SLNWSIFB-ze5db10t.js +1 -0
- package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-thze75gq.js +8 -0
- package/dist/canvas/chunks/timeline-definition-Z64GVDOM-vnp7jyy8.js +120 -0
- 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-8nxg8wqt.js +78 -0
- package/dist/canvas/chunks/xychartDiagram-ELKLHX3M-nj921e7s.js +7 -0
- package/dist/canvas/global.css +483 -230
- package/dist/canvas/index.js +158 -219
- package/dist/canvas/mcp-app.html +4301 -548
- package/dist/canvas/mermaid-entry.js +338 -338
- package/dist/canvas/surface-theme.css +6 -6
- package/dist/json-render/index.css +1 -1
- package/dist/json-render/index.js +49 -49
- package/dist/types/client/canvas/BarHint.d.ts +5 -3
- package/dist/types/client/canvas/BoardMoveDialog.d.ts +2 -0
- package/dist/types/client/canvas/CanvasNode.d.ts +0 -11
- package/dist/types/client/canvas/EdgeEditor.d.ts +19 -0
- package/dist/types/client/canvas/EdgeLayer.d.ts +1 -2
- package/dist/types/client/canvas/GroupNavigation.d.ts +2 -0
- package/dist/types/client/canvas/TextPrompt.d.ts +4 -0
- package/dist/types/client/canvas/auto-fit.d.ts +4 -5
- package/dist/types/client/mermaid-entry.d.ts +1 -2
- package/dist/types/client/mermaid-render.d.ts +1 -0
- package/dist/types/client/nodes/BoardNode.d.ts +1 -1
- package/dist/types/client/nodes/ExtAppFrame.d.ts +7 -90
- package/dist/types/client/nodes/McpAppNode.d.ts +1 -25
- package/dist/types/client/nodes/MermaidNode.d.ts +1 -8
- package/dist/types/client/nodes/PromptNode.d.ts +1 -0
- package/dist/types/client/nodes/ViewerFrame.d.ts +29 -0
- package/dist/types/client/nodes/ViewerHost.d.ts +6 -0
- package/dist/types/client/nodes/WorkCard.d.ts +7 -0
- package/dist/types/client/nodes/iframe-document-url.d.ts +3 -9
- package/dist/types/client/nodes/primitive-copy.d.ts +5 -0
- package/dist/types/client/nodes/use-ax-surface-bridge.d.ts +1 -0
- package/dist/types/client/nodes/use-iframe-content-height.d.ts +1 -1
- package/dist/types/client/nodes/use-surface-frame.d.ts +4 -6
- package/dist/types/client/nodes/viewer-runtime-state.d.ts +2 -1
- package/dist/types/client/state/canvas-store.d.ts +18 -1
- package/dist/types/client/state/human-store.d.ts +2 -0
- package/dist/types/client/state/intent-bridge.d.ts +5 -2
- package/dist/types/client/state/presentation.d.ts +17 -6
- 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/json-render/server.d.ts +2 -1
- 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 +86 -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 +26 -10
- 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/ops/boards.d.ts +0 -1
- package/dist/types/server/operations/registry.d.ts +2 -0
- package/dist/types/server/tour-control.d.ts +13 -3
- 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 -9
- package/dist/types/shared/human-presence.d.ts +1 -0
- package/dist/types/shared/lifecycle-status.d.ts +2 -0
- package/dist/types/shared/tour.d.ts +8 -0
- package/docs/RELEASE.md +21 -14
- package/docs/agent-plugin.md +16 -2
- package/docs/amp-plugin.md +271 -0
- package/docs/cli.md +42 -3
- package/docs/design/Chrome.dc.html +32 -6
- package/docs/design/GuestName.dc.html +50 -0
- package/docs/design/PluginLogo.svg +7 -0
- package/docs/design/Types1.dc.html +3 -2
- package/docs/design/Types2.dc.html +1 -1
- package/docs/design/Types3.dc.html +1 -1
- package/docs/design/WorkCards.dc.html +39 -0
- package/docs/design/Zoom.dc.html +37 -60
- package/docs/design/canvas.json +17 -1
- package/docs/design/plugin-logo.png +0 -0
- package/docs/design.md +280 -12
- package/docs/evals/agents-md-sections.md +38 -0
- package/docs/http-api.md +179 -11
- package/docs/mcp.md +69 -9
- package/docs/node-types.md +109 -4
- package/docs/plans/plan-009-tech-debt-backlog.md +3 -3
- package/docs/plans/plan-019-post-0.9-roadmap.md +327 -31
- package/docs/plans/plan-020-wave-5-work-planning.md +553 -0
- package/docs/product-vision-2026-09.md +42 -17
- package/docs/sdk.md +18 -0
- package/package.json +7 -4
- package/plugins/pmx-canvas/assets/preview.png +0 -0
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/extension.mjs +3 -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 +688 -128
- 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 +232 -849
- package/skills/pmx-canvas/evals/evals.json +26 -3
- package/skills/pmx-canvas/references/full-reference.md +89 -24
- package/skills/pmx-canvas/references/html-primitives.md +7 -0
- package/skills/pmx-canvas/references/installing-pmx-canvas.md +6 -6
- package/skills/pmx-canvas/references/tours-and-recording.md +29 -2
- package/skills/pmx-canvas/references/workbench-workflows.md +900 -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 -77
- package/skills/web-artifacts-builder/LICENSE.txt +202 -0
- package/skills/web-artifacts-builder/SKILL.md +6 -0
- package/skills/web-artifacts-builder/scripts/init-artifact.sh +2 -2
- 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/BarHint.tsx +6 -3
- package/src/client/canvas/BoardMoveDialog.tsx +225 -0
- package/src/client/canvas/CanvasNode.tsx +79 -49
- package/src/client/canvas/CanvasViewport.tsx +42 -14
- package/src/client/canvas/ContextMenu.tsx +97 -15
- package/src/client/canvas/EdgeEditor.tsx +149 -0
- package/src/client/canvas/EdgeLayer.tsx +441 -174
- package/src/client/canvas/ExpandedNodeOverlay.tsx +5 -2
- package/src/client/canvas/GroupNavigation.tsx +85 -0
- package/src/client/canvas/Presentation.tsx +53 -3
- 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 +54 -9
- package/src/client/canvas/auto-fit.ts +9 -11
- package/src/client/canvas/canvas-area.ts +2 -2
- package/src/client/canvas/use-focus-trap.ts +6 -1
- package/src/client/mermaid-entry.ts +6 -20
- package/src/client/mermaid-render.ts +39 -0
- package/src/client/nodes/AxStepControls.tsx +45 -69
- package/src/client/nodes/BoardNode.tsx +65 -9
- package/src/client/nodes/ContextNode.tsx +88 -396
- package/src/client/nodes/ExtAppFrame.tsx +302 -1465
- package/src/client/nodes/FileNode.tsx +92 -81
- package/src/client/nodes/HtmlNode.tsx +8 -36
- package/src/client/nodes/LedgerNode.tsx +31 -17
- package/src/client/nodes/MarkdownNode.tsx +14 -24
- package/src/client/nodes/McpAppNode.tsx +48 -154
- package/src/client/nodes/MermaidNode.tsx +80 -69
- package/src/client/nodes/PromptNode.tsx +44 -17
- package/src/client/nodes/ResponseNode.tsx +8 -6
- package/src/client/nodes/StatusNode.tsx +34 -7
- package/src/client/nodes/StatusSummary.tsx +16 -3
- package/src/client/nodes/TraceNode.tsx +8 -8
- package/src/client/nodes/ViewerFrame.tsx +273 -0
- package/src/client/nodes/ViewerHost.tsx +41 -0
- package/src/client/nodes/WebpageNode.tsx +22 -24
- package/src/client/nodes/WorkCard.tsx +175 -0
- package/src/client/nodes/iframe-document-url.ts +20 -27
- package/src/client/nodes/primitive-copy.ts +97 -0
- package/src/client/nodes/use-ax-surface-bridge.ts +18 -14
- package/src/client/nodes/use-iframe-content-height.ts +34 -10
- package/src/client/nodes/use-surface-frame.ts +22 -11
- package/src/client/nodes/viewer-runtime-state.ts +41 -35
- 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 +202 -26
- package/src/client/state/human-store.ts +22 -2
- package/src/client/state/intent-bridge.ts +20 -5
- package/src/client/state/presentation.ts +135 -15
- package/src/client/state/relation-store.ts +127 -1
- package/src/client/state/sse-bridge.ts +18 -19
- package/src/client/theme/global.css +483 -230
- package/src/client/theme/surface-theme.css +6 -6
- package/src/client/types.ts +1 -0
- package/src/json-render/charts/tufte-components.tsx +44 -2
- package/src/json-render/renderer/index.css +62 -2
- package/src/json-render/renderer/index.tsx +31 -7
- package/src/json-render/server.ts +3 -2
- 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 +54 -30
- package/src/server/board-local.ts +20 -0
- package/src/server/board-move.ts +297 -0
- package/src/server/canvas-db.ts +249 -158
- package/src/server/canvas-geometry.ts +1 -0
- 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 +797 -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 +140 -114
- package/src/server/file-watcher.ts +30 -10
- package/src/server/html-primitives.ts +3 -9
- package/src/server/html-surface.ts +8 -0
- package/src/server/human-presence.ts +18 -5
- package/src/server/index.ts +54 -24
- 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 +32 -2
- 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 +45 -6
- 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/ops/viewport.ts +11 -9
- package/src/server/operations/registry.ts +49 -4
- package/src/server/server.ts +69 -75
- package/src/server/tour-control.ts +97 -12
- package/src/server/trace-manager.ts +4 -0
- package/src/server/web-artifacts/scripts/init-artifact.sh +2 -2
- 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 +20 -9
- package/src/shared/content-height-reporter.ts +4 -3
- package/src/shared/human-presence.ts +1 -0
- package/src/shared/lifecycle-status.ts +2 -0
- package/src/shared/tour.ts +8 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# Installing PMX Canvas
|
|
2
|
+
|
|
3
|
+
Use this reference when the `pmx-canvas` skill is installed but the `pmx-canvas` command is not available yet.
|
|
4
|
+
|
|
5
|
+
## Prerequisites and version
|
|
6
|
+
|
|
7
|
+
The examples pin **PMX Canvas 0.12.0**, which requires **Bun >=1.4.4** even when
|
|
8
|
+
installed through npm: the CLI runs through Bun, not Node. Check `bun --version`
|
|
9
|
+
first. If missing or older, follow the [Bun installation instructions](https://bun.sh/docs/installation)
|
|
10
|
+
with the user's authorization. Ensure Bun is on the MCP host's PATH as well as the
|
|
11
|
+
interactive shell's; use an absolute `bun`/`bunx` executable path if needed.
|
|
12
|
+
|
|
13
|
+
Bun 1.4.4 fixes the Brotli decoder vulnerability CVE-2026-111497. Updating the
|
|
14
|
+
PMX package does not update Bun; upgrade the runtime and restart existing PMX/MCP
|
|
15
|
+
processes. Development and build tooling should use Node 24.22.1 or a newer patched
|
|
16
|
+
release on a supported Node line.
|
|
17
|
+
|
|
18
|
+
Install/configure only when requested. After an intentional runtime upgrade, sync the
|
|
19
|
+
skill from that installed package and restart existing server/MCP processes as described
|
|
20
|
+
in `SKILL.md`. Do not pair newer checkout guidance with an older runtime unknowingly.
|
|
21
|
+
|
|
22
|
+
## Install from npm
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install -g pmx-canvas@0.12.0
|
|
26
|
+
pmx-canvas --version
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Without a global install, use `bunx pmx-canvas@0.12.0` in place of `pmx-canvas` in
|
|
30
|
+
the commands below. Do not use unpinned `bunx pmx-canvas` for a version-specific check.
|
|
31
|
+
|
|
32
|
+
## Choose the workspace and target
|
|
33
|
+
|
|
34
|
+
Select an existing absolute root and a dedicated free port. These shell examples use
|
|
35
|
+
POSIX syntax; supply equivalent environment variables on other platforms.
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
export PMX_CANVAS_WORKSPACE_ROOT=/absolute/path/to/project
|
|
39
|
+
export PMX_CANVAS_PORT=14313 # Example only: choose a free port for this workspace.
|
|
40
|
+
unset PMX_CANVAS_URL # A stale URL overrides the environment's CLI port target.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Use **both root and port**. Root pinning alone does not align the CLI, MCP, and browser
|
|
44
|
+
if a server falls back to another port. Without an explicit root, MCP may attach to a
|
|
45
|
+
different workspace on the preferred port. `PMX_CANVAS_ALLOW_WORKSPACE_SPLIT=1` opts
|
|
46
|
+
out of that heuristic but is not a substitute for checking the actual target.
|
|
47
|
+
|
|
48
|
+
For server startup, precedence is `--port`, then `PMX_WEB_CANVAS_PORT`, then
|
|
49
|
+
`PMX_CANVAS_PORT` (then `PORT` in Amp orbs), then the default 4313. For CLI queries and
|
|
50
|
+
mutations, explicit `--server-url`/`--port` override environment targeting; otherwise
|
|
51
|
+
`PMX_CANVAS_URL` wins over `PMX_CANVAS_PORT`. URL targeting does not set the bind port.
|
|
52
|
+
|
|
53
|
+
## Start the server
|
|
54
|
+
|
|
55
|
+
On an ordinary local machine:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
pmx-canvas serve --daemon --no-open --port="$PMX_CANVAS_PORT" --wait-ms=20000
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
In a managed environment, use the host's supervised-service mechanism with foreground
|
|
62
|
+
`pmx-canvas serve --no-open --port=<chosen-port>`, passing the selected environment.
|
|
63
|
+
Do not daemonize inside a supervisor or rely on `nohup`, background shell jobs, or tmux
|
|
64
|
+
to survive an orb restart. In an Amp orb, prefer declared services with
|
|
65
|
+
`amp orb services ensure`; otherwise use `amp orb service start` with the foreground
|
|
66
|
+
command. Use the host's authenticated portal/preview for remote viewing, not a raw
|
|
67
|
+
loopback URL. Verify health below before opening the workbench or making writes.
|
|
68
|
+
|
|
69
|
+
CLI query/mutation commands do not auto-start a server; `serve` or `--mcp` does.
|
|
70
|
+
|
|
71
|
+
## From a local checkout (development)
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
git clone https://github.com/pskoett/pmx-canvas.git
|
|
75
|
+
cd pmx-canvas
|
|
76
|
+
bun install
|
|
77
|
+
bun run build
|
|
78
|
+
bun run src/cli/index.ts --version
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
This uses the checked-out source, not necessarily the published package. Follow
|
|
82
|
+
that checkout's `package.json` Bun requirement and bundled skill. Set the same root/port
|
|
83
|
+
environment above; substitute `bun run /absolute/path/to/pmx-canvas/src/cli/index.ts`
|
|
84
|
+
for `pmx-canvas` in startup and verification commands. The target workspace can be
|
|
85
|
+
different from the source checkout. Build the client before browser verification.
|
|
86
|
+
|
|
87
|
+
## MCP Config
|
|
88
|
+
|
|
89
|
+
For agents that support MCP, configure the pinned package as a stdio server. Replace
|
|
90
|
+
the root and port with your selections; ensure the port is dedicated to this workspace.
|
|
91
|
+
The empty URL overrides a stale inherited value (empty is treated as unset). If the host
|
|
92
|
+
discards empty env values, remove `PMX_CANVAS_URL` from its launch environment instead.
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"mcpServers": {
|
|
97
|
+
"canvas": {
|
|
98
|
+
"command": "bunx",
|
|
99
|
+
"args": ["pmx-canvas@0.12.0", "--mcp"],
|
|
100
|
+
"env": {
|
|
101
|
+
"PMX_CANVAS_WORKSPACE_ROOT": "/absolute/path/to/project",
|
|
102
|
+
"PMX_CANVAS_PORT": "14313",
|
|
103
|
+
"PMX_CANVAS_URL": ""
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
If you are using a local checkout instead of the published package, point the command at the CLI entry:
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"mcpServers": {
|
|
115
|
+
"canvas": {
|
|
116
|
+
"command": "bun",
|
|
117
|
+
"args": ["run", "/absolute/path/to/pmx-canvas/src/cli/index.ts", "--mcp"],
|
|
118
|
+
"env": {
|
|
119
|
+
"PMX_CANVAS_WORKSPACE_ROOT": "/absolute/path/to/project",
|
|
120
|
+
"PMX_CANVAS_PORT": "14313",
|
|
121
|
+
"PMX_CANVAS_URL": ""
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Restart the host's MCP process after changing configuration. Inspect startup output for
|
|
129
|
+
fallback ports; do not assume the configured port is the one the MCP server bound.
|
|
130
|
+
|
|
131
|
+
## Amp: connect the agent separately from the portal
|
|
132
|
+
|
|
133
|
+
PMX does not ship a dedicated Amp lifecycle adapter. Amp can use the native MCP tools;
|
|
134
|
+
the portal is only the human's browser UI. Configure MCP inside the orb or runner where
|
|
135
|
+
Amp executes, not only on the user's laptop. Merge this into that workspace's
|
|
136
|
+
`.amp/settings.json`, preserving other settings (Amp does not use the generic `.mcp.json`):
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"amp.mcpServers": {
|
|
141
|
+
"canvas": {
|
|
142
|
+
"command": "bunx",
|
|
143
|
+
"args": ["pmx-canvas@0.12.0", "--mcp"],
|
|
144
|
+
"includeTools": ["canvas_*"],
|
|
145
|
+
"env": {
|
|
146
|
+
"PMX_CANVAS_WORKSPACE_ROOT": "/absolute/path/to/project",
|
|
147
|
+
"PMX_CANVAS_PORT": "14313",
|
|
148
|
+
"PMX_CANVAS_URL": "",
|
|
149
|
+
"PMX_CANVAS_AGENT_SOURCE": "amp"
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Replace root and port with the **existing portal service's actual workspace and local
|
|
157
|
+
listening port**. A supervised service may use an assigned `PORT`, not 4313 or 14313;
|
|
158
|
+
inspect its status/logs and `/health`. Do not put the public portal URL in the stdio
|
|
159
|
+
command or copy another test run's absolute paths. Use an absolute executable path if
|
|
160
|
+
the MCP process cannot find Bun. The `canvas_*` filter exposes the Canvas tool family.
|
|
161
|
+
|
|
162
|
+
### Workspace trust is a human approval
|
|
163
|
+
|
|
164
|
+
Run `amp mcp doctor` from this workspace to distinguish `awaiting approval` from a
|
|
165
|
+
missing executable or connection failure. A new workspace MCP command requires the
|
|
166
|
+
user to review and approve it. Give the user this command to run in that workspace's
|
|
167
|
+
orb Terminal or runner terminal (replace `canvas` if the configured server name differs):
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
amp mcp approve canvas
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
The agent must not run this approval itself or move the command to global settings or
|
|
174
|
+
`--mcp-config` to bypass workspace trust. Approval authorizes execution of this MCP
|
|
175
|
+
command; it is not a new Canvas import consent or permission to mutate arbitrary boards.
|
|
176
|
+
After approval, reload MCP connections (`reload_mcp` in Amp) and require `connected`.
|
|
177
|
+
Discover `canvas` tools with `tool_search`; the full unfiltered 0.12.0 server has 25 tools,
|
|
178
|
+
including `canvas_help`. If still absent, inspect the server status, command/PATH and target instead
|
|
179
|
+
of reinstalling blindly. See [Amp MCP documentation](https://ampcode.com/docs/customize/mcp).
|
|
180
|
+
|
|
181
|
+
### Verify native tools, then steering
|
|
182
|
+
|
|
183
|
+
1. Check `/health` for the expected package version and canonical workspace. Through
|
|
184
|
+
Amp's discovered tools, read `canvas_board { action: "get" }` and
|
|
185
|
+
`canvas_query { action: "context" }`; verify the board matches the visible portal.
|
|
186
|
+
A CLI smoke check or SDK-spawned MCP client does not establish native Amp discovery.
|
|
187
|
+
2. For a requested end-to-end check, use a disposable board. Pin a known card in the
|
|
188
|
+
portal and require a native context read to return that card as pinned. Use one
|
|
189
|
+
stable presence/steering identity (`amp` above, or a unique source per independent
|
|
190
|
+
agent); reuse any adapter-owned session instead of attaching a duplicate.
|
|
191
|
+
3. Send a fresh browser message addressed to that identity. The running agent claims
|
|
192
|
+
it with `canvas_ax_delivery` using the same `consumer`, reads the relevant card,
|
|
193
|
+
signals intent, and performs the requested edit through native Canvas tools.
|
|
194
|
+
4. Verify the visible result in the browser before marking the message delivered for
|
|
195
|
+
that consumer. A subsequent claim should omit it. Detach only test-owned sessions.
|
|
196
|
+
|
|
197
|
+
This proves an **active agent can poll and act**, not automatic wake-up of an idle Amp
|
|
198
|
+
thread, background polling, or automatic agent launch for imports. An MCP connection
|
|
199
|
+
does not install a steering pump. Only configure a pump/host integration when requested;
|
|
200
|
+
its startup backlog rules are in the main skill. Tool discovery and resource reads also
|
|
201
|
+
do not establish Amp support for native MCP Skills-extension discovery or activation.
|
|
202
|
+
|
|
203
|
+
## Verify the actual target before writes
|
|
204
|
+
|
|
205
|
+
For the local target selected above:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
pmx-canvas --version
|
|
209
|
+
curl --fail --silent --show-error "http://localhost:${PMX_CANVAS_PORT}/health"
|
|
210
|
+
pmx-canvas serve status --port="$PMX_CANVAS_PORT"
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Require healthy `ok`, the expected running `version`, and a **`workspace`** matching the
|
|
214
|
+
intended canonical absolute root (resolve symlinks on both paths). Inspect persistence
|
|
215
|
+
health too. `serve status` checks a local port, not an arbitrary `PMX_CANVAS_URL`.
|
|
216
|
+
When deliberately targeting a URL or a fallback port, fetch `/health` there instead,
|
|
217
|
+
then align CLI, MCP, and browser to it. Never print a credential-bearing URL.
|
|
218
|
+
On mismatch, stop: leave the other server alone, choose a free port, and repeat.
|
|
219
|
+
|
|
220
|
+
Only after confirming the target:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
pmx-canvas layout
|
|
224
|
+
pmx-canvas open
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Inside an orb, open the registered portal rather than asking the user to open localhost.
|
|
228
|
+
|
|
229
|
+
## Disposable smoke verification
|
|
230
|
+
|
|
231
|
+
`smoke` creates/searches/removes a temporary node and can leave history/activity records.
|
|
232
|
+
It reports the workspace but does **not** compare it with your intended root. Do not run
|
|
233
|
+
it on a valuable board as an identity check. Use a new disposable workspace and its own
|
|
234
|
+
free port, start it with the appropriate startup method above, and verify `/health` first:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
export PMX_CANVAS_WORKSPACE_ROOT="$(mktemp -d)"
|
|
238
|
+
export PMX_CANVAS_PORT=14314 # Choose another free port.
|
|
239
|
+
unset PMX_CANVAS_URL
|
|
240
|
+
# Start this workspace's server, then verify its actual health workspace/version.
|
|
241
|
+
# Only after that verification succeeds:
|
|
242
|
+
pmx-canvas smoke
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Inspect the JSON report and exit status: health, MCP initialize, node lifecycle, and
|
|
246
|
+
validation should pass; failures exit 1. Version skew is reported in details and is not
|
|
247
|
+
necessarily a failing check. Smoke proves neither `tools/list` discovery nor browser
|
|
248
|
+
rendering: verify those separately when testing the complete onboarding experience.
|
|
249
|
+
Stop only the test server (service-manager stop, or `serve stop --port=<test-port>` for
|
|
250
|
+
your local daemon) before removing its disposable directory. Never clear a user's board
|
|
251
|
+
or stop an unrelated listener to make a smoke test pass.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Tours and recording
|
|
2
|
+
|
|
3
|
+
Tours use the existing board cards as presentation content. Interactive presentation and
|
|
4
|
+
deterministic capture share this one stop model; recording does not create a second deck.
|
|
5
|
+
|
|
6
|
+
## Author a tour
|
|
7
|
+
|
|
8
|
+
Persist a tour with `canvas_view { action: "set-tour", tour: { stops: [...] } }` and read it with
|
|
9
|
+
`canvas_view { action: "get-tour" }`. A stop has exactly one target:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"stops": [
|
|
14
|
+
{ "target": { "nodeId": "overview-group" }, "duration": 1.5, "padding": 60 },
|
|
15
|
+
{ "target": { "nodeId": "detail-note" }, "duration": 2, "easing": "ease-in-out", "pullback": 0.7 },
|
|
16
|
+
{ "target": { "viewport": { "x": 80, "y": 100, "scale": 0.5 } }, "duration": 1 }
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- `nodeId` may identify a card or group. Its persisted position and size determine the camera.
|
|
22
|
+
- `rect` is a world-space box `{ x, y, width, height }` (top-left corner plus size).
|
|
23
|
+
- An explicit viewport is `{ x, y, scale }`, with positive `scale`. Translation is screen-space:
|
|
24
|
+
`screen = world * scale + offset`.
|
|
25
|
+
- `duration` is transition time in seconds (default 1; zero jumps). Valid values are 0–3600.
|
|
26
|
+
- `padding` is screen pixels around a node or rect target (default 40).
|
|
27
|
+
- `easing` is `linear`, `ease-in-out` (default), or `ease-out`.
|
|
28
|
+
- `pullback` is 0–4 (default 0). It zooms out during the move without changing either endpoint.
|
|
29
|
+
- A tour contains at most 1000 stops.
|
|
30
|
+
|
|
31
|
+
Open `/workbench?present=1` for chrome-free viewing. Right, Down, or Space advances; Left or Up
|
|
32
|
+
goes back; Escape or **Exit presentation** exits. Right-drag pans and interrupts an ongoing
|
|
33
|
+
transition without editing cards. Stops do not auto-advance. A missing node target reports an
|
|
34
|
+
error and may be skipped. Camera rendering and free pan are viewer-local, but human Back/Next
|
|
35
|
+
and arrow keys advance the shared cursor for all presenting viewers; Exit leaves presentation
|
|
36
|
+
everywhere. `present: false` does not isolate navigation from another presenting viewer.
|
|
37
|
+
Deterministic capture uses its own viewer and ignores live navigation. Recording hides the exit control.
|
|
38
|
+
|
|
39
|
+
Tours are board-scoped, persist with that board and its snapshots, participate in undo, and clear
|
|
40
|
+
with the board. Setting `tour: null` resets to a derived tour: groups ordered by y, then x, then
|
|
41
|
+
ID. A saved `{ "stops": [] }` intentionally has no stops; it does not enable group derivation.
|
|
42
|
+
Preserve the tour of each board when working across boards and target the intended board before
|
|
43
|
+
setting or reading it.
|
|
44
|
+
|
|
45
|
+
## Drive a tour
|
|
46
|
+
|
|
47
|
+
The server holds one in-memory tour cursor, tied to the board it was started on (a tour on another board replaces it). `canvas_view { action: "tour-go", stop: 0 }`
|
|
48
|
+
starts presenting in open workbenches; `step: "next" | "previous"` moves relative to wherever the
|
|
49
|
+
audience is (a human's arrow keys move the same cursor) and clamps at the ends. Pass
|
|
50
|
+
`present: false` to move only viewers already presenting. `canvas_view { action: "tour-exit" }`
|
|
51
|
+
leaves presentation everywhere. `get-tour` reports `position` (the current stop, or null).
|
|
52
|
+
|
|
53
|
+
`canvas_view { action: "move", nodeId | rect | viewport, duration, easing, padding, pullback }`
|
|
54
|
+
eases the camera without a tour. Outside a presentation the end camera becomes the board
|
|
55
|
+
viewport. Tour steps and moves never enter undo history, never count as agent writes, and are
|
|
56
|
+
allowed under a scope fence. Viewers with reduced motion jump instead of animating; a
|
|
57
|
+
deterministic capture ignores both.
|
|
58
|
+
|
|
59
|
+
If another viewer's camera must stay unchanged, do not send `tour-go`, `tour-exit` or `move`,
|
|
60
|
+
or use the human shared navigation controls. Author stops and capture them in the separate
|
|
61
|
+
recording viewer instead. Verify isolation with another viewer already presenting, not only
|
|
62
|
+
an ordinary canvas tab.
|
|
63
|
+
|
|
64
|
+
### Optional presenter ordering fence
|
|
65
|
+
|
|
66
|
+
`tour-go` and `tour-exit` accept `presenter: { clientId, intent, catalogEpoch, boardGeneration }`.
|
|
67
|
+
Use a distinct `clientId` per document, an increasing positive safe-integer `intent` per gesture,
|
|
68
|
+
and the actual server activation's epoch and nonnegative safe-integer generation. Ordinary
|
|
69
|
+
agent calls may omit this object. It orders requests; it is not authorization or viewer isolation.
|
|
70
|
+
|
|
71
|
+
A stale activation or duplicate/older intent returns `{ ok: true, superseded: true }` with no
|
|
72
|
+
navigation event or cursor change. Do not claim navigation from `ok: true` alone. Applied results
|
|
73
|
+
and events carry `catalogEpoch`, `boardGeneration` and `sequence`; presenter-aware clients use
|
|
74
|
+
these to reject stale acknowledgements and events. A structurally valid newer intent is claimed
|
|
75
|
+
before resolving the stop, so even a missing newer stop supersedes older requests.
|
|
76
|
+
|
|
77
|
+
This is latest-intent-wins, not FIFO: reversed relative Next requests can coalesce. Separate
|
|
78
|
+
documents remain independent, and reload does not cancel an old document's pending request.
|
|
79
|
+
An activation retains at most 4096 document IDs; a new ID beyond that returns 409 rather than
|
|
80
|
+
evicting an ordering record. Switching boards resets the capacity but old activation stamps stay stale.
|
|
81
|
+
The SDK accepts `goToTourStop(step, { presenter })` and `exitTour(presenter)`; fenced go can return
|
|
82
|
+
`{ superseded: true }`, while exit returns void. Do not infer applied exit from that void return.
|
|
83
|
+
|
|
84
|
+
## Capture prerequisites and behavior
|
|
85
|
+
|
|
86
|
+
Start and verify the matching PMX daemon first: its `/health` workspace and version must match the
|
|
87
|
+
installation and workspace used by the CLI/MCP host. Capture is a local CLI/file operation. It
|
|
88
|
+
requires Bun with WebView support and Chrome (or `--chrome-path`); MP4 encoding additionally
|
|
89
|
+
requires ffmpeg. Recording starts a separate Chrome session; it does not capture the native host's
|
|
90
|
+
Browser pane. Use a new output path because existing output and frame paths are refused.
|
|
91
|
+
|
|
92
|
+
Capture the saved or derived tour:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
pmx-canvas record --mode deterministic --present --fps 30 --resolution 1920x1080 --output tour.mp4
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Use `--tour-file tour.json` in deterministic mode to try the same model without changing the
|
|
99
|
+
board. Resolution defaults to 1280x720 and FPS to 30 (valid 1–120). Deterministic mode resolves
|
|
100
|
+
target geometry once and emits `max(1, ceil(duration * fps))` frames per stop, including each
|
|
101
|
+
endpoint. Duplicate a stop to hold it. It makes camera timing deterministic, not iframe animation,
|
|
102
|
+
late fonts/network assets, or concurrent board edits.
|
|
103
|
+
|
|
104
|
+
Realtime mode instead needs one stopping rule: `--duration SECONDS` or `--stop-on-signal`. It
|
|
105
|
+
samples the live board and repeats frames when capture is slow to preserve wall-clock duration.
|
|
106
|
+
Capture has no audio and does not move other viewers' cameras or replace an existing automation
|
|
107
|
+
session.
|
|
108
|
+
|
|
109
|
+
An `.mp4` output uses ffmpeg/H.264. Frames and `recording.json` remain in `<output>.frames`; if
|
|
110
|
+
ffmpeg is unavailable, the command reports and returns the PNG sequence directory. Any other
|
|
111
|
+
output path is itself a PNG sequence directory. Encoding failures retain the frames and fail.
|