frizz 0.10.1 → 0.12.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 (96) hide show
  1. package/README.md +3 -3
  2. package/dist/claude-agent-broker.js +31614 -18063
  3. package/dist/dev-child.js +2226 -937
  4. package/dist/frizz.js +268 -15
  5. package/package.json +2 -2
  6. package/runtime/cc-worker/bin/frizz-mcp.mjs +5 -1
  7. package/web-dist/assets/{TerminalPane-VbmxsjxK.js → TerminalPane-C2BnRGVg.js} +1 -1
  8. package/web-dist/assets/{abnfDiagram-VRR7QNED-CBCkSzJg.js → abnfDiagram-VRR7QNED-CnMUakri.js} +1 -1
  9. package/web-dist/assets/architecture-TIHT7OUA-9QsSz9gn.js +1 -0
  10. package/web-dist/assets/{architectureDiagram-ZJ3FMSHR-Rd44A8-r.js → architectureDiagram-ZJ3FMSHR-Dw49H3Py.js} +1 -1
  11. package/web-dist/assets/{blockDiagram-677ZJIJ3-C8vX06UX.js → blockDiagram-677ZJIJ3-BWgasm3g.js} +1 -1
  12. package/web-dist/assets/{c4Diagram-LMCZKHZV-CMMjtui-.js → c4Diagram-LMCZKHZV-CmiVMi-q.js} +1 -1
  13. package/web-dist/assets/channel-CLXyIE2F.js +1 -0
  14. package/web-dist/assets/{chunk-32BRIVSS-DtsFPb8y.js → chunk-32BRIVSS-DsFcmMav.js} +1 -1
  15. package/web-dist/assets/{chunk-52WLFC77-35RvKhG9.js → chunk-52WLFC77-C8TmIbAt.js} +1 -1
  16. package/web-dist/assets/{chunk-C7G6YPKG-Dusr0gOw.js → chunk-C7G6YPKG-CWaIqGh7.js} +1 -1
  17. package/web-dist/assets/{chunk-EX3LRPZG-BadaF-x2.js → chunk-EX3LRPZG-BGtDaEG5.js} +1 -1
  18. package/web-dist/assets/{chunk-FWX5IMBZ-CpQ7yEDx.js → chunk-FWX5IMBZ-DIYLz03w.js} +2 -2
  19. package/web-dist/assets/{chunk-HOUHSVGY-CxygFxWC.js → chunk-HOUHSVGY-DEXmjuFh.js} +1 -1
  20. package/web-dist/assets/{chunk-ICXQ74PX-YC4-v0mV.js → chunk-ICXQ74PX-d7qYOhhi.js} +1 -1
  21. package/web-dist/assets/{chunk-MOJQB5TN-CTgO9Z8o.js → chunk-MOJQB5TN-DclXMP_a.js} +1 -1
  22. package/web-dist/assets/{chunk-OGEWGWER-D87J1JIz.js → chunk-OGEWGWER-Dn3qS913.js} +1 -1
  23. package/web-dist/assets/{chunk-PUDLZKDR-CVB9kmxS.js → chunk-PUDLZKDR-BVShtfU4.js} +1 -1
  24. package/web-dist/assets/{chunk-Q4XR5HBZ-B2a88YVr.js → chunk-Q4XR5HBZ-CGTdESx1.js} +1 -1
  25. package/web-dist/assets/{chunk-V7JOEXUC-DoFngcpl.js → chunk-V7JOEXUC-DyJOjr9v.js} +1 -1
  26. package/web-dist/assets/{chunk-VAUOI2AC-X71d5AYZ.js → chunk-VAUOI2AC-D4IP434V.js} +1 -1
  27. package/web-dist/assets/{chunk-VR4S4FIN-39jPx_ES.js → chunk-VR4S4FIN-BmthV8JY.js} +1 -1
  28. package/web-dist/assets/{chunk-WYO6CB5R-CnCFbrQ7.js → chunk-WYO6CB5R-B7WZtej7.js} +1 -1
  29. package/web-dist/assets/{chunk-ZGVPDNZ5-B7wPa-pc.js → chunk-ZGVPDNZ5-C5udBDd8.js} +1 -1
  30. package/web-dist/assets/classDiagram-OUVF2IWQ-CIWfuY4b.js +1 -0
  31. package/web-dist/assets/classDiagram-v2-EOCWNBFH-CIWfuY4b.js +1 -0
  32. package/web-dist/assets/{cynefin-VYW2F7L2-C4GE-6ZJ.js → cynefin-VYW2F7L2-BGCAuICx.js} +1 -1
  33. package/web-dist/assets/{cynefinDiagram-TSTJHNR4-DM7vNSjQ.js → cynefinDiagram-TSTJHNR4-DrcSp3T9.js} +1 -1
  34. package/web-dist/assets/{dagre-VKFMJZFB-CBRFVbWb.js → dagre-VKFMJZFB-DpwUEsqR.js} +1 -1
  35. package/web-dist/assets/{diagram-FQU43EPY-D3t9pHH6.js → diagram-FQU43EPY-BpFw8lh3.js} +1 -1
  36. package/web-dist/assets/{diagram-G47NLZAW-CBjFvnAL.js → diagram-G47NLZAW-C19UAGgY.js} +1 -1
  37. package/web-dist/assets/{diagram-NH7WQ7WH-DAI3KCBU.js → diagram-NH7WQ7WH-BqCOCiLh.js} +1 -1
  38. package/web-dist/assets/{diagram-OA4YK3LP-C82PfYbV.js → diagram-OA4YK3LP-DeX0lziw.js} +1 -1
  39. package/web-dist/assets/{diagram-WEI45ONY-fOJDDfoI.js → diagram-WEI45ONY-C5CaoiNQ.js} +1 -1
  40. package/web-dist/assets/{ebnfDiagram-CCIWWBDH-B5h_VbLA.js → ebnfDiagram-CCIWWBDH-CmVKBMPd.js} +1 -1
  41. package/web-dist/assets/{erDiagram-Q63AITRT-BPje_yvH.js → erDiagram-Q63AITRT-DKbK71y9.js} +1 -1
  42. package/web-dist/assets/eventmodeling-45OFAUF4-P5CIYaPC.js +1 -0
  43. package/web-dist/assets/flowDiagram-23GEKE2U-B1lYV9tG.js +1 -0
  44. package/web-dist/assets/{ganttDiagram-NO4QXBWP-sBrAv0Zq.js → ganttDiagram-NO4QXBWP-CV9er-Ag.js} +1 -1
  45. package/web-dist/assets/{gitGraph-TEB2WS4Q-DRA1mvOm.js → gitGraph-TEB2WS4Q-DrkGEklk.js} +1 -1
  46. package/web-dist/assets/{gitGraphDiagram-IHSO6WYX-DBMOi0IS.js → gitGraphDiagram-IHSO6WYX-DnfkKTHs.js} +1 -1
  47. package/web-dist/assets/index-BIGkwpMf.css +1 -0
  48. package/web-dist/assets/index-BZuSbTzC.js +319 -0
  49. package/web-dist/assets/{info-DKCQHKI2-faVLVx1A.js → info-DKCQHKI2-DDjeakJ3.js} +1 -1
  50. package/web-dist/assets/{infoDiagram-FWYZ7A6U-BST26f54.js → infoDiagram-FWYZ7A6U-ClPdEwgm.js} +1 -1
  51. package/web-dist/assets/{ishikawaDiagram-FXEZZL3T-AQe4w48R.js → ishikawaDiagram-FXEZZL3T-DQSe577k.js} +1 -1
  52. package/web-dist/assets/{journeyDiagram-5HDEW3XC-DHYMyWnH.js → journeyDiagram-5HDEW3XC-CqGDwDnH.js} +1 -1
  53. package/web-dist/assets/{kanban-definition-HUTT4EX6-DRjdUC1w.js → kanban-definition-HUTT4EX6-Cm2ql3XT.js} +1 -1
  54. package/web-dist/assets/{line-DsDFTOBE.js → line-DYZIw46W.js} +1 -1
  55. package/web-dist/assets/{mermaid-parser.core-BQmWWHcM.js → mermaid-parser.core-BzAUCbYh.js} +3 -3
  56. package/web-dist/assets/{mermaid.core-DyyZgnTM.js → mermaid.core-ChBUFCit.js} +3 -3
  57. package/web-dist/assets/{mindmap-definition-LN4V7U3C-DKFwErMl.js → mindmap-definition-LN4V7U3C-D12k854u.js} +1 -1
  58. package/web-dist/assets/{packet-7NZHBO7P-Dc2mNrwB.js → packet-7NZHBO7P-DqfFhLqp.js} +1 -1
  59. package/web-dist/assets/{pegDiagram-2B236MQR-CApGxts7.js → pegDiagram-2B236MQR-yG5jewLN.js} +1 -1
  60. package/web-dist/assets/{pie-RZYD4A2V-420IM2Cy.js → pie-RZYD4A2V-qk1HY3l9.js} +1 -1
  61. package/web-dist/assets/{pieDiagram-ENE6RG2P-B9AabvqO.js → pieDiagram-ENE6RG2P-B-n6mYM1.js} +1 -1
  62. package/web-dist/assets/{quadrantDiagram-ABIIQ3AL-KDtGo5xp.js → quadrantDiagram-ABIIQ3AL-B35eq6Qw.js} +1 -1
  63. package/web-dist/assets/{radar-I7S5WNFK-r00cL8de.js → radar-I7S5WNFK-BLlNJ62v.js} +1 -1
  64. package/web-dist/assets/{railroad-3IZDKUUU-u3-ja2m8.js → railroad-3IZDKUUU-Bo667-nZ.js} +1 -1
  65. package/web-dist/assets/railroad-abnf-AHOZXSZD-1QyLbHfP.js +1 -0
  66. package/web-dist/assets/railroad-ebnf-EBAXGLYW-Cs3RBVGW.js +1 -0
  67. package/web-dist/assets/railroad-peg-LSFZ7HO6-d_2u0a_u.js +1 -0
  68. package/web-dist/assets/{railroadDiagram-RFXS5EU6-PXQXCI8m.js → railroadDiagram-RFXS5EU6-Cpu40FP1.js} +1 -1
  69. package/web-dist/assets/{requirementDiagram-TGXJPOKE-CsigfYcM.js → requirementDiagram-TGXJPOKE-BnUyecuV.js} +1 -1
  70. package/web-dist/assets/{sankeyDiagram-HTMAVEWB-CZTeOkfq.js → sankeyDiagram-HTMAVEWB-CPKNkdAc.js} +1 -1
  71. package/web-dist/assets/{sequenceDiagram-DBY2YBRQ-BVnCAk_N.js → sequenceDiagram-DBY2YBRQ--Xh3MzFl.js} +1 -1
  72. package/web-dist/assets/{stateDiagram-2N3HPSRC-ChCJipZW.js → stateDiagram-2N3HPSRC-Dt9i46rM.js} +1 -1
  73. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-BKy5vv2y.js +1 -0
  74. package/web-dist/assets/{swimlanes-5IMT3BWC-DHR9HD5O.js → swimlanes-5IMT3BWC-qTKs7JbH.js} +1 -1
  75. package/web-dist/assets/swimlanesDiagram-G3AALYLV-Ce1uKw_w.js +8 -0
  76. package/web-dist/assets/{timeline-definition-FHXFAJF6-BZl68jCj.js → timeline-definition-FHXFAJF6-6k-_GOW3.js} +1 -1
  77. package/web-dist/assets/{treeView-QDETBFTQ-CcWDnN_I.js → treeView-QDETBFTQ-BHU4QpQM.js} +1 -1
  78. package/web-dist/assets/{treemap-6X3UGDF4-CoPTx3oa.js → treemap-6X3UGDF4-DlO97L99.js} +1 -1
  79. package/web-dist/assets/{vennDiagram-L72KCM5P-lrsO-4o9.js → vennDiagram-L72KCM5P-CxKMltcT.js} +1 -1
  80. package/web-dist/assets/{wardley-OPB4EBWU-hA_IMYdR.js → wardley-OPB4EBWU-DaE5ZjFv.js} +1 -1
  81. package/web-dist/assets/{wardleyDiagram-EHGQE667-6T7WmjKn.js → wardleyDiagram-EHGQE667-Bb9Gwjc0.js} +1 -1
  82. package/web-dist/assets/{xychartDiagram-FW5EYKEG-BPYtf6cM.js → xychartDiagram-FW5EYKEG-BdaqOb5a.js} +1 -1
  83. package/web-dist/index.html +2 -2
  84. package/web-dist/assets/architecture-TIHT7OUA-DGkzyd6b.js +0 -1
  85. package/web-dist/assets/channel-BvYE_fQ0.js +0 -1
  86. package/web-dist/assets/classDiagram-OUVF2IWQ-BmoT0Xoa.js +0 -1
  87. package/web-dist/assets/classDiagram-v2-EOCWNBFH-BmoT0Xoa.js +0 -1
  88. package/web-dist/assets/eventmodeling-45OFAUF4-Bqo9jfNt.js +0 -1
  89. package/web-dist/assets/flowDiagram-23GEKE2U-BwssDy7H.js +0 -1
  90. package/web-dist/assets/index-C_iC5T6e.css +0 -1
  91. package/web-dist/assets/index-YBqvcp8M.js +0 -506
  92. package/web-dist/assets/railroad-abnf-AHOZXSZD-BIa3zJb3.js +0 -1
  93. package/web-dist/assets/railroad-ebnf-EBAXGLYW-Dhv_ZRtc.js +0 -1
  94. package/web-dist/assets/railroad-peg-LSFZ7HO6-BSnPbaOy.js +0 -1
  95. package/web-dist/assets/stateDiagram-v2-6OUMAXLB-BopBzYGR.js +0 -1
  96. package/web-dist/assets/swimlanesDiagram-G3AALYLV-B3z_1cGb.js +0 -8
package/dist/frizz.js CHANGED
@@ -12458,11 +12458,18 @@ var init_relay_protocol = __esm({
12458
12458
  }
12459
12459
  });
12460
12460
 
12461
+ // packages/shared/src/shell-writes.ts
12462
+ var init_shell_writes = __esm({
12463
+ "packages/shared/src/shell-writes.ts"() {
12464
+ "use strict";
12465
+ }
12466
+ });
12467
+
12461
12468
  // packages/shared/src/index.ts
12462
12469
  function fallbackPort(base) {
12463
12470
  return base + 1e4;
12464
12471
  }
12465
- var import_yaml, ATTACHMENT_IMAGE_EXTENSIONS, ATTACHMENT_TEXT_EXTENSIONS, ATTACHMENT_OFFICE_EXTENSIONS, ATTACHMENT_DATA_EXTENSIONS, ATTACHMENT_ARCHIVE_EXTENSIONS, ATTACHMENT_DOC_EXTENSIONS, ATTACHMENT_EXTENSIONS, ATTACHMENT_MAX_BASE64_CHARS, ATTACHMENT_MAX_BYTES, ATTACHMENT_EXT_SET, ATTACHMENT_ACCEPT, FrizzStatus, BlockMechanism, RuntimeState, Backend, CodexModel, ThreadProfileOption, ThreadAgent, SubAgentView, BgShellView, CompletionHoldOp, CompletionHold, AskOption, AskQuestion, PendingAsk, AwaitingHint, RETIRED_AWAITING_KINDS, RETIRED_LINE_RE, AWAITING_FOR_MAX_MS, SnoozeUntil, SNOOZE_PROMPT_MAX, SnoozePrompt, RECURRING_PROMPT_MAX, RECURRING_MIN_INTERVAL_SECONDS, RECURRING_MAX_INTERVAL_SECONDS, RecurringPromptText, RecurringIntervalSeconds, ThreadRecurringPrompt, TIMER_PROMPT_MAX, TIMER_MAX_DELAY_SECONDS, TimerPromptText, SIGNOFF_NUDGE_MARKER, SIGNOFF_NUDGE_MESSAGE, ThreadWatchKind, GithubChecksState, GithubMergeState, GithubWatchStatus, ThreadWatchView, PR_WATCH_FOR_MAX_MS, PR_WATCH_DEFAULT_FOR_MS, PrWatchView, AddOwnPrWatchInput, AddOwnPrWatchResult, DropOwnPrWatchInput, DropOwnPrWatchResult, OwnWatchKind, AddOwnWatchInput, OwnWatchView, AddOwnWatchResult, DropOwnWatchInput, DropOwnWatchResult, AskQuestionKind, AskedOptionSchema, AskedQuestionSchema, AskInput, RegisteredQuestionView, AskResult, UnaskInput, UnaskResult, QuestionAnswerSchema, AnswerQuestionsInput, AnswerQuestionsResult, DismissQuestionsInput, DismissQuestionsResult, MarkOwnDoneInput, MarkOwnDoneResult, ListOwnPrWatchesInput, OwnPrWatchesResult, ThreadTimerView, ThreadFence, LimitWindow, LimitPause, ThreadView, BoardErrorItem, BoardSnapshot, QuotaWindow, ProviderQuota, QuotaSnapshot, ProviderAuth, AccountEmails, AuthSnapshot, AccountLogoutInput, AccountLogoutResult, AccountLoginStartInput, AccountLoginStartResult, AccountLoginStatusInput, AccountLoginStatusResult, PermissionMode, LocalFileOpener, Settings, DispatchProviderPreferences, DispatchPreferences, DispatchProfileSnapshot, SetDispatchPreferenceInput, DispatchInput, ADOPT_THREAD_MESSAGE_MAX_CHARS, AdoptThreadInput, AdoptThreadResult, AdoptSessionInput, FollowUpInput, UnqueueFollowUpInput, UnqueueFollowUpResult, DeliverQueuedNowInput, DeliverQueuedNowResult, SetThreadSnoozeInput, SetThreadPinnedInput, SetThreadRecurringPromptInput, SetOwnThreadRecurringPromptInput, SetOwnThreadRecurringPromptResult, GetOwnThreadRecurringPromptInput, OwnThreadRecurringPromptResult, SetOwnThreadTimerInput, CancelOwnThreadTimerInput, ListOwnThreadTimersInput, OwnThreadTimersResult, ThreadActivityItem, ListOwnThreadActivityInput, OwnThreadActivityResult, SetOwnThreadTimerResult, CancelOwnThreadTimerResult, SetOwnThreadStopHookInput, SetOwnThreadHeartbeatInput, ThreadPluginReloadResult, RenameThreadInput, AiRenameThreadInput, AiRenameThreadResult, SetOwnThreadTitleInput, SetOwnThreadTitleResult, SetThreadPermissionInput, SetThreadPermissionResult, ThreadProfileOptionsInput, ThreadProfileOptionsResult, ThreadSkillSource, ThreadSkill, ThreadSkillsInput, ThreadSkillsResult, SetThreadProfileInput, SetThreadProfileResult, DISPATCH_TASK_BANNER, DISPATCH_TASK_BANNER_MARKER, HUMAN_GAP_FLOOR_MS, GithubWakeItem, GithubWakeSteer, WAKE_SCOPE, WAKE_REF, WAKE_SINGLE, WAKE_MULTI_HEAD, PR_WATCH_FINISHED, PR_WATCH_CI_PASSED, PR_WATCH_CI_FAILED, GithubStatus, GithubRefCard, GithubRefPreviewInput, GithubRefPreviewResult, GithubItem, GithubListInput, GithubListResult, GithubBatchInput, GithubBatchResult, BoardMeta, ServerEvent, TranscriptEdit, TranscriptTodo, TranscriptToolCall, TranscriptPart, TranscriptMessage, TranscriptPageCursor, EditedFile, TranscriptPage, TranscriptEarlierInput, SocketTranscriptSlug, SocketFilePath, SocketTranscriptClientMsg, SocketFileClientMsg, SocketClientMsg, ProjectCard, PROJECT_ICON_MAX_BASE64_CHARS, DirectoryPickResult, ThreadLocation, FRIZZ_ROUTE_PREFIX, DEFAULT_PORT;
12472
+ var import_yaml, ATTACHMENT_IMAGE_EXTENSIONS, ATTACHMENT_TEXT_EXTENSIONS, ATTACHMENT_OFFICE_EXTENSIONS, ATTACHMENT_DATA_EXTENSIONS, ATTACHMENT_ARCHIVE_EXTENSIONS, ATTACHMENT_DOC_EXTENSIONS, ATTACHMENT_EXTENSIONS, ATTACHMENT_MAX_BASE64_CHARS, ATTACHMENT_MAX_BYTES, ATTACHMENT_EXT_SET, ATTACHMENT_ACCEPT, FrizzStatus, BlockMechanism, RuntimeState, Backend, CodexModel, ThreadProfileOption, ThreadAgent, SubAgentView, BgShellView, CompletionHoldOp, CompletionHold, AskOption, AskQuestion, PendingAsk, AwaitingHint, RETIRED_AWAITING_KINDS, RETIRED_LINE_RE, AWAITING_FOR_MAX_MS, SnoozeUntil, SNOOZE_PROMPT_MAX, SnoozePrompt, RECURRING_PROMPT_MAX, RECURRING_MIN_INTERVAL_SECONDS, RECURRING_MAX_INTERVAL_SECONDS, RecurringPromptText, RecurringIntervalSeconds, ThreadRecurringPrompt, TIMER_PROMPT_MAX, TIMER_MAX_DELAY_SECONDS, TimerPromptText, SIGNOFF_NUDGE_MARKER, SIGNOFF_NUDGE_MESSAGE, ThreadWatchKind, GithubChecksState, GithubMergeState, GithubWatchStatus, ThreadWatchView, PR_WATCH_FOR_MAX_MS, PR_WATCH_DEFAULT_FOR_MS, PrWatchView, AddOwnPrWatchInput, AddOwnPrWatchResult, DropOwnPrWatchInput, DropOwnPrWatchResult, OwnWatchKind, AddOwnWatchInput, OwnWatchView, AddOwnWatchResult, DropOwnWatchInput, DropOwnWatchResult, AskQuestionKind, AskedOptionSchema, AskedQuestionSchema, AskInput, RegisteredQuestionView, AskResult, UnaskInput, UnaskResult, QuestionAnswerSchema, AnswerQuestionsInput, AnswerQuestionsResult, DismissQuestionsInput, DismissQuestionsResult, MarkOwnDoneInput, MarkOwnDoneResult, ListOwnPrWatchesInput, OwnPrWatchesResult, ThreadTimerView, ThreadFence, LimitWindow, LimitPause, ThreadView, BoardErrorItem, BoardSnapshot, QuotaWindow, ProviderQuota, QuotaSnapshot, ProviderAuth, AccountEmails, AuthSnapshot, AccountLogoutInput, AccountLogoutResult, AccountLoginStartInput, AccountLoginStartResult, AccountLoginStatusInput, AccountLoginStatusResult, PermissionMode, LocalFileOpener, Settings, DispatchProviderPreferences, DispatchPreferences, DispatchProfileSnapshot, SetDispatchPreferenceInput, DispatchInput, ADOPT_THREAD_MESSAGE_MAX_CHARS, AdoptThreadInput, AdoptThreadResult, AdoptSessionInput, FollowUpInput, UnqueueFollowUpInput, UnqueueFollowUpResult, DeliverQueuedNowInput, DeliverQueuedNowResult, SetThreadSnoozeInput, SetThreadPinnedInput, SetThreadRecurringPromptInput, SetOwnThreadRecurringPromptInput, SetOwnThreadRecurringPromptResult, GetOwnThreadRecurringPromptInput, OwnThreadRecurringPromptResult, SetOwnThreadTimerInput, CancelOwnThreadTimerInput, ListOwnThreadTimersInput, OwnThreadTimersResult, ThreadActivityItem, ListOwnThreadActivityInput, OwnThreadActivityResult, SetOwnThreadTimerResult, CancelOwnThreadTimerResult, SetOwnThreadStopHookInput, SetOwnThreadHeartbeatInput, ThreadPluginReloadResult, RenameThreadInput, AiRenameThreadInput, AiRenameThreadResult, SetOwnThreadTitleInput, SetOwnThreadTitleResult, SetThreadPermissionInput, SetThreadPermissionResult, ThreadProfileOptionsInput, ThreadProfileOptionsResult, ThreadSkillSource, ThreadSkill, ThreadSkillsInput, ThreadSkillsResult, SetThreadProfileInput, SetThreadProfileResult, DISPATCH_TASK_BANNER, DISPATCH_TASK_BANNER_MARKER, HUMAN_GAP_FLOOR_MS, GithubWakeItem, GithubWakeSteer, WAKE_SCOPE, WAKE_REF, WAKE_SINGLE, WAKE_MULTI_HEAD, PR_WATCH_FINISHED, PR_WATCH_CI_PASSED, PR_WATCH_CI_GATED, PR_WATCH_STATE, PR_WATCH_CI_FAILED, GithubStatus, GithubRefCard, GithubRefPreviewInput, GithubRefPreviewResult, GithubItem, GithubListInput, GithubListResult, GithubBatchInput, GithubBatchResult, BoardMeta, ServerEvent, TranscriptEdit, TranscriptTodo, TranscriptToolCall, TranscriptPart, TranscriptMessage, TranscriptPageCursor, EditedFile, TranscriptPage, TranscriptEarlierInput, SocketTranscriptSlug, SocketFilePath, SocketTranscriptClientMsg, SocketFileClientMsg, SocketClientMsg, ProjectCard, PROJECT_ICON_MAX_BASE64_CHARS, DirectoryPickResult, ThreadLocation, FRIZZ_ROUTE_PREFIX, DEFAULT_PORT;
12466
12473
  var init_src = __esm({
12467
12474
  "packages/shared/src/index.ts"() {
12468
12475
  "use strict";
@@ -12477,6 +12484,7 @@ var init_src = __esm({
12477
12484
  init_interactions();
12478
12485
  init_receipt_bus();
12479
12486
  init_relay_protocol();
12487
+ init_shell_writes();
12480
12488
  init_thread_slug();
12481
12489
  ATTACHMENT_IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "gif", "webp"];
12482
12490
  ATTACHMENT_TEXT_EXTENSIONS = [
@@ -12882,6 +12890,19 @@ var init_src = __esm({
12882
12890
  running: external_exports.number().int().nonnegative(),
12883
12891
  passed: external_exports.number().int().nonnegative(),
12884
12892
  failed: external_exports.number().int().nonnegative(),
12893
+ /** Checks that reached a terminal state without asserting anything — GitHub's `SKIPPED` and `STALE`.
12894
+ * Counted apart from `passed` since 2026-09-04: they were folded into it, so a rollup of 12 skipped
12895
+ * no-ops and 3 label bots rendered and reported as "15 checks green". Defaulted, because a reading
12896
+ * written before that date carries neither this nor `gated`. */
12897
+ skipped: external_exports.number().int().nonnegative().default(0),
12898
+ /** Workflows held at `action_required` — GitHub's "Approve and run" gate on a fork or first-time
12899
+ * contributor's PR. They produce NO check run, so they are absent from the rollup entirely and the
12900
+ * poll cannot see them there; the head's workflow runs are where they show up. Non-zero means CI has
12901
+ * not started and will not until a maintainer presses the button. */
12902
+ gated: external_exports.number().int().nonnegative().default(0),
12903
+ /** The gated workflow NAMES, capped — "Test Linux, Test macOS, Linters" says what is being withheld,
12904
+ * where a bare count does not. */
12905
+ gating: external_exports.array(external_exports.string()).max(8).default([]),
12885
12906
  /** The failing job NAMES, capped — what a human actually needs to decide whether to look. */
12886
12907
  failing: external_exports.array(external_exports.string()).max(8).default([]),
12887
12908
  merge: GithubMergeState,
@@ -13889,7 +13910,9 @@ ${DISPATCH_TASK_BANNER}
13889
13910
  String.raw`^(👤|🤖) (\d+) new GitHub items on (${WAKE_REF})\. Read exactly these — ` + WAKE_SCOPE + String.raw` — and continue:$`
13890
13911
  );
13891
13912
  PR_WATCH_FINISHED = new RegExp(String.raw`^⏰ (${WAKE_REF}) was (MERGED|CLOSED)\.$`);
13892
- PR_WATCH_CI_PASSED = new RegExp(String.raw`^✅ CI PASSED on (${WAKE_REF}) — (\d+) checks? green\.$`);
13913
+ PR_WATCH_CI_PASSED = new RegExp(String.raw`^✅ CI PASSED on (${WAKE_REF}) — (\d+) checks? green(?:, (\d+) skipped)?\.$`);
13914
+ PR_WATCH_CI_GATED = new RegExp(String.raw`^⏸️ CI on (${WAKE_REF}) is WAITING FOR APPROVAL — (\d+) workflows? held(?:: (.+?))?\.$`);
13915
+ PR_WATCH_STATE = new RegExp(String.raw`^🔔 (${WAKE_REF}): (.+)\.$`);
13893
13916
  PR_WATCH_CI_FAILED = new RegExp(String.raw`^❌ CI FAILED on (${WAKE_REF})(?:: (.+?))?\.$`);
13894
13917
  GithubStatus = external_exports.object({
13895
13918
  installed: external_exports.boolean(),
@@ -22114,6 +22137,248 @@ import { request as requestHttp, createServer } from "node:http";
22114
22137
  import { connect } from "node:net";
22115
22138
  init_local_origin();
22116
22139
  init_local_image();
22140
+
22141
+ // packages/server/src/supervisor-pages.ts
22142
+ function escapeHtml(value) {
22143
+ return value.replace(/[&<>"']/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
22144
+ }
22145
+ function retryTarget(url) {
22146
+ return url.startsWith("/") && !url.startsWith("//") ? url : "/";
22147
+ }
22148
+ var BASE_STYLE = `
22149
+ *,*::before,*::after{box-sizing:border-box}
22150
+ :root{
22151
+ color-scheme:dark;
22152
+ --bg:#0d0e10;--panel:#131519;--panel-2:#181b20;
22153
+ --border:#26282d;--border-strong:#33363c;
22154
+ --fg:#e6e7e9;--muted:#8b8f96;--accent:#e8b923;--danger:#fca5a5;
22155
+ --sans:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
22156
+ --mono:ui-monospace,"JetBrains Mono","SF Mono","Cascadia Mono",Menlo,Consolas,monospace;
22157
+ --ease:cubic-bezier(0,0,.2,1);
22158
+ }
22159
+ html,body{background:var(--bg)}
22160
+ body{
22161
+ margin:0;min-height:100vh;min-height:100dvh;
22162
+ display:flex;align-items:center;justify-content:center;padding:24px;
22163
+ color:var(--fg);font-family:var(--sans);font-size:12.5px;line-height:1.55;
22164
+ -webkit-font-smoothing:antialiased;
22165
+ }
22166
+ html[data-font=mono] body{font-family:var(--mono)}
22167
+ main{width:100%;max-width:28rem;padding:18px;border:1px solid var(--border-strong);border-radius:12px;background:var(--panel-2)}
22168
+ h1{margin:0;display:flex;align-items:baseline;gap:7px;font-size:14px;font-weight:600;letter-spacing:-.01em;line-height:1.4}
22169
+ p{margin:0;text-wrap:pretty}
22170
+ .detail{margin-top:7px;color:color-mix(in srgb,var(--fg) 88%,transparent)}
22171
+ .note{margin-top:12px;padding-top:11px;border-top:1px solid var(--border);color:var(--muted);font-size:11.5px;line-height:1.6}
22172
+ code{font-family:var(--mono);font-size:.92em;padding:.1em .35em;border-radius:4px;background:var(--panel);border:1px solid var(--border);white-space:nowrap}
22173
+ [hidden]{display:none!important}
22174
+ `.trim();
22175
+ var RECOVERY_STYLE = `
22176
+ .actions{margin-top:14px;display:flex;flex-wrap:wrap;gap:8px}
22177
+ /* ErrorBoundary's ACTION_CLASS, one size up for a page that is alone in a viewport. */
22178
+ .btn{
22179
+ appearance:none;display:inline-flex;align-items:center;
22180
+ border:1px solid var(--border);border-radius:6px;background:transparent;
22181
+ padding:5px 10px;font:inherit;font-size:11.5px;color:color-mix(in srgb,var(--fg) 90%,transparent);
22182
+ cursor:pointer;text-decoration:none;
22183
+ transition:background-color 120ms var(--ease),border-color 120ms var(--ease),color 120ms var(--ease);
22184
+ }
22185
+ .btn:hover{background:var(--panel);border-color:var(--border-strong);color:var(--fg)}
22186
+ .btn:focus-visible{outline:none;border-color:color-mix(in srgb,var(--accent) 55%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 22%,transparent)}
22187
+ .btn:disabled{opacity:.5;pointer-events:none}
22188
+ /* min-height holds the slot open while it is LIVE, so a changing status line never nudges the card;
22189
+ :empty collapses it when there is nothing live to say, so a halted card has no trailing gutter. */
22190
+ .probe{margin-top:12px;font-family:var(--mono);font-size:11px;line-height:1.5;color:var(--muted);min-height:1.5em}
22191
+ .probe:empty{margin-top:0;min-height:0}
22192
+ /* RestartFailureNotice's block, at this altitude: a supervisor \`message\` is raw build output, and it
22193
+ reads as what it is \u2014 a terminal excerpt \u2014 only inside a scrolling mono box. */
22194
+ .log{
22195
+ margin-top:10px;max-height:16rem;overflow:auto;white-space:pre-wrap;overflow-wrap:break-word;
22196
+ border:1px solid var(--border);border-radius:6px;background:var(--panel);padding:8px 10px;
22197
+ font-family:var(--mono);font-size:11px;line-height:1.6;color:color-mix(in srgb,var(--fg) 70%,transparent);
22198
+ }
22199
+
22200
+ /* THE LIVE DOT, and it is the app's own \`.frizz-live-dot\` \u2014 same 6px, same 28%/14% halo, same 1.25s
22201
+ cadence \u2014 because it means the same thing here that it means there: work is in flight.
22202
+
22203
+ Alignment is an INK problem. A baseline-aligned flex item with no text of its own contributes its
22204
+ BORDER-BOX BOTTOM as the baseline, so the dot's ink centre lands 3px above it while the cap band's
22205
+ centre sits 0.5cap above it. \`cap\` is the resolved font's own cap height, so the correction holds
22206
+ in BOTH board fonts and at any size, with nothing to re-measure when the type scale moves or the
22207
+ font setting flips. The em spelling is the fallback for a browser without the unit (.35em ~= 0.5 x a
22208
+ 0.7em cap) and is overwritten wherever \`cap\` parses. */
22209
+ .dot{
22210
+ width:6px;height:6px;flex:0 0 auto;border-radius:9999px;background:var(--accent);
22211
+ box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 28%,transparent);
22212
+ animation:frizz-live-pulse 1.25s ease-in-out infinite;
22213
+ transform:translateY(calc(3px - .35em));
22214
+ transform:translateY(calc(3px - .5cap));
22215
+ }
22216
+ .dot[data-state=idle]{animation:none;background:var(--muted);box-shadow:none}
22217
+ .dot[data-state=bad]{animation:none;background:var(--danger);box-shadow:0 0 0 1px color-mix(in srgb,var(--danger) 28%,transparent)}
22218
+ @keyframes frizz-live-pulse{50%{opacity:.62;box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 14%,transparent)}}
22219
+ @media (prefers-reduced-motion:reduce){
22220
+ .dot{animation:none;background:transparent;border:2px solid var(--accent);box-shadow:none}
22221
+ .dot[data-state=idle]{border-color:var(--muted)}
22222
+ .dot[data-state=bad]{border-color:var(--danger);background:transparent}
22223
+ }
22224
+
22225
+ /* The app's \`.shimmer-text\`: a highlight sweeping muted text is how this product says "working", and
22226
+ the probe line is the only thing on the page that is. */
22227
+ .probe[data-live=yes]{
22228
+ color:transparent;
22229
+ background:linear-gradient(90deg,var(--muted) 0%,var(--muted) 35%,var(--fg) 50%,var(--muted) 65%,var(--muted) 100%) 0 0/200% 100%;
22230
+ -webkit-background-clip:text;background-clip:text;
22231
+ animation:frizz-shimmer 2.2s linear infinite;
22232
+ }
22233
+ @keyframes frizz-shimmer{from{background-position:200% 0}to{background-position:-200% 0}}
22234
+ @media (prefers-reduced-motion:reduce){
22235
+ .probe[data-live=yes]{animation:none;background:none;color:var(--muted)}
22236
+ }
22237
+ `.trim();
22238
+ var FONT_SCRIPT = `try{document.documentElement.dataset.font=localStorage.getItem("frizz-font")==="mono"?"mono":"sans"}catch{}`;
22239
+ var RECOVERY_SCRIPT = `
22240
+ (function(){
22241
+ var target=document.body.dataset.target||"/"
22242
+ var heading=document.getElementById("heading")
22243
+ var detail=document.getElementById("detail")
22244
+ var probe=document.getElementById("probe")
22245
+ var log=document.getElementById("log")
22246
+ var dot=document.getElementById("dot")
22247
+ var restart=document.getElementById("restart")
22248
+ var BUDGET=120000,MIN=600,MAX=4000,GROWTH=1.4
22249
+ var delay=MIN,deadline=Date.now()+BUDGET,timer=0,stopped=false,busy=false,told=""
22250
+
22251
+ function say(text,live){probe.textContent=text;probe.setAttribute("data-live",live?"yes":"no")}
22252
+ function halt(text,bad){stopped=true;clearTimeout(timer);dot.setAttribute("data-state",bad?"bad":"idle");say(text,false)}
22253
+ function showLog(message){if(message){log.textContent=message;log.hidden=false}else{log.hidden=true}}
22254
+ function resume(){stopped=false;busy=false;delay=MIN;deadline=Date.now()+BUDGET;dot.removeAttribute("data-state");clearTimeout(timer);timer=setTimeout(tick,0)}
22255
+
22256
+ // 503 is this proxy's own "no child". Every other answer \u2014 200, 404, even a 500 from the app \u2014 means
22257
+ // something is listening again, and the reader's own URL is the right thing to ask.
22258
+ function alive(){
22259
+ return fetch(target,{method:"HEAD",cache:"no-store",credentials:"same-origin"})
22260
+ .then(function(r){return r.status!==503}).catch(function(){return false})
22261
+ }
22262
+ function readStatus(){
22263
+ return fetch("/_frizz/control/status",{cache:"no-store",headers:{"cache-control":"no-store"}})
22264
+ .then(function(r){return r.ok?r.json():null})
22265
+ .then(function(b){return b&&b.protocol===1?b:null}).catch(function(){return null})
22266
+ }
22267
+
22268
+ // An unreachable launcher leaves the server-rendered copy alone: it is already right for the case
22269
+ // that rendered it, and guessing over it would be worse than saying nothing.
22270
+ function narrate(status){
22271
+ if(!status||status.state===told)return
22272
+ told=status.state
22273
+ if(status.state==="failed"){
22274
+ heading.textContent="Frizz did not restart"
22275
+ // Not a second copy of the note below it \u2014 a lead-in to the log, which is the next thing down.
22276
+ detail.textContent="The launcher could not bring the application server back, and reported this:"
22277
+ showLog(status.message||"The launcher gave no reason.")
22278
+ halt("",true)
22279
+ return
22280
+ }
22281
+ showLog("")
22282
+ if(status.state==="restarting"){
22283
+ heading.textContent="Frizz is restarting"
22284
+ detail.textContent="The application server is coming back up."
22285
+ }
22286
+ }
22287
+
22288
+ function tick(){
22289
+ if(stopped||busy)return
22290
+ // A hidden tab neither polls nor spends its budget; visibilitychange starts the loop again.
22291
+ if(document.hidden)return
22292
+ alive().then(function(up){
22293
+ if(up){say("Frizz is back. Reloading.",true);location.replace(target);return}
22294
+ return readStatus().then(function(status){
22295
+ narrate(status)
22296
+ if(stopped)return
22297
+ if(Date.now()>deadline){halt("No answer after 2m. This page stopped checking.",false);return}
22298
+ delay=Math.min(MAX,delay*GROWTH)
22299
+ say("Waiting for Frizz",true)
22300
+ timer=setTimeout(tick,delay)
22301
+ })
22302
+ })
22303
+ }
22304
+
22305
+ document.addEventListener("visibilitychange",function(){
22306
+ if(document.hidden||stopped||busy)return
22307
+ resume()
22308
+ })
22309
+
22310
+ restart.addEventListener("click",function(){
22311
+ if(busy)return
22312
+ busy=true;stopped=false;told="";clearTimeout(timer)
22313
+ restart.disabled=true;restart.textContent="Restarting"
22314
+ dot.removeAttribute("data-state");showLog("");say("Restarting Frizz",true)
22315
+ fetch("/_frizz/control/restart",{method:"POST",headers:{"cache-control":"no-store"}})
22316
+ .then(function(r){return r.json().catch(function(){return null}).then(function(b){return{ok:r.ok,status:r.status,body:b}})})
22317
+ .catch(function(){return{ok:false,status:0,body:null}})
22318
+ .then(function(r){
22319
+ restart.disabled=false;restart.textContent="Restart Frizz";busy=false
22320
+ if(!r.ok){
22321
+ heading.textContent="Frizz did not restart"
22322
+ detail.textContent="The launcher could not bring the application server back, and reported this:"
22323
+ showLog((r.body&&r.body.message)||("The launcher refused the restart ("+(r.status||"no response")+")."))
22324
+ halt("",true)
22325
+ return
22326
+ }
22327
+ // Accepted. The probe, not this response, decides whether the child is actually back.
22328
+ resume()
22329
+ })
22330
+ })
22331
+
22332
+ say("Waiting for Frizz",true)
22333
+ tick()
22334
+ })()
22335
+ `.trim();
22336
+ function documentShell(options2) {
22337
+ return `<!doctype html><html lang="en" data-font="sans"><head><meta charset="utf-8"><title>${options2.title}</title><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="color-scheme" content="dark"><meta name="theme-color" content="#0d0e10"><style>${options2.style ? `${BASE_STYLE}
22338
+ ${options2.style}` : BASE_STYLE}</style>` + (options2.font ? `<script>${FONT_SCRIPT}</script>` : "") + `</head><body${options2.bodyAttributes ? ` ${options2.bodyAttributes}` : ""}><main>${options2.body}</main>` + (options2.script ? `<script>${options2.script}</script>` : "") + `</body></html>`;
22339
+ }
22340
+ var RECOVERY_COPY = {
22341
+ starting: {
22342
+ title: "Restarting | Frizz",
22343
+ heading: "Frizz is restarting",
22344
+ detail: "The application server is not listening yet. This page reloads as soon as it answers."
22345
+ },
22346
+ unreachable: {
22347
+ title: "Not responding | Frizz",
22348
+ heading: "Frizz is not responding",
22349
+ detail: "The application server accepted this request and then dropped it. Restarting it usually clears this."
22350
+ }
22351
+ };
22352
+ var THREADS_NOTE = "Threads already running are not affected. Each runs as its own detached process, and Frizz reattaches to it on restart.";
22353
+ function recoveryPage(url, variant = "starting") {
22354
+ const copy = RECOVERY_COPY[variant];
22355
+ const target2 = escapeHtml(retryTarget(url));
22356
+ return documentShell({
22357
+ title: copy.title,
22358
+ style: RECOVERY_STYLE,
22359
+ font: true,
22360
+ bodyAttributes: `data-target="${target2}"`,
22361
+ body: `<h1><span class="dot" id="dot" aria-hidden="true"></span><span id="heading">${copy.heading}</span></h1><p class="detail" id="detail">${copy.detail}</p><pre class="log" id="log" hidden></pre><p class="note">${THREADS_NOTE}</p><div class="actions"><a class="btn" href="${target2}">Try again</a><button class="btn" type="button" id="restart">Restart Frizz</button></div><p class="probe" id="probe" aria-live="polite"></p>`,
22362
+ script: RECOVERY_SCRIPT
22363
+ });
22364
+ }
22365
+ function unauthorizedPage(reason) {
22366
+ const detail = reason === "already-used" ? "That link has already been used. Generate a fresh one." : reason === "expired" ? "That link expired. Generate a fresh one." : "This address needs a current access link.";
22367
+ return documentShell({
22368
+ title: "Unauthorized",
22369
+ body: `<h1>Unauthorized</h1><p class="detail">${detail}</p>`
22370
+ });
22371
+ }
22372
+ function unlistedHostPage(name) {
22373
+ const shown = escapeHtml(name);
22374
+ return documentShell({
22375
+ title: "Not served by this name",
22376
+ font: true,
22377
+ body: `<h1>Not served by this name</h1><p class="detail">Frizz does not answer to <code>${shown}</code>. A name a browser has to resolve is how DNS rebinding makes another site's page count as this board, so an exposed board accepts only its own hostname and the names its operator lists.</p><p class="note">Open the board by its IP address, or relaunch with <code>--allowed-host ${shown}</code> (or <code>FRIZZ_ALLOWED_HOSTS=${shown}</code>) to accept this one.</p>`
22378
+ });
22379
+ }
22380
+
22381
+ // packages/server/src/restart-supervisor.ts
22117
22382
  init_src();
22118
22383
  var SUPERVISOR_CONTROL_PREFIX = "/_frizz/control";
22119
22384
  var SUPERVISOR_RESTART_PATH = `${SUPERVISOR_CONTROL_PREFIX}/restart`;
@@ -22126,10 +22391,6 @@ function responseJson(res, status, value) {
22126
22391
  res.writeHead(status, { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" });
22127
22392
  res.end(JSON.stringify(value));
22128
22393
  }
22129
- function recoveryPage(url, detail = "Frizz is restarting or unavailable.") {
22130
- const escaped = url.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll('"', "&quot;");
22131
- return `<!doctype html><meta charset="utf-8"><title>Frizz recovering</title><meta name="viewport" content="width=device-width,initial-scale=1"><style>body{margin:3rem;font:16px system-ui;color:#e7e7e7;background:#171717}main{max-width:36rem;padding:1.5rem;border:1px solid #444;border-radius:.75rem;background:#222}a{color:#f7d64a}</style><main><h1>Frizz is recovering</h1><p>${detail}</p><p><a href="${escaped}">Try this page again</a></p></main>`;
22132
- }
22133
22394
  function proxyHeaders(req, childPort, vouchSameOrigin = false) {
22134
22395
  const headers = { ...req.headers };
22135
22396
  headers.host = `127.0.0.1:${childPort}`;
@@ -22151,14 +22412,6 @@ function readCookie(header, name) {
22151
22412
  }
22152
22413
  return void 0;
22153
22414
  }
22154
- function unauthorizedPage(reason) {
22155
- const detail = reason === "already-used" ? "That link has already been used. Generate a fresh one." : reason === "expired" ? "That link expired. Generate a fresh one." : "This address needs a current access link.";
22156
- return `<!doctype html><meta charset="utf-8"><title>Unauthorized</title><meta name="viewport" content="width=device-width,initial-scale=1"><style>body{margin:3rem;font:16px system-ui;color:#e7e7e7;background:#171717}main{max-width:30rem;padding:1.5rem;border:1px solid #444;border-radius:.75rem;background:#222}</style><main><h1>Unauthorized</h1>${detail ? `<p>${detail}</p>` : ""}</main>`;
22157
- }
22158
- function unlistedHostPage(name) {
22159
- const shown = name.replace(/[&<>"]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" })[c]);
22160
- return `<!doctype html><meta charset="utf-8"><title>Not served by this name</title><meta name="viewport" content="width=device-width,initial-scale=1"><style>body{margin:3rem;font:16px system-ui;color:#e7e7e7;background:#171717}main{max-width:34rem;padding:1.5rem;border:1px solid #444;border-radius:.75rem;background:#222}code{font:14px ui-monospace,monospace;padding:.1em .3em;border-radius:.3em;background:#333;white-space:nowrap}</style><main><h1>Not served by this name</h1><p>Frizz does not answer to <code>${shown}</code>. A name a browser has to resolve is how DNS rebinding makes another site's page count as this board, so an exposed board accepts only its own hostname and the names its operator lists.</p><p>Open the board by its IP address, or relaunch with <code>--allowed-host ${shown}</code> (or <code>FRIZZ_ALLOWED_HOSTS=${shown}</code>) to accept this one.</p></main>`;
22161
- }
22162
22415
  function isControlRequest(req) {
22163
22416
  const url = new URL(req.url ?? "/", "http://frizz.invalid");
22164
22417
  return url.pathname === SUPERVISOR_RESTART_PATH || url.pathname === SUPERVISOR_UPDATE_RESTART_PATH || url.pathname === SUPERVISOR_STATUS_PATH || url.pathname === SUPERVISOR_ACCESS_CODE_PATH || url.pathname === SUPERVISOR_SESSIONS_PATH;
@@ -22572,7 +22825,7 @@ var RestartSupervisorProxy = class {
22572
22825
  upstream.once("error", () => {
22573
22826
  if (res.headersSent) return res.destroy();
22574
22827
  res.writeHead(503, { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" });
22575
- res.end(recoveryPage(req.url ?? "/", "The Frizz application server is unavailable. Use Restart Frizz to recover it."));
22828
+ res.end(recoveryPage(req.url ?? "/", "unreachable"));
22576
22829
  });
22577
22830
  req.pipe(upstream);
22578
22831
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frizz",
3
- "version": "0.10.1",
3
+ "version": "0.12.0",
4
4
  "private": false,
5
5
  "description": "A local web UI for running many coding agents at once",
6
6
  "keywords": [
@@ -37,7 +37,7 @@
37
37
  "frizz-dev:check": "nub scripts/install-global-cli.mjs --check",
38
38
  "frizz-dev:uninstall": "nub scripts/install-global-cli.mjs --uninstall",
39
39
  "install:global": "nub scripts/install-global-cli.mjs",
40
- "typecheck": "tsc -b packages/shared packages/rpc packages/server packages/registrar packages/relay . && pnpm --filter @frizz/web typecheck",
40
+ "typecheck": "tsc -b packages/shared packages/rpc packages/server packages/registrar packages/relay . packages/web",
41
41
  "test": "nub scripts/run-tests.mjs",
42
42
  "test:e2e": "nub scripts/e2e-web.mjs",
43
43
  "prepack": "node ./scripts/prepare-package.mjs && node ./scripts/build-package.mjs && node ./scripts/publish-manifest.mjs --strip",
@@ -1040,9 +1040,13 @@ async function callRpc(procedure, body) {
1040
1040
  function threadSlug() {
1041
1041
  const slug = process.env.FRIZZ_THREAD_SLUG || process.env.FRIZZ_THREAD
1042
1042
  if (!slug) {
1043
+ // Ten tools resolve their caller through here, so the message must not name one of them. It said
1044
+ // "so it cannot arm a goal for it" for every single one — which read as a bug in `goal` no matter
1045
+ // which tool the worker had actually called, and sent at least one worker off debugging the wrong
1046
+ // thing after `title` failed on a codex thread.
1043
1047
  throw new Error(
1044
1048
  "this frizz MCP server was not told which thread it belongs to (no FRIZZ_THREAD_SLUG), so it cannot " +
1045
- "arm a goal for it. This is a frizz bug — report it rather than working around it.",
1049
+ "act on the caller's own thread. This is a frizz bug — report it rather than working around it.",
1046
1050
  )
1047
1051
  }
1048
1052
  return slug