project-graph-mcp 2.3.2 → 2.4.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/package.json +3 -2
- package/src/analysis/analysis-cache.ctx +9 -0
- package/src/analysis/analysis-cache.js +1 -1
- package/src/analysis/complexity.ctx +6 -0
- package/src/analysis/complexity.js +1 -1
- package/src/analysis/custom-rules.ctx +14 -0
- package/src/analysis/custom-rules.js +1 -1
- package/src/analysis/db-analysis.ctx +7 -0
- package/src/analysis/db-analysis.js +1 -1
- package/src/analysis/dead-code.ctx +6 -0
- package/src/analysis/dead-code.js +1 -1
- package/src/analysis/full-analysis.ctx +9 -0
- package/src/analysis/full-analysis.js +1 -1
- package/src/analysis/jsdoc-checker.ctx +10 -0
- package/src/analysis/jsdoc-checker.js +1 -1
- package/src/analysis/jsdoc-generator.ctx +9 -0
- package/src/analysis/jsdoc-generator.js +1 -1
- package/src/analysis/large-files.ctx +6 -0
- package/src/analysis/large-files.js +1 -1
- package/src/analysis/outdated-patterns.ctx +7 -0
- package/src/analysis/outdated-patterns.js +1 -1
- package/src/analysis/similar-functions.ctx +6 -0
- package/src/analysis/similar-functions.js +1 -1
- package/src/analysis/test-annotations.ctx +11 -0
- package/src/analysis/test-annotations.js +1 -1
- package/src/analysis/type-checker.ctx +6 -0
- package/src/analysis/type-checker.js +1 -1
- package/src/analysis/undocumented.ctx +8 -0
- package/src/analysis/undocumented.js +1 -1
- package/src/cli/cli-handlers.ctx +7 -0
- package/src/cli/cli-handlers.js +1 -1
- package/src/cli/cli.ctx +6 -0
- package/src/cli/cli.js +1 -1
- package/src/compact/ai-context.ctx +6 -0
- package/src/compact/ai-context.js +1 -1
- package/src/compact/compact-migrate.ctx +8 -0
- package/src/compact/compact-migrate.js +1 -1
- package/src/compact/compact.ctx +11 -0
- package/src/compact/compact.js +1 -1
- package/src/compact/compress.ctx +7 -0
- package/src/compact/compress.js +1 -1
- package/src/compact/ctx-resolver.ctx +2 -0
- package/src/compact/ctx-resolver.js +1 -1
- package/src/compact/ctx-to-jsdoc.ctx +11 -0
- package/src/compact/ctx-to-jsdoc.js +1 -1
- package/src/compact/doc-dialect.ctx +11 -0
- package/src/compact/doc-dialect.js +2 -2
- package/src/compact/expand.ctx +14 -0
- package/src/compact/expand.js +1 -1
- package/src/compact/framework-references.ctx +7 -0
- package/src/compact/framework-references.js +1 -1
- package/src/compact/instructions.ctx +6 -0
- package/src/compact/instructions.js +1 -1
- package/src/compact/jsdoc-builder.ctx +4 -0
- package/src/compact/jsdoc-builder.js +1 -1
- package/src/compact/mode-config.ctx +8 -0
- package/src/compact/mode-config.js +1 -1
- package/src/compact/split-declarations.ctx +6 -0
- package/src/compact/split-declarations.js +1 -1
- package/src/compact/validate-pipeline.ctx +12 -0
- package/src/compact/validate-pipeline.js +1 -1
- package/src/core/event-bus.ctx +9 -0
- package/src/core/event-bus.js +1 -1
- package/src/core/file-walker.ctx +1 -0
- package/src/core/file-walker.js +1 -1
- package/src/core/filters.ctx +12 -0
- package/src/core/filters.js +1 -1
- package/src/core/graph-builder.ctx +7 -0
- package/src/core/graph-builder.js +1 -1
- package/src/core/parser.ctx +12 -0
- package/src/core/parser.js +1 -1
- package/src/core/utils.ctx +1 -0
- package/src/core/utils.js +1 -1
- package/src/core/workspace.ctx +7 -0
- package/src/core/workspace.js +1 -1
- package/src/lang/lang-go.ctx +8 -0
- package/src/lang/lang-go.js +1 -1
- package/src/lang/lang-python.ctx +5 -0
- package/src/lang/lang-python.js +1 -1
- package/src/lang/lang-sql.ctx +10 -0
- package/src/lang/lang-sql.js +1 -1
- package/src/lang/lang-typescript.ctx +6 -0
- package/src/lang/lang-typescript.js +1 -1
- package/src/lang/lang-utils.ctx +5 -0
- package/src/lang/lang-utils.js +1 -1
- package/src/mcp/mcp-server.ctx +6 -0
- package/src/mcp/mcp-server.js +1 -1
- package/src/mcp/tool-defs.ctx +2 -0
- package/src/mcp/tool-defs.js +1 -1
- package/src/mcp/tools.ctx +13 -0
- package/src/mcp/tools.js +1 -1
- package/src/network/backend-lifecycle.ctx +10 -0
- package/src/network/backend-lifecycle.js +1 -1
- package/src/network/backend.ctx +5 -0
- package/src/network/backend.js +1 -1
- package/src/network/local-gateway.ctx +9 -0
- package/src/network/local-gateway.js +1 -1
- package/src/network/mdns.ctx +6 -0
- package/src/network/mdns.js +1 -1
- package/src/network/server.ctx +2 -0
- package/src/network/server.js +2 -2
- package/src/network/web-server.ctx +17 -0
- package/src/network/web-server.js +2 -2
- package/web/follow-controller.js +94 -25
- package/web/panels/dep-graph.js +207 -21
- package/project-graph-mcp-2.3.0.tgz +0 -0
- package/vendor/symbiote-node/CHANGELOG.md +0 -31
- package/vendor/symbiote-node/LICENSE +0 -21
- package/vendor/symbiote-node/README.md +0 -206
- package/vendor/symbiote-node/canvas/AutoLayout.js +0 -725
- package/vendor/symbiote-node/canvas/Breadcrumb/Breadcrumb.css.js +0 -73
- package/vendor/symbiote-node/canvas/Breadcrumb/Breadcrumb.js +0 -93
- package/vendor/symbiote-node/canvas/Breadcrumb/Breadcrumb.tpl.js +0 -9
- package/vendor/symbiote-node/canvas/CanvasConnectionRenderer.js +0 -962
- package/vendor/symbiote-node/canvas/ConnectionRenderer.js +0 -1468
- package/vendor/symbiote-node/canvas/FlowSimulator.js +0 -323
- package/vendor/symbiote-node/canvas/ForceLayout.js +0 -189
- package/vendor/symbiote-node/canvas/ForceWorker.js +0 -1325
- package/vendor/symbiote-node/canvas/GraphTabs/GraphTabs.css.js +0 -97
- package/vendor/symbiote-node/canvas/GraphTabs/GraphTabs.js +0 -176
- package/vendor/symbiote-node/canvas/GraphTabs/GraphTabs.tpl.js +0 -12
- package/vendor/symbiote-node/canvas/LODManager.js +0 -88
- package/vendor/symbiote-node/canvas/Minimap/Minimap.css.js +0 -71
- package/vendor/symbiote-node/canvas/Minimap/Minimap.js +0 -207
- package/vendor/symbiote-node/canvas/Minimap/Minimap.tpl.js +0 -9
- package/vendor/symbiote-node/canvas/NodeCanvas/NodeCanvas.css.js +0 -261
- package/vendor/symbiote-node/canvas/NodeCanvas/NodeCanvas.js +0 -1840
- package/vendor/symbiote-node/canvas/NodeCanvas/NodeCanvas.tpl.js +0 -22
- package/vendor/symbiote-node/canvas/NodeSearch/NodeSearch.css.js +0 -97
- package/vendor/symbiote-node/canvas/NodeSearch/NodeSearch.js +0 -132
- package/vendor/symbiote-node/canvas/NodeSearch/NodeSearch.tpl.js +0 -21
- package/vendor/symbiote-node/canvas/NodeViewManager.js +0 -584
- package/vendor/symbiote-node/canvas/PinExpansion.js +0 -131
- package/vendor/symbiote-node/canvas/PseudoConnection.js +0 -80
- package/vendor/symbiote-node/canvas/SubgraphManager.js +0 -201
- package/vendor/symbiote-node/canvas/SubgraphRouter.js +0 -443
- package/vendor/symbiote-node/canvas/ViewportActions.js +0 -446
- package/vendor/symbiote-node/core/Connection.js +0 -45
- package/vendor/symbiote-node/core/Editor.js +0 -451
- package/vendor/symbiote-node/core/Frame.js +0 -31
- package/vendor/symbiote-node/core/GraphMermaid.js +0 -348
- package/vendor/symbiote-node/core/GraphText.js +0 -210
- package/vendor/symbiote-node/core/Node.js +0 -143
- package/vendor/symbiote-node/core/Portal.js +0 -104
- package/vendor/symbiote-node/core/Socket.js +0 -185
- package/vendor/symbiote-node/core/SubgraphNode.js +0 -125
- package/vendor/symbiote-node/engine/AgentUICommands.js +0 -100
- package/vendor/symbiote-node/engine/Executor.js +0 -371
- package/vendor/symbiote-node/engine/Graph.js +0 -314
- package/vendor/symbiote-node/engine/GraphServer.js +0 -353
- package/vendor/symbiote-node/engine/HandlerLoader.js +0 -145
- package/vendor/symbiote-node/engine/History.js +0 -83
- package/vendor/symbiote-node/engine/Lifecycle.js +0 -118
- package/vendor/symbiote-node/engine/Persistence.js +0 -84
- package/vendor/symbiote-node/engine/Registry.js +0 -264
- package/vendor/symbiote-node/engine/SocketTypes.js +0 -79
- package/vendor/symbiote-node/engine/cli.js +0 -404
- package/vendor/symbiote-node/engine/index.js +0 -56
- package/vendor/symbiote-node/engine/nanoid.js +0 -28
- package/vendor/symbiote-node/engine/package.json +0 -26
- package/vendor/symbiote-node/engine/packs/ai/beat-detect.handler.js +0 -215
- package/vendor/symbiote-node/engine/packs/ai/content-adapt.handler.js +0 -238
- package/vendor/symbiote-node/engine/packs/ai/face-detect.handler.js +0 -287
- package/vendor/symbiote-node/engine/packs/ai/grok-generate.handler.js +0 -565
- package/vendor/symbiote-node/engine/packs/ai/kling-lipsync.handler.js +0 -414
- package/vendor/symbiote-node/engine/packs/ai/lesson-generate.handler.js +0 -343
- package/vendor/symbiote-node/engine/packs/ai/opencode.handler.js +0 -164
- package/vendor/symbiote-node/engine/packs/ai/replicate-lipsync.handler.js +0 -341
- package/vendor/symbiote-node/engine/packs/ai/tts.handler.js +0 -241
- package/vendor/symbiote-node/engine/packs/ai/whisper.handler.js +0 -191
- package/vendor/symbiote-node/engine/packs/data/db-query.handler.js +0 -67
- package/vendor/symbiote-node/engine/packs/data/news-accumulate.handler.js +0 -281
- package/vendor/symbiote-node/engine/packs/data/personas.handler.js +0 -160
- package/vendor/symbiote-node/engine/packs/data/prompt-loader.handler.js +0 -193
- package/vendor/symbiote-node/engine/packs/data/roles.handler.js +0 -216
- package/vendor/symbiote-node/engine/packs/data/rss-feed.handler.js +0 -244
- package/vendor/symbiote-node/engine/packs/debug/inject.handler.js +0 -52
- package/vendor/symbiote-node/engine/packs/flow/agent.handler.js +0 -73
- package/vendor/symbiote-node/engine/packs/flow/if.handler.js +0 -107
- package/vendor/symbiote-node/engine/packs/flow/loop.handler.js +0 -58
- package/vendor/symbiote-node/engine/packs/flow/merge.handler.js +0 -60
- package/vendor/symbiote-node/engine/packs/flow/retry.handler.js +0 -65
- package/vendor/symbiote-node/engine/packs/flow/switch.handler.js +0 -64
- package/vendor/symbiote-node/engine/packs/flow/wait-all.handler.js +0 -39
- package/vendor/symbiote-node/engine/packs/io/http-request.handler.js +0 -82
- package/vendor/symbiote-node/engine/packs/io/read-file.handler.js +0 -60
- package/vendor/symbiote-node/engine/packs/io/write-file.handler.js +0 -63
- package/vendor/symbiote-node/engine/packs/transform/anchor-match.handler.js +0 -494
- package/vendor/symbiote-node/engine/packs/transform/effects-skeleton.handler.js +0 -417
- package/vendor/symbiote-node/engine/packs/transform/json-parse.handler.js +0 -43
- package/vendor/symbiote-node/engine/packs/transform/lipsync-select.handler.js +0 -339
- package/vendor/symbiote-node/engine/packs/transform/riopla-adapt.handler.js +0 -432
- package/vendor/symbiote-node/engine/packs/transform/set.handler.js +0 -57
- package/vendor/symbiote-node/engine/packs/transform/template-builder.handler.js +0 -134
- package/vendor/symbiote-node/engine/packs/transform/template.handler.js +0 -79
- package/vendor/symbiote-node/engine/packs/transform/timeline-build.handler.js +0 -399
- package/vendor/symbiote-node/engine/packs/util/delay.handler.js +0 -39
- package/vendor/symbiote-node/engine/packs/util/log.handler.js +0 -44
- package/vendor/symbiote-node/engine/packs/video-pack.js +0 -323
- package/vendor/symbiote-node/index.js +0 -103
- package/vendor/symbiote-node/inspector/InspectorPanel/InspectorPanel.css.js +0 -361
- package/vendor/symbiote-node/inspector/InspectorPanel/InspectorPanel.js +0 -332
- package/vendor/symbiote-node/inspector/InspectorPanel/InspectorPanel.tpl.js +0 -96
- package/vendor/symbiote-node/inspector/TemplatePreview/TemplatePreview.css.js +0 -104
- package/vendor/symbiote-node/inspector/TemplatePreview/TemplatePreview.js +0 -133
- package/vendor/symbiote-node/inspector/TemplatePreview/TemplatePreview.tpl.js +0 -33
- package/vendor/symbiote-node/interactions/ConnectFlow.js +0 -307
- package/vendor/symbiote-node/interactions/Drag.js +0 -102
- package/vendor/symbiote-node/interactions/Selector.js +0 -132
- package/vendor/symbiote-node/interactions/SnapGrid.js +0 -65
- package/vendor/symbiote-node/interactions/Zoom.js +0 -140
- package/vendor/symbiote-node/layout/ActionZone/ActionZone.css.js +0 -88
- package/vendor/symbiote-node/layout/ActionZone/ActionZone.js +0 -254
- package/vendor/symbiote-node/layout/ActionZone/ActionZone.tpl.js +0 -11
- package/vendor/symbiote-node/layout/Layout/Layout.css.js +0 -88
- package/vendor/symbiote-node/layout/Layout/Layout.js +0 -622
- package/vendor/symbiote-node/layout/Layout/Layout.tpl.js +0 -25
- package/vendor/symbiote-node/layout/LayoutNode/LayoutNode.css.js +0 -293
- package/vendor/symbiote-node/layout/LayoutNode/LayoutNode.js +0 -467
- package/vendor/symbiote-node/layout/LayoutNode/LayoutNode.tpl.js +0 -33
- package/vendor/symbiote-node/layout/LayoutPreview/LayoutPreview.css.js +0 -46
- package/vendor/symbiote-node/layout/LayoutPreview/LayoutPreview.js +0 -102
- package/vendor/symbiote-node/layout/LayoutPreview/LayoutPreview.tpl.js +0 -6
- package/vendor/symbiote-node/layout/LayoutRouter/LayoutRouter.js +0 -156
- package/vendor/symbiote-node/layout/LayoutRouter/routerSync.js +0 -250
- package/vendor/symbiote-node/layout/LayoutSidebar/LayoutSidebar.css.js +0 -379
- package/vendor/symbiote-node/layout/LayoutSidebar/LayoutSidebar.js +0 -263
- package/vendor/symbiote-node/layout/LayoutSidebar/LayoutSidebar.tpl.js +0 -20
- package/vendor/symbiote-node/layout/LayoutSidebar/SidebarSection.js +0 -183
- package/vendor/symbiote-node/layout/LayoutTree.js +0 -246
- package/vendor/symbiote-node/layout/PanelMenu/PanelMenu.css.js +0 -43
- package/vendor/symbiote-node/layout/PanelMenu/PanelMenu.js +0 -89
- package/vendor/symbiote-node/layout/PanelMenu/PanelMenu.tpl.js +0 -14
- package/vendor/symbiote-node/layout/index.js +0 -16
- package/vendor/symbiote-node/menu/ContextMenu/ContextMenu.css.js +0 -61
- package/vendor/symbiote-node/menu/ContextMenu/ContextMenu.js +0 -79
- package/vendor/symbiote-node/menu/ContextMenu/ContextMenu.tpl.js +0 -19
- package/vendor/symbiote-node/node/CtrlItem/CtrlItem.css.js +0 -41
- package/vendor/symbiote-node/node/CtrlItem/CtrlItem.js +0 -24
- package/vendor/symbiote-node/node/CtrlItem/CtrlItem.tpl.js +0 -16
- package/vendor/symbiote-node/node/GraphFrame/GraphFrame.css.js +0 -65
- package/vendor/symbiote-node/node/GraphFrame/GraphFrame.js +0 -29
- package/vendor/symbiote-node/node/GraphFrame/GraphFrame.tpl.js +0 -13
- package/vendor/symbiote-node/node/GraphNode/GraphNode.css.js +0 -683
- package/vendor/symbiote-node/node/GraphNode/GraphNode.js +0 -92
- package/vendor/symbiote-node/node/GraphNode/GraphNode.tpl.js +0 -17
- package/vendor/symbiote-node/node/NodeSocket/NodeSocket.js +0 -25
- package/vendor/symbiote-node/node/NodeSocket/NodeSocket.tpl.js +0 -7
- package/vendor/symbiote-node/node/PortItem/PortItem.css.js +0 -90
- package/vendor/symbiote-node/node/PortItem/PortItem.js +0 -87
- package/vendor/symbiote-node/node/PortItem/PortItem.tpl.js +0 -10
- package/vendor/symbiote-node/package.json +0 -59
- package/vendor/symbiote-node/palette/PaletteBrowser/PaletteBrowser.css.js +0 -143
- package/vendor/symbiote-node/palette/PaletteBrowser/PaletteBrowser.js +0 -131
- package/vendor/symbiote-node/palette/PaletteBrowser/PaletteBrowser.tpl.js +0 -16
- package/vendor/symbiote-node/plugins/History.js +0 -384
- package/vendor/symbiote-node/plugins/Readonly.js +0 -59
- package/vendor/symbiote-node/shapes/CircleShape.js +0 -80
- package/vendor/symbiote-node/shapes/CommentShape.js +0 -35
- package/vendor/symbiote-node/shapes/DiamondShape.js +0 -115
- package/vendor/symbiote-node/shapes/NodeShape.js +0 -80
- package/vendor/symbiote-node/shapes/PillShape.js +0 -91
- package/vendor/symbiote-node/shapes/RectShape.js +0 -72
- package/vendor/symbiote-node/shapes/SVGShape.js +0 -494
- package/vendor/symbiote-node/shapes/index.js +0 -53
- package/vendor/symbiote-node/themes/Palette.js +0 -32
- package/vendor/symbiote-node/themes/Skin.js +0 -113
- package/vendor/symbiote-node/themes/Theme.js +0 -84
- package/vendor/symbiote-node/themes/carbon.js +0 -137
- package/vendor/symbiote-node/themes/dark.js +0 -137
- package/vendor/symbiote-node/themes/ebook.js +0 -138
- package/vendor/symbiote-node/themes/grey.js +0 -137
- package/vendor/symbiote-node/themes/light.js +0 -137
- package/vendor/symbiote-node/themes/neon.js +0 -138
- package/vendor/symbiote-node/themes/pcb.js +0 -273
- package/vendor/symbiote-node/themes/synthwave.js +0 -137
- package/vendor/symbiote-node/toolbar/QuickToolbar/QuickToolbar.css.js +0 -86
- package/vendor/symbiote-node/toolbar/QuickToolbar/QuickToolbar.js +0 -128
- package/vendor/symbiote-node/toolbar/QuickToolbar/QuickToolbar.tpl.js +0 -29
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Persistence.js - File-based graph save/load
|
|
3
|
-
*
|
|
4
|
-
* Serializes Graph to .workflow.json and loads it back.
|
|
5
|
-
* Works in Node.js (fs) and browser (Blob/FileReader).
|
|
6
|
-
*
|
|
7
|
-
* @module agi-graph/Persistence
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { Graph } from './Graph.js';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Save graph to JSON string
|
|
14
|
-
* @param {Graph} graph
|
|
15
|
-
* @param {object} [options={}]
|
|
16
|
-
* @param {boolean} [options.pretty=true] - Pretty-print JSON
|
|
17
|
-
* @param {boolean} [options.includeOutput=false] - Include _output cache in export
|
|
18
|
-
* @returns {string} JSON string
|
|
19
|
-
*/
|
|
20
|
-
export function serialize(graph, options = {}) {
|
|
21
|
-
const { pretty = true, includeOutput = false } = options;
|
|
22
|
-
const data = graph.toJSON();
|
|
23
|
-
|
|
24
|
-
// Strip _output unless explicitly requested
|
|
25
|
-
if (!includeOutput) {
|
|
26
|
-
data.nodes = data.nodes.map(n => {
|
|
27
|
-
const { _output, ...rest } = n;
|
|
28
|
-
return rest;
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return JSON.stringify(data, null, pretty ? 2 : 0);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Load graph from JSON string
|
|
37
|
-
* @param {string} json
|
|
38
|
-
* @returns {Graph}
|
|
39
|
-
*/
|
|
40
|
-
export function deserialize(json) {
|
|
41
|
-
const data = JSON.parse(json);
|
|
42
|
-
return new Graph(data);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Save graph to file (Node.js)
|
|
47
|
-
* @param {Graph} graph
|
|
48
|
-
* @param {string} filePath
|
|
49
|
-
* @param {object} [options]
|
|
50
|
-
* @returns {Promise<void>}
|
|
51
|
-
*/
|
|
52
|
-
export async function saveToFile(graph, filePath, options) {
|
|
53
|
-
const json = serialize(graph, options);
|
|
54
|
-
const { writeFile } = await import('node:fs/promises');
|
|
55
|
-
await writeFile(filePath, json, 'utf-8');
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Load graph from file (Node.js)
|
|
60
|
-
* @param {string} filePath
|
|
61
|
-
* @returns {Promise<Graph>}
|
|
62
|
-
*/
|
|
63
|
-
export async function loadFromFile(filePath) {
|
|
64
|
-
const { readFile } = await import('node:fs/promises');
|
|
65
|
-
const json = await readFile(filePath, 'utf-8');
|
|
66
|
-
return deserialize(json);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Download graph as file (Browser)
|
|
71
|
-
* @param {Graph} graph
|
|
72
|
-
* @param {string} [filename='graph.workflow.json']
|
|
73
|
-
* @param {object} [options]
|
|
74
|
-
*/
|
|
75
|
-
export function downloadGraph(graph, filename = 'graph.workflow.json', options) {
|
|
76
|
-
const json = serialize(graph, options);
|
|
77
|
-
const blob = new Blob([json], { type: 'application/json' });
|
|
78
|
-
const url = URL.createObjectURL(blob);
|
|
79
|
-
const a = document.createElement('a');
|
|
80
|
-
a.href = url;
|
|
81
|
-
a.download = filename;
|
|
82
|
-
a.click();
|
|
83
|
-
URL.revokeObjectURL(url);
|
|
84
|
-
}
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Registry.js - Node type and driver registry
|
|
3
|
-
*
|
|
4
|
-
* Central registry for node types, drivers, and domain packs.
|
|
5
|
-
* AI agents use this to discover, compose, and validate nodes.
|
|
6
|
-
*
|
|
7
|
-
* @module agi-graph/Registry
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { areSocketsCompatible, registerSocketTypes } from './SocketTypes.js';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* @typedef {object} SocketDef
|
|
14
|
-
* @property {string} name - Socket name
|
|
15
|
-
* @property {string} type - Socket type (must be registered in SocketTypes)
|
|
16
|
-
* @property {boolean} [required] - Whether this input is required
|
|
17
|
-
* @property {string} [description] - Human-readable description for AI
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @typedef {object} ParamDef
|
|
22
|
-
* @property {string} type - Parameter type (string, int, float, boolean, object, array)
|
|
23
|
-
* @property {*} [default] - Default value
|
|
24
|
-
* @property {number} [min] - Min value (for numeric types)
|
|
25
|
-
* @property {number} [max] - Max value (for numeric types)
|
|
26
|
-
* @property {Array} [enum] - Allowed values
|
|
27
|
-
* @property {boolean} [required] - Whether this param is required
|
|
28
|
-
* @property {string} [description] - Human-readable description
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* @typedef {object} Driver
|
|
33
|
-
* @property {string} description - What this node type does (for AI discovery)
|
|
34
|
-
* @property {string[]} [capabilities] - Tags for AI search
|
|
35
|
-
* @property {SocketDef[]} inputs - Input socket definitions
|
|
36
|
-
* @property {SocketDef[]} outputs - Output socket definitions
|
|
37
|
-
* @property {Record<string, ParamDef>} [params] - Parameter definitions
|
|
38
|
-
* @property {object} [dynamicOutputs] - Dynamic socket pattern definition
|
|
39
|
-
* @property {object} [constraints] - Requirements (secrets, SSH, etc.)
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* @typedef {object} NodeTypeDef
|
|
44
|
-
* @property {string} type - Unique node type identifier (e.g., 'ai/llm')
|
|
45
|
-
* @property {Driver} driver - Self-describing driver manifest
|
|
46
|
-
* @property {function} [process] - Execution function: (inputs, params) => outputs
|
|
47
|
-
* @property {string} [icon] - Material icon name for UI
|
|
48
|
-
* @property {string} [category] - Category for UI grouping
|
|
49
|
-
*/
|
|
50
|
-
|
|
51
|
-
/** @type {Map<string, NodeTypeDef>} */
|
|
52
|
-
const _nodeTypes = new Map();
|
|
53
|
-
|
|
54
|
-
/** @type {Map<string, object>} */
|
|
55
|
-
const _packs = new Map();
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Register a single node type
|
|
59
|
-
* @param {NodeTypeDef} def
|
|
60
|
-
*/
|
|
61
|
-
export function registerNodeType(def) {
|
|
62
|
-
if (!def.type) throw new Error('Node type definition must have a "type" field');
|
|
63
|
-
if (!def.driver) throw new Error(`Node type "${def.type}" must have a "driver" field`);
|
|
64
|
-
_nodeTypes.set(def.type, def);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Register a domain pack (batch registration of node types + socket types)
|
|
69
|
-
* @param {object} pack
|
|
70
|
-
* @param {string} pack.name - Pack name
|
|
71
|
-
* @param {Record<string, import('./SocketTypes.js').SocketTypeDef>} [pack.socketTypes]
|
|
72
|
-
* @param {NodeTypeDef[]} pack.nodes - Array of node type definitions
|
|
73
|
-
*/
|
|
74
|
-
export function registerPack(pack) {
|
|
75
|
-
if (!pack.name) throw new Error('Pack must have a "name" field');
|
|
76
|
-
|
|
77
|
-
if (pack.socketTypes) {
|
|
78
|
-
registerSocketTypes(pack.socketTypes);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
for (const nodeDef of pack.nodes) {
|
|
82
|
-
registerNodeType(nodeDef);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
_packs.set(pack.name, pack);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Get a node type definition
|
|
90
|
-
* @param {string} type
|
|
91
|
-
* @returns {NodeTypeDef|undefined}
|
|
92
|
-
*/
|
|
93
|
-
export function getNodeType(type) {
|
|
94
|
-
return _nodeTypes.get(type);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* List all registered node types
|
|
99
|
-
* @returns {Array<{type: string, driver: Driver}>}
|
|
100
|
-
*/
|
|
101
|
-
export function listDrivers() {
|
|
102
|
-
return [..._nodeTypes.values()].map(def => ({
|
|
103
|
-
type: def.type,
|
|
104
|
-
driver: def.driver,
|
|
105
|
-
icon: def.icon,
|
|
106
|
-
category: def.category,
|
|
107
|
-
}));
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Find node types compatible with a given output type
|
|
112
|
-
* @param {string} outputType - Socket type to match against inputs
|
|
113
|
-
* @returns {Array<{type: string, inputSocket: string, driver: Driver}>}
|
|
114
|
-
*/
|
|
115
|
-
export function findCompatible(outputType) {
|
|
116
|
-
const results = [];
|
|
117
|
-
for (const [type, def] of _nodeTypes) {
|
|
118
|
-
for (const input of def.driver.inputs) {
|
|
119
|
-
if (areSocketsCompatible(outputType, input.type)) {
|
|
120
|
-
results.push({ type, inputSocket: input.name, driver: def.driver });
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return results;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Find node types by capability tag
|
|
129
|
-
* @param {string} capability
|
|
130
|
-
* @returns {Array<{type: string, driver: Driver}>}
|
|
131
|
-
*/
|
|
132
|
-
export function findByCapability(capability) {
|
|
133
|
-
return [..._nodeTypes.values()]
|
|
134
|
-
.filter(def => def.driver.capabilities?.includes(capability))
|
|
135
|
-
.map(def => ({ type: def.type, driver: def.driver }));
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Get node menu grouped by category (for UI context menus)
|
|
140
|
-
* @returns {Array<{category: string, nodes: Array<{type: string, icon: string, description: string}>}>}
|
|
141
|
-
*/
|
|
142
|
-
export function getNodeMenu() {
|
|
143
|
-
const grouped = {};
|
|
144
|
-
for (const [type, def] of _nodeTypes) {
|
|
145
|
-
const cat = def.category || type.split('/')[0];
|
|
146
|
-
if (!grouped[cat]) grouped[cat] = [];
|
|
147
|
-
grouped[cat].push({
|
|
148
|
-
type,
|
|
149
|
-
icon: def.icon,
|
|
150
|
-
description: def.driver.description,
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
return Object.entries(grouped).map(([category, nodes]) => ({ category, nodes }));
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Register custom drivers from workflow JSON (AI-generated nodes)
|
|
158
|
-
* @param {Array<{type: string, driver: Driver, process: string}>} customDrivers
|
|
159
|
-
*/
|
|
160
|
-
export function registerCustomDrivers(customDrivers) {
|
|
161
|
-
for (const cd of customDrivers) {
|
|
162
|
-
registerNodeType({
|
|
163
|
-
type: cd.type,
|
|
164
|
-
driver: cd.driver,
|
|
165
|
-
category: cd.type.split('/')[0],
|
|
166
|
-
// Process stored as string in JSON — needs eval (sandboxed in production)
|
|
167
|
-
process: cd.process ? new Function('inputs', 'params', cd.process) : null,
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Validate node params against driver schema
|
|
174
|
-
* @param {string} type - Node type
|
|
175
|
-
* @param {object} params - Params to validate
|
|
176
|
-
* @returns {{valid: boolean, errors: string[]}}
|
|
177
|
-
*/
|
|
178
|
-
export function validateParams(type, params) {
|
|
179
|
-
const def = _nodeTypes.get(type);
|
|
180
|
-
if (!def) return { valid: false, errors: [`Unknown node type: ${type}`] };
|
|
181
|
-
|
|
182
|
-
const validationErrors = [];
|
|
183
|
-
const schema = def.driver.params || {};
|
|
184
|
-
|
|
185
|
-
for (const [key, paramDef] of Object.entries(schema)) {
|
|
186
|
-
const val = params[key];
|
|
187
|
-
|
|
188
|
-
if (paramDef.required && (val === undefined || val === null)) {
|
|
189
|
-
validationErrors.push(`Missing required param: ${key}`);
|
|
190
|
-
continue;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (val === undefined) continue;
|
|
194
|
-
|
|
195
|
-
if (paramDef.enum && !paramDef.enum.includes(val)) {
|
|
196
|
-
validationErrors.push(`Param "${key}" must be one of: ${paramDef.enum.join(', ')}. Got: ${val}`);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
if (paramDef.min !== undefined && val < paramDef.min) {
|
|
200
|
-
validationErrors.push(`Param "${key}" must be >= ${paramDef.min}. Got: ${val}`);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (paramDef.max !== undefined && val > paramDef.max) {
|
|
204
|
-
validationErrors.push(`Param "${key}" must be <= ${paramDef.max}. Got: ${val}`);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return { valid: validationErrors.length === 0, errors: validationErrors };
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Get all registered packs
|
|
213
|
-
* @returns {string[]}
|
|
214
|
-
*/
|
|
215
|
-
export function listPacks() {
|
|
216
|
-
return [..._packs.keys()];
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Clear all registrations (for testing)
|
|
221
|
-
*/
|
|
222
|
-
export function clearRegistry() {
|
|
223
|
-
_nodeTypes.clear();
|
|
224
|
-
_packs.clear();
|
|
225
|
-
// Re-register built-in types
|
|
226
|
-
_registerBuiltins();
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Register built-in node types (compound infrastructure)
|
|
231
|
-
* @private
|
|
232
|
-
*/
|
|
233
|
-
function _registerBuiltins() {
|
|
234
|
-
_nodeTypes.set('compound/input', {
|
|
235
|
-
type: 'compound/input',
|
|
236
|
-
category: 'compound',
|
|
237
|
-
icon: 'input',
|
|
238
|
-
driver: {
|
|
239
|
-
description: 'Input bridge for compound nodes — receives data from parent graph',
|
|
240
|
-
capabilities: ['compound'],
|
|
241
|
-
inputs: [],
|
|
242
|
-
outputs: [{ name: 'data', type: 'any' }],
|
|
243
|
-
params: {},
|
|
244
|
-
},
|
|
245
|
-
process: (_inputs, params) => ({ ...params }),
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
_nodeTypes.set('compound/output', {
|
|
249
|
-
type: 'compound/output',
|
|
250
|
-
category: 'compound',
|
|
251
|
-
icon: 'output',
|
|
252
|
-
driver: {
|
|
253
|
-
description: 'Output bridge for compound nodes — sends data to parent graph',
|
|
254
|
-
capabilities: ['compound'],
|
|
255
|
-
inputs: [{ name: 'data', type: 'any' }],
|
|
256
|
-
outputs: [{ name: 'data', type: 'any' }],
|
|
257
|
-
params: {},
|
|
258
|
-
},
|
|
259
|
-
process: (inputs) => ({ ...inputs }),
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Register built-ins on module load
|
|
264
|
-
_registerBuiltins();
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SocketTypes.js - Universal typed socket system
|
|
3
|
-
*
|
|
4
|
-
* Defines socket types for node connections with color coding
|
|
5
|
-
* and compatibility rules. Domain packs register additional types.
|
|
6
|
-
*
|
|
7
|
-
* @module agi-graph/SocketTypes
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @typedef {object} SocketTypeDef
|
|
12
|
-
* @property {string} color - Hex color for UI rendering
|
|
13
|
-
* @property {string} label - Human-readable label
|
|
14
|
-
* @property {string[]} compatible - Types this socket can connect to
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
/** @type {Map<string, SocketTypeDef>} */
|
|
18
|
-
const _types = new Map();
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Register a socket type
|
|
22
|
-
* @param {string} name
|
|
23
|
-
* @param {SocketTypeDef} def
|
|
24
|
-
*/
|
|
25
|
-
export function registerSocketType(name, def) {
|
|
26
|
-
_types.set(name, { ...def, compatible: def.compatible || [name] });
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Register multiple socket types at once
|
|
31
|
-
* @param {Record<string, SocketTypeDef>} types
|
|
32
|
-
*/
|
|
33
|
-
export function registerSocketTypes(types) {
|
|
34
|
-
for (const [name, def] of Object.entries(types)) {
|
|
35
|
-
registerSocketType(name, def);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Get socket type definition
|
|
41
|
-
* @param {string} name
|
|
42
|
-
* @returns {SocketTypeDef|undefined}
|
|
43
|
-
*/
|
|
44
|
-
export function getSocketType(name) {
|
|
45
|
-
return _types.get(name);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Get all registered socket types
|
|
50
|
-
* @returns {Map<string, SocketTypeDef>}
|
|
51
|
-
*/
|
|
52
|
-
export function getAllSocketTypes() {
|
|
53
|
-
return new Map(_types);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Check if two socket types are compatible
|
|
58
|
-
* @param {string} from - Source socket type
|
|
59
|
-
* @param {string} to - Target socket type
|
|
60
|
-
* @returns {boolean}
|
|
61
|
-
*/
|
|
62
|
-
export function areSocketsCompatible(from, to) {
|
|
63
|
-
if (from === 'any' || to === 'any') return true;
|
|
64
|
-
if (from === to) return true;
|
|
65
|
-
const fromDef = _types.get(from);
|
|
66
|
-
if (!fromDef) return false;
|
|
67
|
-
return fromDef.compatible.includes(to);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Core socket types (always available)
|
|
71
|
-
registerSocketTypes({
|
|
72
|
-
any: { color: '#FFFFFF', label: 'Any', compatible: [] },
|
|
73
|
-
float: { color: '#A1A1A1', label: 'Float', compatible: ['float', 'int'] },
|
|
74
|
-
int: { color: '#598C5C', label: 'Integer', compatible: ['int', 'float'] },
|
|
75
|
-
string: { color: '#70B2FF', label: 'String', compatible: ['string'] },
|
|
76
|
-
boolean: { color: '#CCA6D6', label: 'Boolean', compatible: ['boolean'] },
|
|
77
|
-
object: { color: '#E09050', label: 'Object', compatible: ['object'] },
|
|
78
|
-
array: { color: '#50C878', label: 'Array', compatible: ['array'] },
|
|
79
|
-
});
|