@di-code/coding-agent 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -10
- 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/session/session-storage.d.ts.map +1 -1
- package/dist/core/session/session-storage.js +1 -0
- package/dist/core/session/session-storage.js.map +1 -1
- package/dist/core/session.d.ts +17 -2
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +89 -0
- package/dist/core/session.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/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/entry.js +9 -2
- package/dist/entry.js.map +1 -1
- package/dist/main.d.ts +3 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +34 -6
- package/dist/main.js.map +1 -1
- 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 +40 -13
- 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 +64 -11
- package/dist/modes/interactive-state.js.map +1 -1
- package/dist/modes/interactive.d.ts +10 -0
- package/dist/modes/interactive.d.ts.map +1 -1
- package/dist/modes/interactive.js +190 -20
- package/dist/modes/interactive.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 +46 -23
- 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 +11 -3
- package/dist/startup.d.ts.map +1 -1
- package/dist/startup.js +216 -87
- package/dist/startup.js.map +1 -1
- package/package.json +5 -4
|
@@ -1,6 +1,6 @@
|
|
|
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 { resolveStartupRuntime, saveGlobalProviderApiKey, } from "./startup.js";
|
|
4
4
|
export function shouldStartProviderOnboarding(command, isInteractiveTerminal, configuration) {
|
|
5
5
|
return (command.mode === "interactive" &&
|
|
6
6
|
isInteractiveTerminal &&
|
|
@@ -8,7 +8,6 @@ export function shouldStartProviderOnboarding(command, isInteractiveTerminal, co
|
|
|
8
8
|
!configuration.environment.DI_CODE_PROVIDER?.trim());
|
|
9
9
|
}
|
|
10
10
|
class OnboardingScreen {
|
|
11
|
-
title = new Text("di-code provider setup", 1, 1);
|
|
12
11
|
prompt = new Text("", 1, 0);
|
|
13
12
|
error = new Text("", 1, 0);
|
|
14
13
|
active = null;
|
|
@@ -26,15 +25,9 @@ class OnboardingScreen {
|
|
|
26
25
|
this.active = null;
|
|
27
26
|
}
|
|
28
27
|
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
|
-
];
|
|
28
|
+
return [...this.prompt.render(width), ...this.error.render(width), ...(this.active?.render(width) ?? [])];
|
|
35
29
|
}
|
|
36
30
|
invalidate() {
|
|
37
|
-
this.title.invalidate();
|
|
38
31
|
this.prompt.invalidate();
|
|
39
32
|
this.error.invalidate();
|
|
40
33
|
this.active?.invalidate();
|
|
@@ -43,7 +36,7 @@ class OnboardingScreen {
|
|
|
43
36
|
function providerChoices() {
|
|
44
37
|
return [
|
|
45
38
|
{ value: "openai", providerId: "openai", label: "OpenAI", description: "OpenAI Responses API" },
|
|
46
|
-
{ value: "deepseek", providerId: "deepseek", label: "DeepSeek", description: "DeepSeek
|
|
39
|
+
{ value: "deepseek", providerId: "deepseek", label: "DeepSeek", description: "DeepSeek Chat Completions API" },
|
|
47
40
|
{ value: "faux", providerId: "faux", label: "Faux (offline)", description: "Deterministic local provider" },
|
|
48
41
|
{ value: "zhipu", providerId: "zhipu", label: "Zhipu AI", description: "GLM Chat Completions API" },
|
|
49
42
|
{ value: "anthropic", providerId: "anthropic", label: "Anthropic", description: "Claude Messages API" },
|
|
@@ -78,6 +71,15 @@ function apiKeyEnvironmentVariable(providerId) {
|
|
|
78
71
|
return "ANTHROPIC_API_KEY";
|
|
79
72
|
return undefined;
|
|
80
73
|
}
|
|
74
|
+
function providerApi(providerId) {
|
|
75
|
+
if (providerId === "openai")
|
|
76
|
+
return "openai-responses";
|
|
77
|
+
if (providerId === "deepseek" || providerId === "zhipu")
|
|
78
|
+
return "openai-chat-completions";
|
|
79
|
+
if (providerId === "anthropic")
|
|
80
|
+
return "anthropic-messages";
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
81
83
|
function modelChoices(models) {
|
|
82
84
|
return models.map((model) => ({
|
|
83
85
|
value: model.id,
|
|
@@ -92,11 +94,10 @@ function onboardingSelectList(items) {
|
|
|
92
94
|
}),
|
|
93
95
|
});
|
|
94
96
|
}
|
|
95
|
-
|
|
97
|
+
function startProviderOnboarding(options, tui, screen, complete, failure, forceApiKey) {
|
|
96
98
|
return new Promise((resolve, reject) => {
|
|
97
|
-
const tui = new TUI(options.terminal);
|
|
98
|
-
const screen = new OnboardingScreen();
|
|
99
99
|
let settled = false;
|
|
100
|
+
let saving = false;
|
|
100
101
|
let selectedProvider;
|
|
101
102
|
const finish = (runtime) => {
|
|
102
103
|
if (settled)
|
|
@@ -104,19 +105,20 @@ export function runProviderOnboarding(options) {
|
|
|
104
105
|
settled = true;
|
|
105
106
|
if (runtime === undefined)
|
|
106
107
|
screen.setCancelled();
|
|
107
|
-
|
|
108
|
+
complete(runtime);
|
|
108
109
|
resolve(runtime);
|
|
109
110
|
};
|
|
110
111
|
const fail = (cause) => {
|
|
111
112
|
if (settled)
|
|
112
113
|
return;
|
|
113
114
|
settled = true;
|
|
114
|
-
|
|
115
|
+
failure();
|
|
115
116
|
reject(cause);
|
|
116
117
|
};
|
|
117
|
-
const finishSelection = (modelId, apiKey) => {
|
|
118
|
-
if (!selectedProvider)
|
|
118
|
+
const finishSelection = async (modelId, apiKey) => {
|
|
119
|
+
if (!selectedProvider || saving || settled)
|
|
119
120
|
return;
|
|
121
|
+
saving = true;
|
|
120
122
|
const keyVariable = apiKeyEnvironmentVariable(selectedProvider);
|
|
121
123
|
const environment = {
|
|
122
124
|
...options.configuration.environment,
|
|
@@ -125,6 +127,9 @@ export function runProviderOnboarding(options) {
|
|
|
125
127
|
...(keyVariable && apiKey ? { [keyVariable]: apiKey } : {}),
|
|
126
128
|
};
|
|
127
129
|
try {
|
|
130
|
+
const api = providerApi(selectedProvider);
|
|
131
|
+
if (apiKey && api)
|
|
132
|
+
await saveGlobalProviderApiKey(options.agentDir, selectedProvider, api, apiKey, modelId);
|
|
128
133
|
finish(resolveStartupRuntime(environment, options.configuration.providers));
|
|
129
134
|
}
|
|
130
135
|
catch (cause) {
|
|
@@ -140,7 +145,7 @@ export function runProviderOnboarding(options) {
|
|
|
140
145
|
tui.requestRender(true);
|
|
141
146
|
return;
|
|
142
147
|
}
|
|
143
|
-
finishSelection(modelId, key);
|
|
148
|
+
void finishSelection(modelId, key);
|
|
144
149
|
};
|
|
145
150
|
input.onEscape = () => finish(undefined);
|
|
146
151
|
screen.setStep(`Enter ${keyVariable} (input is hidden):`, input);
|
|
@@ -154,10 +159,10 @@ export function runProviderOnboarding(options) {
|
|
|
154
159
|
modelList.onSelect = (item) => {
|
|
155
160
|
const keyVariable = apiKeyEnvironmentVariable(choice.providerId);
|
|
156
161
|
const existingKey = keyVariable ? options.configuration.environment[keyVariable]?.trim() : undefined;
|
|
157
|
-
if (keyVariable && !existingKey)
|
|
162
|
+
if (keyVariable && (forceApiKey || !existingKey))
|
|
158
163
|
showKey(item.value, keyVariable);
|
|
159
164
|
else
|
|
160
|
-
finishSelection(item.value);
|
|
165
|
+
void finishSelection(item.value);
|
|
161
166
|
};
|
|
162
167
|
modelList.onCancel = () => finish(undefined);
|
|
163
168
|
screen.setStep(`Select a ${choice.label} model:`, modelList);
|
|
@@ -172,10 +177,28 @@ export function runProviderOnboarding(options) {
|
|
|
172
177
|
};
|
|
173
178
|
providerList.onCancel = () => finish(undefined);
|
|
174
179
|
screen.setStep("Select a provider:", providerList);
|
|
175
|
-
tui.addChild(screen);
|
|
176
|
-
tui.start();
|
|
177
180
|
tui.setFocus(providerList);
|
|
178
181
|
tui.requestRender(true);
|
|
179
182
|
});
|
|
180
183
|
}
|
|
184
|
+
export function runProviderOnboarding(options) {
|
|
185
|
+
const tui = new TUI(options.terminal);
|
|
186
|
+
const screen = new OnboardingScreen();
|
|
187
|
+
tui.addChild(new Box(screen, { border: "rounded", padding: 1, title: "di-code provider setup" }));
|
|
188
|
+
tui.start();
|
|
189
|
+
return startProviderOnboarding(options, tui, screen, (runtime) => {
|
|
190
|
+
tui.stop({ finalLines: runtime ? ["Provider configured for this run."] : ["Provider setup cancelled."] });
|
|
191
|
+
}, () => tui.stop({ finalLines: ["Provider setup failed."] }), false);
|
|
192
|
+
}
|
|
193
|
+
export function showInteractiveProviderOnboarding(options) {
|
|
194
|
+
const screen = new OnboardingScreen();
|
|
195
|
+
const panel = new Box(screen, { border: "rounded", padding: 1, title: "di-code login" });
|
|
196
|
+
const overlay = options.tui.showOverlay(panel, {
|
|
197
|
+
width: "70%",
|
|
198
|
+
maxHeight: "60%",
|
|
199
|
+
anchor: "center",
|
|
200
|
+
margin: 1,
|
|
201
|
+
});
|
|
202
|
+
return startProviderOnboarding(options, options.tui, screen, () => overlay.hide(), () => overlay.hide(), true);
|
|
203
|
+
}
|
|
181
204
|
//# 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 {\n\tresolveStartupRuntime,\n\ttype StartupConfiguration,\n\ttype StartupRuntime,\n\tsaveGlobalProviderApiKey,\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\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 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 [...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(): 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: \"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 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 === \"anthropic\") return \"anthropic-messages\";\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\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\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();\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(\"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\tvoid finishSelection(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 && (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(`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.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\ttui.addChild(new Box(screen, { border: \"rounded\", padding: 1, title: \"di-code provider setup\" }));\n\ttui.start();\n\treturn startProviderOnboarding(\n\t\toptions,\n\t\ttui,\n\t\tscreen,\n\t\t(runtime) => {\n\t\t\ttui.stop({ finalLines: runtime ? [\"Provider configured for this run.\"] : [\"Provider setup cancelled.\"] });\n\t\t},\n\t\t() => tui.stop({ finalLines: [\"Provider setup failed.\"] }),\n\t\tfalse,\n\t);\n}\n\nexport function showInteractiveProviderOnboarding(\n\toptions: InteractiveProviderOnboardingOptions,\n): Promise<StartupRuntime | undefined> {\n\tconst screen = new OnboardingScreen();\n\tconst panel = new Box(screen, { border: \"rounded\", padding: 1, title: \"di-code 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,4 @@
|
|
|
1
|
-
import { type Model, type Provider } from "@di-code/ai";
|
|
1
|
+
import { type Model, type ModelApi, type Provider } from "@di-code/ai";
|
|
2
2
|
export interface StartupRuntime {
|
|
3
3
|
readonly provider: Provider;
|
|
4
4
|
readonly model: Model;
|
|
@@ -14,11 +14,19 @@ export interface StartupProviderConfiguration {
|
|
|
14
14
|
export interface StartupConfiguration {
|
|
15
15
|
readonly environment: Environment;
|
|
16
16
|
readonly providers: readonly StartupProviderConfiguration[];
|
|
17
|
+
readonly defaults?: StartupDefaults;
|
|
18
|
+
}
|
|
19
|
+
export interface StartupDefaults {
|
|
20
|
+
readonly providerId?: string;
|
|
21
|
+
readonly modelId?: string;
|
|
17
22
|
}
|
|
18
23
|
type Environment = Readonly<Record<string, string | undefined>>;
|
|
19
24
|
export declare function resolveStartupArgs(args: readonly string[]): readonly string[];
|
|
20
|
-
export declare function
|
|
21
|
-
|
|
25
|
+
export declare function saveGlobalProviderApiKey(agentDir: string, providerId: string, api: Exclude<ModelApi, "faux">, apiKey: string, modelId?: string): Promise<void>;
|
|
26
|
+
/** Removes only the persisted credential for one provider; environment variables remain untouched. */
|
|
27
|
+
export declare function removeGlobalProviderApiKey(agentDir: string, providerId: string): Promise<boolean>;
|
|
28
|
+
export declare function resolveStartupRuntime(env: Environment, providers: readonly StartupProviderConfiguration[], defaults?: StartupDefaults): StartupRuntime;
|
|
29
|
+
export declare function loadStartupConfiguration(cwd: string, environment?: Environment, agentDir?: string): Promise<StartupConfiguration>;
|
|
22
30
|
export declare function loadStartupEnvironment(cwd: string, environment?: Environment): Promise<Environment>;
|
|
23
31
|
export {};
|
|
24
32
|
//# sourceMappingURL=startup.d.ts.map
|
package/dist/startup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAGA,OAAO,EAQN,KAAK,KAAK,EACV,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,4BAA4B,EAAE,CAAC;IAC5D,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC1B;AAkBD,KAAK,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAiBhE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAE7E;AAsMD,wBAAsB,wBAAwB,CAC7C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,sGAAsG;AACtG,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBvG;AA6JD,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,SAAS,4BAA4B,EAAE,EAClD,QAAQ,GAAE,eAAoB,GAC5B,cAAc,CAqBhB;AAED,wBAAsB,wBAAwB,CAC7C,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,WAAyB,EACtC,QAAQ,SAA8B,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAoB/B;AAED,wBAAsB,sBAAsB,CAC3C,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,WAAyB,GACpC,OAAO,CAAC,WAAW,CAAC,CAEtB"}
|