@atomic-chat/core 0.19.1 → 0.20.5

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 (206) hide show
  1. package/dist/app-daemon.js +5 -0
  2. package/dist/app-daemon.js.map +1 -1
  3. package/dist/cli/bin.js +0 -0
  4. package/dist/cli/launch.js +2 -0
  5. package/dist/cli/launch.js.map +1 -1
  6. package/dist/cli/main.d.ts +1 -1
  7. package/dist/cli/main.js +5 -0
  8. package/dist/cli/main.js.map +1 -1
  9. package/dist/cloud/registry.js +1 -0
  10. package/dist/cloud/registry.js.map +1 -1
  11. package/dist/config/paths.d.ts +1 -1
  12. package/dist/config/paths.js +12 -0
  13. package/dist/config/paths.js.map +1 -1
  14. package/dist/contracts/engine-builds.d.ts +6 -1
  15. package/dist/contracts/engine-builds.js +1 -1
  16. package/dist/contracts/engine-builds.js.map +1 -1
  17. package/dist/contracts/engines.d.ts +1 -1
  18. package/dist/contracts/engines.js +2 -0
  19. package/dist/contracts/engines.js.map +1 -1
  20. package/dist/contracts/errors.d.ts +7 -1
  21. package/dist/contracts/errors.js.map +1 -1
  22. package/dist/contracts/geniex.d.ts +98 -0
  23. package/dist/contracts/geniex.js +15 -0
  24. package/dist/contracts/geniex.js.map +1 -0
  25. package/dist/contracts/index.d.ts +1 -0
  26. package/dist/contracts/index.js +1 -0
  27. package/dist/contracts/index.js.map +1 -1
  28. package/dist/contracts/model-yml.d.ts +40 -0
  29. package/dist/contracts/model-yml.js +7 -0
  30. package/dist/contracts/model-yml.js.map +1 -1
  31. package/dist/contracts/session.d.ts +6 -1
  32. package/dist/contracts/session.js.map +1 -1
  33. package/dist/contracts/settings.d.ts +12 -1
  34. package/dist/contracts/settings.js.map +1 -1
  35. package/dist/core/atomic-core.d.ts +1 -1
  36. package/dist/core/create.js +75 -1
  37. package/dist/core/create.js.map +1 -1
  38. package/dist/engine-builds/engines.d.ts +28 -7
  39. package/dist/engine-builds/engines.js +49 -5
  40. package/dist/engine-builds/engines.js.map +1 -1
  41. package/dist/engine-builds/geniex.d.ts +35 -0
  42. package/dist/engine-builds/geniex.js +111 -0
  43. package/dist/engine-builds/geniex.js.map +1 -0
  44. package/dist/engine-builds/manifest.d.ts +43 -0
  45. package/dist/engine-builds/manifest.js +92 -0
  46. package/dist/engine-builds/manifest.js.map +1 -1
  47. package/dist/engine-builds/order.d.ts +2 -1
  48. package/dist/engine-builds/order.js +2 -0
  49. package/dist/engine-builds/order.js.map +1 -1
  50. package/dist/engine-builds/select.d.ts +15 -0
  51. package/dist/engine-builds/select.js +14 -0
  52. package/dist/engine-builds/select.js.map +1 -1
  53. package/dist/engine-builds/service.d.ts +5 -3
  54. package/dist/engine-builds/service.js +21 -2
  55. package/dist/engine-builds/service.js.map +1 -1
  56. package/dist/engines/service.d.ts +2 -1
  57. package/dist/engines/service.js +3 -1
  58. package/dist/engines/service.js.map +1 -1
  59. package/dist/engines/versions.js +3 -0
  60. package/dist/engines/versions.js.map +1 -1
  61. package/dist/integrations/catalog.d.ts +3 -1
  62. package/dist/integrations/catalog.js +8 -2
  63. package/dist/integrations/catalog.js.map +1 -1
  64. package/dist/integrations/config-io.d.ts +45 -4
  65. package/dist/integrations/config-io.js +91 -6
  66. package/dist/integrations/config-io.js.map +1 -1
  67. package/dist/integrations/configure/codex-repair.d.ts +75 -0
  68. package/dist/integrations/configure/codex-repair.js +254 -0
  69. package/dist/integrations/configure/codex-repair.js.map +1 -0
  70. package/dist/integrations/configure/codex.d.ts +48 -10
  71. package/dist/integrations/configure/codex.js +126 -32
  72. package/dist/integrations/configure/codex.js.map +1 -1
  73. package/dist/integrations/configure/registry.d.ts +4 -1
  74. package/dist/integrations/configure/registry.js +1 -0
  75. package/dist/integrations/configure/registry.js.map +1 -1
  76. package/dist/models/gguf/kv-cache.d.ts +5 -0
  77. package/dist/models/gguf/kv-cache.js +35 -2
  78. package/dist/models/gguf/kv-cache.js.map +1 -1
  79. package/dist/models/gguf/reader.d.ts +5 -0
  80. package/dist/models/gguf/reader.js +15 -3
  81. package/dist/models/gguf/reader.js.map +1 -1
  82. package/dist/router/resolve.d.ts +3 -2
  83. package/dist/router/resolve.js +3 -1
  84. package/dist/router/resolve.js.map +1 -1
  85. package/dist/runtime/geniex/accelerators.d.ts +20 -0
  86. package/dist/runtime/geniex/accelerators.js +53 -0
  87. package/dist/runtime/geniex/accelerators.js.map +1 -0
  88. package/dist/runtime/geniex/check.d.ts +34 -0
  89. package/dist/runtime/geniex/check.js +117 -0
  90. package/dist/runtime/geniex/check.js.map +1 -0
  91. package/dist/runtime/geniex/chip.d.ts +29 -0
  92. package/dist/runtime/geniex/chip.js +35 -0
  93. package/dist/runtime/geniex/chip.js.map +1 -0
  94. package/dist/runtime/geniex/devices.d.ts +13 -0
  95. package/dist/runtime/geniex/devices.js +32 -0
  96. package/dist/runtime/geniex/devices.js.map +1 -0
  97. package/dist/runtime/geniex/geniex-host.d.ts +17 -0
  98. package/dist/runtime/geniex/geniex-host.js +26 -0
  99. package/dist/runtime/geniex/geniex-host.js.map +1 -0
  100. package/dist/runtime/geniex/host/args.d.ts +56 -0
  101. package/dist/runtime/geniex/host/args.js +115 -0
  102. package/dist/runtime/geniex/host/args.js.map +1 -0
  103. package/dist/runtime/geniex/host/engine.d.ts +76 -0
  104. package/dist/runtime/geniex/host/engine.js +122 -0
  105. package/dist/runtime/geniex/host/engine.js.map +1 -0
  106. package/dist/runtime/geniex/host/ffi-bun.d.ts +15 -0
  107. package/dist/runtime/geniex/host/ffi-bun.js +415 -0
  108. package/dist/runtime/geniex/host/ffi-bun.js.map +1 -0
  109. package/dist/runtime/geniex/host/grammar.d.ts +11 -0
  110. package/dist/runtime/geniex/host/grammar.js +223 -0
  111. package/dist/runtime/geniex/host/grammar.js.map +1 -0
  112. package/dist/runtime/geniex/host/inspect.d.ts +25 -0
  113. package/dist/runtime/geniex/host/inspect.js +177 -0
  114. package/dist/runtime/geniex/host/inspect.js.map +1 -0
  115. package/dist/runtime/geniex/host/library.d.ts +117 -0
  116. package/dist/runtime/geniex/host/library.js +38 -0
  117. package/dist/runtime/geniex/host/library.js.map +1 -0
  118. package/dist/runtime/geniex/host/openai.d.ts +62 -0
  119. package/dist/runtime/geniex/host/openai.js +458 -0
  120. package/dist/runtime/geniex/host/openai.js.map +1 -0
  121. package/dist/runtime/geniex/host/run.d.ts +48 -0
  122. package/dist/runtime/geniex/host/run.js +208 -0
  123. package/dist/runtime/geniex/host/run.js.map +1 -0
  124. package/dist/runtime/geniex/host/server.d.ts +39 -0
  125. package/dist/runtime/geniex/host/server.js +232 -0
  126. package/dist/runtime/geniex/host/server.js.map +1 -0
  127. package/dist/runtime/geniex/host/worker-protocol.d.ts +76 -0
  128. package/dist/runtime/geniex/host/worker-protocol.js +116 -0
  129. package/dist/runtime/geniex/host/worker-protocol.js.map +1 -0
  130. package/dist/runtime/geniex/host/worker-source.generated.d.ts +1 -0
  131. package/dist/runtime/geniex/host/worker-source.generated.js +4 -0
  132. package/dist/runtime/geniex/host/worker-source.generated.js.map +1 -0
  133. package/dist/runtime/geniex/host/worker.d.ts +7 -0
  134. package/dist/runtime/geniex/host/worker.js +19 -0
  135. package/dist/runtime/geniex/host/worker.js.map +1 -0
  136. package/dist/runtime/geniex/host-process.d.ts +48 -0
  137. package/dist/runtime/geniex/host-process.js +104 -0
  138. package/dist/runtime/geniex/host-process.js.map +1 -0
  139. package/dist/runtime/geniex/index.d.ts +11 -0
  140. package/dist/runtime/geniex/index.js +12 -0
  141. package/dist/runtime/geniex/index.js.map +1 -0
  142. package/dist/runtime/geniex/model-yml.d.ts +8 -0
  143. package/dist/runtime/geniex/model-yml.js +98 -0
  144. package/dist/runtime/geniex/model-yml.js.map +1 -0
  145. package/dist/runtime/geniex/runtime.d.ts +94 -0
  146. package/dist/runtime/geniex/runtime.js +366 -0
  147. package/dist/runtime/geniex/runtime.js.map +1 -0
  148. package/dist/runtime/litert-lm/host/openai.d.ts +4 -37
  149. package/dist/runtime/litert-lm/host/openai.js +11 -96
  150. package/dist/runtime/litert-lm/host/openai.js.map +1 -1
  151. package/dist/runtime/litert-lm/host/pool.d.ts +1 -7
  152. package/dist/runtime/litert-lm/host/pool.js +1 -17
  153. package/dist/runtime/litert-lm/host/pool.js.map +1 -1
  154. package/dist/runtime/litert-lm/host/server.js +11 -53
  155. package/dist/runtime/litert-lm/host/server.js.map +1 -1
  156. package/dist/runtime/llamacpp/args.d.ts +5 -0
  157. package/dist/runtime/llamacpp/args.js +2 -0
  158. package/dist/runtime/llamacpp/args.js.map +1 -1
  159. package/dist/runtime/llamacpp/fit-margin.d.ts +44 -0
  160. package/dist/runtime/llamacpp/fit-margin.js +50 -0
  161. package/dist/runtime/llamacpp/fit-margin.js.map +1 -1
  162. package/dist/runtime/llamacpp/load-plan.d.ts +5 -0
  163. package/dist/runtime/llamacpp/load-plan.js +57 -22
  164. package/dist/runtime/llamacpp/load-plan.js.map +1 -1
  165. package/dist/runtime/llamacpp/runtime.d.ts +2 -1
  166. package/dist/runtime/llamacpp/runtime.js +3 -1
  167. package/dist/runtime/llamacpp/runtime.js.map +1 -1
  168. package/dist/runtime/shared/external-sessions.js +1 -0
  169. package/dist/runtime/shared/external-sessions.js.map +1 -1
  170. package/dist/runtime/shared/fifo-lock.d.ts +10 -0
  171. package/dist/runtime/shared/fifo-lock.js +21 -0
  172. package/dist/runtime/shared/fifo-lock.js.map +1 -0
  173. package/dist/runtime/shared/index.d.ts +2 -0
  174. package/dist/runtime/shared/index.js +2 -0
  175. package/dist/runtime/shared/index.js.map +1 -1
  176. package/dist/runtime/shared/openai-sse.d.ts +112 -0
  177. package/dist/runtime/shared/openai-sse.js +178 -0
  178. package/dist/runtime/shared/openai-sse.js.map +1 -0
  179. package/dist/server/control/router.js +2 -0
  180. package/dist/server/control/router.js.map +1 -1
  181. package/dist/server/control/routes/geniex.d.ts +7 -0
  182. package/dist/server/control/routes/geniex.js +22 -0
  183. package/dist/server/control/routes/geniex.js.map +1 -0
  184. package/dist/server/control/types.d.ts +11 -1
  185. package/dist/server/control/types.js.map +1 -1
  186. package/dist/server/http.js +2 -0
  187. package/dist/server/http.js.map +1 -1
  188. package/dist/server/public/embedding.d.ts +8 -7
  189. package/dist/server/public/embedding.js +15 -7
  190. package/dist/server/public/embedding.js.map +1 -1
  191. package/dist/server/public/forward.js +15 -1
  192. package/dist/server/public/forward.js.map +1 -1
  193. package/dist/server/public/listing.js +1 -0
  194. package/dist/server/public/listing.js.map +1 -1
  195. package/dist/server/public/responses.js +9 -0
  196. package/dist/server/public/responses.js.map +1 -1
  197. package/dist/server/public/validate.d.ts +32 -0
  198. package/dist/server/public/validate.js +146 -0
  199. package/dist/server/public/validate.js.map +1 -0
  200. package/dist/settings/schema/geniex.json +63 -0
  201. package/dist/settings/schema/mlx.json +1 -1
  202. package/dist/settings/schema.js +11 -0
  203. package/dist/settings/schema.js.map +1 -1
  204. package/dist/version.d.ts +1 -1
  205. package/dist/version.js +1 -1
  206. package/package.json +7 -2
@@ -10,30 +10,90 @@
10
10
  * diverge on any file with more than one key.
11
11
  * - `serde_yaml` 0.9 does not indent sequence items under their key.
12
12
  * - The managed shell-rc block has an exact shape, including where its blank lines fall.
13
+ *
14
+ * Codex is the exception to "rewrite the user's file": it gets a profile file of its own and only
15
+ * ever *repairs* the shared `config.toml` (`configure/codex-repair.ts`). A repair must never turn an
16
+ * unreadable file into an empty one, so it reads through `readStrict` ("not found" is the only
17
+ * absence), backs up through `createNew` (never over an earlier backup) and writes back with the
18
+ * file's own `permissions` — operations the lenient writers above do not need. Its writes also go
19
+ * through a symbolic link (`linkTarget`) rather than over it: dotfile managers link
20
+ * `~/.codex/config.toml` into their repository, and replacing the link would detach it.
13
21
  */
14
- import { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
22
+ import { chmod, lstat, mkdir, readFile, realpath, rename, rm, stat, writeFile } from 'node:fs/promises';
15
23
  import { dirname, isAbsolute, join, resolve } from 'node:path';
16
24
  import { stringify as yamlStringify, parse as yamlParse } from 'yaml';
17
25
  import { AtomicCoreError } from '../contracts/index.js';
18
26
  export const ATOMIC_MANAGED_BEGIN = '# >>> Atomic Chat (managed) >>>';
19
27
  export const ATOMIC_MANAGED_END = '# <<< Atomic Chat (managed) <<<';
28
+ const isNotFound = (e) => e.code === 'ENOENT';
20
29
  export function nodeConfigFs(home) {
21
30
  const abs = (relative) => (isAbsolute(relative) ? relative : join(home, ...relative.split('/')));
22
31
  return {
23
32
  home,
24
33
  absolute: abs,
25
34
  read: (relative) => readFile(abs(relative), 'utf8').then((t) => t, () => undefined),
35
+ readStrict: async (relative) => {
36
+ let bytes;
37
+ try {
38
+ bytes = await readFile(abs(relative));
39
+ }
40
+ catch (e) {
41
+ if (isNotFound(e))
42
+ return undefined;
43
+ throw e;
44
+ }
45
+ return new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(bytes);
46
+ },
26
47
  write: async (relative, contents, options = {}) => {
27
48
  const path = abs(relative);
28
49
  await mkdir(dirname(path), { recursive: true });
29
50
  // Write beside the target and rename over it, so a crash cannot truncate a user's config.
30
51
  const tmp = `${path}.atomic-tmp`;
31
52
  await writeFile(tmp, contents, options.mode !== undefined ? { mode: options.mode } : {});
53
+ // `writeFile` applies `mode` only to a file it creates, and only through the umask.
54
+ if (options.mode !== undefined)
55
+ await chmod(tmp, options.mode);
32
56
  await rename(tmp, path).catch(async (e) => {
33
57
  await rm(tmp, { force: true }).catch(() => { });
34
58
  throw e;
35
59
  });
36
60
  },
61
+ createNew: async (relative, contents, options = {}) => {
62
+ const path = abs(relative);
63
+ await mkdir(dirname(path), { recursive: true });
64
+ try {
65
+ await writeFile(path, contents, {
66
+ flag: 'wx',
67
+ ...(options.mode !== undefined ? { mode: options.mode } : {}),
68
+ });
69
+ return true;
70
+ }
71
+ catch (e) {
72
+ if (e.code === 'EEXIST')
73
+ return false;
74
+ // `wx` failed after creating the file (a full disk): leave no half-written file behind.
75
+ await rm(path, { force: true }).catch(() => { });
76
+ throw e;
77
+ }
78
+ },
79
+ permissions: (relative) => stat(abs(relative)).then((s) => s.mode & 0o777, (e) => {
80
+ if (isNotFound(e))
81
+ return undefined;
82
+ throw e;
83
+ }),
84
+ linkTarget: async (relative) => {
85
+ const path = abs(relative);
86
+ let link;
87
+ try {
88
+ link = (await lstat(path)).isSymbolicLink();
89
+ }
90
+ catch (e) {
91
+ if (isNotFound(e))
92
+ return path;
93
+ throw e;
94
+ }
95
+ return link ? realpath(path) : path;
96
+ },
37
97
  mkdirp: (relative) => mkdir(abs(relative), { recursive: true }).then(() => undefined),
38
98
  exists: (relative) => stat(abs(relative)).then(() => true, () => false),
39
99
  remove: (relative) => rm(abs(relative), { force: true }),
@@ -151,9 +211,10 @@ export function parseYaml(text, path) {
151
211
  }
152
212
  // ── managed blocks ──────────────────────────────────────────────────────────────────────────────
153
213
  /**
154
- * Remove every `# >>> Atomic Chat (managed) >>> … # <<< Atomic Chat (managed) <<<` region. Some
155
- * writers (Codex) keep two, so this strips all of them, and — like the Rust original — it does not
156
- * consume the newline after the closing marker, which is why blank-line residue is expected.
214
+ * Remove every `# >>> Atomic Chat (managed) >>> … # <<< Atomic Chat (managed) <<<` region. It strips
215
+ * all of them, and — like the Rust original — it does not consume the newline after the closing
216
+ * marker, which is why blank-line residue is expected. The DeepSeek Harness writer uses it; Codex's
217
+ * legacy regions are removed by `configure/codex-repair.ts`, which only removes what it recognises.
157
218
  */
158
219
  export function stripAtomicManagedBlock(content) {
159
220
  let result = content;
@@ -210,10 +271,34 @@ export async function writeMarkedEnvToShell(fs, shell, platform, marker, prefix,
210
271
  await fs.write(rc, renderMarkedEnvBlock(existing, marker, prefix, entries));
211
272
  }
212
273
  // ── small shared helpers ────────────────────────────────────────────────────────────────────────
213
- /** TOML basic string escaping: only `\` and `"`, as the Rust writer does. */
274
+ /**
275
+ * The inside of a TOML basic string. Everything TOML forbids raw is escaped — `\`, `"`, and every
276
+ * control character (the five with a short form use it, the rest and DEL become `\uXXXX`, upper-case
277
+ * hex) — so any value yields a file Codex can parse. The desktop writer escapes the same way, which is
278
+ * what keeps the two sides' profile files byte-identical.
279
+ */
214
280
  export function tomlBasicStringEscape(value) {
215
- return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
281
+ let out = '';
282
+ for (const char of value) {
283
+ const short = TOML_SHORT_ESCAPES[char];
284
+ if (short !== undefined) {
285
+ out += short;
286
+ continue;
287
+ }
288
+ const code = char.codePointAt(0);
289
+ out += code < 0x20 || code === 0x7f ? `\\u${code.toString(16).toUpperCase().padStart(4, '0')}` : char;
290
+ }
291
+ return out;
216
292
  }
293
+ const TOML_SHORT_ESCAPES = {
294
+ '\\': '\\\\',
295
+ '"': '\\"',
296
+ '\b': '\\b',
297
+ '\t': '\\t',
298
+ '\n': '\\n',
299
+ '\f': '\\f',
300
+ '\r': '\\r',
301
+ };
217
302
  /** The key an agent should use when the user configured none. Not uniform across agents. */
218
303
  export function keyOr(apiKey, fallback) {
219
304
  return apiKey && apiKey.length > 0 ? apiKey : fallback;
@@ -1 +1 @@
1
- {"version":3,"file":"config-io.js","sourceRoot":"","sources":["../../src/integrations/config-io.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-io.js","sourceRoot":"","sources":["../../src/integrations/config-io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Undo what earlier Atomic Chat versions wrote into Codex's shared `config.toml`.
3
+ *
4
+ * Until the profile file (`codex.ts`), the Codex writer edited `<codex_home>/config.toml` itself,
5
+ * inside `# >>> Atomic Chat (managed) >>>` … `# <<< Atomic Chat (managed) <<<` regions. V1 (the first
6
+ * Launch page) appended one region: `[model_providers.atomic]` and `[profiles.atomic]`. V2 kept two:
7
+ * root `model` + `model_provider = "atomic"` at the very top, `[model_providers.atomic]` at the end.
8
+ * V2 is the incident: a user with a root `model` of their own got a duplicate key, and Codex — the CLI
9
+ * and the ChatGPT desktop app, which share the file — refused to start until it was fixed by hand.
10
+ *
11
+ * Deleting text from a file that is not ours is safe only for text we can prove is ours, so this is
12
+ * strict where it could be clever. A marker counts only as a whole line; the regions must pair up;
13
+ * each must parse on its own and hold nothing but keys some version wrote, with the values it wrote;
14
+ * the file without them must still parse; and it must not have changed since it was read. Anything
15
+ * else is a conflict: the file stays byte for byte as it was, and the message names it and says which
16
+ * lines to remove by hand. A repair keeps a backup of the original (never over an earlier one) and
17
+ * writes atomically with the file's own permission bits. A `config.toml` that is a symbolic link (a
18
+ * dotfile manager's) is written through: the temp file and the rename happen beside the real file,
19
+ * which gets the new text while the link stays a link; the backup still goes next to the link.
20
+ *
21
+ * The algorithm is shared with the desktop app, which runs it at startup and on disconnect; both
22
+ * sides must reach the same decision on the same bytes
23
+ * (ADR 2026-10-27-codex-runs-on-a-profile-of-its-own).
24
+ */
25
+ import type { ConfigFs } from '../config-io.js';
26
+ /** What the removed regions said, for a caller that wants to carry the setup over to the profile. */
27
+ export interface CodexLegacySettings {
28
+ model?: string;
29
+ baseUrl?: string;
30
+ /** The provider named `ATOMIC_CHAT_API_KEY` as its key variable. */
31
+ keyed: boolean;
32
+ }
33
+ export type CodexRepairResult =
34
+ /** No `config.toml`, or nothing of ours in it. Nothing was written. */
35
+ {
36
+ kind: 'clean';
37
+ } | {
38
+ kind: 'repaired';
39
+ backupPath: string;
40
+ legacy: CodexLegacySettings;
41
+ }
42
+ /** Something we cannot prove is ours. Nothing was written; `reason` is the user-facing message. */
43
+ | {
44
+ kind: 'conflict';
45
+ reason: string;
46
+ };
47
+ /** The decision on one file's text, before any I/O: what to write instead, or why not. */
48
+ export type CodexRepairPlan = {
49
+ kind: 'clean';
50
+ } | {
51
+ kind: 'conflict';
52
+ reason: string;
53
+ } | {
54
+ kind: 'repair';
55
+ text: string;
56
+ legacy: CodexLegacySettings;
57
+ };
58
+ /**
59
+ * The settings in one region when it holds exactly what some Atomic Chat version wrote, else
60
+ * `undefined`. Inline tables and dotted keys mean the same to Codex, so they are accepted too.
61
+ */
62
+ export declare function recogniseLegacyRegion(doc: Record<string, unknown>): CodexLegacySettings | undefined;
63
+ /**
64
+ * Steps 2–6 of the repair on a file's text: find and pair the marker lines, recognise every region,
65
+ * remove them, and check what is left. Pure, so every rule is testable on a string.
66
+ */
67
+ export declare function planCodexConfigRepair(original: string, path: string): CodexRepairPlan;
68
+ /** The first free backup name: `config.toml.atomic-chat-backup`, then `-2`, `-3`, … */
69
+ export declare function codexBackupPath(path: string, attempt: number): string;
70
+ /**
71
+ * Remove every legacy Atomic Chat region from `<dir>/config.toml`. Returns a conflict rather than
72
+ * throwing for a file it will not touch; throws only when the file could not be read, backed up or
73
+ * written. Either way a file that was not repaired is exactly as it was.
74
+ */
75
+ export declare function repairLegacyCodexConfig(fs: ConfigFs, dir: string, platform: NodeJS.Platform): Promise<CodexRepairResult>;
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Undo what earlier Atomic Chat versions wrote into Codex's shared `config.toml`.
3
+ *
4
+ * Until the profile file (`codex.ts`), the Codex writer edited `<codex_home>/config.toml` itself,
5
+ * inside `# >>> Atomic Chat (managed) >>>` … `# <<< Atomic Chat (managed) <<<` regions. V1 (the first
6
+ * Launch page) appended one region: `[model_providers.atomic]` and `[profiles.atomic]`. V2 kept two:
7
+ * root `model` + `model_provider = "atomic"` at the very top, `[model_providers.atomic]` at the end.
8
+ * V2 is the incident: a user with a root `model` of their own got a duplicate key, and Codex — the CLI
9
+ * and the ChatGPT desktop app, which share the file — refused to start until it was fixed by hand.
10
+ *
11
+ * Deleting text from a file that is not ours is safe only for text we can prove is ours, so this is
12
+ * strict where it could be clever. A marker counts only as a whole line; the regions must pair up;
13
+ * each must parse on its own and hold nothing but keys some version wrote, with the values it wrote;
14
+ * the file without them must still parse; and it must not have changed since it was read. Anything
15
+ * else is a conflict: the file stays byte for byte as it was, and the message names it and says which
16
+ * lines to remove by hand. A repair keeps a backup of the original (never over an earlier one) and
17
+ * writes atomically with the file's own permission bits. A `config.toml` that is a symbolic link (a
18
+ * dotfile manager's) is written through: the temp file and the rename happen beside the real file,
19
+ * which gets the new text while the link stays a link; the backup still goes next to the link.
20
+ *
21
+ * The algorithm is shared with the desktop app, which runs it at startup and on disconnect; both
22
+ * sides must reach the same decision on the same bytes
23
+ * (ADR 2026-10-27-codex-runs-on-a-profile-of-its-own).
24
+ */
25
+ import { join } from 'node:path';
26
+ import { parse as parseToml } from 'smol-toml';
27
+ import { AtomicCoreError } from '../../contracts/index.js';
28
+ import { ATOMIC_MANAGED_BEGIN, ATOMIC_MANAGED_END } from '../config-io.js';
29
+ const ROOT_KEYS = new Set(['model', 'model_provider', 'model_providers', 'profiles']);
30
+ const PROVIDER_KEYS = new Set(['name', 'base_url', 'env_key']);
31
+ const PROFILE_KEYS = new Set(['model', 'model_provider']);
32
+ /** A user's own big integers are valid TOML, not a reason to call their file broken. */
33
+ const parseTomlDocument = (text) => parseToml(text, { integersAsBigInt: 'asNeeded' });
34
+ function splitLines(content) {
35
+ const lines = [];
36
+ for (let start = 0; start < content.length;) {
37
+ const newline = content.indexOf('\n', start);
38
+ const end = newline < 0 ? content.length : newline + 1;
39
+ const raw = content.slice(start, end);
40
+ lines.push({ raw, text: raw.replace(/\n$/, '').replace(/\r$/, '') });
41
+ start = end;
42
+ }
43
+ return lines;
44
+ }
45
+ const conflict = (path, problem) => ({
46
+ kind: 'conflict',
47
+ reason: `Atomic Chat cannot remove its old settings from ${path}: ${problem}. ` +
48
+ `Remove the lines between "${ATOMIC_MANAGED_BEGIN}" and "${ATOMIC_MANAGED_END}" by hand, ` +
49
+ 'markers included, then connect Codex again.',
50
+ });
51
+ /** The first line of a parser error, which is the message; the rest is a code frame. */
52
+ const parserMessage = (e) => String(e.message).split('\n')[0];
53
+ const isTable = (value) => typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date);
54
+ const only = (table, allowed) => Object.keys(table).every((key) => allowed.has(key));
55
+ /** `{ atomic = { … } }` and nothing else beside it. */
56
+ function soleAtomicTable(value) {
57
+ if (!isTable(value) || Object.keys(value).join() !== 'atomic')
58
+ return undefined;
59
+ const atomic = value['atomic'];
60
+ return isTable(atomic) ? atomic : undefined;
61
+ }
62
+ /**
63
+ * The settings in one region when it holds exactly what some Atomic Chat version wrote, else
64
+ * `undefined`. Inline tables and dotted keys mean the same to Codex, so they are accepted too.
65
+ */
66
+ export function recogniseLegacyRegion(doc) {
67
+ if (Object.keys(doc).length === 0 || !only(doc, ROOT_KEYS))
68
+ return undefined;
69
+ const found = { keyed: false };
70
+ const has = (key) => Object.hasOwn(doc, key);
71
+ if (has('model')) {
72
+ const model = doc['model'];
73
+ if (typeof model !== 'string')
74
+ return undefined;
75
+ found.model = model;
76
+ }
77
+ if (has('model_provider') && doc['model_provider'] !== 'atomic')
78
+ return undefined;
79
+ if (has('model_providers')) {
80
+ const provider = soleAtomicTable(doc['model_providers']);
81
+ if (!provider || !only(provider, PROVIDER_KEYS))
82
+ return undefined;
83
+ const baseUrl = provider['base_url'];
84
+ if (provider['name'] !== 'Atomic Chat' || typeof baseUrl !== 'string')
85
+ return undefined;
86
+ const keyed = Object.hasOwn(provider, 'env_key');
87
+ if (keyed && provider['env_key'] !== 'ATOMIC_CHAT_API_KEY')
88
+ return undefined;
89
+ found.baseUrl = baseUrl;
90
+ found.keyed = keyed;
91
+ }
92
+ if (has('profiles')) {
93
+ const profile = soleAtomicTable(doc['profiles']);
94
+ if (!profile || !only(profile, PROFILE_KEYS))
95
+ return undefined;
96
+ const model = profile['model'];
97
+ if (typeof model !== 'string' || profile['model_provider'] !== 'atomic')
98
+ return undefined;
99
+ found.model ??= model;
100
+ }
101
+ return found;
102
+ }
103
+ /**
104
+ * Steps 2–6 of the repair on a file's text: find and pair the marker lines, recognise every region,
105
+ * remove them, and check what is left. Pure, so every rule is testable on a string.
106
+ */
107
+ export function planCodexConfigRepair(original, path) {
108
+ const lines = splitLines(original);
109
+ const markers = [];
110
+ for (const [index, { text }] of lines.entries()) {
111
+ if (text === ATOMIC_MANAGED_BEGIN || text === ATOMIC_MANAGED_END) {
112
+ markers.push({ index, begin: text === ATOMIC_MANAGED_BEGIN });
113
+ }
114
+ else if (text.includes(ATOMIC_MANAGED_BEGIN) || text.includes(ATOMIC_MANAGED_END)) {
115
+ return conflict(path, `line ${index + 1} has an Atomic Chat marker inside other text`);
116
+ }
117
+ }
118
+ if (markers.length === 0)
119
+ return { kind: 'clean' };
120
+ const regions = [];
121
+ let open;
122
+ for (const { index, begin } of markers) {
123
+ if (begin && open !== undefined)
124
+ return conflict(path, `line ${index + 1} opens a block inside the one opened on line ${open + 1}`);
125
+ if (!begin && open === undefined)
126
+ return conflict(path, `line ${index + 1} closes a block that was never opened`);
127
+ if (begin)
128
+ open = index;
129
+ else {
130
+ regions.push({ begin: open, end: index });
131
+ open = undefined;
132
+ }
133
+ }
134
+ if (open !== undefined)
135
+ return conflict(path, `the block opened on line ${open + 1} is never closed`);
136
+ const found = [];
137
+ for (const [n, { begin, end }] of regions.entries()) {
138
+ const where = `block ${n + 1} (lines ${begin + 1}–${end + 1})`;
139
+ let doc;
140
+ try {
141
+ doc = parseTomlDocument(lines
142
+ .slice(begin + 1, end)
143
+ .map((line) => line.raw)
144
+ .join(''));
145
+ }
146
+ catch (e) {
147
+ return conflict(path, `${where} is not valid TOML (${parserMessage(e)})`);
148
+ }
149
+ const settings = recogniseLegacyRegion(doc);
150
+ if (!settings)
151
+ return conflict(path, `${where} has settings Atomic Chat never writes`);
152
+ found.push(settings);
153
+ }
154
+ // V2 split one setup over two regions: the model in the head, the endpoint in the tail.
155
+ const model = found.find((s) => s.model !== undefined)?.model;
156
+ const baseUrl = found.find((s) => s.baseUrl !== undefined)?.baseUrl;
157
+ const legacy = {
158
+ ...(model === undefined ? {} : { model }),
159
+ ...(baseUrl === undefined ? {} : { baseUrl }),
160
+ keyed: found.some((s) => s.keyed),
161
+ };
162
+ const removed = new Set();
163
+ for (const { begin, end } of regions)
164
+ for (let index = begin; index <= end; index++)
165
+ removed.add(index);
166
+ let kept = [...lines.keys()].filter((index) => !removed.has(index));
167
+ // The V2 head was followed by a blank line (or, after reruns, several); at the top of the file
168
+ // they are ours too. A file that did not start with a region keeps its leading lines as they are.
169
+ if (removed.has(0)) {
170
+ const first = kept.findIndex((index) => lines[index].text.trim() !== '');
171
+ kept = first < 0 ? [] : kept.slice(first);
172
+ }
173
+ const body = kept
174
+ .map((index) => lines[index].raw)
175
+ .join('')
176
+ .trimEnd();
177
+ const text = body === '' ? '' : `${body}\n`;
178
+ try {
179
+ parseTomlDocument(text);
180
+ }
181
+ catch (e) {
182
+ // Report the line as the user sees it in the file now, not in the text we were about to write.
183
+ // `TomlError.line` is 1-based; a message without one (or past the end) names no line.
184
+ const original = kept[e.line - 1];
185
+ const at = original === undefined ? '' : ` (line ${original + 1})`;
186
+ return {
187
+ kind: 'conflict',
188
+ reason: `${path} would still not be valid TOML after removing Atomic Chat's settings: ` +
189
+ `${parserMessage(e)}${at}. Fix the file, or remove the lines between "${ATOMIC_MANAGED_BEGIN}" ` +
190
+ `and "${ATOMIC_MANAGED_END}" by hand, markers included, then connect Codex again.`,
191
+ };
192
+ }
193
+ return { kind: 'repair', text, legacy };
194
+ }
195
+ /** The first free backup name: `config.toml.atomic-chat-backup`, then `-2`, `-3`, … */
196
+ export function codexBackupPath(path, attempt) {
197
+ return attempt === 1 ? `${path}.atomic-chat-backup` : `${path}.atomic-chat-backup-${attempt}`;
198
+ }
199
+ const readFailure = (path, e) => new AtomicCoreError('IO_ERROR', `Failed to read ${path}`, e.message);
200
+ async function readOrFail(fs, path) {
201
+ try {
202
+ return await fs.readStrict(path);
203
+ }
204
+ catch (e) {
205
+ throw readFailure(path, e);
206
+ }
207
+ }
208
+ /**
209
+ * Remove every legacy Atomic Chat region from `<dir>/config.toml`. Returns a conflict rather than
210
+ * throwing for a file it will not touch; throws only when the file could not be read, backed up or
211
+ * written. Either way a file that was not repaired is exactly as it was.
212
+ */
213
+ export async function repairLegacyCodexConfig(fs, dir, platform) {
214
+ const path = join(dir, 'config.toml');
215
+ const original = await readOrFail(fs, path);
216
+ if (original === undefined)
217
+ return { kind: 'clean' };
218
+ const plan = planCodexConfigRepair(original, path);
219
+ if (plan.kind !== 'repair')
220
+ return plan;
221
+ let target;
222
+ let mode;
223
+ try {
224
+ target = await fs.linkTarget(path);
225
+ mode = platform === 'win32' ? undefined : await fs.permissions(target);
226
+ }
227
+ catch (e) {
228
+ throw readFailure(path, e);
229
+ }
230
+ // Another program (Codex itself, an editor) may have saved the file while we were deciding.
231
+ if ((await readOrFail(fs, path)) !== original) {
232
+ return conflict(path, 'it changed while Atomic Chat was reading it');
233
+ }
234
+ const options = mode === undefined ? {} : { mode };
235
+ let backupPath;
236
+ try {
237
+ for (let attempt = 1; backupPath === undefined; attempt++) {
238
+ const candidate = codexBackupPath(path, attempt);
239
+ if (await fs.createNew(candidate, original, options))
240
+ backupPath = candidate;
241
+ }
242
+ }
243
+ catch (e) {
244
+ throw new AtomicCoreError('IO_ERROR', `Could not back up ${path} before removing Atomic Chat's old settings from it, so it was left as it was.`, e.message);
245
+ }
246
+ try {
247
+ await fs.write(target, plan.text, options);
248
+ }
249
+ catch (e) {
250
+ throw new AtomicCoreError('IO_ERROR', `Failed to write ${target}`, e.message);
251
+ }
252
+ return { kind: 'repaired', backupPath, legacy: plan.legacy };
253
+ }
254
+ //# sourceMappingURL=codex-repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-repair.js","sourceRoot":"","sources":["../../../src/integrations/configure/codex-repair.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,55 @@
1
1
  /**
2
- * Codex CLI — `~/.codex/config.toml`.
2
+ * Codex CLI — a profile file of our own, `<codex_home>/atomic-chat.config.toml`.
3
3
  *
4
- * Port of `configure_codex` in `src-tauri/src/core/system/commands.rs`. This is the only writer that
5
- * edits TOML, and it does it textually rather than by parsing: the file is the user's, so the two
6
- * regions we own are delimited by managed markers and everything between them is left alone.
4
+ * Codex 0.134+ layers `$CODEX_HOME/<name>.config.toml` over the base `config.toml` when it is run
5
+ * with `--profile <name>`, so `launch` runs `codex --profile atomic-chat` (catalog `runArgs`) and the
6
+ * model, the provider and its endpoint live in a file nothing else writes. The provider id is
7
+ * `atomic-chat`, not `atomic`, so it never merges into a `[model_providers.atomic]` the user has.
7
8
  *
8
- * Two regions, not one, because Codex 0.135+ makes Atomic the default provider through the bare
9
- * root keys `model` / `model_provider`, and bare TOML keys must precede every `[table]`. So a head
10
- * block goes at the very top, the user's content follows, and the `[model_providers.atomic]` table
11
- * goes last. Rerunning strips both regions first, which is why a rerun is idempotent.
9
+ * The shared `config.toml` is no longer ours to write. Earlier versions edited it (two managed
10
+ * regions: bare root `model` / `model_provider` at the top, `[model_providers.atomic]` at the end),
11
+ * and a user who already had a root `model` got a duplicate key that stopped Codex — and the ChatGPT
12
+ * desktop app, which reads the same file — from starting. The only thing done to it now is removing
13
+ * those regions, through the strict repair in `codex-repair.ts`, before the profile is written.
12
14
  *
13
- * The user's content is `trimEnd`-ed but never trimmed at the start: leading blank lines left by
14
- * stripping a previous head block are part of the recorded output.
15
+ * Order: version gate, repair, profile. Below 0.134 `--profile` meant the old `[profiles.x]` tables,
16
+ * so an old Codex is refused before anything is touched; a version that cannot be read is let through.
17
+ * The profile is rewritten only while its first line says Atomic Chat wrote it: a file of the same
18
+ * name that someone else made is refused, never replaced. A profile that is a symbolic link is
19
+ * written through, so the link survives; one that points at nothing is refused rather than replaced.
20
+ * The bytes are a contract with the desktop writer (ADR 2026-10-27-codex-runs-on-a-profile-of-its-own),
21
+ * so either side can rewrite the other's.
15
22
  */
23
+ import type { ConfigFs } from '../config-io.js';
16
24
  import type { ConfigureInput } from './registry.js';
25
+ /** The profile name `--profile` takes, and the stem of its file. */
26
+ export declare const CODEX_PROFILE = "atomic-chat";
27
+ /** A profile file is ours iff it starts with this. */
28
+ export declare const CODEX_PROFILE_OWNER_PREFIX = "# Managed by Atomic Chat";
29
+ /**
30
+ * The first release where `--profile <name>` reads `<name>.config.toml`; 0.131–0.133 called that
31
+ * `--profile-v2` and meant the old `[profiles.x]` tables by `--profile`.
32
+ */
33
+ export declare const CODEX_MIN_VERSION: readonly [0, 134, 0];
34
+ export type CodexVersion = readonly [number, number, number];
35
+ /**
36
+ * Codex's own home: `$CODEX_HOME` when set and non-empty, else `<home>/.codex`. Codex resolves a
37
+ * relative `$CODEX_HOME` against its working directory, which `launch` shares with it. A leading `~`
38
+ * is expanded against the home directory: a quoted `CODEX_HOME="~/x"` reaches us unexpanded.
39
+ */
40
+ export declare function codexHome(env: NodeJS.ProcessEnv, home: string): string;
41
+ export declare function codexProfilePath(dir: string): string;
42
+ /**
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.
45
+ */
46
+ export declare function renderCodexProfile(apiUrl: string, model: string, apiKey: string): string;
47
+ /** `codex --version` prints `codex-cli 0.146.0`: the first `x.y.z` in the output. */
48
+ export declare function parseCodexVersion(output: string): CodexVersion | undefined;
49
+ export declare function isCodexTooOld([major, minor, patch]: CodexVersion): boolean;
50
+ /**
51
+ * Write the profile, refusing to replace a file of that name Atomic Chat did not write. Returns its
52
+ * path. A profile that cannot be read is an error, never "absent"; a symbolic link is written through.
53
+ */
54
+ export declare function writeCodexProfile(fs: ConfigFs, dir: string, apiUrl: string, model: string, apiKey: string): Promise<string>;
17
55
  export declare function configureCodex(input: ConfigureInput): Promise<void>;