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
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** The Home category migrated 0.6 snapshots land on, so they do not bury the boards in use. */
|
|
2
|
+
export const MIGRATED_SNAPSHOT_CATEGORY = 'From old snapshots';
|
|
3
|
+
|
|
4
|
+
/** Slash-separated folder paths shared by the UI, HTTP/MCP and SDK. */
|
|
5
|
+
export function normalizeBoardCategory(value: string | null): string | null {
|
|
6
|
+
if (!value?.trim()) return null;
|
|
7
|
+
const parts = value.split('/').map((part) => part.trim());
|
|
8
|
+
if (parts.length > 8) throw new Error('Folders can be nested up to 8 levels.');
|
|
9
|
+
if (parts.some((part) => !part || part === '.' || part === '..' || part.length > 60)) {
|
|
10
|
+
throw new Error('Each folder name must be 1–60 characters, and cannot be "." or "..".');
|
|
11
|
+
}
|
|
12
|
+
return parts.join('/');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Includes implicit parents, so a board in A/B can also be moved into A. */
|
|
16
|
+
export function categoryAncestors(path: string): string[] {
|
|
17
|
+
return path.split('/').map((_, index, parts) => parts.slice(0, index + 1).join('/'));
|
|
18
|
+
}
|
package/src/shared/node-sizes.ts
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
export const NODE_MIN_SIZES: Record<string, { width: number; height: number }> = {
|
|
21
21
|
markdown: { width: 360, height: 180 },
|
|
22
|
+
board: { width: 320, height: 140 },
|
|
22
23
|
context: { width: 360, height: 180 },
|
|
23
24
|
file: { width: 360, height: 200 },
|
|
24
25
|
diff: { width: 420, height: 240 },
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export const cameraSchema = z.object({ x: z.number(), y: z.number(), scale: z.number().positive() });
|
|
4
|
+
export const tourStopSchema = z.object({
|
|
5
|
+
target: z.union([z.strictObject({ nodeId: z.string().min(1) }), z.strictObject({ viewport: cameraSchema })]),
|
|
6
|
+
duration: z.number().nonnegative().max(3600).optional(),
|
|
7
|
+
easing: z.enum(['linear', 'ease-in-out', 'ease-out']).optional(),
|
|
8
|
+
padding: z.number().nonnegative().optional(),
|
|
9
|
+
pullback: z.number().min(0).max(4).optional(),
|
|
10
|
+
});
|
|
11
|
+
export const tourSchema = z.object({ stops: z.array(tourStopSchema).max(1000) });
|
|
12
|
+
export type Tour = z.infer<typeof tourSchema>;
|
|
13
|
+
export type TourStop = z.infer<typeof tourStopSchema>;
|
|
14
|
+
export type Camera = z.infer<typeof cameraSchema>;
|
|
15
|
+
export interface TourNode {
|
|
16
|
+
id: string;
|
|
17
|
+
type: string;
|
|
18
|
+
position: { x: number; y: number };
|
|
19
|
+
size: { width: number; height: number };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function derivedTour(nodes: TourNode[]): Tour {
|
|
23
|
+
return {
|
|
24
|
+
stops: nodes
|
|
25
|
+
.filter((n) => n.type === 'group')
|
|
26
|
+
.sort((a, b) => a.position.y - b.position.y || a.position.x - b.position.x || a.id.localeCompare(b.id))
|
|
27
|
+
.map((n) => ({ target: { nodeId: n.id } })),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function resolveStop(stop: TourStop, nodes: TourNode[], width: number, height: number): Camera {
|
|
32
|
+
if ('viewport' in stop.target) return stop.target.viewport;
|
|
33
|
+
const id = stop.target.nodeId;
|
|
34
|
+
const node = nodes.find((n) => n.id === id);
|
|
35
|
+
if (!node) throw new Error(`Tour target not found: ${id}`);
|
|
36
|
+
const padding = stop.padding ?? 40;
|
|
37
|
+
if (padding * 2 >= Math.min(width, height)) throw new Error('Tour padding exceeds viewport');
|
|
38
|
+
const scale = Math.min((width - padding * 2) / node.size.width, (height - padding * 2) / node.size.height);
|
|
39
|
+
return {
|
|
40
|
+
x: width / 2 - (node.position.x + node.size.width / 2) * scale,
|
|
41
|
+
y: height / 2 - (node.position.y + node.size.height / 2) * scale,
|
|
42
|
+
scale,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Interpolate world-space centres and log zoom; translations remain screen-space. */
|
|
47
|
+
export function interpolateCamera(
|
|
48
|
+
from: Camera,
|
|
49
|
+
to: Camera,
|
|
50
|
+
progress: number,
|
|
51
|
+
width: number,
|
|
52
|
+
height: number,
|
|
53
|
+
easing: TourStop['easing'] = 'ease-in-out',
|
|
54
|
+
pullback = 0,
|
|
55
|
+
): Camera {
|
|
56
|
+
const t = Math.max(0, Math.min(1, progress));
|
|
57
|
+
if (t === 0) return { ...from };
|
|
58
|
+
if (t === 1) return { ...to };
|
|
59
|
+
const e = easing === 'linear' ? t : easing === 'ease-out' ? 1 - (1 - t) ** 3 : t * t * (3 - 2 * t);
|
|
60
|
+
const scale = Math.exp(Math.log(from.scale) * (1 - e) + Math.log(to.scale) * e - pullback * Math.sin(Math.PI * e));
|
|
61
|
+
const cx = ((width / 2 - from.x) / from.scale) * (1 - e) + ((width / 2 - to.x) / to.scale) * e;
|
|
62
|
+
const cy = ((height / 2 - from.y) / from.scale) * (1 - e) + ((height / 2 - to.y) / to.scale) * e;
|
|
63
|
+
return { x: width / 2 - cx * scale, y: height / 2 - cy * scale, scale };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Each segment includes its endpoint; zero-duration stops take one frame. */
|
|
67
|
+
export function segmentFrameCount(duration: number, fps: number): number {
|
|
68
|
+
return Math.max(1, Math.ceil(duration * fps));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function* tourFrames(
|
|
72
|
+
tour: Tour,
|
|
73
|
+
initial: Camera,
|
|
74
|
+
nodes: TourNode[],
|
|
75
|
+
width: number,
|
|
76
|
+
height: number,
|
|
77
|
+
fps: number,
|
|
78
|
+
) {
|
|
79
|
+
let from = initial;
|
|
80
|
+
for (const stop of tour.stops) {
|
|
81
|
+
const to = resolveStop(stop, nodes, width, height);
|
|
82
|
+
const count = segmentFrameCount(stop.duration ?? 1, fps);
|
|
83
|
+
for (let i = 1; i <= count; i++)
|
|
84
|
+
yield interpolateCamera(from, to, i / count, width, height, stop.easing, stop.pullback);
|
|
85
|
+
from = to;
|
|
86
|
+
}
|
|
87
|
+
}
|