@wrongstack/tui 0.302.2 → 0.305.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.
@@ -1,4 +1,4 @@
1
1
  /** Known reducer action types — exact, compile-time checked allow-list. */
2
- export declare const ALLOWED_ACTION_TYPES: readonly ["addEntry", "archiveLoaded", "startArchiveLoad", "authBusy", "authCatalog", "authClose", "authConfirmEnd", "authConfirmStart", "authFilter", "authFlowDone", "authFlowLog", "authFlowStart", "authHint", "authMove", "authOpen", "authPromptChange", "authPromptEnd", "authPromptStart", "authProviders", "authView", "autonomyPickerClose", "autonomyPickerHint", "autonomyPickerMove", "autonomyPickerOpen", "brainBusy", "brainClose", "brainHint", "brainMove", "brainOpen", "brainPromptClear", "brainPromptSet", "brainRiskChange", "brainRowMove", "brainSetLog", "brainSettingsLoaded", "brainStatus", "brainView", "checkpointReceived", "clearConfirmClose", "clearConfirmOpen", "clearConfirmSetValue", "clearHistory", "clearInput", "clearInputHistory", "closeAllPanels", "collabBugFound", "collabEvalComplete", "sidebarScroll", "sidebarScrollReset", "toggleSidebarFocus", "collabPlanEmitted", "collabSessionDone", "collabSubagentSpawned", "compactHistory", "confirmClearAll", "confirmClose", "confirmOpen", "continueConfirmClose", "continueConfirmOpen", "copiedNotice", "coordinatorEvent", "countdownEnded", "countdownTick", "debugStreamStats", "debugStreamStatsClear", "dequeueFirst", "designPickerClose", "designPickerMove", "designPickerOpen", "designPickerStack", "enhanceBusy", "enhanceClose", "enhanceOpen", "enhanceSet", "enqueue", "escConfirmClose", "escConfirmOpen", "fallbackOverlayClose", "fallbackOverlayMove", "fallbackOverlayOpen", "eternalStage", "exitConfirmClose", "exitConfirmOpen", "fKeyPickerClose", "fKeyPickerMove", "fKeyPickerOpen", "fleetBatch", "fleetBudgetExtended", "fleetBudgetWarning", "fleetConcurrency", "fleetCost", "fleetCtxPct", "fleetDelta", "fleetDone", "fleetMessage", "fleetRemove", "fleetSeed", "fleetSpawn", "fleetStart", "fleetTool", "fleetToolEnd", "fleetToolStart", "fleetUsage", "goalRunElapsed", "goalRunInit", "goalRunMonitorToggle", "goalRunPhaseUpdate", "goalRunReset", "goalRunRunningPhases", "goalRunTaskActive", "goalSummary", "helpClose", "helpFilter", "helpHint", "helpMove", "helpOpen", "hint", "historyDown", "historyPush", "historyUp", "interrupt", "leaderCtxPct", "leaderIterEnd", "leaderIterStart", "leaderToolEnd", "leaderToolStart", "mcpPickerBusy", "mcpPickerClose", "mcpPickerHint", "mcpPickerMove", "mcpPickerOpen", "mcpPickerSetItems", "modePickerClose", "modePickerHint", "modePickerMove", "modePickerOpen", "modelPickerBack", "modelPickerClose", "modelPickerHint", "modelPickerMove", "modelPickerOpen", "modelPickerPickProvider", "modelPickerSearch", "pickerClose", "pickerMove", "pickerOpen", "pickerSetMatches", "pluginPickerBusy", "pluginPickerClose", "pluginPickerHint", "pluginPickerMove", "pluginPickerOpen", "pluginPickerSetItems", "projectPickerClose", "projectPickerFilter", "projectPickerHint", "projectPickerMove", "projectPickerOpen", "promptPickerCategory", "promptPickerClose", "promptPickerMove", "promptPickerOpen", "queueClear", "queueDelete", "queueToggleRefine", "refineCountdownClose", "refineCountdownOpen", "refineFailureClose", "refineFailureOpen", "replaceHistory", "resetContextChip", "resetInterrupts", "resumePickerBusy", "resumePickerClose", "resumePickerError", "resumePickerHint", "resumePickerMove", "resumePickerOpen", "rewindOverlayClose", "rewindOverlayMove", "rewindOverlayOpen", "sddBoardSnapshot", "sddBoardFocusNext", "sddBoardFocusPrev", "sendModePickerClose", "sendModePickerMove", "sendModePickerOpen", "sessionResumeConfirmClear", "sessionResumeConfirmSet", "sessionRewound", "sessionsPanelBusy", "sessionsPanelMove", "sessionsPanelSet", "setBuffer", "setFleetChat", "setHistoryScrolled", "setInputHistory", "setViewportRows", "settingsClose", "settingsFieldMove", "settingsFieldSet", "settingsFilterSet", "settingsHint", "settingsOpen", "settingsThinkingEditCancel", "settingsThinkingEditChange", "settingsThinkingEditCommit", "settingsThinkingEditStart", "settingsValueChange", "settingsValueSet", "shadowClose", "shadowHint", "shadowOpen", "shadowUpdate", "shellCommandWarningClose", "shellCommandWarningOpen", "slashConfirmClose", "slashConfirmOpen", "slashPickerClose", "slashPickerMove", "slashPickerOpen", "status", "statuslineChipExpire", "statuslineChipShow", "statuslineClose", "statuslineFieldMove", "statuslineFieldSet", "statuslineHint", "statuslineOpen", "statuslineToggle", "statuslineVisibleChipsSync", "steerConsume", "steerStart", "streamDelta", "streamReset", "toggleAgentsMonitor", "toggleAuditPanel", "toggleContextPanel", "toggleConnectionsPanel", "toggleCoordinatorMonitor", "toggleCronMonitor", "toggleGoalKanbanPanel", "toggleGoalPanel", "toggleHelp", "toggleKanbanPanel", "toggleMonitor", "togglePlanPanel", "toggleProcessList", "toggleQueuePanel", "toggleSddBoardMonitor", "toggleSessionsPanel", "toggleTodosMonitor", "toggleWorktreeMonitor", "toolEnded", "toolStarted", "toolStreamAppend", "toolStreamClear", "topicCheckBusy", "toolsPickerBusy", "toolsPickerClose", "toolsPickerFilter", "toolsPickerHint", "toolsPickerMove", "toolsPickerOpen", "toolsPickerSetItems", "toolsPickerToggle", "worktreeRemove", "worktreeUpsert"];
2
+ export declare const ALLOWED_ACTION_TYPES: readonly ["addEntry", "archiveLoaded", "startArchiveLoad", "authBusy", "authCatalog", "authClose", "authConfirmEnd", "authConfirmStart", "authFilter", "authFlowDone", "authFlowLog", "authFlowStart", "authHint", "authMove", "authOpen", "authPromptChange", "authPromptEnd", "authPromptStart", "authProviders", "authView", "autonomyPickerClose", "autonomyPickerHint", "autonomyPickerMove", "autonomyPickerOpen", "brainBusy", "brainClose", "brainHint", "brainMove", "brainOpen", "brainPromptClear", "brainPromptSet", "brainRiskChange", "brainRowMove", "brainSetLog", "brainSettingsLoaded", "brainStatus", "brainView", "checkpointReceived", "clearConfirmClose", "clearConfirmOpen", "clearConfirmSetValue", "clearHistory", "clearInput", "clearInputHistory", "closeAllPanels", "collabBugFound", "collabEvalComplete", "sidebarScroll", "sidebarScrollReset", "toggleSidebarFocus", "collabPlanEmitted", "collabSessionDone", "collabSubagentSpawned", "compactHistory", "confirmClearAll", "confirmClose", "confirmOpen", "continueConfirmClose", "continueConfirmOpen", "copiedNotice", "coordinatorEvent", "countdownEnded", "countdownTick", "debugStreamStats", "debugStreamStatsClear", "dequeueFirst", "designPickerClose", "designPickerMove", "designPickerOpen", "designPickerStack", "enhanceBusy", "enhanceClose", "enhanceOpen", "enhanceSet", "enqueue", "escConfirmClose", "escConfirmOpen", "fallbackOverlayClose", "fallbackOverlayMove", "fallbackOverlayOpen", "eternalStage", "exitConfirmClose", "exitConfirmOpen", "fKeyPickerClose", "fKeyPickerMove", "fKeyPickerOpen", "fleetBatch", "fleetBudgetExtended", "fleetBudgetWarning", "fleetConcurrency", "fleetCost", "fleetCtxPct", "fleetDelta", "fleetDone", "fleetMessage", "fleetRemove", "fleetSeed", "fleetSpawn", "fleetStart", "fleetTool", "fleetToolEnd", "fleetToolStart", "fleetUsage", "goalRunElapsed", "goalRunInit", "goalRunMonitorToggle", "goalRunPhaseUpdate", "goalRunReset", "goalRunRunningPhases", "goalRunTaskActive", "goalSummary", "helpClose", "helpFilter", "helpHint", "helpMove", "helpOpen", "hint", "historyDown", "historyPush", "historyUp", "interrupt", "leaderCtxPct", "leaderIterEnd", "leaderIterStart", "leaderToolEnd", "leaderToolStart", "mcpPickerBusy", "mcpPickerClose", "mcpPickerHint", "mcpPickerMove", "mcpPickerOpen", "mcpPickerSetItems", "modePickerClose", "modePickerHint", "modePickerMove", "modePickerOpen", "modelPickerBack", "modelPickerClose", "modelPickerHint", "modelPickerMove", "modelPickerOpen", "modelPickerPickProvider", "modelPickerSearch", "pickerClose", "pickerMove", "pickerOpen", "pickerSetMatches", "pluginPickerBusy", "pluginPickerClose", "pluginPickerHint", "pluginPickerMove", "pluginPickerOpen", "pluginPickerSetItems", "projectPickerClose", "projectPickerFilter", "projectPickerHint", "projectPickerMove", "projectPickerOpen", "promptPickerCategory", "promptPickerClose", "promptPickerMove", "promptPickerOpen", "queueClear", "queueDelete", "queueToggleRefine", "refineCountdownClose", "refineCountdownOpen", "refineFailureClose", "refineFailureOpen", "replaceHistory", "resetContextChip", "resetInterrupts", "resumePickerBusy", "resumePickerClose", "resumePickerError", "resumePickerHint", "resumePickerMove", "resumePickerOpen", "rewindOverlayClose", "rewindOverlayMove", "rewindOverlayOpen", "sddBoardSnapshot", "sddBoardFocusNext", "sddBoardFocusPrev", "sendModePickerClose", "sendModePickerMove", "sendModePickerOpen", "sessionResumeConfirmClear", "sessionResumeConfirmSet", "sessionRewound", "sessionsPanelBusy", "sessionsPanelMove", "sessionsPanelSet", "setBuffer", "setFleetChat", "setHistoryScrolled", "setInputHistory", "setViewportRows", "settingsClose", "settingsFieldMove", "settingsFieldSet", "settingsFilterSet", "settingsHint", "settingsOpen", "settingsThinkingEditCancel", "settingsThinkingEditChange", "settingsThinkingEditCommit", "settingsThinkingEditStart", "settingsValueChange", "settingsValueSet", "shadowClose", "shadowHint", "shadowOpen", "shadowUpdate", "shellCommandWarningClose", "shellCommandWarningOpen", "slashConfirmClose", "slashConfirmOpen", "slashPickerClose", "slashPickerMove", "slashPickerOpen", "status", "statuslineChipExpire", "statuslineChipShow", "statuslineClose", "statuslineFieldMove", "statuslineFieldSet", "statuslineHint", "statuslineOpen", "statuslineToggle", "statuslineVisibleChipsSync", "steerConsume", "steerStart", "streamDelta", "streamReset", "themePickerClose", "themePickerHint", "themePickerMove", "themePickerOpen", "toggleAgentsMonitor", "toggleAuditPanel", "toggleContextPanel", "toggleConnectionsPanel", "toggleCoordinatorMonitor", "toggleCronMonitor", "toggleGoalKanbanPanel", "toggleGoalPanel", "toggleHelp", "toggleKanbanPanel", "toggleMonitor", "togglePlanPanel", "toggleProcessList", "toggleQueuePanel", "toggleSddBoardMonitor", "toggleSessionsPanel", "toggleTodosMonitor", "toggleWorktreeMonitor", "toolEnded", "toolStarted", "toolStreamAppend", "toolStreamClear", "topicCheckBusy", "toolsPickerBusy", "toolsPickerClose", "toolsPickerFilter", "toolsPickerHint", "toolsPickerMove", "toolsPickerOpen", "toolsPickerSetItems", "toolsPickerToggle", "worktreeRemove", "worktreeUpsert"];
3
3
  export type AllowedActionType = (typeof ALLOWED_ACTION_TYPES)[number];
4
4
  //# sourceMappingURL=action-types.d.ts.map
@@ -3,10 +3,17 @@
3
3
  *
4
4
  * Mirrors the WebUI's `packages/webui/src/lib/kanban-cleaner.ts` but
5
5
  * lives in the TUI package so we don't have to thread `@wrongstack/webui`
6
- * (which depends on React) into a server-side TUI pipeline. The two
7
- * implementations intentionally share the same audit-code vocabulary
8
- * (10 codes) and severity levels (`error`, `warning`) so a board audited
9
- * from either surface produces the same findings.
6
+ * (which depends on React) into a server-side TUI pipeline.
7
+ *
8
+ * The two implementations must produce the same verdicts for the same board.
9
+ * That claim used to be a comment; it is now enforced by
10
+ * `packages/cli/tests/kanban-cleaner-parity.test.ts`, which runs a shared
11
+ * corpus through both and compares the `taskId:code:severity` triples. Only
12
+ * three differences are deliberate, and all three are API shape rather than
13
+ * verdict: this file also accepts `liveAgentIdentities`, returns eight extra
14
+ * summary fields the WebUI's `KanbanCleanerAlert` fills from queue health, and
15
+ * exports `summarizeAuditHeadline` / `topAuditIssues` for the panel badge.
16
+ * Messages may differ; codes and severities may not.
10
17
  *
11
18
  * The output of `auditKanbanBoard()` feeds the TUI panel header badge so
12
19
  * users see Cleaner warnings inline — mirroring the WebUI's
@@ -14,7 +21,13 @@
14
21
  */
15
22
  import type { KanbanBoard } from '@wrongstack/kanban';
16
23
  export type KanbanAuditSeverity = 'error' | 'warning';
17
- export type KanbanAuditIssueCode = 'missing-description' | 'missing-assignee' | 'missing-due-date' | 'missing-labels' | 'missing-subtasks' | 'missing-success-criteria' | 'skipped-lifecycle-state' | 'abandoned-running-task' | 'stale-running-task' | 'stale-review';
24
+ /**
25
+ * The audit vocabulary, as a runtime value so the parity test can compare the
26
+ * two implementations' code sets instead of trusting that both type unions
27
+ * were edited together.
28
+ */
29
+ export declare const ALL_AUDIT_CODES: readonly ['abandoned-running-task', 'board-oversized', 'missing-assignee', 'missing-description', 'missing-due-date', 'missing-labels', 'missing-subtasks', 'missing-success-criteria', 'skipped-lifecycle-state', 'stale-review', 'stale-running-task'];
30
+ export type KanbanAuditIssueCode = (typeof ALL_AUDIT_CODES)[number];
18
31
  export interface KanbanAuditIssue {
19
32
  id: string;
20
33
  taskId: string;
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * /kanban — open the project kanban panel
8
8
  * /kanban create <title> — create a new board, then open the panel
9
- * /kanban add <title> [--column X] — add a task to the active board
9
+ * /kanban add <title> [--column X] [--desc <text>] — add a task to the active board (managed boards require --desc)
10
10
  * /kanban use <boardId|title|tag> — open the kanban panel on a specific board
11
11
  * /kanban boards — list every board in the project
12
12
  * /kanban health — show kanban queue health summary
@@ -19,7 +19,7 @@
19
19
  * is the text-first equivalent for when the panel is closed.
20
20
  */
21
21
  import type { SlashCommand } from '@wrongstack/core/types';
22
- import type { KanbanBoundaryAccess, KanbanBoundaryPolicy, KanbanBoundarySelectorKind, KanbanBoardSummary, KanbanQueueHealth } from '@wrongstack/kanban';
22
+ import type { KanbanBoardSummary, KanbanBoundaryAccess, KanbanBoundaryPolicy, KanbanBoundarySelectorKind, KanbanQueueHealth } from '@wrongstack/kanban';
23
23
  import { type KanbanAuditSummary } from './kanban-audit.js';
24
24
  /**
25
25
  * Result of resolving the board that an `add` operation should target.
@@ -34,6 +34,12 @@ export interface KanbanAddTarget {
34
34
  boardTitle: string;
35
35
  /** Column that the task will be placed in. Defaults to the first column. */
36
36
  columnId: string;
37
+ /**
38
+ * Whether the board enforces the managed Kanban Agent lifecycle. Managed
39
+ * boards require new cards to be created in the Backlog column and with a
40
+ * description, so callers route the user accordingly.
41
+ */
42
+ managed: boolean;
37
43
  }
38
44
  export interface KanbanSlashDeps {
39
45
  /**
@@ -78,6 +84,7 @@ export type ParsedKanbanArgs = {
78
84
  kind: 'add';
79
85
  title: string;
80
86
  column: string | null;
87
+ description?: string | undefined;
81
88
  } | {
82
89
  kind: 'use';
83
90
  query: string;
@@ -1,6 +1,6 @@
1
1
  import type { Action } from '../app-action-type.js';
2
2
  import type { State } from '../app-state.js';
3
- declare const composerActionTypes: readonly ["brainPromptSet", "brainPromptClear", "pickerOpen", "pickerClose", "pickerSetMatches", "pickerMove", "toolStarted", "toolEnded", "toolStreamAppend", "toolStreamClear", "enqueue", "dequeueFirst", "queueClear", "queueDelete", "queueToggleRefine", "slashPickerOpen", "slashPickerClose", "slashPickerMove", "historyPush", "historyUp", "historyDown", "setInputHistory", "clearInputHistory", "modelPickerOpen", "modelPickerClose", "modelPickerMove", "modelPickerPickProvider", "modelPickerBack", "modelPickerSearch", "modelPickerHint", "autonomyPickerOpen", "autonomyPickerClose", "autonomyPickerMove", "autonomyPickerHint", "modePickerOpen", "modePickerClose", "modePickerMove", "modePickerHint", "designPickerOpen", "designPickerClose", "designPickerMove", "designPickerStack", "promptPickerOpen", "promptPickerClose", "promptPickerMove", "promptPickerCategory", "resumePickerOpen", "resumePickerClose", "resumePickerMove", "resumePickerBusy", "resumePickerHint", "resumePickerError", "replaceHistory"];
3
+ declare const composerActionTypes: readonly ["brainPromptSet", "brainPromptClear", "pickerOpen", "pickerClose", "pickerSetMatches", "pickerMove", "toolStarted", "toolEnded", "toolStreamAppend", "toolStreamClear", "enqueue", "dequeueFirst", "queueClear", "queueDelete", "queueToggleRefine", "slashPickerOpen", "slashPickerClose", "slashPickerMove", "historyPush", "historyUp", "historyDown", "setInputHistory", "clearInputHistory", "modelPickerOpen", "modelPickerClose", "modelPickerMove", "modelPickerPickProvider", "modelPickerBack", "modelPickerSearch", "modelPickerHint", "autonomyPickerOpen", "autonomyPickerClose", "autonomyPickerMove", "autonomyPickerHint", "themePickerOpen", "themePickerClose", "themePickerMove", "themePickerHint", "modePickerOpen", "modePickerClose", "modePickerMove", "modePickerHint", "designPickerOpen", "designPickerClose", "designPickerMove", "designPickerStack", "promptPickerOpen", "promptPickerClose", "promptPickerMove", "promptPickerCategory", "resumePickerOpen", "resumePickerClose", "resumePickerMove", "resumePickerBusy", "resumePickerHint", "resumePickerError", "replaceHistory"];
4
4
  type ComposerAction = Extract<Action, {
5
5
  type: (typeof composerActionTypes)[number];
6
6
  }>;
@@ -1,6 +1,6 @@
1
1
  import type { State } from '../app-state.js';
2
2
  import type { ProjectPickerItem } from '../ui-contracts.js';
3
- type PanelResetState = Pick<State, 'monitorOpen' | 'agentsMonitorOpen' | 'helpOpen' | 'todosMonitorOpen' | 'queuePanelOpen' | 'processListOpen' | 'cronMonitorOpen' | 'auditPanelOpen' | 'planPanelOpen' | 'kanbanPanelOpen' | 'goalPanelOpen' | 'goalKanbanPanelOpen' | 'contextPanelOpen' | 'connectionsPanelOpen' | 'sessionsPanelOpen' | 'sidebarFocused' | 'settingsPicker' | 'statuslinePicker' | 'pluginPicker' | 'mcpPicker' | 'toolsPicker' | 'brainPanel' | 'helpPanel' | 'shadowPanel' | 'authPanel' | 'projectPicker' | 'fKeyPicker' | 'goalRun' | 'sddBoard' | 'worktreeMonitorOpen' | 'coordinator'>;
3
+ type PanelResetState = Pick<State, 'monitorOpen' | 'agentsMonitorOpen' | 'helpOpen' | 'todosMonitorOpen' | 'queuePanelOpen' | 'processListOpen' | 'cronMonitorOpen' | 'auditPanelOpen' | 'planPanelOpen' | 'kanbanPanelOpen' | 'goalPanelOpen' | 'goalKanbanPanelOpen' | 'contextPanelOpen' | 'connectionsPanelOpen' | 'sessionsPanelOpen' | 'sidebarFocused' | 'settingsPicker' | 'statuslinePicker' | 'pluginPicker' | 'mcpPicker' | 'toolsPicker' | 'brainPanel' | 'helpPanel' | 'shadowPanel' | 'authPanel' | 'projectPicker' | 'fKeyPicker' | 'goalRun' | 'sddBoard' | 'worktreeMonitorOpen' | 'coordinator' | 'themePicker'>;
4
4
  export declare function closePanels(state: State): PanelResetState;
5
5
  export declare function clampContextLoad(load: number): number;
6
6
  /** Upper bound on the live tool-stream text retained in state. */
@@ -3,7 +3,7 @@ import type { AutonomousCoordinator, CoordinatorEvent, Director } from '@wrongst
3
3
  import type { EventBus } from '@wrongstack/core/kernel';
4
4
  import type { SlashCommandRegistry } from '@wrongstack/core/registry';
5
5
  import type { QueueStore } from '@wrongstack/core/storage';
6
- import type { AttachmentStore, AutonomyStage, ContextSnapshot, FleetChatVerbosity, Message, TokenCounter, TokenSavingTier } from '@wrongstack/core/types';
6
+ import type { AttachmentStore, AutonomyStage, ConfigStore, ContextSnapshot, FleetChatVerbosity, Message, ThemePresetId, TokenCounter, TokenSavingTier } from '@wrongstack/core/types';
7
7
  import type { VisionAdapters } from '@wrongstack/runtime/vision';
8
8
  import type { SddLifecycleResult, SddRunControl } from '@wrongstack/sdd';
9
9
  import type { AgentTranscriptReader } from './components/agents-monitor.js';
@@ -349,6 +349,16 @@ export interface RunTuiOptions {
349
349
  * error string on failure (so the TUI can display it as a hint).
350
350
  */
351
351
  saveSettings?: ((s: import('./app-state.js').Settings) => string | null | Promise<string | null>) | undefined;
352
+ /** Persist the active theme preset to disk so the next boot starts with it. */
353
+ saveThemePreset?: ((preset: ThemePresetId) => Promise<void>) | undefined;
354
+ /**
355
+ * Live ConfigStore — passed through to the TUI so the `/theme` slash
356
+ * command can read the current `themePreset`, apply it via
357
+ * `setActiveTheme()`, and persist the user's pick back to disk.
358
+ * Subscribes via `ConfigStore.watch` so any external write (CLI REPL,
359
+ * WebUI, profile migration) is reflected immediately.
360
+ */
361
+ configStore?: ConfigStore | undefined;
352
362
  /** Load toggleable plugin rows for the interactive plugin picker. */
353
363
  getPluginItems?: (() => PluginPickerItem[]) | undefined;
354
364
  /** Toggle one plugin from the interactive picker and return refreshed rows. */
package/dist/theme.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { ThemePresetId } from '@wrongstack/core/types';
1
2
  export declare const pastel: Readonly<{
2
3
  readonly black: '#11111b';
3
4
  readonly red: '#f38ba8';
@@ -76,6 +77,17 @@ export declare function softColor(color?: string): string | undefined;
76
77
  * branch without mutating process state.
77
78
  */
78
79
  export declare function detectSupportsBackground(env?: NodeJS.ProcessEnv, isTTY?: boolean): boolean;
80
+ /**
81
+ * Canonical palette preset identifiers. The runtime palette is always one of
82
+ * these five names; the key is also the public CLI/TUI slug (used in
83
+ * `config.themePreset` and the `/theme <preset>` slash command).
84
+ */
85
+ export type ThemeName = ThemePresetId;
86
+ export interface ThemePickerOption {
87
+ id: ThemeName;
88
+ name: string;
89
+ description: string;
90
+ }
79
91
  export interface Theme {
80
92
  /** Primary readable foreground used by framed chrome. */
81
93
  textPrimary: string;
@@ -144,4 +156,34 @@ export interface Theme {
144
156
  diffDelBg: string;
145
157
  }
146
158
  export declare const theme: Theme;
159
+ /**
160
+ * Snapshot of the active palette. The returned object is the *same* reference
161
+ * the rest of the app sees, so identity checks (`===`) can tell when
162
+ * `setActiveTheme` has actually swapped something. Cheap to call.
163
+ */
164
+ export declare function getActiveTheme(): Theme;
165
+ /**
166
+ * Mutate `theme` in place to the given preset's palette. Unknown names fall
167
+ * back to `catppuccin` and report the fallback to the caller so the picker can
168
+ * show a hint. Subscribers (see `subscribeToTheme`) are notified synchronously.
169
+ *
170
+ * Returns the name actually applied (always one of `ThemeName`).
171
+ */
172
+ export declare function setActiveTheme(name: string | undefined): ThemeName;
173
+ type ThemeListener = (name: ThemeName) => void;
174
+ /**
175
+ * Subscribe to active-theme changes. Returns an unsubscribe function. Used by
176
+ * `useActiveTheme()` so React re-renders when the palette swaps. Callers from
177
+ * outside React (e.g. host boot wiring) can use it to persist + reapply.
178
+ */
179
+ export declare function subscribeToTheme(cb: ThemeListener): () => void;
180
+ /**
181
+ * Returns the name of the currently active theme preset, tracked via
182
+ * `currentPresetName` (kept in lockstep with `setActiveTheme` mutations).
183
+ * Cheap O(1). Always returns one of the canonical `ThemeName` values.
184
+ */
185
+ export declare function getActiveThemeName(): ThemeName;
186
+ export declare const themePresets: Record<ThemeName, Theme>;
187
+ export declare const THEME_OPTIONS: readonly ThemePickerOption[];
188
+ export {};
147
189
  //# sourceMappingURL=theme.d.ts.map
@@ -126,6 +126,7 @@ export interface ToolPickerItem {
126
126
  owner: string;
127
127
  category: string;
128
128
  enabled: boolean;
129
+ exposure: 'direct' | 'lazy' | 'disabled';
129
130
  mutating: boolean;
130
131
  permission: string;
131
132
  descMode: 'extend' | 'simple';
@@ -0,0 +1,9 @@
1
+ import type { SlashCommand } from '@wrongstack/core/types';
2
+ import { type KanbanWorkbenchSnapshot } from '@wrongstack/kanban';
3
+ export interface WorkbenchSlashDeps {
4
+ projectRoot: string;
5
+ }
6
+ /** Text-first, bounded cross-board view for terminals where the visual panel is closed. */
7
+ export declare function createWorkbenchSlashCommand(deps: WorkbenchSlashDeps): SlashCommand;
8
+ export declare function renderWorkbenchReport(snapshot: KanbanWorkbenchSnapshot): string;
9
+ //# sourceMappingURL=workbench-slash.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wrongstack/tui",
3
- "version": "0.302.2",
3
+ "version": "0.305.0",
4
4
  "license": "MIT",
5
5
  "description": "WrongStack terminal UI: Ink-based interactive renderer with history, pickers, and slash menus.",
6
6
  "repository": {
@@ -29,12 +29,12 @@
29
29
  "ink": "7.1.1",
30
30
  "react": "^19.2.8",
31
31
  "string-width": "8.2.2",
32
- "@wrongstack/core": "0.302.2",
33
- "@wrongstack/sage": "0.302.2",
34
- "@wrongstack/sdd": "0.302.2",
35
- "@wrongstack/kanban": "0.302.2",
36
- "@wrongstack/tools": "0.302.2",
37
- "@wrongstack/runtime": "0.302.2"
32
+ "@wrongstack/core": "0.305.0",
33
+ "@wrongstack/kanban": "0.305.0",
34
+ "@wrongstack/sage": "0.305.0",
35
+ "@wrongstack/runtime": "0.305.0",
36
+ "@wrongstack/sdd": "0.305.0",
37
+ "@wrongstack/tools": "0.305.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@testing-library/dom": "^10.4.1",