claude-mycelium 2.0.0 → 2.2.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 (208) hide show
  1. package/.agent-meta/_inhibitors.ndjson +1287 -0
  2. package/.agent-meta/_quarantine.json +45 -0
  3. package/.agent-meta/config.json +9 -0
  4. package/.agent-meta/tasks/_active.json +4 -0
  5. package/.agent-meta/tasks/task_0657b028-05a0-4b0c-b0b9-a4eae3d66cd9.json +168 -0
  6. package/.claude/memory.db +0 -0
  7. package/.claude/settings.local.json +4 -1
  8. package/README.md +85 -233
  9. package/SECURITY.md +145 -0
  10. package/dist/agent/task-worker.d.ts +11 -0
  11. package/dist/agent/task-worker.d.ts.map +1 -0
  12. package/dist/agent/task-worker.js +173 -0
  13. package/dist/agent/task-worker.js.map +1 -0
  14. package/dist/agent/worker.d.ts +8 -0
  15. package/dist/agent/worker.d.ts.map +1 -0
  16. package/dist/agent/worker.js +97 -0
  17. package/dist/agent/worker.js.map +1 -0
  18. package/dist/bin.d.ts +7 -0
  19. package/dist/bin.d.ts.map +1 -0
  20. package/dist/bin.js +11 -0
  21. package/dist/bin.js.map +1 -0
  22. package/dist/cli/cost.d.ts +10 -0
  23. package/dist/cli/cost.d.ts.map +1 -0
  24. package/dist/cli/cost.js +163 -0
  25. package/dist/cli/cost.js.map +1 -0
  26. package/dist/cli/gc.d.ts +10 -0
  27. package/dist/cli/gc.d.ts.map +1 -0
  28. package/dist/cli/gc.js +108 -0
  29. package/dist/cli/gc.js.map +1 -0
  30. package/dist/cli/gradients.d.ts +10 -0
  31. package/dist/cli/gradients.d.ts.map +1 -0
  32. package/dist/cli/gradients.js +70 -0
  33. package/dist/cli/gradients.js.map +1 -0
  34. package/dist/cli/grow.d.ts +17 -0
  35. package/dist/cli/grow.d.ts.map +1 -0
  36. package/dist/cli/grow.js +373 -0
  37. package/dist/cli/grow.js.map +1 -0
  38. package/dist/cli/index.d.ts +17 -0
  39. package/dist/cli/index.d.ts.map +1 -0
  40. package/dist/cli/index.js +74 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/cli/init.d.ts +11 -0
  43. package/dist/cli/init.d.ts.map +1 -0
  44. package/dist/cli/init.js +97 -0
  45. package/dist/cli/init.js.map +1 -0
  46. package/dist/cli/status.d.ts +10 -0
  47. package/dist/cli/status.d.ts.map +1 -0
  48. package/dist/cli/status.js +191 -0
  49. package/dist/cli/status.js.map +1 -0
  50. package/dist/coordination/file-locks.d.ts +42 -0
  51. package/dist/coordination/file-locks.d.ts.map +1 -0
  52. package/dist/coordination/file-locks.js +269 -0
  53. package/dist/coordination/file-locks.js.map +1 -0
  54. package/dist/coordination/index.d.ts +4 -0
  55. package/dist/coordination/index.d.ts.map +1 -1
  56. package/dist/coordination/index.js +4 -0
  57. package/dist/coordination/index.js.map +1 -1
  58. package/dist/coordination/inhibitors.d.ts +84 -0
  59. package/dist/coordination/inhibitors.d.ts.map +1 -0
  60. package/dist/coordination/inhibitors.js +290 -0
  61. package/dist/coordination/inhibitors.js.map +1 -0
  62. package/dist/coordination/process-manager.d.ts +73 -0
  63. package/dist/coordination/process-manager.d.ts.map +1 -0
  64. package/dist/coordination/process-manager.js +144 -0
  65. package/dist/coordination/process-manager.js.map +1 -0
  66. package/dist/core/agent-executor.d.ts +4 -1
  67. package/dist/core/agent-executor.d.ts.map +1 -1
  68. package/dist/core/agent-executor.js +38 -12
  69. package/dist/core/agent-executor.js.map +1 -1
  70. package/dist/core/change-applier.d.ts +29 -5
  71. package/dist/core/change-applier.d.ts.map +1 -1
  72. package/dist/core/change-applier.js +254 -24
  73. package/dist/core/change-applier.js.map +1 -1
  74. package/dist/core/signals/churn.d.ts.map +1 -1
  75. package/dist/core/signals/churn.js +6 -4
  76. package/dist/core/signals/churn.js.map +1 -1
  77. package/dist/core/signals/debt.d.ts.map +1 -1
  78. package/dist/core/signals/debt.js +4 -3
  79. package/dist/core/signals/debt.js.map +1 -1
  80. package/dist/cost/cost-tracker.d.ts.map +1 -1
  81. package/dist/cost/cost-tracker.js +2 -0
  82. package/dist/cost/cost-tracker.js.map +1 -1
  83. package/dist/gc/index.d.ts +17 -0
  84. package/dist/gc/index.d.ts.map +1 -0
  85. package/dist/gc/index.js +17 -0
  86. package/dist/gc/index.js.map +1 -0
  87. package/dist/gc/runner.d.ts +39 -0
  88. package/dist/gc/runner.d.ts.map +1 -0
  89. package/dist/gc/runner.js +277 -0
  90. package/dist/gc/runner.js.map +1 -0
  91. package/dist/gc/trace-compactor.d.ts +31 -0
  92. package/dist/gc/trace-compactor.d.ts.map +1 -0
  93. package/dist/gc/trace-compactor.js +162 -0
  94. package/dist/gc/trace-compactor.js.map +1 -0
  95. package/dist/index.d.ts +5 -1
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +6 -1
  98. package/dist/index.js.map +1 -1
  99. package/dist/prompts/index.d.ts +2 -1
  100. package/dist/prompts/index.d.ts.map +1 -1
  101. package/dist/prompts/index.js.map +1 -1
  102. package/dist/quarantine/explorer.d.ts +65 -0
  103. package/dist/quarantine/explorer.d.ts.map +1 -0
  104. package/dist/quarantine/explorer.js +175 -0
  105. package/dist/quarantine/explorer.js.map +1 -0
  106. package/dist/quarantine/index.d.ts +7 -0
  107. package/dist/quarantine/index.d.ts.map +1 -0
  108. package/dist/quarantine/index.js +7 -0
  109. package/dist/quarantine/index.js.map +1 -0
  110. package/dist/quarantine/manager.d.ts +75 -0
  111. package/dist/quarantine/manager.d.ts.map +1 -0
  112. package/dist/quarantine/manager.js +275 -0
  113. package/dist/quarantine/manager.js.map +1 -0
  114. package/dist/task/acceptance.d.ts +29 -0
  115. package/dist/task/acceptance.d.ts.map +1 -0
  116. package/dist/task/acceptance.js +228 -0
  117. package/dist/task/acceptance.js.map +1 -0
  118. package/dist/task/agent-coordinator.d.ts +40 -0
  119. package/dist/task/agent-coordinator.d.ts.map +1 -0
  120. package/dist/task/agent-coordinator.js +168 -0
  121. package/dist/task/agent-coordinator.js.map +1 -0
  122. package/dist/task/executor.d.ts +37 -0
  123. package/dist/task/executor.d.ts.map +1 -0
  124. package/dist/task/executor.js +462 -0
  125. package/dist/task/executor.js.map +1 -0
  126. package/dist/task/index.d.ts +12 -0
  127. package/dist/task/index.d.ts.map +1 -0
  128. package/dist/task/index.js +12 -0
  129. package/dist/task/index.js.map +1 -0
  130. package/dist/task/planner.d.ts +21 -0
  131. package/dist/task/planner.d.ts.map +1 -0
  132. package/dist/task/planner.js +253 -0
  133. package/dist/task/planner.js.map +1 -0
  134. package/dist/task/storage.d.ts +46 -0
  135. package/dist/task/storage.d.ts.map +1 -0
  136. package/dist/task/storage.js +266 -0
  137. package/dist/task/storage.js.map +1 -0
  138. package/dist/trace/trace-event.d.ts +2 -18
  139. package/dist/trace/trace-event.d.ts.map +1 -1
  140. package/dist/trace/trace-event.js +6 -6
  141. package/dist/trace/trace-event.js.map +1 -1
  142. package/dist/utils/file-utils.d.ts.map +1 -1
  143. package/dist/utils/file-utils.js +54 -15
  144. package/dist/utils/file-utils.js.map +1 -1
  145. package/docs/PHASE5_IMPLEMENTATION.md +237 -0
  146. package/docs/PHASES-3-7-COMPLETE.md +177 -0
  147. package/docs/PHASE_4_COMPLETE.md +135 -0
  148. package/docs/PHASE_7_DELIVERABLES.md +295 -0
  149. package/docs/PHASE_7_IMPLEMENTATION.md +306 -0
  150. package/docs/PHASE_7_SUMMARY.txt +195 -0
  151. package/docs/RELEASE-NOTES-v2.1.md +213 -0
  152. package/docs/ROADMAP.md +194 -107
  153. package/docs/SECURITY-AUDIT.md +387 -0
  154. package/docs/SNAPSHOT.md +59 -32
  155. package/docs/implementation/phase3-summary.md +220 -0
  156. package/package.json +27 -11
  157. package/src/agent/task-worker.ts +196 -0
  158. package/src/agent/worker.ts +111 -0
  159. package/src/bin.ts +13 -0
  160. package/src/cli/cost.ts +210 -0
  161. package/src/cli/gc.ts +138 -0
  162. package/src/cli/gradients.ts +97 -0
  163. package/src/cli/grow.ts +416 -0
  164. package/src/cli/index.ts +81 -0
  165. package/src/cli/init.ts +139 -0
  166. package/src/cli/status.ts +218 -0
  167. package/src/coordination/file-locks.ts +300 -0
  168. package/src/coordination/index.ts +4 -0
  169. package/src/coordination/inhibitors.ts +345 -0
  170. package/src/coordination/process-manager.ts +199 -0
  171. package/src/core/agent-executor.ts +37 -8
  172. package/src/core/signals/churn.ts +8 -5
  173. package/src/core/signals/debt.ts +4 -3
  174. package/src/cost/cost-tracker.ts +2 -0
  175. package/src/gc/index.ts +17 -0
  176. package/src/gc/runner.ts +314 -0
  177. package/src/gc/trace-compactor.ts +187 -0
  178. package/src/index.ts +7 -1
  179. package/src/prompts/index.ts +2 -1
  180. package/src/quarantine/explorer.ts +234 -0
  181. package/src/quarantine/index.ts +7 -0
  182. package/src/quarantine/manager.ts +336 -0
  183. package/src/task/acceptance.ts +267 -0
  184. package/src/task/agent-coordinator.ts +220 -0
  185. package/src/task/executor.ts +543 -0
  186. package/src/task/index.ts +38 -0
  187. package/src/task/planner.ts +294 -0
  188. package/src/task/storage.ts +332 -0
  189. package/src/trace/trace-event.ts +7 -26
  190. package/src/utils/file-utils.ts +61 -15
  191. package/tests/cli/gc.test.ts +206 -0
  192. package/tests/cli/init.test.ts +181 -0
  193. package/tests/cli/status.test.ts +282 -0
  194. package/tests/coordination/file-locks.test.ts +196 -0
  195. package/tests/coordination/inhibitors.test.ts +459 -0
  196. package/tests/coordination/integration.test.ts +195 -0
  197. package/tests/coordination/process-manager.test.ts +165 -0
  198. package/tests/gc/trace-compactor.test.ts +245 -0
  199. package/tests/integration/phase-7.test.ts +145 -0
  200. package/tests/quarantine/explorer.test.ts +381 -0
  201. package/tests/quarantine/manager.test.ts +399 -0
  202. package/tests/security/command-injection.test.ts +88 -0
  203. package/tests/security/path-traversal.test.ts +103 -0
  204. package/tests/task/acceptance.test.ts +411 -0
  205. package/tests/task/executor.test.ts +421 -0
  206. package/tests/task/planner.test.ts +359 -0
  207. package/tests/trace/trace-event.test.ts +62 -20
  208. package/tsconfig.json +2 -2
@@ -5,6 +5,10 @@
5
5
  * - Gradient caching
6
6
  * - File locks (Phase 3)
7
7
  * - Process management (Phase 3)
8
+ * - Inhibitor signals (Phase 4)
8
9
  */
9
10
  export * from './gradient-cache.js';
11
+ export * from './file-locks.js';
12
+ export * from './process-manager.js';
13
+ export * from './inhibitors.js';
10
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coordination/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coordination/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Inhibitor Signal System for Claude-Mycelium
3
+ * Records pattern-specific warnings from failures with exponential decay
4
+ * Storage: .agent-meta/_inhibitors.ndjson (append-only)
5
+ * Reference: ADR-002, second-spec §1
6
+ */
7
+ import type { Inhibitor, Mode, TraceEvent } from '../types/index.js';
8
+ /**
9
+ * Emit an inhibitor signal after a failure
10
+ * Appends to NDJSON file for durability
11
+ */
12
+ export declare function emitInhibitor(params: {
13
+ trigger: {
14
+ file?: string;
15
+ pattern?: string;
16
+ mode?: Mode;
17
+ };
18
+ signal: string;
19
+ origin: {
20
+ agent_id: string;
21
+ trace_id: string;
22
+ energy_wasted: number;
23
+ failure_type: 'ci_failed' | 'regression' | 'reverted' | 'loop_detected';
24
+ };
25
+ strength: number;
26
+ half_life_days: number;
27
+ }): Promise<Inhibitor>;
28
+ /**
29
+ * Query relevant inhibitors for a file + mode combination
30
+ * Returns inhibitors sorted by current strength (strongest first)
31
+ * Filters out inhibitors below relevance threshold
32
+ */
33
+ export declare function queryInhibitors(file: string, mode: Mode): Promise<Array<Inhibitor & {
34
+ currentStrength: number;
35
+ }>>;
36
+ /**
37
+ * Calculate current strength with exponential decay
38
+ * Formula: strength * 0.5^(days / half_life)
39
+ *
40
+ * Examples (30-day half-life):
41
+ * - Day 0: 1.0
42
+ * - Day 30: 0.5
43
+ * - Day 60: 0.25
44
+ * - Day 90: 0.125
45
+ */
46
+ export declare function calculateCurrentStrength(inhibitor: Inhibitor): number;
47
+ /**
48
+ * Read all inhibitors from NDJSON file
49
+ */
50
+ export declare function readInhibitors(): Promise<Inhibitor[]>;
51
+ /**
52
+ * Extract failure pattern from CI output
53
+ * Heuristic pattern matching for common failure types
54
+ */
55
+ export declare function extractFailurePattern(ciOutput: string): string | undefined;
56
+ /**
57
+ * Summarize CI failure for human-readable signal
58
+ */
59
+ export declare function summarizeCIFailure(ciOutput: string): string;
60
+ /**
61
+ * Check if inhibitor should be emitted after an agent run
62
+ * Cases: CI failed, regression, or loop detected
63
+ */
64
+ export declare function maybeEmitInhibitor(trace: TraceEvent, ciOutput?: string): Promise<Inhibitor | null>;
65
+ /**
66
+ * Check for loop pattern (same file + mode, 3+ attempts, no progress)
67
+ * Must be called after trace is recorded
68
+ */
69
+ export declare function checkForLoop(file: string, mode: Mode, getRecentTraces: (file: string, mode: Mode, limit: number) => Promise<TraceEvent[]>): Promise<Inhibitor | null>;
70
+ /**
71
+ * Garbage collect decayed inhibitors (strength < 0.05)
72
+ * Rewrites the NDJSON file with only relevant inhibitors
73
+ */
74
+ export declare function gcInhibitors(): Promise<{
75
+ removed: number;
76
+ kept: number;
77
+ }>;
78
+ /**
79
+ * Format inhibitor for display in agent prompts
80
+ */
81
+ export declare function formatInhibitorForPrompt(inhibitor: Inhibitor & {
82
+ currentStrength: number;
83
+ }): string;
84
+ //# sourceMappingURL=inhibitors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inhibitors.d.ts","sourceRoot":"","sources":["../../src/coordination/inhibitors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAYrE;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,OAAO,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,IAAI,CAAC;KACb,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,eAAe,CAAC;KACzE,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,SAAS,CAAC,CA8BrB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAqBzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAMrE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CA2B3D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgB3D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,UAAU,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAiD3B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,GAClF,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CA4C3B;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB/E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,SAAS,GAAG;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,GACjD,MAAM,CAOR"}
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Inhibitor Signal System for Claude-Mycelium
3
+ * Records pattern-specific warnings from failures with exponential decay
4
+ * Storage: .agent-meta/_inhibitors.ndjson (append-only)
5
+ * Reference: ADR-002, second-spec §1
6
+ */
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ import * as path from 'path';
9
+ import { appendFile, readFile, fileExists, writeFile } from '../utils/file-utils.js';
10
+ import { logInfo, logError } from '../utils/logger.js';
11
+ // Compute file path at runtime to respect TEST_META_DIR
12
+ function getInhibitorsFile() {
13
+ const META_DIR = process.env.TEST_META_DIR || '.agent-meta';
14
+ return path.join(META_DIR, '_inhibitors.ndjson');
15
+ }
16
+ const INHIBITOR_RELEVANCE_THRESHOLD = 0.2;
17
+ const INHIBITOR_GC_THRESHOLD = 0.05;
18
+ const DEFAULT_HALF_LIFE_DAYS = 30;
19
+ /**
20
+ * Emit an inhibitor signal after a failure
21
+ * Appends to NDJSON file for durability
22
+ */
23
+ export async function emitInhibitor(params) {
24
+ const inhibitor = {
25
+ id: uuidv4(),
26
+ timestamp: new Date().toISOString(),
27
+ trigger: params.trigger,
28
+ signal: params.signal,
29
+ origin: params.origin,
30
+ strength: params.strength,
31
+ half_life_days: params.half_life_days,
32
+ };
33
+ try {
34
+ // Append to NDJSON file
35
+ const line = JSON.stringify(inhibitor) + '\n';
36
+ appendFile(getInhibitorsFile(), line);
37
+ logInfo('Inhibitor emitted', {
38
+ id: inhibitor.id,
39
+ file: inhibitor.trigger.file,
40
+ mode: inhibitor.trigger.mode,
41
+ pattern: inhibitor.trigger.pattern,
42
+ failure_type: inhibitor.origin.failure_type,
43
+ energy_wasted: `$${inhibitor.origin.energy_wasted.toFixed(4)}`,
44
+ });
45
+ return inhibitor;
46
+ }
47
+ catch (error) {
48
+ logError('Failed to emit inhibitor', error, { inhibitor });
49
+ throw error;
50
+ }
51
+ }
52
+ /**
53
+ * Query relevant inhibitors for a file + mode combination
54
+ * Returns inhibitors sorted by current strength (strongest first)
55
+ * Filters out inhibitors below relevance threshold
56
+ */
57
+ export async function queryInhibitors(file, mode) {
58
+ try {
59
+ const all = await readInhibitors();
60
+ return all
61
+ .map(i => ({ ...i, currentStrength: calculateCurrentStrength(i) }))
62
+ .filter(i => {
63
+ // Must be strong enough to be relevant
64
+ if (i.currentStrength < INHIBITOR_RELEVANCE_THRESHOLD)
65
+ return false;
66
+ // Check trigger match
67
+ const matchesFile = !i.trigger.file || i.trigger.file === file;
68
+ const matchesMode = !i.trigger.mode || i.trigger.mode === mode;
69
+ return matchesFile && matchesMode;
70
+ })
71
+ .sort((a, b) => b.currentStrength - a.currentStrength);
72
+ }
73
+ catch (error) {
74
+ logError('Failed to query inhibitors', error, { file, mode });
75
+ return [];
76
+ }
77
+ }
78
+ /**
79
+ * Calculate current strength with exponential decay
80
+ * Formula: strength * 0.5^(days / half_life)
81
+ *
82
+ * Examples (30-day half-life):
83
+ * - Day 0: 1.0
84
+ * - Day 30: 0.5
85
+ * - Day 60: 0.25
86
+ * - Day 90: 0.125
87
+ */
88
+ export function calculateCurrentStrength(inhibitor) {
89
+ const ageMs = Date.now() - Date.parse(inhibitor.timestamp);
90
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
91
+ const halfLives = ageDays / inhibitor.half_life_days;
92
+ return inhibitor.strength * Math.pow(0.5, halfLives);
93
+ }
94
+ /**
95
+ * Read all inhibitors from NDJSON file
96
+ */
97
+ export async function readInhibitors() {
98
+ try {
99
+ if (!fileExists(getInhibitorsFile())) {
100
+ return [];
101
+ }
102
+ const content = readFile(getInhibitorsFile());
103
+ const lines = content.trim().split('\n').filter(line => line.length > 0);
104
+ const inhibitors = [];
105
+ for (const line of lines) {
106
+ try {
107
+ const inhibitor = JSON.parse(line);
108
+ inhibitors.push(inhibitor);
109
+ }
110
+ catch (error) {
111
+ logError('Failed to parse inhibitor line', error, {
112
+ line: line.substring(0, 100),
113
+ });
114
+ // Skip corrupted lines
115
+ }
116
+ }
117
+ return inhibitors;
118
+ }
119
+ catch (error) {
120
+ logError('Failed to read inhibitors', error);
121
+ return [];
122
+ }
123
+ }
124
+ /**
125
+ * Extract failure pattern from CI output
126
+ * Heuristic pattern matching for common failure types
127
+ */
128
+ export function extractFailurePattern(ciOutput) {
129
+ if (ciOutput.includes('TypeError'))
130
+ return 'changes causing TypeError';
131
+ if (ciOutput.includes('Cannot find module'))
132
+ return 'breaking imports';
133
+ if (ciOutput.includes('is not assignable'))
134
+ return 'type mismatches';
135
+ if (ciOutput.includes('ENOENT'))
136
+ return 'missing file references';
137
+ if (ciOutput.includes('ReferenceError'))
138
+ return 'undefined variable references';
139
+ if (ciOutput.includes('SyntaxError'))
140
+ return 'syntax errors';
141
+ return undefined;
142
+ }
143
+ /**
144
+ * Summarize CI failure for human-readable signal
145
+ */
146
+ export function summarizeCIFailure(ciOutput) {
147
+ const lines = ciOutput.split('\n').filter(line => line.trim().length > 0);
148
+ // Find the first error line
149
+ for (const line of lines) {
150
+ if (line.includes('Error:') ||
151
+ line.includes('error TS') ||
152
+ line.includes('✖') ||
153
+ line.includes('FAIL')) {
154
+ return line.trim().substring(0, 150); // First 150 chars
155
+ }
156
+ }
157
+ return lines[0]?.substring(0, 150) || 'CI failure (no details available)';
158
+ }
159
+ /**
160
+ * Check if inhibitor should be emitted after an agent run
161
+ * Cases: CI failed, regression, or loop detected
162
+ */
163
+ export async function maybeEmitInhibitor(trace, ciOutput) {
164
+ try {
165
+ // Case 1: CI failed
166
+ if (!trace.ci_passed && ciOutput) {
167
+ return await emitInhibitor({
168
+ trigger: {
169
+ file: trace.file_path,
170
+ mode: trace.mode,
171
+ pattern: extractFailurePattern(ciOutput),
172
+ },
173
+ signal: `CI failed: ${summarizeCIFailure(ciOutput)}`,
174
+ origin: {
175
+ agent_id: trace.agent_id || 'unknown',
176
+ trace_id: trace.id,
177
+ energy_wasted: trace.cost?.estimated_usd || 0,
178
+ failure_type: 'ci_failed',
179
+ },
180
+ strength: 1.0,
181
+ half_life_days: DEFAULT_HALF_LIFE_DAYS,
182
+ });
183
+ }
184
+ // Case 2: Regression (gradient increased instead of decreased)
185
+ if (trace.gradient_delta < -0.02) {
186
+ // Made things worse
187
+ return await emitInhibitor({
188
+ trigger: {
189
+ file: trace.file_path,
190
+ mode: trace.mode,
191
+ },
192
+ signal: `${trace.mode} made ${trace.file_path} worse. Gradient increased by ${Math.abs(trace.gradient_delta).toFixed(2)}.`,
193
+ origin: {
194
+ agent_id: trace.agent_id || 'unknown',
195
+ trace_id: trace.id,
196
+ energy_wasted: trace.cost?.estimated_usd || 0,
197
+ failure_type: 'regression',
198
+ },
199
+ strength: 1.0,
200
+ half_life_days: DEFAULT_HALF_LIFE_DAYS,
201
+ });
202
+ }
203
+ // Case 3: Loop detection is handled separately via checkForLoop()
204
+ return null;
205
+ }
206
+ catch (error) {
207
+ logError('Failed to check for inhibitor emission', error, { trace });
208
+ return null;
209
+ }
210
+ }
211
+ /**
212
+ * Check for loop pattern (same file + mode, 3+ attempts, no progress)
213
+ * Must be called after trace is recorded
214
+ */
215
+ export async function checkForLoop(file, mode, getRecentTraces) {
216
+ try {
217
+ const recentTraces = await getRecentTraces(file, mode, 5);
218
+ // Need at least 3 attempts
219
+ if (recentTraces.length < 3) {
220
+ return null;
221
+ }
222
+ // Check if all recent attempts had poor efficiency (<0.02)
223
+ const isLoop = recentTraces.every(t => {
224
+ const efficiency = t.efficiency || 0;
225
+ return efficiency < 0.02;
226
+ });
227
+ if (!isLoop) {
228
+ return null;
229
+ }
230
+ // Calculate total waste
231
+ const totalWasted = recentTraces.reduce((sum, t) => sum + (t.cost?.estimated_usd || 0), 0);
232
+ return await emitInhibitor({
233
+ trigger: {
234
+ file,
235
+ mode,
236
+ },
237
+ signal: `${mode} is stuck on ${file}. ${recentTraces.length} attempts with no improvement. Total wasted: $${totalWasted.toFixed(2)}.`,
238
+ origin: {
239
+ agent_id: recentTraces[0]?.agent_id || 'unknown',
240
+ trace_id: recentTraces[0]?.id || 'unknown',
241
+ energy_wasted: totalWasted,
242
+ failure_type: 'loop_detected',
243
+ },
244
+ strength: 1.0,
245
+ half_life_days: 60, // Longer half-life for loops
246
+ });
247
+ }
248
+ catch (error) {
249
+ logError('Failed to check for loop', error, { file, mode });
250
+ return null;
251
+ }
252
+ }
253
+ /**
254
+ * Garbage collect decayed inhibitors (strength < 0.05)
255
+ * Rewrites the NDJSON file with only relevant inhibitors
256
+ */
257
+ export async function gcInhibitors() {
258
+ try {
259
+ const all = await readInhibitors();
260
+ const active = all.filter(i => calculateCurrentStrength(i) >= INHIBITOR_GC_THRESHOLD);
261
+ // Rewrite file with only active inhibitors
262
+ if (active.length < all.length) {
263
+ const lines = active.map(i => JSON.stringify(i) + '\n').join('');
264
+ writeFile(getInhibitorsFile(), lines);
265
+ logInfo('Inhibitor GC complete', {
266
+ removed: all.length - active.length,
267
+ kept: active.length,
268
+ });
269
+ }
270
+ return {
271
+ removed: all.length - active.length,
272
+ kept: active.length,
273
+ };
274
+ }
275
+ catch (error) {
276
+ logError('Failed to GC inhibitors', error);
277
+ return { removed: 0, kept: 0 };
278
+ }
279
+ }
280
+ /**
281
+ * Format inhibitor for display in agent prompts
282
+ */
283
+ export function formatInhibitorForPrompt(inhibitor) {
284
+ const strengthPercent = Math.round(inhibitor.currentStrength * 100);
285
+ const patternText = inhibitor.trigger.pattern || 'this approach';
286
+ return `⚠️ **[Strength: ${strengthPercent}%]** ${patternText}
287
+ ${inhibitor.signal}
288
+ _Origin: ${inhibitor.origin.failure_type} by ${inhibitor.origin.agent_id}, wasted $${inhibitor.origin.energy_wasted.toFixed(4)}_`;
289
+ }
290
+ //# sourceMappingURL=inhibitors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inhibitors.js","sourceRoot":"","sources":["../../src/coordination/inhibitors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGvD,wDAAwD;AACxD,SAAS,iBAAiB;IACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,aAAa,CAAC;IAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAC1C,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAenC;IACC,MAAM,SAAS,GAAc;QAC3B,EAAE,EAAE,MAAM,EAAE;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC;IAEF,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAC9C,UAAU,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,CAAC;QAEtC,OAAO,CAAC,mBAAmB,EAAE;YAC3B,EAAE,EAAE,SAAS,CAAC,EAAE;YAChB,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI;YAC5B,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI;YAC5B,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO;YAClC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,YAAY;YAC3C,aAAa,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;SAC/D,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,0BAA0B,EAAE,KAAc,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACpE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,IAAU;IAEV,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,cAAc,EAAE,CAAC;QAEnC,OAAO,GAAG;aACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,eAAe,EAAE,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAClE,MAAM,CAAC,CAAC,CAAC,EAAE;YACV,uCAAuC;YACvC,IAAI,CAAC,CAAC,eAAe,GAAG,6BAA6B;gBAAE,OAAO,KAAK,CAAC;YAEpE,sBAAsB;YACtB,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC;YAC/D,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC;YAE/D,OAAO,WAAW,IAAI,WAAW,CAAC;QACpC,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,4BAA4B,EAAE,KAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAoB;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC,cAAc,CAAC;IAErD,OAAO,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEzE,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;gBAChD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,gCAAgC,EAAE,KAAc,EAAE;oBACzD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;iBAC7B,CAAC,CAAC;gBACH,uBAAuB;YACzB,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,2BAA2B,EAAE,KAAc,CAAC,CAAC;QACtD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,2BAA2B,CAAC;IACvE,IAAI,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACvE,IAAI,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACrE,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,yBAAyB,CAAC;IAClE,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,OAAO,+BAA+B,CAAC;IAChF,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,eAAe,CAAC;IAC7D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1E,4BAA4B;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IACE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACvB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EACrB,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,kBAAkB;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,mCAAmC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAiB,EACjB,QAAiB;IAEjB,IAAI,CAAC;QACH,oBAAoB;QACpB,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC;YACjC,OAAO,MAAM,aAAa,CAAC;gBACzB,OAAO,EAAE;oBACP,IAAI,EAAE,KAAK,CAAC,SAAS;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC;iBACzC;gBACD,MAAM,EAAE,cAAc,kBAAkB,CAAC,QAAQ,CAAC,EAAE;gBACpD,MAAM,EAAE;oBACN,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,SAAS;oBACrC,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,aAAa,IAAI,CAAC;oBAC7C,YAAY,EAAE,WAAW;iBAC1B;gBACD,QAAQ,EAAE,GAAG;gBACb,cAAc,EAAE,sBAAsB;aACvC,CAAC,CAAC;QACL,CAAC;QAED,+DAA+D;QAC/D,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,EAAE,CAAC;YACjC,oBAAoB;YACpB,OAAO,MAAM,aAAa,CAAC;gBACzB,OAAO,EAAE;oBACP,IAAI,EAAE,KAAK,CAAC,SAAS;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB;gBACD,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,SAAS,iCAAiC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;gBAC1H,MAAM,EAAE;oBACN,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,SAAS;oBACrC,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,aAAa,IAAI,CAAC;oBAC7C,YAAY,EAAE,YAAY;iBAC3B;gBACD,QAAQ,EAAE,GAAG;gBACb,cAAc,EAAE,sBAAsB;aACvC,CAAC,CAAC;QACL,CAAC;QAED,kEAAkE;QAElE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,wCAAwC,EAAE,KAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAY,EACZ,IAAU,EACV,eAAmF;IAEnF,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1D,2BAA2B;QAC3B,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2DAA2D;QAC3D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACpC,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;YACrC,OAAO,UAAU,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wBAAwB;QACxB,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CACrC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,IAAI,CAAC,CAAC,EAC9C,CAAC,CACF,CAAC;QAEF,OAAO,MAAM,aAAa,CAAC;YACzB,OAAO,EAAE;gBACP,IAAI;gBACJ,IAAI;aACL;YACD,MAAM,EAAE,GAAG,IAAI,gBAAgB,IAAI,KAAK,YAAY,CAAC,MAAM,iDAAiD,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;YACrI,MAAM,EAAE;gBACN,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,SAAS;gBAChD,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,SAAS;gBAC1C,aAAa,EAAE,WAAW;gBAC1B,YAAY,EAAE,eAAe;aAC9B;YACD,QAAQ,EAAE,GAAG;YACb,cAAc,EAAE,EAAE,EAAE,6BAA6B;SAClD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,0BAA0B,EAAE,KAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,cAAc,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC;QAEtF,2CAA2C;QAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjE,SAAS,CAAC,iBAAiB,EAAE,EAAE,KAAK,CAAC,CAAC;YAEtC,OAAO,CAAC,uBAAuB,EAAE;gBAC/B,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;gBACnC,IAAI,EAAE,MAAM,CAAC,MAAM;aACpB,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;YACnC,IAAI,EAAE,MAAM,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,yBAAyB,EAAE,KAAc,CAAC,CAAC;QACpD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAkD;IAElD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IAEjE,OAAO,mBAAmB,eAAe,QAAQ,WAAW;KACzD,SAAS,CAAC,MAAM;cACP,SAAS,CAAC,MAAM,CAAC,YAAY,OAAO,SAAS,CAAC,MAAM,CAAC,QAAQ,aAAa,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACrI,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Process management for spawning and managing agent workers
3
+ * Each agent runs as an independent Node.js process via child_process.fork()
4
+ *
5
+ * Reference: ADR-004 lines 15-28
6
+ */
7
+ import { ChildProcess } from 'child_process';
8
+ export interface SpawnOptions {
9
+ agentId: string;
10
+ maxIterations?: number;
11
+ timeout?: number;
12
+ }
13
+ export interface AgentProcess {
14
+ child: ChildProcess;
15
+ agentId: string;
16
+ startedAt: Date;
17
+ timeout: NodeJS.Timeout | null;
18
+ }
19
+ /**
20
+ * Spawn an agent worker process
21
+ *
22
+ * @param options - Agent spawn options
23
+ * @returns ChildProcess handle
24
+ */
25
+ export declare function spawnAgent(options: SpawnOptions): ChildProcess;
26
+ /**
27
+ * Kill an agent process
28
+ *
29
+ * @param agentId - Agent to kill
30
+ * @returns true if agent was killed, false if not found
31
+ */
32
+ export declare function killAgent(agentId: string): boolean;
33
+ /**
34
+ * List all active agent processes
35
+ *
36
+ * @returns Array of active agent IDs with metadata
37
+ */
38
+ export declare function listAgents(): Array<{
39
+ agentId: string;
40
+ pid: number;
41
+ startedAt: Date;
42
+ uptime: number;
43
+ }>;
44
+ /**
45
+ * Check if an agent is running
46
+ *
47
+ * @param agentId - Agent to check
48
+ * @returns true if agent is running
49
+ */
50
+ export declare function isAgentRunning(agentId: string): boolean;
51
+ /**
52
+ * Get agent process info
53
+ *
54
+ * @param agentId - Agent to get info for
55
+ * @returns Agent info or null if not found
56
+ */
57
+ export declare function getAgentInfo(agentId: string): {
58
+ agentId: string;
59
+ pid: number;
60
+ startedAt: Date;
61
+ uptime: number;
62
+ } | null;
63
+ /**
64
+ * Kill all active agents
65
+ */
66
+ export declare function killAllAgents(): void;
67
+ /**
68
+ * Wait for all agents to complete
69
+ *
70
+ * @returns Promise that resolves when all agents have exited
71
+ */
72
+ export declare function waitForAllAgents(): Promise<void>;
73
+ //# sourceMappingURL=process-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../../src/coordination/process-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,YAAY,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;CAChC;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAmD9D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAalD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,KAAK,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAoBD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAYP;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAQpC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQtD"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Process management for spawning and managing agent workers
3
+ * Each agent runs as an independent Node.js process via child_process.fork()
4
+ *
5
+ * Reference: ADR-004 lines 15-28
6
+ */
7
+ import { fork } from 'child_process';
8
+ import * as path from 'path';
9
+ const activeAgents = new Map();
10
+ /**
11
+ * Spawn an agent worker process
12
+ *
13
+ * @param options - Agent spawn options
14
+ * @returns ChildProcess handle
15
+ */
16
+ export function spawnAgent(options) {
17
+ const { agentId, maxIterations = 10, timeout = 300_000, // 5 minutes default
18
+ } = options;
19
+ // Path to the compiled worker file
20
+ const workerPath = path.join(__dirname, '../agent/worker.js');
21
+ const child = fork(workerPath, [], {
22
+ env: {
23
+ ...process.env,
24
+ AGENT_ID: agentId,
25
+ MAX_ITERATIONS: String(maxIterations),
26
+ },
27
+ stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
28
+ });
29
+ // Set up timeout
30
+ const timer = setTimeout(() => {
31
+ console.warn(`[process-manager] Agent ${agentId} timed out after ${timeout}ms`);
32
+ child.kill('SIGTERM');
33
+ }, timeout);
34
+ // Clean up on exit
35
+ child.on('exit', (code, signal) => {
36
+ clearTimeout(timer);
37
+ activeAgents.delete(agentId);
38
+ console.log(`[process-manager] Agent ${agentId} exited with code ${code}, signal ${signal}`);
39
+ });
40
+ // Handle IPC messages
41
+ child.on('message', (message) => {
42
+ console.log(`[process-manager] Message from ${agentId}:`, message);
43
+ });
44
+ // Handle errors
45
+ child.on('error', (error) => {
46
+ console.error(`[process-manager] Error from agent ${agentId}:`, error);
47
+ });
48
+ // Track the agent
49
+ activeAgents.set(agentId, {
50
+ child,
51
+ agentId,
52
+ startedAt: new Date(),
53
+ timeout: timer,
54
+ });
55
+ return child;
56
+ }
57
+ /**
58
+ * Kill an agent process
59
+ *
60
+ * @param agentId - Agent to kill
61
+ * @returns true if agent was killed, false if not found
62
+ */
63
+ export function killAgent(agentId) {
64
+ const agent = activeAgents.get(agentId);
65
+ if (!agent) {
66
+ return false;
67
+ }
68
+ if (agent.timeout) {
69
+ clearTimeout(agent.timeout);
70
+ }
71
+ agent.child.kill('SIGTERM');
72
+ activeAgents.delete(agentId);
73
+ return true;
74
+ }
75
+ /**
76
+ * List all active agent processes
77
+ *
78
+ * @returns Array of active agent IDs with metadata
79
+ */
80
+ export function listAgents() {
81
+ const agents = [];
82
+ for (const [agentId, agent] of activeAgents) {
83
+ if (agent.child.pid) {
84
+ agents.push({
85
+ agentId,
86
+ pid: agent.child.pid,
87
+ startedAt: agent.startedAt,
88
+ uptime: Date.now() - agent.startedAt.getTime(),
89
+ });
90
+ }
91
+ }
92
+ return agents;
93
+ }
94
+ /**
95
+ * Check if an agent is running
96
+ *
97
+ * @param agentId - Agent to check
98
+ * @returns true if agent is running
99
+ */
100
+ export function isAgentRunning(agentId) {
101
+ return activeAgents.has(agentId);
102
+ }
103
+ /**
104
+ * Get agent process info
105
+ *
106
+ * @param agentId - Agent to get info for
107
+ * @returns Agent info or null if not found
108
+ */
109
+ export function getAgentInfo(agentId) {
110
+ const agent = activeAgents.get(agentId);
111
+ if (!agent || !agent.child.pid) {
112
+ return null;
113
+ }
114
+ return {
115
+ agentId,
116
+ pid: agent.child.pid,
117
+ startedAt: agent.startedAt,
118
+ uptime: Date.now() - agent.startedAt.getTime(),
119
+ };
120
+ }
121
+ /**
122
+ * Kill all active agents
123
+ */
124
+ export function killAllAgents() {
125
+ for (const [agentId, agent] of activeAgents) {
126
+ if (agent.timeout) {
127
+ clearTimeout(agent.timeout);
128
+ }
129
+ agent.child.kill('SIGTERM');
130
+ }
131
+ activeAgents.clear();
132
+ }
133
+ /**
134
+ * Wait for all agents to complete
135
+ *
136
+ * @returns Promise that resolves when all agents have exited
137
+ */
138
+ export async function waitForAllAgents() {
139
+ const promises = Array.from(activeAgents.values()).map((agent) => new Promise((resolve) => {
140
+ agent.child.once('exit', () => resolve());
141
+ }));
142
+ await Promise.all(promises);
143
+ }
144
+ //# sourceMappingURL=process-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../src/coordination/process-manager.ts"],"names":[],"mappings":"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"}
@@ -16,12 +16,15 @@ import type { Mode, TraceEvent } from '../types/index.js';
16
16
  export interface AgentRunResult {
17
17
  success: boolean;
18
18
  changes: string[];
19
- trace: TraceEvent;
19
+ trace?: TraceEvent;
20
20
  cost: number;
21
+ error?: string;
21
22
  }
22
23
  export interface AgentExecuteOptions {
23
24
  dryRun?: boolean;
24
25
  maxRetries?: number;
26
+ agentId?: string;
27
+ taskId?: string;
25
28
  }
26
29
  /**
27
30
  * Execute agent work on a single file
@@ -1 +1 @@
1
- {"version":3,"file":"agent-executor.d.ts","sourceRoot":"","sources":["../../src/core/agent-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAyB,MAAM,mBAAmB,CAAC;AAIjF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAuKzB"}
1
+ {"version":3,"file":"agent-executor.d.ts","sourceRoot":"","sources":["../../src/core/agent-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAyB,MAAM,mBAAmB,CAAC;AAIjF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAOD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAkMzB"}