pmx-canvas 0.6.4 → 0.7.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 +67 -3
- package/CHANGELOG.md +73 -0
- package/Readme.md +35 -5
- package/dist/canvas/global.css +498 -28
- package/dist/canvas/index.js +110 -95
- package/dist/canvas/mermaid-entry.js +258 -258
- package/dist/types/cli/agent.d.ts +4 -0
- package/dist/types/cli/commands/backup.d.ts +1 -0
- package/dist/types/cli/commands/boards.d.ts +1 -0
- package/dist/types/cli/commands/export.d.ts +1 -0
- package/dist/types/cli/commands/record.d.ts +12 -0
- package/dist/types/client/canvas/BoardCopyDialog.d.ts +5 -0
- package/dist/types/client/canvas/BoardFolderDialog.d.ts +7 -0
- package/dist/types/client/canvas/BoardLinkDialog.d.ts +3 -0
- package/dist/types/client/canvas/BoardSwitcher.d.ts +8 -0
- package/dist/types/client/canvas/ExportDialog.d.ts +7 -0
- package/dist/types/client/canvas/HomeView.d.ts +9 -0
- package/dist/types/client/canvas/Presentation.d.ts +13 -0
- package/dist/types/client/canvas/use-node-drag.d.ts +2 -1
- package/dist/types/client/nodes/AttachmentNode.d.ts +6 -0
- package/dist/types/client/nodes/BoardNode.d.ts +5 -0
- package/dist/types/client/nodes/McpAppNode.d.ts +24 -1
- package/dist/types/client/state/boards-store.d.ts +79 -0
- package/dist/types/client/state/canvas-store.d.ts +2 -0
- package/dist/types/client/state/intent-bridge.d.ts +1 -0
- package/dist/types/client/state/presentation.d.ts +3 -0
- package/dist/types/client/state/session-store.d.ts +7 -0
- package/dist/types/client/types.d.ts +2 -2
- package/dist/types/json-render/catalog.d.ts +3 -3
- package/dist/types/json-render/charts/definitions.d.ts +1 -1
- package/dist/types/json-render/server.d.ts +8 -0
- package/dist/types/mcp/canvas-access.d.ts +10 -3
- package/dist/types/mcp/context-uri-template.d.ts +6 -0
- package/dist/types/server/agent-presence.d.ts +1 -1
- package/dist/types/server/attribution.d.ts +11 -0
- package/dist/types/server/ax-context.d.ts +3 -1
- package/dist/types/server/ax-interaction.d.ts +2 -2
- package/dist/types/server/ax-state.d.ts +13 -3
- package/dist/types/server/backup.d.ts +36 -0
- package/dist/types/server/board-export.d.ts +45 -0
- package/dist/types/server/canvas-db.d.ts +65 -9
- package/dist/types/server/canvas-operations.d.ts +45 -0
- package/dist/types/server/canvas-provenance.d.ts +1 -1
- package/dist/types/server/canvas-schema.d.ts +1 -0
- package/dist/types/server/canvas-state.d.ts +146 -3
- package/dist/types/server/canvas-validation.d.ts +3 -0
- package/dist/types/server/context-brief.d.ts +111 -0
- package/dist/types/server/context-reads.d.ts +55 -0
- package/dist/types/server/document-import.d.ts +66 -0
- package/dist/types/server/html-surface.d.ts +1 -1
- package/dist/types/server/index.d.ts +107 -4
- package/dist/types/server/mutation-history.d.ts +1 -0
- package/dist/types/server/operations/invoker.d.ts +2 -0
- package/dist/types/server/operations/mcp.d.ts +7 -1
- package/dist/types/server/operations/ops/app.d.ts +2 -0
- package/dist/types/server/operations/ops/ax-shared.d.ts +2 -2
- package/dist/types/server/operations/ops/backup.d.ts +2 -0
- package/dist/types/server/operations/ops/boards.d.ts +10 -0
- package/dist/types/server/operations/ops/export.d.ts +2 -0
- package/dist/types/server/operations/ops/imports.d.ts +2 -0
- package/dist/types/server/operations/ops/json-render.d.ts +2 -0
- package/dist/types/server/operations/ops/nodes.d.ts +4 -2
- package/dist/types/server/operations/ops/query.d.ts +2 -0
- package/dist/types/server/operations/registry.d.ts +9 -1
- package/dist/types/server/operations/types.d.ts +1 -1
- package/dist/types/server/server.d.ts +1 -0
- package/dist/types/server/trace-manager.d.ts +7 -0
- package/dist/types/server/web-artifacts.d.ts +3 -0
- package/dist/types/server/webpage-node.d.ts +22 -1
- package/dist/types/server/workbench-auth.d.ts +3 -0
- package/dist/types/shared/boards.d.ts +6 -0
- package/dist/types/shared/tour.d.ts +72 -0
- package/docs/RELEASE.md +5 -0
- package/docs/cli.md +157 -0
- package/docs/http-api.md +277 -6
- package/docs/mcp.md +96 -7
- package/docs/node-types.md +106 -0
- package/docs/plans/plan-010-attributed-ask-answers.md +39 -0
- package/docs/plans/plan-011-context-read-instrumentation.md +54 -0
- package/docs/plans/plan-012-many-boards-stage-1.md +98 -0
- package/docs/plans/plan-013-static-board-export.md +47 -0
- package/docs/plans/plan-014-connected-board-memory.md +140 -0
- package/docs/product-vision-2026-09.md +118 -18
- package/docs/sdk.md +50 -0
- package/package.json +1 -1
- package/skills/pmx-canvas/SKILL.md +62 -5
- package/skills/pmx-canvas/references/full-reference.md +44 -8
- package/skills/pmx-canvas/references/github-copilot-app-adapter.md +3 -0
- package/skills/pmx-canvas/references/installing-pmx-canvas.md +4 -4
- package/skills/pmx-canvas-orchestration/SKILL.md +5 -0
- package/skills/pmx-canvas-testing/SKILL.md +4 -0
- package/src/cli/agent.ts +9 -0
- package/src/cli/commands/ax.ts +13 -0
- package/src/cli/commands/backup.ts +66 -0
- package/src/cli/commands/boards.ts +71 -0
- package/src/cli/commands/export.ts +30 -0
- package/src/cli/commands/nodes.ts +14 -1
- package/src/cli/commands/pins.ts +6 -2
- package/src/cli/commands/pump.ts +3 -0
- package/src/cli/commands/query.ts +33 -7
- package/src/cli/commands/record.ts +218 -0
- package/src/cli/commands/view.ts +7 -5
- package/src/cli/index.ts +21 -9
- package/src/client/App.tsx +28 -4
- package/src/client/canvas/AgentPresenceLayer.tsx +1 -1
- package/src/client/canvas/BoardCopyDialog.tsx +153 -0
- package/src/client/canvas/BoardFolderDialog.tsx +120 -0
- package/src/client/canvas/BoardLinkDialog.tsx +93 -0
- package/src/client/canvas/BoardSwitcher.tsx +149 -0
- package/src/client/canvas/CanvasNode.tsx +8 -0
- package/src/client/canvas/CanvasViewport.tsx +3 -0
- package/src/client/canvas/CommandPalette.tsx +107 -4
- package/src/client/canvas/ContextMenu.tsx +4 -0
- package/src/client/canvas/ExpandedNodeOverlay.tsx +3 -0
- package/src/client/canvas/ExportDialog.tsx +197 -0
- package/src/client/canvas/HomeView.tsx +277 -0
- package/src/client/canvas/IntentLayer.tsx +9 -2
- package/src/client/canvas/Presentation.tsx +108 -0
- package/src/client/canvas/SessionPanel.tsx +28 -1
- package/src/client/canvas/ToolRail.tsx +38 -3
- package/src/client/canvas/TopBar.tsx +49 -7
- package/src/client/canvas/import-files.ts +19 -1
- package/src/client/canvas/kind-colors.ts +1 -0
- package/src/client/canvas/use-node-drag.ts +8 -3
- package/src/client/icons.tsx +2 -0
- package/src/client/mermaid-entry.ts +39 -0
- package/src/client/nodes/AttachmentNode.tsx +148 -0
- package/src/client/nodes/BoardNode.tsx +35 -0
- package/src/client/nodes/FileNode.tsx +6 -0
- package/src/client/nodes/HtmlNode.tsx +12 -13
- package/src/client/nodes/MarkdownNode.tsx +47 -19
- package/src/client/nodes/McpAppNode.tsx +105 -13
- package/src/client/nodes/MermaidNode.tsx +3 -2
- package/src/client/nodes/ax-node-actions.ts +2 -5
- package/src/client/nodes/use-ax-surface-bridge.ts +1 -1
- package/src/client/state/boards-store.ts +167 -0
- package/src/client/state/canvas-store.ts +22 -0
- package/src/client/state/intent-bridge.ts +30 -2
- package/src/client/state/intent-store.ts +5 -1
- package/src/client/state/node-factory.ts +1 -0
- package/src/client/state/presentation.ts +7 -0
- package/src/client/state/session-store.ts +8 -0
- package/src/client/state/sse-bridge.ts +52 -5
- package/src/client/theme/global.css +498 -28
- package/src/client/types.ts +2 -0
- package/src/json-render/server.ts +45 -9
- package/src/mcp/canvas-access.ts +59 -22
- package/src/mcp/context-uri-template.ts +28 -0
- package/src/mcp/server.ts +122 -15
- package/src/server/agent-context.ts +116 -29
- package/src/server/agent-presence.ts +15 -9
- package/src/server/attribution.ts +29 -0
- package/src/server/ax-context.ts +4 -2
- package/src/server/ax-interaction.ts +1 -0
- package/src/server/ax-state-manager.ts +72 -3
- package/src/server/ax-state.ts +41 -0
- package/src/server/backup.ts +178 -0
- package/src/server/board-export.ts +686 -0
- package/src/server/canvas-db.ts +612 -105
- package/src/server/canvas-operations.ts +183 -31
- package/src/server/canvas-provenance.ts +1 -0
- package/src/server/canvas-schema.ts +22 -0
- package/src/server/canvas-state.ts +812 -48
- package/src/server/canvas-validation.ts +9 -1
- package/src/server/context-brief.ts +372 -0
- package/src/server/context-reads.ts +238 -0
- package/src/server/demo-state.json +670 -9
- package/src/server/document-import.ts +223 -0
- package/src/server/html-primitives.ts +199 -91
- package/src/server/html-surface.ts +8 -3
- package/src/server/index.ts +243 -5
- package/src/server/mutation-history.ts +10 -13
- package/src/server/operations/composites.ts +29 -5
- package/src/server/operations/http.ts +9 -3
- package/src/server/operations/index.ts +8 -0
- package/src/server/operations/invoker.ts +14 -3
- package/src/server/operations/mcp.ts +50 -11
- package/src/server/operations/ops/app.ts +15 -0
- package/src/server/operations/ops/ax-read.ts +10 -6
- package/src/server/operations/ops/ax-timeline.ts +75 -0
- package/src/server/operations/ops/backup.ts +134 -0
- package/src/server/operations/ops/batch.ts +20 -4
- package/src/server/operations/ops/boards.ts +351 -0
- package/src/server/operations/ops/export.ts +74 -0
- package/src/server/operations/ops/ext-app.ts +4 -0
- package/src/server/operations/ops/groups.ts +14 -7
- package/src/server/operations/ops/imports.ts +220 -0
- package/src/server/operations/ops/json-render.ts +37 -5
- package/src/server/operations/ops/nodes.ts +99 -21
- package/src/server/operations/ops/query.ts +206 -9
- package/src/server/operations/ops/viewport.ts +32 -0
- package/src/server/operations/registry.ts +129 -31
- package/src/server/operations/types.ts +1 -1
- package/src/server/scope-fence.ts +1 -1
- package/src/server/server.ts +155 -8
- package/src/server/spatial-analysis.ts +9 -17
- package/src/server/trace-manager.ts +19 -0
- package/src/server/web-artifacts.ts +11 -3
- package/src/server/webpage-node.ts +173 -13
- package/src/server/workbench-auth.ts +11 -0
- package/src/server/workboard.ts +3 -3
- package/src/shared/boards.ts +18 -0
- package/src/shared/node-sizes.ts +1 -0
- package/src/shared/tour.ts +87 -0
|
@@ -418,14 +418,77 @@ async function startPanelServer(instanceId, ctx, pmx) {
|
|
|
418
418
|
return { server, url: `http://127.0.0.1:${port}/`, entry };
|
|
419
419
|
}
|
|
420
420
|
|
|
421
|
-
async function getAxContext(baseUrl, workspaceRoot, input = {}) {
|
|
421
|
+
async function getAxContext(baseUrl, workspaceRoot, input = {}, options = {}) {
|
|
422
422
|
const resolved = baseUrl
|
|
423
423
|
? { ok: true, baseUrl }
|
|
424
424
|
: await resolvePmxServer({ input, session: { workingDirectory: workspaceRoot } }, { autoStart: false });
|
|
425
425
|
if (!resolved.ok || !resolved.baseUrl) {
|
|
426
426
|
return { ok: false, error: resolved.error ?? "PMX Canvas server is unavailable." };
|
|
427
427
|
}
|
|
428
|
-
|
|
428
|
+
// A proxied read is one this extension records itself with what it actually
|
|
429
|
+
// injected (after truncation), so the server does not record it again.
|
|
430
|
+
const headers = { "x-pmx-source": "copilot", ...(options.proxied ? { "x-pmx-proxied-read": "1" } : {}) };
|
|
431
|
+
return await fetchJson(resolved.baseUrl, "/api/canvas/ax/context", { headers, timeoutMs: 2_000 });
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
function deliveredPinnedIds(pinnedNodeIds, payloadText) {
|
|
435
|
+
const pinned = new Set(pinnedNodeIds);
|
|
436
|
+
const delivered = new Set();
|
|
437
|
+
const objectStarts = [];
|
|
438
|
+
let inString = false;
|
|
439
|
+
let escaped = false;
|
|
440
|
+
for (let index = 0; index < payloadText.length; index += 1) {
|
|
441
|
+
const character = payloadText[index];
|
|
442
|
+
if (inString) {
|
|
443
|
+
if (escaped) escaped = false;
|
|
444
|
+
else if (character === "\\") escaped = true;
|
|
445
|
+
else if (character === '"') inString = false;
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
if (character === '"') {
|
|
449
|
+
inString = true;
|
|
450
|
+
} else if (character === "{") {
|
|
451
|
+
objectStarts.push(index);
|
|
452
|
+
} else if (character === "}" && objectStarts.length > 0) {
|
|
453
|
+
const start = objectStarts.pop();
|
|
454
|
+
try {
|
|
455
|
+
const value = JSON.parse(payloadText.slice(start, index + 1));
|
|
456
|
+
if (value && !Array.isArray(value) && typeof value === "object" &&
|
|
457
|
+
Object.hasOwn(value, "id") && typeof value.id === "string" && pinned.has(value.id)) {
|
|
458
|
+
delivered.add(value.id);
|
|
459
|
+
}
|
|
460
|
+
} catch {
|
|
461
|
+
// An inner object may be complete even when its containing object was clipped.
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return pinnedNodeIds.filter((id) => delivered.has(id));
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/** Records what the per-prompt hook injected, so delivery is measured on what Copilot received. */
|
|
469
|
+
async function recordInjectedContext(baseUrl, context, injected) {
|
|
470
|
+
const pinnedNodeIds = Array.isArray(context?.pinned?.nodeIds) ? context.pinned.nodeIds : [];
|
|
471
|
+
const text = injected ?? "";
|
|
472
|
+
try {
|
|
473
|
+
await fetchJson(baseUrl, "/api/canvas/ax/context-reads", {
|
|
474
|
+
method: "POST",
|
|
475
|
+
headers: { "Content-Type": "application/json", "x-pmx-source": "copilot" },
|
|
476
|
+
body: JSON.stringify({
|
|
477
|
+
channel: "adapter",
|
|
478
|
+
resource: "copilot:prompt-context",
|
|
479
|
+
source: "copilot",
|
|
480
|
+
consumer: "copilot",
|
|
481
|
+
boardId: context.boardId,
|
|
482
|
+
pinnedNodeIds,
|
|
483
|
+
// Same rule as the server (context-reads.ts): a node object with that id, not a bare id list.
|
|
484
|
+
deliveredNodeIds: deliveredPinnedIds(pinnedNodeIds, text),
|
|
485
|
+
bytes: Buffer.byteLength(text, "utf-8"),
|
|
486
|
+
}),
|
|
487
|
+
timeoutMs: 1_500,
|
|
488
|
+
});
|
|
489
|
+
} catch {
|
|
490
|
+
// Instrumentation must never block the prompt.
|
|
491
|
+
}
|
|
429
492
|
}
|
|
430
493
|
|
|
431
494
|
async function getAxStatus(ctx) {
|
|
@@ -860,8 +923,9 @@ copilotSession = await joinSession({
|
|
|
860
923
|
void postPresence(workspaceRoot, { attached: true, phase: "thinking", detail: null });
|
|
861
924
|
const resolved = await resolvePmxServer({ input: {}, session: { workingDirectory: workspaceRoot } }, { autoStart: false });
|
|
862
925
|
if (!resolved.ok || !resolved.baseUrl) return undefined;
|
|
863
|
-
const context = await getAxContext(resolved.baseUrl, workspaceRoot, {});
|
|
926
|
+
const context = await getAxContext(resolved.baseUrl, workspaceRoot, {}, { proxied: true });
|
|
864
927
|
const additionalContext = formatAdditionalContext(context, resolved.baseUrl);
|
|
928
|
+
void recordInjectedContext(resolved.baseUrl, context, additionalContext);
|
|
865
929
|
return additionalContext ? { additionalContext } : undefined;
|
|
866
930
|
},
|
|
867
931
|
},
|
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,79 @@
|
|
|
3
3
|
All notable changes to `pmx-canvas` are documented here. This project follows
|
|
4
4
|
[Semantic Versioning](https://semver.org/).
|
|
5
5
|
|
|
6
|
+
## [Unreleased]
|
|
7
|
+
|
|
8
|
+
## [0.7.0] - 2026-09-29
|
|
9
|
+
|
|
10
|
+
### Highlights
|
|
11
|
+
|
|
12
|
+
- Keep your work in named boards, organized into nested folders and connected by board links.
|
|
13
|
+
- Search across your library and give agents source-labelled context from related boards.
|
|
14
|
+
- Turn document attachments into reviewable Markdown using your connected agent's tools.
|
|
15
|
+
- Share a board as a standalone HTML file and back up the whole library.
|
|
16
|
+
|
|
17
|
+
### Breaking
|
|
18
|
+
|
|
19
|
+
- The database migrates to multi-board storage and cannot be opened by older versions. Before downgrading, restore the automatic `canvas.db.pre-boards` copy or a pre-upgrade backup; changes made after migration are not in that copy.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- The canvas database now stores many named boards. On first start your current board becomes a board named after the workspace, every old snapshot becomes a board of its own, and a copy of the old file is kept as `canvas.db.pre-boards` (older versions cannot open the migrated file).
|
|
24
|
+
- Agent context and search now read chart values, diagram labels and structured card text instead of raw renderer configuration.
|
|
25
|
+
- Questions, approvals and mode requests record who asked and answered them, including self-answers; this attribution describes the writer and does not grant permission.
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- Sort boards into categories on Home; each category is its own section you can fold away, and boards migrated from old snapshots start in a folded "From old snapshots" section.
|
|
30
|
+
- Export a board as one HTML file anyone can open without installing anything, from **Export** in the top bar or `pmx-canvas export`; the dialog lists what goes into the file first, and local file contents stay out unless you include them.
|
|
31
|
+
- Back up every board with `pmx-canvas backup`, schedule server-run copies with `pmx-canvas backup schedule --every 24h`, and bring a backup back with `pmx-canvas restore` (the replaced file is kept); Home has no backup button.
|
|
32
|
+
- The top bar shows the open board; click it to switch to a recent board, create a new one, or go Home, where you can open, rename, and delete boards (deleting asks first).
|
|
33
|
+
- Agents can list, read and create boards with `canvas_board`, `canvas://boards`, `pmx-canvas board list|create|rename`, and the `/api/canvas/boards` routes; only you open, switch or delete a board.
|
|
34
|
+
- Agent writes go to the board you have open; on Home, an agent's first write opens your most recent board, or creates one if there are none.
|
|
35
|
+
- The canvas now records which context each agent reads and whether your pinned nodes were in it, readable with `pmx-canvas ax reads`, `canvas_ax_timeline { action: "reads" }`, or `GET /api/canvas/ax/context-reads`.
|
|
36
|
+
- Designate a Markdown card as a board README, add text-only board-link cards, inspect outgoing links and backlinks, and search cards across the library without switching boards.
|
|
37
|
+
- Preview and create an inactive board from selected reusable cards and optional groups/README; copied cards receive fresh IDs and omit pins, AX state and history.
|
|
38
|
+
- Read a character-bounded cross-board brief with source IDs over MCP, HTTP, CLI or SDK; a durable cursor is used only when a stable consumer ID is supplied.
|
|
39
|
+
- Attach PDF and Office originals up to 20 MiB, explicitly ask the connected agent to draft source-linked Markdown, and review it before adding it to the board; Canvas does not bundle conversion or launch an agent automatically.
|
|
40
|
+
|
|
41
|
+
### Known limitations
|
|
42
|
+
|
|
43
|
+
- Document extraction depends on the connected agent's available tools; remote byte transfer, OCR, unreadable charts, and some host formats may be unavailable.
|
|
44
|
+
- A graph map, direct card-to-card edges across boards, and wiki-link syntax are not implemented.
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
|
|
48
|
+
- Snapshots can only be read, restored, renamed or deleted on their owning board.
|
|
49
|
+
- Slow file imports no longer land on a board opened after the drop, and rapid board switches keep their intended order.
|
|
50
|
+
- Recent boards remain correctly ordered when multiple opens happen within one millisecond.
|
|
51
|
+
- HTTP board switching and deletion require the trusted workbench token, not just the UI marker.
|
|
52
|
+
- `pmx-canvas pump` no longer crashes when its command exits without reading the steer; the exit code decides, as intended.
|
|
53
|
+
- A change the server refuses in the browser now shows a toast with the reason instead of failing silently.
|
|
54
|
+
- Webpage nodes refuse redirects that move a public page onto a private or loopback address, and never fetch link-local (cloud metadata) addresses.
|
|
55
|
+
|
|
56
|
+
### Internal
|
|
57
|
+
|
|
58
|
+
- The e2e gate now checks that every node type paints in a 600 px Chromium pane, the width of the agent-host panels the workbench lives in.
|
|
59
|
+
|
|
60
|
+
## [0.6.5] - 2026-09-26
|
|
61
|
+
|
|
62
|
+
### Added
|
|
63
|
+
|
|
64
|
+
- Present saved board tours or derive stops from groups, with keyboard navigation and optional local PNG/MP4 capture using the same camera path.
|
|
65
|
+
- Creation responses report requested and applied sizes, including group fitting, across HTTP, MCP, and batches.
|
|
66
|
+
- JSON-render warns when unbound form values would be ignored.
|
|
67
|
+
|
|
68
|
+
### Fixed
|
|
69
|
+
|
|
70
|
+
- Workboards use equal-width columns across narrow and wide frames.
|
|
71
|
+
- Embedded HTML and JSON-render updates keep the previous frame visible until the replacement is ready.
|
|
72
|
+
- Explicitly empty HTML primitive fields omit their sections instead of inserting example content.
|
|
73
|
+
- Mermaid diagrams fit overflowing content without enlarging small diagrams; authored sizes and optional natural scrolling are preserved.
|
|
74
|
+
- Titlebar clicks select nodes without adding a selection after a drag.
|
|
75
|
+
- Detached agents expire promptly, workers roll up under their parent, and camera operations no longer claim writer activity.
|
|
76
|
+
- Unchanged and worker sessions do not replace useful receipts or reopen the panel.
|
|
77
|
+
- Ghosts finish their rendered settle animation before removal, and tour-only changes create distinct snapshots.
|
|
78
|
+
|
|
6
79
|
## [0.6.4] - 2026-09-24
|
|
7
80
|
|
|
8
81
|
### Added
|
package/Readme.md
CHANGED
|
@@ -18,6 +18,12 @@ structured panel into place as they generate it — not as a separate tooling
|
|
|
18
18
|
project. Pin what matters and the agent reads your spatial curation as
|
|
19
19
|
structured context.
|
|
20
20
|
|
|
21
|
+
**The board is the presentation.** Click **Present** to step through a saved tour
|
|
22
|
+
(or groups in reading order), with chrome hidden and smooth camera moves.
|
|
23
|
+
Optionally capture that same tour with
|
|
24
|
+
`pmx-canvas record --mode deterministic --present --output tour.mp4`. See the
|
|
25
|
+
[tour model and CLI walkthrough](docs/cli.md#tour-and-presentation).
|
|
26
|
+
|
|
21
27
|
<p align="center">
|
|
22
28
|
<img src="docs/screenshots/workbench-live-dark.png" alt="Live multi-agent workbench — dark theme: two agents on the board, review cards, an architecture diagram, and the writers pill" width="49%" />
|
|
23
29
|
<img src="docs/screenshots/workbench-live-light.png" alt="Live multi-agent workbench — light theme" width="49%" />
|
|
@@ -35,6 +41,15 @@ in real time. Either side adds material; the human curates spatial structure
|
|
|
35
41
|
`canvas://pinned-context` and acts on it. Spatial arrangement is
|
|
36
42
|
communication — proximity means relatedness, pinning means *focus here*.
|
|
37
43
|
|
|
44
|
+
The database holds many named boards. **Home is the library view, not a board**:
|
|
45
|
+
it lists recent boards and nested category paths (up to eight 60-character
|
|
46
|
+
segments). Empty folders are not independent objects; they exist only while a
|
|
47
|
+
board is filed beneath them. Only a human opens/switches or deletes a board.
|
|
48
|
+
Agents may list, read, create, rename, categorize, search, and create an inactive
|
|
49
|
+
board from selected reusable cards without disturbing the board in view. Home
|
|
50
|
+
provides a copy-preview dialog; an open board's command palette offers a
|
|
51
|
+
board-link picker. Neither depends on native browser prompts.
|
|
52
|
+
|
|
38
53
|
## Main features
|
|
39
54
|
|
|
40
55
|
### 01 / Curate
|
|
@@ -67,6 +82,14 @@ the canvas is the union of its [built-in node types](docs/node-types.md) and
|
|
|
67
82
|
**whatever your agent's harness already has access to** — MCP servers, CLIs,
|
|
68
83
|
file reads, web fetch, anything on its toolbelt.
|
|
69
84
|
|
|
85
|
+
Dropping a PDF or Office document attaches the original (up to 20 MiB). It does
|
|
86
|
+
not bundle a converter or automatically launch an agent. After you explicitly
|
|
87
|
+
request agent-assisted import and consent to processing by the connected host's
|
|
88
|
+
tools/model provider, the agent fetches the controlled bytes, returns Markdown
|
|
89
|
+
sections with references and warnings, and you review before adding them to the
|
|
90
|
+
board. Remote hosts may require manual transfer; OCR, charts, and host format
|
|
91
|
+
support are not guaranteed.
|
|
92
|
+
|
|
70
93
|
JSON-render panels support bound form state, nested repeats, watchers, and Card
|
|
71
94
|
header/footer slots. Form edits remain viewer-local until explicitly submitted;
|
|
72
95
|
see [JSON-render nodes](docs/node-types.md#json-render-nodes). Authored iframe cards
|
|
@@ -170,15 +193,21 @@ and the `pmx-canvas-orchestration` skill documents the choreography.
|
|
|
170
193
|
|
|
171
194
|
Spatial state auto-saves to `.pmx-canvas/canvas.db` (debounced ~500 ms) —
|
|
172
195
|
git-committable, shareable across machines, and survives both browser
|
|
173
|
-
refresh and server restart.
|
|
196
|
+
refresh and server restart. Autosave is not a backup: `pmx-canvas backup` and
|
|
197
|
+
its optional server-run schedule copy the whole board library, while restore
|
|
198
|
+
keeps the replaced database. Backup and scheduling are backend/CLI operations;
|
|
199
|
+
there is no Home backup button. A board can also be exported as a self-contained
|
|
200
|
+
HTML file. Export previews what is included, omits local file contents unless
|
|
201
|
+
explicitly requested, and locks board-link cards because an exported file has
|
|
202
|
+
no live target library (the target title is not embedded). Named [snapshots](docs/mcp.md), full
|
|
174
203
|
undo/redo, and an auto-detected code graph (JS/TS, Python, Go, Rust) make
|
|
175
204
|
the canvas durable rather than throwaway. Stop the server before committing
|
|
176
205
|
the DB so SQLite WAL data is checkpointed into the file.
|
|
177
206
|
|
|
178
207
|
### 07 / Any agent
|
|
179
208
|
|
|
180
|
-
Harness-agnostic. Drive the canvas from [MCP](docs/mcp.md) (
|
|
181
|
-
|
|
209
|
+
Harness-agnostic. Drive the canvas from [MCP](docs/mcp.md) (24 tools,
|
|
210
|
+
15 static canvas resources plus one context resource template, change notifications), the [CLI](docs/cli.md), the
|
|
182
211
|
[HTTP API](docs/http-api.md), or the [Bun SDK](docs/sdk.md) — all
|
|
183
212
|
[environment variables documented here](docs/environment.md). Works with
|
|
184
213
|
Claude Code, the GitHub Copilot app and CLI, Codex, Amp, Cursor, Windsurf, or
|
|
@@ -372,7 +401,7 @@ services:
|
|
|
372
401
|
```bash
|
|
373
402
|
# .agents/setup — install the CLI (pin the exact version: a fresh orb running
|
|
374
403
|
# @latest can silently pick up a newer release than the one you validated)
|
|
375
|
-
npm install -g pmx-canvas@0.
|
|
404
|
+
npm install -g pmx-canvas@0.7.0
|
|
376
405
|
```
|
|
377
406
|
|
|
378
407
|
The server binds the portal-assigned `$PORT` automatically (gated on the
|
|
@@ -438,7 +467,8 @@ paths, screenshots, or logs are attached automatically.
|
|
|
438
467
|
the three-tier visual matrix (json-render → html → web-artifact)
|
|
439
468
|
- **[CLI reference](docs/cli.md)** — full command surface, daemon mode,
|
|
440
469
|
watch streams, WebView automation
|
|
441
|
-
- **[MCP reference](docs/mcp.md)** —
|
|
470
|
+
- **[MCP reference](docs/mcp.md)** — 24 tools, 15 static canvas resources, one
|
|
471
|
+
context resource template, plus bundled
|
|
442
472
|
skill resources, Skills extension, change notifications, node-type routing
|
|
443
473
|
- **[HTTP API](docs/http-api.md)** — REST endpoints, SSE, batch operations
|
|
444
474
|
- **[AX host-adapter contract](docs/ax-host-adapter-contract.md)** — how native
|