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.
- package/CLAUDE.md +1 -1
- package/README.md +145 -30
- package/commands/diff-review.md +27 -15
- package/commands/discover.md +102 -0
- package/commands/dynamic.md +136 -0
- package/commands/fix-pr.md +30 -24
- package/commands/postmortem.md +106 -0
- package/commands/red-team.md +41 -26
- package/commands/research.md +22 -1
- package/commands/review-cycle.md +38 -20
- package/commands/spike.md +108 -0
- package/commands/swarm.md +68 -60
- package/commands/tdd.md +44 -24
- package/dist/cli/commands/acp.d.ts.map +1 -1
- package/dist/cli/commands/acp.js +12 -2
- package/dist/cli/commands/acp.js.map +1 -1
- package/dist/cli/commands/agents.d.ts.map +1 -1
- package/dist/cli/commands/agents.js +16 -13
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/completions.d.ts.map +1 -1
- package/dist/cli/commands/completions.js +21 -9
- package/dist/cli/commands/completions.js.map +1 -1
- package/dist/cli/commands/compound.d.ts.map +1 -1
- package/dist/cli/commands/compound.js +1 -2
- package/dist/cli/commands/compound.js.map +1 -1
- package/dist/cli/commands/configure.d.ts.map +1 -1
- package/dist/cli/commands/configure.js +24 -8
- package/dist/cli/commands/configure.js.map +1 -1
- package/dist/cli/commands/convert.d.ts +1 -1
- package/dist/cli/commands/convert.d.ts.map +1 -1
- package/dist/cli/commands/convert.js +22 -48
- package/dist/cli/commands/convert.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +1 -3
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +17 -7
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +1 -1
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/learn.js +6 -6
- package/dist/cli/commands/learn.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +1 -2
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +118 -2
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/orchestrate.d.ts.map +1 -1
- package/dist/cli/commands/orchestrate.js +20 -7
- package/dist/cli/commands/orchestrate.js.map +1 -1
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/plugin.d.ts.map +1 -1
- package/dist/cli/commands/plugin.js +8 -5
- package/dist/cli/commands/plugin.js.map +1 -1
- package/dist/cli/commands/resume.js +1 -1
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +20 -6
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/share.d.ts.map +1 -1
- package/dist/cli/commands/share.js +6 -1
- package/dist/cli/commands/share.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +15 -7
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/template.d.ts.map +1 -1
- package/dist/cli/commands/template.js +14 -6
- package/dist/cli/commands/template.js.map +1 -1
- package/dist/cli/commands/vault.d.ts.map +1 -1
- package/dist/cli/commands/vault.js +14 -9
- package/dist/cli/commands/vault.js.map +1 -1
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +2 -2
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/commands/watch.js +1 -1
- package/dist/cli/commands/watch.js.map +1 -1
- package/dist/cli/index.js +14 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/core/checkpoint.js +1 -1
- package/dist/core/checkpoint.js.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +9 -3
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/patterns.d.ts.map +1 -1
- package/dist/core/patterns.js +31 -8
- package/dist/core/patterns.js.map +1 -1
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +21 -10
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +10 -6
- package/dist/core/registry.js.map +1 -1
- package/dist/core/snapshots.d.ts.map +1 -1
- package/dist/core/snapshots.js +17 -5
- package/dist/core/snapshots.js.map +1 -1
- package/dist/core/types.d.ts +33 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.d.ts +114 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +92 -4
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +38 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +136 -24
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/schema.d.ts +1 -0
- package/dist/memory/schema.d.ts.map +1 -1
- package/dist/memory/schema.js +20 -19
- package/dist/memory/schema.js.map +1 -1
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js.map +1 -1
- package/dist/runtime/acp.d.ts.map +1 -1
- package/dist/runtime/acp.js +71 -41
- package/dist/runtime/acp.js.map +1 -1
- package/dist/runtime/adaptive.d.ts.map +1 -1
- package/dist/runtime/adaptive.js +30 -31
- package/dist/runtime/adaptive.js.map +1 -1
- package/dist/runtime/agent-runner.d.ts +62 -0
- package/dist/runtime/agent-runner.d.ts.map +1 -0
- package/dist/runtime/agent-runner.js +224 -0
- package/dist/runtime/agent-runner.js.map +1 -0
- package/dist/runtime/autonomy.d.ts +1 -0
- package/dist/runtime/autonomy.d.ts.map +1 -1
- package/dist/runtime/autonomy.js +37 -19
- package/dist/runtime/autonomy.js.map +1 -1
- package/dist/runtime/backends/claude.d.ts.map +1 -1
- package/dist/runtime/backends/claude.js +2 -2
- package/dist/runtime/backends/claude.js.map +1 -1
- package/dist/runtime/backends/codex.d.ts.map +1 -1
- package/dist/runtime/backends/codex.js +8 -11
- package/dist/runtime/backends/codex.js.map +1 -1
- package/dist/runtime/backends/gemini.d.ts.map +1 -1
- package/dist/runtime/backends/gemini.js +11 -7
- package/dist/runtime/backends/gemini.js.map +1 -1
- package/dist/runtime/backends/index.js +1 -1
- package/dist/runtime/backends/index.js.map +1 -1
- package/dist/runtime/backends/mock.d.ts.map +1 -1
- package/dist/runtime/backends/mock.js +1 -1
- package/dist/runtime/backends/mock.js.map +1 -1
- package/dist/runtime/backends/vercel-ai.d.ts.map +1 -1
- package/dist/runtime/backends/vercel-ai.js +41 -9
- package/dist/runtime/backends/vercel-ai.js.map +1 -1
- package/dist/runtime/cache-optimizer.d.ts.map +1 -1
- package/dist/runtime/cache-optimizer.js +3 -9
- package/dist/runtime/cache-optimizer.js.map +1 -1
- package/dist/runtime/cascade.d.ts.map +1 -1
- package/dist/runtime/cascade.js +34 -7
- package/dist/runtime/cascade.js.map +1 -1
- package/dist/runtime/chunker.d.ts.map +1 -1
- package/dist/runtime/chunker.js +12 -6
- package/dist/runtime/chunker.js.map +1 -1
- package/dist/runtime/compounder.d.ts +1 -1
- package/dist/runtime/compounder.d.ts.map +1 -1
- package/dist/runtime/compounder.js +30 -11
- package/dist/runtime/compounder.js.map +1 -1
- package/dist/runtime/cost-model.d.ts.map +1 -1
- package/dist/runtime/cost-model.js +1 -1
- package/dist/runtime/cost-model.js.map +1 -1
- package/dist/runtime/database.d.ts +16 -0
- package/dist/runtime/database.d.ts.map +1 -0
- package/dist/runtime/database.js +39 -0
- package/dist/runtime/database.js.map +1 -0
- package/dist/runtime/distiller.d.ts.map +1 -1
- package/dist/runtime/distiller.js +6 -3
- package/dist/runtime/distiller.js.map +1 -1
- package/dist/runtime/engine.d.ts +25 -9
- package/dist/runtime/engine.d.ts.map +1 -1
- package/dist/runtime/engine.js +417 -378
- package/dist/runtime/engine.js.map +1 -1
- package/dist/runtime/execution-graph.d.ts +86 -0
- package/dist/runtime/execution-graph.d.ts.map +1 -0
- package/dist/runtime/execution-graph.js +441 -0
- package/dist/runtime/execution-graph.js.map +1 -0
- package/dist/runtime/executor.d.ts +1 -2
- package/dist/runtime/executor.d.ts.map +1 -1
- package/dist/runtime/executor.js +45 -14
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/graph-adversarial.d.ts +88 -0
- package/dist/runtime/graph-adversarial.d.ts.map +1 -0
- package/dist/runtime/graph-adversarial.js +378 -0
- package/dist/runtime/graph-adversarial.js.map +1 -0
- package/dist/runtime/graph-analyzer.d.ts +106 -0
- package/dist/runtime/graph-analyzer.d.ts.map +1 -0
- package/dist/runtime/graph-analyzer.js +321 -0
- package/dist/runtime/graph-analyzer.js.map +1 -0
- package/dist/runtime/graph-causal.d.ts +91 -0
- package/dist/runtime/graph-causal.d.ts.map +1 -0
- package/dist/runtime/graph-causal.js +292 -0
- package/dist/runtime/graph-causal.js.map +1 -0
- package/dist/runtime/graph-context-router.d.ts +73 -0
- package/dist/runtime/graph-context-router.d.ts.map +1 -0
- package/dist/runtime/graph-context-router.js +162 -0
- package/dist/runtime/graph-context-router.js.map +1 -0
- package/dist/runtime/graph-discovery.d.ts +71 -0
- package/dist/runtime/graph-discovery.d.ts.map +1 -0
- package/dist/runtime/graph-discovery.js +367 -0
- package/dist/runtime/graph-discovery.js.map +1 -0
- package/dist/runtime/graph-dropout.d.ts +59 -0
- package/dist/runtime/graph-dropout.d.ts.map +1 -0
- package/dist/runtime/graph-dropout.js +196 -0
- package/dist/runtime/graph-dropout.js.map +1 -0
- package/dist/runtime/graph-embeddings.d.ts +58 -0
- package/dist/runtime/graph-embeddings.d.ts.map +1 -0
- package/dist/runtime/graph-embeddings.js +301 -0
- package/dist/runtime/graph-embeddings.js.map +1 -0
- package/dist/runtime/graph-feedback.d.ts +30 -0
- package/dist/runtime/graph-feedback.d.ts.map +1 -0
- package/dist/runtime/graph-feedback.js +82 -0
- package/dist/runtime/graph-feedback.js.map +1 -0
- package/dist/runtime/graph-gnn.d.ts +120 -0
- package/dist/runtime/graph-gnn.d.ts.map +1 -0
- package/dist/runtime/graph-gnn.js +524 -0
- package/dist/runtime/graph-gnn.js.map +1 -0
- package/dist/runtime/graph-learner.d.ts +70 -0
- package/dist/runtime/graph-learner.d.ts.map +1 -0
- package/dist/runtime/graph-learner.js +265 -0
- package/dist/runtime/graph-learner.js.map +1 -0
- package/dist/runtime/graph-meta-adversarial.d.ts +113 -0
- package/dist/runtime/graph-meta-adversarial.d.ts.map +1 -0
- package/dist/runtime/graph-meta-adversarial.js +366 -0
- package/dist/runtime/graph-meta-adversarial.js.map +1 -0
- package/dist/runtime/graph-meta.d.ts +115 -0
- package/dist/runtime/graph-meta.d.ts.map +1 -0
- package/dist/runtime/graph-meta.js +437 -0
- package/dist/runtime/graph-meta.js.map +1 -0
- package/dist/runtime/graph-self-evolve.d.ts +92 -0
- package/dist/runtime/graph-self-evolve.d.ts.map +1 -0
- package/dist/runtime/graph-self-evolve.js +422 -0
- package/dist/runtime/graph-self-evolve.js.map +1 -0
- package/dist/runtime/graph-synthesis.d.ts +47 -0
- package/dist/runtime/graph-synthesis.d.ts.map +1 -0
- package/dist/runtime/graph-synthesis.js +232 -0
- package/dist/runtime/graph-synthesis.js.map +1 -0
- package/dist/runtime/graph-trajectory.d.ts +88 -0
- package/dist/runtime/graph-trajectory.d.ts.map +1 -0
- package/dist/runtime/graph-trajectory.js +339 -0
- package/dist/runtime/graph-trajectory.js.map +1 -0
- package/dist/runtime/heuristics.d.ts +1 -0
- package/dist/runtime/heuristics.d.ts.map +1 -1
- package/dist/runtime/heuristics.js +44 -22
- package/dist/runtime/heuristics.js.map +1 -1
- package/dist/runtime/learning-engine.d.ts +63 -0
- package/dist/runtime/learning-engine.d.ts.map +1 -0
- package/dist/runtime/learning-engine.js +273 -0
- package/dist/runtime/learning-engine.js.map +1 -0
- package/dist/runtime/living-spec.js +3 -3
- package/dist/runtime/living-spec.js.map +1 -1
- package/dist/runtime/lsp.d.ts.map +1 -1
- package/dist/runtime/lsp.js +41 -14
- package/dist/runtime/lsp.js.map +1 -1
- package/dist/runtime/mcp.d.ts.map +1 -1
- package/dist/runtime/mcp.js +56 -19
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/runtime/model-router.d.ts +1 -0
- package/dist/runtime/model-router.d.ts.map +1 -1
- package/dist/runtime/model-router.js +37 -21
- package/dist/runtime/model-router.js.map +1 -1
- package/dist/runtime/panes.d.ts.map +1 -1
- package/dist/runtime/panes.js +50 -49
- package/dist/runtime/panes.js.map +1 -1
- package/dist/runtime/plan-search.js +2 -2
- package/dist/runtime/plan-search.js.map +1 -1
- package/dist/runtime/plugins.d.ts +1 -1
- package/dist/runtime/plugins.d.ts.map +1 -1
- package/dist/runtime/plugins.js +63 -47
- package/dist/runtime/plugins.js.map +1 -1
- package/dist/runtime/reflexion.d.ts.map +1 -1
- package/dist/runtime/reflexion.js +4 -8
- package/dist/runtime/reflexion.js.map +1 -1
- package/dist/runtime/review-schema.d.ts.map +1 -1
- package/dist/runtime/review-schema.js +12 -12
- package/dist/runtime/review-schema.js.map +1 -1
- package/dist/runtime/rewriter.d.ts.map +1 -1
- package/dist/runtime/rewriter.js +29 -9
- package/dist/runtime/rewriter.js.map +1 -1
- package/dist/runtime/sharing.d.ts +1 -1
- package/dist/runtime/sharing.d.ts.map +1 -1
- package/dist/runtime/sharing.js +55 -27
- package/dist/runtime/sharing.js.map +1 -1
- package/dist/runtime/stats.d.ts +1 -0
- package/dist/runtime/stats.d.ts.map +1 -1
- package/dist/runtime/stats.js +40 -24
- package/dist/runtime/stats.js.map +1 -1
- package/dist/runtime/templates.d.ts.map +1 -1
- package/dist/runtime/templates.js +2 -2
- package/dist/runtime/templates.js.map +1 -1
- package/dist/runtime/traces.d.ts +1 -0
- package/dist/runtime/traces.d.ts.map +1 -1
- package/dist/runtime/traces.js +50 -28
- package/dist/runtime/traces.js.map +1 -1
- package/dist/runtime/verifier.d.ts.map +1 -1
- package/dist/runtime/verifier.js +12 -6
- package/dist/runtime/verifier.js.map +1 -1
- package/dist/runtime/worktree.d.ts.map +1 -1
- package/dist/runtime/worktree.js +35 -18
- package/dist/runtime/worktree.js.map +1 -1
- package/dist/tui/dashboard.d.ts.map +1 -1
- package/dist/tui/dashboard.js +20 -16
- package/dist/tui/dashboard.js.map +1 -1
- package/dist/tui/progress.d.ts +2 -0
- package/dist/tui/progress.d.ts.map +1 -1
- package/dist/tui/progress.js +105 -33
- package/dist/tui/progress.js.map +1 -1
- package/dist/tui/renderer.d.ts.map +1 -1
- package/dist/tui/renderer.js.map +1 -1
- package/dist/utils/compact-format.js +1 -1
- package/dist/utils/compact-format.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/env.js +19 -5
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +3 -7
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +6 -2
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/project-config.d.ts +18 -0
- package/dist/utils/project-config.d.ts.map +1 -1
- package/dist/utils/project-config.js +14 -6
- package/dist/utils/project-config.js.map +1 -1
- package/dist/utils/schemas.d.ts.map +1 -1
- package/dist/utils/schemas.js +12 -12
- package/dist/utils/schemas.js.map +1 -1
- package/dist/utils/terminal.d.ts.map +1 -1
- package/dist/utils/terminal.js +18 -7
- package/dist/utils/terminal.js.map +1 -1
- package/dist/utils/tiers.d.ts.map +1 -1
- package/dist/utils/tiers.js +14 -6
- package/dist/utils/tiers.js.map +1 -1
- package/package.json +15 -4
- 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
|
-
*
|
|
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,
|
|
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"}
|
package/dist/runtime/executor.js
CHANGED
|
@@ -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
|
|
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
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
})
|
|
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 {
|
|
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 {
|
|
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
|
-
*
|
|
308
|
+
* Lifecycle hook — called when the executor is no longer needed.
|
|
278
309
|
*/
|
|
279
310
|
dispose() {
|
|
280
|
-
|
|
311
|
+
// No-op: lifecycle hook for future cleanup needs
|
|
281
312
|
}
|
|
282
313
|
}
|
|
283
314
|
//# sourceMappingURL=executor.js.map
|