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.
- package/README.md +3 -3
- package/dist/claude-agent-broker.js +31614 -18063
- package/dist/dev-child.js +2226 -937
- package/dist/frizz.js +268 -15
- package/package.json +2 -2
- package/runtime/cc-worker/bin/frizz-mcp.mjs +5 -1
- package/web-dist/assets/{TerminalPane-VbmxsjxK.js → TerminalPane-C2BnRGVg.js} +1 -1
- package/web-dist/assets/{abnfDiagram-VRR7QNED-CBCkSzJg.js → abnfDiagram-VRR7QNED-CnMUakri.js} +1 -1
- package/web-dist/assets/architecture-TIHT7OUA-9QsSz9gn.js +1 -0
- package/web-dist/assets/{architectureDiagram-ZJ3FMSHR-Rd44A8-r.js → architectureDiagram-ZJ3FMSHR-Dw49H3Py.js} +1 -1
- package/web-dist/assets/{blockDiagram-677ZJIJ3-C8vX06UX.js → blockDiagram-677ZJIJ3-BWgasm3g.js} +1 -1
- package/web-dist/assets/{c4Diagram-LMCZKHZV-CMMjtui-.js → c4Diagram-LMCZKHZV-CmiVMi-q.js} +1 -1
- package/web-dist/assets/channel-CLXyIE2F.js +1 -0
- package/web-dist/assets/{chunk-32BRIVSS-DtsFPb8y.js → chunk-32BRIVSS-DsFcmMav.js} +1 -1
- package/web-dist/assets/{chunk-52WLFC77-35RvKhG9.js → chunk-52WLFC77-C8TmIbAt.js} +1 -1
- package/web-dist/assets/{chunk-C7G6YPKG-Dusr0gOw.js → chunk-C7G6YPKG-CWaIqGh7.js} +1 -1
- package/web-dist/assets/{chunk-EX3LRPZG-BadaF-x2.js → chunk-EX3LRPZG-BGtDaEG5.js} +1 -1
- package/web-dist/assets/{chunk-FWX5IMBZ-CpQ7yEDx.js → chunk-FWX5IMBZ-DIYLz03w.js} +2 -2
- package/web-dist/assets/{chunk-HOUHSVGY-CxygFxWC.js → chunk-HOUHSVGY-DEXmjuFh.js} +1 -1
- package/web-dist/assets/{chunk-ICXQ74PX-YC4-v0mV.js → chunk-ICXQ74PX-d7qYOhhi.js} +1 -1
- package/web-dist/assets/{chunk-MOJQB5TN-CTgO9Z8o.js → chunk-MOJQB5TN-DclXMP_a.js} +1 -1
- package/web-dist/assets/{chunk-OGEWGWER-D87J1JIz.js → chunk-OGEWGWER-Dn3qS913.js} +1 -1
- package/web-dist/assets/{chunk-PUDLZKDR-CVB9kmxS.js → chunk-PUDLZKDR-BVShtfU4.js} +1 -1
- package/web-dist/assets/{chunk-Q4XR5HBZ-B2a88YVr.js → chunk-Q4XR5HBZ-CGTdESx1.js} +1 -1
- package/web-dist/assets/{chunk-V7JOEXUC-DoFngcpl.js → chunk-V7JOEXUC-DyJOjr9v.js} +1 -1
- package/web-dist/assets/{chunk-VAUOI2AC-X71d5AYZ.js → chunk-VAUOI2AC-D4IP434V.js} +1 -1
- package/web-dist/assets/{chunk-VR4S4FIN-39jPx_ES.js → chunk-VR4S4FIN-BmthV8JY.js} +1 -1
- package/web-dist/assets/{chunk-WYO6CB5R-CnCFbrQ7.js → chunk-WYO6CB5R-B7WZtej7.js} +1 -1
- package/web-dist/assets/{chunk-ZGVPDNZ5-B7wPa-pc.js → chunk-ZGVPDNZ5-C5udBDd8.js} +1 -1
- package/web-dist/assets/classDiagram-OUVF2IWQ-CIWfuY4b.js +1 -0
- package/web-dist/assets/classDiagram-v2-EOCWNBFH-CIWfuY4b.js +1 -0
- package/web-dist/assets/{cynefin-VYW2F7L2-C4GE-6ZJ.js → cynefin-VYW2F7L2-BGCAuICx.js} +1 -1
- package/web-dist/assets/{cynefinDiagram-TSTJHNR4-DM7vNSjQ.js → cynefinDiagram-TSTJHNR4-DrcSp3T9.js} +1 -1
- package/web-dist/assets/{dagre-VKFMJZFB-CBRFVbWb.js → dagre-VKFMJZFB-DpwUEsqR.js} +1 -1
- package/web-dist/assets/{diagram-FQU43EPY-D3t9pHH6.js → diagram-FQU43EPY-BpFw8lh3.js} +1 -1
- package/web-dist/assets/{diagram-G47NLZAW-CBjFvnAL.js → diagram-G47NLZAW-C19UAGgY.js} +1 -1
- package/web-dist/assets/{diagram-NH7WQ7WH-DAI3KCBU.js → diagram-NH7WQ7WH-BqCOCiLh.js} +1 -1
- package/web-dist/assets/{diagram-OA4YK3LP-C82PfYbV.js → diagram-OA4YK3LP-DeX0lziw.js} +1 -1
- package/web-dist/assets/{diagram-WEI45ONY-fOJDDfoI.js → diagram-WEI45ONY-C5CaoiNQ.js} +1 -1
- package/web-dist/assets/{ebnfDiagram-CCIWWBDH-B5h_VbLA.js → ebnfDiagram-CCIWWBDH-CmVKBMPd.js} +1 -1
- package/web-dist/assets/{erDiagram-Q63AITRT-BPje_yvH.js → erDiagram-Q63AITRT-DKbK71y9.js} +1 -1
- package/web-dist/assets/eventmodeling-45OFAUF4-P5CIYaPC.js +1 -0
- package/web-dist/assets/flowDiagram-23GEKE2U-B1lYV9tG.js +1 -0
- package/web-dist/assets/{ganttDiagram-NO4QXBWP-sBrAv0Zq.js → ganttDiagram-NO4QXBWP-CV9er-Ag.js} +1 -1
- package/web-dist/assets/{gitGraph-TEB2WS4Q-DRA1mvOm.js → gitGraph-TEB2WS4Q-DrkGEklk.js} +1 -1
- package/web-dist/assets/{gitGraphDiagram-IHSO6WYX-DBMOi0IS.js → gitGraphDiagram-IHSO6WYX-DnfkKTHs.js} +1 -1
- package/web-dist/assets/index-BIGkwpMf.css +1 -0
- package/web-dist/assets/index-BZuSbTzC.js +319 -0
- package/web-dist/assets/{info-DKCQHKI2-faVLVx1A.js → info-DKCQHKI2-DDjeakJ3.js} +1 -1
- package/web-dist/assets/{infoDiagram-FWYZ7A6U-BST26f54.js → infoDiagram-FWYZ7A6U-ClPdEwgm.js} +1 -1
- package/web-dist/assets/{ishikawaDiagram-FXEZZL3T-AQe4w48R.js → ishikawaDiagram-FXEZZL3T-DQSe577k.js} +1 -1
- package/web-dist/assets/{journeyDiagram-5HDEW3XC-DHYMyWnH.js → journeyDiagram-5HDEW3XC-CqGDwDnH.js} +1 -1
- package/web-dist/assets/{kanban-definition-HUTT4EX6-DRjdUC1w.js → kanban-definition-HUTT4EX6-Cm2ql3XT.js} +1 -1
- package/web-dist/assets/{line-DsDFTOBE.js → line-DYZIw46W.js} +1 -1
- package/web-dist/assets/{mermaid-parser.core-BQmWWHcM.js → mermaid-parser.core-BzAUCbYh.js} +3 -3
- package/web-dist/assets/{mermaid.core-DyyZgnTM.js → mermaid.core-ChBUFCit.js} +3 -3
- package/web-dist/assets/{mindmap-definition-LN4V7U3C-DKFwErMl.js → mindmap-definition-LN4V7U3C-D12k854u.js} +1 -1
- package/web-dist/assets/{packet-7NZHBO7P-Dc2mNrwB.js → packet-7NZHBO7P-DqfFhLqp.js} +1 -1
- package/web-dist/assets/{pegDiagram-2B236MQR-CApGxts7.js → pegDiagram-2B236MQR-yG5jewLN.js} +1 -1
- package/web-dist/assets/{pie-RZYD4A2V-420IM2Cy.js → pie-RZYD4A2V-qk1HY3l9.js} +1 -1
- package/web-dist/assets/{pieDiagram-ENE6RG2P-B9AabvqO.js → pieDiagram-ENE6RG2P-B-n6mYM1.js} +1 -1
- package/web-dist/assets/{quadrantDiagram-ABIIQ3AL-KDtGo5xp.js → quadrantDiagram-ABIIQ3AL-B35eq6Qw.js} +1 -1
- package/web-dist/assets/{radar-I7S5WNFK-r00cL8de.js → radar-I7S5WNFK-BLlNJ62v.js} +1 -1
- package/web-dist/assets/{railroad-3IZDKUUU-u3-ja2m8.js → railroad-3IZDKUUU-Bo667-nZ.js} +1 -1
- package/web-dist/assets/railroad-abnf-AHOZXSZD-1QyLbHfP.js +1 -0
- package/web-dist/assets/railroad-ebnf-EBAXGLYW-Cs3RBVGW.js +1 -0
- package/web-dist/assets/railroad-peg-LSFZ7HO6-d_2u0a_u.js +1 -0
- package/web-dist/assets/{railroadDiagram-RFXS5EU6-PXQXCI8m.js → railroadDiagram-RFXS5EU6-Cpu40FP1.js} +1 -1
- package/web-dist/assets/{requirementDiagram-TGXJPOKE-CsigfYcM.js → requirementDiagram-TGXJPOKE-BnUyecuV.js} +1 -1
- package/web-dist/assets/{sankeyDiagram-HTMAVEWB-CZTeOkfq.js → sankeyDiagram-HTMAVEWB-CPKNkdAc.js} +1 -1
- package/web-dist/assets/{sequenceDiagram-DBY2YBRQ-BVnCAk_N.js → sequenceDiagram-DBY2YBRQ--Xh3MzFl.js} +1 -1
- package/web-dist/assets/{stateDiagram-2N3HPSRC-ChCJipZW.js → stateDiagram-2N3HPSRC-Dt9i46rM.js} +1 -1
- package/web-dist/assets/stateDiagram-v2-6OUMAXLB-BKy5vv2y.js +1 -0
- package/web-dist/assets/{swimlanes-5IMT3BWC-DHR9HD5O.js → swimlanes-5IMT3BWC-qTKs7JbH.js} +1 -1
- package/web-dist/assets/swimlanesDiagram-G3AALYLV-Ce1uKw_w.js +8 -0
- package/web-dist/assets/{timeline-definition-FHXFAJF6-BZl68jCj.js → timeline-definition-FHXFAJF6-6k-_GOW3.js} +1 -1
- package/web-dist/assets/{treeView-QDETBFTQ-CcWDnN_I.js → treeView-QDETBFTQ-BHU4QpQM.js} +1 -1
- package/web-dist/assets/{treemap-6X3UGDF4-CoPTx3oa.js → treemap-6X3UGDF4-DlO97L99.js} +1 -1
- package/web-dist/assets/{vennDiagram-L72KCM5P-lrsO-4o9.js → vennDiagram-L72KCM5P-CxKMltcT.js} +1 -1
- package/web-dist/assets/{wardley-OPB4EBWU-hA_IMYdR.js → wardley-OPB4EBWU-DaE5ZjFv.js} +1 -1
- package/web-dist/assets/{wardleyDiagram-EHGQE667-6T7WmjKn.js → wardleyDiagram-EHGQE667-Bb9Gwjc0.js} +1 -1
- package/web-dist/assets/{xychartDiagram-FW5EYKEG-BPYtf6cM.js → xychartDiagram-FW5EYKEG-BdaqOb5a.js} +1 -1
- package/web-dist/index.html +2 -2
- package/web-dist/assets/architecture-TIHT7OUA-DGkzyd6b.js +0 -1
- package/web-dist/assets/channel-BvYE_fQ0.js +0 -1
- package/web-dist/assets/classDiagram-OUVF2IWQ-BmoT0Xoa.js +0 -1
- package/web-dist/assets/classDiagram-v2-EOCWNBFH-BmoT0Xoa.js +0 -1
- package/web-dist/assets/eventmodeling-45OFAUF4-Bqo9jfNt.js +0 -1
- package/web-dist/assets/flowDiagram-23GEKE2U-BwssDy7H.js +0 -1
- package/web-dist/assets/index-C_iC5T6e.css +0 -1
- package/web-dist/assets/index-YBqvcp8M.js +0 -506
- package/web-dist/assets/railroad-abnf-AHOZXSZD-BIa3zJb3.js +0 -1
- package/web-dist/assets/railroad-ebnf-EBAXGLYW-Dhv_ZRtc.js +0 -1
- package/web-dist/assets/railroad-peg-LSFZ7HO6-BSnPbaOy.js +0 -1
- package/web-dist/assets/stateDiagram-v2-6OUMAXLB-BopBzYGR.js +0 -1
- 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) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[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("&", "&").replaceAll("<", "<").replaceAll('"', """);
|
|
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) => ({ "&": "&", "<": "<", ">": ">", '"': """ })[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 ?? "/", "
|
|
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.
|
|
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 .
|
|
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
|
-
"
|
|
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
|