pmx-canvas 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/LICENSE +21 -0
  3. package/Readme.md +865 -0
  4. package/dist/canvas/global.css +3173 -0
  5. package/dist/canvas/index.js +183 -0
  6. package/dist/json-render/index.css +2 -0
  7. package/dist/json-render/index.js +389 -0
  8. package/dist/types/cli/agent.d.ts +13 -0
  9. package/dist/types/cli/index.d.ts +2 -0
  10. package/dist/types/cli/watch.d.ts +5 -0
  11. package/dist/types/client/App.d.ts +1 -0
  12. package/dist/types/client/canvas/AttentionHistory.d.ts +1 -0
  13. package/dist/types/client/canvas/AttentionToast.d.ts +1 -0
  14. package/dist/types/client/canvas/CanvasNode.d.ts +8 -0
  15. package/dist/types/client/canvas/CanvasViewport.d.ts +8 -0
  16. package/dist/types/client/canvas/CommandPalette.d.ts +4 -0
  17. package/dist/types/client/canvas/ContextMenu.d.ts +24 -0
  18. package/dist/types/client/canvas/ContextPinBar.d.ts +1 -0
  19. package/dist/types/client/canvas/ContextPinHud.d.ts +1 -0
  20. package/dist/types/client/canvas/DockedNode.d.ts +4 -0
  21. package/dist/types/client/canvas/EdgeLayer.d.ts +8 -0
  22. package/dist/types/client/canvas/ExpandedNodeOverlay.d.ts +1 -0
  23. package/dist/types/client/canvas/FocusFieldLayer.d.ts +1 -0
  24. package/dist/types/client/canvas/Minimap.d.ts +23 -0
  25. package/dist/types/client/canvas/SelectionBar.d.ts +1 -0
  26. package/dist/types/client/canvas/ShortcutOverlay.d.ts +3 -0
  27. package/dist/types/client/canvas/SnapshotPanel.d.ts +7 -0
  28. package/dist/types/client/canvas/snap-guides.d.ts +23 -0
  29. package/dist/types/client/canvas/use-node-drag.d.ts +15 -0
  30. package/dist/types/client/canvas/use-node-resize.d.ts +15 -0
  31. package/dist/types/client/canvas/use-pan-zoom.d.ts +16 -0
  32. package/dist/types/client/ext-app/bridge.d.ts +161 -0
  33. package/dist/types/client/icons.d.ts +70 -0
  34. package/dist/types/client/index.d.ts +1 -0
  35. package/dist/types/client/nodes/ContextNode.d.ts +34 -0
  36. package/dist/types/client/nodes/ExtAppFrame.d.ts +18 -0
  37. package/dist/types/client/nodes/FileNode.d.ts +5 -0
  38. package/dist/types/client/nodes/GroupNode.d.ts +6 -0
  39. package/dist/types/client/nodes/ImageNode.d.ts +10 -0
  40. package/dist/types/client/nodes/InlineFormatBar.d.ts +7 -0
  41. package/dist/types/client/nodes/InlineMarkdownEditor.d.ts +14 -0
  42. package/dist/types/client/nodes/LedgerNode.d.ts +4 -0
  43. package/dist/types/client/nodes/MarkdownNode.d.ts +6 -0
  44. package/dist/types/client/nodes/McpAppNode.d.ts +4 -0
  45. package/dist/types/client/nodes/MdFormatBar.d.ts +8 -0
  46. package/dist/types/client/nodes/PromptNode.d.ts +5 -0
  47. package/dist/types/client/nodes/ResponseNode.d.ts +5 -0
  48. package/dist/types/client/nodes/StatusNode.d.ts +4 -0
  49. package/dist/types/client/nodes/StatusSummary.d.ts +4 -0
  50. package/dist/types/client/nodes/TraceNode.d.ts +4 -0
  51. package/dist/types/client/nodes/WebpageNode.d.ts +5 -0
  52. package/dist/types/client/nodes/image-warnings.d.ts +6 -0
  53. package/dist/types/client/nodes/inline-editor-commands.d.ts +11 -0
  54. package/dist/types/client/nodes/md-format.d.ts +25 -0
  55. package/dist/types/client/state/attention-bridge.d.ts +3 -0
  56. package/dist/types/client/state/attention-store.d.ts +25 -0
  57. package/dist/types/client/state/canvas-store.d.ts +74 -0
  58. package/dist/types/client/state/intent-bridge.d.ts +158 -0
  59. package/dist/types/client/state/sse-bridge.d.ts +5 -0
  60. package/dist/types/client/theme/tokens.d.ts +27 -0
  61. package/dist/types/client/types.d.ts +40 -0
  62. package/dist/types/client/utils/ext-app-tool-result.d.ts +1 -0
  63. package/dist/types/client/utils/placement.d.ts +1 -0
  64. package/dist/types/client/utils/platform.d.ts +2 -0
  65. package/dist/types/json-render/catalog.d.ts +815 -0
  66. package/dist/types/json-render/charts/components.d.ts +54 -0
  67. package/dist/types/json-render/charts/definitions.d.ts +103 -0
  68. package/dist/types/json-render/charts/extra-components.d.ts +58 -0
  69. package/dist/types/json-render/charts/extra-definitions.d.ts +181 -0
  70. package/dist/types/json-render/renderer/index.d.ts +16 -0
  71. package/dist/types/json-render/schema.d.ts +46 -0
  72. package/dist/types/json-render/server.d.ts +55 -0
  73. package/dist/types/mcp/server.d.ts +22 -0
  74. package/dist/types/server/agent-context.d.ts +21 -0
  75. package/dist/types/server/artifact-paths.d.ts +3 -0
  76. package/dist/types/server/canvas-operations.d.ts +154 -0
  77. package/dist/types/server/canvas-provenance.d.ts +13 -0
  78. package/dist/types/server/canvas-schema.d.ts +49 -0
  79. package/dist/types/server/canvas-serialization.d.ts +25 -0
  80. package/dist/types/server/canvas-state.d.ts +174 -0
  81. package/dist/types/server/canvas-validation.d.ts +33 -0
  82. package/dist/types/server/chart-template.d.ts +29 -0
  83. package/dist/types/server/code-graph.d.ts +67 -0
  84. package/dist/types/server/context-cards.d.ts +24 -0
  85. package/dist/types/server/diagram-presets.d.ts +28 -0
  86. package/dist/types/server/ext-app-call-registry.d.ts +16 -0
  87. package/dist/types/server/ext-app-tool-result.d.ts +1 -0
  88. package/dist/types/server/file-watcher.d.ts +16 -0
  89. package/dist/types/server/index.d.ts +243 -0
  90. package/dist/types/server/mcp-app-candidate.d.ts +25 -0
  91. package/dist/types/server/mcp-app-host.d.ts +65 -0
  92. package/dist/types/server/mcp-app-runtime.d.ts +47 -0
  93. package/dist/types/server/mutation-history.d.ts +105 -0
  94. package/dist/types/server/placement.d.ts +37 -0
  95. package/dist/types/server/server.d.ts +103 -0
  96. package/dist/types/server/spatial-analysis.d.ts +87 -0
  97. package/dist/types/server/trace-manager.d.ts +48 -0
  98. package/dist/types/server/web-artifacts.d.ts +50 -0
  99. package/dist/types/server/webpage-node.d.ts +25 -0
  100. package/dist/types/shared/auto-arrange.d.ts +29 -0
  101. package/dist/types/shared/ext-app-tool-result.d.ts +9 -0
  102. package/dist/types/shared/placement.d.ts +26 -0
  103. package/dist/types/shared/semantic-attention.d.ts +97 -0
  104. package/package.json +109 -0
  105. package/skills/data-analysis/SKILL.md +324 -0
  106. package/skills/doc-coauthoring/SKILL.md +375 -0
  107. package/skills/frontend-design/SKILL.md +45 -0
  108. package/skills/json-render-codegen/SKILL.md +112 -0
  109. package/skills/json-render-core/SKILL.md +265 -0
  110. package/skills/json-render-ink/SKILL.md +273 -0
  111. package/skills/json-render-mcp/SKILL.md +132 -0
  112. package/skills/json-render-react/SKILL.md +264 -0
  113. package/skills/json-render-shadcn/SKILL.md +159 -0
  114. package/skills/playwright-cli/SKILL.md +67 -0
  115. package/skills/pmx-canvas/SKILL.md +668 -0
  116. package/skills/pmx-canvas/evals/evals.json +186 -0
  117. package/skills/pmx-canvas-testing/SKILL.md +78 -0
  118. package/skills/published-consumer-e2e/SKILL.md +43 -0
  119. package/skills/published-consumer-e2e/scripts/run-published-consumer-e2e.sh +241 -0
  120. package/skills/web-artifacts-builder/SKILL.md +80 -0
  121. package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +167 -0
  122. package/skills/web-artifacts-builder/scripts/init-artifact.sh +425 -0
  123. package/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  124. package/skills/web-design-guidelines/SKILL.md +39 -0
  125. package/src/cli/agent.ts +2144 -0
  126. package/src/cli/index.ts +622 -0
  127. package/src/cli/watch.ts +88 -0
  128. package/src/client/App.tsx +507 -0
  129. package/src/client/canvas/AttentionHistory.tsx +81 -0
  130. package/src/client/canvas/AttentionToast.tsx +19 -0
  131. package/src/client/canvas/CanvasNode.tsx +363 -0
  132. package/src/client/canvas/CanvasViewport.tsx +590 -0
  133. package/src/client/canvas/CommandPalette.tsx +302 -0
  134. package/src/client/canvas/ContextMenu.tsx +601 -0
  135. package/src/client/canvas/ContextPinBar.tsx +25 -0
  136. package/src/client/canvas/ContextPinHud.tsx +22 -0
  137. package/src/client/canvas/DockedNode.tsx +66 -0
  138. package/src/client/canvas/EdgeLayer.tsx +280 -0
  139. package/src/client/canvas/ExpandedNodeOverlay.tsx +260 -0
  140. package/src/client/canvas/FocusFieldLayer.tsx +107 -0
  141. package/src/client/canvas/Minimap.tsx +301 -0
  142. package/src/client/canvas/SelectionBar.tsx +69 -0
  143. package/src/client/canvas/ShortcutOverlay.tsx +69 -0
  144. package/src/client/canvas/SnapshotPanel.tsx +236 -0
  145. package/src/client/canvas/snap-guides.ts +170 -0
  146. package/src/client/canvas/use-node-drag.ts +51 -0
  147. package/src/client/canvas/use-node-resize.ts +59 -0
  148. package/src/client/canvas/use-pan-zoom.ts +191 -0
  149. package/src/client/ext-app/bridge.ts +542 -0
  150. package/src/client/icons.tsx +424 -0
  151. package/src/client/index.tsx +7 -0
  152. package/src/client/nodes/ContextNode.tsx +412 -0
  153. package/src/client/nodes/ExtAppFrame.tsx +509 -0
  154. package/src/client/nodes/FileNode.tsx +256 -0
  155. package/src/client/nodes/GroupNode.tsx +39 -0
  156. package/src/client/nodes/ImageNode.tsx +160 -0
  157. package/src/client/nodes/InlineFormatBar.tsx +169 -0
  158. package/src/client/nodes/InlineMarkdownEditor.tsx +123 -0
  159. package/src/client/nodes/LedgerNode.tsx +37 -0
  160. package/src/client/nodes/MarkdownNode.tsx +359 -0
  161. package/src/client/nodes/McpAppNode.tsx +85 -0
  162. package/src/client/nodes/MdFormatBar.tsx +109 -0
  163. package/src/client/nodes/PromptNode.tsx +597 -0
  164. package/src/client/nodes/ResponseNode.tsx +153 -0
  165. package/src/client/nodes/StatusNode.tsx +84 -0
  166. package/src/client/nodes/StatusSummary.tsx +38 -0
  167. package/src/client/nodes/TraceNode.tsx +120 -0
  168. package/src/client/nodes/WebpageNode.tsx +288 -0
  169. package/src/client/nodes/image-warnings.ts +95 -0
  170. package/src/client/nodes/inline-editor-commands.ts +37 -0
  171. package/src/client/nodes/md-format.ts +206 -0
  172. package/src/client/state/attention-bridge.ts +328 -0
  173. package/src/client/state/attention-store.ts +73 -0
  174. package/src/client/state/canvas-store.ts +631 -0
  175. package/src/client/state/intent-bridge.ts +315 -0
  176. package/src/client/state/sse-bridge.ts +965 -0
  177. package/src/client/theme/global.css +3173 -0
  178. package/src/client/theme/tokens.ts +72 -0
  179. package/src/client/types-shims.d.ts +5 -0
  180. package/src/client/types.ts +81 -0
  181. package/src/client/utils/ext-app-tool-result.ts +4 -0
  182. package/src/client/utils/placement.ts +4 -0
  183. package/src/client/utils/platform.ts +2 -0
  184. package/src/json-render/catalog.ts +256 -0
  185. package/src/json-render/charts/components.tsx +198 -0
  186. package/src/json-render/charts/definitions.ts +81 -0
  187. package/src/json-render/charts/extra-components.tsx +267 -0
  188. package/src/json-render/charts/extra-definitions.ts +145 -0
  189. package/src/json-render/renderer/index.css +174 -0
  190. package/src/json-render/renderer/index.tsx +86 -0
  191. package/src/json-render/schema.ts +62 -0
  192. package/src/json-render/server.ts +597 -0
  193. package/src/mcp/server.ts +1377 -0
  194. package/src/server/agent-context.ts +242 -0
  195. package/src/server/artifact-paths.ts +17 -0
  196. package/src/server/canvas-operations.ts +1279 -0
  197. package/src/server/canvas-provenance.ts +243 -0
  198. package/src/server/canvas-schema.ts +432 -0
  199. package/src/server/canvas-serialization.ts +95 -0
  200. package/src/server/canvas-state.ts +1134 -0
  201. package/src/server/canvas-validation.ts +114 -0
  202. package/src/server/chart-template.ts +449 -0
  203. package/src/server/code-graph.ts +370 -0
  204. package/src/server/context-cards.ts +31 -0
  205. package/src/server/diagram-presets.ts +71 -0
  206. package/src/server/ext-app-call-registry.ts +77 -0
  207. package/src/server/ext-app-tool-result.ts +4 -0
  208. package/src/server/file-watcher.ts +121 -0
  209. package/src/server/index.ts +647 -0
  210. package/src/server/mcp-app-candidate.ts +174 -0
  211. package/src/server/mcp-app-host.ts +814 -0
  212. package/src/server/mcp-app-runtime.ts +459 -0
  213. package/src/server/mutation-history.ts +350 -0
  214. package/src/server/placement.ts +125 -0
  215. package/src/server/server.ts +3846 -0
  216. package/src/server/spatial-analysis.ts +356 -0
  217. package/src/server/trace-manager.ts +333 -0
  218. package/src/server/web-artifacts/scripts/bundle-artifact.sh +167 -0
  219. package/src/server/web-artifacts/scripts/init-artifact.sh +426 -0
  220. package/src/server/web-artifacts/scripts/shadcn-components.tar.gz +0 -0
  221. package/src/server/web-artifacts.ts +442 -0
  222. package/src/server/webpage-node.ts +328 -0
  223. package/src/shared/auto-arrange.ts +439 -0
  224. package/src/shared/ext-app-tool-result.ts +76 -0
  225. package/src/shared/placement.ts +81 -0
  226. package/src/shared/semantic-attention.ts +598 -0
@@ -0,0 +1,154 @@
1
+ import { type CanvasEdge, type CanvasNodeState, type CanvasNodeUpdate, type CanvasSnapshot } from './canvas-state.js';
2
+ import { type GraphNodeInput, type JsonRenderNodeInput, type JsonRenderSpec } from '../json-render/server.js';
3
+ export type CanvasArrangeMode = 'grid' | 'column' | 'flow';
4
+ export type CanvasPinMode = 'set' | 'add' | 'remove';
5
+ interface CanvasAddNodeInput {
6
+ type: CanvasNodeState['type'];
7
+ title?: string;
8
+ content?: string;
9
+ data?: Record<string, unknown>;
10
+ x?: number;
11
+ y?: number;
12
+ width?: number;
13
+ height?: number;
14
+ defaultWidth?: number;
15
+ defaultHeight?: number;
16
+ fileMode?: 'path' | 'inline' | 'auto';
17
+ }
18
+ interface CanvasCreateGroupInput {
19
+ title?: string;
20
+ childIds?: string[];
21
+ x?: number;
22
+ y?: number;
23
+ width?: number;
24
+ height?: number;
25
+ color?: string;
26
+ childLayout?: CanvasArrangeMode;
27
+ }
28
+ export interface CanvasBatchOperation {
29
+ op: string;
30
+ assign?: string;
31
+ args?: Record<string, unknown>;
32
+ }
33
+ interface CanvasNodeLookupInput {
34
+ id?: string;
35
+ search?: string;
36
+ }
37
+ export declare function primeCanvasRuntimeBackends(options?: {
38
+ forceRehydrateExtApps?: boolean;
39
+ }): {
40
+ targetIds: string[];
41
+ };
42
+ export declare function syncCanvasRuntimeBackends(options?: {
43
+ forceRehydrateExtApps?: boolean;
44
+ alreadyPrimed?: boolean;
45
+ }): Promise<{
46
+ rehydrated: number;
47
+ failed: number;
48
+ }>;
49
+ export declare function validateCanvasNodePatch(patch: {
50
+ position?: {
51
+ x: number;
52
+ y: number;
53
+ };
54
+ size?: {
55
+ width: number;
56
+ height: number;
57
+ };
58
+ }): string | null;
59
+ export declare function scheduleCodeGraphRecompute(onComplete?: () => void): void;
60
+ export declare function addCanvasNode(input: CanvasAddNodeInput): {
61
+ id: string;
62
+ node: CanvasNodeState;
63
+ needsCodeGraphRecompute: boolean;
64
+ };
65
+ export declare function resolveCanvasNode(nodeRef: CanvasNodeLookupInput): {
66
+ ok: true;
67
+ node: CanvasNodeState;
68
+ } | {
69
+ ok: false;
70
+ error: string;
71
+ };
72
+ export declare function refreshCanvasWebpageNode(id: string, options?: {
73
+ url?: string;
74
+ }): Promise<{
75
+ ok: boolean;
76
+ id: string;
77
+ error?: string;
78
+ }>;
79
+ export declare function removeCanvasNode(id: string): {
80
+ removed: boolean;
81
+ needsCodeGraphRecompute: boolean;
82
+ };
83
+ export declare function arrangeCanvasNodes(layout: CanvasArrangeMode): {
84
+ arranged: number;
85
+ layout: CanvasArrangeMode;
86
+ };
87
+ export declare function applyCanvasNodeUpdates(updates: CanvasNodeUpdate[]): {
88
+ applied: number;
89
+ skipped: number;
90
+ };
91
+ export declare function setCanvasContextPins(nodeIds: string[], mode?: CanvasPinMode): {
92
+ count: number;
93
+ nodeIds: string[];
94
+ };
95
+ export declare function listCanvasSnapshots(): CanvasSnapshot[];
96
+ export declare function saveCanvasSnapshot(name: string): CanvasSnapshot | null;
97
+ export declare function restoreCanvasSnapshot(idOrName: string): Promise<{
98
+ ok: boolean;
99
+ }>;
100
+ export declare function deleteCanvasSnapshot(id: string): {
101
+ ok: boolean;
102
+ };
103
+ export declare function addCanvasEdge(input: {
104
+ from?: string;
105
+ to?: string;
106
+ fromSearch?: string;
107
+ toSearch?: string;
108
+ type: CanvasEdge['type'];
109
+ label?: string;
110
+ style?: CanvasEdge['style'];
111
+ animated?: boolean;
112
+ }): {
113
+ id: string;
114
+ from: string;
115
+ to: string;
116
+ };
117
+ export declare function removeCanvasEdge(id: string): {
118
+ removed: boolean;
119
+ };
120
+ export declare function createCanvasGroup(input: CanvasCreateGroupInput): {
121
+ id: string;
122
+ node: CanvasNodeState;
123
+ };
124
+ export declare function groupCanvasNodes(groupId: string, childIds: string[], options?: {
125
+ childLayout?: CanvasArrangeMode;
126
+ }): {
127
+ ok: boolean;
128
+ };
129
+ export declare function ungroupCanvasNodes(groupId: string): {
130
+ ok: boolean;
131
+ };
132
+ export declare function clearCanvas(): {
133
+ ok: boolean;
134
+ };
135
+ export declare function createCanvasJsonRenderNode(input: JsonRenderNodeInput): {
136
+ id: string;
137
+ url: string;
138
+ spec: JsonRenderSpec;
139
+ node: CanvasNodeState;
140
+ };
141
+ export declare function createCanvasGraphNode(input: GraphNodeInput): {
142
+ id: string;
143
+ url: string;
144
+ spec: JsonRenderSpec;
145
+ node: CanvasNodeState;
146
+ };
147
+ export declare function executeCanvasBatch(operations: CanvasBatchOperation[]): Promise<{
148
+ ok: boolean;
149
+ results: Array<Record<string, unknown>>;
150
+ refs: Record<string, unknown>;
151
+ failedIndex?: number;
152
+ error?: string;
153
+ }>;
154
+ export {};
@@ -0,0 +1,13 @@
1
+ export type CanvasNodeType = 'markdown' | 'mcp-app' | 'webpage' | 'json-render' | 'graph' | 'prompt' | 'response' | 'status' | 'context' | 'ledger' | 'trace' | 'file' | 'image' | 'group';
2
+ export type CanvasNodeProvenanceSourceKind = 'workspace-file' | 'webpage-url' | 'mcp-tool' | 'artifact-file' | 'image-url';
3
+ export type CanvasNodeRefreshStrategy = 'file-watch' | 'file-read-write' | 'image-reload' | 'webpage-refresh' | 'mcp-app-rehydrate' | 'artifact-reopen';
4
+ export interface CanvasNodeProvenance {
5
+ sourceKind: CanvasNodeProvenanceSourceKind;
6
+ sourceUri: string;
7
+ refreshStrategy: CanvasNodeRefreshStrategy;
8
+ snapshotContent: boolean;
9
+ syncedAt?: string;
10
+ details?: Record<string, unknown>;
11
+ }
12
+ export declare function inferCanvasNodeProvenance(nodeType: CanvasNodeType, data: Record<string, unknown>): CanvasNodeProvenance | null;
13
+ export declare function normalizeCanvasNodeData<T extends Record<string, unknown>>(nodeType: CanvasNodeType, data: T): T;
@@ -0,0 +1,49 @@
1
+ import { type JsonRenderComponentDescriptor } from '../json-render/catalog.js';
2
+ import { type GraphNodeInput, type JsonRenderSpec } from '../json-render/server.js';
3
+ export interface CanvasCreateField {
4
+ name: string;
5
+ type: string;
6
+ required: boolean;
7
+ description: string;
8
+ aliases?: string[];
9
+ }
10
+ export interface CanvasCreateTypeSchema {
11
+ type: string;
12
+ kind: 'node' | 'virtual-node';
13
+ description: string;
14
+ endpoint: string;
15
+ fields: CanvasCreateField[];
16
+ example: Record<string, unknown>;
17
+ notes?: string[];
18
+ }
19
+ export interface StructuredValidationResult {
20
+ ok: true;
21
+ type: 'json-render' | 'graph';
22
+ normalizedSpec: JsonRenderSpec;
23
+ summary: Record<string, unknown>;
24
+ }
25
+ declare const CANONICAL_GRAPH_TYPES: readonly ["line", "bar", "pie", "area", "scatter", "radar", "stacked-bar", "composed"];
26
+ type CanvasGraphType = typeof CANONICAL_GRAPH_TYPES[number];
27
+ export declare function describeCanvasSchema(): {
28
+ ok: true;
29
+ source: 'running-server';
30
+ version: string | null;
31
+ nodeTypes: CanvasCreateTypeSchema[];
32
+ jsonRender: {
33
+ rootShape: Record<string, string>;
34
+ components: JsonRenderComponentDescriptor[];
35
+ };
36
+ graph: {
37
+ graphTypes: CanvasGraphType[];
38
+ };
39
+ mcp: {
40
+ tools: string[];
41
+ resources: string[];
42
+ };
43
+ };
44
+ export declare function validateStructuredCanvasPayload(input: {
45
+ type: 'json-render' | 'graph';
46
+ spec?: unknown;
47
+ graph?: GraphNodeInput;
48
+ }): StructuredValidationResult;
49
+ export {};
@@ -0,0 +1,25 @@
1
+ import type { CanvasLayout, CanvasNodeState, ViewportState } from './canvas-state.js';
2
+ import { type CanvasNodeProvenance } from './canvas-provenance.js';
3
+ export interface SerializedCanvasNode extends CanvasNodeState {
4
+ title: string | null;
5
+ content: string | null;
6
+ path: string | null;
7
+ url: string | null;
8
+ provenance: CanvasNodeProvenance | null;
9
+ }
10
+ export interface SerializedCanvasLayout extends Omit<CanvasLayout, 'nodes'> {
11
+ nodes: SerializedCanvasNode[];
12
+ }
13
+ export declare function getCanvasNodeTitle(node: CanvasNodeState): string | null;
14
+ export declare function getCanvasNodeContent(node: CanvasNodeState): string | null;
15
+ export declare function serializeCanvasNode(node: CanvasNodeState): SerializedCanvasNode;
16
+ export declare function serializeCanvasLayout(layout: CanvasLayout): SerializedCanvasLayout;
17
+ export interface CanvasSummary {
18
+ totalNodes: number;
19
+ totalEdges: number;
20
+ nodesByType: Record<string, number>;
21
+ pinnedCount: number;
22
+ pinnedTitles: string[];
23
+ viewport: ViewportState;
24
+ }
25
+ export declare function buildCanvasSummary(): CanvasSummary;
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Server-side canvas state manager.
3
+ *
4
+ * Maintains the authoritative node layout so that:
5
+ * - Agent tools (Phase 3) can read/mutate canvas state
6
+ * - Client syncs bidirectionally (SSE for server→client, POST for client→server)
7
+ *
8
+ * Persistence: canvas state auto-saves to `.pmx-canvas/state.json` in the
9
+ * workspace root on every mutation (debounced). Auto-loads on `loadFromDisk()`.
10
+ */
11
+ export declare const PMX_CANVAS_DIR = ".pmx-canvas";
12
+ interface LoadFromDiskOptions {
13
+ clearExisting?: boolean;
14
+ }
15
+ export declare const IMAGE_MIME_MAP: Record<string, string>;
16
+ export interface CanvasSnapshot {
17
+ id: string;
18
+ name: string;
19
+ createdAt: string;
20
+ nodeCount: number;
21
+ edgeCount: number;
22
+ }
23
+ export interface CanvasNodeState {
24
+ id: string;
25
+ type: 'markdown' | 'mcp-app' | 'webpage' | 'json-render' | 'graph' | 'prompt' | 'response' | 'status' | 'context' | 'ledger' | 'trace' | 'file' | 'image' | 'group';
26
+ position: {
27
+ x: number;
28
+ y: number;
29
+ };
30
+ size: {
31
+ width: number;
32
+ height: number;
33
+ };
34
+ zIndex: number;
35
+ collapsed: boolean;
36
+ pinned: boolean;
37
+ dockPosition: 'left' | 'right' | null;
38
+ data: Record<string, unknown>;
39
+ }
40
+ export interface ViewportState {
41
+ x: number;
42
+ y: number;
43
+ scale: number;
44
+ }
45
+ export interface CanvasEdge {
46
+ id: string;
47
+ from: string;
48
+ to: string;
49
+ type: 'relation' | 'depends-on' | 'flow' | 'references';
50
+ label?: string;
51
+ style?: 'solid' | 'dashed' | 'dotted';
52
+ animated?: boolean;
53
+ }
54
+ export interface CanvasLayout {
55
+ viewport: ViewportState;
56
+ nodes: CanvasNodeState[];
57
+ edges: CanvasEdge[];
58
+ }
59
+ export interface CanvasNodeUpdate {
60
+ id: string;
61
+ position?: {
62
+ x: number;
63
+ y: number;
64
+ };
65
+ size?: {
66
+ width: number;
67
+ height: number;
68
+ };
69
+ collapsed?: boolean;
70
+ dockPosition?: 'left' | 'right' | null;
71
+ }
72
+ export type CanvasChangeType = 'pins' | 'nodes';
73
+ export interface MutationRecordInfo {
74
+ operationType: 'addNode' | 'updateNode' | 'removeNode' | 'addEdge' | 'removeEdge' | 'clear' | 'restoreSnapshot' | 'setPins' | 'arrange' | 'batch' | 'groupNodes' | 'ungroupNodes' | 'viewport';
75
+ description: string;
76
+ forward: () => void;
77
+ inverse: () => void;
78
+ }
79
+ interface GroupNodesOptions {
80
+ preservePositions?: boolean;
81
+ layout?: 'grid' | 'column' | 'flow';
82
+ keepGroupFrame?: boolean;
83
+ }
84
+ declare class CanvasStateManager {
85
+ private nodes;
86
+ private edges;
87
+ private _viewport;
88
+ private _contextPinnedNodeIds;
89
+ private _workspaceRoot;
90
+ private _changeListeners;
91
+ /** Register a listener for state changes. Used by MCP server to emit resource notifications. */
92
+ onChange(cb: (type: CanvasChangeType) => void): void;
93
+ private notifyChange;
94
+ private _mutationRecorder;
95
+ private _suppressRecording;
96
+ /** Register a mutation recorder. Used by mutation-history to capture undo/redo closures. */
97
+ onMutation(cb: (info: MutationRecordInfo) => void): void;
98
+ /** Run a function with mutation recording suppressed (for undo/redo replay and computed edges). */
99
+ withSuppressedRecording(fn: () => void): void;
100
+ /** Create a closure that runs with recording suppressed. */
101
+ private suppressed;
102
+ private recordMutation;
103
+ private applyResolvedGroupBounds;
104
+ private getGroupSnapshot;
105
+ private normalizeNode;
106
+ private reflowAllGroups;
107
+ private translateGroupChildren;
108
+ private recomputeParentGroupBounds;
109
+ private compactGroupChildren;
110
+ private _stateFilePath;
111
+ private _saveTimer;
112
+ /** Set the workspace root to enable auto-persistence. */
113
+ setWorkspaceRoot(workspaceRoot: string): void;
114
+ /**
115
+ * One-time migration: rename files from the pre-consolidation layout
116
+ * (`.pmx-canvas.json` + `.pmx-canvas-snapshots/`) into `.pmx-canvas/`.
117
+ * No-op when the new layout already exists.
118
+ */
119
+ private migrateLegacyLayout;
120
+ getWorkspaceRoot(): string;
121
+ private emptyPersistedState;
122
+ /** Load canvas state from disk. Call once on server startup. */
123
+ loadFromDisk(options?: LoadFromDiskOptions): boolean;
124
+ /** Debounced save — coalesces rapid mutations into a single disk write. */
125
+ private scheduleSave;
126
+ flushToDisk(): void;
127
+ /** Write current state to disk immediately. */
128
+ private saveToDisk;
129
+ private get snapshotsDir();
130
+ private applyPersistedState;
131
+ private readResolvedSnapshot;
132
+ /** Save current canvas state as a named snapshot. */
133
+ saveSnapshot(name: string): CanvasSnapshot | null;
134
+ /** List all saved snapshots. */
135
+ listSnapshots(): CanvasSnapshot[];
136
+ /** Restore canvas state from a snapshot. */
137
+ restoreSnapshot(idOrName: string): boolean;
138
+ /** Read a snapshot's data without restoring it (for diff). Resolves by ID or name. */
139
+ getSnapshotData(idOrName: string): {
140
+ name: string;
141
+ nodes: CanvasNodeState[];
142
+ edges: CanvasEdge[];
143
+ } | null;
144
+ /** Delete a snapshot. */
145
+ deleteSnapshot(id: string): boolean;
146
+ get viewport(): ViewportState;
147
+ addNode(node: CanvasNodeState): void;
148
+ addJsonRenderNode(node: CanvasNodeState): void;
149
+ addGraphNode(node: CanvasNodeState): void;
150
+ updateNode(id: string, patch: Partial<CanvasNodeState>): void;
151
+ removeNode(id: string): void;
152
+ getNode(id: string): CanvasNodeState | undefined;
153
+ addEdge(edge: CanvasEdge): boolean;
154
+ removeEdge(id: string): boolean;
155
+ getEdges(): CanvasEdge[];
156
+ getEdgesForNode(nodeId: string): CanvasEdge[];
157
+ private removeEdgesForNode;
158
+ getLayout(): CanvasLayout;
159
+ applyUpdates(updates: CanvasNodeUpdate[]): {
160
+ applied: number;
161
+ skipped: number;
162
+ };
163
+ setViewport(v: Partial<ViewportState>): void;
164
+ get contextPinnedNodeIds(): Set<string>;
165
+ setContextPins(nodeIds: string[]): void;
166
+ clearContextPins(): void;
167
+ /** Move child nodes into a group. Sets data.parentGroup on children and data.children on the group. */
168
+ groupNodes(groupId: string, childIds: string[], options?: GroupNodesOptions): boolean;
169
+ /** Remove all children from a group, clearing their parentGroup. */
170
+ ungroupNodes(groupId: string): boolean;
171
+ clear(): void;
172
+ }
173
+ export declare const canvasState: CanvasStateManager;
174
+ export {};
@@ -0,0 +1,33 @@
1
+ import type { CanvasLayout } from './canvas-state.js';
2
+ export interface CanvasValidationPair {
3
+ aId: string;
4
+ aTitle: string | null;
5
+ bId: string;
6
+ bTitle: string | null;
7
+ }
8
+ export interface CanvasContainmentIssue {
9
+ groupId: string;
10
+ groupTitle: string | null;
11
+ childId: string;
12
+ childTitle: string | null;
13
+ }
14
+ export interface CanvasValidationResult {
15
+ ok: boolean;
16
+ collisions: CanvasValidationPair[];
17
+ containments: CanvasContainmentIssue[];
18
+ containmentViolations: CanvasContainmentIssue[];
19
+ missingEdgeEndpoints: Array<{
20
+ edgeId: string;
21
+ from: string;
22
+ to: string;
23
+ }>;
24
+ summary: {
25
+ nodes: number;
26
+ edges: number;
27
+ collisions: number;
28
+ containments: number;
29
+ containmentViolations: number;
30
+ missingEdgeEndpoints: number;
31
+ };
32
+ }
33
+ export declare function validateCanvasLayout(layout: CanvasLayout): CanvasValidationResult;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Chart HTML template generator — produces self-contained ext-app HTML
3
+ * documents that render interactive Chart.js charts inside the canvas
4
+ * ExtAppFrame iframe.
5
+ *
6
+ * The generated HTML:
7
+ * 1. Renders immediately from inline data (no bridge needed)
8
+ * 2. Connects to host AppBridge via the embedded ext-app App SDK runtime
9
+ * 3. Accepts updated data via toolInput for re-rendering
10
+ */
11
+ export interface ChartDataset {
12
+ label: string;
13
+ values: number[];
14
+ color?: string;
15
+ }
16
+ export interface ChartConfig {
17
+ title: string;
18
+ chartType: 'bar' | 'line' | 'pie' | 'scatter' | 'doughnut' | 'radar';
19
+ labels: string[];
20
+ datasets: ChartDataset[];
21
+ xAxisLabel?: string;
22
+ yAxisLabel?: string;
23
+ stacked?: boolean;
24
+ }
25
+ /**
26
+ * Generate a self-contained HTML document that renders a Chart.js chart
27
+ * and optionally connects to the host via the ext-app App SDK.
28
+ */
29
+ export declare function generateChartHtml(config: ChartConfig): string;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Code Graph — Auto-dependency detection between file nodes.
3
+ *
4
+ * Parses imports from file node content and auto-creates `depends-on` edges
5
+ * between file nodes that reference each other. Updates live when files change.
6
+ *
7
+ * Supported import patterns:
8
+ * - JS/TS: import ... from '...', import('...'), require('...')
9
+ * - Python: import ..., from ... import ...
10
+ * - Go: import "...", import ( "..." )
11
+ * - Rust: mod ..., use crate::...
12
+ *
13
+ * Auto-edges are tagged with `_autoCodeGraph: true` in their metadata so they
14
+ * can be distinguished from manually created edges and cleaned up properly.
15
+ */
16
+ export interface CodeGraphEdge {
17
+ fromNodeId: string;
18
+ toNodeId: string;
19
+ fromPath: string;
20
+ toPath: string;
21
+ importSpecifier: string;
22
+ }
23
+ export interface CodeGraphSummary {
24
+ totalFileNodes: number;
25
+ totalAutoEdges: number;
26
+ nodes: {
27
+ id: string;
28
+ path: string;
29
+ title: string | null;
30
+ imports: string[];
31
+ importedBy: string[];
32
+ /** Number of files this node depends on */
33
+ outDegree: number;
34
+ /** Number of files that depend on this node */
35
+ inDegree: number;
36
+ }[];
37
+ /** Most-depended-on files (highest inDegree) */
38
+ centralFiles: {
39
+ path: string;
40
+ title: string | null;
41
+ inDegree: number;
42
+ }[];
43
+ /** Files with no dependencies in or out (isolated) */
44
+ isolatedFiles: {
45
+ path: string;
46
+ title: string | null;
47
+ }[];
48
+ }
49
+ /**
50
+ * Extract import specifiers from file content based on file extension.
51
+ */
52
+ export declare function parseImports(content: string, filePath: string): string[];
53
+ /**
54
+ * Recompute all auto-edges for the code graph.
55
+ * Called when file nodes are added/removed or file content changes.
56
+ *
57
+ * Returns the list of edges that were created/maintained.
58
+ */
59
+ export declare function recomputeCodeGraph(): CodeGraphEdge[];
60
+ /**
61
+ * Build a summary of the code graph for the MCP resource.
62
+ */
63
+ export declare function buildCodeGraphSummary(): CodeGraphSummary;
64
+ /**
65
+ * Format code graph summary as human-readable text for MCP.
66
+ */
67
+ export declare function formatCodeGraph(summary: CodeGraphSummary): string;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Context cards — standalone version.
3
+ *
4
+ * In the full PMX project this reads project memory and context doc definitions.
5
+ * In the standalone canvas, we expose the types and a simplified builder that
6
+ * returns an empty card list (the host application can populate cards via the API).
7
+ */
8
+ export type WorkbenchContextCardCategory = 'profile' | 'planning' | 'tooling' | 'memory';
9
+ export interface WorkbenchContextCard {
10
+ key: string;
11
+ label: string;
12
+ summary: string;
13
+ path: string;
14
+ exists: boolean;
15
+ required: boolean;
16
+ staleDays: number;
17
+ mtimeMs: number | null;
18
+ state: 'loaded' | 'missing' | 'stale' | 'invalid';
19
+ sourceKind: 'workspace' | 'global';
20
+ note: string | null;
21
+ injectMode: 'startup';
22
+ category: WorkbenchContextCardCategory;
23
+ }
24
+ export declare function buildWorkbenchContextCards(_workspaceRoot?: string): WorkbenchContextCard[];
@@ -0,0 +1,28 @@
1
+ import type { ExternalMcpTransportConfig } from './mcp-app-runtime.js';
2
+ export declare const EXCALIDRAW_MCP_URL = "https://mcp.excalidraw.com/mcp";
3
+ export declare const EXCALIDRAW_SERVER_NAME = "Excalidraw";
4
+ export declare const EXCALIDRAW_CREATE_VIEW_TOOL = "create_view";
5
+ export declare const EXCALIDRAW_MCP_TRANSPORT: ExternalMcpTransportConfig;
6
+ export interface DiagramPresetOpenInput {
7
+ elements: unknown;
8
+ title?: string;
9
+ x?: number;
10
+ y?: number;
11
+ width?: number;
12
+ height?: number;
13
+ }
14
+ export interface ExcalidrawOpenMcpAppInput {
15
+ transport: ExternalMcpTransportConfig;
16
+ toolName: string;
17
+ serverName: string;
18
+ toolArguments: {
19
+ elements: string;
20
+ };
21
+ title?: string;
22
+ x?: number;
23
+ y?: number;
24
+ width?: number;
25
+ height?: number;
26
+ }
27
+ export declare function normalizeExcalidrawElements(elements: unknown): string;
28
+ export declare function buildExcalidrawOpenMcpAppInput(input: DiagramPresetOpenInput): ExcalidrawOpenMcpAppInput;
@@ -0,0 +1,16 @@
1
+ export interface ExtAppCallIdentity {
2
+ toolCallId?: string;
3
+ serverName?: string;
4
+ toolName?: string;
5
+ }
6
+ export declare function getExtAppCallKey(serverName?: string, toolName?: string): string | null;
7
+ export declare class ExtAppCallRegistry {
8
+ private activeIds;
9
+ private keyById;
10
+ private idsByKey;
11
+ register(identity: ExtAppCallIdentity): string | null;
12
+ has(toolCallId?: string): boolean;
13
+ resolve(identity: ExtAppCallIdentity): string | null;
14
+ complete(identity: ExtAppCallIdentity): string | null;
15
+ clear(): void;
16
+ }
@@ -0,0 +1 @@
1
+ export { normalizeExtAppToolResult, type NormalizeExtAppToolResultInput, } from '../shared/ext-app-tool-result.js';
@@ -0,0 +1,16 @@
1
+ /**
2
+ * File watcher for file-type canvas nodes.
3
+ *
4
+ * Monitors files on disk and pushes content updates to the canvas
5
+ * when they change. This enables real-time file viewing: the agent
6
+ * edits a file, the canvas node updates automatically.
7
+ */
8
+ /** Register a callback for when a watched file changes. */
9
+ export declare function onFileNodeChanged(cb: (nodeId: string) => void): void;
10
+ /** Start watching a file for a given node. */
11
+ export declare function watchFileForNode(nodeId: string, filePath: string): void;
12
+ /** Stop watching a file for a given node. */
13
+ export declare function unwatchFileForNode(nodeId: string, filePath?: string): void;
14
+ /** Stop all watchers. */
15
+ export declare function unwatchAll(): void;
16
+ export declare function rewatchAllFileNodes(): void;