@brimveyn/aimux-config 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brimveyn/aimux-config",
3
- "version": "0.4.2",
3
+ "version": "0.4.4",
4
4
  "description": "TypeScript configuration API for aimux — keymaps, themes, and backends with a fluent builder.",
5
5
  "keywords": [
6
6
  "aimux",
package/src/actions.ts CHANGED
@@ -15,22 +15,26 @@ function r(
15
15
  export const nextTab: KeyResult = r([{ delta: 1, type: 'move-active-tab' }])
16
16
  export const prevTab: KeyResult = r([{ delta: -1, type: 'move-active-tab' }])
17
17
 
18
- export const newTab: KeyResult = r([{ type: 'open-new-tab-modal' }], [], 'modal.new-tab')
18
+ export const newTab: KeyResult = r(
19
+ [{ type: 'open-new-tab-modal' }],
20
+ [],
21
+ 'modal.new-tab.command-edit'
22
+ )
19
23
  export const renameTab: KeyResult = r([{ type: 'open-rename-tab-modal' }], [], 'modal.rename-tab')
20
24
  export const sessionPicker: KeyResult = r(
21
25
  [{ type: 'open-session-picker' }],
22
26
  [],
23
- 'modal.session-picker'
27
+ 'modal.session-picker.filtering'
24
28
  )
25
29
  export const snippetPicker: KeyResult = r(
26
30
  [{ type: 'open-snippet-picker' }],
27
31
  [],
28
- 'modal.snippet-picker'
32
+ 'modal.snippet-picker.filtering'
29
33
  )
30
34
  export const themePicker: KeyResult = r(
31
35
  [{ type: 'open-theme-picker' }],
32
36
  [{ action: 'open', type: 'apply-theme' }],
33
- 'modal.theme-picker'
37
+ 'modal.theme-picker.filtering'
34
38
  )
35
39
  export function helpModal(scope?: ModeId): KeyResult {
36
40
  return r([{ scope, type: 'open-help-modal' }])
@@ -160,25 +164,13 @@ export function moveModalSelectionWithPreview(
160
164
 
161
165
  export const launchSelectedAssistant: KeyResult = r([], [{ type: 'launch-selected-assistant' }])
162
166
 
163
- export const beginCommandEdit: KeyResult = r(
164
- [{ type: 'begin-command-edit' }],
165
- [],
166
- 'modal.new-tab.command-edit'
167
- )
168
-
169
167
  export const cancelCommandEdit = (returnTo: KeyResult['transition']): KeyResult =>
170
168
  r([{ type: 'cancel-command-edit' }], [], returnTo)
171
169
 
172
- export const commitCommandEdit: KeyResult = r(
173
- [{ type: 'commit-command-edit' }],
174
- [{ type: 'save-custom-command' }],
175
- 'modal.new-tab'
176
- )
177
-
178
170
  export const confirmSelectedSession: KeyResult = r([], [{ type: 'confirm-selected-session' }])
179
171
 
180
172
  export const openCreateSessionModal: KeyResult = r(
181
- [{ type: 'open-create-session-modal' }],
173
+ [{ returnToSessionPicker: true, type: 'open-create-session-modal' }],
182
174
  [],
183
175
  'modal.create-session'
184
176
  )
@@ -190,12 +182,6 @@ export const openRenameSelectedSession: KeyResult = r(
190
182
 
191
183
  export const deleteSelectedSession: KeyResult = r([], [{ type: 'delete-selected-session' }])
192
184
 
193
- export const beginSessionFilter: KeyResult = r(
194
- [{ type: 'begin-session-filter' }],
195
- [],
196
- 'modal.session-picker.filtering'
197
- )
198
-
199
185
  export const openSnippetEditor: KeyResult = r(
200
186
  [{ type: 'open-snippet-editor' }],
201
187
  [],
@@ -217,24 +203,6 @@ export const pasteSnippetToGroup: KeyResult = r(
217
203
  'navigation'
218
204
  )
219
205
 
220
- export const beginSnippetFilter: KeyResult = r(
221
- [{ type: 'begin-snippet-filter' }],
222
- [],
223
- 'modal.snippet-picker.filtering'
224
- )
225
-
226
- export const beginHelpFilter: KeyResult = r(
227
- [{ type: 'begin-help-filter' }],
228
- [],
229
- 'modal.help.filtering'
230
- )
231
-
232
- export const beginThemeFilter: KeyResult = r(
233
- [{ type: 'begin-theme-filter' }],
234
- [],
235
- 'modal.theme-picker.filtering'
236
- )
237
-
238
206
  export const confirmSplit: KeyResult = r([], [{ type: 'confirm-split' }])
239
207
 
240
208
  export const restoreTheme: KeyResult = r(
@@ -256,19 +224,28 @@ export function previewTheme(delta: 1 | -1): KeyResult {
256
224
  )
257
225
  }
258
226
 
227
+ export const toggleTransparent: KeyResult = r([], [{ type: 'toggle-transparent' }])
228
+
259
229
  export const switchField: KeyResult = r([{ type: 'switch-create-session-field' }])
260
230
  export const selectDirectory: KeyResult = r([{ type: 'select-directory' }])
261
231
 
262
232
  export const backToSessionPicker: KeyResult = r(
263
233
  [{ type: 'open-session-picker' }],
264
234
  [],
265
- 'modal.session-picker'
235
+ 'modal.session-picker.filtering'
266
236
  )
267
237
 
238
+ export const createSessionEscape: ActionFn = (ctx: ModeContext) => {
239
+ if (ctx.state.modal.type === 'create-session' && !ctx.state.modal.returnToSessionPicker) {
240
+ return r([{ type: 'close-modal' }], [], 'navigation')
241
+ }
242
+ return r([{ type: 'open-session-picker' }], [], 'modal.session-picker.filtering')
243
+ }
244
+
268
245
  export const backToSnippetPicker: KeyResult = r(
269
246
  [{ type: 'open-snippet-picker' }],
270
247
  [],
271
- 'modal.snippet-picker'
248
+ 'modal.snippet-picker.filtering'
272
249
  )
273
250
 
274
251
  export const saveSnippetEditor: KeyResult = r(
@@ -277,6 +254,18 @@ export const saveSnippetEditor: KeyResult = r(
277
254
  'navigation'
278
255
  )
279
256
 
257
+ export const saveCustomCommand: KeyResult = r(
258
+ [],
259
+ [{ type: 'save-custom-command' }],
260
+ 'modal.new-tab.command-edit'
261
+ )
262
+
263
+ export const cancelEditCustomCommand: KeyResult = r(
264
+ [{ type: 'cancel-command-edit' }],
265
+ [],
266
+ 'modal.new-tab.command-edit'
267
+ )
268
+
280
269
  // ---------------------------------------------------------------------------
281
270
  // Update-available modal
282
271
  // ---------------------------------------------------------------------------
@@ -329,10 +318,10 @@ export const confirmSessionRename: ActionFn = (ctx: ModeContext) => {
329
318
  return r(
330
319
  [{ type: 'open-session-picker' }],
331
320
  [{ name: trimmed, sessionId, type: 'rename-session' }],
332
- 'modal.session-picker'
321
+ 'modal.session-picker.filtering'
333
322
  )
334
323
  }
335
- return r([{ type: 'open-session-picker' }], [], 'modal.session-picker')
324
+ return r([{ type: 'open-session-picker' }], [], 'modal.session-picker.filtering')
336
325
  }
337
326
 
338
327
  // Rename tab modal
package/src/defaults.ts CHANGED
@@ -111,26 +111,11 @@ export function getDefaultKeymapConfig(): ResolvedKeymapConfig {
111
111
  )
112
112
 
113
113
  // -----------------------------------------------------------------------
114
- // Modal: help
115
- // -----------------------------------------------------------------------
116
- .mode('modal.help', (m) =>
117
- m
118
- .map('<Esc>', actions.closeOverlayModal, 'Close')
119
- .map('j', actions.moveModalSelection(1), 'Next')
120
- .map('k', actions.moveModalSelection(-1), 'Prev')
121
- .map('<Down>', actions.moveModalSelection(1))
122
- .map('<Up>', actions.moveModalSelection(-1))
123
- .map('<C-n>', actions.moveModalSelection(1))
124
- .map('<C-p>', actions.moveModalSelection(-1))
125
- .map('/', actions.beginHelpFilter, 'Filter')
126
- )
127
-
128
- // -----------------------------------------------------------------------
129
- // Modal: help filtering
114
+ // Modal: help (always in filter mode via Picker)
130
115
  // -----------------------------------------------------------------------
131
116
  .mode('modal.help.filtering', (m) =>
132
117
  m
133
- .map('<Esc>', actions.cancelCommandEdit('modal.help'), 'Cancel')
118
+ .map('<Esc>', actions.closeOverlayModal, 'Close')
134
119
  .map('<C-n>', actions.moveModalSelection(1), 'Next')
135
120
  .map('<C-p>', actions.moveModalSelection(-1), 'Prev')
136
121
  .map('<Down>', actions.moveModalSelection(1))
@@ -139,32 +124,17 @@ export function getDefaultKeymapConfig(): ResolvedKeymapConfig {
139
124
  )
140
125
 
141
126
  // -----------------------------------------------------------------------
142
- // Modal: theme-picker
143
- // -----------------------------------------------------------------------
144
- .mode('modal.theme-picker', (m) =>
145
- m
146
- .map('<Esc>', actions.restoreTheme, 'Cancel')
147
- .map('j', actions.previewTheme(1), 'Next')
148
- .map('k', actions.previewTheme(-1), 'Prev')
149
- .map('<Down>', actions.previewTheme(1))
150
- .map('<Up>', actions.previewTheme(-1))
151
- .map('<C-n>', actions.previewTheme(1))
152
- .map('<C-p>', actions.previewTheme(-1))
153
- .map('<CR>', actions.confirmTheme, 'Confirm')
154
- .map('/', actions.beginThemeFilter, 'Filter')
155
- )
156
-
157
- // -----------------------------------------------------------------------
158
- // Modal: theme-picker filtering
127
+ // Modal: theme-picker (always in filter mode via Picker)
159
128
  // -----------------------------------------------------------------------
160
129
  .mode('modal.theme-picker.filtering', (m) =>
161
130
  m
162
- .map('<Esc>', actions.cancelCommandEdit('modal.theme-picker'), 'Cancel')
131
+ .map('<Esc>', actions.restoreTheme, 'Cancel')
163
132
  .map('<C-n>', actions.previewTheme(1), 'Next')
164
133
  .map('<C-p>', actions.previewTheme(-1), 'Prev')
165
134
  .map('<Down>', actions.previewTheme(1))
166
135
  .map('<Up>', actions.previewTheme(-1))
167
136
  .map('<CR>', actions.confirmTheme, 'Confirm')
137
+ .map('<C-t>', actions.toggleTransparent, 'Toggle transparent')
168
138
  .passthrough()
169
139
  )
170
140
 
@@ -176,8 +146,6 @@ export function getDefaultKeymapConfig(): ResolvedKeymapConfig {
176
146
  .map('<Esc>', actions.closeModal, 'Cancel')
177
147
  .map('l', actions.moveModalSelection(1), 'Next')
178
148
  .map('h', actions.moveModalSelection(-1), 'Prev')
179
- .map('j', actions.moveModalSelection(1))
180
- .map('k', actions.moveModalSelection(-1))
181
149
  .map('<Right>', actions.moveModalSelection(1))
182
150
  .map('<Left>', actions.moveModalSelection(-1))
183
151
  .map('<Down>', actions.moveModalSelection(1))
@@ -198,28 +166,12 @@ export function getDefaultKeymapConfig(): ResolvedKeymapConfig {
198
166
  )
199
167
 
200
168
  // -----------------------------------------------------------------------
201
- // Modal: new-tab
169
+ // Modal: new-tab (always in filter mode via Picker)
202
170
  // -----------------------------------------------------------------------
203
- .mode('modal.new-tab', (m) =>
171
+ .mode('modal.new-tab.command-edit', (m) =>
204
172
  m
205
173
  .map('<Esc>', actions.closeModal, 'Cancel')
206
- .map('j', actions.moveModalSelection(1), 'Next')
207
- .map('k', actions.moveModalSelection(-1), 'Prev')
208
- .map('<Down>', actions.moveModalSelection(1))
209
- .map('<Up>', actions.moveModalSelection(-1))
210
- .map('<C-n>', actions.moveModalSelection(1))
211
- .map('<C-p>', actions.moveModalSelection(-1))
212
174
  .map('<CR>', actions.launchSelectedAssistant, 'Launch')
213
- .map('e', actions.beginCommandEdit, 'Edit command')
214
- )
215
-
216
- // -----------------------------------------------------------------------
217
- // Modal: new-tab command-edit
218
- // -----------------------------------------------------------------------
219
- .mode('modal.new-tab.command-edit', (m) =>
220
- m
221
- .map('<Esc>', actions.cancelCommandEdit('modal.new-tab'), 'Cancel')
222
- .map('<CR>', actions.commitCommandEdit, 'Save')
223
175
  .map('<C-n>', actions.moveModalSelection(1), 'Next')
224
176
  .map('<C-p>', actions.moveModalSelection(-1), 'Prev')
225
177
  .map('<Down>', actions.moveModalSelection(1))
@@ -227,31 +179,19 @@ export function getDefaultKeymapConfig(): ResolvedKeymapConfig {
227
179
  .passthrough()
228
180
  )
229
181
 
230
- // -----------------------------------------------------------------------
231
- // Modal: session-picker
232
- // -----------------------------------------------------------------------
233
- .mode('modal.session-picker', (m) =>
182
+ .mode('modal.new-tab.editing-command', (m) =>
234
183
  m
235
- .map('<Esc>', actions.sessionPickerEscape, 'Cancel')
236
- .map('j', actions.moveModalSelection(1), 'Next')
237
- .map('k', actions.moveModalSelection(-1), 'Prev')
238
- .map('<Down>', actions.moveModalSelection(1))
239
- .map('<Up>', actions.moveModalSelection(-1))
240
- .map('<C-n>', actions.moveModalSelection(1))
241
- .map('<C-p>', actions.moveModalSelection(-1))
242
- .map('<CR>', actions.confirmSelectedSession, 'Open')
243
- .map('n', actions.openCreateSessionModal, 'New')
244
- .map('r', actions.openRenameSelectedSession, 'Rename')
245
- .map('d', actions.deleteSelectedSession, 'Delete')
246
- .map('/', actions.beginSessionFilter, 'Filter')
184
+ .map('<Esc>', actions.cancelEditCustomCommand, 'Cancel')
185
+ .map('<CR>', actions.saveCustomCommand, 'Save')
186
+ .passthrough()
247
187
  )
248
188
 
249
189
  // -----------------------------------------------------------------------
250
- // Modal: session-picker filtering
190
+ // Modal: session-picker (always in filter mode via Picker)
251
191
  // -----------------------------------------------------------------------
252
192
  .mode('modal.session-picker.filtering', (m) =>
253
193
  m
254
- .map('<Esc>', actions.cancelCommandEdit('modal.session-picker'), 'Cancel')
194
+ .map('<Esc>', actions.sessionPickerEscape, 'Cancel')
255
195
  .map('<CR>', actions.confirmSelectedSession, 'Open')
256
196
  .map('<C-n>', actions.moveModalSelection(1), 'Next')
257
197
  .map('<C-p>', actions.moveModalSelection(-1), 'Prev')
@@ -275,7 +215,7 @@ export function getDefaultKeymapConfig(): ResolvedKeymapConfig {
275
215
  // -----------------------------------------------------------------------
276
216
  .mode('modal.create-session', (m) =>
277
217
  m
278
- .map('<Esc>', actions.backToSessionPicker, 'Cancel')
218
+ .map('<Esc>', actions.createSessionEscape, 'Cancel')
279
219
  .map('<Tab>', actions.switchField, 'Next field')
280
220
  .map('<CR>', actions.confirmCreateSession, 'Confirm')
281
221
  .map('<C-n>', actions.moveModalSelection(1), 'Next')
@@ -286,32 +226,11 @@ export function getDefaultKeymapConfig(): ResolvedKeymapConfig {
286
226
  )
287
227
 
288
228
  // -----------------------------------------------------------------------
289
- // Modal: snippet-picker
290
- // -----------------------------------------------------------------------
291
- .mode('modal.snippet-picker', (m) =>
292
- m
293
- .map('<Esc>', actions.closeModal, 'Cancel')
294
- .map('j', actions.moveModalSelection(1), 'Next')
295
- .map('k', actions.moveModalSelection(-1), 'Prev')
296
- .map('<Down>', actions.moveModalSelection(1))
297
- .map('<Up>', actions.moveModalSelection(-1))
298
- .map('<C-n>', actions.moveModalSelection(1))
299
- .map('<C-p>', actions.moveModalSelection(-1))
300
- .map('<CR>', actions.pasteSelectedSnippet, 'Send')
301
- .map('a', actions.pasteSnippetToGroup, 'Send to group')
302
- .map('n', actions.openSnippetEditor, 'New')
303
- .map('r', actions.editSelectedSnippet, 'Edit')
304
- .map('e', actions.editSelectedSnippet)
305
- .map('d', actions.deleteSelectedSnippet, 'Delete')
306
- .map('/', actions.beginSnippetFilter, 'Filter')
307
- )
308
-
309
- // -----------------------------------------------------------------------
310
- // Modal: snippet-picker filtering
229
+ // Modal: snippet-picker (always in filter mode via Picker)
311
230
  // -----------------------------------------------------------------------
312
231
  .mode('modal.snippet-picker.filtering', (m) =>
313
232
  m
314
- .map('<Esc>', actions.cancelCommandEdit('modal.snippet-picker'), 'Cancel')
233
+ .map('<Esc>', actions.closeModal, 'Cancel')
315
234
  .map('<CR>', actions.snippetFilterPaste, 'Send')
316
235
  .map('<C-a>', actions.snippetFilterPasteToGroup, 'Send to group')
317
236
  .map('<C-n>', actions.moveModalSelection(1), 'Next')
@@ -342,10 +261,8 @@ export function getDefaultKeymapConfig(): ResolvedKeymapConfig {
342
261
  .mode('modal.split-picker', (m) =>
343
262
  m
344
263
  .map('<Esc>', actions.closeModal, 'Cancel')
345
- .map('j', actions.moveModalSelection(1), 'Next')
346
- .map('k', actions.moveModalSelection(-1), 'Prev')
347
- .map('<Down>', actions.moveModalSelection(1))
348
- .map('<Up>', actions.moveModalSelection(-1))
264
+ .map('<Down>', actions.moveModalSelection(1), 'Next')
265
+ .map('<Up>', actions.moveModalSelection(-1), 'Prev')
349
266
  .map('<C-n>', actions.moveModalSelection(1))
350
267
  .map('<C-p>', actions.moveModalSelection(-1))
351
268
  .map('<CR>', actions.confirmSplit, 'Confirm')
package/src/types.ts CHANGED
@@ -12,19 +12,15 @@ export type ModeId =
12
12
  | 'navigation'
13
13
  | 'terminal-input'
14
14
  | 'git-mode'
15
- | 'modal.new-tab'
16
15
  | 'modal.new-tab.command-edit'
17
- | 'modal.session-picker'
16
+ | 'modal.new-tab.editing-command'
18
17
  | 'modal.session-picker.filtering'
19
18
  | 'modal.session-name'
20
19
  | 'modal.create-session'
21
20
  | 'modal.rename-tab'
22
- | 'modal.snippet-picker'
23
21
  | 'modal.snippet-picker.filtering'
24
22
  | 'modal.snippet-editor'
25
- | 'modal.theme-picker'
26
23
  | 'modal.theme-picker.filtering'
27
- | 'modal.help'
28
24
  | 'modal.help.filtering'
29
25
  | 'modal.split-picker'
30
26
  | 'modal.git-commit'
@@ -34,8 +30,18 @@ export type ModeId =
34
30
 
35
31
  export type BuiltinAssistantId = 'claude' | 'codex' | 'opencode' | 'terminal'
36
32
  export type AssistantId = BuiltinAssistantId | (string & {})
37
- export type TabStatus = 'starting' | 'running' | 'disconnected' | 'exited' | 'error'
38
- export type TabActivity = 'busy' | 'idle'
33
+ export type TabStatus = 'starting' | 'running' | 'disconnected' | 'error'
34
+
35
+ /**
36
+ * Status values that may appear in legacy on-disk workspace snapshots but are
37
+ * not produced by the running app anymore.
38
+ */
39
+ export type LegacyPersistedTabStatus = TabStatus | 'exited'
40
+ export type TabActivity = 'working' | 'waiting-input' | 'idle'
41
+ export interface SessionStatus {
42
+ working: boolean
43
+ waiting: boolean
44
+ }
39
45
  export type FocusMode = 'navigation' | 'terminal-input' | 'modal' | 'command-edit' | 'git'
40
46
  export type SplitDirection = 'horizontal' | 'vertical'
41
47
 
@@ -89,7 +95,7 @@ export interface PersistedTabSnapshot {
89
95
  assistant: AssistantId
90
96
  title: string
91
97
  command: string
92
- status: Exclude<TabStatus, 'disconnected'>
98
+ status: Exclude<LegacyPersistedTabStatus, 'disconnected'>
93
99
  buffer: string
94
100
  viewport?: TerminalSnapshot
95
101
  terminalModes: TerminalModeState
@@ -244,6 +250,7 @@ export interface ModalClosed extends ModalBase {
244
250
 
245
251
  export interface ModalNewTab extends ModalBase {
246
252
  type: 'new-tab'
253
+ editingCommand: AssistantId | null
247
254
  }
248
255
  export interface ModalSessionPicker extends ModalBase {
249
256
  type: 'session-picker'
@@ -276,6 +283,7 @@ export interface ModalCreateSession extends ModalBase {
276
283
  pendingProjectPath: string | null
277
284
  activeField: 'directory' | 'name'
278
285
  nameBuffer: string
286
+ returnToSessionPicker: boolean
279
287
  }
280
288
  export interface ModalGitCommit extends ModalBase {
281
289
  type: 'git-commit'
@@ -328,7 +336,7 @@ export interface AppState {
328
336
  tabGroupMap: Record<string, string>
329
337
  sessions: SessionRecord[]
330
338
  currentSessionId: string | null
331
- sessionsBusy: Record<string, boolean>
339
+ sessionStatuses: Record<string, SessionStatus>
332
340
  sessionBar: SessionBarState
333
341
  snippets: SnippetRecord[]
334
342
  focusMode: FocusMode
@@ -352,21 +360,15 @@ export type ModalAction =
352
360
  | { type: 'open-session-name-modal'; sessionTargetId?: string; initialName?: string }
353
361
  | { type: 'close-modal' }
354
362
  | { type: 'move-modal-selection'; delta: number }
355
- | { type: 'begin-command-edit' }
356
363
  | { type: 'update-command-edit'; char: string }
357
- | { type: 'commit-command-edit' }
358
364
  | { type: 'cancel-command-edit' }
359
- | { type: 'open-create-session-modal' }
365
+ | { type: 'open-create-session-modal'; returnToSessionPicker: boolean }
360
366
  | { type: 'set-directory-results'; results: DirectoryResult[] }
361
367
  | { type: 'switch-create-session-field' }
362
368
  | { type: 'select-directory' }
363
- | { type: 'begin-session-filter' }
364
369
  | { type: 'open-rename-tab-modal' }
365
370
  | { type: 'open-snippet-picker' }
366
371
  | { type: 'open-snippet-editor'; snippetId?: string }
367
- | { type: 'begin-snippet-filter' }
368
- | { type: 'begin-help-filter' }
369
- | { type: 'begin-theme-filter' }
370
372
  | { type: 'set-help-entry-count'; count: number }
371
373
  | { type: 'set-theme-entry-count'; count: number }
372
374
  | { type: 'open-theme-picker' }
@@ -379,7 +381,7 @@ export type SessionAction =
379
381
  | { type: 'rename-session-record'; sessionId: string; name: string }
380
382
  | { type: 'delete-session-record'; sessionId: string }
381
383
  | { type: 'reorder-sessions'; orderedIds: string[] }
382
- | { type: 'set-session-busy'; sessionId: string; busy: boolean }
384
+ | { type: 'set-session-status'; sessionId: string; status: SessionStatus }
383
385
 
384
386
  export type TabAction =
385
387
  | { type: 'add-tab'; tab: TabSession }
@@ -406,7 +408,6 @@ export type TabAction =
406
408
  terminalModes: TerminalModeState
407
409
  }
408
410
  | { type: 'set-tab-activity'; tabId: string; activity?: TabActivity }
409
- | { type: 'set-tab-status'; tabId: string; status: TabStatus; exitCode?: number }
410
411
  | { type: 'set-tab-error'; tabId: string; message: string }
411
412
 
412
413
  export type LayoutAction =
@@ -545,6 +546,7 @@ export type SideEffect =
545
546
  | { type: 'git-push' }
546
547
  | { type: 'confirm-update-selection' }
547
548
  | { type: 'switch-session-by-index'; index: number }
549
+ | { type: 'toggle-transparent' }
548
550
 
549
551
  // ─── Key input / KeyResult / ModeContext ──────────────────────────────────────
550
552