swarm-engine 1.1.1 → 1.38.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 (339) hide show
  1. package/CLAUDE.md +1 -1
  2. package/README.md +145 -30
  3. package/commands/diff-review.md +27 -15
  4. package/commands/discover.md +102 -0
  5. package/commands/dynamic.md +136 -0
  6. package/commands/fix-pr.md +30 -24
  7. package/commands/postmortem.md +106 -0
  8. package/commands/red-team.md +41 -26
  9. package/commands/research.md +22 -1
  10. package/commands/review-cycle.md +38 -20
  11. package/commands/spike.md +108 -0
  12. package/commands/swarm.md +68 -60
  13. package/commands/tdd.md +44 -24
  14. package/dist/cli/commands/acp.d.ts.map +1 -1
  15. package/dist/cli/commands/acp.js +12 -2
  16. package/dist/cli/commands/acp.js.map +1 -1
  17. package/dist/cli/commands/agents.d.ts.map +1 -1
  18. package/dist/cli/commands/agents.js +16 -13
  19. package/dist/cli/commands/agents.js.map +1 -1
  20. package/dist/cli/commands/completions.d.ts.map +1 -1
  21. package/dist/cli/commands/completions.js +21 -9
  22. package/dist/cli/commands/completions.js.map +1 -1
  23. package/dist/cli/commands/compound.d.ts.map +1 -1
  24. package/dist/cli/commands/compound.js +1 -2
  25. package/dist/cli/commands/compound.js.map +1 -1
  26. package/dist/cli/commands/configure.d.ts.map +1 -1
  27. package/dist/cli/commands/configure.js +24 -8
  28. package/dist/cli/commands/configure.js.map +1 -1
  29. package/dist/cli/commands/convert.d.ts +1 -1
  30. package/dist/cli/commands/convert.d.ts.map +1 -1
  31. package/dist/cli/commands/convert.js +22 -48
  32. package/dist/cli/commands/convert.js.map +1 -1
  33. package/dist/cli/commands/doctor.d.ts.map +1 -1
  34. package/dist/cli/commands/doctor.js +1 -3
  35. package/dist/cli/commands/doctor.js.map +1 -1
  36. package/dist/cli/commands/init.d.ts.map +1 -1
  37. package/dist/cli/commands/init.js +17 -7
  38. package/dist/cli/commands/init.js.map +1 -1
  39. package/dist/cli/commands/install.d.ts.map +1 -1
  40. package/dist/cli/commands/install.js +1 -1
  41. package/dist/cli/commands/install.js.map +1 -1
  42. package/dist/cli/commands/learn.js +6 -6
  43. package/dist/cli/commands/learn.js.map +1 -1
  44. package/dist/cli/commands/mcp.d.ts.map +1 -1
  45. package/dist/cli/commands/mcp.js +1 -2
  46. package/dist/cli/commands/mcp.js.map +1 -1
  47. package/dist/cli/commands/memory.d.ts.map +1 -1
  48. package/dist/cli/commands/memory.js +118 -2
  49. package/dist/cli/commands/memory.js.map +1 -1
  50. package/dist/cli/commands/orchestrate.d.ts.map +1 -1
  51. package/dist/cli/commands/orchestrate.js +20 -7
  52. package/dist/cli/commands/orchestrate.js.map +1 -1
  53. package/dist/cli/commands/plan.d.ts.map +1 -1
  54. package/dist/cli/commands/plan.js.map +1 -1
  55. package/dist/cli/commands/plugin.d.ts.map +1 -1
  56. package/dist/cli/commands/plugin.js +8 -5
  57. package/dist/cli/commands/plugin.js.map +1 -1
  58. package/dist/cli/commands/resume.js +1 -1
  59. package/dist/cli/commands/resume.js.map +1 -1
  60. package/dist/cli/commands/run.d.ts.map +1 -1
  61. package/dist/cli/commands/run.js +20 -6
  62. package/dist/cli/commands/run.js.map +1 -1
  63. package/dist/cli/commands/share.d.ts.map +1 -1
  64. package/dist/cli/commands/share.js +6 -1
  65. package/dist/cli/commands/share.js.map +1 -1
  66. package/dist/cli/commands/status.d.ts.map +1 -1
  67. package/dist/cli/commands/status.js +15 -7
  68. package/dist/cli/commands/status.js.map +1 -1
  69. package/dist/cli/commands/template.d.ts.map +1 -1
  70. package/dist/cli/commands/template.js +14 -6
  71. package/dist/cli/commands/template.js.map +1 -1
  72. package/dist/cli/commands/vault.d.ts.map +1 -1
  73. package/dist/cli/commands/vault.js +14 -9
  74. package/dist/cli/commands/vault.js.map +1 -1
  75. package/dist/cli/commands/verify.d.ts.map +1 -1
  76. package/dist/cli/commands/verify.js +2 -2
  77. package/dist/cli/commands/verify.js.map +1 -1
  78. package/dist/cli/commands/watch.js +1 -1
  79. package/dist/cli/commands/watch.js.map +1 -1
  80. package/dist/cli/index.js +14 -4
  81. package/dist/cli/index.js.map +1 -1
  82. package/dist/core/checkpoint.js +1 -1
  83. package/dist/core/checkpoint.js.map +1 -1
  84. package/dist/core/event-bus.d.ts.map +1 -1
  85. package/dist/core/event-bus.js +9 -3
  86. package/dist/core/event-bus.js.map +1 -1
  87. package/dist/core/lifecycle.js.map +1 -1
  88. package/dist/core/patterns.d.ts.map +1 -1
  89. package/dist/core/patterns.js +31 -8
  90. package/dist/core/patterns.js.map +1 -1
  91. package/dist/core/permissions.d.ts.map +1 -1
  92. package/dist/core/permissions.js +21 -10
  93. package/dist/core/permissions.js.map +1 -1
  94. package/dist/core/registry.d.ts.map +1 -1
  95. package/dist/core/registry.js +10 -6
  96. package/dist/core/registry.js.map +1 -1
  97. package/dist/core/snapshots.d.ts.map +1 -1
  98. package/dist/core/snapshots.js +17 -5
  99. package/dist/core/snapshots.js.map +1 -1
  100. package/dist/core/types.d.ts +33 -0
  101. package/dist/core/types.d.ts.map +1 -1
  102. package/dist/core/types.js.map +1 -1
  103. package/dist/hooks/index.js.map +1 -1
  104. package/dist/index.d.ts +114 -6
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +92 -4
  107. package/dist/index.js.map +1 -1
  108. package/dist/memory/index.d.ts +38 -0
  109. package/dist/memory/index.d.ts.map +1 -1
  110. package/dist/memory/index.js +136 -24
  111. package/dist/memory/index.js.map +1 -1
  112. package/dist/memory/schema.d.ts +1 -0
  113. package/dist/memory/schema.d.ts.map +1 -1
  114. package/dist/memory/schema.js +20 -19
  115. package/dist/memory/schema.js.map +1 -1
  116. package/dist/plugin/index.d.ts.map +1 -1
  117. package/dist/plugin/index.js.map +1 -1
  118. package/dist/runtime/acp.d.ts.map +1 -1
  119. package/dist/runtime/acp.js +71 -41
  120. package/dist/runtime/acp.js.map +1 -1
  121. package/dist/runtime/adaptive.d.ts.map +1 -1
  122. package/dist/runtime/adaptive.js +30 -31
  123. package/dist/runtime/adaptive.js.map +1 -1
  124. package/dist/runtime/agent-runner.d.ts +62 -0
  125. package/dist/runtime/agent-runner.d.ts.map +1 -0
  126. package/dist/runtime/agent-runner.js +224 -0
  127. package/dist/runtime/agent-runner.js.map +1 -0
  128. package/dist/runtime/autonomy.d.ts +1 -0
  129. package/dist/runtime/autonomy.d.ts.map +1 -1
  130. package/dist/runtime/autonomy.js +37 -19
  131. package/dist/runtime/autonomy.js.map +1 -1
  132. package/dist/runtime/backends/claude.d.ts.map +1 -1
  133. package/dist/runtime/backends/claude.js +2 -2
  134. package/dist/runtime/backends/claude.js.map +1 -1
  135. package/dist/runtime/backends/codex.d.ts.map +1 -1
  136. package/dist/runtime/backends/codex.js +8 -11
  137. package/dist/runtime/backends/codex.js.map +1 -1
  138. package/dist/runtime/backends/gemini.d.ts.map +1 -1
  139. package/dist/runtime/backends/gemini.js +11 -7
  140. package/dist/runtime/backends/gemini.js.map +1 -1
  141. package/dist/runtime/backends/index.js +1 -1
  142. package/dist/runtime/backends/index.js.map +1 -1
  143. package/dist/runtime/backends/mock.d.ts.map +1 -1
  144. package/dist/runtime/backends/mock.js +1 -1
  145. package/dist/runtime/backends/mock.js.map +1 -1
  146. package/dist/runtime/backends/vercel-ai.d.ts.map +1 -1
  147. package/dist/runtime/backends/vercel-ai.js +41 -9
  148. package/dist/runtime/backends/vercel-ai.js.map +1 -1
  149. package/dist/runtime/cache-optimizer.d.ts.map +1 -1
  150. package/dist/runtime/cache-optimizer.js +3 -9
  151. package/dist/runtime/cache-optimizer.js.map +1 -1
  152. package/dist/runtime/cascade.d.ts.map +1 -1
  153. package/dist/runtime/cascade.js +34 -7
  154. package/dist/runtime/cascade.js.map +1 -1
  155. package/dist/runtime/chunker.d.ts.map +1 -1
  156. package/dist/runtime/chunker.js +12 -6
  157. package/dist/runtime/chunker.js.map +1 -1
  158. package/dist/runtime/compounder.d.ts +1 -1
  159. package/dist/runtime/compounder.d.ts.map +1 -1
  160. package/dist/runtime/compounder.js +30 -11
  161. package/dist/runtime/compounder.js.map +1 -1
  162. package/dist/runtime/cost-model.d.ts.map +1 -1
  163. package/dist/runtime/cost-model.js +1 -1
  164. package/dist/runtime/cost-model.js.map +1 -1
  165. package/dist/runtime/database.d.ts +16 -0
  166. package/dist/runtime/database.d.ts.map +1 -0
  167. package/dist/runtime/database.js +39 -0
  168. package/dist/runtime/database.js.map +1 -0
  169. package/dist/runtime/distiller.d.ts.map +1 -1
  170. package/dist/runtime/distiller.js +6 -3
  171. package/dist/runtime/distiller.js.map +1 -1
  172. package/dist/runtime/engine.d.ts +25 -9
  173. package/dist/runtime/engine.d.ts.map +1 -1
  174. package/dist/runtime/engine.js +417 -378
  175. package/dist/runtime/engine.js.map +1 -1
  176. package/dist/runtime/execution-graph.d.ts +86 -0
  177. package/dist/runtime/execution-graph.d.ts.map +1 -0
  178. package/dist/runtime/execution-graph.js +441 -0
  179. package/dist/runtime/execution-graph.js.map +1 -0
  180. package/dist/runtime/executor.d.ts +1 -2
  181. package/dist/runtime/executor.d.ts.map +1 -1
  182. package/dist/runtime/executor.js +45 -14
  183. package/dist/runtime/executor.js.map +1 -1
  184. package/dist/runtime/graph-adversarial.d.ts +88 -0
  185. package/dist/runtime/graph-adversarial.d.ts.map +1 -0
  186. package/dist/runtime/graph-adversarial.js +378 -0
  187. package/dist/runtime/graph-adversarial.js.map +1 -0
  188. package/dist/runtime/graph-analyzer.d.ts +106 -0
  189. package/dist/runtime/graph-analyzer.d.ts.map +1 -0
  190. package/dist/runtime/graph-analyzer.js +321 -0
  191. package/dist/runtime/graph-analyzer.js.map +1 -0
  192. package/dist/runtime/graph-causal.d.ts +91 -0
  193. package/dist/runtime/graph-causal.d.ts.map +1 -0
  194. package/dist/runtime/graph-causal.js +292 -0
  195. package/dist/runtime/graph-causal.js.map +1 -0
  196. package/dist/runtime/graph-context-router.d.ts +73 -0
  197. package/dist/runtime/graph-context-router.d.ts.map +1 -0
  198. package/dist/runtime/graph-context-router.js +162 -0
  199. package/dist/runtime/graph-context-router.js.map +1 -0
  200. package/dist/runtime/graph-discovery.d.ts +71 -0
  201. package/dist/runtime/graph-discovery.d.ts.map +1 -0
  202. package/dist/runtime/graph-discovery.js +367 -0
  203. package/dist/runtime/graph-discovery.js.map +1 -0
  204. package/dist/runtime/graph-dropout.d.ts +59 -0
  205. package/dist/runtime/graph-dropout.d.ts.map +1 -0
  206. package/dist/runtime/graph-dropout.js +196 -0
  207. package/dist/runtime/graph-dropout.js.map +1 -0
  208. package/dist/runtime/graph-embeddings.d.ts +58 -0
  209. package/dist/runtime/graph-embeddings.d.ts.map +1 -0
  210. package/dist/runtime/graph-embeddings.js +301 -0
  211. package/dist/runtime/graph-embeddings.js.map +1 -0
  212. package/dist/runtime/graph-feedback.d.ts +30 -0
  213. package/dist/runtime/graph-feedback.d.ts.map +1 -0
  214. package/dist/runtime/graph-feedback.js +82 -0
  215. package/dist/runtime/graph-feedback.js.map +1 -0
  216. package/dist/runtime/graph-gnn.d.ts +120 -0
  217. package/dist/runtime/graph-gnn.d.ts.map +1 -0
  218. package/dist/runtime/graph-gnn.js +524 -0
  219. package/dist/runtime/graph-gnn.js.map +1 -0
  220. package/dist/runtime/graph-learner.d.ts +70 -0
  221. package/dist/runtime/graph-learner.d.ts.map +1 -0
  222. package/dist/runtime/graph-learner.js +265 -0
  223. package/dist/runtime/graph-learner.js.map +1 -0
  224. package/dist/runtime/graph-meta-adversarial.d.ts +113 -0
  225. package/dist/runtime/graph-meta-adversarial.d.ts.map +1 -0
  226. package/dist/runtime/graph-meta-adversarial.js +366 -0
  227. package/dist/runtime/graph-meta-adversarial.js.map +1 -0
  228. package/dist/runtime/graph-meta.d.ts +115 -0
  229. package/dist/runtime/graph-meta.d.ts.map +1 -0
  230. package/dist/runtime/graph-meta.js +437 -0
  231. package/dist/runtime/graph-meta.js.map +1 -0
  232. package/dist/runtime/graph-self-evolve.d.ts +92 -0
  233. package/dist/runtime/graph-self-evolve.d.ts.map +1 -0
  234. package/dist/runtime/graph-self-evolve.js +422 -0
  235. package/dist/runtime/graph-self-evolve.js.map +1 -0
  236. package/dist/runtime/graph-synthesis.d.ts +47 -0
  237. package/dist/runtime/graph-synthesis.d.ts.map +1 -0
  238. package/dist/runtime/graph-synthesis.js +232 -0
  239. package/dist/runtime/graph-synthesis.js.map +1 -0
  240. package/dist/runtime/graph-trajectory.d.ts +88 -0
  241. package/dist/runtime/graph-trajectory.d.ts.map +1 -0
  242. package/dist/runtime/graph-trajectory.js +339 -0
  243. package/dist/runtime/graph-trajectory.js.map +1 -0
  244. package/dist/runtime/heuristics.d.ts +1 -0
  245. package/dist/runtime/heuristics.d.ts.map +1 -1
  246. package/dist/runtime/heuristics.js +44 -22
  247. package/dist/runtime/heuristics.js.map +1 -1
  248. package/dist/runtime/learning-engine.d.ts +63 -0
  249. package/dist/runtime/learning-engine.d.ts.map +1 -0
  250. package/dist/runtime/learning-engine.js +273 -0
  251. package/dist/runtime/learning-engine.js.map +1 -0
  252. package/dist/runtime/living-spec.js +3 -3
  253. package/dist/runtime/living-spec.js.map +1 -1
  254. package/dist/runtime/lsp.d.ts.map +1 -1
  255. package/dist/runtime/lsp.js +41 -14
  256. package/dist/runtime/lsp.js.map +1 -1
  257. package/dist/runtime/mcp.d.ts.map +1 -1
  258. package/dist/runtime/mcp.js +56 -19
  259. package/dist/runtime/mcp.js.map +1 -1
  260. package/dist/runtime/model-router.d.ts +1 -0
  261. package/dist/runtime/model-router.d.ts.map +1 -1
  262. package/dist/runtime/model-router.js +37 -21
  263. package/dist/runtime/model-router.js.map +1 -1
  264. package/dist/runtime/panes.d.ts.map +1 -1
  265. package/dist/runtime/panes.js +50 -49
  266. package/dist/runtime/panes.js.map +1 -1
  267. package/dist/runtime/plan-search.js +2 -2
  268. package/dist/runtime/plan-search.js.map +1 -1
  269. package/dist/runtime/plugins.d.ts +1 -1
  270. package/dist/runtime/plugins.d.ts.map +1 -1
  271. package/dist/runtime/plugins.js +63 -47
  272. package/dist/runtime/plugins.js.map +1 -1
  273. package/dist/runtime/reflexion.d.ts.map +1 -1
  274. package/dist/runtime/reflexion.js +4 -8
  275. package/dist/runtime/reflexion.js.map +1 -1
  276. package/dist/runtime/review-schema.d.ts.map +1 -1
  277. package/dist/runtime/review-schema.js +12 -12
  278. package/dist/runtime/review-schema.js.map +1 -1
  279. package/dist/runtime/rewriter.d.ts.map +1 -1
  280. package/dist/runtime/rewriter.js +29 -9
  281. package/dist/runtime/rewriter.js.map +1 -1
  282. package/dist/runtime/sharing.d.ts +1 -1
  283. package/dist/runtime/sharing.d.ts.map +1 -1
  284. package/dist/runtime/sharing.js +55 -27
  285. package/dist/runtime/sharing.js.map +1 -1
  286. package/dist/runtime/stats.d.ts +1 -0
  287. package/dist/runtime/stats.d.ts.map +1 -1
  288. package/dist/runtime/stats.js +40 -24
  289. package/dist/runtime/stats.js.map +1 -1
  290. package/dist/runtime/templates.d.ts.map +1 -1
  291. package/dist/runtime/templates.js +2 -2
  292. package/dist/runtime/templates.js.map +1 -1
  293. package/dist/runtime/traces.d.ts +1 -0
  294. package/dist/runtime/traces.d.ts.map +1 -1
  295. package/dist/runtime/traces.js +50 -28
  296. package/dist/runtime/traces.js.map +1 -1
  297. package/dist/runtime/verifier.d.ts.map +1 -1
  298. package/dist/runtime/verifier.js +12 -6
  299. package/dist/runtime/verifier.js.map +1 -1
  300. package/dist/runtime/worktree.d.ts.map +1 -1
  301. package/dist/runtime/worktree.js +35 -18
  302. package/dist/runtime/worktree.js.map +1 -1
  303. package/dist/tui/dashboard.d.ts.map +1 -1
  304. package/dist/tui/dashboard.js +20 -16
  305. package/dist/tui/dashboard.js.map +1 -1
  306. package/dist/tui/progress.d.ts +2 -0
  307. package/dist/tui/progress.d.ts.map +1 -1
  308. package/dist/tui/progress.js +105 -33
  309. package/dist/tui/progress.js.map +1 -1
  310. package/dist/tui/renderer.d.ts.map +1 -1
  311. package/dist/tui/renderer.js.map +1 -1
  312. package/dist/utils/compact-format.js +1 -1
  313. package/dist/utils/compact-format.js.map +1 -1
  314. package/dist/utils/config.d.ts.map +1 -1
  315. package/dist/utils/config.js.map +1 -1
  316. package/dist/utils/env.d.ts.map +1 -1
  317. package/dist/utils/env.js +19 -5
  318. package/dist/utils/env.js.map +1 -1
  319. package/dist/utils/errors.d.ts.map +1 -1
  320. package/dist/utils/errors.js +3 -7
  321. package/dist/utils/errors.js.map +1 -1
  322. package/dist/utils/output.d.ts.map +1 -1
  323. package/dist/utils/output.js +6 -2
  324. package/dist/utils/output.js.map +1 -1
  325. package/dist/utils/project-config.d.ts +18 -0
  326. package/dist/utils/project-config.d.ts.map +1 -1
  327. package/dist/utils/project-config.js +14 -6
  328. package/dist/utils/project-config.js.map +1 -1
  329. package/dist/utils/schemas.d.ts.map +1 -1
  330. package/dist/utils/schemas.js +12 -12
  331. package/dist/utils/schemas.js.map +1 -1
  332. package/dist/utils/terminal.d.ts.map +1 -1
  333. package/dist/utils/terminal.js +18 -7
  334. package/dist/utils/terminal.js.map +1 -1
  335. package/dist/utils/tiers.d.ts.map +1 -1
  336. package/dist/utils/tiers.js +14 -6
  337. package/dist/utils/tiers.js.map +1 -1
  338. package/package.json +15 -4
  339. package/skills/swarm-output-style/SKILL.md +154 -48
@@ -0,0 +1,441 @@
1
+ import Database from 'better-sqlite3';
2
+ import { existsSync, mkdirSync } from 'fs';
3
+ import { dirname } from 'path';
4
+ import { getDatabase } from './database.js';
5
+ /**
6
+ * Persistent execution knowledge graph backed by SQLite. Records orchestration
7
+ * topology (phases, agents, files, patterns) as nodes and edges, enabling
8
+ * cross-run learning, graph-routed context assembly, and failure prediction.
9
+ */
10
+ export class ExecutionGraph {
11
+ db;
12
+ ownDb;
13
+ bus = null;
14
+ listeners = [];
15
+ currentPhaseMap = new Map(); // orchestrationId → current phase nodeId
16
+ constructor(dbPath) {
17
+ if (dbPath) {
18
+ const dir = dirname(dbPath);
19
+ if (!existsSync(dir))
20
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
21
+ this.db = new Database(dbPath);
22
+ this.db.pragma('journal_mode = WAL');
23
+ this.db.pragma('busy_timeout = 5000');
24
+ this.ownDb = true;
25
+ }
26
+ else {
27
+ this.db = getDatabase();
28
+ this.ownDb = false;
29
+ }
30
+ this.initSchema();
31
+ }
32
+ initSchema() {
33
+ this.db.exec(`
34
+ CREATE TABLE IF NOT EXISTS graph_nodes (
35
+ id TEXT PRIMARY KEY,
36
+ type TEXT NOT NULL,
37
+ label TEXT NOT NULL,
38
+ properties TEXT DEFAULT '{}',
39
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
40
+ );
41
+ CREATE TABLE IF NOT EXISTS graph_edges (
42
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
43
+ source TEXT NOT NULL,
44
+ target TEXT NOT NULL,
45
+ type TEXT NOT NULL,
46
+ weight REAL DEFAULT 1.0,
47
+ confidence TEXT DEFAULT 'EXTRACTED',
48
+ properties TEXT DEFAULT '{}',
49
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
50
+ );
51
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_source ON graph_edges(source, type);
52
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_target ON graph_edges(target, type);
53
+ CREATE INDEX IF NOT EXISTS idx_graph_nodes_type ON graph_nodes(type);
54
+ CREATE INDEX IF NOT EXISTS idx_graph_edges_confidence ON graph_edges(confidence);
55
+ `);
56
+ }
57
+ // ─── CRUD ───────────────────────────────────────────────────────
58
+ addNode(node) {
59
+ this.db
60
+ .prepare(`INSERT OR REPLACE INTO graph_nodes (id, type, label, properties)
61
+ VALUES (?, ?, ?, ?)`)
62
+ .run(node.id, node.type, node.label, JSON.stringify(node.properties ?? {}));
63
+ }
64
+ addEdge(edge) {
65
+ this.db
66
+ .prepare(`INSERT INTO graph_edges (source, target, type, weight, confidence, properties)
67
+ VALUES (?, ?, ?, ?, ?, ?)`)
68
+ .run(edge.source, edge.target, edge.type, edge.weight ?? 1.0, edge.confidence ?? 'EXTRACTED', JSON.stringify(edge.properties ?? {}));
69
+ }
70
+ getNode(id) {
71
+ const row = this.db.prepare('SELECT * FROM graph_nodes WHERE id = ?').get(id);
72
+ if (!row)
73
+ return null;
74
+ return { ...row, properties: JSON.parse(row.properties) };
75
+ }
76
+ getEdges(nodeId, direction = 'both') {
77
+ let sql;
78
+ if (direction === 'outgoing') {
79
+ sql = 'SELECT * FROM graph_edges WHERE source = ?';
80
+ }
81
+ else if (direction === 'incoming') {
82
+ sql = 'SELECT * FROM graph_edges WHERE target = ?';
83
+ }
84
+ else {
85
+ sql = 'SELECT * FROM graph_edges WHERE source = ? OR target = ?';
86
+ }
87
+ const rows = (direction === 'both' ? this.db.prepare(sql).all(nodeId, nodeId) : this.db.prepare(sql).all(nodeId));
88
+ return rows.map((r) => ({ ...r, properties: JSON.parse(r.properties) }));
89
+ }
90
+ getNeighbors(nodeId, edgeType) {
91
+ let sql;
92
+ let params;
93
+ if (edgeType) {
94
+ sql = `SELECT DISTINCT n.* FROM graph_nodes n
95
+ JOIN graph_edges e ON (e.target = n.id AND e.source = ?) OR (e.source = n.id AND e.target = ?)
96
+ WHERE e.type = ?`;
97
+ params = [nodeId, nodeId, edgeType];
98
+ }
99
+ else {
100
+ sql = `SELECT DISTINCT n.* FROM graph_nodes n
101
+ JOIN graph_edges e ON (e.target = n.id AND e.source = ?) OR (e.source = n.id AND e.target = ?)`;
102
+ params = [nodeId, nodeId];
103
+ }
104
+ const rows = this.db.prepare(sql).all(...params);
105
+ return rows.map((r) => ({ ...r, properties: JSON.parse(r.properties) }));
106
+ }
107
+ // ─── Traversal ──────────────────────────────────────────────────
108
+ bfs(startId, maxDepth = 3) {
109
+ const visited = new Set();
110
+ const resultNodes = [];
111
+ const resultEdges = [];
112
+ const queue = [{ id: startId, depth: 0 }];
113
+ while (queue.length > 0) {
114
+ const { id, depth } = queue.shift();
115
+ if (visited.has(id))
116
+ continue;
117
+ visited.add(id);
118
+ const node = this.getNode(id);
119
+ if (node)
120
+ resultNodes.push(node);
121
+ if (depth >= maxDepth)
122
+ continue;
123
+ const edges = this.getEdges(id);
124
+ for (const edge of edges) {
125
+ resultEdges.push(edge);
126
+ const neighborId = edge.source === id ? edge.target : edge.source;
127
+ if (!visited.has(neighborId)) {
128
+ queue.push({ id: neighborId, depth: depth + 1 });
129
+ }
130
+ }
131
+ }
132
+ // Deduplicate edges by source-type-target key
133
+ const uniqueEdges = [...new Map(resultEdges.map((e) => [`${e.source}-${e.type}-${e.target}`, e])).values()];
134
+ return { nodes: resultNodes, edges: uniqueEdges };
135
+ }
136
+ dfs(startId, maxDepth = 6) {
137
+ const visited = new Set();
138
+ const resultNodes = [];
139
+ const resultEdges = [];
140
+ const stack = [{ id: startId, depth: 0 }];
141
+ while (stack.length > 0) {
142
+ const { id, depth } = stack.pop();
143
+ if (visited.has(id))
144
+ continue;
145
+ visited.add(id);
146
+ const node = this.getNode(id);
147
+ if (node)
148
+ resultNodes.push(node);
149
+ if (depth >= maxDepth)
150
+ continue;
151
+ const edges = this.getEdges(id);
152
+ for (const edge of edges) {
153
+ resultEdges.push(edge);
154
+ const neighborId = edge.source === id ? edge.target : edge.source;
155
+ if (!visited.has(neighborId)) {
156
+ stack.push({ id: neighborId, depth: depth + 1 });
157
+ }
158
+ }
159
+ }
160
+ // Deduplicate edges by source-type-target key
161
+ const uniqueEdges = [...new Map(resultEdges.map((e) => [`${e.source}-${e.type}-${e.target}`, e])).values()];
162
+ return { nodes: resultNodes, edges: uniqueEdges };
163
+ }
164
+ shortestPath(fromId, toId, maxHops = 8) {
165
+ const visited = new Set();
166
+ const parent = new Map();
167
+ const queue = [{ id: fromId, depth: 0 }];
168
+ visited.add(fromId);
169
+ while (queue.length > 0) {
170
+ const { id, depth } = queue.shift();
171
+ if (id === toId) {
172
+ // Reconstruct path
173
+ const pathNodes = [];
174
+ const pathEdges = [];
175
+ let current = toId;
176
+ while (current !== fromId) {
177
+ const node = this.getNode(current);
178
+ if (node)
179
+ pathNodes.unshift(node);
180
+ const p = parent.get(current);
181
+ pathEdges.unshift(p.edge);
182
+ current = p.nodeId;
183
+ }
184
+ const startNode = this.getNode(fromId);
185
+ if (startNode)
186
+ pathNodes.unshift(startNode);
187
+ return { nodes: pathNodes, edges: pathEdges };
188
+ }
189
+ if (depth >= maxHops)
190
+ continue;
191
+ const edges = this.getEdges(id);
192
+ for (const edge of edges) {
193
+ const neighborId = edge.source === id ? edge.target : edge.source;
194
+ if (!visited.has(neighborId)) {
195
+ visited.add(neighborId);
196
+ parent.set(neighborId, { nodeId: id, edge });
197
+ queue.push({ id: neighborId, depth: depth + 1 });
198
+ }
199
+ }
200
+ }
201
+ return null;
202
+ }
203
+ // ─── Upsert / Update / Prune ─────────────────────────────────────
204
+ /**
205
+ * INSERT OR UPDATE an edge. If an edge with the same source+target+type
206
+ * already exists, increment its weight and merge properties. Otherwise INSERT.
207
+ */
208
+ upsertEdge(edge) {
209
+ const existing = this.db
210
+ .prepare('SELECT id, weight, properties FROM graph_edges WHERE source = ? AND target = ? AND type = ?')
211
+ .get(edge.source, edge.target, edge.type);
212
+ if (existing) {
213
+ const mergedProps = { ...JSON.parse(existing.properties), ...(edge.properties ?? {}) };
214
+ this.db
215
+ .prepare('UPDATE graph_edges SET weight = ?, properties = ?, confidence = COALESCE(?, confidence) WHERE id = ?')
216
+ .run(existing.weight + (edge.weight ?? 1.0), JSON.stringify(mergedProps), edge.confidence ?? null, existing.id);
217
+ }
218
+ else {
219
+ this.addEdge(edge);
220
+ }
221
+ }
222
+ /**
223
+ * Adjust weight on existing edges matching source+target+type by delta.
224
+ * Returns the number of rows updated.
225
+ */
226
+ updateEdgeWeight(source, target, type, delta) {
227
+ const result = this.db
228
+ .prepare('UPDATE graph_edges SET weight = MAX(weight + ?, 0) WHERE source = ? AND target = ? AND type = ?')
229
+ .run(delta, source, target, type);
230
+ return result.changes;
231
+ }
232
+ /**
233
+ * Delete edges older than N days, then delete orphan nodes
234
+ * (nodes with no remaining edges).
235
+ */
236
+ pruneOlderThan(days) {
237
+ const edgeResult = this.db
238
+ .prepare("DELETE FROM graph_edges WHERE (julianday('now') - julianday(created_at)) > ?")
239
+ .run(days);
240
+ const edgesDeleted = edgeResult.changes;
241
+ const nodeResult = this.db
242
+ .prepare(`DELETE FROM graph_nodes WHERE id NOT IN (
243
+ SELECT source FROM graph_edges UNION SELECT target FROM graph_edges
244
+ )`)
245
+ .run();
246
+ const nodesDeleted = nodeResult.changes;
247
+ return { nodesDeleted, edgesDeleted };
248
+ }
249
+ /**
250
+ * Return the age of a node in days, or null if the node doesn't exist.
251
+ */
252
+ getNodeAge(nodeId) {
253
+ const row = this.db
254
+ .prepare("SELECT (julianday('now') - julianday(created_at)) as age FROM graph_nodes WHERE id = ?")
255
+ .get(nodeId);
256
+ return row?.age ?? null;
257
+ }
258
+ // ─── Query ──────────────────────────────────────────────────────
259
+ getNodesByType(type) {
260
+ const rows = this.db.prepare('SELECT * FROM graph_nodes WHERE type = ?').all(type);
261
+ return rows.map((r) => ({ ...r, properties: JSON.parse(r.properties) }));
262
+ }
263
+ getEdgesByType(type) {
264
+ const rows = this.db.prepare('SELECT * FROM graph_edges WHERE type = ?').all(type);
265
+ return rows.map((r) => ({ ...r, properties: JSON.parse(r.properties) }));
266
+ }
267
+ // ─── Stats ──────────────────────────────────────────────────────
268
+ stats() {
269
+ const nodeCount = this.db.prepare('SELECT COUNT(*) as count FROM graph_nodes').get().count;
270
+ const edgeCount = this.db.prepare('SELECT COUNT(*) as count FROM graph_edges').get().count;
271
+ const nodesByType = {};
272
+ const nodeRows = this.db.prepare('SELECT type, COUNT(*) as count FROM graph_nodes GROUP BY type').all();
273
+ for (const row of nodeRows)
274
+ nodesByType[row.type] = row.count;
275
+ const edgesByType = {};
276
+ const edgeRows = this.db.prepare('SELECT type, COUNT(*) as count FROM graph_edges GROUP BY type').all();
277
+ for (const row of edgeRows)
278
+ edgesByType[row.type] = row.count;
279
+ return { nodeCount, edgeCount, nodesByType, edgesByType };
280
+ }
281
+ // ─── EventBus Integration ───────────────────────────────────────
282
+ attachToEventBus(bus) {
283
+ this.bus = bus;
284
+ const onOrchStart = (event) => {
285
+ const d = event.data;
286
+ this.addNode({
287
+ id: d.id,
288
+ type: 'orchestration',
289
+ label: d.name,
290
+ properties: { pattern: d.pattern, phaseCount: d.phaseCount },
291
+ });
292
+ // Add pattern node (idempotent via INSERT OR REPLACE)
293
+ const patternId = `pattern:${d.pattern}`;
294
+ this.addNode({
295
+ id: patternId,
296
+ type: 'pattern',
297
+ label: d.pattern,
298
+ properties: {},
299
+ });
300
+ this.addEdge({
301
+ source: d.id,
302
+ target: patternId,
303
+ type: 'used_pattern',
304
+ confidence: 'EXTRACTED',
305
+ });
306
+ };
307
+ bus.on('orchestration:start', onOrchStart);
308
+ this.listeners.push({ event: 'orchestration:start', handler: onOrchStart });
309
+ const onPhaseStart = (event) => {
310
+ const d = event.data;
311
+ const phaseId = `${d.orchestrationId}:phase:${d.phase}`;
312
+ this.addNode({
313
+ id: phaseId,
314
+ type: 'phase',
315
+ label: d.phase,
316
+ properties: { agentCount: d.agentCount, parallel: d.parallel },
317
+ });
318
+ this.addEdge({
319
+ source: d.orchestrationId,
320
+ target: phaseId,
321
+ type: 'contains',
322
+ confidence: 'EXTRACTED',
323
+ });
324
+ this.currentPhaseMap.set(d.orchestrationId, phaseId);
325
+ };
326
+ bus.on('orchestration:phase-start', onPhaseStart);
327
+ this.listeners.push({ event: 'orchestration:phase-start', handler: onPhaseStart });
328
+ const onAgentSpawning = (event) => {
329
+ const d = event.data;
330
+ this.addNode({
331
+ id: d.agentId,
332
+ type: 'agent',
333
+ label: d.agentType,
334
+ properties: { model: d.model },
335
+ });
336
+ // NOTE: agent:spawning doesn't carry orchestrationId so we can't do a precise
337
+ // lookup. This assumes single-orchestration-at-a-time; for concurrent orchestrations
338
+ // the event schema would need to be extended. Use the most recently added phase
339
+ // (last entry in Map) as the best approximation.
340
+ let currentPhaseId;
341
+ for (const [, phaseId] of this.currentPhaseMap) {
342
+ currentPhaseId = phaseId; // keep overwriting — last one wins
343
+ }
344
+ if (currentPhaseId) {
345
+ this.addEdge({
346
+ source: currentPhaseId,
347
+ target: d.agentId,
348
+ type: 'spawned',
349
+ confidence: 'EXTRACTED',
350
+ });
351
+ }
352
+ };
353
+ bus.on('agent:spawning', onAgentSpawning);
354
+ this.listeners.push({ event: 'agent:spawning', handler: onAgentSpawning });
355
+ const onAgentIdle = (event) => {
356
+ const d = event.data;
357
+ // Update agent node with result
358
+ this.addNode({
359
+ id: d.agentId,
360
+ type: 'agent',
361
+ label: d.agentType,
362
+ properties: {
363
+ model: d.model,
364
+ backend: d.backend,
365
+ usage: d.usage,
366
+ status: 'idle',
367
+ },
368
+ });
369
+ // Add file nodes + edges if filesTouched exists
370
+ if (d.result?.filesTouched) {
371
+ for (const file of d.result.filesTouched) {
372
+ const fileId = `file:${file}`;
373
+ this.addNode({
374
+ id: fileId,
375
+ type: 'file',
376
+ label: file,
377
+ properties: {},
378
+ });
379
+ this.addEdge({
380
+ source: d.agentId,
381
+ target: fileId,
382
+ type: 'touched_file',
383
+ confidence: 'EXTRACTED',
384
+ });
385
+ }
386
+ }
387
+ };
388
+ bus.on('agent:idle', onAgentIdle);
389
+ this.listeners.push({ event: 'agent:idle', handler: onAgentIdle });
390
+ const onPhaseComplete = (event) => {
391
+ const d = event.data;
392
+ const phaseId = `${d.orchestrationId}:phase:${d.phase}`;
393
+ this.addNode({
394
+ id: phaseId,
395
+ type: 'phase',
396
+ label: d.phase,
397
+ properties: { status: d.status, usage: d.usage },
398
+ });
399
+ };
400
+ bus.on('orchestration:phase-complete', onPhaseComplete);
401
+ this.listeners.push({ event: 'orchestration:phase-complete', handler: onPhaseComplete });
402
+ const onOrchComplete = (event) => {
403
+ const d = event.data;
404
+ this.addNode({
405
+ id: d.id,
406
+ type: 'orchestration',
407
+ label: d.name,
408
+ properties: { status: d.status, usage: d.usage, durationMs: d.durationMs },
409
+ });
410
+ this.currentPhaseMap.delete(d.id);
411
+ };
412
+ bus.on('orchestration:complete', onOrchComplete);
413
+ this.listeners.push({ event: 'orchestration:complete', handler: onOrchComplete });
414
+ const onOrchFailed = (event) => {
415
+ const d = event.data;
416
+ this.addNode({
417
+ id: d.id,
418
+ type: 'orchestration',
419
+ label: d.name,
420
+ properties: { status: d.status, usage: d.usage, durationMs: d.durationMs },
421
+ });
422
+ this.currentPhaseMap.delete(d.id);
423
+ };
424
+ bus.on('orchestration:failed', onOrchFailed);
425
+ this.listeners.push({ event: 'orchestration:failed', handler: onOrchFailed });
426
+ }
427
+ detachFromEventBus(bus) {
428
+ for (const { event, handler } of this.listeners) {
429
+ bus.off(event, handler);
430
+ }
431
+ this.listeners = [];
432
+ }
433
+ // ─── Lifecycle ──────────────────────────────────────────────────
434
+ close() {
435
+ if (this.bus)
436
+ this.detachFromEventBus(this.bus);
437
+ if (this.ownDb)
438
+ this.db.close();
439
+ }
440
+ }
441
+ //# sourceMappingURL=execution-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-graph.js","sourceRoot":"","sources":["../../src/runtime/execution-graph.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,6 @@ export declare class AgentExecutor {
36
36
  private snapshotsEnabled;
37
37
  private paneManager;
38
38
  private pluginLoader;
39
- private _disposed;
40
39
  constructor(options: ExecutorOptions);
41
40
  /**
42
41
  * Execute an agent with a task. Routes to the appropriate backend.
@@ -64,7 +63,7 @@ export declare class AgentExecutor {
64
63
  */
65
64
  rollbackAgent(snapshotId: string): boolean;
66
65
  /**
67
- * Dispose of executor resources. Prevents further execution.
66
+ * Lifecycle hook — called when the executor is no longer needed.
68
67
  */
69
68
  dispose(): void;
70
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/runtime/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,WAAW,EAGZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,mBAAmB,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,QAAQ,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,eAAe;IAgCpC;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAyH1E;;;OAGG;YACW,qBAAqB;IAqCnC;;OAEG;IACH,OAAO,CAAC,eAAe;IA0EvB;;OAEG;IACH,WAAW,IAAI,eAAe;IAI9B;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAQ1C;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/runtime/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,aAAa,EAAE,WAAW,EAA+B,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,mBAAmB,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,QAAQ,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAsB;gBAE9B,OAAO,EAAE,eAAe;IAoCpC;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA2K1E;;;OAGG;YACW,qBAAqB;IAyCnC;;OAEG;IACH,OAAO,CAAC,eAAe;IA8EvB;;OAEG;IACH,WAAW,IAAI,eAAe;IAI9B;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAQ1C;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
@@ -19,7 +19,6 @@ export class AgentExecutor {
19
19
  snapshotsEnabled;
20
20
  paneManager;
21
21
  pluginLoader;
22
- _disposed = false;
23
22
  constructor(options) {
24
23
  this.bus = options.bus;
25
24
  this.log = options.logger.child('executor');
@@ -58,7 +57,10 @@ export class AgentExecutor {
58
57
  const backendName = this.mock ? 'mock' : (config.backend ?? this.defaultBackend);
59
58
  const backend = this.backends.get(backendName);
60
59
  if (!backend) {
61
- throw new Error(`Unknown backend: ${backendName}. Available: ${this.backends.list().map(b => b.name).join(', ')}`);
60
+ throw new Error(`Unknown backend: ${backendName}. Available: ${this.backends
61
+ .list()
62
+ .map((b) => b.name)
63
+ .join(', ')}`);
62
64
  }
63
65
  this.log.info(`Executing agent: ${config.name}`, {
64
66
  backend: backendName,
@@ -68,6 +70,7 @@ export class AgentExecutor {
68
70
  this.bus.emit('agent:running', {
69
71
  agentId: instance.id,
70
72
  agentType: config.name,
73
+ model: config.model,
71
74
  backend: backendName,
72
75
  task: task.slice(0, 200),
73
76
  }, instance.id);
@@ -75,7 +78,7 @@ export class AgentExecutor {
75
78
  if (this.pluginLoader) {
76
79
  const tools = this.pluginLoader.getAllTools();
77
80
  if (tools.length > 0) {
78
- const toolDesc = tools.map(t => `- ${t.name}: ${t.description}`).join('\n');
81
+ const toolDesc = tools.map((t) => `- ${t.name}: ${t.description}`).join('\n');
79
82
  task = `${task}\n\nAvailable plugin tools:\n${toolDesc}`;
80
83
  }
81
84
  }
@@ -84,13 +87,17 @@ export class AgentExecutor {
84
87
  if (profileName) {
85
88
  const checker = new PermissionChecker(profileName);
86
89
  const profile = checker.getProfile();
87
- const rules = profile.rules.map(r => {
88
- const action = r.action === 'allow' ? 'ALLOWED — use freely'
89
- : r.action === 'deny' ? 'NEVER USE this tool'
90
+ const rules = profile.rules
91
+ .map((r) => {
92
+ const action = r.action === 'allow'
93
+ ? 'ALLOWED — use freely'
94
+ : r.action === 'deny'
95
+ ? 'NEVER USE this tool'
90
96
  : 'ASK the user for permission before using';
91
97
  const scope = r.filePattern ? ` (files matching ${r.filePattern})` : '';
92
98
  return `- **${r.tool}**${scope}: ${action}`;
93
- }).join('\n');
99
+ })
100
+ .join('\n');
94
101
  task = `## Tool Permissions\n${rules}\n\nIMPORTANT: Respect these permissions. Do not use denied tools.\n\n${task}`;
95
102
  }
96
103
  // Reset doom loop detector for new agent execution
@@ -128,6 +135,28 @@ export class AgentExecutor {
128
135
  result: backendResult.result,
129
136
  usage: instance.usage,
130
137
  }, instance.id);
138
+ // Extract and emit key findings from agent output for the progress stream
139
+ if (backendResult.result.output) {
140
+ const output = backendResult.result.output;
141
+ // Look for structured findings (Critical/Important/Suggestion patterns)
142
+ const findingPatterns = [
143
+ { pattern: /\*\*Critical\*\*[:\s]+(.{10,80})/gi, severity: 'critical' },
144
+ { pattern: /\*\*Important\*\*[:\s]+(.{10,80})/gi, severity: 'important' },
145
+ { pattern: /(?:^|\n)[-*]\s+(.{15,80})/g, severity: 'info' },
146
+ ];
147
+ for (const { pattern, severity } of findingPatterns) {
148
+ const match = pattern.exec(output);
149
+ if (match?.[1]) {
150
+ this.bus.emit('agent:finding', {
151
+ agentId: instance.id,
152
+ agentType: config.name,
153
+ finding: match[1].trim(),
154
+ severity,
155
+ }, instance.id);
156
+ break; // One finding per agent is enough for the progress stream
157
+ }
158
+ }
159
+ }
131
160
  this.log.info(`Agent completed: ${config.name}`, {
132
161
  backend: backendName,
133
162
  duration: `${durationMs}ms`,
@@ -157,9 +186,7 @@ export class AgentExecutor {
157
186
  */
158
187
  async executePaneOrFallback(config, task, backendName, options, backend) {
159
188
  const pm = this.paneManager;
160
- const fullPrompt = config.prompt
161
- ? `${config.prompt}\n\n## Task:\n${task}`
162
- : task;
189
+ const fullPrompt = config.prompt ? `${config.prompt}\n\n## Task:\n${task}` : task;
163
190
  const command = buildPaneCommand(backendName, fullPrompt, options.cwd);
164
191
  if (!command) {
165
192
  // Backend uses Agent SDK — no CLI command to show in a pane.
@@ -216,7 +243,9 @@ export class AgentExecutor {
216
243
  }
217
244
  }
218
245
  }
219
- catch { /* not JSON */ }
246
+ catch {
247
+ /* not JSON */
248
+ }
220
249
  }
221
250
  }
222
251
  else if (backendName === 'gemini') {
@@ -229,7 +258,9 @@ export class AgentExecutor {
229
258
  outputTokens = result.stats.output_tokens ?? result.stats.outputTokens ?? 0;
230
259
  }
231
260
  }
232
- catch { /* use raw output */ }
261
+ catch {
262
+ /* use raw output */
263
+ }
233
264
  }
234
265
  const usage = {
235
266
  inputTokens,
@@ -274,10 +305,10 @@ export class AgentExecutor {
274
305
  return result;
275
306
  }
276
307
  /**
277
- * Dispose of executor resources. Prevents further execution.
308
+ * Lifecycle hook — called when the executor is no longer needed.
278
309
  */
279
310
  dispose() {
280
- this._disposed = true;
311
+ // No-op: lifecycle hook for future cleanup needs
281
312
  }
282
313
  }
283
314
  //# sourceMappingURL=executor.js.map