@wrongstack/webui 0.299.0 → 0.301.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 (180) hide show
  1. package/dist/assets/AgentRosterView-BV6ysoGs.js +9 -0
  2. package/dist/assets/{AnalyticsDashboard-D58kSekC.js → AnalyticsDashboard-UWNP8zjE.js} +1 -1
  3. package/dist/assets/AudienceMemoryPanel-DwDKbvSA.js +3 -0
  4. package/dist/assets/ChangesView-DuVlGWkD.js +1 -0
  5. package/dist/assets/ChronicleDashboard-cs16n708.js +1 -0
  6. package/dist/assets/CodeEditor-sr50ljZN.js +1 -0
  7. package/dist/assets/CodeMap-CtK-C8gK.js +1 -0
  8. package/dist/assets/ConfirmModal-ndS17YwF.js +1 -0
  9. package/dist/assets/CronJobsPanel-Dovomns5.js +1 -0
  10. package/dist/assets/DeadCodeScanPanel-DjR4LLMs.js +2 -0
  11. package/dist/assets/DebugDashboard-jK1yp3qS.js +1 -0
  12. package/dist/assets/DesignGalleryView-CqXlEUzE.js +1 -0
  13. package/dist/assets/GoalView-CGNLrnA4.js +1 -0
  14. package/dist/assets/KanbanView--tAf_K7N.js +3 -0
  15. package/dist/assets/{MailboxDetailView-ZcKcOEAe.js → MailboxDetailView-0TBzZTdN.js} +1 -1
  16. package/dist/assets/MemoryManager-CDK_MO8A.js +1 -0
  17. package/dist/assets/{ModelPicker-DvNLZzkm.js → ModelPicker-BbBZuQwR.js} +1 -1
  18. package/dist/assets/OfficeMapPanel-68sVzHRD.js +4 -0
  19. package/dist/assets/OfficeMapPanel-D6yTfGIT.css +1 -0
  20. package/dist/assets/{ProcessMonitor-2nSk6sXA.js → ProcessMonitor-gFwiF8gX.js} +1 -1
  21. package/dist/assets/{QueuePanel-4KBBWFxj.js → QueuePanel-Cx-isRGl.js} +1 -1
  22. package/dist/assets/{RefreshDebugView-D3XnE53y.js → RefreshDebugView-C9tdu6Ld.js} +1 -1
  23. package/dist/assets/RequirementIntakeView-cPEw-RpV.js +1 -0
  24. package/dist/assets/SageTabs-BbK6VFO0.js +2 -0
  25. package/dist/assets/SddHub-NKvDRECi.js +2 -0
  26. package/dist/assets/SessionInspectView-DPG5qWhj.js +1 -0
  27. package/dist/assets/SessionList-ncl-20X_.js +1 -0
  28. package/dist/assets/SessionsDashboard-D23UVLr4.js +1 -0
  29. package/dist/assets/SetupScreen-D3XQ8MGk.js +1 -0
  30. package/dist/assets/{SkillDetailView-D7EQ2XtV.js → SkillDetailView-DDPhVFet.js} +1 -1
  31. package/dist/assets/SpecsView-afIS0QpX.js +1 -0
  32. package/dist/assets/TechStackView-kQ2OGxxw.js +1 -0
  33. package/dist/assets/{TerminalPanel-BL9ZPGJt.js → TerminalPanel-GcJWeldW.js} +1 -1
  34. package/dist/assets/{Toaster-CJI70aa-.js → Toaster-CgQA9256.js} +1 -1
  35. package/dist/assets/activity-B-cvKIfT.js +9 -0
  36. package/dist/assets/activity-Ba3aMzvo.js +9 -0
  37. package/dist/assets/activity-CRTVZ5A4.js +9 -0
  38. package/dist/assets/activity-DsSuflRW.js +9 -0
  39. package/dist/assets/activity-DxDRJ8kN.js +9 -0
  40. package/dist/assets/activity-VI776bUZ.js +9 -0
  41. package/dist/assets/activity-nVmsmqAI.js +9 -0
  42. package/dist/assets/chat-BPuAsrkF.js +1 -0
  43. package/dist/assets/chat-BfQBSiII.js +1 -0
  44. package/dist/assets/chat-BnkVCZ3Q.js +1 -0
  45. package/dist/assets/chat-CR2B97dj.js +1 -0
  46. package/dist/assets/chat-CdiY7G6Z.js +1 -0
  47. package/dist/assets/chat-DResBrkV.js +1 -0
  48. package/dist/assets/chat-Di8o0wDz.js +1 -0
  49. package/dist/assets/chat-store-DbxFVDwi.js +17 -0
  50. package/dist/assets/{common-DMM-xyW3.js → common-BXJbu5Y-.js} +1 -1
  51. package/dist/assets/{common-C9ikgX7d.js → common-BiNu_WzQ.js} +1 -1
  52. package/dist/assets/common-COVxQ0FV.js +1 -0
  53. package/dist/assets/{common-D29Zdkxb.js → common-Ch7JihXD.js} +1 -1
  54. package/dist/assets/{common-DoUBSHRY.js → common-DPaTeTls.js} +1 -1
  55. package/dist/assets/{common-vdwxzODB.js → common-DdGpRh8j.js} +1 -1
  56. package/dist/assets/{common-C5hY-d_0.js → common-pI6fYZW3.js} +1 -1
  57. package/dist/assets/i18n-COgumVF5.js +2 -0
  58. package/dist/assets/index-CtpViiZy.js +132 -0
  59. package/dist/assets/index-fIsq43fR.css +1 -0
  60. package/dist/assets/mailbox-store-C1mzoSqJ.js +1 -0
  61. package/dist/assets/{progress-ring-61A-xUEl.js → progress-ring-D_48qsBl.js} +1 -1
  62. package/dist/assets/{roster-ws-Dfg_187V.js → roster-ws-Da57e_sI.js} +1 -1
  63. package/dist/assets/session-store-Df7_hhe9.js +1 -0
  64. package/dist/assets/settings-Bb7_utQE.js +1 -0
  65. package/dist/assets/settings-Bd8zMwvC.js +1 -0
  66. package/dist/assets/settings-DdFgBMAw.js +1 -0
  67. package/dist/assets/settings-De6sXIFO.js +1 -0
  68. package/dist/assets/settings-E8SKMLxq.js +1 -0
  69. package/dist/assets/settings-zIY9-ivF.js +1 -0
  70. package/dist/assets/settings-zKBcRjqE.js +1 -0
  71. package/dist/assets/stores-ChEnUmic.js +7 -0
  72. package/dist/assets/ui-store-CE4-TlwB.js +1 -0
  73. package/dist/assets/useWebSocket-_gk4MRJz.js +29 -0
  74. package/dist/assets/{view-navigation-DxfiZrXS.js → view-navigation-DIDEcp4V.js} +1 -1
  75. package/dist/assets/ws-client-TTMa0XaT.js +1 -0
  76. package/dist/components/AgentCard.d.ts +21 -0
  77. package/dist/components/AgentsPage.d.ts +0 -3
  78. package/dist/components/AutonomyPicker.d.ts +1 -1
  79. package/dist/components/ChatInput/refine-panel-host.d.ts +2 -2
  80. package/dist/components/ChatView/auto-collapse.d.ts +42 -0
  81. package/dist/components/ConfirmModal.d.ts +7 -2
  82. package/dist/components/FallbackModal.d.ts +2 -0
  83. package/dist/components/KanbanBoardState.d.ts +1 -1
  84. package/dist/components/KanbanVerificationDashboard.d.ts +0 -6
  85. package/dist/components/SettingsPanel/PluginToggleList.d.ts +11 -3
  86. package/dist/components/SettingsPanel/ShadowSection.d.ts +18 -1
  87. package/dist/components/SettingsPanel/brain-section-options.d.ts +27 -55
  88. package/dist/components/TaskCard.d.ts +0 -1
  89. package/dist/components/TaskRiskPanel.d.ts +10 -3
  90. package/dist/components/TechStackView/shared.d.ts +11 -6
  91. package/dist/components/ThemeProvider.d.ts +6 -1
  92. package/dist/components/agent-roster-data.d.ts +2 -1
  93. package/dist/components/index.d.ts +0 -1
  94. package/dist/hooks/useWebSocket.d.ts +10 -2
  95. package/dist/hooks/ws-handlers/files-mailbox-handlers.d.ts +1 -0
  96. package/dist/hooks/ws-handlers/misc-handlers.d.ts +13 -0
  97. package/dist/hooks/ws-handlers/session-handlers.d.ts +1 -0
  98. package/dist/index.css +62 -0
  99. package/dist/index.html +18 -17
  100. package/dist/index.js +26640 -12728
  101. package/dist/lib/file-icons.d.ts +3 -3
  102. package/dist/lib/kanban-board-active.d.ts +19 -0
  103. package/dist/lib/palettes.d.ts +37 -0
  104. package/dist/lib/plugin-enablement.d.ts +1 -1
  105. package/dist/lib/ws-client.d.ts +24 -4
  106. package/dist/providers.json +7 -7
  107. package/dist/stores/config-store.d.ts +9 -1
  108. package/dist/stores/context-editor-store.d.ts +9 -1
  109. package/dist/stores/fallback-store.d.ts +30 -0
  110. package/dist/stores/fleet-store.d.ts +14 -1
  111. package/dist/stores/index.d.ts +2 -0
  112. package/dist/stores/local-prefs.d.ts +13 -0
  113. package/dist/stores/mailbox-store.d.ts +2 -0
  114. package/dist/stores/session-store.d.ts +9 -1
  115. package/dist/stores/ui-store.d.ts +2 -0
  116. package/dist/types/brain.d.ts +2 -0
  117. package/dist/types/client-message.d.ts +19 -2
  118. package/dist/types/protocol-core.d.ts +21 -0
  119. package/dist/types/runtime.d.ts +22 -0
  120. package/dist/types/server-message.d.ts +15 -4
  121. package/package.json +9 -9
  122. package/dist/assets/AgentRosterView-BqojERFR.js +0 -11
  123. package/dist/assets/AudienceMemoryPanel-Cc1UkbDl.js +0 -3
  124. package/dist/assets/ChangesView-BKU80ANq.js +0 -1
  125. package/dist/assets/ChronicleDashboard-CvCS1Dj1.js +0 -1
  126. package/dist/assets/CodeEditor-BHZQhx_8.js +0 -1
  127. package/dist/assets/CodeMap-qllGEFLB.js +0 -1
  128. package/dist/assets/CronJobsPanel-DD5mhZ4Q.js +0 -1
  129. package/dist/assets/DeadCodeScanPanel-PB-c8et_.js +0 -2
  130. package/dist/assets/DebugDashboard-Q8QiVflQ.js +0 -1
  131. package/dist/assets/DesignGalleryView-CGOtWO7s.js +0 -1
  132. package/dist/assets/GoalView-Dlk42vW7.js +0 -1
  133. package/dist/assets/KanbanView-DIP6kKmU.js +0 -3
  134. package/dist/assets/MemoryManager-B7620q_K.js +0 -1
  135. package/dist/assets/OfficeMapPanel-BFIF-EMt.css +0 -1
  136. package/dist/assets/OfficeMapPanel-DKJNTtOZ.js +0 -4
  137. package/dist/assets/RequirementIntakeView-BMxlf8bt.js +0 -1
  138. package/dist/assets/SageTabs-g1hO2hJ0.js +0 -2
  139. package/dist/assets/SddHub-Kv_TbTgT.js +0 -2
  140. package/dist/assets/SessionInspectView-PnKTvyvP.js +0 -1
  141. package/dist/assets/SessionList-BeinIC-h.js +0 -1
  142. package/dist/assets/SessionsDashboard-DEG_BylE.js +0 -1
  143. package/dist/assets/SetupScreen-DxJwZ1OZ.js +0 -1
  144. package/dist/assets/SpecsView-Fm7pYYcj.js +0 -1
  145. package/dist/assets/TechStackView-Bo_UenRF.js +0 -1
  146. package/dist/assets/activity-BCgOEWgR.js +0 -5
  147. package/dist/assets/activity-BQ0zqkw2.js +0 -5
  148. package/dist/assets/activity-CAovbq3e.js +0 -5
  149. package/dist/assets/activity-CFQyCvgu.js +0 -5
  150. package/dist/assets/activity-CdQf7zRK.js +0 -5
  151. package/dist/assets/activity-DACvyn2-.js +0 -5
  152. package/dist/assets/activity-DOwYydU-.js +0 -5
  153. package/dist/assets/chat-CRmMDzCb.js +0 -1
  154. package/dist/assets/chat-CwnuX7tG.js +0 -1
  155. package/dist/assets/chat-DLn1hY01.js +0 -1
  156. package/dist/assets/chat-DSEq1Bdz.js +0 -1
  157. package/dist/assets/chat-DxLD17ER.js +0 -1
  158. package/dist/assets/chat-DzPxYALH.js +0 -1
  159. package/dist/assets/chat-OunddzYy.js +0 -1
  160. package/dist/assets/chat-store-CtOyUCdF.js +0 -17
  161. package/dist/assets/common-BfVFjVhf.js +0 -1
  162. package/dist/assets/i18n-B0hsnanh.js +0 -2
  163. package/dist/assets/index-DHdO0CRE.js +0 -132
  164. package/dist/assets/index-DKrFQ76m.css +0 -1
  165. package/dist/assets/mailbox-store-D8TvJsuk.js +0 -1
  166. package/dist/assets/session-store-b2KGFwkX.js +0 -1
  167. package/dist/assets/settings-B5xal2R3.js +0 -1
  168. package/dist/assets/settings-BHtFy8EG.js +0 -1
  169. package/dist/assets/settings-Bss5hBla.js +0 -1
  170. package/dist/assets/settings-BzrLCVRP.js +0 -1
  171. package/dist/assets/settings-C7RdvmLZ.js +0 -1
  172. package/dist/assets/settings-Dd94HoV6.js +0 -1
  173. package/dist/assets/settings-Dm9THFe8.js +0 -1
  174. package/dist/assets/stores-BptlyD_v.js +0 -7
  175. package/dist/assets/ui-store-BsBnjO3w.js +0 -1
  176. package/dist/assets/useWebSocket-Bc4S0N4r.js +0 -29
  177. package/dist/assets/ws-client-DqFoX4jJ.js +0 -1
  178. package/dist/components/AgentsMonitor.d.ts +0 -26
  179. package/dist/components/FleetMonitor.d.ts +0 -21
  180. package/dist/lib/accent-colors.d.ts +0 -136
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Returns a Tailwind text color class for a file extension.
3
- * Colors match the WrongStack semantic palette same hues used in
4
- * syntax highlighting and Monaco editor themes for visual consistency.
2
+ * Returns a semantic Tailwind text-color class for a file extension.
3
+ * The classes resolve through WebUI theme tokens so file icons adapt to
4
+ * light/dark mode and the selected product palette.
5
5
  */
6
6
  export declare function fileIconColor(name: string, isDirectory: boolean): string;
7
7
  export declare function fileIcon(name: string): React.ComponentType<{
@@ -0,0 +1,19 @@
1
+ import type { KanbanBoardSummary } from '@wrongstack/kanban';
2
+ /**
3
+ * The single client-side answer to "is this board attached to a live
4
+ * session?": a board is active when EITHER a presence entry is live OR one
5
+ * of its `session:<id>` tags names a session the client currently knows to
6
+ * be running. Callers that cannot know the live session ids (e.g. the
7
+ * kanban store computing fallback totals outside React) pass an empty
8
+ * list — that degrades to the presence-only half of the predicate instead
9
+ * of forking a second, narrower definition.
10
+ *
11
+ * The server-side twin lives in
12
+ * `packages/webui-server/src/server/kanban-route-pagination.ts`
13
+ * (`isActive` inside `paginateKanbanBoards`) and must keep the same shape:
14
+ * the server's `activeTotal`/`orphanedTotal` land in the same store fields
15
+ * these fallbacks feed, so a definition drift between the two shows up as
16
+ * a section heading disagreeing with the list rendered under it.
17
+ */
18
+ export declare function isKanbanBoardActive(board: Pick<KanbanBoardSummary, 'presence' | 'tags'>, activeSessionIds: readonly string[]): boolean;
19
+ //# sourceMappingURL=kanban-board-active.d.ts.map
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Color palette registry — the WebUI's "main color" system.
3
+ *
4
+ * Users can pick a palette on top of the light/dark theme toggle. The actual
5
+ * token values live in `index.css` as `:root[data-palette="…"]` /
6
+ * `.dark[data-palette="…"]` blocks (rendering is driven by `hsl(var(--token))`),
7
+ * so this module only describes the palettes for the picker UI: id, i18n
8
+ * label, and the two swatch colors that preview the palette's two brand
9
+ * signals. `applyPalette` toggles the `data-palette` attribute on `<html>`.
10
+ *
11
+ * To add a palette: add a CSS token block in `index.css`, an entry here (in
12
+ * the same order), and an i18n label key in all 7 locale files. The default
13
+ * "signal" palette needs no CSS block — it is the base token set.
14
+ */
15
+ export type PaletteId = 'signal' | 'emerald-gold' | 'blue-navy' | 'purple-pink' | 'cyan-teal' | 'rose-copper' | 'indigo-amber';
16
+ export interface PaletteDefinition {
17
+ id: PaletteId;
18
+ /** i18n key for the palette name, e.g. 'settings:general.paletteEmeraldGold'. */
19
+ labelKey: string;
20
+ /** CSS color for the main (primary) swatch stripe — dark-mode value so it reads on both themes. */
21
+ swatch: string;
22
+ /** CSS color for the secondary (brand) swatch stripe. */
23
+ swatchSecondary: string;
24
+ }
25
+ export declare const DEFAULT_PALETTE: PaletteId;
26
+ /** localStorage key for the persisted palette — shared by ThemeProvider and the config store's merge. */
27
+ export declare const PALETTE_STORAGE_KEY = "wrongstack-palette";
28
+ export declare const PALETTES: readonly PaletteDefinition[];
29
+ export declare function isPaletteId(value: unknown): value is PaletteId;
30
+ export declare function getPalette(value: unknown): PaletteDefinition;
31
+ /** Guarded read of a persisted palette id; invalid/missing/blocked storage
32
+ * falls back to `fallback`. Shared by ThemeProvider (initial state) and the
33
+ * config store's `merge` so the two persistence layers agree. */
34
+ export declare function readStoredPalette(storageKey: string, fallback: PaletteId): PaletteId;
35
+ /** Apply a palette to <html> by setting `data-palette`; removes it for the default. */
36
+ export declare function applyPalette(root: HTMLElement, palette: PaletteId): void;
37
+ //# sourceMappingURL=palettes.d.ts.map
@@ -26,7 +26,7 @@ export interface ResolvedPluginState {
26
26
  * behaviour. The local override map may be missing, in which case only
27
27
  * the canonical config is consulted.
28
28
  */
29
- export declare function resolvePluginEnablement(configuredPlugins: readonly PluginEntry[] | undefined, localOverrides: Readonly<Record<string, boolean>> | undefined): ResolvedPluginState[];
29
+ export declare function resolvePluginToggleStates(configuredPlugins: readonly PluginEntry[] | undefined, localOverrides: Readonly<Record<string, boolean>> | undefined): ResolvedPluginState[];
30
30
  /**
31
31
  * Convenience accessor for callers that only need one plugin's resolved
32
32
  * state. Returns `undefined` if the plugin is not configured at all
@@ -1,6 +1,6 @@
1
1
  import type { WSClientMessage, WSModelSwitchResult, WSServerMessage, WSUserMessageImage } from '../types';
2
2
  import type { ProviderCustomModelWire } from '../types/client-message';
3
- import type { ContextEditorMessage } from '../types/runtime';
3
+ import type { ContextEditorMessage, ContextEditorRemoval } from '../types/runtime';
4
4
  import { type WsClientActionMethods } from './ws-client-actions';
5
5
  import type { WSSendOptions } from './ws-client-contracts';
6
6
  import { type EventHandler, type WsStatus } from './ws-client-utils';
@@ -75,6 +75,23 @@ declare class WrongStackWebSocketClientBase {
75
75
  private attemptReconnect;
76
76
  /** Force an immediate reconnect attempt, bypassing the backoff timer. */
77
77
  retryNow(): void;
78
+ /**
79
+ * Drain the offline queue onto a freshly-opened socket.
80
+ *
81
+ * Two hazards, both fatal before this guard:
82
+ *
83
+ * 1. `send()` calls `this.ws.send(...)` unguarded. The socket can race
84
+ * OPEN → CLOSING between the readyState check and the actual write (a
85
+ * normal server restart does it), which throws `InvalidStateError`. This
86
+ * runs from `onopen` BEFORE `resolve()`, so the throw skipped the
87
+ * resolve, the connect promise never settled, `.finally()` never cleared
88
+ * `connectPromise`, and every later `connect()` — including
89
+ * `attemptReconnect` and `retryNow` — returned that dead promise. The tab
90
+ * was offline for good with the banner stuck on "reconnecting".
91
+ * 2. If the socket is not OPEN, `send()` re-queues the message it was handed
92
+ * while this loop keeps shifting — an infinite loop on the main thread.
93
+ * Draining into a local array first makes the loop finite by construction.
94
+ */
78
95
  private flushMessageQueue;
79
96
  private handleMessage;
80
97
  private emit;
@@ -96,7 +113,10 @@ declare class WrongStackWebSocketClientBase {
96
113
  type: K;
97
114
  }>) => void): void;
98
115
  off(eventType: string, handler: EventHandler): void;
99
- sendMessage(content: string, images?: WSUserMessageImage[]): string;
116
+ sendMessage(content: string, images?: WSUserMessageImage[], freshContext?: boolean): string;
117
+ adviseTopic(prompt: string, timeoutMs?: number): Promise<Extract<WSServerMessage, {
118
+ type: 'topic.advice_result';
119
+ }>['payload']>;
100
120
  /** Send a mailbox message of the given type (btw, steer, note, etc.)
101
121
  * to a target agent/role. Returns the requestId for response tracking. */
102
122
  sendMailboxMessage(opts: WSMailboxSendOptions): string;
@@ -154,8 +174,8 @@ declare class WrongStackWebSocketClientBase {
154
174
  compactContext(aggressive?: boolean): void;
155
175
  repairContext(): void;
156
176
  openContextEditor(): void;
157
- validateContextEditor(baseRevision: string, messages: ContextEditorMessage[], allowRepair: boolean): void;
158
- applyContextEditor(baseRevision: string, messages: ContextEditorMessage[], allowRepair: boolean): void;
177
+ validateContextEditor(baseRevision: string, messages: ContextEditorMessage[], removals: ContextEditorRemoval[], allowRepair: boolean): void;
178
+ applyContextEditor(baseRevision: string, messages: ContextEditorMessage[], removals: ContextEditorRemoval[], allowRepair: boolean): void;
159
179
  debugContext(options?: WSSendOptions): void;
160
180
  listContextModes(): void;
161
181
  switchContextMode(id: string): void;
@@ -45,14 +45,14 @@
45
45
  }
46
46
  },
47
47
  {
48
- "id": "zyloo",
49
- "name": "Zyloo",
48
+ "id": "ai-gateway",
49
+ "name": "Vercel AI Gateway",
50
50
  "family": "openai-compatible",
51
- "description": "Zyloo API OpenAI-compatible with a 128-tool limit per request",
52
- "icon": "🚀",
53
- "color": "from-accent/12 to-accent/5 border-accent/30 hover:border-accent/50",
54
- "keyPlaceholder": "zy-...",
55
- "docsUrl": "https://docs.zyloo.io/"
51
+ "description": "Every model behind one key routed by Vercel AI Gateway",
52
+ "icon": "",
53
+ "color": "from-primary/12 to-primary/5 border-primary/30 hover:border-primary/50",
54
+ "keyPlaceholder": "vck_...",
55
+ "docsUrl": "https://vercel.com/docs/ai-gateway"
56
56
  },
57
57
  {
58
58
  "id": "openrouter",
@@ -1,3 +1,4 @@
1
+ import { type PaletteId } from '@/lib/palettes';
1
2
  export interface ConfigState {
2
3
  provider: string;
3
4
  model: string;
@@ -21,6 +22,10 @@ export interface ConfigState {
21
22
  lastError?: string | undefined;
22
23
  };
23
24
  theme: 'light' | 'dark' | 'system';
25
+ /** Selected color palette id — see `lib/palettes.ts` + `index.css` token
26
+ * blocks. Mirrors the ThemeProvider's `wrongstack-palette` localStorage
27
+ * entry so the choice survives reloads and cross-surface config reads. */
28
+ palette: PaletteId;
24
29
  autoConnect: boolean;
25
30
  /** Play a soft synthesized chime when run.result lands with status=done.
26
31
  * Off by default — opt-in via the Command Palette. Persisted so the
@@ -29,8 +34,9 @@ export interface ConfigState {
29
34
  soundOnComplete: boolean;
30
35
  setProvider: (provider: string) => void;
31
36
  setModel: (model: string) => void;
32
- setConfig: (config: Partial<Omit<ConfigState, 'setProvider' | 'setModel' | 'setConfig' | 'setTheme'>>) => void;
37
+ setConfig: (config: Partial<Omit<ConfigState, 'setProvider' | 'setModel' | 'setConfig' | 'setTheme' | 'setPalette'>>) => void;
33
38
  setTheme: (theme: 'light' | 'dark' | 'system') => void;
39
+ setPalette: (palette: PaletteId) => void;
34
40
  setWsConnected: (connected: boolean) => void;
35
41
  setWsStatus: (s: ConfigState['wsStatus']) => void;
36
42
  setSoundOnComplete: (on: boolean) => void;
@@ -44,6 +50,7 @@ export declare const useConfigStore: import("zustand").UseBoundStore<Omit<import
44
50
  model: string;
45
51
  baseUrl: string | undefined;
46
52
  theme: "dark" | "light" | "system";
53
+ palette: PaletteId;
47
54
  autoConnect: boolean;
48
55
  soundOnComplete: boolean;
49
56
  }, unknown>>) => void;
@@ -57,6 +64,7 @@ export declare const useConfigStore: import("zustand").UseBoundStore<Omit<import
57
64
  model: string;
58
65
  baseUrl: string | undefined;
59
66
  theme: "dark" | "light" | "system";
67
+ palette: PaletteId;
60
68
  autoConnect: boolean;
61
69
  soundOnComplete: boolean;
62
70
  }, unknown>>;
@@ -1,4 +1,4 @@
1
- import type { ContextEditorMessage, ContextEditorMetrics, ContextEditorRepairPreview, ContextEditorValidationError, ContextEditorWarning, ContextEditorConflict, ContextEditorDiagnostics } from '@/types/runtime';
1
+ import type { ContextEditorMessage, ContextEditorMetrics, ContextEditorRemoval, ContextEditorRepairPreview, ContextEditorValidationError, ContextEditorWarning, ContextEditorConflict, ContextEditorDiagnostics } from '@/types/runtime';
2
2
  export type ContextEditorPhase = 'closed' | 'loading_snapshot' | 'clean_snapshot' | 'dirty' | 'validating' | 'validated' | 'invalid' | 'conflicted' | 'applying' | 'applied_success' | 'apply_failed';
3
3
  interface ReadonlyContext {
4
4
  systemPromptTokens: number;
@@ -14,6 +14,7 @@ interface MessageBreakdownEntry {
14
14
  preview: string;
15
15
  blockCount: number | null;
16
16
  warnings: ContextEditorWarning[];
17
+ pairedAssistantIndices: number[];
17
18
  }
18
19
  interface ValidationResult {
19
20
  ok: boolean;
@@ -44,6 +45,9 @@ export interface ContextEditorState {
44
45
  messageBreakdown: MessageBreakdownEntry[];
45
46
  diagnostics: ContextEditorDiagnostics | null;
46
47
  removeMessages: Set<number>;
48
+ /** Messages selected directly by the user, excluding required assistant pairing. */
49
+ explicitRemoveMessages: Set<number>;
50
+ removeRanges: ContextEditorRemoval[];
47
51
  validation: ValidationResult | null;
48
52
  appliedResult: AppliedResult | null;
49
53
  errorMessage: string | null;
@@ -59,7 +63,10 @@ export interface ContextEditorActions {
59
63
  diagnostics: ContextEditorDiagnostics;
60
64
  }) => void;
61
65
  toggleRemoveMessage: (index: number) => void;
66
+ markRangeForRemoval: (removal: ContextEditorRemoval) => void;
62
67
  clearRemovals: () => void;
68
+ beginValidation: () => void;
69
+ beginApply: () => void;
63
70
  setValidation: (result: ValidationResult) => void;
64
71
  setApplied: (result: AppliedResult) => void;
65
72
  setError: (message: string | null) => void;
@@ -68,6 +75,7 @@ export interface ContextEditorActions {
68
75
  getProposedMessages: () => ContextEditorMessage[];
69
76
  }
70
77
  export type ContextEditorStore = ContextEditorState & ContextEditorActions;
78
+ export declare function findPairedAssistantIndices(messages: readonly ContextEditorMessage[], userIndex: number): number[];
71
79
  export declare const useContextEditorStore: import("zustand").UseBoundStore<import("zustand").StoreApi<ContextEditorStore>>;
72
80
  export {};
73
81
  //# sourceMappingURL=context-editor-store.d.ts.map
@@ -0,0 +1,30 @@
1
+ export interface FallbackCandidate {
2
+ providerId: string;
3
+ model: string;
4
+ }
5
+ export interface FallbackPendingState {
6
+ requestId: string;
7
+ from: {
8
+ providerId: string;
9
+ model: string;
10
+ };
11
+ status: number;
12
+ candidates: FallbackCandidate[];
13
+ autoSwitchSeconds: number;
14
+ timestamp: number;
15
+ }
16
+ interface FallbackStore {
17
+ pending: FallbackPendingState | null;
18
+ selected: number;
19
+ /** Set the pending state from a WS event. */
20
+ setPending: (state: FallbackPendingState) => void;
21
+ /** Clear the pending state (switch happened or dismissed). */
22
+ clear: () => void;
23
+ /** Move the selection index (wraps). */
24
+ move: (delta: number) => void;
25
+ /** Set selection to a specific index. */
26
+ setSelected: (index: number) => void;
27
+ }
28
+ export declare const useFallbackStore: import("zustand").UseBoundStore<import("zustand").StoreApi<FallbackStore>>;
29
+ export {};
30
+ //# sourceMappingURL=fallback-store.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { AgentTranscriptEntry, FleetTimelineEvent, SubagentView, SubagentEvent } from './types.js';
1
+ import type { AgentTranscriptEntry, FleetTimelineEvent, SubagentEvent, SubagentView } from './types.js';
2
2
  export declare const EMPTY_AGENT_TRANSCRIPT: AgentTranscriptEntry[];
3
3
  interface FleetState {
4
4
  agents: Map<string, SubagentView>;
@@ -10,6 +10,13 @@ interface FleetState {
10
10
  /** Current / max concurrency from server. */
11
11
  fleetConcurrency: number;
12
12
  fleetConcurrencyMax: number;
13
+ /** Lifetime spawn budget from server (issue #323). Undefined until first budget frame. */
14
+ fleetMaxSpawns: number | undefined;
15
+ fleetUsedSpawns: number | undefined;
16
+ fleetRemainingSpawns: number | undefined;
17
+ fleetBudgetSource: string | undefined;
18
+ fleetCheckpointMaxSpawns: number | undefined;
19
+ fleetCeilingMismatch: boolean;
13
20
  /** Last 20 fleet events for the Fleet Monitor timeline. */
14
21
  eventTimeline: FleetTimelineEvent[];
15
22
  /** Agent conversation timeline entries (agent.timeline.message + agent.status_changed). */
@@ -38,6 +45,12 @@ export interface FleetSummary {
38
45
  tokensOut: number;
39
46
  concurrency: number;
40
47
  concurrencyMax: number;
48
+ maxSpawns?: number | undefined;
49
+ usedSpawns?: number | undefined;
50
+ remainingSpawns?: number | undefined;
51
+ budgetSource?: string | undefined;
52
+ ceilingMismatch?: boolean | undefined;
53
+ checkpointMaxSpawns?: number | undefined;
41
54
  }
42
55
  /** Shallow comparison for zustand selector equality checks.
43
56
  * Compares own enumerable string-keyed properties by reference.
@@ -29,6 +29,8 @@ export type { ClientCounts, CurrentSessionStats, MailActivity } from './monitor-
29
29
  export { useMonitorStore } from './monitor-store.js';
30
30
  export { type BackgroundStyle, useOfficeMapStore } from './office-map-store.js';
31
31
  export { type ProviderHealthEntry, type ProviderHealthState, useProviderStatusStore, } from './provider-status-store.js';
32
+ export { useFallbackStore } from './fallback-store.js';
33
+ export type { FallbackCandidate, FallbackPendingState } from './fallback-store.js';
32
34
  export { type SddBoardFeedEntry, type SddBoardSnapshotUI, type SddBoardStatus, type SddBoardSummary, type SddLifecycleResultUI, useSddBoardStore, } from './sdd-board-store.js';
33
35
  export { type SddWizardPhase, type SddWizardSnapshot, useSddWizardStore, } from './sdd-wizard-store.js';
34
36
  export { useSessionStore } from './session-store.js';
@@ -24,6 +24,13 @@ export interface LocalPrefs {
24
24
  fleetChatVerbosity: FleetChatVerbosity;
25
25
  /** Predict next steps after turn completes */
26
26
  nextPrediction: boolean;
27
+ /**
28
+ * Register the leader's agent-callable `nextsteps` tool alongside the
29
+ * `<nextsteps>` block it can already write. Persisted to
30
+ * `tools.nextsteps.enabled`; the tool registry is built at boot, so the
31
+ * change takes effect in the next session.
32
+ */
33
+ nextStepsTool: boolean;
27
34
  /** Global fallback model chain (entries: `model` or `provider/model`). */
28
35
  fallbackModels: string[];
29
36
  /** Named fallback chains selectable by setmodel/model routing. */
@@ -96,6 +103,10 @@ export interface LocalPrefs {
96
103
  showThinkingLogs: boolean;
97
104
  /** Group consecutive tool calls into collapsible chips */
98
105
  groupToolCalls: boolean;
106
+ /** Auto-collapse the chat input under the history when a session with
107
+ * messages loads (opt-in; off by default). When off, the input always
108
+ * starts expanded. Independent of the manual collapse/expand buttons. */
109
+ autoCollapseInput: boolean;
99
110
  /** Show model reasoning/thinking blocks inline in the chat */
100
111
  showModelReasoning: boolean;
101
112
  /** Agent swarm panel placement: bottom, sidebar, or off */
@@ -169,6 +180,8 @@ export interface LocalPrefs {
169
180
  autoReviewModel: string;
170
181
  /** Named fallback profile (from `config.fallbackProfiles`) used to derive provider/model + fallback chain. */
171
182
  autoReviewFallbackProfile: string;
183
+ /** Starting-model policy for the selected auto-review profile. */
184
+ autoReviewModelSelection: 'round-robin' | 'random';
172
185
  /** Explicit fallback chain (derived when no fallbackProfile is set, surfaced for visibility). */
173
186
  autoReviewFallbackModels: string[];
174
187
  /** Debounce window in ms — wait for quiet before firing review (default 15000). */
@@ -71,6 +71,8 @@ interface MailboxState {
71
71
  setMessages: (messages: MailboxMessage[]) => void;
72
72
  setAgents: (agents: MailboxAgent[]) => void;
73
73
  setLastCompaction: (result: MailboxCompactionResult | null) => void;
74
+ /** Drop one agent by id (mailbox.agent_deregistered push). */
75
+ removeAgent: (agentId: string) => void;
74
76
  }
75
77
  export declare const useMailboxStore: import("zustand").UseBoundStore<import("zustand").StoreApi<MailboxState>>;
76
78
  /** Incomplete messages where no agent has acted yet (readByCount === 0).
@@ -8,8 +8,15 @@ interface SessionState {
8
8
  lastInputTokens: number;
9
9
  cost: number;
10
10
  startTime: number | null;
11
- /** Model max context window, from models.dev catalog. 0 = unknown. */
11
+ /** Active effective context window. 0 = unknown. */
12
12
  maxContext: number;
13
+ /** Live provider-reported decrease, shown until the session/model changes. */
14
+ contextLimitWarning: {
15
+ previousMaxContext: number;
16
+ maxContext: number;
17
+ providerId: string;
18
+ modelId: string;
19
+ } | null;
13
20
  /** USD per 1M tokens — used to compute cost deltas on every provider.response. */
14
21
  inputCost: number;
15
22
  outputCost: number;
@@ -92,6 +99,7 @@ interface SessionState {
92
99
  max: number;
93
100
  } | null) => void;
94
101
  setContextUsage: (tokens: number, maxContext?: number | undefined) => void;
102
+ setContextLimitWarning: (warning: SessionState['contextLimitWarning']) => void;
95
103
  setModes: (modes: Array<{
96
104
  id: string;
97
105
  name: string;
@@ -181,6 +181,8 @@ interface UIState {
181
181
  fallbackRef?: string | undefined;
182
182
  /** True once the automatic timeout retry has been spent (so we don't loop). */
183
183
  retried?: boolean | undefined;
184
+ /** Apply a model-context boundary atomically when the approved prompt is sent. */
185
+ freshContext?: boolean | undefined;
184
186
  /** Provider id of the model running the refinement (e.g. "openai"). */
185
187
  provider?: string | undefined;
186
188
  /** Model name running the refinement (e.g. "gpt-4o"). */
@@ -164,6 +164,7 @@ export interface BrainConfigWire {
164
164
  perCallTimeoutMs?: number | undefined;
165
165
  maxConcurrency?: number | undefined;
166
166
  distinctness: 'none' | 'model' | 'provider';
167
+ voterMaxTokens?: number | undefined;
167
168
  judgeMaxTokens?: number | undefined;
168
169
  seats: BrainCouncilSeatWire[];
169
170
  };
@@ -231,6 +232,7 @@ export interface BrainConfigPatchWire {
231
232
  perCallTimeoutMs?: number | null | undefined;
232
233
  maxConcurrency?: number | null | undefined;
233
234
  distinctness?: 'none' | 'model' | 'provider' | null | undefined;
235
+ voterMaxTokens?: number | null | undefined;
234
236
  judgeMaxTokens?: number | null | undefined;
235
237
  seats?: BrainCouncilSeatWire[] | null | undefined;
236
238
  } | null | undefined;
@@ -2,7 +2,7 @@ import type { BrainConfigPatchWire } from './brain.js';
2
2
  import type { ChronicleFacet, ChronicleMetricsView, ChronicleQuery } from './chronicle.js';
3
3
  import type { WSCollabAnnotate, WSCollabGrantControl, WSCollabInjectTool, WSCollabJoin, WSCollabLeave, WSCollabRequestPause, WSCollabResolve, WSCollabResume } from './collab.js';
4
4
  import type { SessionScopedPayload, WSUserMessage } from './protocol-core.js';
5
- import type { ContextEditorMessage, WSModelSwitch, WSToolConfirmResult } from './runtime.js';
5
+ import type { ContextEditorMessage, ContextEditorRemoval, WSModelSwitch, WSToolConfirmResult } from './runtime.js';
6
6
  import type { SageAnchor, SageScope, SageStatus, WSMemorySageForFileRequest } from './sage.js';
7
7
  import type { OAuthKind, WSCompletionRequest } from './system.js';
8
8
  /** Metadata persisted by the custom-provider model editor in provider add/update messages. */
@@ -25,7 +25,13 @@ export interface ProviderCustomModelWire {
25
25
  */
26
26
  modelsDev?: Record<string, unknown> | undefined;
27
27
  }
28
- export type WSClientMessageCore = WSUserMessage | WSToolConfirmResult | {
28
+ export type WSClientMessageCore = WSUserMessage | {
29
+ type: 'topic.advice';
30
+ payload: SessionScopedPayload & {
31
+ requestId: string;
32
+ prompt: string;
33
+ };
34
+ } | WSToolConfirmResult | {
29
35
  type: 'side_effects.list';
30
36
  payload?: Record<string, never>;
31
37
  } | {
@@ -370,6 +376,7 @@ export type WSClientMessageCore = WSUserMessage | WSToolConfirmResult | {
370
376
  payload: SessionScopedPayload & {
371
377
  baseRevision: string;
372
378
  messages: ContextEditorMessage[];
379
+ removals: ContextEditorRemoval[];
373
380
  allowRepair: boolean;
374
381
  };
375
382
  } | {
@@ -377,6 +384,7 @@ export type WSClientMessageCore = WSUserMessage | WSToolConfirmResult | {
377
384
  payload: SessionScopedPayload & {
378
385
  baseRevision: string;
379
386
  messages: ContextEditorMessage[];
387
+ removals: ContextEditorRemoval[];
380
388
  allowRepair: boolean;
381
389
  };
382
390
  } | {
@@ -1190,6 +1198,15 @@ export type WSClientMessageCore = WSUserMessage | WSToolConfirmResult | {
1190
1198
  payload: {
1191
1199
  template: string;
1192
1200
  };
1201
+ } | {
1202
+ type: 'model.fallback_choice';
1203
+ payload: {
1204
+ requestId: string;
1205
+ providerId?: string | undefined;
1206
+ model?: string | undefined;
1207
+ /** When true, auto-switch to the next candidate (countdown expired or Esc). */
1208
+ autoSwitch?: boolean | undefined;
1209
+ };
1193
1210
  } | {
1194
1211
  type: 'webui.shutdown';
1195
1212
  };
@@ -60,6 +60,8 @@ export interface WSUserMessage {
60
60
  content: string;
61
61
  timestamp: number;
62
62
  stateExpiresAt?: number | undefined;
63
+ /** Atomically replace only the provider-bound conversation before this run. */
64
+ freshContext?: boolean | undefined;
63
65
  /** Images attached in the composer (paste / drop / file picker). The
64
66
  * server converts these to canonical ImageBlocks ahead of the text. */
65
67
  images?: WSUserMessageImage[];
@@ -238,6 +240,25 @@ export interface WSProviderFallback {
238
240
  };
239
241
  status: number;
240
242
  providerSwitched: boolean;
243
+ /** Gate correlation id — present when a fallback gate mediated the switch. */
244
+ requestId?: string | undefined;
245
+ };
246
+ }
247
+ export interface WSProviderFallbackPending {
248
+ type: 'provider.fallback_pending';
249
+ payload: SessionScopedPayload & {
250
+ from: {
251
+ providerId: string;
252
+ model: string;
253
+ };
254
+ status: number;
255
+ candidates: Array<{
256
+ providerId: string;
257
+ model: string;
258
+ }>;
259
+ autoSwitchSeconds: number;
260
+ requestId: string;
261
+ timestamp: number;
241
262
  };
242
263
  }
243
264
  export interface WSProviderStatusChanged {
@@ -113,6 +113,13 @@ export interface ContextEditorMessage {
113
113
  content: string | ContextEditorContentBlock[];
114
114
  ts?: string | undefined;
115
115
  }
116
+ /** A whole-message removal, or a character range in string/text-block content. blockIndex only identifies a text block; it is not a whole-block deletion. */
117
+ export interface ContextEditorRemoval {
118
+ messageIndex: number;
119
+ blockIndex?: number | undefined;
120
+ start?: number | undefined;
121
+ end?: number | undefined;
122
+ }
116
123
  export interface ContextEditorMetrics {
117
124
  messages: number;
118
125
  blocks: number;
@@ -168,6 +175,7 @@ export interface WSContextEditorSnapshot {
168
175
  preview: string;
169
176
  blockCount: number | null;
170
177
  warnings: ContextEditorWarning[];
178
+ pairedAssistantIndices: number[];
171
179
  }>;
172
180
  diagnostics: ContextEditorDiagnostics;
173
181
  };
@@ -278,12 +286,26 @@ export interface WSContextPct {
278
286
  maxContext: number;
279
287
  };
280
288
  }
289
+ export interface WSTopicAdviceResult {
290
+ type: 'topic.advice_result';
291
+ payload: SessionScopedPayload & {
292
+ requestId: string;
293
+ suggestNewContext: boolean;
294
+ confidence: number;
295
+ reason: string;
296
+ nextTopic?: string | undefined;
297
+ source: 'explicit' | 'model' | 'cache' | 'local';
298
+ };
299
+ }
281
300
  export interface WSContextMaxContext {
282
301
  type: 'ctx.max_context';
283
302
  payload: SessionScopedPayload & {
284
303
  providerId: string;
285
304
  modelId: string;
286
305
  maxContext: number;
306
+ previousMaxContext?: number | undefined;
307
+ source?: 'configured' | 'provider' | 'provider_overflow' | undefined;
308
+ decreased?: boolean | undefined;
287
309
  };
288
310
  }
289
311
  export interface WSTokenThreshold {
@@ -3,12 +3,12 @@ import type { ChronicleFacet, ChronicleFacetValue, ChronicleGraphResult, Chronic
3
3
  import type { WSCollabAnnotationAdded, WSCollabAnnotationResolved, WSCollabEvent, WSCollabInjectionGranted, WSCollabParticipantJoined, WSCollabParticipantLeft, WSCollabPauseGranted, WSCollabPauseReleased, WSCollabState } from './collab.js';
4
4
  import type { ConnectionsHealthReport, ServiceActionResult } from './connections.js';
5
5
  import type { WSAgentStatusChanged, WSAgentTimelineMessage, WSEternalIteration, WSGoalAssessResult, WSGoalLifecycle, WSGoalList, WSGoalProgress, WSGoalState, WSKanbanResult, WSKanbanTaskActivity, WSModesList, WSWorktreeCleanupResult, WSWorktreeDiffResult, WSWorktreeEvent, WSWorktreeMergeResult, WSWorktreeOrphans, WSWorktreeState } from './goal-kanban-worktree.js';
6
- import type { SessionScopedPayload, WSCodeMapToolExecuted, WSCodeMapToolStarted, WSIterationCompleted, WSIterationLimitReached, WSIterationStarted, WSProviderActiveBlocked, WSProviderError, WSProviderFallback, WSProviderResponse, WSProviderRetry, WSProviderStatusChanged, WSProviderStatusSnapshot, WSProviderStreamError, WSRunResult, WSSessionEnd, WSSessionStart, WSTextDelta, WSThinkingDelta, WSToolExecuted, WSToolProgress, WSToolUseStart } from './protocol-core.js';
7
- import type { WSCompactionFailed, WSContextCompacted, WSContextDebug, WSContextEditorApplied, WSContextEditorSnapshot, WSContextEditorValidation, WSContextMaxContext, WSContextModeChanged, WSContextModesList, WSContextPct, WSContextRepaired, WSDelegateCompleted, WSDelegateStarted, WSError, WSMemoryList, WSSessionStats, WSTokenCostEstimateUnavailable, WSTokenThreshold, WSToolConfirmNeeded, WSToolLoopDetected, WSToolsList, WSTrustPersisted } from './runtime.js';
6
+ import type { SessionScopedPayload, WSCodeMapToolExecuted, WSCodeMapToolStarted, WSIterationCompleted, WSIterationLimitReached, WSIterationStarted, WSProviderActiveBlocked, WSProviderError, WSProviderFallback, WSProviderFallbackPending, WSProviderResponse, WSProviderRetry, WSProviderStatusChanged, WSProviderStatusSnapshot, WSProviderStreamError, WSRunResult, WSSessionEnd, WSSessionStart, WSTextDelta, WSThinkingDelta, WSToolExecuted, WSToolProgress, WSToolUseStart } from './protocol-core.js';
7
+ import type { WSCompactionFailed, WSContextCompacted, WSContextDebug, WSContextEditorApplied, WSContextEditorSnapshot, WSContextEditorValidation, WSContextMaxContext, WSContextModeChanged, WSContextModesList, WSContextPct, WSContextRepaired, WSDelegateCompleted, WSDelegateStarted, WSError, WSMemoryList, WSSessionStats, WSTokenCostEstimateUnavailable, WSTokenThreshold, WSToolConfirmNeeded, WSToolLoopDetected, WSToolsList, WSTopicAdviceResult, WSTrustPersisted } from './runtime.js';
8
8
  import type { WSMemorySageBackfillRecoverable, WSMemorySageCandidateResolve, WSMemorySageDelete, WSMemorySageForFile, WSMemorySageGet, WSMemorySageGraph, WSMemorySageList, WSMemorySageListPage, WSMemorySageRecover, WSMemorySageRemember, WSMemorySageUpdate } from './sage.js';
9
9
  import type { WSDesignList, WSDesignMaterialize, WSDesignSet, WSDesignState, WSDesignSwap, WSDesignTune, WSDesignUse, WSDesignVerify, WSSkillContent, WSSkillsCreated, WSSkillsEdited, WSSkillsExported, WSSkillsInstalled, WSSkillsList, WSSkillsUninstalled, WSSkillsUpdated } from './skills-design.js';
10
- import type { WSAuthOAuthStatus, WSCatalogModelSearchResult, WSCompletionResult, WSDiagGet, WSFilesList, WSKeyOperationResult, WSModelSwitchResult, WSProviderCatalog, WSProviderModels, WSProviderProbe, WSSavedProviders, WSSessionsList, WSSessionInspect, WSSideEffects, WSStatsGet, WSTodosCleared, WSTodosUpdated } from './system.js';
11
- export type WSServerMessage = WSSessionStart | WSSessionEnd | WSTextDelta | WSThinkingDelta | WSToolUseStart | WSToolProgress | WSToolExecuted | WSCodeMapToolStarted | WSCodeMapToolExecuted | WSIterationStarted | WSIterationCompleted | WSIterationLimitReached | WSProviderResponse | WSProviderRetry | WSProviderError | WSProviderFallback | WSProviderStatusChanged | WSProviderStatusSnapshot | WSProviderActiveBlocked | WSProviderStreamError | WSRunResult | WSSessionStats | WSError | WSToolConfirmNeeded | WSTrustPersisted | WSToolLoopDetected | WSDelegateStarted | WSDelegateCompleted | WSContextDebug | WSContextCompacted | WSCompactionFailed | WSContextRepaired | WSContextEditorSnapshot | WSContextEditorValidation | WSContextEditorApplied | WSContextPct | WSContextMaxContext | WSTokenThreshold | WSTokenCostEstimateUnavailable | WSContextModesList | WSContextModeChanged | WSToolsList | WSMemoryList | WSMemorySageList | WSMemorySageListPage | WSMemorySageGet | WSMemorySageGraph | WSMemorySageUpdate | WSMemorySageRemember | WSMemorySageDelete | WSMemorySageRecover | WSMemorySageCandidateResolve | WSMemorySageBackfillRecoverable | WSMemorySageForFile | WSSkillsList | WSSkillContent | WSDesignList | WSDesignUse | WSDesignState | WSDesignSet | WSDesignTune | WSDesignSwap | WSDesignMaterialize | WSDesignVerify | WSSkillsInstalled | WSSkillsUninstalled | WSSkillsUpdated | WSSkillsCreated | WSSkillsEdited | WSSkillsExported | WSDiagGet | WSStatsGet | {
10
+ import type { WSAuthOAuthStatus, WSCatalogModelSearchResult, WSCompletionResult, WSDiagGet, WSFilesList, WSKeyOperationResult, WSModelSwitchResult, WSProviderCatalog, WSProviderModels, WSProviderProbe, WSSavedProviders, WSSessionInspect, WSSessionsList, WSSideEffects, WSStatsGet, WSTodosCleared, WSTodosUpdated } from './system.js';
11
+ export type WSServerMessage = WSSessionStart | WSSessionEnd | WSTextDelta | WSThinkingDelta | WSToolUseStart | WSToolProgress | WSToolExecuted | WSCodeMapToolStarted | WSCodeMapToolExecuted | WSIterationStarted | WSIterationCompleted | WSIterationLimitReached | WSProviderResponse | WSProviderRetry | WSProviderError | WSProviderFallback | WSProviderFallbackPending | WSProviderStatusChanged | WSProviderStatusSnapshot | WSProviderActiveBlocked | WSProviderStreamError | WSRunResult | WSSessionStats | WSError | WSToolConfirmNeeded | WSTrustPersisted | WSToolLoopDetected | WSDelegateStarted | WSDelegateCompleted | WSContextDebug | WSContextCompacted | WSCompactionFailed | WSContextRepaired | WSContextEditorSnapshot | WSContextEditorValidation | WSContextEditorApplied | WSContextPct | WSTopicAdviceResult | WSContextMaxContext | WSTokenThreshold | WSTokenCostEstimateUnavailable | WSContextModesList | WSContextModeChanged | WSToolsList | WSMemoryList | WSMemorySageList | WSMemorySageListPage | WSMemorySageGet | WSMemorySageGraph | WSMemorySageUpdate | WSMemorySageRemember | WSMemorySageDelete | WSMemorySageRecover | WSMemorySageCandidateResolve | WSMemorySageBackfillRecoverable | WSMemorySageForFile | WSSkillsList | WSSkillContent | WSDesignList | WSDesignUse | WSDesignState | WSDesignSet | WSDesignTune | WSDesignSwap | WSDesignMaterialize | WSDesignVerify | WSSkillsInstalled | WSSkillsUninstalled | WSSkillsUpdated | WSSkillsCreated | WSSkillsEdited | WSSkillsExported | WSDiagGet | WSStatsGet | {
12
12
  type: 'connections.health_result';
13
13
  payload: ConnectionsHealthReport;
14
14
  } | {
@@ -246,6 +246,9 @@ export type WSServerMessage = WSSessionStart | WSSessionEnd | WSTextDelta | WSTh
246
246
  } | {
247
247
  type: 'mailbox.agent_registered';
248
248
  payload: Record<string, unknown>;
249
+ } | {
250
+ type: 'mailbox.agent_deregistered';
251
+ payload: Record<string, unknown>;
249
252
  } | {
250
253
  type: 'mailbox.messages';
251
254
  payload: {
@@ -520,6 +523,14 @@ export type WSServerMessage = WSSessionStart | WSSessionEnd | WSTextDelta | WSTh
520
523
  payload: SessionScopedPayload & {
521
524
  fleetConcurrency: number;
522
525
  fleetConcurrencyMax: number;
526
+ maxSpawns?: number;
527
+ usedSpawns?: number;
528
+ remainingSpawns?: number;
529
+ maxSpawnsSource?: string;
530
+ maxConcurrentSource?: string;
531
+ effectiveSource?: string;
532
+ checkpointMaxSpawns?: number;
533
+ ceilingMismatch?: boolean;
523
534
  };
524
535
  } | {
525
536
  type: 'budget.threshold_reached';