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
|
@@ -16,10 +16,9 @@ import { readFile, writeFile } from 'fs/promises';
|
|
|
16
16
|
import { v4 as uuid } from 'uuid';
|
|
17
17
|
import { calculateGradient } from './gradient.js';
|
|
18
18
|
import { buildPrompt } from '../prompts/index.js';
|
|
19
|
-
import {
|
|
19
|
+
import { callLLM, calculateCost } from '../llm/anthropic-client.js';
|
|
20
20
|
import { applyChanges } from './change-applier.js';
|
|
21
21
|
import { recordTrace } from '../trace/trace-event.js';
|
|
22
|
-
import { calculateCost } from '../cost/cost-tracker.js';
|
|
23
22
|
import { logInfo, logDebug, logWarn, logError } from '../utils/logger.js';
|
|
24
23
|
import { ciProvider } from '../utils/ci-provider.js';
|
|
25
24
|
const DEFAULT_OPTIONS = {
|
|
@@ -32,7 +31,7 @@ const DEFAULT_OPTIONS = {
|
|
|
32
31
|
*/
|
|
33
32
|
export async function executeAgent(file, mode, options) {
|
|
34
33
|
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
35
|
-
const agentId = `agent-${uuid().slice(0, 8)}`;
|
|
34
|
+
const agentId = opts.agentId || `agent-${uuid().slice(0, 8)}`;
|
|
36
35
|
const traceId = uuid();
|
|
37
36
|
logInfo('Starting agent execution', {
|
|
38
37
|
file,
|
|
@@ -76,7 +75,21 @@ export async function executeAgent(file, mode, options) {
|
|
|
76
75
|
}
|
|
77
76
|
else {
|
|
78
77
|
// Real run - apply changes and verify
|
|
79
|
-
|
|
78
|
+
const result = await applyChanges([
|
|
79
|
+
{
|
|
80
|
+
file,
|
|
81
|
+
newContent: parsedChanges.newContent,
|
|
82
|
+
reason: `Applied ${mode} changes`,
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
if (!result.success) {
|
|
86
|
+
throw new Error(result.error || 'Failed to apply changes');
|
|
87
|
+
}
|
|
88
|
+
changeSet = {
|
|
89
|
+
additions: countLines(parsedChanges.newContent) - countLines(originalContent),
|
|
90
|
+
deletions: 0,
|
|
91
|
+
files_touched: [file],
|
|
92
|
+
};
|
|
80
93
|
// Step 7: Run CI checks
|
|
81
94
|
logDebug('Step 7: Running CI checks');
|
|
82
95
|
const ciResult = await ciProvider.run(changeSet);
|
|
@@ -94,10 +107,10 @@ export async function executeAgent(file, mode, options) {
|
|
|
94
107
|
// Step 9: Calculate cost
|
|
95
108
|
logDebug('Step 9: Calculating cost');
|
|
96
109
|
const costRecord = {
|
|
97
|
-
tokens_in: llmResponse.
|
|
98
|
-
tokens_out: llmResponse.
|
|
110
|
+
tokens_in: llmResponse.usage.inputTokens,
|
|
111
|
+
tokens_out: llmResponse.usage.outputTokens,
|
|
99
112
|
model: llmResponse.model,
|
|
100
|
-
estimated_usd: calculateCost(llmResponse.model, llmResponse.
|
|
113
|
+
estimated_usd: calculateCost(llmResponse.model, llmResponse.usage.inputTokens, llmResponse.usage.outputTokens),
|
|
101
114
|
};
|
|
102
115
|
// Step 10: Calculate efficiency
|
|
103
116
|
const gradientDelta = gradientAfter.score - gradientBefore.score;
|
|
@@ -121,29 +134,32 @@ export async function executeAgent(file, mode, options) {
|
|
|
121
134
|
`Gradient improved: ${gradientDelta < 0 ? 'Yes' : 'No'}`,
|
|
122
135
|
],
|
|
123
136
|
agent_id: agentId,
|
|
137
|
+
task_id: opts.taskId, // Link to task if part of task execution
|
|
124
138
|
cost: costRecord,
|
|
125
139
|
};
|
|
126
140
|
if (!opts.dryRun) {
|
|
127
141
|
await recordTrace(trace);
|
|
128
142
|
}
|
|
143
|
+
const finalCost = Number(costRecord.estimated_usd) || 0;
|
|
129
144
|
logInfo('Agent execution completed', {
|
|
130
145
|
file,
|
|
131
146
|
mode,
|
|
132
147
|
gradientDelta: gradientDelta.toFixed(3),
|
|
133
148
|
efficiency: efficiency.toFixed(3),
|
|
134
|
-
cost:
|
|
149
|
+
cost: finalCost.toFixed(4),
|
|
135
150
|
ciPassed,
|
|
136
151
|
});
|
|
137
152
|
return {
|
|
138
153
|
success: true,
|
|
139
154
|
changes: [file],
|
|
140
155
|
trace,
|
|
141
|
-
cost:
|
|
156
|
+
cost: finalCost,
|
|
142
157
|
};
|
|
143
158
|
}
|
|
144
159
|
catch (error) {
|
|
145
160
|
// Error handling - record failed trace
|
|
146
|
-
|
|
161
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
162
|
+
logError('Agent execution failed', errorObj, { file, mode, agentId });
|
|
147
163
|
const errorTrace = {
|
|
148
164
|
id: traceId,
|
|
149
165
|
timestamp: new Date().toISOString(),
|
|
@@ -172,7 +188,14 @@ export async function executeAgent(file, mode, options) {
|
|
|
172
188
|
if (!opts.dryRun) {
|
|
173
189
|
await recordTrace(errorTrace);
|
|
174
190
|
}
|
|
175
|
-
|
|
191
|
+
// Return failure result instead of throwing (for task-worker compatibility)
|
|
192
|
+
return {
|
|
193
|
+
success: false,
|
|
194
|
+
changes: [],
|
|
195
|
+
trace: errorTrace,
|
|
196
|
+
cost: 0,
|
|
197
|
+
error: errorObj.message,
|
|
198
|
+
};
|
|
176
199
|
}
|
|
177
200
|
}
|
|
178
201
|
/**
|
|
@@ -184,7 +207,10 @@ async function callLLMWithRetry(prompt, mode, maxRetries) {
|
|
|
184
207
|
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
185
208
|
try {
|
|
186
209
|
logDebug('LLM call attempt', { attempt, maxRetries, mode });
|
|
187
|
-
const response = await
|
|
210
|
+
const response = await callLLM({
|
|
211
|
+
prompt: prompt.user,
|
|
212
|
+
systemPrompt: prompt.system,
|
|
213
|
+
});
|
|
188
214
|
return response;
|
|
189
215
|
}
|
|
190
216
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-executor.js","sourceRoot":"","sources":["../../src/core/agent-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"agent-executor.js","sourceRoot":"","sources":["../../src/core/agent-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Change Applier
|
|
3
|
-
*
|
|
2
|
+
* Change Applier - Safe code change application with backup/rollback
|
|
3
|
+
* Per second-spec.md §4.2
|
|
4
|
+
*
|
|
5
|
+
* Applies code changes safely with:
|
|
6
|
+
* - Backup creation before changes
|
|
7
|
+
* - Atomic all-or-nothing application
|
|
8
|
+
* - Rollback on errors
|
|
9
|
+
* - TypeScript syntax validation
|
|
10
|
+
* - Safety checks (paths, size limits)
|
|
4
11
|
*/
|
|
5
|
-
|
|
12
|
+
export interface CodeChange {
|
|
13
|
+
file: string;
|
|
14
|
+
newContent: string;
|
|
15
|
+
reason: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ApplyResult {
|
|
18
|
+
success: boolean;
|
|
19
|
+
filesChanged: string[];
|
|
20
|
+
backup?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
6
23
|
/**
|
|
7
|
-
* Apply changes
|
|
24
|
+
* Apply code changes with safety checks and backup
|
|
8
25
|
*/
|
|
9
|
-
export declare function applyChanges(
|
|
26
|
+
export declare function applyChanges(changes: CodeChange[], options?: {
|
|
27
|
+
dryRun?: boolean;
|
|
28
|
+
createBackup?: boolean;
|
|
29
|
+
}): Promise<ApplyResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Rollback changes from backup
|
|
32
|
+
*/
|
|
33
|
+
export declare function rollbackChanges(backup: string): Promise<void>;
|
|
10
34
|
//# sourceMappingURL=change-applier.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-applier.d.ts","sourceRoot":"","sources":["../../src/core/change-applier.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"change-applier.d.ts","sourceRoot":"","sources":["../../src/core/change-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GACA,OAAO,CAAC,WAAW,CAAC,CAmEtB;AAqLD;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCnE"}
|
|
@@ -1,32 +1,262 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Change Applier
|
|
3
|
-
*
|
|
2
|
+
* Change Applier - Safe code change application with backup/rollback
|
|
3
|
+
* Per second-spec.md §4.2
|
|
4
|
+
*
|
|
5
|
+
* Applies code changes safely with:
|
|
6
|
+
* - Backup creation before changes
|
|
7
|
+
* - Atomic all-or-nothing application
|
|
8
|
+
* - Rollback on errors
|
|
9
|
+
* - TypeScript syntax validation
|
|
10
|
+
* - Safety checks (paths, size limits)
|
|
4
11
|
*/
|
|
5
|
-
import
|
|
6
|
-
import
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
import * as crypto from 'crypto';
|
|
15
|
+
import { parse } from '@typescript-eslint/typescript-estree';
|
|
16
|
+
import { readFile } from '../utils/file-utils.js';
|
|
17
|
+
import { logDebug, logWarn, logError } from '../utils/logger.js';
|
|
18
|
+
const MAX_FILE_SIZE = 50 * 1024; // 50KB
|
|
19
|
+
const BACKUP_DIR = '.agent-meta/backups';
|
|
20
|
+
const BACKUP_INDEX = path.join(BACKUP_DIR, 'index.json');
|
|
7
21
|
/**
|
|
8
|
-
* Apply changes
|
|
22
|
+
* Apply code changes with safety checks and backup
|
|
9
23
|
*/
|
|
10
|
-
export async function applyChanges(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
24
|
+
export async function applyChanges(changes, options) {
|
|
25
|
+
const { dryRun = false, createBackup = true } = options || {};
|
|
26
|
+
try {
|
|
27
|
+
logDebug('Applying changes', {
|
|
28
|
+
fileCount: changes.length,
|
|
29
|
+
dryRun,
|
|
30
|
+
createBackup,
|
|
31
|
+
});
|
|
32
|
+
// Validate all changes first
|
|
33
|
+
for (const change of changes) {
|
|
34
|
+
await validateChange(change);
|
|
35
|
+
}
|
|
36
|
+
// Dry run mode - validate only
|
|
37
|
+
if (dryRun) {
|
|
38
|
+
logDebug('Dry run mode - changes validated but not applied');
|
|
39
|
+
return {
|
|
40
|
+
success: true,
|
|
41
|
+
filesChanged: changes.map(c => c.file),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Create backup if requested
|
|
45
|
+
let backupId;
|
|
46
|
+
if (createBackup) {
|
|
47
|
+
backupId = await createBackupFiles(changes);
|
|
48
|
+
}
|
|
49
|
+
// Apply all changes
|
|
50
|
+
const filesChanged = [];
|
|
51
|
+
try {
|
|
52
|
+
for (const change of changes) {
|
|
53
|
+
await applyChange(change);
|
|
54
|
+
filesChanged.push(change.file);
|
|
55
|
+
}
|
|
56
|
+
logDebug('All changes applied successfully', {
|
|
57
|
+
filesChanged,
|
|
58
|
+
backup: backupId,
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
success: true,
|
|
62
|
+
filesChanged,
|
|
63
|
+
backup: backupId,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
// Rollback on error
|
|
68
|
+
logError('Error applying changes, rolling back', error);
|
|
69
|
+
if (backupId) {
|
|
70
|
+
await rollbackChanges(backupId);
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
logError('Failed to apply changes', error);
|
|
77
|
+
return {
|
|
78
|
+
success: false,
|
|
79
|
+
filesChanged: [],
|
|
80
|
+
error: error instanceof Error ? error.message : String(error),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Validate a single change before applying
|
|
86
|
+
*/
|
|
87
|
+
async function validateChange(change) {
|
|
88
|
+
const { file, newContent } = change;
|
|
89
|
+
// Check file path is safe
|
|
90
|
+
const absolutePath = path.resolve(file);
|
|
91
|
+
const cwd = process.cwd();
|
|
92
|
+
if (!absolutePath.startsWith(cwd)) {
|
|
93
|
+
throw new Error(`File path outside project directory: ${file}`);
|
|
94
|
+
}
|
|
95
|
+
// Check file exists (only allow modifying existing files)
|
|
96
|
+
if (!fs.existsSync(absolutePath)) {
|
|
97
|
+
throw new Error(`File does not exist: ${file}`);
|
|
98
|
+
}
|
|
99
|
+
// Check existing file size (don't touch files that are already too large)
|
|
100
|
+
const stats = fs.statSync(absolutePath);
|
|
101
|
+
if (stats.size > MAX_FILE_SIZE) {
|
|
102
|
+
throw new Error(`File too large: ${stats.size} bytes (max ${MAX_FILE_SIZE})`);
|
|
103
|
+
}
|
|
104
|
+
// Don't modify protected directories
|
|
105
|
+
const relativePath = path.relative(cwd, absolutePath);
|
|
106
|
+
const pathComponents = relativePath.split(path.sep);
|
|
107
|
+
if (pathComponents.includes('.git') || pathComponents.includes('node_modules')) {
|
|
108
|
+
throw new Error(`Cannot modify protected directory: ${relativePath}`);
|
|
109
|
+
}
|
|
110
|
+
// Check new content size
|
|
111
|
+
if (newContent.length > MAX_FILE_SIZE) {
|
|
112
|
+
throw new Error(`File too large: ${newContent.length} bytes (max ${MAX_FILE_SIZE})`);
|
|
113
|
+
}
|
|
114
|
+
// Check file is writable
|
|
115
|
+
try {
|
|
116
|
+
fs.accessSync(absolutePath, fs.constants.W_OK);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
throw new Error(`File not writable: ${file}`);
|
|
120
|
+
}
|
|
121
|
+
// Validate TypeScript syntax for .ts/.tsx files
|
|
122
|
+
if (file.endsWith('.ts') || file.endsWith('.tsx')) {
|
|
123
|
+
try {
|
|
124
|
+
parse(newContent, {
|
|
125
|
+
loc: true,
|
|
126
|
+
range: true,
|
|
127
|
+
jsx: file.endsWith('.tsx'),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
throw new Error(`TypeScript syntax error: ${error instanceof Error ? error.message : String(error)}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Apply a single change
|
|
137
|
+
*/
|
|
138
|
+
async function applyChange(change) {
|
|
139
|
+
const { file, newContent, reason } = change;
|
|
140
|
+
logDebug('Applying change', {
|
|
141
|
+
file,
|
|
142
|
+
reason,
|
|
143
|
+
size: newContent.length,
|
|
15
144
|
});
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
145
|
+
// Ensure directory exists
|
|
146
|
+
const dir = path.dirname(file);
|
|
147
|
+
if (!fs.existsSync(dir)) {
|
|
148
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
149
|
+
}
|
|
150
|
+
// Write file
|
|
151
|
+
fs.writeFileSync(file, newContent, 'utf-8');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Create backup of files before changes
|
|
155
|
+
*/
|
|
156
|
+
async function createBackupFiles(changes) {
|
|
157
|
+
const timestamp = Date.now();
|
|
158
|
+
const backupId = `${timestamp}-${crypto.randomBytes(4).toString('hex')}`;
|
|
159
|
+
const backupPath = path.join(BACKUP_DIR, backupId);
|
|
160
|
+
logDebug('Creating backup', { backupId });
|
|
161
|
+
// Ensure backup directory exists
|
|
162
|
+
if (!fs.existsSync(BACKUP_DIR)) {
|
|
163
|
+
fs.mkdirSync(BACKUP_DIR, { recursive: true });
|
|
164
|
+
}
|
|
165
|
+
// Create backup directory
|
|
166
|
+
fs.mkdirSync(backupPath, { recursive: true });
|
|
167
|
+
// Backup metadata
|
|
168
|
+
const metadata = {
|
|
169
|
+
timestamp,
|
|
170
|
+
files: [],
|
|
171
|
+
};
|
|
172
|
+
// Backup each file
|
|
173
|
+
for (const change of changes) {
|
|
174
|
+
const { file } = change;
|
|
175
|
+
if (fs.existsSync(file)) {
|
|
176
|
+
// Read original content
|
|
177
|
+
const originalContent = readFile(file);
|
|
178
|
+
const hash = crypto.createHash('sha256').update(originalContent).digest('hex');
|
|
179
|
+
// Write to backup
|
|
180
|
+
const backupFile = path.join(backupPath, path.basename(file));
|
|
181
|
+
fs.writeFileSync(backupFile, originalContent, 'utf-8');
|
|
182
|
+
metadata.files.push({
|
|
183
|
+
file,
|
|
184
|
+
hash,
|
|
185
|
+
backed_up: true,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// File doesn't exist yet (new file)
|
|
190
|
+
metadata.files.push({
|
|
191
|
+
file,
|
|
192
|
+
hash: '',
|
|
193
|
+
backed_up: false,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Write metadata
|
|
198
|
+
const metadataFile = path.join(backupPath, 'metadata.json');
|
|
199
|
+
fs.writeFileSync(metadataFile, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
200
|
+
// Update backup index
|
|
201
|
+
await updateBackupIndex(backupId, metadata);
|
|
202
|
+
logDebug('Backup created', { backupId, fileCount: metadata.files.length });
|
|
203
|
+
return backupId;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Update backup index
|
|
207
|
+
*/
|
|
208
|
+
async function updateBackupIndex(backupId, metadata) {
|
|
209
|
+
let index = {};
|
|
210
|
+
if (fs.existsSync(BACKUP_INDEX)) {
|
|
211
|
+
const content = fs.readFileSync(BACKUP_INDEX, 'utf-8');
|
|
212
|
+
try {
|
|
213
|
+
index = JSON.parse(content);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
logWarn('Failed to parse backup index, creating new one');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
index[backupId] = {
|
|
220
|
+
timestamp: metadata.timestamp,
|
|
221
|
+
files: metadata.files.map(f => f.file),
|
|
28
222
|
};
|
|
29
|
-
|
|
30
|
-
|
|
223
|
+
fs.writeFileSync(BACKUP_INDEX, JSON.stringify(index, null, 2), 'utf-8');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Rollback changes from backup
|
|
227
|
+
*/
|
|
228
|
+
export async function rollbackChanges(backup) {
|
|
229
|
+
const backupPath = path.join(BACKUP_DIR, backup);
|
|
230
|
+
if (!fs.existsSync(backupPath)) {
|
|
231
|
+
throw new Error(`Backup not found: ${backup}`);
|
|
232
|
+
}
|
|
233
|
+
logDebug('Rolling back changes', { backup });
|
|
234
|
+
// Read metadata
|
|
235
|
+
const metadataFile = path.join(backupPath, 'metadata.json');
|
|
236
|
+
if (!fs.existsSync(metadataFile)) {
|
|
237
|
+
throw new Error(`Backup metadata not found: ${backup}`);
|
|
238
|
+
}
|
|
239
|
+
const metadata = JSON.parse(fs.readFileSync(metadataFile, 'utf-8'));
|
|
240
|
+
// Restore each file
|
|
241
|
+
for (const fileInfo of metadata.files) {
|
|
242
|
+
const { file, backed_up } = fileInfo;
|
|
243
|
+
if (backed_up) {
|
|
244
|
+
// Restore from backup
|
|
245
|
+
const backupFile = path.join(backupPath, path.basename(file));
|
|
246
|
+
const content = fs.readFileSync(backupFile, 'utf-8');
|
|
247
|
+
fs.writeFileSync(file, content, 'utf-8');
|
|
248
|
+
logDebug('File restored from backup', { file });
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
// File was new, delete it
|
|
252
|
+
if (fs.existsSync(file)) {
|
|
253
|
+
fs.unlinkSync(file);
|
|
254
|
+
logDebug('New file removed', { file });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Remove backup
|
|
259
|
+
fs.rmSync(backupPath, { recursive: true, force: true });
|
|
260
|
+
logDebug('Rollback complete', { backup });
|
|
31
261
|
}
|
|
32
262
|
//# sourceMappingURL=change-applier.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-applier.js","sourceRoot":"","sources":["../../src/core/change-applier.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"change-applier.js","sourceRoot":"","sources":["../../src/core/change-applier.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"churn.d.ts","sourceRoot":"","sources":["../../../src/core/signals/churn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAgBD;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA0D3E;
|
|
1
|
+
{"version":3,"file":"churn.d.ts","sourceRoot":"","sources":["../../../src/core/signals/churn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAgBD;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA0D3E;AA8FD;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAWP;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAUnC"}
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
* Normalization: commits_to_file / max(commits_to_any_file)
|
|
12
12
|
* Cache TTL: 5 minutes (300 seconds)
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
14
|
+
import { execFile } from 'child_process';
|
|
15
15
|
import { promisify } from 'util';
|
|
16
16
|
import { resolve, dirname } from 'path';
|
|
17
17
|
import { logDebug, logWarn } from '../../utils/logger.js';
|
|
18
|
-
const
|
|
18
|
+
const execFileAsync = promisify(execFile);
|
|
19
19
|
const CHURN_LOOKBACK_DAYS = 30;
|
|
20
20
|
const CHURN_CACHE_TTL_MS = 300_000; // 5 minutes
|
|
21
21
|
// Global cache (in-memory)
|
|
@@ -81,7 +81,8 @@ export async function calculateChurn(filePath) {
|
|
|
81
81
|
async function findGitRootForFile(filePath) {
|
|
82
82
|
const fileDir = dirname(resolve(filePath));
|
|
83
83
|
try {
|
|
84
|
-
|
|
84
|
+
// SECURITY: Use execFile to prevent command injection
|
|
85
|
+
const { stdout } = await execFileAsync('git', ['rev-parse', '--show-toplevel'], {
|
|
85
86
|
cwd: fileDir,
|
|
86
87
|
maxBuffer: 1024,
|
|
87
88
|
});
|
|
@@ -99,7 +100,8 @@ async function buildChurnCache(gitRoot) {
|
|
|
99
100
|
try {
|
|
100
101
|
// Get all commits with changed files
|
|
101
102
|
// Use "30 days ago" which git understands better than ISO dates
|
|
102
|
-
|
|
103
|
+
// SECURITY: Use execFile with array args to prevent command injection
|
|
104
|
+
const { stdout } = await execFileAsync('git', ['log', `--since=${CHURN_LOOKBACK_DAYS} days ago`, '--name-only', '--pretty=format:', '--all'], {
|
|
103
105
|
cwd: gitRoot,
|
|
104
106
|
maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large repos
|
|
105
107
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"churn.js","sourceRoot":"","sources":["../../../src/core/signals/churn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"churn.js","sourceRoot":"","sources":["../../../src/core/signals/churn.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debt.d.ts","sourceRoot":"","sources":["../../../src/core/signals/debt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAYD;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"debt.d.ts","sourceRoot":"","sources":["../../../src/core/signals/debt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAYD;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAuDzE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CASlC"}
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Graceful fallback if ESLint missing or fails (returns 0)
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
13
|
+
import { execFile } from 'child_process';
|
|
14
14
|
import { promisify } from 'util';
|
|
15
15
|
import { getLineCount } from '../../utils/file-utils.js';
|
|
16
16
|
import { logDebug, logWarn } from '../../utils/logger.js';
|
|
17
|
-
const
|
|
17
|
+
const execFileAsync = promisify(execFile);
|
|
18
18
|
/**
|
|
19
19
|
* Calculate technical debt for a file using ESLint
|
|
20
20
|
*/
|
|
@@ -24,7 +24,8 @@ export async function calculateDebt(filePath) {
|
|
|
24
24
|
const loc = getLineCount(filePath);
|
|
25
25
|
// Run ESLint with JSON formatter
|
|
26
26
|
// Note: ESLint exits with code 1 if there are linting errors, so we catch and parse stdout
|
|
27
|
-
|
|
27
|
+
// SECURITY: Use execFile with array args to prevent command injection
|
|
28
|
+
const { stdout } = await execFileAsync('npx', ['eslint', filePath, '--format', 'json'], {
|
|
28
29
|
maxBuffer: 1024 * 1024,
|
|
29
30
|
}).catch((error) => {
|
|
30
31
|
// ESLint returns exit code 1 when there are lint errors, but stdout still has JSON
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debt.js","sourceRoot":"","sources":["../../../src/core/signals/debt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"debt.js","sourceRoot":"","sources":["../../../src/core/signals/debt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"AA0CA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAcD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAkBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,eAAe,CA6BjB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBpF;AA2BD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAUhE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAU/E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAsCnE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAuCxE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,KAAK,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAAC,CA8BF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC,CA6BF;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD"}
|