frizz-server 0.14.2 → 0.14.4

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 (93) hide show
  1. package/dist/claude-agent-broker.js +13199 -13046
  2. package/dist/dev-child.js +80 -39
  3. package/package.json +1 -1
  4. package/web-dist/assets/{TerminalPane-ftTy20h9.js → TerminalPane-BbBcnZ23.js} +2 -2
  5. package/web-dist/assets/{abnfDiagram-VRR7QNED-DPYIADCF.js → abnfDiagram-VRR7QNED-B7Q1MCaG.js} +1 -1
  6. package/web-dist/assets/architecture-TIHT7OUA-CQ5OsBvt.js +1 -0
  7. package/web-dist/assets/{architectureDiagram-ZJ3FMSHR-CslwHJ59.js → architectureDiagram-ZJ3FMSHR-U_o3HwKX.js} +1 -1
  8. package/web-dist/assets/{blockDiagram-677ZJIJ3-C_YKDTK3.js → blockDiagram-677ZJIJ3-BVtitIzJ.js} +1 -1
  9. package/web-dist/assets/{c4Diagram-LMCZKHZV-CN2XoHEM.js → c4Diagram-LMCZKHZV-BS7Qpf8q.js} +1 -1
  10. package/web-dist/assets/channel-C8c70Euw.js +1 -0
  11. package/web-dist/assets/{chunk-32BRIVSS-CqQFWcuW.js → chunk-32BRIVSS-Cvq2fN6D.js} +1 -1
  12. package/web-dist/assets/{chunk-52WLFC77-DIA4ep-j.js → chunk-52WLFC77-VeXenKTG.js} +1 -1
  13. package/web-dist/assets/{chunk-C7G6YPKG-uYEufieL.js → chunk-C7G6YPKG-FJMI15e9.js} +1 -1
  14. package/web-dist/assets/{chunk-EX3LRPZG-Ctuj9M07.js → chunk-EX3LRPZG-zxGy4vd7.js} +1 -1
  15. package/web-dist/assets/{chunk-FWX5IMBZ-BSeGDrvG.js → chunk-FWX5IMBZ-wyhG39cd.js} +2 -2
  16. package/web-dist/assets/{chunk-HOUHSVGY-DFtB1XOE.js → chunk-HOUHSVGY-CzgfjFo5.js} +1 -1
  17. package/web-dist/assets/{chunk-ICXQ74PX-DvvNMH3B.js → chunk-ICXQ74PX-zI2FTOFt.js} +1 -1
  18. package/web-dist/assets/{chunk-MOJQB5TN-blCgZYTp.js → chunk-MOJQB5TN-BDoDmaWa.js} +1 -1
  19. package/web-dist/assets/{chunk-OGEWGWER-DiKWBhls.js → chunk-OGEWGWER-SslhMwtr.js} +1 -1
  20. package/web-dist/assets/{chunk-PUDLZKDR-CEZ-LRny.js → chunk-PUDLZKDR-GGjXXaFh.js} +1 -1
  21. package/web-dist/assets/{chunk-Q4XR5HBZ-BO1Y_Z4a.js → chunk-Q4XR5HBZ-BTPa3B0G.js} +1 -1
  22. package/web-dist/assets/{chunk-V7JOEXUC-ouWDihRg.js → chunk-V7JOEXUC-D6G1XcaO.js} +1 -1
  23. package/web-dist/assets/{chunk-VAUOI2AC-DCCN8ceH.js → chunk-VAUOI2AC-B5V7_Y8l.js} +1 -1
  24. package/web-dist/assets/{chunk-VR4S4FIN-D8VxxNLW.js → chunk-VR4S4FIN-DsGWvDSG.js} +1 -1
  25. package/web-dist/assets/{chunk-WYO6CB5R-_B7FSzZM.js → chunk-WYO6CB5R-BY_8sfg6.js} +1 -1
  26. package/web-dist/assets/{chunk-ZGVPDNZ5-BErRylCv.js → chunk-ZGVPDNZ5-BBoYc_fe.js} +1 -1
  27. package/web-dist/assets/classDiagram-OUVF2IWQ-yefBxIWV.js +1 -0
  28. package/web-dist/assets/classDiagram-v2-EOCWNBFH-yefBxIWV.js +1 -0
  29. package/web-dist/assets/{cynefin-VYW2F7L2-CgH8n1RK.js → cynefin-VYW2F7L2-CPup9cZx.js} +1 -1
  30. package/web-dist/assets/{cynefinDiagram-TSTJHNR4-Cp3iB5ig.js → cynefinDiagram-TSTJHNR4-Cl3irVoi.js} +1 -1
  31. package/web-dist/assets/{dagre-VKFMJZFB-DEJ5M2UQ.js → dagre-VKFMJZFB-CaVEsVrh.js} +1 -1
  32. package/web-dist/assets/{diagram-FQU43EPY-B7TBBYyA.js → diagram-FQU43EPY-DPf7R028.js} +1 -1
  33. package/web-dist/assets/{diagram-G47NLZAW-Djy0qteu.js → diagram-G47NLZAW-BeOq2gOT.js} +1 -1
  34. package/web-dist/assets/{diagram-NH7WQ7WH-C7ASxlCE.js → diagram-NH7WQ7WH-DW39nAyh.js} +1 -1
  35. package/web-dist/assets/{diagram-OA4YK3LP-DQs7Hn4c.js → diagram-OA4YK3LP-DSRy0QBE.js} +1 -1
  36. package/web-dist/assets/{diagram-WEI45ONY-DvjYq10q.js → diagram-WEI45ONY-DBZZ9-gh.js} +1 -1
  37. package/web-dist/assets/{ebnfDiagram-CCIWWBDH-D5dvO41S.js → ebnfDiagram-CCIWWBDH-BQhqbJ08.js} +1 -1
  38. package/web-dist/assets/{erDiagram-Q63AITRT-DGMDAMz2.js → erDiagram-Q63AITRT-YWFordnS.js} +1 -1
  39. package/web-dist/assets/eventmodeling-45OFAUF4-h7nF91S2.js +1 -0
  40. package/web-dist/assets/flowDiagram-23GEKE2U-DLwDjSwL.js +1 -0
  41. package/web-dist/assets/{ganttDiagram-NO4QXBWP-DE4sBbug.js → ganttDiagram-NO4QXBWP-C69Iv5AR.js} +1 -1
  42. package/web-dist/assets/{gitGraph-TEB2WS4Q-6iwymAqh.js → gitGraph-TEB2WS4Q-CrilrtQw.js} +1 -1
  43. package/web-dist/assets/{gitGraphDiagram-IHSO6WYX-B8M8HMMa.js → gitGraphDiagram-IHSO6WYX-DJx5Bqry.js} +1 -1
  44. package/web-dist/assets/index-BfUUFLv7.js +319 -0
  45. package/web-dist/assets/index-D956g6KI.css +1 -0
  46. package/web-dist/assets/{info-DKCQHKI2-D1rdRKv2.js → info-DKCQHKI2-CJW0Ce93.js} +1 -1
  47. package/web-dist/assets/{infoDiagram-FWYZ7A6U-DfXxAWG-.js → infoDiagram-FWYZ7A6U-BOWnq2zW.js} +1 -1
  48. package/web-dist/assets/{ishikawaDiagram-FXEZZL3T-C6huyjB4.js → ishikawaDiagram-FXEZZL3T-Biglx1ys.js} +1 -1
  49. package/web-dist/assets/{journeyDiagram-5HDEW3XC-Cz0dAdxo.js → journeyDiagram-5HDEW3XC-k3enathS.js} +1 -1
  50. package/web-dist/assets/{kanban-definition-HUTT4EX6-CnOJ2JGq.js → kanban-definition-HUTT4EX6-D8GEpRw0.js} +1 -1
  51. package/web-dist/assets/{line-BsyJpb4L.js → line-CHe_pa_l.js} +1 -1
  52. package/web-dist/assets/{mermaid-parser.core-B2YDnnfc.js → mermaid-parser.core-xAuEpTpK.js} +3 -3
  53. package/web-dist/assets/{mermaid.core-DZmxOzX_.js → mermaid.core-Cblk2suU.js} +3 -3
  54. package/web-dist/assets/{mindmap-definition-LN4V7U3C-C-cB8iLg.js → mindmap-definition-LN4V7U3C-zu5mHxT1.js} +1 -1
  55. package/web-dist/assets/{packet-7NZHBO7P-ByYSVaHA.js → packet-7NZHBO7P-BzmJzZyb.js} +1 -1
  56. package/web-dist/assets/{pegDiagram-2B236MQR-CiIbvo6V.js → pegDiagram-2B236MQR-NnlukGZG.js} +1 -1
  57. package/web-dist/assets/{pie-RZYD4A2V-DT0L5Lbg.js → pie-RZYD4A2V-BSxCIj_U.js} +1 -1
  58. package/web-dist/assets/{pieDiagram-ENE6RG2P-BpX1rkMn.js → pieDiagram-ENE6RG2P-DsDCAaSf.js} +1 -1
  59. package/web-dist/assets/{quadrantDiagram-ABIIQ3AL-Bl6eITpX.js → quadrantDiagram-ABIIQ3AL-Cs8GeNtT.js} +1 -1
  60. package/web-dist/assets/{radar-I7S5WNFK-Dc5znSZ_.js → radar-I7S5WNFK-CWwe4R07.js} +1 -1
  61. package/web-dist/assets/{railroad-3IZDKUUU-Ho4iVXCL.js → railroad-3IZDKUUU-D9VKEiaV.js} +1 -1
  62. package/web-dist/assets/railroad-abnf-AHOZXSZD-CtJSUXbE.js +1 -0
  63. package/web-dist/assets/railroad-ebnf-EBAXGLYW-Yc0BdBdp.js +1 -0
  64. package/web-dist/assets/railroad-peg-LSFZ7HO6-Dp0P5Iq6.js +1 -0
  65. package/web-dist/assets/{railroadDiagram-RFXS5EU6-D5afWytG.js → railroadDiagram-RFXS5EU6-BawT2JlG.js} +1 -1
  66. package/web-dist/assets/{requirementDiagram-TGXJPOKE-0L5V-_bC.js → requirementDiagram-TGXJPOKE-XDHPtPfx.js} +1 -1
  67. package/web-dist/assets/{sankeyDiagram-HTMAVEWB-CH-xRkM4.js → sankeyDiagram-HTMAVEWB-dSowfEdK.js} +1 -1
  68. package/web-dist/assets/{sequenceDiagram-DBY2YBRQ-CMUPviAU.js → sequenceDiagram-DBY2YBRQ-C__EROVn.js} +1 -1
  69. package/web-dist/assets/{stateDiagram-2N3HPSRC-ayE6u0KZ.js → stateDiagram-2N3HPSRC-Cg1Nddpd.js} +1 -1
  70. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-QKgumchx.js +1 -0
  71. package/web-dist/assets/{swimlanes-5IMT3BWC-BggKIJzJ.js → swimlanes-5IMT3BWC-DKmvUdu_.js} +1 -1
  72. package/web-dist/assets/swimlanesDiagram-G3AALYLV-BSZ6jqLy.js +8 -0
  73. package/web-dist/assets/{timeline-definition-FHXFAJF6-B4mcBscv.js → timeline-definition-FHXFAJF6-DL8d36QS.js} +1 -1
  74. package/web-dist/assets/{treeView-QDETBFTQ-DAH6PHIx.js → treeView-QDETBFTQ-BwIXzEk2.js} +1 -1
  75. package/web-dist/assets/{treemap-6X3UGDF4-CUipyr2w.js → treemap-6X3UGDF4-Cduo02Iv.js} +1 -1
  76. package/web-dist/assets/{vennDiagram-L72KCM5P-CuKqAm0J.js → vennDiagram-L72KCM5P-DPgx-kOV.js} +1 -1
  77. package/web-dist/assets/{wardley-OPB4EBWU-D5Wfkjy9.js → wardley-OPB4EBWU-uOXCOFG6.js} +1 -1
  78. package/web-dist/assets/{wardleyDiagram-EHGQE667-M5MDAf53.js → wardleyDiagram-EHGQE667-DuqFuXjY.js} +1 -1
  79. package/web-dist/assets/{xychartDiagram-FW5EYKEG-BaSJmtNq.js → xychartDiagram-FW5EYKEG-BI6-eymd.js} +1 -1
  80. package/web-dist/index.html +16 -10
  81. package/web-dist/assets/architecture-TIHT7OUA-C4ce4EvA.js +0 -1
  82. package/web-dist/assets/channel-46DdEyrY.js +0 -1
  83. package/web-dist/assets/classDiagram-OUVF2IWQ-BvKONN2o.js +0 -1
  84. package/web-dist/assets/classDiagram-v2-EOCWNBFH-BvKONN2o.js +0 -1
  85. package/web-dist/assets/eventmodeling-45OFAUF4-eNNW0zlr.js +0 -1
  86. package/web-dist/assets/flowDiagram-23GEKE2U-C5RJ-lqT.js +0 -1
  87. package/web-dist/assets/index-C-jkL60P.js +0 -319
  88. package/web-dist/assets/index-D0gz-Bx-.css +0 -1
  89. package/web-dist/assets/railroad-abnf-AHOZXSZD-JkQWwE17.js +0 -1
  90. package/web-dist/assets/railroad-ebnf-EBAXGLYW-grVU10Bk.js +0 -1
  91. package/web-dist/assets/railroad-peg-LSFZ7HO6-BTqoHLa0.js +0 -1
  92. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-DAjtM6iw.js +0 -1
  93. package/web-dist/assets/swimlanesDiagram-G3AALYLV-BS0jxTx_.js +0 -8
package/dist/dev-child.js CHANGED
@@ -14086,7 +14086,7 @@ var init_src = __esm({
14086
14086
  };
14087
14087
  AWAITING_HINT_MAX = 8;
14088
14088
  AWAITING_HINT_VALUE_MAX = 200;
14089
- AWAITING_TITLE_MAX = 40;
14089
+ AWAITING_TITLE_MAX = 120;
14090
14090
  AWAITING_ITEM_KINDS = ["shell", "agent", "timer", "pr", "issue"];
14091
14091
  AWAITING_DURATION_RE = /^(\d{1,5})(s|m|h|d)$/;
14092
14092
  DURATION_UNIT_MS = { s: 1e3, m: 6e4, h: 36e5, d: 864e5 };
@@ -14935,13 +14935,13 @@ var init_src = __esm({
14935
14935
  * to, not furniture you sit beside. Hidden, the way back is a breadcrumb in the status bar, which
14936
14936
  * costs a click exactly when you meant to switch and nothing when you did not.
14937
14937
  *
14938
- * Machine-level, like the font: which chrome you want is a property of the person, not the repo.
14938
+ * Machine-level: which chrome you want is a property of the person, not the repo.
14939
14939
  */
14940
14940
  projectRail: external_exports.boolean(),
14941
- // UI type family. `mono` (default) is the mono-forward system; `sans` swaps prose/UI chrome to a
14942
- // sans stack while code / tool lines / the terminal stay mono. Optional so an old settings blob
14943
- // parses; defaultSettings pins "mono".
14944
- font: external_exports.enum(["mono", "sans"]).optional(),
14941
+ // There is no `font` key any more. The interface rendered in one of two type families as a machine
14942
+ // setting until 2026-09-19 (maintainer: "let's drop monospace as an option"); every surface is sans
14943
+ // now, and index.html pins `data-font="sans"` on <html> directly. Settings is a non-strict object,
14944
+ // so a stored `font` is stripped the moment an old blob parses — no migration.
14945
14945
  // Default action for a vetted non-image local path in agent markdown. Image clicks always use the
14946
14946
  // OS default viewer so screenshots retain their expected behavior.
14947
14947
  localFileOpener: LocalFileOpener.optional(),
@@ -20911,7 +20911,7 @@ var init_settings = __esm({
20911
20911
  init_frizz_paths();
20912
20912
  init_machine_config();
20913
20913
  SETTINGS_KEY = "settings";
20914
- MACHINE_KEYS = ["font", "notifications", "localFileOpener", "projectRail"];
20914
+ MACHINE_KEYS = ["notifications", "localFileOpener", "projectRail"];
20915
20915
  MachineSettingsRecord = Settings.partial();
20916
20916
  defaultSettings = () => ({
20917
20917
  // `bypassPermissions` = claude's --dangerously-skip-permissions: a headless worker never stops on an
@@ -20924,7 +20924,6 @@ var init_settings = __esm({
20924
20924
  model: void 0,
20925
20925
  effort: void 0,
20926
20926
  notifications: true,
20927
- font: "sans",
20928
20927
  localFileOpener: "system",
20929
20928
  // 500K tokens: half the 1M window every Claude worker is dispatched with. See the schema for why a
20930
20929
  // worker left to compact at 1M is the biggest single reason a Frizz thread out-spends the TUI.
@@ -31252,6 +31251,11 @@ function parseClaudeUsage(body, planType) {
31252
31251
  if (windows.length === 0) return { status: "unavailable", windows: [], detail: "No usage windows reported" };
31253
31252
  return { status: "ok", planType, windows };
31254
31253
  }
31254
+ function retryAtFrom(res, now) {
31255
+ const seconds = Number(res.headers.get("retry-after"));
31256
+ const backoff = Number.isFinite(seconds) && seconds > 0 ? seconds * 1e3 : RATE_LIMIT_DEFAULT_BACKOFF_MS;
31257
+ return now + Math.min(backoff, RATE_LIMIT_MAX_BACKOFF_MS);
31258
+ }
31255
31259
  function cachePaths(cacheDir, configDir) {
31256
31260
  const profile = createHash9("sha256").update(configDir).digest("hex").slice(0, 12);
31257
31261
  return {
@@ -31340,10 +31344,10 @@ async function refreshQuota(claudeBin, deps, now) {
31340
31344
  const quota2 = parseClaudeUsage(body, planType);
31341
31345
  if (quota2.status === "ok") return quota2;
31342
31346
  } else if (res.status === 429 || res.status === 529) {
31343
- throw new Error(`Usage endpoint ${res.status}`);
31347
+ throw new UsageRateLimited(res.status, retryAtFrom(res, now));
31344
31348
  }
31345
31349
  } catch (err) {
31346
- if (err instanceof Error && /^Usage endpoint (429|529)$/.test(err.message)) throw err;
31350
+ if (err instanceof UsageRateLimited) throw err;
31347
31351
  }
31348
31352
  }
31349
31353
  const quota = parseClaudeUsageOutput(await (deps.execUsage ?? runClaudeUsage)(claudeBin), now);
@@ -31433,14 +31437,30 @@ async function tryAcquireLock2(path3) {
31433
31437
  }
31434
31438
  return void 0;
31435
31439
  }
31440
+ function rateLimited(shared, now) {
31441
+ return shared?.retryAt !== void 0 && now < shared.retryAt;
31442
+ }
31443
+ function serveRateLimited(shared, now) {
31444
+ if (shared.quota.status !== "ok" || now - shared.at >= STALE_MAX_AGE_MS) return UNAVAILABLE;
31445
+ const minutes = (ms, round) => Math.max(1, round(ms / 6e4));
31446
+ return {
31447
+ ...shared.quota,
31448
+ detail: `Next refresh in ${minutes(shared.retryAt - now, Math.ceil)}m \xB7 last updated ${minutes(now - shared.at, Math.round)}m ago`
31449
+ };
31450
+ }
31436
31451
  function refreshSharedInBackground(paths, claudeBin, deps, now) {
31437
31452
  if (backgroundRefreshes.has(paths.data)) return;
31438
31453
  const task = (async () => {
31454
+ if (rateLimited(await readShared(paths.data), now)) return;
31439
31455
  const release = await tryAcquireLock2(paths.lock);
31440
31456
  if (!release) return;
31441
31457
  try {
31442
31458
  const quota = await refreshQuota(claudeBin, deps, now);
31443
31459
  await writeShared(paths.data, { at: now, quota });
31460
+ } catch (err) {
31461
+ if (!(err instanceof UsageRateLimited)) throw err;
31462
+ const current = await readShared(paths.data);
31463
+ await writeShared(paths.data, { ...current ?? { at: now, quota: UNAVAILABLE }, retryAt: err.retryAt });
31444
31464
  } finally {
31445
31465
  await release().catch(() => {
31446
31466
  });
@@ -31458,7 +31478,10 @@ async function refreshClaudeQuotaInBackground(claudeBin = "claude", deps = {}) {
31458
31478
  } catch {
31459
31479
  return;
31460
31480
  }
31461
- refreshSharedInBackground(cachePaths(cacheDir, configDir), claudeBin, deps, now);
31481
+ const paths = cachePaths(cacheDir, configDir);
31482
+ const current = await readShared(paths.data);
31483
+ if (current?.quota.status === "ok" && now - current.at < OK_TTL_MS) return;
31484
+ refreshSharedInBackground(paths, claudeBin, deps, now);
31462
31485
  }
31463
31486
  async function readClaudeQuota(claudeBin = "claude", deps = {}, options = {}) {
31464
31487
  const now = (deps.now ?? Date.now)();
@@ -31481,36 +31504,44 @@ async function readClaudeQuota(claudeBin = "claude", deps = {}, options = {}) {
31481
31504
  if (!options.force && initial?.quota.status === "ok" && now - initial.at < STALE_MAX_AGE_MS) {
31482
31505
  refreshSharedInBackground(paths, claudeBin, deps, now);
31483
31506
  const ageMs = now - initial.at;
31507
+ if (ageMs >= 10 * 6e4 && rateLimited(initial, now)) return serveRateLimited(initial, now);
31484
31508
  if (ageMs < 10 * 6e4) return initial.quota;
31485
31509
  return { ...initial.quota, detail: `Refreshing \xB7 last updated ${Math.round(ageMs / 6e4)}m ago` };
31486
31510
  }
31511
+ if (rateLimited(initial, now)) return serveRateLimited(initial, now);
31487
31512
  let release;
31488
31513
  try {
31489
31514
  release = await acquireLock(paths.lock);
31490
31515
  const afterLock = await readShared(paths.data);
31516
+ if (rateLimited(afterLock, now)) return serveRateLimited(afterLock, now);
31491
31517
  if (afterLock && afterLock.at !== initial?.at && now - afterLock.at < OK_TTL_MS) return afterLock.quota;
31492
31518
  const quota = await refreshQuota(claudeBin, deps, now);
31493
31519
  await writeShared(paths.data, { at: now, quota }).catch(() => {
31494
31520
  });
31495
31521
  return quota;
31496
- } catch {
31522
+ } catch (err) {
31497
31523
  const fallback = await readShared(paths.data);
31524
+ if (err instanceof UsageRateLimited) {
31525
+ const refused = { ...fallback ?? { at: now, quota: UNAVAILABLE }, retryAt: err.retryAt };
31526
+ await writeShared(paths.data, refused).catch(() => {
31527
+ });
31528
+ return serveRateLimited(refused, now);
31529
+ }
31498
31530
  if (fallback?.quota.status === "ok" && now - fallback.at < STALE_MAX_AGE_MS) {
31499
31531
  return {
31500
31532
  ...fallback.quota,
31501
31533
  detail: `Could not refresh \xB7 last updated ${Math.max(1, Math.round((now - fallback.at) / 6e4))}m ago`
31502
31534
  };
31503
31535
  }
31504
- const unavailable = { status: "unavailable", windows: [], detail: "Claude Code usage unavailable" };
31505
- await writeShared(paths.data, { at: now, quota: unavailable }).catch(() => {
31536
+ await writeShared(paths.data, { at: now, quota: UNAVAILABLE }).catch(() => {
31506
31537
  });
31507
- return unavailable;
31538
+ return UNAVAILABLE;
31508
31539
  } finally {
31509
31540
  await release?.().catch(() => {
31510
31541
  });
31511
31542
  }
31512
31543
  }
31513
- var execFileAsync2, USAGE_URL, OAUTH_BETA, USER_AGENT, ENDPOINT_TIMEOUT_MS, OK_TTL_MS, FAIL_TTL_MS, STALE_MAX_AGE_MS, CLI_TIMEOUT_MS, LOCK_STALE_MS, LOCK_WAIT_MS, LOCK_POLL_MS2, LINE_WINDOWS, MONTH_INDEX, backgroundRefreshes;
31544
+ var execFileAsync2, USAGE_URL, OAUTH_BETA, USER_AGENT, ENDPOINT_TIMEOUT_MS, OK_TTL_MS, FAIL_TTL_MS, STALE_MAX_AGE_MS, CLI_TIMEOUT_MS, LOCK_STALE_MS, LOCK_WAIT_MS, LOCK_POLL_MS2, RATE_LIMIT_DEFAULT_BACKOFF_MS, RATE_LIMIT_MAX_BACKOFF_MS, UsageRateLimited, LINE_WINDOWS, MONTH_INDEX, UNAVAILABLE, backgroundRefreshes;
31514
31545
  var init_claude_quota = __esm({
31515
31546
  "packages/server/src/backend/claude-quota.ts"() {
31516
31547
  "use strict";
@@ -31528,6 +31559,14 @@ var init_claude_quota = __esm({
31528
31559
  LOCK_STALE_MS = 4e4;
31529
31560
  LOCK_WAIT_MS = 15e3;
31530
31561
  LOCK_POLL_MS2 = 50;
31562
+ RATE_LIMIT_DEFAULT_BACKOFF_MS = 5 * 6e4;
31563
+ RATE_LIMIT_MAX_BACKOFF_MS = 60 * 6e4;
31564
+ UsageRateLimited = class extends Error {
31565
+ constructor(status, retryAt) {
31566
+ super(`Usage endpoint ${status}`);
31567
+ this.retryAt = retryAt;
31568
+ }
31569
+ };
31531
31570
  LINE_WINDOWS = [
31532
31571
  [/^Current session$/i, "5h", "5h"],
31533
31572
  [/^Current week \(all models\)$/i, "weekly", "Weekly"],
@@ -31548,6 +31587,7 @@ var init_claude_quota = __esm({
31548
31587
  nov: 10,
31549
31588
  dec: 11
31550
31589
  };
31590
+ UNAVAILABLE = { status: "unavailable", windows: [], detail: "Claude Code usage unavailable" };
31551
31591
  backgroundRefreshes = /* @__PURE__ */ new Map();
31552
31592
  }
31553
31593
  });
@@ -36045,9 +36085,11 @@ exactly ONE of them.
36045
36085
  until somebody notices. Long is free \u2014 real activity wakes you the moment it lands either way, and
36046
36086
  the human snoozes or archives the thread when they want it gone. Hours are for a PR you control and
36047
36087
  a check you expect to settle today.
36048
- - \`title:\` \u2014 OPTIONAL, the card's heading: **40 characters or fewer**, sentence case, naming THIS
36049
- wait ("Fork-CI approval", "Nightly bench, arm 3 of 3"); longer is trimmed on a word boundary.
36050
- Without it the card is headed "Awaiting", which is true of every park and specific to none.
36088
+ - \`title:\` \u2014 OPTIONAL, the card's heading: a short phrase in sentence case naming THIS wait
36089
+ ("Fork-CI approval", "Nightly bench, arm 3 of 3", "Spread ask and soundness issue on two TypeScript
36090
+ issues"). It wraps, so name the wait fully; a HEADING, though, not the handoff \u2014 past 120
36091
+ characters it is trimmed on a word boundary. Without it the card is headed "Awaiting", which is
36092
+ true of every park and specific to none.
36051
36093
  - **REGISTERING IS NOT PARKING, AND PARKING IS NOT REGISTERING.** Your shells, sub-agents, timers
36052
36094
  and PR watchers are watched AUTOMATICALLY, fence or no fence \u2014 frizz wakes you when one finishes,
36053
36095
  every time. The fence only declares that you have STOPPED, and names which of them you stopped
@@ -36569,10 +36611,11 @@ When delegation is explicitly authorized:
36569
36611
  - \`gpt-5.6-luna\` + \`medium\` or \`gpt-5.6-terra\` + \`medium\` for fully specified mechanical QA,
36570
36612
  documentation, straightforward tests, and exact collection or edits.
36571
36613
  - \`gpt-5.6-terra\` + \`high\` only after observed cross-layer or concurrency ambiguity.
36572
- - \`gpt-6-astra\` + \`high\` or \`xhigh\` (or \`gpt-5.6-sol\` when Astra is absent from the live
36573
- model catalog) only for evidenced high-risk runtime, persistence, process-control,
36574
- provider-protocol, or complex-concurrency work. Before any Astra, Sol or xhigh spawn, state the
36575
- observed evidence, the specific risk/ambiguity, and why Terra + medium is inadequate.
36614
+ - \`gpt-6-astra\` + \`high\` or \`xhigh\` (or \`gpt-6-sol\`, then \`gpt-5.6-sol\`, when the one above it
36615
+ is absent from the live model catalog) only for evidenced high-risk runtime, persistence,
36616
+ process-control, provider-protocol, or complex-concurrency work.
36617
+ Before any Astra, Sol or xhigh spawn, state the observed evidence, the specific risk/ambiguity,
36618
+ and why Terra + medium is inadequate.
36576
36619
 
36577
36620
  ## Automated waits in Codex
36578
36621
 
@@ -38716,18 +38759,12 @@ function hasDeclaredWait(tele, nowMs, armedTimerIds = /* @__PURE__ */ new Set(),
38716
38759
  if (hasParkedTimerWatch(tele, armedTimerIds)) return true;
38717
38760
  return (tele?.subAgents ?? []).some((a) => isDirectSubAgent(a) && a.state === "running");
38718
38761
  }
38719
- function heldByRunningChecks(tele, github, registered) {
38720
- if (tele?.lastFence?.kind !== "awaiting") return false;
38721
- const refs = [];
38722
- for (const hint of tele.lastFence.hints) {
38723
- if (hint.kind !== "pr") continue;
38724
- const ref = parsePrRef(hint.value);
38725
- if (ref && registered.has(githubStatusKey(ref))) refs.push(githubStatusKey(ref));
38726
- }
38727
- if (refs.length === 0) return false;
38728
- return refs.every((key) => {
38762
+ function heldByRunningChecks(github, registered) {
38763
+ if (registered.size === 0) return false;
38764
+ return [...registered].every((key) => {
38729
38765
  const status = github[key];
38730
- return status?.checks === "running" && status.state === "open";
38766
+ if (!status || status.checks !== "running" || status.state !== "open") return false;
38767
+ return !(status.running === 0 && (status.gated ?? 0) > 0);
38731
38768
  });
38732
38769
  }
38733
38770
  function hasLiveOwnWork(tele, registeredPrWatches) {
@@ -38828,7 +38865,7 @@ function deriveNeedsYou(row, tele, runtime, hasActionableInteraction = false, no
38828
38865
  if (hasParkedExternalWait(tele, nowMs)) return false;
38829
38866
  if (excuseLiveOwnWork && runtime !== "exited" && hasLiveBackgroundWork(tele) && !tele?.lastFence) return false;
38830
38867
  if (excuseLiveOwnWork && runtime !== "exited" && (hasDeclaredBackgroundPark(tele, nowMs) || hasRegisteredBackgroundPark(tele, armedWatches, nowMs))) return false;
38831
- if (excuseLiveOwnWork && runtime !== "exited" && heldByRunningChecks(tele, github, registeredPrWatches)) return false;
38868
+ if (excuseLiveOwnWork && runtime !== "exited" && heldByRunningChecks(github, registeredPrWatches)) return false;
38832
38869
  if (runtime !== "exited" && (hasLiveOwnWork(tele, registeredPrWatches) || hasParkedTimerWatch(tele, armedTimerIds)) && tele?.lastFence?.kind !== "done") return !bgSnoozeArmed(row);
38833
38870
  if (tele?.lastFence?.kind === "done") return true;
38834
38871
  return true;
@@ -44886,7 +44923,7 @@ var init_context = __esm({
44886
44923
  init_logging();
44887
44924
  init_project_launch();
44888
44925
  CONTEXT_STARTUP_CLEANUP_TIMEOUT_MS = 4e3;
44889
- QUOTA_REFRESH_INTERVAL_MS = 2 * 6e4;
44926
+ QUOTA_REFRESH_INTERVAL_MS = 3e4;
44890
44927
  ContextStartupError = class extends Error {
44891
44928
  startupError;
44892
44929
  cleanupError;
@@ -54385,12 +54422,15 @@ a { color: inherit; }
54385
54422
  (() => {
54386
54423
  const notifyHeight = () => parent.postMessage({ type: "frizz-inline-vis-height", height: Math.ceil(document.documentElement.scrollHeight) }, "*");
54387
54424
  addEventListener("message", (event) => {
54388
- if (event.data?.type !== "frizz-inline-vis-theme" || !event.data.vars) return;
54425
+ if (event.source !== parent) return;
54426
+ if (event.data?.type !== "frizz-inline-vis-theme" || !event.data.vars || !Number.isSafeInteger(event.data.requestId)) return;
54389
54427
  for (const [name, value] of Object.entries(event.data.vars)) {
54390
54428
  if (/^--[a-z0-9-]+$/.test(name) && typeof value === "string") document.documentElement.style.setProperty(name, value);
54391
54429
  }
54392
54430
  document.documentElement.style.colorScheme = event.data.colorScheme === "light" ? "light" : "dark";
54393
54431
  requestAnimationFrame(notifyHeight);
54432
+ dispatchEvent(new CustomEvent("frizz-theme-change", { detail: { requestId: event.data.requestId, colorScheme: document.documentElement.style.colorScheme, vars: event.data.vars } }));
54433
+ parent.postMessage({ type: "frizz-inline-vis-applied", requestId: event.data.requestId }, "*");
54394
54434
  });
54395
54435
  window.openai = Object.freeze({
54396
54436
  sendFollowUpMessage: async () => { throw new Error("Follow-up actions are not supported in Frizz visualizations yet"); }
@@ -54398,6 +54438,7 @@ a { color: inherit; }
54398
54438
  addEventListener("DOMContentLoaded", () => {
54399
54439
  new ResizeObserver(notifyHeight).observe(document.body);
54400
54440
  notifyHeight();
54441
+ parent.postMessage({ type: "frizz-inline-vis-ready" }, "*");
54401
54442
  });
54402
54443
  })();
54403
54444
  </script>
@@ -56353,8 +56394,8 @@ var init_runtimes = __esm({
56353
56394
  init_codex_app_server();
56354
56395
  init_frizz_paths();
56355
56396
  init_runtime_lease();
56356
- CLAUDE_AGENT_SDK_VERSION = "0.3.277";
56357
- CLAUDE_CODE_VERSION = "2.1.277";
56397
+ CLAUDE_AGENT_SDK_VERSION = "0.3.280";
56398
+ CLAUDE_CODE_VERSION = "2.1.280";
56358
56399
  CODEX_VERSION = CODEX_APP_SERVER_SUPPORTED_VERSION;
56359
56400
  RUNTIMES_MODE_ENV = "FRIZZ_RUNTIMES";
56360
56401
  RUNTIMES_DIR_ENV = "FRIZZ_RUNTIMES_DIR";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frizz-server",
3
- "version": "0.14.2",
3
+ "version": "0.14.4",
4
4
  "private": false,
5
5
  "description": "Replaceable Frizz server runtime",
6
6
  "license": "MIT",