locadex 0.1.0-alpha.9 → 0.1.1

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 (123) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +3 -5
  3. package/dist/cli.js +11 -10
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/i18n.d.ts.map +1 -1
  6. package/dist/commands/i18n.js +15 -14
  7. package/dist/commands/i18n.js.map +1 -1
  8. package/dist/commands/setup.d.ts.map +1 -1
  9. package/dist/commands/setup.js +15 -14
  10. package/dist/commands/setup.js.map +1 -1
  11. package/dist/index.js +1 -4
  12. package/dist/index.js.map +1 -1
  13. package/dist/logging/console.js +2 -5
  14. package/dist/logging/console.js.map +1 -1
  15. package/dist/logging/logger.d.ts +4 -2
  16. package/dist/logging/logger.d.ts.map +1 -1
  17. package/dist/logging/logger.js +1 -4
  18. package/dist/logging/logger.js.map +1 -1
  19. package/dist/mcp/getDocs.js +1 -4
  20. package/dist/mcp/getDocs.js.map +1 -1
  21. package/dist/mcp/getGuide.js +1 -4
  22. package/dist/mcp/getGuide.js.map +1 -1
  23. package/dist/mcp/getPort.js +1 -4
  24. package/dist/mcp/getPort.js.map +1 -1
  25. package/dist/mcp/tools/docs.js +1 -4
  26. package/dist/mcp/tools/docs.js.map +1 -1
  27. package/dist/mcp/tools/guides.js +1 -4
  28. package/dist/mcp/tools/guides.js.map +1 -1
  29. package/dist/mcp.d.ts +1 -1
  30. package/dist/mcp.d.ts.map +1 -1
  31. package/dist/mcp.js +56 -16
  32. package/dist/mcp.js.map +1 -1
  33. package/dist/prompts/system.js +1 -4
  34. package/dist/prompts/system.js.map +1 -1
  35. package/dist/tasks/concurrency.d.ts +72 -0
  36. package/dist/tasks/concurrency.d.ts.map +1 -0
  37. package/dist/tasks/concurrency.js +132 -0
  38. package/dist/tasks/concurrency.js.map +1 -0
  39. package/dist/tasks/i18n.d.ts.map +1 -1
  40. package/dist/tasks/i18n.js +60 -127
  41. package/dist/tasks/i18n.js.map +1 -1
  42. package/dist/tasks/setup.d.ts.map +1 -1
  43. package/dist/tasks/setup.js +40 -44
  44. package/dist/tasks/setup.js.map +1 -1
  45. package/dist/telemetry.js +1 -4
  46. package/dist/telemetry.js.map +1 -1
  47. package/dist/types/claude-sdk.d.ts +1 -1
  48. package/dist/types/claude-sdk.d.ts.map +1 -1
  49. package/dist/types/claude-sdk.js +1 -4
  50. package/dist/types/claude-sdk.js.map +1 -1
  51. package/dist/types/cli.d.ts +3 -0
  52. package/dist/types/cli.d.ts.map +1 -1
  53. package/dist/types/cli.js +1 -4
  54. package/dist/types/cli.js.map +1 -1
  55. package/dist/utils/claudeCode.d.ts +6 -5
  56. package/dist/utils/claudeCode.d.ts.map +1 -1
  57. package/dist/utils/claudeCode.js +50 -17
  58. package/dist/utils/claudeCode.js.map +1 -1
  59. package/dist/utils/config.d.ts +4 -3
  60. package/dist/utils/config.d.ts.map +1 -1
  61. package/dist/utils/config.js +33 -20
  62. package/dist/utils/config.js.map +1 -1
  63. package/dist/utils/dag/createDag.d.ts.map +1 -1
  64. package/dist/utils/dag/createDag.js +10 -11
  65. package/dist/utils/dag/createDag.js.map +1 -1
  66. package/dist/utils/dag/extractFiles.d.ts.map +1 -1
  67. package/dist/utils/dag/extractFiles.js +6 -9
  68. package/dist/utils/dag/extractFiles.js.map +1 -1
  69. package/dist/utils/dag/getFiles.d.ts +1 -12
  70. package/dist/utils/dag/getFiles.d.ts.map +1 -1
  71. package/dist/utils/dag/getFiles.js +5 -53
  72. package/dist/utils/dag/getFiles.js.map +1 -1
  73. package/dist/utils/dag/matchFiles.d.ts +2 -2
  74. package/dist/utils/dag/matchFiles.d.ts.map +1 -1
  75. package/dist/utils/dag/matchFiles.js +3 -6
  76. package/dist/utils/dag/matchFiles.js.map +1 -1
  77. package/dist/utils/fs/findConfigs.d.ts +4 -4
  78. package/dist/utils/fs/findConfigs.d.ts.map +1 -1
  79. package/dist/utils/fs/findConfigs.js +7 -13
  80. package/dist/utils/fs/findConfigs.js.map +1 -1
  81. package/dist/utils/fs/getFiles.d.ts +1 -1
  82. package/dist/utils/fs/getFiles.d.ts.map +1 -1
  83. package/dist/utils/fs/getFiles.js +3 -6
  84. package/dist/utils/fs/getFiles.js.map +1 -1
  85. package/dist/utils/fs/git.d.ts +6 -0
  86. package/dist/utils/fs/git.d.ts.map +1 -0
  87. package/dist/utils/fs/git.js +32 -0
  88. package/dist/utils/fs/git.js.map +1 -0
  89. package/dist/utils/fs/writeFiles.js +1 -4
  90. package/dist/utils/fs/writeFiles.js.map +1 -1
  91. package/dist/utils/getPaths.js +1 -4
  92. package/dist/utils/getPaths.js.map +1 -1
  93. package/dist/utils/locadexManager.d.ts +15 -5
  94. package/dist/utils/locadexManager.d.ts.map +1 -1
  95. package/dist/utils/locadexManager.js +80 -73
  96. package/dist/utils/locadexManager.js.map +1 -1
  97. package/dist/utils/lockfile.d.ts +2 -2
  98. package/dist/utils/lockfile.d.ts.map +1 -1
  99. package/dist/utils/lockfile.js +8 -17
  100. package/dist/utils/lockfile.js.map +1 -1
  101. package/dist/utils/packages/installPackage.d.ts +4 -0
  102. package/dist/utils/packages/installPackage.d.ts.map +1 -1
  103. package/dist/utils/packages/installPackage.js +41 -5
  104. package/dist/utils/packages/installPackage.js.map +1 -1
  105. package/dist/utils/session.js +1 -4
  106. package/dist/utils/session.js.map +1 -1
  107. package/dist/utils/shared.js +1 -4
  108. package/dist/utils/shared.js.map +1 -1
  109. package/dist/utils/shutdown.d.ts.map +1 -1
  110. package/dist/utils/shutdown.js +1 -9
  111. package/dist/utils/shutdown.js.map +1 -1
  112. package/dist/utils/stats.js +1 -4
  113. package/dist/utils/stats.js.map +1 -1
  114. package/guides/next/advanced/var-outside-client-server-component.md +1 -1
  115. package/package.json +4 -6
  116. package/dist/mcp/debugger.d.ts +0 -3
  117. package/dist/mcp/debugger.d.ts.map +0 -1
  118. package/dist/mcp/debugger.js +0 -37
  119. package/dist/mcp/debugger.js.map +0 -1
  120. package/dist/mcp-sse.d.ts +0 -3
  121. package/dist/mcp-sse.d.ts.map +0 -1
  122. package/dist/mcp-sse.js +0 -77
  123. package/dist/mcp-sse.js.map +0 -1
@@ -1,12 +1,13 @@
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]="4315bb3c-f91e-59a8-82ba-0b76e35bae44")}catch(e){}}();
3
1
  import { getPackageInfo } from 'gtx-cli/utils/packageInfo';
4
2
  import { createSpinner } from '../../logging/console.js';
5
3
  import chalk from 'chalk';
6
- import { installPackageGlobal } from 'gtx-cli/utils/installPackage';
4
+ import { installPackage, installPackageGlobal, } from 'gtx-cli/utils/installPackage';
7
5
  import { logger } from '../../logging/logger.js';
8
6
  import { CLAUDE_CODE_VERSION } from '../shared.js';
9
7
  import { exit } from '../shutdown.js';
8
+ import { getPackageManager, } from 'gtx-cli/utils/packageManager';
9
+ import { updatePackageJson } from 'gtx-cli/utils/packageJson';
10
+ import path from 'node:path';
10
11
  export async function installClaudeCode() {
11
12
  const claudeCodeInfo = await getPackageInfo('@anthropic-ai/claude-code');
12
13
  if (!claudeCodeInfo) {
@@ -26,5 +27,40 @@ export async function installClaudeCode() {
26
27
  logger.step(`claude-code is already installed: v${claudeCodeInfo.version}`);
27
28
  }
28
29
  }
29
- //# sourceMappingURL=installPackage.js.map
30
- //# debugId=4315bb3c-f91e-59a8-82ba-0b76e35bae44
30
+ export async function addTranslateScript(manager, packageJson, packageManager) {
31
+ if (!packageJson.scripts) {
32
+ packageJson.scripts = {};
33
+ }
34
+ const translateCommand = `locadex translate`;
35
+ let translateScript = 'translate';
36
+ if (!packageJson.scripts?.translate) {
37
+ packageJson.scripts.translate = translateCommand;
38
+ translateScript = 'translate';
39
+ }
40
+ else {
41
+ if (packageJson.scripts.translate &&
42
+ packageJson.scripts.translate.includes(translateCommand)) {
43
+ translateScript = 'translate';
44
+ }
45
+ else {
46
+ packageJson.scripts['translate:gt'] = translateCommand;
47
+ translateScript = 'translate:gt';
48
+ }
49
+ }
50
+ // prefix translate to build command
51
+ const runTranslate = `${packageManager.runScriptCommand} ${translateScript}`;
52
+ if (packageJson.scripts.build &&
53
+ !packageJson.scripts.build.includes(runTranslate)) {
54
+ packageJson.scripts.build = `${runTranslate} && ${packageJson.scripts.build}`;
55
+ }
56
+ await updatePackageJson(packageJson, manager.appDirectory);
57
+ logger.success(`Added ${chalk.cyan(translateScript)} script to your ${chalk.cyan(path.relative(manager.rootDirectory, path.resolve(manager.appDirectory, 'package.json')))} file and build command. Run ${chalk.cyan(translateScript)} to translate your project.`);
58
+ }
59
+ export async function installLocadex(manager) {
60
+ const packageManager = await getPackageManager(manager.rootDirectory);
61
+ const spinner = createSpinner();
62
+ spinner.start(`Installing locadex as a dev dependency with ${packageManager.name}...`);
63
+ await installPackage('locadex', packageManager, true, manager.rootDirectory);
64
+ spinner.stop(chalk.green('Installed locadex.'));
65
+ }
66
+ //# sourceMappingURL=installPackage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installPackage.js","sources":["utils/packages/installPackage.ts"],"sourceRoot":"/","sourcesContent":["import { getPackageInfo } from 'gtx-cli/utils/packageInfo';\nimport { createSpinner } from '../../logging/console.js';\nimport chalk from 'chalk';\nimport { installPackageGlobal } from 'gtx-cli/utils/installPackage';\nimport { logger } from '../../logging/logger.js';\nimport { CLAUDE_CODE_VERSION } from '../shared.js';\nimport { exit } from '../shutdown.js';\n\nexport async function installClaudeCode() {\n const claudeCodeInfo = await getPackageInfo('@anthropic-ai/claude-code');\n if (!claudeCodeInfo) {\n const spinner = createSpinner();\n spinner.start('Installing claude-code...');\n try {\n await installPackageGlobal(\n '@anthropic-ai/claude-code',\n CLAUDE_CODE_VERSION\n );\n spinner.stop(chalk.green('Installed claude-code.'));\n } catch (error) {\n spinner.stop(chalk.red('Failed to install claude-code.'));\n logger.error(\n 'Claude Code installation failed. Please install it manually and try again.'\n );\n await exit(1);\n }\n } else {\n logger.step(`claude-code is already installed: v${claudeCodeInfo.version}`);\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,2BAA2B,CAAC,CAAC;IACzE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,oBAAoB,CACxB,2BAA2B,EAC3B,mBAAmB,CACpB,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CACV,4EAA4E,CAC7E,CAAC;YACF,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,sCAAsC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC","debug_id":"4315bb3c-f91e-59a8-82ba-0b76e35bae44"}
1
+ {"version":3,"file":"installPackage.js","sourceRoot":"/","sources":["utils/packages/installPackage.ts"],"names":[],"mappings":"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","sourcesContent":["import { getPackageInfo } from 'gtx-cli/utils/packageInfo';\nimport { createSpinner } from '../../logging/console.js';\nimport chalk from 'chalk';\nimport {\n installPackage,\n installPackageGlobal,\n} from 'gtx-cli/utils/installPackage';\nimport { logger } from '../../logging/logger.js';\nimport { CLAUDE_CODE_VERSION } from '../shared.js';\nimport { exit } from '../shutdown.js';\nimport {\n getPackageManager,\n PackageManager,\n} from 'gtx-cli/utils/packageManager';\nimport { updatePackageJson } from 'gtx-cli/utils/packageJson';\nimport path from 'node:path';\nimport { LocadexManager } from '../locadexManager.js';\n\nexport async function installClaudeCode() {\n const claudeCodeInfo = await getPackageInfo('@anthropic-ai/claude-code');\n if (!claudeCodeInfo) {\n const spinner = createSpinner();\n spinner.start('Installing claude-code...');\n try {\n await installPackageGlobal(\n '@anthropic-ai/claude-code',\n CLAUDE_CODE_VERSION\n );\n spinner.stop(chalk.green('Installed claude-code.'));\n } catch (error) {\n spinner.stop(chalk.red('Failed to install claude-code.'));\n logger.error(\n 'Claude Code installation failed. Please install it manually and try again.'\n );\n await exit(1);\n }\n } else {\n logger.step(`claude-code is already installed: v${claudeCodeInfo.version}`);\n }\n}\n\nexport async function addTranslateScript(\n manager: LocadexManager,\n packageJson: Record<string, any>,\n packageManager: PackageManager\n) {\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n const translateCommand = `locadex translate`;\n let translateScript = 'translate';\n if (!packageJson.scripts?.translate) {\n packageJson.scripts.translate = translateCommand;\n translateScript = 'translate';\n } else {\n if (\n packageJson.scripts.translate &&\n packageJson.scripts.translate.includes(translateCommand)\n ) {\n translateScript = 'translate';\n } else {\n packageJson.scripts['translate:gt'] = translateCommand;\n translateScript = 'translate:gt';\n }\n }\n // prefix translate to build command\n const runTranslate = `${packageManager.runScriptCommand} ${translateScript}`;\n if (\n packageJson.scripts.build &&\n !packageJson.scripts.build.includes(runTranslate)\n ) {\n packageJson.scripts.build = `${runTranslate} && ${packageJson.scripts.build}`;\n }\n await updatePackageJson(packageJson, manager.appDirectory);\n logger.success(\n `Added ${chalk.cyan(translateScript)} script to your ${chalk.cyan(\n path.relative(\n manager.rootDirectory,\n path.resolve(manager.appDirectory, 'package.json')\n )\n )} file and build command. Run ${chalk.cyan(translateScript)} to translate your project.`\n );\n}\n\nexport async function installLocadex(manager: LocadexManager) {\n const packageManager = await getPackageManager(manager.rootDirectory);\n const spinner = createSpinner();\n spinner.start(\n `Installing locadex as a dev dependency with ${packageManager.name}...`\n );\n await installPackage('locadex', packageManager, true, manager.rootDirectory);\n spinner.stop(chalk.green('Installed locadex.'));\n}\n"]}
@@ -1,5 +1,3 @@
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]="1cd0c442-1dd2-510f-a16c-b7ccf0366d8b")}catch(e){}}();
3
1
  import { randomUUID } from 'node:crypto';
4
2
  let _sessionId = null;
5
3
  export function getSessionId() {
@@ -8,5 +6,4 @@ export function getSessionId() {
8
6
  }
9
7
  return _sessionId;
10
8
  }
11
- //# sourceMappingURL=session.js.map
12
- //# debugId=1cd0c442-1dd2-510f-a16c-b7ccf0366d8b
9
+ //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sources":["utils/session.ts"],"sourceRoot":"/","sourcesContent":["import { randomUUID } from 'node:crypto';\n\nlet _sessionId: string | null = null;\n\nexport function getSessionId(): string {\n if (!_sessionId) {\n _sessionId = randomUUID();\n }\n return _sessionId;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,IAAI,UAAU,GAAkB,IAAI,CAAC;AAErC,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,UAAU,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC","debug_id":"1cd0c442-1dd2-510f-a16c-b7ccf0366d8b"}
1
+ {"version":3,"file":"session.js","sourceRoot":"/","sources":["utils/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,IAAI,UAAU,GAAkB,IAAI,CAAC;AAErC,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,UAAU,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import { randomUUID } from 'node:crypto';\n\nlet _sessionId: string | null = null;\n\nexport function getSessionId(): string {\n if (!_sessionId) {\n _sessionId = randomUUID();\n }\n return _sessionId;\n}\n"]}
@@ -1,5 +1,3 @@
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]="513100d0-dccb-53d9-ad07-db86abb4c4ec")}catch(e){}}();
3
1
  export const DAG_IGNORED_FILES = [
4
2
  'next.config.js',
5
3
  'next.config.ts',
@@ -46,5 +44,4 @@ export const DAG_IGNORED_EXTENSIONS = [
46
44
  '.fixture.ts', // Test fixtures
47
45
  ];
48
46
  export const CLAUDE_CODE_VERSION = '1.0.16';
49
- //# sourceMappingURL=shared.js.map
50
- //# debugId=513100d0-dccb-53d9-ad07-db86abb4c4ec
47
+ //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sources":["utils/shared.ts"],"sourceRoot":"/","sourcesContent":["export const DAG_IGNORED_FILES = [\n 'next.config.js',\n 'next.config.ts',\n 'next.config.mjs',\n 'next.config.mts',\n 'next.config.cjs',\n 'next.config.cts',\n 'tailwind.config.js',\n 'webpack.config.js',\n];\n\nexport const DAG_IGNORED_PATTERNS = [\n '**/node_modules/**',\n '**/.next/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.cache/**',\n '**/.nuxt/**',\n '**/.vite/**',\n '**/.turbo/**',\n '**/.locadex/**',\n];\n\nexport const DAG_IGNORED_EXTENSIONS = [\n '.map', // Source maps\n '.map.js', // Source maps\n '.min.js', // Minified JavaScript\n '.min.ts', // Minified TypeScript\n '.spec.js', // Test files\n '.spec.ts',\n '.test.js',\n '.test.ts',\n '.stories.js', // Storybook files\n '.stories.ts',\n '.config.js', // Various config files (though some might be relevant)\n '.config.ts',\n '.d.ts',\n '.e2e.js', // End-to-end tests\n '.e2e.ts', // End-to-end tests\n '.setup.js', // Test setup files\n '.setup.ts', // Test setup files\n '.mock.js', // Mock files\n '.mock.ts', // Mock files\n '.fixture.js', // Test fixtures\n '.fixture.ts', // Test fixtures\n];\n\nexport const CLAUDE_CODE_VERSION = '1.0.16';\n"],"names":[],"mappings":";;AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,oBAAoB;IACpB,mBAAmB;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,oBAAoB;IACpB,aAAa;IACb,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,cAAc;IACd,aAAa;IACb,aAAa;IACb,cAAc;IACd,gBAAgB;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,MAAM,EAAE,cAAc;IACtB,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,sBAAsB;IACjC,SAAS,EAAE,sBAAsB;IACjC,UAAU,EAAE,aAAa;IACzB,UAAU;IACV,UAAU;IACV,UAAU;IACV,aAAa,EAAE,kBAAkB;IACjC,aAAa;IACb,YAAY,EAAE,uDAAuD;IACrE,YAAY;IACZ,OAAO;IACP,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,mBAAmB;IAC9B,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,mBAAmB;IAChC,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,aAAa;IACzB,aAAa,EAAE,gBAAgB;IAC/B,aAAa,EAAE,gBAAgB;CAChC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC","debug_id":"513100d0-dccb-53d9-ad07-db86abb4c4ec"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"/","sources":["utils/shared.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,oBAAoB;IACpB,mBAAmB;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,oBAAoB;IACpB,aAAa;IACb,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,cAAc;IACd,aAAa;IACb,aAAa;IACb,cAAc;IACd,gBAAgB;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,MAAM,EAAE,cAAc;IACtB,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,sBAAsB;IACjC,SAAS,EAAE,sBAAsB;IACjC,UAAU,EAAE,aAAa;IACzB,UAAU;IACV,UAAU;IACV,UAAU;IACV,aAAa,EAAE,kBAAkB;IACjC,aAAa;IACb,YAAY,EAAE,uDAAuD;IACrE,YAAY;IACZ,OAAO;IACP,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,mBAAmB;IAC9B,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,mBAAmB;IAChC,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,aAAa;IACzB,aAAa,EAAE,gBAAgB;IAC/B,aAAa,EAAE,gBAAgB;CAChC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC","sourcesContent":["export const DAG_IGNORED_FILES = [\n 'next.config.js',\n 'next.config.ts',\n 'next.config.mjs',\n 'next.config.mts',\n 'next.config.cjs',\n 'next.config.cts',\n 'tailwind.config.js',\n 'webpack.config.js',\n];\n\nexport const DAG_IGNORED_PATTERNS = [\n '**/node_modules/**',\n '**/.next/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.cache/**',\n '**/.nuxt/**',\n '**/.vite/**',\n '**/.turbo/**',\n '**/.locadex/**',\n];\n\nexport const DAG_IGNORED_EXTENSIONS = [\n '.map', // Source maps\n '.map.js', // Source maps\n '.min.js', // Minified JavaScript\n '.min.ts', // Minified TypeScript\n '.spec.js', // Test files\n '.spec.ts',\n '.test.js',\n '.test.ts',\n '.stories.js', // Storybook files\n '.stories.ts',\n '.config.js', // Various config files (though some might be relevant)\n '.config.ts',\n '.d.ts',\n '.e2e.js', // End-to-end tests\n '.e2e.ts', // End-to-end tests\n '.setup.js', // Test setup files\n '.setup.ts', // Test setup files\n '.mock.js', // Mock files\n '.mock.ts', // Mock files\n '.fixture.js', // Test fixtures\n '.fixture.ts', // Test fixtures\n];\n\nexport const CLAUDE_CODE_VERSION = '1.0.16';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown.d.ts","sourceRoot":"/","sources":["utils/shutdown.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAE7B,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,cAAM,gBAAgB;IACpB,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAe;;YASjB,YAAY;IAO1B,UAAU,CAAC,OAAO,EAAE,eAAe;IAI7B,QAAQ,CAAC,QAAQ,GAAE,QAAY;IA0CrC,IAAI,CAAC,IAAI,GAAE,QAAY;CAGxB;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAGvD,wBAAgB,IAAI,CAAC,IAAI,GAAE,QAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAEvD"}
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"/","sources":["utils/shutdown.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAE7B,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,cAAM,gBAAgB;IACpB,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAe;;YASjB,YAAY;IAO1B,UAAU,CAAC,OAAO,EAAE,eAAe;IAI7B,QAAQ,CAAC,QAAQ,GAAE,QAAY;IAmCrC,IAAI,CAAC,IAAI,GAAE,QAAY;CAGxB;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAGvD,wBAAgB,IAAI,CAAC,IAAI,GAAE,QAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAEvD"}
@@ -1,5 +1,3 @@
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]="298af6f8-5391-5ade-a89e-a253f2207811")}catch(e){}}();
3
1
  import { logger } from '../logging/logger.js';
4
2
  class GracefulShutdown {
5
3
  shutdownHandlers = [];
@@ -40,11 +38,6 @@ class GracefulShutdown {
40
38
  }
41
39
  }
42
40
  logger.debugMessage('Graceful shutdown complete');
43
- // Force exit after a timeout if process doesn't exit naturally
44
- global.setTimeout(() => {
45
- logger.error('Force exiting after timeout');
46
- process.exit(this.exitCode);
47
- }, 1000);
48
41
  process.exit(this.exitCode);
49
42
  }
50
43
  // For backward compatibility and convenience
@@ -58,5 +51,4 @@ export const gracefulShutdown = new GracefulShutdown();
58
51
  export function exit(code = 0) {
59
52
  return gracefulShutdown.shutdown(code);
60
53
  }
61
- //# sourceMappingURL=shutdown.js.map
62
- //# debugId=298af6f8-5391-5ade-a89e-a253f2207811
54
+ //# sourceMappingURL=shutdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown.js","sources":["utils/shutdown.ts"],"sourceRoot":"/","sourcesContent":["import { logger } from '../logging/logger.js';\n\nexport type ExitCode = 0 | 1;\n\ninterface ShutdownHandler {\n name: string;\n handler: () => Promise<void> | void;\n timeout?: number;\n}\n\nclass GracefulShutdown {\n private shutdownHandlers: ShutdownHandler[] = [];\n private isShuttingDown = false;\n private exitCode: ExitCode = 0;\n\n constructor() {\n // Handle termination signals\n process.on('SIGINT', () => this.handleSignal('SIGINT'));\n process.on('SIGTERM', () => this.handleSignal('SIGTERM'));\n process.on('SIGUSR2', () => this.handleSignal('SIGUSR2')); // nodemon restart\n }\n\n private async handleSignal(signal: string) {\n logger.debugMessage(\n `Received ${signal}, initiating graceful shutdown with exit code 0...`\n );\n await this.shutdown(0);\n }\n\n addHandler(handler: ShutdownHandler) {\n this.shutdownHandlers.push(handler);\n }\n\n async shutdown(exitCode: ExitCode = 0) {\n if (this.isShuttingDown) {\n return;\n }\n\n this.isShuttingDown = true;\n this.exitCode = exitCode;\n\n // Execute shutdown handlers in reverse order (LIFO)\n const handlers = [...this.shutdownHandlers].reverse();\n\n for (const { name, handler, timeout = 5000 } of handlers) {\n try {\n logger.debugMessage(`Executing shutdown handler: ${name}`);\n\n const timeoutPromise = new Promise<void>((_, reject) => {\n global.setTimeout(\n () => reject(new Error(`Timeout: ${name}`)),\n timeout\n );\n });\n\n await Promise.race([Promise.resolve(handler()), timeoutPromise]);\n\n logger.debugMessage(`Completed shutdown handler: ${name}`);\n } catch (error) {\n logger.error(`Error in shutdown handler ${name}: ${error}`);\n }\n }\n\n logger.debugMessage('Graceful shutdown complete');\n\n // Force exit after a timeout if process doesn't exit naturally\n global.setTimeout(() => {\n logger.error('Force exiting after timeout');\n process.exit(this.exitCode);\n }, 1000);\n\n process.exit(this.exitCode);\n }\n\n // For backward compatibility and convenience\n exit(code: ExitCode = 0) {\n return this.shutdown(code);\n }\n}\n\n// Export singleton instance\nexport const gracefulShutdown = new GracefulShutdown();\n\n// Export convenience function for backward compatibility\nexport function exit(code: ExitCode = 0): Promise<never> {\n return gracefulShutdown.shutdown(code) as Promise<never>;\n}\n"],"names":[],"mappings":"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","debug_id":"298af6f8-5391-5ade-a89e-a253f2207811"}
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"/","sources":["utils/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAU9C,MAAM,gBAAgB;IACZ,gBAAgB,GAAsB,EAAE,CAAC;IACzC,cAAc,GAAG,KAAK,CAAC;IACvB,QAAQ,GAAa,CAAC,CAAC;IAE/B;QACE,6BAA6B;QAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,kBAAkB;IAC/E,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAc;QACvC,MAAM,CAAC,YAAY,CACjB,YAAY,MAAM,oDAAoD,CACvE,CAAC;QACF,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,OAAwB;QACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,WAAqB,CAAC;QACnC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,oDAAoD;QACpD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC;QAEtD,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,CAAC,YAAY,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;gBAE3D,MAAM,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;oBACrD,MAAM,CAAC,UAAU,CACf,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,EAC3C,OAAO,CACR,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;gBAEjE,MAAM,CAAC,YAAY,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,MAAM,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,6CAA6C;IAC7C,IAAI,CAAC,OAAiB,CAAC;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEvD,yDAAyD;AACzD,MAAM,UAAU,IAAI,CAAC,OAAiB,CAAC;IACrC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAmB,CAAC;AAC3D,CAAC","sourcesContent":["import { logger } from '../logging/logger.js';\n\nexport type ExitCode = 0 | 1;\n\ninterface ShutdownHandler {\n name: string;\n handler: () => Promise<void> | void;\n timeout?: number;\n}\n\nclass GracefulShutdown {\n private shutdownHandlers: ShutdownHandler[] = [];\n private isShuttingDown = false;\n private exitCode: ExitCode = 0;\n\n constructor() {\n // Handle termination signals\n process.on('SIGINT', () => this.handleSignal('SIGINT'));\n process.on('SIGTERM', () => this.handleSignal('SIGTERM'));\n process.on('SIGUSR2', () => this.handleSignal('SIGUSR2')); // nodemon restart\n }\n\n private async handleSignal(signal: string) {\n logger.debugMessage(\n `Received ${signal}, initiating graceful shutdown with exit code 0...`\n );\n await this.shutdown(0);\n }\n\n addHandler(handler: ShutdownHandler) {\n this.shutdownHandlers.push(handler);\n }\n\n async shutdown(exitCode: ExitCode = 0) {\n if (this.isShuttingDown) {\n return;\n }\n\n this.isShuttingDown = true;\n this.exitCode = exitCode;\n\n // Execute shutdown handlers in reverse order (LIFO)\n const handlers = [...this.shutdownHandlers].reverse();\n\n for (const { name, handler, timeout = 5000 } of handlers) {\n try {\n logger.debugMessage(`Executing shutdown handler: ${name}`);\n\n const timeoutPromise = new Promise<void>((_, reject) => {\n global.setTimeout(\n () => reject(new Error(`Timeout: ${name}`)),\n timeout\n );\n });\n\n await Promise.race([Promise.resolve(handler()), timeoutPromise]);\n\n logger.debugMessage(`Completed shutdown handler: ${name}`);\n } catch (error) {\n logger.error(`Error in shutdown handler ${name}: ${error}`);\n }\n }\n\n logger.debugMessage('Graceful shutdown complete');\n process.exit(this.exitCode);\n }\n\n // For backward compatibility and convenience\n exit(code: ExitCode = 0) {\n return this.shutdown(code);\n }\n}\n\n// Export singleton instance\nexport const gracefulShutdown = new GracefulShutdown();\n\n// Export convenience function for backward compatibility\nexport function exit(code: ExitCode = 0): Promise<never> {\n return gracefulShutdown.shutdown(code) as Promise<never>;\n}\n"]}
@@ -1,5 +1,3 @@
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]="24d19598-ee2b-5e12-9264-36c1477ffac0")}catch(e){}}();
3
1
  import { posthog } from '../telemetry.js';
4
2
  import { getSessionId } from './session.js';
5
3
  import * as Sentry from '@sentry/node';
@@ -93,5 +91,4 @@ export class AgentStats {
93
91
  });
94
92
  }
95
93
  }
96
- //# sourceMappingURL=stats.js.map
97
- //# debugId=24d19598-ee2b-5e12-9264-36c1477ffac0
94
+ //# sourceMappingURL=stats.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sources":["utils/stats.ts"],"sourceRoot":"/","sourcesContent":["import { posthog } from '../telemetry.js';\nimport { getSessionId } from './session.js';\nimport * as Sentry from '@sentry/node';\n\nexport class AgentStats {\n private totalFiles: number = 0;\n private processedFiles: number = 0;\n private totalCost: number = 0;\n private totalToolCalls: number = 0;\n private totalApiDuration: number = 0;\n private totalWallDuration: number = 0;\n private startTime: number;\n private inputTokens: number = 0;\n private outputTokens: number = 0;\n private cachedInputTokens: number = 0;\n private turns: number = 0;\n\n constructor() {\n this.startTime = Date.now();\n }\n\n updateStats(stats: {\n newProcessedFiles?: number;\n newCost?: number;\n newToolCalls?: number;\n newApiDuration?: number;\n newWallDuration?: number;\n newInputTokens?: number;\n newOutputTokens?: number;\n newCachedInputTokens?: number;\n newTurns?: number;\n }) {\n if (stats.newProcessedFiles) {\n this.processedFiles += stats.newProcessedFiles;\n }\n if (stats.newCost) {\n this.totalCost += stats.newCost;\n }\n if (stats.newToolCalls) {\n this.totalToolCalls += stats.newToolCalls;\n }\n if (stats.newApiDuration) {\n this.totalApiDuration += stats.newApiDuration;\n }\n if (stats.newWallDuration) {\n this.totalWallDuration += stats.newWallDuration;\n }\n if (stats.newInputTokens) {\n this.inputTokens += stats.newInputTokens;\n }\n if (stats.newOutputTokens) {\n this.outputTokens += stats.newOutputTokens;\n }\n if (stats.newCachedInputTokens) {\n this.cachedInputTokens += stats.newCachedInputTokens;\n }\n if (stats.newTurns) {\n this.turns += stats.newTurns;\n }\n }\n\n getStats() {\n return {\n totalFiles: this.totalFiles,\n processedFiles: this.processedFiles,\n totalCost: this.totalCost,\n totalToolCalls: this.totalToolCalls,\n totalApiDuration: this.totalApiDuration,\n totalWallDuration: this.totalWallDuration,\n startTime: this.startTime,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n cachedInputTokens: this.cachedInputTokens,\n turns: this.turns,\n };\n }\n\n recordTelemetry(success: boolean) {\n Sentry.getActiveSpan()?.setAttributes({\n 'agent.total_input_tokens': this.inputTokens,\n 'agent.total_cached_input_tokens': this.cachedInputTokens,\n 'agent.total_output_tokens': this.outputTokens,\n 'agent.total_turns': this.turns,\n 'agent.total_cost_usd': this.totalCost,\n 'agent.total_wall_duration_ms': this.totalWallDuration,\n 'agent.total_api_duration_ms': this.totalApiDuration,\n 'agent.total_files_processed': this.processedFiles,\n 'agent.total_tool_calls': this.totalToolCalls,\n 'agent.success': success,\n });\n\n posthog.capture({\n distinctId: getSessionId(),\n event: 'agent_stats',\n properties: {\n total_files: this.processedFiles,\n total_turns: this.turns,\n total_input_tokens: this.inputTokens,\n total_output_tokens: this.outputTokens,\n total_cost_usd: this.totalCost,\n total_wall_duration_ms: this.totalWallDuration,\n total_api_duration_ms: this.totalApiDuration,\n total_files_processed: this.processedFiles,\n total_tool_calls: this.totalToolCalls,\n success: success,\n },\n });\n }\n}\n"],"names":[],"mappings":"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","debug_id":"24d19598-ee2b-5e12-9264-36c1477ffac0"}
1
+ {"version":3,"file":"stats.js","sourceRoot":"/","sources":["utils/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,UAAU;IACb,UAAU,GAAW,CAAC,CAAC;IACvB,cAAc,GAAW,CAAC,CAAC;IAC3B,SAAS,GAAW,CAAC,CAAC;IACtB,cAAc,GAAW,CAAC,CAAC;IAC3B,gBAAgB,GAAW,CAAC,CAAC;IAC7B,iBAAiB,GAAW,CAAC,CAAC;IAC9B,SAAS,CAAS;IAClB,WAAW,GAAW,CAAC,CAAC;IACxB,YAAY,GAAW,CAAC,CAAC;IACzB,iBAAiB,GAAW,CAAC,CAAC;IAC9B,KAAK,GAAW,CAAC,CAAC;IAE1B;QACE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,KAUX;QACC,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,iBAAiB,CAAC;QACjD,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC;QAClC,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,YAAY,CAAC;QAC5C,CAAC;QACD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC,cAAc,CAAC;QAChD,CAAC;QACD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,eAAe,CAAC;QAClD,CAAC;QACD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,cAAc,CAAC;QAC3C,CAAC;QACD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,eAAe,CAAC;QAC7C,CAAC;QACD,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,oBAAoB,CAAC;QACvD,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,eAAe,CAAC,OAAgB;QAC9B,MAAM,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC;YACpC,0BAA0B,EAAE,IAAI,CAAC,WAAW;YAC5C,iCAAiC,EAAE,IAAI,CAAC,iBAAiB;YACzD,2BAA2B,EAAE,IAAI,CAAC,YAAY;YAC9C,mBAAmB,EAAE,IAAI,CAAC,KAAK;YAC/B,sBAAsB,EAAE,IAAI,CAAC,SAAS;YACtC,8BAA8B,EAAE,IAAI,CAAC,iBAAiB;YACtD,6BAA6B,EAAE,IAAI,CAAC,gBAAgB;YACpD,6BAA6B,EAAE,IAAI,CAAC,cAAc;YAClD,wBAAwB,EAAE,IAAI,CAAC,cAAc;YAC7C,eAAe,EAAE,OAAO;SACzB,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC;YACd,UAAU,EAAE,YAAY,EAAE;YAC1B,KAAK,EAAE,aAAa;YACpB,UAAU,EAAE;gBACV,WAAW,EAAE,IAAI,CAAC,cAAc;gBAChC,WAAW,EAAE,IAAI,CAAC,KAAK;gBACvB,kBAAkB,EAAE,IAAI,CAAC,WAAW;gBACpC,mBAAmB,EAAE,IAAI,CAAC,YAAY;gBACtC,cAAc,EAAE,IAAI,CAAC,SAAS;gBAC9B,sBAAsB,EAAE,IAAI,CAAC,iBAAiB;gBAC9C,qBAAqB,EAAE,IAAI,CAAC,gBAAgB;gBAC5C,qBAAqB,EAAE,IAAI,CAAC,cAAc;gBAC1C,gBAAgB,EAAE,IAAI,CAAC,cAAc;gBACrC,OAAO,EAAE,OAAO;aACjB;SACF,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { posthog } from '../telemetry.js';\nimport { getSessionId } from './session.js';\nimport * as Sentry from '@sentry/node';\n\nexport class AgentStats {\n private totalFiles: number = 0;\n private processedFiles: number = 0;\n private totalCost: number = 0;\n private totalToolCalls: number = 0;\n private totalApiDuration: number = 0;\n private totalWallDuration: number = 0;\n private startTime: number;\n private inputTokens: number = 0;\n private outputTokens: number = 0;\n private cachedInputTokens: number = 0;\n private turns: number = 0;\n\n constructor() {\n this.startTime = Date.now();\n }\n\n updateStats(stats: {\n newProcessedFiles?: number;\n newCost?: number;\n newToolCalls?: number;\n newApiDuration?: number;\n newWallDuration?: number;\n newInputTokens?: number;\n newOutputTokens?: number;\n newCachedInputTokens?: number;\n newTurns?: number;\n }) {\n if (stats.newProcessedFiles) {\n this.processedFiles += stats.newProcessedFiles;\n }\n if (stats.newCost) {\n this.totalCost += stats.newCost;\n }\n if (stats.newToolCalls) {\n this.totalToolCalls += stats.newToolCalls;\n }\n if (stats.newApiDuration) {\n this.totalApiDuration += stats.newApiDuration;\n }\n if (stats.newWallDuration) {\n this.totalWallDuration += stats.newWallDuration;\n }\n if (stats.newInputTokens) {\n this.inputTokens += stats.newInputTokens;\n }\n if (stats.newOutputTokens) {\n this.outputTokens += stats.newOutputTokens;\n }\n if (stats.newCachedInputTokens) {\n this.cachedInputTokens += stats.newCachedInputTokens;\n }\n if (stats.newTurns) {\n this.turns += stats.newTurns;\n }\n }\n\n getStats() {\n return {\n totalFiles: this.totalFiles,\n processedFiles: this.processedFiles,\n totalCost: this.totalCost,\n totalToolCalls: this.totalToolCalls,\n totalApiDuration: this.totalApiDuration,\n totalWallDuration: this.totalWallDuration,\n startTime: this.startTime,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n cachedInputTokens: this.cachedInputTokens,\n turns: this.turns,\n };\n }\n\n recordTelemetry(success: boolean) {\n Sentry.getActiveSpan()?.setAttributes({\n 'agent.total_input_tokens': this.inputTokens,\n 'agent.total_cached_input_tokens': this.cachedInputTokens,\n 'agent.total_output_tokens': this.outputTokens,\n 'agent.total_turns': this.turns,\n 'agent.total_cost_usd': this.totalCost,\n 'agent.total_wall_duration_ms': this.totalWallDuration,\n 'agent.total_api_duration_ms': this.totalApiDuration,\n 'agent.total_files_processed': this.processedFiles,\n 'agent.total_tool_calls': this.totalToolCalls,\n 'agent.success': success,\n });\n\n posthog.capture({\n distinctId: getSessionId(),\n event: 'agent_stats',\n properties: {\n total_files: this.processedFiles,\n total_turns: this.turns,\n total_input_tokens: this.inputTokens,\n total_output_tokens: this.outputTokens,\n total_cost_usd: this.totalCost,\n total_wall_duration_ms: this.totalWallDuration,\n total_api_duration_ms: this.totalApiDuration,\n total_files_processed: this.processedFiles,\n total_tool_calls: this.totalToolCalls,\n success: success,\n },\n });\n }\n}\n"]}
@@ -8,7 +8,7 @@ Apply this pattern when variables declared outside function scope contain string
8
8
 
9
9
  1. **Minimal footprint**: Minimize code changes by keeping internationalized content in the same file where it originated
10
10
  2. **No file movement**: Avoid moving content between files unless absolutely necessary
11
- 3. **Always add client directives**: Do not add "use client" or "use server" directives
11
+ 3. **Only add the "use client" directive when ABSOLUTELY necessary**: Do not add "use server" directives
12
12
  4. **Scope**: Only use this implementation for string translation (for HTML translation use ALWAYS `<T>`)
13
13
 
14
14
  Rule of thumb for implementation:
package/package.json CHANGED
@@ -1,13 +1,11 @@
1
1
  {
2
2
  "name": "locadex",
3
- "version": "0.1.0-alpha.9",
3
+ "version": "0.1.1",
4
4
  "description": "An AI agent for internationalization",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "bin": {
8
- "locadex": "dist/cli.js",
9
- "locadex-mcp": "dist/mcp.js",
10
- "locadex-mcp-sse": "dist/mcp-sse.js"
8
+ "locadex": "dist/cli.js"
11
9
  },
12
10
  "files": [
13
11
  "dist",
@@ -15,7 +13,6 @@
15
13
  "guides"
16
14
  ],
17
15
  "dependencies": {
18
- "@anthropic-ai/sdk": "^0.52.0",
19
16
  "@clack/prompts": "^1.0.0-alpha.1",
20
17
  "@modelcontextprotocol/sdk": "^1.12.0",
21
18
  "@sentry/cli": "^2.46.0",
@@ -25,11 +22,12 @@
25
22
  "dependency-tree": "^11.1.1",
26
23
  "dotenv": "^16.4.5",
27
24
  "express": "^5.1.0",
28
- "gtx-cli": "^1.2.24-alpha.5",
25
+ "gtx-cli": "^1.2.24",
29
26
  "micromatch": "^4.0.8",
30
27
  "posthog-node": "^4.18.0"
31
28
  },
32
29
  "devDependencies": {
30
+ "@anthropic-ai/sdk": "^0.52.0",
33
31
  "@modelcontextprotocol/inspector": "^0.13.0",
34
32
  "@types/express": "^5.0.2",
35
33
  "@types/jest": "^29.5.14",
@@ -1,3 +0,0 @@
1
- export declare function debug(...args: any[]): void;
2
- export declare function getDebugLocation(): string;
3
- //# sourceMappingURL=debugger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"debugger.d.ts","sourceRoot":"/","sources":["mcp/debugger.ts"],"names":[],"mappings":"AAqBA,wBAAgB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAiB1C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
@@ -1,37 +0,0 @@
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]="0329310b-d542-544f-a626-1c13dd43b861")}catch(e){}}();
3
- import { appendFileSync, existsSync, mkdirSync } 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 debug(...args) {
19
- const logPath = getDebugLogPath();
20
- const timestamp = new Date().toISOString();
21
- const message = args
22
- .map((arg) => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg))
23
- .join(' ');
24
- const logEntry = `[${timestamp}] ${message}\n`;
25
- try {
26
- appendFileSync(logPath, logEntry);
27
- }
28
- catch (error) {
29
- // Fallback to console if file writing fails
30
- console.error('Debug log write failed:', error);
31
- }
32
- }
33
- export function getDebugLocation() {
34
- return getDebugLogPath();
35
- }
36
- //# sourceMappingURL=debugger.js.map
37
- //# debugId=0329310b-d542-544f-a626-1c13dd43b861
@@ -1 +0,0 @@
1
- {"version":3,"file":"debugger.js","sources":["mcp/debugger.ts"],"sourceRoot":"/","sourcesContent":["import { appendFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } 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 debug(...args: any[]): void {\n const logPath = getDebugLogPath();\n const timestamp = new Date().toISOString();\n const message = args\n .map((arg) =>\n typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)\n )\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 }\n}\n\nexport function getDebugLocation(): string {\n return getDebugLogPath();\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,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,KAAK,CAAC,GAAG,IAAW;IAClC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI;SACjB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACX,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;SACA,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,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;IAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC","debug_id":"0329310b-d542-544f-a626-1c13dd43b861"}
package/dist/mcp-sse.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export declare function start(): Promise<void>;
3
- //# sourceMappingURL=mcp-sse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-sse.d.ts","sourceRoot":"/","sources":["mcp-sse.ts"],"names":[],"mappings":";AAcA,wBAAsB,KAAK,kBAuE1B"}
package/dist/mcp-sse.js DELETED
@@ -1,77 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- !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]="1077fad8-46e0-5d35-8ffc-cc8350fa9d60")}catch(e){}}();
4
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
- import { addDocsTools } from './mcp/tools/docs.js';
6
- import { existsSync, readFileSync } from 'node:fs';
7
- import { fromPackageRoot } from './utils/getPaths.js';
8
- import { addGuidesTools } from './mcp/tools/guides.js';
9
- import express from 'express';
10
- import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
11
- import { logger } from './logging/logger.js';
12
- import { findAvailablePort } from './mcp/getPort.js';
13
- import { exit } from './utils/shutdown.js';
14
- export async function start() {
15
- const stateFile = process.env.LOCADEX_FILES_STATE_FILE_PATH;
16
- const logFile = process.env.LOCADEX_LOG_FILE_PATH;
17
- const requestedPort = process.env.PORT ? parseInt(process.env.PORT) : 8888;
18
- const port = await findAvailablePort(requestedPort);
19
- const verbose = process.env.LOCADEX_VERBOSE === 'true';
20
- const debug = process.env.LOCADEX_DEBUG === 'true';
21
- logger.initialize({ verbose, debug }, logFile);
22
- if (stateFile && existsSync(stateFile)) {
23
- const state = JSON.parse(readFileSync(stateFile, 'utf8'));
24
- logger.debugMessage(`[locadex-mcp-sse] state: ${JSON.stringify(state, null, 2)}`);
25
- }
26
- else {
27
- throw new Error(`[locadex-mcp-sse] state file not found: ${stateFile}`);
28
- }
29
- const mcpServer = new McpServer({
30
- name: 'Locadex: AI Agent for Internationalization',
31
- version: JSON.parse(readFileSync(fromPackageRoot('package.json'), 'utf8'))
32
- .version,
33
- });
34
- const app = express();
35
- app.use(express.json());
36
- // Store transports for each session type
37
- const transports = {
38
- streamable: {},
39
- sse: {},
40
- };
41
- addDocsTools(mcpServer);
42
- addGuidesTools(mcpServer);
43
- // SSE endpoint for legacy clients
44
- // Claude Code only supports SSE as of 2025-06-04
45
- app.get('/sse', async (req, res) => {
46
- const transport = new SSEServerTransport('/messages', res);
47
- transports.sse[transport.sessionId] = transport;
48
- res.on('close', () => {
49
- delete transports.sse[transport.sessionId];
50
- });
51
- await mcpServer.connect(transport);
52
- });
53
- // Companion endpoint for sending messages
54
- app.post('/messages', async (req, res) => {
55
- const sessionId = req.query.sessionId;
56
- const transport = transports.sse[sessionId];
57
- if (transport) {
58
- await transport.handlePostMessage(req, res, req.body);
59
- }
60
- else {
61
- res.status(400).send('No transport found for sessionId');
62
- }
63
- });
64
- app.listen(port, () => {
65
- const portMessage = port !== requestedPort
66
- ? `${port} (requested ${requestedPort} was in use)`
67
- : `${port}`;
68
- logger.debugMessage(`[locadex-mcp] started on port ${portMessage} with state file ${stateFile}`);
69
- });
70
- }
71
- // Start the SSE server
72
- start().catch(async (error) => {
73
- logger.error(`[locadex-mcp-sse] Failed to start: ${error instanceof Error ? error.message : String(error)}`);
74
- await exit(1);
75
- });
76
- //# sourceMappingURL=mcp-sse.js.map
77
- //# debugId=1077fad8-46e0-5d35-8ffc-cc8350fa9d60
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-sse.js","sources":["mcp-sse.ts"],"sourceRoot":"/","sourcesContent":["#!/usr/bin/env node\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { addDocsTools } from './mcp/tools/docs.js';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { fromPackageRoot } from './utils/getPaths.js';\nimport { addGuidesTools } from './mcp/tools/guides.js';\nimport express from 'express';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\nimport { logger } from './logging/logger.js';\nimport { findAvailablePort } from './mcp/getPort.js';\nimport { exit } from './utils/shutdown.js';\n\nexport async function start() {\n const stateFile = process.env.LOCADEX_FILES_STATE_FILE_PATH;\n const logFile = process.env.LOCADEX_LOG_FILE_PATH;\n const requestedPort = process.env.PORT ? parseInt(process.env.PORT) : 8888;\n const port = await findAvailablePort(requestedPort);\n\n const verbose = process.env.LOCADEX_VERBOSE === 'true';\n const debug = process.env.LOCADEX_DEBUG === 'true';\n\n logger.initialize({ verbose, debug }, logFile);\n\n if (stateFile && existsSync(stateFile)) {\n const state = JSON.parse(readFileSync(stateFile, 'utf8'));\n logger.debugMessage(\n `[locadex-mcp-sse] state: ${JSON.stringify(state, null, 2)}`\n );\n } else {\n throw new Error(`[locadex-mcp-sse] state file not found: ${stateFile}`);\n }\n\n const mcpServer = new McpServer({\n name: 'Locadex: AI Agent for Internationalization',\n version: JSON.parse(readFileSync(fromPackageRoot('package.json'), 'utf8'))\n .version,\n });\n\n const app = express();\n app.use(express.json());\n\n // Store transports for each session type\n const transports = {\n streamable: {} as Record<string, StreamableHTTPServerTransport>,\n sse: {} as Record<string, SSEServerTransport>,\n };\n\n addDocsTools(mcpServer);\n addGuidesTools(mcpServer);\n\n // SSE endpoint for legacy clients\n // Claude Code only supports SSE as of 2025-06-04\n app.get('/sse', async (req, res) => {\n const transport = new SSEServerTransport('/messages', res);\n transports.sse[transport.sessionId] = transport;\n\n res.on('close', () => {\n delete transports.sse[transport.sessionId];\n });\n\n await mcpServer.connect(transport);\n });\n\n // Companion endpoint for sending messages\n app.post('/messages', async (req, res) => {\n const sessionId = req.query.sessionId as string;\n const transport = transports.sse[sessionId];\n if (transport) {\n await transport.handlePostMessage(req, res, req.body);\n } else {\n res.status(400).send('No transport found for sessionId');\n }\n });\n\n app.listen(port, () => {\n const portMessage =\n port !== requestedPort\n ? `${port} (requested ${requestedPort} was in use)`\n : `${port}`;\n logger.debugMessage(\n `[locadex-mcp] started on port ${portMessage} with state file ${stateFile}`\n );\n });\n}\n\n// Start the SSE server\nstart().catch(async (error) => {\n logger.error(\n `[locadex-mcp-sse] Failed to start: ${error instanceof Error ? error.message : String(error)}`\n );\n await exit(1);\n});\n"],"names":[],"mappings":"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","debug_id":"1077fad8-46e0-5d35-8ffc-cc8350fa9d60"}