@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.
- package/README.md +91 -30
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +96 -17
- package/dist/cli.js.map +1 -1
- package/dist/core/clipboard-image.d.ts +3 -3
- package/dist/core/clipboard-image.d.ts.map +1 -1
- package/dist/core/clipboard-image.js +26 -13
- package/dist/core/clipboard-image.js.map +1 -1
- package/dist/core/context-builder.d.ts.map +1 -1
- package/dist/core/context-builder.js +6 -2
- package/dist/core/context-builder.js.map +1 -1
- package/dist/core/image-input.d.ts +1 -1
- package/dist/core/image-input.d.ts.map +1 -1
- package/dist/core/image-input.js +55 -10
- package/dist/core/image-input.js.map +1 -1
- package/dist/core/resources/loader.d.ts.map +1 -1
- package/dist/core/resources/loader.js +15 -42
- package/dist/core/resources/loader.js.map +1 -1
- package/dist/core/resources/types.d.ts +6 -9
- package/dist/core/resources/types.d.ts.map +1 -1
- package/dist/core/resources/types.js.map +1 -1
- package/dist/core/session/session-manager.d.ts +12 -1
- package/dist/core/session/session-manager.d.ts.map +1 -1
- package/dist/core/session/session-manager.js +66 -3
- package/dist/core/session/session-manager.js.map +1 -1
- package/dist/core/session/session-storage.d.ts.map +1 -1
- package/dist/core/session/session-storage.js +30 -15
- package/dist/core/session/session-storage.js.map +1 -1
- package/dist/core/session/types.d.ts +6 -1
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/session/types.js +1 -1
- package/dist/core/session/types.js.map +1 -1
- package/dist/core/session.d.ts +38 -3
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +167 -9
- package/dist/core/session.js.map +1 -1
- package/dist/core/system-prompt.js +2 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +25 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +136 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +13 -4
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +64 -30
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-search.d.ts +14 -0
- package/dist/core/tools/file-search.d.ts.map +1 -0
- package/dist/core/tools/file-search.js +99 -0
- package/dist/core/tools/file-search.js.map +1 -0
- package/dist/core/tools/glob.d.ts +11 -0
- package/dist/core/tools/glob.d.ts.map +1 -0
- package/dist/core/tools/glob.js +44 -0
- package/dist/core/tools/glob.js.map +1 -0
- package/dist/core/tools/grep.d.ts +13 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +67 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/load-skill.d.ts +10 -0
- package/dist/core/tools/load-skill.d.ts.map +1 -0
- package/dist/core/tools/load-skill.js +22 -0
- package/dist/core/tools/load-skill.js.map +1 -0
- package/dist/core/tools/path-boundary.d.ts +2 -0
- package/dist/core/tools/path-boundary.d.ts.map +1 -1
- package/dist/core/tools/path-boundary.js +4 -0
- package/dist/core/tools/path-boundary.js.map +1 -1
- package/dist/core/tools/read.d.ts +2 -2
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts +2 -2
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/user-data.d.ts +3 -0
- package/dist/core/user-data.d.ts.map +1 -0
- package/dist/core/user-data.js +8 -0
- package/dist/core/user-data.js.map +1 -0
- package/dist/entry.js +22 -2
- package/dist/entry.js.map +1 -1
- package/dist/extensions/runtime.js +2 -2
- package/dist/extensions/runtime.js.map +1 -1
- package/dist/i18n.d.ts +5 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +223 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +20 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +272 -17
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts +33 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +211 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/loader.d.ts +21 -0
- package/dist/mcp/loader.d.ts.map +1 -0
- package/dist/mcp/loader.js +60 -0
- package/dist/mcp/loader.js.map +1 -0
- package/dist/mcp/tool-adapter.d.ts +5 -0
- package/dist/mcp/tool-adapter.d.ts.map +1 -0
- package/dist/mcp/tool-adapter.js +149 -0
- package/dist/mcp/tool-adapter.js.map +1 -0
- package/dist/modes/interactive-components.d.ts +2 -0
- package/dist/modes/interactive-components.d.ts.map +1 -1
- package/dist/modes/interactive-components.js +55 -31
- package/dist/modes/interactive-components.js.map +1 -1
- package/dist/modes/interactive-diff.d.ts +8 -0
- package/dist/modes/interactive-diff.d.ts.map +1 -0
- package/dist/modes/interactive-diff.js +78 -0
- package/dist/modes/interactive-diff.js.map +1 -0
- package/dist/modes/interactive-layout.d.ts +4 -0
- package/dist/modes/interactive-layout.d.ts.map +1 -1
- package/dist/modes/interactive-layout.js +4 -0
- package/dist/modes/interactive-layout.js.map +1 -1
- package/dist/modes/interactive-state.d.ts +5 -0
- package/dist/modes/interactive-state.d.ts.map +1 -1
- package/dist/modes/interactive-state.js +65 -11
- package/dist/modes/interactive-state.js.map +1 -1
- package/dist/modes/interactive.d.ts +19 -0
- package/dist/modes/interactive.d.ts.map +1 -1
- package/dist/modes/interactive.js +351 -52
- package/dist/modes/interactive.js.map +1 -1
- package/dist/modes/tree-selector.d.ts +30 -0
- package/dist/modes/tree-selector.d.ts.map +1 -0
- package/dist/modes/tree-selector.js +205 -0
- package/dist/modes/tree-selector.js.map +1 -0
- package/dist/plugins/loader.d.ts +19 -1
- package/dist/plugins/loader.d.ts.map +1 -1
- package/dist/plugins/loader.js +21 -2
- package/dist/plugins/loader.js.map +1 -1
- package/dist/provider-onboarding.d.ts +8 -1
- package/dist/provider-onboarding.d.ts.map +1 -1
- package/dist/provider-onboarding.js +160 -40
- package/dist/provider-onboarding.js.map +1 -1
- package/dist/rpc-entry.js +1 -1
- package/dist/rpc-entry.js.map +1 -1
- package/dist/startup.d.ts +34 -3
- package/dist/startup.d.ts.map +1 -1
- package/dist/startup.js +407 -87
- package/dist/startup.js.map +1 -1
- package/package.json +7 -4
package/dist/plugins/loader.js
CHANGED
|
@@ -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
|
|
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
|
|
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,
|
|
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 {
|
|
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.
|
|
8
|
-
!configuration.
|
|
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(
|
|
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
|
|
47
|
-
{ value: "faux", providerId: "faux", label: "Faux (offline)", description:
|
|
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
|
|
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 ?
|
|
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
|
-
|
|
123
|
+
function startProviderOnboarding(options, tui, screen, complete, failure, forceApiKey) {
|
|
96
124
|
return new Promise((resolve, reject) => {
|
|
97
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
195
|
+
screen.setStep(translate(locale, "selectProviderModel", choice.label), modelList);
|
|
164
196
|
tui.setFocus(modelList);
|
|
165
197
|
tui.requestRender(true);
|
|
166
198
|
};
|
|
167
|
-
const
|
|
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(
|
|
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":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAA6B,MAAM,aAAa,CAAC;AACpF,OAAO,EACN,GAAG,EACH,KAAK,EACL,GAAG,EACH,kBAAkB,EAElB,UAAU,EAEV,IAAI,EACJ,GAAG,GACH,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAe,SAAS,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EACN,qBAAqB,EAGrB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,GACrB,MAAM,cAAc,CAAC;AAgBtB,MAAM,UAAU,6BAA6B,CAC5C,OAA0B,EAC1B,qBAA8B,EAC9B,aAAmC;IAEnC,OAAO,CACN,OAAO,CAAC,IAAI,KAAK,aAAa;QAC9B,qBAAqB;QACrB,CAAC,aAAa,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,EAAE;QACnD,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU;QACnC,aAAa,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CACpC,CAAC;AACH,CAAC;AAMD,MAAM,gBAAgB;IACJ,MAAM,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,KAAK,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,MAAM,GAA8B,IAAI,CAAC;IAEjD,OAAO,CAAC,MAAc,EAAE,MAA0B;QACjD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED,QAAQ,CAAC,OAAe;QACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,YAAY,CAAC,MAAc;QAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,UAAU;QACT,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;IAC3B,CAAC;CACD;AAED,SAAS,eAAe,CAAC,MAAc;IACtC,OAAO;QACN,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;QAC/F,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,+BAA+B,EAAE;QAC9G,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE;QAC9G,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,0BAA0B,EAAE;QACnG,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,qBAAqB,EAAE;QACvG;YACC,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC;YAC1C,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,2BAA2B,CAAC;SAC3D;QACD,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,kCAAkC,EAAE;KACrG,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,UAA0C;IAC5D,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvC,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IACvE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAChE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3F,CAAC;IACD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACjE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3F,CAAC;IACD,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,mBAAmB,CAAC,CAAC;QAC3E,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3F,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,yBAAyB,CAAC,UAA0C;IAC5E,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAC;IACrD,IAAI,UAAU,KAAK,UAAU;QAAE,OAAO,kBAAkB,CAAC;IACzD,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,cAAc,CAAC;IACjD,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,aAAa,CAAC;IACjD,IAAI,UAAU,KAAK,WAAW;QAAE,OAAO,mBAAmB,CAAC;IAC3D,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,UAA0C;IAC9D,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAC;IACvD,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,yBAAyB,CAAC;IAC1F,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,yBAAyB,CAAC;IAC5D,IAAI,UAAU,KAAK,WAAW;QAAE,OAAO,oBAAoB,CAAC;IAC5D,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB;IACxB,OAAO;QACN,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,sBAAsB,EAAE;QAC7F;YACC,KAAK,EAAE,yBAAyB;YAChC,KAAK,EAAE,yBAAyB;YAChC,WAAW,EAAE,iCAAiC;SAC9C;QACD,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,wBAAwB,EAAE;KACnG,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAAwB,EAAE,MAAc;IAC7D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7B,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,WAAW,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;KAC1F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA4B;IACzD,OAAO,IAAI,UAAU,CAAC,KAAK,EAAE;QAC5B,WAAW,EAAE,IAAI,kBAAkB,CAAC;YACnC,mBAAmB,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC/D,CAAC;KACF,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC/B,OAAsE,EACtE,GAAQ,EACR,MAAwB,EACxB,QAAuD,EACvD,OAAmB,EACnB,WAAoB;IAEpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,IAAI,cAAc,CAAC;QAC9D,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,gBAA4D,CAAC;QAEjE,MAAM,MAAM,GAAG,CAAC,OAAmC,EAAQ,EAAE;YAC5D,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,OAAO,KAAK,SAAS;gBAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACvD,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClB,OAAO,CAAC,OAAO,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,KAAc,EAAQ,EAAE;YACrC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,eAAe,GAAG,KAAK,EAAE,OAAe,EAAE,MAAe,EAAiB,EAAE;YACjF,IAAI,CAAC,gBAAgB,IAAI,MAAM,IAAI,OAAO;gBAAE,OAAO;YACnD,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,WAAW,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;YAChE,MAAM,WAAW,GAAG;gBACnB,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW;gBACpC,gBAAgB,EAAE,gBAAgB;gBAClC,aAAa,EAAE,OAAO;gBACtB,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D,CAAC;YACF,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;gBAC1C,IAAI,MAAM,IAAI,GAAG;oBAAE,MAAM,wBAAwB,CAAC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC5G,MAAM,CAAC,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,KAAK,CAAC,CAAC;YACb,CAAC;QACF,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAQ,EAAE;YAC9D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE;gBAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;gBACzB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtB,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;oBACrD,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBACxB,OAAO;gBACR,CAAC;gBACD,KAAK,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACpC,CAAC,CAAC;YACF,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;YACrE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpB,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,MAAwB,EAAQ,EAAE;YACrD,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC;YACrC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,oBAAoB,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YACrE,SAAS,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;gBAC7B,MAAM,WAAW,GAAG,yBAAyB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACjE,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACrG,IAAI,WAAW,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;;oBAC9E,KAAK,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC,CAAC;YACF,SAAS,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;YAClF,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACxB,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,GAAS,EAAE;YAC7B,MAAM,YAAY,GAAG,oBAAoB,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAC9D,YAAY,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAkC,CAAC;gBACpD,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpE,YAAY,CAAC,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE;oBACjC,IAAI,OAAe,CAAC;oBACpB,IAAI,CAAC;wBACJ,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;oBACxC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBAChB,MAAM,CAAC,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;wBACpG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;wBACxB,OAAO;oBACR,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3E,QAAQ,CAAC,QAAQ,GAAG,CAAC,QAAQ,EAAE,EAAE;wBAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;wBAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;4BACb,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;4BACrD,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;4BACxB,OAAO;wBACR,CAAC;wBACD,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;wBAClE,UAAU,CAAC,QAAQ,GAAG,CAAC,UAAU,EAAE,EAAE;4BACpC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;4BAClC,IAAI,CAAC,OAAO,EAAE,CAAC;gCACd,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;gCACtD,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gCACxB,OAAO;4BACR,CAAC;4BACD,IAAI,MAAM,IAAI,OAAO;gCAAE,OAAO;4BAC9B,MAAM,GAAG,IAAI,CAAC;4BACd,KAAK,wBAAwB,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;iCAChF,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gCAChB,MAAM,SAAS,GAAG;oCACjB,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC;oCACjF,MAAM;iCACN,CAAC;gCACF,MAAM,CACL,qBAAqB,CACpB,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,EAC5F,SAAS,EACT,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CACjC,CACD,CAAC;4BACH,CAAC,CAAC;iCACD,KAAK,CAAC,IAAI,CAAC,CAAC;wBACf,CAAC,CAAC;wBACF,UAAU,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;wBAC9C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,UAAU,CAAC,CAAC;wBACpE,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;wBACzB,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;oBACzB,CAAC,CAAC;oBACF,QAAQ,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC5C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,QAAQ,CAAC,CAAC;oBACjE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACvB,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC,CAAC;gBACF,YAAY,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAChD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,YAAY,CAAC,CAAC;gBACtE,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAC3B,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC,CAAC;YACF,YAAY,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,YAAY,CAAC,CAAC;YACnE,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC3B,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,oBAAoB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,YAAY,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3F,IAAI,MAAM,EAAE,UAAU,KAAK,QAAQ;gBAAE,UAAU,EAAE,CAAC;iBAC7C,IAAI,MAAM;gBAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC,CAAC;QACF,YAAY,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,YAAY,CAAC,CAAC;QAClE,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC3B,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAkC;IACvE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,IAAI,cAAc,CAAC;IAC9D,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5G,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,OAAO,uBAAuB,CAC7B,OAAO,EACP,GAAG,EACH,MAAM,EACN,CAAC,OAAO,EAAE,EAAE;QACX,GAAG,CAAC,IAAI,CAAC;YACR,UAAU,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;SAC1F,CAAC,CAAC;IACJ,CAAC,EACD,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAC1E,KAAK,CACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAChD,OAA6C;IAE7C,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,IAAI,cAAc,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACpG,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE;QAC9C,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,CAAC;KACT,CAAC,CAAC;IACH,OAAO,uBAAuB,CAC7B,OAAO,EACP,OAAO,CAAC,GAAG,EACX,MAAM,EACN,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EACpB,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EACpB,IAAI,CACJ,CAAC;AACH,CAAC","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,
|
package/dist/rpc-entry.js.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
21
|
-
export declare function
|
|
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
|