@wrongstack/webui-server 0.292.1 → 0.295.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +18753 -14274
  4. package/dist/index.js.map +4 -4
  5. package/dist/protocol/client-conversation.d.ts +3 -0
  6. package/dist/protocol/client-conversation.d.ts.map +1 -0
  7. package/dist/protocol/client-integrations.d.ts +3 -0
  8. package/dist/protocol/client-integrations.d.ts.map +1 -0
  9. package/dist/protocol/client-operations.d.ts +3 -0
  10. package/dist/protocol/client-operations.d.ts.map +1 -0
  11. package/dist/protocol/client-workspace.d.ts +3 -0
  12. package/dist/protocol/client-workspace.d.ts.map +1 -0
  13. package/dist/protocol/connection-fsm.d.ts +39 -0
  14. package/dist/protocol/connection-fsm.d.ts.map +1 -0
  15. package/dist/protocol/decoder.d.ts +6 -0
  16. package/dist/protocol/decoder.d.ts.map +1 -0
  17. package/dist/protocol/index.d.ts +7 -0
  18. package/dist/protocol/index.d.ts.map +1 -0
  19. package/dist/protocol/index.js +842 -0
  20. package/dist/protocol/index.js.map +7 -0
  21. package/dist/protocol/projections.d.ts +111 -0
  22. package/dist/protocol/projections.d.ts.map +1 -0
  23. package/dist/protocol/registry.d.ts +6 -0
  24. package/dist/protocol/registry.d.ts.map +1 -0
  25. package/dist/protocol/server-conversation.d.ts +3 -0
  26. package/dist/protocol/server-conversation.d.ts.map +1 -0
  27. package/dist/protocol/server-integrations.d.ts +3 -0
  28. package/dist/protocol/server-integrations.d.ts.map +1 -0
  29. package/dist/protocol/server-operations.d.ts +4 -0
  30. package/dist/protocol/server-operations.d.ts.map +1 -0
  31. package/dist/protocol/server-workspace.d.ts +3 -0
  32. package/dist/protocol/server-workspace.d.ts.map +1 -0
  33. package/dist/protocol/types.d.ts +24 -0
  34. package/dist/protocol/types.d.ts.map +1 -0
  35. package/dist/protocol/version.d.ts +20 -0
  36. package/dist/protocol/version.d.ts.map +1 -0
  37. package/dist/server/agent-roster-handlers.d.ts +27 -0
  38. package/dist/server/agent-roster-handlers.d.ts.map +1 -0
  39. package/dist/server/agent-roster-routes.d.ts +8 -0
  40. package/dist/server/agent-roster-routes.d.ts.map +1 -0
  41. package/dist/server/autonomy-routes.d.ts +9 -0
  42. package/dist/server/autonomy-routes.d.ts.map +1 -0
  43. package/dist/server/backend-services.d.ts +19 -6
  44. package/dist/server/backend-services.d.ts.map +1 -1
  45. package/dist/server/boot.d.ts +4 -1
  46. package/dist/server/boot.d.ts.map +1 -1
  47. package/dist/server/brain-handlers.d.ts +47 -0
  48. package/dist/server/brain-handlers.d.ts.map +1 -0
  49. package/dist/server/chronicle-routes.d.ts +12 -0
  50. package/dist/server/chronicle-routes.d.ts.map +1 -0
  51. package/dist/server/client-presence.d.ts +26 -0
  52. package/dist/server/client-presence.d.ts.map +1 -0
  53. package/dist/server/client-transport-routes.d.ts +8 -0
  54. package/dist/server/client-transport-routes.d.ts.map +1 -0
  55. package/dist/server/codebase-indexing.d.ts +3 -1
  56. package/dist/server/codebase-indexing.d.ts.map +1 -1
  57. package/dist/server/codemap-telemetry.d.ts.map +1 -1
  58. package/dist/server/collaboration-ws-handler.d.ts +3 -1
  59. package/dist/server/collaboration-ws-handler.d.ts.map +1 -1
  60. package/dist/server/completion-handlers.d.ts +2 -1
  61. package/dist/server/completion-handlers.d.ts.map +1 -1
  62. package/dist/server/completion-routes.d.ts +7 -0
  63. package/dist/server/completion-routes.d.ts.map +1 -0
  64. package/dist/server/config-doctor.d.ts +11 -0
  65. package/dist/server/config-doctor.d.ts.map +1 -0
  66. package/dist/server/connection-handler.d.ts +8 -46
  67. package/dist/server/connection-handler.d.ts.map +1 -1
  68. package/dist/server/connection-lifecycle.d.ts +43 -0
  69. package/dist/server/connection-lifecycle.d.ts.map +1 -0
  70. package/dist/server/content-routes.d.ts +15 -0
  71. package/dist/server/content-routes.d.ts.map +1 -0
  72. package/dist/server/conversation-operations.d.ts +28 -0
  73. package/dist/server/conversation-operations.d.ts.map +1 -0
  74. package/dist/server/conversation-routes.d.ts +10 -0
  75. package/dist/server/conversation-routes.d.ts.map +1 -0
  76. package/dist/server/custom-context-modes.d.ts +1 -1
  77. package/dist/server/custom-context-modes.d.ts.map +1 -1
  78. package/dist/server/design-handlers.d.ts +8 -0
  79. package/dist/server/design-handlers.d.ts.map +1 -1
  80. package/dist/server/discover-mailbox-bridge.d.ts.map +1 -1
  81. package/dist/server/embedded-host-adapters.d.ts +96 -0
  82. package/dist/server/embedded-host-adapters.d.ts.map +1 -0
  83. package/dist/server/embedded-lifecycle.d.ts +113 -0
  84. package/dist/server/embedded-lifecycle.d.ts.map +1 -0
  85. package/dist/server/embedded-message-router.d.ts +64 -0
  86. package/dist/server/embedded-message-router.d.ts.map +1 -0
  87. package/dist/server/entry.js +16641 -14023
  88. package/dist/server/entry.js.map +4 -4
  89. package/dist/server/eternal-iteration-broadcast.d.ts +1 -1
  90. package/dist/server/eternal-iteration-broadcast.d.ts.map +1 -1
  91. package/dist/server/file-handlers.d.ts.map +1 -1
  92. package/dist/server/frontend-static-serve.d.ts +133 -0
  93. package/dist/server/frontend-static-serve.d.ts.map +1 -0
  94. package/dist/server/git-process.d.ts +4 -0
  95. package/dist/server/git-process.d.ts.map +1 -0
  96. package/dist/server/goal-snapshot-routes.d.ts +7 -0
  97. package/dist/server/goal-snapshot-routes.d.ts.map +1 -0
  98. package/dist/server/goal-ws-handler.d.ts +3 -1
  99. package/dist/server/goal-ws-handler.d.ts.map +1 -1
  100. package/dist/server/handlers/worklist-handlers.d.ts +14 -20
  101. package/dist/server/handlers/worklist-handlers.d.ts.map +1 -1
  102. package/dist/server/handlers.js +150 -121
  103. package/dist/server/handlers.js.map +3 -3
  104. package/dist/server/host-routes.d.ts +7 -0
  105. package/dist/server/host-routes.d.ts.map +1 -0
  106. package/dist/server/http-server/analytics-handler.d.ts +2 -0
  107. package/dist/server/http-server/analytics-handler.d.ts.map +1 -1
  108. package/dist/server/http-server/api-handlers.d.ts.map +1 -1
  109. package/dist/server/http-server.d.ts +20 -23
  110. package/dist/server/http-server.d.ts.map +1 -1
  111. package/dist/server/index.d.ts +55 -22
  112. package/dist/server/index.d.ts.map +1 -1
  113. package/dist/server/instance-registry.d.ts +1 -3
  114. package/dist/server/instance-registry.d.ts.map +1 -1
  115. package/dist/server/introspection-routes.d.ts +19 -0
  116. package/dist/server/introspection-routes.d.ts.map +1 -0
  117. package/dist/server/kanban-dispatch.d.ts +41 -0
  118. package/dist/server/kanban-dispatch.d.ts.map +1 -0
  119. package/dist/server/kanban-host-routes.d.ts +10 -0
  120. package/dist/server/kanban-host-routes.d.ts.map +1 -0
  121. package/dist/server/kanban-routes.d.ts +5 -3
  122. package/dist/server/kanban-routes.d.ts.map +1 -1
  123. package/dist/server/kanban-run-mirror.d.ts +76 -0
  124. package/dist/server/kanban-run-mirror.d.ts.map +1 -0
  125. package/dist/server/kanban-supervisor.d.ts +47 -0
  126. package/dist/server/kanban-supervisor.d.ts.map +1 -0
  127. package/dist/server/mailbox-handlers.d.ts +12 -4
  128. package/dist/server/mailbox-handlers.d.ts.map +1 -1
  129. package/dist/server/mailbox-routes.d.ts +8 -0
  130. package/dist/server/mailbox-routes.d.ts.map +1 -1
  131. package/dist/server/mcp-handlers.d.ts +4 -0
  132. package/dist/server/mcp-handlers.d.ts.map +1 -1
  133. package/dist/server/memory-handlers.d.ts +54 -46
  134. package/dist/server/memory-handlers.d.ts.map +1 -1
  135. package/dist/server/memory-routes.d.ts +11 -0
  136. package/dist/server/memory-routes.d.ts.map +1 -0
  137. package/dist/server/message-dispatcher.d.ts +3 -4
  138. package/dist/server/message-dispatcher.d.ts.map +1 -1
  139. package/dist/server/mode-handlers.d.ts +6 -15
  140. package/dist/server/mode-handlers.d.ts.map +1 -1
  141. package/dist/server/mode-operations.d.ts +24 -0
  142. package/dist/server/mode-operations.d.ts.map +1 -0
  143. package/dist/server/mode-routes.d.ts +2 -0
  144. package/dist/server/mode-routes.d.ts.map +1 -1
  145. package/dist/server/model-auto-discovery.d.ts +1 -1
  146. package/dist/server/model-auto-discovery.d.ts.map +1 -1
  147. package/dist/server/model-catalog.d.ts +1 -1
  148. package/dist/server/model-catalog.d.ts.map +1 -1
  149. package/dist/server/model-operations.d.ts +29 -0
  150. package/dist/server/model-operations.d.ts.map +1 -0
  151. package/dist/server/path-containment.d.ts.map +1 -1
  152. package/dist/server/port-utils.d.ts +18 -25
  153. package/dist/server/port-utils.d.ts.map +1 -1
  154. package/dist/server/pre-context-services.d.ts +32 -5
  155. package/dist/server/pre-context-services.d.ts.map +1 -1
  156. package/dist/server/pref-helpers.d.ts +2 -4
  157. package/dist/server/pref-helpers.d.ts.map +1 -1
  158. package/dist/server/prefs-handlers.d.ts +22 -0
  159. package/dist/server/prefs-handlers.d.ts.map +1 -0
  160. package/dist/server/prefs-routes.d.ts +5 -0
  161. package/dist/server/prefs-routes.d.ts.map +1 -1
  162. package/dist/server/privileged-actions.d.ts +16 -0
  163. package/dist/server/privileged-actions.d.ts.map +1 -0
  164. package/dist/server/process-handlers.d.ts +8 -6
  165. package/dist/server/process-handlers.d.ts.map +1 -1
  166. package/dist/server/process-routes.d.ts +9 -0
  167. package/dist/server/process-routes.d.ts.map +1 -0
  168. package/dist/server/project-handlers.d.ts +25 -33
  169. package/dist/server/project-handlers.d.ts.map +1 -1
  170. package/dist/server/projects-manifest.d.ts +8 -0
  171. package/dist/server/projects-manifest.d.ts.map +1 -1
  172. package/dist/server/prompts-handlers.d.ts +2 -1
  173. package/dist/server/prompts-handlers.d.ts.map +1 -1
  174. package/dist/server/provider-config-io.d.ts +2 -2
  175. package/dist/server/provider-config-io.d.ts.map +1 -1
  176. package/dist/server/provider-config-standalone.d.ts +5 -3
  177. package/dist/server/provider-config-standalone.d.ts.map +1 -1
  178. package/dist/server/provider-handlers.d.ts +63 -6
  179. package/dist/server/provider-handlers.d.ts.map +1 -1
  180. package/dist/server/provider-keys.d.ts +1 -1
  181. package/dist/server/provider-keys.d.ts.map +1 -1
  182. package/dist/server/provider-routes.d.ts +28 -2
  183. package/dist/server/provider-routes.d.ts.map +1 -1
  184. package/dist/server/provider-store.d.ts +5 -4
  185. package/dist/server/provider-store.d.ts.map +1 -1
  186. package/dist/server/route-family-dispatcher.d.ts +71 -0
  187. package/dist/server/route-family-dispatcher.d.ts.map +1 -0
  188. package/dist/server/routes.d.ts +17 -7
  189. package/dist/server/routes.d.ts.map +1 -1
  190. package/dist/server/sdd-board-ws-handler.d.ts +5 -1
  191. package/dist/server/sdd-board-ws-handler.d.ts.map +1 -1
  192. package/dist/server/sdd-wizard-wiring.d.ts +8 -3
  193. package/dist/server/sdd-wizard-wiring.d.ts.map +1 -1
  194. package/dist/server/sdd-wizard-ws-handler.d.ts.map +1 -1
  195. package/dist/server/server-runtime.d.ts +16 -12
  196. package/dist/server/server-runtime.d.ts.map +1 -1
  197. package/dist/server/session-handlers.d.ts +30 -11
  198. package/dist/server/session-handlers.d.ts.map +1 -1
  199. package/dist/server/session-history.d.ts +1 -1
  200. package/dist/server/session-history.d.ts.map +1 -1
  201. package/dist/server/setup-event-projection.d.ts +10 -0
  202. package/dist/server/setup-event-projection.d.ts.map +1 -0
  203. package/dist/server/setup-events-watcher.d.ts +13 -0
  204. package/dist/server/setup-events-watcher.d.ts.map +1 -0
  205. package/dist/server/setup-events.d.ts +11 -21
  206. package/dist/server/setup-events.d.ts.map +1 -1
  207. package/dist/server/setup-screen.d.ts +2 -1
  208. package/dist/server/setup-screen.d.ts.map +1 -1
  209. package/dist/server/shell-open.d.ts +26 -2
  210. package/dist/server/shell-open.d.ts.map +1 -1
  211. package/dist/server/skills-handlers.d.ts +2 -2
  212. package/dist/server/skills-handlers.d.ts.map +1 -1
  213. package/dist/server/specs-ws-handler.d.ts.map +1 -1
  214. package/dist/server/standalone-session-identity.d.ts +3 -2
  215. package/dist/server/standalone-session-identity.d.ts.map +1 -1
  216. package/dist/server/start-webui.d.ts +9 -1
  217. package/dist/server/start-webui.d.ts.map +1 -1
  218. package/dist/server/stream-coalescer.d.ts +49 -0
  219. package/dist/server/stream-coalescer.d.ts.map +1 -0
  220. package/dist/server/techstack-handlers.d.ts +12 -2
  221. package/dist/server/techstack-handlers.d.ts.map +1 -1
  222. package/dist/server/terminal-ws-handler.d.ts +5 -3
  223. package/dist/server/terminal-ws-handler.d.ts.map +1 -1
  224. package/dist/server/types.d.ts +10 -3
  225. package/dist/server/types.d.ts.map +1 -1
  226. package/dist/server/worklist-routes.d.ts +21 -0
  227. package/dist/server/worklist-routes.d.ts.map +1 -0
  228. package/dist/server/worktree-routes.d.ts +10 -0
  229. package/dist/server/worktree-routes.d.ts.map +1 -0
  230. package/dist/server/worktree-ws-handler.d.ts +2 -1
  231. package/dist/server/worktree-ws-handler.d.ts.map +1 -1
  232. package/dist/server/ws-payload-validation.d.ts +11 -0
  233. package/dist/server/ws-payload-validation.d.ts.map +1 -1
  234. package/dist/server/ws-utils.d.ts +8 -0
  235. package/dist/server/ws-utils.d.ts.map +1 -1
  236. package/package.json +14 -10
@@ -0,0 +1,842 @@
1
+ // src/protocol/connection-fsm.ts
2
+ var DEFAULT_SURFACE_CONNECTION_CONFIG = {
3
+ maxReconnectAttempts: 10,
4
+ initialBackoffMs: 1e3,
5
+ maxBackoffMs: 3e4,
6
+ backoffMultiplier: 2,
7
+ jitterRatio: 0,
8
+ queueLimit: 1e3,
9
+ heartbeatIntervalMs: 0,
10
+ heartbeatTimeoutMs: 0
11
+ };
12
+ function createSurfaceConnectionState() {
13
+ return { phase: "idle", reconnectAttempt: 0, lastActivityAt: null, stopped: false };
14
+ }
15
+ function markConnectionConnecting(state) {
16
+ if (state.stopped) return state;
17
+ return { ...state, phase: "connecting" };
18
+ }
19
+ function markConnectionOpen(state, now = Date.now()) {
20
+ return {
21
+ ...state,
22
+ phase: "open",
23
+ reconnectAttempt: 0,
24
+ lastActivityAt: now,
25
+ stopped: false
26
+ };
27
+ }
28
+ function markConnectionActivity(state, now = Date.now()) {
29
+ return { ...state, lastActivityAt: now };
30
+ }
31
+ function stopConnection(state) {
32
+ return { ...state, phase: "closed", stopped: true };
33
+ }
34
+ function resetConnection(state) {
35
+ return { ...state, phase: "idle", reconnectAttempt: 0, stopped: false };
36
+ }
37
+ function planConnectionReconnect(state, config, now = Date.now(), random = Math.random) {
38
+ if (state.stopped || state.reconnectAttempt >= config.maxReconnectAttempts) {
39
+ return { state: { ...state, phase: "closed" }, plan: null };
40
+ }
41
+ const attempt = state.reconnectAttempt + 1;
42
+ const base = Math.min(
43
+ config.initialBackoffMs * config.backoffMultiplier ** (attempt - 1),
44
+ config.maxBackoffMs
45
+ );
46
+ const centeredJitter = (random() * 2 - 1) * config.jitterRatio;
47
+ const delayMs = Math.max(0, Math.round(base * (1 + centeredJitter)));
48
+ return {
49
+ state: { ...state, phase: "reconnecting", reconnectAttempt: attempt },
50
+ plan: { attempt, delayMs, retryAt: now + delayMs }
51
+ };
52
+ }
53
+ function isConnectionHeartbeatTimedOut(state, config, now = Date.now()) {
54
+ if (state.phase !== "open" || state.lastActivityAt === null) return false;
55
+ if (config.heartbeatIntervalMs <= 0) return false;
56
+ return now - state.lastActivityAt > config.heartbeatIntervalMs + config.heartbeatTimeoutMs;
57
+ }
58
+ function enqueueBounded(queue, item, limit) {
59
+ if (limit <= 0) return { queue: [], dropped: item };
60
+ if (queue.length < limit) return { queue: [...queue, item], dropped: null };
61
+ return { queue: [...queue.slice(queue.length - limit + 1), item], dropped: queue[0] ?? null };
62
+ }
63
+
64
+ // src/protocol/client-conversation.ts
65
+ var CLIENT_CONVERSATION_MESSAGE_TYPES = [
66
+ "abort",
67
+ "ping",
68
+ "user_message",
69
+ "tool.confirm_result",
70
+ "completion.request",
71
+ "model.switch",
72
+ "model.refine",
73
+ "autonomy.switch",
74
+ "context.clear",
75
+ "context.compact",
76
+ "context.debug",
77
+ "context.mode.create",
78
+ "context.mode.delete",
79
+ "context.mode.switch",
80
+ "context.mode.update",
81
+ "context.modes.list",
82
+ "context.repair",
83
+ "mode.switch",
84
+ "modes.list",
85
+ "session.checkpoints",
86
+ "session.delete",
87
+ "session.new",
88
+ "session.rename",
89
+ "session.resume",
90
+ "session.rewind",
91
+ "session.save",
92
+ "sessions.list",
93
+ "side_effects.list",
94
+ "stats.get",
95
+ "todo.update",
96
+ "todos.clear",
97
+ "todos.get",
98
+ "todos.remove"
99
+ ];
100
+ var CLIENT_COLLABORATION_MESSAGE_TYPES = [
101
+ "collab.join",
102
+ "collab.leave",
103
+ "collab.annotate",
104
+ "collab.resolve",
105
+ "collab.request_pause",
106
+ "collab.resume",
107
+ "collab.grant_control",
108
+ "collab.inject_tool",
109
+ "mailbox.agents",
110
+ "mailbox.clear",
111
+ "mailbox.compact",
112
+ "mailbox.messages",
113
+ "mailbox.purge",
114
+ "mailbox.send"
115
+ ];
116
+
117
+ // src/protocol/client-integrations.ts
118
+ var CLIENT_KNOWLEDGE_MESSAGE_TYPES = [
119
+ "brain.ask",
120
+ "brain.config.get",
121
+ "brain.config.set",
122
+ "brain.risk",
123
+ "brain.status",
124
+ "chronicle.facet",
125
+ "chronicle.facets",
126
+ "chronicle.graph",
127
+ "chronicle.query",
128
+ "config.doctor",
129
+ "design.list",
130
+ "design.materialize",
131
+ "design.set",
132
+ "design.state",
133
+ "design.swap",
134
+ "design.tune",
135
+ "design.use",
136
+ "design.verify",
137
+ "memory.list",
138
+ "memory.sage.backfillRecoverable",
139
+ "memory.sage.candidateResolve",
140
+ "memory.sage.delete",
141
+ "memory.sage.forFile",
142
+ "memory.sage.get",
143
+ "memory.sage.graph",
144
+ "memory.sage.list",
145
+ "memory.sage.listPage",
146
+ "memory.sage.recover",
147
+ "memory.sage.remember",
148
+ "memory.sage.update"
149
+ ];
150
+ var CLIENT_EXTENSION_MESSAGE_TYPES = [
151
+ "auth.oauth.cancel",
152
+ "auth.oauth.code",
153
+ "auth.oauth.start",
154
+ "mcp.add",
155
+ "mcp.disable",
156
+ "mcp.discover",
157
+ "mcp.enable",
158
+ "mcp.list",
159
+ "mcp.prompt.get",
160
+ "mcp.prompts",
161
+ "mcp.remove",
162
+ "mcp.resource.read",
163
+ "mcp.resources",
164
+ "mcp.restart",
165
+ "mcp.sleep",
166
+ "mcp.update",
167
+ "mcp.wake",
168
+ "prompts.content",
169
+ "prompts.create",
170
+ "prompts.favorite",
171
+ "prompts.list",
172
+ "prompts.recent",
173
+ "prompts.search",
174
+ "prompts.used",
175
+ "skills.content",
176
+ "skills.create",
177
+ "skills.edit",
178
+ "skills.export",
179
+ "skills.install",
180
+ "skills.list",
181
+ "skills.uninstall",
182
+ "skills.update"
183
+ ];
184
+
185
+ // src/protocol/client-operations.ts
186
+ var CLIENT_GOAL_MESSAGE_TYPES = [
187
+ "goal-state.get",
188
+ "goal.addTask",
189
+ "goal.assignTask",
190
+ "goal.clear",
191
+ "goal.get",
192
+ "goal.list",
193
+ "goal.load",
194
+ "goal.moveTask",
195
+ "goal.pause",
196
+ "goal.resume",
197
+ "goal.retryTask",
198
+ "goal.revert",
199
+ "goal.runTask",
200
+ "goal.save",
201
+ "goal.selectPhase",
202
+ "goal.start",
203
+ "goal.state",
204
+ "goal.status",
205
+ "goal.stop",
206
+ "goal.taskStatus",
207
+ "goal.toggleAutonomous",
208
+ "plan.get",
209
+ "plan.item.update",
210
+ "plan.template_use",
211
+ "task.update",
212
+ "tasks.get"
213
+ ];
214
+ var CLIENT_SDD_MESSAGE_TYPES = [
215
+ "sdd.board.cancel_task",
216
+ "sdd.board.cleanup_worktrees",
217
+ "sdd.board.delete_task",
218
+ "sdd.board.destroy",
219
+ "sdd.board.get",
220
+ "sdd.board.list",
221
+ "sdd.board.pause",
222
+ "sdd.board.reassign",
223
+ "sdd.board.resume",
224
+ "sdd.board.retry",
225
+ "sdd.board.retry_all_failed",
226
+ "sdd.board.rollback",
227
+ "sdd.board.set_task_fallbacks",
228
+ "sdd.board.set_task_model",
229
+ "sdd.board.set_task_verification",
230
+ "sdd.board.split_task",
231
+ "sdd.board.stop",
232
+ "sdd.run.start",
233
+ "sdd.spec.approve",
234
+ "sdd.spec.get",
235
+ "sdd.spec.message",
236
+ "sdd.spec.start",
237
+ "specs.get",
238
+ "specs.list",
239
+ "specs.taskStatus"
240
+ ];
241
+
242
+ // src/protocol/client-workspace.ts
243
+ var CLIENT_WORKSPACE_MESSAGE_TYPES = [
244
+ "files.list",
245
+ "files.read",
246
+ "files.tree",
247
+ "files.write",
248
+ "git.changes",
249
+ "git.diff",
250
+ "git.info",
251
+ "projects.add",
252
+ "projects.list",
253
+ "projects.select",
254
+ "working_dir.set",
255
+ "worktree.cleanup",
256
+ "worktree.diff",
257
+ "worktree.merge",
258
+ "worktree.remove",
259
+ "worktree.scan",
260
+ "shell.open",
261
+ "process.kill",
262
+ "process.killAll",
263
+ "process.list",
264
+ "terminal.close",
265
+ "terminal.create",
266
+ "terminal.input",
267
+ "terminal.resize"
268
+ ];
269
+ var CLIENT_CONFIGURATION_MESSAGE_TYPES = [
270
+ "diag.get",
271
+ "key.add",
272
+ "key.delete",
273
+ "key.set_active",
274
+ "key.update",
275
+ "prefs.get",
276
+ "prefs.update",
277
+ "provider.add",
278
+ "provider.clear_models",
279
+ "provider.models",
280
+ "provider.probe",
281
+ "provider.remove",
282
+ "provider.undo_clear",
283
+ "provider.update",
284
+ "providers.list",
285
+ "providers.saved",
286
+ "tool.disable",
287
+ "tool.enable",
288
+ "tools.list",
289
+ "webui.shutdown"
290
+ ];
291
+
292
+ // src/protocol/server-conversation.ts
293
+ var SERVER_CONVERSATION_MESSAGE_TYPES = [
294
+ "error",
295
+ "log",
296
+ "pong",
297
+ "side_effects",
298
+ "agent.status_changed",
299
+ "agent.timeline.message",
300
+ "client.status_update",
301
+ "compaction.failed",
302
+ "completion.result",
303
+ "context.compacted",
304
+ "context.debug",
305
+ "context.mode.changed",
306
+ "context.modes.list",
307
+ "context.repaired",
308
+ "ctx.max_context",
309
+ "ctx.pct",
310
+ "delegate.completed",
311
+ "delegate.started",
312
+ "iteration.completed",
313
+ "iteration.limit_reached",
314
+ "iteration.started",
315
+ "model.refine_result",
316
+ "modes.list",
317
+ "provider.active_blocked",
318
+ "provider.error",
319
+ "provider.fallback",
320
+ "provider.response",
321
+ "provider.retry",
322
+ "provider.status_changed",
323
+ "provider.stream_error",
324
+ "provider.text_delta",
325
+ "provider.thinking_delta",
326
+ "run.result",
327
+ "session.checkpoints",
328
+ "session.damaged",
329
+ "session.end",
330
+ "session.rewound",
331
+ "session.start",
332
+ "session.stats",
333
+ "sessions.list",
334
+ "sessions.status_update",
335
+ "stats.get",
336
+ "token.cost_estimate_unavailable",
337
+ "token.threshold",
338
+ "tool.confirm_needed",
339
+ "tool.disabled",
340
+ "tool.enabled",
341
+ "tool.executed",
342
+ "tool.loop_detected",
343
+ "tool.progress",
344
+ "tool.started",
345
+ "tools.list",
346
+ "trust.persisted"
347
+ ];
348
+ var SERVER_COLLABORATION_MESSAGE_TYPES = [
349
+ "collab.annotation.added",
350
+ "collab.annotation.resolved",
351
+ "collab.event",
352
+ "collab.injection.granted",
353
+ "collab.participant.joined",
354
+ "collab.participant.left",
355
+ "collab.pause.granted",
356
+ "collab.pause.released",
357
+ "collab.state",
358
+ "mailbox.agent_registered",
359
+ "mailbox.agents",
360
+ "mailbox.cleared",
361
+ "mailbox.compacted",
362
+ "mailbox.event",
363
+ "mailbox.messages",
364
+ "mailbox.sent",
365
+ "mailbox.purged",
366
+ "mailbox.received",
367
+ "subagent.budget_extended",
368
+ "subagent.event"
369
+ ];
370
+
371
+ // src/protocol/server-integrations.ts
372
+ var SERVER_KNOWLEDGE_MESSAGE_TYPES = [
373
+ "brain.answer",
374
+ "brain.config",
375
+ "brain.event",
376
+ "brain.status",
377
+ "chronicle.error",
378
+ "chronicle.facet_result",
379
+ "chronicle.facets_result",
380
+ "chronicle.graph_result",
381
+ "chronicle.query_result",
382
+ "config.doctor.result",
383
+ "design.list",
384
+ "design.materialize",
385
+ "design.set",
386
+ "design.state",
387
+ "design.swap",
388
+ "design.tune",
389
+ "design.use",
390
+ "design.verify",
391
+ "memory.event",
392
+ "memory.list",
393
+ "memory.sage.backfillRecoverable",
394
+ "memory.sage.candidateResolve",
395
+ "memory.sage.delete",
396
+ "memory.sage.forFile",
397
+ "memory.sage.get",
398
+ "memory.sage.graph",
399
+ "memory.sage.list",
400
+ "memory.sage.listPage",
401
+ "memory.sage.recover",
402
+ "memory.sage.remember",
403
+ "memory.sage.update"
404
+ ];
405
+ var SERVER_EXTENSION_MESSAGE_TYPES = [
406
+ "mcp.content.error",
407
+ "mcp.content.selected",
408
+ "mcp.list",
409
+ "mcp.operation_result",
410
+ "mcp.prompts",
411
+ "mcp.resources",
412
+ "mcp.server.added",
413
+ "mcp.server.connected",
414
+ "mcp.server.disconnected",
415
+ "mcp.server.discovered",
416
+ "mcp.server.error",
417
+ "mcp.server.reconnected",
418
+ "mcp.server.removed",
419
+ "mcp.server.sleeping",
420
+ "mcp.server.updated",
421
+ "mcp.server.waking",
422
+ "prompts.content",
423
+ "prompts.created",
424
+ "prompts.favorite",
425
+ "prompts.list",
426
+ "prompts.recent",
427
+ "prompts.search",
428
+ "prompts.used",
429
+ "skills.content",
430
+ "skills.created",
431
+ "skills.edited",
432
+ "skills.exported",
433
+ "skills.installed",
434
+ "skills.list",
435
+ "skills.uninstalled",
436
+ "skills.updated"
437
+ ];
438
+
439
+ // src/protocol/server-operations.ts
440
+ var SERVER_GOAL_MESSAGE_TYPES = [
441
+ "budget.decision",
442
+ "budget.threshold_reached",
443
+ "coordinator.stats",
444
+ "coordinator.status",
445
+ "eternal.iteration",
446
+ "fleet.concurrency_update",
447
+ "goal-state.updated",
448
+ "goal.list",
449
+ "goal.paused",
450
+ "goal.resumed",
451
+ "goal.saved",
452
+ "goal.error",
453
+ "goal.stopped",
454
+ "goal.failed",
455
+ "goal.completed",
456
+ "goal.cleared",
457
+ "goal.reverted",
458
+ "goal.progress",
459
+ "goal.state",
460
+ "in_flight.ended",
461
+ "in_flight.started",
462
+ "plan.updated",
463
+ "task.completed",
464
+ "task.failed",
465
+ "task.pending",
466
+ "task.started",
467
+ "tasks.updated",
468
+ "todos.cleared",
469
+ "todos.updated"
470
+ ];
471
+ var SERVER_SDD_MESSAGE_TYPES = [
472
+ "kanban.task.activity",
473
+ "sdd.board.lifecycle_result",
474
+ "sdd.board.list",
475
+ "sdd.board.snapshot",
476
+ "sdd.run.started",
477
+ "sdd.spec.agent_text",
478
+ "sdd.spec.error",
479
+ "sdd.spec.snapshot",
480
+ "specs.detail",
481
+ "specs.list"
482
+ ];
483
+ var SERVER_AUTOMATION_MESSAGE_TYPES = [
484
+ "consensus.vote_cast",
485
+ "consensus.vote_initiated",
486
+ "consensus.vote_resolved",
487
+ "cron.job_fired",
488
+ "cron.snapshot",
489
+ "techstack.job.cancelled",
490
+ "techstack.job.failed",
491
+ "techstack.job.progress",
492
+ "techstack.job.started",
493
+ "techstack.report.delivered",
494
+ "techstack.report.ready",
495
+ "techstack.snapshot.updated",
496
+ "techstack.workspace.completed"
497
+ ];
498
+
499
+ // src/protocol/server-workspace.ts
500
+ var SERVER_WORKSPACE_MESSAGE_TYPES = [
501
+ "checkpoint.written",
502
+ "codemap.file_event",
503
+ "codemap.tool_executed",
504
+ "codemap.tool_started",
505
+ "file.saved",
506
+ "files.list",
507
+ "files.read",
508
+ "files.tree",
509
+ "files.written",
510
+ "git.changes",
511
+ "git.diff",
512
+ "git.info",
513
+ "process.list",
514
+ "projects.added",
515
+ "projects.list",
516
+ "projects.selected",
517
+ "terminal.exit",
518
+ "terminal.output",
519
+ "working_dir.changed",
520
+ "worktree.cleanup_result",
521
+ "worktree.diff_result",
522
+ "worktree.event",
523
+ "worktree.merge_result",
524
+ "worktree.orphans",
525
+ "worktree.state"
526
+ ];
527
+ var SERVER_CONFIGURATION_MESSAGE_TYPES = [
528
+ "auth.oauth.status",
529
+ "diag.get",
530
+ "key.operation_result",
531
+ "prefs.updated",
532
+ "provider.catalog",
533
+ "provider.models",
534
+ "provider.probe",
535
+ "providers.saved"
536
+ ];
537
+
538
+ // src/protocol/registry.ts
539
+ var CLIENT_MESSAGE_TYPES = [
540
+ ...CLIENT_CONVERSATION_MESSAGE_TYPES,
541
+ ...CLIENT_COLLABORATION_MESSAGE_TYPES,
542
+ ...CLIENT_WORKSPACE_MESSAGE_TYPES,
543
+ ...CLIENT_CONFIGURATION_MESSAGE_TYPES,
544
+ ...CLIENT_GOAL_MESSAGE_TYPES,
545
+ ...CLIENT_SDD_MESSAGE_TYPES,
546
+ ...CLIENT_KNOWLEDGE_MESSAGE_TYPES,
547
+ ...CLIENT_EXTENSION_MESSAGE_TYPES
548
+ ];
549
+ var SERVER_MESSAGE_TYPES = [
550
+ ...SERVER_CONVERSATION_MESSAGE_TYPES,
551
+ ...SERVER_COLLABORATION_MESSAGE_TYPES,
552
+ ...SERVER_WORKSPACE_MESSAGE_TYPES,
553
+ ...SERVER_CONFIGURATION_MESSAGE_TYPES,
554
+ ...SERVER_GOAL_MESSAGE_TYPES,
555
+ ...SERVER_SDD_MESSAGE_TYPES,
556
+ ...SERVER_AUTOMATION_MESSAGE_TYPES,
557
+ ...SERVER_KNOWLEDGE_MESSAGE_TYPES,
558
+ ...SERVER_EXTENSION_MESSAGE_TYPES
559
+ ];
560
+ var CLIENT_TYPE_SET = new Set(CLIENT_MESSAGE_TYPES);
561
+ var SERVER_TYPE_SET = new Set(SERVER_MESSAGE_TYPES);
562
+ function isRegisteredMessageType(type, direction) {
563
+ const exact = direction === "client" ? CLIENT_TYPE_SET : SERVER_TYPE_SET;
564
+ return exact.has(type) || type.startsWith("kanban.") && type.length > "kanban.".length || type.startsWith("agent-roster.") && type.length > "agent-roster.".length;
565
+ }
566
+
567
+ // src/protocol/decoder.ts
568
+ var FORBIDDEN_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
569
+ var MAX_PAYLOAD_DEPTH = 32;
570
+ function inspectValue(value, path, depth) {
571
+ if (depth > MAX_PAYLOAD_DEPTH) {
572
+ return { code: "too_deep", message: "Protocol payload exceeds the nesting limit", path };
573
+ }
574
+ if (value === null || typeof value !== "object") return null;
575
+ for (const key of Object.keys(value)) {
576
+ const childPath = `${path}.${key}`;
577
+ if (FORBIDDEN_KEYS.has(key)) {
578
+ return { code: "unsafe_key", message: `Unsafe protocol key: ${key}`, path: childPath };
579
+ }
580
+ const issue = inspectValue(value[key], childPath, depth + 1);
581
+ if (issue) return issue;
582
+ }
583
+ return null;
584
+ }
585
+ function decodeProtocolMessage(input, direction) {
586
+ if (input === null || typeof input !== "object" || Array.isArray(input)) {
587
+ return {
588
+ ok: false,
589
+ issue: { code: "invalid_envelope", message: "Protocol message must be an object" }
590
+ };
591
+ }
592
+ const envelope = input;
593
+ if (typeof envelope["type"] !== "string" || envelope["type"].length === 0) {
594
+ return {
595
+ ok: false,
596
+ issue: { code: "invalid_type", message: "Protocol message type must be a non-empty string" }
597
+ };
598
+ }
599
+ if (!isRegisteredMessageType(envelope["type"], direction)) {
600
+ return {
601
+ ok: false,
602
+ issue: { code: "unknown_type", message: `Unknown ${direction} message: ${envelope["type"]}` }
603
+ };
604
+ }
605
+ if (direction === "server" && !Object.hasOwn(envelope, "payload")) {
606
+ return {
607
+ ok: false,
608
+ issue: { code: "invalid_envelope", message: "Server protocol messages require a payload" }
609
+ };
610
+ }
611
+ const issue = inspectValue(envelope, "$", 0);
612
+ if (issue) return { ok: false, issue };
613
+ return { ok: true, message: input };
614
+ }
615
+ function decodeProtocolFrame(frame, direction) {
616
+ try {
617
+ return decodeProtocolMessage(JSON.parse(frame), direction);
618
+ } catch {
619
+ return {
620
+ ok: false,
621
+ issue: { code: "invalid_envelope", message: "Protocol frame is not valid JSON" }
622
+ };
623
+ }
624
+ }
625
+
626
+ // src/protocol/projections.ts
627
+ function record(value) {
628
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
629
+ }
630
+ function text(value, fallback = "") {
631
+ return typeof value === "string" ? value : fallback;
632
+ }
633
+ function finite(value, fallback = 0) {
634
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
635
+ }
636
+ function optionalArray(value) {
637
+ return value === void 0 || Array.isArray(value);
638
+ }
639
+ function isValidHqTotals(totals) {
640
+ return finite(totals["activeProjects"]) === totals["activeProjects"] && finite(totals["activeClients"]) === totals["activeClients"] && finite(totals["activeSessions"]) === totals["activeSessions"] && finite(totals["activeSubagents"]) === totals["activeSubagents"] && finite(totals["unreadMailboxMessages"]) === totals["unreadMailboxMessages"] && finite(totals["incompleteMailboxMessages"]) === totals["incompleteMailboxMessages"] && finite(totals["totalCostUsd"]) === totals["totalCostUsd"];
641
+ }
642
+ function projectSessionMessage(message) {
643
+ if (message.type !== "session.start") return null;
644
+ const payload = record(message.payload);
645
+ if (!payload) return null;
646
+ return {
647
+ kind: "session",
648
+ id: text(payload["sessionId"]),
649
+ provider: text(payload["provider"]),
650
+ model: text(payload["model"]),
651
+ projectName: text(payload["projectName"], "Project"),
652
+ cwd: text(payload["cwd"]),
653
+ maxContext: finite(payload["maxContext"]),
654
+ reset: payload["reset"] === true,
655
+ replayMessages: Array.isArray(payload["replayMessages"]) ? payload["replayMessages"] : null,
656
+ replayUsage: record(payload["replayUsage"])
657
+ };
658
+ }
659
+ function projectChatMessage(message) {
660
+ const payload = record(message.payload);
661
+ if (!payload) return null;
662
+ switch (message.type) {
663
+ case "provider.thinking_delta": {
664
+ const value = text(payload["text"]);
665
+ return value ? { kind: "thinking-delta", text: value } : null;
666
+ }
667
+ case "provider.text_delta": {
668
+ const value = text(payload["text"]);
669
+ return value ? { kind: "text-delta", text: value, messageId: text(payload["messageId"]) } : null;
670
+ }
671
+ case "provider.response":
672
+ return { kind: "response", content: payload["content"] };
673
+ case "run.result":
674
+ return {
675
+ kind: "run-result",
676
+ status: text(payload["status"]),
677
+ iterations: finite(payload["iterations"], 1),
678
+ ...typeof payload["finalText"] === "string" ? { finalText: payload["finalText"] } : {}
679
+ };
680
+ case "error":
681
+ return { kind: "error", message: text(payload["message"], "Run failed") };
682
+ default:
683
+ return null;
684
+ }
685
+ }
686
+ function projectToolMessage(message) {
687
+ const payload = record(message.payload);
688
+ if (!payload) return null;
689
+ if (message.type === "tool.started") {
690
+ const name = text(payload["name"], "tool");
691
+ return {
692
+ kind: "started",
693
+ id: text(payload["id"], name),
694
+ name,
695
+ input: payload["input"],
696
+ messageId: text(payload["messageId"])
697
+ };
698
+ }
699
+ if (message.type === "tool.progress") {
700
+ const event = record(payload["event"]);
701
+ return {
702
+ kind: "progress",
703
+ id: text(payload["id"]),
704
+ name: text(payload["name"], "tool"),
705
+ eventType: text(event?.["type"]),
706
+ text: text(event?.["text"]).trim()
707
+ };
708
+ }
709
+ if (message.type === "tool.executed") {
710
+ return {
711
+ kind: "executed",
712
+ id: text(payload["id"]),
713
+ name: text(payload["name"]),
714
+ ok: payload["ok"] !== false,
715
+ durationMs: finite(payload["durationMs"]),
716
+ ...typeof payload["output"] === "string" ? { output: payload["output"] } : {}
717
+ };
718
+ }
719
+ return null;
720
+ }
721
+ function projectFleetMessage(message) {
722
+ const payload = record(message.payload);
723
+ if (!payload) return null;
724
+ switch (message.type) {
725
+ case "fleet.concurrency_update":
726
+ return {
727
+ kind: "concurrency",
728
+ active: finite(payload["fleetConcurrency"]),
729
+ maximum: finite(payload["fleetConcurrencyMax"])
730
+ };
731
+ case "client.status_update":
732
+ return { kind: "client-status", status: payload };
733
+ case "sessions.status_update":
734
+ return {
735
+ kind: "sessions",
736
+ sessions: Array.isArray(payload["sessions"]) ? payload["sessions"] : []
737
+ };
738
+ case "coordinator.stats":
739
+ return {
740
+ kind: "coordinator",
741
+ agents: Array.isArray(payload["subagentStatuses"]) ? payload["subagentStatuses"].filter(
742
+ (item) => record(item) !== null
743
+ ) : []
744
+ };
745
+ default:
746
+ return null;
747
+ }
748
+ }
749
+ function projectHqFleetMessage(message) {
750
+ if (message.type !== "hq.snapshot") return null;
751
+ const snapshot = record(message.snapshot);
752
+ const totals = snapshot ? record(snapshot["totals"]) : null;
753
+ if (!snapshot || typeof snapshot["generatedAt"] !== "string" || !Array.isArray(snapshot["clients"]) || !Array.isArray(snapshot["projects"]) || !Array.isArray(snapshot["sessions"]) || !Array.isArray(snapshot["fleets"]) || !Array.isArray(snapshot["mailboxes"]) || !totals || !isValidHqTotals(totals) || !optionalArray(snapshot["machines"]) || !optionalArray(snapshot["liveSessions"]) || !optionalArray(snapshot["mcpServers"])) {
754
+ return null;
755
+ }
756
+ return { kind: "hq-snapshot", snapshot };
757
+ }
758
+ function projectHqEventMessage(message) {
759
+ if (message.type !== "hq.event") return null;
760
+ const event = record(message.event);
761
+ if (!event || typeof event["id"] !== "string" || typeof event["type"] !== "string" || typeof event["timestamp"] !== "string" || typeof event["clientId"] !== "string" || typeof event["projectId"] !== "string" || typeof event["seq"] !== "number") {
762
+ return null;
763
+ }
764
+ return { kind: "hq-event", event };
765
+ }
766
+ function projectHqAlertMessage(message) {
767
+ if (message.type !== "hq.alert") return null;
768
+ if (typeof message["severity"] !== "string" || !["info", "warn", "error"].includes(message["severity"]) || typeof message["message"] !== "string" || typeof message["timestamp"] !== "string") {
769
+ return null;
770
+ }
771
+ return { kind: "hq-alert", alert: message };
772
+ }
773
+ function projectHqCommandStatusMessage(message) {
774
+ if (message.type !== "hq.command_status") return null;
775
+ const command = record(message.command);
776
+ if (!command || typeof command["commandId"] !== "string" || typeof command["type"] !== "string" || typeof command["clientId"] !== "string" || typeof command["enqueuedBy"] !== "string" || typeof command["enqueuedAt"] !== "string" || typeof command["status"] !== "string" || !["queued", "delivered", "acked"].includes(command["status"])) {
777
+ return null;
778
+ }
779
+ return { kind: "hq-command-status", command };
780
+ }
781
+
782
+ // src/protocol/version.ts
783
+ var SURFACE_PROTOCOL_VERSION = 1;
784
+ var SURFACE_PROTOCOL_MIN_VERSION = 1;
785
+ var SURFACE_PROTOCOL_CAPABILITIES = [
786
+ "protocol.directional-decoder",
787
+ "protocol.recursive-key-safety",
788
+ "chronicle.query",
789
+ "chronicle.facet",
790
+ "chronicle.facets",
791
+ "chronicle.graph"
792
+ ];
793
+ function protocolAdvertisement() {
794
+ return {
795
+ protocolVersion: SURFACE_PROTOCOL_VERSION,
796
+ protocolCapabilities: [...SURFACE_PROTOCOL_CAPABILITIES]
797
+ };
798
+ }
799
+ function negotiateProtocol(peer) {
800
+ const peerVersion = peer.protocolVersion;
801
+ const legacyPeer = peerVersion === void 0;
802
+ const version = legacyPeer ? SURFACE_PROTOCOL_VERSION : Math.min(peerVersion, SURFACE_PROTOCOL_VERSION);
803
+ const compatible = legacyPeer || Number.isInteger(peerVersion) && peerVersion >= SURFACE_PROTOCOL_MIN_VERSION;
804
+ const advertised = new Set(peer.protocolCapabilities ?? []);
805
+ return {
806
+ compatible,
807
+ legacyPeer,
808
+ version,
809
+ capabilities: SURFACE_PROTOCOL_CAPABILITIES.filter((item) => advertised.has(item))
810
+ };
811
+ }
812
+ export {
813
+ CLIENT_MESSAGE_TYPES,
814
+ DEFAULT_SURFACE_CONNECTION_CONFIG,
815
+ SERVER_MESSAGE_TYPES,
816
+ SURFACE_PROTOCOL_CAPABILITIES,
817
+ SURFACE_PROTOCOL_MIN_VERSION,
818
+ SURFACE_PROTOCOL_VERSION,
819
+ createSurfaceConnectionState,
820
+ decodeProtocolFrame,
821
+ decodeProtocolMessage,
822
+ enqueueBounded,
823
+ isConnectionHeartbeatTimedOut,
824
+ isRegisteredMessageType,
825
+ markConnectionActivity,
826
+ markConnectionConnecting,
827
+ markConnectionOpen,
828
+ negotiateProtocol,
829
+ planConnectionReconnect,
830
+ projectChatMessage,
831
+ projectFleetMessage,
832
+ projectHqAlertMessage,
833
+ projectHqCommandStatusMessage,
834
+ projectHqEventMessage,
835
+ projectHqFleetMessage,
836
+ projectSessionMessage,
837
+ projectToolMessage,
838
+ protocolAdvertisement,
839
+ resetConnection,
840
+ stopConnection
841
+ };
842
+ //# sourceMappingURL=index.js.map