@wrongstack/tui 1.0.29 → 1.0.32

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.
@@ -1,1434 +1,9 @@
1
- import type { StatuslineDensities, StatuslineDensity, StatuslineLine, StatuslineLines, StatuslineOrder } from '@wrongstack/core/statusline';
2
- import type { AutonomyStage, ContextSnapshot, DesignKitEntry, FleetChatVerbosity, SkillEntry, TokenSavingTier } from '@wrongstack/core/types';
3
- import type { SddBoardSnapshot } from '@wrongstack/sdd';
4
- import type { State } from './app-state.js';
5
- import type { DraftEntry, GoalSummary, QueueItem, ResumeSessionEntry, SlashCommandMatch } from './app-state-core-types.js';
6
- import type { FleetEntry } from './app-state-fleet.js';
7
- import type { AuthCatalogRow, AuthConfirmAction, AuthFormFieldId, AuthFormState, AuthLocalPresetRow, AuthPanelView, AuthProviderRow } from './auth-panel-model.js';
8
- import type { BrainLogEntry, BrainRiskLevel } from './brain-contracts.js';
9
- import type { BrainPanelSettings } from './brain-panel-model.js';
10
- import type { StatuslineItem } from './components/statusline-picker.js';
11
- import type { HistoryEntry } from './history-entry.js';
12
- import type { AuditLevel, CacheTtl, CompactorStrategy, ContextMode, LogLevel, ReasoningEffort, SettingsMode, SettingsPickerPatch, StatuslineMode, ToolResultViewMode } from './settings-contracts.js';
13
- import type { AutonomyOption, ChipMeta, HelpEntry, LiveSessionEntry, McpPickerItem, ModeOption, PluginPickerItem, ProjectPickerItem, PromptPickEntry, ProviderOption, ResourceMenuAction, ResourceMenuSnapshot, ShadowState, SubagentLaneView, SubagentRoleView, ToolPickerItem, WorktreeRow } from './ui-contracts.js';
14
- export type Action = {
15
- type: 'addEntry';
16
- entry: DraftEntry;
17
- } | {
18
- type: 'archiveLoaded';
19
- entries: HistoryEntry[];
20
- } | {
21
- type: 'startArchiveLoad';
22
- } | {
23
- type: 'compactHistory';
24
- } | {
25
- type: 'setBuffer';
26
- buffer: string;
27
- cursor: number;
28
- } | {
29
- type: 'clearInput';
30
- }
31
- /**
32
- * Flip the composer into bash mode (`!` pressed on an empty draft): the
33
- * input becomes a shell-command line and Enter runs it via the `!` path.
34
- */
35
- | {
36
- type: 'bashModeEnter';
37
- }
38
- /** Leave bash mode and restore the normal chat composer. */
39
- | {
40
- type: 'bashModeExit';
41
- } | {
42
- type: 'clearHistory';
43
- model?: string | undefined;
44
- provider?: string | undefined;
45
- cwd?: string | undefined;
46
- sessionId?: string | undefined;
47
- /**
48
- * Tells the reducer the boot-time restored transcript source has been
49
- * discarded (e.g. by `/clear`). When explicitly `null` (not just
50
- * omitted), the reducer resets the resume-derived state slice to the
51
- * fresh values `createInitialState` would have produced with no
52
- * restored entries: `historyBudget = undefined`, `autoProceedHold = false`,
53
- * and `nextId` re-seeded from the surviving banner only. Pass
54
- * `undefined` to leave the resume slice intact (existing behavior for
55
- * `session.rewound` / `project.switched`).
56
- */
57
- restoredMessages?: readonly unknown[] | null | undefined;
58
- restoredToolCalls?: readonly unknown[] | null | undefined;
59
- restoredEvents?: readonly unknown[] | null | undefined;
60
- /**
61
- * Keep the checkpoint list. A rewind clears the screen but the
62
- * checkpoints up to its target still belong to this conversation.
63
- */
64
- keepCheckpoints?: boolean | undefined;
65
- } | {
66
- type: 'streamDelta';
67
- delta: string;
68
- } | {
69
- type: 'streamReset';
70
- } | {
71
- type: 'status';
72
- status: State['status'];
73
- } | {
74
- type: 'interrupt';
75
- } | {
76
- type: 'resetInterrupts';
77
- }
78
- /**
79
- * User pressed Esc mid-iteration — flag the next message for steering
80
- * AND stash a context snapshot so the preamble can tell the model
81
- * exactly what it was doing.
82
- */
83
- | {
84
- type: 'steerStart';
85
- snapshot: State['steerSnapshot'];
86
- }
87
- /** Submit handler consumed the steering flag; reset. */
88
- | {
89
- type: 'steerConsume';
90
- } | {
91
- type: 'hint';
92
- text: string;
93
- } | {
94
- type: 'copiedNotice';
95
- text: string;
96
- entryId: number | null;
97
- } | {
98
- type: 'inspectOverlayOpen';
99
- entryId: number;
100
- entryIds?: readonly number[] | undefined;
101
- } | {
102
- type: 'inspectOverlayClose';
103
- } | {
104
- type: 'inspectOverlayScroll';
105
- delta: number;
106
- }
107
- /** Open the transcript search bar, optionally with a prefilled query. */
108
- | {
109
- type: 'chatSearchOpen';
110
- query?: string | undefined;
111
- includeReasoning: boolean;
112
- } | {
113
- type: 'chatSearchSetQuery';
114
- query: string;
115
- includeReasoning: boolean;
116
- }
117
- /** Move the selection: -1 = older match, +1 = newer match (wraps). */
118
- | {
119
- type: 'chatSearchStep';
120
- delta: -1 | 1;
121
- includeReasoning: boolean;
122
- } | {
123
- type: 'chatSearchClose';
124
- }
125
- /** Alt+↑ / Alt+↓: jump to the previous / next user message. */
126
- | {
127
- type: 'messageJump';
128
- direction: -1 | 1;
129
- } | {
130
- type: 'messageJumpClear';
131
- } | {
132
- type: 'brainStatus';
133
- state: State['brain']['state'];
134
- source?: string | undefined;
135
- risk?: State['brain']['risk'] | undefined;
136
- summary?: string | undefined;
137
- } | {
138
- type: 'brainPromptSet';
139
- prompt: NonNullable<State['brainPrompt']>;
140
- } | {
141
- type: 'brainPromptClear';
142
- } | {
143
- type: 'pickerOpen';
144
- query: string;
145
- } | {
146
- type: 'pickerClose';
147
- } | {
148
- type: 'pickerSetMatches';
149
- query: string;
150
- matches: string[];
151
- } | {
152
- type: 'pickerMove';
153
- delta: number;
154
- } | {
155
- type: 'toolStarted';
156
- id: string;
157
- name: string;
158
- } | {
159
- type: 'toolEnded';
160
- id?: string | undefined;
161
- name?: string | undefined;
162
- } | {
163
- type: 'toolStreamAppend';
164
- toolUseId: string;
165
- name: string;
166
- text: string;
167
- startedAt: number;
168
- } | {
169
- type: 'toolStreamClear';
170
- toolUseId?: string | undefined;
171
- name?: string | undefined;
172
- } | {
173
- type: 'enqueue';
174
- item: Omit<QueueItem, 'id'>;
175
- } | {
176
- type: 'dequeueFirst';
177
- } | {
178
- type: 'queueClear';
179
- } | {
180
- type: 'queueDelete';
181
- positions: number[];
182
- } | {
183
- type: 'queueToggleRefine';
184
- position: number;
185
- } | {
186
- type: 'slashPickerOpen';
187
- query: string;
188
- matches: SlashCommandMatch[];
189
- } | {
190
- type: 'slashPickerClose';
191
- } | {
192
- type: 'slashPickerMove';
193
- delta: number;
194
- } | {
195
- type: 'modelPickerOpen';
196
- providers: ProviderOption[];
197
- purpose?: 'switch' | 'pick' | undefined;
198
- title?: string | undefined;
199
- } | {
200
- type: 'modelPickerClose';
201
- } | {
202
- type: 'modelPickerMove';
203
- delta: number;
204
- } | {
205
- type: 'modelPickerPickProvider';
206
- providerId: string;
207
- models: string[];
208
- } | {
209
- type: 'modelPickerBack';
210
- } | {
211
- type: 'modelPickerHint';
212
- text?: string | undefined;
213
- }
214
- /** Update the search filter in step 2. */
215
- | {
216
- type: 'modelPickerSearch';
217
- query: string;
218
- }
219
- /** ←/→ on the focused model row: cycle its reasoning-effort choice. */
220
- | {
221
- type: 'modelPickerEffort';
222
- delta: number;
223
- }
224
- /** Per-session subagent model lanes — opened by `/subagent-models`. */
225
- | {
226
- type: 'subagentModelsOpen';
227
- lanes: SubagentLaneView[];
228
- roles: SubagentRoleView[];
229
- enabled: boolean;
230
- lock: boolean;
231
- followSessionModel: boolean;
232
- sessionTarget: string;
233
- } | {
234
- type: 'subagentModelsClose';
235
- } | {
236
- type: 'subagentModelsMove';
237
- delta: number;
238
- } | {
239
- type: 'subagentModelsUpdate';
240
- lanes: SubagentLaneView[];
241
- roles: SubagentRoleView[];
242
- enabled: boolean;
243
- lock: boolean;
244
- followSessionModel: boolean;
245
- sessionTarget: string;
246
- } | {
247
- type: 'subagentModelsHint';
248
- text?: string | undefined;
249
- } | {
250
- type: 'autonomyPickerOpen';
251
- options: AutonomyOption[];
252
- } | {
253
- type: 'autonomyPickerClose';
254
- } | {
255
- type: 'autonomyPickerMove';
256
- delta: number;
257
- } | {
258
- type: 'autonomyPickerHint';
259
- text?: string | undefined;
260
- }
261
- /** Theme picker — opened by `/theme`. Selecting a row swaps the palette and
262
- * persists the choice via the ConfigStore bridge from the host. */
263
- | {
264
- type: 'themePickerOpen';
265
- selected?: number;
266
- } | {
267
- type: 'themePickerClose';
268
- } | {
269
- type: 'themePickerMove';
270
- delta: number;
271
- } | {
272
- type: 'themePickerHint';
273
- text?: string | undefined;
274
- } | {
275
- type: 'themePickerFilter';
276
- text: string;
277
- } | {
278
- type: 'themePickerFilterMode';
279
- on: boolean;
280
- } | {
281
- type: 'themePickerPreview';
282
- on: boolean;
283
- } | {
284
- type: 'themePickerUndo';
285
- } | {
286
- type: 'themePickerSwapPrevious';
287
- } | {
288
- type: 'skillPickerOpen';
289
- entries: SkillEntry[];
290
- mention?: import('@wrongstack/core/skill-mentions').SkillMention | undefined;
291
- } | {
292
- type: 'skillMentionResults';
293
- entries: SkillEntry[];
294
- hint?: string | undefined;
295
- mention: import('@wrongstack/core/skill-mentions').SkillMention;
296
- } | {
297
- type: 'skillPickerClose';
298
- } | {
299
- type: 'skillPickerMove';
300
- delta: number;
301
- } | {
302
- type: 'skillPickerHint';
303
- text?: string | undefined;
304
- } | {
305
- type: 'resourceMenuOpen';
306
- snapshot: ResourceMenuSnapshot;
307
- } | {
308
- type: 'resourceMenuClose';
309
- } | {
310
- type: 'resourceMenuMove';
311
- delta: number;
312
- } | {
313
- type: 'resourceMenuHint';
314
- text?: string | undefined;
315
- } | {
316
- type: 'resourceMenuFilter';
317
- filter: string;
318
- active: boolean;
319
- } | {
320
- type: 'resourceMenuConfirm';
321
- action?: ResourceMenuAction | undefined;
322
- } | {
323
- type: 'modePickerOpen';
324
- modes: ModeOption[];
325
- } | {
326
- type: 'modePickerClose';
327
- } | {
328
- type: 'modePickerMove';
329
- delta: number;
330
- } | {
331
- type: 'modePickerHint';
332
- text?: string | undefined;
333
- } | {
334
- type: 'designPickerOpen';
335
- kits: DesignKitEntry[];
336
- } | {
337
- type: 'designPickerClose';
338
- } | {
339
- type: 'designPickerMove';
340
- delta: number;
341
- } | {
342
- type: 'designPickerStack';
343
- stack: string;
344
- } | {
345
- type: 'promptPickerOpen';
346
- all: PromptPickEntry[];
347
- categories: string[];
348
- recentSlugs: string[];
349
- } | {
350
- type: 'promptPickerClose';
351
- } | {
352
- type: 'promptPickerMove';
353
- delta: number;
354
- } | {
355
- type: 'promptPickerCategory';
356
- delta: number;
357
- } | {
358
- type: 'resumePickerOpen';
359
- sessions: ResumeSessionEntry[];
360
- } | {
361
- type: 'resumePickerClose';
362
- } | {
363
- type: 'resumePickerMove';
364
- delta: number;
365
- } | {
366
- type: 'resumePickerBusy';
367
- on: boolean;
368
- } | {
369
- type: 'resumePickerHint';
370
- text?: string | undefined;
371
- } | {
372
- type: 'resumePickerError';
373
- text: string;
374
- }
375
- /**
376
- * Release the post-resume auto-proceed hold.
377
- *
378
- * Dispatched by the manual submit path only. The hold exists so a resumed
379
- * session's restored todo board cannot arm an automatic turn before the user
380
- * has done anything; sending a message IS that something.
381
- */
382
- | {
383
- type: 'autoProceedRelease';
384
- }
385
- /**
386
- * Begin a `/resume`: wipe the screen to a clean slate (banner only, exactly
387
- * like `/clear`) and put the live progress block in its place.
388
- *
389
- * The wipe is the point. Leaving the previous conversation on screen while a
390
- * different one loaded meant the user could not tell whether anything was
391
- * happening, or which session they were looking at once it did.
392
- */
393
- | {
394
- type: 'resumeLoadStart';
395
- sessionId: string;
396
- label: string;
397
- }
398
- /**
399
- * Advance the progress block. Every field is optional so the same action
400
- * serves the spinner ticker (nothing but a frame bump), the byte-progress
401
- * sink, and the host's stage reports.
402
- *
403
- * `sessionId` attributes the tick to its runResume chain: after a
404
- * cross-path start is rejected, the SUPERSEDED chain keeps ticking with the
405
- * other session's byte counts, and the reducer drops those instead of
406
- * mutating the winning load. Unstamped ticks keep legacy semantics.
407
- */
408
- | {
409
- type: 'resumeLoadTick';
410
- sessionId?: string | undefined;
411
- loadedBytes?: number | undefined;
412
- totalBytes?: number | undefined;
413
- /** Human-readable stage line to push onto the rolling log. */
414
- note?: string | undefined;
415
- }
416
- /**
417
- * Commit one batch of the replayed transcript.
418
- *
419
- * The first batch flips the phase and clears the progress block, so the
420
- * transcript streams into a screen that holds nothing else. `done` finishes
421
- * the resume and applies the context snapshot.
422
- */
423
- | {
424
- type: 'resumeStreamChunk';
425
- /**
426
- * Session the chunk belongs to. Stamped by the runResume chain so the
427
- * reducer can drop a SUPERSEDED run's terminating `done` chunk instead
428
- * of settling the winning load with another session's transcript.
429
- * Unstamped chunks keep legacy semantics.
430
- */
431
- sessionId?: string | undefined;
432
- entries: HistoryEntry[];
433
- /** Total entries in the replay, for the batch counter. */
434
- total: number;
435
- done?: boolean | undefined;
436
- /** Keep input gated until replay effects and suggestion restoration settle. */
437
- holdUntilSettled?: boolean | undefined;
438
- /** Actual attached session metadata; absent for read-only replay. */
439
- banner?: {
440
- sessionId: string;
441
- cwd?: string | undefined;
442
- model?: string | undefined;
443
- provider?: string | undefined;
444
- } | undefined;
445
- contextSnapshot?: ContextSnapshot | undefined;
446
- }
447
- /**
448
- * Abandon an in-flight resume (failure, or a second resume superseding it).
449
- * `sessionId` attributes the abort to its runResume chain: a SUPERSEDED
450
- * chain's abort must not cancel the winning load. Unstamped aborts keep
451
- * legacy semantics.
452
- */
453
- | {
454
- type: 'resumeLoadAbort';
455
- sessionId?: string | undefined;
456
- }
457
- /** Replace all history entries with the given hydrated entries from a resumed session. */
458
- | {
459
- type: 'replaceHistory';
460
- entries: HistoryEntry[];
461
- nextId: number;
462
- /**
463
- * Optional context-window snapshot forwarded from the host's
464
- * `onResumeSession` return. When present, the reducer writes
465
- * `tokens` to `state.leader.ctxTokens` and bumps
466
- * `state.contextChipVersion` so the statusline chip and `/context`
467
- * panel reflect the rebuilt context immediately, instead of staying
468
- * at zero until the next ctx.pct event.
469
- */
470
- contextSnapshot?: ContextSnapshot | undefined;
471
- } | {
472
- type: 'settingsOpen';
473
- mode: SettingsMode;
474
- delayMs: number;
475
- titleAnimation: boolean;
476
- yolo: boolean;
477
- fleetChat: FleetChatVerbosity;
478
- chime: boolean;
479
- confirmExit: boolean;
480
- nextPrediction: boolean;
481
- featureMcp: boolean;
482
- featurePlugins: boolean;
483
- featureMemory: boolean;
484
- featureSkills: boolean;
485
- featureModelsRegistry: boolean;
486
- featureToolCoach: boolean;
487
- tokenSavingTier: TokenSavingTier;
488
- allowOutsideProjectRoot: boolean;
489
- contextAutoCompact: boolean;
490
- contextStrategy: CompactorStrategy;
491
- contextMode: ContextMode;
492
- maxConcurrent: number;
493
- logLevel: LogLevel;
494
- auditLevel: AuditLevel;
495
- indexOnStart: boolean;
496
- multiDiffSummaryThreshold: number;
497
- /**
498
- * Animation style for the working/thinking chip in the status bar.
499
- * One of the renderable styles plus the meta-mode `'cycle'`. Persisted
500
- * to disk on every ←/→ change in `/settings`.
501
- */
502
- animationStyle: 'rainbow' | 'wave' | 'pulse' | 'dots' | 'breathe' | 'static' | 'cycle';
503
- /**
504
- * Persisted row index for where to land when the picker reopens.
505
- * See `Settings.lastSettingsField`.
506
- */
507
- lastSettingsField: number;
508
- maxIterations: number;
509
- autoProceedMaxIterations: number;
510
- enhanceDelayMs: number;
511
- enhanceEnabled: boolean;
512
- enhanceLanguage: 'original' | 'english';
513
- debugStream: boolean;
514
- statuslineMode: StatuslineMode;
515
- reasoningMode: 'auto' | 'on' | 'off';
516
- reasoningEffort: ReasoningEffort;
517
- /** Documented effort levels of the active model (absent = undocumented). */
518
- reasoningEffortLevels?: string[] | undefined;
519
- reasoningPreserve: boolean;
520
- thinkingWord: string;
521
- cacheTtl: CacheTtl;
522
- configScope: 'global' | 'project';
523
- breakerEnabled: boolean;
524
- breakerAutoKillResetMs: number;
525
- showModelReasoning: boolean;
526
- toolResultViewMode: ToolResultViewMode;
527
- showAgentSwarmPanel: import('./app-settings-type.js').AgentSwarmPanelMode;
528
- showSidebar?: boolean | undefined;
529
- panelPositions: import('./ui-contracts.js').PanelPositionMap;
530
- readSymbols: boolean;
531
- showSageMemoryInject: boolean;
532
- sageMemoryInjectThreshold: number;
533
- nextStepsTool: boolean;
534
- /**
535
- * WrongProxy / WrongTrace: master switch + configurable URL
536
- * (default http://localhost:3444). Mirrors `Settings.wrongProxy*`
537
- * and `SettingsPickerPatch.wrongProxy*`. Both fields land in
538
- * the Integrations section of the picker; the runtime probe
539
- * reads the values via the TUI settings adapter (see
540
- * `packages/cli/boot/tui-settings-adapter.ts`).
541
- */
542
- wrongProxyEnabled: boolean;
543
- wrongProxyUrl: string;
544
- } | {
545
- type: 'settingsClose';
546
- } | {
547
- type: 'settingsFieldMove';
548
- delta: number;
549
- } | {
550
- type: 'settingsFieldSet';
551
- field: number;
552
- } | {
553
- type: 'settingsValueChange';
554
- delta: number;
555
- }
556
- /**
557
- * Set a settings value directly from a typed patch (used by the
558
- * `/settings <chord> <value>` slash command). The patch is produced
559
- * by `resolveSettingsFieldValue` in settings-picker.tsx and validated
560
- * before dispatch, so the reducer just spreads it.
561
- */
562
- | {
563
- type: 'settingsValueSet';
564
- patch: SettingsPickerPatch;
565
- } | {
566
- type: 'toolResultViewSet';
567
- entryIds: readonly number[];
568
- mode: ToolResultViewMode;
569
- }
570
- /**
571
- * Update the live row-search filter. Empty string clears the filter.
572
- * Setting any non-empty value while the filter is empty also implicitly
573
- * activates filter mode (the picker renders only matching rows).
574
- */
575
- | {
576
- type: 'settingsFilterSet';
577
- filter: string;
578
- } | {
579
- type: 'settingsHint';
580
- text?: string | undefined;
581
- }
582
- /** Begin free-text editing of the thinking word (Enter on its row). */
583
- | {
584
- type: 'settingsThinkingEditStart';
585
- }
586
- /** Replace the in-progress thinking-word draft with the given buffer. */
587
- | {
588
- type: 'settingsThinkingEditChange';
589
- draft: string;
590
- }
591
- /** Commit the draft as the new thinking word (validated in the reducer). */
592
- | {
593
- type: 'settingsThinkingEditCommit';
594
- }
595
- /** Discard the draft and leave edit mode without changing the word. */
596
- | {
597
- type: 'settingsThinkingEditCancel';
598
- }
599
- /** Begin free-text editing of the WrongProxy URL (Enter on its row). */
600
- | {
601
- type: 'settingsWrongProxyUrlEditStart';
602
- }
603
- /** Replace the in-progress WrongProxy URL draft with the given buffer. */
604
- | {
605
- type: 'settingsWrongProxyUrlEditChange';
606
- draft: string;
607
- }
608
- /** Commit the draft as the new WrongProxy URL (validated in the reducer). */
609
- | {
610
- type: 'settingsWrongProxyUrlEditCommit';
611
- }
612
- /** Discard the draft and leave edit mode without changing the URL. */
613
- | {
614
- type: 'settingsWrongProxyUrlEditCancel';
615
- } | {
616
- type: 'statuslineOpen';
617
- hiddenItems: StatuslineItem[];
618
- lines?: StatuslineLines | undefined;
619
- densities?: StatuslineDensities | undefined;
620
- order?: StatuslineOrder | undefined;
621
- } | {
622
- type: 'statuslineClose';
623
- } | {
624
- type: 'statuslineFieldMove';
625
- delta: number;
626
- } | {
627
- type: 'statuslineFieldSet';
628
- field: number;
629
- } | {
630
- type: 'statuslineToggle';
631
- item: StatuslineItem;
632
- }
633
- /** Move a chip to another rail (1-4). */
634
- | {
635
- type: 'statuslineSetLine';
636
- item: StatuslineItem;
637
- line: StatuslineLine;
638
- }
639
- /** Shift a chip one rail up/down, wrapping within 1-4. */
640
- | {
641
- type: 'statuslineMoveLine';
642
- item: StatuslineItem;
643
- delta: number;
644
- }
645
- /** Move a chip earlier/later within its effective rail. */
646
- | {
647
- type: 'statuslineMoveOrder';
648
- item: StatuslineItem;
649
- delta: number;
650
- }
651
- /** Cycle or set a chip's density pin (auto → full → short → micro). */
652
- | {
653
- type: 'statuslineSetDensity';
654
- item: StatuslineItem;
655
- density?: StatuslineDensity | undefined;
656
- }
657
- /** Turn every chip on the given rail on or off in one keystroke. */
658
- | {
659
- type: 'statuslineToggleLine';
660
- line: StatuslineLine;
661
- }
662
- /** Restore default lines, order and densities (chip visibility untouched). */
663
- | {
664
- type: 'statuslineResetLayout';
665
- }
666
- /** Enter/leave `/` filter capture, or replace the filter text. */
667
- | {
668
- type: 'statuslineFilter';
669
- text?: string | undefined;
670
- filtering?: boolean | undefined;
671
- } | {
672
- type: 'statuslineHint';
673
- text?: string | undefined;
674
- }
675
- /**
676
- * A chip became visible due to data arriving (e.g., brain decision made,
677
- * mailbox messages arrived). Adds it to visibleChips with optional expiration.
678
- * If the chip is already in visibleChips, resets its shownAt timestamp.
679
- */
680
- | {
681
- type: 'statuslineChipShow';
682
- key: StatuslineItem;
683
- expiresIn?: number;
684
- }
685
- /**
686
- * Immediately remove a chip from visibleChips. Used when a stream ends
687
- * (brain, mailbox, enhance, debug_stream) so it disappears right away
688
- * even if it hasn't expired yet.
689
- */
690
- | {
691
- type: 'statuslineChipExpire';
692
- key: StatuslineItem;
693
- }
694
- /**
695
- * Sync visibleChips from the parent (e.g., after /statusline reset).
696
- * Replaces the entire visibleChips array.
697
- */
698
- | {
699
- type: 'statuslineVisibleChipsSync';
700
- visibleChips: ChipMeta[];
701
- } | {
702
- type: 'pluginPickerOpen';
703
- items?: PluginPickerItem[] | undefined;
704
- } | {
705
- type: 'pluginPickerClose';
706
- } | {
707
- type: 'pluginPickerMove';
708
- delta: number;
709
- } | {
710
- type: 'pluginPickerSetItems';
711
- items: PluginPickerItem[];
712
- } | {
713
- type: 'pluginPickerBusy';
714
- busy: boolean;
715
- } | {
716
- type: 'pluginPickerHint';
717
- text?: string | undefined;
718
- } | {
719
- type: 'mcpPickerOpen';
720
- items?: McpPickerItem[] | undefined;
721
- } | {
722
- type: 'mcpPickerClose';
723
- } | {
724
- type: 'mcpPickerMove';
725
- delta: number;
726
- } | {
727
- type: 'mcpPickerSetItems';
728
- items: McpPickerItem[];
729
- } | {
730
- type: 'mcpPickerBusy';
731
- busy: boolean;
732
- } | {
733
- type: 'mcpPickerHint';
734
- text?: string | undefined;
735
- } | {
736
- type: 'toolsPickerOpen';
737
- items?: ToolPickerItem[] | undefined;
738
- } | {
739
- type: 'toolsPickerClose';
740
- } | {
741
- type: 'toolsPickerMove';
742
- delta: number;
743
- } | {
744
- type: 'toolsPickerSetItems';
745
- items: ToolPickerItem[];
746
- } | {
747
- type: 'toolsPickerToggle';
748
- } | {
749
- type: 'toolsPickerBusy';
750
- busy: boolean;
751
- } | {
752
- type: 'toolsPickerHint';
753
- text?: string | undefined;
754
- } | {
755
- type: 'toolsPickerFilter';
756
- filter: string;
757
- } | {
758
- type: 'brainOpen';
759
- riskLevel: BrainRiskLevel;
760
- log: BrainLogEntry[];
761
- settings?: BrainPanelSettings | undefined;
762
- } | {
763
- type: 'brainClose';
764
- } | {
765
- type: 'brainMove';
766
- delta: number;
767
- } | {
768
- type: 'brainRiskChange';
769
- delta: number;
770
- } | {
771
- type: 'brainSetLog';
772
- log: BrainLogEntry[];
773
- } | {
774
- type: 'brainHint';
775
- text?: string | undefined;
776
- } | {
777
- type: 'brainSettingsLoaded';
778
- settings: BrainPanelSettings;
779
- } | {
780
- type: 'brainView';
781
- view: 'settings' | 'log';
782
- } | {
783
- type: 'brainRowMove';
784
- delta: number;
785
- } | {
786
- type: 'brainBusy';
787
- busy: boolean;
788
- } | {
789
- type: 'helpOpen';
790
- entries: HelpEntry[];
791
- } | {
792
- type: 'helpClose';
793
- } | {
794
- type: 'helpMove';
795
- delta: number;
796
- } | {
797
- type: 'helpFilter';
798
- filter: string;
799
- } | {
800
- type: 'helpHint';
801
- text?: string | undefined;
802
- } | {
803
- type: 'helpScrollDetail';
804
- delta: number;
805
- } | {
806
- type: 'shadowOpen';
807
- shadow: ShadowState;
808
- } | {
809
- type: 'shadowClose';
810
- } | {
811
- type: 'shadowUpdate';
812
- shadow: ShadowState;
813
- } | {
814
- type: 'shadowHint';
815
- text?: string | undefined;
816
- } | {
817
- type: 'authOpen';
818
- view?: Extract<AuthPanelView, 'list' | 'oauth'> | undefined;
819
- providers?: AuthProviderRow[] | undefined;
820
- presets?: AuthLocalPresetRow[] | undefined;
821
- oauthStrategies?: import('./auth-panel-model.js').AuthOAuthStrategyRow[] | undefined;
822
- } | {
823
- type: 'authClose';
824
- } | {
825
- type: 'authProviders';
826
- providers: AuthProviderRow[];
827
- } | {
828
- type: 'authCatalog';
829
- catalog: AuthCatalogRow[];
830
- } | {
831
- type: 'authView';
832
- view: AuthPanelView;
833
- providerId?: string | undefined;
834
- } | {
835
- type: 'authMove';
836
- delta: number;
837
- } | {
838
- type: 'authBusy';
839
- busy: boolean;
840
- } | {
841
- type: 'authHint';
842
- text?: string | undefined;
843
- } | {
844
- type: 'authFilter';
845
- filter: string;
846
- } | {
847
- type: 'authFlowStart';
848
- title: string;
849
- } | {
850
- type: 'authFlowLog';
851
- line: string;
852
- } | {
853
- type: 'authFlowDone';
854
- ok: boolean;
855
- message?: string | undefined;
856
- } | {
857
- type: 'authPromptStart';
858
- label: string;
859
- masked: boolean;
860
- } | {
861
- type: 'authPromptChange';
862
- draft: string;
863
- } | {
864
- type: 'authPromptEnd';
865
- } | {
866
- type: 'authConfirmStart';
867
- question: string;
868
- action: AuthConfirmAction;
869
- } | {
870
- type: 'authConfirmEnd';
871
- } | {
872
- type: 'authFormStart';
873
- form: AuthFormState;
874
- } | {
875
- type: 'authFormChange';
876
- field: AuthFormFieldId;
877
- value: string;
878
- } | {
879
- type: 'authFormCancel';
880
- } | {
881
- type: 'projectPickerOpen';
882
- items: ProjectPickerItem[];
883
- } | {
884
- type: 'projectPickerClose';
885
- } | {
886
- type: 'projectPickerMove';
887
- delta: number;
888
- } | {
889
- type: 'projectPickerFilter';
890
- filter: string;
891
- } | {
892
- type: 'projectPickerHint';
893
- text?: string | undefined;
894
- } | {
895
- type: 'fKeyPickerOpen';
896
- } | {
897
- type: 'fKeyPickerClose';
898
- } | {
899
- type: 'fKeyPickerMove';
900
- delta: number;
901
- } | {
902
- type: 'historyPush';
903
- text: string;
904
- } | {
905
- type: 'historyUp';
906
- } | {
907
- type: 'historyDown';
908
- } | {
909
- type: 'setInputHistory';
910
- entries: string[];
911
- } | {
912
- type: 'clearInputHistory';
913
- } | {
914
- type: 'confirmOpen';
915
- info: State['confirmQueue'][0];
916
- } | {
917
- type: 'confirmClose';
918
- } | {
919
- type: 'confirmResolved';
920
- toolUseId: string;
921
- } | {
922
- type: 'confirmClearAll';
923
- } | {
924
- type: 'shellCommandWarningOpen';
925
- info: NonNullable<State['shellCommandWarning']>;
926
- } | {
927
- type: 'shellCommandWarningClose';
928
- } | {
929
- type: 'enhanceOpen';
930
- info: NonNullable<State['enhance']>;
931
- } | {
932
- type: 'enhanceClose';
933
- } | {
934
- type: 'enhanceSet';
935
- enabled: boolean;
936
- } | {
937
- type: 'enhanceBusy';
938
- on: boolean;
939
- } | {
940
- type: 'topicCheckBusy';
941
- on: boolean;
942
- } | {
943
- type: 'refineCountdownOpen';
944
- info: NonNullable<State['refineCountdown']>;
945
- }
946
- /**
947
- * `info` scopes the close to the countdown the caller opened. A refine flow
948
- * that was superseded by a newer countdown must not tear the newer one down
949
- * when it finally unwinds; omitting `info` closes unconditionally.
950
- */
951
- | {
952
- type: 'refineCountdownClose';
953
- info?: NonNullable<State['refineCountdown']>;
954
- } | {
955
- type: 'refineFailureOpen';
956
- info: NonNullable<State['refineFailure']>;
957
- } | {
958
- type: 'refineFailureClose';
959
- } | {
960
- type: 'continueConfirmOpen';
961
- info: NonNullable<State['continueConfirm']>;
962
- } | {
963
- type: 'continueConfirmClose';
964
- } | {
965
- type: 'bugHuntContinueOpen';
966
- info: NonNullable<State['bugHuntContinue']>;
967
- } | {
968
- type: 'bugHuntContinueClose';
969
- } | {
970
- type: 'bugHuntRunningOpen';
971
- info: NonNullable<State['bugHuntRunning']>;
972
- } | {
973
- type: 'bugHuntRunningClose';
974
- } | {
975
- type: 'clearConfirmOpen';
976
- info: NonNullable<State['clearConfirm']>;
977
- } | {
978
- type: 'clearConfirmSetValue';
979
- value: string;
980
- } | {
981
- type: 'clearConfirmClose';
982
- } | {
983
- type: 'exitConfirmOpen';
984
- info: NonNullable<State['exitConfirm']>;
985
- } | {
986
- type: 'exitConfirmClose';
987
- } | {
988
- type: 'slashConfirmOpen';
989
- info: NonNullable<State['slashConfirm']>;
990
- } | {
991
- type: 'slashConfirmClose';
992
- }
993
- /**
994
- * Open the ESC-interrupt confirmation dialog with a context snapshot.
995
- * Fired when Esc is pressed mid-iteration and `confirmExit` is enabled.
996
- * The snapshot is replayed into `steerStart` on confirmation so the
997
- * STEERING preamble can describe the interrupted state to the LLM.
998
- */
999
- | {
1000
- type: 'escConfirmOpen';
1001
- snapshot: NonNullable<State['steerSnapshot']>;
1002
- }
1003
- /** Dismiss the ESC-interrupt confirmation (user cancelled). */
1004
- | {
1005
- type: 'escConfirmClose';
1006
- }
1007
- /** Open the fallback model overlay (provider.fallback_pending received). */
1008
- | {
1009
- type: 'fallbackOverlayOpen';
1010
- info: NonNullable<State['fallbackOverlay']>;
1011
- }
1012
- /** Move the fallback overlay selection (wraps). */
1013
- | {
1014
- type: 'fallbackOverlayMove';
1015
- delta: number;
1016
- }
1017
- /** Close the fallback overlay (choice made or auto-switched). */
1018
- | {
1019
- type: 'fallbackOverlayClose';
1020
- }
1021
- /** Open the mid-run send-mode picker with the resolved message + resolver. */
1022
- | {
1023
- type: 'sendModePickerOpen';
1024
- info: NonNullable<State['sendModePicker']>;
1025
- }
1026
- /** Move the send-mode highlight (wraps). */
1027
- | {
1028
- type: 'sendModePickerMove';
1029
- delta: number;
1030
- }
1031
- /** Close the send-mode picker. */
1032
- | {
1033
- type: 'sendModePickerClose';
1034
- } | {
1035
- type: 'resetContextChip';
1036
- } | {
1037
- type: 'fleetSeed';
1038
- entries: FleetEntry[];
1039
- cost: number;
1040
- } | {
1041
- type: 'fleetSpawn';
1042
- id: string;
1043
- name?: string | undefined;
1044
- provider?: string | undefined;
1045
- model?: string | undefined;
1046
- transcriptPath?: string | undefined;
1047
- } | {
1048
- type: 'fleetStart';
1049
- id: string;
1050
- taskId?: string | undefined;
1051
- } | {
1052
- type: 'fleetDelta';
1053
- id: string;
1054
- text: string;
1055
- } | {
1056
- type: 'fleetMessage';
1057
- id: string;
1058
- text: string;
1059
- } | {
1060
- type: 'fleetTool';
1061
- id: string;
1062
- name?: string | undefined;
1063
- ok?: boolean | undefined;
1064
- durationMs?: number | undefined;
1065
- outputBytes?: number | undefined;
1066
- outputLines?: number | undefined;
1067
- }
1068
- /** tool.started: pin the current tool name for status display. */
1069
- | {
1070
- type: 'fleetToolStart';
1071
- id: string;
1072
- name: string;
1073
- }
1074
- /** tool.executed: clear the current tool (paired with fleetTool). */
1075
- | {
1076
- type: 'fleetToolEnd';
1077
- id: string;
1078
- } | {
1079
- type: 'fleetUsage';
1080
- id: string;
1081
- input: number;
1082
- output: number;
1083
- cacheRead: number;
1084
- cacheWrite: number;
1085
- } | {
1086
- type: 'fleetDone';
1087
- id: string;
1088
- status: FleetEntry['status'];
1089
- iterations: number;
1090
- toolCalls: number;
1091
- /** Human-readable failure reason, e.g. "provider_auth", "rate_limit", "timeout". */
1092
- failureReason?: string | undefined;
1093
- } | {
1094
- type: 'fleetRemove';
1095
- id: string;
1096
- } | {
1097
- type: 'fleetBudgetWarning';
1098
- id: string;
1099
- kind: string;
1100
- used: number;
1101
- limit: number;
1102
- } | {
1103
- type: 'fleetBudgetExtended';
1104
- id: string;
1105
- totalExtensions: number;
1106
- } | {
1107
- type: 'fleetCtxPct';
1108
- id: string;
1109
- load: number;
1110
- tokens: number;
1111
- maxContext: number;
1112
- /** Estimated USD cost of the context tokens (optional — computed when pricing known). */
1113
- ctxCost?: number | undefined;
1114
- } | {
1115
- type: 'fleetCost';
1116
- cost: number;
1117
- input?: number | undefined;
1118
- output?: number | undefined;
1119
- /** Per-subagent usage keyed by subagent id (from the director snapshot). */
1120
- perAgent?: Record<string, {
1121
- cost: number;
1122
- }>;
1123
- }
1124
- /** Runtime concurrency ceiling change from CLI /fleet concurrency <n>. */
1125
- | {
1126
- type: 'fleetConcurrency';
1127
- n: number;
1128
- } | {
1129
- type: 'leaderIterStart';
1130
- } | {
1131
- type: 'leaderIterEnd';
1132
- } | {
1133
- type: 'leaderToolStart';
1134
- name: string;
1135
- } | {
1136
- type: 'leaderToolEnd';
1137
- name: string;
1138
- ok?: boolean | undefined;
1139
- durationMs?: number | undefined;
1140
- } | {
1141
- type: 'leaderCtxPct';
1142
- load: number;
1143
- tokens: number;
1144
- maxContext: number;
1145
- } | {
1146
- type: 'setFleetChat';
1147
- mode: FleetChatVerbosity;
1148
- } | {
1149
- type: 'toggleMonitor';
1150
- } | {
1151
- type: 'toggleAgentsMonitor';
1152
- } | {
1153
- type: 'toggleHelp';
1154
- } | {
1155
- type: 'toggleTodosMonitor';
1156
- } | {
1157
- type: 'toggleQueuePanel';
1158
- } | {
1159
- type: 'checkpointReceived';
1160
- cp: State['checkpoints'][0];
1161
- }
1162
- /** `selected` preselects a row (a message picked with Alt+↑); default the newest. */
1163
- | {
1164
- type: 'rewindOverlayOpen';
1165
- selected?: number | undefined;
1166
- } | {
1167
- type: 'rewindOverlayClose';
1168
- }
1169
- /** Fork the session at a checkpoint and switch to the fork. */
1170
- | {
1171
- type: 'checkpointFork';
1172
- promptIndex: number;
1173
- } | {
1174
- type: 'forkRequestDone';
1175
- } | {
1176
- type: 'rewindOverlayMove';
1177
- delta: number;
1178
- } | {
1179
- type: 'sessionRewound';
1180
- toPromptIndex: number;
1181
- } | {
1182
- type: 'eternalStage';
1183
- stage: AutonomyStage;
1184
- } | {
1185
- type: 'goalSummary';
1186
- summary: GoalSummary;
1187
- } | {
1188
- type: 'goalRunInit';
1189
- title: string;
1190
- } | {
1191
- type: 'goalRunPhaseUpdate';
1192
- phaseId: string;
1193
- name: string;
1194
- status: string;
1195
- completedTasks: number;
1196
- totalTasks: number;
1197
- startedAt?: number | undefined;
1198
- } | {
1199
- type: 'goalRunRunningPhases';
1200
- phaseIds: string[];
1201
- } | {
1202
- type: 'goalRunElapsed';
1203
- ms: number;
1204
- } | {
1205
- type: 'goalRunTaskActive';
1206
- phaseId: string;
1207
- taskId: string;
1208
- title: string;
1209
- agent?: string | undefined;
1210
- /** True when the task starts, false when it completes/fails. */
1211
- active: boolean;
1212
- } | {
1213
- /** A task finished successfully; the reducer owns the count arithmetic. */
1214
- type: 'goalRunTaskCompleted';
1215
- phaseId: string;
1216
- taskId: string;
1217
- } | {
1218
- /** Attach the assigned agent to an already-active task (reducer-owned). */
1219
- type: 'goalRunTaskAgent';
1220
- phaseId: string;
1221
- taskId: string;
1222
- agent?: string | undefined;
1223
- } | {
1224
- type: 'goalRunMonitorToggle';
1225
- } | {
1226
- type: 'goalRunReset';
1227
- } | {
1228
- type: 'sddBoardSnapshot';
1229
- snapshot: SddBoardSnapshot;
1230
- } | {
1231
- type: 'toggleSddBoardMonitor';
1232
- } | {
1233
- type: 'sddBoardFocusNext';
1234
- } | {
1235
- type: 'sddBoardFocusPrev';
1236
- } | {
1237
- type: 'worktreeUpsert';
1238
- handleId: string;
1239
- row: Partial<WorktreeRow & {
1240
- baseBranch?: string | undefined;
1241
- }>;
1242
- baseBranch?: string | undefined;
1243
- } | {
1244
- type: 'worktreeRemove';
1245
- handleId: string;
1246
- } | {
1247
- type: 'toggleWorktreeMonitor';
1248
- }
1249
- /** ScrollableHistory reports whether the viewport is scrolled up. */
1250
- | {
1251
- type: 'setHistoryScrolled';
1252
- scrolled: boolean;
1253
- }
1254
- /** Report the computed viewport height. */
1255
- | {
1256
- type: 'setViewportRows';
1257
- rows: number;
1258
- }
1259
- /**
1260
- * Fold a batch of fleet/display actions through the reducer in ONE pass so
1261
- * a 150ms burst of subagent events produces a single React render instead
1262
- * of one per event. Order-preserving; only high-frequency display events
1263
- * are batched (correctness-sensitive events stay immediate).
1264
- */
1265
- | {
1
+ import type { AppActionRuntime } from './app-action-runtime.js';
2
+ import type { AppActionServices } from './app-action-services.js';
3
+ import type { AppActionSettings } from './app-action-settings.js';
4
+ import type { AppActionWorkflows } from './app-action-workflows.js';
5
+ export type Action = AppActionRuntime | AppActionSettings | AppActionServices | AppActionWorkflows | {
1266
6
  type: 'fleetBatch';
1267
7
  actions: Action[];
1268
- }
1269
- /** BugHunter emitted a bug.found event on the FleetBus. */
1270
- | {
1271
- type: 'collabBugFound';
1272
- sessionId: string;
1273
- bugId: string;
1274
- severity: string;
1275
- description: string;
1276
- }
1277
- /** RefactorPlanner emitted a refactor.plan event on the FleetBus. */
1278
- | {
1279
- type: 'collabPlanEmitted';
1280
- sessionId: string;
1281
- planId: string;
1282
- riskScore: string;
1283
- phaseCount: number;
1284
- }
1285
- /** Critic emitted a critic.evaluation event on the FleetBus. */
1286
- | {
1287
- type: 'collabEvalComplete';
1288
- sessionId: string;
1289
- evalId: string;
1290
- verdict: string;
1291
- score: number;
1292
- }
1293
- /** Collab session completed — overall verdict is available. */
1294
- | {
1295
- type: 'collabSessionDone';
1296
- sessionId: string;
1297
- verdict: 'approve' | 'needs_revision' | 'reject';
1298
- }
1299
- /** A collab subagent (bug-hunter / refactor-planner / critic) was spawned. */
1300
- | {
1301
- type: 'collabSubagentSpawned';
1302
- subagentId: string;
1303
- role: string;
1304
- }
1305
- /** Toggle the process list overlay (F8). */
1306
- | {
1307
- type: 'toggleProcessList';
1308
- }
1309
- /** Toggle the cron jobs monitor. */
1310
- | {
1311
- type: 'toggleCronMonitor';
1312
- }
1313
- /** Toggle the audit (side effects) panel. */
1314
- | {
1315
- type: 'toggleAuditPanel';
1316
- }
1317
- /** Toggle the plan panel (F5). */
1318
- | {
1319
- type: 'togglePlanPanel';
1320
- }
1321
- /** Close every open panel/monitor/overlay at once. */
1322
- | {
1323
- type: 'closeAllPanels';
1324
- }
1325
- /** Toggle keyboard focus between input and the right sidebar. */
1326
- | {
1327
- type: 'toggleSidebarFocus';
1328
- }
1329
- /** Scroll the sidebar content by delta rows (clamped to >=0). */
1330
- | {
1331
- type: 'sidebarScroll';
1332
- delta: number;
1333
- viewportHeight?: number | undefined;
1334
- /**
1335
- * Rows occupied by routed twin panels (Todos / Plan / Kanban / …)
1336
- * mounted above `SidebarContent` inside `RightSidebar`. Subtracted
1337
- * from `viewportHeight` so the scroll clamp matches the actual
1338
- * viewport the user can scroll through. Defaults to 0 (no twins
1339
- * mounted) when omitted so existing call sites stay correct.
1340
- */
1341
- sidebarTwinRowCount?: number | undefined;
1342
- /**
1343
- * Whether the swarm panel is on the sidebar using the effective
1344
- * source (picker draft when the picker is open, persisted
1345
- * `liveSettings` otherwise — see `app-view.tsx`). Drives the
1346
- * mission-queue reservation in `computeMaxSidebarScroll`; without
1347
- * this field the reducer only sees the picker draft and under-
1348
- * reserves the mission card when a config-only 'sidebar' swarm
1349
- * mode is persisted but the picker has never been opened.
1350
- */
1351
- effectiveSwarmOnSidebar?: boolean | undefined;
1352
- }
1353
- /** Reset sidebar scroll offset to 0. */
1354
- | {
1355
- type: 'sidebarScrollReset';
1356
- }
1357
- /** Jump the sidebar scroll to an absolute offset (scrollbar press/drag). */
1358
- | {
1359
- type: 'sidebarScrollSet';
1360
- /** Absolute offset in rows from the content top; clamped to [0, max]. */
1361
- offset: number;
1362
- viewportHeight?: number | undefined;
1363
- /** See the `sidebarScroll` twin field — identical clamp semantics. */
1364
- sidebarTwinRowCount?: number | undefined;
1365
- /** See the `sidebarScroll` twin field — identical clamp semantics. */
1366
- effectiveSwarmOnSidebar?: boolean | undefined;
1367
- } | {
1368
- type: 'toggleKanbanPanel';
1369
- } | {
1370
- type: 'toggleGoalPanel';
1371
- } | {
1372
- type: 'toggleGoalKanbanPanel';
1373
- } | {
1374
- type: 'toggleContextPanel';
1375
- } | {
1376
- type: 'toggleConnectionsPanel';
1377
- } | {
1378
- type: 'toggleSessionsPanel';
1379
- } | {
1380
- type: 'sessionsPanelSet';
1381
- sessions: LiveSessionEntry[];
1382
- } | {
1383
- type: 'sessionsPanelMove';
1384
- delta: number;
1385
- } | {
1386
- type: 'sessionsPanelBusy';
1387
- on: boolean;
1388
- } | {
1389
- type: 'sessionResumeConfirmSet';
1390
- sessionId: string;
1391
- sessionName: string;
1392
- } | {
1393
- type: 'sessionResumeConfirmClear';
1394
- }
1395
- /** Push throttled debug-stream telemetry from the provider's chunk callback. */
1396
- | {
1397
- type: 'debugStreamStats';
1398
- chunkCount: number;
1399
- lastChunkSize: number;
1400
- lastDeltaMs: number;
1401
- totalBytes: number;
1402
- lastChunkAt: string;
1403
- }
1404
- /** Clear debug-stream stats (fired on stream reset / idle). */
1405
- | {
1406
- type: 'debugStreamStatsClear';
1407
- }
1408
- /** Auto-proceed countdown tick. Upserts the countdown; 0 clears it. */
1409
- | {
1410
- type: 'countdownTick';
1411
- remainingSeconds: number;
1412
- }
1413
- /** Auto-proceed countdown ended (completed or aborted). */
1414
- | {
1415
- type: 'countdownEnded';
1416
- }
1417
- /** Coordinator emitted a live event. */
1418
- | {
1419
- type: 'coordinatorEvent';
1420
- event: {
1421
- type: string;
1422
- goalId?: string | undefined;
1423
- taskId?: string | undefined;
1424
- knowledgeId?: string | undefined;
1425
- title?: string | undefined;
1426
- text?: string | undefined;
1427
- participants?: string[] | undefined;
1428
- };
1429
- }
1430
- /** Toggle the coordinator monitor overlay. */
1431
- | {
1432
- type: 'toggleCoordinatorMonitor';
1433
8
  };
1434
9
  //# sourceMappingURL=app-action-type.d.ts.map