shadok-ai 0.11.1 → 0.11.3

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.
package/README.md CHANGED
@@ -165,6 +165,14 @@ Enter to skip; you can add it later from the web UI).
165
165
  a brand-new instance (which is signed out at boot, so there is nothing to
166
166
  spawn yet). The condition is "no channel", which makes it idempotent: it never
167
167
  appears twice.
168
+ While it is being started the central panel says so — *starting your first
169
+ agent…* — instead of the *no agent open* invitation, which would ask you to
170
+ create a second one while the first is being born. It is a status, not a
171
+ screen: nothing to click, nothing to dismiss, and it ends on its own whichever
172
+ way the spawn goes (started, refused because the instance is signed out,
173
+ failed). The two look identical from the browser — an empty cockpit is an
174
+ empty cockpit — so the server is asked (`GET /first-agent`) rather than
175
+ guessed at, and the agent list is reconciled faster while the answer is yes.
168
176
  It is the environment's **home base**: pinned at the top of the list, with no
169
177
  close button and no *Close agent* in its menu. You can still reload, rename,
170
178
  re-profile or mute it — "permanent" should not mean "stuck". A cockpit that
@@ -580,7 +588,9 @@ cockpit's name, per launch directory: click the header brand to rename it, so
580
588
  several cockpits stay apart in the tab bar; an empty PUT reverts to the default),
581
589
  `/theme` (GET/PUT — the cockpit's colour palette, per launch directory: an accent
582
590
  key picked from the ⋯ menu, e.g. `emerald`; unknown/`amber` reverts to default),
583
- `/profiles`, `/secrets`, `/telegram`, `/defaults`, `/version`, `/autoupdate`,
591
+ `/profiles`, `/secrets`, `/telegram`, `/defaults`, `/first-agent` (GET —
592
+ `{pending, reason}`: whether this instance's lead agent is being started
593
+ right now), `/version`, `/autoupdate`,
584
594
  `/update-channel` (POST `{channel}` — `alpha` or `beta`), `/permission-mode`, `/tweak/prepare` (POST — clone/refresh shadok-ai's own source,
585
595
  returns the cwd to start the tweak agent in), and the sign-in group: `/auth` (GET
586
596
  — `{loggedIn, email?, subscriptionType?}`), `/auth/login` (POST — start a flow,
@@ -94,6 +94,51 @@ export interface RetryOptions {
94
94
  * hold the server back from serving).
95
95
  */
96
96
  export declare function findClaudeBinWithRetry(deps: FindClaudeDeps, opts?: RetryOptions): Promise<ClaudeBin>;
97
+ /**
98
+ * Is this the kernel refusing to run a binary that is being rewritten?
99
+ *
100
+ * ETXTBSY — "text file busy", where "text" is the old Unix word for a
101
+ * program's CODE segment, nothing to do with text files. The kernel refuses
102
+ * both directions: writing a file that is executing, and executing a file that
103
+ * is being written. It is the second that reaches us.
104
+ *
105
+ * Every `@anthropic-ai/claude-code` upgrade rewrites a ~214 MB native binary in
106
+ * place, so the window is SECONDS wide rather than microseconds, and a machine
107
+ * that follows releases hits it repeatedly — three times in one day here, each
108
+ * time killing an agent spawn and reporting it as a death.
109
+ *
110
+ * This is a DIFFERENT failure from invariant 32, and the difference decides the
111
+ * cure. There the file is the wrong thing (the npm placeholder) and reinstalling
112
+ * makes it worse, so we say what is wrong and stop. Here the file is exactly
113
+ * right and merely busy — the condition is transient by construction, resolves
114
+ * on its own, and the only possible mistake is concluding too early.
115
+ *
116
+ * `findClaudeBinWithRetry` cannot help: it retries a STAT, and a busy binary
117
+ * stats perfectly. You only learn at `execve`.
118
+ */
119
+ export declare function isBinaryBusyError(e: unknown): boolean;
120
+ /** Marks a spawn that failed because the pane's command never got to run. */
121
+ export declare function binaryBusyError(what: string): Error;
122
+ export declare const BINARY_BUSY_TRIES = 6;
123
+ export declare const BINARY_BUSY_DELAY_MS = 500;
124
+ /**
125
+ * Runs a pilot's synchronous `start()`, waiting out a binary that is mid-upgrade.
126
+ *
127
+ * The retry lives HERE and not inside `start()` because both pilots' `start()`
128
+ * are synchronous: waiting there would block the event loop for every other
129
+ * agent. `attachPilot` is already async, so this is the first place that can
130
+ * afford to wait at all.
131
+ *
132
+ * Only a busy binary is retried. Any other failure is rethrown at once — a
133
+ * missing binary or a bad path does not get better by being asked six times,
134
+ * and burying it under three seconds of retries would hide the real message.
135
+ */
136
+ export declare function startWithBusyRetry(start: () => void, opts?: {
137
+ tries?: number;
138
+ delayMs?: number;
139
+ sleep?: (ms: number) => Promise<void>;
140
+ onRetry?: (attempt: number, tries: number) => void;
141
+ }): Promise<void>;
97
142
  /** Live deps for {@link findClaudeBin}, reading the real filesystem. */
98
143
  export declare function liveClaudeDeps(): FindClaudeDeps;
99
144
  /**
@@ -210,6 +210,76 @@ export async function findClaudeBinWithRetry(deps, opts = {}) {
210
210
  }
211
211
  return last;
212
212
  }
213
+ /**
214
+ * Is this the kernel refusing to run a binary that is being rewritten?
215
+ *
216
+ * ETXTBSY — "text file busy", where "text" is the old Unix word for a
217
+ * program's CODE segment, nothing to do with text files. The kernel refuses
218
+ * both directions: writing a file that is executing, and executing a file that
219
+ * is being written. It is the second that reaches us.
220
+ *
221
+ * Every `@anthropic-ai/claude-code` upgrade rewrites a ~214 MB native binary in
222
+ * place, so the window is SECONDS wide rather than microseconds, and a machine
223
+ * that follows releases hits it repeatedly — three times in one day here, each
224
+ * time killing an agent spawn and reporting it as a death.
225
+ *
226
+ * This is a DIFFERENT failure from invariant 32, and the difference decides the
227
+ * cure. There the file is the wrong thing (the npm placeholder) and reinstalling
228
+ * makes it worse, so we say what is wrong and stop. Here the file is exactly
229
+ * right and merely busy — the condition is transient by construction, resolves
230
+ * on its own, and the only possible mistake is concluding too early.
231
+ *
232
+ * `findClaudeBinWithRetry` cannot help: it retries a STAT, and a busy binary
233
+ * stats perfectly. You only learn at `execve`.
234
+ */
235
+ export function isBinaryBusyError(e) {
236
+ if (!e)
237
+ return false;
238
+ const code = e.code;
239
+ if (code === "ETXTBSY")
240
+ return true;
241
+ // node-pty surfaces the errno inside a message rather than as `code`, and a
242
+ // shell in between may too. Matching the token is what actually catches it.
243
+ const msg = e instanceof Error ? e.message : String(e);
244
+ return /\bETXTBSY\b|text file busy/i.test(msg);
245
+ }
246
+ /** Marks a spawn that failed because the pane's command never got to run. */
247
+ export function binaryBusyError(what) {
248
+ const e = new Error(`${what} could not be executed (ETXTBSY: the binary is being rewritten)`);
249
+ e.code = "ETXTBSY";
250
+ return e;
251
+ }
252
+ export const BINARY_BUSY_TRIES = 6;
253
+ export const BINARY_BUSY_DELAY_MS = 500;
254
+ /**
255
+ * Runs a pilot's synchronous `start()`, waiting out a binary that is mid-upgrade.
256
+ *
257
+ * The retry lives HERE and not inside `start()` because both pilots' `start()`
258
+ * are synchronous: waiting there would block the event loop for every other
259
+ * agent. `attachPilot` is already async, so this is the first place that can
260
+ * afford to wait at all.
261
+ *
262
+ * Only a busy binary is retried. Any other failure is rethrown at once — a
263
+ * missing binary or a bad path does not get better by being asked six times,
264
+ * and burying it under three seconds of retries would hide the real message.
265
+ */
266
+ export async function startWithBusyRetry(start, opts = {}) {
267
+ const tries = Math.max(1, opts.tries ?? BINARY_BUSY_TRIES);
268
+ const delayMs = opts.delayMs ?? BINARY_BUSY_DELAY_MS;
269
+ const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
270
+ for (let i = 1;; i++) {
271
+ try {
272
+ start();
273
+ return;
274
+ }
275
+ catch (e) {
276
+ if (!isBinaryBusyError(e) || i >= tries)
277
+ throw e;
278
+ opts.onRetry?.(i, tries);
279
+ await sleep(delayMs);
280
+ }
281
+ }
282
+ }
213
283
  /** Live deps for {@link findClaudeBin}, reading the real filesystem. */
214
284
  export function liveClaudeDeps() {
215
285
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"claude-bin.js","sourceRoot":"","sources":["../src/claude-bin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-bin.js","sourceRoot":"","sources":["../src/claude-bin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,GAAG,GAAsB,OAAO,CAAC,GAAG,EACpC,MAAM,GAA2B,YAAY;IAE7C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACjF,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChG,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;YACjC,IAAI,MAAM,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAC9E,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,wEAAwE;AACxE,6EAA6E;AAC7E,gFAAgF;AAChF,gFAAgF;AAChF,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,4EAA4E;AAC5E,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAC/E,gFAAgF;AAChF,8EAA8E;AAC9E,8EAA8E;AAC9E,4CAA4C;AAE5C,yEAAyE;AACzE,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC;;;GAGG;AACH,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B,+EAA+E;AAC/E,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAUlD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CAAC,MAAwB;IAClD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IAAI,MAAM,CAAC,IAAI,GAAG,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,MAAM,CAAC;IACrF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,IAAI,EAAE,GAAkB,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjC,qEAAqE;QACrE,IAAI,IAAI,IAAI,cAAc;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACtD,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,KAAK,IAAI;YAAE,IAAI,CAAC;gBAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,IAAY,EACZ,IAAI,GAAG,KAAK;IAEZ,MAAM,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC;IACjC,MAAM,GAAG,GACP,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;IACvF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;QACpB,cAAc,EAAE,YAAY;QAC5B,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB;QAChE,WAAW,EAAE,aAAa;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,EAAE,GAAG,EAAE,GAAG,UAAU,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,gBAAwB,EAAE,GAAW,EAAE,GAAW;IACpF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,SAAS,CAAC;QACR,4EAA4E;QAC5E,kEAAkE;QAClE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,GAAG;YAAE,MAAM;QACtB,GAAG,GAAG,EAAE,CAAC;IACX,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAsBD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAoB;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACvD,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;IAE1G,4EAA4E;IAC5E,0EAA0E;IAC1E,8EAA8E;IAC9E,wEAAwE;IACxE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,IAAI,GAAG,QAAQ,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;YACtE,6DAA6D;QAC/D,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9D,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC;AASD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAoB,EACpB,IAAI,GAAiB,EAAE;IAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,IAAI,IAAI,GAAc,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,MAAM,IAAI,GAAI,CAAwB,CAAC,IAAI,CAAC;IAC5C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpC,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,iEAAiE,CAAC,CAAC;IAC7F,CAAuB,CAAC,IAAI,GAAG,SAAS,CAAC;IAC1C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAiB,EACjB,IAAI,GAKA,EAAE;IAEN,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,oBAAoB,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,KAAK,EAAE,CAAC;YACR,OAAO;QACT,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK;gBAAE,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACzB,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QACnC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;QACnC,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,MAAM,EAAE;KACf,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,MAAM;IACb,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,UAAU,CAAC,CAAC,CAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAoD,CAAC,CAAC,CAAC,IAAI,CAAC;QACtJ,OAAO,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,mBAAmB,KAAK,SAAS,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,0EAA0E;AAC1E,8EAA8E;AAC9E,qEAAqE;AACrE,IAAI,SAAS,GAAkB,IAAI,CAAC;AAEpC;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,SAAS,IAAI,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAClF,MAAM,CAAC,GAAG,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC;IAC1C,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,OAAO,SAAS,IAAI,QAAQ,CAAC;AAC/B,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAAC,CAAgB;IAChD,SAAS,GAAG,CAAC,CAAC;AAChB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,CACL,8CAA8C,MAAM,IAAI;QACxD,iCAAiC,UAAU,+DAA+D;QAC1G,4FAA4F,CAC7F,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CACL,gFAAgF;QAChF,4CAA4C,UAAU,kCAAkC;QACxF,qDAAqD;QACrD,yFAAyF;QACzF,kDAAkD,UAAU,cAAc,CAC3E,CAAC;AACJ,CAAC;AAaD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAsB;IACvD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,CAAC;IAE9E,IAAI,CAAC,MAAM,CAAC,0CAA0C,UAAU,sCAAsC,CAAC,CAAC;IACxG,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,CAAC,yBAAyB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5H,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,CAAC,4FAA4F,CAAC,CAAC;QAC1G,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,CAAC;IAC9E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,CAAC,oDAAoD,CAAC,EAAE,CAAC;AAC1G,CAAC"}
@@ -30,6 +30,46 @@ export declare function firstAgentPlan(input: {
30
30
  channelCount: number;
31
31
  authState: AuthState;
32
32
  }): FirstAgentPlan;
33
+ /**
34
+ * What the cockpit is allowed to SAY while it has no agent to show.
35
+ *
36
+ * The browser cannot work this out on its own: "a first agent is on its way"
37
+ * and "the user closed their last tab" are the same zero channels (invariant
38
+ * 18, which is why `active` can be null). Guessing picks one of two wrong
39
+ * answers — either a returning user is told forever that their first agent is
40
+ * starting, or a brand-new one is invited to create a SECOND lead agent while
41
+ * the first is being born. So the side doing the spawning says which it is.
42
+ *
43
+ * The state is deliberately hard to leave switched on. Every exit from
44
+ * `ensureFirstAgent` goes through `settleFirstAgent`, including the ones that
45
+ * spawn nothing (`not-signed-in`, `channels-exist`), the socket erroring and
46
+ * the 60s guard — because a flag that could stick would leave a signed-out
47
+ * cockpit reading "starting your first agent…" forever, which is a worse first
48
+ * impression than the empty state this replaces.
49
+ */
50
+ export interface FirstAgentStatus {
51
+ /** Is a lead agent genuinely being started right now? */
52
+ pending: boolean;
53
+ /** Why — the plan's reason once one has been computed, before that "starting". */
54
+ reason: FirstAgentPlan["reason"] | "starting" | "idle";
55
+ }
56
+ /** A copy, so no caller can hold a handle on the state and edit it. */
57
+ export declare function firstAgentStatus(): FirstAgentStatus;
58
+ /**
59
+ * Say a spawn is coming, BEFORE the attempt itself.
60
+ *
61
+ * The boot path defers `ensureFirstAgent` a beat (so it dials a server already
62
+ * accepting) and opens the browser first — so without this the very page this
63
+ * status exists for loads during that gap and is told "idle", which is the bug.
64
+ * The auth probe inside `ensureFirstAgent` costs another ~850ms on top.
65
+ *
66
+ * Authoritative, not sticky: called with channels present it CLEARS the flag
67
+ * rather than leaving a stale one — an instance that has agents has nothing
68
+ * pending by definition.
69
+ */
70
+ export declare function announceFirstAgent(channelCount: number): void;
71
+ /** The one way out of `pending`. Never conditional: every reason ends the wait. */
72
+ export declare function settleFirstAgent(reason: FirstAgentPlan["reason"]): void;
33
73
  /**
34
74
  * Start the lead agent if this instance has none. Idempotent by construction:
35
75
  * the condition is "no channel at all", so both callers can call it freely.
@@ -32,6 +32,33 @@ export function firstAgentPlan(input) {
32
32
  return { spawn: false, reason: "not-signed-in" };
33
33
  return { spawn: true, reason: "first-boot", name: FIRST_AGENT_NAME, profile: BOSS_PROFILE_NAME };
34
34
  }
35
+ let status = { pending: false, reason: "idle" };
36
+ /** A copy, so no caller can hold a handle on the state and edit it. */
37
+ export function firstAgentStatus() {
38
+ return { ...status };
39
+ }
40
+ /**
41
+ * Say a spawn is coming, BEFORE the attempt itself.
42
+ *
43
+ * The boot path defers `ensureFirstAgent` a beat (so it dials a server already
44
+ * accepting) and opens the browser first — so without this the very page this
45
+ * status exists for loads during that gap and is told "idle", which is the bug.
46
+ * The auth probe inside `ensureFirstAgent` costs another ~850ms on top.
47
+ *
48
+ * Authoritative, not sticky: called with channels present it CLEARS the flag
49
+ * rather than leaving a stale one — an instance that has agents has nothing
50
+ * pending by definition.
51
+ */
52
+ export function announceFirstAgent(channelCount) {
53
+ status =
54
+ channelCount > 0
55
+ ? { pending: false, reason: "channels-exist" }
56
+ : { pending: true, reason: "starting" };
57
+ }
58
+ /** The one way out of `pending`. Never conditional: every reason ends the wait. */
59
+ export function settleFirstAgent(reason) {
60
+ status = { pending: false, reason };
61
+ }
35
62
  /** Guards the two callers (boot, sign-in) against firing at the same moment. */
36
63
  let inFlight = false;
37
64
  /**
@@ -48,8 +75,15 @@ export async function ensureFirstAgent(deps) {
48
75
  channelCount: loadChannels().length,
49
76
  authState: (await authStatus()).state,
50
77
  });
51
- if (!plan.spawn)
78
+ if (!plan.spawn) {
79
+ settleFirstAgent(plan.reason);
52
80
  return plan.reason;
81
+ }
82
+ // The sign-in path reaches here without the boot path's announcement, and the
83
+ // auth probe above has just spent ~850ms — say it now, so the window in which
84
+ // the page could be told "idle" while a spawn is under way is closed at both
85
+ // ends rather than only at boot.
86
+ announceFirstAgent(0);
53
87
  inFlight = true;
54
88
  try {
55
89
  await new Promise((resolve) => {
@@ -100,6 +134,11 @@ export async function ensureFirstAgent(deps) {
100
134
  }
101
135
  finally {
102
136
  inFlight = false;
137
+ // In the `finally` on purpose: the spawn resolves on `ready`, on `error`,
138
+ // on `exited`, on a socket failure and on the 60s guard, and every one of
139
+ // them has to end the "starting…" status. `onReady` has already written the
140
+ // channel by now, so the client sees the tab and the cleared flag together.
141
+ settleFirstAgent("first-boot");
103
142
  }
104
143
  return "first-boot";
105
144
  }
@@ -1 +1 @@
1
- {"version":3,"file":"first-agent.js","sourceRoot":"","sources":["../src/first-agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"first-agent.js","sourceRoot":"","sources":["../src/first-agent.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -18,7 +18,7 @@ import { PtyPilot } from "./session.js";
18
18
  import { ensureClaudeHome, ensureProjectTrusted } from "./claude-home.js";
19
19
  import { authStatus, cancelLogin, startLogin, submitLoginCode } from "./claude-auth.js";
20
20
  import { starCount } from "./stars.js";
21
- import { ensureFirstAgent } from "./first-agent.js";
21
+ import { announceFirstAgent, ensureFirstAgent, firstAgentStatus, settleFirstAgent, } from "./first-agent.js";
22
22
  import { readGroundAt } from "./ground.js";
23
23
  import { homeGreetingBrief } from "./greeting.js";
24
24
  import { ensureSshIdentity } from "./ssh.js";
@@ -53,7 +53,7 @@ import { acquireInstanceLock, releaseInstanceLock } from "./lock.js";
53
53
  import { bindRefusal, originAllowed, parseOrigins, resolveHost, browserOrigin, } from "./net.js";
54
54
  import { pctFromUsage, windowForModel } from "./context.js";
55
55
  import { startHeartbeat } from "./heartbeat.js";
56
- import { ensureClaude, claudeCommand, classifyBin, findClaudeBinWithRetry, liveClaudeDeps, rememberClaudeBin, resolveBin, sampleBin, } from "./claude-bin.js";
56
+ import { ensureClaude, claudeCommand, classifyBin, findClaudeBinWithRetry, startWithBusyRetry, liveClaudeDeps, rememberClaudeBin, resolveBin, sampleBin, } from "./claude-bin.js";
57
57
  import { ensureTmux, tmuxInstallCommand } from "./tmux-install.js";
58
58
  import { cspHeader, injectNonce, NONCE_PLACEHOLDER, injectAssetVersion, injectInstanceKey } from "./csp.js";
59
59
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -183,6 +183,9 @@ function greetHomeAgent(id) {
183
183
  });
184
184
  }
185
185
  async function startFirstAgent() {
186
+ // Before the attempt, not after it: the browser may already be loading, and
187
+ // the empty state it would otherwise paint invites a SECOND lead agent.
188
+ announceFirstAgent(loadChannels().length);
186
189
  try {
187
190
  const why = await ensureFirstAgent({
188
191
  port: boundPort,
@@ -205,6 +208,11 @@ async function startFirstAgent() {
205
208
  console.log(`first agent: skipped (${why})`);
206
209
  }
207
210
  catch (e) {
211
+ // `ensureFirstAgent` settles its own status in a `finally`, but it can also
212
+ // throw BEFORE reaching it (reading the channel list, probing auth). A
213
+ // cockpit stuck on "starting your first agent…" is exactly what this
214
+ // feature must never produce, so the outermost handler ends the wait too.
215
+ settleFirstAgent("not-signed-in");
208
216
  console.log(`first agent: could not start — ${e instanceof Error ? e.message : String(e)}`);
209
217
  }
210
218
  }
@@ -967,6 +975,17 @@ app.get("/defaults", (_req, res) => {
967
975
  // share it. One source of truth with the server's own per-dir keying.
968
976
  res.json({ cwd: process.cwd(), instanceKey: instanceKey() });
969
977
  });
978
+ // Is the instance's lead agent on its way? A page with no channel cannot tell
979
+ // "one is being born" from "you closed your last tab" — both are zero channels
980
+ // (invariant 18) — and the difference decides whether it invites the user to
981
+ // create an agent or asks them to wait. Its own route rather than a field on
982
+ // `/defaults`, because the two have different lifetimes: `/defaults` hands out
983
+ // facts that cannot change under the page (the launch dir, its `instanceKey`)
984
+ // and is read once, while this one changes while the page watches and is
985
+ // POLLED — for as long as it answers `pending`, and never after.
986
+ app.get("/first-agent", (_req, res) => {
987
+ res.json(firstAgentStatus());
988
+ });
970
989
  // Cockpit name (header brand + browser tab), per launch directory — so several
971
990
  // cockpits stay distinguishable across a reload. Empty PUT clears it.
972
991
  app.get("/title", (_req, res) => {
@@ -2309,7 +2328,13 @@ async function attachPilot(s) {
2309
2328
  notifyParent(s, { kind: "exited" });
2310
2329
  destroySession(s);
2311
2330
  });
2312
- pilot.start();
2331
+ // Not `pilot.start()` directly: a claude-code upgrade rewrites a ~214 MB
2332
+ // binary in place, and a spawn landing in that window dies on ETXTBSY. It is
2333
+ // transient by construction, so it is waited out rather than reported as a
2334
+ // death — see `isBinaryBusyError`.
2335
+ await startWithBusyRetry(() => pilot.start(), {
2336
+ onRetry: (attempt, tries) => console.log(`spawn ${id.slice(0, 8)}: claude binary busy (upgrade in flight), retry ${attempt}/${tries}`),
2337
+ });
2313
2338
  // Start the stall clock now: a session reattached mid-work must not look
2314
2339
  // instantly "silent since epoch" and trip the fork detector before its tail
2315
2340
  // has had a chance to stream anything.
@@ -3559,6 +3584,10 @@ server.listen(port, HOST, () => {
3559
3584
  // would delay the window for nothing.
3560
3585
  openBrowser("http://localhost:" + port);
3561
3586
  adoptHomeChannel();
3587
+ // Announce here, not only inside the deferred call: the browser is opening
3588
+ // NOW and would otherwise be told there is nothing coming for a second and a
3589
+ // half — the whole window this status exists to fill.
3590
+ announceFirstAgent(loadChannels().length);
3562
3591
  setTimeout(() => void startFirstAgent(), 1500).unref?.();
3563
3592
  });
3564
3593
  //# sourceMappingURL=server.js.map