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.
- package/.agent-meta/_inhibitors.ndjson +1287 -0
- package/.agent-meta/_quarantine.json +45 -0
- package/.agent-meta/config.json +9 -0
- package/.agent-meta/tasks/_active.json +4 -0
- package/.agent-meta/tasks/task_0657b028-05a0-4b0c-b0b9-a4eae3d66cd9.json +168 -0
- package/.claude/memory.db +0 -0
- package/.claude/settings.local.json +4 -1
- package/README.md +85 -233
- package/SECURITY.md +145 -0
- package/dist/agent/task-worker.d.ts +11 -0
- package/dist/agent/task-worker.d.ts.map +1 -0
- package/dist/agent/task-worker.js +173 -0
- package/dist/agent/task-worker.js.map +1 -0
- package/dist/agent/worker.d.ts +8 -0
- package/dist/agent/worker.d.ts.map +1 -0
- package/dist/agent/worker.js +97 -0
- package/dist/agent/worker.js.map +1 -0
- package/dist/bin.d.ts +7 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +11 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/cost.d.ts +10 -0
- package/dist/cli/cost.d.ts.map +1 -0
- package/dist/cli/cost.js +163 -0
- package/dist/cli/cost.js.map +1 -0
- package/dist/cli/gc.d.ts +10 -0
- package/dist/cli/gc.d.ts.map +1 -0
- package/dist/cli/gc.js +108 -0
- package/dist/cli/gc.js.map +1 -0
- package/dist/cli/gradients.d.ts +10 -0
- package/dist/cli/gradients.d.ts.map +1 -0
- package/dist/cli/gradients.js +70 -0
- package/dist/cli/gradients.js.map +1 -0
- package/dist/cli/grow.d.ts +17 -0
- package/dist/cli/grow.d.ts.map +1 -0
- package/dist/cli/grow.js +373 -0
- package/dist/cli/grow.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +74 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +11 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +97 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/status.d.ts +10 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +191 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/coordination/file-locks.d.ts +42 -0
- package/dist/coordination/file-locks.d.ts.map +1 -0
- package/dist/coordination/file-locks.js +269 -0
- package/dist/coordination/file-locks.js.map +1 -0
- package/dist/coordination/index.d.ts +4 -0
- package/dist/coordination/index.d.ts.map +1 -1
- package/dist/coordination/index.js +4 -0
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/inhibitors.d.ts +84 -0
- package/dist/coordination/inhibitors.d.ts.map +1 -0
- package/dist/coordination/inhibitors.js +290 -0
- package/dist/coordination/inhibitors.js.map +1 -0
- package/dist/coordination/process-manager.d.ts +73 -0
- package/dist/coordination/process-manager.d.ts.map +1 -0
- package/dist/coordination/process-manager.js +144 -0
- package/dist/coordination/process-manager.js.map +1 -0
- package/dist/core/agent-executor.d.ts +4 -1
- package/dist/core/agent-executor.d.ts.map +1 -1
- package/dist/core/agent-executor.js +38 -12
- package/dist/core/agent-executor.js.map +1 -1
- package/dist/core/change-applier.d.ts +29 -5
- package/dist/core/change-applier.d.ts.map +1 -1
- package/dist/core/change-applier.js +254 -24
- package/dist/core/change-applier.js.map +1 -1
- package/dist/core/signals/churn.d.ts.map +1 -1
- package/dist/core/signals/churn.js +6 -4
- package/dist/core/signals/churn.js.map +1 -1
- package/dist/core/signals/debt.d.ts.map +1 -1
- package/dist/core/signals/debt.js +4 -3
- package/dist/core/signals/debt.js.map +1 -1
- package/dist/cost/cost-tracker.d.ts.map +1 -1
- package/dist/cost/cost-tracker.js +2 -0
- package/dist/cost/cost-tracker.js.map +1 -1
- package/dist/gc/index.d.ts +17 -0
- package/dist/gc/index.d.ts.map +1 -0
- package/dist/gc/index.js +17 -0
- package/dist/gc/index.js.map +1 -0
- package/dist/gc/runner.d.ts +39 -0
- package/dist/gc/runner.d.ts.map +1 -0
- package/dist/gc/runner.js +277 -0
- package/dist/gc/runner.js.map +1 -0
- package/dist/gc/trace-compactor.d.ts +31 -0
- package/dist/gc/trace-compactor.d.ts.map +1 -0
- package/dist/gc/trace-compactor.js +162 -0
- package/dist/gc/trace-compactor.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/prompts/index.d.ts +2 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js.map +1 -1
- package/dist/quarantine/explorer.d.ts +65 -0
- package/dist/quarantine/explorer.d.ts.map +1 -0
- package/dist/quarantine/explorer.js +175 -0
- package/dist/quarantine/explorer.js.map +1 -0
- package/dist/quarantine/index.d.ts +7 -0
- package/dist/quarantine/index.d.ts.map +1 -0
- package/dist/quarantine/index.js +7 -0
- package/dist/quarantine/index.js.map +1 -0
- package/dist/quarantine/manager.d.ts +75 -0
- package/dist/quarantine/manager.d.ts.map +1 -0
- package/dist/quarantine/manager.js +275 -0
- package/dist/quarantine/manager.js.map +1 -0
- package/dist/task/acceptance.d.ts +29 -0
- package/dist/task/acceptance.d.ts.map +1 -0
- package/dist/task/acceptance.js +228 -0
- package/dist/task/acceptance.js.map +1 -0
- package/dist/task/agent-coordinator.d.ts +40 -0
- package/dist/task/agent-coordinator.d.ts.map +1 -0
- package/dist/task/agent-coordinator.js +168 -0
- package/dist/task/agent-coordinator.js.map +1 -0
- package/dist/task/executor.d.ts +37 -0
- package/dist/task/executor.d.ts.map +1 -0
- package/dist/task/executor.js +462 -0
- package/dist/task/executor.js.map +1 -0
- package/dist/task/index.d.ts +12 -0
- package/dist/task/index.d.ts.map +1 -0
- package/dist/task/index.js +12 -0
- package/dist/task/index.js.map +1 -0
- package/dist/task/planner.d.ts +21 -0
- package/dist/task/planner.d.ts.map +1 -0
- package/dist/task/planner.js +253 -0
- package/dist/task/planner.js.map +1 -0
- package/dist/task/storage.d.ts +46 -0
- package/dist/task/storage.d.ts.map +1 -0
- package/dist/task/storage.js +266 -0
- package/dist/task/storage.js.map +1 -0
- package/dist/trace/trace-event.d.ts +2 -18
- package/dist/trace/trace-event.d.ts.map +1 -1
- package/dist/trace/trace-event.js +6 -6
- package/dist/trace/trace-event.js.map +1 -1
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +54 -15
- package/dist/utils/file-utils.js.map +1 -1
- package/docs/PHASE5_IMPLEMENTATION.md +237 -0
- package/docs/PHASES-3-7-COMPLETE.md +177 -0
- package/docs/PHASE_4_COMPLETE.md +135 -0
- package/docs/PHASE_7_DELIVERABLES.md +295 -0
- package/docs/PHASE_7_IMPLEMENTATION.md +306 -0
- package/docs/PHASE_7_SUMMARY.txt +195 -0
- package/docs/RELEASE-NOTES-v2.1.md +213 -0
- package/docs/ROADMAP.md +194 -107
- package/docs/SECURITY-AUDIT.md +387 -0
- package/docs/SNAPSHOT.md +59 -32
- package/docs/implementation/phase3-summary.md +220 -0
- package/package.json +27 -11
- package/src/agent/task-worker.ts +196 -0
- package/src/agent/worker.ts +111 -0
- package/src/bin.ts +13 -0
- package/src/cli/cost.ts +210 -0
- package/src/cli/gc.ts +138 -0
- package/src/cli/gradients.ts +97 -0
- package/src/cli/grow.ts +416 -0
- package/src/cli/index.ts +81 -0
- package/src/cli/init.ts +139 -0
- package/src/cli/status.ts +218 -0
- package/src/coordination/file-locks.ts +300 -0
- package/src/coordination/index.ts +4 -0
- package/src/coordination/inhibitors.ts +345 -0
- package/src/coordination/process-manager.ts +199 -0
- package/src/core/agent-executor.ts +37 -8
- package/src/core/signals/churn.ts +8 -5
- package/src/core/signals/debt.ts +4 -3
- package/src/cost/cost-tracker.ts +2 -0
- package/src/gc/index.ts +17 -0
- package/src/gc/runner.ts +314 -0
- package/src/gc/trace-compactor.ts +187 -0
- package/src/index.ts +7 -1
- package/src/prompts/index.ts +2 -1
- package/src/quarantine/explorer.ts +234 -0
- package/src/quarantine/index.ts +7 -0
- package/src/quarantine/manager.ts +336 -0
- package/src/task/acceptance.ts +267 -0
- package/src/task/agent-coordinator.ts +220 -0
- package/src/task/executor.ts +543 -0
- package/src/task/index.ts +38 -0
- package/src/task/planner.ts +294 -0
- package/src/task/storage.ts +332 -0
- package/src/trace/trace-event.ts +7 -26
- package/src/utils/file-utils.ts +61 -15
- package/tests/cli/gc.test.ts +206 -0
- package/tests/cli/init.test.ts +181 -0
- package/tests/cli/status.test.ts +282 -0
- package/tests/coordination/file-locks.test.ts +196 -0
- package/tests/coordination/inhibitors.test.ts +459 -0
- package/tests/coordination/integration.test.ts +195 -0
- package/tests/coordination/process-manager.test.ts +165 -0
- package/tests/gc/trace-compactor.test.ts +245 -0
- package/tests/integration/phase-7.test.ts +145 -0
- package/tests/quarantine/explorer.test.ts +381 -0
- package/tests/quarantine/manager.test.ts +399 -0
- package/tests/security/command-injection.test.ts +88 -0
- package/tests/security/path-traversal.test.ts +103 -0
- package/tests/task/acceptance.test.ts +411 -0
- package/tests/task/executor.test.ts +421 -0
- package/tests/task/planner.test.ts +359 -0
- package/tests/trace/trace-event.test.ts +62 -20
- 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 @@
|
|
|
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 @@
|
|
|
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
|
package/dist/bin.js.map
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/cli/cost.js
ADDED
|
@@ -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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"}
|
package/dist/cli/gc.d.ts
ADDED
|
@@ -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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"}
|