agentopology 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +450 -0
  3. package/dist/analyzer/__tests__/analyzer.test.d.ts +2 -0
  4. package/dist/analyzer/__tests__/analyzer.test.d.ts.map +1 -0
  5. package/dist/analyzer/__tests__/analyzer.test.js +258 -0
  6. package/dist/analyzer/__tests__/analyzer.test.js.map +1 -0
  7. package/dist/analyzer/index.d.ts +44 -0
  8. package/dist/analyzer/index.d.ts.map +1 -0
  9. package/dist/analyzer/index.js +308 -0
  10. package/dist/analyzer/index.js.map +1 -0
  11. package/dist/bindings/__tests__/bindings.test.d.ts +2 -0
  12. package/dist/bindings/__tests__/bindings.test.d.ts.map +1 -0
  13. package/dist/bindings/__tests__/bindings.test.js +2089 -0
  14. package/dist/bindings/__tests__/bindings.test.js.map +1 -0
  15. package/dist/bindings/claude-code.d.ts +12 -0
  16. package/dist/bindings/claude-code.d.ts.map +1 -0
  17. package/dist/bindings/claude-code.js +2063 -0
  18. package/dist/bindings/claude-code.js.map +1 -0
  19. package/dist/bindings/codex.d.ts +18 -0
  20. package/dist/bindings/codex.d.ts.map +1 -0
  21. package/dist/bindings/codex.js +1633 -0
  22. package/dist/bindings/codex.js.map +1 -0
  23. package/dist/bindings/copilot-cli.d.ts +20 -0
  24. package/dist/bindings/copilot-cli.d.ts.map +1 -0
  25. package/dist/bindings/copilot-cli.js +1515 -0
  26. package/dist/bindings/copilot-cli.js.map +1 -0
  27. package/dist/bindings/cursor.d.ts +17 -0
  28. package/dist/bindings/cursor.d.ts.map +1 -0
  29. package/dist/bindings/cursor.js +1715 -0
  30. package/dist/bindings/cursor.js.map +1 -0
  31. package/dist/bindings/gemini-cli.d.ts +18 -0
  32. package/dist/bindings/gemini-cli.d.ts.map +1 -0
  33. package/dist/bindings/gemini-cli.js +1327 -0
  34. package/dist/bindings/gemini-cli.js.map +1 -0
  35. package/dist/bindings/index.d.ts +20 -0
  36. package/dist/bindings/index.d.ts.map +1 -0
  37. package/dist/bindings/index.js +33 -0
  38. package/dist/bindings/index.js.map +1 -0
  39. package/dist/bindings/kiro.d.ts +17 -0
  40. package/dist/bindings/kiro.d.ts.map +1 -0
  41. package/dist/bindings/kiro.js +1624 -0
  42. package/dist/bindings/kiro.js.map +1 -0
  43. package/dist/bindings/openclaw.d.ts +18 -0
  44. package/dist/bindings/openclaw.d.ts.map +1 -0
  45. package/dist/bindings/openclaw.js +1578 -0
  46. package/dist/bindings/openclaw.js.map +1 -0
  47. package/dist/bindings/types.d.ts +33 -0
  48. package/dist/bindings/types.d.ts.map +1 -0
  49. package/dist/bindings/types.js +23 -0
  50. package/dist/bindings/types.js.map +1 -0
  51. package/dist/cli/index.d.ts +19 -0
  52. package/dist/cli/index.d.ts.map +1 -0
  53. package/dist/cli/index.js +679 -0
  54. package/dist/cli/index.js.map +1 -0
  55. package/dist/docs/__tests__/docs.test.d.ts +2 -0
  56. package/dist/docs/__tests__/docs.test.d.ts.map +1 -0
  57. package/dist/docs/__tests__/docs.test.js +438 -0
  58. package/dist/docs/__tests__/docs.test.js.map +1 -0
  59. package/dist/docs/content.d.ts +16 -0
  60. package/dist/docs/content.d.ts.map +1 -0
  61. package/dist/docs/content.js +3273 -0
  62. package/dist/docs/content.js.map +1 -0
  63. package/dist/docs/index.d.ts +17 -0
  64. package/dist/docs/index.d.ts.map +1 -0
  65. package/dist/docs/index.js +117 -0
  66. package/dist/docs/index.js.map +1 -0
  67. package/dist/exporters/__tests__/exporters.test.d.ts +2 -0
  68. package/dist/exporters/__tests__/exporters.test.d.ts.map +1 -0
  69. package/dist/exporters/__tests__/exporters.test.js +731 -0
  70. package/dist/exporters/__tests__/exporters.test.js.map +1 -0
  71. package/dist/exporters/index.d.ts +13 -0
  72. package/dist/exporters/index.d.ts.map +1 -0
  73. package/dist/exporters/index.js +18 -0
  74. package/dist/exporters/index.js.map +1 -0
  75. package/dist/exporters/json.d.ts +8 -0
  76. package/dist/exporters/json.d.ts.map +1 -0
  77. package/dist/exporters/json.js +25 -0
  78. package/dist/exporters/json.js.map +1 -0
  79. package/dist/exporters/markdown.d.ts +9 -0
  80. package/dist/exporters/markdown.d.ts.map +1 -0
  81. package/dist/exporters/markdown.js +686 -0
  82. package/dist/exporters/markdown.js.map +1 -0
  83. package/dist/exporters/mermaid.d.ts +11 -0
  84. package/dist/exporters/mermaid.d.ts.map +1 -0
  85. package/dist/exporters/mermaid.js +161 -0
  86. package/dist/exporters/mermaid.js.map +1 -0
  87. package/dist/exporters/types.d.ts +22 -0
  88. package/dist/exporters/types.d.ts.map +1 -0
  89. package/dist/exporters/types.js +10 -0
  90. package/dist/exporters/types.js.map +1 -0
  91. package/dist/import/__tests__/import.test.d.ts +2 -0
  92. package/dist/import/__tests__/import.test.d.ts.map +1 -0
  93. package/dist/import/__tests__/import.test.js +781 -0
  94. package/dist/import/__tests__/import.test.js.map +1 -0
  95. package/dist/import/claude-code.d.ts +38 -0
  96. package/dist/import/claude-code.d.ts.map +1 -0
  97. package/dist/import/claude-code.js +897 -0
  98. package/dist/import/claude-code.js.map +1 -0
  99. package/dist/import/index.d.ts +18 -0
  100. package/dist/import/index.d.ts.map +1 -0
  101. package/dist/import/index.js +28 -0
  102. package/dist/import/index.js.map +1 -0
  103. package/dist/import/serializer.d.ts +11 -0
  104. package/dist/import/serializer.d.ts.map +1 -0
  105. package/dist/import/serializer.js +960 -0
  106. package/dist/import/serializer.js.map +1 -0
  107. package/dist/index.d.ts +26 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +21 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/parser/__tests__/parser.test.d.ts +2 -0
  112. package/dist/parser/__tests__/parser.test.d.ts.map +1 -0
  113. package/dist/parser/__tests__/parser.test.js +6514 -0
  114. package/dist/parser/__tests__/parser.test.js.map +1 -0
  115. package/dist/parser/ast.d.ts +708 -0
  116. package/dist/parser/ast.d.ts.map +1 -0
  117. package/dist/parser/ast.js +12 -0
  118. package/dist/parser/ast.js.map +1 -0
  119. package/dist/parser/index.d.ts +253 -0
  120. package/dist/parser/index.d.ts.map +1 -0
  121. package/dist/parser/index.js +1985 -0
  122. package/dist/parser/index.js.map +1 -0
  123. package/dist/parser/lexer.d.ts +100 -0
  124. package/dist/parser/lexer.d.ts.map +1 -0
  125. package/dist/parser/lexer.js +304 -0
  126. package/dist/parser/lexer.js.map +1 -0
  127. package/dist/parser/validator.d.ts +42 -0
  128. package/dist/parser/validator.d.ts.map +1 -0
  129. package/dist/parser/validator.js +2568 -0
  130. package/dist/parser/validator.js.map +1 -0
  131. package/dist/scaffold/__tests__/scaffold.test.d.ts +7 -0
  132. package/dist/scaffold/__tests__/scaffold.test.d.ts.map +1 -0
  133. package/dist/scaffold/__tests__/scaffold.test.js +295 -0
  134. package/dist/scaffold/__tests__/scaffold.test.js.map +1 -0
  135. package/dist/scaffold/incremental.d.ts +43 -0
  136. package/dist/scaffold/incremental.d.ts.map +1 -0
  137. package/dist/scaffold/incremental.js +185 -0
  138. package/dist/scaffold/incremental.js.map +1 -0
  139. package/dist/scaffold/index.d.ts +13 -0
  140. package/dist/scaffold/index.d.ts.map +1 -0
  141. package/dist/scaffold/index.js +13 -0
  142. package/dist/scaffold/index.js.map +1 -0
  143. package/dist/scaffold/manifest.d.ts +30 -0
  144. package/dist/scaffold/manifest.d.ts.map +1 -0
  145. package/dist/scaffold/manifest.js +71 -0
  146. package/dist/scaffold/manifest.js.map +1 -0
  147. package/dist/scaffold/merge.d.ts +52 -0
  148. package/dist/scaffold/merge.d.ts.map +1 -0
  149. package/dist/scaffold/merge.js +134 -0
  150. package/dist/scaffold/merge.js.map +1 -0
  151. package/dist/scaffold/types.d.ts +51 -0
  152. package/dist/scaffold/types.d.ts.map +1 -0
  153. package/dist/scaffold/types.js +10 -0
  154. package/dist/scaffold/types.js.map +1 -0
  155. package/dist/sync/index.d.ts +34 -0
  156. package/dist/sync/index.d.ts.map +1 -0
  157. package/dist/sync/index.js +392 -0
  158. package/dist/sync/index.js.map +1 -0
  159. package/dist/visualizer/index.d.ts +17 -0
  160. package/dist/visualizer/index.d.ts.map +1 -0
  161. package/dist/visualizer/index.js +1976 -0
  162. package/dist/visualizer/index.js.map +1 -0
  163. package/examples/code-review.at +167 -0
  164. package/examples/data-processing.at +296 -0
  165. package/examples/openclaw-assistant.at +142 -0
  166. package/examples/scheduled-monitor.at +193 -0
  167. package/examples/simple-pipeline.at +163 -0
  168. package/package.json +77 -0
  169. package/skill/SKILL.md +403 -0
  170. package/skill/scripts/emit.ts +853 -0
  171. package/skill/scripts/visualize.ts +89 -0
  172. package/spec/grammar.md +1466 -0
  173. package/spec/reserved-keywords.md +147 -0
  174. package/spec/validation.md +535 -0
@@ -0,0 +1,258 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { parse } from "../../parser/index.js";
3
+ import { analyze } from "../index.js";
4
+ // ---------------------------------------------------------------------------
5
+ // Test topologies
6
+ // ---------------------------------------------------------------------------
7
+ const SIMPLE_PIPELINE = `
8
+ topology simple-pipeline : [pipeline, human-gate] {
9
+ meta {
10
+ version: "1.0.0"
11
+ description: "Research, write, and review"
12
+ }
13
+ orchestrator {
14
+ model: sonnet
15
+ handles: [intake, done]
16
+ }
17
+ action intake { kind: inline }
18
+ agent researcher {
19
+ model: gpt-4o
20
+ permissions: supervised
21
+ phase: 1
22
+ tools: [Read, Grep]
23
+ prompt { You are a researcher. }
24
+ }
25
+ agent writer {
26
+ model: sonnet
27
+ phase: 2
28
+ tools: [Read, Write]
29
+ prompt { You are a writer. }
30
+ }
31
+ agent reviewer {
32
+ model: opus
33
+ phase: 3
34
+ tools: [Read]
35
+ outputs: { verdict: approve | revise | reject }
36
+ prompt { You are a reviewer. }
37
+ }
38
+ action done { kind: report }
39
+ flow {
40
+ intake -> researcher
41
+ researcher -> writer
42
+ writer -> reviewer
43
+ reviewer -> writer [when reviewer.verdict == revise, max 2]
44
+ reviewer -> researcher [when reviewer.verdict == reject, max 1]
45
+ reviewer -> done [when reviewer.verdict == approve]
46
+ }
47
+ gates {
48
+ gate quality-check {
49
+ after: writer
50
+ before: reviewer
51
+ run: "scripts/check.sh"
52
+ checks: [grammar, formatting]
53
+ on-fail: bounce-back
54
+ }
55
+ }
56
+ settings {
57
+ allow: ["Read", "Grep"]
58
+ }
59
+ }
60
+ `;
61
+ const FAN_OUT = `
62
+ topology code-review : [pipeline, fan-out] {
63
+ meta { version: "2.0.0" description: "Fan-out review" }
64
+ orchestrator { model: opus handles: [intake, report] }
65
+ action intake { kind: inline }
66
+ agent analyzer { model: sonnet phase: 1 }
67
+ agent security { model: sonnet phase: 1 }
68
+ agent reporter { model: sonnet phase: 2 prompt { Summarize findings. } }
69
+ action report { kind: report }
70
+ flow {
71
+ intake -> analyzer
72
+ intake -> security
73
+ analyzer -> reporter
74
+ security -> reporter
75
+ reporter -> report
76
+ }
77
+ }
78
+ `;
79
+ const MINIMAL = `
80
+ topology minimal : [pipeline] {
81
+ meta { version: "0.1.0" description: "Bare minimum" }
82
+ orchestrator { model: sonnet handles: [start] }
83
+ action start { kind: inline }
84
+ agent worker { model: haiku phase: 1 }
85
+ flow { start -> worker }
86
+ }
87
+ `;
88
+ // ---------------------------------------------------------------------------
89
+ // Summary tests
90
+ // ---------------------------------------------------------------------------
91
+ describe("analyze — summary", () => {
92
+ it("returns correct topology name and version", () => {
93
+ const result = analyze(parse(SIMPLE_PIPELINE));
94
+ expect(result.summary.name).toBe("simple-pipeline");
95
+ expect(result.summary.version).toBe("1.0.0");
96
+ expect(result.summary.description).toBe("Research, write, and review");
97
+ });
98
+ it("counts nodes correctly", () => {
99
+ const result = analyze(parse(SIMPLE_PIPELINE));
100
+ expect(result.summary.nodeCount.agents).toBe(3);
101
+ expect(result.summary.nodeCount.actions).toBe(2);
102
+ expect(result.summary.nodeCount.gates).toBe(1);
103
+ expect(result.summary.nodeCount.orchestrators).toBe(1);
104
+ expect(result.summary.nodeCount.groups).toBe(0);
105
+ expect(result.summary.nodeCount.humans).toBe(0);
106
+ });
107
+ it("counts edges", () => {
108
+ const result = analyze(parse(SIMPLE_PIPELINE));
109
+ expect(result.summary.edgeCount).toBe(6);
110
+ });
111
+ it("includes declared patterns", () => {
112
+ const result = analyze(parse(SIMPLE_PIPELINE));
113
+ expect(result.summary.declaredPatterns).toContain("pipeline");
114
+ expect(result.summary.declaredPatterns).toContain("human-gate");
115
+ });
116
+ it("works with minimal topology", () => {
117
+ const result = analyze(parse(MINIMAL));
118
+ expect(result.summary.nodeCount.agents).toBe(1);
119
+ expect(result.summary.edgeCount).toBe(1);
120
+ });
121
+ });
122
+ // ---------------------------------------------------------------------------
123
+ // Pattern detection tests
124
+ // ---------------------------------------------------------------------------
125
+ describe("analyze — patterns", () => {
126
+ it("detects pipeline pattern", () => {
127
+ const result = analyze(parse(SIMPLE_PIPELINE));
128
+ const pipeline = result.patterns.find((p) => p.name === "pipeline");
129
+ expect(pipeline).toBeDefined();
130
+ expect(pipeline.confidence).toBe("definite");
131
+ expect(pipeline.involvedNodes.length).toBeGreaterThanOrEqual(3);
132
+ });
133
+ it("pipeline description shows node chain", () => {
134
+ const result = analyze(parse(SIMPLE_PIPELINE));
135
+ const pipeline = result.patterns.find((p) => p.name === "pipeline");
136
+ expect(pipeline.description).toContain("->");
137
+ });
138
+ it("detects fan-out pattern", () => {
139
+ const result = analyze(parse(FAN_OUT));
140
+ const fanOut = result.patterns.find((p) => p.name === "fan-out");
141
+ expect(fanOut).toBeDefined();
142
+ expect(fanOut.involvedNodes).toContain("intake");
143
+ expect(fanOut.involvedNodes).toContain("analyzer");
144
+ expect(fanOut.involvedNodes).toContain("security");
145
+ });
146
+ it("detects review-loop pattern", () => {
147
+ const result = analyze(parse(SIMPLE_PIPELINE));
148
+ const loops = result.patterns.filter((p) => p.name === "review-loop");
149
+ expect(loops.length).toBe(2);
150
+ expect(loops[0].involvedNodes).toContain("reviewer");
151
+ });
152
+ it("review-loop description shows max iterations", () => {
153
+ const result = analyze(parse(SIMPLE_PIPELINE));
154
+ const loop = result.patterns.find((p) => p.name === "review-loop");
155
+ expect(loop.description).toContain("max");
156
+ });
157
+ it("no false fan-out on simple pipeline", () => {
158
+ // The simple pipeline has fan-out from reviewer (3 conditional edges)
159
+ const result = analyze(parse(SIMPLE_PIPELINE));
160
+ const fanOuts = result.patterns.filter((p) => p.name === "fan-out");
161
+ // reviewer has 3 outgoing forward edges (the conditional ones without max)
162
+ // This is technically a fan-out
163
+ expect(fanOuts.length).toBeGreaterThanOrEqual(0);
164
+ });
165
+ it("minimal topology detects no loops", () => {
166
+ const result = analyze(parse(MINIMAL));
167
+ const loops = result.patterns.filter((p) => p.name === "review-loop");
168
+ expect(loops).toHaveLength(0);
169
+ });
170
+ });
171
+ // ---------------------------------------------------------------------------
172
+ // Layer tests
173
+ // ---------------------------------------------------------------------------
174
+ describe("analyze — layers", () => {
175
+ it("computes topological layers", () => {
176
+ const result = analyze(parse(SIMPLE_PIPELINE));
177
+ expect(result.layers.length).toBeGreaterThan(0);
178
+ });
179
+ it("source nodes are at depth 0", () => {
180
+ const result = analyze(parse(SIMPLE_PIPELINE));
181
+ const layer0 = result.layers.find((l) => l.depth === 0);
182
+ expect(layer0).toBeDefined();
183
+ expect(layer0.nodes.length).toBeGreaterThan(0);
184
+ });
185
+ it("fan-out nodes are at same depth", () => {
186
+ const result = analyze(parse(FAN_OUT));
187
+ const analyzerLayer = result.layers.find((l) => l.nodes.includes("analyzer"));
188
+ const securityLayer = result.layers.find((l) => l.nodes.includes("security"));
189
+ expect(analyzerLayer).toBeDefined();
190
+ expect(securityLayer).toBeDefined();
191
+ expect(analyzerLayer.depth).toBe(securityLayer.depth);
192
+ });
193
+ it("downstream nodes have higher depth", () => {
194
+ const result = analyze(parse(FAN_OUT));
195
+ const intakeLayer = result.layers.find((l) => l.nodes.includes("intake"));
196
+ const reporterLayer = result.layers.find((l) => l.nodes.includes("reporter"));
197
+ expect(intakeLayer).toBeDefined();
198
+ expect(reporterLayer).toBeDefined();
199
+ expect(reporterLayer.depth).toBeGreaterThan(intakeLayer.depth);
200
+ });
201
+ it("minimal topology has layers", () => {
202
+ const result = analyze(parse(MINIMAL));
203
+ expect(result.layers.length).toBeGreaterThanOrEqual(1);
204
+ });
205
+ });
206
+ // ---------------------------------------------------------------------------
207
+ // Suggestion tests
208
+ // ---------------------------------------------------------------------------
209
+ describe("analyze — suggestions", () => {
210
+ it("suggests retry for agents without retry config", () => {
211
+ const result = analyze(parse(SIMPLE_PIPELINE));
212
+ const retrySuggestions = result.suggestions.filter((s) => s.message.includes("retry"));
213
+ expect(retrySuggestions.length).toBeGreaterThan(0);
214
+ });
215
+ it("suggests timeout for agents without timeout", () => {
216
+ const result = analyze(parse(SIMPLE_PIPELINE));
217
+ const timeoutSuggestions = result.suggestions.filter((s) => s.message.includes("timeout"));
218
+ expect(timeoutSuggestions.length).toBeGreaterThan(0);
219
+ });
220
+ it("does not suggest missing prompt for agents with prompts", () => {
221
+ const result = analyze(parse(SIMPLE_PIPELINE));
222
+ const promptSuggestions = result.suggestions.filter((s) => s.message.includes("no prompt") && s.node === "researcher");
223
+ expect(promptSuggestions).toHaveLength(0);
224
+ });
225
+ it("suggests missing prompt for agents without prompt", () => {
226
+ const result = analyze(parse(FAN_OUT));
227
+ const promptSuggestions = result.suggestions.filter((s) => s.message.includes("no prompt"));
228
+ // analyzer and security have no prompt
229
+ expect(promptSuggestions.length).toBeGreaterThanOrEqual(2);
230
+ });
231
+ it("detects declared pattern mismatch", () => {
232
+ // SIMPLE_PIPELINE declares "human-gate" but has no HumanNode
233
+ const result = analyze(parse(SIMPLE_PIPELINE));
234
+ const mismatch = result.suggestions.find((s) => s.message.includes("human-gate") && s.message.includes("not detected"));
235
+ expect(mismatch).toBeDefined();
236
+ });
237
+ it("suggestions include node id", () => {
238
+ const result = analyze(parse(SIMPLE_PIPELINE));
239
+ const withNode = result.suggestions.filter((s) => s.node);
240
+ expect(withNode.length).toBeGreaterThan(0);
241
+ });
242
+ it("gate without checks gets suggestion", () => {
243
+ const ast = parse(`
244
+ topology test : [pipeline] {
245
+ meta { version: "1.0.0" }
246
+ orchestrator { model: sonnet handles: [start] }
247
+ action start { kind: inline }
248
+ agent a { model: sonnet prompt { test } }
249
+ flow { start -> a }
250
+ gates { gate g { after: a run: "check.sh" } }
251
+ }
252
+ `);
253
+ const result = analyze(ast);
254
+ const gateSuggestion = result.suggestions.find((s) => s.node === "g" && s.message.includes("checks"));
255
+ expect(gateSuggestion).toBeDefined();
256
+ });
257
+ });
258
+ //# sourceMappingURL=analyzer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.test.js","sourceRoot":"","sources":["../../../src/analyzer/__tests__/analyzer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Topology analyzer — detects patterns, computes layers, and suggests improvements.
3
+ *
4
+ * @module
5
+ */
6
+ import type { TopologyAST } from "../parser/ast.js";
7
+ export interface TopologySummary {
8
+ name: string;
9
+ version: string;
10
+ description: string;
11
+ nodeCount: {
12
+ agents: number;
13
+ actions: number;
14
+ gates: number;
15
+ groups: number;
16
+ humans: number;
17
+ orchestrators: number;
18
+ };
19
+ edgeCount: number;
20
+ declaredPatterns: string[];
21
+ }
22
+ export interface DetectedPattern {
23
+ name: string;
24
+ confidence: "definite" | "likely";
25
+ involvedNodes: string[];
26
+ description: string;
27
+ }
28
+ export interface LayerInfo {
29
+ depth: number;
30
+ nodes: string[];
31
+ }
32
+ export interface Suggestion {
33
+ level: "info" | "improvement";
34
+ message: string;
35
+ node?: string;
36
+ }
37
+ export interface AnalysisResult {
38
+ summary: TopologySummary;
39
+ patterns: DetectedPattern[];
40
+ layers: LayerInfo[];
41
+ suggestions: Suggestion[];
42
+ }
43
+ export declare function analyze(ast: TopologyAST): AnalysisResult;
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,WAAW,EAOZ,MAAM,kBAAkB,CAAC;AAM1B,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC;IAClC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AA2SD,wBAAgB,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAsCxD"}
@@ -0,0 +1,308 @@
1
+ /**
2
+ * Topology analyzer — detects patterns, computes layers, and suggests improvements.
3
+ *
4
+ * @module
5
+ */
6
+ // ---------------------------------------------------------------------------
7
+ // Helpers
8
+ // ---------------------------------------------------------------------------
9
+ function isAgent(n) {
10
+ return n.type === "agent";
11
+ }
12
+ function isGate(n) {
13
+ return n.type === "gate";
14
+ }
15
+ /** Compute in-degree and out-degree for each node in the flow graph. */
16
+ function computeDegrees(edges) {
17
+ const degrees = new Map();
18
+ const ensure = (id) => {
19
+ if (!degrees.has(id))
20
+ degrees.set(id, { in: 0, out: 0 });
21
+ };
22
+ for (const edge of edges) {
23
+ ensure(edge.from);
24
+ ensure(edge.to);
25
+ degrees.get(edge.from).out++;
26
+ degrees.get(edge.to).in++;
27
+ }
28
+ return degrees;
29
+ }
30
+ /** Build adjacency list from edges. */
31
+ function buildAdjacency(edges) {
32
+ const adj = new Map();
33
+ for (const edge of edges) {
34
+ if (!adj.has(edge.from))
35
+ adj.set(edge.from, []);
36
+ adj.get(edge.from).push(edge.to);
37
+ }
38
+ return adj;
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Layer computation (Kahn's algorithm)
42
+ // ---------------------------------------------------------------------------
43
+ function computeLayers(edges, nodeIds) {
44
+ // Only consider forward edges (no back-edges with maxIterations)
45
+ const forwardEdges = edges.filter((e) => !e.maxIterations);
46
+ const inDegree = new Map();
47
+ const adj = new Map();
48
+ for (const id of nodeIds) {
49
+ inDegree.set(id, 0);
50
+ adj.set(id, []);
51
+ }
52
+ for (const edge of forwardEdges) {
53
+ if (!nodeIds.has(edge.from) || !nodeIds.has(edge.to))
54
+ continue;
55
+ adj.get(edge.from).push(edge.to);
56
+ inDegree.set(edge.to, (inDegree.get(edge.to) ?? 0) + 1);
57
+ }
58
+ // BFS by topological depth
59
+ const depthMap = new Map();
60
+ const queue = [];
61
+ for (const [id, deg] of inDegree) {
62
+ if (deg === 0) {
63
+ queue.push(id);
64
+ depthMap.set(id, 0);
65
+ }
66
+ }
67
+ let head = 0;
68
+ while (head < queue.length) {
69
+ const current = queue[head++];
70
+ const currentDepth = depthMap.get(current);
71
+ for (const neighbor of adj.get(current) ?? []) {
72
+ const newDeg = inDegree.get(neighbor) - 1;
73
+ inDegree.set(neighbor, newDeg);
74
+ // Track maximum depth (longest path)
75
+ const existingDepth = depthMap.get(neighbor);
76
+ if (existingDepth === undefined || currentDepth + 1 > existingDepth) {
77
+ depthMap.set(neighbor, currentDepth + 1);
78
+ }
79
+ if (newDeg === 0) {
80
+ queue.push(neighbor);
81
+ }
82
+ }
83
+ }
84
+ // Nodes not reached (cycles without forward paths) get depth -1
85
+ for (const id of nodeIds) {
86
+ if (!depthMap.has(id))
87
+ depthMap.set(id, -1);
88
+ }
89
+ // Group by depth
90
+ const layerMap = new Map();
91
+ for (const [id, depth] of depthMap) {
92
+ if (!layerMap.has(depth))
93
+ layerMap.set(depth, []);
94
+ layerMap.get(depth).push(id);
95
+ }
96
+ return Array.from(layerMap.entries())
97
+ .sort(([a], [b]) => a - b)
98
+ .map(([depth, nodes]) => ({ depth, nodes: nodes.sort() }));
99
+ }
100
+ // ---------------------------------------------------------------------------
101
+ // Pattern detection
102
+ // ---------------------------------------------------------------------------
103
+ function detectPatterns(ast) {
104
+ const patterns = [];
105
+ const edges = ast.edges;
106
+ const degrees = computeDegrees(edges);
107
+ const adj = buildAdjacency(edges);
108
+ // Pipeline: find longest chain of nodes with in-degree=1, out-degree=1
109
+ const chainNodes = new Set();
110
+ for (const [id, deg] of degrees) {
111
+ if (deg.in <= 1 && deg.out <= 1)
112
+ chainNodes.add(id);
113
+ }
114
+ // Trace chains from source nodes (in-degree 0)
115
+ const chains = [];
116
+ const visited = new Set();
117
+ for (const [id, deg] of degrees) {
118
+ if (deg.in === 0 && !visited.has(id)) {
119
+ const chain = [id];
120
+ visited.add(id);
121
+ let current = id;
122
+ while (true) {
123
+ const neighbors = adj.get(current);
124
+ // Follow single outgoing forward edge
125
+ const forwardNeighbors = neighbors?.filter((n) => {
126
+ const edge = edges.find((e) => e.from === current && e.to === n);
127
+ return edge && !edge.maxIterations;
128
+ });
129
+ if (!forwardNeighbors || forwardNeighbors.length !== 1)
130
+ break;
131
+ const next = forwardNeighbors[0];
132
+ const nextDeg = degrees.get(next);
133
+ // Stop if the next node has multiple incoming forward edges
134
+ const incomingForward = edges.filter((e) => e.to === next && !e.maxIterations);
135
+ if (incomingForward.length > 1)
136
+ break;
137
+ if (visited.has(next))
138
+ break;
139
+ chain.push(next);
140
+ visited.add(next);
141
+ current = next;
142
+ }
143
+ if (chain.length >= 3)
144
+ chains.push(chain);
145
+ }
146
+ }
147
+ if (chains.length > 0) {
148
+ const longest = chains.reduce((a, b) => (a.length >= b.length ? a : b));
149
+ patterns.push({
150
+ name: "pipeline",
151
+ confidence: "definite",
152
+ involvedNodes: longest,
153
+ description: longest.join(" -> "),
154
+ });
155
+ }
156
+ // Fan-out: node with multiple outgoing forward edges
157
+ for (const [id, deg] of degrees) {
158
+ if (deg.out > 1) {
159
+ const targets = edges
160
+ .filter((e) => e.from === id && !e.maxIterations)
161
+ .map((e) => e.to);
162
+ if (targets.length > 1) {
163
+ patterns.push({
164
+ name: "fan-out",
165
+ confidence: "definite",
166
+ involvedNodes: [id, ...targets],
167
+ description: `${id} -> [${targets.join(", ")}]`,
168
+ });
169
+ }
170
+ }
171
+ }
172
+ // Review-loop: back-edges with maxIterations
173
+ const backEdges = edges.filter((e) => e.maxIterations);
174
+ for (const edge of backEdges) {
175
+ patterns.push({
176
+ name: "review-loop",
177
+ confidence: "definite",
178
+ involvedNodes: [edge.from, edge.to],
179
+ description: `${edge.from} -> ${edge.to} [max ${edge.maxIterations}]`,
180
+ });
181
+ }
182
+ // Human-gate: any HumanNode in the graph
183
+ const humanNodes = ast.nodes.filter((n) => n.type === "human");
184
+ for (const human of humanNodes) {
185
+ patterns.push({
186
+ name: "human-gate",
187
+ confidence: "definite",
188
+ involvedNodes: [human.id],
189
+ description: `Human approval: ${human.id}`,
190
+ });
191
+ }
192
+ // Group/debate: any GroupNode
193
+ const groupNodes = ast.nodes.filter((n) => n.type === "group");
194
+ for (const group of groupNodes) {
195
+ patterns.push({
196
+ name: "group-chat",
197
+ confidence: "definite",
198
+ involvedNodes: [group.id, ...(group.members ?? [])],
199
+ description: `Group: ${group.id} (${(group.members ?? []).join(", ")})`,
200
+ });
201
+ }
202
+ return patterns;
203
+ }
204
+ // ---------------------------------------------------------------------------
205
+ // Suggestions
206
+ // ---------------------------------------------------------------------------
207
+ function generateSuggestions(ast) {
208
+ const suggestions = [];
209
+ for (const node of ast.nodes) {
210
+ if (!isAgent(node))
211
+ continue;
212
+ if (!node.prompt) {
213
+ suggestions.push({
214
+ level: "improvement",
215
+ message: "Agent has no prompt",
216
+ node: node.id,
217
+ });
218
+ }
219
+ if (!node.retry) {
220
+ suggestions.push({
221
+ level: "info",
222
+ message: "Agent has no retry configuration",
223
+ node: node.id,
224
+ });
225
+ }
226
+ if (!node.timeout) {
227
+ suggestions.push({
228
+ level: "info",
229
+ message: "Agent has no timeout",
230
+ node: node.id,
231
+ });
232
+ }
233
+ }
234
+ for (const node of ast.nodes) {
235
+ if (!isGate(node))
236
+ continue;
237
+ if (!node.checks || node.checks.length === 0) {
238
+ suggestions.push({
239
+ level: "improvement",
240
+ message: "Gate has no checks defined",
241
+ node: node.id,
242
+ });
243
+ }
244
+ }
245
+ // Declared vs detected pattern mismatch
246
+ const detected = detectPatterns(ast);
247
+ const detectedNames = new Set(detected.map((p) => p.name));
248
+ const declared = new Set(ast.topology.patterns);
249
+ for (const p of declared) {
250
+ // Normalize: "human-gate" matches "human-gate"
251
+ if (!detectedNames.has(p)) {
252
+ suggestions.push({
253
+ level: "info",
254
+ message: `Declared pattern "${p}" was not detected in the flow graph`,
255
+ });
256
+ }
257
+ }
258
+ return suggestions;
259
+ }
260
+ // ---------------------------------------------------------------------------
261
+ // Main analysis function
262
+ // ---------------------------------------------------------------------------
263
+ export function analyze(ast) {
264
+ const counts = {
265
+ agents: 0,
266
+ actions: 0,
267
+ gates: 0,
268
+ groups: 0,
269
+ humans: 0,
270
+ orchestrators: 0,
271
+ };
272
+ for (const node of ast.nodes) {
273
+ switch (node.type) {
274
+ case "agent":
275
+ counts.agents++;
276
+ break;
277
+ case "action":
278
+ counts.actions++;
279
+ break;
280
+ case "gate":
281
+ counts.gates++;
282
+ break;
283
+ case "group":
284
+ counts.groups++;
285
+ break;
286
+ case "human":
287
+ counts.humans++;
288
+ break;
289
+ case "orchestrator":
290
+ counts.orchestrators++;
291
+ break;
292
+ }
293
+ }
294
+ const summary = {
295
+ name: ast.topology.name,
296
+ version: ast.topology.version,
297
+ description: ast.topology.description,
298
+ nodeCount: counts,
299
+ edgeCount: ast.edges.length,
300
+ declaredPatterns: ast.topology.patterns,
301
+ };
302
+ const patterns = detectPatterns(ast);
303
+ const nodeIds = new Set(ast.nodes.map((n) => n.id));
304
+ const layers = computeLayers(ast.edges, nodeIds);
305
+ const suggestions = generateSuggestions(ast);
306
+ return { summary, patterns, layers, suggestions };
307
+ }
308
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bindings.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindings.test.d.ts","sourceRoot":"","sources":["../../../src/bindings/__tests__/bindings.test.ts"],"names":[],"mappings":""}