locadex 0.1.14-alpha.4 → 0.1.14-alpha.6

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,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]="a14f788a-86ac-5858-a5a8-21c1ba4a5eb4")}catch(e){}}();
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]="7e6f1a90-3beb-58b3-974b-b40d26a25776")}catch(e){}}();
3
3
  import { logger } from '../../logging/logger.js';
4
4
  import { execFunction } from '../../utils/exec.js';
5
5
  export function addValidateProjectTool(server, appDirectory) {
@@ -8,15 +8,15 @@ export function addValidateProjectTool(server, appDirectory) {
8
8
  const { stdout, stderr, code } = await execFunction('locadex', ['validate'], false, appDirectory, undefined, 1 * 60 * 1000 // 1 minute
9
9
  );
10
10
  if (code === 0) {
11
- logger.log(`[locadex-mcp: validate] Successfully validated project: ${stdout}`);
11
+ logger.log(`[locadex-mcp: validate] Successfully validated project: ${stdout} ${stderr}`);
12
12
  return {
13
- content: [{ type: 'text', text: stdout }],
13
+ content: [{ type: 'text', text: stdout + stderr }],
14
14
  };
15
15
  }
16
16
  else {
17
- logger.log(`[locadex-mcp: validate] Error validating project: ${stdout} with code ${code}`);
17
+ logger.log(`[locadex-mcp: validate] Error validating project: ${stdout} ${stderr} with code ${code}`);
18
18
  return {
19
- content: [{ type: 'text', text: stdout }],
19
+ content: [{ type: 'text', text: stdout + stderr }],
20
20
  };
21
21
  }
22
22
  }
@@ -34,4 +34,4 @@ export function addValidateProjectTool(server, appDirectory) {
34
34
  });
35
35
  }
36
36
  //# sourceMappingURL=validate.js.map
37
- //# debugId=a14f788a-86ac-5858-a5a8-21c1ba4a5eb4
37
+ //# debugId=7e6f1a90-3beb-58b3-974b-b40d26a25776
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sources":["mcp/tools/validate.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { logger } from '../../logging/logger.js';\nimport { execFunction } from '../../utils/exec.js';\n\nexport function addValidateProjectTool(\n server: McpServer,\n appDirectory: string\n) {\n server.tool(\n 'validate-project',\n 'Validates a project for internationalization errors',\n {},\n async () => {\n try {\n const { stdout, stderr, code } = await execFunction(\n 'locadex',\n ['validate'],\n false,\n appDirectory,\n undefined,\n 1 * 60 * 1000 // 1 minute\n );\n if (code === 0) {\n logger.log(\n `[locadex-mcp: validate] Successfully validated project: ${stdout}`\n );\n return {\n content: [{ type: 'text', text: stdout }],\n };\n } else {\n logger.log(\n `[locadex-mcp: validate] Error validating project: ${stdout} with code ${code}`\n );\n return {\n content: [{ type: 'text', text: stdout }],\n };\n }\n } catch (error) {\n logger.log(\n `[locadex-mcp: validate] Error validating project: ${error instanceof Error ? error.message : String(error)}`\n );\n return {\n content: [\n {\n type: 'text',\n text: `Error validating project: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n };\n }\n }\n );\n}\n"],"names":[],"mappings":";;AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,YAAoB;IAEpB,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,qDAAqD,EACrD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CACjD,SAAS,EACT,CAAC,UAAU,CAAC,EACZ,KAAK,EACL,YAAY,EACZ,SAAS,EACT,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW;aAC1B,CAAC;YACF,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,CACR,2DAA2D,MAAM,EAAE,CACpE,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iBAC1C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CACR,qDAAqD,MAAM,cAAc,IAAI,EAAE,CAChF,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iBAC1C,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,CACR,qDAAqD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9G,CAAC;YACF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC5F;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","debug_id":"a14f788a-86ac-5858-a5a8-21c1ba4a5eb4"}
1
+ {"version":3,"file":"validate.js","sources":["mcp/tools/validate.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { logger } from '../../logging/logger.js';\nimport { execFunction } from '../../utils/exec.js';\n\nexport function addValidateProjectTool(\n server: McpServer,\n appDirectory: string\n) {\n server.tool(\n 'validate-project',\n 'Validates a project for internationalization errors',\n {},\n async () => {\n try {\n const { stdout, stderr, code } = await execFunction(\n 'locadex',\n ['validate'],\n false,\n appDirectory,\n undefined,\n 1 * 60 * 1000 // 1 minute\n );\n if (code === 0) {\n logger.log(\n `[locadex-mcp: validate] Successfully validated project: ${stdout} ${stderr}`\n );\n return {\n content: [{ type: 'text', text: stdout + stderr }],\n };\n } else {\n logger.log(\n `[locadex-mcp: validate] Error validating project: ${stdout} ${stderr} with code ${code}`\n );\n return {\n content: [{ type: 'text', text: stdout + stderr }],\n };\n }\n } catch (error) {\n logger.log(\n `[locadex-mcp: validate] Error validating project: ${error instanceof Error ? error.message : String(error)}`\n );\n return {\n content: [\n {\n type: 'text',\n text: `Error validating project: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n };\n }\n }\n );\n}\n"],"names":[],"mappings":";;AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,YAAoB;IAEpB,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,qDAAqD,EACrD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CACjD,SAAS,EACT,CAAC,UAAU,CAAC,EACZ,KAAK,EACL,YAAY,EACZ,SAAS,EACT,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW;aAC1B,CAAC;YACF,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,CACR,2DAA2D,MAAM,IAAI,MAAM,EAAE,CAC9E,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;iBACnD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CACR,qDAAqD,MAAM,IAAI,MAAM,cAAc,IAAI,EAAE,CAC1F,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;iBACnD,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,CACR,qDAAqD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9G,CAAC;YACF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC5F;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC","debug_id":"7e6f1a90-3beb-58b3-974b-b40d26a25776"}
@@ -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;IAad;;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;IAuEvB,cAAc,IAAI,MAAM;CAGzB"}
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;IAaV,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"}
@@ -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]="4f0c7990-b29f-559e-b1de-72967bf9f72c")}catch(e){}}();
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]="86618cc7-0a6d-5348-b80c-66ed3ccf8e4d")}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';
@@ -59,6 +59,7 @@ export class ClaudeCodeRunner {
59
59
  this.resetStats();
60
60
  }
61
61
  resetStats() {
62
+ this.aggregateStats();
62
63
  this.stats = {
63
64
  cost: 0,
64
65
  wallDuration: 0,
@@ -71,6 +72,7 @@ export class ClaudeCodeRunner {
71
72
  };
72
73
  }
73
74
  aggregateStats() {
75
+ logger.verboseMessage(`[${this.id}] Aggregating stats.\nCost: $${this.stats.cost.toFixed(2)}\nDuration: ${this.stats.wallDuration / 1000}s`);
74
76
  this.manager.stats.updateStats({
75
77
  newCost: this.stats.cost,
76
78
  newWallDuration: this.stats.wallDuration,
@@ -312,10 +314,10 @@ export class ClaudeCodeRunner {
312
314
  this.stats.turns = outputData.num_turns;
313
315
  this.turns = outputData.num_turns;
314
316
  if (!outputData.is_error) {
315
- logger.verboseMessage(`[${this.id}] finished task.\nCost: $${outputData.total_cost_usd.toFixed(2)}\nDuration: ${outputData.duration_ms / 1000}s`);
317
+ logger.verboseMessage(`[${this.id}] finished task.`);
316
318
  }
317
319
  else {
318
- logger.verboseMessage(`[${this.id}] finished task with error: ${outputData.subtype}\nCost: $${outputData.total_cost_usd}\nDuration: ${outputData.duration_ms / 1000}s`);
320
+ logger.verboseMessage(`[${this.id}] finished task with error: ${outputData.subtype}`);
319
321
  return {
320
322
  success: false,
321
323
  error: outputData.subtype,
@@ -339,4 +341,4 @@ export class ClaudeCodeRunner {
339
341
  }
340
342
  }
341
343
  //# sourceMappingURL=claudeCode.js.map
342
- //# debugId=4f0c7990-b29f-559e-b1de-72967bf9f72c
344
+ //# debugId=86618cc7-0a6d-5348-b80c-66ed3ccf8e4d
@@ -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.aggregateStats();\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":"86618cc7-0a6d-5348-b80c-66ed3ccf8e4d"}
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"/","sources":["utils/exec.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,GAAE,OAAc,EAC1B,GAAG,GAAE,MAAsB,EAC3B,qBAAqB,CAAC,EAAE,eAAe,EACvC,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoE3D"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"/","sources":["utils/exec.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,GAAE,OAAc,EAC1B,GAAG,GAAE,MAAsB,EAC3B,qBAAqB,CAAC,EAAE,eAAe,EACvC,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAsE3D"}
@@ -1,8 +1,10 @@
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]="07edb598-972a-53b2-9b4a-9b9a381a250f")}catch(e){}}();
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]="0051b367-ed4a-5b80-bc98-b49b64a0f46e")}catch(e){}}();
3
3
  import chalk from 'chalk';
4
4
  import { spawn } from 'node:child_process';
5
5
  import { logger } from '../logging/logger.js';
6
+ // Utility function for executing a command and returning the output (and error)
7
+ // If pipeStdout is true, the output will be logged to the console
6
8
  export async function execFunction(command, args, pipeStdout = true, cwd = process.cwd(), parentAbortController, timeoutMs = 5 * 60 * 1000) {
7
9
  return new Promise((resolve, reject) => {
8
10
  const abortController = new AbortController();
@@ -18,20 +20,18 @@ export async function execFunction(command, args, pipeStdout = true, cwd = proce
18
20
  cwd,
19
21
  signal: abortController.signal,
20
22
  });
21
- let stdoutOutput = '';
22
- let errorOutput = '';
23
+ let stdOutOutput = '';
24
+ let stdErrOutput = '';
23
25
  const timeout = global.setTimeout(() => {
24
26
  abortController.abort();
25
27
  reject(new Error(`Process timed out after ${timeoutMs / 1000}s`));
26
28
  }, timeoutMs);
27
- if (childProcess.stderr) {
28
- childProcess.stderr.on('data', (data) => {
29
- errorOutput += data.toString();
30
- });
31
- }
29
+ childProcess.stderr.on('data', (data) => {
30
+ stdErrOutput += data.toString();
31
+ });
32
32
  childProcess.stdout.on('data', (data) => {
33
33
  const output = data.toString();
34
- stdoutOutput += output;
34
+ stdOutOutput += output;
35
35
  if (!pipeStdout) {
36
36
  logger.log(output);
37
37
  }
@@ -47,17 +47,17 @@ export async function execFunction(command, args, pipeStdout = true, cwd = proce
47
47
  childProcess.on('close', (code) => {
48
48
  global.clearTimeout(timeout);
49
49
  if (code === 0) {
50
- resolve({ stdout: stdoutOutput, stderr: errorOutput, code });
50
+ resolve({ stdout: stdOutOutput, stderr: stdErrOutput, code });
51
51
  }
52
52
  else {
53
- logger.log(chalk.red(`${command} failed with exit code ${code}`));
54
- if (errorOutput) {
55
- logger.log(chalk.red(`Error details: ${errorOutput}`));
53
+ logger.log(chalk.red(`${command} ${args.join(' ')} failed with exit code ${code} in ${cwd}`));
54
+ if (stdErrOutput) {
55
+ logger.log(chalk.red(`Error details: ${stdErrOutput}`));
56
56
  }
57
57
  // reject with the most recent output
58
58
  resolve({
59
- stdout: stdoutOutput,
60
- stderr: errorOutput,
59
+ stdout: stdOutOutput,
60
+ stderr: stdErrOutput,
61
61
  code: code ?? 1,
62
62
  });
63
63
  }
@@ -65,4 +65,4 @@ export async function execFunction(command, args, pipeStdout = true, cwd = proce
65
65
  });
66
66
  }
67
67
  //# sourceMappingURL=exec.js.map
68
- //# debugId=07edb598-972a-53b2-9b4a-9b9a381a250f
68
+ //# debugId=0051b367-ed4a-5b80-bc98-b49b64a0f46e
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sources":["utils/exec.ts"],"sourceRoot":"/","sourcesContent":["import chalk from 'chalk';\nimport { spawn } from 'node:child_process';\nimport { logger } from '../logging/logger.js';\n\nexport async function execFunction(\n command: string,\n args: string[],\n pipeStdout: boolean = true,\n cwd: string = process.cwd(),\n parentAbortController?: AbortController,\n timeoutMs: number = 5 * 60 * 1000\n): Promise<{ stdout: string; stderr: string; code: number }> {\n return new Promise<{ stdout: string; stderr: string; code: number }>(\n (resolve, reject) => {\n const abortController = new AbortController();\n\n // Listen for parent abort signal\n if (parentAbortController) {\n parentAbortController.signal.addEventListener('abort', () => {\n abortController.abort();\n reject(new Error('Process aborted by parent'));\n });\n }\n\n const childProcess = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd,\n signal: abortController.signal,\n });\n\n let stdoutOutput = '';\n let errorOutput = '';\n\n const timeout = global.setTimeout(() => {\n abortController.abort();\n reject(new Error(`Process timed out after ${timeoutMs / 1000}s`));\n }, timeoutMs);\n\n if (childProcess.stderr) {\n childProcess.stderr.on('data', (data) => {\n errorOutput += data.toString();\n });\n }\n\n childProcess.stdout.on('data', (data) => {\n const output = data.toString();\n stdoutOutput += output;\n if (!pipeStdout) {\n logger.log(output);\n } else {\n // eslint-disable-next-line no-console\n console.log(output);\n }\n });\n\n childProcess.on('error', (error) => {\n global.clearTimeout(timeout);\n reject(error);\n });\n\n childProcess.on('close', (code) => {\n global.clearTimeout(timeout);\n if (code === 0) {\n resolve({ stdout: stdoutOutput, stderr: errorOutput, code });\n } else {\n logger.log(chalk.red(`${command} failed with exit code ${code}`));\n if (errorOutput) {\n logger.log(chalk.red(`Error details: ${errorOutput}`));\n }\n // reject with the most recent output\n resolve({\n stdout: stdoutOutput,\n stderr: errorOutput,\n code: code ?? 1,\n });\n }\n });\n }\n );\n}\n"],"names":[],"mappings":"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","debug_id":"07edb598-972a-53b2-9b4a-9b9a381a250f"}
1
+ {"version":3,"file":"exec.js","sources":["utils/exec.ts"],"sourceRoot":"/","sourcesContent":["import chalk from 'chalk';\nimport { spawn } from 'node:child_process';\nimport { logger } from '../logging/logger.js';\n\n// Utility function for executing a command and returning the output (and error)\n// If pipeStdout is true, the output will be logged to the console\nexport async function execFunction(\n command: string,\n args: string[],\n pipeStdout: boolean = true,\n cwd: string = process.cwd(),\n parentAbortController?: AbortController,\n timeoutMs: number = 5 * 60 * 1000\n): Promise<{ stdout: string; stderr: string; code: number }> {\n return new Promise<{ stdout: string; stderr: string; code: number }>(\n (resolve, reject) => {\n const abortController = new AbortController();\n\n // Listen for parent abort signal\n if (parentAbortController) {\n parentAbortController.signal.addEventListener('abort', () => {\n abortController.abort();\n reject(new Error('Process aborted by parent'));\n });\n }\n\n const childProcess = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd,\n signal: abortController.signal,\n });\n\n let stdOutOutput = '';\n let stdErrOutput = '';\n\n const timeout = global.setTimeout(() => {\n abortController.abort();\n reject(new Error(`Process timed out after ${timeoutMs / 1000}s`));\n }, timeoutMs);\n\n childProcess.stderr.on('data', (data) => {\n stdErrOutput += data.toString();\n });\n\n childProcess.stdout.on('data', (data) => {\n const output = data.toString();\n stdOutOutput += output;\n if (!pipeStdout) {\n logger.log(output);\n } else {\n // eslint-disable-next-line no-console\n console.log(output);\n }\n });\n\n childProcess.on('error', (error) => {\n global.clearTimeout(timeout);\n reject(error);\n });\n\n childProcess.on('close', (code) => {\n global.clearTimeout(timeout);\n if (code === 0) {\n resolve({ stdout: stdOutOutput, stderr: stdErrOutput, code });\n } else {\n logger.log(\n chalk.red(\n `${command} ${args.join(' ')} failed with exit code ${code} in ${cwd}`\n )\n );\n if (stdErrOutput) {\n logger.log(chalk.red(`Error details: ${stdErrOutput}`));\n }\n // reject with the most recent output\n resolve({\n stdout: stdOutOutput,\n stderr: stdErrOutput,\n code: code ?? 1,\n });\n }\n });\n }\n );\n}\n"],"names":[],"mappings":"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","debug_id":"0051b367-ed4a-5b80-bc98-b49b64a0f46e"}
@@ -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,iBAgBrE"}
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]="4b30a274-b8fe-56a4-ae09-702133cbcaa3")}catch(e){}}();
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 '${cmd}': ${stderr}`);
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=4b30a274-b8fe-56a4-ae09-702133cbcaa3
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 '${cmd}': ${stderr}`);\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,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,CAAC,kBAAkB,GAAG,MAAM,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC","debug_id":"4b30a274-b8fe-56a4-ae09-702133cbcaa3"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "locadex",
3
- "version": "0.1.14-alpha.4",
3
+ "version": "0.1.14-alpha.6",
4
4
  "description": "An AI agent for internationalization",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",