@di-code/coding-agent 0.1.4 → 0.1.7

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 (111) hide show
  1. package/README.md +79 -42
  2. package/dist/cli.d.ts +15 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +96 -17
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/clipboard-image.d.ts +3 -3
  7. package/dist/core/clipboard-image.d.ts.map +1 -1
  8. package/dist/core/clipboard-image.js +26 -13
  9. package/dist/core/clipboard-image.js.map +1 -1
  10. package/dist/core/resources/loader.d.ts.map +1 -1
  11. package/dist/core/resources/loader.js +15 -42
  12. package/dist/core/resources/loader.js.map +1 -1
  13. package/dist/core/resources/types.d.ts +6 -9
  14. package/dist/core/resources/types.d.ts.map +1 -1
  15. package/dist/core/resources/types.js.map +1 -1
  16. package/dist/core/session/session-manager.d.ts +12 -1
  17. package/dist/core/session/session-manager.d.ts.map +1 -1
  18. package/dist/core/session/session-manager.js +66 -3
  19. package/dist/core/session/session-manager.js.map +1 -1
  20. package/dist/core/session/session-storage.d.ts.map +1 -1
  21. package/dist/core/session/session-storage.js +29 -15
  22. package/dist/core/session/session-storage.js.map +1 -1
  23. package/dist/core/session/types.d.ts +6 -1
  24. package/dist/core/session/types.d.ts.map +1 -1
  25. package/dist/core/session/types.js +1 -1
  26. package/dist/core/session/types.js.map +1 -1
  27. package/dist/core/session.d.ts +23 -1
  28. package/dist/core/session.d.ts.map +1 -1
  29. package/dist/core/session.js +86 -13
  30. package/dist/core/session.js.map +1 -1
  31. package/dist/core/system-prompt.js +2 -2
  32. package/dist/core/system-prompt.js.map +1 -1
  33. package/dist/core/tools/file-search.d.ts +14 -0
  34. package/dist/core/tools/file-search.d.ts.map +1 -0
  35. package/dist/core/tools/file-search.js +99 -0
  36. package/dist/core/tools/file-search.js.map +1 -0
  37. package/dist/core/tools/glob.d.ts +11 -0
  38. package/dist/core/tools/glob.d.ts.map +1 -0
  39. package/dist/core/tools/glob.js +44 -0
  40. package/dist/core/tools/glob.js.map +1 -0
  41. package/dist/core/tools/grep.d.ts +13 -0
  42. package/dist/core/tools/grep.d.ts.map +1 -0
  43. package/dist/core/tools/grep.js +67 -0
  44. package/dist/core/tools/grep.js.map +1 -0
  45. package/dist/core/tools/load-skill.d.ts +10 -0
  46. package/dist/core/tools/load-skill.d.ts.map +1 -0
  47. package/dist/core/tools/load-skill.js +22 -0
  48. package/dist/core/tools/load-skill.js.map +1 -0
  49. package/dist/core/tools/path-boundary.d.ts +2 -0
  50. package/dist/core/tools/path-boundary.d.ts.map +1 -1
  51. package/dist/core/tools/path-boundary.js +4 -0
  52. package/dist/core/tools/path-boundary.js.map +1 -1
  53. package/dist/core/user-data.d.ts +3 -0
  54. package/dist/core/user-data.d.ts.map +1 -0
  55. package/dist/core/user-data.js +8 -0
  56. package/dist/core/user-data.js.map +1 -0
  57. package/dist/entry.js +13 -0
  58. package/dist/entry.js.map +1 -1
  59. package/dist/extensions/runtime.js +2 -2
  60. package/dist/extensions/runtime.js.map +1 -1
  61. package/dist/i18n.d.ts +5 -0
  62. package/dist/i18n.d.ts.map +1 -0
  63. package/dist/i18n.js +225 -0
  64. package/dist/i18n.js.map +1 -0
  65. package/dist/index.d.ts +3 -0
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +3 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/main.d.ts +17 -0
  70. package/dist/main.d.ts.map +1 -1
  71. package/dist/main.js +243 -11
  72. package/dist/main.js.map +1 -1
  73. package/dist/mcp/config.d.ts +33 -0
  74. package/dist/mcp/config.d.ts.map +1 -0
  75. package/dist/mcp/config.js +211 -0
  76. package/dist/mcp/config.js.map +1 -0
  77. package/dist/mcp/loader.d.ts +21 -0
  78. package/dist/mcp/loader.d.ts.map +1 -0
  79. package/dist/mcp/loader.js +60 -0
  80. package/dist/mcp/loader.js.map +1 -0
  81. package/dist/mcp/tool-adapter.d.ts +5 -0
  82. package/dist/mcp/tool-adapter.d.ts.map +1 -0
  83. package/dist/mcp/tool-adapter.js +149 -0
  84. package/dist/mcp/tool-adapter.js.map +1 -0
  85. package/dist/modes/interactive-components.d.ts +2 -2
  86. package/dist/modes/interactive-components.d.ts.map +1 -1
  87. package/dist/modes/interactive-components.js +30 -33
  88. package/dist/modes/interactive-components.js.map +1 -1
  89. package/dist/modes/interactive-state.d.ts.map +1 -1
  90. package/dist/modes/interactive-state.js +2 -1
  91. package/dist/modes/interactive-state.js.map +1 -1
  92. package/dist/modes/interactive.d.ts +9 -0
  93. package/dist/modes/interactive.d.ts.map +1 -1
  94. package/dist/modes/interactive.js +209 -63
  95. package/dist/modes/interactive.js.map +1 -1
  96. package/dist/modes/tree-selector.d.ts +30 -0
  97. package/dist/modes/tree-selector.d.ts.map +1 -0
  98. package/dist/modes/tree-selector.js +205 -0
  99. package/dist/modes/tree-selector.js.map +1 -0
  100. package/dist/plugins/loader.d.ts +19 -1
  101. package/dist/plugins/loader.d.ts.map +1 -1
  102. package/dist/plugins/loader.js +21 -2
  103. package/dist/plugins/loader.js.map +1 -1
  104. package/dist/provider-onboarding.d.ts.map +1 -1
  105. package/dist/provider-onboarding.js +119 -22
  106. package/dist/provider-onboarding.js.map +1 -1
  107. package/dist/startup.d.ts +34 -2
  108. package/dist/startup.d.ts.map +1 -1
  109. package/dist/startup.js +278 -9
  110. package/dist/startup.js.map +1 -1
  111. package/package.json +6 -4
@@ -52,6 +52,10 @@ export async function resolveAllowedMutationPath(inputPath, allowedRoot) {
52
52
  }
53
53
  }
54
54
  export async function resolveAllowedFilePath(inputPath, allowedRoot) {
55
+ return resolveAllowedExistingPath(inputPath, allowedRoot);
56
+ }
57
+ /** Resolve an existing file or directory while enforcing the realpath root boundary. */
58
+ export async function resolveAllowedExistingPath(inputPath, allowedRoot) {
55
59
  const rootReal = await realpath(allowedRoot);
56
60
  const candidate = resolve(rootReal, inputPath);
57
61
  assertInsideRoot(rootReal, candidate);
@@ -1 +1 @@
1
- {"version":3,"file":"path-boundary.js","sourceRoot":"","sources":["../../../src/core/tools/path-boundary.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstat, realpath } from \"node:fs/promises\";\nimport { basename, dirname, isAbsolute, relative, resolve, sep } from \"node:path\";\n\nfunction assertInsideRoot(root: string, target: string): void {\n\tconst fromRoot = relative(root, target);\n\tif (fromRoot === \"\" || (fromRoot !== \"..\" && !fromRoot.startsWith(`..${sep}`) && !isAbsolute(fromRoot))) {\n\t\treturn;\n\t}\n\tthrow new Error(\"Path is outside the allowed root\");\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n\t);\n}\n\nexport async function resolveAllowedMutationPath(inputPath: string, allowedRoot: string): Promise<string> {\n\tconst rootReal = await realpath(allowedRoot);\n\tconst candidate = resolve(rootReal, inputPath);\n\tassertInsideRoot(rootReal, candidate);\n\n\tconst missingSegments: string[] = [];\n\tlet current = candidate;\n\n\twhile (true) {\n\t\ttry {\n\t\t\tconst currentReal = await realpath(current);\n\t\t\tassertInsideRoot(rootReal, currentReal);\n\t\t\tconst target = resolve(currentReal, ...missingSegments.reverse());\n\t\t\tassertInsideRoot(rootReal, target);\n\t\t\treturn target;\n\t\t} catch (error) {\n\t\t\tif (!isMissingPathError(error)) throw error;\n\t\t\tlet entryExists = false;\n\t\t\ttry {\n\t\t\t\tconst entry = await lstat(current);\n\t\t\t\tif (entry.isSymbolicLink()) throw new Error(\"Path is outside the allowed root\");\n\t\t\t\tentryExists = true;\n\t\t\t} catch (entryError) {\n\t\t\t\tif (!isMissingPathError(entryError)) throw entryError;\n\t\t\t}\n\t\t\tif (entryExists) continue;\n\t\t\tconst parent = dirname(current);\n\t\t\tif (parent === current) throw error;\n\t\t\tmissingSegments.push(basename(current));\n\t\t\tcurrent = parent;\n\t\t}\n\t}\n}\n\nexport async function resolveAllowedFilePath(inputPath: string, allowedRoot: string): Promise<string> {\n\tconst rootReal = await realpath(allowedRoot);\n\tconst candidate = resolve(rootReal, inputPath);\n\tassertInsideRoot(rootReal, candidate);\n\tconst targetReal = await realpath(candidate);\n\tassertInsideRoot(rootReal, targetReal);\n\treturn targetReal;\n}\n"]}
1
+ {"version":3,"file":"path-boundary.js","sourceRoot":"","sources":["../../../src/core/tools/path-boundary.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstat, realpath } from \"node:fs/promises\";\nimport { basename, dirname, isAbsolute, relative, resolve, sep } from \"node:path\";\n\nfunction assertInsideRoot(root: string, target: string): void {\n\tconst fromRoot = relative(root, target);\n\tif (fromRoot === \"\" || (fromRoot !== \"..\" && !fromRoot.startsWith(`..${sep}`) && !isAbsolute(fromRoot))) {\n\t\treturn;\n\t}\n\tthrow new Error(\"Path is outside the allowed root\");\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n\t);\n}\n\nexport async function resolveAllowedMutationPath(inputPath: string, allowedRoot: string): Promise<string> {\n\tconst rootReal = await realpath(allowedRoot);\n\tconst candidate = resolve(rootReal, inputPath);\n\tassertInsideRoot(rootReal, candidate);\n\n\tconst missingSegments: string[] = [];\n\tlet current = candidate;\n\n\twhile (true) {\n\t\ttry {\n\t\t\tconst currentReal = await realpath(current);\n\t\t\tassertInsideRoot(rootReal, currentReal);\n\t\t\tconst target = resolve(currentReal, ...missingSegments.reverse());\n\t\t\tassertInsideRoot(rootReal, target);\n\t\t\treturn target;\n\t\t} catch (error) {\n\t\t\tif (!isMissingPathError(error)) throw error;\n\t\t\tlet entryExists = false;\n\t\t\ttry {\n\t\t\t\tconst entry = await lstat(current);\n\t\t\t\tif (entry.isSymbolicLink()) throw new Error(\"Path is outside the allowed root\");\n\t\t\t\tentryExists = true;\n\t\t\t} catch (entryError) {\n\t\t\t\tif (!isMissingPathError(entryError)) throw entryError;\n\t\t\t}\n\t\t\tif (entryExists) continue;\n\t\t\tconst parent = dirname(current);\n\t\t\tif (parent === current) throw error;\n\t\t\tmissingSegments.push(basename(current));\n\t\t\tcurrent = parent;\n\t\t}\n\t}\n}\n\nexport async function resolveAllowedFilePath(inputPath: string, allowedRoot: string): Promise<string> {\n\treturn resolveAllowedExistingPath(inputPath, allowedRoot);\n}\n\n/** Resolve an existing file or directory while enforcing the realpath root boundary. */\nexport async function resolveAllowedExistingPath(inputPath: string, allowedRoot: string): Promise<string> {\n\tconst rootReal = await realpath(allowedRoot);\n\tconst candidate = resolve(rootReal, inputPath);\n\tassertInsideRoot(rootReal, candidate);\n\tconst targetReal = await realpath(candidate);\n\tassertInsideRoot(rootReal, targetReal);\n\treturn targetReal;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ /** Returns a stable, non-path-revealing directory name for workspace-scoped user data. */
2
+ export declare function workspaceStorageKey(cwd: string): string;
3
+ //# sourceMappingURL=user-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-data.d.ts","sourceRoot":"","sources":["../../src/core/user-data.ts"],"names":[],"mappings":"AAGA,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvD"}
@@ -0,0 +1,8 @@
1
+ import { createHash } from "node:crypto";
2
+ import { resolve } from "node:path";
3
+ /** Returns a stable, non-path-revealing directory name for workspace-scoped user data. */
4
+ export function workspaceStorageKey(cwd) {
5
+ const normalized = process.platform === "win32" ? resolve(cwd).toLowerCase() : resolve(cwd);
6
+ return createHash("sha256").update(normalized).digest("hex");
7
+ }
8
+ //# sourceMappingURL=user-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-data.js","sourceRoot":"","sources":["../../src/core/user-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,0FAA0F;AAC1F,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5F,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { resolve } from \"node:path\";\n\n/** Returns a stable, non-path-revealing directory name for workspace-scoped user data. */\nexport function workspaceStorageKey(cwd: string): string {\n\tconst normalized = process.platform === \"win32\" ? resolve(cwd).toLowerCase() : resolve(cwd);\n\treturn createHash(\"sha256\").update(normalized).digest(\"hex\");\n}\n"]}
package/dist/entry.js CHANGED
@@ -1,11 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
+ import { createInterface } from "node:readline/promises";
4
5
  import { ProcessTerminal } from "@di-code/tui";
5
6
  import packageMetadata from "../package.json" with { type: "json" };
6
7
  import { runMain } from "./main.js";
7
8
  import { runProviderOnboarding, shouldStartProviderOnboarding } from "./provider-onboarding.js";
8
9
  import { loadStartupConfiguration, resolveStartupArgs, resolveStartupRuntime } from "./startup.js";
10
+ async function promptProjectTrust(cwd) {
11
+ const readline = createInterface({ input: process.stdin, output: process.stdout });
12
+ try {
13
+ const answer = await readline.question(`Trust project-local Skills, plugins, and extensions in ${cwd}? [y/N] `);
14
+ return /^(?:y|yes)$/i.test(answer.trim());
15
+ }
16
+ finally {
17
+ readline.close();
18
+ }
19
+ }
9
20
  try {
10
21
  const configuration = await loadStartupConfiguration(process.cwd());
11
22
  process.exitCode = await runMain(resolveStartupArgs(process.argv.slice(2)), {
@@ -22,6 +33,8 @@ try {
22
33
  return resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);
23
34
  },
24
35
  startupConfiguration: configuration,
36
+ isInteractiveTerminal: Boolean(process.stdin.isTTY && process.stdout.isTTY),
37
+ promptProjectTrust,
25
38
  stdout: (text) => process.stdout.write(text),
26
39
  stderr: (text) => process.stderr.write(text),
27
40
  });
package/dist/entry.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,eAAe,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAEnG,IAAI,CAAC;IACJ,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;QAC3E,OAAO,EAAE,eAAe,CAAC,OAAO;QAChC,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE;YAC1B,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnF,IAAI,6BAA6B,CAAC,OAAO,EAAE,qBAAqB,EAAE,aAAa,CAAC,EAAE,CAAC;gBAClF,OAAO,qBAAqB,CAAC;oBAC5B,aAAa;oBACb,QAAQ,EAAE,IAAI,eAAe,EAAE;oBAC/B,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC;iBACrC,CAAC,CAAC;YACJ,CAAC;YACD,OAAO,qBAAqB,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1G,CAAC;QACD,oBAAoB,EAAE,aAAa;QACnC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;KAC5C,CAAC,CAAC;AACJ,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;IACjF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACtB,CAAC","sourcesContent":["#!/usr/bin/env node\n\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { ProcessTerminal } from \"@di-code/tui\";\nimport packageMetadata from \"../package.json\" with { type: \"json\" };\nimport { runMain } from \"./main.ts\";\nimport { runProviderOnboarding, shouldStartProviderOnboarding } from \"./provider-onboarding.ts\";\nimport { loadStartupConfiguration, resolveStartupArgs, resolveStartupRuntime } from \"./startup.ts\";\n\ntry {\n\tconst configuration = await loadStartupConfiguration(process.cwd());\n\tprocess.exitCode = await runMain(resolveStartupArgs(process.argv.slice(2)), {\n\t\tversion: packageMetadata.version,\n\t\tcreateRuntime: (command) => {\n\t\t\tconst isInteractiveTerminal = Boolean(process.stdin.isTTY && process.stdout.isTTY);\n\t\t\tif (shouldStartProviderOnboarding(command, isInteractiveTerminal, configuration)) {\n\t\t\t\treturn runProviderOnboarding({\n\t\t\t\t\tconfiguration,\n\t\t\t\t\tterminal: new ProcessTerminal(),\n\t\t\t\t\tagentDir: join(homedir(), \".di-code\"),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);\n\t\t},\n\t\tstartupConfiguration: configuration,\n\t\tstdout: (text) => process.stdout.write(text),\n\t\tstderr: (text) => process.stderr.write(text),\n\t});\n} catch (cause) {\n\tconst message = cause instanceof Error ? cause.message : \"Unknown startup error\";\n\tprocess.stderr.write(`${message}\\n`);\n\tprocess.exitCode = 1;\n}\n"]}
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,eAAe,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAEnG,KAAK,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnF,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,0DAA0D,GAAG,UAAU,CAAC,CAAC;QAChH,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACV,QAAQ,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;AACF,CAAC;AAED,IAAI,CAAC;IACJ,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;QAC3E,OAAO,EAAE,eAAe,CAAC,OAAO;QAChC,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE;YAC1B,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnF,IAAI,6BAA6B,CAAC,OAAO,EAAE,qBAAqB,EAAE,aAAa,CAAC,EAAE,CAAC;gBAClF,OAAO,qBAAqB,CAAC;oBAC5B,aAAa;oBACb,QAAQ,EAAE,IAAI,eAAe,EAAE;oBAC/B,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC;iBACrC,CAAC,CAAC;YACJ,CAAC;YACD,OAAO,qBAAqB,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1G,CAAC;QACD,oBAAoB,EAAE,aAAa;QACnC,qBAAqB,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3E,kBAAkB;QAClB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;KAC5C,CAAC,CAAC;AACJ,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;IACjF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACtB,CAAC","sourcesContent":["#!/usr/bin/env node\n\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { ProcessTerminal } from \"@di-code/tui\";\nimport packageMetadata from \"../package.json\" with { type: \"json\" };\nimport { runMain } from \"./main.ts\";\nimport { runProviderOnboarding, shouldStartProviderOnboarding } from \"./provider-onboarding.ts\";\nimport { loadStartupConfiguration, resolveStartupArgs, resolveStartupRuntime } from \"./startup.ts\";\n\nasync function promptProjectTrust(cwd: string): Promise<boolean> {\n\tconst readline = createInterface({ input: process.stdin, output: process.stdout });\n\ttry {\n\t\tconst answer = await readline.question(`Trust project-local Skills, plugins, and extensions in ${cwd}? [y/N] `);\n\t\treturn /^(?:y|yes)$/i.test(answer.trim());\n\t} finally {\n\t\treadline.close();\n\t}\n}\n\ntry {\n\tconst configuration = await loadStartupConfiguration(process.cwd());\n\tprocess.exitCode = await runMain(resolveStartupArgs(process.argv.slice(2)), {\n\t\tversion: packageMetadata.version,\n\t\tcreateRuntime: (command) => {\n\t\t\tconst isInteractiveTerminal = Boolean(process.stdin.isTTY && process.stdout.isTTY);\n\t\t\tif (shouldStartProviderOnboarding(command, isInteractiveTerminal, configuration)) {\n\t\t\t\treturn runProviderOnboarding({\n\t\t\t\t\tconfiguration,\n\t\t\t\t\tterminal: new ProcessTerminal(),\n\t\t\t\t\tagentDir: join(homedir(), \".di-code\"),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);\n\t\t},\n\t\tstartupConfiguration: configuration,\n\t\tisInteractiveTerminal: Boolean(process.stdin.isTTY && process.stdout.isTTY),\n\t\tpromptProjectTrust,\n\t\tstdout: (text) => process.stdout.write(text),\n\t\tstderr: (text) => process.stderr.write(text),\n\t});\n} catch (cause) {\n\tconst message = cause instanceof Error ? cause.message : \"Unknown startup error\";\n\tprocess.stderr.write(`${message}\\n`);\n\tprocess.exitCode = 1;\n}\n"]}
@@ -134,7 +134,7 @@ function safeDiagnosticMessage(cause) {
134
134
  return message.replace(/(api[_-]?key|token|secret|authorization)=[^\\s]+/gi, "$1=[redacted]").slice(0, 500);
135
135
  }
136
136
  async function discoverProjectPaths(cwd) {
137
- const candidates = [join(cwd, ".di-code", "extensions"), join(cwd, ".pi", "extensions")];
137
+ const candidates = [join(cwd, ".di-code", "extensions")];
138
138
  const paths = [];
139
139
  for (const directory of candidates) {
140
140
  if (!existsSync(directory))
@@ -169,7 +169,7 @@ export async function loadExtensions(options) {
169
169
  const explicitPaths = [...(options.paths ?? [])].map((path) => resolve(cwd, path));
170
170
  const projectPaths = projectTrusted ? await discoverProjectPaths(cwd) : [];
171
171
  if (!projectTrusted) {
172
- const projectDirectories = [join(cwd, ".di-code", "extensions"), join(cwd, ".pi", "extensions")];
172
+ const projectDirectories = [join(cwd, ".di-code", "extensions")];
173
173
  for (const directory of projectDirectories) {
174
174
  if (existsSync(directory)) {
175
175
  diagnostics.push({
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/extensions/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { extname, join, resolve } from \"node:path\";\nimport { validateToolArguments } from \"@di-code/ai\";\nimport type { ProjectTrustManager } from \"./trust.ts\";\nimport type {\n\tExtensionAPI,\n\tExtensionCommand,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionEvent,\n\tExtensionEventHandler,\n\tExtensionEventMap,\n\tExtensionFactory,\n\tExtensionReadOnlyTool,\n} from \"./types.ts\";\n\nexport interface ExtensionHostOptions {\n\treadonly cwd: string;\n\treadonly mode: ExtensionContext[\"mode\"];\n\treadonly projectTrusted: boolean;\n\treadonly abort?: () => void;\n}\n\nexport interface LoadedExtension {\n\treadonly path: string;\n}\n\nexport type ExtensionDiagnosticStage = \"discover\" | \"import\" | \"factory\" | \"register\" | \"handler\";\n\nexport interface ExtensionDiagnostic {\n\treadonly path: string;\n\treadonly stage: ExtensionDiagnosticStage;\n\treadonly message: string;\n}\n\nexport interface ExtensionLoadOptions {\n\treadonly cwd: string;\n\treadonly projectTrusted?: boolean;\n\treadonly trustManager?: ProjectTrustManager;\n\treadonly paths?: readonly string[];\n\treadonly mode?: ExtensionContext[\"mode\"];\n}\n\nexport interface ExtensionLoadResult {\n\treadonly host: ExtensionHost;\n\treadonly loaded: readonly LoadedExtension[];\n\treadonly diagnostics: readonly ExtensionDiagnostic[];\n}\n\nfunction isExtensionPath(path: string): boolean {\n\treturn extname(path) === \".js\" || extname(path) === \".mjs\" || extname(path) === \".ts\";\n}\n\nfunction createContext(options: ExtensionHostOptions, signal?: AbortSignal): ExtensionContext {\n\treturn {\n\t\tcwd: options.cwd,\n\t\tmode: options.mode,\n\t\tsignal,\n\t\tisProjectTrusted: () => options.projectTrusted,\n\t\tabort: options.abort ?? (() => {}),\n\t};\n}\n\nexport class ExtensionHost {\n\tprivate readonly options: ExtensionHostOptions;\n\tprivate readonly context: ExtensionContext;\n\tprivate readonly commands = new Map<string, ExtensionCommand>();\n\tprivate readonly tools = new Map<string, ExtensionReadOnlyTool>();\n\tprivate readonly handlers = new Map<\n\t\tkeyof ExtensionEventMap,\n\t\treadonly { path: string; handler: ExtensionEventHandler<keyof ExtensionEventMap> }[]\n\t>();\n\tprivate readonly runtimeDiagnostics: ExtensionDiagnostic[] = [];\n\n\tconstructor(options: ExtensionHostOptions) {\n\t\tthis.options = options;\n\t\tthis.context = createContext(options);\n\t}\n\n\tget extensionContext(): ExtensionContext {\n\t\treturn this.context;\n\t}\n\n\tlistCommands(): readonly ExtensionCommand[] {\n\t\treturn [...this.commands.values()];\n\t}\n\n\tlistTools(): readonly ExtensionReadOnlyTool[] {\n\t\treturn [...this.tools.values()];\n\t}\n\n\tlistRuntimeDiagnostics(): readonly ExtensionDiagnostic[] {\n\t\treturn [...this.runtimeDiagnostics];\n\t}\n\n\tasync registerExtension(_path: string, factory: ExtensionFactory, pluginId?: string): Promise<void> {\n\t\tconst commands: ExtensionCommand[] = [];\n\t\tconst tools: ExtensionReadOnlyTool[] = [];\n\t\tconst handlers = new Map<keyof ExtensionEventMap, ExtensionEventHandler<keyof ExtensionEventMap>[]>();\n\t\tconst api: ExtensionAPI = {\n\t\t\tregisterCommand: (command) => commands.push(command),\n\t\t\tregisterTool: (tool) => tools.push(tool),\n\t\t\ton: (event, handler) => {\n\t\t\t\tconst list = handlers.get(event) ?? [];\n\t\t\t\tlist.push(handler as ExtensionEventHandler<keyof ExtensionEventMap>);\n\t\t\t\thandlers.set(event, list);\n\t\t\t},\n\t\t};\n\t\tawait factory(api);\n\n\t\tfor (const command of commands) {\n\t\t\tif (RESERVED_INTERACTIVE_COMMANDS.has(command.name))\n\t\t\t\tthrow new Error(`Extension command conflicts with built-in command: ${command.name}`);\n\t\t\tif (this.commands.has(command.name)) throw new Error(`Extension command conflict: \"${command.name}\"`);\n\t\t}\n\t\tfor (const tool of tools) {\n\t\t\tif (pluginId !== undefined && !tool.name.startsWith(`${pluginId}__`))\n\t\t\t\tthrow new Error(`Plugin tool namespace conflict: ${tool.name}`);\n\t\t\tif (this.tools.has(tool.name)) throw new Error(`Extension tool conflict: \"${tool.name}\"`);\n\t\t}\n\t\tfor (const command of commands) this.commands.set(command.name, command);\n\t\tfor (const tool of tools) this.tools.set(tool.name, tool);\n\t\tfor (const [event, list] of handlers) {\n\t\t\tconst existing = this.handlers.get(event) ?? [];\n\t\t\tthis.handlers.set(event, [...existing, ...list.map((handler) => ({ path: _path, handler }))]);\n\t\t}\n\t}\n\n\tasync emit<E extends keyof ExtensionEventMap>(event: ExtensionEventMap[E], signal?: AbortSignal): Promise<void> {\n\t\tconst list = this.handlers.get(event.type) ?? [];\n\t\tconst context = createContext(this.options, signal);\n\t\tfor (const { path, handler } of list) {\n\t\t\ttry {\n\t\t\t\tawait handler(event as ExtensionEvent, context);\n\t\t\t} catch (cause) {\n\t\t\t\tthis.runtimeDiagnostics.push({\n\t\t\t\t\tpath,\n\t\t\t\t\tstage: \"handler\",\n\t\t\t\t\tmessage: `Extension event handler failed: ${safeDiagnosticMessage(cause)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tasync runCommand(name: string, args: string): Promise<void> {\n\t\tconst command = this.commands.get(name);\n\t\tif (!command) throw new Error(`Unknown extension command: \"${name}\"`);\n\t\tconst commandContext: ExtensionCommandContext = { ...this.context, args };\n\t\tawait command.handler(commandContext);\n\t}\n\n\tasync runTool(\n\t\tname: string,\n\t\ttoolCallId: string,\n\t\tinput: unknown,\n\t\tsignal?: AbortSignal,\n\t): Promise<readonly import(\"@di-code/ai\").ToolResultContent[]> {\n\t\tconst tool = this.tools.get(name);\n\t\tif (!tool) throw new Error(`Unknown extension tool: \"${name}\"`);\n\t\tlet parameters: unknown;\n\t\ttry {\n\t\t\tparameters = validateToolArguments(tool, input);\n\t\t} catch (cause) {\n\t\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\t\tthrow new Error(`Tool arguments invalid: ${message}`, { cause });\n\t\t}\n\t\treturn tool.execute(toolCallId, parameters as never, signal, createContext(this.options, signal));\n\t}\n}\n\nconst RESERVED_INTERACTIVE_COMMANDS = new Set([\n\t\"help\",\n\t\"clear\",\n\t\"model\",\n\t\"session\",\n\t\"theme\",\n\t\"settings\",\n\t\"compact\",\n\t\"usage\",\n\t\"retry\",\n]);\n\nfunction safeDiagnosticMessage(cause: unknown): string {\n\tconst message = cause instanceof Error ? cause.message : String(cause);\n\treturn message.replace(/(api[_-]?key|token|secret|authorization)=[^\\\\s]+/gi, \"$1=[redacted]\").slice(0, 500);\n}\n\nasync function discoverProjectPaths(cwd: string): Promise<string[]> {\n\tconst candidates = [join(cwd, \".di-code\", \"extensions\"), join(cwd, \".pi\", \"extensions\")];\n\tconst paths: string[] = [];\n\tfor (const directory of candidates) {\n\t\tif (!existsSync(directory)) continue;\n\t\tconst entries = await readdir(directory, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isFile() && isExtensionPath(entry.name)) paths.push(resolve(directory, entry.name));\n\t\t}\n\t}\n\treturn paths.sort((a, b) => a.localeCompare(b));\n}\n\nasync function importFactory(path: string): Promise<ExtensionFactory> {\n\tlet module: { default?: unknown };\n\ttry {\n\t\tmodule = (await import(path)) as { default?: unknown };\n\t} catch (cause) {\n\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\tthrow new Error(`Failed to import extension: ${message}`, { cause });\n\t}\n\tif (typeof module.default !== \"function\") throw new Error(\"Extension module must export a default factory function\");\n\treturn module.default as ExtensionFactory;\n}\n\nexport async function loadExtensions(options: ExtensionLoadOptions): Promise<ExtensionLoadResult> {\n\tconst cwd = resolve(options.cwd);\n\tconst persistedDecision = options.projectTrusted === undefined ? await options.trustManager?.get(cwd) : null;\n\tconst projectTrusted = options.projectTrusted ?? persistedDecision === true;\n\tconst host = new ExtensionHost({ cwd, mode: options.mode ?? \"json\", projectTrusted });\n\tconst diagnostics: ExtensionDiagnostic[] = [];\n\tconst explicitPaths = [...(options.paths ?? [])].map((path) => resolve(cwd, path));\n\tconst projectPaths = projectTrusted ? await discoverProjectPaths(cwd) : [];\n\tif (!projectTrusted) {\n\t\tconst projectDirectories = [join(cwd, \".di-code\", \"extensions\"), join(cwd, \".pi\", \"extensions\")];\n\t\tfor (const directory of projectDirectories) {\n\t\t\tif (existsSync(directory)) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tpath: directory,\n\t\t\t\t\tstage: \"discover\",\n\t\t\t\t\tmessage: \"Project extension skipped because project trust is not granted\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tconst paths = [...new Set([...explicitPaths, ...projectPaths])].sort((a, b) => a.localeCompare(b));\n\tconst loaded: LoadedExtension[] = [];\n\tfor (const path of paths) {\n\t\ttry {\n\t\t\tconst factory = await importFactory(path);\n\t\t\tawait host.registerExtension(path, factory);\n\t\t\tloaded.push({ path });\n\t\t} catch (cause) {\n\t\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\t\tconst stage: ExtensionDiagnosticStage = message.startsWith(\"Extension module\")\n\t\t\t\t? \"factory\"\n\t\t\t\t: message.startsWith(\"Extension command conflict\") || message.startsWith(\"Extension tool conflict\")\n\t\t\t\t\t? \"register\"\n\t\t\t\t\t: message.startsWith(\"Failed to import extension\")\n\t\t\t\t\t\t? \"import\"\n\t\t\t\t\t\t: \"factory\";\n\t\t\tdiagnostics.push({\n\t\t\t\tpath,\n\t\t\t\tstage,\n\t\t\t\tmessage:\n\t\t\t\t\tstage === \"factory\" && message !== \"Extension module must export a default factory function\"\n\t\t\t\t\t\t? `Failed to load extension: ${message}`\n\t\t\t\t\t\t: message,\n\t\t\t});\n\t\t}\n\t}\n\treturn { host, loaded, diagnostics };\n}\n\nexport function createExtensionHost(options: ExtensionHostOptions): ExtensionHost {\n\treturn new ExtensionHost(options);\n}\n"]}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/extensions/runtime.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA+CpD,SAAS,eAAe,CAAC,IAAY;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AACvF,CAAC;AAED,SAAS,aAAa,CAAC,OAA6B,EAAE,MAAoB;IACzE,OAAO;QACN,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM;QACN,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc;QAC9C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;KAClC,CAAC;AACH,CAAC;AAED,MAAM,OAAO,aAAa;IACR,OAAO,CAAuB;IAC9B,OAAO,CAAmB;IAC1B,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC/C,KAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IACjD,QAAQ,GAAG,IAAI,GAAG,EAGhC,CAAC;IACa,kBAAkB,GAA0B,EAAE,CAAC;IAEhE,YAAY,OAA6B;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,gBAAgB;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,YAAY;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,SAAS;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,sBAAsB;QACrB,OAAO,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAAa,EAAE,OAAyB,EAAE,QAAiB;QAClF,MAAM,QAAQ,GAAuB,EAAE,CAAC;QACxC,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6E,CAAC;QACtG,MAAM,GAAG,GAAiB;YACzB,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACpD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,OAAyD,CAAC,CAAC;gBACrE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC;SACD,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,6BAA6B,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,sDAAsD,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACvF,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QACvG,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,IAAI,CAAC;gBACnE,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACjE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAC3F,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzE,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAoC,KAA2B,EAAE,MAAoB;QAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpD,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC;gBACJ,MAAM,OAAO,CAAC,KAAuB,EAAE,OAAO,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;oBAC5B,IAAI;oBACJ,KAAK,EAAE,SAAS;oBAChB,OAAO,EAAE,mCAAmC,qBAAqB,CAAC,KAAK,CAAC,EAAE;iBAC1E,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,IAAY;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,GAAG,CAAC,CAAC;QACtE,MAAM,cAAc,GAA4B,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1E,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO,CACZ,IAAY,EACZ,UAAkB,EAClB,KAAc,EACd,MAAoB;QAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAC;QAChE,IAAI,UAAmB,CAAC;QACxB,IAAI,CAAC;YACJ,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,UAAmB,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACnG,CAAC;CACD;AAED,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC;IAC7C,MAAM;IACN,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,UAAU;IACV,SAAS;IACT,OAAO;IACP,OAAO;CACP,CAAC,CAAC;AAEH,SAAS,qBAAqB,CAAC,KAAc;IAC5C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,OAAO,CAAC,oDAAoD,EAAE,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7G,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/F,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,MAA6B,CAAC;IAClC,IAAI,CAAC;QACJ,MAAM,GAAG,CAAC,MAAM,MAAM,kCAAC,IAAI,EAAC,CAA0B,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IACrH,OAAO,MAAM,CAAC,OAA2B,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA6B;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,iBAAiB,GAAG,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7G,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,iBAAiB,KAAK,IAAI,CAAC;IAC5E,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IACtF,MAAM,WAAW,GAA0B,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACnF,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,IAAI,CAAC,cAAc,EAAE,CAAC;QACrB,MAAM,kBAAkB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;QACjE,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;YAC5C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,WAAW,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,UAAU;oBACjB,OAAO,EAAE,gEAAgE;iBACzE,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;IACF,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,KAAK,GAA6B,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC;gBAC7E,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,yBAAyB,CAAC;oBAClG,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC;wBACjD,CAAC,CAAC,QAAQ;wBACV,CAAC,CAAC,SAAS,CAAC;YACf,WAAW,CAAC,IAAI,CAAC;gBAChB,IAAI;gBACJ,KAAK;gBACL,OAAO,EACN,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,yDAAyD;oBAC3F,CAAC,CAAC,6BAA6B,OAAO,EAAE;oBACxC,CAAC,CAAC,OAAO;aACX,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAChE,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { extname, join, resolve } from \"node:path\";\nimport { validateToolArguments } from \"@di-code/ai\";\nimport type { ProjectTrustManager } from \"./trust.ts\";\nimport type {\n\tExtensionAPI,\n\tExtensionCommand,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionEvent,\n\tExtensionEventHandler,\n\tExtensionEventMap,\n\tExtensionFactory,\n\tExtensionReadOnlyTool,\n} from \"./types.ts\";\n\nexport interface ExtensionHostOptions {\n\treadonly cwd: string;\n\treadonly mode: ExtensionContext[\"mode\"];\n\treadonly projectTrusted: boolean;\n\treadonly abort?: () => void;\n}\n\nexport interface LoadedExtension {\n\treadonly path: string;\n}\n\nexport type ExtensionDiagnosticStage = \"discover\" | \"import\" | \"factory\" | \"register\" | \"handler\";\n\nexport interface ExtensionDiagnostic {\n\treadonly path: string;\n\treadonly stage: ExtensionDiagnosticStage;\n\treadonly message: string;\n}\n\nexport interface ExtensionLoadOptions {\n\treadonly cwd: string;\n\treadonly projectTrusted?: boolean;\n\treadonly trustManager?: ProjectTrustManager;\n\treadonly paths?: readonly string[];\n\treadonly mode?: ExtensionContext[\"mode\"];\n}\n\nexport interface ExtensionLoadResult {\n\treadonly host: ExtensionHost;\n\treadonly loaded: readonly LoadedExtension[];\n\treadonly diagnostics: readonly ExtensionDiagnostic[];\n}\n\nfunction isExtensionPath(path: string): boolean {\n\treturn extname(path) === \".js\" || extname(path) === \".mjs\" || extname(path) === \".ts\";\n}\n\nfunction createContext(options: ExtensionHostOptions, signal?: AbortSignal): ExtensionContext {\n\treturn {\n\t\tcwd: options.cwd,\n\t\tmode: options.mode,\n\t\tsignal,\n\t\tisProjectTrusted: () => options.projectTrusted,\n\t\tabort: options.abort ?? (() => {}),\n\t};\n}\n\nexport class ExtensionHost {\n\tprivate readonly options: ExtensionHostOptions;\n\tprivate readonly context: ExtensionContext;\n\tprivate readonly commands = new Map<string, ExtensionCommand>();\n\tprivate readonly tools = new Map<string, ExtensionReadOnlyTool>();\n\tprivate readonly handlers = new Map<\n\t\tkeyof ExtensionEventMap,\n\t\treadonly { path: string; handler: ExtensionEventHandler<keyof ExtensionEventMap> }[]\n\t>();\n\tprivate readonly runtimeDiagnostics: ExtensionDiagnostic[] = [];\n\n\tconstructor(options: ExtensionHostOptions) {\n\t\tthis.options = options;\n\t\tthis.context = createContext(options);\n\t}\n\n\tget extensionContext(): ExtensionContext {\n\t\treturn this.context;\n\t}\n\n\tlistCommands(): readonly ExtensionCommand[] {\n\t\treturn [...this.commands.values()];\n\t}\n\n\tlistTools(): readonly ExtensionReadOnlyTool[] {\n\t\treturn [...this.tools.values()];\n\t}\n\n\tlistRuntimeDiagnostics(): readonly ExtensionDiagnostic[] {\n\t\treturn [...this.runtimeDiagnostics];\n\t}\n\n\tasync registerExtension(_path: string, factory: ExtensionFactory, pluginId?: string): Promise<void> {\n\t\tconst commands: ExtensionCommand[] = [];\n\t\tconst tools: ExtensionReadOnlyTool[] = [];\n\t\tconst handlers = new Map<keyof ExtensionEventMap, ExtensionEventHandler<keyof ExtensionEventMap>[]>();\n\t\tconst api: ExtensionAPI = {\n\t\t\tregisterCommand: (command) => commands.push(command),\n\t\t\tregisterTool: (tool) => tools.push(tool),\n\t\t\ton: (event, handler) => {\n\t\t\t\tconst list = handlers.get(event) ?? [];\n\t\t\t\tlist.push(handler as ExtensionEventHandler<keyof ExtensionEventMap>);\n\t\t\t\thandlers.set(event, list);\n\t\t\t},\n\t\t};\n\t\tawait factory(api);\n\n\t\tfor (const command of commands) {\n\t\t\tif (RESERVED_INTERACTIVE_COMMANDS.has(command.name))\n\t\t\t\tthrow new Error(`Extension command conflicts with built-in command: ${command.name}`);\n\t\t\tif (this.commands.has(command.name)) throw new Error(`Extension command conflict: \"${command.name}\"`);\n\t\t}\n\t\tfor (const tool of tools) {\n\t\t\tif (pluginId !== undefined && !tool.name.startsWith(`${pluginId}__`))\n\t\t\t\tthrow new Error(`Plugin tool namespace conflict: ${tool.name}`);\n\t\t\tif (this.tools.has(tool.name)) throw new Error(`Extension tool conflict: \"${tool.name}\"`);\n\t\t}\n\t\tfor (const command of commands) this.commands.set(command.name, command);\n\t\tfor (const tool of tools) this.tools.set(tool.name, tool);\n\t\tfor (const [event, list] of handlers) {\n\t\t\tconst existing = this.handlers.get(event) ?? [];\n\t\t\tthis.handlers.set(event, [...existing, ...list.map((handler) => ({ path: _path, handler }))]);\n\t\t}\n\t}\n\n\tasync emit<E extends keyof ExtensionEventMap>(event: ExtensionEventMap[E], signal?: AbortSignal): Promise<void> {\n\t\tconst list = this.handlers.get(event.type) ?? [];\n\t\tconst context = createContext(this.options, signal);\n\t\tfor (const { path, handler } of list) {\n\t\t\ttry {\n\t\t\t\tawait handler(event as ExtensionEvent, context);\n\t\t\t} catch (cause) {\n\t\t\t\tthis.runtimeDiagnostics.push({\n\t\t\t\t\tpath,\n\t\t\t\t\tstage: \"handler\",\n\t\t\t\t\tmessage: `Extension event handler failed: ${safeDiagnosticMessage(cause)}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tasync runCommand(name: string, args: string): Promise<void> {\n\t\tconst command = this.commands.get(name);\n\t\tif (!command) throw new Error(`Unknown extension command: \"${name}\"`);\n\t\tconst commandContext: ExtensionCommandContext = { ...this.context, args };\n\t\tawait command.handler(commandContext);\n\t}\n\n\tasync runTool(\n\t\tname: string,\n\t\ttoolCallId: string,\n\t\tinput: unknown,\n\t\tsignal?: AbortSignal,\n\t): Promise<readonly import(\"@di-code/ai\").ToolResultContent[]> {\n\t\tconst tool = this.tools.get(name);\n\t\tif (!tool) throw new Error(`Unknown extension tool: \"${name}\"`);\n\t\tlet parameters: unknown;\n\t\ttry {\n\t\t\tparameters = validateToolArguments(tool, input);\n\t\t} catch (cause) {\n\t\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\t\tthrow new Error(`Tool arguments invalid: ${message}`, { cause });\n\t\t}\n\t\treturn tool.execute(toolCallId, parameters as never, signal, createContext(this.options, signal));\n\t}\n}\n\nconst RESERVED_INTERACTIVE_COMMANDS = new Set([\n\t\"help\",\n\t\"clear\",\n\t\"model\",\n\t\"session\",\n\t\"theme\",\n\t\"settings\",\n\t\"compact\",\n\t\"usage\",\n\t\"retry\",\n]);\n\nfunction safeDiagnosticMessage(cause: unknown): string {\n\tconst message = cause instanceof Error ? cause.message : String(cause);\n\treturn message.replace(/(api[_-]?key|token|secret|authorization)=[^\\\\s]+/gi, \"$1=[redacted]\").slice(0, 500);\n}\n\nasync function discoverProjectPaths(cwd: string): Promise<string[]> {\n\tconst candidates = [join(cwd, \".di-code\", \"extensions\")];\n\tconst paths: string[] = [];\n\tfor (const directory of candidates) {\n\t\tif (!existsSync(directory)) continue;\n\t\tconst entries = await readdir(directory, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isFile() && isExtensionPath(entry.name)) paths.push(resolve(directory, entry.name));\n\t\t}\n\t}\n\treturn paths.sort((a, b) => a.localeCompare(b));\n}\n\nasync function importFactory(path: string): Promise<ExtensionFactory> {\n\tlet module: { default?: unknown };\n\ttry {\n\t\tmodule = (await import(path)) as { default?: unknown };\n\t} catch (cause) {\n\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\tthrow new Error(`Failed to import extension: ${message}`, { cause });\n\t}\n\tif (typeof module.default !== \"function\") throw new Error(\"Extension module must export a default factory function\");\n\treturn module.default as ExtensionFactory;\n}\n\nexport async function loadExtensions(options: ExtensionLoadOptions): Promise<ExtensionLoadResult> {\n\tconst cwd = resolve(options.cwd);\n\tconst persistedDecision = options.projectTrusted === undefined ? await options.trustManager?.get(cwd) : null;\n\tconst projectTrusted = options.projectTrusted ?? persistedDecision === true;\n\tconst host = new ExtensionHost({ cwd, mode: options.mode ?? \"json\", projectTrusted });\n\tconst diagnostics: ExtensionDiagnostic[] = [];\n\tconst explicitPaths = [...(options.paths ?? [])].map((path) => resolve(cwd, path));\n\tconst projectPaths = projectTrusted ? await discoverProjectPaths(cwd) : [];\n\tif (!projectTrusted) {\n\t\tconst projectDirectories = [join(cwd, \".di-code\", \"extensions\")];\n\t\tfor (const directory of projectDirectories) {\n\t\t\tif (existsSync(directory)) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tpath: directory,\n\t\t\t\t\tstage: \"discover\",\n\t\t\t\t\tmessage: \"Project extension skipped because project trust is not granted\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tconst paths = [...new Set([...explicitPaths, ...projectPaths])].sort((a, b) => a.localeCompare(b));\n\tconst loaded: LoadedExtension[] = [];\n\tfor (const path of paths) {\n\t\ttry {\n\t\t\tconst factory = await importFactory(path);\n\t\t\tawait host.registerExtension(path, factory);\n\t\t\tloaded.push({ path });\n\t\t} catch (cause) {\n\t\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\t\tconst stage: ExtensionDiagnosticStage = message.startsWith(\"Extension module\")\n\t\t\t\t? \"factory\"\n\t\t\t\t: message.startsWith(\"Extension command conflict\") || message.startsWith(\"Extension tool conflict\")\n\t\t\t\t\t? \"register\"\n\t\t\t\t\t: message.startsWith(\"Failed to import extension\")\n\t\t\t\t\t\t? \"import\"\n\t\t\t\t\t\t: \"factory\";\n\t\t\tdiagnostics.push({\n\t\t\t\tpath,\n\t\t\t\tstage,\n\t\t\t\tmessage:\n\t\t\t\t\tstage === \"factory\" && message !== \"Extension module must export a default factory function\"\n\t\t\t\t\t\t? `Failed to load extension: ${message}`\n\t\t\t\t\t\t: message,\n\t\t\t});\n\t\t}\n\t}\n\treturn { host, loaded, diagnostics };\n}\n\nexport function createExtensionHost(options: ExtensionHostOptions): ExtensionHost {\n\treturn new ExtensionHost(options);\n}\n"]}
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export type Locale = "en" | "zh-CN";
2
+ export declare const DEFAULT_LOCALE: Locale;
3
+ export declare function isLocale(value: unknown): value is Locale;
4
+ export declare function translate(locale: Locale, key: string, ...values: string[]): string;
5
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;AAEpC,eAAO,MAAM,cAAc,EAAE,MAAa,CAAC;AA6N3C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAGlF"}
package/dist/i18n.js ADDED
@@ -0,0 +1,225 @@
1
+ export const DEFAULT_LOCALE = "en";
2
+ const MESSAGES = {
3
+ en: {
4
+ usage: "Usage: di-code [options] <prompt>",
5
+ options: "Options:",
6
+ print: "Print only the final assistant text (default)",
7
+ mode: "Output mode: print, json, or interactive",
8
+ interactive: "Start interactive terminal mode",
9
+ continueSession: "Continue the most recently modified session",
10
+ session: "Create or resume a JSONL session (relative to the work root)",
11
+ image: "Attach a local PNG, JPEG, WebP, or GIF image (repeatable)",
12
+ skill: "Add a SKILL.md file or skill directory (repeatable)",
13
+ noSkills: "Disable all Skill loading",
14
+ noContextFiles: "Disable AGENTS.md discovery and loading",
15
+ trustProject: "Persist trust for project-local Skill discovery",
16
+ untrustProject: "Persist denial for project-local Skill discovery",
17
+ plugin: "Install, list, enable, disable, update, or remove a plugin",
18
+ mcp: "Manage MCP configuration (add <id> -- <command> defaults to local stdio)",
19
+ help: "Show help",
20
+ version: "Show version",
21
+ commands: "commands",
22
+ complete: "complete",
23
+ working: "WORKING",
24
+ ready: "READY",
25
+ error: "ERROR",
26
+ compacting: "COMPACTING",
27
+ retrying: "RETRYING",
28
+ thinking: "Thinking",
29
+ activity: "Activity",
30
+ queue: (count) => `Queue (${count})`,
31
+ errorPrefix: "Error",
32
+ edited: "Edited",
33
+ wrote: "Wrote",
34
+ earlierToolUpdates: (count) => `${count} earlier tool updates`,
35
+ messages: (count) => `${count} messages`,
36
+ context: "ctx",
37
+ total: "total",
38
+ tokens: "tok",
39
+ send: "send",
40
+ pasteImage: "paste image",
41
+ thinkingShortcut: "thinking",
42
+ cancel: "cancel",
43
+ cancelled: "Cancelled",
44
+ model: "model",
45
+ imageShortcut: "image",
46
+ language: "Language",
47
+ settings: "Settings",
48
+ english: "English",
49
+ chinese: "中文",
50
+ contextCompaction: "Context compaction",
51
+ on: "on",
52
+ off: "off",
53
+ compactionUnavailable: "compaction unavailable without a persisted session",
54
+ visibleMessagesCleared: "visible messages cleared",
55
+ nothingToRetry: "nothing to retry",
56
+ manualCompactionStarting: "starting manual compaction",
57
+ manualCompactionComplete: "manual compaction complete",
58
+ currentSession: "Current session",
59
+ inMemorySession: "In-memory session",
60
+ newSession: "New session",
61
+ newSessionDescription: "Start a new persistent conversation.",
62
+ dark: "Dark",
63
+ light: "Light",
64
+ darkTheme: "Dark terminal theme",
65
+ lightTheme: "Light terminal theme",
66
+ openModelSelector: "Open the model selector",
67
+ openSessionSelector: "Open the session selector",
68
+ openTreeSelector: "Browse the current session tree",
69
+ treeTitle: "Branch tree",
70
+ treeNodes: "Branches",
71
+ treePreview: "Preview",
72
+ treeEmpty: "The current session has no history nodes.",
73
+ treeActiveLeaf: "active leaf",
74
+ treeBranchNode: "branch node",
75
+ treeImagesOmitted: "Images are not restored when editing this prompt.",
76
+ treeContinue: "Continue",
77
+ treeEdit: "Edit prompt",
78
+ treeSummarize: "Summarize + branch",
79
+ treeCancel: "Cancel",
80
+ openThemeSelector: "Open the theme selector",
81
+ openSettingsSelector: "Open the settings selector",
82
+ showInteractiveCommands: "Show interactive commands",
83
+ clearVisibleMessages: "Clear visible messages",
84
+ chooseProvider: "Choose a Provider and save its global API key",
85
+ removeProviderKey: "Remove the current Provider global API key",
86
+ compactContext: "Compact the persisted context now",
87
+ showUsage: "Show token and cost usage",
88
+ retryPrompt: "Retry the last failed prompt",
89
+ steerAgent: "Steer the running agent",
90
+ providerSetup: "di-code provider setup",
91
+ login: "di-code login",
92
+ selectProvider: "Select a provider:",
93
+ selectProviderModel: (provider) => `Select a ${provider} model:`,
94
+ enterApiKey: (name) => `Enter ${name} (input is hidden):`,
95
+ apiKeyRequired: "API key cannot be empty. Press Escape to cancel.",
96
+ providerSetupCancelled: "Provider setup cancelled.",
97
+ providerConfigured: "Provider configured for this run.",
98
+ providerSetupFailed: "Provider setup failed.",
99
+ reasoning: "reasoning",
100
+ fauxProvider: "Deterministic local provider",
101
+ customProvider: "Custom",
102
+ customProviderDescription: "Configure a compatible gateway or private endpoint",
103
+ selectCustomApi: "Select an API protocol:",
104
+ enterCustomBaseUrl: "Enter the API base URL (for example, https://gateway.example.com/v1):",
105
+ enterCustomApiKey: "Enter API key (input is hidden):",
106
+ enterCustomModelId: "Enter model ID:",
107
+ modelIdRequired: "Model ID cannot be empty. Press Escape to cancel.",
108
+ customBaseUrlInvalid: "Base URL is invalid.",
109
+ },
110
+ "zh-CN": {
111
+ usage: "用法:di-code [选项] <提示词>",
112
+ options: "选项:",
113
+ print: "只输出最终 assistant 文本(默认)",
114
+ mode: "输出模式:print、json 或 interactive",
115
+ interactive: "启动交互式终端模式",
116
+ continueSession: "继续最近修改的会话",
117
+ session: "创建或恢复 JSONL 会话(相对工作根目录)",
118
+ image: "附加本地 PNG、JPEG、WebP 或 GIF 图片(可重复)",
119
+ skill: "加载一个 SKILL.md 文件或技能目录(可重复)",
120
+ noSkills: "禁用所有 Skill 加载",
121
+ noContextFiles: "禁用 AGENTS.md 发现和加载",
122
+ trustProject: "保存对项目本地 Skill 的信任",
123
+ untrustProject: "保存对项目本地 Skill 的拒绝",
124
+ plugin: "安装、列出、启用、禁用、更新或移除插件",
125
+ mcp: "管理 MCP 配置(add <id> -- <command> 默认为本地 stdio)",
126
+ help: "显示帮助",
127
+ version: "显示版本",
128
+ commands: "命令",
129
+ complete: "补全",
130
+ working: "工作中",
131
+ ready: "就绪",
132
+ error: "错误",
133
+ compacting: "压缩中",
134
+ retrying: "重试中",
135
+ thinking: "思考中",
136
+ activity: "活动",
137
+ queue: (count) => `队列(${count})`,
138
+ errorPrefix: "错误",
139
+ edited: "已编辑",
140
+ wrote: "已写入",
141
+ earlierToolUpdates: (count) => `之前还有 ${count} 条工具更新`,
142
+ messages: (count) => `${count} 条消息`,
143
+ context: "上下文",
144
+ total: "总计",
145
+ tokens: "token",
146
+ send: "发送",
147
+ pasteImage: "粘贴图片",
148
+ thinkingShortcut: "思考",
149
+ cancel: "取消",
150
+ cancelled: "已取消",
151
+ model: "模型",
152
+ imageShortcut: "图片",
153
+ language: "语言",
154
+ settings: "设置",
155
+ english: "English",
156
+ chinese: "中文",
157
+ contextCompaction: "上下文压缩",
158
+ on: "开",
159
+ off: "关",
160
+ compactionUnavailable: "没有持久化会话,无法进行上下文压缩",
161
+ visibleMessagesCleared: "已清除可见消息",
162
+ nothingToRetry: "没有可重试的内容",
163
+ manualCompactionStarting: "开始手动压缩",
164
+ manualCompactionComplete: "手动压缩完成",
165
+ currentSession: "当前会话",
166
+ inMemorySession: "内存会话",
167
+ newSession: "新建会话",
168
+ newSessionDescription: "开始新的持久化对话。",
169
+ dark: "深色",
170
+ light: "浅色",
171
+ darkTheme: "深色终端主题",
172
+ lightTheme: "浅色终端主题",
173
+ openModelSelector: "打开模型选择器",
174
+ openSessionSelector: "打开会话选择器",
175
+ openTreeSelector: "浏览当前会话树",
176
+ treeTitle: "分支树",
177
+ treeNodes: "分支",
178
+ treePreview: "预览",
179
+ treeEmpty: "当前会话还没有历史节点。",
180
+ treeActiveLeaf: "当前叶节点",
181
+ treeBranchNode: "分支节点",
182
+ treeImagesOmitted: "编辑此提示词时不会恢复图片。",
183
+ treeContinue: "从此处继续",
184
+ treeEdit: "编辑提示词",
185
+ treeSummarize: "摘要后分支",
186
+ treeCancel: "取消",
187
+ openThemeSelector: "打开主题选择器",
188
+ openSettingsSelector: "打开设置选择器",
189
+ showInteractiveCommands: "显示交互命令",
190
+ clearVisibleMessages: "清除可见消息",
191
+ chooseProvider: "选择 Provider 并保存全局 API key",
192
+ removeProviderKey: "移除当前 Provider 的全局 API key",
193
+ compactContext: "立即压缩持久化上下文",
194
+ showUsage: "显示 token 和费用用量",
195
+ retryPrompt: "重试上次失败的提示词",
196
+ steerAgent: "调整运行中的 Agent",
197
+ providerSetup: "di-code Provider 设置",
198
+ login: "di-code 登录",
199
+ selectProvider: "选择 Provider:",
200
+ selectProviderModel: (provider) => `选择 ${provider} 模型:`,
201
+ enterApiKey: (name) => `输入 ${name}(输入内容会隐藏):`,
202
+ apiKeyRequired: "API key 不能为空。按 Escape 取消。",
203
+ providerSetupCancelled: "已取消 Provider 设置。",
204
+ providerConfigured: "已为本次运行配置 Provider。",
205
+ providerSetupFailed: "Provider 设置失败。",
206
+ reasoning: "推理",
207
+ fauxProvider: "确定性的本地 Provider",
208
+ customProvider: "Custom",
209
+ customProviderDescription: "配置兼容网关或私有 endpoint",
210
+ selectCustomApi: "选择 API 协议:",
211
+ enterCustomBaseUrl: "输入 API 根地址(例如 https://gateway.example.com/v1):",
212
+ enterCustomApiKey: "输入 API key(输入内容会隐藏):",
213
+ enterCustomModelId: "输入模型 ID:",
214
+ modelIdRequired: "模型 ID 不能为空。按 Escape 取消。",
215
+ customBaseUrlInvalid: "Base URL 无效。",
216
+ },
217
+ };
218
+ export function isLocale(value) {
219
+ return value === "en" || value === "zh-CN";
220
+ }
221
+ export function translate(locale, key, ...values) {
222
+ const message = MESSAGES[locale][key] ?? MESSAGES[DEFAULT_LOCALE][key] ?? key;
223
+ return typeof message === "function" ? message(...values) : message;
224
+ }
225
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"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","sourcesContent":["export type Locale = \"en\" | \"zh-CN\";\n\nexport const DEFAULT_LOCALE: Locale = \"en\";\n\ntype Message = string | ((...values: string[]) => string);\n\nconst MESSAGES: Record<Locale, Record<string, Message>> = {\n\ten: {\n\t\tusage: \"Usage: di-code [options] <prompt>\",\n\t\toptions: \"Options:\",\n\t\tprint: \"Print only the final assistant text (default)\",\n\t\tmode: \"Output mode: print, json, or interactive\",\n\t\tinteractive: \"Start interactive terminal mode\",\n\t\tcontinueSession: \"Continue the most recently modified session\",\n\t\tsession: \"Create or resume a JSONL session (relative to the work root)\",\n\t\timage: \"Attach a local PNG, JPEG, WebP, or GIF image (repeatable)\",\n\t\tskill: \"Add a SKILL.md file or skill directory (repeatable)\",\n\t\tnoSkills: \"Disable all Skill loading\",\n\t\tnoContextFiles: \"Disable AGENTS.md discovery and loading\",\n\t\ttrustProject: \"Persist trust for project-local Skill discovery\",\n\t\tuntrustProject: \"Persist denial for project-local Skill discovery\",\n\t\tplugin: \"Install, list, enable, disable, update, or remove a plugin\",\n\t\tmcp: \"Manage MCP configuration (add <id> -- <command> defaults to local stdio)\",\n\t\thelp: \"Show help\",\n\t\tversion: \"Show version\",\n\t\tcommands: \"commands\",\n\t\tcomplete: \"complete\",\n\t\tworking: \"WORKING\",\n\t\tready: \"READY\",\n\t\terror: \"ERROR\",\n\t\tcompacting: \"COMPACTING\",\n\t\tretrying: \"RETRYING\",\n\t\tthinking: \"Thinking\",\n\t\tactivity: \"Activity\",\n\t\tqueue: (count) => `Queue (${count})`,\n\t\terrorPrefix: \"Error\",\n\t\tedited: \"Edited\",\n\t\twrote: \"Wrote\",\n\t\tearlierToolUpdates: (count) => `${count} earlier tool updates`,\n\t\tmessages: (count) => `${count} messages`,\n\t\tcontext: \"ctx\",\n\t\ttotal: \"total\",\n\t\ttokens: \"tok\",\n\t\tsend: \"send\",\n\t\tpasteImage: \"paste image\",\n\t\tthinkingShortcut: \"thinking\",\n\t\tcancel: \"cancel\",\n\t\tcancelled: \"Cancelled\",\n\t\tmodel: \"model\",\n\t\timageShortcut: \"image\",\n\t\tlanguage: \"Language\",\n\t\tsettings: \"Settings\",\n\t\tenglish: \"English\",\n\t\tchinese: \"中文\",\n\t\tcontextCompaction: \"Context compaction\",\n\t\ton: \"on\",\n\t\toff: \"off\",\n\t\tcompactionUnavailable: \"compaction unavailable without a persisted session\",\n\t\tvisibleMessagesCleared: \"visible messages cleared\",\n\t\tnothingToRetry: \"nothing to retry\",\n\t\tmanualCompactionStarting: \"starting manual compaction\",\n\t\tmanualCompactionComplete: \"manual compaction complete\",\n\t\tcurrentSession: \"Current session\",\n\t\tinMemorySession: \"In-memory session\",\n\t\tnewSession: \"New session\",\n\t\tnewSessionDescription: \"Start a new persistent conversation.\",\n\t\tdark: \"Dark\",\n\t\tlight: \"Light\",\n\t\tdarkTheme: \"Dark terminal theme\",\n\t\tlightTheme: \"Light terminal theme\",\n\t\topenModelSelector: \"Open the model selector\",\n\t\topenSessionSelector: \"Open the session selector\",\n\t\topenTreeSelector: \"Browse the current session tree\",\n\t\ttreeTitle: \"Branch tree\",\n\t\ttreeNodes: \"Branches\",\n\t\ttreePreview: \"Preview\",\n\t\ttreeEmpty: \"The current session has no history nodes.\",\n\t\ttreeActiveLeaf: \"active leaf\",\n\t\ttreeBranchNode: \"branch node\",\n\t\ttreeImagesOmitted: \"Images are not restored when editing this prompt.\",\n\t\ttreeContinue: \"Continue\",\n\t\ttreeEdit: \"Edit prompt\",\n\t\ttreeSummarize: \"Summarize + branch\",\n\t\ttreeCancel: \"Cancel\",\n\t\topenThemeSelector: \"Open the theme selector\",\n\t\topenSettingsSelector: \"Open the settings selector\",\n\t\tshowInteractiveCommands: \"Show interactive commands\",\n\t\tclearVisibleMessages: \"Clear visible messages\",\n\t\tchooseProvider: \"Choose a Provider and save its global API key\",\n\t\tremoveProviderKey: \"Remove the current Provider global API key\",\n\t\tcompactContext: \"Compact the persisted context now\",\n\t\tshowUsage: \"Show token and cost usage\",\n\t\tretryPrompt: \"Retry the last failed prompt\",\n\t\tsteerAgent: \"Steer the running agent\",\n\t\tproviderSetup: \"di-code provider setup\",\n\t\tlogin: \"di-code login\",\n\t\tselectProvider: \"Select a provider:\",\n\t\tselectProviderModel: (provider) => `Select a ${provider} model:`,\n\t\tenterApiKey: (name) => `Enter ${name} (input is hidden):`,\n\t\tapiKeyRequired: \"API key cannot be empty. Press Escape to cancel.\",\n\t\tproviderSetupCancelled: \"Provider setup cancelled.\",\n\t\tproviderConfigured: \"Provider configured for this run.\",\n\t\tproviderSetupFailed: \"Provider setup failed.\",\n\t\treasoning: \"reasoning\",\n\t\tfauxProvider: \"Deterministic local provider\",\n\t\tcustomProvider: \"Custom\",\n\t\tcustomProviderDescription: \"Configure a compatible gateway or private endpoint\",\n\t\tselectCustomApi: \"Select an API protocol:\",\n\t\tenterCustomBaseUrl: \"Enter the API base URL (for example, https://gateway.example.com/v1):\",\n\t\tenterCustomApiKey: \"Enter API key (input is hidden):\",\n\t\tenterCustomModelId: \"Enter model ID:\",\n\t\tmodelIdRequired: \"Model ID cannot be empty. Press Escape to cancel.\",\n\t\tcustomBaseUrlInvalid: \"Base URL is invalid.\",\n\t},\n\t\"zh-CN\": {\n\t\tusage: \"用法:di-code [选项] <提示词>\",\n\t\toptions: \"选项:\",\n\t\tprint: \"只输出最终 assistant 文本(默认)\",\n\t\tmode: \"输出模式:print、json 或 interactive\",\n\t\tinteractive: \"启动交互式终端模式\",\n\t\tcontinueSession: \"继续最近修改的会话\",\n\t\tsession: \"创建或恢复 JSONL 会话(相对工作根目录)\",\n\t\timage: \"附加本地 PNG、JPEG、WebP 或 GIF 图片(可重复)\",\n\t\tskill: \"加载一个 SKILL.md 文件或技能目录(可重复)\",\n\t\tnoSkills: \"禁用所有 Skill 加载\",\n\t\tnoContextFiles: \"禁用 AGENTS.md 发现和加载\",\n\t\ttrustProject: \"保存对项目本地 Skill 的信任\",\n\t\tuntrustProject: \"保存对项目本地 Skill 的拒绝\",\n\t\tplugin: \"安装、列出、启用、禁用、更新或移除插件\",\n\t\tmcp: \"管理 MCP 配置(add <id> -- <command> 默认为本地 stdio)\",\n\t\thelp: \"显示帮助\",\n\t\tversion: \"显示版本\",\n\t\tcommands: \"命令\",\n\t\tcomplete: \"补全\",\n\t\tworking: \"工作中\",\n\t\tready: \"就绪\",\n\t\terror: \"错误\",\n\t\tcompacting: \"压缩中\",\n\t\tretrying: \"重试中\",\n\t\tthinking: \"思考中\",\n\t\tactivity: \"活动\",\n\t\tqueue: (count) => `队列(${count})`,\n\t\terrorPrefix: \"错误\",\n\t\tedited: \"已编辑\",\n\t\twrote: \"已写入\",\n\t\tearlierToolUpdates: (count) => `之前还有 ${count} 条工具更新`,\n\t\tmessages: (count) => `${count} 条消息`,\n\t\tcontext: \"上下文\",\n\t\ttotal: \"总计\",\n\t\ttokens: \"token\",\n\t\tsend: \"发送\",\n\t\tpasteImage: \"粘贴图片\",\n\t\tthinkingShortcut: \"思考\",\n\t\tcancel: \"取消\",\n\t\tcancelled: \"已取消\",\n\t\tmodel: \"模型\",\n\t\timageShortcut: \"图片\",\n\t\tlanguage: \"语言\",\n\t\tsettings: \"设置\",\n\t\tenglish: \"English\",\n\t\tchinese: \"中文\",\n\t\tcontextCompaction: \"上下文压缩\",\n\t\ton: \"开\",\n\t\toff: \"关\",\n\t\tcompactionUnavailable: \"没有持久化会话,无法进行上下文压缩\",\n\t\tvisibleMessagesCleared: \"已清除可见消息\",\n\t\tnothingToRetry: \"没有可重试的内容\",\n\t\tmanualCompactionStarting: \"开始手动压缩\",\n\t\tmanualCompactionComplete: \"手动压缩完成\",\n\t\tcurrentSession: \"当前会话\",\n\t\tinMemorySession: \"内存会话\",\n\t\tnewSession: \"新建会话\",\n\t\tnewSessionDescription: \"开始新的持久化对话。\",\n\t\tdark: \"深色\",\n\t\tlight: \"浅色\",\n\t\tdarkTheme: \"深色终端主题\",\n\t\tlightTheme: \"浅色终端主题\",\n\t\topenModelSelector: \"打开模型选择器\",\n\t\topenSessionSelector: \"打开会话选择器\",\n\t\topenTreeSelector: \"浏览当前会话树\",\n\t\ttreeTitle: \"分支树\",\n\t\ttreeNodes: \"分支\",\n\t\ttreePreview: \"预览\",\n\t\ttreeEmpty: \"当前会话还没有历史节点。\",\n\t\ttreeActiveLeaf: \"当前叶节点\",\n\t\ttreeBranchNode: \"分支节点\",\n\t\ttreeImagesOmitted: \"编辑此提示词时不会恢复图片。\",\n\t\ttreeContinue: \"从此处继续\",\n\t\ttreeEdit: \"编辑提示词\",\n\t\ttreeSummarize: \"摘要后分支\",\n\t\ttreeCancel: \"取消\",\n\t\topenThemeSelector: \"打开主题选择器\",\n\t\topenSettingsSelector: \"打开设置选择器\",\n\t\tshowInteractiveCommands: \"显示交互命令\",\n\t\tclearVisibleMessages: \"清除可见消息\",\n\t\tchooseProvider: \"选择 Provider 并保存全局 API key\",\n\t\tremoveProviderKey: \"移除当前 Provider 的全局 API key\",\n\t\tcompactContext: \"立即压缩持久化上下文\",\n\t\tshowUsage: \"显示 token 和费用用量\",\n\t\tretryPrompt: \"重试上次失败的提示词\",\n\t\tsteerAgent: \"调整运行中的 Agent\",\n\t\tproviderSetup: \"di-code Provider 设置\",\n\t\tlogin: \"di-code 登录\",\n\t\tselectProvider: \"选择 Provider:\",\n\t\tselectProviderModel: (provider) => `选择 ${provider} 模型:`,\n\t\tenterApiKey: (name) => `输入 ${name}(输入内容会隐藏):`,\n\t\tapiKeyRequired: \"API key 不能为空。按 Escape 取消。\",\n\t\tproviderSetupCancelled: \"已取消 Provider 设置。\",\n\t\tproviderConfigured: \"已为本次运行配置 Provider。\",\n\t\tproviderSetupFailed: \"Provider 设置失败。\",\n\t\treasoning: \"推理\",\n\t\tfauxProvider: \"确定性的本地 Provider\",\n\t\tcustomProvider: \"Custom\",\n\t\tcustomProviderDescription: \"配置兼容网关或私有 endpoint\",\n\t\tselectCustomApi: \"选择 API 协议:\",\n\t\tenterCustomBaseUrl: \"输入 API 根地址(例如 https://gateway.example.com/v1):\",\n\t\tenterCustomApiKey: \"输入 API key(输入内容会隐藏):\",\n\t\tenterCustomModelId: \"输入模型 ID:\",\n\t\tmodelIdRequired: \"模型 ID 不能为空。按 Escape 取消。\",\n\t\tcustomBaseUrlInvalid: \"Base URL 无效。\",\n\t},\n};\n\nexport function isLocale(value: unknown): value is Locale {\n\treturn value === \"en\" || value === \"zh-CN\";\n}\n\nexport function translate(locale: Locale, key: string, ...values: string[]): string {\n\tconst message = MESSAGES[locale][key] ?? MESSAGES[DEFAULT_LOCALE][key] ?? key;\n\treturn typeof message === \"function\" ? message(...values) : message;\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -7,5 +7,8 @@ export * from "./core/session/types.ts";
7
7
  export * from "./core/session.ts";
8
8
  export * from "./core/system-prompt.ts";
9
9
  export * from "./extensions/index.ts";
10
+ export * from "./mcp/config.ts";
11
+ export * from "./mcp/loader.ts";
12
+ export * from "./mcp/tool-adapter.ts";
10
13
  export * from "./plugins/index.ts";
11
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -7,5 +7,8 @@ export * from "./core/session/types.js";
7
7
  export * from "./core/session.js";
8
8
  export * from "./core/system-prompt.js";
9
9
  export * from "./extensions/index.js";
10
+ export * from "./mcp/config.js";
11
+ export * from "./mcp/loader.js";
12
+ export * from "./mcp/tool-adapter.js";
10
13
  export * from "./plugins/index.js";
11
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC","sourcesContent":["export * from \"./cli.ts\";\nexport * from \"./core/context-builder.ts\";\nexport * from \"./core/resources/index.ts\";\nexport * from \"./core/session/session-manager.ts\";\nexport * from \"./core/session/session-storage.ts\";\nexport * from \"./core/session/types.ts\";\nexport * from \"./core/session.ts\";\nexport * from \"./core/system-prompt.ts\";\nexport * from \"./extensions/index.ts\";\nexport * from \"./plugins/index.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC","sourcesContent":["export * from \"./cli.ts\";\nexport * from \"./core/context-builder.ts\";\nexport * from \"./core/resources/index.ts\";\nexport * from \"./core/session/session-manager.ts\";\nexport * from \"./core/session/session-storage.ts\";\nexport * from \"./core/session/types.ts\";\nexport * from \"./core/session.ts\";\nexport * from \"./core/system-prompt.ts\";\nexport * from \"./extensions/index.ts\";\nexport * from \"./mcp/config.ts\";\nexport * from \"./mcp/loader.ts\";\nexport * from \"./mcp/tool-adapter.ts\";\nexport * from \"./plugins/index.ts\";\n"]}
package/dist/main.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { Model, Provider } from "@di-code/ai";
2
2
  import { type CliCommand } from "./cli.ts";
3
3
  import { SessionManager } from "./core/session/session-manager.ts";
4
+ import { type Locale } from "./i18n.ts";
4
5
  import { type PrintIo } from "./modes/print.ts";
5
6
  import type { StartupConfiguration } from "./startup.ts";
6
7
  export interface MainRuntime {
@@ -15,7 +16,23 @@ export interface MainOptions extends PrintIo {
15
16
  readonly allowedRoot?: string;
16
17
  readonly agentDir?: string;
17
18
  readonly startupConfiguration?: StartupConfiguration;
19
+ /** Language for built-in human-facing CLI and terminal text. */
20
+ readonly locale?: Locale;
18
21
  readonly now?: () => number;
22
+ /** Whether stdin and stdout are interactive terminals. */
23
+ readonly isInteractiveTerminal?: boolean;
24
+ /** Ask whether project-local Skills, plugins, and extensions may be loaded. */
25
+ readonly promptProjectTrust?: (cwd: string) => Promise<boolean>;
26
+ }
27
+ /** Renders startup states in place so terminal history retains only their final outcome. */
28
+ export declare class StartupStatusRenderer {
29
+ private readonly lines;
30
+ private readonly indexes;
31
+ private readonly write;
32
+ private readonly replaceInPlace;
33
+ private readonly width;
34
+ constructor(write: (text: string) => void, replaceInPlace: boolean, width?: number);
35
+ update(key: string, text: string): void;
19
36
  }
20
37
  export declare function formatSessionLabel(manager: SessionManager, timeZone?: string): string;
21
38
  export declare function runMain(args: readonly string[], options: MainOptions): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,KAAK,UAAU,EAAgC,MAAM,UAAU,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAMnE,OAAO,EAAE,KAAK,OAAO,EAAgB,MAAM,kBAAkB,CAAC;AAG9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,CACvB,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE,CAAC,KACzC,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IACrD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC5B;AAkGD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBrF;AAuCD,wBAAsB,OAAO,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAyJ5F"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,KAAK,UAAU,EAAgC,MAAM,UAAU,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAKnE,OAAO,EAAkB,KAAK,MAAM,EAAa,MAAM,WAAW,CAAC;AAKnE,OAAO,EAAE,KAAK,OAAO,EAAgB,MAAM,kBAAkB,CAAC;AAG9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,CACvB,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE,CAAC,KACzC,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IACrD,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,+EAA+E;IAC/E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AAkDD,4FAA4F;AAC5F,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,SAAK;IAM9E,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;CAavC;AA4HD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBrF;AAuCD,wBAAsB,OAAO,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAoS5F"}