locadex 0.1.14-alpha.4 → 0.1.14-alpha.5
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claudeCode.d.ts","sourceRoot":"/","sources":["utils/claudeCode.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAUrD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,qBAAqB;CAAG;AAczC,qBAAa,gBAAgB;IAwBzB,OAAO,CAAC,OAAO;IAvBjB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,KAAK,CAAa;IAE1B,OAAO,CAAC,KAAK,CASX;gBAGA,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,eAAe,EACnB,OAAO,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB;IA2BH,YAAY,IAAI,MAAM,GAAG,SAAS;IAGlC,KAAK;IAKL,UAAU;IAYV,cAAc;
|
|
1
|
+
{"version":3,"file":"claudeCode.d.ts","sourceRoot":"/","sources":["utils/claudeCode.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAUrD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,qBAAqB;CAAG;AAczC,qBAAa,gBAAgB;IAwBzB,OAAO,CAAC,OAAO;IAvBjB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,KAAK,CAAa;IAE1B,OAAO,CAAC,KAAK,CASX;gBAGA,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,eAAe,EACnB,OAAO,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB;IA2BH,YAAY,IAAI,MAAM,GAAG,SAAS;IAGlC,KAAK;IAKL,UAAU;IAYV,cAAc;IAkBd;;OAEG;YACW,WAAW;IA2BzB;;;OAGG;YACW,SAAS;IAiDjB,GAAG,CACP,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,MAAM,CAAC;IAiPlB,OAAO,CAAC,eAAe;IAiEvB,cAAc,IAAI,MAAM;CAGzB"}
|
package/dist/utils/claudeCode.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="fc8c7d40-4d26-516e-a5da-a15cc9022973")}catch(e){}}();
|
|
3
3
|
import { spawn } from 'node:child_process';
|
|
4
4
|
import { guides } from '../mcp/tools/guides.js';
|
|
5
5
|
import { logger } from '../logging/logger.js';
|
|
@@ -71,6 +71,7 @@ export class ClaudeCodeRunner {
|
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
73
|
aggregateStats() {
|
|
74
|
+
logger.verboseMessage(`[${this.id}] Aggregating stats.\nCost: $${this.stats.cost.toFixed(2)}\nDuration: ${this.stats.wallDuration / 1000}s`);
|
|
74
75
|
this.manager.stats.updateStats({
|
|
75
76
|
newCost: this.stats.cost,
|
|
76
77
|
newWallDuration: this.stats.wallDuration,
|
|
@@ -312,10 +313,10 @@ export class ClaudeCodeRunner {
|
|
|
312
313
|
this.stats.turns = outputData.num_turns;
|
|
313
314
|
this.turns = outputData.num_turns;
|
|
314
315
|
if (!outputData.is_error) {
|
|
315
|
-
logger.verboseMessage(`[${this.id}] finished task
|
|
316
|
+
logger.verboseMessage(`[${this.id}] finished task.`);
|
|
316
317
|
}
|
|
317
318
|
else {
|
|
318
|
-
logger.verboseMessage(`[${this.id}] finished task with error: ${outputData.subtype}
|
|
319
|
+
logger.verboseMessage(`[${this.id}] finished task with error: ${outputData.subtype}`);
|
|
319
320
|
return {
|
|
320
321
|
success: false,
|
|
321
322
|
error: outputData.subtype,
|
|
@@ -339,4 +340,4 @@ export class ClaudeCodeRunner {
|
|
|
339
340
|
}
|
|
340
341
|
}
|
|
341
342
|
//# sourceMappingURL=claudeCode.js.map
|
|
342
|
-
//# debugId=
|
|
343
|
+
//# debugId=fc8c7d40-4d26-516e-a5da-a15cc9022973
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claudeCode.js","sources":["utils/claudeCode.ts"],"sourceRoot":"/","sourcesContent":["import { spawn } from 'node:child_process';\nimport { ClaudeSDKMessage } from '../types/claude-sdk.js';\nimport { guides } from '../mcp/tools/guides.js';\nimport { logger } from '../logging/logger.js';\nimport { posthog } from '../telemetry.js';\nimport { LocadexManager } from './locadexManager.js';\nimport { getSessionId } from './session.js';\nimport * as Sentry from '@sentry/node';\nimport {\n TimeoutError,\n UserAbortError,\n AgentProcessError,\n AgentSpawnError,\n} from './errors.js';\n\nexport type ClaudeRunOptions = {\n additionalSystemPrompt?: string;\n additionalAllowedTools?: string[];\n maxTurns?: number; // Hard limit on the number of turns per Claude Code call\n\n // required\n timeoutSec: number; // Timeout per .run() call\n maxRetries: number; // Max number of retries per .run() call\n};\n\nexport type ClaudeRunnerOptions = {\n softTurnLimit?: number; // Soft limit on the number of turns per Claude runner\n};\n\nexport interface ClaudeCodeObservation {}\n\nconst DEFAULT_ALLOWED_TOOLS = [\n 'mcp__locadex__fetch-docs',\n 'mcp__locadex__list-docs',\n 'mcp__locadex__validate-project',\n 'Bash',\n 'Edit',\n 'MultiEdit',\n 'Write',\n].concat(guides.map((guide) => `mcp__locadex__${guide.id}`));\n\nconst DISALLOWED_TOOLS = ['NotebookEdit', 'WebFetch', 'WebSearch'];\n\nexport class ClaudeCodeRunner {\n private id: string;\n private sessionId: string | undefined;\n private mcpConfig: string | undefined;\n private manager: LocadexManager;\n private changes: string[] = [];\n private controller: AbortController;\n private softTurnLimit: number;\n private turns: number = 0;\n\n private stats: {\n cost: number;\n wallDuration: number;\n apiDuration: number;\n turns: number;\n mcpToolCalls: number;\n inputTokens: number;\n outputTokens: number;\n cachedInputTokens: number;\n };\n\n constructor(\n manager: LocadexManager,\n controller: AbortController,\n private options: {\n id: string;\n apiKey: string;\n mcpConfig: string;\n softTurnLimit: number;\n }\n ) {\n this.manager = manager;\n this.id = options.id;\n this.mcpConfig = options.mcpConfig;\n this.controller = controller;\n this.softTurnLimit = options.softTurnLimit;\n\n this.stats = {\n cost: 0,\n wallDuration: 0,\n apiDuration: 0,\n turns: 0,\n mcpToolCalls: 0,\n inputTokens: 0,\n outputTokens: 0,\n cachedInputTokens: 0,\n };\n\n // Ensure API key is set\n if (!process.env.ANTHROPIC_API_KEY && !this.options.apiKey) {\n throw new Error(\n 'ANTHROPIC_API_KEY environment variable or apiKey option is required'\n );\n }\n }\n\n getSessionId(): string | undefined {\n return this.sessionId;\n }\n reset() {\n this.sessionId = undefined;\n this.turns = 0;\n this.resetStats();\n }\n resetStats() {\n this.stats = {\n cost: 0,\n wallDuration: 0,\n apiDuration: 0,\n turns: 0,\n mcpToolCalls: 0,\n inputTokens: 0,\n outputTokens: 0,\n cachedInputTokens: 0,\n };\n }\n aggregateStats() {\n this.manager.stats.updateStats({\n newCost: this.stats.cost,\n newWallDuration: this.stats.wallDuration,\n newApiDuration: this.stats.apiDuration,\n newTurns: this.stats.turns,\n newToolCalls: this.stats.mcpToolCalls,\n newInputTokens: this.stats.inputTokens,\n newOutputTokens: this.stats.outputTokens,\n newCachedInputTokens: this.stats.cachedInputTokens,\n });\n }\n\n /**\n * Wraps a promise with a timeout mechanism that can abort the underlying operation\n */\n private async withTimeout<T>(\n promiseFactory: (abortController: AbortController) => Promise<T>,\n timeoutSec: number,\n timeoutMessage?: string\n ): Promise<T> {\n const timeoutController = new AbortController();\n let timeoutId: ReturnType<typeof global.setTimeout>;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = global.setTimeout(() => {\n timeoutController.abort();\n reject(\n new TimeoutError(\n timeoutMessage || `Operation timed out after ${timeoutSec}s`,\n timeoutSec\n )\n );\n }, timeoutSec * 1000);\n });\n\n const promise = promiseFactory(timeoutController);\n return Promise.race([promise, timeoutPromise]).finally(() => {\n // Clear the timeout regardless of how the promise resolves\n global.clearTimeout(timeoutId);\n });\n }\n\n /**\n * Retries an async operation with exponential backoff\n * Retries on TimeoutError but not on UserAbortError\n */\n private async withRetry<T>(\n operation: () => Promise<T>,\n maxRetries: number = 1,\n baseDelayMs: number = 1000\n ): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on user aborts - these are intentional\n if (\n lastError instanceof UserAbortError ||\n lastError.name === 'AbortError'\n ) {\n logger.debugMessage(`Claude Code operation aborted by user`);\n throw lastError;\n }\n\n // Don't retry on the last attempt\n if (attempt === maxRetries) {\n throw lastError;\n }\n\n const delay = baseDelayMs * Math.pow(2, attempt);\n\n // Log different messages for different error types\n if (lastError instanceof TimeoutError) {\n logger.debugMessage(\n `Claude Code operation timed out (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms: ${lastError.message}`\n );\n // reset the session id\n this.reset();\n } else {\n logger.debugMessage(\n `Claude Code operation failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms: ${lastError.message}`\n );\n }\n\n await new Promise((resolve) => global.setTimeout(resolve, delay));\n }\n }\n\n throw lastError!;\n }\n\n async run(\n prompt: string,\n options: ClaudeRunOptions,\n _obs: ClaudeCodeObservation\n ): Promise<string> {\n this.changes = [];\n return this.withRetry(\n () =>\n Sentry.startSpan(\n {\n name: 'claude-code-exec',\n op: 'claude-code.exec',\n attributes: {\n 'process.command': 'claude',\n },\n },\n () =>\n this.withTimeout(\n (timeoutController: AbortController) =>\n new Promise<string>((resolve, reject) => {\n const args = ['-p', prompt];\n\n if (options.additionalSystemPrompt) {\n args.push(\n '--append-system-prompt',\n options.additionalSystemPrompt\n );\n }\n\n args.push('--output-format', 'stream-json');\n args.push('--verbose');\n\n if (this.sessionId) {\n if (this.turns < this.softTurnLimit) {\n args.push('--resume', this.sessionId);\n } else {\n logger.debugMessage(\n `[${this.id}] Resetting session id because of soft turn limit reached: ${this.turns} >= ${this.softTurnLimit}`\n );\n this.reset();\n }\n }\n\n if (this.mcpConfig) {\n args.push('--mcp-config', this.mcpConfig);\n }\n\n args.push(\n '--allowedTools',\n [\n ...DEFAULT_ALLOWED_TOOLS,\n ...(options?.additionalAllowedTools || []),\n ].join(',')\n );\n\n args.push('--disallowedTools', DISALLOWED_TOOLS.join(','));\n\n if (options.maxTurns) {\n args.push('--max-turns', options.maxTurns.toString());\n }\n\n const env = { ...process.env };\n env.ANTHROPIC_API_KEY = this.options.apiKey;\n logger.debugMessage(\n `[${this.id}] Spawning Claude Code with additional args: ${JSON.stringify(\n {\n maxTurns: options.maxTurns,\n softTurnLimit: this.softTurnLimit,\n timeoutSec: options.timeoutSec,\n maxRetries: options.maxRetries,\n sessionId: this.sessionId,\n mcpConfig: this.mcpConfig,\n additionalAllowedTools: options.additionalAllowedTools,\n },\n null,\n 2\n )}. API key is ${this.options.apiKey ? 'set' : 'not set'}`\n );\n\n // Create a combined abort controller that triggers on either user abort or timeout\n const combinedController = new AbortController();\n\n const abortHandler = () => {\n combinedController.abort();\n };\n\n this.controller.signal.addEventListener(\n 'abort',\n abortHandler\n );\n timeoutController.signal.addEventListener(\n 'abort',\n abortHandler\n );\n\n const claude = spawn('claude', args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env,\n signal: combinedController.signal,\n });\n\n logger.debugMessage(\n `[${this.id}] Spawned claude code process`\n );\n\n const output = {\n error: '',\n };\n\n let buffer = '';\n claude.stdout?.on('data', (data) => {\n buffer += data.toString();\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n logger.debugMessage(`[${this.id}] ${line}`);\n const outputData: ClaudeSDKMessage = JSON.parse(line);\n const result = this.handleSDKOutput(outputData, _obs);\n if (!result.success) {\n output.error = result.error ?? '';\n }\n } catch (error) {\n logger.debugMessage(\n `[${this.id}] Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n });\n\n claude.stderr?.on('data', (data) => {\n logger.debugMessage(\n `[${this.id}] ${data.toString().trim()}`\n );\n });\n\n claude.on('close', (code, signal) => {\n // Clean up event listeners\n this.controller.signal.removeEventListener(\n 'abort',\n abortHandler\n );\n timeoutController.signal.removeEventListener(\n 'abort',\n abortHandler\n );\n\n if (signal === 'SIGTERM' || signal === 'SIGKILL') {\n // Process was terminated due to abort\n if (this.controller.signal.aborted) {\n reject(\n new UserAbortError(\n 'Claude Code process was aborted by user'\n )\n );\n } else if (timeoutController.signal.aborted) {\n reject(\n new TimeoutError(\n `Claude Code process timed out after ${options.timeoutSec}s`,\n options.timeoutSec\n )\n );\n } else {\n reject(\n new AgentProcessError(\n `[${this.id}] Claude Code process was terminated with signal ${signal}`,\n code ?? undefined\n )\n );\n }\n } else if (code === 0) {\n logger.debugMessage(\n `[${this.id}] Claude Code exited with code ${code}`\n );\n resolve('');\n } else {\n logger.debugMessage(\n `[${this.id}] Claude Code exited with code ${code}: ${output.error}`\n );\n reject(\n new AgentProcessError(\n `[${this.id}] Claude Code exited with code ${code}: ${output.error}`,\n code ?? undefined\n )\n );\n }\n });\n\n claude.on('error', (error) => {\n // Clean up event listeners\n this.controller.signal.removeEventListener(\n 'abort',\n abortHandler\n );\n timeoutController.signal.removeEventListener(\n 'abort',\n abortHandler\n );\n\n if (error.name === 'AbortError') {\n // Determine if this was a user abort or timeout abort\n if (this.controller.signal.aborted) {\n reject(\n new UserAbortError(\n 'Claude Code process was aborted by user'\n )\n );\n } else if (timeoutController.signal.aborted) {\n reject(\n new TimeoutError(\n `Claude Code process timed out after ${options.timeoutSec}s`,\n options.timeoutSec\n )\n );\n } else {\n reject(\n new UserAbortError('Claude Code process was aborted')\n );\n }\n } else {\n logger.debugMessage(\n `[${this.id}] failed to run Claude Code: ${error.message}`\n );\n reject(\n new AgentSpawnError(\n `[${this.id}] failed to run Claude Code: ${error.message}`,\n error\n )\n );\n }\n });\n }),\n options.timeoutSec,\n `Claude Code operation timed out after ${options.timeoutSec}s`\n )\n ),\n options.maxRetries\n );\n }\n\n private handleSDKOutput(\n outputData: ClaudeSDKMessage,\n _obs: ClaudeCodeObservation\n ): { success: boolean; error?: string } {\n if (outputData.type === 'assistant') {\n const text: string[] = [];\n const toolUses: string[] = [];\n outputData.message.content.forEach((c) => {\n if (c.type === 'text') {\n text.push(c.text);\n }\n if (c.type === 'tool_use') {\n toolUses.push(c.name);\n if (c.name.startsWith('mcp__locadex__')) {\n posthog.capture({\n distinctId: getSessionId(),\n event: 'tool_used',\n properties: {\n tool: c.name,\n },\n });\n }\n }\n });\n if (text.length > 0) {\n logger.verboseMessage(`[${this.id}] ${text.join('').trim()}`);\n }\n if (toolUses.length > 0) {\n logger.debugMessage(`[${this.id}] used tools: ${toolUses.join(', ')}`);\n }\n this.stats.mcpToolCalls += toolUses.length;\n this.stats.inputTokens += outputData.message.usage.input_tokens;\n this.stats.outputTokens += outputData.message.usage.output_tokens;\n this.stats.cachedInputTokens +=\n outputData.message.usage.cache_read_input_tokens ?? 0;\n } else if (outputData.type === 'result') {\n this.stats.cost = outputData.total_cost_usd;\n this.stats.wallDuration = outputData.duration_ms;\n this.stats.apiDuration = outputData.duration_api_ms;\n this.stats.turns = outputData.num_turns;\n this.turns = outputData.num_turns;\n if (!outputData.is_error) {\n logger.verboseMessage(\n `[${this.id}] finished task.\\nCost: $${outputData.total_cost_usd.toFixed(2)}\\nDuration: ${\n outputData.duration_ms / 1000\n }s`\n );\n } else {\n logger.verboseMessage(\n `[${this.id}] finished task with error: ${outputData.subtype}\\nCost: $${outputData.total_cost_usd}\\nDuration: ${\n outputData.duration_ms / 1000\n }s`\n );\n return {\n success: false,\n error: outputData.subtype,\n };\n }\n if (outputData.subtype === 'success') {\n this.changes.push(outputData.result);\n }\n } else if (outputData.type === 'system') {\n if (outputData.subtype === 'init') {\n this.sessionId = outputData.session_id;\n }\n }\n return {\n success: true,\n };\n }\n\n generateReport(): string {\n return this.changes.join('\\n');\n }\n}\n"],"names":[],"mappings":"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","debug_id":"4f0c7990-b29f-559e-b1de-72967bf9f72c"}
|
|
1
|
+
{"version":3,"file":"claudeCode.js","sources":["utils/claudeCode.ts"],"sourceRoot":"/","sourcesContent":["import { spawn } from 'node:child_process';\nimport { ClaudeSDKMessage } from '../types/claude-sdk.js';\nimport { guides } from '../mcp/tools/guides.js';\nimport { logger } from '../logging/logger.js';\nimport { posthog } from '../telemetry.js';\nimport { LocadexManager } from './locadexManager.js';\nimport { getSessionId } from './session.js';\nimport * as Sentry from '@sentry/node';\nimport {\n TimeoutError,\n UserAbortError,\n AgentProcessError,\n AgentSpawnError,\n} from './errors.js';\n\nexport type ClaudeRunOptions = {\n additionalSystemPrompt?: string;\n additionalAllowedTools?: string[];\n maxTurns?: number; // Hard limit on the number of turns per Claude Code call\n\n // required\n timeoutSec: number; // Timeout per .run() call\n maxRetries: number; // Max number of retries per .run() call\n};\n\nexport type ClaudeRunnerOptions = {\n softTurnLimit?: number; // Soft limit on the number of turns per Claude runner\n};\n\nexport interface ClaudeCodeObservation {}\n\nconst DEFAULT_ALLOWED_TOOLS = [\n 'mcp__locadex__fetch-docs',\n 'mcp__locadex__list-docs',\n 'mcp__locadex__validate-project',\n 'Bash',\n 'Edit',\n 'MultiEdit',\n 'Write',\n].concat(guides.map((guide) => `mcp__locadex__${guide.id}`));\n\nconst DISALLOWED_TOOLS = ['NotebookEdit', 'WebFetch', 'WebSearch'];\n\nexport class ClaudeCodeRunner {\n private id: string;\n private sessionId: string | undefined;\n private mcpConfig: string | undefined;\n private manager: LocadexManager;\n private changes: string[] = [];\n private controller: AbortController;\n private softTurnLimit: number;\n private turns: number = 0;\n\n private stats: {\n cost: number;\n wallDuration: number;\n apiDuration: number;\n turns: number;\n mcpToolCalls: number;\n inputTokens: number;\n outputTokens: number;\n cachedInputTokens: number;\n };\n\n constructor(\n manager: LocadexManager,\n controller: AbortController,\n private options: {\n id: string;\n apiKey: string;\n mcpConfig: string;\n softTurnLimit: number;\n }\n ) {\n this.manager = manager;\n this.id = options.id;\n this.mcpConfig = options.mcpConfig;\n this.controller = controller;\n this.softTurnLimit = options.softTurnLimit;\n\n this.stats = {\n cost: 0,\n wallDuration: 0,\n apiDuration: 0,\n turns: 0,\n mcpToolCalls: 0,\n inputTokens: 0,\n outputTokens: 0,\n cachedInputTokens: 0,\n };\n\n // Ensure API key is set\n if (!process.env.ANTHROPIC_API_KEY && !this.options.apiKey) {\n throw new Error(\n 'ANTHROPIC_API_KEY environment variable or apiKey option is required'\n );\n }\n }\n\n getSessionId(): string | undefined {\n return this.sessionId;\n }\n reset() {\n this.sessionId = undefined;\n this.turns = 0;\n this.resetStats();\n }\n resetStats() {\n this.stats = {\n cost: 0,\n wallDuration: 0,\n apiDuration: 0,\n turns: 0,\n mcpToolCalls: 0,\n inputTokens: 0,\n outputTokens: 0,\n cachedInputTokens: 0,\n };\n }\n aggregateStats() {\n logger.verboseMessage(\n `[${this.id}] Aggregating stats.\\nCost: $${this.stats.cost.toFixed(\n 2\n )}\\nDuration: ${this.stats.wallDuration / 1000}s`\n );\n this.manager.stats.updateStats({\n newCost: this.stats.cost,\n newWallDuration: this.stats.wallDuration,\n newApiDuration: this.stats.apiDuration,\n newTurns: this.stats.turns,\n newToolCalls: this.stats.mcpToolCalls,\n newInputTokens: this.stats.inputTokens,\n newOutputTokens: this.stats.outputTokens,\n newCachedInputTokens: this.stats.cachedInputTokens,\n });\n }\n\n /**\n * Wraps a promise with a timeout mechanism that can abort the underlying operation\n */\n private async withTimeout<T>(\n promiseFactory: (abortController: AbortController) => Promise<T>,\n timeoutSec: number,\n timeoutMessage?: string\n ): Promise<T> {\n const timeoutController = new AbortController();\n let timeoutId: ReturnType<typeof global.setTimeout>;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = global.setTimeout(() => {\n timeoutController.abort();\n reject(\n new TimeoutError(\n timeoutMessage || `Operation timed out after ${timeoutSec}s`,\n timeoutSec\n )\n );\n }, timeoutSec * 1000);\n });\n\n const promise = promiseFactory(timeoutController);\n return Promise.race([promise, timeoutPromise]).finally(() => {\n // Clear the timeout regardless of how the promise resolves\n global.clearTimeout(timeoutId);\n });\n }\n\n /**\n * Retries an async operation with exponential backoff\n * Retries on TimeoutError but not on UserAbortError\n */\n private async withRetry<T>(\n operation: () => Promise<T>,\n maxRetries: number = 1,\n baseDelayMs: number = 1000\n ): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on user aborts - these are intentional\n if (\n lastError instanceof UserAbortError ||\n lastError.name === 'AbortError'\n ) {\n logger.debugMessage(`Claude Code operation aborted by user`);\n throw lastError;\n }\n\n // Don't retry on the last attempt\n if (attempt === maxRetries) {\n throw lastError;\n }\n\n const delay = baseDelayMs * Math.pow(2, attempt);\n\n // Log different messages for different error types\n if (lastError instanceof TimeoutError) {\n logger.debugMessage(\n `Claude Code operation timed out (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms: ${lastError.message}`\n );\n // reset the session id\n this.reset();\n } else {\n logger.debugMessage(\n `Claude Code operation failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms: ${lastError.message}`\n );\n }\n\n await new Promise((resolve) => global.setTimeout(resolve, delay));\n }\n }\n\n throw lastError!;\n }\n\n async run(\n prompt: string,\n options: ClaudeRunOptions,\n _obs: ClaudeCodeObservation\n ): Promise<string> {\n this.changes = [];\n return this.withRetry(\n () =>\n Sentry.startSpan(\n {\n name: 'claude-code-exec',\n op: 'claude-code.exec',\n attributes: {\n 'process.command': 'claude',\n },\n },\n () =>\n this.withTimeout(\n (timeoutController: AbortController) =>\n new Promise<string>((resolve, reject) => {\n const args = ['-p', prompt];\n\n if (options.additionalSystemPrompt) {\n args.push(\n '--append-system-prompt',\n options.additionalSystemPrompt\n );\n }\n\n args.push('--output-format', 'stream-json');\n args.push('--verbose');\n\n if (this.sessionId) {\n if (this.turns < this.softTurnLimit) {\n args.push('--resume', this.sessionId);\n } else {\n logger.debugMessage(\n `[${this.id}] Resetting session id because of soft turn limit reached: ${this.turns} >= ${this.softTurnLimit}`\n );\n this.reset();\n }\n }\n\n if (this.mcpConfig) {\n args.push('--mcp-config', this.mcpConfig);\n }\n\n args.push(\n '--allowedTools',\n [\n ...DEFAULT_ALLOWED_TOOLS,\n ...(options?.additionalAllowedTools || []),\n ].join(',')\n );\n\n args.push('--disallowedTools', DISALLOWED_TOOLS.join(','));\n\n if (options.maxTurns) {\n args.push('--max-turns', options.maxTurns.toString());\n }\n\n const env = { ...process.env };\n env.ANTHROPIC_API_KEY = this.options.apiKey;\n logger.debugMessage(\n `[${this.id}] Spawning Claude Code with additional args: ${JSON.stringify(\n {\n maxTurns: options.maxTurns,\n softTurnLimit: this.softTurnLimit,\n timeoutSec: options.timeoutSec,\n maxRetries: options.maxRetries,\n sessionId: this.sessionId,\n mcpConfig: this.mcpConfig,\n additionalAllowedTools: options.additionalAllowedTools,\n },\n null,\n 2\n )}. API key is ${this.options.apiKey ? 'set' : 'not set'}`\n );\n\n // Create a combined abort controller that triggers on either user abort or timeout\n const combinedController = new AbortController();\n\n const abortHandler = () => {\n combinedController.abort();\n };\n\n this.controller.signal.addEventListener(\n 'abort',\n abortHandler\n );\n timeoutController.signal.addEventListener(\n 'abort',\n abortHandler\n );\n\n const claude = spawn('claude', args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env,\n signal: combinedController.signal,\n });\n\n logger.debugMessage(\n `[${this.id}] Spawned claude code process`\n );\n\n const output = {\n error: '',\n };\n\n let buffer = '';\n claude.stdout?.on('data', (data) => {\n buffer += data.toString();\n const lines = buffer.split('\\n');\n\n // Keep the last incomplete line in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n logger.debugMessage(`[${this.id}] ${line}`);\n const outputData: ClaudeSDKMessage = JSON.parse(line);\n const result = this.handleSDKOutput(outputData, _obs);\n if (!result.success) {\n output.error = result.error ?? '';\n }\n } catch (error) {\n logger.debugMessage(\n `[${this.id}] Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n });\n\n claude.stderr?.on('data', (data) => {\n logger.debugMessage(\n `[${this.id}] ${data.toString().trim()}`\n );\n });\n\n claude.on('close', (code, signal) => {\n // Clean up event listeners\n this.controller.signal.removeEventListener(\n 'abort',\n abortHandler\n );\n timeoutController.signal.removeEventListener(\n 'abort',\n abortHandler\n );\n\n if (signal === 'SIGTERM' || signal === 'SIGKILL') {\n // Process was terminated due to abort\n if (this.controller.signal.aborted) {\n reject(\n new UserAbortError(\n 'Claude Code process was aborted by user'\n )\n );\n } else if (timeoutController.signal.aborted) {\n reject(\n new TimeoutError(\n `Claude Code process timed out after ${options.timeoutSec}s`,\n options.timeoutSec\n )\n );\n } else {\n reject(\n new AgentProcessError(\n `[${this.id}] Claude Code process was terminated with signal ${signal}`,\n code ?? undefined\n )\n );\n }\n } else if (code === 0) {\n logger.debugMessage(\n `[${this.id}] Claude Code exited with code ${code}`\n );\n resolve('');\n } else {\n logger.debugMessage(\n `[${this.id}] Claude Code exited with code ${code}: ${output.error}`\n );\n reject(\n new AgentProcessError(\n `[${this.id}] Claude Code exited with code ${code}: ${output.error}`,\n code ?? undefined\n )\n );\n }\n });\n\n claude.on('error', (error) => {\n // Clean up event listeners\n this.controller.signal.removeEventListener(\n 'abort',\n abortHandler\n );\n timeoutController.signal.removeEventListener(\n 'abort',\n abortHandler\n );\n\n if (error.name === 'AbortError') {\n // Determine if this was a user abort or timeout abort\n if (this.controller.signal.aborted) {\n reject(\n new UserAbortError(\n 'Claude Code process was aborted by user'\n )\n );\n } else if (timeoutController.signal.aborted) {\n reject(\n new TimeoutError(\n `Claude Code process timed out after ${options.timeoutSec}s`,\n options.timeoutSec\n )\n );\n } else {\n reject(\n new UserAbortError('Claude Code process was aborted')\n );\n }\n } else {\n logger.debugMessage(\n `[${this.id}] failed to run Claude Code: ${error.message}`\n );\n reject(\n new AgentSpawnError(\n `[${this.id}] failed to run Claude Code: ${error.message}`,\n error\n )\n );\n }\n });\n }),\n options.timeoutSec,\n `Claude Code operation timed out after ${options.timeoutSec}s`\n )\n ),\n options.maxRetries\n );\n }\n\n private handleSDKOutput(\n outputData: ClaudeSDKMessage,\n _obs: ClaudeCodeObservation\n ): { success: boolean; error?: string } {\n if (outputData.type === 'assistant') {\n const text: string[] = [];\n const toolUses: string[] = [];\n outputData.message.content.forEach((c) => {\n if (c.type === 'text') {\n text.push(c.text);\n }\n if (c.type === 'tool_use') {\n toolUses.push(c.name);\n if (c.name.startsWith('mcp__locadex__')) {\n posthog.capture({\n distinctId: getSessionId(),\n event: 'tool_used',\n properties: {\n tool: c.name,\n },\n });\n }\n }\n });\n if (text.length > 0) {\n logger.verboseMessage(`[${this.id}] ${text.join('').trim()}`);\n }\n if (toolUses.length > 0) {\n logger.debugMessage(`[${this.id}] used tools: ${toolUses.join(', ')}`);\n }\n this.stats.mcpToolCalls += toolUses.length;\n this.stats.inputTokens += outputData.message.usage.input_tokens;\n this.stats.outputTokens += outputData.message.usage.output_tokens;\n this.stats.cachedInputTokens +=\n outputData.message.usage.cache_read_input_tokens ?? 0;\n } else if (outputData.type === 'result') {\n this.stats.cost = outputData.total_cost_usd;\n this.stats.wallDuration = outputData.duration_ms;\n this.stats.apiDuration = outputData.duration_api_ms;\n this.stats.turns = outputData.num_turns;\n this.turns = outputData.num_turns;\n if (!outputData.is_error) {\n logger.verboseMessage(`[${this.id}] finished task.`);\n } else {\n logger.verboseMessage(\n `[${this.id}] finished task with error: ${outputData.subtype}`\n );\n return {\n success: false,\n error: outputData.subtype,\n };\n }\n if (outputData.subtype === 'success') {\n this.changes.push(outputData.result);\n }\n } else if (outputData.type === 'system') {\n if (outputData.subtype === 'init') {\n this.sessionId = outputData.session_id;\n }\n }\n return {\n success: true,\n };\n }\n\n generateReport(): string {\n return this.changes.join('\\n');\n }\n}\n"],"names":[],"mappings":"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","debug_id":"fc8c7d40-4d26-516e-a5da-a15cc9022973"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatFiles.d.ts","sourceRoot":"/","sources":["utils/fs/formatFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"formatFiles.d.ts","sourceRoot":"/","sources":["utils/fs/formatFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,iBAqBrE"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="51fb8c4b-3d99-562c-875b-53308a68b718")}catch(e){}}();
|
|
3
3
|
import { logger } from '../../logging/logger.js';
|
|
4
4
|
import { execFunction } from '../exec.js';
|
|
5
5
|
export async function formatFiles(cmd, manager) {
|
|
6
6
|
const trimmed = cmd.trim();
|
|
7
7
|
const stripped = trimmed.replace(/^["'](.*)["']$/, '$1');
|
|
8
8
|
const formattedCmd = `"${stripped}"`;
|
|
9
|
+
logger.verboseMessage(`Running ${formattedCmd}... in ${manager.appDirectory}`);
|
|
9
10
|
const { stderr, code } = await execFunction('sh', ['-c', formattedCmd], false, manager.appDirectory, manager.getAgentAbortController());
|
|
10
11
|
if (code !== 0) {
|
|
11
|
-
logger.error(`Error running
|
|
12
|
+
logger.error(`Error running ${formattedCmd} in ${manager.appDirectory}: ${stderr}`);
|
|
12
13
|
}
|
|
13
14
|
else {
|
|
14
15
|
logger.step(`Formatted files with ${cmd}`);
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
18
|
//# sourceMappingURL=formatFiles.js.map
|
|
18
|
-
//# debugId=
|
|
19
|
+
//# debugId=51fb8c4b-3d99-562c-875b-53308a68b718
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatFiles.js","sources":["utils/fs/formatFiles.ts"],"sourceRoot":"/","sourcesContent":["import { LocadexManager } from '../locadexManager.js';\nimport { logger } from '../../logging/logger.js';\nimport { execFunction } from '../exec.js';\n\nexport async function formatFiles(cmd: string, manager: LocadexManager) {\n const trimmed = cmd.trim();\n const stripped = trimmed.replace(/^[\"'](.*)[\"']$/, '$1');\n const formattedCmd = `\"${stripped}\"`;\n const { stderr, code } = await execFunction(\n 'sh',\n ['-c', formattedCmd],\n false,\n manager.appDirectory,\n manager.getAgentAbortController()\n );\n if (code !== 0) {\n logger.error(`Error running
|
|
1
|
+
{"version":3,"file":"formatFiles.js","sources":["utils/fs/formatFiles.ts"],"sourceRoot":"/","sourcesContent":["import { LocadexManager } from '../locadexManager.js';\nimport { logger } from '../../logging/logger.js';\nimport { execFunction } from '../exec.js';\n\nexport async function formatFiles(cmd: string, manager: LocadexManager) {\n const trimmed = cmd.trim();\n const stripped = trimmed.replace(/^[\"'](.*)[\"']$/, '$1');\n const formattedCmd = `\"${stripped}\"`;\n logger.verboseMessage(\n `Running ${formattedCmd}... in ${manager.appDirectory}`\n );\n const { stderr, code } = await execFunction(\n 'sh',\n ['-c', formattedCmd],\n false,\n manager.appDirectory,\n manager.getAgentAbortController()\n );\n if (code !== 0) {\n logger.error(\n `Error running ${formattedCmd} in ${manager.appDirectory}: ${stderr}`\n );\n } else {\n logger.step(`Formatted files with ${cmd}`);\n }\n}\n"],"names":[],"mappings":";;AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,OAAuB;IACpE,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,IAAI,QAAQ,GAAG,CAAC;IACrC,MAAM,CAAC,cAAc,CACnB,WAAW,YAAY,UAAU,OAAO,CAAC,YAAY,EAAE,CACxD,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CACzC,IAAI,EACJ,CAAC,IAAI,EAAE,YAAY,CAAC,EACpB,KAAK,EACL,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,uBAAuB,EAAE,CAClC,CAAC;IACF,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CACV,iBAAiB,YAAY,OAAO,OAAO,CAAC,YAAY,KAAK,MAAM,EAAE,CACtE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC","debug_id":"51fb8c4b-3d99-562c-875b-53308a68b718"}
|