frizz-server 0.15.20 → 0.15.23

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 (112) hide show
  1. package/dist/claude-agent-broker.js +371 -39
  2. package/dist/dev-child.js +8255 -6173
  3. package/package.json +1 -1
  4. package/runtime/cc-worker/DECISIONS.md +42 -2
  5. package/runtime/cc-worker/bin/frizz-mcp.mjs +11 -1848
  6. package/runtime/cc-worker/bin/frizzctl +14 -0
  7. package/runtime/cc-worker/bin/frizzctl.cmd +9 -0
  8. package/runtime/cc-worker/bin/frizzctl.mjs +438 -0
  9. package/runtime/cc-worker/hooks/agent-dispatch.mjs +2 -2
  10. package/runtime/cc-worker/hooks/deny-ask.mjs +3 -3
  11. package/runtime/cc-worker/hooks/deny-plan.mjs +2 -2
  12. package/runtime/cc-worker/hooks/perm-policy.mjs +52 -1
  13. package/runtime/cc-worker/hooks/scratchpad.mjs +16 -10
  14. package/runtime/cc-worker/hooks/session-seed.mjs +1 -1
  15. package/runtime/cc-worker/lib/frizz-tools.mjs +2241 -0
  16. package/runtime/cc-worker/skills/gh/SKILL.md +6 -6
  17. package/web-dist/assets/{abnfDiagram-VRR7QNED-B61nQEjt.js → abnfDiagram-VRR7QNED-BW_CIF9J.js} +1 -1
  18. package/web-dist/assets/{arc-CR8_qWI3.js → arc-B475yv46.js} +1 -1
  19. package/web-dist/assets/architecture-TIHT7OUA-wAP7tOoN.js +1 -0
  20. package/web-dist/assets/{architectureDiagram-ZJ3FMSHR-6sc4SDOh.js → architectureDiagram-ZJ3FMSHR-DkPvFjFp.js} +1 -1
  21. package/web-dist/assets/{blockDiagram-677ZJIJ3-p-DPTDGB.js → blockDiagram-677ZJIJ3-Rls7Nttu.js} +1 -1
  22. package/web-dist/assets/{c4Diagram-LMCZKHZV-cqvAqZE2.js → c4Diagram-LMCZKHZV-maV0q2bv.js} +1 -1
  23. package/web-dist/assets/channel-Clg0HJPA.js +1 -0
  24. package/web-dist/assets/{chunk-32BRIVSS-BNnoKILR.js → chunk-32BRIVSS-Coi7L0de.js} +1 -1
  25. package/web-dist/assets/{chunk-52WLFC77-BmHIWiVu.js → chunk-52WLFC77-DZaDe-48.js} +1 -1
  26. package/web-dist/assets/{chunk-C7G6YPKG-D7XYFno8.js → chunk-C7G6YPKG-DNQ-JhD9.js} +1 -1
  27. package/web-dist/assets/{chunk-EX3LRPZG-BUViIha7.js → chunk-EX3LRPZG-BQCebwoA.js} +1 -1
  28. package/web-dist/assets/{chunk-FWX5IMBZ-3x5Zky3W.js → chunk-FWX5IMBZ-CqiHtpEB.js} +2 -2
  29. package/web-dist/assets/{chunk-HOUHSVGY-C6_RBSov.js → chunk-HOUHSVGY-Bop69PFg.js} +1 -1
  30. package/web-dist/assets/{chunk-ICXQ74PX-NbVxQ4i1.js → chunk-ICXQ74PX-D3PkeZ6B.js} +1 -1
  31. package/web-dist/assets/{chunk-MOJQB5TN-nRMfcSHe.js → chunk-MOJQB5TN-lidXw8-C.js} +1 -1
  32. package/web-dist/assets/{chunk-OGEWGWER-BbSXfbEB.js → chunk-OGEWGWER-CzD91FAh.js} +1 -1
  33. package/web-dist/assets/{chunk-PUDLZKDR-Byubn9VY.js → chunk-PUDLZKDR-Cilkzvck.js} +1 -1
  34. package/web-dist/assets/{chunk-Q4XR5HBZ-DLq-aZ3t.js → chunk-Q4XR5HBZ-C37UQCfb.js} +1 -1
  35. package/web-dist/assets/{chunk-RYQCIY6F-Dbt66M6V.js → chunk-RYQCIY6F-C0qnX-Ux.js} +1 -1
  36. package/web-dist/assets/{chunk-V7JOEXUC-DNFTmXz6.js → chunk-V7JOEXUC-Da5vOGHX.js} +1 -1
  37. package/web-dist/assets/{chunk-VAUOI2AC-QWrszv3X.js → chunk-VAUOI2AC-FrJadrJY.js} +1 -1
  38. package/web-dist/assets/{chunk-VR4S4FIN-CJdyjwam.js → chunk-VR4S4FIN-DYxK2Z50.js} +1 -1
  39. package/web-dist/assets/{chunk-WYO6CB5R-D_786t-3.js → chunk-WYO6CB5R-C164KTfT.js} +1 -1
  40. package/web-dist/assets/{chunk-XXDRQBXY-Bd_2jBj_.js → chunk-XXDRQBXY-D4wHtxet.js} +1 -1
  41. package/web-dist/assets/{chunk-ZGVPDNZ5-DklPG-LG.js → chunk-ZGVPDNZ5-BXKkVljT.js} +1 -1
  42. package/web-dist/assets/classDiagram-OUVF2IWQ-23bCXfvg.js +1 -0
  43. package/web-dist/assets/classDiagram-v2-EOCWNBFH-23bCXfvg.js +1 -0
  44. package/web-dist/assets/{cose-bilkent-JH36ORCC-C4MtSvEs.js → cose-bilkent-JH36ORCC-BFSgVzNT.js} +1 -1
  45. package/web-dist/assets/{cynefin-VYW2F7L2-Dr0CmMQz.js → cynefin-VYW2F7L2-BSoEbT-s.js} +1 -1
  46. package/web-dist/assets/{cynefinDiagram-TSTJHNR4-BpHXKyDO.js → cynefinDiagram-TSTJHNR4-BBZgLbdX.js} +1 -1
  47. package/web-dist/assets/{dagre-VKFMJZFB-CWAtKn43.js → dagre-VKFMJZFB-Dx6giO7u.js} +1 -1
  48. package/web-dist/assets/{diagram-FQU43EPY-B_6PhpPG.js → diagram-FQU43EPY-BMI3qRca.js} +1 -1
  49. package/web-dist/assets/{diagram-G47NLZAW-DPNrX-3a.js → diagram-G47NLZAW-CJY-MA3L.js} +1 -1
  50. package/web-dist/assets/{diagram-NH7WQ7WH-BL4nqAUm.js → diagram-NH7WQ7WH-CbQVFJ3r.js} +1 -1
  51. package/web-dist/assets/{diagram-OA4YK3LP-CcFbtuCf.js → diagram-OA4YK3LP-CPnrakdY.js} +1 -1
  52. package/web-dist/assets/{diagram-WEI45ONY-Bkl0nXre.js → diagram-WEI45ONY-D9DNwzlo.js} +1 -1
  53. package/web-dist/assets/{dist-krVNNn4H.js → dist-CO93_xVa.js} +1 -1
  54. package/web-dist/assets/{ebnfDiagram-CCIWWBDH-C_51YQqw.js → ebnfDiagram-CCIWWBDH-DNHudB8r.js} +1 -1
  55. package/web-dist/assets/{erDiagram-Q63AITRT-D8oBhiQB.js → erDiagram-Q63AITRT-Cwt63Xz8.js} +1 -1
  56. package/web-dist/assets/eventmodeling-45OFAUF4-Q3Nq1ecc.js +1 -0
  57. package/web-dist/assets/flowDiagram-23GEKE2U-B2snV3ot.js +1 -0
  58. package/web-dist/assets/{ganttDiagram-NO4QXBWP-BOJJvkcQ.js → ganttDiagram-NO4QXBWP-DiFpSJc2.js} +1 -1
  59. package/web-dist/assets/{gitGraph-TEB2WS4Q-DrZGs6X0.js → gitGraph-TEB2WS4Q-2-hTvDOu.js} +1 -1
  60. package/web-dist/assets/{gitGraphDiagram-IHSO6WYX-C0pqDVhD.js → gitGraphDiagram-IHSO6WYX-mbc4Il71.js} +1 -1
  61. package/web-dist/assets/index-C6AXnNpg.css +2 -0
  62. package/web-dist/assets/index-DewBdeY0.js +352 -0
  63. package/web-dist/assets/{info-DKCQHKI2-0OcIuVxc.js → info-DKCQHKI2-BO0ZUEnn.js} +1 -1
  64. package/web-dist/assets/{infoDiagram-FWYZ7A6U-CRAc-N7_.js → infoDiagram-FWYZ7A6U-Cn3DmnjS.js} +1 -1
  65. package/web-dist/assets/{ishikawaDiagram-FXEZZL3T-D_bHCCxh.js → ishikawaDiagram-FXEZZL3T-Ckwh42aC.js} +1 -1
  66. package/web-dist/assets/{journeyDiagram-5HDEW3XC-Dbvh7D1e.js → journeyDiagram-5HDEW3XC-D26ySLLD.js} +1 -1
  67. package/web-dist/assets/{kanban-definition-HUTT4EX6-CxOWhFpB.js → kanban-definition-HUTT4EX6-CXKwXGxe.js} +1 -1
  68. package/web-dist/assets/{line-BGqbhtvK.js → line-BHqhqZTw.js} +1 -1
  69. package/web-dist/assets/{linear-DRvKJ3WJ.js → linear-Xq8ICqCe.js} +1 -1
  70. package/web-dist/assets/{mermaid-parser.core-C5lIBam8.js → mermaid-parser.core-ByagDKoG.js} +3 -3
  71. package/web-dist/assets/{mermaid.core-ChLUqNEE.js → mermaid.core-CEwbkqrb.js} +3 -3
  72. package/web-dist/assets/{mindmap-definition-LN4V7U3C-BfPv_GOf.js → mindmap-definition-LN4V7U3C-C3S3nEo5.js} +1 -1
  73. package/web-dist/assets/{packet-7NZHBO7P-CH3B2i7_.js → packet-7NZHBO7P-BjcgqWf7.js} +1 -1
  74. package/web-dist/assets/{pegDiagram-2B236MQR-DLuCHUaK.js → pegDiagram-2B236MQR-Due7wPzY.js} +1 -1
  75. package/web-dist/assets/{pie-RZYD4A2V-C-hDlp0h.js → pie-RZYD4A2V-C1X-Fm2K.js} +1 -1
  76. package/web-dist/assets/{pieDiagram-ENE6RG2P-CKVu3PTC.js → pieDiagram-ENE6RG2P-CbKS5jFv.js} +1 -1
  77. package/web-dist/assets/{quadrantDiagram-ABIIQ3AL--tZ3JdyA.js → quadrantDiagram-ABIIQ3AL-CVF1CNNO.js} +1 -1
  78. package/web-dist/assets/{radar-I7S5WNFK-C10EMwWx.js → radar-I7S5WNFK-Co7Otr5p.js} +1 -1
  79. package/web-dist/assets/{railroad-3IZDKUUU-BYegvtJS.js → railroad-3IZDKUUU-BTwZqHtN.js} +1 -1
  80. package/web-dist/assets/railroad-abnf-AHOZXSZD-CEkmgARz.js +1 -0
  81. package/web-dist/assets/railroad-ebnf-EBAXGLYW-D2dXzrFd.js +1 -0
  82. package/web-dist/assets/railroad-peg-LSFZ7HO6-yA2XVaxN.js +1 -0
  83. package/web-dist/assets/{railroadDiagram-RFXS5EU6-CfpRdkA8.js → railroadDiagram-RFXS5EU6-DCymlvVU.js} +1 -1
  84. package/web-dist/assets/{requirementDiagram-TGXJPOKE-CUajgDbc.js → requirementDiagram-TGXJPOKE-CEFbAu30.js} +1 -1
  85. package/web-dist/assets/{sankeyDiagram-HTMAVEWB-DRs5oKTx.js → sankeyDiagram-HTMAVEWB-fnX7WrAj.js} +1 -1
  86. package/web-dist/assets/{sequenceDiagram-DBY2YBRQ-BTeEqLFC.js → sequenceDiagram-DBY2YBRQ-BUvsAYkQ.js} +1 -1
  87. package/web-dist/assets/{src-Cf1DXZ3M.js → src-V5VjKILh.js} +1 -1
  88. package/web-dist/assets/{stateDiagram-2N3HPSRC-BPcqMj-B.js → stateDiagram-2N3HPSRC-C9LJKbHM.js} +1 -1
  89. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-Bm1cPGFT.js +1 -0
  90. package/web-dist/assets/{swimlanes-5IMT3BWC-CJTd58TJ.js → swimlanes-5IMT3BWC-aq9B5aBs.js} +1 -1
  91. package/web-dist/assets/swimlanesDiagram-G3AALYLV-DR6Yx_Ic.js +8 -0
  92. package/web-dist/assets/{timeline-definition-FHXFAJF6-CqbaBVpe.js → timeline-definition-FHXFAJF6-DhJ9Jf4f.js} +1 -1
  93. package/web-dist/assets/{treeView-QDETBFTQ-B2OQ8r59.js → treeView-QDETBFTQ-D42FrEH4.js} +1 -1
  94. package/web-dist/assets/{treemap-6X3UGDF4-DGpAdWTA.js → treemap-6X3UGDF4-BV_9JyG6.js} +1 -1
  95. package/web-dist/assets/{vennDiagram-L72KCM5P-BAS_eWHm.js → vennDiagram-L72KCM5P-BkwHzxsN.js} +1 -1
  96. package/web-dist/assets/{wardley-OPB4EBWU-DpNHIH3W.js → wardley-OPB4EBWU-fwm52ei3.js} +1 -1
  97. package/web-dist/assets/{wardleyDiagram-EHGQE667-2N7X1vj8.js → wardleyDiagram-EHGQE667-D_UqvgcE.js} +1 -1
  98. package/web-dist/assets/{xychartDiagram-FW5EYKEG-C8mfLCei.js → xychartDiagram-FW5EYKEG-tKdmcTfS.js} +1 -1
  99. package/web-dist/index.html +2 -2
  100. package/web-dist/assets/architecture-TIHT7OUA-CXyjbDft.js +0 -1
  101. package/web-dist/assets/channel-uFMfT294.js +0 -1
  102. package/web-dist/assets/classDiagram-OUVF2IWQ-D1koMbqS.js +0 -1
  103. package/web-dist/assets/classDiagram-v2-EOCWNBFH-D1koMbqS.js +0 -1
  104. package/web-dist/assets/eventmodeling-45OFAUF4-tWFB9ALb.js +0 -1
  105. package/web-dist/assets/flowDiagram-23GEKE2U-Dz_Opd7B.js +0 -1
  106. package/web-dist/assets/index-BwC7xvWu.js +0 -336
  107. package/web-dist/assets/index-CuXKWysP.css +0 -2
  108. package/web-dist/assets/railroad-abnf-AHOZXSZD-DLmknJDm.js +0 -1
  109. package/web-dist/assets/railroad-ebnf-EBAXGLYW-BoZF0VpA.js +0 -1
  110. package/web-dist/assets/railroad-peg-LSFZ7HO6-Dib7YVqg.js +0 -1
  111. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-DiV9dOER.js +0 -1
  112. package/web-dist/assets/swimlanesDiagram-G3AALYLV-BDeobZmn.js +0 -8
@@ -13,8 +13,8 @@
13
13
  // what their worker would be told.
14
14
  //
15
15
  // The maintainer's replacement (chosen deliberately over keeping a canonical doc): the thread gets a
16
- // free-form scratch DIRECTORY, and compaction recovery moves to `mcp__frizz__goal`'s
17
- // post_compaction trigger — the worker writes whatever doc it likes and LINKS it in a prompt frizz
16
+ // free-form scratch DIRECTORY, and compaction recovery moves to `frizzctl goal`'s
17
+ // post-compaction trigger — the worker writes whatever doc it likes and LINKS it in a prompt frizz
18
18
  // re-sends when the context is summarized away. Durable in SQLite, visible in the thread footer,
19
19
  // editable by the human. This hook's job is therefore reduced to two honest things:
20
20
  //
@@ -212,6 +212,12 @@ function emitJson(additionalContext, hookEventName) {
212
212
 
213
213
  // ── mode: session-start ──────────────────────────────────────────────────────────────────────────
214
214
  if (mode === 'session-start') {
215
+ // A CODEX resume loses nothing: the thread is rebuilt from its rollout with the whole conversation in
216
+ // it, and Frizz resumes a thread routinely — its first message after every Frizz restart, and again
217
+ // when a newer Frizz hands it new hooks. Telling that worker "Context was just lost" would be false
218
+ // every time, so the Codex registration says so with a flag and this stays silent. (On Claude a
219
+ // resume is a cold start of the process and keeps the wording below.)
220
+ if (input.source === 'resume' && argv.includes('--resume-keeps-context')) process.exit(0);
215
221
  const files = listScratch();
216
222
  const written = files.length > 0;
217
223
 
@@ -245,8 +251,8 @@ if (mode === 'session-start') {
245
251
  '⟦scratch directory⟧ Context was just ' + (input.source === 'compact' ? 'compacted' : 'lost') +
246
252
  '. You have files in your scratch directory `' + relPath + '`:\n' + describe(files) +
247
253
  '\n\nRead whichever of them bears on what you were doing BEFORE acting, and treat what you ' +
248
- 'wrote there as authoritative over anything the summary implies. (A goal armed via ' +
249
- 'mcp__frizz__goal with post_compaction: true can hand a link back at the next ' +
254
+ 'wrote there as authoritative over anything the summary implies. (A goal armed with ' +
255
+ '`frizzctl goal start --post-compaction` can hand a link back at the next ' +
250
256
  'compaction without relying on this note.)' +
251
257
  compactedNote,
252
258
  );
@@ -260,7 +266,7 @@ if (mode === 'session-start') {
260
266
  '`.frizz/threads/*/` directories for a substitute, and do not broadly reload repo docs or ' +
261
267
  'skills merely to reconstruct context. Recover from the retained compaction summary and any ' +
262
268
  'task-specific handoff it directly names. The directory is still available if you want notes ' +
263
- 'this time, and a goal armed via mcp__frizz__goal with post_compaction: true can ' +
269
+ 'this time, and a goal armed with `frizzctl goal start --post-compaction` can ' +
264
270
  're-send a prompt linking them at the next compaction.' +
265
271
  compactedNote,
266
272
  );
@@ -270,8 +276,8 @@ if (mode === 'session-start') {
270
276
  parts.push(
271
277
  '⟦scratch directory⟧ `' + relPath + '` is yours: any files you like, no format expected, and ' +
272
278
  'nothing in it is read automatically. Use it if you want it. If you ever want a note to come ' +
273
- 'back after a compaction, a goal armed via mcp__frizz__goal with ' +
274
- 'post_compaction: true re-sends a prompt of your choosing — one that can link a file here.',
279
+ 'back after a compaction, a goal armed with `frizzctl goal start ' +
280
+ '--post-compaction` re-sends a prompt of your choosing — one that can link a file here.',
275
281
  );
276
282
  }
277
283
  emitJson(parts.join('\n\n'), 'SessionStart');
@@ -402,13 +408,13 @@ if (mode === 'nudge') {
402
408
  mtimeMs
403
409
  ? '⟦scratch notes stale⟧ Your context has grown ~' + k + 'k tokens since you last wrote anything ' +
404
410
  'in `' + relPath + '`. Top the notes up in passing if you still want them current (a goal ' +
405
- 'armed with post_compaction: true can link them). This is a background note, NOT a task and ' +
411
+ 'armed with `frizzctl goal start --post-compaction` can link them). This is a background note, NOT a task and ' +
406
412
  'NOT a reason to pause: do not stop working to service it, and never end a turn on it while ' +
407
413
  'the human\'s instruction still has parts left.'
408
414
  : '⟦scratch directory empty⟧ This session is ~' + k + 'k tokens deep and `' + relPath + '` is ' +
409
415
  'empty. That is fine — notes are optional and writing them is not doing the work. The ' +
410
- 'directory is available if you want notes, and mcp__frizz__goal with ' +
411
- 'post_compaction: true can re-send a prompt linking them after a compaction. This is a ' +
416
+ 'directory is available if you want notes, and `frizzctl goal start ' +
417
+ '--post-compaction` can re-send a prompt linking them after a compaction. This is a ' +
412
418
  'background note, NOT a task and NOT a reason to pause: keep going with what you were asked to do.',
413
419
  event,
414
420
  );
@@ -68,7 +68,7 @@ const scratch = sid
68
68
  // prompt. Trimmed 2026-08-26 (maintainer: "Definitely trim the session seed hook if it's fully
69
69
  // repetitive") as part of cutting the per-session token overhead Frizz adds over a plain TUI session.
70
70
  const core =
71
- '⟦frizz worker contract⟧ You are a frizz WORKER driving EXACTLY ONE effort. Your FULL operating contract — the end-of-turn signal fences (```done / ```awaiting — a question is a registered row, `mcp__frizz__ask`, and the only ```question fence is the EMPTY placement marker naming its id), the scratch-directory rules, the sub-agent rules, the question handback and the stop criterion — lives in your SYSTEM PROMPT; follow it there. ALWAYS SIGN OFF — a fence OR a registration (`ask`, `done`); an open question is one, so rest normally and write no question fence for it. A rest on running work takes the ```awaiting fence with `status: working|watching|needs_input` — `working` and `watching` are quiet parks and need no write-up.\n' +
71
+ '⟦frizz worker contract⟧ You are a frizz WORKER driving EXACTLY ONE effort. Your FULL operating contract — the end-of-turn signal fences (```done / ```awaiting — a question is a registered row, `frizzctl ask`, and the only ```question fence is the EMPTY placement marker naming its id), the scratch-directory rules, the sub-agent rules, the question handback and the stop criterion — lives in your SYSTEM PROMPT; follow it there. ALWAYS SIGN OFF — a fence OR a registration (`frizzctl ask`, `frizzctl done`); an open question is one, so rest normally and write no question fence for it. A rest on running work takes the ```awaiting fence with `status: working|watching|needs_input` — `working` and `watching` are quiet parks and need no write-up.\n' +
72
72
  'SCRATCH DIRECTORY (OPTIONAL): `' + scratch + '` — a folder kept FOR YOU, nothing in it read automatically, never a substitute for doing the work. Give each sub-agent its OWN file rather than a shared one.';
73
73
 
74
74
  const grounding =