@wrongstack/webui 0.319.0 → 1.0.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 (218) hide show
  1. package/dist/assets/AgentRosterView-B_J6SvVF.js +12 -0
  2. package/dist/assets/AnalyticsDashboard-BgZiiiDb.js +1 -0
  3. package/dist/assets/AudienceMemoryPanel-CPuksIMN.js +3 -0
  4. package/dist/assets/ChangesView-CmZeNwbw.js +1 -0
  5. package/dist/assets/ChimeraReviewsView-CpfSkgQ2.js +1 -0
  6. package/dist/assets/ChronicleDashboard-B6lhZGjz.js +1 -0
  7. package/dist/assets/CodeEditor-Daz1yqjF.js +2 -0
  8. package/dist/assets/CodeMap-D-H9FNUJ.js +1 -0
  9. package/dist/assets/ConfirmModal-CjsZbvo3.js +1 -0
  10. package/dist/assets/CronJobsPanel-DGKW_zwc.js +1 -0
  11. package/dist/assets/{DeadCodeScanPanel-DooqnEMF.js → DeadCodeScanPanel-Cn5bSfLv.js} +1 -1
  12. package/dist/assets/DebugDashboard-Uh9QLbEk.js +1 -0
  13. package/dist/assets/DesignGalleryView-Da1QtI5b.js +1 -0
  14. package/dist/assets/GoalView-BgVxzzzS.js +1 -0
  15. package/dist/assets/KanbanView-_JvZKFyI.js +3 -0
  16. package/dist/assets/MailboxDetailView-26bVSSbU.js +1 -0
  17. package/dist/assets/MemoryDrawer-C5sEdVvj.js +1 -0
  18. package/dist/assets/MemoryManager-BqWzNt8w.js +1 -0
  19. package/dist/assets/ModelPicker-DqRzzv5J.js +1 -0
  20. package/dist/assets/ProcessMonitor-ygFLD5zk.js +1 -0
  21. package/dist/assets/PromptJournalView-B65KxlYi.js +1 -0
  22. package/dist/assets/QueuePanel-CJlIV0pX.js +1 -0
  23. package/dist/assets/RefreshDebugView-CNovrSAn.js +1 -0
  24. package/dist/assets/RequirementIntakeView-BnrQSVE_.js +1 -0
  25. package/dist/assets/SageTabs-CJqOqiY7.js +2 -0
  26. package/dist/assets/SddFlowGraph-CNOyn5N9.js +1 -0
  27. package/dist/assets/SddHub-mFjsa_Zl.js +2 -0
  28. package/dist/assets/SessionInspectView-MEmxIEzB.js +1 -0
  29. package/dist/assets/SessionList-DmcQJmzw.js +1 -0
  30. package/dist/assets/SessionsDashboard-BCYViJlx.js +1 -0
  31. package/dist/assets/SetupScreen-BwnSJt7v.js +1 -0
  32. package/dist/assets/SkillDetailView-ebz2dRUQ.js +3 -0
  33. package/dist/assets/TechStackView-DESDpUDA.js +2 -0
  34. package/dist/assets/TerminalPanel-BiWnldbB.js +1 -0
  35. package/dist/assets/{activity-C7dkJqBU.js → activity-87Kr1xrI.js} +2 -2
  36. package/dist/assets/{activity-D1rp3dH9.js → activity-CCW2-qSA.js} +2 -2
  37. package/dist/assets/activity-CXLMCm4J.js +10 -0
  38. package/dist/assets/{activity-BU6MNvBJ.js → activity-CmzV075e.js} +2 -2
  39. package/dist/assets/{activity-C_18AaRY.js → activity-D2D6_ljD.js} +2 -2
  40. package/dist/assets/{activity-CpnSsE22.js → activity-Dt348P4m.js} +2 -2
  41. package/dist/assets/{activity-hTPcI4q1.js → activity-FxWZooaS.js} +2 -2
  42. package/dist/assets/button-rqi3MczV.js +1 -0
  43. package/dist/assets/chat-store-BcfvHUUj.js +1 -0
  44. package/dist/assets/{codemap-activity-store-Br4b57a0.js → codemap-activity-store-CWi-Yd9Z.js} +1 -1
  45. package/dist/assets/codemap-index-store-3M7F08K_.js +1 -0
  46. package/dist/assets/dialog-xJxaQi60.js +1 -0
  47. package/dist/assets/empty-state-BxilAuC3.js +1 -0
  48. package/dist/assets/i18n-DBqM1FUM.js +2 -0
  49. package/dist/assets/index-TDhvFXb0.js +144 -0
  50. package/dist/assets/input-ClZR-odw.js +1 -0
  51. package/dist/assets/{mailbox-store-B9DIvRgo.js → mailbox-store-yydAVjyj.js} +1 -1
  52. package/dist/assets/{markdown-Kp5uSgOw.js → markdown-BP6Z3HKc.js} +24 -24
  53. package/dist/assets/{monaco-BCqJp2xW.js → monaco-_kWjHrlo.js} +204 -204
  54. package/dist/assets/{monaco-theme-CR1QvFi2.js → monaco-theme-Dmx6JuoU.js} +1 -1
  55. package/dist/assets/react-core-BNmTiJ-I.js +9 -0
  56. package/dist/assets/{roster-ws-BQUI8QuW.js → roster-ws-n_N7K9tX.js} +1 -1
  57. package/dist/assets/{settings-BGvRM3vJ.js → settings-B1vpPbTt.js} +1 -1
  58. package/dist/assets/{settings-D-LlBmzO.js → settings-BZnHCnGT.js} +1 -1
  59. package/dist/assets/{settings-1o1gooaL.js → settings-BcB2BIE2.js} +1 -1
  60. package/dist/assets/{settings-Cy_xp4Jt.js → settings-D9AQ5wLT2.js} +1 -1
  61. package/dist/assets/{settings-BV8EFmpH.js → settings-DiVpBZQ2.js} +1 -1
  62. package/dist/assets/{settings-nWMBX3xS.js → settings-DwbEJvxt.js} +1 -1
  63. package/dist/assets/settings-WuyKla3E.js +1 -0
  64. package/dist/assets/setup-B-xPcuTH.js +1 -0
  65. package/dist/assets/setup-B9oerXTs.js +1 -0
  66. package/dist/assets/setup-BWlr07i_.js +1 -0
  67. package/dist/assets/setup-CQ4-lz5u.js +1 -0
  68. package/dist/assets/setup-Cmq_aIjv.js +1 -0
  69. package/dist/assets/setup-DK5JTuqw.js +1 -0
  70. package/dist/assets/setup-qooXjj4V.js +1 -0
  71. package/dist/assets/shared-D8dubdNH.js +1 -0
  72. package/dist/assets/stores-Cfei1ViB.js +7 -0
  73. package/dist/assets/ui-store-CLXDcLPI.js +1 -0
  74. package/dist/assets/useWebSocket-AYEcpb1U.js +27 -0
  75. package/dist/assets/{utils-DQ9Exx8j.js → utils-BpBOwXlT.js} +1 -1
  76. package/dist/assets/vector-memory-panel-BwPPCCbh.js +1 -0
  77. package/dist/assets/{vendor-BMdWcCR4.css → vendor-BShi5_Dg.css} +1 -1
  78. package/dist/assets/vendor-BshlG0z-.js +125 -0
  79. package/dist/assets/view-navigation-CvWJeGMc.js +1 -0
  80. package/dist/assets/vite-preload-Czpn1I53.js +1 -0
  81. package/dist/assets/ws-client-C_IqS0t4.js +22 -0
  82. package/dist/assets/xyflow-BNn76cbK.js +7 -0
  83. package/dist/assets/xyflow-DLioOiRN.css +1 -0
  84. package/dist/components/AgentOfficeView/AgentLane.d.ts +10 -0
  85. package/dist/components/AgentOfficeView/BreakRoom.d.ts +10 -0
  86. package/dist/components/AgentOfficeView/ClientOfficeHeader.d.ts +6 -0
  87. package/dist/components/AgentOfficeView/OfficeBriefing.d.ts +8 -0
  88. package/dist/components/AgentOfficeView/parcels.d.ts +27 -0
  89. package/dist/components/AgentOfficeView.d.ts +2 -10
  90. package/dist/components/ChatInput/chat-input-bars.d.ts +30 -0
  91. package/dist/components/ChatInput/session-draft.d.ts +46 -0
  92. package/dist/components/ChatInput/use-chat-keydown.d.ts +21 -0
  93. package/dist/components/ChatInput/use-chat-submit.d.ts +40 -0
  94. package/dist/components/ChatInput/use-paste-drop.d.ts +1 -1
  95. package/dist/components/ChatInput/use-speech-recognition.d.ts +1 -1
  96. package/dist/components/ChatInput.d.ts +3 -3
  97. package/dist/components/DependencyGraph.d.ts +1 -1
  98. package/dist/components/DiffView.d.ts +1 -1
  99. package/dist/components/FileActivityDrawer/ContextTab.d.ts +21 -0
  100. package/dist/components/FileActivityDrawer/LogsTab.d.ts +13 -0
  101. package/dist/components/FileActivityDrawer/OverviewTab.d.ts +14 -0
  102. package/dist/components/FileActivityDrawer/SkeletonTab.d.ts +5 -0
  103. package/dist/components/FileActivityDrawer/types.d.ts +58 -0
  104. package/dist/components/FileActivityDrawer.d.ts +1 -40
  105. package/dist/components/MainViewSlot.d.ts +16 -0
  106. package/dist/components/MemoryManager/DeleteMemoryDialog.d.ts +3 -2
  107. package/dist/components/MessageBubble/ToolLedgerCard.d.ts +1 -1
  108. package/dist/components/SettingsPanel/brain-section-options.d.ts +6 -0
  109. package/dist/components/SetupScreen/CustomProviderSection.d.ts +1 -1
  110. package/dist/components/ViewRouter.d.ts +12 -4
  111. package/dist/components/agents/AgentRosterCard.d.ts +1 -1
  112. package/dist/components/context-editor/ContextWindowEditor.d.ts +1 -1
  113. package/dist/components/ui/dropdown-menu.d.ts +1 -1
  114. package/dist/components/vector-memory-panel/index.d.ts +1 -1
  115. package/dist/components/view-registry.d.ts +73 -0
  116. package/dist/hooks/useServerMessage.d.ts +71 -0
  117. package/dist/hooks/ws-handlers/session-context-handlers.d.ts +20 -0
  118. package/dist/index.css +788 -788
  119. package/dist/index.html +25 -25
  120. package/dist/index.js +48077 -45298
  121. package/dist/lib/platform.d.ts +40 -0
  122. package/dist/lib/view-navigation.d.ts +27 -2
  123. package/dist/lib/ws-client-auth.d.ts +17 -0
  124. package/dist/lib/ws-client-connection.d.ts +26 -0
  125. package/dist/lib/ws-client-contracts.d.ts +10 -0
  126. package/dist/lib/ws-client-echo.d.ts +46 -0
  127. package/dist/lib/ws-client-queue.d.ts +18 -0
  128. package/dist/lib/ws-client-session-methods.d.ts +54 -0
  129. package/dist/lib/ws-client-swap.d.ts +53 -0
  130. package/dist/lib/ws-client.d.ts +40 -71
  131. package/dist/manifest.json +1 -1
  132. package/dist/stores/context-editor-store.d.ts +1 -1
  133. package/dist/stores/council-log-store.d.ts +6 -0
  134. package/dist/stores/index.d.ts +2 -2
  135. package/dist/stores/session-tab-store.d.ts +8 -0
  136. package/dist/stores/types.d.ts +10 -1
  137. package/dist/stores/ui-store-chrome.d.ts +12 -0
  138. package/dist/stores/ui-store-persist.d.ts +4 -0
  139. package/dist/stores/ui-store-types.d.ts +379 -0
  140. package/dist/stores/ui-store.d.ts +7 -467
  141. package/dist/stores/viz-graph-helpers.d.ts +18 -0
  142. package/dist/stores/viz-pipeline.d.ts +7 -0
  143. package/dist/stores/viz-store.d.ts +3 -123
  144. package/dist/stores/viz-types.d.ts +124 -0
  145. package/dist/types/brain.d.ts +3 -0
  146. package/dist/types/client-message.d.ts +8 -0
  147. package/dist/types/runtime.d.ts +7 -0
  148. package/dist/types/sage.d.ts +7 -0
  149. package/dist/types/server-message-chimera.d.ts +161 -0
  150. package/dist/types/server-message-files.d.ts +195 -0
  151. package/dist/types/server-message-fleet.d.ts +148 -0
  152. package/dist/types/server-message-mcp.d.ts +199 -0
  153. package/dist/types/server-message-system.d.ts +399 -0
  154. package/dist/types/server-message.d.ts +12 -1098
  155. package/dist/types/skills-design.d.ts +7 -0
  156. package/dist/types/system.d.ts +16 -0
  157. package/package.json +9 -9
  158. package/dist/assets/AgentRosterView-BVpIFQwi.js +0 -9
  159. package/dist/assets/AnalyticsDashboard-nqlWJi6M.js +0 -1
  160. package/dist/assets/AudienceMemoryPanel-BT6C4Jkw.js +0 -3
  161. package/dist/assets/ChangesView-CN7NWDeV.js +0 -1
  162. package/dist/assets/ChimeraReviewsView-BNQE5kRx.js +0 -1
  163. package/dist/assets/ChronicleDashboard-BWMkG_hu.js +0 -1
  164. package/dist/assets/CodeEditor-DZ2k-Mz5.js +0 -2
  165. package/dist/assets/CodeMap-CLOuNLqN.js +0 -1
  166. package/dist/assets/ConfirmModal-B6BGiiN8.js +0 -1
  167. package/dist/assets/CronJobsPanel-CsMIoWVQ.js +0 -1
  168. package/dist/assets/DebugDashboard-C0tmxxV8.js +0 -1
  169. package/dist/assets/DesignGalleryView-lc-XRmVG.js +0 -1
  170. package/dist/assets/GoalView-BuYUc4OB.js +0 -1
  171. package/dist/assets/KanbanView-DQK6adut.js +0 -3
  172. package/dist/assets/MailboxDetailView-CBV3-Hf2.js +0 -1
  173. package/dist/assets/MemoryDrawer-rPf-1Ulk.js +0 -1
  174. package/dist/assets/MemoryManager-B_ZJhOqq.js +0 -1
  175. package/dist/assets/ModelPicker-CLs0qQgg.js +0 -1
  176. package/dist/assets/OfficeMapPanel-DnbdkXL1.js +0 -4
  177. package/dist/assets/ProcessMonitor-CHNNqCk9.js +0 -1
  178. package/dist/assets/PromptJournalView-Biu4DknM.js +0 -1
  179. package/dist/assets/QueuePanel-CzTXq6j4.js +0 -1
  180. package/dist/assets/RefreshDebugView-d9iU3sFX.js +0 -1
  181. package/dist/assets/RequirementIntakeView-g9dzUTVw.js +0 -1
  182. package/dist/assets/SageTabs-Bw6PDwy3.js +0 -2
  183. package/dist/assets/SddFlowGraph-Bj_Aqq5B.js +0 -1
  184. package/dist/assets/SddHub-Cdow0Exb.js +0 -2
  185. package/dist/assets/SessionInspectView-je_xLISf.js +0 -1
  186. package/dist/assets/SessionList-4y1uuB-y.js +0 -1
  187. package/dist/assets/SessionsDashboard-DkaNF5lx.js +0 -1
  188. package/dist/assets/SetupScreen-DWzbXvmU.js +0 -1
  189. package/dist/assets/SkillDetailView-Bjq8GkDB.js +0 -3
  190. package/dist/assets/SpecsView-ok8HZ8ws.js +0 -1
  191. package/dist/assets/TechStackView-CQ9AdoBa.js +0 -2
  192. package/dist/assets/TerminalPanel-cbM6oQWQ.js +0 -1
  193. package/dist/assets/activity-CtTKsSX6.js +0 -10
  194. package/dist/assets/button-DNyYztcH.js +0 -1
  195. package/dist/assets/chat-store-oW_-zcJP.js +0 -1
  196. package/dist/assets/codemap-index-store-tSmlp7Uz.js +0 -1
  197. package/dist/assets/dialog-BTHxOi5z.js +0 -1
  198. package/dist/assets/empty-state-DBQN80mK.js +0 -1
  199. package/dist/assets/i18n-D06uU1PM.js +0 -2
  200. package/dist/assets/index-Cwjer17r.js +0 -144
  201. package/dist/assets/input-CTGeYzNe.js +0 -1
  202. package/dist/assets/settings-Ci_RMpCQ.js +0 -1
  203. package/dist/assets/setup-B0D9CK3-.js +0 -1
  204. package/dist/assets/setup-B58YVaGU.js +0 -1
  205. package/dist/assets/setup-C2H9Uv0Q.js +0 -1
  206. package/dist/assets/setup-CzM4dkkU.js +0 -1
  207. package/dist/assets/setup-Di56FlHP.js +0 -1
  208. package/dist/assets/setup-Dwt58Mpz.js +0 -1
  209. package/dist/assets/setup-DznVdlJy.js +0 -1
  210. package/dist/assets/shared-CLfD85oZ.js +0 -1
  211. package/dist/assets/stores-C7Vvce-6.js +0 -7
  212. package/dist/assets/ui-store-Dm7ujR9u.js +0 -1
  213. package/dist/assets/useWebSocket-9lfOsI_r.js +0 -27
  214. package/dist/assets/vector-memory-panel-B4bQhdHe.js +0 -1
  215. package/dist/assets/vendor-enc0q-Va.js +0 -139
  216. package/dist/assets/view-navigation-wOKaM_Rf.js +0 -1
  217. package/dist/assets/ws-client-DtTZLD8e.js +0 -22
  218. /package/dist/assets/{OfficeMapPanel-Ce7myLNH.css → AgentRosterView-Ce7myLNH.css} +0 -0
@@ -0,0 +1,46 @@
1
+ import type React from 'react';
2
+ import { useFileReferenceStore } from '@/stores';
3
+ import type { FileMentionState } from './file-mention-picker.js';
4
+ import type { ImageAttachment } from './image-attachments.js';
5
+ import type { PasteHintState } from './use-paste-drop.js';
6
+ export declare function resolveCancelInput(prev: string, original: string): string;
7
+ export interface SessionDraftRecord {
8
+ input: string;
9
+ images: ImageAttachment[];
10
+ refs: ReturnType<typeof useFileReferenceStore.getState>['refs'];
11
+ }
12
+ /**
13
+ * One unsent draft per tab: text, image attachments and file chips.
14
+ *
15
+ * There is a single ChatInput for all four tabs (the chat surface is parked,
16
+ * never unmounted), so without this the tab you switch to inherits the text
17
+ * you were typing in the tab you left.
18
+ *
19
+ * Keyed by session id and freed with the lane, so a closed tab's draft cannot
20
+ * come back on a session that is later handed the same id — and the map does
21
+ * not grow for the life of the page.
22
+ */
23
+ export declare const sessionDraftMap: Map<string, SessionDraftRecord>;
24
+ export declare function clearSessionDraft(sessionId?: string | null): void;
25
+ export interface UseSessionDraftOptions {
26
+ sessionId: string | null;
27
+ input: string;
28
+ setInput: React.Dispatch<React.SetStateAction<string>>;
29
+ pendingImages: ImageAttachment[];
30
+ setPendingImages: (images: ImageAttachment[]) => void;
31
+ clearPendingImages: () => void;
32
+ fileRefs: ReturnType<typeof useFileReferenceStore.getState>['refs'];
33
+ clearRefs: () => void;
34
+ setHistoryIdx: (idx: number) => void;
35
+ stickyDraftRef: React.MutableRefObject<string | null>;
36
+ setAtMention: (mention: FileMentionState | null) => void;
37
+ setPasteHint: (hint: PasteHintState | null) => void;
38
+ stopSpeech: () => void;
39
+ topicCheckAbortRef: React.MutableRefObject<AbortController | null>;
40
+ topicCheckBusyRef: React.MutableRefObject<boolean>;
41
+ setTopicCheckBusy: (busy: boolean) => void;
42
+ refineBackstopTimerRef: React.MutableRefObject<ReturnType<typeof setTimeout> | null>;
43
+ textareaRef: React.RefObject<HTMLTextAreaElement | null>;
44
+ }
45
+ export declare function useSessionDraft({ sessionId, input, setInput, pendingImages, setPendingImages, clearPendingImages, fileRefs, clearRefs, setHistoryIdx, stickyDraftRef, setAtMention, setPasteHint, stopSpeech, topicCheckAbortRef, topicCheckBusyRef, setTopicCheckBusy, refineBackstopTimerRef, textareaRef, }: UseSessionDraftOptions): void;
46
+ //# sourceMappingURL=session-draft.d.ts.map
@@ -0,0 +1,21 @@
1
+ import type React from 'react';
2
+ import type { FileMentionState } from './file-mention-picker.js';
3
+ export interface UseChatKeyDownOptions {
4
+ input: string;
5
+ setInput: React.Dispatch<React.SetStateAction<string>>;
6
+ textareaRef: React.RefObject<HTMLTextAreaElement | null>;
7
+ atMention: FileMentionState | null;
8
+ promptHistory: string[];
9
+ runSlashCommand: (raw: string) => boolean;
10
+ handleSubmit: (e: React.FormEvent) => void;
11
+ }
12
+ export declare function useChatKeyDown({ input, setInput, textareaRef, atMention, promptHistory, runSlashCommand, handleSubmit, }: UseChatKeyDownOptions): {
13
+ slashIndex: number;
14
+ setSlashIndex: React.Dispatch<React.SetStateAction<number>>;
15
+ slashSuggestions: import("./slash-commands.js").SlashCommandDef[];
16
+ historyIdx: number;
17
+ setHistoryIdx: React.Dispatch<React.SetStateAction<number>>;
18
+ stickyDraftRef: React.RefObject<string | null>;
19
+ handleKeyDown: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void;
20
+ };
21
+ //# sourceMappingURL=use-chat-keydown.d.ts.map
@@ -0,0 +1,40 @@
1
+ import type React from 'react';
2
+ import type { useWebSocket } from '@/hooks/useWebSocket';
3
+ import { useChatStore } from '@/stores';
4
+ import type { QueueMode } from '@/stores/chat-store';
5
+ import { type ImageAttachment } from './image-attachments.js';
6
+ export interface UseChatSubmitOptions {
7
+ input: string;
8
+ setInput: React.Dispatch<React.SetStateAction<string>>;
9
+ sessionId: string | null;
10
+ textareaRef: React.RefObject<HTMLTextAreaElement | null>;
11
+ pendingImagesRef: React.MutableRefObject<ImageAttachment[]>;
12
+ clearPendingImages: () => void;
13
+ isLoading: boolean;
14
+ setLoading: (loading: boolean) => void;
15
+ addMessage: ReturnType<typeof useChatStore.getState>['addMessage'];
16
+ enqueue: ReturnType<typeof useChatStore.getState>['enqueue'];
17
+ ws: ReturnType<typeof useWebSocket>;
18
+ enhanceEnabled: boolean;
19
+ pushPrompt: (prompt: string) => void;
20
+ setHistoryIdx: (idx: number) => void;
21
+ stickyDraftRef: React.MutableRefObject<string | null>;
22
+ refineBackstopTimerRef: React.MutableRefObject<ReturnType<typeof setTimeout> | null>;
23
+ topicCheckBusyRef: React.MutableRefObject<boolean>;
24
+ topicCheckAbortRef: React.MutableRefObject<AbortController | null>;
25
+ setTopicCheckBusy: (busy: boolean) => void;
26
+ runSlashCommand: (raw: string) => boolean;
27
+ clearTextarea: () => void;
28
+ t: (key: string, options?: Record<string, unknown>) => string;
29
+ }
30
+ export declare function useChatSubmit({ input, setInput, sessionId, textareaRef, pendingImagesRef, clearPendingImages, isLoading, setLoading, addMessage, enqueue, ws, enhanceEnabled, pushPrompt, setHistoryIdx, stickyDraftRef, refineBackstopTimerRef, topicCheckBusyRef, topicCheckAbortRef, setTopicCheckBusy, runSlashCommand, clearTextarea, t, }: UseChatSubmitOptions): {
31
+ sendMsg: (content: string, mode?: QueueMode) => void;
32
+ submitWith: (mode: QueueMode) => Promise<void>;
33
+ handleSubmit: (e: React.FormEvent) => void;
34
+ handleBtw: () => void;
35
+ handleSteer: () => void;
36
+ handleAddQueue: () => void;
37
+ handleAbort: () => void;
38
+ handleStopAndEdit: () => void;
39
+ };
40
+ //# sourceMappingURL=use-chat-submit.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import type React from 'react';
2
2
  import { type ImageAttachment } from './image-attachments.js';
3
- interface PasteHintState {
3
+ export interface PasteHintState {
4
4
  chars: number;
5
5
  lines: number;
6
6
  /** Detected language if code was auto-fenced. */
@@ -1,4 +1,4 @@
1
- export declare function useSpeechRecognition({ onTranscript, }: {
1
+ export declare function useSpeechRecognition({ onTranscript }: {
2
2
  onTranscript: (text: string) => void;
3
3
  }): {
4
4
  isListening: boolean;
@@ -1,6 +1,6 @@
1
- import type React from 'react';
2
- export declare function resolveCancelInput(prev: string, original: string): string;
1
+ import { resolveCancelInput } from './ChatInput/session-draft.js';
2
+ export { resolveCancelInput };
3
3
  export declare function ChatInput({ onOpenBreakdown, }?: {
4
4
  onOpenBreakdown?: (() => void) | undefined;
5
- }): React.JSX.Element;
5
+ }): import("react").JSX.Element;
6
6
  //# sourceMappingURL=ChatInput.d.ts.map
@@ -9,6 +9,6 @@ interface DependencyGraphProps {
9
9
  * phase columns (Start, Phase 1, …); each card shows its short id, priority,
10
10
  * title and dependency refs (← t01). A status legend sits above the columns.
11
11
  */
12
- export declare function DependencyGraph({ columns, onTaskClick }: DependencyGraphProps): React.ReactElement;
12
+ export declare function DependencyGraph({ columns, onTaskClick, }: DependencyGraphProps): React.ReactElement;
13
13
  export {};
14
14
  //# sourceMappingURL=DependencyGraph.d.ts.map
@@ -26,7 +26,7 @@ export declare const DiffView: import("react").MemoExoticComponent<({ oldText, n
26
26
  * rendering, so edit/write and patch look consistent. Returns the same "too
27
27
  * large" guard as {@link DiffView} for oversized LCS inputs.
28
28
  */
29
- export declare const ToolDiffView: import("react").MemoExoticComponent<({ diff, fill }: {
29
+ export declare const ToolDiffView: import("react").MemoExoticComponent<({ diff, fill, }: {
30
30
  diff: ToolDiff;
31
31
  fill?: boolean;
32
32
  }) => import("react").JSX.Element>;
@@ -0,0 +1,21 @@
1
+ import { type ActivityRecord } from './types.js';
2
+ export declare function ContextItem({ title, subtitle, raw, }: {
3
+ title: string;
4
+ subtitle: string;
5
+ raw?: string | undefined;
6
+ }): import("react").JSX.Element;
7
+ export declare function ContextColumn({ icon, title, empty, children, }: {
8
+ icon: React.ReactNode;
9
+ title: string;
10
+ empty: string;
11
+ children: React.ReactNode;
12
+ }): import("react").JSX.Element;
13
+ export declare function ContextTab({ sessions, agents, tasks, records, taskLabel, boardTitle, }: {
14
+ sessions: string[];
15
+ agents: string[];
16
+ tasks: string[];
17
+ records: ActivityRecord[];
18
+ taskLabel: (id: string) => string;
19
+ boardTitle?: string | undefined;
20
+ }): import("react").JSX.Element;
21
+ //# sourceMappingURL=ContextTab.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { type ActivityRecord } from './types.js';
2
+ export declare function EmptyRow({ text }: {
3
+ text: string;
4
+ }): import("react").JSX.Element;
5
+ export declare function ActivityRow({ record, raw }: {
6
+ record: ActivityRecord;
7
+ raw?: boolean;
8
+ }): import("react").JSX.Element;
9
+ export declare function LogsTab({ records, loading }: {
10
+ records: ActivityRecord[];
11
+ loading: boolean;
12
+ }): import("react").JSX.Element;
13
+ //# sourceMappingURL=LogsTab.d.ts.map
@@ -0,0 +1,14 @@
1
+ import type { ActivityRecord, FileActivityAnalysis, FileLineageSummary } from './types.js';
2
+ export declare function LifetimeLineage({ lifetime }: {
3
+ lifetime: FileLineageSummary;
4
+ }): import("react").JSX.Element;
5
+ export declare function OverviewTab({ analysis, lifetime, records, sessions, agents, tasks, taskLabel, }: {
6
+ analysis: FileActivityAnalysis;
7
+ lifetime: FileLineageSummary;
8
+ records: ActivityRecord[];
9
+ sessions: string[];
10
+ agents: string[];
11
+ tasks: string[];
12
+ taskLabel: (id: string) => string;
13
+ }): import("react").JSX.Element;
14
+ //# sourceMappingURL=OverviewTab.d.ts.map
@@ -0,0 +1,5 @@
1
+ import { type OpenFile } from '@/stores';
2
+ export declare function SkeletonTab({ file }: {
3
+ file: OpenFile;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=SkeletonTab.d.ts.map
@@ -0,0 +1,58 @@
1
+ import type { FileActivity } from '@/stores';
2
+ import type { ChronicleEventView, ChronicleFileLineageRow } from '@/types';
3
+ export type DrawerTab = 'overview' | 'changes' | 'skeleton' | 'context' | 'memory' | 'logs';
4
+ export interface ActivityRecord {
5
+ id: string;
6
+ at: number;
7
+ action: string;
8
+ actor: string;
9
+ source: string;
10
+ summary: string;
11
+ sessionId?: string | undefined;
12
+ agentId?: string | undefined;
13
+ taskId?: string | undefined;
14
+ boardId?: string | undefined;
15
+ tool?: string | undefined;
16
+ status?: string | undefined;
17
+ raw?: unknown;
18
+ }
19
+ export interface FileActivityAnalysis {
20
+ level: 'quiet' | 'active' | 'churn';
21
+ mutationCount: number;
22
+ sessionCount: number;
23
+ actorCount: number;
24
+ taskCount: number;
25
+ }
26
+ /** Full-history rollup of a file's mutation lineage, sourced from the Chronicle
27
+ * metrics store (indexed by path) rather than a bounded event scan. */
28
+ export interface FileLineageSummary {
29
+ mutations: number;
30
+ sessions: number;
31
+ tasks: number;
32
+ boards: number;
33
+ tools: string[];
34
+ models: string[];
35
+ firstAt?: string | undefined;
36
+ lastAt?: string | undefined;
37
+ }
38
+ export declare function summarizeLineage(rows: ChronicleFileLineageRow[]): FileLineageSummary;
39
+ export declare const MIN_DRAWER_HEIGHT = 150;
40
+ export declare const DEFAULT_DRAWER_HEIGHT = 224;
41
+ export declare const COLLAPSED_HEIGHT = 38;
42
+ export declare const MUTATION_PATTERN: RegExp;
43
+ export declare function normalizeTrackedPath(value: string): string;
44
+ export declare function pathsReferToSameFile(left: string, right: string): boolean;
45
+ export declare function analyzeFileActivity(records: Array<Pick<ActivityRecord, 'at' | 'action' | 'actor' | 'sessionId' | 'taskId'>>, now?: number): FileActivityAnalysis;
46
+ export declare function chronicleRecord(event: ChronicleEventView): ActivityRecord;
47
+ export declare function liveRecord(activity: FileActivity): ActivityRecord;
48
+ export declare function uniqueRecords(records: ActivityRecord[]): ActivityRecord[];
49
+ export declare function countLines(text: string): number;
50
+ export declare function byteCount(text: string): number;
51
+ export declare function formatBytes(bytes: number): string;
52
+ export declare function compactId(value: string): string;
53
+ export declare function changeCounts(oldText: string, newText: string): {
54
+ added: number;
55
+ removed: number;
56
+ large: boolean;
57
+ };
58
+ //# sourceMappingURL=types.d.ts.map
@@ -1,45 +1,6 @@
1
1
  import { type OpenFile } from '@/stores';
2
- import type { ChronicleFileLineageRow } from '@/types';
3
- interface ActivityRecord {
4
- id: string;
5
- at: number;
6
- action: string;
7
- actor: string;
8
- source: string;
9
- summary: string;
10
- sessionId?: string | undefined;
11
- agentId?: string | undefined;
12
- taskId?: string | undefined;
13
- boardId?: string | undefined;
14
- tool?: string | undefined;
15
- status?: string | undefined;
16
- raw?: unknown;
17
- }
18
- interface FileActivityAnalysis {
19
- level: 'quiet' | 'active' | 'churn';
20
- mutationCount: number;
21
- sessionCount: number;
22
- actorCount: number;
23
- taskCount: number;
24
- }
25
- /** Full-history rollup of a file's mutation lineage, sourced from the Chronicle
26
- * metrics store (indexed by path) rather than a bounded event scan. */
27
- interface FileLineageSummary {
28
- mutations: number;
29
- sessions: number;
30
- tasks: number;
31
- boards: number;
32
- tools: string[];
33
- models: string[];
34
- firstAt?: string | undefined;
35
- lastAt?: string | undefined;
36
- }
37
- export declare function summarizeLineage(rows: ChronicleFileLineageRow[]): FileLineageSummary;
38
- export declare function normalizeTrackedPath(value: string): string;
39
- export declare function pathsReferToSameFile(left: string, right: string): boolean;
40
- export declare function analyzeFileActivity(records: Array<Pick<ActivityRecord, 'at' | 'action' | 'actor' | 'sessionId' | 'taskId'>>, now?: number): FileActivityAnalysis;
2
+ export { type ActivityRecord, analyzeFileActivity, type DrawerTab, type FileActivityAnalysis, type FileLineageSummary, normalizeTrackedPath, pathsReferToSameFile, summarizeLineage, } from './FileActivityDrawer/types';
41
3
  export declare function FileActivityDrawer({ file }: {
42
4
  file: OpenFile;
43
5
  }): import("react").JSX.Element;
44
- export {};
45
6
  //# sourceMappingURL=FileActivityDrawer.d.ts.map
@@ -0,0 +1,16 @@
1
+ import { type ViewMeta } from './view-registry';
2
+ import type { View } from '@/stores/ui-store';
3
+ interface MainViewSlotProps {
4
+ view: View;
5
+ onCloseToChat: () => void;
6
+ }
7
+ export declare function MainViewSlot({ view, onCloseToChat, }: MainViewSlotProps): React.ReactElement | null;
8
+ /**
9
+ * Production `onClose` factory — identical to what the per-view `<button>`
10
+ * buttons wired by hand in the legacy ViewRouter did: clear the sidebar,
11
+ * surface chat. Exported so tests can import it without re-implementing the
12
+ * contract.
13
+ */
14
+ export declare function defaultOnCloseToChat(): void;
15
+ export type { ViewMeta };
16
+ //# sourceMappingURL=MainViewSlot.d.ts.map
@@ -2,11 +2,12 @@ import type { SageEntry } from '@/types';
2
2
  interface DeleteMemoryDialogProps {
3
3
  busyAction: 'create' | 'update' | 'delete' | null;
4
4
  deletingId: string | null;
5
- memories: readonly SageEntry[];
5
+ /** Resolved target — may be a search hit or graph neighbor outside the loaded page. */
6
+ memory: SageEntry | null;
6
7
  onCancel: () => void;
7
8
  onConfirm: () => void;
8
9
  onOpenChange: (open: boolean) => void;
9
10
  }
10
- export declare function DeleteMemoryDialog({ busyAction, deletingId, memories, onCancel, onConfirm, onOpenChange, }: DeleteMemoryDialogProps): import("react").JSX.Element;
11
+ export declare function DeleteMemoryDialog({ busyAction, deletingId, memory, onCancel, onConfirm, onOpenChange, }: DeleteMemoryDialogProps): import("react").JSX.Element;
11
12
  export {};
12
13
  //# sourceMappingURL=DeleteMemoryDialog.d.ts.map
@@ -7,7 +7,7 @@ import './ledger.css';
7
7
  * footer. Sharp corners by design — the identity is the rail + hairline, not
8
8
  * rounding. Replaces the old two-part "chevron button + gray box" layout.
9
9
  */
10
- export declare const ToolLedgerCard: import("react").MemoExoticComponent<({ message, }: {
10
+ export declare const ToolLedgerCard: import("react").MemoExoticComponent<({ message }: {
11
11
  message: ChatMessage;
12
12
  }) => import("react").JSX.Element>;
13
13
  //# sourceMappingURL=ToolLedgerCard.d.ts.map
@@ -26,6 +26,12 @@ export declare const COUNCIL_CALL_TIMEOUTS: BrainOption[];
26
26
  export declare const COUNCIL_CONCURRENCY: BrainOption[];
27
27
  /** Per-seat output budget. Default 2000 — reasoning models think from this budget. */
28
28
  export declare const VOTER_MAX_TOKENS: BrainOption[];
29
+ /**
30
+ * Deliberation rounds. Deliberately short: each step is another provider call
31
+ * PER SEAT on every council decision, which makes this the panel's steepest
32
+ * cost lever.
33
+ */
34
+ export declare const DELIBERATION_ROUNDS: BrainOption[];
29
35
  export declare const JUDGE_MAX_TOKENS: BrainOption[];
30
36
  export declare const LEDGER_MEMORY_ENTRIES: BrainOption[];
31
37
  export declare const INTERVENTION_WINDOWS: BrainOption[];
@@ -1,4 +1,4 @@
1
- export declare function CustomProviderSection({ onKeySaved }: {
1
+ export declare function CustomProviderSection({ onKeySaved, }: {
2
2
  onKeySaved: (providerId: string) => void;
3
3
  }): import("react").JSX.Element;
4
4
  //# sourceMappingURL=CustomProviderSection.d.ts.map
@@ -1,9 +1,17 @@
1
1
  /**
2
- * Main view router — switches the main content area based on `currentView`.
2
+ * Main view router — mounts every registered view at most once per session
3
+ * and parks each one when another comes to the front, so the chat virtual
4
+ * transcript + scroll position + composer draft are kept across trips.
3
5
  *
4
- * Extracted from App.tsx Phase 2 shell decomposition. Each view branch wraps
5
- * its component in an ErrorBoundary + Suspense. Lazy-loaded views get a
6
- * PanelSuspense fallback; eagerly-loaded views (chat, settings, context) do not.
6
+ * The per-view render used to be 26 hand-written `currentView === 'X' &&`
7
+ * branches here. They now live in `view-registry.ts` and are rendered by
8
+ * `MainViewSlot`. `chat` itself stays here because it is mounted for the
9
+ * session lifetime (not conditionally on `currentView`) and parked instead
10
+ * of remounted. The terminal bottom dock is also handled here because it is
11
+ * an overlay rather than a "main view" — it can come and go without
12
+ * swapping `currentView`.
13
+ *
14
+ * See docs/audit/webui-full-review-2026-09-03.md B-17.
7
15
  */
8
16
  export declare function ViewRouter({ sessionId, desktopShell, }: {
9
17
  sessionId: string | null;
@@ -24,6 +24,6 @@ interface AgentRosterCardProps {
24
24
  /** Timestamp for computing live elapsed time (pass useFleetPolling().now). */
25
25
  now?: number | undefined;
26
26
  }
27
- export declare function AgentRosterCard({ agent, isLeader, isExpanded, isFocused, onToggle, onOpenInspector, now: externalNow }: AgentRosterCardProps): import("react").JSX.Element;
27
+ export declare function AgentRosterCard({ agent, isLeader, isExpanded, isFocused, onToggle, onOpenInspector, now: externalNow, }: AgentRosterCardProps): import("react").JSX.Element;
28
28
  export {};
29
29
  //# sourceMappingURL=AgentRosterCard.d.ts.map
@@ -2,6 +2,6 @@ interface ContextWindowEditorProps {
2
2
  open: boolean;
3
3
  onClose: () => void;
4
4
  }
5
- export declare function ContextWindowEditor({ open, onClose }: ContextWindowEditorProps): React.ReactElement | null;
5
+ export declare function ContextWindowEditor({ open, onClose, }: ContextWindowEditorProps): React.ReactElement | null;
6
6
  export {};
7
7
  //# sourceMappingURL=ContextWindowEditor.d.ts.map
@@ -24,5 +24,5 @@ declare function DropdownMenuShortcut({ className, ...props }: React.HTMLAttribu
24
24
  declare namespace DropdownMenuShortcut {
25
25
  var displayName: string;
26
26
  }
27
- export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut };
27
+ export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, };
28
28
  //# sourceMappingURL=dropdown-menu.d.ts.map
@@ -3,5 +3,5 @@ export interface VectorMemoryPanelProps {
3
3
  /** Base URL prefix for the webui-server. Default: same-origin. */
4
4
  baseUrl?: string;
5
5
  }
6
- export declare function VectorMemoryPanel({ baseUrl, }?: VectorMemoryPanelProps): ReactElement;
6
+ export declare function VectorMemoryPanel({ baseUrl }?: VectorMemoryPanelProps): ReactElement;
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Single source of truth for the per-view main-area rendering.
3
+ *
4
+ * Each entry tells `MainViewSlot` how to render one `View`:
5
+ *
6
+ * - `Component` — the lazy or eager component. Eager ones are still passed
7
+ * through `<Suspense>` for symmetry; that's a no-op on a non-lazy module.
8
+ * - `wrapperClassName` — the wrapping `<div>` class (most views use the
9
+ * standard flex/min-h-0/min-w-0/overflow-hidden shell; some override it
10
+ * for a different scroll axis).
11
+ * - `boundaryNameKey` — i18n key for the ErrorBoundary `name` prop, so a
12
+ * crash inside a panel is reported under that panel's name and not the
13
+ * chat one.
14
+ * - `loadingLabelKey` — optional i18n key for a named Suspense fallback.
15
+ * When omitted, `PanelSuspense` renders its unlabeled spinner.
16
+ * - `props` — extra props the entry's component expects (e.g. `onClose`
17
+ * for panels that go back to chat on ×, or `className` for components
18
+ * that have to fill a fixed-height parent).
19
+ *
20
+ * `chat` is not in this map because it is mounted for the session lifetime
21
+ * and rendered separately by `ViewRouter`. Anywhere `View` lands at runtime
22
+ * falls back to a "not registered" placeholder — `RoutedView` catches that
23
+ * during the one-time AssertNever check, so an entry can never fall through
24
+ * in CI.
25
+ *
26
+ * See docs/audit/webui-full-review-2026-09-03.md B-17 for the context and
27
+ * view-router/shell examples.
28
+ */
29
+ import { type ComponentType } from 'react';
30
+ import type { View } from '@/stores/ui-store';
31
+ export interface ViewMeta {
32
+ /**
33
+ * The view component. Typed as `ComponentType<any>` because individual
34
+ * components take stricter prop shapes (e.g. `KanbanView` requires
35
+ * `onClose`); the registry entry is what guarantees runtime props match.
36
+ */
37
+ Component: ComponentType<any>;
38
+ /** Tailwind class for the wrapping `<div>`. Pass `''` for no wrapper. */
39
+ wrapperClassName: string;
40
+ /**
41
+ * i18n key under the `activity` namespace (e.g. `activity:panels.chat`)
42
+ * used as the ErrorBoundary's `name`. Crashes inside the view are reported
43
+ * under this name so the boundary log can attribute them to the panel.
44
+ */
45
+ boundaryNameKey: string;
46
+ /**
47
+ * Optional i18n key (without i18next quoting — the slot passes it through
48
+ * the hook itself) for a named Suspense fallback. The previous `ViewRouter`
49
+ * mixed both: some views passed a named label to `PanelSuspense`, others
50
+ * rendered the spinner bare. Centralising the choice here means adding a
51
+ * view can no longer omit the label and produce a silent flash.
52
+ *
53
+ * When `null`, the unlabeled spinner is used.
54
+ */
55
+ loadingLabelKey: string | null;
56
+ /**
57
+ * Extra props merged onto the view component at render time. `onClose`
58
+ * for views that × back to chat (Kanban, Goal), `className` for views that
59
+ * have to fill a fixed-height parent (Changes, Mailbox, DesignGallery,
60
+ * SkillDetail, Chimera Reviews).
61
+ */
62
+ props?: Record<string, unknown>;
63
+ }
64
+ /** Widened view for consumers: `VIEW_REGISTRY[view]` reads `ViewMeta | undefined`. */
65
+ export declare const VIEW_REGISTRY: Partial<Record<View, ViewMeta>>;
66
+ /**
67
+ * The runtime fallback for `onClose: 'PANEL_CLOSE_TO_CHAT'`. The registry
68
+ * uses a sentinel so the function identity can stay stable across re-renders
69
+ * (one closure per slot, not per registry lookup) while still pointing to a
70
+ * real handler owned by `ViewRouter`.
71
+ */
72
+ export declare const PANEL_CLOSE_TO_CHAT_SENTINEL: 'PANEL_CLOSE_TO_CHAT';
73
+ //# sourceMappingURL=view-registry.d.ts.map
@@ -0,0 +1,71 @@
1
+ import type { WSServerMessage } from '@/types';
2
+ /**
3
+ * Lane-aware single-message subscription hook (B-03).
4
+ *
5
+ * The earlier design let every component that needed a server message reach
6
+ * into `getWSClient().on(type, handler)` directly — 118 ad-hoc call sites
7
+ * across the codebase. Each of those sites re-implements the same two
8
+ * concerns, both of which are easy to get wrong and almost impossible to
9
+ * audit in isolation:
10
+ *
11
+ * 1. teardown — forgetting to call the returned `off()` (or calling it
12
+ * against a stale closure) leaves a stale listener on the socket that
13
+ * keeps dispatching into an unmounted component;
14
+ *
15
+ * 2. lane filtering — a multi-tab window has up to MAX_LANES tabs sharing
16
+ * one WS connection, and a message addressed to tab 2 must not be
17
+ * acted on by tab 1's listener. Some sites filter on
18
+ * `payload.sessionId`, some on `isActiveSessionMessage`, and many
19
+ * forget to filter at all (every reply lands on every tab).
20
+ *
21
+ * `useServerMessage` collapses both: it registers exactly once, cleans up on
22
+ * unmount, and drops messages whose `payload.sessionId` doesn't match the
23
+ * `sessionId` passed in. Filtering is OPT-IN: a caller that passes no
24
+ * `sessionId` receives every frame of that type, exactly as a raw `ws.on`
25
+ * would. Pass the lane you care about whenever the state you update is
26
+ * tab-local.
27
+ *
28
+ * Typing follows the underlying `ws.on` narrowing — pass a literal `type`
29
+ * and the handler receives the matching union member of `WSServerMessage`,
30
+ * not the bare envelope.
31
+ *
32
+ * The handler is captured in a ref so re-renders don't churn the WS
33
+ * subscription. Pass `deps` when the handler closes over reactive state
34
+ * that should be fresh inside the handler (same contract as `useEffect`).
35
+ *
36
+ * Example migration of the three ad-hoc `context.editor.*` subscriptions
37
+ * inside `ContextWindowEditor.tsx`:
38
+ *
39
+ * useServerMessage('context.editor.snapshot', (msg) => {
40
+ * store.getState().loadSnapshot(msg.payload);
41
+ * }, { sessionId: askedFor, deps: [store] });
42
+ */
43
+ export interface UseServerMessageOptions {
44
+ /**
45
+ * If provided, the handler runs ONLY when the inbound message's
46
+ * `payload.sessionId` matches this value (or when the message has no
47
+ * sessionId stamp at all — boot-time broadcasts, project-wide events).
48
+ * If omitted, NO lane filter is applied and the handler sees every frame
49
+ * of this type, including replies addressed to another tab. Accepts
50
+ * `null` for sources that may yield a nullable pointer (Zustand
51
+ * selectors, etc.) — it is normalized to "no pin".
52
+ */
53
+ sessionId?: string | null | undefined;
54
+ /**
55
+ * Re-subscribe when these change. Same contract as `useEffect`. Defaults
56
+ * to `[]` — the subscription is mounted once.
57
+ */
58
+ deps?: ReadonlyArray<unknown>;
59
+ /**
60
+ * When `false`, the hook stays registered (so the deps contract is not
61
+ * violated) but the WS subscription is NOT installed — both the initial
62
+ * register and any dep-driven re-register are skipped. Defaults to
63
+ * `true`. Mirrors the `active` / `enabled` flag most consumers want to
64
+ * gate polling loops on without paying the cleanup + re-register cost.
65
+ */
66
+ enabled?: boolean;
67
+ }
68
+ export declare function useServerMessage<K extends WSServerMessage['type']>(type: K, handler: (msg: Extract<WSServerMessage, {
69
+ type: K;
70
+ }>) => void, options?: UseServerMessageOptions): void;
71
+ //# sourceMappingURL=useServerMessage.d.ts.map
@@ -16,6 +16,26 @@ export declare const warnedCostModels: Map<string, Set<string>>;
16
16
  */
17
17
  export declare function flushThinkingLogForCurrentIteration(lane?: ChatLaneActions): void;
18
18
  export declare function handleContextDebug(msg: WSServerMessage): void;
19
+ /**
20
+ * The server's general-purpose "did that work?" reply.
21
+ *
22
+ * Two things were wrong here, and both are about a socket that serves up to
23
+ * four tabs:
24
+ *
25
+ * 1. The toast was unconditional. A background tab's "commit failed" or
26
+ * "provider key rejected" popped on whichever tab the user was looking at,
27
+ * with no way to tell whose it was — and the tab that actually failed
28
+ * showed nothing at all when switched to. The server now stamps the asking
29
+ * tab (`sessionId`, see B-05), so the toast fires only for the tab in
30
+ * front and a background tab gets an attention marker on its tab strip
31
+ * instead — the same treatment `provider.fallback_pending` already gives.
32
+ * 2. EVERY result re-fetched the saved-provider list, including a prefs
33
+ * validation error that has nothing to do with providers. The refetch is
34
+ * kept (deciding from the message PROSE which results touch providers
35
+ * would be a worse bug than the extra round trip) but it now runs only on
36
+ * the foreground path, so a background tab's result no longer triggers it
37
+ * at all.
38
+ */
19
39
  export declare function handleKeyOperationResult(msg: WSServerMessage): void;
20
40
  /**
21
41
  * A successful model switch is broadcast to every surface, so it has to be