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.
Files changed (165) hide show
  1. package/README.md +145 -42
  2. package/agents/implementer.md +1 -14
  3. package/agents/orchestrator.md +127 -246
  4. package/agents/reviewer.md +3 -18
  5. package/dist/cli/commands/agents.js +13 -1
  6. package/dist/cli/commands/agents.js.map +1 -1
  7. package/dist/cli/commands/dashboard.d.ts +3 -0
  8. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  9. package/dist/cli/commands/dashboard.js +43 -0
  10. package/dist/cli/commands/dashboard.js.map +1 -0
  11. package/dist/cli/commands/orchestrate.d.ts.map +1 -1
  12. package/dist/cli/commands/orchestrate.js +17 -0
  13. package/dist/cli/commands/orchestrate.js.map +1 -1
  14. package/dist/cli/commands/run.d.ts.map +1 -1
  15. package/dist/cli/commands/run.js +20 -1
  16. package/dist/cli/commands/run.js.map +1 -1
  17. package/dist/cli/commands/status.d.ts +1 -0
  18. package/dist/cli/commands/status.d.ts.map +1 -1
  19. package/dist/cli/commands/status.js +5 -2
  20. package/dist/cli/commands/status.js.map +1 -1
  21. package/dist/cli/commands/usage.d.ts +3 -0
  22. package/dist/cli/commands/usage.d.ts.map +1 -0
  23. package/dist/cli/commands/usage.js +85 -0
  24. package/dist/cli/commands/usage.js.map +1 -0
  25. package/dist/cli/index.js +2 -0
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/core/event-bus.d.ts.map +1 -1
  28. package/dist/core/event-bus.js +4 -1
  29. package/dist/core/event-bus.js.map +1 -1
  30. package/dist/core/types.d.ts +44 -1
  31. package/dist/core/types.d.ts.map +1 -1
  32. package/dist/core/types.js +4 -0
  33. package/dist/core/types.js.map +1 -1
  34. package/dist/hooks/cli.js +4 -1
  35. package/dist/hooks/cli.js.map +1 -1
  36. package/dist/hooks/index.d.ts +9 -0
  37. package/dist/hooks/index.d.ts.map +1 -1
  38. package/dist/hooks/index.js +54 -0
  39. package/dist/hooks/index.js.map +1 -1
  40. package/dist/hooks/transcript-parser.d.ts +68 -0
  41. package/dist/hooks/transcript-parser.d.ts.map +1 -0
  42. package/dist/hooks/transcript-parser.js +163 -0
  43. package/dist/hooks/transcript-parser.js.map +1 -0
  44. package/dist/hooks/usage-logger.d.ts +30 -0
  45. package/dist/hooks/usage-logger.d.ts.map +1 -0
  46. package/dist/hooks/usage-logger.js +67 -0
  47. package/dist/hooks/usage-logger.js.map +1 -0
  48. package/dist/index.d.ts +16 -1
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +10 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/memory/index.js +2 -2
  53. package/dist/memory/index.js.map +1 -1
  54. package/dist/runtime/agent-runner.d.ts +9 -0
  55. package/dist/runtime/agent-runner.d.ts.map +1 -1
  56. package/dist/runtime/agent-runner.js +167 -11
  57. package/dist/runtime/agent-runner.js.map +1 -1
  58. package/dist/runtime/backends/claude.d.ts +30 -0
  59. package/dist/runtime/backends/claude.d.ts.map +1 -1
  60. package/dist/runtime/backends/claude.js +112 -2
  61. package/dist/runtime/backends/claude.js.map +1 -1
  62. package/dist/runtime/backends/codex.d.ts.map +1 -1
  63. package/dist/runtime/backends/codex.js +4 -0
  64. package/dist/runtime/backends/codex.js.map +1 -1
  65. package/dist/runtime/backends/gemini.d.ts.map +1 -1
  66. package/dist/runtime/backends/gemini.js +4 -0
  67. package/dist/runtime/backends/gemini.js.map +1 -1
  68. package/dist/runtime/benefits.d.ts +81 -1
  69. package/dist/runtime/benefits.d.ts.map +1 -1
  70. package/dist/runtime/benefits.js +199 -12
  71. package/dist/runtime/benefits.js.map +1 -1
  72. package/dist/runtime/cache-optimizer.d.ts +7 -3
  73. package/dist/runtime/cache-optimizer.d.ts.map +1 -1
  74. package/dist/runtime/cache-optimizer.js +11 -7
  75. package/dist/runtime/cache-optimizer.js.map +1 -1
  76. package/dist/runtime/compaction.d.ts +6 -1
  77. package/dist/runtime/compaction.d.ts.map +1 -1
  78. package/dist/runtime/compaction.js +39 -2
  79. package/dist/runtime/compaction.js.map +1 -1
  80. package/dist/runtime/cost-model.d.ts.map +1 -1
  81. package/dist/runtime/cost-model.js +20 -17
  82. package/dist/runtime/cost-model.js.map +1 -1
  83. package/dist/runtime/engine.d.ts +2 -0
  84. package/dist/runtime/engine.d.ts.map +1 -1
  85. package/dist/runtime/engine.js +162 -3
  86. package/dist/runtime/engine.js.map +1 -1
  87. package/dist/runtime/graph-discovery.js +2 -2
  88. package/dist/runtime/graph-discovery.js.map +1 -1
  89. package/dist/runtime/graph-trajectory.js +3 -3
  90. package/dist/runtime/graph-trajectory.js.map +1 -1
  91. package/dist/runtime/handoff.d.ts +8 -0
  92. package/dist/runtime/handoff.d.ts.map +1 -0
  93. package/dist/runtime/handoff.js +109 -0
  94. package/dist/runtime/handoff.js.map +1 -0
  95. package/dist/runtime/heuristics.d.ts +2 -1
  96. package/dist/runtime/heuristics.d.ts.map +1 -1
  97. package/dist/runtime/heuristics.js +15 -2
  98. package/dist/runtime/heuristics.js.map +1 -1
  99. package/dist/runtime/lsp.d.ts.map +1 -1
  100. package/dist/runtime/lsp.js +4 -0
  101. package/dist/runtime/lsp.js.map +1 -1
  102. package/dist/runtime/mcp.d.ts +1 -0
  103. package/dist/runtime/mcp.d.ts.map +1 -1
  104. package/dist/runtime/mcp.js +38 -0
  105. package/dist/runtime/mcp.js.map +1 -1
  106. package/dist/runtime/model-router.d.ts +2 -1
  107. package/dist/runtime/model-router.d.ts.map +1 -1
  108. package/dist/runtime/model-router.js +8 -1
  109. package/dist/runtime/model-router.js.map +1 -1
  110. package/dist/runtime/output-summarizer.d.ts +45 -0
  111. package/dist/runtime/output-summarizer.d.ts.map +1 -0
  112. package/dist/runtime/output-summarizer.js +171 -0
  113. package/dist/runtime/output-summarizer.js.map +1 -0
  114. package/dist/runtime/plugins.d.ts +5 -1
  115. package/dist/runtime/plugins.d.ts.map +1 -1
  116. package/dist/runtime/plugins.js +14 -2
  117. package/dist/runtime/plugins.js.map +1 -1
  118. package/dist/runtime/prompt-tier.d.ts +33 -0
  119. package/dist/runtime/prompt-tier.d.ts.map +1 -0
  120. package/dist/runtime/prompt-tier.js +105 -0
  121. package/dist/runtime/prompt-tier.js.map +1 -0
  122. package/dist/runtime/savings-manifest.d.ts +66 -0
  123. package/dist/runtime/savings-manifest.d.ts.map +1 -0
  124. package/dist/runtime/savings-manifest.js +103 -0
  125. package/dist/runtime/savings-manifest.js.map +1 -0
  126. package/dist/runtime/sharing.js +2 -1
  127. package/dist/runtime/sharing.js.map +1 -1
  128. package/dist/runtime/stats.d.ts +2 -0
  129. package/dist/runtime/stats.d.ts.map +1 -1
  130. package/dist/runtime/stats.js +23 -3
  131. package/dist/runtime/stats.js.map +1 -1
  132. package/dist/runtime/violation-tracker.d.ts +31 -0
  133. package/dist/runtime/violation-tracker.d.ts.map +1 -0
  134. package/dist/runtime/violation-tracker.js +125 -0
  135. package/dist/runtime/violation-tracker.js.map +1 -0
  136. package/dist/utils/project-config.d.ts +20 -0
  137. package/dist/utils/project-config.d.ts.map +1 -1
  138. package/dist/utils/project-config.js +46 -1
  139. package/dist/utils/project-config.js.map +1 -1
  140. package/dist/utils/redact.d.ts.map +1 -1
  141. package/dist/utils/redact.js +5 -1
  142. package/dist/utils/redact.js.map +1 -1
  143. package/dist/web/bridge.d.ts +47 -0
  144. package/dist/web/bridge.d.ts.map +1 -0
  145. package/dist/web/bridge.js +267 -0
  146. package/dist/web/bridge.js.map +1 -0
  147. package/dist/web/graph-api.d.ts +19 -0
  148. package/dist/web/graph-api.d.ts.map +1 -0
  149. package/dist/web/graph-api.js +157 -0
  150. package/dist/web/graph-api.js.map +1 -0
  151. package/dist/web/index.d.ts +21 -0
  152. package/dist/web/index.d.ts.map +1 -0
  153. package/dist/web/index.js +38 -0
  154. package/dist/web/index.js.map +1 -0
  155. package/dist/web/public/index.html +1304 -0
  156. package/dist/web/public/public/index.html +1307 -0
  157. package/dist/web/server.d.ts +24 -0
  158. package/dist/web/server.d.ts.map +1 -0
  159. package/dist/web/server.js +113 -0
  160. package/dist/web/server.js.map +1 -0
  161. package/dist/web/tray.d.ts +23 -0
  162. package/dist/web/tray.d.ts.map +1 -0
  163. package/dist/web/tray.js +205 -0
  164. package/dist/web/tray.js.map +1 -0
  165. 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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"}
@@ -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
- return JSON.stringify({
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":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAiBnD,MAAM,UAAU,cAAc,CAAC,aAAoC,EAAE,IAAmB;IACtF,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9F,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,KAAK,MAAM;QACpB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QACxB,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM;YACtB,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC;YAC9B,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAC/E,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,KAAK,CAAC,aAAoC,EAAE,IAAmB;IACtE,MAAM,KAAK,GAAa;QACtB,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE;QAChC,EAAE;QACF,gBAAgB,aAAa,CAAC,MAAM,CAAC,OAAO,kBAAkB,aAAa,CAAC,MAAM,EAAE;KACrF,CAAC;IACF,IAAI,aAAa,CAAC,SAAS,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,6BAA6B,CAAC,CAAC;IAC1F,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACpF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACjF,IAAI,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBACpD,KAAK,CAAC,IAAI,CAAC,aAAa,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,iBAAiB,KAAK,KAAK,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CACR,EAAE,EACF,UAAU,EACV,WAAW,aAAa,CAAC,KAAK,CAAC,WAAW,aAAa,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAChG,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,OAAO,CAAC,aAAoC,EAAE,IAAmB;IACxE,OAAO;;;oBAGW,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,sBAAsB,CAAC;AAC1E,CAAC;AAED,SAAS,OAAO,CAAC,aAAoC;IACnD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE;QAC3B,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI;QAC/B,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO;QACrC,MAAM,EAAE,aAAa,CAAC,MAAM;QAC5B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;YACvB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;gBACvB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;gBACzB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;SACJ,CAAC,CAAC;QACH,KAAK,EAAE,aAAa,CAAC,KAAK;KAC3B,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,EAAU;IACrB,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;AACtH,CAAC;AAED,SAAS,GAAG,CAAC,GAAW;IACtB,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAChF,CAAC"}
1
+ {"version":3,"file":"sharing.js","sourceRoot":"","sources":["../../src/runtime/sharing.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,8 @@ export declare class StatsCollector {
30
30
  durationMs: number;
31
31
  turns: number;
32
32
  toolCalls: number;
33
+ cacheReadInputTokens?: number;
34
+ cacheCreationInputTokens?: number;
33
35
  };
34
36
  success: boolean;
35
37
  confidence?: string;
@@ -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;IA2BlB,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;SACnB,CAAC;QACF,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;IA4BR,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;IAuCvD,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"}
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"}
@@ -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":"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"}
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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"}