@atomic-chat/core 0.20.6 → 0.21.0

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 (226) hide show
  1. package/dist/audio/jobs.js +4 -0
  2. package/dist/audio/jobs.js.map +1 -1
  3. package/dist/audio/service.d.ts +1 -1
  4. package/dist/audio/service.js +3 -1
  5. package/dist/audio/service.js.map +1 -1
  6. package/dist/audio/session.js +28 -16
  7. package/dist/audio/session.js.map +1 -1
  8. package/dist/audio/state.d.ts +3 -1
  9. package/dist/audio/state.js +3 -1
  10. package/dist/audio/state.js.map +1 -1
  11. package/dist/cli/launch.d.ts +23 -3
  12. package/dist/cli/launch.js +59 -8
  13. package/dist/cli/launch.js.map +1 -1
  14. package/dist/cli/main.d.ts +1 -1
  15. package/dist/contracts/events.d.ts +8 -0
  16. package/dist/contracts/settings.d.ts +5 -0
  17. package/dist/contracts/settings.js.map +1 -1
  18. package/dist/core/atomic-core.d.ts +3 -1
  19. package/dist/core/atomic-core.js +4 -1
  20. package/dist/core/atomic-core.js.map +1 -1
  21. package/dist/core/create.js +4 -1
  22. package/dist/core/create.js.map +1 -1
  23. package/dist/core/sessions.js +1 -0
  24. package/dist/core/sessions.js.map +1 -1
  25. package/dist/integrations/catalog.d.ts +25 -8
  26. package/dist/integrations/catalog.js +105 -38
  27. package/dist/integrations/catalog.js.map +1 -1
  28. package/dist/integrations/configure/atomic-agent.d.ts +9 -1
  29. package/dist/integrations/configure/atomic-agent.js +42 -3
  30. package/dist/integrations/configure/atomic-agent.js.map +1 -1
  31. package/dist/integrations/configure/backup.d.ts +21 -0
  32. package/dist/integrations/configure/backup.js +52 -0
  33. package/dist/integrations/configure/backup.js.map +1 -0
  34. package/dist/integrations/configure/claude-code.d.ts +11 -4
  35. package/dist/integrations/configure/claude-code.js +73 -24
  36. package/dist/integrations/configure/claude-code.js.map +1 -1
  37. package/dist/integrations/configure/cline.d.ts +14 -4
  38. package/dist/integrations/configure/cline.js +78 -6
  39. package/dist/integrations/configure/cline.js.map +1 -1
  40. package/dist/integrations/configure/codex.d.ts +5 -3
  41. package/dist/integrations/configure/codex.js +12 -5
  42. package/dist/integrations/configure/codex.js.map +1 -1
  43. package/dist/integrations/configure/copilot.d.ts +28 -5
  44. package/dist/integrations/configure/copilot.js +124 -8
  45. package/dist/integrations/configure/copilot.js.map +1 -1
  46. package/dist/integrations/configure/droid.d.ts +13 -7
  47. package/dist/integrations/configure/droid.js +48 -17
  48. package/dist/integrations/configure/droid.js.map +1 -1
  49. package/dist/integrations/configure/dsh.d.ts +36 -20
  50. package/dist/integrations/configure/dsh.js +250 -48
  51. package/dist/integrations/configure/dsh.js.map +1 -1
  52. package/dist/integrations/configure/goose.d.ts +21 -7
  53. package/dist/integrations/configure/goose.js +141 -10
  54. package/dist/integrations/configure/goose.js.map +1 -1
  55. package/dist/integrations/configure/hermes.d.ts +63 -10
  56. package/dist/integrations/configure/hermes.js +360 -75
  57. package/dist/integrations/configure/hermes.js.map +1 -1
  58. package/dist/integrations/configure/json-backup.d.ts +73 -0
  59. package/dist/integrations/configure/json-backup.js +292 -0
  60. package/dist/integrations/configure/json-backup.js.map +1 -0
  61. package/dist/integrations/configure/json-key-backup.d.ts +43 -0
  62. package/dist/integrations/configure/json-key-backup.js +113 -0
  63. package/dist/integrations/configure/json-key-backup.js.map +1 -0
  64. package/dist/integrations/configure/kilo.d.ts +4 -4
  65. package/dist/integrations/configure/kilo.js +6 -9
  66. package/dist/integrations/configure/kilo.js.map +1 -1
  67. package/dist/integrations/configure/legacy-env-block.d.ts +18 -0
  68. package/dist/integrations/configure/legacy-env-block.js +47 -0
  69. package/dist/integrations/configure/legacy-env-block.js.map +1 -0
  70. package/dist/integrations/configure/mimo.d.ts +3 -2
  71. package/dist/integrations/configure/mimo.js +8 -9
  72. package/dist/integrations/configure/mimo.js.map +1 -1
  73. package/dist/integrations/configure/muse.d.ts +3 -3
  74. package/dist/integrations/configure/muse.js +5 -6
  75. package/dist/integrations/configure/muse.js.map +1 -1
  76. package/dist/integrations/configure/openclaude.d.ts +22 -7
  77. package/dist/integrations/configure/openclaude.js +132 -39
  78. package/dist/integrations/configure/openclaude.js.map +1 -1
  79. package/dist/integrations/configure/openclaw.d.ts +19 -5
  80. package/dist/integrations/configure/openclaw.js +79 -23
  81. package/dist/integrations/configure/openclaw.js.map +1 -1
  82. package/dist/integrations/configure/opencode-style.d.ts +53 -11
  83. package/dist/integrations/configure/opencode-style.js +218 -23
  84. package/dist/integrations/configure/opencode-style.js.map +1 -1
  85. package/dist/integrations/configure/opencode.d.ts +5 -4
  86. package/dist/integrations/configure/opencode.js +8 -10
  87. package/dist/integrations/configure/opencode.js.map +1 -1
  88. package/dist/integrations/configure/openhands.d.ts +5 -4
  89. package/dist/integrations/configure/openhands.js +7 -7
  90. package/dist/integrations/configure/openhands.js.map +1 -1
  91. package/dist/integrations/configure/pi.d.ts +6 -5
  92. package/dist/integrations/configure/pi.js +79 -30
  93. package/dist/integrations/configure/pi.js.map +1 -1
  94. package/dist/integrations/configure/poolside.d.ts +5 -4
  95. package/dist/integrations/configure/poolside.js +7 -7
  96. package/dist/integrations/configure/poolside.js.map +1 -1
  97. package/dist/integrations/configure/registry.d.ts +6 -0
  98. package/dist/integrations/configure/registry.js +1 -0
  99. package/dist/integrations/configure/registry.js.map +1 -1
  100. package/dist/integrations/configure/zcode.d.ts +6 -7
  101. package/dist/integrations/configure/zcode.js +26 -11
  102. package/dist/integrations/configure/zcode.js.map +1 -1
  103. package/dist/integrations/configure/zed.d.ts +16 -4
  104. package/dist/integrations/configure/zed.js +61 -13
  105. package/dist/integrations/configure/zed.js.map +1 -1
  106. package/dist/models/gguf/kv-cache.d.ts +20 -1
  107. package/dist/models/gguf/kv-cache.js +97 -7
  108. package/dist/models/gguf/kv-cache.js.map +1 -1
  109. package/dist/models/gguf/reader.d.ts +5 -3
  110. package/dist/models/gguf/reader.js +10 -6
  111. package/dist/models/gguf/reader.js.map +1 -1
  112. package/dist/runtime/llamacpp/args.d.ts +14 -0
  113. package/dist/runtime/llamacpp/args.js +48 -4
  114. package/dist/runtime/llamacpp/args.js.map +1 -1
  115. package/dist/runtime/llamacpp/ctx-ladder.d.ts +6 -3
  116. package/dist/runtime/llamacpp/ctx-ladder.js +6 -3
  117. package/dist/runtime/llamacpp/ctx-ladder.js.map +1 -1
  118. package/dist/runtime/llamacpp/fit-margin.d.ts +24 -0
  119. package/dist/runtime/llamacpp/fit-margin.js +31 -0
  120. package/dist/runtime/llamacpp/fit-margin.js.map +1 -1
  121. package/dist/runtime/llamacpp/generation-limits.d.ts +45 -0
  122. package/dist/runtime/llamacpp/generation-limits.js +61 -0
  123. package/dist/runtime/llamacpp/generation-limits.js.map +1 -0
  124. package/dist/runtime/llamacpp/load-plan.d.ts +14 -2
  125. package/dist/runtime/llamacpp/load-plan.js +64 -13
  126. package/dist/runtime/llamacpp/load-plan.js.map +1 -1
  127. package/dist/runtime/llamacpp/runtime.d.ts +1 -0
  128. package/dist/runtime/llamacpp/runtime.js +2 -0
  129. package/dist/runtime/llamacpp/runtime.js.map +1 -1
  130. package/dist/runtime/managed-engines/runtime.js +13 -2
  131. package/dist/runtime/managed-engines/runtime.js.map +1 -1
  132. package/dist/runtime/managed-engines/spec.d.ts +6 -0
  133. package/dist/runtime/managed-engines/spec.js.map +1 -1
  134. package/dist/runtime/managed-models/auto-limits.d.ts +47 -0
  135. package/dist/runtime/managed-models/auto-limits.js +60 -0
  136. package/dist/runtime/managed-models/auto-limits.js.map +1 -0
  137. package/dist/runtime/managed-models/index.d.ts +1 -0
  138. package/dist/runtime/managed-models/index.js +1 -0
  139. package/dist/runtime/managed-models/index.js.map +1 -1
  140. package/dist/runtime/mlx/config.d.ts +9 -5
  141. package/dist/runtime/mlx/config.js +12 -6
  142. package/dist/runtime/mlx/config.js.map +1 -1
  143. package/dist/runtime/mlx/model-files.d.ts +9 -0
  144. package/dist/runtime/mlx/model-files.js +26 -0
  145. package/dist/runtime/mlx/model-files.js.map +1 -1
  146. package/dist/runtime/mlx/runtime.d.ts +7 -0
  147. package/dist/runtime/mlx/runtime.js +24 -2
  148. package/dist/runtime/mlx/runtime.js.map +1 -1
  149. package/dist/runtime/sglang/adapter.d.ts +4 -0
  150. package/dist/runtime/sglang/adapter.js +9 -6
  151. package/dist/runtime/sglang/adapter.js.map +1 -1
  152. package/dist/runtime/sglang/engine.js +2 -1
  153. package/dist/runtime/sglang/engine.js.map +1 -1
  154. package/dist/runtime/sglang/memory.d.ts +11 -1
  155. package/dist/runtime/sglang/memory.js +34 -3
  156. package/dist/runtime/sglang/memory.js.map +1 -1
  157. package/dist/runtime/sglang/settings.d.ts +2 -1
  158. package/dist/runtime/sglang/settings.js +11 -7
  159. package/dist/runtime/sglang/settings.js.map +1 -1
  160. package/dist/runtime/vllm/adapter.d.ts +4 -0
  161. package/dist/runtime/vllm/adapter.js +9 -6
  162. package/dist/runtime/vllm/adapter.js.map +1 -1
  163. package/dist/runtime/vllm/engine.js +1 -0
  164. package/dist/runtime/vllm/engine.js.map +1 -1
  165. package/dist/runtime/vllm/memory.d.ts +12 -1
  166. package/dist/runtime/vllm/memory.js +44 -2
  167. package/dist/runtime/vllm/memory.js.map +1 -1
  168. package/dist/runtime/vllm/settings.d.ts +2 -1
  169. package/dist/runtime/vllm/settings.js +12 -7
  170. package/dist/runtime/vllm/settings.js.map +1 -1
  171. package/dist/server/public/context-window.d.ts +29 -0
  172. package/dist/server/public/context-window.js +77 -0
  173. package/dist/server/public/context-window.js.map +1 -0
  174. package/dist/server/public/decision-preview.js +1 -0
  175. package/dist/server/public/decision-preview.js.map +1 -1
  176. package/dist/server/public/errors.d.ts +15 -4
  177. package/dist/server/public/errors.js +53 -7
  178. package/dist/server/public/errors.js.map +1 -1
  179. package/dist/server/public/forward.js +65 -5
  180. package/dist/server/public/forward.js.map +1 -1
  181. package/dist/server/public/index.d.ts +1 -0
  182. package/dist/server/public/index.js +1 -0
  183. package/dist/server/public/index.js.map +1 -1
  184. package/dist/server/public/listing.d.ts +9 -2
  185. package/dist/server/public/listing.js +30 -9
  186. package/dist/server/public/listing.js.map +1 -1
  187. package/dist/server/public/responses.js +9 -5
  188. package/dist/server/public/responses.js.map +1 -1
  189. package/dist/server/public/system-messages.d.ts +39 -0
  190. package/dist/server/public/system-messages.js +166 -0
  191. package/dist/server/public/system-messages.js.map +1 -0
  192. package/dist/server/public/telemetry.d.ts +9 -0
  193. package/dist/server/public/telemetry.js +42 -6
  194. package/dist/server/public/telemetry.js.map +1 -1
  195. package/dist/server/public/thinking.d.ts +26 -0
  196. package/dist/server/public/thinking.js +62 -0
  197. package/dist/server/public/thinking.js.map +1 -0
  198. package/dist/server/public/trace.d.ts +8 -0
  199. package/dist/server/public/trace.js +17 -0
  200. package/dist/server/public/trace.js.map +1 -1
  201. package/dist/server/public/types.d.ts +8 -0
  202. package/dist/server/shims/index.d.ts +1 -0
  203. package/dist/server/shims/index.js +1 -0
  204. package/dist/server/shims/index.js.map +1 -1
  205. package/dist/server/shims/reminders.d.ts +8 -0
  206. package/dist/server/shims/reminders.js +14 -0
  207. package/dist/server/shims/reminders.js.map +1 -0
  208. package/dist/server/shims/responses.d.ts +33 -9
  209. package/dist/server/shims/responses.js +160 -36
  210. package/dist/server/shims/responses.js.map +1 -1
  211. package/dist/settings/default-migrations.d.ts +34 -0
  212. package/dist/settings/default-migrations.js +47 -0
  213. package/dist/settings/default-migrations.js.map +1 -0
  214. package/dist/settings/schema/atomic-prism.json +23 -9
  215. package/dist/settings/schema/llamacpp-upstream.json +23 -9
  216. package/dist/settings/schema/llamacpp.json +23 -9
  217. package/dist/settings/schema/sglang.json +8 -8
  218. package/dist/settings/schema/vllm.json +8 -8
  219. package/dist/settings/schema.js +1 -0
  220. package/dist/settings/schema.js.map +1 -1
  221. package/dist/settings/store.d.ts +6 -0
  222. package/dist/settings/store.js +18 -1
  223. package/dist/settings/store.js.map +1 -1
  224. package/dist/version.d.ts +1 -1
  225. package/dist/version.js +1 -1
  226. package/package.json +1 -1
@@ -192,7 +192,7 @@ export const AGENTS = [
192
192
  detectBin: 'goose',
193
193
  aliases: [],
194
194
  requiresModel: true,
195
- // Goose appends its own path via OPENAI_BASE_PATH.
195
+ // Handed the bare host like Claude Code; `childEnv` adds the server's prefix to OPENAI_BASE_URL.
196
196
  endpointWithPrefix: false,
197
197
  docsUrl: 'https://block.github.io/goose/',
198
198
  // A bare `goose` only prints help.
@@ -263,6 +263,9 @@ export function apiUrlFor(agent, baseUrl, prefix) {
263
263
  export const CONFLICTING_PROVIDER_ENV = [
264
264
  'OPENAI_API_KEY',
265
265
  'OPENAI_BASE_URL',
266
+ // Goose reads an OPENAI_HOST from the environment before OPENAI_BASE_URL, and its base path with it.
267
+ 'OPENAI_HOST',
268
+ 'OPENAI_BASE_PATH',
266
269
  'ANTHROPIC_API_KEY',
267
270
  'ANTHROPIC_AUTH_TOKEN',
268
271
  'ANTHROPIC_OAUTH_TOKEN',
@@ -273,32 +276,37 @@ export const CONFLICTING_PROVIDER_ENV = [
273
276
  'OPENROUTER_API_KEY',
274
277
  ];
275
278
  /**
276
- * Environment the spawned agent needs on top of its config file. Five agents are configured purely
277
- * through environment variables that `configure_*` persists to the user's shell rc — that file is
278
- * not live in a process we are about to spawn, so the same variables are set on the child. Codex's
279
- * profile names the variable its key is read from (`env_key`) but never holds the key, so the key
280
- * goes on the child — only when there is one, as the profile names the variable only then.
279
+ * Environment the spawned agent needs on top of its config file. Six agents are configured purely
280
+ * through environment variables, only ever on the process we start and never for the user: Goose,
281
+ * OpenHands, Poolside, Muse Code, Copilot (selecting its providers.json entry) and Codex. Codex's
282
+ * profile names the variable its key is read from (`env_key`) but never holds the key, so the key goes
283
+ * on the child — only when there is one, as the profile names the variable only then.
284
+ * `options.contextLength`, the served window when known, tells Goose and Poolside when to compact.
281
285
  */
282
- export function childEnv(agent, apiUrl, model, apiKey) {
286
+ export function childEnv(agent, apiUrl, model, apiKey, options = {}) {
283
287
  const key = apiKey || 'atomic';
284
288
  switch (agent.id) {
285
289
  case 'copilot':
286
- return {
287
- COPILOT_PROVIDER_BASE_URL: apiUrl,
288
- COPILOT_PROVIDER_TYPE: 'openai',
289
- COPILOT_MODEL: model,
290
- COPILOT_OFFLINE: 'true',
291
- // Copilot is the one that omits the key entirely when there is none.
292
- ...(apiKey ? { COPILOT_PROVIDER_API_KEY: apiKey } : {}),
293
- };
294
- case 'goose':
290
+ // The endpoint, key and limits are our entry in Copilot's providers.json
291
+ // (`configure/copilot.ts`); this selects it for the run, as `--model` would.
292
+ return { COPILOT_MODEL: `atomic-chat/${model}` };
293
+ case 'goose': {
294
+ // Goose derives its chat path from OPENAI_BASE_URL, prefix included; with the window and output
295
+ // cap it compacts before the server refuses.
296
+ const ctx = options.contextLength !== undefined && options.contextLength > 0 ? options.contextLength : 0;
295
297
  return {
296
298
  GOOSE_PROVIDER: 'openai',
297
299
  GOOSE_MODEL: model,
298
- OPENAI_HOST: apiUrl,
299
- OPENAI_BASE_PATH: 'v1/chat/completions',
300
+ OPENAI_BASE_URL: `${apiUrl}${options.apiPrefix ?? '/v1'}`,
300
301
  OPENAI_API_KEY: key,
302
+ ...(ctx
303
+ ? {
304
+ GOOSE_CONTEXT_LIMIT: String(ctx),
305
+ GOOSE_MAX_TOKENS: String(Math.min(8192, Math.floor(ctx / 4))),
306
+ }
307
+ : {}),
301
308
  };
309
+ }
302
310
  case 'openhands':
303
311
  // The litellm `openai/` prefix is required for a custom OpenAI-compatible base_url.
304
312
  return { LLM_MODEL: `openai/${model}`, LLM_BASE_URL: apiUrl, LLM_API_KEY: key };
@@ -307,6 +315,9 @@ export function childEnv(agent, apiUrl, model, apiKey) {
307
315
  POOLSIDE_STANDALONE_BASE_URL: poolsideStandaloneBaseUrl(apiUrl),
308
316
  POOLSIDE_API_KEY: key,
309
317
  POOLSIDE_STANDALONE_MODEL: model,
318
+ ...(options.contextLength && options.contextLength > 0
319
+ ? { POOLSIDE_STANDALONE_CONTEXT_LENGTH: String(options.contextLength) }
320
+ : {}),
310
321
  };
311
322
  case 'muse':
312
323
  return { META_API_KEY: key };
@@ -316,17 +327,26 @@ export function childEnv(agent, apiUrl, model, apiKey) {
316
327
  return {};
317
328
  }
318
329
  }
319
- /** Poolside wants the root without `/v1`; it appends its own paths. */
330
+ /**
331
+ * The arguments that start `agent` on `model`: its fixed `runArgs`, plus `--model atomic/<id>` for
332
+ * Kilo, which otherwise opens on the model it last used before the one its config selects.
333
+ */
334
+ export function runArgsFor(agent, model) {
335
+ return agent.id === 'kilo' && model ? ['--model', `atomic/${model}`, ...agent.runArgs] : [...agent.runArgs];
336
+ }
337
+ /**
338
+ * Poolside's docs give the standalone base URL with its API prefix (`/v1`), so it is kept; only
339
+ * surrounding whitespace and trailing slashes go.
340
+ */
320
341
  export function poolsideStandaloneBaseUrl(apiUrl) {
321
- const trimmed = apiUrl.trim().replace(/\/+$/, '');
322
- const withoutV1 = trimmed.endsWith('/v1') ? trimmed.slice(0, -'/v1'.length) : trimmed;
323
- return withoutV1.replace(/\/+$/, '');
342
+ return apiUrl.trim().replace(/\/+$/, '');
324
343
  }
325
344
  /**
326
345
  * Launchers that installers drop outside PATH. OpenClaw's installer writes into `~/.openclaw/bin`
327
346
  * or `~/.local/bin` (or `$OPENCLAW_PREFIX`), which a login shell may not have on PATH yet. ZCode is a
328
347
  * desktop app that puts nothing on PATH outside Linux, so its candidates are the executables its
329
- * installers write. Every other agent installs onto PATH, and guessing would only produce false
348
+ * installers write. Zed's DMG links no `zed` CLI, and its install script's `~/.local/bin` is often
349
+ * not on PATH. Every other agent installs onto PATH, and guessing would only produce false
330
350
  * positives.
331
351
  */
332
352
  export function offPathCandidates(bin, home, env = process.env, platform = process.platform) {
@@ -334,6 +354,8 @@ export function offPathCandidates(bin, home, env = process.env, platform = proce
334
354
  const join = (...parts) => parts.map((p) => p.replace(/[\\/]+$/, '')).join(separator);
335
355
  if (bin === 'zcode')
336
356
  return zcodeAppCandidates(home, env, platform, join);
357
+ if (bin === 'zed')
358
+ return zedLauncherCandidates(home, env, platform, join);
337
359
  if (bin !== 'openclaw' || !home)
338
360
  return [];
339
361
  const roots = [];
@@ -349,32 +371,77 @@ export function offPathCandidates(bin, home, env = process.env, platform = proce
349
371
  out.push(join(root, 'bin', name));
350
372
  return out;
351
373
  }
374
+ /** ZCode's two builds: product name and Linux executable. */
375
+ const ZCODE_FLAVORS = [
376
+ ['ZCode', 'zcode'],
377
+ ['ZCode Preview', 'zcode-preview'],
378
+ ];
352
379
  /**
353
- * Where each ZCode installer puts the desktop app's executable (`zcode_app_candidates` in the app's
354
- * `core/system/commands.rs`, commit `ec1fd3ea7`). The Linux deb/rpm packages also link
355
- * `/usr/bin/zcode`, which the PATH probe finds first.
380
+ * Where each ZCode installer puts the desktop app's executable, the "ZCode Preview" build included
381
+ * (`zcode_app_candidates_for` in the app's `core/system/commands.rs`, which also scans for AppImages
382
+ * and the Windows uninstall list). The Linux deb/rpm packages also link `/usr/bin/zcode`, which the
383
+ * PATH probe finds first.
356
384
  */
357
385
  function zcodeAppCandidates(home, env, platform, join) {
386
+ const out = [];
358
387
  if (platform === 'darwin') {
359
- const out = ['/Applications/ZCode.app/Contents/MacOS/ZCode'];
360
- if (home)
361
- out.push(join(home, 'Applications/ZCode.app/Contents/MacOS/ZCode'));
388
+ const roots = ['/Applications', ...(home ? [join(home, 'Applications')] : [])];
389
+ for (const root of roots)
390
+ for (const [product] of ZCODE_FLAVORS)
391
+ out.push(join(root, `${product}.app/Contents/MacOS/${product}`));
362
392
  return out;
363
393
  }
364
394
  if (platform === 'win32') {
365
395
  // NSIS installs per user under `%LOCALAPPDATA%\Programs` and for all users under `%ProgramFiles%`.
366
- const out = [];
367
- for (const [variable, sub] of [
368
- ['LOCALAPPDATA', 'Programs\\ZCode'],
369
- ['ProgramFiles', 'ZCode'],
370
- ]) {
371
- const root = env[variable];
396
+ const roots = [
397
+ env['LOCALAPPDATA'] ? join(env['LOCALAPPDATA'], 'Programs') : undefined,
398
+ env['ProgramFiles'],
399
+ ];
400
+ for (const root of roots)
372
401
  if (root)
373
- out.push(join(root, sub, 'ZCode.exe'));
374
- }
402
+ for (const [product] of ZCODE_FLAVORS)
403
+ out.push(join(root, product, `${product}.exe`));
375
404
  return out;
376
405
  }
377
- return ['/opt/ZCode/zcode'];
406
+ for (const [product, exe] of ZCODE_FLAVORS) {
407
+ out.push(`/opt/${product}/${exe}`);
408
+ if (exe !== 'zcode')
409
+ out.push(`/usr/bin/${exe}`);
410
+ }
411
+ return out;
412
+ }
413
+ /**
414
+ * Zed's launchers off PATH (`zed_cli_candidates` and `zed_app_candidates` in the app's
415
+ * `core/system/commands.rs`): its CLI, then the editor itself.
416
+ */
417
+ function zedLauncherCandidates(home, env, platform, join) {
418
+ if (!home)
419
+ return [];
420
+ if (platform === 'darwin') {
421
+ const roots = ['/Applications', join(home, 'Applications')];
422
+ return [
423
+ join(home, '.local/bin/zed'),
424
+ ...roots.flatMap((root) => [
425
+ join(root, 'Zed.app/Contents/MacOS/cli'),
426
+ join(root, 'Zed Preview.app/Contents/MacOS/cli'),
427
+ ]),
428
+ ...roots.map((root) => join(root, 'Zed.app/Contents/MacOS/zed')),
429
+ ];
430
+ }
431
+ if (platform === 'win32') {
432
+ // The installer's `{autopf}\Zed`: per user unless run elevated.
433
+ const local = env['LOCALAPPDATA'] || join(home, 'AppData\\Local');
434
+ const dirs = [
435
+ join(local, 'Programs\\Zed'),
436
+ ...(env['ProgramFiles'] ? [join(env['ProgramFiles'], 'Zed')] : []),
437
+ ];
438
+ return [...dirs.map((dir) => join(dir, 'bin\\zed.exe')), ...dirs.map((dir) => join(dir, 'Zed.exe'))];
439
+ }
440
+ return [
441
+ join(home, '.local/bin/zed'),
442
+ join(home, '.local/zed.app/bin/zed'),
443
+ join(home, '.local/zed-preview.app/bin/zed'),
444
+ ];
378
445
  }
379
446
  /**
380
447
  * `launch` runs a bare llama-server, and Muse Code fetches `/muse-code/models` before its first
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/integrations/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/integrations/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2BH,yFAAyF;AACzF,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAA;AAE3C,MAAM,CAAC,MAAM,MAAM,GAAqB;IACtC;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;QACjC,aAAa,EAAE,KAAK;QACpB,qCAAqC;QACrC,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,gDAAgD;QACzD,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,sCAAsC;QAC/C,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,OAAO;QAClB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,iCAAiC;QAC1C,gGAAgG;QAChG,8DAA8D;QAC9D,OAAO,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC;QACrC,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,SAAS,EAAE,YAAY;QACvB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,uCAAuC;QAChD,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,OAAO;QAClB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,kDAAkD;QAC3D,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,iDAAiD;QAC1D,4FAA4F;QAC5F,6CAA6C;QAC7C,OAAO,EAAE,CAAC,KAAK,CAAC;QAChB,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,uCAAuC;QAChD,OAAO,EAAE,EAAE;QACX,wEAAwE;QACxE,OAAO,EAAE,KAAK;KACf;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,OAAO;QACb,oFAAoF;QACpF,6BAA6B;QAC7B,SAAS,EAAE,OAAO;QAClB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,0CAA0C;QACnD,OAAO,EAAE,EAAE;QACX,2EAA2E;QAC3E,OAAO,EAAE,KAAK;KACf;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,mCAAmC;QAC5C,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,OAAO;QAClB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,wDAAwD;QACjE,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,wDAAwD;QACjE,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,WAAW;QACtB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,6DAA6D;QACtE,yDAAyD;QACzD,OAAO,EAAE,CAAC,sBAAsB,CAAC;QACjC,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,8BAA8B;QACvC,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,OAAO;QAClB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,iGAAiG;QACjG,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,gCAAgC;QACzC,mCAAmC;QACnC,OAAO,EAAE,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;QAClC,aAAa,EAAE,IAAI;QACnB,mFAAmF;QACnF,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,mDAAmD;QAC5D,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,cAAc;QACzB,oEAAoE;QACpE,OAAO,EAAE,CAAC,MAAM,CAAC;QACjB,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,8CAA8C;QACvD,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,8CAA8C;QACvD,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;KACpB;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,IAAI;QACnB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,0BAA0B;QACnC,uEAAuE;QACvE,OAAO,EAAE,CAAC,MAAM,CAAC;QACjB,OAAO,EAAE,UAAU;KACpB;CACF,CAAA;AAED,uEAAuE;AACvE,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;AACpG,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,SAAS,CAAC,KAAY,EAAE,OAAe,EAAE,MAAc;IACrE,OAAO,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,gBAAgB;IAChB,iBAAiB;IACjB,qGAAqG;IACrG,aAAa;IACb,kBAAkB;IAClB,mBAAmB;IACnB,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,aAAa;IACb,oBAAoB;CACrB,CAAA;AAUD;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAY,EACZ,MAAc,EACd,KAAa,EACb,MAAc,EACd,UAA2B,EAAE;IAE7B,MAAM,GAAG,GAAG,MAAM,IAAI,QAAQ,CAAA;IAC9B,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,yEAAyE;YACzE,6EAA6E;YAC7E,OAAO,EAAE,aAAa,EAAE,eAAe,KAAK,EAAE,EAAE,CAAA;QAClD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,gGAAgG;YAChG,6CAA6C;YAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;YACxG,OAAO;gBACL,cAAc,EAAE,QAAQ;gBACxB,WAAW,EAAE,KAAK;gBAClB,eAAe,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE;gBACzD,cAAc,EAAE,GAAG;gBACnB,GAAG,CAAC,GAAG;oBACL,CAAC,CAAC;wBACE,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC;wBAChC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;qBAC9D;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAA;QACH,CAAC;QACD,KAAK,WAAW;YACd,oFAAoF;YACpF,OAAO,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAA;QACjF,KAAK,UAAU;YACb,OAAO;gBACL,4BAA4B,EAAE,yBAAyB,CAAC,MAAM,CAAC;gBAC/D,gBAAgB,EAAE,GAAG;gBACrB,yBAAyB,EAAE,KAAK;gBAChC,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC;oBACpD,CAAC,CAAC,EAAE,kCAAkC,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;oBACvE,CAAC,CAAC,EAAE,CAAC;aACR,CAAA;QACH,KAAK,MAAM;YACT,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,CAAA;QAC9B,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACtD;YACE,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAY,EAAE,KAAa;IACpD,OAAO,KAAK,CAAC,EAAE,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;AAC7G,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,IAAwB,EACxB,MAAyB,OAAO,CAAC,GAAG,EACpC,WAA4B,OAAO,CAAC,QAAQ;IAE5C,MAAM,SAAS,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;IACnD,MAAM,IAAI,GAAG,CAAC,GAAG,KAAe,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC/F,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IACzE,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC1E,IAAI,GAAG,KAAK,UAAU,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAA;IACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACzD,oEAAoE;IACpE,MAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;IAChG,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IACrF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,6DAA6D;AAC7D,MAAM,aAAa,GAAG;IACpB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,eAAe,EAAE,eAAe,CAAC;CAC1B,CAAA;AAEV;;;;;GAKG;AACH,SAAS,kBAAkB,CACzB,IAAwB,EACxB,GAAsB,EACtB,QAAyB,EACzB,IAAoC;IAEpC,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9E,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,aAAa;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAA;QACzG,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,mGAAmG;QACnG,MAAM,KAAK,GAAG;YACZ,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;YACvE,GAAG,CAAC,cAAc,CAAC;SACpB,CAAA;QACD,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,IAAI;gBAAE,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,aAAa;oBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC,CAAA;QAClG,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,aAAa,EAAE,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,QAAQ,OAAO,IAAI,GAAG,EAAE,CAAC,CAAA;QAClC,IAAI,GAAG,KAAK,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAC5B,IAAwB,EACxB,GAAsB,EACtB,QAAyB,EACzB,IAAoC;IAEpC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IACpB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAA;QAC3D,OAAO;YACL,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC;YAC5B,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,EAAE,4BAA4B,CAAC;gBACxC,IAAI,CAAC,IAAI,EAAE,oCAAoC,CAAC;aACjD,CAAC;YACF,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;SACjE,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,gEAAgE;QAChE,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;QACjE,MAAM,IAAI,GAAG;YACX,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC;YAC5B,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAA;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IACtG,CAAC;IACD,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,gCAAgC,CAAC;KAC7C,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,sEAAsE;IACtE,yEAAyE;IACzE,oCAAoC;IACpC,EAAE;IACF,qEAAqE;CACtE,CAAA"}
@@ -14,6 +14,12 @@
14
14
  * - `activeEmbeddingProvider` is repaired only when it is missing or dangling, and always to
15
15
  * `local-llama`. Repairing it to US would quietly hand memory recall to Atomic Chat, which is not
16
16
  * what Run asked for.
17
+ *
18
+ * With no `llm.fallback` block the agent appends `local-llama` to every chain, so a failure of ours
19
+ * (a 404 included) is retried on :8080 and reported as "The local model isn't running": Connect
20
+ * writes `appendLocal: false` there. What the `llm` keys held before is recorded in
21
+ * `config.json.atomic-chat-backup.json` for the app's Disconnect. Mirrors `configure_atomic_agent_at`
22
+ * in the app's `core/system/commands.rs`, byte for byte.
17
23
  */
18
24
  import type { JsonValue } from '../config-io.js';
19
25
  import type { JsonObject } from './json-tree.js';
@@ -29,5 +35,7 @@ export declare function atomicAgentEmbeddingBaseUrl(root: JsonObject, chatUrl: s
29
35
  /** The `llama-server` entry Atomic Agent would synthesise for itself, from the same inputs. */
30
36
  export declare function atomicAgentLocalLlamaEntry(root: JsonObject): JsonObject;
31
37
  /** The whole merge, with no I/O, so the rules above are testable without a state directory. */
32
- export declare function atomicAgentPatchConfig(parsed: JsonValue, apiUrl: string, model: string, apiKey: string): JsonObject;
38
+ export declare function atomicAgentPatchConfig(parsed: JsonValue, apiUrl: string, model: string, apiKey: string, contextLength?: number): JsonObject;
39
+ /** The `llm` keys Connect may overwrite besides our provider entry. */
40
+ export declare const ATOMIC_AGENT_TRACKED_PATHS: string[][];
33
41
  export declare const configureAtomicAgent: ConfigureWriter;
@@ -14,9 +14,16 @@
14
14
  * - `activeEmbeddingProvider` is repaired only when it is missing or dangling, and always to
15
15
  * `local-llama`. Repairing it to US would quietly hand memory recall to Atomic Chat, which is not
16
16
  * what Run asked for.
17
+ *
18
+ * With no `llm.fallback` block the agent appends `local-llama` to every chain, so a failure of ours
19
+ * (a 404 included) is retried on :8080 and reported as "The local model isn't running": Connect
20
+ * writes `appendLocal: false` there. What the `llm` keys held before is recorded in
21
+ * `config.json.atomic-chat-backup.json` for the app's Disconnect. Mirrors `configure_atomic_agent_at`
22
+ * in the app's `core/system/commands.rs`, byte for byte.
17
23
  */
18
24
  import { AtomicCoreError } from '../../contracts/index.js';
19
25
  import { canonicalJson, parseJsonStrict } from '../config-io.js';
26
+ import { getAt, readBackup, renderBackup, trackKeys, writeBackupText } from './json-key-backup.js';
20
27
  import { asJsonArray, asJsonObject } from './json-tree.js';
21
28
  import { registerWriter } from './registry.js';
22
29
  const PROVIDER_ID = 'atomic-chat';
@@ -68,7 +75,7 @@ function lists(providers, id) {
68
75
  return providers.some((p) => asJsonObject(p)?.['id'] === id);
69
76
  }
70
77
  /** The whole merge, with no I/O, so the rules above are testable without a state directory. */
71
- export function atomicAgentPatchConfig(parsed, apiUrl, model, apiKey) {
78
+ export function atomicAgentPatchConfig(parsed, apiUrl, model, apiKey, contextLength) {
72
79
  // The agent's `parseOptionalString` rejects `""` outright rather than treating it as absent, so an
73
80
  // empty model would take the whole file down at its next start. Fail before touching anything.
74
81
  if (model.trim() === '') {
@@ -102,6 +109,11 @@ export function atomicAgentPatchConfig(parsed, apiUrl, model, apiKey) {
102
109
  supportsTools: true,
103
110
  requestTimeoutMs: timeout,
104
111
  };
112
+ // `userModels` outranks the bundled catalog in the agent's `resolveModel`; without it a local model
113
+ // is assumed to hold 128K and is never compacted before the server refuses.
114
+ if (contextLength !== undefined) {
115
+ entry['userModels'] = [{ id: model.trim(), kind: 'chat', contextWindow: contextLength }];
116
+ }
105
117
  if (existing >= 0)
106
118
  providers[existing] = entry;
107
119
  else
@@ -114,14 +126,41 @@ export function atomicAgentPatchConfig(parsed, apiUrl, model, apiKey) {
114
126
  llm['activeTextProvider'] = PROVIDER_ID;
115
127
  if (repair)
116
128
  llm['activeEmbeddingProvider'] = LOCAL_PROVIDER_ID;
129
+ // A chain the user configured is theirs.
130
+ if (llm['fallback'] === undefined || llm['fallback'] === null)
131
+ llm['fallback'] = { appendLocal: false };
117
132
  return root;
118
133
  }
119
- export const configureAtomicAgent = async ({ apiUrl, model, apiKey, fs, env }) => {
134
+ /** The `llm` keys Connect may overwrite besides our provider entry. */
135
+ export const ATOMIC_AGENT_TRACKED_PATHS = [
136
+ ['llm', 'activeTextProvider'],
137
+ ['llm', 'activeEmbeddingProvider'],
138
+ ['llm', 'fallback'],
139
+ ];
140
+ export const configureAtomicAgent = async ({ apiUrl, model, apiKey, fs, env, contextLength, }) => {
120
141
  const override = env['ATOMIC_AGENT_STATE_DIR']?.trim();
121
142
  const path = `${override && override !== '' ? override : '.atomic-agent'}/config.json`;
122
143
  const text = await fs.read(path);
123
144
  const parsed = text === undefined ? {} : parseJsonStrict(text, fs.absolute(path));
124
- await fs.write(path, canonicalJson(atomicAgentPatchConfig(parsed, apiUrl, model, apiKey)));
145
+ const before = JSON.parse(JSON.stringify(parsed));
146
+ const patched = atomicAgentPatchConfig(parsed, apiUrl, model, apiKey, contextLength);
147
+ // The `local-llama` entry this Connect added, or an earlier one did: Disconnect drops it when
148
+ // nothing else is left.
149
+ const previous = await readBackup(fs, path);
150
+ const listed = (value) => asJsonArray(getAt(value, ['llm', 'providers'])) ?? [];
151
+ const same = (a, b) => canonicalJson(a) === canonicalJson(b);
152
+ const seeded = [...(previous?.seeded ?? [])];
153
+ const original = listed(before);
154
+ for (const entry of listed(patched)) {
155
+ if (asJsonObject(entry)?.['id'] === LOCAL_PROVIDER_ID &&
156
+ !original.some((e) => same(e, entry)) &&
157
+ !seeded.some((e) => same(e, entry))) {
158
+ seeded.push(entry);
159
+ }
160
+ }
161
+ const keys = trackKeys(before, patched, ATOMIC_AGENT_TRACKED_PATHS, previous?.keys ?? []);
162
+ await fs.write(path, canonicalJson(patched));
163
+ await writeBackupText(fs, path, renderBackup({ keys, seeded }));
125
164
  };
126
165
  registerWriter('atomic-agent', configureAtomicAgent);
127
166
  //# sourceMappingURL=atomic-agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"atomic-agent.js","sourceRoot":"","sources":["../../../src/integrations/configure/atomic-agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"atomic-agent.js","sourceRoot":"","sources":["../../../src/integrations/configure/atomic-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The backup sidecar the desktop's Disconnect reads — twin of `agent_files.rs` in the app.
3
+ *
4
+ * `<config file>.atomic-chat-backup.json` records what the keys a writer overwrites held before the
5
+ * first Connect (`previous`) and what the writer put there (`written`). Disconnect restores
6
+ * `previous` only while the file still holds `written`, so a later choice of the user's stands. A
7
+ * `launch` from this CLI writes the same sidecar as the desktop, so either side can undo the other.
8
+ */
9
+ import type { ConfigFs, JsonValue } from '../config-io.js';
10
+ import type { JsonObject } from './json-tree.js';
11
+ export declare function sidecarPath(path: string): string;
12
+ /** The sidecar of `path`, when there is one; one that does not parse only narrows what is restored. */
13
+ export declare function readSidecar(fs: ConfigFs, path: string): Promise<JsonObject | undefined>;
14
+ /** Owner-only off Windows: the previous values can include another provider's key. */
15
+ export declare function writeSidecar(fs: ConfigFs, path: string, backup: JsonValue, platform: NodeJS.Platform): Promise<void>;
16
+ /** The window to write, or `undefined` when it is not known. */
17
+ export declare function knownWindow(contextLength: number | undefined): number | undefined;
18
+ /** The reply cap written beside a known window: a quarter of it, and never more than 8192. */
19
+ export declare function outputCap(contextLength: number): number;
20
+ /** Deep equality of two JSON values, key order aside. */
21
+ export declare function sameJson(a: JsonValue | undefined, b: JsonValue | undefined): boolean;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The backup sidecar the desktop's Disconnect reads — twin of `agent_files.rs` in the app.
3
+ *
4
+ * `<config file>.atomic-chat-backup.json` records what the keys a writer overwrites held before the
5
+ * first Connect (`previous`) and what the writer put there (`written`). Disconnect restores
6
+ * `previous` only while the file still holds `written`, so a later choice of the user's stands. A
7
+ * `launch` from this CLI writes the same sidecar as the desktop, so either side can undo the other.
8
+ */
9
+ import { canonicalJson } from '../config-io.js';
10
+ import { asJsonObject } from './json-tree.js';
11
+ export function sidecarPath(path) {
12
+ return `${path}.atomic-chat-backup.json`;
13
+ }
14
+ /** The sidecar of `path`, when there is one; one that does not parse only narrows what is restored. */
15
+ export async function readSidecar(fs, path) {
16
+ const text = await fs.read(sidecarPath(path));
17
+ if (text === undefined)
18
+ return undefined;
19
+ try {
20
+ return asJsonObject(JSON.parse(text));
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ }
26
+ /** Owner-only off Windows: the previous values can include another provider's key. */
27
+ export async function writeSidecar(fs, path, backup, platform) {
28
+ await fs.write(sidecarPath(path), canonicalJson(backup), platform === 'win32' ? {} : { mode: 0o600 });
29
+ }
30
+ /** The window to write, or `undefined` when it is not known. */
31
+ export function knownWindow(contextLength) {
32
+ return contextLength !== undefined && contextLength > 0 ? contextLength : undefined;
33
+ }
34
+ /** The reply cap written beside a known window: a quarter of it, and never more than 8192. */
35
+ export function outputCap(contextLength) {
36
+ return Math.min(8192, Math.floor(contextLength / 4));
37
+ }
38
+ /** Deep equality of two JSON values, key order aside. */
39
+ export function sameJson(a, b) {
40
+ if (a === b)
41
+ return true;
42
+ if (a === undefined || b === undefined || a === null || b === null)
43
+ return false;
44
+ if (Array.isArray(a) || Array.isArray(b)) {
45
+ return (Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((v, i) => sameJson(v, b[i])));
46
+ }
47
+ if (typeof a !== 'object' || typeof b !== 'object')
48
+ return false;
49
+ const keys = Object.keys(a);
50
+ return (keys.length === Object.keys(b).length && keys.every((k) => Object.hasOwn(b, k) && sameJson(a[k], b[k])));
51
+ }
52
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../src/integrations/configure/backup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,GAAG,IAAI,0BAA0B,CAAA;AAC1C,CAAC;AAED,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAY,EAAE,IAAY;IAC1D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;IAC7C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACxC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC,CAAA;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAY,EACZ,IAAY,EACZ,MAAiB,EACjB,QAAyB;IAEzB,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AACvG,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,WAAW,CAAC,aAAiC;IAC3D,OAAO,aAAa,KAAK,SAAS,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAA;AACrF,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,SAAS,CAAC,aAAqB;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAA;AACtD,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,QAAQ,CAAC,CAAwB,EAAE,CAAwB;IACzE,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACxB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAChF,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,CACL,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACtG,CAAA;IACH,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACxG,CAAA;AACH,CAAC"}
@@ -1,9 +1,14 @@
1
1
  /**
2
- * Claude Code — `~/.claude/settings.json`.
2
+ * Claude Code — `settings.json` in its config directory (`$CLAUDE_CONFIG_DIR`, else `~/.claude`).
3
3
  *
4
- * Port of `configure_claude_code` in `src-tauri/src/core/system/commands.rs`. Claude Code takes its
5
- * endpoint from environment variables that its settings file can carry, so pointing it at a local
6
- * model is an upsert into that file's `env` map plus the top-level `model` setting.
4
+ * Port of `configure_claude_code` / `connect_claude_code` in the app (`src-tauri/src/core/system/
5
+ * claude_config.rs`). Claude Code takes its endpoint from environment variables that its settings
6
+ * file can carry, and that `env` wins over the shell's, so pointing it at a local model is an upsert
7
+ * into that map plus the top-level `model` setting. Alongside the endpoint go empty values for the
8
+ * Bedrock / Vertex / Foundry switches (Claude Code's documented way to unset a shell's), the tab
9
+ * title off (it costs a side request to the model) and, when the served window is known, that window
10
+ * and an output cap so Claude Code compacts before the server refuses. What every key held before is
11
+ * kept in the sidecar `json-backup.ts` describes, for the app's Disconnect.
7
12
  *
8
13
  * Claude Code appends its own `/v1`, so `apiUrl` here is the bare `host:port` (the catalog marks
9
14
  * this agent `endpointWithPrefix: false`).
@@ -13,4 +18,6 @@
13
18
  * ones an earlier run left behind, so a rerun without a model keeps pointing at the last one.
14
19
  */
15
20
  import type { ConfigureInput } from './registry.js';
21
+ /** `settings.json` in `$CLAUDE_CONFIG_DIR` (absolute or `~`-relative), else `.claude/settings.json`. */
22
+ export declare function claudeSettingsPath(input: Pick<ConfigureInput, 'env' | 'fs'>): string;
16
23
  export declare function configureClaudeCode(input: ConfigureInput): Promise<void>;
@@ -1,9 +1,14 @@
1
1
  /**
2
- * Claude Code — `~/.claude/settings.json`.
2
+ * Claude Code — `settings.json` in its config directory (`$CLAUDE_CONFIG_DIR`, else `~/.claude`).
3
3
  *
4
- * Port of `configure_claude_code` in `src-tauri/src/core/system/commands.rs`. Claude Code takes its
5
- * endpoint from environment variables that its settings file can carry, so pointing it at a local
6
- * model is an upsert into that file's `env` map plus the top-level `model` setting.
4
+ * Port of `configure_claude_code` / `connect_claude_code` in the app (`src-tauri/src/core/system/
5
+ * claude_config.rs`). Claude Code takes its endpoint from environment variables that its settings
6
+ * file can carry, and that `env` wins over the shell's, so pointing it at a local model is an upsert
7
+ * into that map plus the top-level `model` setting. Alongside the endpoint go empty values for the
8
+ * Bedrock / Vertex / Foundry switches (Claude Code's documented way to unset a shell's), the tab
9
+ * title off (it costs a side request to the model) and, when the served window is known, that window
10
+ * and an output cap so Claude Code compacts before the server refuses. What every key held before is
11
+ * kept in the sidecar `json-backup.ts` describes, for the app's Disconnect.
7
12
  *
8
13
  * Claude Code appends its own `/v1`, so `apiUrl` here is the bare `host:port` (the catalog marks
9
14
  * this agent `endpointWithPrefix: false`).
@@ -12,34 +17,78 @@
12
17
  * this agent, and the writer then leaves every model key alone — it neither writes them nor removes
13
18
  * ones an earlier run left behind, so a rerun without a model keeps pointing at the last one.
14
19
  */
20
+ import { join } from 'node:path';
15
21
  import { AtomicCoreError } from '../../contracts/index.js';
16
22
  import { canonicalJson, keyOr, parseJsonStrict } from '../config-io.js';
23
+ import { configDirFrom, getAt, isOurServerUrl, ourServerFromUrl, outputCap, readBackup, redo, writeBackup, writeConfigFile, } from './json-backup.js';
17
24
  import { asJsonObject } from './json-tree.js';
18
25
  import { registerWriter } from './registry.js';
19
- const DIR = '.claude';
20
- const PATH = `${DIR}/settings.json`;
21
- export async function configureClaudeCode(input) {
22
- const { fs, apiUrl, model, apiKey } = input;
23
- await fs.mkdirp(DIR);
24
- const text = await fs.read(PATH);
25
- const parsed = text === undefined ? {} : parseJsonStrict(text, fs.absolute(PATH));
26
- const root = asJsonObject(parsed);
27
- if (!root)
28
- throw new AtomicCoreError('IO_ERROR', 'settings.json is not a JSON object');
29
- const env = asJsonObject(root['env']) ?? {};
30
- root['env'] = env;
31
- env['ANTHROPIC_BASE_URL'] = apiUrl;
32
- env['ANTHROPIC_AUTH_TOKEN'] = keyOr(apiKey, 'atomic');
26
+ const MODEL_KEYS = [
27
+ 'ANTHROPIC_MODEL',
28
+ 'ANTHROPIC_DEFAULT_OPUS_MODEL',
29
+ 'ANTHROPIC_DEFAULT_SONNET_MODEL',
30
+ 'ANTHROPIC_DEFAULT_HAIKU_MODEL',
31
+ ];
32
+ /** Provider switches a shell can export that Claude Code would follow instead of our endpoint. */
33
+ const PROVIDER_SWITCHES = [
34
+ 'CLAUDE_CODE_USE_BEDROCK',
35
+ 'CLAUDE_CODE_USE_VERTEX',
36
+ 'CLAUDE_CODE_USE_FOUNDRY',
37
+ ];
38
+ const env = (key) => ['env', key];
39
+ const MODEL_PATHS = [...MODEL_KEYS.map(env), ['model']];
40
+ /** `settings.json` in `$CLAUDE_CONFIG_DIR` (absolute or `~`-relative), else `.claude/settings.json`. */
41
+ export function claudeSettingsPath(input) {
42
+ const dir = configDirFrom(input.env['CLAUDE_CONFIG_DIR'], input.fs.home);
43
+ return dir === undefined ? '.claude/settings.json' : join(dir, 'settings.json');
44
+ }
45
+ function writesFor(input) {
46
+ const { apiUrl, model, apiKey, contextLength } = input;
47
+ const writes = [
48
+ [env('ANTHROPIC_BASE_URL'), apiUrl],
49
+ [env('ANTHROPIC_AUTH_TOKEN'), keyOr(apiKey, 'atomic')],
50
+ ];
51
+ for (const name of PROVIDER_SWITCHES)
52
+ writes.push([env(name), '']);
53
+ writes.push([env('CLAUDE_CODE_DISABLE_TERMINAL_TITLE'), '1']);
54
+ if (contextLength !== undefined && contextLength > 0) {
55
+ writes.push([env('CLAUDE_CODE_MAX_CONTEXT_TOKENS'), String(contextLength)]);
56
+ writes.push([env('CLAUDE_CODE_MAX_OUTPUT_TOKENS'), String(outputCap(contextLength))]);
57
+ }
33
58
  if (model !== '') {
34
59
  // ANTHROPIC_MODEL overrides the `model` setting; the tier aliases make every Opus/Sonnet/Haiku
35
60
  // request route to the single local model too.
36
- env['ANTHROPIC_MODEL'] = model;
37
- env['ANTHROPIC_DEFAULT_OPUS_MODEL'] = model;
38
- env['ANTHROPIC_DEFAULT_SONNET_MODEL'] = model;
39
- env['ANTHROPIC_DEFAULT_HAIKU_MODEL'] = model;
40
- root['model'] = model;
61
+ for (const key of MODEL_KEYS)
62
+ writes.push([env(key), model]);
63
+ writes.push([['model'], model]);
41
64
  }
42
- await fs.write(PATH, canonicalJson(root));
65
+ return writes;
66
+ }
67
+ /** Settings an earlier release wrote without a backup: the endpoint is this server. */
68
+ function forgetLegacy(root, server) {
69
+ const base = getAt(root, env('ANTHROPIC_BASE_URL'));
70
+ if (typeof base !== 'string' || !isOurServerUrl(server, base))
71
+ return;
72
+ const envObject = asJsonObject(root['env']);
73
+ const model = envObject['ANTHROPIC_MODEL'];
74
+ for (const key of ['ANTHROPIC_BASE_URL', 'ANTHROPIC_AUTH_TOKEN', ...MODEL_KEYS])
75
+ delete envObject[key];
76
+ if (model !== undefined && root['model'] === model)
77
+ delete root['model'];
78
+ }
79
+ export async function configureClaudeCode(input) {
80
+ const { fs, apiUrl } = input;
81
+ const path = claudeSettingsPath(input);
82
+ const text = await fs.read(path);
83
+ const parsed = text === undefined ? {} : parseJsonStrict(text, fs.absolute(path));
84
+ const root = asJsonObject(parsed);
85
+ if (!root)
86
+ throw new AtomicCoreError('IO_ERROR', 'settings.json is not a JSON object');
87
+ const server = ourServerFromUrl(apiUrl);
88
+ const backup = redo(root, await readBackup(fs, path), text !== undefined, writesFor(input), MODEL_PATHS, (r) => forgetLegacy(r, server));
89
+ // Sidecar first: a crash between the two leaves a backup whose values simply do not match yet.
90
+ await writeBackup(fs, path, backup);
91
+ await writeConfigFile(fs, path, canonicalJson(root));
43
92
  }
44
93
  registerWriter('claude-code', configureClaudeCode);
45
94
  //# sourceMappingURL=claude-code.js.map