@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
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/integrations/configure/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,GAAG,GAAG,SAAS,CAAA;AACrB,MAAM,IAAI,GAAG,GAAG,GAAG,gBAAgB,CAAA;AAEnC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAqB;IAC7D,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAC3C,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAEpB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IACjF,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACjC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,eAAe,CAAC,UAAU,EAAE,oCAAoC,CAAC,CAAA;IAEtF,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;IAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA;IACjB,GAAG,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAA;IAClC,GAAG,CAAC,sBAAsB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAErD,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACjB,+FAA+F;QAC/F,+CAA+C;QAC/C,GAAG,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAA;QAC9B,GAAG,CAAC,8BAA8B,CAAC,GAAG,KAAK,CAAA;QAC3C,GAAG,CAAC,gCAAgC,CAAC,GAAG,KAAK,CAAA;QAC7C,GAAG,CAAC,+BAA+B,CAAC,GAAG,KAAK,CAAA;QAC5C,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAA;IACvB,CAAC;IAED,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;AAC3C,CAAC;AAED,cAAc,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAA"}
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/integrations/configure/claude-code.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,14 @@
1
1
  /**
2
- * Cline — no config file at all.
2
+ * Cline — configured by its own `cline auth` subcommand.
3
3
  *
4
- * Port of `configure_cline` in `src-tauri/src/core/system/commands.rs`. Cline stores its provider
5
- * settings itself; the supported way in is its own `cline auth` subcommand, so configuring it means
6
- * running a process and reporting what it said. Nothing is written to disk by us.
4
+ * Port of `configure_cline` in `src-tauri/src/core/system/commands.rs` and `cline_config.rs`. The
5
+ * supported way in is `cline auth --provider openai-compatible …`, which saves the provider into
6
+ * Cline's `providers.json` (`<CLINE_DIR>/data/settings/providers.json`) and makes it
7
+ * `lastUsedProvider`, so configuring it means running a process and reporting what it said. It has
8
+ * no flag for the context window, which Cline 3.x reads from the entry's `contextWindow` (and the
9
+ * reply cap from `maxTokens`): both are set on the saved entry afterwards, and removed when the
10
+ * window is unknown. The entry and `lastUsedProvider` from before are kept in the backup sidecar for
11
+ * the desktop's Disconnect, read before `cline auth` rewrites them.
7
12
  *
8
13
  * On Windows the npm-installed `cline` is a batch shim (`cline.cmd`), which `CreateProcessW` refuses
9
14
  * to execute directly, so the call is routed through `cmd /C`.
@@ -25,4 +30,9 @@ export declare function clineAuthCommand(apiUrl: string, model: string, apiKey:
25
30
  * outcomes Cline's caller has to report differently.
26
31
  */
27
32
  export declare function spawnProcess(program: string, args: string[]): Promise<SpawnResult>;
33
+ /**
34
+ * `providers.json` where Cline resolves it: `$CLINE_PROVIDER_SETTINGS_PATH`, else
35
+ * `$CLINE_DATA_DIR/settings`, else `$CLINE_DIR/data/settings`, else `~/.cline/data/settings`.
36
+ */
37
+ export declare function clineProvidersPath(env: NodeJS.ProcessEnv, home: string): string;
28
38
  export declare function configureCline(input: ConfigureInput): Promise<void>;
@@ -1,17 +1,25 @@
1
1
  /**
2
- * Cline — no config file at all.
2
+ * Cline — configured by its own `cline auth` subcommand.
3
3
  *
4
- * Port of `configure_cline` in `src-tauri/src/core/system/commands.rs`. Cline stores its provider
5
- * settings itself; the supported way in is its own `cline auth` subcommand, so configuring it means
6
- * running a process and reporting what it said. Nothing is written to disk by us.
4
+ * Port of `configure_cline` in `src-tauri/src/core/system/commands.rs` and `cline_config.rs`. The
5
+ * supported way in is `cline auth --provider openai-compatible …`, which saves the provider into
6
+ * Cline's `providers.json` (`<CLINE_DIR>/data/settings/providers.json`) and makes it
7
+ * `lastUsedProvider`, so configuring it means running a process and reporting what it said. It has
8
+ * no flag for the context window, which Cline 3.x reads from the entry's `contextWindow` (and the
9
+ * reply cap from `maxTokens`): both are set on the saved entry afterwards, and removed when the
10
+ * window is unknown. The entry and `lastUsedProvider` from before are kept in the backup sidecar for
11
+ * the desktop's Disconnect, read before `cline auth` rewrites them.
7
12
  *
8
13
  * On Windows the npm-installed `cline` is a batch shim (`cline.cmd`), which `CreateProcessW` refuses
9
14
  * to execute directly, so the call is routed through `cmd /C`.
10
15
  */
11
16
  import { execFile } from 'node:child_process';
12
17
  import { AtomicCoreError } from '../../contracts/index.js';
13
- import { keyOr } from '../config-io.js';
18
+ import { canonicalJson, expandTilde, keyOr, parseJsonStrict } from '../config-io.js';
19
+ import { knownWindow, outputCap, readSidecar, sameJson, writeSidecar } from './backup.js';
20
+ import { asJsonObject } from './json-tree.js';
14
21
  import { registerWriter } from './registry.js';
22
+ const PROVIDER = 'openai-compatible';
15
23
  /** Argv for `cline auth`, split out so both the writer and its tests can name the exact command. */
16
24
  export function clineAuthCommand(apiUrl, model, apiKey, platform) {
17
25
  // Cline rejects an empty `--apikey` (and an empty `--modelid`), so a keyless local server gets a
@@ -19,7 +27,7 @@ export function clineAuthCommand(apiUrl, model, apiKey, platform) {
19
27
  const args = [
20
28
  'auth',
21
29
  '--provider',
22
- 'openai-compatible',
30
+ PROVIDER,
23
31
  '--apikey',
24
32
  keyOr(apiKey, 'local'),
25
33
  '--modelid',
@@ -49,9 +57,52 @@ export function spawnProcess(program, args) {
49
57
  });
50
58
  });
51
59
  }
60
+ /**
61
+ * `providers.json` where Cline resolves it: `$CLINE_PROVIDER_SETTINGS_PATH`, else
62
+ * `$CLINE_DATA_DIR/settings`, else `$CLINE_DIR/data/settings`, else `~/.cline/data/settings`.
63
+ */
64
+ export function clineProvidersPath(env, home) {
65
+ const value = (name) => {
66
+ const raw = env[name]?.trim();
67
+ return raw ? expandTilde(raw, home) : undefined;
68
+ };
69
+ const file = value('CLINE_PROVIDER_SETTINGS_PATH');
70
+ if (file !== undefined)
71
+ return file;
72
+ const data = value('CLINE_DATA_DIR') ?? `${value('CLINE_DIR') ?? '.cline'}/data`;
73
+ return `${data}/settings/providers.json`;
74
+ }
75
+ async function readProviders(fs, path) {
76
+ const text = await fs.read(path);
77
+ const parsed = text === undefined ? {} : parseJsonStrict(text, fs.absolute(path));
78
+ const root = asJsonObject(parsed);
79
+ if (!root)
80
+ throw new AtomicCoreError('IO_ERROR', `${fs.absolute(path)} is not a JSON object`);
81
+ return root;
82
+ }
83
+ const entrySettings = (root) => asJsonObject(asJsonObject(asJsonObject(root['providers'])?.[PROVIDER])?.['settings']);
84
+ /** Whether the entry still points where we pointed it. */
85
+ function holdsOurs(root, written) {
86
+ const settings = entrySettings(root);
87
+ const ours = asJsonObject(written);
88
+ return (settings !== undefined &&
89
+ ours !== undefined &&
90
+ sameJson(settings['baseUrl'], ours['baseUrl']) &&
91
+ sameJson(settings['model'], ours['model']));
92
+ }
52
93
  export async function configureCline(input) {
53
94
  const { program, args } = clineAuthCommand(input.apiUrl, input.model, input.apiKey, input.platform);
54
95
  const spawn = input.spawn ?? spawnProcess;
96
+ // What the desktop's Disconnect restores, read before `cline auth` rewrites it — and kept as it
97
+ // is across reconnects while the file still holds ours.
98
+ const path = clineProvidersPath(input.env, input.fs.home);
99
+ const before = await readProviders(input.fs, path);
100
+ const backup = await readSidecar(input.fs, path);
101
+ const kept = backup !== undefined && holdsOurs(before, backup['written']) ? backup['previous'] : undefined;
102
+ const previous = kept ?? {
103
+ lastUsedProvider: before['lastUsedProvider'] ?? null,
104
+ entry: asJsonObject(before['providers'])?.[PROVIDER] ?? null,
105
+ };
55
106
  let result;
56
107
  try {
57
108
  result = await spawn(program, args);
@@ -65,6 +116,27 @@ export async function configureCline(input) {
65
116
  const detail = stderr === '' ? result.stdout.trim() : stderr;
66
117
  throw new AtomicCoreError('INTERNAL_ERROR', `\`cline auth\` failed: ${detail}`);
67
118
  }
119
+ // `cline auth` has no flag for the window; set it on the entry it saved, or clear what the entry
120
+ // carried for the endpoint it pointed at before.
121
+ const after = await readProviders(input.fs, path);
122
+ const settings = entrySettings(after);
123
+ if (settings !== undefined) {
124
+ const was = canonicalJson(settings);
125
+ const window = knownWindow(input.contextLength);
126
+ if (window !== undefined) {
127
+ settings['contextWindow'] = window;
128
+ settings['maxTokens'] = outputCap(window);
129
+ }
130
+ else {
131
+ delete settings['contextWindow'];
132
+ delete settings['maxTokens'];
133
+ }
134
+ // Cline keeps the file owner-only: it holds every provider's key.
135
+ if (canonicalJson(settings) !== was) {
136
+ await input.fs.write(path, canonicalJson(after), input.platform === 'win32' ? {} : { mode: 0o600 });
137
+ }
138
+ }
139
+ await writeSidecar(input.fs, path, { previous, written: { baseUrl: input.apiUrl, model: input.model } }, input.platform);
68
140
  }
69
141
  registerWriter('cline', configureCline);
70
142
  //# sourceMappingURL=cline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cline.js","sourceRoot":"","sources":["../../../src/integrations/configure/cline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cline.js","sourceRoot":"","sources":["../../../src/integrations/configure/cline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACpF,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,QAAQ,GAAG,mBAAmB,CAAA;AAQpC,oGAAoG;AACpG,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,KAAa,EACb,MAAc,EACd,QAAyB;IAEzB,iGAAiG;IACjG,gGAAgG;IAChG,MAAM,IAAI,GAAG;QACX,MAAM;QACN,YAAY;QACZ,QAAQ;QACR,UAAU;QACV,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;QACtB,WAAW;QACX,KAAK;QACL,WAAW;QACX,MAAM;KACP,CAAA;IACD,OAAO,QAAQ,KAAK,OAAO;QACzB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE;QACpD,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAc;IAC1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACvE,8FAA8F;YAC9F,iFAAiF;YACjF,MAAM,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAClF,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAA;;gBACrD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAsB,EAAE,IAAY;IACrE,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;QAC7B,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACjD,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAClD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,QAAQ,OAAO,CAAA;IAChF,OAAO,GAAG,IAAI,0BAA0B,CAAA;AAC1C,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,EAAY,EAAE,IAAY;IACrD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IACjF,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACjC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,eAAe,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IAC7F,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,IAAgB,EAA0B,EAAE,CACjE,YAAY,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;AAEvF,0DAA0D;AAC1D,SAAS,SAAS,CAAC,IAAgB,EAAE,OAA8B;IACjE,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAClC,OAAO,CACL,QAAQ,KAAK,SAAS;QACtB,IAAI,KAAK,SAAS;QAClB,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAC3C,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAqB;IACxD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;IACnG,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,YAAY,CAAA;IAEzC,gGAAgG;IAChG,wDAAwD;IACxD,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IACzD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IAClD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1G,MAAM,QAAQ,GAAc,IAAI,IAAI;QAClC,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,CAAC,IAAI,IAAI;QACpD,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI;KAC7D,CAAA;IAED,IAAI,MAAmB,CAAA;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACrC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CAAC,UAAU,EAAE,4BAA6B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAA;IAC3F,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,+FAA+F;QAC/F,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QACnC,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;QAC5D,MAAM,IAAI,eAAe,CAAC,gBAAgB,EAAE,0BAA0B,MAAM,EAAE,CAAC,CAAA;IACjF,CAAC;IAED,iGAAiG;IACjG,iDAAiD;IACjD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACrC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;QACnC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QAC/C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,QAAQ,CAAC,eAAe,CAAC,GAAG,MAAM,CAAA;YAClC,QAAQ,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,QAAQ,CAAC,eAAe,CAAC,CAAA;YAChC,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAA;QAC9B,CAAC;QACD,kEAAkE;QAClE,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;YACpC,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACrG,CAAC;IACH,CAAC;IACD,MAAM,YAAY,CAChB,KAAK,CAAC,EAAE,EACR,IAAI,EACJ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,EACpE,KAAK,CAAC,QAAQ,CACf,CAAA;AACH,CAAC;AAED,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA"}
@@ -41,9 +41,11 @@ export declare function codexHome(env: NodeJS.ProcessEnv, home: string): string;
41
41
  export declare function codexProfilePath(dir: string): string;
42
42
  /**
43
43
  * The profile's exact bytes. Codex reads the key from the variable `env_key` names, never inline, so
44
- * a keyless server gets no `env_key` line at all and `launch` sets the variable on the child.
44
+ * a keyless server gets no `env_key` line at all and `launch` sets the variable on the child. A known
45
+ * served window is written as `model_context_window` (Codex otherwise assumes 272K for a model it
46
+ * does not know) with compaction at three quarters of it; an unknown one writes neither line.
45
47
  */
46
- export declare function renderCodexProfile(apiUrl: string, model: string, apiKey: string): string;
48
+ export declare function renderCodexProfile(apiUrl: string, model: string, apiKey: string, contextLength?: number): string;
47
49
  /** `codex --version` prints `codex-cli 0.146.0`: the first `x.y.z` in the output. */
48
50
  export declare function parseCodexVersion(output: string): CodexVersion | undefined;
49
51
  export declare function isCodexTooOld([major, minor, patch]: CodexVersion): boolean;
@@ -51,5 +53,5 @@ export declare function isCodexTooOld([major, minor, patch]: CodexVersion): bool
51
53
  * Write the profile, refusing to replace a file of that name Atomic Chat did not write. Returns its
52
54
  * path. A profile that cannot be read is an error, never "absent"; a symbolic link is written through.
53
55
  */
54
- export declare function writeCodexProfile(fs: ConfigFs, dir: string, apiUrl: string, model: string, apiKey: string): Promise<string>;
56
+ export declare function writeCodexProfile(fs: ConfigFs, dir: string, apiUrl: string, model: string, apiKey: string, contextLength?: number): Promise<string>;
55
57
  export declare function configureCodex(input: ConfigureInput): Promise<void>;
@@ -49,13 +49,20 @@ export function codexProfilePath(dir) {
49
49
  }
50
50
  /**
51
51
  * The profile's exact bytes. Codex reads the key from the variable `env_key` names, never inline, so
52
- * a keyless server gets no `env_key` line at all and `launch` sets the variable on the child.
52
+ * a keyless server gets no `env_key` line at all and `launch` sets the variable on the child. A known
53
+ * served window is written as `model_context_window` (Codex otherwise assumes 272K for a model it
54
+ * does not know) with compaction at three quarters of it; an unknown one writes neither line.
53
55
  */
54
- export function renderCodexProfile(apiUrl, model, apiKey) {
56
+ export function renderCodexProfile(apiUrl, model, apiKey, contextLength) {
57
+ const window = contextLength !== undefined && contextLength > 0
58
+ ? `model_context_window = ${contextLength}\n` +
59
+ `model_auto_compact_token_limit = ${Math.floor((contextLength * 3) / 4)}\n`
60
+ : '';
55
61
  return (`${CODEX_PROFILE_OWNER_PREFIX}: \`codex --profile ${CODEX_PROFILE}\` runs Codex on your local models.\n` +
56
62
  '# Atomic Chat rewrites this file when Codex is connected again and deletes it on disconnect.\n' +
57
63
  `model = "${tomlBasicStringEscape(model)}"\n` +
58
64
  `model_provider = "${CODEX_PROFILE}"\n` +
65
+ window +
59
66
  '\n' +
60
67
  `[model_providers.${CODEX_PROFILE}]\n` +
61
68
  'name = "Atomic Chat"\n' +
@@ -79,9 +86,9 @@ export function isCodexTooOld([major, minor, patch]) {
79
86
  * Write the profile, refusing to replace a file of that name Atomic Chat did not write. Returns its
80
87
  * path. A profile that cannot be read is an error, never "absent"; a symbolic link is written through.
81
88
  */
82
- export async function writeCodexProfile(fs, dir, apiUrl, model, apiKey) {
89
+ export async function writeCodexProfile(fs, dir, apiUrl, model, apiKey, contextLength) {
83
90
  const path = codexProfilePath(dir);
84
- const contents = renderCodexProfile(apiUrl, model, apiKey);
91
+ const contents = renderCodexProfile(apiUrl, model, apiKey, contextLength);
85
92
  // Cannot fail with the escaping above; it keeps a future edit of the template from shipping a file
86
93
  // Codex would reject.
87
94
  parseToml(contents);
@@ -131,7 +138,7 @@ export async function configureCodex(input) {
131
138
  const repair = await repairLegacyCodexConfig(input.fs, dir, input.platform);
132
139
  if (repair.kind === 'conflict')
133
140
  throw new AtomicCoreError('IO_ERROR', repair.reason);
134
- await writeCodexProfile(input.fs, dir, input.apiUrl, input.model, input.apiKey);
141
+ await writeCodexProfile(input.fs, dir, input.apiUrl, input.model, input.apiKey, input.contextLength);
135
142
  }
136
143
  registerWriter('codex', configureCodex);
137
144
  //# sourceMappingURL=codex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/integrations/configure/codex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/integrations/configure/codex.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,33 @@
1
1
  /**
2
- * GitHub Copilot CLI has no provider config file — it reads its BYOK settings from the environment
3
- * at launch — so configuring it means persisting `COPILOT_*` to the shell rc (Windows: `setx`).
4
- * `COPILOT_OFFLINE` is on so no GitHub sign-in is required and traffic stays on the local provider.
2
+ * GitHub Copilot CLI — an `atomic-chat` provider and its model in Copilot's `providers.json`.
3
+ * Twin of `copilot_config.rs` in the app.
5
4
  *
6
- * Copilot is the one agent that OMITS the key variable entirely when there is none, rather than
7
- * writing an `atomic` placeholder: an empty `COPILOT_PROVIDER_API_KEY` would be sent as a credential.
5
+ * Earlier releases persisted `COPILOT_PROVIDER_*`, `COPILOT_MODEL` and `COPILOT_OFFLINE=true`
6
+ * user-wide (a marked block in the shell rc, `setx` on Windows), which put every `copilot` the user
7
+ * ran on the local server — and a `providers.json` with any provider in it overrides those
8
+ * variables anyway. The file is Copilot's documented home for named providers, holds the window
9
+ * limits the variables could not, and lists the model beside the user's own; `launch` selects it for
10
+ * the run through `COPILOT_MODEL=atomic-chat/<model>` (catalog `childEnv`), which Copilot reads like
11
+ * `--model`. Our entries are replaced in place; every other provider and model is kept.
12
+ *
13
+ * Copilot reads `apiKey` literally (no variable references), so a keyed server's key is written into
14
+ * the owner-only file, and a keyless one gets no key at all, as Copilot allows for a local server.
15
+ *
16
+ * Connect also removes exactly the rc blocks an earlier release wrote: a block must open and close
17
+ * with our marker and hold only `export COPILOT_…` and blank lines, or the file stays as it is. The
18
+ * Windows variables are removed by the desktop app.
8
19
  */
9
20
  import type { ConfigureWriter } from './registry.js';
21
+ /** Our provider's `name`; Copilot addresses the model as `atomic-chat/<model id>`. */
22
+ export declare const COPILOT_PROVIDER_NAME = "atomic-chat";
23
+ /**
24
+ * `providers.json` where Copilot reads it: `$COPILOT_PROVIDERS_CONFIG`, else
25
+ * `$COPILOT_HOME/providers.json`, else `~/.copilot/providers.json`.
26
+ */
27
+ export declare function copilotProvidersPath(env: NodeJS.ProcessEnv, home: string): string;
28
+ /**
29
+ * `text` without the blocks an earlier release wrote, or `undefined` when there is nothing it can
30
+ * vouch for.
31
+ */
32
+ export declare function stripLegacyCopilotBlock(text: string): string | undefined;
10
33
  export declare const configureCopilot: ConfigureWriter;
@@ -1,14 +1,130 @@
1
1
  /**
2
- * GitHub Copilot CLI has no provider config file — it reads its BYOK settings from the environment
3
- * at launch — so configuring it means persisting `COPILOT_*` to the shell rc (Windows: `setx`).
4
- * `COPILOT_OFFLINE` is on so no GitHub sign-in is required and traffic stays on the local provider.
2
+ * GitHub Copilot CLI — an `atomic-chat` provider and its model in Copilot's `providers.json`.
3
+ * Twin of `copilot_config.rs` in the app.
5
4
  *
6
- * Copilot is the one agent that OMITS the key variable entirely when there is none, rather than
7
- * writing an `atomic` placeholder: an empty `COPILOT_PROVIDER_API_KEY` would be sent as a credential.
5
+ * Earlier releases persisted `COPILOT_PROVIDER_*`, `COPILOT_MODEL` and `COPILOT_OFFLINE=true`
6
+ * user-wide (a marked block in the shell rc, `setx` on Windows), which put every `copilot` the user
7
+ * ran on the local server — and a `providers.json` with any provider in it overrides those
8
+ * variables anyway. The file is Copilot's documented home for named providers, holds the window
9
+ * limits the variables could not, and lists the model beside the user's own; `launch` selects it for
10
+ * the run through `COPILOT_MODEL=atomic-chat/<model>` (catalog `childEnv`), which Copilot reads like
11
+ * `--model`. Our entries are replaced in place; every other provider and model is kept.
12
+ *
13
+ * Copilot reads `apiKey` literally (no variable references), so a keyed server's key is written into
14
+ * the owner-only file, and a keyless one gets no key at all, as Copilot allows for a local server.
15
+ *
16
+ * Connect also removes exactly the rc blocks an earlier release wrote: a block must open and close
17
+ * with our marker and hold only `export COPILOT_…` and blank lines, or the file stays as it is. The
18
+ * Windows variables are removed by the desktop app.
8
19
  */
20
+ import { AtomicCoreError } from '../../contracts/index.js';
21
+ import { canonicalJson, expandTilde, parseJsonStrict } from '../config-io.js';
22
+ import { knownWindow, outputCap } from './backup.js';
23
+ import { asJsonObject } from './json-tree.js';
9
24
  import { registerWriter } from './registry.js';
10
- import { configureEnvAgent } from './env-agent.js';
11
- const MARKER = '# Atomic Chat - Copilot CLI Config';
12
- export const configureCopilot = (input) => configureEnvAgent(input, { agentId: 'copilot', marker: MARKER, prefix: 'COPILOT_' });
25
+ /** Our provider's `name`; Copilot addresses the model as `atomic-chat/<model id>`. */
26
+ export const COPILOT_PROVIDER_NAME = 'atomic-chat';
27
+ const LEGACY_MARKER = '# Atomic Chat - Copilot CLI Config';
28
+ /** Every rc file an earlier release could have written to. */
29
+ const LEGACY_RC_FILES = ['.zshenv', '.bash_profile', '.bashrc'];
30
+ /**
31
+ * `providers.json` where Copilot reads it: `$COPILOT_PROVIDERS_CONFIG`, else
32
+ * `$COPILOT_HOME/providers.json`, else `~/.copilot/providers.json`.
33
+ */
34
+ export function copilotProvidersPath(env, home) {
35
+ const value = (name) => {
36
+ const raw = env[name]?.trim();
37
+ return raw ? expandTilde(raw, home) : undefined;
38
+ };
39
+ return value('COPILOT_PROVIDERS_CONFIG') ?? `${value('COPILOT_HOME') ?? '.copilot'}/providers.json`;
40
+ }
41
+ const named = (entry, field) => asJsonObject(entry)?.[field] === COPILOT_PROVIDER_NAME;
42
+ /** `root[key]` as a list, created when absent or null (Copilot reads both as empty). */
43
+ function list(root, key, path) {
44
+ const value = root[key];
45
+ if (value === undefined || value === null)
46
+ root[key] = [];
47
+ const out = root[key];
48
+ if (!Array.isArray(out)) {
49
+ throw new AtomicCoreError('IO_ERROR', `\`${key}\` in ${path} is not a list. Fix or remove it and try again.`);
50
+ }
51
+ return out;
52
+ }
53
+ /**
54
+ * `text` without the blocks an earlier release wrote, or `undefined` when there is nothing it can
55
+ * vouch for.
56
+ */
57
+ export function stripLegacyCopilotBlock(text) {
58
+ const isMarker = (line) => line.replace(/[\r\n]+$/, '') === LEGACY_MARKER;
59
+ const lines = text.split(/(?<=\n)/);
60
+ if (!lines.some(isMarker))
61
+ return undefined;
62
+ const kept = [];
63
+ let open = false;
64
+ for (const line of lines) {
65
+ if (isMarker(line)) {
66
+ open = !open;
67
+ continue;
68
+ }
69
+ if (open) {
70
+ const bare = line.replace(/[\r\n]+$/, '');
71
+ if (bare.trim() !== '' && !bare.startsWith('export COPILOT_'))
72
+ return undefined;
73
+ continue;
74
+ }
75
+ kept.push(line);
76
+ }
77
+ return open ? undefined : kept.join('');
78
+ }
79
+ export const configureCopilot = async ({ apiUrl, model, apiKey, fs, env, platform, contextLength, }) => {
80
+ const path = copilotProvidersPath(env, fs.home);
81
+ const text = await fs.read(path);
82
+ const root = asJsonObject(text === undefined ? {} : parseJsonStrict(text, fs.absolute(path)));
83
+ if (!root)
84
+ throw new AtomicCoreError('IO_ERROR', `${fs.absolute(path)} is not a JSON object`);
85
+ const providers = list(root, 'providers', fs.absolute(path));
86
+ const provider = {
87
+ name: COPILOT_PROVIDER_NAME,
88
+ type: 'openai',
89
+ baseUrl: apiUrl,
90
+ ...(apiKey ? { apiKey } : {}),
91
+ };
92
+ const at = providers.findIndex((p) => named(p, 'name'));
93
+ if (at >= 0) {
94
+ providers[at] = provider;
95
+ root['providers'] = providers.filter((p, i) => i <= at || !named(p, 'name'));
96
+ }
97
+ else {
98
+ providers.push(provider);
99
+ }
100
+ const models = list(root, 'models', fs.absolute(path));
101
+ const first = models.findIndex((m) => named(m, 'provider'));
102
+ const others = models.filter((m) => !named(m, 'provider'));
103
+ // A known window becomes Copilot's limits: the reply capped at a quarter of it (8192 at most) and
104
+ // the prompt given the rest. Unknown, Copilot assumes 128K for a model it does not know.
105
+ const window = knownWindow(contextLength);
106
+ const ours = {
107
+ id: model,
108
+ provider: COPILOT_PROVIDER_NAME,
109
+ ...(window !== undefined
110
+ ? {
111
+ maxContextWindowTokens: window,
112
+ maxPromptTokens: window - outputCap(window),
113
+ maxOutputTokens: outputCap(window),
114
+ }
115
+ : {}),
116
+ };
117
+ others.splice(first >= 0 ? Math.min(first, others.length) : others.length, 0, ours);
118
+ root['models'] = others;
119
+ // Plain text keys, the user's own among them.
120
+ await fs.write(path, canonicalJson(root), platform === 'win32' ? {} : { mode: 0o600 });
121
+ for (const rc of LEGACY_RC_FILES) {
122
+ const existing = await fs.read(rc);
123
+ const stripped = existing === undefined ? undefined : stripLegacyCopilotBlock(existing);
124
+ // Written through a symbolic link (dotfile managers link rc files), never over it.
125
+ if (stripped !== undefined)
126
+ await fs.write(await fs.linkTarget(rc), stripped);
127
+ }
128
+ };
13
129
  registerWriter('copilot', configureCopilot);
14
130
  //# sourceMappingURL=copilot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../src/integrations/configure/copilot.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,MAAM,GAAG,oCAAoC,CAAA;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAAoB,CAAC,KAAK,EAAE,EAAE,CACzD,iBAAiB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;AAEtF,cAAc,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA"}
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../src/integrations/configure/copilot.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,18 @@
1
1
  /**
2
- * Factory Droid keeps its BYOK providers in `~/.factory/settings.json` as a `customModels` array,
3
- * and selects one with a top-level `model` string.
2
+ * Factory Droid keeps its BYOK providers in `~/.factory/settings.json` as a `customModels` array.
3
+ * Twin of `droid_config.rs` in the app.
4
4
  *
5
- * The selector is the awkward part: Droid addresses a custom model by its POSITION in the array
6
- * (`custom:<displayName with spaces->dashes>-<index>`), not by name. So the value we write depends
7
- * on where our entry lands — seeding other models first shifts it. We upsert by `displayName`
8
- * (our managed marker) precisely so a rerun replaces our entry in place and the selector stays valid
9
- * instead of appending a duplicate and renumbering the user's models.
5
+ * Droid addresses a custom model by its `id`, `custom:<displayName with dashes>-<n>`; our entry
6
+ * carries `id` and `index` explicitly so the selector cannot drift when other entries move, and we
7
+ * upsert by `displayName` (our managed marker) so a rerun replaces it in place. The default for new
8
+ * sessions lives in `sessionDefaultSettings.model`: Droid moves a legacy top-level `model` there only
9
+ * when that key is empty, so the top-level value earlier releases wrote lost to any default the user
10
+ * had. That one is removed; the default the user had before is kept in the backup sidecar for the
11
+ * desktop's Disconnect.
12
+ *
13
+ * A known served window caps the reply at a quarter of it (8192 at most) and gives Droid the rest
14
+ * as `maxContextLimit`; an unknown one writes neither, where earlier releases claimed 16384 output
15
+ * tokens — the whole of a 16K window.
10
16
  */
11
17
  import type { ConfigureWriter } from './registry.js';
12
18
  export declare const configureDroid: ConfigureWriter;
@@ -1,47 +1,78 @@
1
1
  /**
2
- * Factory Droid keeps its BYOK providers in `~/.factory/settings.json` as a `customModels` array,
3
- * and selects one with a top-level `model` string.
2
+ * Factory Droid keeps its BYOK providers in `~/.factory/settings.json` as a `customModels` array.
3
+ * Twin of `droid_config.rs` in the app.
4
4
  *
5
- * The selector is the awkward part: Droid addresses a custom model by its POSITION in the array
6
- * (`custom:<displayName with spaces->dashes>-<index>`), not by name. So the value we write depends
7
- * on where our entry lands — seeding other models first shifts it. We upsert by `displayName`
8
- * (our managed marker) precisely so a rerun replaces our entry in place and the selector stays valid
9
- * instead of appending a duplicate and renumbering the user's models.
5
+ * Droid addresses a custom model by its `id`, `custom:<displayName with dashes>-<n>`; our entry
6
+ * carries `id` and `index` explicitly so the selector cannot drift when other entries move, and we
7
+ * upsert by `displayName` (our managed marker) so a rerun replaces it in place. The default for new
8
+ * sessions lives in `sessionDefaultSettings.model`: Droid moves a legacy top-level `model` there only
9
+ * when that key is empty, so the top-level value earlier releases wrote lost to any default the user
10
+ * had. That one is removed; the default the user had before is kept in the backup sidecar for the
11
+ * desktop's Disconnect.
12
+ *
13
+ * A known served window caps the reply at a quarter of it (8192 at most) and gives Droid the rest
14
+ * as `maxContextLimit`; an unknown one writes neither, where earlier releases claimed 16384 output
15
+ * tokens — the whole of a 16K window.
10
16
  */
11
17
  import { AtomicCoreError } from '../../contracts/index.js';
12
18
  import { canonicalJson, keyOr, parseJsonStrict } from '../config-io.js';
19
+ import { knownWindow, outputCap, readSidecar, sameJson, writeSidecar } from './backup.js';
13
20
  import { asJsonArray, asJsonObject } from './json-tree.js';
14
21
  import { registerWriter } from './registry.js';
15
22
  const DISPLAY_NAME = 'Atomic Chat';
23
+ /** `custom:` + the display name with whitespace runs turned into dashes. */
24
+ const SELECTOR_PREFIX = 'custom:Atomic-Chat-';
16
25
  const SETTINGS_PATH = '.factory/settings.json';
17
- /** Droid's own ceiling for a generic chat-completions provider; lower values truncate long edits. */
18
- const MAX_OUTPUT_TOKENS = 16_384;
19
- export const configureDroid = async ({ apiUrl, model, apiKey, fs }) => {
26
+ const SESSION_DEFAULTS = 'sessionDefaultSettings';
27
+ const isOurSelector = (value) => typeof value === 'string' && value.startsWith(SELECTOR_PREFIX);
28
+ export const configureDroid = async ({ apiUrl, model, apiKey, fs, platform, contextLength, }) => {
20
29
  const text = await fs.read(SETTINGS_PATH);
21
30
  const parsed = text === undefined ? {} : parseJsonStrict(text, fs.absolute(SETTINGS_PATH));
22
31
  const root = asJsonObject(parsed);
23
32
  if (!root)
24
33
  throw new AtomicCoreError('IO_ERROR', 'settings.json is not a JSON object');
34
+ // What the desktop's Disconnect puts back: the default before the first Connect, kept across
35
+ // reconnects while the file still has ours.
36
+ const currentDefault = asJsonObject(root[SESSION_DEFAULTS])?.['model'];
37
+ const backup = await readSidecar(fs, SETTINGS_PATH);
38
+ const previous = backup !== undefined &&
39
+ currentDefault !== undefined &&
40
+ sameJson(asJsonObject(backup['written'])?.['defaultModel'], currentDefault)
41
+ ? (backup['previous'] ?? null)
42
+ : {
43
+ defaultModel: currentDefault ?? null,
44
+ sessionDefaultSettings: Object.hasOwn(root, SESSION_DEFAULTS),
45
+ };
25
46
  // A `customModels` that is not an array is unusable to Droid anyway, so it is replaced rather than
26
47
  // preserved — unlike the individual entries inside it, which are the user's own providers.
27
48
  const models = asJsonArray(root['customModels']) ?? [];
49
+ const found = models.findIndex((m) => asJsonObject(m)?.['displayName'] === DISPLAY_NAME);
50
+ const index = found >= 0 ? found : models.length;
51
+ const selector = `${SELECTOR_PREFIX}${index}`;
52
+ const window = knownWindow(contextLength);
28
53
  const entry = {
29
54
  model,
55
+ id: selector,
56
+ index,
30
57
  displayName: DISPLAY_NAME,
31
58
  baseUrl: apiUrl,
32
59
  // Droid rejects an empty apiKey outright, so a keyless local server still needs a placeholder.
33
60
  apiKey: keyOr(apiKey, 'atomic'),
34
61
  provider: 'generic-chat-completion-api',
35
- maxOutputTokens: MAX_OUTPUT_TOKENS,
62
+ ...(window !== undefined
63
+ ? { maxOutputTokens: outputCap(window), maxContextLimit: window - outputCap(window) }
64
+ : {}),
36
65
  };
37
- let index = models.findIndex((m) => asJsonObject(m)?.['displayName'] === DISPLAY_NAME);
38
- if (index >= 0)
39
- models[index] = entry;
40
- else
41
- index = models.push(entry) - 1;
66
+ models[index] = entry;
42
67
  root['customModels'] = models;
43
- root['model'] = `custom:${DISPLAY_NAME.split(' ').join('-')}-${index}`;
68
+ // Earlier releases selected us through the legacy top-level key.
69
+ if (isOurSelector(root['model']))
70
+ delete root['model'];
71
+ const defaults = asJsonObject(root[SESSION_DEFAULTS]) ?? {};
72
+ defaults['model'] = selector;
73
+ root[SESSION_DEFAULTS] = defaults;
44
74
  await fs.write(SETTINGS_PATH, canonicalJson(root));
75
+ await writeSidecar(fs, SETTINGS_PATH, { previous, written: { defaultModel: selector } }, platform);
45
76
  };
46
77
  registerWriter('droid', configureDroid);
47
78
  //# sourceMappingURL=droid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"droid.js","sourceRoot":"","sources":["../../../src/integrations/configure/droid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,YAAY,GAAG,aAAa,CAAA;AAClC,MAAM,aAAa,GAAG,wBAAwB,CAAA;AAC9C,qGAAqG;AACrG,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEhC,MAAM,CAAC,MAAM,cAAc,GAAoB,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE;IACrF,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAA;IAC1F,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACjC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,eAAe,CAAC,UAAU,EAAE,oCAAoC,CAAC,CAAA;IAEtF,mGAAmG;IACnG,2FAA2F;IAC3F,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAA;IACtD,MAAM,KAAK,GAAe;QACxB,KAAK;QACL,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,MAAM;QACf,+FAA+F;QAC/F,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC/B,QAAQ,EAAE,6BAA6B;QACvC,eAAe,EAAE,iBAAiB;KACnC,CAAA;IAED,IAAI,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,YAAY,CAAC,CAAA;IACtF,IAAI,KAAK,IAAI,CAAC;QAAE,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;;QAChC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEnC,IAAI,CAAC,cAAc,CAAC,GAAG,MAAM,CAAA;IAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,UAAU,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAA;IAEtE,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;AACpD,CAAC,CAAA;AAED,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA"}
1
+ {"version":3,"file":"droid.js","sourceRoot":"","sources":["../../../src/integrations/configure/droid.ts"],"names":[],"mappings":"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"}