@di-code/coding-agent 0.1.3 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +91 -30
  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/context-builder.d.ts.map +1 -1
  11. package/dist/core/context-builder.js +6 -2
  12. package/dist/core/context-builder.js.map +1 -1
  13. package/dist/core/image-input.d.ts +1 -1
  14. package/dist/core/image-input.d.ts.map +1 -1
  15. package/dist/core/image-input.js +55 -10
  16. package/dist/core/image-input.js.map +1 -1
  17. package/dist/core/resources/loader.d.ts.map +1 -1
  18. package/dist/core/resources/loader.js +15 -42
  19. package/dist/core/resources/loader.js.map +1 -1
  20. package/dist/core/resources/types.d.ts +6 -9
  21. package/dist/core/resources/types.d.ts.map +1 -1
  22. package/dist/core/resources/types.js.map +1 -1
  23. package/dist/core/session/session-manager.d.ts +12 -1
  24. package/dist/core/session/session-manager.d.ts.map +1 -1
  25. package/dist/core/session/session-manager.js +66 -3
  26. package/dist/core/session/session-manager.js.map +1 -1
  27. package/dist/core/session/session-storage.d.ts.map +1 -1
  28. package/dist/core/session/session-storage.js +30 -15
  29. package/dist/core/session/session-storage.js.map +1 -1
  30. package/dist/core/session/types.d.ts +6 -1
  31. package/dist/core/session/types.d.ts.map +1 -1
  32. package/dist/core/session/types.js +1 -1
  33. package/dist/core/session/types.js.map +1 -1
  34. package/dist/core/session.d.ts +38 -3
  35. package/dist/core/session.d.ts.map +1 -1
  36. package/dist/core/session.js +167 -9
  37. package/dist/core/session.js.map +1 -1
  38. package/dist/core/system-prompt.js +2 -2
  39. package/dist/core/system-prompt.js.map +1 -1
  40. package/dist/core/tools/bash.d.ts +2 -2
  41. package/dist/core/tools/bash.d.ts.map +1 -1
  42. package/dist/core/tools/bash.js.map +1 -1
  43. package/dist/core/tools/edit-diff.d.ts +25 -0
  44. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  45. package/dist/core/tools/edit-diff.js +136 -0
  46. package/dist/core/tools/edit-diff.js.map +1 -0
  47. package/dist/core/tools/edit.d.ts +13 -4
  48. package/dist/core/tools/edit.d.ts.map +1 -1
  49. package/dist/core/tools/edit.js +64 -30
  50. package/dist/core/tools/edit.js.map +1 -1
  51. package/dist/core/tools/file-search.d.ts +14 -0
  52. package/dist/core/tools/file-search.d.ts.map +1 -0
  53. package/dist/core/tools/file-search.js +99 -0
  54. package/dist/core/tools/file-search.js.map +1 -0
  55. package/dist/core/tools/glob.d.ts +11 -0
  56. package/dist/core/tools/glob.d.ts.map +1 -0
  57. package/dist/core/tools/glob.js +44 -0
  58. package/dist/core/tools/glob.js.map +1 -0
  59. package/dist/core/tools/grep.d.ts +13 -0
  60. package/dist/core/tools/grep.d.ts.map +1 -0
  61. package/dist/core/tools/grep.js +67 -0
  62. package/dist/core/tools/grep.js.map +1 -0
  63. package/dist/core/tools/load-skill.d.ts +10 -0
  64. package/dist/core/tools/load-skill.d.ts.map +1 -0
  65. package/dist/core/tools/load-skill.js +22 -0
  66. package/dist/core/tools/load-skill.js.map +1 -0
  67. package/dist/core/tools/path-boundary.d.ts +2 -0
  68. package/dist/core/tools/path-boundary.d.ts.map +1 -1
  69. package/dist/core/tools/path-boundary.js +4 -0
  70. package/dist/core/tools/path-boundary.js.map +1 -1
  71. package/dist/core/tools/read.d.ts +2 -2
  72. package/dist/core/tools/read.d.ts.map +1 -1
  73. package/dist/core/tools/read.js.map +1 -1
  74. package/dist/core/tools/write.d.ts +2 -2
  75. package/dist/core/tools/write.d.ts.map +1 -1
  76. package/dist/core/tools/write.js.map +1 -1
  77. package/dist/core/user-data.d.ts +3 -0
  78. package/dist/core/user-data.d.ts.map +1 -0
  79. package/dist/core/user-data.js +8 -0
  80. package/dist/core/user-data.js.map +1 -0
  81. package/dist/entry.js +22 -2
  82. package/dist/entry.js.map +1 -1
  83. package/dist/extensions/runtime.js +2 -2
  84. package/dist/extensions/runtime.js.map +1 -1
  85. package/dist/i18n.d.ts +5 -0
  86. package/dist/i18n.d.ts.map +1 -0
  87. package/dist/i18n.js +223 -0
  88. package/dist/i18n.js.map +1 -0
  89. package/dist/index.d.ts +3 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +3 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/main.d.ts +20 -1
  94. package/dist/main.d.ts.map +1 -1
  95. package/dist/main.js +272 -17
  96. package/dist/main.js.map +1 -1
  97. package/dist/mcp/config.d.ts +33 -0
  98. package/dist/mcp/config.d.ts.map +1 -0
  99. package/dist/mcp/config.js +211 -0
  100. package/dist/mcp/config.js.map +1 -0
  101. package/dist/mcp/loader.d.ts +21 -0
  102. package/dist/mcp/loader.d.ts.map +1 -0
  103. package/dist/mcp/loader.js +60 -0
  104. package/dist/mcp/loader.js.map +1 -0
  105. package/dist/mcp/tool-adapter.d.ts +5 -0
  106. package/dist/mcp/tool-adapter.d.ts.map +1 -0
  107. package/dist/mcp/tool-adapter.js +149 -0
  108. package/dist/mcp/tool-adapter.js.map +1 -0
  109. package/dist/modes/interactive-components.d.ts +2 -0
  110. package/dist/modes/interactive-components.d.ts.map +1 -1
  111. package/dist/modes/interactive-components.js +55 -31
  112. package/dist/modes/interactive-components.js.map +1 -1
  113. package/dist/modes/interactive-diff.d.ts +8 -0
  114. package/dist/modes/interactive-diff.d.ts.map +1 -0
  115. package/dist/modes/interactive-diff.js +78 -0
  116. package/dist/modes/interactive-diff.js.map +1 -0
  117. package/dist/modes/interactive-layout.d.ts +4 -0
  118. package/dist/modes/interactive-layout.d.ts.map +1 -1
  119. package/dist/modes/interactive-layout.js +4 -0
  120. package/dist/modes/interactive-layout.js.map +1 -1
  121. package/dist/modes/interactive-state.d.ts +5 -0
  122. package/dist/modes/interactive-state.d.ts.map +1 -1
  123. package/dist/modes/interactive-state.js +65 -11
  124. package/dist/modes/interactive-state.js.map +1 -1
  125. package/dist/modes/interactive.d.ts +19 -0
  126. package/dist/modes/interactive.d.ts.map +1 -1
  127. package/dist/modes/interactive.js +351 -52
  128. package/dist/modes/interactive.js.map +1 -1
  129. package/dist/modes/tree-selector.d.ts +30 -0
  130. package/dist/modes/tree-selector.d.ts.map +1 -0
  131. package/dist/modes/tree-selector.js +205 -0
  132. package/dist/modes/tree-selector.js.map +1 -0
  133. package/dist/plugins/loader.d.ts +19 -1
  134. package/dist/plugins/loader.d.ts.map +1 -1
  135. package/dist/plugins/loader.js +21 -2
  136. package/dist/plugins/loader.js.map +1 -1
  137. package/dist/provider-onboarding.d.ts +8 -1
  138. package/dist/provider-onboarding.d.ts.map +1 -1
  139. package/dist/provider-onboarding.js +160 -40
  140. package/dist/provider-onboarding.js.map +1 -1
  141. package/dist/rpc-entry.js +1 -1
  142. package/dist/rpc-entry.js.map +1 -1
  143. package/dist/startup.d.ts +34 -3
  144. package/dist/startup.d.ts.map +1 -1
  145. package/dist/startup.js +407 -87
  146. package/dist/startup.js.map +1 -1
  147. package/package.json +7 -4
@@ -58,17 +58,22 @@ export async function loadPlugins(options) {
58
58
  manifest = await readPluginManifest(manifestPath).catch(async () => readPackagePluginManifest(root));
59
59
  }
60
60
  catch (cause) {
61
+ const message = cause instanceof Error ? cause.message : String(cause);
61
62
  diagnostics.push({
62
63
  sourcePath: manifestPath,
63
64
  stage: "manifest",
64
65
  severity: "error",
65
- message: cause instanceof Error ? cause.message : String(cause),
66
+ message,
66
67
  });
68
+ options.onPluginLoadStatus?.({ state: "failed", sourcePath: manifestPath, stage: "manifest", message });
67
69
  continue;
68
70
  }
69
71
  const projectLocal = root.startsWith(resolve(cwd, ".di-code", "plugins"));
70
72
  if (!projectLocal && !enabledGlobal.has(manifest.id))
71
73
  continue;
74
+ options.onPluginLoadStatus?.({ state: "loading", pluginId: manifest.id });
75
+ const toolCount = extensionResult.host.listTools().length;
76
+ const commandCount = extensionResult.host.listCommands().length;
72
77
  try {
73
78
  const entry = await resolvePluginEntry(root, manifest.entry);
74
79
  const module = await jiti.import(entry);
@@ -76,14 +81,28 @@ export async function loadPlugins(options) {
76
81
  throw new Error("plugin entry must export a default factory function");
77
82
  await extensionResult.host.registerExtension(entry, module.default, manifest.id);
78
83
  loaded.push({ manifest, root, sourcePath: manifestPath, projectLocal });
84
+ options.onPluginLoadStatus?.({
85
+ state: "loaded",
86
+ pluginId: manifest.id,
87
+ tools: extensionResult.host.listTools().length - toolCount,
88
+ commands: extensionResult.host.listCommands().length - commandCount,
89
+ });
79
90
  }
80
91
  catch (cause) {
92
+ const message = cause instanceof Error ? cause.message : String(cause);
81
93
  diagnostics.push({
82
94
  pluginId: manifest.id,
83
95
  sourcePath: manifestPath,
84
96
  stage: "import",
85
97
  severity: "error",
86
- message: cause instanceof Error ? cause.message : String(cause),
98
+ message,
99
+ });
100
+ options.onPluginLoadStatus?.({
101
+ state: "failed",
102
+ pluginId: manifest.id,
103
+ sourcePath: manifestPath,
104
+ stage: "import",
105
+ message,
87
106
  });
88
107
  }
89
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport { type ExtensionHost, loadExtensions } from \"../extensions/runtime.ts\";\nimport type { ProjectTrustManager } from \"../extensions/trust.ts\";\nimport type { ExtensionFactory } from \"../extensions/types.ts\";\nimport { PluginManager } from \"./manager.ts\";\nimport { readPackagePluginManifest, readPluginManifest, resolvePluginEntry } from \"./manifest.ts\";\nimport type { DiscoveredPlugin, PluginDiagnostic } from \"./types.ts\";\n\nexport interface PluginLoadOptions {\n\treadonly cwd: string;\n\treadonly agentDir?: string;\n\treadonly projectTrusted?: boolean;\n\treadonly trustManager?: ProjectTrustManager;\n\treadonly mode?: \"interactive\" | \"print\" | \"json\";\n\treadonly explicitPaths?: readonly string[];\n}\n\nexport interface PluginLoadResult {\n\treadonly host: ExtensionHost;\n\treadonly loaded: readonly DiscoveredPlugin[];\n\treadonly diagnostics: readonly PluginDiagnostic[];\n}\n\nasync function isPluginPackage(root: string): Promise<boolean> {\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(await readFile(join(root, \"package.json\"), \"utf8\"));\n\t\treturn typeof parsed === \"object\" && parsed !== null && \"diCode\" in parsed;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function discoverPluginRoots(cwd: string, agentDir: string, trusted: boolean): Promise<string[]> {\n\tconst roots = [...(trusted ? [join(cwd, \".di-code\", \"plugins\")] : []), join(agentDir, \"plugins\", \"installed\")];\n\tconst result: string[] = [];\n\tfor (const root of roots) {\n\t\tif (!existsSync(root)) continue;\n\t\tfor (const entry of await readdir(root, { withFileTypes: true })) {\n\t\t\tif (!entry.isDirectory()) continue;\n\t\t\tconst pluginRoot = join(root, entry.name);\n\t\t\tif (existsSync(join(pluginRoot, \"plugin.json\")) || (await isPluginPackage(pluginRoot)))\n\t\t\t\tresult.push(resolve(pluginRoot));\n\t\t}\n\t}\n\treturn result.sort((a, b) => a.localeCompare(b));\n}\n\nexport async function loadPlugins(options: PluginLoadOptions): Promise<PluginLoadResult> {\n\tconst cwd = resolve(options.cwd);\n\tconst agentDir = resolve(options.agentDir ?? join(cwd, \".di-code\"));\n\tconst trusted =\n\t\toptions.projectTrusted ?? (options.trustManager ? (await options.trustManager.get(cwd)) === true : false);\n\tconst extensionResult = await loadExtensions({\n\t\tcwd,\n\t\tprojectTrusted: trusted,\n\t\ttrustManager: options.trustManager,\n\t\tmode: options.mode,\n\t\tpaths: options.explicitPaths,\n\t});\n\tconst diagnostics: PluginDiagnostic[] = extensionResult.diagnostics.map((diagnostic) => ({\n\t\tsourcePath: diagnostic.path,\n\t\tstage: diagnostic.stage,\n\t\tseverity: \"error\",\n\t\tmessage: diagnostic.message,\n\t}));\n\tconst enabledGlobal = new Set(\n\t\t(await new PluginManager({ agentDir }).list()).filter((plugin) => plugin.enabled).map((plugin) => plugin.id),\n\t);\n\tconst pluginRoots = await discoverPluginRoots(cwd, agentDir, trusted);\n\tconst loaded: DiscoveredPlugin[] = [];\n\tconst jiti = createJiti(import.meta.url, { moduleCache: false });\n\tfor (const root of pluginRoots) {\n\t\tconst manifestPath = join(root, \"plugin.json\");\n\t\tlet manifest: Awaited<ReturnType<typeof readPluginManifest>>;\n\t\ttry {\n\t\t\tmanifest = await readPluginManifest(manifestPath).catch(async () => readPackagePluginManifest(root));\n\t\t} catch (cause) {\n\t\t\tdiagnostics.push({\n\t\t\t\tsourcePath: manifestPath,\n\t\t\t\tstage: \"manifest\",\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage: cause instanceof Error ? cause.message : String(cause),\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst projectLocal = root.startsWith(resolve(cwd, \".di-code\", \"plugins\"));\n\t\tif (!projectLocal && !enabledGlobal.has(manifest.id)) continue;\n\t\ttry {\n\t\t\tconst entry = await resolvePluginEntry(root, manifest.entry);\n\t\t\tconst module = await jiti.import<{ default?: unknown }>(entry);\n\t\t\tif (typeof module.default !== \"function\") throw new Error(\"plugin entry must export a default factory function\");\n\t\t\tawait extensionResult.host.registerExtension(entry, module.default as ExtensionFactory, manifest.id);\n\t\t\tloaded.push({ manifest, root, sourcePath: manifestPath, projectLocal });\n\t\t} catch (cause) {\n\t\t\tdiagnostics.push({\n\t\t\t\tpluginId: manifest.id,\n\t\t\t\tsourcePath: manifestPath,\n\t\t\t\tstage: \"import\",\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage: cause instanceof Error ? cause.message : String(cause),\n\t\t\t});\n\t\t}\n\t}\n\treturn { host: extensionResult.host, loaded, diagnostics };\n}\n"]}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport { type ExtensionHost, loadExtensions } from \"../extensions/runtime.ts\";\nimport type { ProjectTrustManager } from \"../extensions/trust.ts\";\nimport type { ExtensionFactory } from \"../extensions/types.ts\";\nimport { PluginManager } from \"./manager.ts\";\nimport { readPackagePluginManifest, readPluginManifest, resolvePluginEntry } from \"./manifest.ts\";\nimport type { DiscoveredPlugin, PluginDiagnostic, PluginDiagnosticStage } from \"./types.ts\";\n\n/** A plugin loading transition emitted after its manifest is discovered. */\nexport type PluginLoadStatus =\n\t| { readonly state: \"loading\"; readonly pluginId: string }\n\t| { readonly state: \"loaded\"; readonly pluginId: string; readonly tools: number; readonly commands: number }\n\t| {\n\t\t\treadonly state: \"failed\";\n\t\t\treadonly pluginId?: string;\n\t\t\treadonly sourcePath: string;\n\t\t\treadonly stage: Extract<PluginDiagnosticStage, \"manifest\" | \"import\">;\n\t\t\treadonly message: string;\n\t };\n\nexport interface PluginLoadOptions {\n\treadonly cwd: string;\n\treadonly agentDir?: string;\n\treadonly projectTrusted?: boolean;\n\treadonly trustManager?: ProjectTrustManager;\n\treadonly mode?: \"interactive\" | \"print\" | \"json\";\n\treadonly explicitPaths?: readonly string[];\n\t/** Observes packaged plugin import outcomes without affecting the loader. */\n\treadonly onPluginLoadStatus?: (status: PluginLoadStatus) => void;\n}\n\nexport interface PluginLoadResult {\n\treadonly host: ExtensionHost;\n\treadonly loaded: readonly DiscoveredPlugin[];\n\treadonly diagnostics: readonly PluginDiagnostic[];\n}\n\nasync function isPluginPackage(root: string): Promise<boolean> {\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(await readFile(join(root, \"package.json\"), \"utf8\"));\n\t\treturn typeof parsed === \"object\" && parsed !== null && \"diCode\" in parsed;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function discoverPluginRoots(cwd: string, agentDir: string, trusted: boolean): Promise<string[]> {\n\tconst roots = [...(trusted ? [join(cwd, \".di-code\", \"plugins\")] : []), join(agentDir, \"plugins\", \"installed\")];\n\tconst result: string[] = [];\n\tfor (const root of roots) {\n\t\tif (!existsSync(root)) continue;\n\t\tfor (const entry of await readdir(root, { withFileTypes: true })) {\n\t\t\tif (!entry.isDirectory()) continue;\n\t\t\tconst pluginRoot = join(root, entry.name);\n\t\t\tif (existsSync(join(pluginRoot, \"plugin.json\")) || (await isPluginPackage(pluginRoot)))\n\t\t\t\tresult.push(resolve(pluginRoot));\n\t\t}\n\t}\n\treturn result.sort((a, b) => a.localeCompare(b));\n}\n\nexport async function loadPlugins(options: PluginLoadOptions): Promise<PluginLoadResult> {\n\tconst cwd = resolve(options.cwd);\n\tconst agentDir = resolve(options.agentDir ?? join(cwd, \".di-code\"));\n\tconst trusted =\n\t\toptions.projectTrusted ?? (options.trustManager ? (await options.trustManager.get(cwd)) === true : false);\n\tconst extensionResult = await loadExtensions({\n\t\tcwd,\n\t\tprojectTrusted: trusted,\n\t\ttrustManager: options.trustManager,\n\t\tmode: options.mode,\n\t\tpaths: options.explicitPaths,\n\t});\n\tconst diagnostics: PluginDiagnostic[] = extensionResult.diagnostics.map((diagnostic) => ({\n\t\tsourcePath: diagnostic.path,\n\t\tstage: diagnostic.stage,\n\t\tseverity: \"error\",\n\t\tmessage: diagnostic.message,\n\t}));\n\tconst enabledGlobal = new Set(\n\t\t(await new PluginManager({ agentDir }).list()).filter((plugin) => plugin.enabled).map((plugin) => plugin.id),\n\t);\n\tconst pluginRoots = await discoverPluginRoots(cwd, agentDir, trusted);\n\tconst loaded: DiscoveredPlugin[] = [];\n\tconst jiti = createJiti(import.meta.url, { moduleCache: false });\n\tfor (const root of pluginRoots) {\n\t\tconst manifestPath = join(root, \"plugin.json\");\n\t\tlet manifest: Awaited<ReturnType<typeof readPluginManifest>>;\n\t\ttry {\n\t\t\tmanifest = await readPluginManifest(manifestPath).catch(async () => readPackagePluginManifest(root));\n\t\t} catch (cause) {\n\t\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\t\tdiagnostics.push({\n\t\t\t\tsourcePath: manifestPath,\n\t\t\t\tstage: \"manifest\",\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage,\n\t\t\t});\n\t\t\toptions.onPluginLoadStatus?.({ state: \"failed\", sourcePath: manifestPath, stage: \"manifest\", message });\n\t\t\tcontinue;\n\t\t}\n\t\tconst projectLocal = root.startsWith(resolve(cwd, \".di-code\", \"plugins\"));\n\t\tif (!projectLocal && !enabledGlobal.has(manifest.id)) continue;\n\t\toptions.onPluginLoadStatus?.({ state: \"loading\", pluginId: manifest.id });\n\t\tconst toolCount = extensionResult.host.listTools().length;\n\t\tconst commandCount = extensionResult.host.listCommands().length;\n\t\ttry {\n\t\t\tconst entry = await resolvePluginEntry(root, manifest.entry);\n\t\t\tconst module = await jiti.import<{ default?: unknown }>(entry);\n\t\t\tif (typeof module.default !== \"function\") throw new Error(\"plugin entry must export a default factory function\");\n\t\t\tawait extensionResult.host.registerExtension(entry, module.default as ExtensionFactory, manifest.id);\n\t\t\tloaded.push({ manifest, root, sourcePath: manifestPath, projectLocal });\n\t\t\toptions.onPluginLoadStatus?.({\n\t\t\t\tstate: \"loaded\",\n\t\t\t\tpluginId: manifest.id,\n\t\t\t\ttools: extensionResult.host.listTools().length - toolCount,\n\t\t\t\tcommands: extensionResult.host.listCommands().length - commandCount,\n\t\t\t});\n\t\t} catch (cause) {\n\t\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\t\tdiagnostics.push({\n\t\t\t\tpluginId: manifest.id,\n\t\t\t\tsourcePath: manifestPath,\n\t\t\t\tstage: \"import\",\n\t\t\t\tseverity: \"error\",\n\t\t\t\tmessage,\n\t\t\t});\n\t\t\toptions.onPluginLoadStatus?.({\n\t\t\t\tstate: \"failed\",\n\t\t\t\tpluginId: manifest.id,\n\t\t\t\tsourcePath: manifestPath,\n\t\t\t\tstage: \"import\",\n\t\t\t\tmessage,\n\t\t\t});\n\t\t}\n\t}\n\treturn { host: extensionResult.host, loaded, diagnostics };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { type Terminal } from "@di-code/tui";
1
+ import { type Terminal, TUI } from "@di-code/tui";
2
2
  import type { CliCommand } from "./cli.ts";
3
3
  import { type StartupConfiguration, type StartupRuntime } from "./startup.ts";
4
4
  export type StartupRunCommand = Extract<CliCommand, {
@@ -7,7 +7,14 @@ export type StartupRunCommand = Extract<CliCommand, {
7
7
  export interface ProviderOnboardingOptions {
8
8
  readonly configuration: StartupConfiguration;
9
9
  readonly terminal: Terminal;
10
+ readonly agentDir: string;
11
+ }
12
+ export interface InteractiveProviderOnboardingOptions {
13
+ readonly configuration: StartupConfiguration;
14
+ readonly agentDir: string;
15
+ readonly tui: TUI;
10
16
  }
11
17
  export declare function shouldStartProviderOnboarding(command: StartupRunCommand, isInteractiveTerminal: boolean, configuration: StartupConfiguration): boolean;
12
18
  export declare function runProviderOnboarding(options: ProviderOnboardingOptions): Promise<StartupRuntime | undefined>;
19
+ export declare function showInteractiveProviderOnboarding(options: InteractiveProviderOnboardingOptions): Promise<StartupRuntime | undefined>;
13
20
  //# sourceMappingURL=provider-onboarding.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-onboarding.d.ts","sourceRoot":"","sources":["../src/provider-onboarding.ts"],"names":[],"mappings":"AACA,OAAO,EAA+D,KAAK,QAAQ,EAAa,MAAM,cAAc,CAAC;AACrH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAyB,KAAK,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAErG,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAErE,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC5B;AAED,wBAAgB,6BAA6B,CAC5C,OAAO,EAAE,iBAAiB,EAC1B,qBAAqB,EAAE,OAAO,EAC9B,aAAa,EAAE,oBAAoB,GACjC,OAAO,CAOT;AAiGD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAmF7G"}
1
+ {"version":3,"file":"provider-onboarding.d.ts","sourceRoot":"","sources":["../src/provider-onboarding.ts"],"names":[],"mappings":"AACA,OAAO,EAON,KAAK,QAAQ,EAEb,GAAG,EACH,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAEN,KAAK,oBAAoB,EACzB,KAAK,cAAc,EAInB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAErE,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oCAAoC;IACpD,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;CAClB;AAED,wBAAgB,6BAA6B,CAC5C,OAAO,EAAE,iBAAiB,EAC1B,qBAAqB,EAAE,OAAO,EAC9B,aAAa,EAAE,oBAAoB,GACjC,OAAO,CAQT;AA0RD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAkB7G;AAED,wBAAgB,iCAAiC,CAChD,OAAO,EAAE,oCAAoC,GAC3C,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAkBrC"}
@@ -1,14 +1,15 @@
1
1
  import { createFauxProvider, MODELS } from "@di-code/ai";
2
- import { Input, Key, KeybindingsManager, SelectList, Text, TUI } from "@di-code/tui";
3
- import { resolveStartupRuntime } from "./startup.js";
2
+ import { Box, Input, Key, KeybindingsManager, SelectList, Text, TUI, } from "@di-code/tui";
3
+ import { DEFAULT_LOCALE, translate } from "./i18n.js";
4
+ import { resolveStartupRuntime, saveGlobalCustomProvider, saveGlobalProviderApiKey, validateCustomBaseUrl, } from "./startup.js";
4
5
  export function shouldStartProviderOnboarding(command, isInteractiveTerminal, configuration) {
5
6
  return (command.mode === "interactive" &&
6
7
  isInteractiveTerminal &&
7
- configuration.providers.length === 0 &&
8
- !configuration.environment.DI_CODE_PROVIDER?.trim());
8
+ !configuration.environment.DI_CODE_PROVIDER?.trim() &&
9
+ !configuration.defaults?.providerId &&
10
+ configuration.providers.length !== 1);
9
11
  }
10
12
  class OnboardingScreen {
11
- title = new Text("di-code provider setup", 1, 1);
12
13
  prompt = new Text("", 1, 0);
13
14
  error = new Text("", 1, 0);
14
15
  active = null;
@@ -20,36 +21,39 @@ class OnboardingScreen {
20
21
  setError(message) {
21
22
  this.error.setText(message);
22
23
  }
23
- setCancelled() {
24
- this.prompt.setText("Provider setup cancelled.");
24
+ setCancelled(locale) {
25
+ this.prompt.setText(translate(locale, "providerSetupCancelled"));
25
26
  this.error.setText("");
26
27
  this.active = null;
27
28
  }
28
29
  render(width) {
29
- return [
30
- ...this.title.render(width),
31
- ...this.prompt.render(width),
32
- ...this.error.render(width),
33
- ...(this.active?.render(width) ?? []),
34
- ];
30
+ return [...this.prompt.render(width), ...this.error.render(width), ...(this.active?.render(width) ?? [])];
35
31
  }
36
32
  invalidate() {
37
- this.title.invalidate();
38
33
  this.prompt.invalidate();
39
34
  this.error.invalidate();
40
35
  this.active?.invalidate();
41
36
  }
42
37
  }
43
- function providerChoices() {
38
+ function providerChoices(locale) {
44
39
  return [
45
40
  { value: "openai", providerId: "openai", label: "OpenAI", description: "OpenAI Responses API" },
46
- { value: "deepseek", providerId: "deepseek", label: "DeepSeek", description: "DeepSeek Responses API" },
47
- { value: "faux", providerId: "faux", label: "Faux (offline)", description: "Deterministic local provider" },
41
+ { value: "deepseek", providerId: "deepseek", label: "DeepSeek", description: "DeepSeek Chat Completions API" },
42
+ { value: "faux", providerId: "faux", label: "Faux (offline)", description: translate(locale, "fauxProvider") },
48
43
  { value: "zhipu", providerId: "zhipu", label: "Zhipu AI", description: "GLM Chat Completions API" },
49
44
  { value: "anthropic", providerId: "anthropic", label: "Anthropic", description: "Claude Messages API" },
45
+ {
46
+ value: "custom",
47
+ providerId: "custom",
48
+ label: translate(locale, "customProvider"),
49
+ description: translate(locale, "customProviderDescription"),
50
+ },
51
+ { value: "kimi", providerId: "kimi", label: "Kimi", description: "Kimi Coding Chat Completions API" },
50
52
  ];
51
53
  }
52
54
  function modelsFor(providerId) {
55
+ if (providerId === "custom")
56
+ return [];
53
57
  if (providerId === "faux")
54
58
  return [createFauxProvider({ responses: [] }).model];
55
59
  const models = MODELS.filter((model) => model.provider === providerId);
@@ -72,17 +76,41 @@ function apiKeyEnvironmentVariable(providerId) {
72
76
  return "OPENAI_API_KEY";
73
77
  if (providerId === "deepseek")
74
78
  return "DEEPSEEK_API_KEY";
79
+ if (providerId === "kimi")
80
+ return "KIMI_API_KEY";
75
81
  if (providerId === "zhipu")
76
82
  return "ZAI_API_KEY";
77
83
  if (providerId === "anthropic")
78
84
  return "ANTHROPIC_API_KEY";
79
85
  return undefined;
80
86
  }
81
- function modelChoices(models) {
87
+ function providerApi(providerId) {
88
+ if (providerId === "openai")
89
+ return "openai-responses";
90
+ if (providerId === "deepseek" || providerId === "zhipu")
91
+ return "openai-chat-completions";
92
+ if (providerId === "kimi")
93
+ return "openai-chat-completions";
94
+ if (providerId === "anthropic")
95
+ return "anthropic-messages";
96
+ return undefined;
97
+ }
98
+ function customApiChoices() {
99
+ return [
100
+ { value: "openai-responses", label: "OpenAI Responses", description: "OpenAI Responses API" },
101
+ {
102
+ value: "openai-chat-completions",
103
+ label: "OpenAI Chat Completions",
104
+ description: "Chat Completions-compatible API",
105
+ },
106
+ { value: "anthropic-messages", label: "Anthropic Messages", description: "Anthropic Messages API" },
107
+ ];
108
+ }
109
+ function modelChoices(models, locale) {
82
110
  return models.map((model) => ({
83
111
  value: model.id,
84
112
  label: model.name,
85
- description: `${model.id}${model.reasoning ? " - reasoning" : ""}`,
113
+ description: `${model.id}${model.reasoning ? ` - ${translate(locale, "reasoning")}` : ""}`,
86
114
  }));
87
115
  }
88
116
  function onboardingSelectList(items) {
@@ -92,31 +120,32 @@ function onboardingSelectList(items) {
92
120
  }),
93
121
  });
94
122
  }
95
- export function runProviderOnboarding(options) {
123
+ function startProviderOnboarding(options, tui, screen, complete, failure, forceApiKey) {
96
124
  return new Promise((resolve, reject) => {
97
- const tui = new TUI(options.terminal);
98
- const screen = new OnboardingScreen();
125
+ const locale = options.configuration.locale ?? DEFAULT_LOCALE;
99
126
  let settled = false;
127
+ let saving = false;
100
128
  let selectedProvider;
101
129
  const finish = (runtime) => {
102
130
  if (settled)
103
131
  return;
104
132
  settled = true;
105
133
  if (runtime === undefined)
106
- screen.setCancelled();
107
- tui.stop({ finalLines: runtime ? ["Provider configured for this run."] : ["Provider setup cancelled."] });
134
+ screen.setCancelled(locale);
135
+ complete(runtime);
108
136
  resolve(runtime);
109
137
  };
110
138
  const fail = (cause) => {
111
139
  if (settled)
112
140
  return;
113
141
  settled = true;
114
- tui.stop({ finalLines: ["Provider setup failed."] });
142
+ failure();
115
143
  reject(cause);
116
144
  };
117
- const finishSelection = (modelId, apiKey) => {
118
- if (!selectedProvider)
145
+ const finishSelection = async (modelId, apiKey) => {
146
+ if (!selectedProvider || saving || settled)
119
147
  return;
148
+ saving = true;
120
149
  const keyVariable = apiKeyEnvironmentVariable(selectedProvider);
121
150
  const environment = {
122
151
  ...options.configuration.environment,
@@ -125,6 +154,9 @@ export function runProviderOnboarding(options) {
125
154
  ...(keyVariable && apiKey ? { [keyVariable]: apiKey } : {}),
126
155
  };
127
156
  try {
157
+ const api = providerApi(selectedProvider);
158
+ if (apiKey && api)
159
+ await saveGlobalProviderApiKey(options.agentDir, selectedProvider, api, apiKey, modelId);
128
160
  finish(resolveStartupRuntime(environment, options.configuration.providers));
129
161
  }
130
162
  catch (cause) {
@@ -136,46 +168,134 @@ export function runProviderOnboarding(options) {
136
168
  input.onSubmit = (value) => {
137
169
  const key = value.trim();
138
170
  if (key.length === 0) {
139
- screen.setError("API key cannot be empty. Press Escape to cancel.");
171
+ screen.setError(translate(locale, "apiKeyRequired"));
140
172
  tui.requestRender(true);
141
173
  return;
142
174
  }
143
- finishSelection(modelId, key);
175
+ void finishSelection(modelId, key);
144
176
  };
145
177
  input.onEscape = () => finish(undefined);
146
- screen.setStep(`Enter ${keyVariable} (input is hidden):`, input);
178
+ screen.setStep(translate(locale, "enterApiKey", keyVariable), input);
147
179
  tui.setFocus(input);
148
180
  tui.requestRender(true);
149
181
  };
150
182
  const showModels = (choice) => {
151
183
  selectedProvider = choice.providerId;
152
184
  const models = modelsFor(choice.providerId);
153
- const modelList = onboardingSelectList(modelChoices(models));
185
+ const modelList = onboardingSelectList(modelChoices(models, locale));
154
186
  modelList.onSelect = (item) => {
155
187
  const keyVariable = apiKeyEnvironmentVariable(choice.providerId);
156
188
  const existingKey = keyVariable ? options.configuration.environment[keyVariable]?.trim() : undefined;
157
- if (keyVariable && !existingKey)
189
+ if (keyVariable && (forceApiKey || !existingKey))
158
190
  showKey(item.value, keyVariable);
159
191
  else
160
- finishSelection(item.value);
192
+ void finishSelection(item.value);
161
193
  };
162
194
  modelList.onCancel = () => finish(undefined);
163
- screen.setStep(`Select a ${choice.label} model:`, modelList);
195
+ screen.setStep(translate(locale, "selectProviderModel", choice.label), modelList);
164
196
  tui.setFocus(modelList);
165
197
  tui.requestRender(true);
166
198
  };
167
- const providerList = onboardingSelectList(providerChoices());
199
+ const showCustom = () => {
200
+ const protocolList = onboardingSelectList(customApiChoices());
201
+ protocolList.onSelect = (item) => {
202
+ const api = item.value;
203
+ const baseUrlInput = new Input({ cancelOnEndOfTransmission: true });
204
+ baseUrlInput.onSubmit = (value) => {
205
+ let baseUrl;
206
+ try {
207
+ baseUrl = validateCustomBaseUrl(value);
208
+ }
209
+ catch (cause) {
210
+ screen.setError(cause instanceof Error ? cause.message : translate(locale, "customBaseUrlInvalid"));
211
+ tui.requestRender(true);
212
+ return;
213
+ }
214
+ const keyInput = new Input({ mask: "*", cancelOnEndOfTransmission: true });
215
+ keyInput.onSubmit = (keyValue) => {
216
+ const apiKey = keyValue.trim();
217
+ if (!apiKey) {
218
+ screen.setError(translate(locale, "apiKeyRequired"));
219
+ tui.requestRender(true);
220
+ return;
221
+ }
222
+ const modelInput = new Input({ cancelOnEndOfTransmission: true });
223
+ modelInput.onSubmit = (modelValue) => {
224
+ const modelId = modelValue.trim();
225
+ if (!modelId) {
226
+ screen.setError(translate(locale, "modelIdRequired"));
227
+ tui.requestRender(true);
228
+ return;
229
+ }
230
+ if (saving || settled)
231
+ return;
232
+ saving = true;
233
+ void saveGlobalCustomProvider(options.agentDir, { api, baseUrl, apiKey, modelId })
234
+ .then((custom) => {
235
+ const providers = [
236
+ ...options.configuration.providers.filter((provider) => provider.id !== "custom"),
237
+ custom,
238
+ ];
239
+ finish(resolveStartupRuntime({ ...options.configuration.environment, DI_CODE_PROVIDER: "custom", DI_CODE_MODEL: modelId }, providers, { providerId: "custom", modelId }));
240
+ })
241
+ .catch(fail);
242
+ };
243
+ modelInput.onEscape = () => finish(undefined);
244
+ screen.setStep(translate(locale, "enterCustomModelId"), modelInput);
245
+ tui.setFocus(modelInput);
246
+ tui.requestRender(true);
247
+ };
248
+ keyInput.onEscape = () => finish(undefined);
249
+ screen.setStep(translate(locale, "enterCustomApiKey"), keyInput);
250
+ tui.setFocus(keyInput);
251
+ tui.requestRender(true);
252
+ };
253
+ baseUrlInput.onEscape = () => finish(undefined);
254
+ screen.setStep(translate(locale, "enterCustomBaseUrl"), baseUrlInput);
255
+ tui.setFocus(baseUrlInput);
256
+ tui.requestRender(true);
257
+ };
258
+ protocolList.onCancel = () => finish(undefined);
259
+ screen.setStep(translate(locale, "selectCustomApi"), protocolList);
260
+ tui.setFocus(protocolList);
261
+ tui.requestRender(true);
262
+ };
263
+ const providerList = onboardingSelectList(providerChoices(locale));
168
264
  providerList.onSelect = (item) => {
169
- const choice = providerChoices().find((candidate) => candidate.value === item.value);
170
- if (choice)
265
+ const choice = providerChoices(locale).find((candidate) => candidate.value === item.value);
266
+ if (choice?.providerId === "custom")
267
+ showCustom();
268
+ else if (choice)
171
269
  showModels(choice);
172
270
  };
173
271
  providerList.onCancel = () => finish(undefined);
174
- screen.setStep("Select a provider:", providerList);
175
- tui.addChild(screen);
176
- tui.start();
272
+ screen.setStep(translate(locale, "selectProvider"), providerList);
177
273
  tui.setFocus(providerList);
178
274
  tui.requestRender(true);
179
275
  });
180
276
  }
277
+ export function runProviderOnboarding(options) {
278
+ const tui = new TUI(options.terminal);
279
+ const screen = new OnboardingScreen();
280
+ const locale = options.configuration.locale ?? DEFAULT_LOCALE;
281
+ tui.addChild(new Box(screen, { border: "rounded", padding: 1, title: translate(locale, "providerSetup") }));
282
+ tui.start();
283
+ return startProviderOnboarding(options, tui, screen, (runtime) => {
284
+ tui.stop({
285
+ finalLines: [translate(locale, runtime ? "providerConfigured" : "providerSetupCancelled")],
286
+ });
287
+ }, () => tui.stop({ finalLines: [translate(locale, "providerSetupFailed")] }), false);
288
+ }
289
+ export function showInteractiveProviderOnboarding(options) {
290
+ const screen = new OnboardingScreen();
291
+ const locale = options.configuration.locale ?? DEFAULT_LOCALE;
292
+ const panel = new Box(screen, { border: "rounded", padding: 1, title: translate(locale, "login") });
293
+ const overlay = options.tui.showOverlay(panel, {
294
+ width: "70%",
295
+ maxHeight: "60%",
296
+ anchor: "center",
297
+ margin: 1,
298
+ });
299
+ return startProviderOnboarding(options, options.tui, screen, () => overlay.hide(), () => overlay.hide(), true);
300
+ }
181
301
  //# sourceMappingURL=provider-onboarding.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-onboarding.js","sourceRoot":"","sources":["../src/provider-onboarding.ts"],"names":[],"mappings":"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","sourcesContent":["import { createFauxProvider, MODELS, type Model } from \"@di-code/ai\";\nimport { Input, Key, KeybindingsManager, type SelectItem, SelectList, type Terminal, Text, TUI } from \"@di-code/tui\";\nimport type { CliCommand } from \"./cli.ts\";\nimport { resolveStartupRuntime, type StartupConfiguration, type StartupRuntime } from \"./startup.ts\";\n\nexport type StartupRunCommand = Extract<CliCommand, { kind: \"run\" }>;\n\nexport interface ProviderOnboardingOptions {\n\treadonly configuration: StartupConfiguration;\n\treadonly terminal: Terminal;\n}\n\nexport function shouldStartProviderOnboarding(\n\tcommand: StartupRunCommand,\n\tisInteractiveTerminal: boolean,\n\tconfiguration: StartupConfiguration,\n): boolean {\n\treturn (\n\t\tcommand.mode === \"interactive\" &&\n\t\tisInteractiveTerminal &&\n\t\tconfiguration.providers.length === 0 &&\n\t\t!configuration.environment.DI_CODE_PROVIDER?.trim()\n\t);\n}\n\ninterface OnboardingChoice extends SelectItem {\n\treadonly providerId: \"openai\" | \"deepseek\" | \"zhipu\" | \"anthropic\" | \"faux\";\n}\n\nclass OnboardingScreen {\n\tprivate readonly title = new Text(\"di-code provider setup\", 1, 1);\n\tprivate readonly prompt = new Text(\"\", 1, 0);\n\tprivate readonly error = new Text(\"\", 1, 0);\n\tprivate active: SelectList | Input | null = null;\n\n\tsetStep(prompt: string, active: SelectList | Input): void {\n\t\tthis.prompt.setText(prompt);\n\t\tthis.error.setText(\"\");\n\t\tthis.active = active;\n\t}\n\n\tsetError(message: string): void {\n\t\tthis.error.setText(message);\n\t}\n\n\tsetCancelled(): void {\n\t\tthis.prompt.setText(\"Provider setup cancelled.\");\n\t\tthis.error.setText(\"\");\n\t\tthis.active = null;\n\t}\n\n\trender(width: number): string[] {\n\t\treturn [\n\t\t\t...this.title.render(width),\n\t\t\t...this.prompt.render(width),\n\t\t\t...this.error.render(width),\n\t\t\t...(this.active?.render(width) ?? []),\n\t\t];\n\t}\n\n\tinvalidate(): void {\n\t\tthis.title.invalidate();\n\t\tthis.prompt.invalidate();\n\t\tthis.error.invalidate();\n\t\tthis.active?.invalidate();\n\t}\n}\n\nfunction providerChoices(): OnboardingChoice[] {\n\treturn [\n\t\t{ value: \"openai\", providerId: \"openai\", label: \"OpenAI\", description: \"OpenAI Responses API\" },\n\t\t{ value: \"deepseek\", providerId: \"deepseek\", label: \"DeepSeek\", description: \"DeepSeek Responses API\" },\n\t\t{ value: \"faux\", providerId: \"faux\", label: \"Faux (offline)\", description: \"Deterministic local provider\" },\n\t\t{ value: \"zhipu\", providerId: \"zhipu\", label: \"Zhipu AI\", description: \"GLM Chat Completions API\" },\n\t\t{ value: \"anthropic\", providerId: \"anthropic\", label: \"Anthropic\", description: \"Claude Messages API\" },\n\t];\n}\n\nfunction modelsFor(providerId: OnboardingChoice[\"providerId\"]): readonly Model[] {\n\tif (providerId === \"faux\") return [createFauxProvider({ responses: [] }).model];\n\tconst models = MODELS.filter((model) => model.provider === providerId);\n\tif (providerId === \"openai\") {\n\t\tconst preferred = models.find((model) => model.id === \"gpt-4o\");\n\t\treturn preferred ? [preferred, ...models.filter((model) => model !== preferred)] : models;\n\t}\n\tif (providerId === \"zhipu\") {\n\t\tconst preferred = models.find((model) => model.id === \"glm-5.3\");\n\t\treturn preferred ? [preferred, ...models.filter((model) => model !== preferred)] : models;\n\t}\n\tif (providerId === \"anthropic\") {\n\t\tconst preferred = models.find((model) => model.id === \"claude-sonnet-4-5\");\n\t\treturn preferred ? [preferred, ...models.filter((model) => model !== preferred)] : models;\n\t}\n\treturn models;\n}\n\nfunction apiKeyEnvironmentVariable(providerId: OnboardingChoice[\"providerId\"]): string | undefined {\n\tif (providerId === \"openai\") return \"OPENAI_API_KEY\";\n\tif (providerId === \"deepseek\") return \"DEEPSEEK_API_KEY\";\n\tif (providerId === \"zhipu\") return \"ZAI_API_KEY\";\n\tif (providerId === \"anthropic\") return \"ANTHROPIC_API_KEY\";\n\treturn undefined;\n}\n\nfunction modelChoices(models: readonly Model[]): SelectItem[] {\n\treturn models.map((model) => ({\n\t\tvalue: model.id,\n\t\tlabel: model.name,\n\t\tdescription: `${model.id}${model.reasoning ? \" - reasoning\" : \"\"}`,\n\t}));\n}\n\nfunction onboardingSelectList(items: readonly SelectItem[]): SelectList {\n\treturn new SelectList(items, {\n\t\tkeybindings: new KeybindingsManager({\n\t\t\t\"tui.select.cancel\": [Key.escape, Key.ctrl(\"c\"), Key.ctrl(\"d\")],\n\t\t}),\n\t});\n}\n\nexport function runProviderOnboarding(options: ProviderOnboardingOptions): Promise<StartupRuntime | undefined> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tui = new TUI(options.terminal);\n\t\tconst screen = new OnboardingScreen();\n\t\tlet settled = false;\n\t\tlet selectedProvider: OnboardingChoice[\"providerId\"] | undefined;\n\n\t\tconst finish = (runtime: StartupRuntime | undefined): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tif (runtime === undefined) screen.setCancelled();\n\t\t\ttui.stop({ finalLines: runtime ? [\"Provider configured for this run.\"] : [\"Provider setup cancelled.\"] });\n\t\t\tresolve(runtime);\n\t\t};\n\n\t\tconst fail = (cause: unknown): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\ttui.stop({ finalLines: [\"Provider setup failed.\"] });\n\t\t\treject(cause);\n\t\t};\n\n\t\tconst finishSelection = (modelId: string, apiKey?: string): void => {\n\t\t\tif (!selectedProvider) return;\n\t\t\tconst keyVariable = apiKeyEnvironmentVariable(selectedProvider);\n\t\t\tconst environment = {\n\t\t\t\t...options.configuration.environment,\n\t\t\t\tDI_CODE_PROVIDER: selectedProvider,\n\t\t\t\tDI_CODE_MODEL: modelId,\n\t\t\t\t...(keyVariable && apiKey ? { [keyVariable]: apiKey } : {}),\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tfinish(resolveStartupRuntime(environment, options.configuration.providers));\n\t\t\t} catch (cause) {\n\t\t\t\tfail(cause);\n\t\t\t}\n\t\t};\n\n\t\tconst showKey = (modelId: string, keyVariable: string): void => {\n\t\t\tconst input = new Input({ mask: \"*\", cancelOnEndOfTransmission: true });\n\t\t\tinput.onSubmit = (value) => {\n\t\t\t\tconst key = value.trim();\n\t\t\t\tif (key.length === 0) {\n\t\t\t\t\tscreen.setError(\"API key cannot be empty. Press Escape to cancel.\");\n\t\t\t\t\ttui.requestRender(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfinishSelection(modelId, key);\n\t\t\t};\n\t\t\tinput.onEscape = () => finish(undefined);\n\t\t\tscreen.setStep(`Enter ${keyVariable} (input is hidden):`, input);\n\t\t\ttui.setFocus(input);\n\t\t\ttui.requestRender(true);\n\t\t};\n\n\t\tconst showModels = (choice: OnboardingChoice): void => {\n\t\t\tselectedProvider = choice.providerId;\n\t\t\tconst models = modelsFor(choice.providerId);\n\t\t\tconst modelList = onboardingSelectList(modelChoices(models));\n\t\t\tmodelList.onSelect = (item) => {\n\t\t\t\tconst keyVariable = apiKeyEnvironmentVariable(choice.providerId);\n\t\t\t\tconst existingKey = keyVariable ? options.configuration.environment[keyVariable]?.trim() : undefined;\n\t\t\t\tif (keyVariable && !existingKey) showKey(item.value, keyVariable);\n\t\t\t\telse finishSelection(item.value);\n\t\t\t};\n\t\t\tmodelList.onCancel = () => finish(undefined);\n\t\t\tscreen.setStep(`Select a ${choice.label} model:`, modelList);\n\t\t\ttui.setFocus(modelList);\n\t\t\ttui.requestRender(true);\n\t\t};\n\n\t\tconst providerList = onboardingSelectList(providerChoices());\n\t\tproviderList.onSelect = (item) => {\n\t\t\tconst choice = providerChoices().find((candidate) => candidate.value === item.value);\n\t\t\tif (choice) showModels(choice);\n\t\t};\n\t\tproviderList.onCancel = () => finish(undefined);\n\t\tscreen.setStep(\"Select a provider:\", providerList);\n\t\ttui.addChild(screen);\n\t\ttui.start();\n\t\ttui.setFocus(providerList);\n\t\ttui.requestRender(true);\n\t});\n}\n"]}
1
+ {"version":3,"file":"provider-onboarding.js","sourceRoot":"","sources":["../src/provider-onboarding.ts"],"names":[],"mappings":"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","sourcesContent":["import { createFauxProvider, MODELS, type Model, type ModelApi } from \"@di-code/ai\";\nimport {\n\tBox,\n\tInput,\n\tKey,\n\tKeybindingsManager,\n\ttype SelectItem,\n\tSelectList,\n\ttype Terminal,\n\tText,\n\tTUI,\n} from \"@di-code/tui\";\nimport type { CliCommand } from \"./cli.ts\";\nimport { DEFAULT_LOCALE, type Locale, translate } from \"./i18n.ts\";\nimport {\n\tresolveStartupRuntime,\n\ttype StartupConfiguration,\n\ttype StartupRuntime,\n\tsaveGlobalCustomProvider,\n\tsaveGlobalProviderApiKey,\n\tvalidateCustomBaseUrl,\n} from \"./startup.ts\";\n\nexport type StartupRunCommand = Extract<CliCommand, { kind: \"run\" }>;\n\nexport interface ProviderOnboardingOptions {\n\treadonly configuration: StartupConfiguration;\n\treadonly terminal: Terminal;\n\treadonly agentDir: string;\n}\n\nexport interface InteractiveProviderOnboardingOptions {\n\treadonly configuration: StartupConfiguration;\n\treadonly agentDir: string;\n\treadonly tui: TUI;\n}\n\nexport function shouldStartProviderOnboarding(\n\tcommand: StartupRunCommand,\n\tisInteractiveTerminal: boolean,\n\tconfiguration: StartupConfiguration,\n): boolean {\n\treturn (\n\t\tcommand.mode === \"interactive\" &&\n\t\tisInteractiveTerminal &&\n\t\t!configuration.environment.DI_CODE_PROVIDER?.trim() &&\n\t\t!configuration.defaults?.providerId &&\n\t\tconfiguration.providers.length !== 1\n\t);\n}\n\ninterface OnboardingChoice extends SelectItem {\n\treadonly providerId: \"openai\" | \"deepseek\" | \"kimi\" | \"zhipu\" | \"anthropic\" | \"faux\" | \"custom\";\n}\n\nclass OnboardingScreen {\n\tprivate readonly prompt = new Text(\"\", 1, 0);\n\tprivate readonly error = new Text(\"\", 1, 0);\n\tprivate active: SelectList | Input | null = null;\n\n\tsetStep(prompt: string, active: SelectList | Input): void {\n\t\tthis.prompt.setText(prompt);\n\t\tthis.error.setText(\"\");\n\t\tthis.active = active;\n\t}\n\n\tsetError(message: string): void {\n\t\tthis.error.setText(message);\n\t}\n\n\tsetCancelled(locale: Locale): void {\n\t\tthis.prompt.setText(translate(locale, \"providerSetupCancelled\"));\n\t\tthis.error.setText(\"\");\n\t\tthis.active = null;\n\t}\n\n\trender(width: number): string[] {\n\t\treturn [...this.prompt.render(width), ...this.error.render(width), ...(this.active?.render(width) ?? [])];\n\t}\n\n\tinvalidate(): void {\n\t\tthis.prompt.invalidate();\n\t\tthis.error.invalidate();\n\t\tthis.active?.invalidate();\n\t}\n}\n\nfunction providerChoices(locale: Locale): OnboardingChoice[] {\n\treturn [\n\t\t{ value: \"openai\", providerId: \"openai\", label: \"OpenAI\", description: \"OpenAI Responses API\" },\n\t\t{ value: \"deepseek\", providerId: \"deepseek\", label: \"DeepSeek\", description: \"DeepSeek Chat Completions API\" },\n\t\t{ value: \"faux\", providerId: \"faux\", label: \"Faux (offline)\", description: translate(locale, \"fauxProvider\") },\n\t\t{ value: \"zhipu\", providerId: \"zhipu\", label: \"Zhipu AI\", description: \"GLM Chat Completions API\" },\n\t\t{ value: \"anthropic\", providerId: \"anthropic\", label: \"Anthropic\", description: \"Claude Messages API\" },\n\t\t{\n\t\t\tvalue: \"custom\",\n\t\t\tproviderId: \"custom\",\n\t\t\tlabel: translate(locale, \"customProvider\"),\n\t\t\tdescription: translate(locale, \"customProviderDescription\"),\n\t\t},\n\t\t{ value: \"kimi\", providerId: \"kimi\", label: \"Kimi\", description: \"Kimi Coding Chat Completions API\" },\n\t];\n}\n\nfunction modelsFor(providerId: OnboardingChoice[\"providerId\"]): readonly Model[] {\n\tif (providerId === \"custom\") return [];\n\tif (providerId === \"faux\") return [createFauxProvider({ responses: [] }).model];\n\tconst models = MODELS.filter((model) => model.provider === providerId);\n\tif (providerId === \"openai\") {\n\t\tconst preferred = models.find((model) => model.id === \"gpt-4o\");\n\t\treturn preferred ? [preferred, ...models.filter((model) => model !== preferred)] : models;\n\t}\n\tif (providerId === \"zhipu\") {\n\t\tconst preferred = models.find((model) => model.id === \"glm-5.3\");\n\t\treturn preferred ? [preferred, ...models.filter((model) => model !== preferred)] : models;\n\t}\n\tif (providerId === \"anthropic\") {\n\t\tconst preferred = models.find((model) => model.id === \"claude-sonnet-4-5\");\n\t\treturn preferred ? [preferred, ...models.filter((model) => model !== preferred)] : models;\n\t}\n\treturn models;\n}\n\nfunction apiKeyEnvironmentVariable(providerId: OnboardingChoice[\"providerId\"]): string | undefined {\n\tif (providerId === \"openai\") return \"OPENAI_API_KEY\";\n\tif (providerId === \"deepseek\") return \"DEEPSEEK_API_KEY\";\n\tif (providerId === \"kimi\") return \"KIMI_API_KEY\";\n\tif (providerId === \"zhipu\") return \"ZAI_API_KEY\";\n\tif (providerId === \"anthropic\") return \"ANTHROPIC_API_KEY\";\n\treturn undefined;\n}\n\nfunction providerApi(providerId: OnboardingChoice[\"providerId\"]): Exclude<ModelApi, \"faux\"> | undefined {\n\tif (providerId === \"openai\") return \"openai-responses\";\n\tif (providerId === \"deepseek\" || providerId === \"zhipu\") return \"openai-chat-completions\";\n\tif (providerId === \"kimi\") return \"openai-chat-completions\";\n\tif (providerId === \"anthropic\") return \"anthropic-messages\";\n\treturn undefined;\n}\n\nfunction customApiChoices(): SelectItem[] {\n\treturn [\n\t\t{ value: \"openai-responses\", label: \"OpenAI Responses\", description: \"OpenAI Responses API\" },\n\t\t{\n\t\t\tvalue: \"openai-chat-completions\",\n\t\t\tlabel: \"OpenAI Chat Completions\",\n\t\t\tdescription: \"Chat Completions-compatible API\",\n\t\t},\n\t\t{ value: \"anthropic-messages\", label: \"Anthropic Messages\", description: \"Anthropic Messages API\" },\n\t];\n}\n\nfunction modelChoices(models: readonly Model[], locale: Locale): SelectItem[] {\n\treturn models.map((model) => ({\n\t\tvalue: model.id,\n\t\tlabel: model.name,\n\t\tdescription: `${model.id}${model.reasoning ? ` - ${translate(locale, \"reasoning\")}` : \"\"}`,\n\t}));\n}\n\nfunction onboardingSelectList(items: readonly SelectItem[]): SelectList {\n\treturn new SelectList(items, {\n\t\tkeybindings: new KeybindingsManager({\n\t\t\t\"tui.select.cancel\": [Key.escape, Key.ctrl(\"c\"), Key.ctrl(\"d\")],\n\t\t}),\n\t});\n}\n\nfunction startProviderOnboarding(\n\toptions: Pick<ProviderOnboardingOptions, \"configuration\" | \"agentDir\">,\n\ttui: TUI,\n\tscreen: OnboardingScreen,\n\tcomplete: (runtime: StartupRuntime | undefined) => void,\n\tfailure: () => void,\n\tforceApiKey: boolean,\n): Promise<StartupRuntime | undefined> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst locale = options.configuration.locale ?? DEFAULT_LOCALE;\n\t\tlet settled = false;\n\t\tlet saving = false;\n\t\tlet selectedProvider: OnboardingChoice[\"providerId\"] | undefined;\n\n\t\tconst finish = (runtime: StartupRuntime | undefined): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tif (runtime === undefined) screen.setCancelled(locale);\n\t\t\tcomplete(runtime);\n\t\t\tresolve(runtime);\n\t\t};\n\n\t\tconst fail = (cause: unknown): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tfailure();\n\t\t\treject(cause);\n\t\t};\n\n\t\tconst finishSelection = async (modelId: string, apiKey?: string): Promise<void> => {\n\t\t\tif (!selectedProvider || saving || settled) return;\n\t\t\tsaving = true;\n\t\t\tconst keyVariable = apiKeyEnvironmentVariable(selectedProvider);\n\t\t\tconst environment = {\n\t\t\t\t...options.configuration.environment,\n\t\t\t\tDI_CODE_PROVIDER: selectedProvider,\n\t\t\t\tDI_CODE_MODEL: modelId,\n\t\t\t\t...(keyVariable && apiKey ? { [keyVariable]: apiKey } : {}),\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tconst api = providerApi(selectedProvider);\n\t\t\t\tif (apiKey && api) await saveGlobalProviderApiKey(options.agentDir, selectedProvider, api, apiKey, modelId);\n\t\t\t\tfinish(resolveStartupRuntime(environment, options.configuration.providers));\n\t\t\t} catch (cause) {\n\t\t\t\tfail(cause);\n\t\t\t}\n\t\t};\n\n\t\tconst showKey = (modelId: string, keyVariable: string): void => {\n\t\t\tconst input = new Input({ mask: \"*\", cancelOnEndOfTransmission: true });\n\t\t\tinput.onSubmit = (value) => {\n\t\t\t\tconst key = value.trim();\n\t\t\t\tif (key.length === 0) {\n\t\t\t\t\tscreen.setError(translate(locale, \"apiKeyRequired\"));\n\t\t\t\t\ttui.requestRender(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvoid finishSelection(modelId, key);\n\t\t\t};\n\t\t\tinput.onEscape = () => finish(undefined);\n\t\t\tscreen.setStep(translate(locale, \"enterApiKey\", keyVariable), input);\n\t\t\ttui.setFocus(input);\n\t\t\ttui.requestRender(true);\n\t\t};\n\n\t\tconst showModels = (choice: OnboardingChoice): void => {\n\t\t\tselectedProvider = choice.providerId;\n\t\t\tconst models = modelsFor(choice.providerId);\n\t\t\tconst modelList = onboardingSelectList(modelChoices(models, locale));\n\t\t\tmodelList.onSelect = (item) => {\n\t\t\t\tconst keyVariable = apiKeyEnvironmentVariable(choice.providerId);\n\t\t\t\tconst existingKey = keyVariable ? options.configuration.environment[keyVariable]?.trim() : undefined;\n\t\t\t\tif (keyVariable && (forceApiKey || !existingKey)) showKey(item.value, keyVariable);\n\t\t\t\telse void finishSelection(item.value);\n\t\t\t};\n\t\t\tmodelList.onCancel = () => finish(undefined);\n\t\t\tscreen.setStep(translate(locale, \"selectProviderModel\", choice.label), modelList);\n\t\t\ttui.setFocus(modelList);\n\t\t\ttui.requestRender(true);\n\t\t};\n\n\t\tconst showCustom = (): void => {\n\t\t\tconst protocolList = onboardingSelectList(customApiChoices());\n\t\t\tprotocolList.onSelect = (item) => {\n\t\t\t\tconst api = item.value as Exclude<ModelApi, \"faux\">;\n\t\t\t\tconst baseUrlInput = new Input({ cancelOnEndOfTransmission: true });\n\t\t\t\tbaseUrlInput.onSubmit = (value) => {\n\t\t\t\t\tlet baseUrl: string;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tbaseUrl = validateCustomBaseUrl(value);\n\t\t\t\t\t} catch (cause) {\n\t\t\t\t\t\tscreen.setError(cause instanceof Error ? cause.message : translate(locale, \"customBaseUrlInvalid\"));\n\t\t\t\t\t\ttui.requestRender(true);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst keyInput = new Input({ mask: \"*\", cancelOnEndOfTransmission: true });\n\t\t\t\t\tkeyInput.onSubmit = (keyValue) => {\n\t\t\t\t\t\tconst apiKey = keyValue.trim();\n\t\t\t\t\t\tif (!apiKey) {\n\t\t\t\t\t\t\tscreen.setError(translate(locale, \"apiKeyRequired\"));\n\t\t\t\t\t\t\ttui.requestRender(true);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst modelInput = new Input({ cancelOnEndOfTransmission: true });\n\t\t\t\t\t\tmodelInput.onSubmit = (modelValue) => {\n\t\t\t\t\t\t\tconst modelId = modelValue.trim();\n\t\t\t\t\t\t\tif (!modelId) {\n\t\t\t\t\t\t\t\tscreen.setError(translate(locale, \"modelIdRequired\"));\n\t\t\t\t\t\t\t\ttui.requestRender(true);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (saving || settled) return;\n\t\t\t\t\t\t\tsaving = true;\n\t\t\t\t\t\t\tvoid saveGlobalCustomProvider(options.agentDir, { api, baseUrl, apiKey, modelId })\n\t\t\t\t\t\t\t\t.then((custom) => {\n\t\t\t\t\t\t\t\t\tconst providers = [\n\t\t\t\t\t\t\t\t\t\t...options.configuration.providers.filter((provider) => provider.id !== \"custom\"),\n\t\t\t\t\t\t\t\t\t\tcustom,\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\tfinish(\n\t\t\t\t\t\t\t\t\t\tresolveStartupRuntime(\n\t\t\t\t\t\t\t\t\t\t\t{ ...options.configuration.environment, DI_CODE_PROVIDER: \"custom\", DI_CODE_MODEL: modelId },\n\t\t\t\t\t\t\t\t\t\t\tproviders,\n\t\t\t\t\t\t\t\t\t\t\t{ providerId: \"custom\", modelId },\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(fail);\n\t\t\t\t\t\t};\n\t\t\t\t\t\tmodelInput.onEscape = () => finish(undefined);\n\t\t\t\t\t\tscreen.setStep(translate(locale, \"enterCustomModelId\"), modelInput);\n\t\t\t\t\t\ttui.setFocus(modelInput);\n\t\t\t\t\t\ttui.requestRender(true);\n\t\t\t\t\t};\n\t\t\t\t\tkeyInput.onEscape = () => finish(undefined);\n\t\t\t\t\tscreen.setStep(translate(locale, \"enterCustomApiKey\"), keyInput);\n\t\t\t\t\ttui.setFocus(keyInput);\n\t\t\t\t\ttui.requestRender(true);\n\t\t\t\t};\n\t\t\t\tbaseUrlInput.onEscape = () => finish(undefined);\n\t\t\t\tscreen.setStep(translate(locale, \"enterCustomBaseUrl\"), baseUrlInput);\n\t\t\t\ttui.setFocus(baseUrlInput);\n\t\t\t\ttui.requestRender(true);\n\t\t\t};\n\t\t\tprotocolList.onCancel = () => finish(undefined);\n\t\t\tscreen.setStep(translate(locale, \"selectCustomApi\"), protocolList);\n\t\t\ttui.setFocus(protocolList);\n\t\t\ttui.requestRender(true);\n\t\t};\n\n\t\tconst providerList = onboardingSelectList(providerChoices(locale));\n\t\tproviderList.onSelect = (item) => {\n\t\t\tconst choice = providerChoices(locale).find((candidate) => candidate.value === item.value);\n\t\t\tif (choice?.providerId === \"custom\") showCustom();\n\t\t\telse if (choice) showModels(choice);\n\t\t};\n\t\tproviderList.onCancel = () => finish(undefined);\n\t\tscreen.setStep(translate(locale, \"selectProvider\"), providerList);\n\t\ttui.setFocus(providerList);\n\t\ttui.requestRender(true);\n\t});\n}\n\nexport function runProviderOnboarding(options: ProviderOnboardingOptions): Promise<StartupRuntime | undefined> {\n\tconst tui = new TUI(options.terminal);\n\tconst screen = new OnboardingScreen();\n\tconst locale = options.configuration.locale ?? DEFAULT_LOCALE;\n\ttui.addChild(new Box(screen, { border: \"rounded\", padding: 1, title: translate(locale, \"providerSetup\") }));\n\ttui.start();\n\treturn startProviderOnboarding(\n\t\toptions,\n\t\ttui,\n\t\tscreen,\n\t\t(runtime) => {\n\t\t\ttui.stop({\n\t\t\t\tfinalLines: [translate(locale, runtime ? \"providerConfigured\" : \"providerSetupCancelled\")],\n\t\t\t});\n\t\t},\n\t\t() => tui.stop({ finalLines: [translate(locale, \"providerSetupFailed\")] }),\n\t\tfalse,\n\t);\n}\n\nexport function showInteractiveProviderOnboarding(\n\toptions: InteractiveProviderOnboardingOptions,\n): Promise<StartupRuntime | undefined> {\n\tconst screen = new OnboardingScreen();\n\tconst locale = options.configuration.locale ?? DEFAULT_LOCALE;\n\tconst panel = new Box(screen, { border: \"rounded\", padding: 1, title: translate(locale, \"login\") });\n\tconst overlay = options.tui.showOverlay(panel, {\n\t\twidth: \"70%\",\n\t\tmaxHeight: \"60%\",\n\t\tanchor: \"center\",\n\t\tmargin: 1,\n\t});\n\treturn startProviderOnboarding(\n\t\toptions,\n\t\toptions.tui,\n\t\tscreen,\n\t\t() => overlay.hide(),\n\t\t() => overlay.hide(),\n\t\ttrue,\n\t);\n}\n"]}
package/dist/rpc-entry.js CHANGED
@@ -6,7 +6,7 @@ import { loadStartupConfiguration, resolveStartupRuntime } from "./startup.js";
6
6
  try {
7
7
  const allowedRoot = resolve(process.cwd());
8
8
  const configuration = await loadStartupConfiguration(allowedRoot);
9
- const runtime = resolveStartupRuntime(configuration.environment, configuration.providers);
9
+ const runtime = resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);
10
10
  const session = new AgentSession({
11
11
  allowedRoot,
12
12
  provider: runtime.provider,
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-entry.js","sourceRoot":"","sources":["../src/rpc-entry.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE/E,IAAI,CAAC;IACJ,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;QAChC,WAAW;QACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;KACpB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,OAAO;QACP,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC;KAC9D,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;IACrF,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 { resolve } from \"node:path\";\nimport { AgentSession } from \"./core/session.ts\";\nimport { RpcServer } from \"./rpc/server.ts\";\nimport { loadStartupConfiguration, resolveStartupRuntime } from \"./startup.ts\";\n\ntry {\n\tconst allowedRoot = resolve(process.cwd());\n\tconst configuration = await loadStartupConfiguration(allowedRoot);\n\tconst runtime = resolveStartupRuntime(configuration.environment, configuration.providers);\n\tconst session = new AgentSession({\n\t\tallowedRoot,\n\t\tprovider: runtime.provider,\n\t\tmodel: runtime.model,\n\t});\n\tconst server = new RpcServer({\n\t\tsession,\n\t\tinput: process.stdin,\n\t\toutput: process.stdout,\n\t\tonError: (error) => process.stderr.write(`${error.message}\\n`),\n\t});\n\tserver.start();\n} catch (cause) {\n\tconst message = cause instanceof Error ? cause.message : \"Unknown RPC startup error\";\n\tprocess.stderr.write(`${message}\\n`);\n\tprocess.exitCode = 1;\n}\n"]}
1
+ {"version":3,"file":"rpc-entry.js","sourceRoot":"","sources":["../src/rpc-entry.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE/E,IAAI,CAAC;IACJ,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClH,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;QAChC,WAAW;QACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;KACpB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,OAAO;QACP,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC;KAC9D,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;IACrF,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 { resolve } from \"node:path\";\nimport { AgentSession } from \"./core/session.ts\";\nimport { RpcServer } from \"./rpc/server.ts\";\nimport { loadStartupConfiguration, resolveStartupRuntime } from \"./startup.ts\";\n\ntry {\n\tconst allowedRoot = resolve(process.cwd());\n\tconst configuration = await loadStartupConfiguration(allowedRoot);\n\tconst runtime = resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);\n\tconst session = new AgentSession({\n\t\tallowedRoot,\n\t\tprovider: runtime.provider,\n\t\tmodel: runtime.model,\n\t});\n\tconst server = new RpcServer({\n\t\tsession,\n\t\tinput: process.stdin,\n\t\toutput: process.stdout,\n\t\tonError: (error) => process.stderr.write(`${error.message}\\n`),\n\t});\n\tserver.start();\n} catch (cause) {\n\tconst message = cause instanceof Error ? cause.message : \"Unknown RPC startup error\";\n\tprocess.stderr.write(`${message}\\n`);\n\tprocess.exitCode = 1;\n}\n"]}
package/dist/startup.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { type Model, type Provider } from "@di-code/ai";
1
+ import { type Model, type ModelApi, type Provider } from "@di-code/ai";
2
+ import { type Locale } from "./i18n.ts";
2
3
  export interface StartupRuntime {
3
4
  readonly provider: Provider;
4
5
  readonly model: Model;
@@ -14,11 +15,41 @@ export interface StartupProviderConfiguration {
14
15
  export interface StartupConfiguration {
15
16
  readonly environment: Environment;
16
17
  readonly providers: readonly StartupProviderConfiguration[];
18
+ readonly defaults?: StartupDefaults;
19
+ readonly locale?: Locale;
20
+ }
21
+ export interface StartupDefaults {
22
+ readonly providerId?: string;
23
+ readonly modelId?: string;
24
+ }
25
+ export interface CustomProviderInput {
26
+ readonly api: Exclude<ModelApi, "faux">;
27
+ readonly baseUrl: string;
28
+ readonly apiKey: string;
29
+ readonly modelId: string;
17
30
  }
18
31
  type Environment = Readonly<Record<string, string | undefined>>;
19
32
  export declare function resolveStartupArgs(args: readonly string[]): readonly string[];
20
- export declare function resolveStartupRuntime(env: Environment, providers: readonly StartupProviderConfiguration[]): StartupRuntime;
21
- export declare function loadStartupConfiguration(cwd: string, environment?: Environment): Promise<StartupConfiguration>;
33
+ /** Validates a Custom onboarding endpoint without issuing a network request. */
34
+ export declare function validateCustomBaseUrl(value: string): string;
35
+ /** Builds the single user-managed Custom provider from validated onboarding input. */
36
+ export declare function createCustomProviderConfiguration(input: CustomProviderInput): StartupProviderConfiguration;
37
+ /** Persists a user-level terminal language preference without changing project settings. */
38
+ export declare function saveGlobalLocale(agentDir: string, locale: Locale): Promise<void>;
39
+ export declare function saveGlobalProviderApiKey(agentDir: string, providerId: string, api: Exclude<ModelApi, "faux">, apiKey: string, modelId?: string): Promise<void>;
40
+ /**
41
+ * Replaces the user-managed `custom` provider while retaining other global
42
+ * providers and preferences. The key is intentionally stored only here, never
43
+ * in project settings or process environment.
44
+ */
45
+ export declare function saveGlobalCustomProvider(agentDir: string, input: CustomProviderInput): Promise<StartupProviderConfiguration>;
46
+ /**
47
+ * Removes one persisted credential and clears it as the default when applicable.
48
+ * Environment variables and other Provider configuration remain untouched.
49
+ */
50
+ export declare function removeGlobalProviderApiKey(agentDir: string, providerId: string): Promise<boolean>;
51
+ export declare function resolveStartupRuntime(env: Environment, providers: readonly StartupProviderConfiguration[], defaults?: StartupDefaults): StartupRuntime;
52
+ export declare function loadStartupConfiguration(cwd: string, environment?: Environment, agentDir?: string): Promise<StartupConfiguration>;
22
53
  export declare function loadStartupEnvironment(cwd: string, environment?: Environment): Promise<Environment>;
23
54
  export {};
24
55
  //# sourceMappingURL=startup.d.ts.map