locadex 0.0.2-alpha.1 → 0.0.2-alpha.4

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.
Files changed (150) hide show
  1. package/.locadex-mcp-stdio.json +9 -0
  2. package/.locadex-mcp.json +2 -3
  3. package/LICENSE.md +1 -1
  4. package/dist/cli.d.ts +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +44 -9
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/i18n.d.ts +2 -1
  9. package/dist/commands/i18n.d.ts.map +1 -1
  10. package/dist/commands/i18n.js +255 -140
  11. package/dist/commands/i18n.js.map +1 -1
  12. package/dist/commands/setup.d.ts +1 -1
  13. package/dist/commands/setup.d.ts.map +1 -1
  14. package/dist/commands/setup.js +141 -86
  15. package/dist/commands/setup.js.map +1 -1
  16. package/dist/index.d.ts +0 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +5 -68
  19. package/dist/index.js.map +1 -1
  20. package/dist/{utils/logging.d.ts → logging/console.d.ts} +9 -12
  21. package/dist/logging/console.d.ts.map +1 -0
  22. package/dist/logging/console.js +137 -0
  23. package/dist/logging/console.js.map +1 -0
  24. package/dist/logging/logger.d.ts +44 -0
  25. package/dist/logging/logger.d.ts.map +1 -0
  26. package/dist/logging/logger.js +142 -0
  27. package/dist/logging/logger.js.map +1 -0
  28. package/dist/mcp/debugger.d.ts +3 -0
  29. package/dist/mcp/debugger.d.ts.map +1 -0
  30. package/dist/mcp/debugger.js +37 -0
  31. package/dist/mcp/debugger.js.map +1 -0
  32. package/dist/mcp/getDocs.d.ts.map +1 -0
  33. package/dist/mcp/getDocs.js +56 -0
  34. package/dist/mcp/getDocs.js.map +1 -0
  35. package/dist/mcp/getGuide.d.ts +5 -0
  36. package/dist/mcp/getGuide.d.ts.map +1 -0
  37. package/dist/mcp/getGuide.js +17 -0
  38. package/dist/mcp/getGuide.js.map +1 -0
  39. package/dist/{tools → mcp/tools}/docs.d.ts +3 -0
  40. package/dist/mcp/tools/docs.d.ts.map +1 -0
  41. package/dist/mcp/tools/docs.js +86 -0
  42. package/dist/mcp/tools/docs.js.map +1 -0
  43. package/dist/mcp/tools/guides.d.ts +11 -0
  44. package/dist/mcp/tools/guides.d.ts.map +1 -0
  45. package/dist/mcp/tools/guides.js +118 -0
  46. package/dist/mcp/tools/guides.js.map +1 -0
  47. package/dist/mcp-sse.d.ts +3 -0
  48. package/dist/mcp-sse.d.ts.map +1 -0
  49. package/dist/mcp-sse.js +95 -0
  50. package/dist/mcp-sse.js.map +1 -0
  51. package/dist/mcp.d.ts +3 -0
  52. package/dist/mcp.d.ts.map +1 -0
  53. package/dist/mcp.js +34 -0
  54. package/dist/mcp.js.map +1 -0
  55. package/dist/prompts/system.d.ts +4 -0
  56. package/dist/prompts/system.d.ts.map +1 -0
  57. package/dist/prompts/system.js +17 -0
  58. package/dist/prompts/system.js.map +1 -0
  59. package/dist/telemetry.d.ts +11 -0
  60. package/dist/telemetry.d.ts.map +1 -0
  61. package/dist/telemetry.js +104 -0
  62. package/dist/telemetry.js.map +1 -0
  63. package/dist/types/claude-sdk.d.ts +39 -0
  64. package/dist/types/claude-sdk.d.ts.map +1 -0
  65. package/dist/types/claude-sdk.js +5 -0
  66. package/dist/types/claude-sdk.js.map +1 -0
  67. package/dist/types/cli.d.ts +7 -0
  68. package/dist/types/cli.d.ts.map +1 -0
  69. package/dist/types/cli.js +5 -0
  70. package/dist/types/cli.js.map +1 -0
  71. package/dist/utils/agentManager.d.ts +34 -0
  72. package/dist/utils/agentManager.d.ts.map +1 -0
  73. package/dist/utils/agentManager.js +123 -0
  74. package/dist/utils/agentManager.js.map +1 -0
  75. package/dist/utils/claudeCode.d.ts +14 -6
  76. package/dist/utils/claudeCode.d.ts.map +1 -1
  77. package/dist/utils/claudeCode.js +170 -102
  78. package/dist/utils/claudeCode.js.map +1 -1
  79. package/dist/utils/dag/createDag.d.ts +24 -0
  80. package/dist/utils/dag/createDag.d.ts.map +1 -0
  81. package/dist/utils/dag/createDag.js +181 -0
  82. package/dist/utils/dag/createDag.js.map +1 -0
  83. package/dist/utils/debugLogger.d.ts +3 -0
  84. package/dist/utils/debugLogger.d.ts.map +1 -0
  85. package/dist/utils/debugLogger.js +36 -0
  86. package/dist/utils/debugLogger.js.map +1 -0
  87. package/dist/utils/fs/findConfigs.d.ts +11 -0
  88. package/dist/utils/fs/findConfigs.d.ts.map +1 -0
  89. package/dist/utils/fs/findConfigs.js +63 -0
  90. package/dist/utils/fs/findConfigs.js.map +1 -0
  91. package/dist/utils/fs/getFiles.d.ts +2 -0
  92. package/dist/utils/fs/getFiles.d.ts.map +1 -0
  93. package/dist/utils/fs/getFiles.js +8 -0
  94. package/dist/utils/fs/getFiles.js.map +1 -0
  95. package/dist/utils/fs/writeFiles.d.ts +2 -0
  96. package/dist/utils/fs/writeFiles.d.ts.map +1 -0
  97. package/dist/utils/fs/writeFiles.js +19 -0
  98. package/dist/utils/fs/writeFiles.js.map +1 -0
  99. package/dist/utils/getFiles.d.ts +30 -0
  100. package/dist/utils/getFiles.d.ts.map +1 -0
  101. package/dist/utils/getFiles.js +152 -0
  102. package/dist/utils/getFiles.js.map +1 -0
  103. package/dist/utils/getPaths.d.ts +1 -0
  104. package/dist/utils/getPaths.d.ts.map +1 -1
  105. package/dist/utils/getPaths.js +19 -3
  106. package/dist/utils/getPaths.js.map +1 -1
  107. package/dist/utils/mcpConfig.d.ts.map +1 -1
  108. package/dist/utils/mcpConfig.js +5 -2
  109. package/dist/utils/mcpConfig.js.map +1 -1
  110. package/dist/utils/shared.d.ts +4 -0
  111. package/dist/utils/shared.d.ts.map +1 -0
  112. package/dist/utils/shared.js +26 -0
  113. package/dist/utils/shared.js.map +1 -0
  114. package/dist/utils/stats.d.ts +25 -0
  115. package/dist/utils/stats.d.ts.map +1 -0
  116. package/dist/utils/stats.js +40 -0
  117. package/dist/utils/stats.js.map +1 -0
  118. package/dist/utils/validateConfig.d.ts +2 -0
  119. package/dist/utils/validateConfig.d.ts.map +1 -0
  120. package/dist/utils/validateConfig.js +12 -0
  121. package/dist/utils/validateConfig.js.map +1 -0
  122. package/guides/next/advanced/complicated-mapping-expressions.md +200 -0
  123. package/guides/next/advanced/interpolated-strings.md +162 -0
  124. package/guides/next/advanced/migrating.md +86 -0
  125. package/guides/next/advanced/ternary-operators.md +217 -0
  126. package/guides/next/advanced/var-outside-client-component.md +446 -0
  127. package/guides/next/advanced/var-outside-client-server-component.md +550 -0
  128. package/guides/next/advanced/var-outside-server-component.md +545 -0
  129. package/guides/next/basic/branches.md +310 -0
  130. package/guides/next/basic/client-side-components.md +221 -0
  131. package/guides/next/basic/jsx.md +268 -0
  132. package/guides/next/basic/server-side-components.md +165 -0
  133. package/guides/next/basic/strings.md +144 -0
  134. package/guides/next/basic/variables.md +161 -0
  135. package/guides/next/important/functions.md +37 -0
  136. package/package.json +27 -13
  137. package/dist/resources/docs.d.ts +0 -4
  138. package/dist/resources/docs.d.ts.map +0 -1
  139. package/dist/resources/docs.js +0 -176
  140. package/dist/resources/docs.js.map +0 -1
  141. package/dist/tools/docs.d.ts.map +0 -1
  142. package/dist/tools/docs.js +0 -140
  143. package/dist/tools/docs.js.map +0 -1
  144. package/dist/utils/getDocs.d.ts.map +0 -1
  145. package/dist/utils/getDocs.js +0 -113
  146. package/dist/utils/getDocs.js.map +0 -1
  147. package/dist/utils/logging.d.ts.map +0 -1
  148. package/dist/utils/logging.js +0 -226
  149. package/dist/utils/logging.js.map +0 -1
  150. /package/dist/{utils → mcp}/getDocs.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"claudeCode.d.ts","sourceRoot":"","sources":["../../src/utils/claudeCode.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,OAAO;gBAAP,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAS/C,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CA4DvD"}
1
+ {"version":3,"file":"claudeCode.d.ts","sourceRoot":"/","sources":["utils/claudeCode.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;CAAG;AAmCzC,qBAAa,gBAAgB;IAOzB,OAAO,CAAC,OAAO;IANjB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAAiB;gBAG9B,OAAO,EAAE,cAAc,EACf,OAAO,GAAE;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;KACf;IAgBR,YAAY,IAAI,MAAM;IAIhB,GAAG,CACP,OAAO,EAAE,iBAAiB,EAC1B,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAAC,MAAM,CAAC;IA4FlB,OAAO,CAAC,eAAe;CAiExB"}
@@ -1,114 +1,182 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
- return new (P || (P = Promise))(function (resolve, reject) {
15
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
- step((generator = generator.apply(thisArg, _arguments || [])).next());
19
- });
20
- };
21
- var __generator = (this && this.__generator) || function (thisArg, body) {
22
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
23
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
- function verb(n) { return function (v) { return step([n, v]); }; }
25
- function step(op) {
26
- if (f) throw new TypeError("Generator is already executing.");
27
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
- if (y = 0, t) op = [op[0] & 2, t.value];
30
- switch (op[0]) {
31
- case 0: case 1: t = op; break;
32
- case 4: _.label++; return { value: op[1], done: false };
33
- case 5: _.label++; y = op[1]; op = [0]; continue;
34
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
- default:
36
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
- if (t[2]) _.ops.pop();
41
- _.trys.pop(); continue;
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]="241bc31c-ad73-55df-abfe-d38afdd90259")}catch(e){}}();
3
+ import { spawn } from 'node:child_process';
4
+ import { createHash } from 'node:crypto';
5
+ import { guides } from '../mcp/tools/guides.js';
6
+ import { logger } from '../logging/logger.js';
7
+ import { posthog } from '../telemetry.js';
8
+ const DEFAULT_ALLOWED_TOOLS = [
9
+ 'mcp__locadex__fetch-docs',
10
+ 'mcp__locadex__list-docs',
11
+ 'Bash',
12
+ 'Edit',
13
+ 'MultiEdit',
14
+ 'Write',
15
+ ].concat(guides.map((guide) => `mcp__locadex__${guide.id}`));
16
+ const DISALLOWED_TOOLS = ['NotebookEdit', 'WebFetch', 'WebSearch'];
17
+ // Global tracking of all Claude processes
18
+ const activeClaudeProcesses = new Set();
19
+ // Setup global process termination handlers once
20
+ let handlersSetup = false;
21
+ const setupProcessHandlers = () => {
22
+ if (handlersSetup)
23
+ return;
24
+ handlersSetup = true;
25
+ const killAllClaudeProcesses = () => {
26
+ activeClaudeProcesses.forEach((proc) => {
27
+ if (!proc.killed) {
28
+ proc.kill('SIGTERM');
42
29
  }
43
- op = body.call(thisArg, _);
44
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
- }
30
+ });
31
+ activeClaudeProcesses.clear();
32
+ };
33
+ process.on('SIGINT', killAllClaudeProcesses);
34
+ process.on('SIGTERM', killAllClaudeProcesses);
47
35
  };
48
- import { spawn } from 'node:child_process';
49
- var ClaudeCodeRunner = /** @class */ (function () {
50
- function ClaudeCodeRunner(options) {
51
- if (options === void 0) { options = {}; }
36
+ export class ClaudeCodeRunner {
37
+ options;
38
+ sessionId = '';
39
+ mcpConfig;
40
+ manager;
41
+ constructor(manager, options = {}) {
52
42
  this.options = options;
43
+ this.manager = manager;
44
+ this.mcpConfig = options.mcpConfig;
53
45
  // Ensure API key is set
54
46
  if (!process.env.ANTHROPIC_API_KEY && !this.options.apiKey) {
55
47
  throw new Error('ANTHROPIC_API_KEY environment variable or apiKey option is required');
56
48
  }
49
+ // Setup global process handlers
50
+ setupProcessHandlers();
57
51
  }
58
- ClaudeCodeRunner.prototype.run = function (options) {
59
- return __awaiter(this, void 0, void 0, function () {
60
- var _this = this;
61
- return __generator(this, function (_a) {
62
- return [2 /*return*/, new Promise(function (resolve, reject) {
63
- var _a, _b;
64
- var args = ['-p', options.prompt];
65
- if (options.systemPrompt) {
66
- args.push('--system-prompt', options.systemPrompt);
67
- }
68
- if (options.outputFormat) {
69
- args.push('--output-format', options.outputFormat);
70
- }
71
- if (options.mcpConfig) {
72
- args.push('--mcp-config', options.mcpConfig);
73
- }
74
- if (options.allowedTools) {
75
- args.push('--allowedTools', options.allowedTools.join(','));
76
- }
77
- if (options.maxTurns) {
78
- args.push('--max-turns', options.maxTurns.toString());
52
+ getSessionId() {
53
+ return this.sessionId;
54
+ }
55
+ async run(options, obs) {
56
+ return new Promise((resolve, reject) => {
57
+ const args = ['-p', options.prompt];
58
+ if (options.additionalSystemPrompt) {
59
+ args.push('--append-system-prompt', options.additionalSystemPrompt);
60
+ }
61
+ args.push('--output-format', 'stream-json');
62
+ args.push('--verbose');
63
+ if (options.sessionId) {
64
+ args.push('--resume', options.sessionId);
65
+ }
66
+ if (this.mcpConfig) {
67
+ args.push('--mcp-config', this.mcpConfig);
68
+ }
69
+ args.push('--allowedTools', [
70
+ ...DEFAULT_ALLOWED_TOOLS,
71
+ ...(options?.additionalAllowedTools || []),
72
+ ].join(','));
73
+ args.push('--disallowedTools', DISALLOWED_TOOLS.join(','));
74
+ if (options.maxTurns) {
75
+ args.push('--max-turns', options.maxTurns.toString());
76
+ }
77
+ const env = { ...process.env };
78
+ if (this.options.apiKey) {
79
+ env.ANTHROPIC_API_KEY = this.options.apiKey;
80
+ }
81
+ const claude = spawn('npx', ['claude', ...args], {
82
+ stdio: ['inherit', 'pipe', 'pipe'],
83
+ env,
84
+ });
85
+ activeClaudeProcesses.add(claude);
86
+ const output = '';
87
+ const errorOutput = '';
88
+ let buffer = '';
89
+ claude.stdout?.on('data', (data) => {
90
+ buffer += data.toString();
91
+ const lines = buffer.split('\n');
92
+ // Keep the last incomplete line in buffer
93
+ buffer = lines.pop() || '';
94
+ for (const line of lines) {
95
+ if (line.trim()) {
96
+ try {
97
+ logger.debugMessage(`[Claude Code SDK] ${line}`);
98
+ const outputData = JSON.parse(line);
99
+ this.handleSDKOutput(outputData, obs);
79
100
  }
80
- var env = __assign({}, process.env);
81
- if (_this.options.apiKey) {
82
- env.ANTHROPIC_API_KEY = _this.options.apiKey;
101
+ catch (error) {
102
+ logger.debugMessage(`[Claude Code SDK] Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`);
83
103
  }
84
- var claude = spawn('claude', args, {
85
- stdio: ['inherit', 'pipe', 'pipe'],
86
- env: env,
87
- });
88
- var output = '';
89
- var errorOutput = '';
90
- (_a = claude.stdout) === null || _a === void 0 ? void 0 : _a.on('data', function (data) {
91
- output += data.toString();
92
- });
93
- (_b = claude.stderr) === null || _b === void 0 ? void 0 : _b.on('data', function (data) {
94
- errorOutput += data.toString();
95
- });
96
- claude.on('close', function (code) {
97
- if (code === 0) {
98
- resolve(output.trim());
99
- }
100
- else {
101
- reject(new Error("Claude Code exited with code ".concat(code, ": ").concat(errorOutput)));
102
- }
103
- });
104
- claude.on('error', function (error) {
105
- reject(new Error("Failed to run Claude Code: ".concat(error.message)));
106
- });
107
- })];
104
+ }
105
+ }
106
+ });
107
+ claude.stderr?.on('data', () => {
108
+ logger.warning('An error occurred while running Claude Code');
109
+ });
110
+ claude.on('close', (code) => {
111
+ activeClaudeProcesses.delete(claude);
112
+ if (code === 0) {
113
+ resolve(output.trim());
114
+ }
115
+ else {
116
+ reject(new Error(`Claude Code exited with code ${code}: ${errorOutput}`));
117
+ }
118
+ });
119
+ claude.on('error', (error) => {
120
+ activeClaudeProcesses.delete(claude);
121
+ reject(new Error(`Failed to run Claude Code: ${error.message}`));
108
122
  });
109
123
  });
110
- };
111
- return ClaudeCodeRunner;
112
- }());
113
- export { ClaudeCodeRunner };
114
- //# sourceMappingURL=claudeCode.js.map
124
+ }
125
+ handleSDKOutput(outputData, obs) {
126
+ if (outputData.type === 'assistant') {
127
+ const text = [];
128
+ const toolUses = [];
129
+ outputData.message.content.forEach((c) => {
130
+ if (c.type === 'text') {
131
+ text.push(c.text);
132
+ }
133
+ if (c.type === 'tool_use') {
134
+ toolUses.push(c.name);
135
+ if (c.name.startsWith('mcp__locadex__')) {
136
+ posthog.capture({
137
+ distinctId: this.sessionId
138
+ ? createHash('sha256')
139
+ .update(this.sessionId)
140
+ .digest('base64url')
141
+ .slice(0, 8)
142
+ : 'anonymous',
143
+ event: 'tool_used',
144
+ properties: {
145
+ tool: c.name,
146
+ },
147
+ });
148
+ }
149
+ }
150
+ });
151
+ if (text.length > 0) {
152
+ logger.verboseMessage(text.join('').trim());
153
+ }
154
+ if (toolUses.length > 0) {
155
+ logger.debugMessage(`[Claude Code SDK] Used tools: ${toolUses.join(', ')}`);
156
+ }
157
+ this.manager.stats.updateStats({
158
+ newToolCalls: toolUses.length,
159
+ });
160
+ }
161
+ else if (outputData.type === 'result') {
162
+ if (!outputData.is_error) {
163
+ logger.verboseMessage(`[Claude Code SDK] Finished\nCost: $${Number(outputData.cost_usd).toFixed(2)}\nDuration: ${Number(outputData.duration_ms) / 1000}s`);
164
+ }
165
+ else {
166
+ logger.verboseMessage(`[Claude Code SDK] Finished with error: ${outputData.subtype}\nCost: $${outputData.cost_usd}\nDuration: ${Number(outputData.duration_ms) / 1000}s`);
167
+ }
168
+ this.manager.stats.updateStats({
169
+ newCost: Number(outputData.cost_usd),
170
+ newWallDuration: Number(outputData.duration_ms),
171
+ newApiDuration: Number(outputData.duration_api_ms),
172
+ });
173
+ }
174
+ else if (outputData.type === 'system') {
175
+ if (outputData.subtype === 'init') {
176
+ this.sessionId = outputData.session_id;
177
+ }
178
+ }
179
+ }
180
+ }
181
+ //# sourceMappingURL=claudeCode.js.map
182
+ //# debugId=241bc31c-ad73-55df-abfe-d38afdd90259
@@ -1 +1 @@
1
- {"version":3,"file":"claudeCode.js","sourceRoot":"","sources":["../../src/utils/claudeCode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claudeCode.js","sources":["utils/claudeCode.ts"],"sourceRoot":"/","sourcesContent":["import { spawn } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { ClaudeSDKMessage } from '../types/claude-sdk.js';\nimport { guides } from '../mcp/tools/guides.js';\nimport { SpinnerResult } from '@clack/prompts';\nimport { logger } from '../logging/logger.js';\nimport { posthog } from '../telemetry.js';\nimport { LocadexManager } from './agentManager.js';\n\nexport interface ClaudeCodeOptions {\n additionalSystemPrompt?: string;\n prompt: string;\n additionalAllowedTools?: string[];\n maxTurns?: number;\n sessionId?: string;\n}\n\nexport interface ClaudeCodeObservation {}\n\nconst DEFAULT_ALLOWED_TOOLS = [\n 'mcp__locadex__fetch-docs',\n 'mcp__locadex__list-docs',\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\n// Global tracking of all Claude processes\nconst activeClaudeProcesses = new Set<any>();\n\n// Setup global process termination handlers once\nlet handlersSetup = false;\nconst setupProcessHandlers = () => {\n if (handlersSetup) return;\n handlersSetup = true;\n\n const killAllClaudeProcesses = () => {\n activeClaudeProcesses.forEach((proc) => {\n if (!proc.killed) {\n proc.kill('SIGTERM');\n }\n });\n activeClaudeProcesses.clear();\n };\n\n process.on('SIGINT', killAllClaudeProcesses);\n process.on('SIGTERM', killAllClaudeProcesses);\n};\n\nexport class ClaudeCodeRunner {\n private sessionId: string = '';\n private mcpConfig: string | undefined;\n private manager: LocadexManager;\n\n constructor(\n manager: LocadexManager,\n private options: {\n apiKey?: string;\n mcpConfig?: string;\n } = {}\n ) {\n this.manager = manager;\n this.mcpConfig = options.mcpConfig;\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 // Setup global process handlers\n setupProcessHandlers();\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n async run(\n options: ClaudeCodeOptions,\n obs: ClaudeCodeObservation\n ): Promise<string> {\n return new Promise((resolve, reject) => {\n const args = ['-p', options.prompt];\n\n if (options.additionalSystemPrompt) {\n args.push('--append-system-prompt', options.additionalSystemPrompt);\n }\n\n args.push('--output-format', 'stream-json');\n args.push('--verbose');\n if (options.sessionId) {\n args.push('--resume', options.sessionId);\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 if (this.options.apiKey) {\n env.ANTHROPIC_API_KEY = this.options.apiKey;\n }\n\n const claude = spawn('npx', ['claude', ...args], {\n stdio: ['inherit', 'pipe', 'pipe'],\n env,\n });\n\n activeClaudeProcesses.add(claude);\n\n const output = '';\n const errorOutput = '';\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(`[Claude Code SDK] ${line}`);\n const outputData: ClaudeSDKMessage = JSON.parse(line);\n this.handleSDKOutput(outputData, obs);\n } catch (error) {\n logger.debugMessage(\n `[Claude Code SDK] Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n });\n\n claude.stderr?.on('data', () => {\n logger.warning('An error occurred while running Claude Code');\n });\n\n claude.on('close', (code) => {\n activeClaudeProcesses.delete(claude);\n if (code === 0) {\n resolve(output.trim());\n } else {\n reject(\n new Error(`Claude Code exited with code ${code}: ${errorOutput}`)\n );\n }\n });\n\n claude.on('error', (error) => {\n activeClaudeProcesses.delete(claude);\n reject(new Error(`Failed to run Claude Code: ${error.message}`));\n });\n });\n }\n\n private handleSDKOutput(\n outputData: ClaudeSDKMessage,\n obs: ClaudeCodeObservation\n ) {\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: this.sessionId\n ? createHash('sha256')\n .update(this.sessionId)\n .digest('base64url')\n .slice(0, 8)\n : 'anonymous',\n event: 'tool_used',\n properties: {\n tool: c.name,\n },\n });\n }\n }\n });\n if (text.length > 0) {\n logger.verboseMessage(text.join('').trim());\n }\n if (toolUses.length > 0) {\n logger.debugMessage(\n `[Claude Code SDK] Used tools: ${toolUses.join(', ')}`\n );\n }\n this.manager.stats.updateStats({\n newToolCalls: toolUses.length,\n });\n } else if (outputData.type === 'result') {\n if (!outputData.is_error) {\n logger.verboseMessage(\n `[Claude Code SDK] Finished\\nCost: $${Number(outputData.cost_usd).toFixed(2)}\\nDuration: ${\n Number(outputData.duration_ms) / 1000\n }s`\n );\n } else {\n logger.verboseMessage(\n `[Claude Code SDK] Finished with error: ${outputData.subtype}\\nCost: $${outputData.cost_usd}\\nDuration: ${\n Number(outputData.duration_ms) / 1000\n }s`\n );\n }\n this.manager.stats.updateStats({\n newCost: Number(outputData.cost_usd),\n newWallDuration: Number(outputData.duration_ms),\n newApiDuration: Number(outputData.duration_api_ms),\n });\n } else if (outputData.type === 'system') {\n if (outputData.subtype === 'init') {\n this.sessionId = outputData.session_id;\n }\n }\n }\n}\n"],"names":[],"mappings":"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","debug_id":"241bc31c-ad73-55df-abfe-d38afdd90259"}
@@ -0,0 +1,24 @@
1
+ export type DagOptions = {
2
+ tsConfig?: string;
3
+ webpackConfig?: string;
4
+ requireConfig?: string;
5
+ };
6
+ export type DagNode = {
7
+ [filename: string]: DagNode;
8
+ };
9
+ export declare class Dag {
10
+ private dag;
11
+ private reverseDag;
12
+ private dependenciesMap;
13
+ private topologicalOrder;
14
+ constructor(dag: DagNode);
15
+ private buildMaps;
16
+ private buildTopologicalOrder;
17
+ getDependencies(filename: string): string[];
18
+ getDependents(filename: string): string[];
19
+ getDag(): DagNode;
20
+ getReverseDag(): Record<string, string[]>;
21
+ getTopologicalOrder(): string[];
22
+ }
23
+ export declare function createDag(directories: string[], options: DagOptions): Dag;
24
+ //# sourceMappingURL=createDag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDag.d.ts","sourceRoot":"/","sources":["utils/dag/createDag.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B,CAAC;AAEF,qBAAa,GAAG;IACd,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,gBAAgB,CAAW;gBAEvB,GAAG,EAAE,OAAO;IAQxB,OAAO,CAAC,SAAS;IAsCjB,OAAO,CAAC,qBAAqB;IAwB7B,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAK3C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAKzC,MAAM,IAAI,OAAO;IAIjB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAIzC,mBAAmB,IAAI,MAAM,EAAE;CAGhC;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,GAAG,CAkCzE"}
@@ -0,0 +1,181 @@
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]="cd961cb2-0d8b-56a7-b051-57bc0119565f")}catch(e){}}();
3
+ import { logger } from '../../logging/logger.js';
4
+ import dependencyTree from 'dependency-tree';
5
+ import * as fs from 'node:fs';
6
+ import * as path from 'node:path';
7
+ import { DAG_IGNORED_EXTENSIONS, DAG_IGNORED_FILES } from '../shared.js';
8
+ export class Dag {
9
+ dag;
10
+ reverseDag;
11
+ dependenciesMap;
12
+ topologicalOrder;
13
+ constructor(dag) {
14
+ this.dag = dag;
15
+ const { reverseDag, dependenciesMap } = this.buildMaps(dag);
16
+ this.reverseDag = reverseDag;
17
+ this.dependenciesMap = dependenciesMap;
18
+ this.topologicalOrder = this.buildTopologicalOrder();
19
+ }
20
+ buildMaps(dag) {
21
+ const reverseDag = {};
22
+ const dependenciesMap = {};
23
+ // Clean the file paths recursively
24
+ const cleanedDag = cleanFilePaths(dag);
25
+ function traverse(node, parent) {
26
+ for (const [filename, subtree] of Object.entries(node)) {
27
+ // Build dependencies map - direct dependencies are the keys of subtree
28
+ if (!dependenciesMap[filename]) {
29
+ dependenciesMap[filename] = Object.keys(subtree);
30
+ }
31
+ // Build reverse DAG - if we have a parent, parent depends on filename
32
+ // So filename has parent as a dependent
33
+ if (parent) {
34
+ if (!reverseDag[filename]) {
35
+ reverseDag[filename] = [];
36
+ }
37
+ reverseDag[filename].push(parent);
38
+ }
39
+ // Recursively traverse the subtree
40
+ if (typeof subtree === 'object' && subtree !== null) {
41
+ traverse(subtree, filename);
42
+ }
43
+ }
44
+ }
45
+ traverse(cleanedDag);
46
+ return { reverseDag, dependenciesMap };
47
+ }
48
+ // No need to worry about cycles since the DAG is a tree
49
+ buildTopologicalOrder() {
50
+ const visited = new Set();
51
+ const result = [];
52
+ const dfs = (file) => {
53
+ if (visited.has(file))
54
+ return;
55
+ visited.add(file);
56
+ const dependencies = this.dependenciesMap[file] || [];
57
+ for (const dep of dependencies) {
58
+ dfs(dep);
59
+ }
60
+ result.push(file);
61
+ };
62
+ // Visit all files in the DAG
63
+ for (const file of Object.keys(this.dependenciesMap)) {
64
+ dfs(file);
65
+ }
66
+ return result;
67
+ }
68
+ // Get all direct dependencies of a file
69
+ getDependencies(filename) {
70
+ // return this.dependenciesMap[filename] || [];
71
+ return this.reverseDag[filename] || [];
72
+ }
73
+ // Get all children of a file
74
+ getDependents(filename) {
75
+ // return this.reverseDag[filename] || [];
76
+ return this.dependenciesMap[filename] || [];
77
+ }
78
+ getDag() {
79
+ return this.dag;
80
+ }
81
+ getReverseDag() {
82
+ return this.reverseDag;
83
+ }
84
+ getTopologicalOrder() {
85
+ return this.topologicalOrder;
86
+ }
87
+ }
88
+ export function createDag(directories, options) {
89
+ const allTrees = [];
90
+ const visited = {};
91
+ const nonExistent = [];
92
+ const files = discoverSourceFiles(directories);
93
+ logger.debugMessage(`Creating combined tree for ${files.length} files and ${directories.length} directories`);
94
+ files.forEach((file) => {
95
+ if (visited[file]) {
96
+ return;
97
+ }
98
+ try {
99
+ const tree = dependencyTree({
100
+ directory: process.cwd(),
101
+ filename: file,
102
+ filter: (path) => !path.includes('node_modules'),
103
+ visited: visited,
104
+ nonExistent: nonExistent,
105
+ tsConfig: options.tsConfig,
106
+ webpackConfig: options.webpackConfig,
107
+ requireConfig: options.requireConfig,
108
+ });
109
+ allTrees.push(tree);
110
+ }
111
+ catch (error) {
112
+ logger.debugMessage(`Failed to create tree for ${file}: ${error}`);
113
+ }
114
+ });
115
+ return new Dag(mergeTrees(allTrees));
116
+ }
117
+ function cleanFilePath(filePath) {
118
+ return path.relative(process.cwd(), filePath);
119
+ }
120
+ function cleanFilePaths(dag) {
121
+ const result = {};
122
+ for (const [filename, subtree] of Object.entries(dag)) {
123
+ const cleanedFilename = cleanFilePath(filename);
124
+ result[cleanedFilename] = cleanFilePaths(subtree);
125
+ }
126
+ return result;
127
+ }
128
+ function mergeTrees(trees) {
129
+ const result = {};
130
+ function mergeTree(tree, target) {
131
+ if (typeof tree === 'object' && tree !== null) {
132
+ for (const [filename, subtree] of Object.entries(tree)) {
133
+ if (!target[filename]) {
134
+ target[filename] = {};
135
+ }
136
+ mergeTree(subtree, target[filename]);
137
+ }
138
+ }
139
+ }
140
+ // Process each tree
141
+ trees.forEach((tree) => {
142
+ mergeTree(tree, result);
143
+ });
144
+ return result;
145
+ }
146
+ function discoverSourceFiles(directories) {
147
+ const files = [];
148
+ const extensions = ['.ts', '.tsx', '.js', '.jsx'];
149
+ function walkDirectory(dir) {
150
+ if (!fs.existsSync(dir))
151
+ return;
152
+ const items = fs.readdirSync(dir);
153
+ for (const item of items) {
154
+ const fullPath = path.join(dir, item);
155
+ const stat = fs.statSync(fullPath);
156
+ if (stat.isDirectory()) {
157
+ // Skip node_modules and common build/cache directories
158
+ if (!['node_modules', '.next', 'dist', 'build', '.git'].includes(item)) {
159
+ walkDirectory(fullPath);
160
+ }
161
+ }
162
+ else if (stat.isFile()) {
163
+ const ext = path.extname(item);
164
+ // Skip blacklisted extensions and files
165
+ if (DAG_IGNORED_EXTENSIONS.includes(ext) ||
166
+ DAG_IGNORED_FILES.includes(item)) {
167
+ continue;
168
+ }
169
+ if (extensions.includes(ext)) {
170
+ files.push(fullPath);
171
+ }
172
+ }
173
+ }
174
+ }
175
+ for (const directory of directories) {
176
+ walkDirectory(directory);
177
+ }
178
+ return files;
179
+ }
180
+ //# sourceMappingURL=createDag.js.map
181
+ //# debugId=cd961cb2-0d8b-56a7-b051-57bc0119565f
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDag.js","sources":["utils/dag/createDag.ts"],"sourceRoot":"/","sourcesContent":["import { logger } from '../../logging/logger.js';\nimport dependencyTree, { Tree } from 'dependency-tree';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { DAG_IGNORED_EXTENSIONS, DAG_IGNORED_FILES } from '../shared.js';\n\nexport type DagOptions = {\n tsConfig?: string;\n webpackConfig?: string;\n requireConfig?: string;\n};\n\nexport type DagNode = {\n [filename: string]: DagNode;\n};\n\nexport class Dag {\n private dag: DagNode;\n private reverseDag: Record<string, string[]>;\n private dependenciesMap: Record<string, string[]>;\n private topologicalOrder: string[];\n\n constructor(dag: DagNode) {\n this.dag = dag;\n const { reverseDag, dependenciesMap } = this.buildMaps(dag);\n this.reverseDag = reverseDag;\n this.dependenciesMap = dependenciesMap;\n this.topologicalOrder = this.buildTopologicalOrder();\n }\n\n private buildMaps(dag: DagNode): {\n reverseDag: Record<string, string[]>;\n dependenciesMap: Record<string, string[]>;\n } {\n const reverseDag: Record<string, string[]> = {};\n const dependenciesMap: Record<string, string[]> = {};\n\n // Clean the file paths recursively\n const cleanedDag = cleanFilePaths(dag);\n\n function traverse(node: DagNode, parent?: string): void {\n for (const [filename, subtree] of Object.entries(node)) {\n // Build dependencies map - direct dependencies are the keys of subtree\n if (!dependenciesMap[filename]) {\n dependenciesMap[filename] = Object.keys(subtree);\n }\n\n // Build reverse DAG - if we have a parent, parent depends on filename\n // So filename has parent as a dependent\n if (parent) {\n if (!reverseDag[filename]) {\n reverseDag[filename] = [];\n }\n reverseDag[filename].push(parent);\n }\n\n // Recursively traverse the subtree\n if (typeof subtree === 'object' && subtree !== null) {\n traverse(subtree, filename);\n }\n }\n }\n\n traverse(cleanedDag);\n return { reverseDag, dependenciesMap };\n }\n\n // No need to worry about cycles since the DAG is a tree\n private buildTopologicalOrder(): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n\n const dfs = (file: string) => {\n if (visited.has(file)) return;\n visited.add(file);\n\n const dependencies = this.dependenciesMap[file] || [];\n for (const dep of dependencies) {\n dfs(dep);\n }\n\n result.push(file);\n };\n\n // Visit all files in the DAG\n for (const file of Object.keys(this.dependenciesMap)) {\n dfs(file);\n }\n\n return result;\n }\n // Get all direct dependencies of a file\n getDependencies(filename: string): string[] {\n // return this.dependenciesMap[filename] || [];\n return this.reverseDag[filename] || [];\n }\n // Get all children of a file\n getDependents(filename: string): string[] {\n // return this.reverseDag[filename] || [];\n return this.dependenciesMap[filename] || [];\n }\n\n getDag(): DagNode {\n return this.dag;\n }\n\n getReverseDag(): Record<string, string[]> {\n return this.reverseDag;\n }\n\n getTopologicalOrder(): string[] {\n return this.topologicalOrder;\n }\n}\n\nexport function createDag(directories: string[], options: DagOptions): Dag {\n const allTrees: Tree[] = [];\n const visited: dependencyTree.Tree = {};\n const nonExistent: string[] = [];\n\n const files = discoverSourceFiles(directories);\n\n logger.debugMessage(\n `Creating combined tree for ${files.length} files and ${directories.length} directories`\n );\n\n files.forEach((file) => {\n if (visited[file]) {\n return;\n }\n\n try {\n const tree = dependencyTree({\n directory: process.cwd(),\n filename: file,\n filter: (path: string) => !path.includes('node_modules'),\n visited: visited,\n nonExistent: nonExistent,\n tsConfig: options.tsConfig,\n webpackConfig: options.webpackConfig,\n requireConfig: options.requireConfig,\n });\n allTrees.push(tree);\n } catch (error) {\n logger.debugMessage(`Failed to create tree for ${file}: ${error}`);\n }\n });\n\n return new Dag(mergeTrees(allTrees));\n}\n\nfunction cleanFilePath(filePath: string): string {\n return path.relative(process.cwd(), filePath);\n}\n\nfunction cleanFilePaths(dag: DagNode): DagNode {\n const result: DagNode = {};\n\n for (const [filename, subtree] of Object.entries(dag)) {\n const cleanedFilename = cleanFilePath(filename);\n result[cleanedFilename] = cleanFilePaths(subtree);\n }\n\n return result;\n}\n\nfunction mergeTrees(trees: Tree[]): DagNode {\n const result: DagNode = {};\n\n function mergeTree(tree: Tree, target: DagNode): void {\n if (typeof tree === 'object' && tree !== null) {\n for (const [filename, subtree] of Object.entries(tree)) {\n if (!target[filename]) {\n target[filename] = {};\n }\n mergeTree(subtree, target[filename]);\n }\n }\n }\n\n // Process each tree\n trees.forEach((tree) => {\n mergeTree(tree, result);\n });\n\n return result;\n}\n\nfunction discoverSourceFiles(directories: string[]): string[] {\n const files: string[] = [];\n const extensions = ['.ts', '.tsx', '.js', '.jsx'];\n\n function walkDirectory(dir: string) {\n if (!fs.existsSync(dir)) return;\n\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n // Skip node_modules and common build/cache directories\n if (\n !['node_modules', '.next', 'dist', 'build', '.git'].includes(item)\n ) {\n walkDirectory(fullPath);\n }\n } else if (stat.isFile()) {\n const ext = path.extname(item);\n\n // Skip blacklisted extensions and files\n if (\n DAG_IGNORED_EXTENSIONS.includes(ext) ||\n DAG_IGNORED_FILES.includes(item)\n ) {\n continue;\n }\n\n if (extensions.includes(ext)) {\n files.push(fullPath);\n }\n }\n }\n }\n\n for (const directory of directories) {\n walkDirectory(directory);\n }\n\n return files;\n}\n"],"names":[],"mappings":"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","debug_id":"cd961cb2-0d8b-56a7-b051-57bc0119565f"}
@@ -0,0 +1,3 @@
1
+ export declare function debugLog(...args: any[]): void;
2
+ export declare function getDebugLogLocation(): string;
3
+ //# sourceMappingURL=debugLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugLogger.d.ts","sourceRoot":"/","sources":["utils/debugLogger.ts"],"names":[],"mappings":"AAqBA,wBAAgB,QAAQ,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAgB7C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
@@ -0,0 +1,36 @@
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]="728d6d1d-2ed7-569b-8a04-bbe65558e2ba")}catch(e){}}();
3
+ import { existsSync, mkdirSync, appendFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { randomBytes } from 'node:crypto';
6
+ let debugLogPath = null;
7
+ function getDebugLogPath() {
8
+ if (!debugLogPath) {
9
+ const uniqueId = randomBytes(8).toString('hex');
10
+ const debugDir = join(process.cwd(), '.tmp', uniqueId);
11
+ if (!existsSync(debugDir)) {
12
+ mkdirSync(debugDir, { recursive: true });
13
+ }
14
+ debugLogPath = join(debugDir, 'out.txt');
15
+ }
16
+ return debugLogPath;
17
+ }
18
+ export function debugLog(...args) {
19
+ const logPath = getDebugLogPath();
20
+ const timestamp = new Date().toISOString();
21
+ const message = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)).join(' ');
22
+ const logEntry = `[${timestamp}] ${message}\n`;
23
+ try {
24
+ appendFileSync(logPath, logEntry);
25
+ }
26
+ catch (error) {
27
+ // Fallback to console if file writing fails
28
+ console.error('Debug log write failed:', error);
29
+ console.log(...args);
30
+ }
31
+ }
32
+ export function getDebugLogLocation() {
33
+ return getDebugLogPath();
34
+ }
35
+ //# sourceMappingURL=debugLogger.js.map
36
+ //# debugId=728d6d1d-2ed7-569b-8a04-bbe65558e2ba
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugLogger.js","sources":["utils/debugLogger.ts"],"sourceRoot":"/","sourcesContent":["import { writeFileSync, existsSync, mkdirSync, appendFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { randomBytes } from 'node:crypto';\n\nlet debugLogPath: string | null = null;\n\nfunction getDebugLogPath(): string {\n if (!debugLogPath) {\n const uniqueId = randomBytes(8).toString('hex');\n const debugDir = join(process.cwd(), '.tmp', uniqueId);\n \n if (!existsSync(debugDir)) {\n mkdirSync(debugDir, { recursive: true });\n }\n \n debugLogPath = join(debugDir, 'out.txt');\n }\n \n return debugLogPath;\n}\n\nexport function debugLog(...args: any[]): void {\n const logPath = getDebugLogPath();\n const timestamp = new Date().toISOString();\n const message = args.map(arg => \n typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)\n ).join(' ');\n \n const logEntry = `[${timestamp}] ${message}\\n`;\n \n try {\n appendFileSync(logPath, logEntry);\n } catch (error) {\n // Fallback to console if file writing fails\n console.error('Debug log write failed:', error);\n console.log(...args);\n }\n}\n\nexport function getDebugLogLocation(): string {\n return getDebugLogPath();\n}"],"names":[],"mappings":";;AAAA,OAAO,EAAiB,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,SAAS,eAAe;IACtB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEvD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAG,IAAW;IACrC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAC7B,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACrE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,MAAM,QAAQ,GAAG,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC;IAE/C,IAAI,CAAC;QACH,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4CAA4C;QAC5C,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC","debug_id":"728d6d1d-2ed7-569b-8a04-bbe65558e2ba"}
@@ -0,0 +1,11 @@
1
+ export declare function findTsConfig(): string | undefined;
2
+ export declare function findWebpackConfig(): string | undefined;
3
+ /**
4
+ * Resolve the file paths from the given file paths or default paths.
5
+ * @param {string[]} paths - The file paths to resolve.
6
+ * @param {string} errorMessage - The error message to throw if no paths are found.
7
+ * @returns {string[]} - The resolved file paths.
8
+ */
9
+ export declare function findRequireConfig(): string | undefined;
10
+ export declare function findFilepaths(paths: string[]): string[];
11
+ //# sourceMappingURL=findConfigs.d.ts.map