onadit 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.dev.md +1 -1
  2. package/README.md +5 -4
  3. package/dist/src/capture/triage-provider-factory.d.ts +12 -1
  4. package/dist/src/capture/triage-provider-factory.d.ts.map +1 -1
  5. package/dist/src/capture/triage-provider-factory.js +27 -1
  6. package/dist/src/capture/triage-provider-factory.js.map +1 -1
  7. package/dist/src/capture/worker-choice.d.ts +32 -0
  8. package/dist/src/capture/worker-choice.d.ts.map +1 -0
  9. package/dist/src/capture/worker-choice.js +76 -0
  10. package/dist/src/capture/worker-choice.js.map +1 -0
  11. package/dist/src/cli/commands/backfill.d.ts.map +1 -1
  12. package/dist/src/cli/commands/backfill.js +2 -2
  13. package/dist/src/cli/commands/backfill.js.map +1 -1
  14. package/dist/src/cli/commands/brief.js +2 -2
  15. package/dist/src/cli/commands/brief.js.map +1 -1
  16. package/dist/src/cli/commands/bulk-ingest.js +2 -2
  17. package/dist/src/cli/commands/bulk-ingest.js.map +1 -1
  18. package/dist/src/cli/commands/capture-recover.d.ts.map +1 -1
  19. package/dist/src/cli/commands/capture-recover.js +7 -3
  20. package/dist/src/cli/commands/capture-recover.js.map +1 -1
  21. package/dist/src/cli/commands/capture.d.ts.map +1 -1
  22. package/dist/src/cli/commands/capture.js +9 -4
  23. package/dist/src/cli/commands/capture.js.map +1 -1
  24. package/dist/src/cli/commands/compact.js +2 -2
  25. package/dist/src/cli/commands/compact.js.map +1 -1
  26. package/dist/src/cli/commands/doctor.d.ts.map +1 -1
  27. package/dist/src/cli/commands/doctor.js +7 -0
  28. package/dist/src/cli/commands/doctor.js.map +1 -1
  29. package/dist/src/cli/commands/import.d.ts.map +1 -1
  30. package/dist/src/cli/commands/import.js +2 -2
  31. package/dist/src/cli/commands/import.js.map +1 -1
  32. package/dist/src/cli/commands/ingest.js +2 -2
  33. package/dist/src/cli/commands/ingest.js.map +1 -1
  34. package/dist/src/cli/commands/onboard.d.ts +49 -0
  35. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  36. package/dist/src/cli/commands/onboard.js +183 -19
  37. package/dist/src/cli/commands/onboard.js.map +1 -1
  38. package/dist/src/cli/commands/rebuild.d.ts.map +1 -1
  39. package/dist/src/cli/commands/rebuild.js +2 -2
  40. package/dist/src/cli/commands/rebuild.js.map +1 -1
  41. package/dist/src/cli/commands/reconcile.js +2 -2
  42. package/dist/src/cli/commands/reconcile.js.map +1 -1
  43. package/dist/src/cli/commands/reindex.js +2 -2
  44. package/dist/src/cli/commands/reindex.js.map +1 -1
  45. package/dist/src/cli/commands/review.d.ts.map +1 -1
  46. package/dist/src/cli/commands/review.js +2 -2
  47. package/dist/src/cli/commands/review.js.map +1 -1
  48. package/dist/src/cli/commands/save.js +2 -2
  49. package/dist/src/cli/commands/save.js.map +1 -1
  50. package/dist/src/cli/commands/search.js +2 -2
  51. package/dist/src/cli/commands/search.js.map +1 -1
  52. package/dist/src/cli/commands/stats.js +2 -2
  53. package/dist/src/cli/commands/stats.js.map +1 -1
  54. package/dist/src/cli/commands/status.d.ts.map +1 -1
  55. package/dist/src/cli/commands/status.js +31 -3
  56. package/dist/src/cli/commands/status.js.map +1 -1
  57. package/dist/src/cli/commands/triage.d.ts.map +1 -1
  58. package/dist/src/cli/commands/triage.js +2 -2
  59. package/dist/src/cli/commands/triage.js.map +1 -1
  60. package/dist/src/cli/http-client.d.ts +6 -0
  61. package/dist/src/cli/http-client.d.ts.map +1 -1
  62. package/dist/src/cli/http-client.js +6 -0
  63. package/dist/src/cli/http-client.js.map +1 -1
  64. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  65. package/dist/src/cli/status/friend-header.js +19 -1
  66. package/dist/src/cli/status/friend-header.js.map +1 -1
  67. package/dist/src/config/schema.d.ts +30 -0
  68. package/dist/src/config/schema.d.ts.map +1 -1
  69. package/dist/src/config/schema.js +13 -0
  70. package/dist/src/config/schema.js.map +1 -1
  71. package/dist/src/diagnostics/codex-preflight.d.ts +10 -1
  72. package/dist/src/diagnostics/codex-preflight.d.ts.map +1 -1
  73. package/dist/src/diagnostics/codex-preflight.js +40 -0
  74. package/dist/src/diagnostics/codex-preflight.js.map +1 -1
  75. package/dist/src/diagnostics/doctor.d.ts +1 -1
  76. package/dist/src/diagnostics/doctor.d.ts.map +1 -1
  77. package/dist/src/diagnostics/doctor.js +20 -9
  78. package/dist/src/diagnostics/doctor.js.map +1 -1
  79. package/dist/src/diagnostics/repair-prompt.js +9 -2
  80. package/dist/src/diagnostics/repair-prompt.js.map +1 -1
  81. package/dist/src/jobs/worker-entry.d.ts.map +1 -1
  82. package/dist/src/jobs/worker-entry.js +1 -0
  83. package/dist/src/jobs/worker-entry.js.map +1 -1
  84. package/dist/src/main.js +5 -2
  85. package/dist/src/main.js.map +1 -1
  86. package/dist/src/mcp/server.d.ts.map +1 -1
  87. package/dist/src/mcp/server.js +2 -2
  88. package/dist/src/mcp/server.js.map +1 -1
  89. package/dist/src/onboarding/capture-switch.d.ts +15 -2
  90. package/dist/src/onboarding/capture-switch.d.ts.map +1 -1
  91. package/dist/src/onboarding/capture-switch.js +28 -5
  92. package/dist/src/onboarding/capture-switch.js.map +1 -1
  93. package/dist/src/onboarding/setup-session.d.ts.map +1 -1
  94. package/dist/src/onboarding/setup-session.js +2 -0
  95. package/dist/src/onboarding/setup-session.js.map +1 -1
  96. package/dist/src/onboarding/setup-state.d.ts +8 -1
  97. package/dist/src/onboarding/setup-state.d.ts.map +1 -1
  98. package/dist/src/onboarding/setup-state.js +6 -0
  99. package/dist/src/onboarding/setup-state.js.map +1 -1
  100. package/dist/src/providers/claude-cli-runner.d.ts +17 -5
  101. package/dist/src/providers/claude-cli-runner.d.ts.map +1 -1
  102. package/dist/src/providers/claude-cli-runner.js +35 -6
  103. package/dist/src/providers/claude-cli-runner.js.map +1 -1
  104. package/dist/src/providers/codex-cli-model.d.ts +68 -13
  105. package/dist/src/providers/codex-cli-model.d.ts.map +1 -1
  106. package/dist/src/providers/codex-cli-model.js +220 -41
  107. package/dist/src/providers/codex-cli-model.js.map +1 -1
  108. package/dist/src/providers/codex-cli-runner.d.ts +7 -0
  109. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -1
  110. package/dist/src/providers/codex-cli-runner.js +51 -13
  111. package/dist/src/providers/codex-cli-runner.js.map +1 -1
  112. package/dist/src/server/app.d.ts.map +1 -1
  113. package/dist/src/server/app.js +3 -1
  114. package/dist/src/server/app.js.map +1 -1
  115. package/dist/src/server/routes/friend-status.d.ts +14 -1
  116. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  117. package/dist/src/server/routes/friend-status.js +14 -1
  118. package/dist/src/server/routes/friend-status.js.map +1 -1
  119. package/dist/src/server/routes/setup.d.ts +11 -4
  120. package/dist/src/server/routes/setup.d.ts.map +1 -1
  121. package/dist/src/server/routes/setup.js +30 -8
  122. package/dist/src/server/routes/setup.js.map +1 -1
  123. package/package.json +1 -1
@@ -7,9 +7,22 @@ import path from "node:path";
7
7
  * after a week rather than banned forever.
8
8
  */
9
9
  export const REFUSAL_TTL_MS = 7 * 24 * 60 * 60 * 1000;
10
+ /**
11
+ * How long a model at capacity stays skipped. Short, so the next hourly
12
+ * capture tries the preferred model again.
13
+ */
14
+ export const BUSY_TTL_MS = 30 * 60 * 1000;
15
+ /**
16
+ * How long a process keeps its pick before reading Codex's list again. The list
17
+ * costs no model call, so the daemon checks it about once per capture run.
18
+ */
19
+ export const MODEL_RECHECK_MS = 60 * 60 * 1000;
10
20
  /** Probe at most this many catalog models per resolution — each is a real call. */
11
21
  const MAX_CATALOG_PROBES = 4;
12
- const PERSISTED_MODEL_FILE = path.join(".internal", "codex-model");
22
+ // One verified model per level, so changing the level re-picks. The earlier
23
+ // single `.internal/codex-model` file (no level) is only the last resort.
24
+ const persistedModelFile = (level) => path.join(".internal", `codex-model-${level}`);
25
+ const LEGACY_MODEL_FILE = path.join(".internal", "codex-model");
13
26
  const MODEL_HISTORY_FILE = path.join(".internal", "codex-model-history.json");
14
27
  /**
15
28
  * Thrown when no model could be resolved from config/source/persisted state
@@ -25,15 +38,34 @@ export class CodexModelUnavailableError extends Error {
25
38
  this.tried = tried;
26
39
  }
27
40
  }
41
+ /**
42
+ * Thrown when Codex says a model is at capacity ("Selected model is at
43
+ * capacity. Please try a different model."), by the runner for one model, or
44
+ * by the resolution when every model it tried was. Lives here, not in the
45
+ * runner, so the resolution can catch it without a module cycle.
46
+ */
47
+ export class CodexModelBusyError extends Error {
48
+ models;
49
+ constructor(models, message) {
50
+ super(message);
51
+ this.name = "CodexModelBusyError";
52
+ this.models = models;
53
+ }
54
+ }
28
55
  let configuredModel;
29
56
  let configuredDataDir;
57
+ let configuredLevel = "balanced";
30
58
  let resolvedModelPromise = null;
31
59
  let resolvedModel = null;
60
+ // When `resolvedModel` was picked, for MODEL_RECHECK_MS.
61
+ let resolvedAtMs = 0;
32
62
  // Set when a refusal invalidates the memoized model; written as the switch
33
63
  // record once the next resolution lands on a different model.
34
64
  let pendingSwitch = null;
35
- // Refusals seen by this process — the source of truth when no data dir is set.
65
+ // Refusals and capacity errors seen by this process — the source of truth
66
+ // when no data dir is set.
36
67
  const memoryRefusals = new Map();
68
+ const memoryBusy = new Map();
37
69
  /**
38
70
  * Wire the Onadit config's model override + data dir into the resolver. Called
39
71
  * once at daemon/CLI bootstrap. Safe to omit: without it, resolution still
@@ -46,6 +78,9 @@ export function configureCodexModel(opts) {
46
78
  if (typeof opts.dataDir === "string" && opts.dataDir.trim().length > 0) {
47
79
  configuredDataDir = opts.dataDir.trim();
48
80
  }
81
+ if (opts.level === "fast" || opts.level === "balanced") {
82
+ configuredLevel = opts.level;
83
+ }
49
84
  // Re-resolve after (re)configuration so a newly-supplied override wins.
50
85
  resolvedModelPromise = null;
51
86
  resolvedModel = null;
@@ -53,31 +88,40 @@ export function configureCodexModel(opts) {
53
88
  export function resetCodexModelCacheForTests() {
54
89
  configuredModel = undefined;
55
90
  configuredDataDir = undefined;
91
+ configuredLevel = "balanced";
56
92
  resolvedModelPromise = null;
57
93
  resolvedModel = null;
94
+ resolvedAtMs = 0;
58
95
  pendingSwitch = null;
59
96
  memoryRefusals.clear();
97
+ memoryBusy.clear();
60
98
  }
61
99
  /**
62
- * Resolve the model to pin on `codex exec`. Memoized for the process so the
63
- * source-config read / catalog probe happens at most once per model. `probe`
64
- * and `listModels` are injected by the runner (rather than imported) to avoid
65
- * a module cycle. `probe` resolves true when the model runs and false when
66
- * Codex refuses it; any other failure (auth, network) throws and aborts the
100
+ * Resolve the model to pin on `codex exec`. Memoized for the process, for
101
+ * MODEL_RECHECK_MS, so the list read / probe happens about once an hour.
102
+ * `probe` and `listModels` are injected by the runner (rather than imported)
103
+ * to avoid a module cycle. `probe` resolves true when the model runs and false
104
+ * when Codex refuses it, and throws CodexModelBusyError when it is at
105
+ * capacity; any other failure (auth, network) throws and aborts the
67
106
  * resolution, so it surfaces as itself instead of "no working model".
68
107
  */
69
108
  export async function resolveCodexModel(probe, listModels = async () => []) {
70
109
  if (resolvedModelPromise) {
71
- return resolvedModelPromise;
110
+ const stale = resolvedModel !== null && Date.now() - resolvedAtMs >= MODEL_RECHECK_MS;
111
+ if (!stale) {
112
+ return resolvedModelPromise;
113
+ }
114
+ resolvedModelPromise = null;
115
+ resolvedModel = null;
72
116
  }
73
117
  const pending = (async () => {
74
118
  const now = Date.now();
75
- const usable = (model) => model !== undefined && !isRefused(model, now) ? model : undefined;
76
- const direct = usable(configuredModel) ??
77
- usable(readSourceConfigModel()) ??
78
- usable(readPersistedModel(configuredDataDir));
79
- if (direct) {
80
- return direct;
119
+ const skipped = (model) => isRefused(model, now) || isBusy(model, now);
120
+ const usable = (model) => model !== undefined && !skipped(model) ? model : undefined;
121
+ const level = configuredLevel;
122
+ const pinned = usable(configuredModel);
123
+ if (pinned) {
124
+ return pinned;
81
125
  }
82
126
  let catalog = [];
83
127
  try {
@@ -85,18 +129,90 @@ export async function resolveCodexModel(probe, listModels = async () => []) {
85
129
  }
86
130
  catch {
87
131
  // A Codex without `debug models`, or no network: nothing to pick from.
88
- // The thrown error below then tells the user to set codex_cli.model.
132
+ // The steps after the list, then the thrown error, take over.
89
133
  }
90
- const candidates = orderCodexModelCandidates(catalog, (model) => isRefused(model, now)).slice(0, MAX_CATALOG_PROBES);
134
+ const persisted = usable(readPersistedModel(configuredDataDir, level));
135
+ const candidates = orderCodexModelCandidates(catalog, skipped, level);
136
+ const persistedListed = persisted !== undefined && candidates.includes(persisted);
91
137
  const tried = [];
138
+ const busy = [];
92
139
  for (const candidate of candidates) {
140
+ // Verified earlier and still listed: everything Codex ranks above it
141
+ // has been tried, so keep it without a call.
142
+ if (candidate === persisted) {
143
+ return persisted;
144
+ }
145
+ if (tried.length >= MAX_CATALOG_PROBES) {
146
+ break;
147
+ }
93
148
  tried.push(candidate);
94
- if (await probe(candidate)) {
95
- persistModel(configuredDataDir, candidate);
149
+ let runs;
150
+ try {
151
+ runs = await probe(candidate);
152
+ }
153
+ catch (error) {
154
+ if (error instanceof CodexModelBusyError) {
155
+ recordBusy(candidate, new Date());
156
+ busy.push(candidate);
157
+ continue;
158
+ }
159
+ // Checking a model ranked above the one that already works must not
160
+ // stop capture: keep that one, and the real call surfaces a lasting
161
+ // failure as itself.
162
+ if (persistedListed) {
163
+ return persisted;
164
+ }
165
+ throw error;
166
+ }
167
+ if (runs) {
168
+ persistModel(configuredDataDir, level, candidate);
96
169
  return candidate;
97
170
  }
98
171
  recordRefusal(candidate, new Date());
99
172
  }
173
+ // Nothing from the list ran (or there is no list): the model verified
174
+ // earlier — only when there is no list, or it is still on it, since a
175
+ // model Codex no longer lists is gone — then the user's own Codex model,
176
+ // used as before without a probe — a refusal later marks it.
177
+ if (persisted && (catalog.length === 0 || persistedListed) && !tried.includes(persisted)) {
178
+ return persisted;
179
+ }
180
+ const fromSource = usable(readSourceConfigModel());
181
+ if (fromSource && !tried.includes(fromSource)) {
182
+ return fromSource;
183
+ }
184
+ const legacy = usable(readLegacyPersistedModel(configuredDataDir));
185
+ if (legacy && !tried.includes(legacy)) {
186
+ tried.push(legacy);
187
+ try {
188
+ if (await probe(legacy)) {
189
+ persistModel(configuredDataDir, level, legacy);
190
+ return legacy;
191
+ }
192
+ recordRefusal(legacy, new Date());
193
+ }
194
+ catch (error) {
195
+ if (!(error instanceof CodexModelBusyError))
196
+ throw error;
197
+ recordBusy(legacy, new Date());
198
+ busy.push(legacy);
199
+ }
200
+ }
201
+ // Models skipped because they were at capacity a moment ago count too:
202
+ // within the cooldown nothing is probed, and the cause is still capacity,
203
+ // not a model to change in the config.
204
+ const stillBusy = [
205
+ configuredModel,
206
+ readPersistedModel(configuredDataDir, level),
207
+ ...catalog.map((model) => model.slug),
208
+ readSourceConfigModel(),
209
+ readLegacyPersistedModel(configuredDataDir),
210
+ ].filter((model) => model !== undefined && isBusy(model, now));
211
+ const allBusy = [...new Set([...busy, ...stillBusy])];
212
+ if (allBusy.length > 0) {
213
+ throw new CodexModelBusyError(allBusy, `Every Codex model Onadit tried is at capacity (${allBusy.join(", ")}). ` +
214
+ "Onadit tries again on its next pass.");
215
+ }
100
216
  throw new CodexModelUnavailableError(tried);
101
217
  })();
102
218
  resolvedModelPromise = pending;
@@ -104,6 +220,7 @@ export async function resolveCodexModel(probe, listModels = async () => []) {
104
220
  if (resolvedModelPromise !== pending)
105
221
  return;
106
222
  resolvedModel = model;
223
+ resolvedAtMs = Date.now();
107
224
  if (pendingSwitch && pendingSwitch.from !== model) {
108
225
  recordSwitch({
109
226
  from: pendingSwitch.from,
@@ -122,6 +239,20 @@ export async function resolveCodexModel(probe, listModels = async () => []) {
122
239
  });
123
240
  return pending;
124
241
  }
242
+ /**
243
+ * The model Codex runs under now, as far as this process knows, for status:
244
+ * the one resolved this run, else the configured or remembered one Codex has
245
+ * not refused. Null before the first pick.
246
+ */
247
+ export function currentCodexModel() {
248
+ if (resolvedModel)
249
+ return resolvedModel;
250
+ const now = Date.now();
251
+ if (configuredModel && !isRefused(configuredModel, now))
252
+ return configuredModel;
253
+ const persisted = readPersistedModel(configuredDataDir, configuredLevel);
254
+ return persisted && !isRefused(persisted, now) ? persisted : null;
255
+ }
125
256
  /**
126
257
  * Codex refused `model`. Record it (so every resolution skips it) and, when it
127
258
  * is the model this process resolved, drop the memo so the next
@@ -138,6 +269,21 @@ export function markCodexModelRefused(model, now = new Date()) {
138
269
  resolvedModel = null;
139
270
  }
140
271
  }
272
+ /**
273
+ * Codex said `model` is at capacity. Skip it for BUSY_TTL_MS and, when it is
274
+ * the model this process resolved, drop the memo so the next
275
+ * `resolveCodexModel` picks another one. Not a switch for status: the model is
276
+ * not gone, and capture goes back to it once the time passes.
277
+ */
278
+ export function markCodexModelBusy(model, now = new Date()) {
279
+ if (!isBusy(model, now.getTime())) {
280
+ recordBusy(model, now);
281
+ }
282
+ if (resolvedModel === model) {
283
+ resolvedModelPromise = null;
284
+ resolvedModel = null;
285
+ }
286
+ }
141
287
  /**
142
288
  * Rough tier from Codex's own description of a model ("Frontier intelligence
143
289
  * for the most demanding work", "Latest workhorse model…", "Fast and
@@ -152,26 +298,24 @@ export function classifyCodexModelTier(description) {
152
298
  return "fast";
153
299
  return "balanced";
154
300
  }
155
- // Balanced first (the default level); then fast, which is cheap and finishes
156
- // well inside the triage timeout; frontier last — slowest, and it uses the most
157
- // of the user's plan on every hourly run.
301
+ // The level's own tier first, then the other of balanced/fast; frontier last
302
+ // — slowest, and it uses the most of the user's plan on every hourly run.
158
303
  const TIER_RANK = {
159
- balanced: 0,
160
- fast: 1,
161
- frontier: 2,
304
+ balanced: { balanced: 0, fast: 1, frontier: 2 },
305
+ fast: { fast: 0, balanced: 1, frontier: 2 },
162
306
  };
163
307
  /**
164
308
  * Catalog models worth probing, best first: models shown in Codex's picker
165
309
  * (`visibility: "list"`), minus refused ones, ordered by tier and then by
166
310
  * Codex's own priority (lower = more recommended).
167
311
  */
168
- export function orderCodexModelCandidates(catalog, isModelRefused = () => false) {
312
+ export function orderCodexModelCandidates(catalog, isModelRefused = () => false, level = "balanced") {
169
313
  return catalog
170
314
  .filter((model) => model.visibility === undefined || model.visibility === "list")
171
315
  .filter((model) => !isModelRefused(model.slug))
172
316
  .map((model, index) => ({
173
317
  slug: model.slug,
174
- tier: TIER_RANK[classifyCodexModelTier(model.description)],
318
+ tier: TIER_RANK[level][classifyCodexModelTier(model.description)],
175
319
  priority: typeof model.priority === "number" ? model.priority : Number.POSITIVE_INFINITY,
176
320
  index,
177
321
  }))
@@ -240,14 +384,14 @@ export function parseTopLevelTomlModel(text) {
240
384
  }
241
385
  return undefined;
242
386
  }
243
- function persistedModelPath(dataDir) {
387
+ function persistedModelPath(dataDir, level) {
244
388
  if (!dataDir) {
245
389
  return undefined;
246
390
  }
247
- return path.join(dataDir, PERSISTED_MODEL_FILE);
391
+ return path.join(dataDir, persistedModelFile(level));
248
392
  }
249
- function readPersistedModel(dataDir) {
250
- const file = persistedModelPath(dataDir);
393
+ function readPersistedModel(dataDir, level) {
394
+ const file = persistedModelPath(dataDir, level);
251
395
  if (!file) {
252
396
  return undefined;
253
397
  }
@@ -259,8 +403,21 @@ function readPersistedModel(dataDir) {
259
403
  return undefined;
260
404
  }
261
405
  }
262
- function persistModel(dataDir, model) {
263
- const file = persistedModelPath(dataDir);
406
+ /** The single pick 1.0.0 saved, before picks were kept per level. */
407
+ function readLegacyPersistedModel(dataDir) {
408
+ if (!dataDir) {
409
+ return undefined;
410
+ }
411
+ try {
412
+ const value = fs.readFileSync(path.join(dataDir, LEGACY_MODEL_FILE), "utf-8").trim();
413
+ return value.length > 0 ? value : undefined;
414
+ }
415
+ catch {
416
+ return undefined;
417
+ }
418
+ }
419
+ function persistModel(dataDir, level, model) {
420
+ const file = persistedModelPath(dataDir, level);
264
421
  if (!file) {
265
422
  return;
266
423
  }
@@ -287,13 +444,34 @@ function recordRefusal(model, now) {
287
444
  const history = readHistory(configuredDataDir);
288
445
  history.refused[model] = now.toISOString();
289
446
  // Drop refusals past their TTL so the file stays a handful of entries.
290
- for (const [name, at] of Object.entries(history.refused)) {
291
- const refusedAt = Date.parse(at);
292
- if (!Number.isFinite(refusedAt) || now.getTime() - refusedAt >= REFUSAL_TTL_MS) {
293
- delete history.refused[name];
447
+ dropExpired(history.refused, now, REFUSAL_TTL_MS);
448
+ writeHistory(configuredDataDir, history);
449
+ }
450
+ function isBusy(model, nowMs) {
451
+ const at = memoryBusy.get(model) ?? readHistory(configuredDataDir).busy[model];
452
+ if (!at)
453
+ return false;
454
+ const busyAt = Date.parse(at);
455
+ return Number.isFinite(busyAt) && nowMs - busyAt < BUSY_TTL_MS;
456
+ }
457
+ // Kept in the data dir too, so `onadit capture` and the scripted captures of
458
+ // other agent homes skip a busy model the daemon just met, and the other way.
459
+ function recordBusy(model, now) {
460
+ memoryBusy.set(model, now.toISOString());
461
+ if (!configuredDataDir)
462
+ return;
463
+ const history = readHistory(configuredDataDir);
464
+ history.busy[model] = now.toISOString();
465
+ dropExpired(history.busy, now, BUSY_TTL_MS);
466
+ writeHistory(configuredDataDir, history);
467
+ }
468
+ function dropExpired(entries, now, ttlMs) {
469
+ for (const [name, at] of Object.entries(entries)) {
470
+ const atMs = Date.parse(at);
471
+ if (!Number.isFinite(atMs) || now.getTime() - atMs >= ttlMs) {
472
+ delete entries[name];
294
473
  }
295
474
  }
296
- writeHistory(configuredDataDir, history);
297
475
  }
298
476
  function recordSwitch(modelSwitch) {
299
477
  if (!configuredDataDir)
@@ -304,21 +482,22 @@ function recordSwitch(modelSwitch) {
304
482
  }
305
483
  function readHistory(dataDir) {
306
484
  if (!dataDir)
307
- return { refused: {} };
485
+ return { refused: {}, busy: {} };
308
486
  try {
309
487
  const parsed = JSON.parse(fs.readFileSync(path.join(dataDir, MODEL_HISTORY_FILE), "utf-8"));
310
488
  const refused = parsed.refused && typeof parsed.refused === "object" ? parsed.refused : {};
489
+ const busy = parsed.busy && typeof parsed.busy === "object" ? parsed.busy : {};
311
490
  const last = parsed.last_switch;
312
491
  const lastValid = last &&
313
492
  typeof last.from === "string" &&
314
493
  typeof last.to === "string" &&
315
494
  typeof last.at === "string";
316
495
  return lastValid
317
- ? { refused, last_switch: { ...last, from_config: last.from_config === true } }
318
- : { refused };
496
+ ? { refused, busy, last_switch: { ...last, from_config: last.from_config === true } }
497
+ : { refused, busy };
319
498
  }
320
499
  catch {
321
- return { refused: {} };
500
+ return { refused: {}, busy: {} };
322
501
  }
323
502
  }
324
503
  function writeHistory(dataDir, history) {
@@ -1 +1 @@
1
- {"version":3,"file":"codex-cli-model.js","sourceRoot":"","sources":["../../../src/providers/codex-cli-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-cli-model.js","sourceRoot":"","sources":["../../../src/providers/codex-cli-model.ts"],"names":[],"mappings":"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"}
@@ -58,6 +58,13 @@ export declare function runCodexCliJson<T>(options: CodexCliRunOptions): Promise
58
58
  * still passes here and fails later at extraction time.
59
59
  */
60
60
  export declare function isCodexCliAvailable(): boolean;
61
+ /**
62
+ * Is Codex signed in, as Onadit runs it? `codex login status` reads the
63
+ * sign-in file Onadit copies into its own Codex folder: no model call,
64
+ * nothing sent. Null when unknown: no `codex`, or an answer we cannot read.
65
+ * Used to suggest a capture worker, never to gate one.
66
+ */
67
+ export declare function codexSignedIn(): Promise<boolean | null>;
61
68
  export declare function resetCodexCliRunnerCacheForTests(): void;
62
69
  /**
63
70
  * Summarise codex output for diagnosis. The old first-500-chars slice captured
@@ -1 +1 @@
1
- {"version":3,"file":"codex-cli-runner.d.ts","sourceRoot":"","sources":["../../../src/providers/codex-cli-runner.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACf;AAsED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,GACxD,IAAI,CAGN;AA2DD;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC3B,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,SAAK;CAS1E;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACX,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAK5D;AASD,wBAAsB,eAAe,CAAC,CAAC,EACrC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CA4C/B;AAwFD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,wBAAgB,gCAAgC,IAAI,IAAI,CAQvD;AAiMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAe3E;AA4GD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,GAAG,SAA+B,EACjD,YAAY,GAAE,SAAS,MAAM,EAAmC,EAChE,cAAc,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAA+B,GACnE,MAAM,GAAG,SAAS,CA8BpB"}
1
+ {"version":3,"file":"codex-cli-runner.d.ts","sourceRoot":"","sources":["../../../src/providers/codex-cli-runner.ts"],"names":[],"mappings":"AAuCA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACf;AAwED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,GACxD,IAAI,CAGN;AA2DD;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC3B,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,MAAM,SAAK;CAS1E;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACX,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAK5D;AASD,wBAAsB,eAAe,CAAC,CAAC,EACrC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CA+C/B;AAwFD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAa7D;AAED,wBAAgB,gCAAgC,IAAI,IAAI,CAQvD;AA6MD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAe3E;AA4GD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,GAAG,SAA+B,EACjD,YAAY,GAAE,SAAS,MAAM,EAAmC,EAChE,cAAc,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAA+B,GACnE,MAAM,GAAG,SAAS,CA8BpB"}
@@ -3,8 +3,8 @@ import fs from "node:fs";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
5
  import { spawn, spawnSync } from "node:child_process";
6
- import { findCodexModelRejection } from "../diagnostics/codex-preflight.js";
7
- import { markCodexModelRefused, resetCodexModelCacheForTests, resolveCodexModel, } from "./codex-cli-model.js";
6
+ import { findCodexModelBusy, findCodexModelRejection, } from "../diagnostics/codex-preflight.js";
7
+ import { CodexModelBusyError, markCodexModelBusy, markCodexModelRefused, resetCodexModelCacheForTests, resolveCodexModel, } from "./codex-cli-model.js";
8
8
  const SCHEMA_CACHE = new Map();
9
9
  let codexVersionPromise = null;
10
10
  let isolatedCodexHomePath = null;
@@ -32,9 +32,11 @@ const CODEX_MODEL_PROBE_SCHEMA = {
32
32
  /**
33
33
  * Does this model actually run under our isolated CODEX_HOME? A tiny real
34
34
  * `codex exec` — true on a clean structured response, false when Codex refuses
35
- * the model. Any other failure (auth, network, timeout) throws: it is not about
36
- * the model, so trying the next one would only hide it. Injected into
37
- * resolveCodexModel so the pick is verified rather than guessed.
35
+ * the model. A model at capacity throws CodexModelBusyError, which the
36
+ * resolution reads as "skip it for now". Any other failure (auth, network,
37
+ * timeout) throws: it is not about the model, so trying the next one would
38
+ * only hide it. Injected into resolveCodexModel so the pick is verified
39
+ * rather than guessed.
38
40
  */
39
41
  async function probeCodexModel(model) {
40
42
  try {
@@ -205,21 +207,27 @@ export async function runCodexCliJson(options) {
205
207
  // default — that default changes between releases and silently broke every
206
208
  // preflight when 0.125.0 moved it to a ChatGPT-plan-rejected model.
207
209
  let model = await resolveCodexModel(probeCodexModel, listCodexCatalog);
208
- // When Codex refuses the model (OpenAI retired it, or the plan lost it),
209
- // record the refusal, pick another model and run again, instead of failing
210
- // every capture until someone edits config.json. Bounded: the configured,
211
- // source and persisted models are tried unprobed, so each can be refused once
212
- // before resolution reaches the probed catalog.
210
+ // When Codex refuses the model (OpenAI retired it, or the plan lost it), or
211
+ // says it is at capacity, record that, pick another model and run again,
212
+ // instead of failing the session (or, at the preflight, the whole run).
213
+ // Bounded: the configured, source and persisted models are tried unprobed,
214
+ // so each can fail once before resolution reaches the probed catalog.
213
215
  for (let switches = 0;; switches++) {
214
216
  try {
215
217
  return await runCodexExec(exec, model);
216
218
  }
217
219
  catch (error) {
218
- if (!(error instanceof CodexModelRejectedError) ||
219
- switches >= CODEX_MODEL_SWITCH_LIMIT) {
220
+ const refused = error instanceof CodexModelRejectedError;
221
+ const busy = error instanceof CodexModelBusyError;
222
+ if ((!refused && !busy) || switches >= CODEX_MODEL_SWITCH_LIMIT) {
220
223
  throw error;
221
224
  }
222
- markCodexModelRefused(model);
225
+ if (refused) {
226
+ markCodexModelRefused(model);
227
+ }
228
+ else {
229
+ markCodexModelBusy(model);
230
+ }
223
231
  model = await resolveCodexModel(probeCodexModel, listCodexCatalog);
224
232
  }
225
233
  }
@@ -304,6 +312,29 @@ async function runCodexExec(exec, model) {
304
312
  export function isCodexCliAvailable() {
305
313
  return resolveCodexExecutableForTests("codex") !== undefined;
306
314
  }
315
+ /**
316
+ * Is Codex signed in, as Onadit runs it? `codex login status` reads the
317
+ * sign-in file Onadit copies into its own Codex folder: no model call,
318
+ * nothing sent. Null when unknown: no `codex`, or an answer we cannot read.
319
+ * Used to suggest a capture worker, never to gate one.
320
+ */
321
+ export async function codexSignedIn() {
322
+ if (!isCodexCliAvailable())
323
+ return null;
324
+ try {
325
+ const { stdout, stderr } = await runCodexCommand(["login", "status"], {
326
+ cwd: ensureRuntimeTempDir(),
327
+ timeoutMs: 10_000,
328
+ });
329
+ const text = `${stdout}\n${stderr}`;
330
+ if (/not logged in/i.test(text))
331
+ return false;
332
+ return /logged in/i.test(text) ? true : null;
333
+ }
334
+ catch (error) {
335
+ return error instanceof Error && /not logged in/i.test(error.message) ? false : null;
336
+ }
337
+ }
307
338
  export function resetCodexCliRunnerCacheForTests() {
308
339
  SCHEMA_CACHE.clear();
309
340
  codexVersionPromise = null;
@@ -440,6 +471,13 @@ async function runCodexCommandOnce(args, options) {
440
471
  reject(new CodexModelRejectedError(model, rejection, code));
441
472
  return;
442
473
  }
474
+ const busy = model
475
+ ? findCodexModelBusy(`${stderr}\n${stdout}`, options.stdinText ?? "")
476
+ : null;
477
+ if (model && busy) {
478
+ reject(new CodexModelBusyError([model], `Codex CLI failed (exit ${code}) — the model "${model}" is at capacity: ${busy}`));
479
+ return;
480
+ }
443
481
  reject(new Error(`Codex CLI failed (exit ${code})${summary
444
482
  ? ` — ${summary}`
445
483
  : stdinError