mstro-app 0.4.35 → 0.4.37

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 (32) hide show
  1. package/dist/server/cli/headless/claude-invoker-stream.d.ts +76 -1
  2. package/dist/server/cli/headless/claude-invoker-stream.d.ts.map +1 -1
  3. package/dist/server/cli/headless/claude-invoker-stream.js +28 -16
  4. package/dist/server/cli/headless/claude-invoker-stream.js.map +1 -1
  5. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  6. package/dist/server/cli/headless/claude-invoker.js +2 -0
  7. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  8. package/dist/server/cli/improvisation-session-manager.d.ts +3 -0
  9. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  10. package/dist/server/cli/improvisation-session-manager.js +50 -39
  11. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  12. package/dist/server/services/websocket/git-worktree-handlers.js +25 -16
  13. package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -1
  14. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
  15. package/dist/server/services/websocket/session-handlers.js +11 -1
  16. package/dist/server/services/websocket/session-handlers.js.map +1 -1
  17. package/dist/server/services/websocket/skill-handlers.d.ts +9 -0
  18. package/dist/server/services/websocket/skill-handlers.d.ts.map +1 -1
  19. package/dist/server/services/websocket/skill-handlers.js +244 -3
  20. package/dist/server/services/websocket/skill-handlers.js.map +1 -1
  21. package/dist/server/services/websocket/types.d.ts +44 -3
  22. package/dist/server/services/websocket/types.d.ts.map +1 -1
  23. package/dist/server/services/websocket/types.js +38 -0
  24. package/dist/server/services/websocket/types.js.map +1 -1
  25. package/package.json +1 -1
  26. package/server/cli/headless/claude-invoker-stream.ts +114 -32
  27. package/server/cli/headless/claude-invoker.ts +2 -0
  28. package/server/cli/improvisation-session-manager.ts +59 -43
  29. package/server/services/websocket/git-worktree-handlers.ts +30 -14
  30. package/server/services/websocket/session-handlers.ts +17 -1
  31. package/server/services/websocket/skill-handlers.ts +260 -3
  32. package/server/services/websocket/types.ts +123 -329
@@ -20,345 +20,139 @@ export interface WSContext {
20
20
  _ws?: unknown
21
21
  }
22
22
 
23
+ const CoreMessages = ['execute', 'cancel', 'getHistory', 'getSessions', 'getSessionsCount', 'deleteSession', 'getSessionById', 'clearHistory', 'searchHistory', 'new', 'autocomplete', 'readFile', 'ping', 'initTab', 'resumeSession', 'approve', 'reject', 'recordSelection', 'requestNotificationSummary'] as const;
24
+
25
+ const TerminalMessages = ['terminalInit', 'terminalReconnect', 'terminalList', 'terminalInput', 'terminalResize', 'terminalClose'] as const;
26
+
27
+ const FileExplorerMessages = ['listDirectory', 'writeFile', 'createFile', 'createDirectory', 'deleteFile', 'renameFile', 'notifyFileOpened', 'searchFileContents', 'cancelSearch', 'findDefinition'] as const;
28
+
29
+ const GitMessages = ['gitStatus', 'gitStage', 'gitUnstage', 'gitCommit', 'gitCommitWithAI', 'gitPush', 'gitPull', 'gitLog', 'gitDiscoverRepos', 'gitSetDirectory', 'gitGetRemoteInfo', 'gitCreatePR', 'gitGeneratePRDescription'] as const;
30
+
31
+ const GitBranchMessages = ['gitListBranches', 'gitCheckout', 'gitCreateBranch', 'gitDeleteBranch'] as const;
32
+
33
+ const GitDiffMessages = ['gitDiff', 'gitShowCommit', 'gitCommitDiff'] as const;
34
+
35
+ const GitTagMessages = ['gitListTags', 'gitCreateTag', 'gitPushTag'] as const;
36
+
37
+ const GitWorktreeMessages = ['gitWorktreeList', 'gitWorktreeCreate', 'gitWorktreeCreateAndAssign', 'gitWorktreeRemove', 'tabWorktreeSwitch', 'gitWorktreePush', 'gitWorktreeCreatePR'] as const;
38
+
39
+ const GitMergeMessages = ['gitMergePreview', 'gitWorktreeMerge', 'gitMergeAbort', 'gitMergeComplete'] as const;
40
+
41
+ const SessionSyncMessages = ['getActiveTabs', 'createTab', 'reorderTabs', 'syncTabMeta', 'syncPromptText', 'removeTab', 'markTabViewed'] as const;
42
+
43
+ const SettingsMessages = ['getSettings', 'updateSettings'] as const;
44
+
45
+ const QualityMessages = ['qualityDetectTools', 'qualityScan', 'qualityInstallTools', 'qualityCodeReview', 'qualityFixIssues', 'qualityLoadState', 'qualitySaveDirectories'] as const;
46
+
47
+ const FileUploadMessages = ['fileUploadStart', 'fileUploadChunk', 'fileUploadComplete', 'fileUploadCancel'] as const;
48
+
49
+ const PlanMessages = ['planInit', 'planGetState', 'planListIssues', 'planGetIssue', 'planGetSprint', 'planGetMilestone', 'planCreateIssue', 'planUpdateIssue', 'planDeleteIssue', 'planScaffold', 'planPrompt', 'planExecute', 'planExecuteEpic', 'planPause', 'planStop', 'planResume'] as const;
50
+
51
+ const PlanBoardMessages = ['planCreateBoard', 'planUpdateBoard', 'planArchiveBoard', 'planGetBoard', 'planGetBoardState', 'planReorderBoards', 'planSetActiveBoard', 'planGetBoardArtifacts'] as const;
52
+
53
+ const PlanSprintMessages = ['planCreateSprint', 'planActivateSprint', 'planCompleteSprint', 'planGetSprintArtifacts'] as const;
54
+
55
+ const DeployMessages = ['deployCreate', 'deployStop', 'deployResume', 'deployDelete', 'deployList', 'deployGetStatus', 'deployUpdateConfig', 'deploySetApiKey', 'deployValidateApiKey'] as const;
56
+
57
+ const DeployRelayMessages = ['deployHttpRequest', 'deployUsageReport', 'deployAiHealthUpdate'] as const;
58
+
59
+ const SkillMessages = ['listSkills', 'chatToBoard'] as const;
60
+
61
+ type WebSocketMessageType =
62
+ | typeof CoreMessages[number]
63
+ | typeof TerminalMessages[number]
64
+ | typeof FileExplorerMessages[number]
65
+ | typeof GitMessages[number]
66
+ | typeof GitBranchMessages[number]
67
+ | typeof GitDiffMessages[number]
68
+ | typeof GitTagMessages[number]
69
+ | typeof GitWorktreeMessages[number]
70
+ | typeof GitMergeMessages[number]
71
+ | typeof SessionSyncMessages[number]
72
+ | typeof SettingsMessages[number]
73
+ | typeof QualityMessages[number]
74
+ | typeof FileUploadMessages[number]
75
+ | typeof PlanMessages[number]
76
+ | typeof PlanBoardMessages[number]
77
+ | typeof PlanSprintMessages[number]
78
+ | typeof DeployMessages[number]
79
+ | typeof DeployRelayMessages[number]
80
+ | typeof SkillMessages[number];
81
+
23
82
  export interface WebSocketMessage {
24
- type:
25
- | 'execute'
26
- | 'cancel'
27
- | 'getHistory'
28
- | 'getSessions'
29
- | 'getSessionsCount'
30
- | 'deleteSession'
31
- | 'getSessionById'
32
- | 'clearHistory'
33
- | 'searchHistory'
34
- | 'new'
35
- | 'autocomplete'
36
- | 'readFile'
37
- | 'ping'
38
- | 'initTab'
39
- | 'resumeSession'
40
- | 'approve'
41
- | 'reject'
42
- | 'recordSelection'
43
- | 'requestNotificationSummary'
44
- | 'terminalInit'
45
- | 'terminalReconnect'
46
- | 'terminalList'
47
- | 'terminalInput'
48
- | 'terminalResize'
49
- | 'terminalClose'
50
- // File explorer message types
51
- | 'listDirectory'
52
- | 'writeFile'
53
- | 'createFile'
54
- | 'createDirectory'
55
- | 'deleteFile'
56
- | 'renameFile'
57
- | 'notifyFileOpened'
58
- | 'searchFileContents'
59
- | 'cancelSearch'
60
- | 'findDefinition'
61
- // Git message types
62
- | 'gitStatus'
63
- | 'gitStage'
64
- | 'gitUnstage'
65
- | 'gitCommit'
66
- | 'gitCommitWithAI'
67
- | 'gitPush'
68
- | 'gitPull'
69
- | 'gitLog'
70
- | 'gitDiscoverRepos'
71
- | 'gitSetDirectory'
72
- | 'gitGetRemoteInfo'
73
- | 'gitCreatePR'
74
- | 'gitGeneratePRDescription'
75
- // Branch operations
76
- | 'gitListBranches'
77
- | 'gitCheckout'
78
- | 'gitCreateBranch'
79
- | 'gitDeleteBranch'
80
- // Diff operations
81
- | 'gitDiff'
82
- // Commit detail operations
83
- | 'gitShowCommit'
84
- | 'gitCommitDiff'
85
- // Tag operations
86
- | 'gitListTags'
87
- | 'gitCreateTag'
88
- | 'gitPushTag'
89
- // Worktree operations
90
- | 'gitWorktreeList'
91
- | 'gitWorktreeCreate'
92
- | 'gitWorktreeCreateAndAssign'
93
- | 'gitWorktreeRemove'
94
- | 'tabWorktreeSwitch'
95
- | 'gitWorktreePush'
96
- | 'gitWorktreeCreatePR'
97
- // Merge operations
98
- | 'gitMergePreview'
99
- | 'gitWorktreeMerge'
100
- | 'gitMergeAbort'
101
- | 'gitMergeComplete'
102
- // Session sync message types
103
- | 'getActiveTabs'
104
- | 'createTab'
105
- | 'reorderTabs'
106
- | 'syncTabMeta'
107
- | 'syncPromptText'
108
- | 'removeTab'
109
- | 'markTabViewed'
110
- // Settings message types
111
- | 'getSettings'
112
- | 'updateSettings'
113
- // Quality message types
114
- | 'qualityDetectTools'
115
- | 'qualityScan'
116
- | 'qualityInstallTools'
117
- | 'qualityCodeReview'
118
- | 'qualityFixIssues'
119
- | 'qualityLoadState'
120
- | 'qualitySaveDirectories'
121
- // File upload message types (chunked remote uploads)
122
- | 'fileUploadStart'
123
- | 'fileUploadChunk'
124
- | 'fileUploadComplete'
125
- | 'fileUploadCancel'
126
- // Plan message types
127
- | 'planInit'
128
- | 'planGetState'
129
- | 'planListIssues'
130
- | 'planGetIssue'
131
- | 'planGetSprint'
132
- | 'planGetMilestone'
133
- | 'planCreateIssue'
134
- | 'planUpdateIssue'
135
- | 'planDeleteIssue'
136
- | 'planScaffold'
137
- | 'planPrompt'
138
- | 'planExecute'
139
- | 'planExecuteEpic'
140
- | 'planPause'
141
- | 'planStop'
142
- | 'planResume'
143
- // Board lifecycle message types
144
- | 'planCreateBoard'
145
- | 'planUpdateBoard'
146
- | 'planArchiveBoard'
147
- | 'planGetBoard'
148
- | 'planGetBoardState'
149
- | 'planReorderBoards'
150
- | 'planSetActiveBoard'
151
- | 'planGetBoardArtifacts'
152
- // Sprint lifecycle message types (legacy)
153
- | 'planCreateSprint'
154
- | 'planActivateSprint'
155
- | 'planCompleteSprint'
156
- | 'planGetSprintArtifacts'
157
- // Deploy message types
158
- | 'deployCreate'
159
- | 'deployStop'
160
- | 'deployResume'
161
- | 'deployDelete'
162
- | 'deployList'
163
- | 'deployGetStatus'
164
- | 'deployUpdateConfig'
165
- | 'deploySetApiKey'
166
- | 'deployValidateApiKey'
167
- // Deploy HTTP relay message types (server→cli)
168
- | 'deployHttpRequest'
169
- // Deploy usage/health message types (cli→server)
170
- | 'deployUsageReport'
171
- | 'deployAiHealthUpdate'
172
- // Skill discovery
173
- | 'listSkills'
174
- // Chat-to-board (cross-view skill actions)
175
- | 'chatToBoard';
83
+ type: WebSocketMessageType;
176
84
  tabId?: string;
177
85
  terminalId?: string;
178
- // biome-ignore lint/suspicious/noExplicitAny: message envelope carries heterogeneous payloads
86
+ // biome-ignore lint/suspicious/noExplicitAny: message envelope carries heterogeneous payloads — typed per-handler via destructuring
179
87
  data?: any;
180
88
  /** Injected by server relay for view-only shared users */
181
89
  _permission?: 'view';
182
90
  }
183
91
 
92
+ const CoreResponseMessages = ['output', 'thinking', 'movementStart', 'movementComplete', 'movementError', 'sessionUpdate', 'history', 'sessions', 'sessionsCount', 'sessionDeleted', 'sessionData', 'historyCleared', 'searchResults', 'newSession', 'autocomplete', 'fileContent', 'error', 'pong', 'tabInitialized', 'approvalRequired', 'toolUse', 'streamingTokens', 'notificationSummary'] as const;
93
+
94
+ const TerminalResponseMessages = ['terminalOutput', 'terminalReady', 'terminalExit', 'terminalError', 'terminalList', 'terminalScrollback', 'terminalCreated', 'terminalClosed'] as const;
95
+
96
+ const FileExplorerResponseMessages = ['directoryListing', 'fileWritten', 'fileCreated', 'directoryCreated', 'fileDeleted', 'fileRenamed', 'fileOpened', 'fileContentChanged', 'contentSearchResults', 'contentSearchComplete', 'contentSearchError', 'definitionResult', 'fileError'] as const;
97
+
98
+ const GitResponseMessages = ['gitStatus', 'gitStaged', 'gitUnstaged', 'gitCommitted', 'gitCommitMessage', 'gitPushed', 'gitPulled', 'gitLog', 'gitError', 'gitReposDiscovered', 'gitDirectorySet', 'gitRemoteInfo', 'gitPRCreated', 'gitPRDescription'] as const;
99
+
100
+ const GitBranchResponseMessages = ['gitBranchList', 'gitCheckedOut', 'gitBranchCreated', 'gitBranchDeleted'] as const;
101
+
102
+ const GitDiffResponseMessages = ['gitDiffResult', 'gitCommitDetail', 'gitCommitDiffResult'] as const;
103
+
104
+ const GitTagResponseMessages = ['gitTagList', 'gitTagCreated', 'gitTagPushed'] as const;
105
+
106
+ const GitWorktreeResponseMessages = ['gitWorktreeListResult', 'gitWorktreeCreated', 'gitWorktreeCreatedAndAssigned', 'gitWorktreeRemoved', 'tabWorktreeSwitched', 'gitBranchChanged', 'gitWorktreePushed', 'gitWorktreePRCreated'] as const;
107
+
108
+ const GitMergeResponseMessages = ['gitMergePreviewResult', 'gitWorktreeMergeResult', 'gitMergeAborted', 'gitMergeCompleted'] as const;
109
+
110
+ const SessionSyncResponseMessages = ['activeTabs', 'tabCreated', 'tabRemoved', 'tabRenamed', 'tabsReordered', 'promptTextSync', 'tabViewed', 'tabStateChanged'] as const;
111
+
112
+ const SettingsResponseMessages = ['settings', 'settingsUpdated'] as const;
113
+
114
+ const QualityResponseMessages = ['qualityToolsDetected', 'qualityScanProgress', 'qualityScanResults', 'qualityInstallProgress', 'qualityInstallComplete', 'qualityCodeReview', 'qualityCodeReviewProgress', 'qualityPostSession', 'qualityFixProgress', 'qualityFixComplete', 'qualityError', 'qualityStateLoaded'] as const;
115
+
116
+ const FileUploadResponseMessages = ['fileUploadAck', 'fileUploadReady', 'fileUploadError'] as const;
117
+
118
+ const PlanResponseMessages = ['planState', 'planIssueList', 'planIssue', 'planSprint', 'planMilestone', 'planNotFound', 'planStateUpdated', 'planIssueUpdated', 'planIssueCreated', 'planIssueDeleted', 'planScaffolded', 'planPromptStreaming', 'planPromptProgress', 'planPromptResponse', 'planExecutionStarted', 'planExecutionProgress', 'planExecutionOutput', 'planExecutionMetrics', 'planExecutionComplete', 'planExecutionError', 'planError'] as const;
119
+
120
+ const PlanBoardResponseMessages = ['planBoardCreated', 'planBoardUpdated', 'planBoardArchived', 'planBoardState', 'planBoardArtifacts', 'planWorkspaceUpdated'] as const;
121
+
122
+ const PlanSprintResponseMessages = ['planSprintCreated', 'planSprintUpdated', 'planSprintCompleted', 'planSprintArtifacts', 'planReviewProgress'] as const;
123
+
124
+ const DeployResponseMessages = ['deployCreated', 'deployStopped', 'deployResumed', 'deployDeleted', 'deployListResult', 'deployStatusResult', 'deployConfigUpdated', 'deployApiKeyStatus', 'deployError'] as const;
125
+
126
+ const DeployRelayResponseMessages = ['deployHttpResponse', 'deployHttpResponseChunk', 'deployStatus', 'deployUsageReportAck', 'deployAiHealthAck'] as const;
127
+
128
+ const SkillResponseMessages = ['skillsList', 'chatToBoardCreated'] as const;
129
+
130
+ type WebSocketResponseType =
131
+ | typeof CoreResponseMessages[number]
132
+ | typeof TerminalResponseMessages[number]
133
+ | typeof FileExplorerResponseMessages[number]
134
+ | typeof GitResponseMessages[number]
135
+ | typeof GitBranchResponseMessages[number]
136
+ | typeof GitDiffResponseMessages[number]
137
+ | typeof GitTagResponseMessages[number]
138
+ | typeof GitWorktreeResponseMessages[number]
139
+ | typeof GitMergeResponseMessages[number]
140
+ | typeof SessionSyncResponseMessages[number]
141
+ | typeof SettingsResponseMessages[number]
142
+ | typeof QualityResponseMessages[number]
143
+ | typeof FileUploadResponseMessages[number]
144
+ | typeof PlanResponseMessages[number]
145
+ | typeof PlanBoardResponseMessages[number]
146
+ | typeof PlanSprintResponseMessages[number]
147
+ | typeof DeployResponseMessages[number]
148
+ | typeof DeployRelayResponseMessages[number]
149
+ | typeof SkillResponseMessages[number];
150
+
184
151
  export interface WebSocketResponse {
185
- type:
186
- | 'output'
187
- | 'thinking'
188
- | 'movementStart'
189
- | 'movementComplete'
190
- | 'movementError'
191
- | 'sessionUpdate'
192
- | 'history'
193
- | 'sessions'
194
- | 'sessionsCount'
195
- | 'sessionDeleted'
196
- | 'sessionData'
197
- | 'historyCleared'
198
- | 'searchResults'
199
- | 'newSession'
200
- | 'autocomplete'
201
- | 'fileContent'
202
- | 'error'
203
- | 'pong'
204
- | 'tabInitialized'
205
- | 'approvalRequired'
206
- | 'toolUse'
207
- | 'streamingTokens'
208
- | 'notificationSummary'
209
- | 'terminalOutput'
210
- | 'terminalReady'
211
- | 'terminalExit'
212
- | 'terminalError'
213
- | 'terminalList'
214
- // File explorer response types
215
- | 'directoryListing'
216
- | 'fileWritten'
217
- | 'fileCreated'
218
- | 'directoryCreated'
219
- | 'fileDeleted'
220
- | 'fileRenamed'
221
- | 'fileOpened'
222
- | 'fileContentChanged'
223
- | 'contentSearchResults'
224
- | 'contentSearchComplete'
225
- | 'contentSearchError'
226
- | 'definitionResult'
227
- | 'fileError'
228
- | 'terminalScrollback'
229
- // Terminal sync response types
230
- | 'terminalCreated'
231
- | 'terminalClosed'
232
- // Git response types
233
- | 'gitStatus'
234
- | 'gitStaged'
235
- | 'gitUnstaged'
236
- | 'gitCommitted'
237
- | 'gitCommitMessage'
238
- | 'gitPushed'
239
- | 'gitPulled'
240
- | 'gitLog'
241
- | 'gitError'
242
- | 'gitReposDiscovered'
243
- | 'gitDirectorySet'
244
- | 'gitRemoteInfo'
245
- | 'gitPRCreated'
246
- | 'gitPRDescription'
247
- // Branch response types
248
- | 'gitBranchList'
249
- | 'gitCheckedOut'
250
- | 'gitBranchCreated'
251
- | 'gitBranchDeleted'
252
- // Diff response types
253
- | 'gitDiffResult'
254
- // Commit detail response types
255
- | 'gitCommitDetail'
256
- | 'gitCommitDiffResult'
257
- // Tag response types
258
- | 'gitTagList'
259
- | 'gitTagCreated'
260
- | 'gitTagPushed'
261
- // Worktree response types
262
- | 'gitWorktreeListResult'
263
- | 'gitWorktreeCreated'
264
- | 'gitWorktreeCreatedAndAssigned'
265
- | 'gitWorktreeRemoved'
266
- | 'tabWorktreeSwitched'
267
- | 'gitBranchChanged'
268
- | 'gitWorktreePushed'
269
- | 'gitWorktreePRCreated'
270
- // Merge response types
271
- | 'gitMergePreviewResult'
272
- | 'gitWorktreeMergeResult'
273
- | 'gitMergeAborted'
274
- | 'gitMergeCompleted'
275
- // Session sync response types
276
- | 'activeTabs'
277
- | 'tabCreated'
278
- | 'tabRemoved'
279
- | 'tabRenamed'
280
- | 'tabsReordered'
281
- | 'promptTextSync'
282
- | 'tabViewed'
283
- | 'tabStateChanged'
284
- // Settings response types
285
- | 'settings'
286
- | 'settingsUpdated'
287
- // Quality response types
288
- | 'qualityToolsDetected'
289
- | 'qualityScanProgress'
290
- | 'qualityScanResults'
291
- | 'qualityInstallProgress'
292
- | 'qualityInstallComplete'
293
- | 'qualityCodeReview'
294
- | 'qualityCodeReviewProgress'
295
- | 'qualityPostSession'
296
- | 'qualityFixProgress'
297
- | 'qualityFixComplete'
298
- | 'qualityError'
299
- | 'qualityStateLoaded'
300
- // File upload response types
301
- | 'fileUploadAck'
302
- | 'fileUploadReady'
303
- | 'fileUploadError'
304
- // Plan response types
305
- | 'planState'
306
- | 'planIssueList'
307
- | 'planIssue'
308
- | 'planSprint'
309
- | 'planMilestone'
310
- | 'planNotFound'
311
- | 'planStateUpdated'
312
- | 'planIssueUpdated'
313
- | 'planIssueCreated'
314
- | 'planIssueDeleted'
315
- | 'planScaffolded'
316
- | 'planPromptStreaming'
317
- | 'planPromptProgress'
318
- | 'planPromptResponse'
319
- | 'planExecutionStarted'
320
- | 'planExecutionProgress'
321
- | 'planExecutionOutput'
322
- | 'planExecutionMetrics'
323
- | 'planExecutionComplete'
324
- | 'planExecutionError'
325
- | 'planError'
326
- // Board lifecycle response types
327
- | 'planBoardCreated'
328
- | 'planBoardUpdated'
329
- | 'planBoardArchived'
330
- | 'planBoardState'
331
- | 'planBoardArtifacts'
332
- | 'planWorkspaceUpdated'
333
- // Sprint lifecycle response types (legacy)
334
- | 'planSprintCreated'
335
- | 'planSprintUpdated'
336
- | 'planSprintCompleted'
337
- | 'planSprintArtifacts'
338
- | 'planReviewProgress'
339
- // Deploy response types
340
- | 'deployCreated'
341
- | 'deployStopped'
342
- | 'deployResumed'
343
- | 'deployDeleted'
344
- | 'deployListResult'
345
- | 'deployStatusResult'
346
- | 'deployConfigUpdated'
347
- | 'deployApiKeyStatus'
348
- | 'deployError'
349
- // Deploy HTTP relay response types (cli→server)
350
- | 'deployHttpResponse'
351
- | 'deployHttpResponseChunk'
352
- | 'deployStatus'
353
- | 'deployUsageReportAck'
354
- | 'deployAiHealthAck'
355
- // Skill discovery response types
356
- | 'skillsList'
357
- // Chat-to-board response types
358
- | 'chatToBoardCreated';
152
+ type: WebSocketResponseType;
359
153
  tabId?: string;
360
154
  terminalId?: string;
361
- // biome-ignore lint/suspicious/noExplicitAny: message envelope carries heterogeneous payloads
155
+ // biome-ignore lint/suspicious/noExplicitAny: message envelope carries heterogeneous payloads — typed per-handler via destructuring
362
156
  data?: any;
363
157
  }
364
158
 
@@ -371,7 +165,7 @@ export interface SkillEntry {
371
165
  name: string;
372
166
  displayName: string;
373
167
  description: string;
374
- source: 'project' | 'system' | 'builtin';
168
+ source: 'project' | 'user' | 'system' | 'builtin' | 'platform';
375
169
  }
376
170
 
377
171
  // Extended autocomplete option with metadata