frizz 0.7.7 → 0.8.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 (127) hide show
  1. package/README.md +15 -45
  2. package/dist/claude-agent-broker.js +7 -4
  3. package/dist/dev-child.js +422 -273
  4. package/dist/frizz.js +1003 -398
  5. package/package.json +1 -1
  6. package/runtime/cc-worker/.claude-plugin/plugin.json +1 -1
  7. package/runtime/cc-worker/DECISIONS.md +31 -2
  8. package/runtime/cc-worker/agents/high.md +7 -0
  9. package/runtime/cc-worker/agents/low.md +7 -0
  10. package/runtime/cc-worker/agents/max.md +7 -0
  11. package/runtime/cc-worker/agents/medium.md +7 -0
  12. package/runtime/cc-worker/agents/xhigh.md +7 -0
  13. package/runtime/cc-worker/bin/frizz-mcp.mjs +3 -2
  14. package/runtime/cc-worker/hooks/agent-dispatch.mjs +7 -6
  15. package/runtime/cc-worker/hooks/hooks.json +0 -2
  16. package/runtime/cc-worker/hooks/scratchpad.mjs +5 -3
  17. package/runtime/cc-worker/hooks/session-seed.mjs +17 -17
  18. package/runtime/cc-worker/skills/gh/SKILL.md +5 -19
  19. package/web-dist/assets/{TerminalPane-Cb8jOFP9.js → TerminalPane-BIBHC61j.js} +1 -1
  20. package/web-dist/assets/{abnfDiagram-VRR7QNED-Dtbg2eZ0.js → abnfDiagram-VRR7QNED-CcFQGFPf.js} +1 -1
  21. package/web-dist/assets/architecture-TIHT7OUA-BZEZt7jZ.js +1 -0
  22. package/web-dist/assets/{architectureDiagram-ZJ3FMSHR-DzQjWW7u.js → architectureDiagram-ZJ3FMSHR-DErIQOIs.js} +1 -1
  23. package/web-dist/assets/{blockDiagram-677ZJIJ3-BJnpkLMt.js → blockDiagram-677ZJIJ3-CpsUqur1.js} +1 -1
  24. package/web-dist/assets/{c4Diagram-LMCZKHZV-COdatsYu.js → c4Diagram-LMCZKHZV-D2dHmCEJ.js} +1 -1
  25. package/web-dist/assets/channel-DdFRPviT.js +1 -0
  26. package/web-dist/assets/{chunk-32BRIVSS-CORMw4Vm.js → chunk-32BRIVSS-aOCEfxRW.js} +1 -1
  27. package/web-dist/assets/{chunk-52WLFC77-C7lEadTg.js → chunk-52WLFC77-2iw4nJPC.js} +1 -1
  28. package/web-dist/assets/{chunk-C7G6YPKG-DZy4F97l.js → chunk-C7G6YPKG-BPD3iHVE.js} +1 -1
  29. package/web-dist/assets/{chunk-EX3LRPZG-HynlfV9p.js → chunk-EX3LRPZG-DrefHift.js} +1 -1
  30. package/web-dist/assets/{chunk-FWX5IMBZ-BbwKNhKm.js → chunk-FWX5IMBZ-By940EHT.js} +2 -2
  31. package/web-dist/assets/{chunk-HOUHSVGY-lIhOZSmL.js → chunk-HOUHSVGY-B1Cqvz7e.js} +1 -1
  32. package/web-dist/assets/{chunk-ICXQ74PX-WGxaMO8c.js → chunk-ICXQ74PX-1LkVpWuI.js} +1 -1
  33. package/web-dist/assets/{chunk-MOJQB5TN-B-cx0f3u.js → chunk-MOJQB5TN-Ip1cy64r.js} +1 -1
  34. package/web-dist/assets/{chunk-OGEWGWER-DJceVwZH.js → chunk-OGEWGWER-CNjVyu8F.js} +1 -1
  35. package/web-dist/assets/{chunk-PUDLZKDR-CGwHZns8.js → chunk-PUDLZKDR-9HZR6DAU.js} +1 -1
  36. package/web-dist/assets/{chunk-Q4XR5HBZ-PTSWtmk1.js → chunk-Q4XR5HBZ-vtWwOCuQ.js} +1 -1
  37. package/web-dist/assets/{chunk-V7JOEXUC-VNxHZPcf.js → chunk-V7JOEXUC-DC6YaHG0.js} +1 -1
  38. package/web-dist/assets/{chunk-VAUOI2AC-ZXYCz_Aw.js → chunk-VAUOI2AC-CP-xe7SD.js} +1 -1
  39. package/web-dist/assets/{chunk-VR4S4FIN-9WCtmFJp.js → chunk-VR4S4FIN-wbxDFptH.js} +1 -1
  40. package/web-dist/assets/{chunk-WYO6CB5R-V4EBjpmt.js → chunk-WYO6CB5R-dibXmwpK.js} +1 -1
  41. package/web-dist/assets/{chunk-ZGVPDNZ5-CPW0Z0ae.js → chunk-ZGVPDNZ5-_y_itJHG.js} +1 -1
  42. package/web-dist/assets/classDiagram-OUVF2IWQ-Bf3duLb8.js +1 -0
  43. package/web-dist/assets/classDiagram-v2-EOCWNBFH-Bf3duLb8.js +1 -0
  44. package/web-dist/assets/{cynefin-VYW2F7L2-E7PklfJD.js → cynefin-VYW2F7L2-D1RYokZP.js} +1 -1
  45. package/web-dist/assets/{cynefinDiagram-TSTJHNR4-JIXAPjDf.js → cynefinDiagram-TSTJHNR4-qofqoy3T.js} +1 -1
  46. package/web-dist/assets/{dagre-VKFMJZFB-DjXrdcNx.js → dagre-VKFMJZFB-CgHLoGFk.js} +1 -1
  47. package/web-dist/assets/{diagram-FQU43EPY--i9i0qhm.js → diagram-FQU43EPY-JEAs4LOb.js} +1 -1
  48. package/web-dist/assets/{diagram-G47NLZAW-DxgcENZ_.js → diagram-G47NLZAW--tLd4Lf7.js} +1 -1
  49. package/web-dist/assets/{diagram-NH7WQ7WH-CUy9Nr90.js → diagram-NH7WQ7WH-DPbw9CJU.js} +1 -1
  50. package/web-dist/assets/{diagram-OA4YK3LP-DbTbUaCb.js → diagram-OA4YK3LP-CDrb7nWs.js} +1 -1
  51. package/web-dist/assets/{diagram-WEI45ONY-2gk6xhOq.js → diagram-WEI45ONY-DJswZe3f.js} +1 -1
  52. package/web-dist/assets/{ebnfDiagram-CCIWWBDH-uE2iDETg.js → ebnfDiagram-CCIWWBDH-BP8-PZMF.js} +1 -1
  53. package/web-dist/assets/{erDiagram-Q63AITRT-dztd4MUw.js → erDiagram-Q63AITRT-BQXuebf5.js} +1 -1
  54. package/web-dist/assets/eventmodeling-45OFAUF4-DOLxRQQ5.js +1 -0
  55. package/web-dist/assets/flowDiagram-23GEKE2U-DoK1yb0H.js +1 -0
  56. package/web-dist/assets/{ganttDiagram-NO4QXBWP-DAds6Aht.js → ganttDiagram-NO4QXBWP-DotMb935.js} +1 -1
  57. package/web-dist/assets/{gitGraph-TEB2WS4Q-Ci0XVvIa.js → gitGraph-TEB2WS4Q-B1vbYyKQ.js} +1 -1
  58. package/web-dist/assets/{gitGraphDiagram-IHSO6WYX-C6FULyt8.js → gitGraphDiagram-IHSO6WYX-BjDXKk4m.js} +1 -1
  59. package/web-dist/assets/index-CmrDpsD8.css +1 -0
  60. package/web-dist/assets/{index-CNy5uOpI.js → index-Cs0TDGMu.js} +124 -124
  61. package/web-dist/assets/{info-DKCQHKI2-9N77dOiw.js → info-DKCQHKI2-xLTLqQju.js} +1 -1
  62. package/web-dist/assets/{infoDiagram-FWYZ7A6U-BymP3PgG.js → infoDiagram-FWYZ7A6U-BFfYUsrC.js} +1 -1
  63. package/web-dist/assets/{ishikawaDiagram-FXEZZL3T-CU_kQBz1.js → ishikawaDiagram-FXEZZL3T-45a7VMwm.js} +1 -1
  64. package/web-dist/assets/{journeyDiagram-5HDEW3XC-DZN15HSd.js → journeyDiagram-5HDEW3XC-CEBUpu59.js} +1 -1
  65. package/web-dist/assets/{kanban-definition-HUTT4EX6-J4wR5g_3.js → kanban-definition-HUTT4EX6-RwKtDFzG.js} +1 -1
  66. package/web-dist/assets/{line-SRzGpiDr.js → line-DStcMIry.js} +1 -1
  67. package/web-dist/assets/{mermaid-parser.core-CGBscNGo.js → mermaid-parser.core-B0ekgQMA.js} +3 -3
  68. package/web-dist/assets/{mermaid.core-xNdwXb1r.js → mermaid.core-w1hcQaPy.js} +3 -3
  69. package/web-dist/assets/{mindmap-definition-LN4V7U3C-gR2dbzrj.js → mindmap-definition-LN4V7U3C-D_n38Imb.js} +1 -1
  70. package/web-dist/assets/{packet-7NZHBO7P-DrR4W6I3.js → packet-7NZHBO7P-CstGeBOX.js} +1 -1
  71. package/web-dist/assets/{pegDiagram-2B236MQR-DN7R-_t4.js → pegDiagram-2B236MQR-DvowVyTO.js} +1 -1
  72. package/web-dist/assets/{pie-RZYD4A2V-C8VjQAFZ.js → pie-RZYD4A2V-BOP2j_HH.js} +1 -1
  73. package/web-dist/assets/{pieDiagram-ENE6RG2P-5w64zdD1.js → pieDiagram-ENE6RG2P-CKRqu_2f.js} +1 -1
  74. package/web-dist/assets/{quadrantDiagram-ABIIQ3AL-B4rbezq_.js → quadrantDiagram-ABIIQ3AL-zSArSS8R.js} +1 -1
  75. package/web-dist/assets/{radar-I7S5WNFK-CTbbPB8m.js → radar-I7S5WNFK-BqRdNIBw.js} +1 -1
  76. package/web-dist/assets/{railroad-3IZDKUUU-CY1er15b.js → railroad-3IZDKUUU-BaKcl_LU.js} +1 -1
  77. package/web-dist/assets/railroad-abnf-AHOZXSZD-itqDLg1p.js +1 -0
  78. package/web-dist/assets/railroad-ebnf-EBAXGLYW-ze7rLVCi.js +1 -0
  79. package/web-dist/assets/railroad-peg-LSFZ7HO6-DKsYkEuG.js +1 -0
  80. package/web-dist/assets/{railroadDiagram-RFXS5EU6-Bx2HJ3yT.js → railroadDiagram-RFXS5EU6-BrXTQge9.js} +1 -1
  81. package/web-dist/assets/{requirementDiagram-TGXJPOKE-BLK-Y2rx.js → requirementDiagram-TGXJPOKE-DBBNi_SS.js} +1 -1
  82. package/web-dist/assets/{sankeyDiagram-HTMAVEWB-Dk-8Miv-.js → sankeyDiagram-HTMAVEWB-BwFi7xFy.js} +1 -1
  83. package/web-dist/assets/{sequenceDiagram-DBY2YBRQ-DL2alfR-.js → sequenceDiagram-DBY2YBRQ-CeivqMeT.js} +1 -1
  84. package/web-dist/assets/{stateDiagram-2N3HPSRC-Bka44wf1.js → stateDiagram-2N3HPSRC-C6NZsnFm.js} +1 -1
  85. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-B3YRnI4W.js +1 -0
  86. package/web-dist/assets/{swimlanes-5IMT3BWC-e0GbMwIr.js → swimlanes-5IMT3BWC-C0MubXTG.js} +1 -1
  87. package/web-dist/assets/swimlanesDiagram-G3AALYLV-CXva4Ic9.js +8 -0
  88. package/web-dist/assets/{timeline-definition-FHXFAJF6-CT3GFq89.js → timeline-definition-FHXFAJF6-CtxwSvFu.js} +1 -1
  89. package/web-dist/assets/{treeView-QDETBFTQ-BJauJ0bm.js → treeView-QDETBFTQ-CXcwSjey.js} +1 -1
  90. package/web-dist/assets/{treemap-6X3UGDF4-DCX7A-nx.js → treemap-6X3UGDF4-Uspgr-d1.js} +1 -1
  91. package/web-dist/assets/{vennDiagram-L72KCM5P-D4dm2iTR.js → vennDiagram-L72KCM5P-tZamQQAQ.js} +1 -1
  92. package/web-dist/assets/{wardley-OPB4EBWU-DklTDSId.js → wardley-OPB4EBWU-0_79c19P.js} +1 -1
  93. package/web-dist/assets/{wardleyDiagram-EHGQE667-CikP5hBd.js → wardleyDiagram-EHGQE667-uYmUsP66.js} +1 -1
  94. package/web-dist/assets/{xychartDiagram-FW5EYKEG-FXuOAFpz.js → xychartDiagram-FW5EYKEG-BsOU7Wf7.js} +1 -1
  95. package/web-dist/index.html +2 -2
  96. package/runtime/cc-worker/agents/fable-high.md +0 -8
  97. package/runtime/cc-worker/agents/fable-low.md +0 -8
  98. package/runtime/cc-worker/agents/fable-max.md +0 -8
  99. package/runtime/cc-worker/agents/fable-medium.md +0 -8
  100. package/runtime/cc-worker/agents/fable-xhigh.md +0 -8
  101. package/runtime/cc-worker/agents/haiku.md +0 -7
  102. package/runtime/cc-worker/agents/opus-high.md +0 -8
  103. package/runtime/cc-worker/agents/opus-low.md +0 -8
  104. package/runtime/cc-worker/agents/opus-max.md +0 -8
  105. package/runtime/cc-worker/agents/opus-medium.md +0 -8
  106. package/runtime/cc-worker/agents/opus-xhigh.md +0 -8
  107. package/runtime/cc-worker/agents/sonnet-high.md +0 -8
  108. package/runtime/cc-worker/agents/sonnet-low.md +0 -8
  109. package/runtime/cc-worker/agents/sonnet-max.md +0 -8
  110. package/runtime/cc-worker/agents/sonnet-medium.md +0 -8
  111. package/runtime/cc-worker/agents/sonnet-xhigh.md +0 -8
  112. package/runtime/cc-worker/bin/browser-mcp-tools.json +0 -1192
  113. package/runtime/cc-worker/bin/browser-mcp.mjs +0 -730
  114. package/runtime/cc-worker/hooks/precompact-instructions.mjs +0 -133
  115. package/runtime/cc-worker/skills/waits/SKILL.md +0 -84
  116. package/web-dist/assets/architecture-TIHT7OUA-CTxVpl9_.js +0 -1
  117. package/web-dist/assets/channel-COS0Ygbp.js +0 -1
  118. package/web-dist/assets/classDiagram-OUVF2IWQ-Df5TLnrN.js +0 -1
  119. package/web-dist/assets/classDiagram-v2-EOCWNBFH-Df5TLnrN.js +0 -1
  120. package/web-dist/assets/eventmodeling-45OFAUF4-DPVPOEaJ.js +0 -1
  121. package/web-dist/assets/flowDiagram-23GEKE2U-BMIMgVYd.js +0 -1
  122. package/web-dist/assets/index-D6LsViUY.css +0 -1
  123. package/web-dist/assets/railroad-abnf-AHOZXSZD-DfEpkrtJ.js +0 -1
  124. package/web-dist/assets/railroad-ebnf-EBAXGLYW-Csunejgu.js +0 -1
  125. package/web-dist/assets/railroad-peg-LSFZ7HO6-BgRslbM_.js +0 -1
  126. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-6KcScVPX.js +0 -1
  127. package/web-dist/assets/swimlanesDiagram-G3AALYLV-jaJhlDbE.js +0 -8
package/README.md CHANGED
@@ -63,7 +63,7 @@ Frizz is a browser tab, a queue, and the agent CLIs you already pay for. It brin
63
63
  - 🐙 **GitHub integration.** Browse your repo's issues and pull requests without leaving the composer, and turn a selection of them into threads. Workers can read issues, diffs, and CI on their own.
64
64
  - 👀 **Built-in CI and PR watchers.** A worker waiting on a build or a review doesn't hand the thread back to you to be told "keep going." It watches, and picks the work back up when the run goes green or a review lands.
65
65
  - 📝 **No magic.** A thread behaves like a Claude Code session you started yourself. Frizz adds no worktrees, no branches, no dev server, no build integration, no workflow engine to fight with.
66
- - 🔒 **Local only.** No cloud, no account, no telemetry. The server binds `127.0.0.1` by default and its state lives in your user directory, never in your checkout. To reach a board from a phone, put your own tunnel or proxy in front of it — see [Remote access](docs/remote-access.md).
66
+ - 🔒 **Local only.** No cloud, no account, no telemetry. The server binds `127.0.0.1` by default and its state lives in your user directory, never in your checkout. To reach a board from a phone, press R in its terminal — see [Remote access](docs/remote-access.md).
67
67
 
68
68
  ### Projects
69
69
 
@@ -132,11 +132,7 @@ $ npx frizz --help
132
132
 
133
133
  Frizz production launcher
134
134
 
135
- Usage: npx frizz [up] [options]
136
-
137
- Commands:
138
- up serve at the saved public hostname and run its tunnel; asked once,
139
- then remembered
135
+ Usage: npx frizz [options]
140
136
 
141
137
  Run it in the directory you want to work in. One server serves EVERY project on this machine,
142
138
  each at its own /project/<name> URL, so a second run joins the one already going. Runs the
@@ -146,28 +142,18 @@ for a source checkout.
146
142
  Options:
147
143
  --no-app print the URL without opening a browser
148
144
  --port <port> request a fixed port for a new workspace server
149
- --host [address] serve on a network address instead of loopback (bare --host means 0.0.0.0)
150
- --allowed-host <name> with --host, also accept this DNS name as the board's address (repeatable)
151
- --public-origin <url> serve behind a proxy/tunnel reachable at this exact origin
152
- --cloud alias of up, for saved commands
145
+ --sandbox a disposable Frizz to try things in: throwaway home and project, its
146
+ own port, deleted when this terminal closes; credentials (gh,
147
+ cloudflared, Claude, Codex, the machine's frizz.sh key) are shared
153
148
  --link print a fresh single-use access link for the running board
154
149
  --debug stream the full event feed to the terminal instead of the compact readout
155
150
  -h, --help show this help
156
151
 
157
- Environment:
158
- FRIZZ_HOST same as --host
159
- FRIZZ_ALLOWED_HOSTS same as --allowed-host, comma separated
160
- FRIZZ_PUBLIC_ORIGIN same as --public-origin
161
-
162
- --host puts a board that can run shell commands as you on the network, and Frizz has no login: anyone
163
- who reaches the port controls it. Only do this on a network you trust. An IP address and this
164
- machine's own hostname work as-is; any other DNS name must be listed with --allowed-host ("*"
165
- allows any).
166
152
 
167
- --public-origin serves the board through a tunnel or reverse proxy without putting it on the LAN
168
- at all Frizz stays on loopback and the tunnel dials it. It prints a SINGLE-USE access link, and
169
- shows it as a QR so you can scan it from a phone; press L for a fresh one at any time. Scanning it
170
- trades the code for a session cookie, so the link itself stops working the moment it is used.
153
+ To reach the board from a phone or another machine, press R in the terminal running it: a short
154
+ walkthrough sets up a frizz.sh name, a Cloudflare Tunnel, Tailscale, or a proxy of your own, and
155
+ remembers the choice, so a plain launch serves it from then on. The board stays on loopback and
156
+ shows a single-use sign-in link as a QR; press L for a fresh one, or run --link from another shell.
171
157
  ```
172
158
 
173
159
  <br/>
@@ -184,7 +170,7 @@ trades the code for a session cookie, so the link itself stops working the momen
184
170
  <details>
185
171
  <summary><b>Does anything leave my machine?</b></summary>
186
172
 
187
- > Nothing from Frizz. There's no account, no telemetry, and the server binds to `127.0.0.1` unless you ask for otherwise with `--host`. The agents themselves talk to their providers, and `gh` talks to GitHub, but Frizz is a local process looking at local files.
173
+ > Nothing from Frizz. There's no account, no telemetry, and the server binds to `127.0.0.1`; reaching it from another device is something you switch on yourself (press R in its terminal). The agents themselves talk to their providers, and `gh` talks to GitHub, but Frizz is a local process looking at local files.
188
174
 
189
175
  </details>
190
176
 
@@ -219,36 +205,20 @@ trades the code for a session cookie, so the link itself stops working the momen
219
205
  <details>
220
206
  <summary><b>Can I reach it from another machine?</b></summary>
221
207
 
222
- > Yes, with `--host`the flag every dev server has, and it means the same thing here:
208
+ > Yes. Press **R** in the terminal running Frizz. A short walkthrough sets up one of four ways to reach the board — a name on frizz.sh, a Cloudflare Tunnel you own, Tailscale, or any proxy you run checks what each needs, prints the commands, and remembers your choice. From then on a plain `npx frizz` serves it; pick **Off** in the same place to go back to loopback only.
223
209
  >
224
- > ```sh
225
- > npx frizz --host # every interface, i.e. 0.0.0.0
226
- > npx frizz --host 192.168.1.5 # one interface
227
- > ```
210
+ > To try any of this without touching the board you run, launch a second one with `npx frizz --sandbox` — a throwaway home and project on its own port, deleted on ctrl-c.
228
211
  >
229
- > Frizz prints the addresses to use and warns you as it starts. Reaching it by IP or by the machine's own hostname (`http://pupper:9393/`, `http://pupper.local:9393/`) works as-is; any other name you have to say so `--host --allowed-host frizz.home.arpa` because an unlisted name is how DNS rebinding gets a browser to treat an attacker's page as same-origin with your board, and the machine's own name is the one nobody off your network can point elsewhere. `FRIZZ_HOST` and `FRIZZ_ALLOWED_HOSTS` do the same thing when the launch command lives in an image or a unit file.
230
- >
231
- > Understand what you're turning on. Frizz has no login: reaching the port *is* the authorization, and the board runs shell commands as you. Only do this on a network you trust, and prefer a tunnel (`ssh -L 9393:127.0.0.1:9393 you@box`, Frizz's port, the same on both ends) if you just want your own board from your own laptop — that needs no flag at all.
212
+ > The board stays bound to `127.0.0.1` in every case. Something in front of it the frizz.sh relay, the tunnel, Tailscale, your proxycarries the traffic, and Frizz gates the first visit with a single-use sign-in link shown as a QR. Press **L** for a fresh link any time, or `npx frizz --link` from another shell (over SSH, for a headless box). See [Remote access](docs/remote-access.md) for what each option needs.
232
213
 
233
214
  </details>
234
215
 
235
216
  <details>
236
217
  <summary><b>Can I reach it from anywhere, not just my LAN?</b></summary>
237
218
 
238
- > Yes put it behind a tunnel and tell Frizz the address the tunnel answers on, with `--public-origin`:
239
- >
240
- > ```sh
241
- > npx frizz --public-origin https://frizz.example.com
242
- > cloudflared tunnel --url http://127.0.0.1:9393 # Frizz's port
243
- > ```
219
+ > Same answer: press **R** and pick a frizz.sh name, a Cloudflare Tunnel, or Tailscale. Each is reachable from anywhere the transport is — a frizz.sh name and a Cloudflare Tunnel from the open internet, Tailscale from your own devices.
244
220
  >
245
- > Frizz stays bound to `127.0.0.1` — `--public-origin` is not `--host` and does not put anything on your LAN. The tunnel runs on the same machine and dials the loopback port, so the only way in is through the tunnel. That is also what makes this the *good* remote option rather than merely a working one: the tunnel terminates TLS, so the board is a real `https://` origin and therefore a secure context, which plain `--host` over a LAN IP is not. Copy buttons and desktop notifications work again, and it works on a phone.
246
- >
247
- > The address you pass must be the exact origin your browser shows — scheme and host, no path. Frizz accepts that one origin, and accepts `X-Forwarded-*` only on requests that actually arrived as it.
248
- >
249
- > Frizz prints a **single-use** access link and renders it as a QR in your terminal, so you can scan it from a phone without typing forty characters. Scanning trades the code for a session cookie and the link immediately stops working; press **L** any time for a fresh one. A code expires in five minutes, and a spent one says so rather than failing silently.
250
-
251
- **Even so: Frizz has no accounts, so that link — and anything you put in front of the tunnel — *is* your access control.** A bare tunnel publishes a shell-capable board to the open internet for anyone who has the URL. Require authentication at the proxy — with Cloudflare, that means a [Cloudflare Access](https://developers.cloudflare.com/cloudflare-one/policies/access/) application over the hostname, with a policy allowing only your own email, created *before* the hostname resolves. Tailscale Serve is the same idea with device identity instead of SSO. Frizz prints this warning on every launch that names a public origin, and it is not boilerplate.
221
+ > Frizz has no accounts, so the single-use sign-in link **is** the door: a phone that scans it gets a session; nobody else gets in. Sessions are per device and can be listed and revoked with `npx frizz --sessions` and `npx frizz --sign-out`.
252
222
 
253
223
  </details>
254
224
 
@@ -20667,11 +20667,14 @@ function startClaudeQuery(executablePath, options) {
20667
20667
  // `user,project,local` reported it applied.
20668
20668
  settingSources: options.settingSources ?? ["user", "project", "local"],
20669
20669
  // The frizz worker environment (see ClaudeQueryStartOptions): load the local cc-worker plugin so a
20670
- // broker session gets the frizz sub-agent profiles + hooks, mount the MCP servers (frizz +
20671
- // chrome-devtools), and pre-approve them.
20670
+ // broker session gets the frizz sub-agent profiles + hooks, mount the frizz MCP server, and
20671
+ // pre-approve it. EMPTY is skipped, not passed: since frizz stopped mounting a browser (2026-08-26)
20672
+ // a resolved-nothing worker env is a real state, and `{}`/`[]` are truthy — handing the SDK an
20673
+ // empty allowlist is not the same as handing it none. The project's own `.mcp.json` servers are
20674
+ // loaded by settingSources, independently of this.
20672
20675
  ...options.pluginDir ? { plugins: [{ type: "local", path: options.pluginDir }] } : {},
20673
- ...options.mcpServers ? { mcpServers: options.mcpServers } : {},
20674
- ...options.allowedTools ? { allowedTools: options.allowedTools } : {},
20676
+ ...options.mcpServers && Object.keys(options.mcpServers).length > 0 ? { mcpServers: options.mcpServers } : {},
20677
+ ...options.allowedTools?.length ? { allowedTools: options.allowedTools } : {},
20675
20678
  ...options.disallowedTools?.length ? { disallowedTools: [...options.disallowedTools] } : {},
20676
20679
  persistSession: options.persistSession ?? false,
20677
20680
  // Keep Claude's default (preset) system prompt and APPEND the frizz worker contract, the SDK