@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.
Files changed (69) hide show
  1. package/README.md +20 -10
  2. package/dist/core/context-builder.d.ts.map +1 -1
  3. package/dist/core/context-builder.js +6 -2
  4. package/dist/core/context-builder.js.map +1 -1
  5. package/dist/core/image-input.d.ts +1 -1
  6. package/dist/core/image-input.d.ts.map +1 -1
  7. package/dist/core/image-input.js +55 -10
  8. package/dist/core/image-input.js.map +1 -1
  9. package/dist/core/session/session-storage.d.ts.map +1 -1
  10. package/dist/core/session/session-storage.js +1 -0
  11. package/dist/core/session/session-storage.js.map +1 -1
  12. package/dist/core/session.d.ts +17 -2
  13. package/dist/core/session.d.ts.map +1 -1
  14. package/dist/core/session.js +89 -0
  15. package/dist/core/session.js.map +1 -1
  16. package/dist/core/tools/bash.d.ts +2 -2
  17. package/dist/core/tools/bash.d.ts.map +1 -1
  18. package/dist/core/tools/bash.js.map +1 -1
  19. package/dist/core/tools/edit-diff.d.ts +25 -0
  20. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  21. package/dist/core/tools/edit-diff.js +136 -0
  22. package/dist/core/tools/edit-diff.js.map +1 -0
  23. package/dist/core/tools/edit.d.ts +13 -4
  24. package/dist/core/tools/edit.d.ts.map +1 -1
  25. package/dist/core/tools/edit.js +64 -30
  26. package/dist/core/tools/edit.js.map +1 -1
  27. package/dist/core/tools/read.d.ts +2 -2
  28. package/dist/core/tools/read.d.ts.map +1 -1
  29. package/dist/core/tools/read.js.map +1 -1
  30. package/dist/core/tools/write.d.ts +2 -2
  31. package/dist/core/tools/write.d.ts.map +1 -1
  32. package/dist/core/tools/write.js.map +1 -1
  33. package/dist/entry.js +9 -2
  34. package/dist/entry.js.map +1 -1
  35. package/dist/main.d.ts +3 -1
  36. package/dist/main.d.ts.map +1 -1
  37. package/dist/main.js +34 -6
  38. package/dist/main.js.map +1 -1
  39. package/dist/modes/interactive-components.d.ts +2 -0
  40. package/dist/modes/interactive-components.d.ts.map +1 -1
  41. package/dist/modes/interactive-components.js +40 -13
  42. package/dist/modes/interactive-components.js.map +1 -1
  43. package/dist/modes/interactive-diff.d.ts +8 -0
  44. package/dist/modes/interactive-diff.d.ts.map +1 -0
  45. package/dist/modes/interactive-diff.js +78 -0
  46. package/dist/modes/interactive-diff.js.map +1 -0
  47. package/dist/modes/interactive-layout.d.ts +4 -0
  48. package/dist/modes/interactive-layout.d.ts.map +1 -1
  49. package/dist/modes/interactive-layout.js +4 -0
  50. package/dist/modes/interactive-layout.js.map +1 -1
  51. package/dist/modes/interactive-state.d.ts +5 -0
  52. package/dist/modes/interactive-state.d.ts.map +1 -1
  53. package/dist/modes/interactive-state.js +64 -11
  54. package/dist/modes/interactive-state.js.map +1 -1
  55. package/dist/modes/interactive.d.ts +10 -0
  56. package/dist/modes/interactive.d.ts.map +1 -1
  57. package/dist/modes/interactive.js +190 -20
  58. package/dist/modes/interactive.js.map +1 -1
  59. package/dist/provider-onboarding.d.ts +8 -1
  60. package/dist/provider-onboarding.d.ts.map +1 -1
  61. package/dist/provider-onboarding.js +46 -23
  62. package/dist/provider-onboarding.js.map +1 -1
  63. package/dist/rpc-entry.js +1 -1
  64. package/dist/rpc-entry.js.map +1 -1
  65. package/dist/startup.d.ts +11 -3
  66. package/dist/startup.d.ts.map +1 -1
  67. package/dist/startup.js +216 -87
  68. package/dist/startup.js.map +1 -1
  69. 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 Responses API" },
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
- export function runProviderOnboarding(options) {
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
- tui.stop({ finalLines: runtime ? ["Provider configured for this run."] : ["Provider setup cancelled."] });
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
- tui.stop({ finalLines: ["Provider setup failed."] });
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,
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-entry.js","sourceRoot":"","sources":["../src/rpc-entry.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE/E,IAAI,CAAC;IACJ,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;QAChC,WAAW;QACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;KACpB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,OAAO;QACP,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC;KAC9D,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;IACrF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACtB,CAAC","sourcesContent":["#!/usr/bin/env node\n\nimport { resolve } from \"node:path\";\nimport { AgentSession } from \"./core/session.ts\";\nimport { RpcServer } from \"./rpc/server.ts\";\nimport { loadStartupConfiguration, resolveStartupRuntime } from \"./startup.ts\";\n\ntry {\n\tconst allowedRoot = resolve(process.cwd());\n\tconst configuration = await loadStartupConfiguration(allowedRoot);\n\tconst runtime = resolveStartupRuntime(configuration.environment, configuration.providers);\n\tconst session = new AgentSession({\n\t\tallowedRoot,\n\t\tprovider: runtime.provider,\n\t\tmodel: runtime.model,\n\t});\n\tconst server = new RpcServer({\n\t\tsession,\n\t\tinput: process.stdin,\n\t\toutput: process.stdout,\n\t\tonError: (error) => process.stderr.write(`${error.message}\\n`),\n\t});\n\tserver.start();\n} catch (cause) {\n\tconst message = cause instanceof Error ? cause.message : \"Unknown RPC startup error\";\n\tprocess.stderr.write(`${message}\\n`);\n\tprocess.exitCode = 1;\n}\n"]}
1
+ {"version":3,"file":"rpc-entry.js","sourceRoot":"","sources":["../src/rpc-entry.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE/E,IAAI,CAAC;IACJ,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClH,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;QAChC,WAAW;QACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;KACpB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,OAAO;QACP,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC;KAC9D,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;IACrF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACtB,CAAC","sourcesContent":["#!/usr/bin/env node\n\nimport { resolve } from \"node:path\";\nimport { AgentSession } from \"./core/session.ts\";\nimport { RpcServer } from \"./rpc/server.ts\";\nimport { loadStartupConfiguration, resolveStartupRuntime } from \"./startup.ts\";\n\ntry {\n\tconst allowedRoot = resolve(process.cwd());\n\tconst configuration = await loadStartupConfiguration(allowedRoot);\n\tconst runtime = resolveStartupRuntime(configuration.environment, configuration.providers, configuration.defaults);\n\tconst session = new AgentSession({\n\t\tallowedRoot,\n\t\tprovider: runtime.provider,\n\t\tmodel: runtime.model,\n\t});\n\tconst server = new RpcServer({\n\t\tsession,\n\t\tinput: process.stdin,\n\t\toutput: process.stdout,\n\t\tonError: (error) => process.stderr.write(`${error.message}\\n`),\n\t});\n\tserver.start();\n} catch (cause) {\n\tconst message = cause instanceof Error ? cause.message : \"Unknown RPC startup error\";\n\tprocess.stderr.write(`${message}\\n`);\n\tprocess.exitCode = 1;\n}\n"]}
package/dist/startup.d.ts CHANGED
@@ -1,4 +1,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 resolveStartupRuntime(env: Environment, providers: readonly StartupProviderConfiguration[]): StartupRuntime;
21
- export declare function loadStartupConfiguration(cwd: string, environment?: Environment): Promise<StartupConfiguration>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAEA,OAAO,EAON,KAAK,KAAK,EACV,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;CAC5D;AAQD,KAAK,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAehE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAE7E;AAmPD,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,SAAS,4BAA4B,EAAE,GAChD,cAAc,CAgBhB;AAED,wBAAsB,wBAAwB,CAC7C,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,WAAyB,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAuB/B;AAED,wBAAsB,sBAAsB,CAC3C,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,WAAyB,GACpC,OAAO,CAAC,WAAW,CAAC,CAEtB"}
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"}