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
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Task Worker Process
3
+ *
4
+ * Independent agent process spawned for a specific task step.
5
+ * Integrates with the full mycelium system: file locks, inhibitors,
6
+ * quarantine, and the complete executeAgent() RALPH cycle.
7
+ *
8
+ * This runs as a separate Node.js process via child_process.fork()
9
+ */
10
+ import { executeAgent } from '../core/agent-executor.js';
11
+ import { tryAcquireLock, releaseLock } from '../coordination/file-locks.js';
12
+ import { isQuarantined, recordExplorerAttempt } from '../quarantine/manager.js';
13
+ import { logDebug, logError, logInfo } from '../utils/logger.js';
14
+ /**
15
+ * Parse task context from environment variables
16
+ */
17
+ function getTaskContext() {
18
+ const agentId = process.env.AGENT_ID;
19
+ const taskId = process.env.TASK_ID;
20
+ const stepOrder = process.env.STEP_ORDER;
21
+ const targetFile = process.env.TARGET_FILE;
22
+ const mode = process.env.MODE;
23
+ const description = process.env.STEP_DESCRIPTION;
24
+ if (!agentId || !taskId || !stepOrder || !targetFile || !mode) {
25
+ throw new Error('Missing required environment variables for task worker');
26
+ }
27
+ return {
28
+ agentId,
29
+ taskId,
30
+ stepOrder: parseInt(stepOrder, 10),
31
+ targetFile,
32
+ mode: mode,
33
+ description: description || '',
34
+ };
35
+ }
36
+ /**
37
+ * Send IPC message to parent process
38
+ */
39
+ function sendMessage(type, data) {
40
+ if (process.send) {
41
+ process.send({ type, ...data });
42
+ }
43
+ }
44
+ /**
45
+ * Main worker execution
46
+ */
47
+ async function main() {
48
+ let lockAcquired = false;
49
+ let lockId;
50
+ try {
51
+ const context = getTaskContext();
52
+ logInfo('Task worker started', {
53
+ agentId: context.agentId,
54
+ taskId: context.taskId,
55
+ stepOrder: context.stepOrder,
56
+ targetFile: context.targetFile,
57
+ mode: context.mode,
58
+ });
59
+ sendMessage('progress', {
60
+ message: `Starting work on ${context.targetFile}`,
61
+ });
62
+ // Check if file is quarantined
63
+ if (await isQuarantined(context.targetFile)) {
64
+ // Only explorer mode can work on quarantined files
65
+ if (context.mode === 'explorer') {
66
+ logInfo('Explorer mode working on quarantined file', {
67
+ file: context.targetFile,
68
+ });
69
+ await recordExplorerAttempt(context.targetFile);
70
+ }
71
+ else {
72
+ logInfo('File is quarantined, skipping', {
73
+ file: context.targetFile,
74
+ mode: context.mode,
75
+ });
76
+ sendMessage('result', {
77
+ success: false,
78
+ error: `File ${context.targetFile} is quarantined. Only explorer mode can work on it.`,
79
+ });
80
+ process.exit(1);
81
+ }
82
+ }
83
+ // Try to acquire file lock
84
+ logDebug('Attempting to acquire lock', {
85
+ file: context.targetFile,
86
+ agentId: context.agentId,
87
+ });
88
+ const lockResult = await tryAcquireLock(context.targetFile, {
89
+ agent_id: context.agentId,
90
+ task_id: context.taskId,
91
+ mode: context.mode,
92
+ });
93
+ if (!lockResult.acquired) {
94
+ logInfo('Lock acquisition failed', {
95
+ file: context.targetFile,
96
+ reason: lockResult.reason,
97
+ });
98
+ sendMessage('result', {
99
+ success: false,
100
+ error: `Could not acquire lock: ${lockResult.reason}`,
101
+ });
102
+ process.exit(1);
103
+ }
104
+ lockAcquired = true;
105
+ lockId = lockResult.lockId;
106
+ logInfo('Lock acquired', {
107
+ file: context.targetFile,
108
+ lockId,
109
+ });
110
+ sendMessage('progress', {
111
+ message: 'Lock acquired, executing agent cycle',
112
+ });
113
+ // Execute the full agent cycle (RALPH loop)
114
+ // This includes:
115
+ // - Reading file and calculating gradient
116
+ // - Building prompt with inhibitors
117
+ // - Calling LLM
118
+ // - Applying changes
119
+ // - Running CI validation
120
+ // - Recording trace
121
+ // - Emitting inhibitors on failure
122
+ const result = await executeAgent(context.targetFile, context.mode, {
123
+ dryRun: false,
124
+ agentId: context.agentId,
125
+ taskId: context.taskId,
126
+ });
127
+ logInfo('Agent execution complete', {
128
+ file: context.targetFile,
129
+ success: result.success,
130
+ traceId: result.trace?.id,
131
+ });
132
+ // Send result back to coordinator
133
+ sendMessage('result', {
134
+ success: result.success,
135
+ traceId: result.trace?.id,
136
+ error: result.error,
137
+ });
138
+ // Clean exit
139
+ process.exit(result.success ? 0 : 1);
140
+ }
141
+ catch (error) {
142
+ const errorObj = error instanceof Error ? error : new Error(String(error));
143
+ logError('Task worker failed', errorObj, {
144
+ agentId: process.env.AGENT_ID,
145
+ });
146
+ sendMessage('result', {
147
+ success: false,
148
+ error: errorObj.message,
149
+ });
150
+ process.exit(1);
151
+ }
152
+ finally {
153
+ // Always release lock if we acquired it
154
+ if (lockAcquired && lockId) {
155
+ try {
156
+ const targetFile = process.env.TARGET_FILE;
157
+ if (targetFile) {
158
+ await releaseLock(targetFile, lockId);
159
+ logDebug('Lock released', { file: targetFile, lockId });
160
+ }
161
+ }
162
+ catch (error) {
163
+ logError('Failed to release lock', error, { lockId });
164
+ }
165
+ }
166
+ }
167
+ }
168
+ // Run the worker
169
+ main().catch((error) => {
170
+ console.error('Fatal error in task worker:', error);
171
+ process.exit(1);
172
+ });
173
+ //# sourceMappingURL=task-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-worker.js","sourceRoot":"","sources":["../../src/agent/task-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Agent Worker Process Entry Point
3
+ * Each agent runs as an independent Node.js process
4
+ *
5
+ * Reference: ADR-004 lines 30-45
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/agent/worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Agent Worker Process Entry Point
3
+ * Each agent runs as an independent Node.js process
4
+ *
5
+ * Reference: ADR-004 lines 30-45
6
+ */
7
+ // import { readGradientCache } from '../coordination/gradient-cache.js'; // TODO: Implement readGradientCache
8
+ /**
9
+ * Main agent worker loop
10
+ */
11
+ async function main() {
12
+ const agentId = process.env.AGENT_ID;
13
+ const maxIterations = parseInt(process.env.MAX_ITERATIONS ?? '10', 10);
14
+ if (!agentId) {
15
+ console.error('[worker] AGENT_ID environment variable not set');
16
+ process.exit(1);
17
+ }
18
+ console.log(`[${agentId}] Starting with max ${maxIterations} iterations`);
19
+ let iterations = 0;
20
+ while (iterations < maxIterations) {
21
+ try {
22
+ // 1. Read gradient cache
23
+ // const cache = await readGradientCache(); // TODO: Implement readGradientCache
24
+ const cache = null; // Temporary workaround
25
+ if (!cache) {
26
+ console.log(`[${agentId}] No gradient cache available. Exiting.`);
27
+ break;
28
+ }
29
+ // 2. Find unlocked target with highest gradient
30
+ // const target = findUnlockedTarget(cache.gradients); // TODO: Fix when readGradientCache is implemented
31
+ const target = null; // Temporary workaround
32
+ if (!target) {
33
+ console.log(`[${agentId}] No unlocked work available. Exiting.`);
34
+ break;
35
+ }
36
+ // TODO: The following code is disabled until readGradientCache is implemented
37
+ /*
38
+ // 3. Try to acquire lock
39
+ const locked = await acquireLock(target.file, agentId, 'error_reducer');
40
+
41
+ if (!locked) {
42
+ console.log(`[${agentId}] ${target.file} locked by another agent. Retrying...`);
43
+ iterations++;
44
+ continue;
45
+ }
46
+
47
+ console.log(`[${agentId}] Acquired lock on ${target.file}`);
48
+
49
+ try {
50
+ // 4. Execute work (stub for Phase 3)
51
+ console.log(`[${agentId}] Would process ${target.file} here`);
52
+
53
+ // Simulate work
54
+ await new Promise((resolve) => setTimeout(resolve, 100));
55
+
56
+ console.log(`[${agentId}] Completed work on ${target.file}`);
57
+ } finally {
58
+ // 5. Release lock
59
+ await releaseLock(target.file);
60
+ console.log(`[${agentId}] Released lock on ${target.file}`);
61
+ }
62
+ */
63
+ iterations++;
64
+ }
65
+ catch (error) {
66
+ console.error(`[${agentId}] Error in iteration ${iterations}:`, error);
67
+ iterations++;
68
+ }
69
+ }
70
+ console.log(`[${agentId}] Completed ${iterations} iterations. Exiting.`);
71
+ process.exit(0);
72
+ }
73
+ /**
74
+ * Find highest gradient file that isn't locked
75
+ * Stub implementation for Phase 3 - TODO: Enable when readGradientCache is implemented
76
+ */
77
+ /*
78
+ function findUnlockedTarget(gradients: any[]): { file: string; score: number } | null {
79
+ if (!gradients || gradients.length === 0) {
80
+ return null;
81
+ }
82
+
83
+ // Sort by score descending
84
+ const sorted = [...gradients].sort((a, b) => b.score - a.score);
85
+
86
+ // For Phase 3, just return the highest
87
+ // In Phase 4, we'll check lock status
88
+ return sorted[0] ? { file: sorted[0].file, score: sorted[0].score } : null;
89
+ }
90
+ */
91
+ // Run the worker
92
+ main().catch((error) => {
93
+ console.error('[worker] Fatal error:', error);
94
+ process.exit(1);
95
+ });
96
+ export {};
97
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/agent/worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,8GAA8G;AAE9G;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,uBAAuB,aAAa,aAAa,CAAC,CAAC;IAE1E,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO,UAAU,GAAG,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,yBAAyB;YACzB,iFAAiF;YACjF,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,uBAAuB;YAE3C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,yCAAyC,CAAC,CAAC;gBAClE,MAAM;YACR,CAAC;YAED,gDAAgD;YAChD,0GAA0G;YAC1G,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,uBAAuB;YAE5C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,wCAAwC,CAAC,CAAC;gBACjE,MAAM;YACR,CAAC;YAED,8EAA8E;YAC9E;;;;;;;;;;;;;;;;;;;;;;;;;cAyBE;YAEF,UAAU,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,wBAAwB,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;YACvE,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,eAAe,UAAU,uBAAuB,CAAC,CAAC;IACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH;;;;;;;;;;;;;EAaE;AAEF,iBAAiB;AACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Entry Point
4
+ * Executable entry point for claude-mycelium CLI
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
package/dist/bin.js ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Entry Point
4
+ * Executable entry point for claude-mycelium CLI
5
+ */
6
+ import { execute } from './cli/index.js';
7
+ execute().catch((error) => {
8
+ console.error('Fatal error:', error);
9
+ process.exit(1);
10
+ });
11
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Cost CLI Command
3
+ *
4
+ * Display spending report with daily summaries
5
+ * Show efficiency trends
6
+ */
7
+ import { Command } from 'commander';
8
+ declare const command: Command;
9
+ export default command;
10
+ //# sourceMappingURL=cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/cli/cost.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,QAAA,MAAM,OAAO,SA6ET,CAAC;AAuHL,eAAe,OAAO,CAAC"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Cost CLI Command
3
+ *
4
+ * Display spending report with daily summaries
5
+ * Show efficiency trends
6
+ */
7
+ import { Command } from 'commander';
8
+ import chalk from 'chalk';
9
+ import * as fs from 'fs/promises';
10
+ import * as path from 'path';
11
+ const command = new Command()
12
+ .name('cost')
13
+ .description('Show spending report and efficiency trends')
14
+ .option('--days <number>', 'Show data for last N days', '30')
15
+ .option('--json', 'Output as JSON')
16
+ .action(async (options) => {
17
+ try {
18
+ const days = parseInt(options.days, 10) || 30;
19
+ const summary = await generateCostSummary(days);
20
+ if (options.json) {
21
+ console.log(JSON.stringify(summary, null, 2));
22
+ return;
23
+ }
24
+ // Colorized output
25
+ console.log('');
26
+ console.log(chalk.bold('Cost Report (Last ' + days + ' days)'));
27
+ console.log(chalk.dim('─'.repeat(80)));
28
+ // Overall totals
29
+ console.log(chalk.bold('Overall:'));
30
+ console.log(` Total cost: ${chalk.yellow('$' + summary.total_usd.toFixed(2))}`);
31
+ console.log(` Total tokens in: ${summary.total_tokens_in.toLocaleString()}`);
32
+ console.log(` Total tokens out: ${summary.total_tokens_out.toLocaleString()}`);
33
+ console.log(` Avg cost per run: ${chalk.yellow('$' + summary.avg_cost_per_run.toFixed(4))}`);
34
+ console.log(` Avg cost per improvement: ${chalk.yellow('$' + summary.avg_cost_per_improvement.toFixed(4))}`);
35
+ // Trend
36
+ const trendColor = summary.cost_efficiency_trend === 'improving'
37
+ ? 'green'
38
+ : summary.cost_efficiency_trend === 'stable'
39
+ ? 'yellow'
40
+ : 'red';
41
+ console.log(` Trend: ${chalk[trendColor](summary.cost_efficiency_trend)}`);
42
+ console.log(chalk.dim('─'.repeat(80)));
43
+ // Daily breakdown
44
+ if (summary.daily.length > 0) {
45
+ console.log(chalk.bold('Daily Breakdown:'));
46
+ console.log(chalk.gray(`${'Date'.padEnd(12)} ${'Runs'.padStart(6)} ${'Cost'.padStart(12)} ${'Eff.'.padStart(8)}`));
47
+ for (const day of summary.daily.slice(-7)) {
48
+ const costStr = ('$' + day.total_cost_usd.toFixed(2)).padStart(12);
49
+ const effStr = (day.avg_efficiency.toFixed(3)).padStart(8);
50
+ console.log(`${day.date.padEnd(12)} ${String(day.runs).padStart(6)} ${costStr} ${effStr}`);
51
+ }
52
+ }
53
+ console.log('');
54
+ }
55
+ catch (error) {
56
+ const message = error instanceof Error ? error.message : 'Unknown error';
57
+ console.error(chalk.red(`Error: ${message}`));
58
+ process.exit(1);
59
+ }
60
+ });
61
+ /**
62
+ * Generate cost summary from trace events
63
+ */
64
+ async function generateCostSummary(days) {
65
+ const tracesDir = '.agent-meta/traces';
66
+ const now = Date.now();
67
+ const cutoffMs = days * 24 * 60 * 60 * 1000;
68
+ let traceFiles = [];
69
+ try {
70
+ const entries = await fs.readdir(tracesDir);
71
+ traceFiles = entries.filter(f => f.endsWith('.ndjson'));
72
+ }
73
+ catch {
74
+ // Traces directory doesn't exist
75
+ }
76
+ const events = [];
77
+ // Collect all trace events from last N days
78
+ for (const file of traceFiles) {
79
+ const filePath = path.join(tracesDir, file);
80
+ try {
81
+ const content = await fs.readFile(filePath, 'utf-8');
82
+ const lines = content.split('\n').filter(Boolean);
83
+ for (const line of lines) {
84
+ try {
85
+ const event = JSON.parse(line);
86
+ const ageMs = now - new Date(event.timestamp).getTime();
87
+ if (ageMs < cutoffMs) {
88
+ events.push(event);
89
+ }
90
+ }
91
+ catch {
92
+ // Skip malformed lines
93
+ }
94
+ }
95
+ }
96
+ catch {
97
+ // File read error
98
+ }
99
+ }
100
+ // Calculate daily summaries
101
+ const byDate = new Map();
102
+ for (const event of events) {
103
+ const date = new Date(event.timestamp).toISOString().split('T')[0];
104
+ if (!byDate.has(date)) {
105
+ byDate.set(date, []);
106
+ }
107
+ byDate.get(date).push(event);
108
+ }
109
+ const daily = [];
110
+ let totalCost = 0;
111
+ let totalTokensIn = 0;
112
+ let totalTokensOut = 0;
113
+ let totalEfficiency = 0;
114
+ let improvementCount = 0;
115
+ for (const [date, dayEvents] of Array.from(byDate).sort()) {
116
+ const cost = dayEvents.reduce((sum, e) => sum + e.cost.estimated_usd, 0);
117
+ const tokensIn = dayEvents.reduce((sum, e) => sum + e.cost.tokens_in, 0);
118
+ const tokensOut = dayEvents.reduce((sum, e) => sum + e.cost.tokens_out, 0);
119
+ const avgEff = dayEvents.reduce((sum, e) => sum + e.efficiency, 0) / dayEvents.length;
120
+ const improvements = dayEvents.filter(e => e.gradient_delta > 0).length;
121
+ const dayData = {
122
+ date,
123
+ runs: dayEvents.length,
124
+ total_cost_usd: cost,
125
+ total_tokens_in: tokensIn,
126
+ total_tokens_out: tokensOut,
127
+ avg_efficiency: avgEff,
128
+ cost_per_improvement: improvements > 0 ? cost / improvements : cost,
129
+ };
130
+ daily.push(dayData);
131
+ totalCost += cost;
132
+ totalTokensIn += tokensIn;
133
+ totalTokensOut += tokensOut;
134
+ totalEfficiency += avgEff;
135
+ improvementCount += improvements;
136
+ }
137
+ // Calculate trend (compare first half vs second half)
138
+ let trend = 'stable';
139
+ if (daily.length >= 2) {
140
+ const mid = Math.floor(daily.length / 2);
141
+ const firstHalf = daily.slice(0, mid);
142
+ const secondHalf = daily.slice(mid);
143
+ const firstAvgEff = firstHalf.reduce((sum, d) => sum + d.avg_efficiency, 0) / firstHalf.length;
144
+ const secondAvgEff = secondHalf.reduce((sum, d) => sum + d.avg_efficiency, 0) / secondHalf.length;
145
+ if (secondAvgEff > firstAvgEff * 1.1) {
146
+ trend = 'improving';
147
+ }
148
+ else if (secondAvgEff < firstAvgEff * 0.9) {
149
+ trend = 'degrading';
150
+ }
151
+ }
152
+ return {
153
+ total_usd: totalCost,
154
+ total_tokens_in: totalTokensIn,
155
+ total_tokens_out: totalTokensOut,
156
+ avg_cost_per_run: events.length > 0 ? totalCost / events.length : 0,
157
+ avg_cost_per_improvement: improvementCount > 0 ? totalCost / improvementCount : totalCost,
158
+ cost_efficiency_trend: trend,
159
+ daily,
160
+ };
161
+ }
162
+ export default command;
163
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/cli/cost.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * GC CLI Command
3
+ *
4
+ * Manual garbage collection trigger
5
+ * Show GC report and statistics
6
+ */
7
+ import { Command } from 'commander';
8
+ declare const command: Command;
9
+ export default command;
10
+ //# sourceMappingURL=gc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc.d.ts","sourceRoot":"","sources":["../../src/cli/gc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,QAAA,MAAM,OAAO,SAkBT,CAAC;AA4GL,eAAe,OAAO,CAAC"}
package/dist/cli/gc.js ADDED
@@ -0,0 +1,108 @@
1
+ /**
2
+ * GC CLI Command
3
+ *
4
+ * Manual garbage collection trigger
5
+ * Show GC report and statistics
6
+ */
7
+ import { Command } from 'commander';
8
+ import chalk from 'chalk';
9
+ import { runGC, readGCLog } from '../gc/runner.js';
10
+ const command = new Command()
11
+ .name('gc')
12
+ .description('Run garbage collection manually')
13
+ .option('--json', 'Output as JSON')
14
+ .option('--history', 'Show GC history')
15
+ .action(async (options) => {
16
+ try {
17
+ if (options.history) {
18
+ await showGCHistory(options.json);
19
+ return;
20
+ }
21
+ await runGarbageCollection(options.json);
22
+ }
23
+ catch (error) {
24
+ const message = error instanceof Error ? error.message : 'Unknown error';
25
+ console.error(chalk.red(`Error: ${message}`));
26
+ process.exit(1);
27
+ }
28
+ });
29
+ /**
30
+ * Run garbage collection and show report
31
+ */
32
+ async function runGarbageCollection(json = false) {
33
+ if (!json) {
34
+ console.log('');
35
+ console.log(chalk.bold('Running garbage collection...'));
36
+ }
37
+ const report = await runGC();
38
+ if (json) {
39
+ console.log(JSON.stringify(report, null, 2));
40
+ return;
41
+ }
42
+ // Display report
43
+ console.log(chalk.green('✓ GC completed'));
44
+ console.log('');
45
+ console.log(chalk.bold('Report:'));
46
+ console.log(` Timestamp: ${report.timestamp}`);
47
+ console.log(` Duration: ${report.duration_ms}ms`);
48
+ console.log(` Size before: ${report.size_before_mb.toFixed(2)} MB`);
49
+ console.log(` Size after: ${report.size_after_mb.toFixed(2)} MB`);
50
+ if (report.size_before_mb > 0) {
51
+ const saved = report.size_before_mb - report.size_after_mb;
52
+ const percent = ((saved / report.size_before_mb) * 100).toFixed(1);
53
+ console.log(` Space saved: ${chalk.green(saved.toFixed(2) + ' MB')} (${percent}%)`);
54
+ }
55
+ console.log('');
56
+ console.log(chalk.bold('Actions:'));
57
+ console.log(` Deleted items: ${report.deleted}`);
58
+ console.log(` Compacted files: ${report.compacted}`);
59
+ if (report.errors.length > 0) {
60
+ console.log('');
61
+ console.log(chalk.yellow('Warnings:'));
62
+ for (const error of report.errors) {
63
+ console.log(` - ${error}`);
64
+ }
65
+ }
66
+ console.log('');
67
+ }
68
+ /**
69
+ * Show GC history
70
+ */
71
+ async function showGCHistory(json = false) {
72
+ const reports = await readGCLog();
73
+ if (json) {
74
+ console.log(JSON.stringify(reports, null, 2));
75
+ return;
76
+ }
77
+ if (reports.length === 0) {
78
+ console.log(chalk.yellow('No GC history found'));
79
+ return;
80
+ }
81
+ console.log('');
82
+ console.log(chalk.bold('GC History'));
83
+ console.log(chalk.dim('─'.repeat(80)));
84
+ console.log(chalk.gray(`${'Timestamp'.padEnd(25)} ${'Duration'.padStart(10)} ${'Deleted'.padStart(10)} ${'Space'.padStart(15)}`));
85
+ console.log(chalk.dim('─'.repeat(80)));
86
+ for (const report of reports.slice(-10)) {
87
+ const date = new Date(report.timestamp).toISOString().split('T')[0];
88
+ const time = new Date(report.timestamp).toISOString().split('T')[1].substring(0, 5);
89
+ const timestamp = `${date} ${time}`.padEnd(25);
90
+ const duration = `${report.duration_ms}ms`.padStart(10);
91
+ const deleted = String(report.deleted).padStart(10);
92
+ const saved = (report.size_before_mb - report.size_after_mb).toFixed(2);
93
+ const space = `${saved}MB`.padStart(15);
94
+ console.log(`${timestamp} ${duration} ${deleted} ${space}`);
95
+ }
96
+ console.log(chalk.dim('─'.repeat(80)));
97
+ // Summary statistics
98
+ const totalDeleted = reports.reduce((sum, r) => sum + r.deleted, 0);
99
+ const totalSaved = reports.reduce((sum, r) => sum + (r.size_before_mb - r.size_after_mb), 0);
100
+ const avgDuration = reports.reduce((sum, r) => sum + r.duration_ms, 0) / reports.length;
101
+ console.log(chalk.bold('Summary (all runs):'));
102
+ console.log(` Total items deleted: ${totalDeleted}`);
103
+ console.log(` Total space saved: ${totalSaved.toFixed(2)} MB`);
104
+ console.log(` Average duration: ${avgDuration.toFixed(0)}ms`);
105
+ console.log('');
106
+ }
107
+ export default command;
108
+ //# sourceMappingURL=gc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc.js","sourceRoot":"","sources":["../../src/cli/gc.ts"],"names":[],"mappings":"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"}