@superblocksteam/gateway 2.0.155-next.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 (183) hide show
  1. package/LICENSE.txt +87 -0
  2. package/README.md +170 -0
  3. package/dist/agents/resolve-orchestrator-url.d.ts +22 -0
  4. package/dist/agents/resolve-orchestrator-url.js +38 -0
  5. package/dist/agents/resolve-orchestrator-url.js.map +1 -0
  6. package/dist/capabilities/import-prompt.d.ts +11 -0
  7. package/dist/capabilities/import-prompt.js +96 -0
  8. package/dist/capabilities/import-prompt.js.map +1 -0
  9. package/dist/capabilities/lifecycle.d.ts +73 -0
  10. package/dist/capabilities/lifecycle.js +2531 -0
  11. package/dist/capabilities/lifecycle.js.map +1 -0
  12. package/dist/capabilities/persisted-progress.d.ts +46 -0
  13. package/dist/capabilities/persisted-progress.js +246 -0
  14. package/dist/capabilities/persisted-progress.js.map +1 -0
  15. package/dist/capabilities/types.d.ts +446 -0
  16. package/dist/capabilities/types.js +47 -0
  17. package/dist/capabilities/types.js.map +1 -0
  18. package/dist/capture/browser-contract.d.ts +36 -0
  19. package/dist/capture/browser-contract.js +24 -0
  20. package/dist/capture/browser-contract.js.map +1 -0
  21. package/dist/capture/browser-instructions.d.ts +9 -0
  22. package/dist/capture/browser-instructions.js +17 -0
  23. package/dist/capture/browser-instructions.js.map +1 -0
  24. package/dist/capture/capture-library-probe.d.ts +55 -0
  25. package/dist/capture/capture-library-probe.js +177 -0
  26. package/dist/capture/capture-library-probe.js.map +1 -0
  27. package/dist/capture/capture-library.d.ts +52 -0
  28. package/dist/capture/capture-library.js +249 -0
  29. package/dist/capture/capture-library.js.map +1 -0
  30. package/dist/capture/classify-library-paint.d.ts +21 -0
  31. package/dist/capture/classify-library-paint.js +13 -0
  32. package/dist/capture/classify-library-paint.js.map +1 -0
  33. package/dist/capture/host-mcp-scan.d.ts +16 -0
  34. package/dist/capture/host-mcp-scan.js +64 -0
  35. package/dist/capture/host-mcp-scan.js.map +1 -0
  36. package/dist/capture/library-parent-script.d.ts +34 -0
  37. package/dist/capture/library-parent-script.js +82 -0
  38. package/dist/capture/library-parent-script.js.map +1 -0
  39. package/dist/capture/mode.d.ts +22 -0
  40. package/dist/capture/mode.js +45 -0
  41. package/dist/capture/mode.js.map +1 -0
  42. package/dist/config.d.ts +141 -0
  43. package/dist/config.js +109 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/debug.d.ts +2 -0
  46. package/dist/debug.js +9 -0
  47. package/dist/debug.js.map +1 -0
  48. package/dist/deps.d.ts +36 -0
  49. package/dist/deps.js +2 -0
  50. package/dist/deps.js.map +1 -0
  51. package/dist/events/cursor.d.ts +43 -0
  52. package/dist/events/cursor.js +78 -0
  53. package/dist/events/cursor.js.map +1 -0
  54. package/dist/events/memory-event-store.d.ts +34 -0
  55. package/dist/events/memory-event-store.js +110 -0
  56. package/dist/events/memory-event-store.js.map +1 -0
  57. package/dist/events/merge.d.ts +23 -0
  58. package/dist/events/merge.js +97 -0
  59. package/dist/events/merge.js.map +1 -0
  60. package/dist/events/normalized-collector.d.ts +62 -0
  61. package/dist/events/normalized-collector.js +156 -0
  62. package/dist/events/normalized-collector.js.map +1 -0
  63. package/dist/events/schema.d.ts +9 -0
  64. package/dist/events/schema.js +93 -0
  65. package/dist/events/schema.js.map +1 -0
  66. package/dist/events/snapshot.d.ts +32 -0
  67. package/dist/events/snapshot.js +57 -0
  68. package/dist/events/snapshot.js.map +1 -0
  69. package/dist/events/stream-key.d.ts +2 -0
  70. package/dist/events/stream-key.js +31 -0
  71. package/dist/events/stream-key.js.map +1 -0
  72. package/dist/events/types.d.ts +179 -0
  73. package/dist/events/types.js +66 -0
  74. package/dist/events/types.js.map +1 -0
  75. package/dist/health/readiness.d.ts +99 -0
  76. package/dist/health/readiness.js +202 -0
  77. package/dist/health/readiness.js.map +1 -0
  78. package/dist/index.d.ts +10 -0
  79. package/dist/index.js +10 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/integrations/filters.d.ts +8 -0
  82. package/dist/integrations/filters.js +40 -0
  83. package/dist/integrations/filters.js.map +1 -0
  84. package/dist/integrations/map.d.ts +26 -0
  85. package/dist/integrations/map.js +43 -0
  86. package/dist/integrations/map.js.map +1 -0
  87. package/dist/integrations/profile-key.d.ts +19 -0
  88. package/dist/integrations/profile-key.js +35 -0
  89. package/dist/integrations/profile-key.js.map +1 -0
  90. package/dist/main.d.ts +2 -0
  91. package/dist/main.js +5 -0
  92. package/dist/main.js.map +1 -0
  93. package/dist/orchestrator/client.d.ts +62 -0
  94. package/dist/orchestrator/client.js +160 -0
  95. package/dist/orchestrator/client.js.map +1 -0
  96. package/dist/playwright/ensure-chromium.d.ts +26 -0
  97. package/dist/playwright/ensure-chromium.js +60 -0
  98. package/dist/playwright/ensure-chromium.js.map +1 -0
  99. package/dist/preview/capture-screenshot.d.ts +52 -0
  100. package/dist/preview/capture-screenshot.js +158 -0
  101. package/dist/preview/capture-screenshot.js.map +1 -0
  102. package/dist/preview/viewer-url.d.ts +82 -0
  103. package/dist/preview/viewer-url.js +128 -0
  104. package/dist/preview/viewer-url.js.map +1 -0
  105. package/dist/process/fault-barrier.d.ts +55 -0
  106. package/dist/process/fault-barrier.js +113 -0
  107. package/dist/process/fault-barrier.js.map +1 -0
  108. package/dist/resume/memory-progress-store.d.ts +39 -0
  109. package/dist/resume/memory-progress-store.js +82 -0
  110. package/dist/resume/memory-progress-store.js.map +1 -0
  111. package/dist/resume/memory-recent-app-store.d.ts +14 -0
  112. package/dist/resume/memory-recent-app-store.js +27 -0
  113. package/dist/resume/memory-recent-app-store.js.map +1 -0
  114. package/dist/resume/memory-turn-store.d.ts +18 -0
  115. package/dist/resume/memory-turn-store.js +73 -0
  116. package/dist/resume/memory-turn-store.js.map +1 -0
  117. package/dist/resume/progress-key.d.ts +21 -0
  118. package/dist/resume/progress-key.js +58 -0
  119. package/dist/resume/progress-key.js.map +1 -0
  120. package/dist/resume/stores.d.ts +14 -0
  121. package/dist/resume/stores.js +18 -0
  122. package/dist/resume/stores.js.map +1 -0
  123. package/dist/resume/types.d.ts +124 -0
  124. package/dist/resume/types.js +13 -0
  125. package/dist/resume/types.js.map +1 -0
  126. package/dist/sabs/agent-facing-text.d.ts +33 -0
  127. package/dist/sabs/agent-facing-text.js +125 -0
  128. package/dist/sabs/agent-facing-text.js.map +1 -0
  129. package/dist/sabs/browser-context.d.ts +53 -0
  130. package/dist/sabs/browser-context.js +91 -0
  131. package/dist/sabs/browser-context.js.map +1 -0
  132. package/dist/sabs/editor-client-methods.d.ts +147 -0
  133. package/dist/sabs/editor-client-methods.js +715 -0
  134. package/dist/sabs/editor-client-methods.js.map +1 -0
  135. package/dist/sabs/recent-tool-runs.d.ts +14 -0
  136. package/dist/sabs/recent-tool-runs.js +61 -0
  137. package/dist/sabs/recent-tool-runs.js.map +1 -0
  138. package/dist/sabs/session-peer.d.ts +351 -0
  139. package/dist/sabs/session-peer.js +2 -0
  140. package/dist/sabs/session-peer.js.map +1 -0
  141. package/dist/sabs/turn-collector.d.ts +152 -0
  142. package/dist/sabs/turn-collector.js +573 -0
  143. package/dist/sabs/turn-collector.js.map +1 -0
  144. package/dist/sabs/websocket-session-peer.d.ts +514 -0
  145. package/dist/sabs/websocket-session-peer.js +2487 -0
  146. package/dist/sabs/websocket-session-peer.js.map +1 -0
  147. package/dist/security/constant-time.d.ts +9 -0
  148. package/dist/security/constant-time.js +13 -0
  149. package/dist/security/constant-time.js.map +1 -0
  150. package/dist/server/client.d.ts +371 -0
  151. package/dist/server/client.js +572 -0
  152. package/dist/server/client.js.map +1 -0
  153. package/dist/server/identity-reads.d.ts +76 -0
  154. package/dist/server/identity-reads.js +209 -0
  155. package/dist/server/identity-reads.js.map +1 -0
  156. package/dist/start.d.ts +14 -0
  157. package/dist/start.js +75 -0
  158. package/dist/start.js.map +1 -0
  159. package/dist/telemetry/metrics.d.ts +32 -0
  160. package/dist/telemetry/metrics.js +57 -0
  161. package/dist/telemetry/metrics.js.map +1 -0
  162. package/dist/transports/mcp/admin-tools.d.ts +47 -0
  163. package/dist/transports/mcp/admin-tools.js +164 -0
  164. package/dist/transports/mcp/admin-tools.js.map +1 -0
  165. package/dist/transports/mcp/app-status-html.d.ts +15 -0
  166. package/dist/transports/mcp/app-status-html.js +563 -0
  167. package/dist/transports/mcp/app-status-html.js.map +1 -0
  168. package/dist/transports/mcp/decision-elicitation.d.ts +74 -0
  169. package/dist/transports/mcp/decision-elicitation.js +233 -0
  170. package/dist/transports/mcp/decision-elicitation.js.map +1 -0
  171. package/dist/transports/mcp/dispatch-probe.d.ts +24 -0
  172. package/dist/transports/mcp/dispatch-probe.js +48 -0
  173. package/dist/transports/mcp/dispatch-probe.js.map +1 -0
  174. package/dist/transports/mcp/format-tool-content.d.ts +25 -0
  175. package/dist/transports/mcp/format-tool-content.js +48 -0
  176. package/dist/transports/mcp/format-tool-content.js.map +1 -0
  177. package/dist/transports/mcp/mount.d.ts +9 -0
  178. package/dist/transports/mcp/mount.js +469 -0
  179. package/dist/transports/mcp/mount.js.map +1 -0
  180. package/dist/transports/mcp/progress-notifier.d.ts +39 -0
  181. package/dist/transports/mcp/progress-notifier.js +52 -0
  182. package/dist/transports/mcp/progress-notifier.js.map +1 -0
  183. package/package.json +72 -0
@@ -0,0 +1,573 @@
1
+ const ACTIVE_STATES = new Set(["debugging", "generating", "summarizing"]);
2
+ /** Sync states that mean the dev server still has file work in flight. */
3
+ const PENDING_SYNC_STATES = new Set(["LOCAL_AHEAD", "SERVER_AHEAD"]);
4
+ const PROGRESS_CHAR_CHUNK = 400;
5
+ const PROGRESS_MS_CHUNK = 1_500;
6
+ /** How long an unfinished sentence may be held back before it is shown anyway. */
7
+ const PROGRESS_STALE_MS = 4_000;
8
+ /** Default quiet window after completed/idle before treating the job as done. */
9
+ export const DEFAULT_SETTLE_MS = 12_000;
10
+ /** Matches library-shared AI_PLAN_STREAMING_END_MARKER. */
11
+ const PLAN_STREAMING_END_MARKER = "[__SUPERBLOCKS_PLAN_DONE__]";
12
+ /**
13
+ * Collects Clark chat and generation-state pushes for one MCP turn wait.
14
+ *
15
+ * `completed` / `idle` start a settle window so an acknowledgment turn that
16
+ * resumes generating is coalesced into the same tool call. `awaiting_user_input`
17
+ * returns `needs_decision` immediately so Claude can answer via `edit_app`.
18
+ */
19
+ export class TurnCollector {
20
+ onProgress;
21
+ deltas = [];
22
+ labels = [];
23
+ states = [];
24
+ settleMs;
25
+ seenGenerating = false;
26
+ terminal;
27
+ viewStatus = "unknown";
28
+ draftPending = false;
29
+ syncPending = false;
30
+ signals = new Set();
31
+ /** Case id to name, so a later per-case update can be reported by name. */
32
+ testCaseNames = new Map();
33
+ planChunks = [];
34
+ planMessageId;
35
+ planTitle;
36
+ multiChoice;
37
+ /**
38
+ * Whether anything has arrived on the channel the dev server binds to a
39
+ * single editor peer (Clark's messages and generation states). Draft and sync
40
+ * pushes go to every attached editor, so they say nothing about the binding.
41
+ */
42
+ clarkPushSeen = false;
43
+ lastEventReceivedAt = 0;
44
+ notifyClarkPush;
45
+ lastProgressAt = 0;
46
+ streamedLen = 0;
47
+ lastLine;
48
+ settleTimer;
49
+ syncTimer;
50
+ notifySettled;
51
+ notifyInSync;
52
+ constructor(onProgress, options = {}) {
53
+ this.onProgress = onProgress;
54
+ this.settleMs = options.settleMs ?? DEFAULT_SETTLE_MS;
55
+ }
56
+ handle(event) {
57
+ this.lastEventReceivedAt = Date.now();
58
+ if (event.kind !== "draft_state" && event.kind !== "sync_status") {
59
+ this.clarkPushSeen = true;
60
+ this.notifyClarkPush?.();
61
+ }
62
+ switch (event.kind) {
63
+ case "change_info":
64
+ case "task_status": {
65
+ const label = event.label.trim();
66
+ if (label) {
67
+ this.labels.push(label);
68
+ this.emit(label);
69
+ }
70
+ // A change_info push names a file Clark wrote; a task label only says
71
+ // it is working on something.
72
+ if (event.kind === "change_info") {
73
+ this.signals.add("change_info");
74
+ }
75
+ return;
76
+ }
77
+ case "draft_state": {
78
+ this.draftPending = event.hasDraft;
79
+ if (event.hasDraft) {
80
+ this.signals.add("draft_state");
81
+ }
82
+ return;
83
+ }
84
+ case "generation_state": {
85
+ this.onGenerationState(event);
86
+ return;
87
+ }
88
+ case "reload_iframe": {
89
+ this.viewStatus = "ready";
90
+ this.signals.add("reload_iframe");
91
+ this.emit("Preview reloaded");
92
+ return;
93
+ }
94
+ case "sync_status": {
95
+ this.onSyncStatus(event.status);
96
+ return;
97
+ }
98
+ case "message": {
99
+ break;
100
+ }
101
+ }
102
+ const { message } = event;
103
+ const type = message.type ?? "text";
104
+ const content = typeof message.content === "string" ? message.content : "";
105
+ if (type === "text-delta" && content) {
106
+ this.deltas.push(content);
107
+ this.maybeProgressText();
108
+ return;
109
+ }
110
+ if ((type === "text" || type === "reasoning" || type === undefined) &&
111
+ content &&
112
+ message.role !== "user") {
113
+ // Final assistant text replaces streaming deltas for the same turn. When
114
+ // it finalizes text already streamed, only the tail is new; when it is a
115
+ // fresh message, all of it is.
116
+ const alreadyStreamed = this.deltas.join("").slice(0, this.streamedLen);
117
+ this.deltas.length = 0;
118
+ this.deltas.push(content);
119
+ if (!alreadyStreamed || !content.startsWith(alreadyStreamed)) {
120
+ this.streamedLen = 0;
121
+ }
122
+ this.flushProgressText();
123
+ return;
124
+ }
125
+ if (type === "confirm" ||
126
+ type === "multi_choice" ||
127
+ type === "searchable_dropdown") {
128
+ const question = content ||
129
+ message.title ||
130
+ message.name ||
131
+ "Superblocks needs a decision";
132
+ this.labels.push(question);
133
+ this.emit(question);
134
+ if (type === "multi_choice") {
135
+ this.multiChoice = {
136
+ ...(typeof message.id === "string" ? { messageId: message.id } : {}),
137
+ options: choiceLabels(message.choices),
138
+ question,
139
+ };
140
+ }
141
+ else if (type === "searchable_dropdown") {
142
+ this.multiChoice = {
143
+ ...(typeof message.id === "string" ? { messageId: message.id } : {}),
144
+ options: dropdownLabels(message.options),
145
+ question,
146
+ };
147
+ }
148
+ return;
149
+ }
150
+ if (type === "test_run_start" ||
151
+ type === "test_case_update" ||
152
+ type === "test_run_end") {
153
+ this.onTestMessage(type, message);
154
+ return;
155
+ }
156
+ if (type === "plan" || type === "plan-delta") {
157
+ if (type === "plan") {
158
+ this.planChunks = [];
159
+ if (typeof message.id === "string") {
160
+ this.planMessageId = message.id;
161
+ }
162
+ if (typeof message.title === "string" && message.title.trim()) {
163
+ this.planTitle = message.title.trim();
164
+ }
165
+ }
166
+ if (content) {
167
+ this.planChunks.push(content);
168
+ }
169
+ const assembled = this.assembledPlan();
170
+ if (assembled && type === "plan") {
171
+ this.emit("Superblocks proposed a plan");
172
+ }
173
+ return;
174
+ }
175
+ if (type === "tool" && (message.name || content)) {
176
+ const label = `Tool: ${message.name ?? content}`.slice(0, 120);
177
+ this.labels.push(label);
178
+ this.emit(label);
179
+ }
180
+ }
181
+ reply() {
182
+ const streamed = this.deltas.join("");
183
+ if (streamed) {
184
+ return streamed;
185
+ }
186
+ return this.labels.join("\n");
187
+ }
188
+ /**
189
+ * Structured decision Clark is waiting on (plan card or multi_choice).
190
+ * Prefer plan over multi_choice when both arrived in the same turn.
191
+ */
192
+ decision() {
193
+ const plan = this.assembledPlan();
194
+ if (plan) {
195
+ return {
196
+ kind: "plan",
197
+ ...(this.planMessageId ? { messageId: this.planMessageId } : {}),
198
+ plan,
199
+ ...(this.planTitle ? { title: this.planTitle } : {}),
200
+ };
201
+ }
202
+ if (this.multiChoice) {
203
+ return { kind: "multi_choice", ...this.multiChoice };
204
+ }
205
+ return undefined;
206
+ }
207
+ /**
208
+ * When something last reached this turn, from either transport.
209
+ *
210
+ * The held socket is one of two ways a turn hears from its live edit - SABS
211
+ * relays the same events - so a socket the gateway cannot get back is not
212
+ * proof that nothing is reporting. This is what separates the two.
213
+ *
214
+ * Zero until the first event, which reads as "nothing has arrived yet"
215
+ * against any later comparison.
216
+ */
217
+ lastEventAt() {
218
+ return this.lastEventReceivedAt;
219
+ }
220
+ status() {
221
+ return this.terminal;
222
+ }
223
+ viewableStatus() {
224
+ return this.viewStatus;
225
+ }
226
+ /**
227
+ * Whether Clark left a draft the gateway still has to accept. Mirrors the
228
+ * browser editor's `hasAiSuggestedDraft`, which is what gates its
229
+ * auto-accept.
230
+ */
231
+ needsDraftAccept() {
232
+ return this.draftPending;
233
+ }
234
+ stateSequence() {
235
+ return [...this.states];
236
+ }
237
+ /**
238
+ * Which pushes this turn used to decide it built something. Diagnostic: a
239
+ * headless peer that receives none of them cannot tell an empty job from a
240
+ * successful one, and that is a session-protocol problem, not a Clark one.
241
+ */
242
+ workSignals() {
243
+ return [...this.signals];
244
+ }
245
+ /**
246
+ * Resolves true once Clark has pushed anything on the single-peer channel, or
247
+ * false when the budget expires having heard nothing.
248
+ *
249
+ * A turn that hears nothing is not a slow turn: `generating` lands within a
250
+ * second of the prompt being acknowledged. Silence means this peer is not the
251
+ * one the sandbox is pushing to, and no amount of waiting fixes that.
252
+ */
253
+ waitForClarkPush(input) {
254
+ if (this.clarkPushSeen) {
255
+ return Promise.resolve(true);
256
+ }
257
+ if (input.timeoutMs <= 0) {
258
+ return Promise.resolve(false);
259
+ }
260
+ if (input.signal?.aborted) {
261
+ return Promise.resolve(false);
262
+ }
263
+ return new Promise((resolve) => {
264
+ const settle = (heard) => {
265
+ clearTimeout(timer);
266
+ this.notifyClarkPush = undefined;
267
+ input.signal?.removeEventListener("abort", onAbort);
268
+ resolve(heard);
269
+ };
270
+ const onAbort = () => settle(false);
271
+ const timer = setTimeout(() => settle(false), input.timeoutMs);
272
+ timer.unref?.();
273
+ input.signal?.addEventListener("abort", onAbort, { once: true });
274
+ this.notifyClarkPush = () => settle(true);
275
+ });
276
+ }
277
+ waitUntilTerminal(input) {
278
+ if (this.terminal) {
279
+ return Promise.resolve(this.terminal);
280
+ }
281
+ return new Promise((resolve, reject) => {
282
+ const finish = (status) => {
283
+ cleanup();
284
+ resolve(status);
285
+ };
286
+ const onAbort = () => {
287
+ cleanup();
288
+ reject(new Error("Superblocks turn wait aborted"));
289
+ };
290
+ const timer = setTimeout(() => {
291
+ this.clearSettleTimer();
292
+ this.terminal = "timeout";
293
+ finish("timeout");
294
+ }, input.timeoutMs);
295
+ const cleanup = () => {
296
+ clearTimeout(timer);
297
+ this.clearSettleTimer();
298
+ this.notifySettled = undefined;
299
+ input.signal?.removeEventListener("abort", onAbort);
300
+ };
301
+ if (input.signal?.aborted) {
302
+ onAbort();
303
+ return;
304
+ }
305
+ input.signal?.addEventListener("abort", onAbort, { once: true });
306
+ this.notifySettled = () => {
307
+ if (this.terminal) {
308
+ finish(this.terminal);
309
+ }
310
+ };
311
+ });
312
+ }
313
+ /**
314
+ * Resolves once the dev server has flushed Clark's files. An unreported sync
315
+ * status counts as in sync, matching the browser editor's `isOutOfSync`,
316
+ * which only blocks on LOCAL_AHEAD / SERVER_AHEAD.
317
+ *
318
+ * Resolves false when the budget expires with the sync still pending, so the
319
+ * caller can decline to checkpoint a half-uploaded app.
320
+ */
321
+ waitUntilInSync(input) {
322
+ if (!this.syncPending) {
323
+ return Promise.resolve(true);
324
+ }
325
+ if (input.timeoutMs <= 0) {
326
+ return Promise.resolve(false);
327
+ }
328
+ return new Promise((resolve) => {
329
+ this.syncTimer = setTimeout(() => {
330
+ this.endSyncWait();
331
+ resolve(false);
332
+ }, input.timeoutMs);
333
+ this.notifyInSync = (settled) => {
334
+ this.endSyncWait();
335
+ resolve(settled);
336
+ };
337
+ });
338
+ }
339
+ /** Records that the gateway committed Clark's draft into a checkpoint. */
340
+ markCheckpointed() {
341
+ this.viewStatus = "ready";
342
+ this.draftPending = false;
343
+ }
344
+ /**
345
+ * Drops pending timers and releases anyone still waiting, so a turn that
346
+ * timed out or threw leaves nothing armed behind it.
347
+ */
348
+ dispose() {
349
+ this.clearSettleTimer();
350
+ this.notifySettled = undefined;
351
+ this.notifyInSync?.(false);
352
+ this.notifyClarkPush = undefined;
353
+ }
354
+ endSyncWait() {
355
+ if (this.syncTimer) {
356
+ clearTimeout(this.syncTimer);
357
+ this.syncTimer = undefined;
358
+ }
359
+ this.notifyInSync = undefined;
360
+ }
361
+ /**
362
+ * Turns a test run into activity lines. Clark names each case only once, in
363
+ * the run's opening plan, so the names are kept to label the per-case
364
+ * updates that follow — an update carries an id and nothing else.
365
+ */
366
+ onTestMessage(type, message) {
367
+ this.signals.add("test_run");
368
+ if (type === "test_run_start") {
369
+ for (const testCase of message.testCases ?? []) {
370
+ if (testCase.id && testCase.name) {
371
+ this.testCaseNames.set(testCase.id, testCase.name);
372
+ }
373
+ }
374
+ const header = message.header?.trim() || "Testing the app";
375
+ this.labels.push(header);
376
+ this.emit(header);
377
+ return;
378
+ }
379
+ if (type === "test_case_update") {
380
+ const status = message.testCaseStatus ?? "running";
381
+ // Anything without a name is still worth reporting under its id: a
382
+ // failure the caller cannot see is a failure it will report as success.
383
+ const name = message.testCaseId
384
+ ? (this.testCaseNames.get(message.testCaseId) ?? message.testCaseId)
385
+ : "a test case";
386
+ const line = `Test ${status}: ${name}`;
387
+ this.labels.push(line);
388
+ this.emit(line);
389
+ return;
390
+ }
391
+ const verdict = message.testStatus === "failed" ? "failed" : "passed";
392
+ const summary = message.summary?.trim();
393
+ const line = summary ? `Tests ${verdict}: ${summary}` : `Tests ${verdict}`;
394
+ this.labels.push(line);
395
+ this.emit(line);
396
+ }
397
+ onSyncStatus(status) {
398
+ if (!status) {
399
+ return;
400
+ }
401
+ const pending = PENDING_SYNC_STATES.has(status);
402
+ if (pending && !this.syncPending) {
403
+ this.emit("Saving Superblocks' changes");
404
+ }
405
+ // A pending sync is deliberately not a work signal: creating an app uploads
406
+ // its template, so a sync goes pending on every turn, including one where
407
+ // Clark only answered in chat. Work is proven by a draft, a written file, or
408
+ // a preview reload.
409
+ this.syncPending = pending;
410
+ if (!pending) {
411
+ this.notifyInSync?.(true);
412
+ }
413
+ }
414
+ onGenerationState(event) {
415
+ const { state } = event;
416
+ this.states.push(state);
417
+ // Same rule the editor's clarkAi slice applies: suggestions mean a draft is
418
+ // waiting, unless the turn errored out.
419
+ if (event.hasSuggestions !== undefined || event.hasError !== undefined) {
420
+ this.draftPending = Boolean(event.hasSuggestions) && !event.hasError;
421
+ if (event.hasSuggestions) {
422
+ this.signals.add("has_suggestions");
423
+ }
424
+ }
425
+ if (ACTIVE_STATES.has(state)) {
426
+ this.seenGenerating = true;
427
+ this.clearSettleTimer();
428
+ // A resume after a false completed/idle clears the pending terminal.
429
+ if (this.terminal === "completed" || this.terminal === "no_changes") {
430
+ this.terminal = undefined;
431
+ }
432
+ this.emit(`Superblocks is ${state}`);
433
+ return;
434
+ }
435
+ if (state === "cancelled") {
436
+ this.clearSettleTimer();
437
+ this.terminal = "cancelled";
438
+ this.notifySettled?.();
439
+ return;
440
+ }
441
+ if (state === "awaiting_user_input") {
442
+ this.clearSettleTimer();
443
+ this.terminal = "needs_decision";
444
+ this.emit("Superblocks needs a decision");
445
+ this.notifySettled?.();
446
+ return;
447
+ }
448
+ if (state === "completed" || (state === "idle" && this.seenGenerating)) {
449
+ this.armSettle();
450
+ }
451
+ }
452
+ armSettle() {
453
+ this.clearSettleTimer();
454
+ // Whatever Clark left mid-sentence belongs to the reader now.
455
+ this.flushProgressText();
456
+ // Which outcome it is can only be read when the window closes: the file
457
+ // pushes that prove Clark built something often land after the state
458
+ // that ended the job.
459
+ const settle = () => {
460
+ this.settleTimer = undefined;
461
+ this.terminal = this.signals.size > 0 ? "completed" : "no_changes";
462
+ this.notifySettled?.();
463
+ };
464
+ if (this.settleMs <= 0) {
465
+ settle();
466
+ return;
467
+ }
468
+ this.emit("Waiting for Superblocks to finish…");
469
+ this.settleTimer = setTimeout(settle, this.settleMs);
470
+ }
471
+ clearSettleTimer() {
472
+ if (this.settleTimer) {
473
+ clearTimeout(this.settleTimer);
474
+ this.settleTimer = undefined;
475
+ }
476
+ }
477
+ /**
478
+ * Reports the text Clark has streamed since the previous report, cut at the
479
+ * last sentence end so nothing arrives mid-word and nothing arrives twice.
480
+ */
481
+ maybeProgressText() {
482
+ const reply = this.deltas.join("");
483
+ const pending = reply.slice(this.streamedLen);
484
+ const now = Date.now();
485
+ if (pending.length < PROGRESS_CHAR_CHUNK &&
486
+ now - this.lastProgressAt < PROGRESS_MS_CHUNK) {
487
+ return;
488
+ }
489
+ // Waiting for a sentence to end keeps lines readable, but Clark can stop
490
+ // mid-sentence for a long tool call. Once a line has been held that long,
491
+ // showing it unfinished beats showing nothing.
492
+ const cut = sentenceCut(pending) ||
493
+ (now - this.lastProgressAt >= PROGRESS_STALE_MS ? pending.length : 0);
494
+ if (cut === 0) {
495
+ return;
496
+ }
497
+ this.lastProgressAt = now;
498
+ this.streamedLen += cut;
499
+ this.emit(pending.slice(0, cut));
500
+ }
501
+ /** Flushes whatever text is still unreported, e.g. when the turn ends. */
502
+ flushProgressText() {
503
+ const pending = this.deltas.join("").slice(this.streamedLen);
504
+ if (!pending.trim()) {
505
+ return;
506
+ }
507
+ this.streamedLen += pending.length;
508
+ this.emit(pending);
509
+ }
510
+ /**
511
+ * Single door for every progress line: blank lines and a line identical to
512
+ * the one before it are dropped, because the dev server repeats status
513
+ * pushes many times per build and repetition buries the text that matters.
514
+ */
515
+ emit(line) {
516
+ const trimmed = line.trim();
517
+ if (!trimmed || trimmed === this.lastLine) {
518
+ return;
519
+ }
520
+ this.lastLine = trimmed;
521
+ this.onProgress?.(trimmed);
522
+ }
523
+ assembledPlan() {
524
+ if (this.planChunks.length === 0) {
525
+ return undefined;
526
+ }
527
+ const plan = this.planChunks
528
+ .join("")
529
+ .split(PLAN_STREAMING_END_MARKER)
530
+ .join("")
531
+ .trimEnd();
532
+ return plan || undefined;
533
+ }
534
+ }
535
+ function choiceLabels(choices) {
536
+ if (!choices?.length) {
537
+ return [];
538
+ }
539
+ return choices.map((choice) => typeof choice === "string" ? choice : choice.text);
540
+ }
541
+ function dropdownLabels(options) {
542
+ if (!options?.length) {
543
+ return [];
544
+ }
545
+ return options
546
+ .map((option) => {
547
+ if (typeof option === "string") {
548
+ return option;
549
+ }
550
+ return option.label ?? option.value ?? "";
551
+ })
552
+ .filter(Boolean);
553
+ }
554
+ /**
555
+ * Length of the leading part of `text` that ends on a sentence or line break,
556
+ * falling back to a word boundary once the text outgrows one chunk. Returns 0
557
+ * when there is no good place to cut yet.
558
+ */
559
+ function sentenceCut(text) {
560
+ const boundary = Math.max(text.lastIndexOf(". "), text.lastIndexOf(".\n"), text.lastIndexOf("! "), text.lastIndexOf("? "), text.lastIndexOf(":\n"), text.lastIndexOf("\n"));
561
+ if (boundary >= 0) {
562
+ return boundary + 1;
563
+ }
564
+ if (text.trimEnd().endsWith(".")) {
565
+ return text.length;
566
+ }
567
+ if (text.length < PROGRESS_CHAR_CHUNK) {
568
+ return 0;
569
+ }
570
+ const space = text.lastIndexOf(" ");
571
+ return space > 0 ? space : text.length;
572
+ }
573
+ //# sourceMappingURL=turn-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-collector.js","sourceRoot":"","sources":["../../src/sabs/turn-collector.ts"],"names":[],"mappings":"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"}