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.
Files changed (279) hide show
  1. package/package.json +3 -2
  2. package/src/analysis/analysis-cache.ctx +9 -0
  3. package/src/analysis/analysis-cache.js +1 -1
  4. package/src/analysis/complexity.ctx +6 -0
  5. package/src/analysis/complexity.js +1 -1
  6. package/src/analysis/custom-rules.ctx +14 -0
  7. package/src/analysis/custom-rules.js +1 -1
  8. package/src/analysis/db-analysis.ctx +7 -0
  9. package/src/analysis/db-analysis.js +1 -1
  10. package/src/analysis/dead-code.ctx +6 -0
  11. package/src/analysis/dead-code.js +1 -1
  12. package/src/analysis/full-analysis.ctx +9 -0
  13. package/src/analysis/full-analysis.js +1 -1
  14. package/src/analysis/jsdoc-checker.ctx +10 -0
  15. package/src/analysis/jsdoc-checker.js +1 -1
  16. package/src/analysis/jsdoc-generator.ctx +9 -0
  17. package/src/analysis/jsdoc-generator.js +1 -1
  18. package/src/analysis/large-files.ctx +6 -0
  19. package/src/analysis/large-files.js +1 -1
  20. package/src/analysis/outdated-patterns.ctx +7 -0
  21. package/src/analysis/outdated-patterns.js +1 -1
  22. package/src/analysis/similar-functions.ctx +6 -0
  23. package/src/analysis/similar-functions.js +1 -1
  24. package/src/analysis/test-annotations.ctx +11 -0
  25. package/src/analysis/test-annotations.js +1 -1
  26. package/src/analysis/type-checker.ctx +6 -0
  27. package/src/analysis/type-checker.js +1 -1
  28. package/src/analysis/undocumented.ctx +8 -0
  29. package/src/analysis/undocumented.js +1 -1
  30. package/src/cli/cli-handlers.ctx +7 -0
  31. package/src/cli/cli-handlers.js +1 -1
  32. package/src/cli/cli.ctx +6 -0
  33. package/src/cli/cli.js +1 -1
  34. package/src/compact/ai-context.ctx +6 -0
  35. package/src/compact/ai-context.js +1 -1
  36. package/src/compact/compact-migrate.ctx +8 -0
  37. package/src/compact/compact-migrate.js +1 -1
  38. package/src/compact/compact.ctx +11 -0
  39. package/src/compact/compact.js +1 -1
  40. package/src/compact/compress.ctx +7 -0
  41. package/src/compact/compress.js +1 -1
  42. package/src/compact/ctx-resolver.ctx +2 -0
  43. package/src/compact/ctx-resolver.js +1 -1
  44. package/src/compact/ctx-to-jsdoc.ctx +11 -0
  45. package/src/compact/ctx-to-jsdoc.js +1 -1
  46. package/src/compact/doc-dialect.ctx +11 -0
  47. package/src/compact/doc-dialect.js +2 -2
  48. package/src/compact/expand.ctx +14 -0
  49. package/src/compact/expand.js +1 -1
  50. package/src/compact/framework-references.ctx +7 -0
  51. package/src/compact/framework-references.js +1 -1
  52. package/src/compact/instructions.ctx +6 -0
  53. package/src/compact/instructions.js +1 -1
  54. package/src/compact/jsdoc-builder.ctx +4 -0
  55. package/src/compact/jsdoc-builder.js +1 -1
  56. package/src/compact/mode-config.ctx +8 -0
  57. package/src/compact/mode-config.js +1 -1
  58. package/src/compact/split-declarations.ctx +6 -0
  59. package/src/compact/split-declarations.js +1 -1
  60. package/src/compact/validate-pipeline.ctx +12 -0
  61. package/src/compact/validate-pipeline.js +1 -1
  62. package/src/core/event-bus.ctx +9 -0
  63. package/src/core/event-bus.js +1 -1
  64. package/src/core/file-walker.ctx +1 -0
  65. package/src/core/file-walker.js +1 -1
  66. package/src/core/filters.ctx +12 -0
  67. package/src/core/filters.js +1 -1
  68. package/src/core/graph-builder.ctx +7 -0
  69. package/src/core/graph-builder.js +1 -1
  70. package/src/core/parser.ctx +12 -0
  71. package/src/core/parser.js +1 -1
  72. package/src/core/utils.ctx +1 -0
  73. package/src/core/utils.js +1 -1
  74. package/src/core/workspace.ctx +7 -0
  75. package/src/core/workspace.js +1 -1
  76. package/src/lang/lang-go.ctx +8 -0
  77. package/src/lang/lang-go.js +1 -1
  78. package/src/lang/lang-python.ctx +5 -0
  79. package/src/lang/lang-python.js +1 -1
  80. package/src/lang/lang-sql.ctx +10 -0
  81. package/src/lang/lang-sql.js +1 -1
  82. package/src/lang/lang-typescript.ctx +6 -0
  83. package/src/lang/lang-typescript.js +1 -1
  84. package/src/lang/lang-utils.ctx +5 -0
  85. package/src/lang/lang-utils.js +1 -1
  86. package/src/mcp/mcp-server.ctx +6 -0
  87. package/src/mcp/mcp-server.js +1 -1
  88. package/src/mcp/tool-defs.ctx +2 -0
  89. package/src/mcp/tool-defs.js +1 -1
  90. package/src/mcp/tools.ctx +13 -0
  91. package/src/mcp/tools.js +1 -1
  92. package/src/network/backend-lifecycle.ctx +10 -0
  93. package/src/network/backend-lifecycle.js +1 -1
  94. package/src/network/backend.ctx +5 -0
  95. package/src/network/backend.js +1 -1
  96. package/src/network/local-gateway.ctx +9 -0
  97. package/src/network/local-gateway.js +1 -1
  98. package/src/network/mdns.ctx +6 -0
  99. package/src/network/mdns.js +1 -1
  100. package/src/network/server.ctx +2 -0
  101. package/src/network/server.js +2 -2
  102. package/src/network/web-server.ctx +17 -0
  103. package/src/network/web-server.js +2 -2
  104. package/web/follow-controller.js +94 -25
  105. package/web/panels/dep-graph.js +207 -21
  106. package/project-graph-mcp-2.3.0.tgz +0 -0
  107. package/vendor/symbiote-node/CHANGELOG.md +0 -31
  108. package/vendor/symbiote-node/LICENSE +0 -21
  109. package/vendor/symbiote-node/README.md +0 -206
  110. package/vendor/symbiote-node/canvas/AutoLayout.js +0 -725
  111. package/vendor/symbiote-node/canvas/Breadcrumb/Breadcrumb.css.js +0 -73
  112. package/vendor/symbiote-node/canvas/Breadcrumb/Breadcrumb.js +0 -93
  113. package/vendor/symbiote-node/canvas/Breadcrumb/Breadcrumb.tpl.js +0 -9
  114. package/vendor/symbiote-node/canvas/CanvasConnectionRenderer.js +0 -962
  115. package/vendor/symbiote-node/canvas/ConnectionRenderer.js +0 -1468
  116. package/vendor/symbiote-node/canvas/FlowSimulator.js +0 -323
  117. package/vendor/symbiote-node/canvas/ForceLayout.js +0 -189
  118. package/vendor/symbiote-node/canvas/ForceWorker.js +0 -1325
  119. package/vendor/symbiote-node/canvas/GraphTabs/GraphTabs.css.js +0 -97
  120. package/vendor/symbiote-node/canvas/GraphTabs/GraphTabs.js +0 -176
  121. package/vendor/symbiote-node/canvas/GraphTabs/GraphTabs.tpl.js +0 -12
  122. package/vendor/symbiote-node/canvas/LODManager.js +0 -88
  123. package/vendor/symbiote-node/canvas/Minimap/Minimap.css.js +0 -71
  124. package/vendor/symbiote-node/canvas/Minimap/Minimap.js +0 -207
  125. package/vendor/symbiote-node/canvas/Minimap/Minimap.tpl.js +0 -9
  126. package/vendor/symbiote-node/canvas/NodeCanvas/NodeCanvas.css.js +0 -261
  127. package/vendor/symbiote-node/canvas/NodeCanvas/NodeCanvas.js +0 -1840
  128. package/vendor/symbiote-node/canvas/NodeCanvas/NodeCanvas.tpl.js +0 -22
  129. package/vendor/symbiote-node/canvas/NodeSearch/NodeSearch.css.js +0 -97
  130. package/vendor/symbiote-node/canvas/NodeSearch/NodeSearch.js +0 -132
  131. package/vendor/symbiote-node/canvas/NodeSearch/NodeSearch.tpl.js +0 -21
  132. package/vendor/symbiote-node/canvas/NodeViewManager.js +0 -584
  133. package/vendor/symbiote-node/canvas/PinExpansion.js +0 -131
  134. package/vendor/symbiote-node/canvas/PseudoConnection.js +0 -80
  135. package/vendor/symbiote-node/canvas/SubgraphManager.js +0 -201
  136. package/vendor/symbiote-node/canvas/SubgraphRouter.js +0 -443
  137. package/vendor/symbiote-node/canvas/ViewportActions.js +0 -446
  138. package/vendor/symbiote-node/core/Connection.js +0 -45
  139. package/vendor/symbiote-node/core/Editor.js +0 -451
  140. package/vendor/symbiote-node/core/Frame.js +0 -31
  141. package/vendor/symbiote-node/core/GraphMermaid.js +0 -348
  142. package/vendor/symbiote-node/core/GraphText.js +0 -210
  143. package/vendor/symbiote-node/core/Node.js +0 -143
  144. package/vendor/symbiote-node/core/Portal.js +0 -104
  145. package/vendor/symbiote-node/core/Socket.js +0 -185
  146. package/vendor/symbiote-node/core/SubgraphNode.js +0 -125
  147. package/vendor/symbiote-node/engine/AgentUICommands.js +0 -100
  148. package/vendor/symbiote-node/engine/Executor.js +0 -371
  149. package/vendor/symbiote-node/engine/Graph.js +0 -314
  150. package/vendor/symbiote-node/engine/GraphServer.js +0 -353
  151. package/vendor/symbiote-node/engine/HandlerLoader.js +0 -145
  152. package/vendor/symbiote-node/engine/History.js +0 -83
  153. package/vendor/symbiote-node/engine/Lifecycle.js +0 -118
  154. package/vendor/symbiote-node/engine/Persistence.js +0 -84
  155. package/vendor/symbiote-node/engine/Registry.js +0 -264
  156. package/vendor/symbiote-node/engine/SocketTypes.js +0 -79
  157. package/vendor/symbiote-node/engine/cli.js +0 -404
  158. package/vendor/symbiote-node/engine/index.js +0 -56
  159. package/vendor/symbiote-node/engine/nanoid.js +0 -28
  160. package/vendor/symbiote-node/engine/package.json +0 -26
  161. package/vendor/symbiote-node/engine/packs/ai/beat-detect.handler.js +0 -215
  162. package/vendor/symbiote-node/engine/packs/ai/content-adapt.handler.js +0 -238
  163. package/vendor/symbiote-node/engine/packs/ai/face-detect.handler.js +0 -287
  164. package/vendor/symbiote-node/engine/packs/ai/grok-generate.handler.js +0 -565
  165. package/vendor/symbiote-node/engine/packs/ai/kling-lipsync.handler.js +0 -414
  166. package/vendor/symbiote-node/engine/packs/ai/lesson-generate.handler.js +0 -343
  167. package/vendor/symbiote-node/engine/packs/ai/opencode.handler.js +0 -164
  168. package/vendor/symbiote-node/engine/packs/ai/replicate-lipsync.handler.js +0 -341
  169. package/vendor/symbiote-node/engine/packs/ai/tts.handler.js +0 -241
  170. package/vendor/symbiote-node/engine/packs/ai/whisper.handler.js +0 -191
  171. package/vendor/symbiote-node/engine/packs/data/db-query.handler.js +0 -67
  172. package/vendor/symbiote-node/engine/packs/data/news-accumulate.handler.js +0 -281
  173. package/vendor/symbiote-node/engine/packs/data/personas.handler.js +0 -160
  174. package/vendor/symbiote-node/engine/packs/data/prompt-loader.handler.js +0 -193
  175. package/vendor/symbiote-node/engine/packs/data/roles.handler.js +0 -216
  176. package/vendor/symbiote-node/engine/packs/data/rss-feed.handler.js +0 -244
  177. package/vendor/symbiote-node/engine/packs/debug/inject.handler.js +0 -52
  178. package/vendor/symbiote-node/engine/packs/flow/agent.handler.js +0 -73
  179. package/vendor/symbiote-node/engine/packs/flow/if.handler.js +0 -107
  180. package/vendor/symbiote-node/engine/packs/flow/loop.handler.js +0 -58
  181. package/vendor/symbiote-node/engine/packs/flow/merge.handler.js +0 -60
  182. package/vendor/symbiote-node/engine/packs/flow/retry.handler.js +0 -65
  183. package/vendor/symbiote-node/engine/packs/flow/switch.handler.js +0 -64
  184. package/vendor/symbiote-node/engine/packs/flow/wait-all.handler.js +0 -39
  185. package/vendor/symbiote-node/engine/packs/io/http-request.handler.js +0 -82
  186. package/vendor/symbiote-node/engine/packs/io/read-file.handler.js +0 -60
  187. package/vendor/symbiote-node/engine/packs/io/write-file.handler.js +0 -63
  188. package/vendor/symbiote-node/engine/packs/transform/anchor-match.handler.js +0 -494
  189. package/vendor/symbiote-node/engine/packs/transform/effects-skeleton.handler.js +0 -417
  190. package/vendor/symbiote-node/engine/packs/transform/json-parse.handler.js +0 -43
  191. package/vendor/symbiote-node/engine/packs/transform/lipsync-select.handler.js +0 -339
  192. package/vendor/symbiote-node/engine/packs/transform/riopla-adapt.handler.js +0 -432
  193. package/vendor/symbiote-node/engine/packs/transform/set.handler.js +0 -57
  194. package/vendor/symbiote-node/engine/packs/transform/template-builder.handler.js +0 -134
  195. package/vendor/symbiote-node/engine/packs/transform/template.handler.js +0 -79
  196. package/vendor/symbiote-node/engine/packs/transform/timeline-build.handler.js +0 -399
  197. package/vendor/symbiote-node/engine/packs/util/delay.handler.js +0 -39
  198. package/vendor/symbiote-node/engine/packs/util/log.handler.js +0 -44
  199. package/vendor/symbiote-node/engine/packs/video-pack.js +0 -323
  200. package/vendor/symbiote-node/index.js +0 -103
  201. package/vendor/symbiote-node/inspector/InspectorPanel/InspectorPanel.css.js +0 -361
  202. package/vendor/symbiote-node/inspector/InspectorPanel/InspectorPanel.js +0 -332
  203. package/vendor/symbiote-node/inspector/InspectorPanel/InspectorPanel.tpl.js +0 -96
  204. package/vendor/symbiote-node/inspector/TemplatePreview/TemplatePreview.css.js +0 -104
  205. package/vendor/symbiote-node/inspector/TemplatePreview/TemplatePreview.js +0 -133
  206. package/vendor/symbiote-node/inspector/TemplatePreview/TemplatePreview.tpl.js +0 -33
  207. package/vendor/symbiote-node/interactions/ConnectFlow.js +0 -307
  208. package/vendor/symbiote-node/interactions/Drag.js +0 -102
  209. package/vendor/symbiote-node/interactions/Selector.js +0 -132
  210. package/vendor/symbiote-node/interactions/SnapGrid.js +0 -65
  211. package/vendor/symbiote-node/interactions/Zoom.js +0 -140
  212. package/vendor/symbiote-node/layout/ActionZone/ActionZone.css.js +0 -88
  213. package/vendor/symbiote-node/layout/ActionZone/ActionZone.js +0 -254
  214. package/vendor/symbiote-node/layout/ActionZone/ActionZone.tpl.js +0 -11
  215. package/vendor/symbiote-node/layout/Layout/Layout.css.js +0 -88
  216. package/vendor/symbiote-node/layout/Layout/Layout.js +0 -622
  217. package/vendor/symbiote-node/layout/Layout/Layout.tpl.js +0 -25
  218. package/vendor/symbiote-node/layout/LayoutNode/LayoutNode.css.js +0 -293
  219. package/vendor/symbiote-node/layout/LayoutNode/LayoutNode.js +0 -467
  220. package/vendor/symbiote-node/layout/LayoutNode/LayoutNode.tpl.js +0 -33
  221. package/vendor/symbiote-node/layout/LayoutPreview/LayoutPreview.css.js +0 -46
  222. package/vendor/symbiote-node/layout/LayoutPreview/LayoutPreview.js +0 -102
  223. package/vendor/symbiote-node/layout/LayoutPreview/LayoutPreview.tpl.js +0 -6
  224. package/vendor/symbiote-node/layout/LayoutRouter/LayoutRouter.js +0 -156
  225. package/vendor/symbiote-node/layout/LayoutRouter/routerSync.js +0 -250
  226. package/vendor/symbiote-node/layout/LayoutSidebar/LayoutSidebar.css.js +0 -379
  227. package/vendor/symbiote-node/layout/LayoutSidebar/LayoutSidebar.js +0 -263
  228. package/vendor/symbiote-node/layout/LayoutSidebar/LayoutSidebar.tpl.js +0 -20
  229. package/vendor/symbiote-node/layout/LayoutSidebar/SidebarSection.js +0 -183
  230. package/vendor/symbiote-node/layout/LayoutTree.js +0 -246
  231. package/vendor/symbiote-node/layout/PanelMenu/PanelMenu.css.js +0 -43
  232. package/vendor/symbiote-node/layout/PanelMenu/PanelMenu.js +0 -89
  233. package/vendor/symbiote-node/layout/PanelMenu/PanelMenu.tpl.js +0 -14
  234. package/vendor/symbiote-node/layout/index.js +0 -16
  235. package/vendor/symbiote-node/menu/ContextMenu/ContextMenu.css.js +0 -61
  236. package/vendor/symbiote-node/menu/ContextMenu/ContextMenu.js +0 -79
  237. package/vendor/symbiote-node/menu/ContextMenu/ContextMenu.tpl.js +0 -19
  238. package/vendor/symbiote-node/node/CtrlItem/CtrlItem.css.js +0 -41
  239. package/vendor/symbiote-node/node/CtrlItem/CtrlItem.js +0 -24
  240. package/vendor/symbiote-node/node/CtrlItem/CtrlItem.tpl.js +0 -16
  241. package/vendor/symbiote-node/node/GraphFrame/GraphFrame.css.js +0 -65
  242. package/vendor/symbiote-node/node/GraphFrame/GraphFrame.js +0 -29
  243. package/vendor/symbiote-node/node/GraphFrame/GraphFrame.tpl.js +0 -13
  244. package/vendor/symbiote-node/node/GraphNode/GraphNode.css.js +0 -683
  245. package/vendor/symbiote-node/node/GraphNode/GraphNode.js +0 -92
  246. package/vendor/symbiote-node/node/GraphNode/GraphNode.tpl.js +0 -17
  247. package/vendor/symbiote-node/node/NodeSocket/NodeSocket.js +0 -25
  248. package/vendor/symbiote-node/node/NodeSocket/NodeSocket.tpl.js +0 -7
  249. package/vendor/symbiote-node/node/PortItem/PortItem.css.js +0 -90
  250. package/vendor/symbiote-node/node/PortItem/PortItem.js +0 -87
  251. package/vendor/symbiote-node/node/PortItem/PortItem.tpl.js +0 -10
  252. package/vendor/symbiote-node/package.json +0 -59
  253. package/vendor/symbiote-node/palette/PaletteBrowser/PaletteBrowser.css.js +0 -143
  254. package/vendor/symbiote-node/palette/PaletteBrowser/PaletteBrowser.js +0 -131
  255. package/vendor/symbiote-node/palette/PaletteBrowser/PaletteBrowser.tpl.js +0 -16
  256. package/vendor/symbiote-node/plugins/History.js +0 -384
  257. package/vendor/symbiote-node/plugins/Readonly.js +0 -59
  258. package/vendor/symbiote-node/shapes/CircleShape.js +0 -80
  259. package/vendor/symbiote-node/shapes/CommentShape.js +0 -35
  260. package/vendor/symbiote-node/shapes/DiamondShape.js +0 -115
  261. package/vendor/symbiote-node/shapes/NodeShape.js +0 -80
  262. package/vendor/symbiote-node/shapes/PillShape.js +0 -91
  263. package/vendor/symbiote-node/shapes/RectShape.js +0 -72
  264. package/vendor/symbiote-node/shapes/SVGShape.js +0 -494
  265. package/vendor/symbiote-node/shapes/index.js +0 -53
  266. package/vendor/symbiote-node/themes/Palette.js +0 -32
  267. package/vendor/symbiote-node/themes/Skin.js +0 -113
  268. package/vendor/symbiote-node/themes/Theme.js +0 -84
  269. package/vendor/symbiote-node/themes/carbon.js +0 -137
  270. package/vendor/symbiote-node/themes/dark.js +0 -137
  271. package/vendor/symbiote-node/themes/ebook.js +0 -138
  272. package/vendor/symbiote-node/themes/grey.js +0 -137
  273. package/vendor/symbiote-node/themes/light.js +0 -137
  274. package/vendor/symbiote-node/themes/neon.js +0 -138
  275. package/vendor/symbiote-node/themes/pcb.js +0 -273
  276. package/vendor/symbiote-node/themes/synthwave.js +0 -137
  277. package/vendor/symbiote-node/toolbar/QuickToolbar/QuickToolbar.css.js +0 -86
  278. package/vendor/symbiote-node/toolbar/QuickToolbar/QuickToolbar.js +0 -128
  279. 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
- });