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.
- package/CHANGELOG.md +38 -0
- package/LICENSE +21 -0
- package/Readme.md +865 -0
- package/dist/canvas/global.css +3173 -0
- package/dist/canvas/index.js +183 -0
- package/dist/json-render/index.css +2 -0
- package/dist/json-render/index.js +389 -0
- package/dist/types/cli/agent.d.ts +13 -0
- package/dist/types/cli/index.d.ts +2 -0
- package/dist/types/cli/watch.d.ts +5 -0
- package/dist/types/client/App.d.ts +1 -0
- package/dist/types/client/canvas/AttentionHistory.d.ts +1 -0
- package/dist/types/client/canvas/AttentionToast.d.ts +1 -0
- package/dist/types/client/canvas/CanvasNode.d.ts +8 -0
- package/dist/types/client/canvas/CanvasViewport.d.ts +8 -0
- package/dist/types/client/canvas/CommandPalette.d.ts +4 -0
- package/dist/types/client/canvas/ContextMenu.d.ts +24 -0
- package/dist/types/client/canvas/ContextPinBar.d.ts +1 -0
- package/dist/types/client/canvas/ContextPinHud.d.ts +1 -0
- package/dist/types/client/canvas/DockedNode.d.ts +4 -0
- package/dist/types/client/canvas/EdgeLayer.d.ts +8 -0
- package/dist/types/client/canvas/ExpandedNodeOverlay.d.ts +1 -0
- package/dist/types/client/canvas/FocusFieldLayer.d.ts +1 -0
- package/dist/types/client/canvas/Minimap.d.ts +23 -0
- package/dist/types/client/canvas/SelectionBar.d.ts +1 -0
- package/dist/types/client/canvas/ShortcutOverlay.d.ts +3 -0
- package/dist/types/client/canvas/SnapshotPanel.d.ts +7 -0
- package/dist/types/client/canvas/snap-guides.d.ts +23 -0
- package/dist/types/client/canvas/use-node-drag.d.ts +15 -0
- package/dist/types/client/canvas/use-node-resize.d.ts +15 -0
- package/dist/types/client/canvas/use-pan-zoom.d.ts +16 -0
- package/dist/types/client/ext-app/bridge.d.ts +161 -0
- package/dist/types/client/icons.d.ts +70 -0
- package/dist/types/client/index.d.ts +1 -0
- package/dist/types/client/nodes/ContextNode.d.ts +34 -0
- package/dist/types/client/nodes/ExtAppFrame.d.ts +18 -0
- package/dist/types/client/nodes/FileNode.d.ts +5 -0
- package/dist/types/client/nodes/GroupNode.d.ts +6 -0
- package/dist/types/client/nodes/ImageNode.d.ts +10 -0
- package/dist/types/client/nodes/InlineFormatBar.d.ts +7 -0
- package/dist/types/client/nodes/InlineMarkdownEditor.d.ts +14 -0
- package/dist/types/client/nodes/LedgerNode.d.ts +4 -0
- package/dist/types/client/nodes/MarkdownNode.d.ts +6 -0
- package/dist/types/client/nodes/McpAppNode.d.ts +4 -0
- package/dist/types/client/nodes/MdFormatBar.d.ts +8 -0
- package/dist/types/client/nodes/PromptNode.d.ts +5 -0
- package/dist/types/client/nodes/ResponseNode.d.ts +5 -0
- package/dist/types/client/nodes/StatusNode.d.ts +4 -0
- package/dist/types/client/nodes/StatusSummary.d.ts +4 -0
- package/dist/types/client/nodes/TraceNode.d.ts +4 -0
- package/dist/types/client/nodes/WebpageNode.d.ts +5 -0
- package/dist/types/client/nodes/image-warnings.d.ts +6 -0
- package/dist/types/client/nodes/inline-editor-commands.d.ts +11 -0
- package/dist/types/client/nodes/md-format.d.ts +25 -0
- package/dist/types/client/state/attention-bridge.d.ts +3 -0
- package/dist/types/client/state/attention-store.d.ts +25 -0
- package/dist/types/client/state/canvas-store.d.ts +74 -0
- package/dist/types/client/state/intent-bridge.d.ts +158 -0
- package/dist/types/client/state/sse-bridge.d.ts +5 -0
- package/dist/types/client/theme/tokens.d.ts +27 -0
- package/dist/types/client/types.d.ts +40 -0
- package/dist/types/client/utils/ext-app-tool-result.d.ts +1 -0
- package/dist/types/client/utils/placement.d.ts +1 -0
- package/dist/types/client/utils/platform.d.ts +2 -0
- package/dist/types/json-render/catalog.d.ts +815 -0
- package/dist/types/json-render/charts/components.d.ts +54 -0
- package/dist/types/json-render/charts/definitions.d.ts +103 -0
- package/dist/types/json-render/charts/extra-components.d.ts +58 -0
- package/dist/types/json-render/charts/extra-definitions.d.ts +181 -0
- package/dist/types/json-render/renderer/index.d.ts +16 -0
- package/dist/types/json-render/schema.d.ts +46 -0
- package/dist/types/json-render/server.d.ts +55 -0
- package/dist/types/mcp/server.d.ts +22 -0
- package/dist/types/server/agent-context.d.ts +21 -0
- package/dist/types/server/artifact-paths.d.ts +3 -0
- package/dist/types/server/canvas-operations.d.ts +154 -0
- package/dist/types/server/canvas-provenance.d.ts +13 -0
- package/dist/types/server/canvas-schema.d.ts +49 -0
- package/dist/types/server/canvas-serialization.d.ts +25 -0
- package/dist/types/server/canvas-state.d.ts +174 -0
- package/dist/types/server/canvas-validation.d.ts +33 -0
- package/dist/types/server/chart-template.d.ts +29 -0
- package/dist/types/server/code-graph.d.ts +67 -0
- package/dist/types/server/context-cards.d.ts +24 -0
- package/dist/types/server/diagram-presets.d.ts +28 -0
- package/dist/types/server/ext-app-call-registry.d.ts +16 -0
- package/dist/types/server/ext-app-tool-result.d.ts +1 -0
- package/dist/types/server/file-watcher.d.ts +16 -0
- package/dist/types/server/index.d.ts +243 -0
- package/dist/types/server/mcp-app-candidate.d.ts +25 -0
- package/dist/types/server/mcp-app-host.d.ts +65 -0
- package/dist/types/server/mcp-app-runtime.d.ts +47 -0
- package/dist/types/server/mutation-history.d.ts +105 -0
- package/dist/types/server/placement.d.ts +37 -0
- package/dist/types/server/server.d.ts +103 -0
- package/dist/types/server/spatial-analysis.d.ts +87 -0
- package/dist/types/server/trace-manager.d.ts +48 -0
- package/dist/types/server/web-artifacts.d.ts +50 -0
- package/dist/types/server/webpage-node.d.ts +25 -0
- package/dist/types/shared/auto-arrange.d.ts +29 -0
- package/dist/types/shared/ext-app-tool-result.d.ts +9 -0
- package/dist/types/shared/placement.d.ts +26 -0
- package/dist/types/shared/semantic-attention.d.ts +97 -0
- package/package.json +109 -0
- package/skills/data-analysis/SKILL.md +324 -0
- package/skills/doc-coauthoring/SKILL.md +375 -0
- package/skills/frontend-design/SKILL.md +45 -0
- package/skills/json-render-codegen/SKILL.md +112 -0
- package/skills/json-render-core/SKILL.md +265 -0
- package/skills/json-render-ink/SKILL.md +273 -0
- package/skills/json-render-mcp/SKILL.md +132 -0
- package/skills/json-render-react/SKILL.md +264 -0
- package/skills/json-render-shadcn/SKILL.md +159 -0
- package/skills/playwright-cli/SKILL.md +67 -0
- package/skills/pmx-canvas/SKILL.md +668 -0
- package/skills/pmx-canvas/evals/evals.json +186 -0
- package/skills/pmx-canvas-testing/SKILL.md +78 -0
- package/skills/published-consumer-e2e/SKILL.md +43 -0
- package/skills/published-consumer-e2e/scripts/run-published-consumer-e2e.sh +241 -0
- package/skills/web-artifacts-builder/SKILL.md +80 -0
- package/skills/web-artifacts-builder/scripts/bundle-artifact.sh +167 -0
- package/skills/web-artifacts-builder/scripts/init-artifact.sh +425 -0
- package/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/web-design-guidelines/SKILL.md +39 -0
- package/src/cli/agent.ts +2144 -0
- package/src/cli/index.ts +622 -0
- package/src/cli/watch.ts +88 -0
- package/src/client/App.tsx +507 -0
- package/src/client/canvas/AttentionHistory.tsx +81 -0
- package/src/client/canvas/AttentionToast.tsx +19 -0
- package/src/client/canvas/CanvasNode.tsx +363 -0
- package/src/client/canvas/CanvasViewport.tsx +590 -0
- package/src/client/canvas/CommandPalette.tsx +302 -0
- package/src/client/canvas/ContextMenu.tsx +601 -0
- package/src/client/canvas/ContextPinBar.tsx +25 -0
- package/src/client/canvas/ContextPinHud.tsx +22 -0
- package/src/client/canvas/DockedNode.tsx +66 -0
- package/src/client/canvas/EdgeLayer.tsx +280 -0
- package/src/client/canvas/ExpandedNodeOverlay.tsx +260 -0
- package/src/client/canvas/FocusFieldLayer.tsx +107 -0
- package/src/client/canvas/Minimap.tsx +301 -0
- package/src/client/canvas/SelectionBar.tsx +69 -0
- package/src/client/canvas/ShortcutOverlay.tsx +69 -0
- package/src/client/canvas/SnapshotPanel.tsx +236 -0
- package/src/client/canvas/snap-guides.ts +170 -0
- package/src/client/canvas/use-node-drag.ts +51 -0
- package/src/client/canvas/use-node-resize.ts +59 -0
- package/src/client/canvas/use-pan-zoom.ts +191 -0
- package/src/client/ext-app/bridge.ts +542 -0
- package/src/client/icons.tsx +424 -0
- package/src/client/index.tsx +7 -0
- package/src/client/nodes/ContextNode.tsx +412 -0
- package/src/client/nodes/ExtAppFrame.tsx +509 -0
- package/src/client/nodes/FileNode.tsx +256 -0
- package/src/client/nodes/GroupNode.tsx +39 -0
- package/src/client/nodes/ImageNode.tsx +160 -0
- package/src/client/nodes/InlineFormatBar.tsx +169 -0
- package/src/client/nodes/InlineMarkdownEditor.tsx +123 -0
- package/src/client/nodes/LedgerNode.tsx +37 -0
- package/src/client/nodes/MarkdownNode.tsx +359 -0
- package/src/client/nodes/McpAppNode.tsx +85 -0
- package/src/client/nodes/MdFormatBar.tsx +109 -0
- package/src/client/nodes/PromptNode.tsx +597 -0
- package/src/client/nodes/ResponseNode.tsx +153 -0
- package/src/client/nodes/StatusNode.tsx +84 -0
- package/src/client/nodes/StatusSummary.tsx +38 -0
- package/src/client/nodes/TraceNode.tsx +120 -0
- package/src/client/nodes/WebpageNode.tsx +288 -0
- package/src/client/nodes/image-warnings.ts +95 -0
- package/src/client/nodes/inline-editor-commands.ts +37 -0
- package/src/client/nodes/md-format.ts +206 -0
- package/src/client/state/attention-bridge.ts +328 -0
- package/src/client/state/attention-store.ts +73 -0
- package/src/client/state/canvas-store.ts +631 -0
- package/src/client/state/intent-bridge.ts +315 -0
- package/src/client/state/sse-bridge.ts +965 -0
- package/src/client/theme/global.css +3173 -0
- package/src/client/theme/tokens.ts +72 -0
- package/src/client/types-shims.d.ts +5 -0
- package/src/client/types.ts +81 -0
- package/src/client/utils/ext-app-tool-result.ts +4 -0
- package/src/client/utils/placement.ts +4 -0
- package/src/client/utils/platform.ts +2 -0
- package/src/json-render/catalog.ts +256 -0
- package/src/json-render/charts/components.tsx +198 -0
- package/src/json-render/charts/definitions.ts +81 -0
- package/src/json-render/charts/extra-components.tsx +267 -0
- package/src/json-render/charts/extra-definitions.ts +145 -0
- package/src/json-render/renderer/index.css +174 -0
- package/src/json-render/renderer/index.tsx +86 -0
- package/src/json-render/schema.ts +62 -0
- package/src/json-render/server.ts +597 -0
- package/src/mcp/server.ts +1377 -0
- package/src/server/agent-context.ts +242 -0
- package/src/server/artifact-paths.ts +17 -0
- package/src/server/canvas-operations.ts +1279 -0
- package/src/server/canvas-provenance.ts +243 -0
- package/src/server/canvas-schema.ts +432 -0
- package/src/server/canvas-serialization.ts +95 -0
- package/src/server/canvas-state.ts +1134 -0
- package/src/server/canvas-validation.ts +114 -0
- package/src/server/chart-template.ts +449 -0
- package/src/server/code-graph.ts +370 -0
- package/src/server/context-cards.ts +31 -0
- package/src/server/diagram-presets.ts +71 -0
- package/src/server/ext-app-call-registry.ts +77 -0
- package/src/server/ext-app-tool-result.ts +4 -0
- package/src/server/file-watcher.ts +121 -0
- package/src/server/index.ts +647 -0
- package/src/server/mcp-app-candidate.ts +174 -0
- package/src/server/mcp-app-host.ts +814 -0
- package/src/server/mcp-app-runtime.ts +459 -0
- package/src/server/mutation-history.ts +350 -0
- package/src/server/placement.ts +125 -0
- package/src/server/server.ts +3846 -0
- package/src/server/spatial-analysis.ts +356 -0
- package/src/server/trace-manager.ts +333 -0
- package/src/server/web-artifacts/scripts/bundle-artifact.sh +167 -0
- package/src/server/web-artifacts/scripts/init-artifact.sh +426 -0
- package/src/server/web-artifacts/scripts/shadcn-components.tar.gz +0 -0
- package/src/server/web-artifacts.ts +442 -0
- package/src/server/webpage-node.ts +328 -0
- package/src/shared/auto-arrange.ts +439 -0
- package/src/shared/ext-app-tool-result.ts +76 -0
- package/src/shared/placement.ts +81 -0
- package/src/shared/semantic-attention.ts +598 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spatial Semantics Layer for PMX Canvas
|
|
3
|
+
*
|
|
4
|
+
* Analyzes the spatial arrangement of nodes on the canvas to extract
|
|
5
|
+
* meaningful relationships: proximity clusters, reading order, and
|
|
6
|
+
* neighborhood context around pinned nodes.
|
|
7
|
+
*
|
|
8
|
+
* This makes the canvas promise — "spatial arrangement is communication" —
|
|
9
|
+
* actually real for agents. Instead of raw x/y coordinates, agents get
|
|
10
|
+
* semantic clusters, ordered context, and implicit human intent.
|
|
11
|
+
*/
|
|
12
|
+
import type { CanvasNodeState, CanvasEdge } from './canvas-state.js';
|
|
13
|
+
export interface SpatialCluster {
|
|
14
|
+
/** Auto-generated cluster ID */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Node IDs in this cluster */
|
|
17
|
+
nodeIds: string[];
|
|
18
|
+
/** Human-readable label derived from node titles/types */
|
|
19
|
+
label: string;
|
|
20
|
+
/** Centroid of the cluster */
|
|
21
|
+
centroid: {
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
};
|
|
25
|
+
/** Bounding box of all nodes in the cluster */
|
|
26
|
+
bounds: {
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
width: number;
|
|
30
|
+
height: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export interface SpatialNeighbor {
|
|
34
|
+
id: string;
|
|
35
|
+
type: string;
|
|
36
|
+
title: string | null;
|
|
37
|
+
distance: number;
|
|
38
|
+
}
|
|
39
|
+
export interface NodeSpatialInfo {
|
|
40
|
+
id: string;
|
|
41
|
+
type: string;
|
|
42
|
+
title: string | null;
|
|
43
|
+
content: string | null;
|
|
44
|
+
clusterId: string | null;
|
|
45
|
+
/** Reading order index (top-left to bottom-right) */
|
|
46
|
+
readingOrder: number;
|
|
47
|
+
}
|
|
48
|
+
export interface SpatialContext {
|
|
49
|
+
/** Total nodes on canvas */
|
|
50
|
+
totalNodes: number;
|
|
51
|
+
/** Detected proximity clusters */
|
|
52
|
+
clusters: SpatialCluster[];
|
|
53
|
+
/** All nodes in spatial reading order (top-left to bottom-right) */
|
|
54
|
+
nodesInReadingOrder: NodeSpatialInfo[];
|
|
55
|
+
/** For each pinned node, nearby unpinned nodes (the implicit context) */
|
|
56
|
+
pinnedNeighborhoods: {
|
|
57
|
+
pinnedNodeId: string;
|
|
58
|
+
pinnedNodeTitle: string | null;
|
|
59
|
+
neighbors: SpatialNeighbor[];
|
|
60
|
+
}[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Detect proximity clusters using single-linkage clustering.
|
|
64
|
+
* Two nodes are "close" if their edge-to-edge gap is within the threshold.
|
|
65
|
+
*
|
|
66
|
+
* Default threshold: 200px (roughly "visually grouped" on a typical canvas).
|
|
67
|
+
*/
|
|
68
|
+
export declare function detectClusters(nodes: CanvasNodeState[], proximityThreshold?: number): SpatialCluster[];
|
|
69
|
+
/**
|
|
70
|
+
* Find the nearest unpinned nodes to each pinned node.
|
|
71
|
+
*/
|
|
72
|
+
export declare function findNeighborhoods(nodes: CanvasNodeState[], pinnedIds: Set<string>, maxNeighbors?: number, maxDistance?: number): SpatialContext['pinnedNeighborhoods'];
|
|
73
|
+
/**
|
|
74
|
+
* Full-text search across node titles and content.
|
|
75
|
+
* Returns matching nodes with relevance score.
|
|
76
|
+
*/
|
|
77
|
+
export declare function searchNodes(nodes: CanvasNodeState[], query: string): {
|
|
78
|
+
id: string;
|
|
79
|
+
type: string;
|
|
80
|
+
title: string | null;
|
|
81
|
+
snippet: string;
|
|
82
|
+
score: number;
|
|
83
|
+
}[];
|
|
84
|
+
/**
|
|
85
|
+
* Build the complete spatial context for the canvas.
|
|
86
|
+
*/
|
|
87
|
+
export declare function buildSpatialContext(nodes: CanvasNodeState[], _edges: CanvasEdge[], pinnedIds: Set<string>): SpatialContext;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TraceManager — creates trace nodes and flow edges on the canvas
|
|
3
|
+
* as the agent calls tools and spawns subagents.
|
|
4
|
+
*
|
|
5
|
+
* Server-side singleton consumed by chat-view event wiring.
|
|
6
|
+
*/
|
|
7
|
+
declare class TraceManager {
|
|
8
|
+
private _enabled;
|
|
9
|
+
private traceNodeIds;
|
|
10
|
+
private lastTraceNodeId;
|
|
11
|
+
private toolCallToNodeId;
|
|
12
|
+
private traceOrigin;
|
|
13
|
+
private chainIndex;
|
|
14
|
+
get enabled(): boolean;
|
|
15
|
+
setEnabled(value: boolean): void;
|
|
16
|
+
onToolStart(payload: {
|
|
17
|
+
name: string;
|
|
18
|
+
toolCallId?: string;
|
|
19
|
+
activity?: string;
|
|
20
|
+
mcpServerName?: string | null;
|
|
21
|
+
mcpToolName?: string | null;
|
|
22
|
+
}): void;
|
|
23
|
+
onToolComplete(payload: {
|
|
24
|
+
name: string;
|
|
25
|
+
toolCallId?: string;
|
|
26
|
+
success?: boolean;
|
|
27
|
+
activity?: string;
|
|
28
|
+
error?: string;
|
|
29
|
+
}): void;
|
|
30
|
+
onSubagentStarted(payload: {
|
|
31
|
+
agentName: string;
|
|
32
|
+
agentDisplayName?: string;
|
|
33
|
+
}): void;
|
|
34
|
+
onSubagentCompleted(payload: {
|
|
35
|
+
agentName: string;
|
|
36
|
+
agentDisplayName?: string;
|
|
37
|
+
durationMs?: number;
|
|
38
|
+
failed?: boolean;
|
|
39
|
+
}): void;
|
|
40
|
+
clearTrace(): void;
|
|
41
|
+
getTraceNodeCount(): number;
|
|
42
|
+
private getOrigin;
|
|
43
|
+
private nextPosition;
|
|
44
|
+
private evictIfNeeded;
|
|
45
|
+
private broadcastUpdate;
|
|
46
|
+
}
|
|
47
|
+
export declare const traceManager: TraceManager;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface WebArtifactBuildInput {
|
|
2
|
+
title: string;
|
|
3
|
+
appTsx: string;
|
|
4
|
+
indexCss?: string;
|
|
5
|
+
mainTsx?: string;
|
|
6
|
+
indexHtml?: string;
|
|
7
|
+
files?: Record<string, string>;
|
|
8
|
+
projectPath?: string;
|
|
9
|
+
outputPath?: string;
|
|
10
|
+
initScriptPath?: string;
|
|
11
|
+
bundleScriptPath?: string;
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface WebArtifactBuildOutput {
|
|
15
|
+
filePath: string;
|
|
16
|
+
fileSize: number;
|
|
17
|
+
projectPath: string;
|
|
18
|
+
metadata: Record<string, unknown>;
|
|
19
|
+
logs?: {
|
|
20
|
+
stdout?: WebArtifactLogSummary;
|
|
21
|
+
stderr?: WebArtifactLogSummary;
|
|
22
|
+
};
|
|
23
|
+
stdout?: string;
|
|
24
|
+
stderr?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface WebArtifactLogSummary {
|
|
27
|
+
lineCount: number;
|
|
28
|
+
excerpt: string[];
|
|
29
|
+
truncated: boolean;
|
|
30
|
+
suppressedNoiseCount: number;
|
|
31
|
+
}
|
|
32
|
+
export interface WebArtifactCanvasOpenResult {
|
|
33
|
+
nodeId: string;
|
|
34
|
+
url: string;
|
|
35
|
+
}
|
|
36
|
+
export interface WebArtifactCanvasBuildResult extends WebArtifactBuildOutput {
|
|
37
|
+
openedInCanvas: boolean;
|
|
38
|
+
nodeId?: string;
|
|
39
|
+
url?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function resolveWorkspacePath(pathLike: string, cwd?: string): string;
|
|
42
|
+
export declare function resolveWebArtifactScriptPath(kind: 'init' | 'bundle'): string;
|
|
43
|
+
export declare function executeWebArtifactBuild(input: WebArtifactBuildInput): Promise<WebArtifactBuildOutput>;
|
|
44
|
+
export declare function openWebArtifactInCanvas(input: {
|
|
45
|
+
title: string;
|
|
46
|
+
filePath: string;
|
|
47
|
+
}): WebArtifactCanvasOpenResult;
|
|
48
|
+
export declare function buildWebArtifactOnCanvas(input: WebArtifactBuildInput & {
|
|
49
|
+
openInCanvas?: boolean;
|
|
50
|
+
}): Promise<WebArtifactCanvasBuildResult>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const WEBPAGE_NODE_DEFAULT_SIZE: {
|
|
2
|
+
readonly width: 520;
|
|
3
|
+
readonly height: 420;
|
|
4
|
+
};
|
|
5
|
+
export interface WebpageSnapshot {
|
|
6
|
+
url: string;
|
|
7
|
+
pageTitle: string | null;
|
|
8
|
+
description: string | null;
|
|
9
|
+
imageUrl: string | null;
|
|
10
|
+
content: string;
|
|
11
|
+
excerpt: string;
|
|
12
|
+
fetchedAt: string;
|
|
13
|
+
statusCode: number;
|
|
14
|
+
contentType: string | null;
|
|
15
|
+
frameBlocked: boolean;
|
|
16
|
+
frameBlockedReason: string | null;
|
|
17
|
+
}
|
|
18
|
+
export declare function normalizeWebpageUrl(rawUrl: string): string;
|
|
19
|
+
export declare function summarizeWebpageContent(data: Record<string, unknown>, maxLength?: number): string;
|
|
20
|
+
export declare function fetchWebpageSnapshot(inputUrl: string): Promise<WebpageSnapshot>;
|
|
21
|
+
export declare function getWebpageFetchErrorDetails(error: unknown): {
|
|
22
|
+
message: string;
|
|
23
|
+
statusCode: number | null;
|
|
24
|
+
contentType: string | null;
|
|
25
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ArrangePosition {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
}
|
|
5
|
+
export interface ArrangeSize {
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ArrangeNode {
|
|
10
|
+
id: string;
|
|
11
|
+
type: string;
|
|
12
|
+
position: ArrangePosition;
|
|
13
|
+
size: ArrangeSize;
|
|
14
|
+
pinned: boolean;
|
|
15
|
+
dockPosition: 'left' | 'right' | null;
|
|
16
|
+
data: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface ArrangeEdge {
|
|
19
|
+
id: string;
|
|
20
|
+
from: string;
|
|
21
|
+
to: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AutoArrangeResult {
|
|
24
|
+
nodePositions: Map<string, ArrangePosition>;
|
|
25
|
+
groupBounds: Map<string, ArrangePosition & ArrangeSize>;
|
|
26
|
+
}
|
|
27
|
+
type ArrangeMode = 'grid' | 'graph';
|
|
28
|
+
export declare function computeAutoArrange(allNodes: ArrangeNode[], allEdges: ArrangeEdge[], mode: ArrangeMode): AutoArrangeResult;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
export interface NormalizeExtAppToolResultInput {
|
|
3
|
+
result: unknown;
|
|
4
|
+
success?: boolean;
|
|
5
|
+
error?: string;
|
|
6
|
+
content?: string;
|
|
7
|
+
detailedContent?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function normalizeExtAppToolResult(input: NormalizeExtAppToolResultInput): CallToolResult;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface CanvasPlacementRect {
|
|
2
|
+
position: {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
};
|
|
6
|
+
size: {
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function rectsOverlap(a: {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
}, aw: number, ah: number, b: CanvasPlacementRect, gap: number): boolean;
|
|
15
|
+
export declare function overlapsAny(pos: {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
}, width: number, height: number, existing: CanvasPlacementRect[], gap: number): boolean;
|
|
19
|
+
export declare function findBlocker(pos: {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
}, width: number, height: number, existing: CanvasPlacementRect[], gap: number): CanvasPlacementRect | undefined;
|
|
23
|
+
export declare function findOpenCanvasPosition(existing: CanvasPlacementRect[], width: number, height: number, gap?: number): {
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { CanvasEdge, CanvasLayout, CanvasNodeState } from '../client/types.js';
|
|
2
|
+
import { type SpatialContext } from '../server/spatial-analysis.js';
|
|
3
|
+
export type SemanticWatchEventType = 'context-pin' | 'connect' | 'remove' | 'group' | 'move-end';
|
|
4
|
+
export declare const ALL_SEMANTIC_WATCH_EVENT_TYPES: SemanticWatchEventType[];
|
|
5
|
+
export interface SemanticWatchNodeSummary {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string | null;
|
|
8
|
+
nodeType: CanvasNodeState['type'];
|
|
9
|
+
}
|
|
10
|
+
export interface SemanticWatchEdgeSummary {
|
|
11
|
+
id: string;
|
|
12
|
+
edgeType: CanvasEdge['type'];
|
|
13
|
+
fromId: string;
|
|
14
|
+
toId: string;
|
|
15
|
+
fromTitle: string | null;
|
|
16
|
+
toTitle: string | null;
|
|
17
|
+
}
|
|
18
|
+
export interface ContextPinWatchEvent {
|
|
19
|
+
type: 'context-pin';
|
|
20
|
+
timestamp?: string;
|
|
21
|
+
sessionId?: string;
|
|
22
|
+
added: SemanticWatchNodeSummary[];
|
|
23
|
+
removed: SemanticWatchNodeSummary[];
|
|
24
|
+
}
|
|
25
|
+
export interface ConnectWatchEvent {
|
|
26
|
+
type: 'connect';
|
|
27
|
+
timestamp?: string;
|
|
28
|
+
sessionId?: string;
|
|
29
|
+
edges: SemanticWatchEdgeSummary[];
|
|
30
|
+
}
|
|
31
|
+
export interface RemoveWatchEvent {
|
|
32
|
+
type: 'remove';
|
|
33
|
+
timestamp?: string;
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
nodes: SemanticWatchNodeSummary[];
|
|
36
|
+
edges: SemanticWatchEdgeSummary[];
|
|
37
|
+
}
|
|
38
|
+
export interface GroupCreatedSummary {
|
|
39
|
+
id: string;
|
|
40
|
+
title: string | null;
|
|
41
|
+
childCount: number;
|
|
42
|
+
}
|
|
43
|
+
export interface GroupUpdatedSummary {
|
|
44
|
+
id: string;
|
|
45
|
+
title: string | null;
|
|
46
|
+
addedChildIds: string[];
|
|
47
|
+
removedChildIds: string[];
|
|
48
|
+
childCount: number;
|
|
49
|
+
}
|
|
50
|
+
export interface GroupWatchEvent {
|
|
51
|
+
type: 'group';
|
|
52
|
+
timestamp?: string;
|
|
53
|
+
sessionId?: string;
|
|
54
|
+
created: GroupCreatedSummary[];
|
|
55
|
+
updated: GroupUpdatedSummary[];
|
|
56
|
+
}
|
|
57
|
+
export interface MoveEndNodeSummary extends SemanticWatchNodeSummary {
|
|
58
|
+
reasons: string[];
|
|
59
|
+
}
|
|
60
|
+
export interface MoveEndWatchEvent {
|
|
61
|
+
type: 'move-end';
|
|
62
|
+
timestamp?: string;
|
|
63
|
+
sessionId?: string;
|
|
64
|
+
nodes: MoveEndNodeSummary[];
|
|
65
|
+
}
|
|
66
|
+
export type SemanticWatchEvent = ContextPinWatchEvent | ConnectWatchEvent | RemoveWatchEvent | GroupWatchEvent | MoveEndWatchEvent;
|
|
67
|
+
export interface SseMessage {
|
|
68
|
+
event: string;
|
|
69
|
+
data: unknown;
|
|
70
|
+
id?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface SemanticAttentionRegion {
|
|
73
|
+
id: string;
|
|
74
|
+
primaryNodeId: string;
|
|
75
|
+
nodeIds: string[];
|
|
76
|
+
}
|
|
77
|
+
export interface SemanticAttentionSnapshot {
|
|
78
|
+
layout: CanvasLayout | null;
|
|
79
|
+
pinnedNodeIds: string[];
|
|
80
|
+
primaryFocusNodeIds: string[];
|
|
81
|
+
secondaryFocusNodeIds: string[];
|
|
82
|
+
regions: SemanticAttentionRegion[];
|
|
83
|
+
spatial: SpatialContext | null;
|
|
84
|
+
}
|
|
85
|
+
export declare function formatCompactWatchEvent(event: SemanticWatchEvent): string;
|
|
86
|
+
export declare class SemanticWatchReducer {
|
|
87
|
+
private currentLayout;
|
|
88
|
+
private currentPins;
|
|
89
|
+
private previousSpatial;
|
|
90
|
+
setInitialPins(nodeIds: string[]): void;
|
|
91
|
+
getAttentionSnapshot(): SemanticAttentionSnapshot;
|
|
92
|
+
handleMessage(message: SseMessage): SemanticWatchEvent[];
|
|
93
|
+
private handleContextPinsChanged;
|
|
94
|
+
private handleLayoutUpdate;
|
|
95
|
+
private buildGroupEvent;
|
|
96
|
+
private buildMoveEndEvent;
|
|
97
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pmx-canvas",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Spatial canvas workbench for coding agents — infinite 2D canvas with agent-native CLI, MCP integration, nodes, edges, file watching, and snapshots",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./src/server/index.ts",
|
|
7
|
+
"module": "./src/server/index.ts",
|
|
8
|
+
"types": "./dist/types/server/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/types/server/index.d.ts",
|
|
12
|
+
"default": "./src/server/index.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"pmx-canvas": "src/cli/index.ts"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"src/",
|
|
20
|
+
"skills/",
|
|
21
|
+
"dist/canvas/",
|
|
22
|
+
"dist/json-render/",
|
|
23
|
+
"dist/types/",
|
|
24
|
+
"Readme.md",
|
|
25
|
+
"CHANGELOG.md",
|
|
26
|
+
"LICENSE"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"dev": "bun run src/cli/index.ts",
|
|
30
|
+
"dev:demo": "bun run src/cli/index.ts --demo",
|
|
31
|
+
"dev:portless": "portless run --name pmx --app-port 4313 bun run src/cli/index.ts --no-open --port=4313",
|
|
32
|
+
"dev:portless:demo": "portless run --name pmx --app-port 4313 bun run src/cli/index.ts --no-open --port=4313 --demo",
|
|
33
|
+
"build:client": "bun build src/client/index.tsx --outdir dist/canvas --minify && cp src/client/theme/global.css dist/canvas/global.css",
|
|
34
|
+
"build:json-render": "bash scripts/build-json-render.sh",
|
|
35
|
+
"build:types": "tsc -p tsconfig.types.json",
|
|
36
|
+
"build": "bun run build:client && bun run build:json-render && bun run build:types",
|
|
37
|
+
"start": "bun run src/cli/index.ts --no-open",
|
|
38
|
+
"pack:dry-run": "bun pm pack --dry-run",
|
|
39
|
+
"release:check": "bun run build && bun run typecheck && bun run test:all",
|
|
40
|
+
"release:smoke": "bash scripts/release-smoke.sh",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"test": "PMX_CANVAS_DISABLE_BROWSER_OPEN=1 bun test tests/unit",
|
|
43
|
+
"test:unit": "PMX_CANVAS_DISABLE_BROWSER_OPEN=1 bun test tests/unit",
|
|
44
|
+
"test:coverage": "bun test tests/unit --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir coverage",
|
|
45
|
+
"test:web-canvas": "PMX_CANVAS_DISABLE_BROWSER_OPEN=1 bun run build && PMX_CANVAS_DISABLE_BROWSER_OPEN=1 bun x playwright test",
|
|
46
|
+
"test:e2e": "bun run test:web-canvas",
|
|
47
|
+
"test:web-canvas:headed": "bun run build && bun x playwright test --headed",
|
|
48
|
+
"test:e2e:headed": "bun run test:web-canvas:headed",
|
|
49
|
+
"test:all": "bun run test && bun run test:web-canvas",
|
|
50
|
+
"test:install-browsers": "bun x playwright install chromium",
|
|
51
|
+
"validate:agent-skills": "bash scripts/validate-agent-skill-mirrors.sh",
|
|
52
|
+
"prepublishOnly": "bun run build && bun run typecheck"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@joplin/turndown-plugin-gfm": "^1.0.64",
|
|
56
|
+
"@json-render/core": "^0.14.1",
|
|
57
|
+
"@json-render/mcp": "^0.14.1",
|
|
58
|
+
"@json-render/react": "^0.14.1",
|
|
59
|
+
"@json-render/shadcn": "^0.14.1",
|
|
60
|
+
"@modelcontextprotocol/ext-apps": "^1.3.1",
|
|
61
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
62
|
+
"@preact/signals": "^2.0.0",
|
|
63
|
+
"@types/turndown": "^5.0.6",
|
|
64
|
+
"marked": "^15.0.0",
|
|
65
|
+
"preact": "^10.25.0",
|
|
66
|
+
"react": "^19.2.0",
|
|
67
|
+
"react-dom": "^19.2.0",
|
|
68
|
+
"recharts": "^3.2.1",
|
|
69
|
+
"turndown": "^7.2.4",
|
|
70
|
+
"zod": "^4.3.6"
|
|
71
|
+
},
|
|
72
|
+
"devDependencies": {
|
|
73
|
+
"@playwright/test": "^1.58.2",
|
|
74
|
+
"@tailwindcss/cli": "^4.1.18",
|
|
75
|
+
"@types/bun": "latest",
|
|
76
|
+
"@types/react": "^19.2.14",
|
|
77
|
+
"@types/react-dom": "^19.2.3",
|
|
78
|
+
"tailwindcss": "^4.1.18",
|
|
79
|
+
"tw-animate-css": "^1.4.0",
|
|
80
|
+
"typescript": "^5.7.0"
|
|
81
|
+
},
|
|
82
|
+
"keywords": [
|
|
83
|
+
"canvas",
|
|
84
|
+
"agent",
|
|
85
|
+
"workbench",
|
|
86
|
+
"spatial",
|
|
87
|
+
"coding-agent",
|
|
88
|
+
"claude-code",
|
|
89
|
+
"codex",
|
|
90
|
+
"cursor",
|
|
91
|
+
"windsurf",
|
|
92
|
+
"mcp",
|
|
93
|
+
"model-context-protocol",
|
|
94
|
+
"ai-tools"
|
|
95
|
+
],
|
|
96
|
+
"author": "pskoett",
|
|
97
|
+
"license": "MIT",
|
|
98
|
+
"repository": {
|
|
99
|
+
"type": "git",
|
|
100
|
+
"url": "https://github.com/pskoett/pmx-canvas"
|
|
101
|
+
},
|
|
102
|
+
"bugs": {
|
|
103
|
+
"url": "https://github.com/pskoett/pmx-canvas/issues"
|
|
104
|
+
},
|
|
105
|
+
"homepage": "https://github.com/pskoett/pmx-canvas#readme",
|
|
106
|
+
"engines": {
|
|
107
|
+
"bun": ">=1.3.12"
|
|
108
|
+
}
|
|
109
|
+
}
|