swarm-engine 1.43.0 → 1.54.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/README.md +145 -42
- package/agents/implementer.md +1 -14
- package/agents/orchestrator.md +127 -246
- package/agents/reviewer.md +3 -18
- package/dist/cli/commands/agents.js +13 -1
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/dashboard.d.ts +3 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +43 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/orchestrate.d.ts.map +1 -1
- package/dist/cli/commands/orchestrate.js +17 -0
- package/dist/cli/commands/orchestrate.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +20 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +5 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/usage.d.ts +3 -0
- package/dist/cli/commands/usage.d.ts.map +1 -0
- package/dist/cli/commands/usage.js +85 -0
- package/dist/cli/commands/usage.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +4 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/types.d.ts +44 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -1
- package/dist/hooks/cli.js +4 -1
- package/dist/hooks/cli.js.map +1 -1
- package/dist/hooks/index.d.ts +9 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +54 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/transcript-parser.d.ts +68 -0
- package/dist/hooks/transcript-parser.d.ts.map +1 -0
- package/dist/hooks/transcript-parser.js +163 -0
- package/dist/hooks/transcript-parser.js.map +1 -0
- package/dist/hooks/usage-logger.d.ts +30 -0
- package/dist/hooks/usage-logger.d.ts.map +1 -0
- package/dist/hooks/usage-logger.js +67 -0
- package/dist/hooks/usage-logger.js.map +1 -0
- package/dist/index.d.ts +16 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/index.js +2 -2
- package/dist/memory/index.js.map +1 -1
- package/dist/runtime/agent-runner.d.ts +9 -0
- package/dist/runtime/agent-runner.d.ts.map +1 -1
- package/dist/runtime/agent-runner.js +167 -11
- package/dist/runtime/agent-runner.js.map +1 -1
- package/dist/runtime/backends/claude.d.ts +30 -0
- package/dist/runtime/backends/claude.d.ts.map +1 -1
- package/dist/runtime/backends/claude.js +112 -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 +4 -0
- 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 +4 -0
- package/dist/runtime/backends/gemini.js.map +1 -1
- package/dist/runtime/benefits.d.ts +81 -1
- package/dist/runtime/benefits.d.ts.map +1 -1
- package/dist/runtime/benefits.js +199 -12
- package/dist/runtime/benefits.js.map +1 -1
- package/dist/runtime/cache-optimizer.d.ts +7 -3
- package/dist/runtime/cache-optimizer.d.ts.map +1 -1
- package/dist/runtime/cache-optimizer.js +11 -7
- package/dist/runtime/cache-optimizer.js.map +1 -1
- package/dist/runtime/compaction.d.ts +6 -1
- package/dist/runtime/compaction.d.ts.map +1 -1
- package/dist/runtime/compaction.js +39 -2
- package/dist/runtime/compaction.js.map +1 -1
- package/dist/runtime/cost-model.d.ts.map +1 -1
- package/dist/runtime/cost-model.js +20 -17
- package/dist/runtime/cost-model.js.map +1 -1
- package/dist/runtime/engine.d.ts +2 -0
- package/dist/runtime/engine.d.ts.map +1 -1
- package/dist/runtime/engine.js +162 -3
- package/dist/runtime/engine.js.map +1 -1
- package/dist/runtime/graph-discovery.js +2 -2
- package/dist/runtime/graph-discovery.js.map +1 -1
- package/dist/runtime/graph-trajectory.js +3 -3
- package/dist/runtime/graph-trajectory.js.map +1 -1
- package/dist/runtime/handoff.d.ts +8 -0
- package/dist/runtime/handoff.d.ts.map +1 -0
- package/dist/runtime/handoff.js +109 -0
- package/dist/runtime/handoff.js.map +1 -0
- package/dist/runtime/heuristics.d.ts +2 -1
- package/dist/runtime/heuristics.d.ts.map +1 -1
- package/dist/runtime/heuristics.js +15 -2
- package/dist/runtime/heuristics.js.map +1 -1
- package/dist/runtime/lsp.d.ts.map +1 -1
- package/dist/runtime/lsp.js +4 -0
- package/dist/runtime/lsp.js.map +1 -1
- package/dist/runtime/mcp.d.ts +1 -0
- package/dist/runtime/mcp.d.ts.map +1 -1
- package/dist/runtime/mcp.js +38 -0
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/runtime/model-router.d.ts +2 -1
- package/dist/runtime/model-router.d.ts.map +1 -1
- package/dist/runtime/model-router.js +8 -1
- package/dist/runtime/model-router.js.map +1 -1
- package/dist/runtime/output-summarizer.d.ts +45 -0
- package/dist/runtime/output-summarizer.d.ts.map +1 -0
- package/dist/runtime/output-summarizer.js +171 -0
- package/dist/runtime/output-summarizer.js.map +1 -0
- package/dist/runtime/plugins.d.ts +5 -1
- package/dist/runtime/plugins.d.ts.map +1 -1
- package/dist/runtime/plugins.js +14 -2
- package/dist/runtime/plugins.js.map +1 -1
- package/dist/runtime/prompt-tier.d.ts +33 -0
- package/dist/runtime/prompt-tier.d.ts.map +1 -0
- package/dist/runtime/prompt-tier.js +105 -0
- package/dist/runtime/prompt-tier.js.map +1 -0
- package/dist/runtime/savings-manifest.d.ts +66 -0
- package/dist/runtime/savings-manifest.d.ts.map +1 -0
- package/dist/runtime/savings-manifest.js +103 -0
- package/dist/runtime/savings-manifest.js.map +1 -0
- package/dist/runtime/sharing.js +2 -1
- package/dist/runtime/sharing.js.map +1 -1
- package/dist/runtime/stats.d.ts +2 -0
- package/dist/runtime/stats.d.ts.map +1 -1
- package/dist/runtime/stats.js +23 -3
- package/dist/runtime/stats.js.map +1 -1
- package/dist/runtime/violation-tracker.d.ts +31 -0
- package/dist/runtime/violation-tracker.d.ts.map +1 -0
- package/dist/runtime/violation-tracker.js +125 -0
- package/dist/runtime/violation-tracker.js.map +1 -0
- package/dist/utils/project-config.d.ts +20 -0
- package/dist/utils/project-config.d.ts.map +1 -1
- package/dist/utils/project-config.js +46 -1
- package/dist/utils/project-config.js.map +1 -1
- package/dist/utils/redact.d.ts.map +1 -1
- package/dist/utils/redact.js +5 -1
- package/dist/utils/redact.js.map +1 -1
- package/dist/web/bridge.d.ts +47 -0
- package/dist/web/bridge.d.ts.map +1 -0
- package/dist/web/bridge.js +267 -0
- package/dist/web/bridge.js.map +1 -0
- package/dist/web/graph-api.d.ts +19 -0
- package/dist/web/graph-api.d.ts.map +1 -0
- package/dist/web/graph-api.js +157 -0
- package/dist/web/graph-api.js.map +1 -0
- package/dist/web/index.d.ts +21 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +38 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/public/index.html +1304 -0
- package/dist/web/public/public/index.html +1307 -0
- package/dist/web/server.d.ts +24 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +113 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/tray.d.ts +23 -0
- package/dist/web/tray.d.ts.map +1 -0
- package/dist/web/tray.js +205 -0
- package/dist/web/tray.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AgentConfig, PromptDietConfig } from '../core/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Auto-select a promptTier for an agent based on its role, turn budget, and
|
|
4
|
+
* the orchestration's prompt-diet configuration.
|
|
5
|
+
*
|
|
6
|
+
* Precedence (strongest first):
|
|
7
|
+
* 1. `config.promptTier` (explicit per-agent setting always wins)
|
|
8
|
+
* 2. `dietConfig.overrides` matching the agent's type (case-insensitive substring)
|
|
9
|
+
* 3. `mode === 'conservative'` → no auto-tiering (legacy behavior)
|
|
10
|
+
* 4. `maxTurns ≤ 3` → 'minimal' (regardless of mode — short agents can't
|
|
11
|
+
* afford full-prompt overhead per turn)
|
|
12
|
+
* 5. `mode === 'aggressive'` → 'lite' for everyone, including PROTECTED_ROLES
|
|
13
|
+
* 6. `mode === 'balanced'` (default) → PROTECTED_ROLES stay full;
|
|
14
|
+
* LITE_ELIGIBLE_ROLES → 'lite'; unknown roles → full (safe default)
|
|
15
|
+
*
|
|
16
|
+
* @param config Agent configuration. Reads `config.agentType` (registry type)
|
|
17
|
+
* and falls back to `config.name` (instance label) for role matching.
|
|
18
|
+
* @param dietConfig Orchestration-level diet settings. Defaults to `balanced`
|
|
19
|
+
* when `dietConfig` is supplied without a `default`. Pass `undefined` to use
|
|
20
|
+
* `balanced` defaults.
|
|
21
|
+
*/
|
|
22
|
+
export declare function autoSelectPromptTier(config: AgentConfig, dietConfig?: PromptDietConfig): 'full' | 'lite' | 'minimal' | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve a {@link PromptDietConfig} from the `SWARM_PROMPT_DIET` environment
|
|
25
|
+
* variable. Returns `undefined` when the env var is unset or has an invalid
|
|
26
|
+
* value (so callers fall through to orchestration config / `balanced` default).
|
|
27
|
+
*
|
|
28
|
+
* Logs a warning when the env var is set but unrecognized so the operator
|
|
29
|
+
* notices the typo (the CLI flag rejects with exit-1, but env vars otherwise
|
|
30
|
+
* fall through silently).
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveDietFromEnv(): PromptDietConfig | undefined;
|
|
33
|
+
//# sourceMappingURL=prompt-tier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-tier.d.ts","sourceRoot":"","sources":["../../src/runtime/prompt-tier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAkB,MAAM,kBAAkB,CAAC;AAkCtF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,EACnB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAoCzC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,gBAAgB,GAAG,SAAS,CAUjE"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agents whose system prompts contain load-bearing structure (orchestration
|
|
3
|
+
* decision-making, adversarial probing, refactor safety scaffolding) where
|
|
4
|
+
* trimming risks behavior drift. Stay at `full` under `balanced` mode.
|
|
5
|
+
*
|
|
6
|
+
* `aggressive` mode bypasses this list — operator opted in to the risk.
|
|
7
|
+
*/
|
|
8
|
+
const PROTECTED_ROLES = ['orchestrator', 'grounding', 'devils-advocate', 'judge', 'refactorer'];
|
|
9
|
+
/**
|
|
10
|
+
* Worker/reviewer/researcher roles that have been validated as safe to trim
|
|
11
|
+
* to `lite` (Before-You-Act / Self-Check / Debt / Meta sections stripped).
|
|
12
|
+
*
|
|
13
|
+
* Substring match is intentional: `security-reviewer`, `testing-reviewer`,
|
|
14
|
+
* `convention-reviewer` all match `reviewer`; `my-custom-implementer` matches
|
|
15
|
+
* `implementer`. New review/worker roles get the savings automatically.
|
|
16
|
+
*/
|
|
17
|
+
const LITE_ELIGIBLE_ROLES = [
|
|
18
|
+
'reviewer',
|
|
19
|
+
'checker',
|
|
20
|
+
'implementer',
|
|
21
|
+
'researcher',
|
|
22
|
+
'tester',
|
|
23
|
+
'debugger',
|
|
24
|
+
'planner',
|
|
25
|
+
'integrator',
|
|
26
|
+
'guardian',
|
|
27
|
+
'sentinel',
|
|
28
|
+
'librarian',
|
|
29
|
+
'documenter',
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Auto-select a promptTier for an agent based on its role, turn budget, and
|
|
33
|
+
* the orchestration's prompt-diet configuration.
|
|
34
|
+
*
|
|
35
|
+
* Precedence (strongest first):
|
|
36
|
+
* 1. `config.promptTier` (explicit per-agent setting always wins)
|
|
37
|
+
* 2. `dietConfig.overrides` matching the agent's type (case-insensitive substring)
|
|
38
|
+
* 3. `mode === 'conservative'` → no auto-tiering (legacy behavior)
|
|
39
|
+
* 4. `maxTurns ≤ 3` → 'minimal' (regardless of mode — short agents can't
|
|
40
|
+
* afford full-prompt overhead per turn)
|
|
41
|
+
* 5. `mode === 'aggressive'` → 'lite' for everyone, including PROTECTED_ROLES
|
|
42
|
+
* 6. `mode === 'balanced'` (default) → PROTECTED_ROLES stay full;
|
|
43
|
+
* LITE_ELIGIBLE_ROLES → 'lite'; unknown roles → full (safe default)
|
|
44
|
+
*
|
|
45
|
+
* @param config Agent configuration. Reads `config.agentType` (registry type)
|
|
46
|
+
* and falls back to `config.name` (instance label) for role matching.
|
|
47
|
+
* @param dietConfig Orchestration-level diet settings. Defaults to `balanced`
|
|
48
|
+
* when `dietConfig` is supplied without a `default`. Pass `undefined` to use
|
|
49
|
+
* `balanced` defaults.
|
|
50
|
+
*/
|
|
51
|
+
export function autoSelectPromptTier(config, dietConfig) {
|
|
52
|
+
// 1. Explicit tier on AgentConfig always wins
|
|
53
|
+
if (config.promptTier)
|
|
54
|
+
return config.promptTier;
|
|
55
|
+
const mode = dietConfig?.default ?? 'balanced';
|
|
56
|
+
const role = (config.agentType || config.name || '').toLowerCase();
|
|
57
|
+
// 2. Per-agent-type override (case-insensitive substring) beats mode.
|
|
58
|
+
// Sort keys longest-first so more specific keys win over shorter prefixes
|
|
59
|
+
// (e.g. `security-implementer` matches before `implementer`).
|
|
60
|
+
if (dietConfig?.overrides) {
|
|
61
|
+
const entries = Object.entries(dietConfig.overrides).sort(([a], [b]) => b.length - a.length);
|
|
62
|
+
for (const [key, tier] of entries) {
|
|
63
|
+
if (role.includes(key.toLowerCase()))
|
|
64
|
+
return tier;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// 3. Conservative mode: no automatic trimming
|
|
68
|
+
if (mode === 'conservative')
|
|
69
|
+
return undefined;
|
|
70
|
+
// 4. Short-running agents always get minimal regardless of mode
|
|
71
|
+
const maxTurns = config.maxTurns ?? 50;
|
|
72
|
+
if (maxTurns <= 3)
|
|
73
|
+
return 'minimal';
|
|
74
|
+
const isProtected = PROTECTED_ROLES.some((r) => role.includes(r));
|
|
75
|
+
// 5. Aggressive mode trims even protected agents to lite
|
|
76
|
+
if (mode === 'aggressive')
|
|
77
|
+
return 'lite';
|
|
78
|
+
// 6. Balanced mode (default): protected stay full
|
|
79
|
+
if (isProtected)
|
|
80
|
+
return undefined;
|
|
81
|
+
if (LITE_ELIGIBLE_ROLES.some((r) => role.includes(r)))
|
|
82
|
+
return 'lite';
|
|
83
|
+
// Unknown agent type → leave at full (safe default)
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve a {@link PromptDietConfig} from the `SWARM_PROMPT_DIET` environment
|
|
88
|
+
* variable. Returns `undefined` when the env var is unset or has an invalid
|
|
89
|
+
* value (so callers fall through to orchestration config / `balanced` default).
|
|
90
|
+
*
|
|
91
|
+
* Logs a warning when the env var is set but unrecognized so the operator
|
|
92
|
+
* notices the typo (the CLI flag rejects with exit-1, but env vars otherwise
|
|
93
|
+
* fall through silently).
|
|
94
|
+
*/
|
|
95
|
+
export function resolveDietFromEnv() {
|
|
96
|
+
const mode = process.env.SWARM_PROMPT_DIET;
|
|
97
|
+
if (!mode)
|
|
98
|
+
return undefined;
|
|
99
|
+
if (mode === 'aggressive' || mode === 'balanced' || mode === 'conservative') {
|
|
100
|
+
return { default: mode };
|
|
101
|
+
}
|
|
102
|
+
console.warn(`[swarm] SWARM_PROMPT_DIET="${mode}" is not a valid mode (expected: aggressive | balanced | conservative). Ignoring.`);
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=prompt-tier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-tier.js","sourceRoot":"","sources":["../../src/runtime/prompt-tier.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,eAAe,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AAEhG;;;;;;;GAOG;AACH,MAAM,mBAAmB,GAAG;IAC1B,UAAU;IACV,SAAS;IACT,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,SAAS;IACT,YAAY;IACZ,UAAU;IACV,UAAU;IACV,WAAW;IACX,YAAY;CACb,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAmB,EACnB,UAA6B;IAE7B,8CAA8C;IAC9C,IAAI,MAAM,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC,UAAU,CAAC;IAEhD,MAAM,IAAI,GAAmB,UAAU,EAAE,OAAO,IAAI,UAAU,CAAC;IAC/D,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAEnE,sEAAsE;IACtE,0EAA0E;IAC1E,8DAA8D;IAC9D,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7F,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpD,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,SAAS,CAAC;IAE9C,gEAAgE;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAEpC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE,yDAAyD;IACzD,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC;IAEzC,kDAAkD;IAClD,IAAI,WAAW;QAAE,OAAO,SAAS,CAAC;IAElC,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAErE,oDAAoD;IACpD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,IAAI,CACV,8BAA8B,IAAI,mFAAmF,CACtH,CAAC;IACF,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export interface AgentSavingsEntry {
|
|
2
|
+
agentId: string;
|
|
3
|
+
agentType: string;
|
|
4
|
+
model: string;
|
|
5
|
+
/** Estimated tokens per turn WITHOUT any optimizations */
|
|
6
|
+
naiveTokensPerTurn: number;
|
|
7
|
+
/** Breakdown of what was saved per turn */
|
|
8
|
+
optimizations: {
|
|
9
|
+
/** ~14K saved by ENABLE_TOOL_SEARCH (deferred tool schemas) */
|
|
10
|
+
toolSearchSaved: number;
|
|
11
|
+
/** Tokens saved by promptDiet (lite/minimal tier stripping) */
|
|
12
|
+
promptDietSaved: number;
|
|
13
|
+
/** Tokens saved by context filtering (irrelevant phase outputs removed) */
|
|
14
|
+
contextFilteringSaved: number;
|
|
15
|
+
/** Tokens saved by VerbatimCompactor on shared context */
|
|
16
|
+
compactionSaved: number;
|
|
17
|
+
};
|
|
18
|
+
/** Total estimated savings per turn (sum of above) */
|
|
19
|
+
savedPerTurn: number;
|
|
20
|
+
/** Timestamp when this entry was written */
|
|
21
|
+
timestamp: string;
|
|
22
|
+
}
|
|
23
|
+
export interface SavingsManifest {
|
|
24
|
+
orchestrationId: string;
|
|
25
|
+
pattern: string;
|
|
26
|
+
startedAt: string;
|
|
27
|
+
agents: AgentSavingsEntry[];
|
|
28
|
+
}
|
|
29
|
+
/** Get the manifest file path for an orchestration */
|
|
30
|
+
export declare function getManifestPath(cwd: string, orchestrationId: string): string;
|
|
31
|
+
/** Write a savings manifest for an orchestration */
|
|
32
|
+
export declare function writeSavingsManifest(cwd: string, manifest: SavingsManifest): void;
|
|
33
|
+
/** Add an agent entry to an existing manifest */
|
|
34
|
+
export declare function appendAgentToManifest(cwd: string, orchestrationId: string, entry: AgentSavingsEntry): void;
|
|
35
|
+
/** Read a savings manifest */
|
|
36
|
+
export declare function readSavingsManifest(cwd: string, orchestrationId: string): SavingsManifest | null;
|
|
37
|
+
/** Find the most recent savings manifest in the .swarm directory */
|
|
38
|
+
export declare function findLatestManifest(cwd: string): SavingsManifest | null;
|
|
39
|
+
/** Clean up old manifests (keep last N) */
|
|
40
|
+
export declare function pruneManifests(cwd: string, keep?: number): void;
|
|
41
|
+
/**
|
|
42
|
+
* Calculate naive (unoptimized) tokens per turn for an agent.
|
|
43
|
+
* Returns the theoretical maximum and what each optimization saved.
|
|
44
|
+
*
|
|
45
|
+
* @param opts.basePayloadFull - Base payload without ENABLE_TOOL_SEARCH (~45K)
|
|
46
|
+
* @param opts.fullPromptTokens - Agent prompt size in tokens (full, before any diet)
|
|
47
|
+
* @param opts.appliedPromptTokens - Agent prompt size after diet
|
|
48
|
+
* @param opts.unfilteredContextTokens - Cross-phase context before filtering
|
|
49
|
+
* @param opts.filteredContextTokens - Cross-phase context after filtering
|
|
50
|
+
* @param opts.uncompactedSharedTokens - Shared context before compaction
|
|
51
|
+
* @param opts.compactedSharedTokens - Shared context after compaction
|
|
52
|
+
*/
|
|
53
|
+
export declare function calculateNaiveTokensPerTurn(opts: {
|
|
54
|
+
basePayloadFull: number;
|
|
55
|
+
fullPromptTokens: number;
|
|
56
|
+
appliedPromptTokens: number;
|
|
57
|
+
unfilteredContextTokens: number;
|
|
58
|
+
filteredContextTokens: number;
|
|
59
|
+
uncompactedSharedTokens: number;
|
|
60
|
+
compactedSharedTokens: number;
|
|
61
|
+
}): {
|
|
62
|
+
naive: number;
|
|
63
|
+
optimizations: AgentSavingsEntry['optimizations'];
|
|
64
|
+
saved: number;
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=savings-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings-manifest.d.ts","sourceRoot":"","sources":["../../src/runtime/savings-manifest.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,aAAa,EAAE;QACb,+DAA+D;QAC/D,eAAe,EAAE,MAAM,CAAC;QACxB,+DAA+D;QAC/D,eAAe,EAAE,MAAM,CAAC;QACxB,2EAA2E;QAC3E,qBAAqB,EAAE,MAAM,CAAC;QAC9B,0DAA0D;QAC1D,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAID,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAOjF;AAED,iDAAiD;AACjD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAc1G;AAED,8BAA8B;AAC9B,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAMhG;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAYtE;AAED,2CAA2C;AAC3C,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,IAAI,CAYnE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,qBAAqB,EAAE,MAAM,CAAC;CAC/B,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAsBtF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync, existsSync, readFileSync, readdirSync, unlinkSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
const MANIFEST_DIR = '.swarm';
|
|
4
|
+
/** Get the manifest file path for an orchestration */
|
|
5
|
+
export function getManifestPath(cwd, orchestrationId) {
|
|
6
|
+
return join(cwd, MANIFEST_DIR, `savings-manifest-${orchestrationId}.json`);
|
|
7
|
+
}
|
|
8
|
+
/** Write a savings manifest for an orchestration */
|
|
9
|
+
export function writeSavingsManifest(cwd, manifest) {
|
|
10
|
+
const dir = join(cwd, MANIFEST_DIR);
|
|
11
|
+
if (!existsSync(dir)) {
|
|
12
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
13
|
+
}
|
|
14
|
+
const path = getManifestPath(cwd, manifest.orchestrationId);
|
|
15
|
+
writeFileSync(path, JSON.stringify(manifest, null, 2), { mode: 0o600 });
|
|
16
|
+
}
|
|
17
|
+
/** Add an agent entry to an existing manifest */
|
|
18
|
+
export function appendAgentToManifest(cwd, orchestrationId, entry) {
|
|
19
|
+
const path = getManifestPath(cwd, orchestrationId);
|
|
20
|
+
let manifest;
|
|
21
|
+
try {
|
|
22
|
+
manifest = JSON.parse(readFileSync(path, 'utf-8'));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
manifest = { orchestrationId, pattern: '', startedAt: new Date().toISOString(), agents: [] };
|
|
26
|
+
}
|
|
27
|
+
manifest.agents.push(entry);
|
|
28
|
+
const dir = join(cwd, MANIFEST_DIR);
|
|
29
|
+
if (!existsSync(dir)) {
|
|
30
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
31
|
+
}
|
|
32
|
+
writeFileSync(path, JSON.stringify(manifest, null, 2), { mode: 0o600 });
|
|
33
|
+
}
|
|
34
|
+
/** Read a savings manifest */
|
|
35
|
+
export function readSavingsManifest(cwd, orchestrationId) {
|
|
36
|
+
try {
|
|
37
|
+
return JSON.parse(readFileSync(getManifestPath(cwd, orchestrationId), 'utf-8'));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Find the most recent savings manifest in the .swarm directory */
|
|
44
|
+
export function findLatestManifest(cwd) {
|
|
45
|
+
const dir = join(cwd, MANIFEST_DIR);
|
|
46
|
+
try {
|
|
47
|
+
const files = readdirSync(dir)
|
|
48
|
+
.filter((f) => f.startsWith('savings-manifest-') && f.endsWith('.json'))
|
|
49
|
+
.sort()
|
|
50
|
+
.reverse();
|
|
51
|
+
if (files.length === 0)
|
|
52
|
+
return null;
|
|
53
|
+
return JSON.parse(readFileSync(join(dir, files[0]), 'utf-8'));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Clean up old manifests (keep last N) */
|
|
60
|
+
export function pruneManifests(cwd, keep = 10) {
|
|
61
|
+
const dir = join(cwd, MANIFEST_DIR);
|
|
62
|
+
try {
|
|
63
|
+
const files = readdirSync(dir)
|
|
64
|
+
.filter((f) => f.startsWith('savings-manifest-') && f.endsWith('.json'))
|
|
65
|
+
.sort();
|
|
66
|
+
while (files.length > keep) {
|
|
67
|
+
unlinkSync(join(dir, files.shift()));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
/* silent */
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Calculate naive (unoptimized) tokens per turn for an agent.
|
|
76
|
+
* Returns the theoretical maximum and what each optimization saved.
|
|
77
|
+
*
|
|
78
|
+
* @param opts.basePayloadFull - Base payload without ENABLE_TOOL_SEARCH (~45K)
|
|
79
|
+
* @param opts.fullPromptTokens - Agent prompt size in tokens (full, before any diet)
|
|
80
|
+
* @param opts.appliedPromptTokens - Agent prompt size after diet
|
|
81
|
+
* @param opts.unfilteredContextTokens - Cross-phase context before filtering
|
|
82
|
+
* @param opts.filteredContextTokens - Cross-phase context after filtering
|
|
83
|
+
* @param opts.uncompactedSharedTokens - Shared context before compaction
|
|
84
|
+
* @param opts.compactedSharedTokens - Shared context after compaction
|
|
85
|
+
*/
|
|
86
|
+
export function calculateNaiveTokensPerTurn(opts) {
|
|
87
|
+
// ENABLE_TOOL_SEARCH drops base payload from ~45K to ~31K
|
|
88
|
+
const BASE_WITH_TOOL_SEARCH = 31_000;
|
|
89
|
+
const toolSearchSaved = Math.max(0, opts.basePayloadFull - BASE_WITH_TOOL_SEARCH);
|
|
90
|
+
const promptDietSaved = Math.max(0, opts.fullPromptTokens - opts.appliedPromptTokens);
|
|
91
|
+
const contextFilteringSaved = Math.max(0, opts.unfilteredContextTokens - opts.filteredContextTokens);
|
|
92
|
+
const compactionSaved = Math.max(0, opts.uncompactedSharedTokens - opts.compactedSharedTokens);
|
|
93
|
+
const naive = opts.basePayloadFull + opts.fullPromptTokens + opts.unfilteredContextTokens + opts.uncompactedSharedTokens;
|
|
94
|
+
const optimizations = {
|
|
95
|
+
toolSearchSaved,
|
|
96
|
+
promptDietSaved,
|
|
97
|
+
contextFilteringSaved,
|
|
98
|
+
compactionSaved,
|
|
99
|
+
};
|
|
100
|
+
const saved = toolSearchSaved + promptDietSaved + contextFilteringSaved + compactionSaved;
|
|
101
|
+
return { naive, optimizations, saved };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=savings-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings-manifest.js","sourceRoot":"","sources":["../../src/runtime/savings-manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/sharing.js
CHANGED
|
@@ -50,7 +50,7 @@ h1{font-size:24px}pre{background:#f5f5f5;padding:16px;border-radius:8px;overflow
|
|
|
50
50
|
</head><body><pre>${esc(genMD(orchestration, opts))}</pre></body></html>`;
|
|
51
51
|
}
|
|
52
52
|
function genJSON(orchestration) {
|
|
53
|
-
|
|
53
|
+
const raw = JSON.stringify({
|
|
54
54
|
id: orchestration.config.id,
|
|
55
55
|
name: orchestration.config.name,
|
|
56
56
|
pattern: orchestration.config.pattern,
|
|
@@ -66,6 +66,7 @@ function genJSON(orchestration) {
|
|
|
66
66
|
})),
|
|
67
67
|
usage: orchestration.usage,
|
|
68
68
|
}, null, 2);
|
|
69
|
+
return redactSecrets(raw);
|
|
69
70
|
}
|
|
70
71
|
function fmt(ms) {
|
|
71
72
|
return ms < 60000 ? `${(ms / 1000).toFixed(1)}s` : `${Math.floor(ms / 60000)}m ${Math.floor((ms % 60000) / 1000)}s`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharing.js","sourceRoot":"","sources":["../../src/runtime/sharing.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sharing.js","sourceRoot":"","sources":["../../src/runtime/sharing.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/stats.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/runtime/stats.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,CAAC,EAAE,MAAM;IAe3B,OAAO,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/runtime/stats.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,CAAC,EAAE,MAAM;IAe3B,OAAO,CAAC,UAAU;IAwClB,yCAAyC;IACzC,MAAM,CAAC,IAAI,EAAE;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,EAAE;YACL,WAAW,EAAE,MAAM,CAAC;YACpB,YAAY,EAAE,MAAM,CAAC;YACrB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC;YAChB,UAAU,EAAE,MAAM,CAAC;YACnB,KAAK,EAAE,MAAM,CAAC;YACd,SAAS,EAAE,MAAM,CAAC;YAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;YAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;SACnC,CAAC;QACF,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;IAuCR,qDAAqD;IACrD,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAmDrE,6BAA6B;IAC7B,cAAc,IAAI,UAAU,EAAE;IAY9B,oDAAoD;IACpD,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAyCvD,yEAAyE;IACzE,iBAAiB,CACf,OAAO,CAAC,EAAE,MAAM,GACf,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BzG,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/runtime/stats.js
CHANGED
|
@@ -38,6 +38,8 @@ export class StatsCollector {
|
|
|
38
38
|
duration_ms INTEGER DEFAULT 0,
|
|
39
39
|
turns INTEGER DEFAULT 0,
|
|
40
40
|
tool_calls INTEGER DEFAULT 0,
|
|
41
|
+
cache_read_tokens INTEGER DEFAULT 0,
|
|
42
|
+
cache_creation_tokens INTEGER DEFAULT 0,
|
|
41
43
|
success INTEGER DEFAULT 1,
|
|
42
44
|
confidence TEXT,
|
|
43
45
|
retries INTEGER DEFAULT 0,
|
|
@@ -46,15 +48,31 @@ export class StatsCollector {
|
|
|
46
48
|
CREATE INDEX IF NOT EXISTS idx_stats_agent ON execution_stats(agent_type, model);
|
|
47
49
|
CREATE INDEX IF NOT EXISTS idx_stats_pattern ON execution_stats(pattern);
|
|
48
50
|
`);
|
|
51
|
+
// Defensive schema migration — add cache token columns if upgrading from older version.
|
|
52
|
+
// There's no migration framework, so we check column existence and ALTER TABLE as needed.
|
|
53
|
+
const cols = this.db.prepare(`PRAGMA table_info(execution_stats)`).all();
|
|
54
|
+
const colNames = new Set(cols.map((c) => c.name));
|
|
55
|
+
if (!colNames.has('cache_read_tokens')) {
|
|
56
|
+
this.db.exec(`ALTER TABLE execution_stats ADD COLUMN cache_read_tokens INTEGER DEFAULT 0`);
|
|
57
|
+
}
|
|
58
|
+
if (!colNames.has('cache_creation_tokens')) {
|
|
59
|
+
this.db.exec(`ALTER TABLE execution_stats ADD COLUMN cache_creation_tokens INTEGER DEFAULT 0`);
|
|
60
|
+
}
|
|
49
61
|
}
|
|
50
62
|
/** Record a completed agent execution */
|
|
51
63
|
record(data) {
|
|
52
64
|
this.db
|
|
53
65
|
.prepare(`
|
|
54
|
-
INSERT INTO execution_stats (agent_type, agent_name, model, backend, pattern, phase, input_tokens, output_tokens, total_tokens, cost_usd, duration_ms, turns, tool_calls, success, confidence, retries)
|
|
55
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
66
|
+
INSERT INTO execution_stats (agent_type, agent_name, model, backend, pattern, phase, input_tokens, output_tokens, total_tokens, cost_usd, duration_ms, turns, tool_calls, cache_read_tokens, cache_creation_tokens, success, confidence, retries)
|
|
67
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
56
68
|
`)
|
|
57
|
-
.run(data.agentType, data.agentName ?? null, data.model, data.backend ?? null, data.pattern ?? null, data.phase ?? null, data.usage.inputTokens, data.usage.outputTokens, data.usage.totalTokens, data.usage.costUsd, data.usage.durationMs, data.usage.turns, data.usage.toolCalls, data.success ? 1 : 0, data.confidence ?? null, data.retries ?? 0);
|
|
69
|
+
.run(data.agentType, data.agentName ?? null, data.model, data.backend ?? null, data.pattern ?? null, data.phase ?? null, data.usage.inputTokens, data.usage.outputTokens, data.usage.totalTokens, data.usage.costUsd, data.usage.durationMs, data.usage.turns, data.usage.toolCalls, data.usage.cacheReadInputTokens ?? 0, data.usage.cacheCreationInputTokens ?? 0, data.success ? 1 : 0, data.confidence ?? null, data.retries ?? 0);
|
|
70
|
+
// Prune oldest beyond retention cap (300 per agent_type+model)
|
|
71
|
+
this.db
|
|
72
|
+
.prepare(`DELETE FROM execution_stats WHERE agent_type = ? AND model = ? AND id NOT IN (
|
|
73
|
+
SELECT id FROM execution_stats WHERE agent_type = ? AND model = ? ORDER BY created_at DESC LIMIT 300
|
|
74
|
+
)`)
|
|
75
|
+
.run(data.agentType, data.model, data.agentType, data.model);
|
|
58
76
|
}
|
|
59
77
|
/** Get aggregated stats for an agent type + model */
|
|
60
78
|
getAgentProfile(agentType, model) {
|
|
@@ -129,6 +147,8 @@ export class StatsCollector {
|
|
|
129
147
|
durationMs: usage.durationMs ?? 0,
|
|
130
148
|
turns: usage.turns ?? 0,
|
|
131
149
|
toolCalls: usage.toolCalls ?? 0,
|
|
150
|
+
cacheReadInputTokens: usage.cacheReadInputTokens ?? 0,
|
|
151
|
+
cacheCreationInputTokens: usage.cacheCreationInputTokens ?? 0,
|
|
132
152
|
},
|
|
133
153
|
success: true,
|
|
134
154
|
confidence: String(data.result?.confidence ?? ''),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/runtime/stats.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAQ,OAAO,EAAE,MAAM,MAAM,CAAC;AAGrC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAa5C,MAAM,OAAO,cAAc;IACjB,EAAE,CAAoB;IACtB,KAAK,CAAU;IAEvB,YAAY,MAAe;QACzB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACrC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/runtime/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type ViolationType = 'file-conflict' | 'review-repeat' | 'retry-burst' | 'phase-timeout' | 'cost-overrun' | 'cold-wake-burst';
|
|
2
|
+
export interface Violation {
|
|
3
|
+
type: ViolationType;
|
|
4
|
+
orchestrationId: string;
|
|
5
|
+
phase?: string;
|
|
6
|
+
agentType?: string;
|
|
7
|
+
details: string;
|
|
8
|
+
repo?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ViolationHotSpot {
|
|
11
|
+
type: ViolationType;
|
|
12
|
+
count: number;
|
|
13
|
+
lastSeen: string;
|
|
14
|
+
details: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class ViolationTracker {
|
|
17
|
+
private db;
|
|
18
|
+
private ownDb;
|
|
19
|
+
constructor(dbPath?: string);
|
|
20
|
+
private initSchema;
|
|
21
|
+
/** Record a violation */
|
|
22
|
+
record(violation: Violation): void;
|
|
23
|
+
/** Get hot spots — violations that recurred across multiple orchestrations */
|
|
24
|
+
getHotSpots(repo?: string, minCount?: number): ViolationHotSpot[];
|
|
25
|
+
/** Get recent violations for a specific orchestration */
|
|
26
|
+
getForOrchestration(orchestrationId: string): Violation[];
|
|
27
|
+
/** Format hot spots as a pre-flight warning string */
|
|
28
|
+
formatPreFlightWarnings(repo?: string): string | null;
|
|
29
|
+
close(): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=violation-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violation-tracker.d.ts","sourceRoot":"","sources":["../../src/runtime/violation-tracker.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,eAAe,GACf,aAAa,GACb,eAAe,GACf,cAAc,GACd,iBAAiB,CAAC;AAEtB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,CAAC,EAAE,MAAM;IAe3B,OAAO,CAAC,UAAU;IAiBlB,yBAAyB;IACzB,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAgBlC,8EAA8E;IAC9E,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAmDjE,yDAAyD;IACzD,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,EAAE;IA0BzD,sDAAsD;IACtD,uBAAuB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAWrD,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
3
|
+
import { dirname } from 'path';
|
|
4
|
+
import { getDatabase } from './database.js';
|
|
5
|
+
export class ViolationTracker {
|
|
6
|
+
db;
|
|
7
|
+
ownDb;
|
|
8
|
+
constructor(dbPath) {
|
|
9
|
+
if (dbPath) {
|
|
10
|
+
const dir = dirname(dbPath);
|
|
11
|
+
if (!existsSync(dir))
|
|
12
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
13
|
+
this.db = new Database(dbPath);
|
|
14
|
+
this.db.pragma('journal_mode = WAL');
|
|
15
|
+
this.db.pragma('busy_timeout = 5000');
|
|
16
|
+
this.ownDb = true;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
this.db = getDatabase();
|
|
20
|
+
this.ownDb = false;
|
|
21
|
+
}
|
|
22
|
+
this.initSchema();
|
|
23
|
+
}
|
|
24
|
+
initSchema() {
|
|
25
|
+
this.db.exec(`
|
|
26
|
+
CREATE TABLE IF NOT EXISTS violation_log (
|
|
27
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
28
|
+
type TEXT NOT NULL,
|
|
29
|
+
orchestration_id TEXT NOT NULL,
|
|
30
|
+
phase TEXT,
|
|
31
|
+
agent_type TEXT,
|
|
32
|
+
details TEXT NOT NULL,
|
|
33
|
+
repo TEXT,
|
|
34
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
35
|
+
);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_violation_type ON violation_log(type);
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_violation_repo ON violation_log(repo);
|
|
38
|
+
`);
|
|
39
|
+
}
|
|
40
|
+
/** Record a violation */
|
|
41
|
+
record(violation) {
|
|
42
|
+
this.db
|
|
43
|
+
.prepare(`INSERT INTO violation_log (type, orchestration_id, phase, agent_type, details, repo)
|
|
44
|
+
VALUES (?, ?, ?, ?, ?, ?)`)
|
|
45
|
+
.run(violation.type, violation.orchestrationId, violation.phase ?? null, violation.agentType ?? null, violation.details, violation.repo ?? null);
|
|
46
|
+
}
|
|
47
|
+
/** Get hot spots — violations that recurred across multiple orchestrations */
|
|
48
|
+
getHotSpots(repo, minCount) {
|
|
49
|
+
const min = minCount ?? 2;
|
|
50
|
+
// Use a simpler two-query approach for the "most recent details" to avoid
|
|
51
|
+
// correlated subquery issues with the GROUP BY + HAVING clause.
|
|
52
|
+
let rows;
|
|
53
|
+
if (repo) {
|
|
54
|
+
rows = this.db
|
|
55
|
+
.prepare(`SELECT type, COUNT(*) as count, MAX(created_at) as last_seen
|
|
56
|
+
FROM violation_log
|
|
57
|
+
WHERE repo = ?
|
|
58
|
+
GROUP BY type
|
|
59
|
+
HAVING count >= ?
|
|
60
|
+
ORDER BY count DESC`)
|
|
61
|
+
.all(repo, min);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
rows = this.db
|
|
65
|
+
.prepare(`SELECT type, COUNT(*) as count, MAX(created_at) as last_seen
|
|
66
|
+
FROM violation_log
|
|
67
|
+
GROUP BY type
|
|
68
|
+
HAVING count >= ?
|
|
69
|
+
ORDER BY count DESC`)
|
|
70
|
+
.all(min);
|
|
71
|
+
}
|
|
72
|
+
return rows.map((r) => {
|
|
73
|
+
// Fetch most recent details for this type in a separate query
|
|
74
|
+
let detailRow;
|
|
75
|
+
if (repo) {
|
|
76
|
+
detailRow = this.db
|
|
77
|
+
.prepare(`SELECT details FROM violation_log WHERE type = ? AND repo = ? ORDER BY created_at DESC LIMIT 1`)
|
|
78
|
+
.get(r.type, repo);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
detailRow = this.db
|
|
82
|
+
.prepare(`SELECT details FROM violation_log WHERE type = ? ORDER BY created_at DESC LIMIT 1`)
|
|
83
|
+
.get(r.type);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
type: r.type,
|
|
87
|
+
count: r.count,
|
|
88
|
+
lastSeen: r.last_seen,
|
|
89
|
+
details: detailRow?.details ?? '',
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/** Get recent violations for a specific orchestration */
|
|
94
|
+
getForOrchestration(orchestrationId) {
|
|
95
|
+
const rows = this.db
|
|
96
|
+
.prepare(`SELECT type, orchestration_id, phase, agent_type, details, repo
|
|
97
|
+
FROM violation_log WHERE orchestration_id = ?
|
|
98
|
+
ORDER BY id DESC`)
|
|
99
|
+
.all(orchestrationId);
|
|
100
|
+
return rows.map((r) => ({
|
|
101
|
+
type: r.type,
|
|
102
|
+
orchestrationId: r.orchestration_id,
|
|
103
|
+
phase: r.phase ?? undefined,
|
|
104
|
+
agentType: r.agent_type ?? undefined,
|
|
105
|
+
details: r.details,
|
|
106
|
+
repo: r.repo ?? undefined,
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
/** Format hot spots as a pre-flight warning string */
|
|
110
|
+
formatPreFlightWarnings(repo) {
|
|
111
|
+
const hotSpots = this.getHotSpots(repo, 2);
|
|
112
|
+
if (hotSpots.length === 0)
|
|
113
|
+
return null;
|
|
114
|
+
const lines = ['## Pre-flight Warnings (recurring violations)'];
|
|
115
|
+
for (const hs of hotSpots) {
|
|
116
|
+
lines.push(`- **${hs.type}** (${hs.count}× across runs, last: ${hs.lastSeen}): ${hs.details}`);
|
|
117
|
+
}
|
|
118
|
+
return lines.join('\n');
|
|
119
|
+
}
|
|
120
|
+
close() {
|
|
121
|
+
if (this.ownDb)
|
|
122
|
+
this.db.close();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=violation-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violation-tracker.js","sourceRoot":"","sources":["../../src/runtime/violation-tracker.ts"],"names":[],"mappings":"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"}
|