@di-code/coding-agent 0.1.0 → 0.1.2

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 (81) hide show
  1. package/README.md +224 -0
  2. package/dist/cli.d.ts +11 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +59 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/resources/index.d.ts +3 -0
  7. package/dist/core/resources/index.d.ts.map +1 -0
  8. package/dist/core/resources/index.js +2 -0
  9. package/dist/core/resources/index.js.map +1 -0
  10. package/dist/core/resources/loader.d.ts +8 -0
  11. package/dist/core/resources/loader.d.ts.map +1 -0
  12. package/dist/core/resources/loader.js +174 -0
  13. package/dist/core/resources/loader.js.map +1 -0
  14. package/dist/core/resources/skills.d.ts +10 -0
  15. package/dist/core/resources/skills.d.ts.map +1 -0
  16. package/dist/core/resources/skills.js +167 -0
  17. package/dist/core/resources/skills.js.map +1 -0
  18. package/dist/core/resources/types.d.ts +41 -0
  19. package/dist/core/resources/types.d.ts.map +1 -0
  20. package/dist/core/resources/types.js +2 -0
  21. package/dist/core/resources/types.js.map +1 -0
  22. package/dist/core/session.d.ts +7 -0
  23. package/dist/core/session.d.ts.map +1 -1
  24. package/dist/core/session.js +23 -3
  25. package/dist/core/session.js.map +1 -1
  26. package/dist/core/skill-command.d.ts +3 -0
  27. package/dist/core/skill-command.d.ts.map +1 -0
  28. package/dist/core/skill-command.js +34 -0
  29. package/dist/core/skill-command.js.map +1 -0
  30. package/dist/core/system-prompt.d.ts +6 -0
  31. package/dist/core/system-prompt.d.ts.map +1 -0
  32. package/dist/core/system-prompt.js +57 -0
  33. package/dist/core/system-prompt.js.map +1 -0
  34. package/dist/extensions/runtime.d.ts +7 -4
  35. package/dist/extensions/runtime.d.ts.map +1 -1
  36. package/dist/extensions/runtime.js +45 -10
  37. package/dist/extensions/runtime.js.map +1 -1
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +3 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/main.d.ts +1 -0
  43. package/dist/main.d.ts.map +1 -1
  44. package/dist/main.js +85 -2
  45. package/dist/main.js.map +1 -1
  46. package/dist/modes/interactive-components.d.ts.map +1 -1
  47. package/dist/modes/interactive-components.js +4 -0
  48. package/dist/modes/interactive-components.js.map +1 -1
  49. package/dist/modes/interactive-state.js +1 -1
  50. package/dist/modes/interactive-state.js.map +1 -1
  51. package/dist/modes/interactive.d.ts +4 -0
  52. package/dist/modes/interactive.d.ts.map +1 -1
  53. package/dist/modes/interactive.js +26 -5
  54. package/dist/modes/interactive.js.map +1 -1
  55. package/dist/plugins/index.d.ts +5 -0
  56. package/dist/plugins/index.d.ts.map +1 -0
  57. package/dist/plugins/index.js +5 -0
  58. package/dist/plugins/index.js.map +1 -0
  59. package/dist/plugins/loader.d.ts +18 -0
  60. package/dist/plugins/loader.d.ts.map +1 -0
  61. package/dist/plugins/loader.js +92 -0
  62. package/dist/plugins/loader.js.map +1 -0
  63. package/dist/plugins/manager.d.ts +23 -0
  64. package/dist/plugins/manager.d.ts.map +1 -0
  65. package/dist/plugins/manager.js +152 -0
  66. package/dist/plugins/manager.js.map +1 -0
  67. package/dist/plugins/manifest.d.ts +7 -0
  68. package/dist/plugins/manifest.d.ts.map +1 -0
  69. package/dist/plugins/manifest.js +116 -0
  70. package/dist/plugins/manifest.js.map +1 -0
  71. package/dist/plugins/types.d.ts +41 -0
  72. package/dist/plugins/types.d.ts.map +1 -0
  73. package/dist/plugins/types.js +2 -0
  74. package/dist/plugins/types.js.map +1 -0
  75. package/dist/provider-onboarding.d.ts.map +1 -1
  76. package/dist/provider-onboarding.js +13 -1
  77. package/dist/provider-onboarding.js.map +1 -1
  78. package/dist/startup.d.ts.map +1 -1
  79. package/dist/startup.js +37 -15
  80. package/dist/startup.js.map +1 -1
  81. package/package.json +24 -4
package/dist/startup.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
- import { createDeepSeekProvider, createFauxProvider, createOpenAIProvider, } from "@di-code/ai";
3
+ import { createDeepSeekProvider, createFauxProvider, createOpenAIProvider, createZhipuProvider, } from "@di-code/ai";
4
4
  const FAUX_RESPONSES = [
5
5
  { type: "success", content: [{ type: "text", text: "Faux response." }] },
6
6
  ];
@@ -129,7 +129,13 @@ function createFauxRuntime() {
129
129
  return { provider: faux.provider, model: faux.model };
130
130
  }
131
131
  function selectProviderModel(provider, providerId, env) {
132
- const modelId = env.DI_CODE_MODEL?.trim() || provider.models[0]?.id;
132
+ const modelId = env.DI_CODE_MODEL?.trim() ||
133
+ (providerId === "openai"
134
+ ? provider.models.find((candidate) => candidate.id === "gpt-4o")?.id
135
+ : providerId === "zhipu"
136
+ ? provider.models.find((candidate) => candidate.id === "glm-5.3")?.id
137
+ : undefined) ||
138
+ provider.models[0]?.id;
133
139
  if (!modelId)
134
140
  throw new Error("DI_CODE_MODEL is required when the selected provider has no models");
135
141
  const model = provider.models.find((candidate) => candidate.id === modelId);
@@ -148,13 +154,22 @@ function createBuiltInRuntime(env, providerId) {
148
154
  const provider = createDeepSeekProvider({ env });
149
155
  return { provider, model: selectProviderModel(provider, providerId, env) };
150
156
  }
157
+ if (providerId === "zhipu") {
158
+ const provider = createZhipuProvider({ env });
159
+ return { provider, model: selectProviderModel(provider, providerId, env) };
160
+ }
151
161
  return undefined;
152
162
  }
153
163
  function createConfiguredRuntime(env, configuration) {
154
- if (configuration.api !== "openai-responses" && configuration.api !== "deepseek-responses") {
155
- throw new Error(`Unsupported API "${configuration.api ?? "missing"}" for provider "${configuration.id}". Expected openai-responses or deepseek-responses.`);
164
+ if (configuration.api !== "openai-responses" &&
165
+ configuration.api !== "deepseek-responses" &&
166
+ configuration.api !== "zhipu-chat-completions") {
167
+ throw new Error(`Unsupported API "${configuration.api ?? "missing"}" for provider "${configuration.id}". Expected openai-responses or deepseek-responses. zhipu-chat-completions is also supported.`);
156
168
  }
157
- if (configuration.id !== "openai" && configuration.id !== "deepseek" && !configuration.models) {
169
+ if (configuration.id !== "openai" &&
170
+ configuration.id !== "deepseek" &&
171
+ configuration.id !== "zhipu" &&
172
+ !configuration.models) {
158
173
  throw new Error(`${SETTINGS_PATH}: providers.${configuration.id}.models is required for a custom provider`);
159
174
  }
160
175
  const provider = configuration.id === "deepseek"
@@ -164,16 +179,23 @@ function createConfiguredRuntime(env, configuration) {
164
179
  apiKey: resolveConfigValue(configuration.apiKey, env),
165
180
  baseUrl: configuration.models ? undefined : configuration.baseUrl,
166
181
  })
167
- : createOpenAIProvider({
168
- env: configuration.id === "openai"
169
- ? env
170
- : Object.fromEntries(Object.entries(env).filter(([name]) => name !== "OPENAI_API_KEY" && name !== "OPENAI_BASE_URL")),
171
- models: configuration.models,
172
- apiKey: resolveConfigValue(configuration.apiKey, env),
173
- baseUrl: configuration.models ? undefined : configuration.baseUrl,
174
- providerId: configuration.id,
175
- name: configuration.name,
176
- });
182
+ : configuration.id === "zhipu"
183
+ ? createZhipuProvider({
184
+ env,
185
+ models: configuration.models,
186
+ apiKey: resolveConfigValue(configuration.apiKey, env),
187
+ baseUrl: configuration.models ? undefined : configuration.baseUrl,
188
+ })
189
+ : createOpenAIProvider({
190
+ env: configuration.id === "openai"
191
+ ? env
192
+ : Object.fromEntries(Object.entries(env).filter(([name]) => name !== "OPENAI_API_KEY" && name !== "OPENAI_BASE_URL")),
193
+ models: configuration.models,
194
+ apiKey: resolveConfigValue(configuration.apiKey, env),
195
+ baseUrl: configuration.models ? undefined : configuration.baseUrl,
196
+ providerId: configuration.id,
197
+ name: configuration.name,
198
+ });
177
199
  const model = selectProviderModel(provider, configuration.id, env);
178
200
  return { provider, model };
179
201
  }
@@ -1 +1 @@
1
- {"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcreateDeepSeekProvider,\n\tcreateFauxProvider,\n\tcreateOpenAIProvider,\n\ttype FauxResponse,\n\ttype Model,\n\ttype Provider,\n} from \"@di-code/ai\";\n\nexport interface StartupRuntime {\n\treadonly provider: Provider;\n\treadonly model: Model;\n}\n\nexport interface StartupProviderConfiguration {\n\treadonly id: string;\n\treadonly name?: string;\n\treadonly api?: string;\n\treadonly apiKey?: string;\n\treadonly baseUrl?: string;\n\treadonly models?: readonly Model[];\n}\n\nexport interface StartupConfiguration {\n\treadonly environment: Environment;\n\treadonly providers: readonly StartupProviderConfiguration[];\n}\n\nconst FAUX_RESPONSES: readonly FauxResponse[] = [\n\t{ type: \"success\", content: [{ type: \"text\", text: \"Faux response.\" }] },\n];\n\nconst SETTINGS_PATH = join(\".di-code\", \"settings.json\");\n\ntype Environment = Readonly<Record<string, string | undefined>>;\n\ninterface SettingsFile {\n\treadonly providers: Record<\n\t\tstring,\n\t\t{\n\t\t\treadonly name?: string;\n\t\t\treadonly baseUrl?: string;\n\t\t\treadonly apiKey?: string;\n\t\t\treadonly api?: string;\n\t\t\treadonly models?: unknown;\n\t\t}\n\t>;\n}\n\nexport function resolveStartupArgs(args: readonly string[]): readonly string[] {\n\treturn args.length === 0 ? [\"--interactive\"] : args;\n}\n\nfunction optionalString(value: unknown, path: string): string | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"string\") throw new Error(`${SETTINGS_PATH}: ${path} must be a string`);\n\treturn value;\n}\n\nfunction requiredString(value: unknown, path: string): string {\n\tconst result = optionalString(value, path);\n\tif (!result?.trim()) throw new Error(`${SETTINGS_PATH}: ${path} must be a non-empty string`);\n\treturn result.trim();\n}\n\nfunction positiveInteger(value: unknown, path: string, fallback: number): number {\n\tconst result = value ?? fallback;\n\tif (!Number.isInteger(result) || (result as number) <= 0) {\n\t\tthrow new Error(`${SETTINGS_PATH}: ${path} must be a positive integer`);\n\t}\n\treturn result as number;\n}\n\nfunction nonNegativeNumber(value: unknown, path: string, fallback: number): number {\n\tconst result = value ?? fallback;\n\tif (typeof result !== \"number\" || !Number.isFinite(result) || result < 0) {\n\t\tthrow new Error(`${SETTINGS_PATH}: ${path} must be a non-negative finite number`);\n\t}\n\treturn result;\n}\n\nfunction parseModels(\n\tvalue: unknown,\n\tpath: string,\n\tproviderId: string,\n\tproviderApi: string | undefined,\n\tproviderBaseUrl: string | undefined,\n): readonly Model[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) throw new Error(`${SETTINGS_PATH}: ${path} must be an array`);\n\n\treturn value.map((entry, index) => {\n\t\tconst modelPath = `${path}[${index}]`;\n\t\tif (typeof entry !== \"object\" || entry === null || Array.isArray(entry)) {\n\t\t\tthrow new Error(`${SETTINGS_PATH}: ${modelPath} must be an object`);\n\t\t}\n\t\tconst model = entry as Record<string, unknown>;\n\t\tconst input = model.input ?? [\"text\"];\n\t\tif (!Array.isArray(input) || input.length === 0 || input.some((item) => item !== \"text\" && item !== \"image\")) {\n\t\t\tthrow new Error(`${SETTINGS_PATH}: ${modelPath}.input must contain text and/or image`);\n\t\t}\n\t\tconst cost = model.cost ?? {};\n\t\tif (typeof cost !== \"object\" || cost === null || Array.isArray(cost)) {\n\t\t\tthrow new Error(`${SETTINGS_PATH}: ${modelPath}.cost must be an object`);\n\t\t}\n\t\tconst prices = cost as Record<string, unknown>;\n\t\tif (model.reasoning !== undefined && typeof model.reasoning !== \"boolean\") {\n\t\t\tthrow new Error(`${SETTINGS_PATH}: ${modelPath}.reasoning must be a boolean`);\n\t\t}\n\t\tconst api = optionalString(model.api, `${modelPath}.api`) ?? providerApi;\n\t\tif (!api) throw new Error(`${SETTINGS_PATH}: ${modelPath}.api is required`);\n\t\tconst baseUrl = optionalString(model.baseUrl, `${modelPath}.baseUrl`) ?? providerBaseUrl;\n\t\tconst id = requiredString(model.id, `${modelPath}.id`);\n\t\treturn {\n\t\t\tid,\n\t\t\tname: requiredString(model.name ?? id, `${modelPath}.name`),\n\t\t\tprovider: providerId,\n\t\t\tapi,\n\t\t\t...(baseUrl === undefined ? {} : { baseUrl }),\n\t\t\tinput: [...input],\n\t\t\treasoning: model.reasoning ?? false,\n\t\t\tcontextWindow: positiveInteger(model.contextWindow, `${modelPath}.contextWindow`, 128_000),\n\t\t\tmaxOutputTokens: positiveInteger(model.maxTokens ?? model.maxOutputTokens, `${modelPath}.maxTokens`, 16_384),\n\t\t\tcost: {\n\t\t\t\tinput: nonNegativeNumber(prices.input, `${modelPath}.cost.input`, 0) / 1_000_000,\n\t\t\t\toutput: nonNegativeNumber(prices.output, `${modelPath}.cost.output`, 0) / 1_000_000,\n\t\t\t\tcacheRead: nonNegativeNumber(prices.cacheRead, `${modelPath}.cost.cacheRead`, 0) / 1_000_000,\n\t\t\t\tcacheWrite: nonNegativeNumber(prices.cacheWrite, `${modelPath}.cost.cacheWrite`, 0) / 1_000_000,\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction parseSettings(value: unknown): SettingsFile {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(`${SETTINGS_PATH}: root value must be an object`);\n\t}\n\tconst record = value as Record<string, unknown>;\n\tconst providersValue = record.providers;\n\tif (typeof providersValue !== \"object\" || providersValue === null || Array.isArray(providersValue)) {\n\t\tthrow new Error(`${SETTINGS_PATH}: providers must be an object`);\n\t}\n\tconst providers: Record<string, SettingsFile[\"providers\"][string]> = {};\n\tfor (const [id, entry] of Object.entries(providersValue as Record<string, unknown>)) {\n\t\tif (typeof entry !== \"object\" || entry === null || Array.isArray(entry)) {\n\t\t\tthrow new Error(`${SETTINGS_PATH}: providers.${id} must be an object`);\n\t\t}\n\t\tconst provider = entry as Record<string, unknown>;\n\t\tproviders[id] = {\n\t\t\tname: optionalString(provider.name, `providers.${id}.name`),\n\t\t\tbaseUrl: optionalString(provider.baseUrl, `providers.${id}.baseUrl`),\n\t\t\tapiKey: optionalString(provider.apiKey, `providers.${id}.apiKey`),\n\t\t\tapi: optionalString(provider.api, `providers.${id}.api`),\n\t\t\tmodels: provider.models,\n\t\t};\n\t}\n\treturn { providers };\n}\n\nfunction resolveConfigValue(value: string | undefined, env: Environment): string | undefined {\n\tif (value === undefined) return undefined;\n\tconst trimmed = value.trim();\n\tconst match = /^\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}$|^\\$([A-Za-z_][A-Za-z0-9_]*)$/.exec(trimmed);\n\tif (match) {\n\t\tconst name = match[1] ?? match[2];\n\t\tconst resolved = env[name];\n\t\tif (!resolved?.trim()) throw new Error(`Configured apiKey environment variable \"${name}\" is not set.`);\n\t\treturn resolved;\n\t}\n\tif (trimmed.startsWith(\"!\")) {\n\t\tthrow new Error(\"Command-based apiKey values are not supported by di-code; use $ENV_VAR instead.\");\n\t}\n\treturn value;\n}\n\nfunction createFauxRuntime(): StartupRuntime {\n\tconst faux = createFauxProvider({ responses: FAUX_RESPONSES });\n\treturn { provider: faux.provider, model: faux.model };\n}\n\nfunction selectProviderModel(provider: Provider, providerId: string, env: Environment): Model {\n\tconst modelId = env.DI_CODE_MODEL?.trim() || provider.models[0]?.id;\n\tif (!modelId) throw new Error(\"DI_CODE_MODEL is required when the selected provider has no models\");\n\tconst model = provider.models.find((candidate) => candidate.id === modelId);\n\tif (!model) {\n\t\tconst availableModels = provider.models.map((candidate) => candidate.id).join(\", \");\n\t\tthrow new Error(`Unknown model \"${modelId}\" for provider \"${providerId}\". Available models: ${availableModels}.`);\n\t}\n\treturn model;\n}\n\nfunction createBuiltInRuntime(env: Environment, providerId: string): StartupRuntime | undefined {\n\tif (providerId === \"openai\") {\n\t\tconst provider = createOpenAIProvider({ env });\n\t\treturn { provider, model: selectProviderModel(provider, providerId, env) };\n\t}\n\tif (providerId === \"deepseek\") {\n\t\tconst provider = createDeepSeekProvider({ env });\n\t\treturn { provider, model: selectProviderModel(provider, providerId, env) };\n\t}\n\treturn undefined;\n}\n\nfunction createConfiguredRuntime(env: Environment, configuration: StartupProviderConfiguration): StartupRuntime {\n\tif (configuration.api !== \"openai-responses\" && configuration.api !== \"deepseek-responses\") {\n\t\tthrow new Error(\n\t\t\t`Unsupported API \"${configuration.api ?? \"missing\"}\" for provider \"${configuration.id}\". Expected openai-responses or deepseek-responses.`,\n\t\t);\n\t}\n\tif (configuration.id !== \"openai\" && configuration.id !== \"deepseek\" && !configuration.models) {\n\t\tthrow new Error(`${SETTINGS_PATH}: providers.${configuration.id}.models is required for a custom provider`);\n\t}\n\tconst provider =\n\t\tconfiguration.id === \"deepseek\"\n\t\t\t? createDeepSeekProvider({\n\t\t\t\t\tenv,\n\t\t\t\t\tmodels: configuration.models,\n\t\t\t\t\tapiKey: resolveConfigValue(configuration.apiKey, env),\n\t\t\t\t\tbaseUrl: configuration.models ? undefined : configuration.baseUrl,\n\t\t\t\t})\n\t\t\t: createOpenAIProvider({\n\t\t\t\t\tenv:\n\t\t\t\t\t\tconfiguration.id === \"openai\"\n\t\t\t\t\t\t\t? env\n\t\t\t\t\t\t\t: Object.fromEntries(\n\t\t\t\t\t\t\t\t\tObject.entries(env).filter(([name]) => name !== \"OPENAI_API_KEY\" && name !== \"OPENAI_BASE_URL\"),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\tmodels: configuration.models,\n\t\t\t\t\tapiKey: resolveConfigValue(configuration.apiKey, env),\n\t\t\t\t\tbaseUrl: configuration.models ? undefined : configuration.baseUrl,\n\t\t\t\t\tproviderId: configuration.id,\n\t\t\t\t\tname: configuration.name,\n\t\t\t\t});\n\tconst model = selectProviderModel(provider, configuration.id, env);\n\treturn { provider, model };\n}\n\nexport function resolveStartupRuntime(\n\tenv: Environment,\n\tproviders: readonly StartupProviderConfiguration[],\n): StartupRuntime {\n\tconst selectedProviderId = env.DI_CODE_PROVIDER?.trim() || (providers.length === 1 ? providers[0]?.id : undefined);\n\tif (selectedProviderId === \"faux\") return createFauxRuntime();\n\tif (!selectedProviderId) {\n\t\tif (providers.length === 0) {\n\t\t\tthrow new Error(\"Provider is not configured. Set DI_CODE_PROVIDER or start interactive mode in a TTY.\");\n\t\t}\n\t\tthrow new Error(\"DI_CODE_PROVIDER is required when more than one provider is configured.\");\n\t}\n\tconst selectedProvider = providers.find((provider) => provider.id === selectedProviderId);\n\tif (selectedProvider) return createConfiguredRuntime(env, selectedProvider);\n\tconst builtInRuntime = createBuiltInRuntime(env, selectedProviderId);\n\tif (builtInRuntime) return builtInRuntime;\n\tthrow new Error(\n\t\t`Unknown configured provider \"${selectedProviderId}\". Available providers: ${providers.map((provider) => provider.id).join(\", \")}.`,\n\t);\n}\n\nexport async function loadStartupConfiguration(\n\tcwd: string,\n\tenvironment: Environment = process.env,\n): Promise<StartupConfiguration> {\n\tlet settings: SettingsFile;\n\ttry {\n\t\tconst source = await readFile(join(cwd, SETTINGS_PATH), \"utf8\");\n\t\tif (source.trim().length === 0) return { environment, providers: [] };\n\t\tsettings = parseSettings(JSON.parse(source));\n\t} catch (cause) {\n\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n\t\t\treturn { environment, providers: [] };\n\t\t}\n\t\tif (cause instanceof SyntaxError) throw new Error(`${SETTINGS_PATH}: invalid JSON`, { cause });\n\t\tthrow cause;\n\t}\n\n\tconst providers = Object.entries(settings.providers).map(([id, provider]) => ({\n\t\tid: requiredString(id, `providers.${id}`),\n\t\tname: provider.name,\n\t\tapi: provider.api,\n\t\tapiKey: provider.apiKey,\n\t\tbaseUrl: provider.baseUrl,\n\t\tmodels: parseModels(provider.models, `providers.${id}.models`, id, provider.api, provider.baseUrl),\n\t}));\n\treturn { environment, providers };\n}\n\nexport async function loadStartupEnvironment(\n\tcwd: string,\n\tenvironment: Environment = process.env,\n): Promise<Environment> {\n\treturn (await loadStartupConfiguration(cwd, environment)).environment;\n}\n"]}
1
+ {"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcreateDeepSeekProvider,\n\tcreateFauxProvider,\n\tcreateOpenAIProvider,\n\tcreateZhipuProvider,\n\ttype FauxResponse,\n\ttype Model,\n\ttype Provider,\n} from \"@di-code/ai\";\n\nexport interface StartupRuntime {\n\treadonly provider: Provider;\n\treadonly model: Model;\n}\n\nexport interface StartupProviderConfiguration {\n\treadonly id: string;\n\treadonly name?: string;\n\treadonly api?: string;\n\treadonly apiKey?: string;\n\treadonly baseUrl?: string;\n\treadonly models?: readonly Model[];\n}\n\nexport interface StartupConfiguration {\n\treadonly environment: Environment;\n\treadonly providers: readonly StartupProviderConfiguration[];\n}\n\nconst FAUX_RESPONSES: readonly FauxResponse[] = [\n\t{ type: \"success\", content: [{ type: \"text\", text: \"Faux response.\" }] },\n];\n\nconst SETTINGS_PATH = join(\".di-code\", \"settings.json\");\n\ntype Environment = Readonly<Record<string, string | undefined>>;\n\ninterface SettingsFile {\n\treadonly providers: Record<\n\t\tstring,\n\t\t{\n\t\t\treadonly name?: string;\n\t\t\treadonly baseUrl?: string;\n\t\t\treadonly apiKey?: string;\n\t\t\treadonly api?: string;\n\t\t\treadonly models?: unknown;\n\t\t}\n\t>;\n}\n\nexport function resolveStartupArgs(args: readonly string[]): readonly string[] {\n\treturn args.length === 0 ? [\"--interactive\"] : args;\n}\n\nfunction optionalString(value: unknown, path: string): string | undefined {\n\tif (value === undefined) return undefined;\n\tif (typeof value !== \"string\") throw new Error(`${SETTINGS_PATH}: ${path} must be a string`);\n\treturn value;\n}\n\nfunction requiredString(value: unknown, path: string): string {\n\tconst result = optionalString(value, path);\n\tif (!result?.trim()) throw new Error(`${SETTINGS_PATH}: ${path} must be a non-empty string`);\n\treturn result.trim();\n}\n\nfunction positiveInteger(value: unknown, path: string, fallback: number): number {\n\tconst result = value ?? fallback;\n\tif (!Number.isInteger(result) || (result as number) <= 0) {\n\t\tthrow new Error(`${SETTINGS_PATH}: ${path} must be a positive integer`);\n\t}\n\treturn result as number;\n}\n\nfunction nonNegativeNumber(value: unknown, path: string, fallback: number): number {\n\tconst result = value ?? fallback;\n\tif (typeof result !== \"number\" || !Number.isFinite(result) || result < 0) {\n\t\tthrow new Error(`${SETTINGS_PATH}: ${path} must be a non-negative finite number`);\n\t}\n\treturn result;\n}\n\nfunction parseModels(\n\tvalue: unknown,\n\tpath: string,\n\tproviderId: string,\n\tproviderApi: string | undefined,\n\tproviderBaseUrl: string | undefined,\n): readonly Model[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) throw new Error(`${SETTINGS_PATH}: ${path} must be an array`);\n\n\treturn value.map((entry, index) => {\n\t\tconst modelPath = `${path}[${index}]`;\n\t\tif (typeof entry !== \"object\" || entry === null || Array.isArray(entry)) {\n\t\t\tthrow new Error(`${SETTINGS_PATH}: ${modelPath} must be an object`);\n\t\t}\n\t\tconst model = entry as Record<string, unknown>;\n\t\tconst input = model.input ?? [\"text\"];\n\t\tif (!Array.isArray(input) || input.length === 0 || input.some((item) => item !== \"text\" && item !== \"image\")) {\n\t\t\tthrow new Error(`${SETTINGS_PATH}: ${modelPath}.input must contain text and/or image`);\n\t\t}\n\t\tconst cost = model.cost ?? {};\n\t\tif (typeof cost !== \"object\" || cost === null || Array.isArray(cost)) {\n\t\t\tthrow new Error(`${SETTINGS_PATH}: ${modelPath}.cost must be an object`);\n\t\t}\n\t\tconst prices = cost as Record<string, unknown>;\n\t\tif (model.reasoning !== undefined && typeof model.reasoning !== \"boolean\") {\n\t\t\tthrow new Error(`${SETTINGS_PATH}: ${modelPath}.reasoning must be a boolean`);\n\t\t}\n\t\tconst api = optionalString(model.api, `${modelPath}.api`) ?? providerApi;\n\t\tif (!api) throw new Error(`${SETTINGS_PATH}: ${modelPath}.api is required`);\n\t\tconst baseUrl = optionalString(model.baseUrl, `${modelPath}.baseUrl`) ?? providerBaseUrl;\n\t\tconst id = requiredString(model.id, `${modelPath}.id`);\n\t\treturn {\n\t\t\tid,\n\t\t\tname: requiredString(model.name ?? id, `${modelPath}.name`),\n\t\t\tprovider: providerId,\n\t\t\tapi,\n\t\t\t...(baseUrl === undefined ? {} : { baseUrl }),\n\t\t\tinput: [...input],\n\t\t\treasoning: model.reasoning ?? false,\n\t\t\tcontextWindow: positiveInteger(model.contextWindow, `${modelPath}.contextWindow`, 128_000),\n\t\t\tmaxOutputTokens: positiveInteger(model.maxTokens ?? model.maxOutputTokens, `${modelPath}.maxTokens`, 16_384),\n\t\t\tcost: {\n\t\t\t\tinput: nonNegativeNumber(prices.input, `${modelPath}.cost.input`, 0) / 1_000_000,\n\t\t\t\toutput: nonNegativeNumber(prices.output, `${modelPath}.cost.output`, 0) / 1_000_000,\n\t\t\t\tcacheRead: nonNegativeNumber(prices.cacheRead, `${modelPath}.cost.cacheRead`, 0) / 1_000_000,\n\t\t\t\tcacheWrite: nonNegativeNumber(prices.cacheWrite, `${modelPath}.cost.cacheWrite`, 0) / 1_000_000,\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction parseSettings(value: unknown): SettingsFile {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(`${SETTINGS_PATH}: root value must be an object`);\n\t}\n\tconst record = value as Record<string, unknown>;\n\tconst providersValue = record.providers;\n\tif (typeof providersValue !== \"object\" || providersValue === null || Array.isArray(providersValue)) {\n\t\tthrow new Error(`${SETTINGS_PATH}: providers must be an object`);\n\t}\n\tconst providers: Record<string, SettingsFile[\"providers\"][string]> = {};\n\tfor (const [id, entry] of Object.entries(providersValue as Record<string, unknown>)) {\n\t\tif (typeof entry !== \"object\" || entry === null || Array.isArray(entry)) {\n\t\t\tthrow new Error(`${SETTINGS_PATH}: providers.${id} must be an object`);\n\t\t}\n\t\tconst provider = entry as Record<string, unknown>;\n\t\tproviders[id] = {\n\t\t\tname: optionalString(provider.name, `providers.${id}.name`),\n\t\t\tbaseUrl: optionalString(provider.baseUrl, `providers.${id}.baseUrl`),\n\t\t\tapiKey: optionalString(provider.apiKey, `providers.${id}.apiKey`),\n\t\t\tapi: optionalString(provider.api, `providers.${id}.api`),\n\t\t\tmodels: provider.models,\n\t\t};\n\t}\n\treturn { providers };\n}\n\nfunction resolveConfigValue(value: string | undefined, env: Environment): string | undefined {\n\tif (value === undefined) return undefined;\n\tconst trimmed = value.trim();\n\tconst match = /^\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}$|^\\$([A-Za-z_][A-Za-z0-9_]*)$/.exec(trimmed);\n\tif (match) {\n\t\tconst name = match[1] ?? match[2];\n\t\tconst resolved = env[name];\n\t\tif (!resolved?.trim()) throw new Error(`Configured apiKey environment variable \"${name}\" is not set.`);\n\t\treturn resolved;\n\t}\n\tif (trimmed.startsWith(\"!\")) {\n\t\tthrow new Error(\"Command-based apiKey values are not supported by di-code; use $ENV_VAR instead.\");\n\t}\n\treturn value;\n}\n\nfunction createFauxRuntime(): StartupRuntime {\n\tconst faux = createFauxProvider({ responses: FAUX_RESPONSES });\n\treturn { provider: faux.provider, model: faux.model };\n}\n\nfunction selectProviderModel(provider: Provider, providerId: string, env: Environment): Model {\n\tconst modelId =\n\t\tenv.DI_CODE_MODEL?.trim() ||\n\t\t(providerId === \"openai\"\n\t\t\t? provider.models.find((candidate) => candidate.id === \"gpt-4o\")?.id\n\t\t\t: providerId === \"zhipu\"\n\t\t\t\t? provider.models.find((candidate) => candidate.id === \"glm-5.3\")?.id\n\t\t\t\t: undefined) ||\n\t\tprovider.models[0]?.id;\n\tif (!modelId) throw new Error(\"DI_CODE_MODEL is required when the selected provider has no models\");\n\tconst model = provider.models.find((candidate) => candidate.id === modelId);\n\tif (!model) {\n\t\tconst availableModels = provider.models.map((candidate) => candidate.id).join(\", \");\n\t\tthrow new Error(`Unknown model \"${modelId}\" for provider \"${providerId}\". Available models: ${availableModels}.`);\n\t}\n\treturn model;\n}\n\nfunction createBuiltInRuntime(env: Environment, providerId: string): StartupRuntime | undefined {\n\tif (providerId === \"openai\") {\n\t\tconst provider = createOpenAIProvider({ env });\n\t\treturn { provider, model: selectProviderModel(provider, providerId, env) };\n\t}\n\tif (providerId === \"deepseek\") {\n\t\tconst provider = createDeepSeekProvider({ env });\n\t\treturn { provider, model: selectProviderModel(provider, providerId, env) };\n\t}\n\tif (providerId === \"zhipu\") {\n\t\tconst provider = createZhipuProvider({ env });\n\t\treturn { provider, model: selectProviderModel(provider, providerId, env) };\n\t}\n\treturn undefined;\n}\n\nfunction createConfiguredRuntime(env: Environment, configuration: StartupProviderConfiguration): StartupRuntime {\n\tif (\n\t\tconfiguration.api !== \"openai-responses\" &&\n\t\tconfiguration.api !== \"deepseek-responses\" &&\n\t\tconfiguration.api !== \"zhipu-chat-completions\"\n\t) {\n\t\tthrow new Error(\n\t\t\t`Unsupported API \"${configuration.api ?? \"missing\"}\" for provider \"${configuration.id}\". Expected openai-responses or deepseek-responses. zhipu-chat-completions is also supported.`,\n\t\t);\n\t}\n\tif (\n\t\tconfiguration.id !== \"openai\" &&\n\t\tconfiguration.id !== \"deepseek\" &&\n\t\tconfiguration.id !== \"zhipu\" &&\n\t\t!configuration.models\n\t) {\n\t\tthrow new Error(`${SETTINGS_PATH}: providers.${configuration.id}.models is required for a custom provider`);\n\t}\n\tconst provider =\n\t\tconfiguration.id === \"deepseek\"\n\t\t\t? createDeepSeekProvider({\n\t\t\t\t\tenv,\n\t\t\t\t\tmodels: configuration.models,\n\t\t\t\t\tapiKey: resolveConfigValue(configuration.apiKey, env),\n\t\t\t\t\tbaseUrl: configuration.models ? undefined : configuration.baseUrl,\n\t\t\t\t})\n\t\t\t: configuration.id === \"zhipu\"\n\t\t\t\t? createZhipuProvider({\n\t\t\t\t\t\tenv,\n\t\t\t\t\t\tmodels: configuration.models,\n\t\t\t\t\t\tapiKey: resolveConfigValue(configuration.apiKey, env),\n\t\t\t\t\t\tbaseUrl: configuration.models ? undefined : configuration.baseUrl,\n\t\t\t\t\t})\n\t\t\t\t: createOpenAIProvider({\n\t\t\t\t\t\tenv:\n\t\t\t\t\t\t\tconfiguration.id === \"openai\"\n\t\t\t\t\t\t\t\t? env\n\t\t\t\t\t\t\t\t: Object.fromEntries(\n\t\t\t\t\t\t\t\t\t\tObject.entries(env).filter(([name]) => name !== \"OPENAI_API_KEY\" && name !== \"OPENAI_BASE_URL\"),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\tmodels: configuration.models,\n\t\t\t\t\t\tapiKey: resolveConfigValue(configuration.apiKey, env),\n\t\t\t\t\t\tbaseUrl: configuration.models ? undefined : configuration.baseUrl,\n\t\t\t\t\t\tproviderId: configuration.id,\n\t\t\t\t\t\tname: configuration.name,\n\t\t\t\t\t});\n\tconst model = selectProviderModel(provider, configuration.id, env);\n\treturn { provider, model };\n}\n\nexport function resolveStartupRuntime(\n\tenv: Environment,\n\tproviders: readonly StartupProviderConfiguration[],\n): StartupRuntime {\n\tconst selectedProviderId = env.DI_CODE_PROVIDER?.trim() || (providers.length === 1 ? providers[0]?.id : undefined);\n\tif (selectedProviderId === \"faux\") return createFauxRuntime();\n\tif (!selectedProviderId) {\n\t\tif (providers.length === 0) {\n\t\t\tthrow new Error(\"Provider is not configured. Set DI_CODE_PROVIDER or start interactive mode in a TTY.\");\n\t\t}\n\t\tthrow new Error(\"DI_CODE_PROVIDER is required when more than one provider is configured.\");\n\t}\n\tconst selectedProvider = providers.find((provider) => provider.id === selectedProviderId);\n\tif (selectedProvider) return createConfiguredRuntime(env, selectedProvider);\n\tconst builtInRuntime = createBuiltInRuntime(env, selectedProviderId);\n\tif (builtInRuntime) return builtInRuntime;\n\tthrow new Error(\n\t\t`Unknown configured provider \"${selectedProviderId}\". Available providers: ${providers.map((provider) => provider.id).join(\", \")}.`,\n\t);\n}\n\nexport async function loadStartupConfiguration(\n\tcwd: string,\n\tenvironment: Environment = process.env,\n): Promise<StartupConfiguration> {\n\tlet settings: SettingsFile;\n\ttry {\n\t\tconst source = await readFile(join(cwd, SETTINGS_PATH), \"utf8\");\n\t\tif (source.trim().length === 0) return { environment, providers: [] };\n\t\tsettings = parseSettings(JSON.parse(source));\n\t} catch (cause) {\n\t\tif (cause instanceof Error && \"code\" in cause && cause.code === \"ENOENT\") {\n\t\t\treturn { environment, providers: [] };\n\t\t}\n\t\tif (cause instanceof SyntaxError) throw new Error(`${SETTINGS_PATH}: invalid JSON`, { cause });\n\t\tthrow cause;\n\t}\n\n\tconst providers = Object.entries(settings.providers).map(([id, provider]) => ({\n\t\tid: requiredString(id, `providers.${id}`),\n\t\tname: provider.name,\n\t\tapi: provider.api,\n\t\tapiKey: provider.apiKey,\n\t\tbaseUrl: provider.baseUrl,\n\t\tmodels: parseModels(provider.models, `providers.${id}.models`, id, provider.api, provider.baseUrl),\n\t}));\n\treturn { environment, providers };\n}\n\nexport async function loadStartupEnvironment(\n\tcwd: string,\n\tenvironment: Environment = process.env,\n): Promise<Environment> {\n\treturn (await loadStartupConfiguration(cwd, environment)).environment;\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,17 @@
1
1
  {
2
2
  "name": "@di-code/coding-agent",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Coding agent product layer for di-code",
5
+ "keywords": [
6
+ "ai-coding-agent",
7
+ "coding-agent",
8
+ "cli",
9
+ "developer-tools",
10
+ "openai",
11
+ "deepseek",
12
+ "jsonl",
13
+ "rpc"
14
+ ],
5
15
  "private": false,
6
16
  "type": "module",
7
17
  "main": "./dist/index.js",
@@ -24,6 +34,15 @@
24
34
  "dist"
25
35
  ],
26
36
  "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/qddidi/di-code.git",
40
+ "directory": "packages/coding-agent"
41
+ },
42
+ "bugs": {
43
+ "url": "https://github.com/qddidi/di-code/issues"
44
+ },
45
+ "homepage": "https://github.com/qddidi/di-code#readme",
27
46
  "publishConfig": {
28
47
  "access": "public"
29
48
  },
@@ -33,9 +52,10 @@
33
52
  "test": "vitest run --passWithNoTests"
34
53
  },
35
54
  "dependencies": {
36
- "@di-code/agent": "0.1.0",
37
- "@di-code/ai": "0.1.0",
38
- "@di-code/tui": "0.1.0"
55
+ "@di-code/agent": "0.1.2",
56
+ "@di-code/ai": "0.1.2",
57
+ "@di-code/tui": "0.1.2",
58
+ "jiti": "^2.5.1"
39
59
  },
40
60
  "engines": {
41
61
  "node": ">=22.19.0"