claude-mycelium 2.0.0 → 2.1.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/.claude/memory.db +0 -0
- package/.claude/settings.local.json +4 -1
- package/README.md +81 -235
- package/SECURITY.md +145 -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 +69 -0
- package/dist/cli/gradients.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 +72 -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.map +1 -1
- package/dist/core/agent-executor.js +28 -10
- 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/executor.d.ts +30 -0
- package/dist/task/executor.d.ts.map +1 -0
- package/dist/task/executor.js +429 -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 +64 -57
- package/docs/SECURITY-AUDIT.md +387 -0
- package/docs/SNAPSHOT.md +59 -32
- package/docs/implementation/phase3-summary.md +220 -0
- package/package.json +19 -11
- 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 +95 -0
- package/src/cli/index.ts +79 -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 +20 -4
- 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/executor.ts +538 -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/tsconfig.json +2 -2
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Planning Implementation
|
|
3
|
+
* Per second-spec §12.1: Task Planning
|
|
4
|
+
*
|
|
5
|
+
* LLM-based task decomposition that generates a TaskPlan with steps,
|
|
6
|
+
* dependency analysis, and risk identification.
|
|
7
|
+
*/
|
|
8
|
+
import { callLLM } from '../llm/anthropic-client.js';
|
|
9
|
+
import { logDebug, logError } from '../utils/logger.js';
|
|
10
|
+
import fg from 'fast-glob';
|
|
11
|
+
/**
|
|
12
|
+
* Plan a task by using LLM to decompose it into steps
|
|
13
|
+
*/
|
|
14
|
+
export async function planTask(task) {
|
|
15
|
+
logDebug('Planning task', { taskId: task.id, description: task.description });
|
|
16
|
+
try {
|
|
17
|
+
// Get existing files in target directory
|
|
18
|
+
const existingFiles = await getExistingFiles(task.target ?? 'src');
|
|
19
|
+
// Build prompts for LLM
|
|
20
|
+
const systemPrompt = buildPlanningSystemPrompt();
|
|
21
|
+
const userPrompt = buildPlanningUserPrompt(task, existingFiles);
|
|
22
|
+
// Call LLM to generate plan
|
|
23
|
+
const response = await callLLM({
|
|
24
|
+
prompt: userPrompt,
|
|
25
|
+
systemPrompt,
|
|
26
|
+
temperature: 0.3, // Lower temperature for more deterministic planning
|
|
27
|
+
maxTokens: 4000,
|
|
28
|
+
});
|
|
29
|
+
// Parse JSON plan from response
|
|
30
|
+
const plan = parseTaskPlanFromResponse(response.content);
|
|
31
|
+
logDebug('Task plan generated', {
|
|
32
|
+
taskId: task.id,
|
|
33
|
+
steps: plan.steps.length,
|
|
34
|
+
complexity: plan.estimated_complexity,
|
|
35
|
+
});
|
|
36
|
+
return plan;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
40
|
+
logError('Failed to plan task', errorObj, { taskId: task.id });
|
|
41
|
+
throw new Error(`Task planning failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Analyze dependencies between task steps
|
|
46
|
+
*/
|
|
47
|
+
export function analyzeDependencies(steps) {
|
|
48
|
+
const dependencies = new Map();
|
|
49
|
+
for (const step of steps) {
|
|
50
|
+
// Direct dependencies from the step definition
|
|
51
|
+
dependencies.set(step.order, [...step.depends_on]);
|
|
52
|
+
// Detect implicit file dependencies
|
|
53
|
+
const implicitDeps = detectImplicitDependencies(step, steps);
|
|
54
|
+
const allDeps = new Set([...step.depends_on, ...implicitDeps]);
|
|
55
|
+
dependencies.set(step.order, Array.from(allDeps));
|
|
56
|
+
}
|
|
57
|
+
return dependencies;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Identify potential risks in the task plan
|
|
61
|
+
*/
|
|
62
|
+
export function identifyRisks(plan) {
|
|
63
|
+
const risks = [...plan.risks];
|
|
64
|
+
// Check for circular dependencies
|
|
65
|
+
if (hasCircularDependencies(plan.steps)) {
|
|
66
|
+
risks.push('Circular dependency detected in task steps');
|
|
67
|
+
}
|
|
68
|
+
// Check for steps with many dependencies
|
|
69
|
+
const stepsWithManyDeps = plan.steps.filter(s => s.depends_on.length > 3);
|
|
70
|
+
if (stepsWithManyDeps.length > 0) {
|
|
71
|
+
risks.push(`${stepsWithManyDeps.length} step(s) have complex dependencies (>3 deps)`);
|
|
72
|
+
}
|
|
73
|
+
// Check for create mode on existing file patterns
|
|
74
|
+
const createSteps = plan.steps.filter(s => s.mode === 'create');
|
|
75
|
+
if (createSteps.length > 5) {
|
|
76
|
+
risks.push(`Many new files (${createSteps.length}) - may need more validation`);
|
|
77
|
+
}
|
|
78
|
+
// Check for high complexity tasks
|
|
79
|
+
if (plan.estimated_complexity === 'large' && plan.steps.length > 10) {
|
|
80
|
+
risks.push('Large task with many steps - consider breaking down further');
|
|
81
|
+
}
|
|
82
|
+
return risks;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get existing files in the target directory
|
|
86
|
+
*/
|
|
87
|
+
async function getExistingFiles(target) {
|
|
88
|
+
try {
|
|
89
|
+
const pattern = `${target}/**/*.{ts,tsx,js,jsx}`;
|
|
90
|
+
const files = await fg(pattern, {
|
|
91
|
+
ignore: ['**/node_modules/**', '**/dist/**', '**/*.test.ts', '**/*.spec.ts'],
|
|
92
|
+
onlyFiles: true,
|
|
93
|
+
});
|
|
94
|
+
return files;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
98
|
+
logError('Failed to list existing files', errorObj, { target });
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Build system prompt for task planning
|
|
104
|
+
*/
|
|
105
|
+
function buildPlanningSystemPrompt() {
|
|
106
|
+
return `You are a task planning agent.
|
|
107
|
+
|
|
108
|
+
Given a task description, create a step-by-step plan to accomplish it.
|
|
109
|
+
|
|
110
|
+
Output your plan as JSON in this exact format:
|
|
111
|
+
{
|
|
112
|
+
"summary": "Brief description of approach",
|
|
113
|
+
"steps": [
|
|
114
|
+
{
|
|
115
|
+
"order": 1,
|
|
116
|
+
"description": "What to do",
|
|
117
|
+
"target_file": "path/to/file.ts",
|
|
118
|
+
"mode": "create|error_reducer|complexity_reducer|debt_payer|stabilizer",
|
|
119
|
+
"depends_on": []
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
"estimated_complexity": "small|medium|large",
|
|
123
|
+
"risks": ["potential risk 1", "potential risk 2"]
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
Rules:
|
|
127
|
+
- Prefer small, incremental steps over large changes
|
|
128
|
+
- Each step should be independently testable
|
|
129
|
+
- New files must include basic tests
|
|
130
|
+
- Follow existing code patterns
|
|
131
|
+
- mode "create" is for new files only
|
|
132
|
+
- Use error_reducer for fixing bugs
|
|
133
|
+
- Use complexity_reducer for simplifying code
|
|
134
|
+
- Use debt_payer for fixing lint/type issues
|
|
135
|
+
- Use stabilizer for adding tests/docs`;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Build user prompt for task planning
|
|
139
|
+
*/
|
|
140
|
+
function buildPlanningUserPrompt(task, existingFiles) {
|
|
141
|
+
const fileList = existingFiles.length > 50
|
|
142
|
+
? `${existingFiles.slice(0, 50).join('\n')}\n... and ${existingFiles.length - 50} more`
|
|
143
|
+
: existingFiles.join('\n') || '(no files found)';
|
|
144
|
+
const criteriaList = task.acceptance_criteria.length > 0
|
|
145
|
+
? task.acceptance_criteria.map(c => `- ${c.description}`).join('\n')
|
|
146
|
+
: '(none specified)';
|
|
147
|
+
return `## Task
|
|
148
|
+
${task.description}
|
|
149
|
+
|
|
150
|
+
## Target Directory
|
|
151
|
+
${task.target ?? 'src/'}
|
|
152
|
+
|
|
153
|
+
## Existing Files
|
|
154
|
+
${fileList}
|
|
155
|
+
|
|
156
|
+
## Acceptance Criteria
|
|
157
|
+
${criteriaList}
|
|
158
|
+
|
|
159
|
+
Create a plan to accomplish this task.`;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Parse TaskPlan from LLM response
|
|
163
|
+
*/
|
|
164
|
+
function parseTaskPlanFromResponse(content) {
|
|
165
|
+
// Try to extract JSON from response
|
|
166
|
+
const jsonMatch = content.match(/\{[\s\S]*\}/);
|
|
167
|
+
if (!jsonMatch) {
|
|
168
|
+
throw new Error('Failed to parse task plan from LLM response - no JSON found');
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
172
|
+
// Validate required fields
|
|
173
|
+
if (!parsed.summary || !Array.isArray(parsed.steps) || !parsed.estimated_complexity) {
|
|
174
|
+
throw new Error('Invalid task plan structure - missing required fields');
|
|
175
|
+
}
|
|
176
|
+
// Validate each step
|
|
177
|
+
for (const step of parsed.steps) {
|
|
178
|
+
if (typeof step.order !== 'number' ||
|
|
179
|
+
!step.description ||
|
|
180
|
+
!step.target_file ||
|
|
181
|
+
!step.mode) {
|
|
182
|
+
throw new Error('Invalid task step structure');
|
|
183
|
+
}
|
|
184
|
+
// Ensure depends_on is an array
|
|
185
|
+
step.depends_on = step.depends_on || [];
|
|
186
|
+
step.completed = false;
|
|
187
|
+
}
|
|
188
|
+
// Ensure risks is an array
|
|
189
|
+
parsed.risks = parsed.risks || [];
|
|
190
|
+
return parsed;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throw new Error(`Failed to parse task plan JSON: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Detect implicit dependencies between steps based on file relationships
|
|
198
|
+
*/
|
|
199
|
+
function detectImplicitDependencies(step, allSteps) {
|
|
200
|
+
const implicitDeps = [];
|
|
201
|
+
// If this step modifies a file, it depends on the step that creates it
|
|
202
|
+
if (step.mode !== 'create') {
|
|
203
|
+
const createStep = allSteps.find(s => s.mode === 'create' &&
|
|
204
|
+
s.target_file === step.target_file &&
|
|
205
|
+
s.order < step.order);
|
|
206
|
+
if (createStep && !step.depends_on.includes(createStep.order)) {
|
|
207
|
+
implicitDeps.push(createStep.order);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// If this step creates a test file, it depends on the implementation file step
|
|
211
|
+
if (step.mode === 'create' && step.target_file.includes('.test.')) {
|
|
212
|
+
const implPath = step.target_file.replace(/\.test\./, '.');
|
|
213
|
+
const implStep = allSteps.find(s => s.target_file === implPath && s.order < step.order);
|
|
214
|
+
if (implStep && !step.depends_on.includes(implStep.order)) {
|
|
215
|
+
implicitDeps.push(implStep.order);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return implicitDeps;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Check if task steps have circular dependencies
|
|
222
|
+
*/
|
|
223
|
+
function hasCircularDependencies(steps) {
|
|
224
|
+
const visited = new Set();
|
|
225
|
+
const recursionStack = new Set();
|
|
226
|
+
function hasCycle(stepOrder) {
|
|
227
|
+
if (recursionStack.has(stepOrder)) {
|
|
228
|
+
return true; // Found a cycle
|
|
229
|
+
}
|
|
230
|
+
if (visited.has(stepOrder)) {
|
|
231
|
+
return false; // Already checked this path
|
|
232
|
+
}
|
|
233
|
+
visited.add(stepOrder);
|
|
234
|
+
recursionStack.add(stepOrder);
|
|
235
|
+
const step = steps.find(s => s.order === stepOrder);
|
|
236
|
+
if (step) {
|
|
237
|
+
for (const dep of step.depends_on) {
|
|
238
|
+
if (hasCycle(dep)) {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
recursionStack.delete(stepOrder);
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
for (const step of steps) {
|
|
247
|
+
if (hasCycle(step.order)) {
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/task/planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Storage Implementation
|
|
3
|
+
* Per ROADMAP §Phase 5 Week 6 Day 7: Task Storage
|
|
4
|
+
*
|
|
5
|
+
* Stores tasks in .agent-meta/tasks/ with one file per task,
|
|
6
|
+
* tracks status transitions, and links to trace IDs.
|
|
7
|
+
*/
|
|
8
|
+
import { Task, TaskStatus } from '../types/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Store a task to disk
|
|
11
|
+
*/
|
|
12
|
+
export declare function storeTask(task: Task): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Load a task from disk
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadTask(taskId: string): Promise<Task | null>;
|
|
17
|
+
/**
|
|
18
|
+
* List all tasks, optionally filtered by status
|
|
19
|
+
*/
|
|
20
|
+
export declare function listTasks(statusFilter?: TaskStatus): Promise<Task[]>;
|
|
21
|
+
/**
|
|
22
|
+
* List active tasks (from index for performance)
|
|
23
|
+
*/
|
|
24
|
+
export declare function listActiveTasks(): Promise<Task[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Delete a task from storage
|
|
27
|
+
*/
|
|
28
|
+
export declare function deleteTask(taskId: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Update task status and store
|
|
31
|
+
*/
|
|
32
|
+
export declare function updateTaskStatus(taskId: string, newStatus: TaskStatus, error?: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Get task history for a file (all tasks that touched it)
|
|
35
|
+
*/
|
|
36
|
+
export declare function getTaskHistoryForFile(filePath: string): Promise<Task[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Get task statistics
|
|
39
|
+
*/
|
|
40
|
+
export declare function getTaskStatistics(): Promise<{
|
|
41
|
+
total: number;
|
|
42
|
+
byStatus: Record<TaskStatus, number>;
|
|
43
|
+
avgCompletionTime: number;
|
|
44
|
+
successRate: number;
|
|
45
|
+
}>;
|
|
46
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/task/storage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAuBrD;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BzD;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAiBnE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,YAAY,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAuC1E;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAkBvD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB9D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,UAAU,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAyBf;AAiED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAQ7E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACrC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAyCD"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Storage Implementation
|
|
3
|
+
* Per ROADMAP §Phase 5 Week 6 Day 7: Task Storage
|
|
4
|
+
*
|
|
5
|
+
* Stores tasks in .agent-meta/tasks/ with one file per task,
|
|
6
|
+
* tracks status transitions, and links to trace IDs.
|
|
7
|
+
*/
|
|
8
|
+
import { fileExists, readJsonFile, writeJsonFile, ensureDir, deleteFile, } from '../utils/file-utils.js';
|
|
9
|
+
import { logDebug, logError } from '../utils/logger.js';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
const TASKS_DIR = '.agent-meta/tasks';
|
|
13
|
+
const ACTIVE_TASKS_FILE = path.join(TASKS_DIR, '_active.json');
|
|
14
|
+
/**
|
|
15
|
+
* Store a task to disk
|
|
16
|
+
*/
|
|
17
|
+
export async function storeTask(task) {
|
|
18
|
+
try {
|
|
19
|
+
// Ensure tasks directory exists
|
|
20
|
+
ensureDir(TASKS_DIR);
|
|
21
|
+
// Write task to its own file
|
|
22
|
+
const taskFilePath = getTaskFilePath(task.id);
|
|
23
|
+
writeJsonFile(taskFilePath, task);
|
|
24
|
+
// Update active tasks index
|
|
25
|
+
if (task.status === 'pending' || task.status === 'planning' || task.status === 'in_progress' || task.status === 'validating') {
|
|
26
|
+
await addToActiveIndex(task.id);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
await removeFromActiveIndex(task.id);
|
|
30
|
+
}
|
|
31
|
+
logDebug('Task stored', {
|
|
32
|
+
taskId: task.id,
|
|
33
|
+
status: task.status,
|
|
34
|
+
filePath: taskFilePath,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
39
|
+
logError('Failed to store task', errorObj, { taskId: task.id });
|
|
40
|
+
throw new Error(`Task storage failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Load a task from disk
|
|
45
|
+
*/
|
|
46
|
+
export async function loadTask(taskId) {
|
|
47
|
+
try {
|
|
48
|
+
const taskFilePath = getTaskFilePath(taskId);
|
|
49
|
+
if (!fileExists(taskFilePath)) {
|
|
50
|
+
logDebug('Task file not found', { taskId, filePath: taskFilePath });
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const task = readJsonFile(taskFilePath);
|
|
54
|
+
logDebug('Task loaded', { taskId, status: task.status });
|
|
55
|
+
return task;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
59
|
+
logError('Failed to load task', errorObj, { taskId });
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* List all tasks, optionally filtered by status
|
|
65
|
+
*/
|
|
66
|
+
export async function listTasks(statusFilter) {
|
|
67
|
+
try {
|
|
68
|
+
ensureDir(TASKS_DIR);
|
|
69
|
+
// Get all task files
|
|
70
|
+
const files = fs.readdirSync(TASKS_DIR).filter(f => f.startsWith('task_') && f.endsWith('.json'));
|
|
71
|
+
const tasks = [];
|
|
72
|
+
for (const file of files) {
|
|
73
|
+
try {
|
|
74
|
+
const taskFilePath = path.join(TASKS_DIR, file);
|
|
75
|
+
const task = readJsonFile(taskFilePath);
|
|
76
|
+
// Apply status filter if provided
|
|
77
|
+
if (!statusFilter || task.status === statusFilter) {
|
|
78
|
+
tasks.push(task);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
83
|
+
logError('Failed to load task file', errorObj, { file });
|
|
84
|
+
// Continue with other files
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Sort by creation date (newest first)
|
|
88
|
+
tasks.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
|
|
89
|
+
logDebug('Tasks listed', {
|
|
90
|
+
total: tasks.length,
|
|
91
|
+
statusFilter,
|
|
92
|
+
});
|
|
93
|
+
return tasks;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
97
|
+
logError('Failed to list tasks', errorObj);
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* List active tasks (from index for performance)
|
|
103
|
+
*/
|
|
104
|
+
export async function listActiveTasks() {
|
|
105
|
+
try {
|
|
106
|
+
const index = await getActiveIndex();
|
|
107
|
+
const tasks = [];
|
|
108
|
+
for (const taskId of index.tasks) {
|
|
109
|
+
const task = await loadTask(taskId);
|
|
110
|
+
if (task) {
|
|
111
|
+
tasks.push(task);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return tasks;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
118
|
+
logError('Failed to list active tasks', errorObj);
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Delete a task from storage
|
|
124
|
+
*/
|
|
125
|
+
export async function deleteTask(taskId) {
|
|
126
|
+
try {
|
|
127
|
+
const taskFilePath = getTaskFilePath(taskId);
|
|
128
|
+
if (fileExists(taskFilePath)) {
|
|
129
|
+
deleteFile(taskFilePath);
|
|
130
|
+
logDebug('Task deleted', { taskId });
|
|
131
|
+
}
|
|
132
|
+
// Remove from active index
|
|
133
|
+
await removeFromActiveIndex(taskId);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
137
|
+
logError('Failed to delete task', errorObj, { taskId });
|
|
138
|
+
throw new Error(`Task deletion failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Update task status and store
|
|
143
|
+
*/
|
|
144
|
+
export async function updateTaskStatus(taskId, newStatus, error) {
|
|
145
|
+
const task = await loadTask(taskId);
|
|
146
|
+
if (!task) {
|
|
147
|
+
throw new Error(`Task ${taskId} not found`);
|
|
148
|
+
}
|
|
149
|
+
const oldStatus = task.status;
|
|
150
|
+
task.status = newStatus;
|
|
151
|
+
if (error) {
|
|
152
|
+
task.error = error;
|
|
153
|
+
}
|
|
154
|
+
if (newStatus === 'completed' || newStatus === 'failed') {
|
|
155
|
+
task.completed_at = new Date().toISOString();
|
|
156
|
+
}
|
|
157
|
+
await storeTask(task);
|
|
158
|
+
logDebug('Task status updated', {
|
|
159
|
+
taskId,
|
|
160
|
+
oldStatus,
|
|
161
|
+
newStatus,
|
|
162
|
+
hasError: !!error,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get task file path
|
|
167
|
+
*/
|
|
168
|
+
function getTaskFilePath(taskId) {
|
|
169
|
+
return path.join(TASKS_DIR, `task_${taskId}.json`);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get active tasks index
|
|
173
|
+
*/
|
|
174
|
+
async function getActiveIndex() {
|
|
175
|
+
try {
|
|
176
|
+
if (fileExists(ACTIVE_TASKS_FILE)) {
|
|
177
|
+
return readJsonFile(ACTIVE_TASKS_FILE);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
182
|
+
logError('Failed to read active tasks index', errorObj);
|
|
183
|
+
}
|
|
184
|
+
// Return empty index if file doesn't exist or can't be read
|
|
185
|
+
return {
|
|
186
|
+
updated_at: new Date().toISOString(),
|
|
187
|
+
tasks: [],
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Save active tasks index
|
|
192
|
+
*/
|
|
193
|
+
async function saveActiveIndex(index) {
|
|
194
|
+
index.updated_at = new Date().toISOString();
|
|
195
|
+
writeJsonFile(ACTIVE_TASKS_FILE, index);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Add task to active index
|
|
199
|
+
*/
|
|
200
|
+
async function addToActiveIndex(taskId) {
|
|
201
|
+
const index = await getActiveIndex();
|
|
202
|
+
if (!index.tasks.includes(taskId)) {
|
|
203
|
+
index.tasks.push(taskId);
|
|
204
|
+
await saveActiveIndex(index);
|
|
205
|
+
logDebug('Task added to active index', { taskId });
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Remove task from active index
|
|
210
|
+
*/
|
|
211
|
+
async function removeFromActiveIndex(taskId) {
|
|
212
|
+
const index = await getActiveIndex();
|
|
213
|
+
const initialLength = index.tasks.length;
|
|
214
|
+
index.tasks = index.tasks.filter(id => id !== taskId);
|
|
215
|
+
if (index.tasks.length < initialLength) {
|
|
216
|
+
await saveActiveIndex(index);
|
|
217
|
+
logDebug('Task removed from active index', { taskId });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get task history for a file (all tasks that touched it)
|
|
222
|
+
*/
|
|
223
|
+
export async function getTaskHistoryForFile(filePath) {
|
|
224
|
+
const allTasks = await listTasks();
|
|
225
|
+
return allTasks.filter(task => task.files_created.includes(filePath) ||
|
|
226
|
+
task.files_modified.includes(filePath));
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get task statistics
|
|
230
|
+
*/
|
|
231
|
+
export async function getTaskStatistics() {
|
|
232
|
+
const allTasks = await listTasks();
|
|
233
|
+
const byStatus = {
|
|
234
|
+
pending: 0,
|
|
235
|
+
planning: 0,
|
|
236
|
+
in_progress: 0,
|
|
237
|
+
validating: 0,
|
|
238
|
+
completed: 0,
|
|
239
|
+
failed: 0,
|
|
240
|
+
blocked: 0,
|
|
241
|
+
};
|
|
242
|
+
let totalCompletionTime = 0;
|
|
243
|
+
let completedOrFailed = 0;
|
|
244
|
+
for (const task of allTasks) {
|
|
245
|
+
byStatus[task.status]++;
|
|
246
|
+
if (task.completed_at) {
|
|
247
|
+
const created = new Date(task.created_at).getTime();
|
|
248
|
+
const completed = new Date(task.completed_at).getTime();
|
|
249
|
+
totalCompletionTime += completed - created;
|
|
250
|
+
completedOrFailed++;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const avgCompletionTime = completedOrFailed > 0
|
|
254
|
+
? totalCompletionTime / completedOrFailed
|
|
255
|
+
: 0;
|
|
256
|
+
const successRate = completedOrFailed > 0
|
|
257
|
+
? byStatus.completed / completedOrFailed
|
|
258
|
+
: 0;
|
|
259
|
+
return {
|
|
260
|
+
total: allTasks.length,
|
|
261
|
+
byStatus,
|
|
262
|
+
avgCompletionTime,
|
|
263
|
+
successRate,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/task/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,23 +3,7 @@
|
|
|
3
3
|
* Records agent actions for learning and analysis
|
|
4
4
|
* Storage: .agent-meta/traces.jsonl (JSON Lines format)
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
export interface TraceEvent {
|
|
8
|
-
id: string;
|
|
9
|
-
timestamp: string;
|
|
10
|
-
agent_id: string;
|
|
11
|
-
file_path: string;
|
|
12
|
-
mode: Mode;
|
|
13
|
-
gradient_before: number;
|
|
14
|
-
gradient_after: number;
|
|
15
|
-
gradient_delta: number;
|
|
16
|
-
changes_made: string[];
|
|
17
|
-
tokens_used: number;
|
|
18
|
-
cost_usd: number;
|
|
19
|
-
duration_ms: number;
|
|
20
|
-
success: boolean;
|
|
21
|
-
error?: string;
|
|
22
|
-
}
|
|
6
|
+
import type { TraceEvent, Mode } from '../types/index.js';
|
|
23
7
|
export interface TraceFilters {
|
|
24
8
|
file?: string;
|
|
25
9
|
mode?: Mode;
|
|
@@ -68,5 +52,5 @@ export declare function calculateCost(tokensIn: number, tokensOut: number, model
|
|
|
68
52
|
/**
|
|
69
53
|
* Create a trace event with defaults
|
|
70
54
|
*/
|
|
71
|
-
export declare function createTraceEvent(partial: Omit<TraceEvent, 'id' | 'timestamp'
|
|
55
|
+
export declare function createTraceEvent(partial: Omit<TraceEvent, 'id' | 'timestamp'>): TraceEvent;
|
|
72
56
|
//# sourceMappingURL=trace-event.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-event.d.ts","sourceRoot":"","sources":["../../src/trace/trace-event.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"trace-event.d.ts","sourceRoot":"","sources":["../../src/trace/trace-event.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BlE;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAkD9E;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAexB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAchE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAoB9D;AA4ED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAA0B,GAAG,MAAM,CAe5G;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,CAAC,GAC5C,UAAU,CAMZ"}
|