claude-mycelium 2.0.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/.claude/settings.local.json +14 -0
- package/README.md +304 -0
- package/dist/coordination/gradient-cache.d.ts +48 -0
- package/dist/coordination/gradient-cache.d.ts.map +1 -0
- package/dist/coordination/gradient-cache.js +145 -0
- package/dist/coordination/gradient-cache.js.map +1 -0
- package/dist/coordination/index.d.ts +10 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +10 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/core/agent-executor.d.ts +31 -0
- package/dist/core/agent-executor.d.ts.map +1 -0
- package/dist/core/agent-executor.js +257 -0
- package/dist/core/agent-executor.js.map +1 -0
- package/dist/core/change-applier.d.ts +10 -0
- package/dist/core/change-applier.d.ts.map +1 -0
- package/dist/core/change-applier.js +32 -0
- package/dist/core/change-applier.js.map +1 -0
- package/dist/core/gradient.d.ts +60 -0
- package/dist/core/gradient.d.ts.map +1 -0
- package/dist/core/gradient.js +191 -0
- package/dist/core/gradient.js.map +1 -0
- package/dist/core/index.d.ts +24 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +24 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/mode-selector.d.ts +44 -0
- package/dist/core/mode-selector.d.ts.map +1 -0
- package/dist/core/mode-selector.js +208 -0
- package/dist/core/mode-selector.js.map +1 -0
- package/dist/core/signals/centrality.d.ts +44 -0
- package/dist/core/signals/centrality.d.ts.map +1 -0
- package/dist/core/signals/centrality.js +264 -0
- package/dist/core/signals/centrality.js.map +1 -0
- package/dist/core/signals/churn.d.ts +41 -0
- package/dist/core/signals/churn.d.ts.map +1 -0
- package/dist/core/signals/churn.js +188 -0
- package/dist/core/signals/churn.js.map +1 -0
- package/dist/core/signals/complexity.d.ts +29 -0
- package/dist/core/signals/complexity.d.ts.map +1 -0
- package/dist/core/signals/complexity.js +169 -0
- package/dist/core/signals/complexity.js.map +1 -0
- package/dist/core/signals/debt.d.ts +27 -0
- package/dist/core/signals/debt.d.ts.map +1 -0
- package/dist/core/signals/debt.js +80 -0
- package/dist/core/signals/debt.js.map +1 -0
- package/dist/core/signals/errors.d.ts +32 -0
- package/dist/core/signals/errors.d.ts.map +1 -0
- package/dist/core/signals/errors.js +73 -0
- package/dist/core/signals/errors.js.map +1 -0
- package/dist/core/signals/index.d.ts +19 -0
- package/dist/core/signals/index.d.ts.map +1 -0
- package/dist/core/signals/index.js +19 -0
- package/dist/core/signals/index.js.map +1 -0
- package/dist/cost/cost-tracker.d.ts +90 -0
- package/dist/cost/cost-tracker.d.ts.map +1 -0
- package/dist/cost/cost-tracker.js +305 -0
- package/dist/cost/cost-tracker.js.map +1 -0
- package/dist/cost/index.d.ts +56 -0
- package/dist/cost/index.d.ts.map +1 -0
- package/dist/cost/index.js +111 -0
- package/dist/cost/index.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/anthropic-client.d.ts +52 -0
- package/dist/llm/anthropic-client.d.ts.map +1 -0
- package/dist/llm/anthropic-client.js +310 -0
- package/dist/llm/anthropic-client.js.map +1 -0
- package/dist/llm/index.d.ts +27 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +34 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/prompts/complexity-reducer.d.ts +7 -0
- package/dist/prompts/complexity-reducer.d.ts.map +1 -0
- package/dist/prompts/complexity-reducer.js +55 -0
- package/dist/prompts/complexity-reducer.js.map +1 -0
- package/dist/prompts/debt-payer.d.ts +7 -0
- package/dist/prompts/debt-payer.d.ts.map +1 -0
- package/dist/prompts/debt-payer.js +55 -0
- package/dist/prompts/debt-payer.js.map +1 -0
- package/dist/prompts/error-reducer.d.ts +7 -0
- package/dist/prompts/error-reducer.d.ts.map +1 -0
- package/dist/prompts/error-reducer.js +54 -0
- package/dist/prompts/error-reducer.js.map +1 -0
- package/dist/prompts/index.d.ts +22 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +112 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/stabilizer.d.ts +7 -0
- package/dist/prompts/stabilizer.d.ts.map +1 -0
- package/dist/prompts/stabilizer.js +55 -0
- package/dist/prompts/stabilizer.js.map +1 -0
- package/dist/prompts/types.d.ts +14 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +5 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/trace/index.d.ts +51 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +60 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/trace/trace-event.d.ts +72 -0
- package/dist/trace/trace-event.d.ts.map +1 -0
- package/dist/trace/trace-event.js +244 -0
- package/dist/trace/trace-event.js.map +1 -0
- package/dist/types/index.d.ts +206 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/ci-provider.d.ts +43 -0
- package/dist/utils/ci-provider.d.ts.map +1 -0
- package/dist/utils/ci-provider.js +130 -0
- package/dist/utils/ci-provider.js.map +1 -0
- package/dist/utils/config.d.ts +31 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +85 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/error-provider.d.ts +51 -0
- package/dist/utils/error-provider.d.ts.map +1 -0
- package/dist/utils/error-provider.js +123 -0
- package/dist/utils/error-provider.js.map +1 -0
- package/dist/utils/file-utils.d.ts +18 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +95 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +74 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/IMPLEMENTATION-STATUS.md +199 -0
- package/docs/PHASE-0-COMPLETE.md +252 -0
- package/docs/PHASE-1-COMPLETE.md +204 -0
- package/docs/PHASE-2-COMPLETE.md +233 -0
- package/docs/PHASE2_COMPLETION_CHECKLIST.md +290 -0
- package/docs/PHASE2_INTEGRATION_SUMMARY.md +255 -0
- package/docs/PHASE2_QUICK_REFERENCE.md +365 -0
- package/docs/PHASE2_TEST_RESULTS.md +282 -0
- package/docs/ROADMAP.md +746 -0
- package/docs/SNAPSHOT.md +376 -0
- package/docs/adrs/ADR-001-signal-computation.md +76 -0
- package/docs/adrs/ADR-002-inhibitor-signals.md +108 -0
- package/docs/adrs/ADR-003-llm-integration.md +156 -0
- package/docs/adrs/ADR-004-process-architecture.md +175 -0
- package/docs/adrs/ADR-005-testing-strategy.md +243 -0
- package/docs/pitch.md +94 -0
- package/docs/specs/fourth-spec.md +1973 -0
- package/docs/specs/initial-spec.md +2096 -0
- package/docs/specs/second-spec.md +2690 -0
- package/package.json +50 -0
- package/src/coordination/gradient-cache.ts +185 -0
- package/src/coordination/index.ts +10 -0
- package/src/core/agent-executor.ts +327 -0
- package/src/core/change-applier.ts +338 -0
- package/src/core/gradient.ts +258 -0
- package/src/core/index.ts +24 -0
- package/src/core/mode-selector.ts +243 -0
- package/src/core/signals/centrality.ts +328 -0
- package/src/core/signals/churn.ts +239 -0
- package/src/core/signals/complexity.ts +206 -0
- package/src/core/signals/debt.ts +111 -0
- package/src/core/signals/errors.ts +93 -0
- package/src/core/signals/index.ts +19 -0
- package/src/cost/cost-tracker.ts +410 -0
- package/src/cost/index.ts +143 -0
- package/src/index.ts +43 -0
- package/src/llm/anthropic-client.ts +415 -0
- package/src/llm/index.ts +43 -0
- package/src/prompts/complexity-reducer.ts +59 -0
- package/src/prompts/debt-payer.ts +59 -0
- package/src/prompts/error-reducer.ts +58 -0
- package/src/prompts/index.ts +128 -0
- package/src/prompts/stabilizer.ts +59 -0
- package/src/prompts/types.ts +15 -0
- package/src/trace/README.md +178 -0
- package/src/trace/index.ts +88 -0
- package/src/trace/trace-event.ts +324 -0
- package/src/types/index.ts +271 -0
- package/src/utils/ci-provider.ts +145 -0
- package/src/utils/config.ts +95 -0
- package/src/utils/error-provider.ts +138 -0
- package/src/utils/file-utils.ts +111 -0
- package/src/utils/index.ts +10 -0
- package/src/utils/logger.ts +94 -0
- package/test-8d713cc8-f4b7-403d-8153-57573172b94c.ts +3 -0
- package/tests/coordination/gradient-cache.test.ts +270 -0
- package/tests/core/agent-executor.test.ts +217 -0
- package/tests/core/change-applier.test.ts +336 -0
- package/tests/core/gradient.test.ts +263 -0
- package/tests/core/mode-selector.test.ts +239 -0
- package/tests/core/signals/centrality.test.ts +512 -0
- package/tests/core/signals/churn.test.ts +355 -0
- package/tests/core/signals/complexity.test.ts +284 -0
- package/tests/core/signals/debt.test.ts +437 -0
- package/tests/core/signals/errors.test.ts +350 -0
- package/tests/cost/cost-tracker.test.ts +475 -0
- package/tests/integration/phase2.test.ts +405 -0
- package/tests/llm/anthropic-client.test.ts +437 -0
- package/tests/prompts/prompts.test.ts +266 -0
- package/tests/trace/trace-event.test.ts +666 -0
- package/tests/utils/file-utils.test.ts +148 -0
- package/tsconfig.json +24 -0
- package/vitest.config.ts +28 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt Templates
|
|
3
|
+
* Per initial-spec §4.1
|
|
4
|
+
*
|
|
5
|
+
* Mode-specific prompts for guiding agents.
|
|
6
|
+
* Each prompt provides context and instructions for a specific improvement mode.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFile } from 'fs/promises';
|
|
10
|
+
import type { Mode, GradientScore } from '../types/index.js';
|
|
11
|
+
import type { PromptContext } from './types.js';
|
|
12
|
+
|
|
13
|
+
export { generatePrompt as generateErrorReducerPrompt } from './error-reducer.js';
|
|
14
|
+
export { generatePrompt as generateComplexityReducerPrompt } from './complexity-reducer.js';
|
|
15
|
+
export { generatePrompt as generateDebtPayerPrompt } from './debt-payer.js';
|
|
16
|
+
export { generatePrompt as generateStabilizerPrompt } from './stabilizer.js';
|
|
17
|
+
|
|
18
|
+
export type { PromptContext } from './types.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Build complete prompt for agent (system + user)
|
|
22
|
+
* Used by agent-executor
|
|
23
|
+
*/
|
|
24
|
+
export async function buildPrompt(
|
|
25
|
+
file: string,
|
|
26
|
+
mode: Mode,
|
|
27
|
+
gradient: GradientScore
|
|
28
|
+
): Promise<{ system: string; user: string }> {
|
|
29
|
+
// Read file content
|
|
30
|
+
const content = await readFile(file, 'utf-8');
|
|
31
|
+
|
|
32
|
+
// Build context
|
|
33
|
+
const context: PromptContext = {
|
|
34
|
+
file,
|
|
35
|
+
content,
|
|
36
|
+
gradient,
|
|
37
|
+
mode,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// Generate mode-specific prompt
|
|
41
|
+
let userPrompt: string;
|
|
42
|
+
switch (mode) {
|
|
43
|
+
case 'error_reducer': {
|
|
44
|
+
const { generatePrompt } = await import('./error-reducer.js');
|
|
45
|
+
userPrompt = generatePrompt(context);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
case 'complexity_reducer': {
|
|
49
|
+
const { generatePrompt } = await import('./complexity-reducer.js');
|
|
50
|
+
userPrompt = generatePrompt(context);
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case 'debt_payer': {
|
|
54
|
+
const { generatePrompt } = await import('./debt-payer.js');
|
|
55
|
+
userPrompt = generatePrompt(context);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case 'stabilizer': {
|
|
59
|
+
const { generatePrompt } = await import('./stabilizer.js');
|
|
60
|
+
userPrompt = generatePrompt(context);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case 'explorer': {
|
|
64
|
+
// Explorer mode - use generic improvement prompt
|
|
65
|
+
userPrompt = buildExplorerPrompt(context);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
default:
|
|
69
|
+
throw new Error(`Unknown mode: ${mode}`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// System prompt is common across all modes
|
|
73
|
+
const systemPrompt = `You are a code improvement agent. Your task is to analyze and improve code files.
|
|
74
|
+
|
|
75
|
+
CRITICAL OUTPUT FORMAT:
|
|
76
|
+
1. Brief analysis (2-3 sentences)
|
|
77
|
+
2. Complete modified file in code fence:
|
|
78
|
+
|
|
79
|
+
\`\`\`typescript
|
|
80
|
+
// complete modified code here
|
|
81
|
+
\`\`\`
|
|
82
|
+
|
|
83
|
+
RULES:
|
|
84
|
+
- Output COMPLETE file, not just changes
|
|
85
|
+
- Make MINIMAL changes for your mode's focus
|
|
86
|
+
- PRESERVE all existing functionality
|
|
87
|
+
- Do NOT add comments explaining changes
|
|
88
|
+
- Do NOT introduce new dependencies`;
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
system: systemPrompt,
|
|
92
|
+
user: userPrompt,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Build explorer mode prompt
|
|
98
|
+
*/
|
|
99
|
+
function buildExplorerPrompt(context: PromptContext): string {
|
|
100
|
+
const { file, content, gradient } = context;
|
|
101
|
+
|
|
102
|
+
return `# Task
|
|
103
|
+
You are exploring \`${file}\` to find novel improvement opportunities.
|
|
104
|
+
|
|
105
|
+
## File Context
|
|
106
|
+
**Gradient**: ${gradient.score.toFixed(3)}
|
|
107
|
+
**Dominant issue**: ${gradient.dominantSignal.name} = ${gradient.dominantSignal.value.toFixed(3)}
|
|
108
|
+
|
|
109
|
+
## Explorer Mode Instructions
|
|
110
|
+
This file has resisted conventional improvements. You have permission to:
|
|
111
|
+
- Challenge fundamental assumptions
|
|
112
|
+
- Suggest structural changes (within limits)
|
|
113
|
+
- Try unconventional approaches
|
|
114
|
+
|
|
115
|
+
**Constraints**:
|
|
116
|
+
- Maximum 50 lines changed
|
|
117
|
+
- Cannot change public API signatures
|
|
118
|
+
- Cannot remove validation logic
|
|
119
|
+
- Changes will be flagged for human review
|
|
120
|
+
|
|
121
|
+
## Current File Content
|
|
122
|
+
\`\`\`typescript
|
|
123
|
+
${content}
|
|
124
|
+
\`\`\`
|
|
125
|
+
|
|
126
|
+
## Your Task
|
|
127
|
+
Explore creative improvements to this file while respecting the constraints.`;
|
|
128
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stabilizer Prompt
|
|
3
|
+
* Focus: Reduce churn with tests and documentation
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { getModeInstructions } from '../core/mode-selector.js';
|
|
7
|
+
import type { PromptContext } from './types.js';
|
|
8
|
+
|
|
9
|
+
export function generatePrompt(context: PromptContext): string {
|
|
10
|
+
const { file, content, gradient, rank, totalFiles } = context;
|
|
11
|
+
const { dominantSignal, signals, score } = gradient;
|
|
12
|
+
|
|
13
|
+
const rankInfo = rank && totalFiles
|
|
14
|
+
? `(ranked #${rank} of ${totalFiles})`
|
|
15
|
+
: '';
|
|
16
|
+
|
|
17
|
+
return `# Task
|
|
18
|
+
You are improving \`${file}\` in mode \`stabilizer\`.
|
|
19
|
+
|
|
20
|
+
## File Context
|
|
21
|
+
**Current gradient**: ${score.toFixed(3)} ${rankInfo}
|
|
22
|
+
**Dominant issue**: ${dominantSignal.name} = ${dominantSignal.value.toFixed(3)}
|
|
23
|
+
|
|
24
|
+
${getModeInstructions('stabilizer')}
|
|
25
|
+
|
|
26
|
+
## Current File Content
|
|
27
|
+
\`\`\`typescript
|
|
28
|
+
${content}
|
|
29
|
+
\`\`\`
|
|
30
|
+
|
|
31
|
+
## Your Task
|
|
32
|
+
Improve stability to reduce future changes:
|
|
33
|
+
|
|
34
|
+
1. Identify stability issues:
|
|
35
|
+
- Missing tests
|
|
36
|
+
- Unclear behavior that requires frequent changes
|
|
37
|
+
- Weak interfaces that allow misuse
|
|
38
|
+
- Magic numbers without constants
|
|
39
|
+
- Poor encapsulation
|
|
40
|
+
|
|
41
|
+
2. Make stability improvements:
|
|
42
|
+
- Add unit tests for untested code
|
|
43
|
+
- Document unclear behavior
|
|
44
|
+
- Improve interfaces to prevent misuse
|
|
45
|
+
- Extract constants from magic numbers
|
|
46
|
+
- Improve encapsulation
|
|
47
|
+
|
|
48
|
+
3. Avoid major changes:
|
|
49
|
+
- Do NOT refactor internals (use complexity_reducer for that)
|
|
50
|
+
- Do NOT change public APIs without good reason
|
|
51
|
+
- Do NOT remove existing tests
|
|
52
|
+
|
|
53
|
+
**Important**:
|
|
54
|
+
- Make minimal, focused changes
|
|
55
|
+
- Preserve existing functionality
|
|
56
|
+
- Add tests if removing code
|
|
57
|
+
- Keep the same file structure
|
|
58
|
+
- Explain what you changed and why`;
|
|
59
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt Template Types
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { Mode } from '../types/index.js';
|
|
6
|
+
import type { GradientScore } from '../core/gradient.js';
|
|
7
|
+
|
|
8
|
+
export interface PromptContext {
|
|
9
|
+
file: string;
|
|
10
|
+
content: string;
|
|
11
|
+
gradient: GradientScore;
|
|
12
|
+
mode: Mode;
|
|
13
|
+
rank?: number;
|
|
14
|
+
totalFiles?: number;
|
|
15
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Trace Event System
|
|
2
|
+
|
|
3
|
+
The trace event system records all agent actions for learning and analysis. Every agent intervention produces a trace event that captures what happened, how much it cost, and whether it improved the codebase.
|
|
4
|
+
|
|
5
|
+
## Storage
|
|
6
|
+
|
|
7
|
+
Traces are stored in `.agent-meta/traces.jsonl` using JSON Lines format (one trace per line). This format enables:
|
|
8
|
+
- Fast append-only writes (important for concurrent agents)
|
|
9
|
+
- Easy streaming/parsing (no need to load entire file)
|
|
10
|
+
- Simple archival (just move lines to archive files)
|
|
11
|
+
|
|
12
|
+
## Schema
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
interface TraceEvent {
|
|
16
|
+
id: string; // UUID
|
|
17
|
+
timestamp: string; // ISO 8601
|
|
18
|
+
agent_id: string; // Agent that performed the action
|
|
19
|
+
file_path: string; // File that was modified
|
|
20
|
+
mode: Mode; // Agent mode used
|
|
21
|
+
gradient_before: number; // File gradient before intervention
|
|
22
|
+
gradient_after: number; // File gradient after intervention
|
|
23
|
+
gradient_delta: number; // Improvement (before - after)
|
|
24
|
+
changes_made: string[]; // List of changes
|
|
25
|
+
tokens_used: number; // Total tokens consumed
|
|
26
|
+
cost_usd: number; // Estimated cost in USD
|
|
27
|
+
duration_ms: number; // Duration in milliseconds
|
|
28
|
+
success: boolean; // Whether intervention succeeded
|
|
29
|
+
error?: string; // Error message if failed
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Usage
|
|
34
|
+
|
|
35
|
+
### Recording Traces
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
import { recordTrace, createTraceEvent } from './trace/trace-event.js';
|
|
39
|
+
|
|
40
|
+
const trace = createTraceEvent({
|
|
41
|
+
agent_id: 'agent-123',
|
|
42
|
+
file_path: 'src/auth.ts',
|
|
43
|
+
mode: 'error_reducer',
|
|
44
|
+
gradient_before: 0.8,
|
|
45
|
+
gradient_after: 0.6,
|
|
46
|
+
changes_made: ['fix null check', 'add error handling'],
|
|
47
|
+
tokens_used: 1000,
|
|
48
|
+
cost_usd: 0.05,
|
|
49
|
+
duration_ms: 30000,
|
|
50
|
+
success: true,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
await recordTrace(trace);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Reading Traces
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { readTraces } from './trace/trace-event.js';
|
|
60
|
+
|
|
61
|
+
// Get all traces (newest first)
|
|
62
|
+
const all = await readTraces();
|
|
63
|
+
|
|
64
|
+
// Filter by file
|
|
65
|
+
const authTraces = await readTraces({ file: 'src/auth.ts' });
|
|
66
|
+
|
|
67
|
+
// Filter by mode
|
|
68
|
+
const errorReducers = await readTraces({ mode: 'error_reducer' });
|
|
69
|
+
|
|
70
|
+
// Filter by date
|
|
71
|
+
const recent = await readTraces({
|
|
72
|
+
since: new Date('2025-01-01'),
|
|
73
|
+
limit: 10
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Calculating Efficiency
|
|
78
|
+
|
|
79
|
+
Efficiency measures gradient improvement per dollar spent:
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
import { getRecentEfficiency } from './trace/trace-event.js';
|
|
83
|
+
|
|
84
|
+
// Get efficiency for last 5 traces
|
|
85
|
+
const efficiency = await getRecentEfficiency('src/auth.ts', 5);
|
|
86
|
+
|
|
87
|
+
if (efficiency !== null && efficiency < 0.15) {
|
|
88
|
+
console.log('Poor efficiency - consider quarantining this file');
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Statistics
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
import { getTraceStats } from './trace/trace-event.js';
|
|
96
|
+
|
|
97
|
+
const traces = await readTraces({ file: 'src/auth.ts' });
|
|
98
|
+
const stats = getTraceStats(traces);
|
|
99
|
+
|
|
100
|
+
console.log(`Total cost: $${stats.totalCost.toFixed(2)}`);
|
|
101
|
+
console.log(`Average improvement: ${stats.avgDelta.toFixed(3)}`);
|
|
102
|
+
console.log(`Success rate: ${(stats.successRate * 100).toFixed(1)}%`);
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Cost Calculation
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
import { calculateCost } from './trace/trace-event.js';
|
|
109
|
+
|
|
110
|
+
// Calculate cost from token usage
|
|
111
|
+
const cost = calculateCost(
|
|
112
|
+
1_000_000, // tokens in
|
|
113
|
+
500_000, // tokens out
|
|
114
|
+
'claude-sonnet-4'
|
|
115
|
+
);
|
|
116
|
+
// Returns: $10.50
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Cleanup
|
|
120
|
+
|
|
121
|
+
The system automatically cleans up old traces to keep file size manageable:
|
|
122
|
+
- Keeps last 1000 traces in main file
|
|
123
|
+
- Archives older traces to dated files in `.agent-meta/traces-archive/`
|
|
124
|
+
- Runs cleanup every 100 traces
|
|
125
|
+
|
|
126
|
+
## Concurrent Access
|
|
127
|
+
|
|
128
|
+
The trace system is designed for concurrent access by multiple agents:
|
|
129
|
+
- Append-only writes (no locks needed)
|
|
130
|
+
- Each trace is a single line (atomic writes)
|
|
131
|
+
- Read operations tolerate partially written lines (skip corrupted)
|
|
132
|
+
|
|
133
|
+
## Metrics
|
|
134
|
+
|
|
135
|
+
Key metrics calculated from traces:
|
|
136
|
+
|
|
137
|
+
1. **Efficiency**: `gradient_delta / cost_usd`
|
|
138
|
+
- Higher is better
|
|
139
|
+
- Below 0.15 indicates poor performance
|
|
140
|
+
|
|
141
|
+
2. **Success Rate**: Percentage of traces with `success: true`
|
|
142
|
+
- Should be > 90%
|
|
143
|
+
|
|
144
|
+
3. **Cost per Improvement**: `total_cost / total_delta`
|
|
145
|
+
- Lower is better
|
|
146
|
+
- Used for budget optimization
|
|
147
|
+
|
|
148
|
+
## Example Trace
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"id": "550e8400-e29b-41d4-a716-446655440000",
|
|
153
|
+
"timestamp": "2025-01-30T18:30:00.000Z",
|
|
154
|
+
"agent_id": "agent-abc123",
|
|
155
|
+
"file_path": "src/auth.ts",
|
|
156
|
+
"mode": "error_reducer",
|
|
157
|
+
"gradient_before": 0.72,
|
|
158
|
+
"gradient_after": 0.58,
|
|
159
|
+
"gradient_delta": 0.14,
|
|
160
|
+
"changes_made": [
|
|
161
|
+
"fix null check in validateToken()",
|
|
162
|
+
"add error handling for expired tokens"
|
|
163
|
+
],
|
|
164
|
+
"tokens_used": 1523,
|
|
165
|
+
"cost_usd": 0.0456,
|
|
166
|
+
"duration_ms": 32451,
|
|
167
|
+
"success": true
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Integration
|
|
172
|
+
|
|
173
|
+
Traces feed into several system components:
|
|
174
|
+
|
|
175
|
+
- **Quarantine System**: Uses efficiency to detect files resisting improvement
|
|
176
|
+
- **Explorer Mode**: Triggered by low system-wide efficiency
|
|
177
|
+
- **Cost Tracking**: Aggregates costs by mode, file, and time period
|
|
178
|
+
- **Learning**: Trains on successful patterns for future routing
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace Module - Event Tracking System
|
|
3
|
+
*
|
|
4
|
+
* Per Phase 2 specification, this tracks:
|
|
5
|
+
* - Agent execution traces with timing
|
|
6
|
+
* - File changes (additions, deletions, modifications)
|
|
7
|
+
* - Gradient measurements (before/after)
|
|
8
|
+
* - Cost metrics (tokens, USD)
|
|
9
|
+
* - CI pass/fail status
|
|
10
|
+
*
|
|
11
|
+
* Traces are stored as JSON Lines format for efficient querying.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { recordTraceEvent } from './trace/index.js';
|
|
16
|
+
* await recordTraceEvent({ ... });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
21
|
+
import { logDebug } from '../utils/logger.js';
|
|
22
|
+
import type { TraceEvent, ChangeSet } from '../types/index.js';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create a trace event for an agent execution
|
|
26
|
+
*/
|
|
27
|
+
export function createTraceEvent(data: {
|
|
28
|
+
filePath: string;
|
|
29
|
+
mode: string;
|
|
30
|
+
gradientBefore: number;
|
|
31
|
+
gradientAfter: number;
|
|
32
|
+
metabolicCost: number;
|
|
33
|
+
efficiency: number;
|
|
34
|
+
ciPassed: boolean;
|
|
35
|
+
changes: ChangeSet;
|
|
36
|
+
costRecord: {
|
|
37
|
+
tokens_in: number;
|
|
38
|
+
tokens_out: number;
|
|
39
|
+
model: string;
|
|
40
|
+
estimated_usd: number;
|
|
41
|
+
};
|
|
42
|
+
notes?: string[];
|
|
43
|
+
taskId?: string;
|
|
44
|
+
agentId?: string;
|
|
45
|
+
}): TraceEvent {
|
|
46
|
+
const now = new Date().toISOString();
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
id: uuidv4(),
|
|
50
|
+
timestamp: now,
|
|
51
|
+
file_path: data.filePath,
|
|
52
|
+
mode: data.mode as any,
|
|
53
|
+
gradient_before: data.gradientBefore,
|
|
54
|
+
gradient_after: data.gradientAfter,
|
|
55
|
+
gradient_delta: data.gradientAfter - data.gradientBefore,
|
|
56
|
+
metabolic_cost: data.metabolicCost,
|
|
57
|
+
efficiency: data.efficiency,
|
|
58
|
+
ci_passed: data.ciPassed,
|
|
59
|
+
changes: data.changes,
|
|
60
|
+
notes: data.notes || [],
|
|
61
|
+
task_id: data.taskId,
|
|
62
|
+
agent_id: data.agentId,
|
|
63
|
+
cost: data.costRecord,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Record a trace event to the trace log
|
|
69
|
+
* In Phase 2, we store this in memory; in Phase 3+ it goes to persistent storage
|
|
70
|
+
*/
|
|
71
|
+
export async function recordTraceEvent(event: TraceEvent): Promise<void> {
|
|
72
|
+
logDebug('Trace event recorded', {
|
|
73
|
+
event_id: event.id,
|
|
74
|
+
file: event.file_path,
|
|
75
|
+
mode: event.mode,
|
|
76
|
+
gradient_delta: event.gradient_delta.toFixed(3),
|
|
77
|
+
cost_usd: event.cost.estimated_usd.toFixed(4),
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// In Phase 2, trace events are collected in memory
|
|
81
|
+
// In Phase 3+, they will be written to persistent storage (JSON Lines format)
|
|
82
|
+
// For now, this is a no-op that validates the event structure
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Export trace event type and utilities for Phase 2 integration
|
|
87
|
+
*/
|
|
88
|
+
export type { TraceEvent, ChangeSet } from '../types/index.js';
|