ccdeck 3.29.11 → 3.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +4 -3
  2. package/bin/agent-dag.js +67 -118
  3. package/bin/cli/help.js +67 -0
  4. package/bin/cli/login-item.js +182 -0
  5. package/bin/cli/one-shot.js +254 -0
  6. package/bin/cli/package.js +39 -0
  7. package/bin/cli/pulse.js +98 -0
  8. package/bin/cli/restart.js +179 -0
  9. package/bin/cli/screen.js +166 -0
  10. package/bin/cli/second-start.js +120 -0
  11. package/bin/cli/startup.js +459 -0
  12. package/bin/cli/uninstall.js +169 -0
  13. package/bin/deck.js +112 -1559
  14. package/dist/web/assets/BrowserWatchModal-n63GjLhv.js +1 -0
  15. package/dist/web/assets/UsageHistoryModal-DEwBX4Fk.js +1 -0
  16. package/dist/web/assets/index-CZJf1Cpp.js +299 -0
  17. package/dist/web/assets/index-D4q1ElXU.css +1 -0
  18. package/dist/web/index.html +2 -2
  19. package/hook/hook.js +15 -14
  20. package/package.json +1 -1
  21. package/release-notes.json +40 -0
  22. package/src/server/account-projects.mjs +25 -11
  23. package/src/server/account-routes.mjs +254 -0
  24. package/src/server/activity.mjs +3 -3
  25. package/src/server/append-budget.mjs +185 -0
  26. package/src/server/append-failures.mjs +147 -0
  27. package/src/server/args.mjs +37 -5
  28. package/src/server/atomic-write.mjs +300 -0
  29. package/src/server/block-notify.mjs +0 -5
  30. package/src/server/boot-lock.mjs +1 -1
  31. package/src/server/brand.mjs +7 -6
  32. package/src/server/browser-react.mjs +10 -2
  33. package/src/server/browser-watch-decks.mjs +146 -0
  34. package/src/server/browser-watch-feed.mjs +69 -0
  35. package/src/server/browser-watch-log.mjs +173 -0
  36. package/src/server/browser-watch-mtime.mjs +18 -0
  37. package/src/server/browser-watch-relay.mjs +112 -0
  38. package/src/server/browser-watch-routes.mjs +172 -0
  39. package/src/server/browser-watch-seen.mjs +127 -0
  40. package/src/server/browser-watch-store.mjs +14 -143
  41. package/src/server/browser-watch.mjs +278 -626
  42. package/src/server/canonical-path.mjs +150 -0
  43. package/src/server/ccusage-failure.mjs +64 -0
  44. package/src/server/ccusage-install.mjs +459 -0
  45. package/src/server/ccusage-runner.mjs +271 -0
  46. package/src/server/ccusage.mjs +21 -756
  47. package/src/server/claude-accounts.mjs +220 -464
  48. package/src/server/claude-collector.mjs +189 -0
  49. package/src/server/claude-dir.mjs +7 -3
  50. package/src/server/claude-identity.mjs +5 -4
  51. package/src/server/claude-reset-credits.mjs +130 -0
  52. package/src/server/claude-verdicts.mjs +174 -0
  53. package/src/server/clear-route.mjs +191 -0
  54. package/src/server/codex-auth.mjs +4 -4
  55. package/src/server/codex-dir.mjs +52 -8
  56. package/src/server/codex-enrichment.mjs +310 -0
  57. package/src/server/codex-quota.mjs +5 -3
  58. package/src/server/codex-translate.mjs +407 -0
  59. package/src/server/codex-usage.mjs +8 -5
  60. package/src/server/codex-watch.mjs +496 -0
  61. package/src/server/cswap-auto-loop.mjs +342 -0
  62. package/src/server/cswap-auto-readers.mjs +303 -0
  63. package/src/server/cswap-auto.mjs +51 -609
  64. package/src/server/cswap-install.mjs +69 -265
  65. package/src/server/cswap-layout.mjs +242 -0
  66. package/src/server/deck-home.mjs +2 -2
  67. package/src/server/deck-prefs.mjs +58 -184
  68. package/src/server/deck-scope.mjs +52 -0
  69. package/src/server/desktop-update-routes.mjs +75 -0
  70. package/src/server/detach.mjs +78 -0
  71. package/src/server/discovery.mjs +298 -0
  72. package/src/server/event-log.mjs +328 -0
  73. package/src/server/event-pipeline.mjs +235 -0
  74. package/src/server/event-ring.mjs +214 -0
  75. package/src/server/event-routes.mjs +352 -0
  76. package/src/server/event-sink.mjs +26 -0
  77. package/src/server/exec-children.mjs +128 -0
  78. package/src/server/exec-not-found.mjs +213 -0
  79. package/src/server/exec-output.mjs +23 -0
  80. package/src/server/exec-spec.mjs +341 -0
  81. package/src/server/exec.mjs +74 -661
  82. package/src/server/health-route.mjs +42 -0
  83. package/src/server/hook-challenge.mjs +37 -0
  84. package/src/server/http-io.mjs +104 -0
  85. package/src/server/index.mjs +174 -7620
  86. package/src/server/install-layout.mjs +506 -0
  87. package/src/server/installer.mjs +79 -608
  88. package/src/server/jsonl-chunks.mjs +139 -0
  89. package/src/server/lan-accounts.mjs +27 -0
  90. package/src/server/lan-beacon.mjs +457 -0
  91. package/src/server/lan-call.mjs +239 -0
  92. package/src/server/lan-copies.mjs +270 -0
  93. package/src/server/lan-deck.mjs +583 -0
  94. package/src/server/lan-dials.mjs +161 -0
  95. package/src/server/lan-engine.mjs +475 -1024
  96. package/src/server/lan-hearing.mjs +49 -0
  97. package/src/server/lan-inbound.mjs +100 -0
  98. package/src/server/lan-invite-offer.mjs +77 -0
  99. package/src/server/lan-invite.mjs +207 -0
  100. package/src/server/lan-lines.mjs +73 -0
  101. package/src/server/lan-manifest.mjs +74 -0
  102. package/src/server/lan-reach.mjs +82 -69
  103. package/src/server/lan-requests.mjs +249 -0
  104. package/src/server/lan-round-record.mjs +45 -0
  105. package/src/server/lan-round-timer.mjs +62 -0
  106. package/src/server/lan-routes.mjs +143 -0
  107. package/src/server/lan-serve.mjs +112 -0
  108. package/src/server/lan-socket.mjs +243 -925
  109. package/src/server/lan-sync.mjs +58 -1026
  110. package/src/server/lan-tailnet-poll.mjs +57 -0
  111. package/src/server/lan-turns.mjs +80 -0
  112. package/src/server/lan-wire.mjs +620 -0
  113. package/src/server/lifecycle.mjs +421 -0
  114. package/src/server/listen.mjs +110 -0
  115. package/src/server/live-decks.mjs +138 -0
  116. package/src/server/load-average.mjs +32 -0
  117. package/src/server/log-election.mjs +235 -0
  118. package/src/server/log-replay.mjs +374 -0
  119. package/src/server/log-writer.mjs +72 -557
  120. package/src/server/login-service.mjs +3 -2
  121. package/src/server/macmon.mjs +1 -1
  122. package/src/server/memory-files.mjs +163 -0
  123. package/src/server/memory-metrics.mjs +178 -0
  124. package/src/server/metrics-history.mjs +94 -0
  125. package/src/server/metrics-run.mjs +100 -0
  126. package/src/server/music-routes.mjs +134 -0
  127. package/src/server/network-metrics.mjs +5 -3
  128. package/src/server/network-sampler.mjs +256 -0
  129. package/src/server/npm-latest.mjs +385 -0
  130. package/src/server/npm-upgrade.mjs +352 -0
  131. package/src/server/npx.mjs +41 -7
  132. package/src/server/output-watch.mjs +5 -4
  133. package/src/server/pinned-build.mjs +110 -0
  134. package/src/server/prefs-give-back.mjs +206 -0
  135. package/src/server/prefs-path.mjs +14 -0
  136. package/src/server/prefs-refusal.mjs +86 -0
  137. package/src/server/prefs-routes.mjs +99 -0
  138. package/src/server/prefs-set-aside.mjs +86 -0
  139. package/src/server/prefs-state.mjs +70 -0
  140. package/src/server/process-command.mjs +104 -0
  141. package/src/server/process-list.mjs +547 -0
  142. package/src/server/provider-status.mjs +307 -0
  143. package/src/server/pulse-line.mjs +132 -0
  144. package/src/server/purge-key.mjs +7 -7
  145. package/src/server/quota-cli.mjs +174 -0
  146. package/src/server/quota-oauth.mjs +190 -0
  147. package/src/server/quota-shape.mjs +229 -0
  148. package/src/server/quota-store-resets.mjs +206 -0
  149. package/src/server/quota.mjs +123 -509
  150. package/src/server/relay-guard.mjs +3 -3
  151. package/src/server/request-gates.mjs +441 -0
  152. package/src/server/restart-note.mjs +180 -0
  153. package/src/server/retire-sound-hook.mjs +3 -3
  154. package/src/server/ring-bounds.mjs +215 -0
  155. package/src/server/running-deck.mjs +1 -1
  156. package/src/server/running-version.mjs +24 -0
  157. package/src/server/self-update.mjs +39 -1371
  158. package/src/server/session-enrichment.mjs +622 -0
  159. package/src/server/session-read-gate.mjs +49 -0
  160. package/src/server/session-tracking.mjs +242 -0
  161. package/src/server/sse-clients.mjs +222 -0
  162. package/src/server/stale-discovery.mjs +30 -0
  163. package/src/server/static-serve.mjs +81 -0
  164. package/src/server/supervisor.mjs +73 -12
  165. package/src/server/system-metrics.mjs +169 -1935
  166. package/src/server/term.mjs +11 -249
  167. package/src/server/thermal-metrics.mjs +520 -0
  168. package/src/server/thermal-sampler.mjs +204 -0
  169. package/src/server/token-redact.mjs +123 -0
  170. package/src/server/transcript-gate.mjs +107 -0
  171. package/src/server/transcript-scan.mjs +563 -0
  172. package/src/server/usage-routes.mjs +108 -0
  173. package/src/server/uv-bootstrap.mjs +1 -1
  174. package/src/server/wordmark.mjs +127 -0
  175. package/dist/web/assets/BrowserWatchModal-CyAFTvAY.js +0 -1
  176. package/dist/web/assets/UsageHistoryModal-KJfli0oa.js +0 -1
  177. package/dist/web/assets/index-Ck2RAla3.css +0 -1
  178. package/dist/web/assets/index-jmrcEsCj.js +0 -298
@@ -143,6 +143,30 @@ export function isCrash({ code, signal, served, stopping } = {}) {
143
143
  return code !== 0 && code !== null && code !== undefined;
144
144
  }
145
145
 
146
+ /**
147
+ * The line a crash crashPolicy answers leaves behind: what ended the deck, how
148
+ * long until it is back, and how much of the ceiling that has used.
149
+ *
150
+ * `recent` over CRASH_CEILING is the pair that makes the count mean something:
151
+ * "3/5" says how many more of these the supervisor will answer. The dash is a
152
+ * parameter for the reason upgradeRefusalText takes one (#797) — detached, this
153
+ * is written into deck.log, and the terminal tailing it may be a console that
154
+ * cannot draw an em dash.
155
+ */
156
+ export function crashRestartNote({ code, signal, delayMs, recent, product = "ccdeck", dash = "—" }) {
157
+ const how = signal ? `killed by ${signal}` : `exit ${code}`;
158
+ return `${product}: the deck stopped on its own (${how}) ${dash} starting it again in ${Math.round(delayMs / 1000)}s (${recent}/${CRASH_CEILING}).`;
159
+ }
160
+
161
+ /**
162
+ * The line the crash past the ceiling leaves before the supervisor ends: how
163
+ * many, in how long, and the command that starts the deck again once somebody
164
+ * has looked — the one the user typed, when that is known.
165
+ */
166
+ export function crashCeilingNote({ product = "ccdeck", command = "ccdeck", dash = "—" } = {}) {
167
+ return `${product}: the deck has stopped ${CRASH_CEILING} times in ${Math.round(CRASH_WINDOW_MS / 60000)} minutes ${dash} not starting it again. Run \`${command}\` when you have looked at the log above.`;
168
+ }
169
+
146
170
  /**
147
171
  * How to report a worker that did not exit at all but was killed by a signal.
148
172
  *
@@ -187,6 +211,18 @@ export function signalExitAction(signal, platform = process.platform, numbers =
187
211
  *
188
212
  * `proc` is a parameter so the whole sequence can be driven in a test child.
189
213
  */
214
+ export function dieOfSignal(signal, proc = process) {
215
+ const { reraise, code } = signalExitAction(signal, proc.platform);
216
+ if (reraise) {
217
+ proc.removeAllListeners(reraise);
218
+ try { proc.kill(proc.pid, reraise); } catch { /* fall through to the number */ }
219
+ }
220
+ // Reached on Windows, and on POSIX only when the signal is ignored or
221
+ // blocked — inherited dispositions survive spawn — so the kill above returns
222
+ // instead of ending us.
223
+ proc.exit(code);
224
+ }
225
+
190
226
  /**
191
227
  * What to say when the upgrade that just succeeded took this install with it,
192
228
  * or null when that is not what happened.
@@ -223,18 +259,6 @@ export function replacedNote({ workerExists, moved, product = "ccdeck", command
223
259
  ].join("\n");
224
260
  }
225
261
 
226
- export function dieOfSignal(signal, proc = process) {
227
- const { reraise, code } = signalExitAction(signal, proc.platform);
228
- if (reraise) {
229
- proc.removeAllListeners(reraise);
230
- try { proc.kill(proc.pid, reraise); } catch { /* fall through to the number */ }
231
- }
232
- // Reached on Windows, and on POSIX only when the signal is ignored or
233
- // blocked — inherited dispositions survive spawn — so the kill above returns
234
- // instead of ending us.
235
- proc.exit(code);
236
- }
237
-
238
262
  // ── how often an upgrade that failed may be attempted again ──────────────────
239
263
  //
240
264
  // Reported from a terminal that had been left alone: the same version, the same
@@ -324,6 +348,43 @@ export function upgradeRefusalText({ reason, waitMs = 0, attempt = 0, dash = "
324
348
  return `${what} failed to fetch a moment ago ${dash} waiting ${left} before trying again`;
325
349
  }
326
350
 
351
+ /** Drop the two flags launchNpx sets itself. `--port` takes a value, and both
352
+ * spellings npm's parser accepts (`--port 4317`, `--port=4317`) have to go.
353
+ * launchNpx appends its own two after what this leaves of the user's argv. */
354
+ export function withoutPortAndOpen(args) {
355
+ const out = [];
356
+ for (let i = 0; i < args.length; i++) {
357
+ const a = args[i];
358
+ if (a === "--no-open") continue;
359
+ if (a === "--port") { i++; continue; } // and its value
360
+ if (a.startsWith("--port=")) continue;
361
+ out.push(a);
362
+ }
363
+ return out;
364
+ }
365
+
366
+ /** The worker's command line: the script and the user's own argv, and on a
367
+ * respawn the port the last worker actually bound. Appended last so it wins:
368
+ * the worker's parser keeps the final --port. */
369
+ export function workerArgs(worker, argv, { respawn = false, boundPort = null } = {}) {
370
+ const args = [worker, ...argv];
371
+ if (respawn && boundPort != null) args.push("--port", String(boundPort));
372
+ return args;
373
+ }
374
+
375
+ /** npx's command line for an upgrade: the spec, then the user's argv with the
376
+ * two flags this sets itself taken out. Ours are appended, so the originals
377
+ * are dropped rather than left to be overridden — `--port 4317 --no-open
378
+ * --port 4317 --no-open` works, but it is what the next person reads in `ps`. */
379
+ export function npxRelaunchArgs(spec, argv, boundPort = null) {
380
+ const args = ["-y", spec, ...withoutPortAndOpen(argv)];
381
+ if (boundPort != null) args.push("--port", String(boundPort));
382
+ // The tab that asked for this is open and reconnecting; a second one would be
383
+ // the deck talking over itself.
384
+ args.push("--no-open");
385
+ return args;
386
+ }
387
+
327
388
  /**
328
389
  * Die when the process that started this one does — on all three operating
329
390
  * systems (#702).