pmx-canvas 0.9.2 → 0.9.3
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 +9 -3
- package/.github/extensions/pmx-canvas/runtime.json +1 -1
- package/CHANGELOG.md +12 -0
- package/dist/canvas/global.css +12 -17
- package/dist/canvas/index.js +58 -58
- package/dist/canvas/mcp-app.html +75 -80
- package/dist/types/client/canvas/submit-without-navigation.d.ts +3 -0
- package/dist/types/client/state/intent-bridge.d.ts +0 -3
- package/dist/types/client/state/presence-store.d.ts +3 -3
- package/dist/types/client/types.d.ts +1 -1
- package/dist/types/server/canvas-state.d.ts +2 -0
- package/dist/types/server/index.d.ts +2 -2
- package/dist/types/server/knowledge-lifecycle.d.ts +11 -2
- package/dist/types/server/lifecycle-status.d.ts +3 -1
- package/dist/types/server/tour-control.d.ts +6 -3
- package/docs/cli.md +10 -1
- package/docs/design/Chrome.dc.html +1 -0
- package/docs/design.md +3 -1
- package/docs/mcp.md +5 -1
- package/docs/node-types.md +3 -0
- package/docs/plans/plan-019-post-0.9-roadmap.md +68 -9
- package/docs/sdk.md +7 -0
- package/package.json +1 -1
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/extension.mjs +9 -3
- package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
- package/plugins/pmx-canvas/plugin.json +1 -1
- package/plugins/pmx-canvas/runtime.json +1 -1
- package/skills/pmx-canvas/SKILL.md +4 -4
- package/skills/pmx-canvas/references/github-copilot-app-adapter.md +2 -2
- package/skills/pmx-canvas/references/installing-pmx-canvas.md +6 -6
- package/src/client/canvas/BoardCopyDialog.tsx +2 -1
- package/src/client/canvas/KnowledgeDialog.tsx +3 -0
- package/src/client/canvas/LifecyclePanel.tsx +4 -0
- package/src/client/canvas/RelationPresetsDialog.tsx +2 -0
- package/src/client/canvas/submit-without-navigation.ts +14 -0
- package/src/client/state/canvas-store.ts +12 -24
- package/src/client/state/intent-bridge.ts +0 -6
- package/src/client/state/presence-store.ts +3 -3
- package/src/client/state/sse-bridge.ts +11 -6
- package/src/client/theme/global.css +12 -17
- package/src/server/canvas-state.ts +10 -0
- package/src/server/index.ts +10 -30
- package/src/server/knowledge-lifecycle.ts +66 -0
- package/src/server/lifecycle-status.ts +79 -7
- package/src/server/operations/ops/lifecycle.ts +3 -7
- package/src/server/operations/ops/nodes.ts +2 -5
- package/src/server/operations/ops/viewport.ts +3 -7
- package/src/server/server.ts +13 -10
- package/src/server/tour-control.ts +17 -8
|
@@ -21,14 +21,22 @@ export interface TourStepResult {
|
|
|
21
21
|
stop: TourStop;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
export interface TourState {
|
|
25
|
+
tour: Tour;
|
|
26
|
+
derived: boolean;
|
|
27
|
+
position: number | null;
|
|
28
|
+
}
|
|
29
|
+
|
|
24
30
|
let cursor: { boardGeneration: number; tour: string; index: number } | null = null;
|
|
25
31
|
|
|
26
|
-
export function currentTour():
|
|
27
|
-
|
|
32
|
+
export function currentTour(): TourState {
|
|
33
|
+
const saved = canvasState.getTour();
|
|
34
|
+
const tour = saved ?? derivedTour(canvasState.nodeGeometry());
|
|
35
|
+
return { tour, derived: !saved, position: tourPosition(tour) };
|
|
28
36
|
}
|
|
29
37
|
|
|
30
38
|
/** The stop the tour is on for the active board, or null when not touring. */
|
|
31
|
-
|
|
39
|
+
function tourPosition(tour: Tour): number | null {
|
|
32
40
|
if (cursor && (cursor.boardGeneration !== canvasState.boardGeneration || cursor.tour !== JSON.stringify(tour))) {
|
|
33
41
|
cursor = null;
|
|
34
42
|
}
|
|
@@ -37,9 +45,8 @@ export function tourPosition(tour: Tour = currentTour()): number | null {
|
|
|
37
45
|
|
|
38
46
|
/** Move the shared cursor. `next`/`previous` clamp at the ends; an explicit index must exist. */
|
|
39
47
|
export function goToTourStop(step: TourStep): TourStepResult {
|
|
40
|
-
const tour = currentTour();
|
|
48
|
+
const { tour, position: at } = currentTour();
|
|
41
49
|
const { stops } = tour;
|
|
42
|
-
const at = tourPosition(tour);
|
|
43
50
|
if (stops.length === 0) {
|
|
44
51
|
throw new OperationError('This board has no tour stops. Save a tour or add groups.', 400);
|
|
45
52
|
}
|
|
@@ -67,13 +74,15 @@ export function moveCamera(input: unknown): { stop: TourStop; viewport: Camera }
|
|
|
67
74
|
throw new OperationError('Give exactly one of nodeId, rect {x,y,width,height} or viewport {x,y,scale}.', 400);
|
|
68
75
|
}
|
|
69
76
|
const stop = parsed.data;
|
|
70
|
-
|
|
71
|
-
|
|
77
|
+
const nodes = 'nodeId' in stop.target ? canvasState.nodeGeometry() : [];
|
|
78
|
+
const target = stop.target;
|
|
79
|
+
if ('nodeId' in target && !nodes.some((node) => node.id === target.nodeId)) {
|
|
80
|
+
throw new OperationError(`Node "${target.nodeId}" not found.`, 404);
|
|
72
81
|
}
|
|
73
82
|
const size = getClientViewportSize() ?? { width: 1440, height: 900 };
|
|
74
83
|
let viewport: Camera;
|
|
75
84
|
try {
|
|
76
|
-
viewport = resolveStop(stop,
|
|
85
|
+
viewport = resolveStop(stop, nodes, size.width, size.height);
|
|
77
86
|
} catch (error) {
|
|
78
87
|
throw new OperationError(error instanceof Error ? error.message : String(error), 400);
|
|
79
88
|
}
|