@wrongstack/webui 0.319.1 → 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.
- package/dist/assets/AgentRosterView-B_J6SvVF.js +12 -0
- package/dist/assets/AnalyticsDashboard-BgZiiiDb.js +1 -0
- package/dist/assets/AudienceMemoryPanel-CPuksIMN.js +3 -0
- package/dist/assets/ChangesView-CmZeNwbw.js +1 -0
- package/dist/assets/ChimeraReviewsView-CpfSkgQ2.js +1 -0
- package/dist/assets/ChronicleDashboard-B6lhZGjz.js +1 -0
- package/dist/assets/CodeEditor-Daz1yqjF.js +2 -0
- package/dist/assets/CodeMap-D-H9FNUJ.js +1 -0
- package/dist/assets/ConfirmModal-CjsZbvo3.js +1 -0
- package/dist/assets/CronJobsPanel-DGKW_zwc.js +1 -0
- package/dist/assets/{DeadCodeScanPanel-DooqnEMF.js → DeadCodeScanPanel-Cn5bSfLv.js} +1 -1
- package/dist/assets/DebugDashboard-Uh9QLbEk.js +1 -0
- package/dist/assets/DesignGalleryView-Da1QtI5b.js +1 -0
- package/dist/assets/GoalView-BgVxzzzS.js +1 -0
- package/dist/assets/KanbanView-_JvZKFyI.js +3 -0
- package/dist/assets/MailboxDetailView-26bVSSbU.js +1 -0
- package/dist/assets/MemoryDrawer-C5sEdVvj.js +1 -0
- package/dist/assets/MemoryManager-BqWzNt8w.js +1 -0
- package/dist/assets/ModelPicker-DqRzzv5J.js +1 -0
- package/dist/assets/ProcessMonitor-ygFLD5zk.js +1 -0
- package/dist/assets/PromptJournalView-B65KxlYi.js +1 -0
- package/dist/assets/QueuePanel-CJlIV0pX.js +1 -0
- package/dist/assets/RefreshDebugView-CNovrSAn.js +1 -0
- package/dist/assets/RequirementIntakeView-BnrQSVE_.js +1 -0
- package/dist/assets/SageTabs-CJqOqiY7.js +2 -0
- package/dist/assets/SddFlowGraph-CNOyn5N9.js +1 -0
- package/dist/assets/SddHub-mFjsa_Zl.js +2 -0
- package/dist/assets/SessionInspectView-MEmxIEzB.js +1 -0
- package/dist/assets/SessionList-DmcQJmzw.js +1 -0
- package/dist/assets/SessionsDashboard-BCYViJlx.js +1 -0
- package/dist/assets/SetupScreen-BwnSJt7v.js +1 -0
- package/dist/assets/SkillDetailView-ebz2dRUQ.js +3 -0
- package/dist/assets/TechStackView-DESDpUDA.js +2 -0
- package/dist/assets/TerminalPanel-BiWnldbB.js +1 -0
- package/dist/assets/{activity-C7dkJqBU.js → activity-87Kr1xrI.js} +2 -2
- package/dist/assets/{activity-D1rp3dH9.js → activity-CCW2-qSA.js} +2 -2
- package/dist/assets/activity-CXLMCm4J.js +10 -0
- package/dist/assets/{activity-BU6MNvBJ.js → activity-CmzV075e.js} +2 -2
- package/dist/assets/{activity-C_18AaRY.js → activity-D2D6_ljD.js} +2 -2
- package/dist/assets/{activity-CpnSsE22.js → activity-Dt348P4m.js} +2 -2
- package/dist/assets/{activity-hTPcI4q1.js → activity-FxWZooaS.js} +2 -2
- package/dist/assets/button-rqi3MczV.js +1 -0
- package/dist/assets/chat-store-BcfvHUUj.js +1 -0
- package/dist/assets/{codemap-activity-store-Br4b57a0.js → codemap-activity-store-CWi-Yd9Z.js} +1 -1
- package/dist/assets/codemap-index-store-3M7F08K_.js +1 -0
- package/dist/assets/dialog-xJxaQi60.js +1 -0
- package/dist/assets/empty-state-BxilAuC3.js +1 -0
- package/dist/assets/i18n-DBqM1FUM.js +2 -0
- package/dist/assets/index-TDhvFXb0.js +144 -0
- package/dist/assets/input-ClZR-odw.js +1 -0
- package/dist/assets/{mailbox-store-B9DIvRgo.js → mailbox-store-yydAVjyj.js} +1 -1
- package/dist/assets/{markdown-Kp5uSgOw.js → markdown-BP6Z3HKc.js} +24 -24
- package/dist/assets/{monaco-BCqJp2xW.js → monaco-_kWjHrlo.js} +204 -204
- package/dist/assets/{monaco-theme-CR1QvFi2.js → monaco-theme-Dmx6JuoU.js} +1 -1
- package/dist/assets/react-core-BNmTiJ-I.js +9 -0
- package/dist/assets/{roster-ws-BQUI8QuW.js → roster-ws-n_N7K9tX.js} +1 -1
- package/dist/assets/{settings-BGvRM3vJ.js → settings-B1vpPbTt.js} +1 -1
- package/dist/assets/{settings-D-LlBmzO.js → settings-BZnHCnGT.js} +1 -1
- package/dist/assets/{settings-1o1gooaL.js → settings-BcB2BIE2.js} +1 -1
- package/dist/assets/{settings-Cy_xp4Jt.js → settings-D9AQ5wLT2.js} +1 -1
- package/dist/assets/{settings-BV8EFmpH.js → settings-DiVpBZQ2.js} +1 -1
- package/dist/assets/{settings-nWMBX3xS.js → settings-DwbEJvxt.js} +1 -1
- package/dist/assets/settings-WuyKla3E.js +1 -0
- package/dist/assets/setup-B-xPcuTH.js +1 -0
- package/dist/assets/setup-B9oerXTs.js +1 -0
- package/dist/assets/setup-BWlr07i_.js +1 -0
- package/dist/assets/setup-CQ4-lz5u.js +1 -0
- package/dist/assets/setup-Cmq_aIjv.js +1 -0
- package/dist/assets/setup-DK5JTuqw.js +1 -0
- package/dist/assets/setup-qooXjj4V.js +1 -0
- package/dist/assets/shared-D8dubdNH.js +1 -0
- package/dist/assets/stores-Cfei1ViB.js +7 -0
- package/dist/assets/ui-store-CLXDcLPI.js +1 -0
- package/dist/assets/useWebSocket-AYEcpb1U.js +27 -0
- package/dist/assets/{utils-DQ9Exx8j.js → utils-BpBOwXlT.js} +1 -1
- package/dist/assets/vector-memory-panel-BwPPCCbh.js +1 -0
- package/dist/assets/{vendor-BMdWcCR4.css → vendor-BShi5_Dg.css} +1 -1
- package/dist/assets/vendor-BshlG0z-.js +125 -0
- package/dist/assets/view-navigation-CvWJeGMc.js +1 -0
- package/dist/assets/vite-preload-Czpn1I53.js +1 -0
- package/dist/assets/ws-client-C_IqS0t4.js +22 -0
- package/dist/assets/xyflow-BNn76cbK.js +7 -0
- package/dist/assets/xyflow-DLioOiRN.css +1 -0
- package/dist/components/AgentOfficeView/AgentLane.d.ts +10 -0
- package/dist/components/AgentOfficeView/BreakRoom.d.ts +10 -0
- package/dist/components/AgentOfficeView/ClientOfficeHeader.d.ts +6 -0
- package/dist/components/AgentOfficeView/OfficeBriefing.d.ts +8 -0
- package/dist/components/AgentOfficeView/parcels.d.ts +27 -0
- package/dist/components/AgentOfficeView.d.ts +2 -10
- package/dist/components/ChatInput/chat-input-bars.d.ts +30 -0
- package/dist/components/ChatInput/session-draft.d.ts +46 -0
- package/dist/components/ChatInput/use-chat-keydown.d.ts +21 -0
- package/dist/components/ChatInput/use-chat-submit.d.ts +40 -0
- package/dist/components/ChatInput/use-paste-drop.d.ts +1 -1
- package/dist/components/ChatInput.d.ts +3 -3
- package/dist/components/FileActivityDrawer/ContextTab.d.ts +21 -0
- package/dist/components/FileActivityDrawer/LogsTab.d.ts +13 -0
- package/dist/components/FileActivityDrawer/OverviewTab.d.ts +14 -0
- package/dist/components/FileActivityDrawer/SkeletonTab.d.ts +5 -0
- package/dist/components/FileActivityDrawer/types.d.ts +58 -0
- package/dist/components/FileActivityDrawer.d.ts +1 -40
- package/dist/components/MainViewSlot.d.ts +16 -0
- package/dist/components/MemoryManager/DeleteMemoryDialog.d.ts +3 -2
- package/dist/components/SettingsPanel/brain-section-options.d.ts +6 -0
- package/dist/components/ViewRouter.d.ts +12 -4
- package/dist/components/view-registry.d.ts +73 -0
- package/dist/hooks/useServerMessage.d.ts +71 -0
- package/dist/hooks/ws-handlers/session-context-handlers.d.ts +20 -0
- package/dist/index.css +788 -788
- package/dist/index.html +25 -25
- package/dist/index.js +81157 -80161
- package/dist/lib/platform.d.ts +40 -0
- package/dist/lib/view-navigation.d.ts +27 -2
- package/dist/lib/ws-client-auth.d.ts +17 -0
- package/dist/lib/ws-client-connection.d.ts +26 -0
- package/dist/lib/ws-client-contracts.d.ts +10 -0
- package/dist/lib/ws-client-echo.d.ts +46 -0
- package/dist/lib/ws-client-queue.d.ts +18 -0
- package/dist/lib/ws-client-session-methods.d.ts +54 -0
- package/dist/lib/ws-client-swap.d.ts +53 -0
- package/dist/lib/ws-client.d.ts +40 -71
- package/dist/stores/context-editor-store.d.ts +1 -1
- package/dist/stores/council-log-store.d.ts +6 -0
- package/dist/stores/session-tab-store.d.ts +8 -0
- package/dist/stores/types.d.ts +10 -1
- package/dist/stores/ui-store-chrome.d.ts +12 -0
- package/dist/stores/ui-store-persist.d.ts +4 -0
- package/dist/stores/ui-store-types.d.ts +379 -0
- package/dist/stores/ui-store.d.ts +7 -467
- package/dist/stores/viz-graph-helpers.d.ts +18 -0
- package/dist/stores/viz-pipeline.d.ts +7 -0
- package/dist/stores/viz-store.d.ts +3 -123
- package/dist/stores/viz-types.d.ts +124 -0
- package/dist/types/brain.d.ts +3 -0
- package/dist/types/client-message.d.ts +8 -0
- package/dist/types/runtime.d.ts +7 -0
- package/dist/types/sage.d.ts +7 -0
- package/dist/types/server-message-chimera.d.ts +161 -0
- package/dist/types/server-message-files.d.ts +195 -0
- package/dist/types/server-message-fleet.d.ts +148 -0
- package/dist/types/server-message-mcp.d.ts +199 -0
- package/dist/types/server-message-system.d.ts +399 -0
- package/dist/types/server-message.d.ts +12 -1098
- package/dist/types/skills-design.d.ts +7 -0
- package/dist/types/system.d.ts +16 -0
- package/package.json +9 -9
- package/dist/assets/AgentRosterView-VIctzKMy.js +0 -9
- package/dist/assets/AnalyticsDashboard-Dr67MeEY.js +0 -1
- package/dist/assets/AudienceMemoryPanel-DoaZfrjf.js +0 -3
- package/dist/assets/ChangesView-s7Mn7iE2.js +0 -1
- package/dist/assets/ChimeraReviewsView-Cverzv0b.js +0 -1
- package/dist/assets/ChronicleDashboard-CzqPfaPc.js +0 -1
- package/dist/assets/CodeEditor-DXQoTSH5.js +0 -2
- package/dist/assets/CodeMap-D34FOPgR.js +0 -1
- package/dist/assets/ConfirmModal-B6BGiiN8.js +0 -1
- package/dist/assets/CronJobsPanel-CenxuaN9.js +0 -1
- package/dist/assets/DebugDashboard-DWaUg6e1.js +0 -1
- package/dist/assets/DesignGalleryView-BKtjn4px.js +0 -1
- package/dist/assets/GoalView-BZ62_vF-.js +0 -1
- package/dist/assets/KanbanView-DsWnTpxr.js +0 -3
- package/dist/assets/MailboxDetailView-DS1P9DRT.js +0 -1
- package/dist/assets/MemoryDrawer-BJEY1v4P.js +0 -1
- package/dist/assets/MemoryManager-D-kuyTQe.js +0 -1
- package/dist/assets/ModelPicker-CLs0qQgg.js +0 -1
- package/dist/assets/OfficeMapPanel-BqoCcniD.js +0 -4
- package/dist/assets/ProcessMonitor-CHNNqCk9.js +0 -1
- package/dist/assets/PromptJournalView-Biu4DknM.js +0 -1
- package/dist/assets/QueuePanel-CzTXq6j4.js +0 -1
- package/dist/assets/RefreshDebugView-d9iU3sFX.js +0 -1
- package/dist/assets/RequirementIntakeView-BVyF2zXR.js +0 -1
- package/dist/assets/SageTabs-YASyEFo6.js +0 -2
- package/dist/assets/SddFlowGraph-Bj_Aqq5B.js +0 -1
- package/dist/assets/SddHub-rmGGEYZe.js +0 -2
- package/dist/assets/SessionInspectView-iaKkGAAM.js +0 -1
- package/dist/assets/SessionList-vmAS2Fg5.js +0 -1
- package/dist/assets/SessionsDashboard-x3iyhrGl.js +0 -1
- package/dist/assets/SetupScreen-huPJT0Bv.js +0 -1
- package/dist/assets/SkillDetailView-BcD9z7zG.js +0 -3
- package/dist/assets/SpecsView-ok8HZ8ws.js +0 -1
- package/dist/assets/TechStackView-DmMtwb4l.js +0 -2
- package/dist/assets/TerminalPanel-cbM6oQWQ.js +0 -1
- package/dist/assets/activity-CtTKsSX6.js +0 -10
- package/dist/assets/button-DNyYztcH.js +0 -1
- package/dist/assets/chat-store-oW_-zcJP.js +0 -1
- package/dist/assets/codemap-index-store-tSmlp7Uz.js +0 -1
- package/dist/assets/dialog-BTHxOi5z.js +0 -1
- package/dist/assets/empty-state-DBQN80mK.js +0 -1
- package/dist/assets/i18n-D06uU1PM.js +0 -2
- package/dist/assets/index-BQ7PJ-sA.js +0 -144
- package/dist/assets/input-CTGeYzNe.js +0 -1
- package/dist/assets/settings-Ci_RMpCQ.js +0 -1
- package/dist/assets/setup-B0D9CK3-.js +0 -1
- package/dist/assets/setup-B58YVaGU.js +0 -1
- package/dist/assets/setup-C2H9Uv0Q.js +0 -1
- package/dist/assets/setup-CzM4dkkU.js +0 -1
- package/dist/assets/setup-Di56FlHP.js +0 -1
- package/dist/assets/setup-Dwt58Mpz.js +0 -1
- package/dist/assets/setup-DznVdlJy.js +0 -1
- package/dist/assets/shared-CLfD85oZ.js +0 -1
- package/dist/assets/stores-C7Vvce-6.js +0 -7
- package/dist/assets/ui-store-Dm7ujR9u.js +0 -1
- package/dist/assets/useWebSocket-9lfOsI_r.js +0 -27
- package/dist/assets/vector-memory-panel-B4bQhdHe.js +0 -1
- package/dist/assets/vendor-enc0q-Va.js +0 -139
- package/dist/assets/view-navigation-wOKaM_Rf.js +0 -1
- package/dist/assets/ws-client-DtTZLD8e.js +0 -22
- /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
|
-
import
|
|
2
|
-
export
|
|
1
|
+
import { resolveCancelInput } from './ChatInput/session-draft.js';
|
|
2
|
+
export { resolveCancelInput };
|
|
3
3
|
export declare function ChatInput({ onOpenBreakdown, }?: {
|
|
4
4
|
onOpenBreakdown?: (() => void) | undefined;
|
|
5
|
-
}):
|
|
5
|
+
}): import("react").JSX.Element;
|
|
6
6
|
//# sourceMappingURL=ChatInput.d.ts.map
|
|
@@ -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,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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
@@ -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,9 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Main view router —
|
|
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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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;
|
|
@@ -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
|