@guildai/cli 0.11.0 → 0.12.1

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 (203) hide show
  1. package/dist/auth-67G3BIAW.js +29 -0
  2. package/dist/auth-67G3BIAW.js.map +7 -0
  3. package/dist/chat-ALOJ22JR.js +303 -0
  4. package/dist/chat-ALOJ22JR.js.map +7 -0
  5. package/dist/chat-SG2I727J.js +33 -0
  6. package/dist/chat-SG2I727J.js.map +7 -0
  7. package/dist/chunk-56YCMGL3.js +522 -0
  8. package/dist/chunk-56YCMGL3.js.map +7 -0
  9. package/dist/chunk-6EX6E7WP.js +7042 -0
  10. package/dist/chunk-6EX6E7WP.js.map +7 -0
  11. package/dist/chunk-7JJT3RNI.js +97272 -0
  12. package/dist/chunk-7JJT3RNI.js.map +7 -0
  13. package/dist/chunk-ENKEEJ45.js +17 -0
  14. package/dist/chunk-ENKEEJ45.js.map +7 -0
  15. package/dist/chunk-EQUW4M5A.js +532 -0
  16. package/dist/chunk-EQUW4M5A.js.map +7 -0
  17. package/dist/chunk-F3F5CUO3.js +841 -0
  18. package/dist/chunk-F3F5CUO3.js.map +7 -0
  19. package/dist/chunk-JQRJ4A4S.js +19778 -0
  20. package/dist/chunk-JQRJ4A4S.js.map +7 -0
  21. package/dist/chunk-M347HP6M.js +22896 -0
  22. package/dist/chunk-M347HP6M.js.map +7 -0
  23. package/dist/chunk-OYQ476FQ.js +44 -0
  24. package/dist/chunk-OYQ476FQ.js.map +7 -0
  25. package/dist/chunk-PNCUR4OB.js +257 -0
  26. package/dist/chunk-PNCUR4OB.js.map +7 -0
  27. package/dist/chunk-RJHD6XTV.js +317 -0
  28. package/dist/chunk-RJHD6XTV.js.map +7 -0
  29. package/dist/chunk-VVSOU6ON.js +53 -0
  30. package/dist/chunk-VVSOU6ON.js.map +7 -0
  31. package/dist/chunk-X3ADGWOF.js +3643 -0
  32. package/dist/chunk-X3ADGWOF.js.map +7 -0
  33. package/dist/chunk-YQWI6SUV.js +3057 -0
  34. package/dist/chunk-YQWI6SUV.js.map +7 -0
  35. package/dist/commands/chat.d.ts +21 -0
  36. package/dist/commands/skill/create.d.ts +3 -0
  37. package/dist/commands/skill/get.d.ts +3 -0
  38. package/dist/commands/skill/list.d.ts +3 -0
  39. package/dist/commands/skill/update.d.ts +3 -0
  40. package/dist/commands/skill/version/create.d.ts +3 -0
  41. package/dist/commands/skill/version/get.d.ts +3 -0
  42. package/dist/commands/skill/version/list.d.ts +3 -0
  43. package/dist/devtools-AO7YSDOD.js +67 -0
  44. package/dist/devtools-AO7YSDOD.js.map +7 -0
  45. package/dist/dist-4CBK6X5H.js +1566 -0
  46. package/dist/dist-4CBK6X5H.js.map +7 -0
  47. package/dist/esm-FRAVZP4J.js +13 -0
  48. package/dist/esm-FRAVZP4J.js.map +7 -0
  49. package/dist/execa-XQMWSABC.js +35 -0
  50. package/dist/execa-XQMWSABC.js.map +7 -0
  51. package/dist/index.js +8230 -263
  52. package/dist/index.js.map +7 -0
  53. package/dist/lib/api-types.d.ts +44 -0
  54. package/dist/lib/config.d.ts +9 -0
  55. package/dist/lib/display-message.d.ts +11 -0
  56. package/dist/lib/errors.d.ts +1 -1
  57. package/dist/lib/markdown.d.ts +2 -9
  58. package/dist/lib/output.d.ts +11 -1
  59. package/dist/lib/response-stream-display-state.d.ts +51 -0
  60. package/dist/lib/session-events.d.ts +5 -1
  61. package/dist/lib/session-polling.d.ts +24 -1
  62. package/dist/lib/session-resume.d.ts +2 -6
  63. package/dist/lib/websocket-client.d.ts +46 -0
  64. package/dist/open-RF4X5MOP.js +13 -0
  65. package/dist/open-RF4X5MOP.js.map +7 -0
  66. package/dist/server-CKXFV2JC.js +27659 -0
  67. package/dist/server-CKXFV2JC.js.map +7 -0
  68. package/dist/test-VEA4ENOR.js +692 -0
  69. package/dist/test-VEA4ENOR.js.map +7 -0
  70. package/docs/skills/codex-agent-dev.md +2 -2
  71. package/package.json +8 -12
  72. package/dist/commands/agent/chat.js +0 -281
  73. package/dist/commands/agent/clone.js +0 -118
  74. package/dist/commands/agent/code.js +0 -87
  75. package/dist/commands/agent/fork.js +0 -220
  76. package/dist/commands/agent/get.js +0 -37
  77. package/dist/commands/agent/grep.js +0 -107
  78. package/dist/commands/agent/init.js +0 -403
  79. package/dist/commands/agent/list.js +0 -110
  80. package/dist/commands/agent/logs.js +0 -62
  81. package/dist/commands/agent/owners.js +0 -74
  82. package/dist/commands/agent/publish.js +0 -91
  83. package/dist/commands/agent/pull.js +0 -194
  84. package/dist/commands/agent/revalidate.js +0 -56
  85. package/dist/commands/agent/save.js +0 -345
  86. package/dist/commands/agent/search.js +0 -61
  87. package/dist/commands/agent/tags/add.js +0 -73
  88. package/dist/commands/agent/tags/list.js +0 -43
  89. package/dist/commands/agent/tags/remove.js +0 -84
  90. package/dist/commands/agent/tags/set.js +0 -71
  91. package/dist/commands/agent/test.js +0 -489
  92. package/dist/commands/agent/unpublish.js +0 -64
  93. package/dist/commands/agent/update.js +0 -118
  94. package/dist/commands/agent/versions.js +0 -55
  95. package/dist/commands/agent/workspaces.js +0 -54
  96. package/dist/commands/auth/login.js +0 -31
  97. package/dist/commands/auth/logout.js +0 -24
  98. package/dist/commands/auth/status.js +0 -38
  99. package/dist/commands/auth/token.js +0 -19
  100. package/dist/commands/chat.js +0 -1416
  101. package/dist/commands/config/get.js +0 -64
  102. package/dist/commands/config/list.js +0 -46
  103. package/dist/commands/config/path.js +0 -37
  104. package/dist/commands/config/set.js +0 -132
  105. package/dist/commands/credentials/endpoint-list.js +0 -88
  106. package/dist/commands/credentials/list.js +0 -50
  107. package/dist/commands/credentials/policy-create.js +0 -66
  108. package/dist/commands/credentials/policy-delete.js +0 -33
  109. package/dist/commands/credentials/policy-list.js +0 -45
  110. package/dist/commands/credentials/policy-update.js +0 -66
  111. package/dist/commands/doctor.js +0 -233
  112. package/dist/commands/integration/connect.js +0 -76
  113. package/dist/commands/integration/create.js +0 -298
  114. package/dist/commands/integration/get.js +0 -95
  115. package/dist/commands/integration/list.js +0 -62
  116. package/dist/commands/integration/operation/create.js +0 -164
  117. package/dist/commands/integration/operation/list.js +0 -92
  118. package/dist/commands/integration/update.js +0 -139
  119. package/dist/commands/integration/version/build.js +0 -86
  120. package/dist/commands/integration/version/create.js +0 -45
  121. package/dist/commands/integration/version/get.js +0 -72
  122. package/dist/commands/integration/version/list.js +0 -45
  123. package/dist/commands/integration/version/publish.js +0 -79
  124. package/dist/commands/integration/version/test.js +0 -104
  125. package/dist/commands/job/get-step.js +0 -40
  126. package/dist/commands/job/get.js +0 -44
  127. package/dist/commands/mcp.js +0 -34
  128. package/dist/commands/session/create.js +0 -59
  129. package/dist/commands/session/events.js +0 -56
  130. package/dist/commands/session/get.js +0 -33
  131. package/dist/commands/session/interrupt.js +0 -33
  132. package/dist/commands/session/list.js +0 -59
  133. package/dist/commands/session/send.js +0 -54
  134. package/dist/commands/session/tasks.js +0 -45
  135. package/dist/commands/setup.js +0 -260
  136. package/dist/commands/trigger/activate.js +0 -41
  137. package/dist/commands/trigger/create.js +0 -197
  138. package/dist/commands/trigger/deactivate.js +0 -41
  139. package/dist/commands/trigger/get.js +0 -33
  140. package/dist/commands/trigger/list.js +0 -57
  141. package/dist/commands/trigger/sessions.js +0 -48
  142. package/dist/commands/trigger/update.js +0 -128
  143. package/dist/commands/version.js +0 -24
  144. package/dist/commands/workspace/agent/add.js +0 -114
  145. package/dist/commands/workspace/agent/list.js +0 -78
  146. package/dist/commands/workspace/agent/remove.js +0 -78
  147. package/dist/commands/workspace/clear.js +0 -45
  148. package/dist/commands/workspace/context/edit.js +0 -107
  149. package/dist/commands/workspace/context/get.js +0 -47
  150. package/dist/commands/workspace/context/list.js +0 -51
  151. package/dist/commands/workspace/context/publish.js +0 -42
  152. package/dist/commands/workspace/create.js +0 -51
  153. package/dist/commands/workspace/current.js +0 -63
  154. package/dist/commands/workspace/get.js +0 -39
  155. package/dist/commands/workspace/list.js +0 -70
  156. package/dist/commands/workspace/select.js +0 -184
  157. package/dist/components/AgentInstallPrompt.js +0 -97
  158. package/dist/components/SplashAnimation.js +0 -321
  159. package/dist/components/TaskView.js +0 -268
  160. package/dist/lib/agent-helpers.js +0 -306
  161. package/dist/lib/alternate-screen.js +0 -59
  162. package/dist/lib/api-client.js +0 -154
  163. package/dist/lib/api-types.js +0 -10
  164. package/dist/lib/auth.js +0 -284
  165. package/dist/lib/braille-canvas.js +0 -321
  166. package/dist/lib/colors.js +0 -46
  167. package/dist/lib/config-cache.js +0 -45
  168. package/dist/lib/config.js +0 -153
  169. package/dist/lib/did-you-mean.js +0 -144
  170. package/dist/lib/errors.js +0 -375
  171. package/dist/lib/event-filter.js +0 -91
  172. package/dist/lib/generated-types.js +0 -56
  173. package/dist/lib/git.js +0 -176
  174. package/dist/lib/gk.js +0 -91
  175. package/dist/lib/guild-config.js +0 -178
  176. package/dist/lib/iap.js +0 -117
  177. package/dist/lib/integration-helpers.js +0 -38
  178. package/dist/lib/loading-messages.js +0 -72
  179. package/dist/lib/logo.js +0 -141
  180. package/dist/lib/lottie-serverside.js +0 -181
  181. package/dist/lib/markdown.js +0 -38
  182. package/dist/lib/npmrc.js +0 -59
  183. package/dist/lib/output-mode.js +0 -54
  184. package/dist/lib/output.js +0 -622
  185. package/dist/lib/owner-helpers.js +0 -112
  186. package/dist/lib/polling.js +0 -76
  187. package/dist/lib/progress.js +0 -324
  188. package/dist/lib/session-events-fetch.js +0 -25
  189. package/dist/lib/session-events.js +0 -126
  190. package/dist/lib/session-polling.js +0 -166
  191. package/dist/lib/session-resume.js +0 -229
  192. package/dist/lib/spinners.js +0 -770
  193. package/dist/lib/splash.js +0 -42
  194. package/dist/lib/stdin.js +0 -91
  195. package/dist/lib/svg-to-braille.js +0 -76
  196. package/dist/lib/table.js +0 -59
  197. package/dist/lib/update-check.js +0 -65
  198. package/dist/lib/validate-input-schema.js +0 -208
  199. package/dist/lib/version-helpers.js +0 -137
  200. package/dist/lib/workspace-helpers.js +0 -49
  201. package/dist/mcp/resources.js +0 -67
  202. package/dist/mcp/server.js +0 -64
  203. package/dist/mcp/tools.js +0 -753
@@ -0,0 +1,841 @@
1
+ import { createRequire as _cjsReq } from 'module'; if(typeof require === 'undefined') var require = _cjsReq(import.meta.url);
2
+ import {
3
+ shouldShowEvent
4
+ } from "./chunk-RJHD6XTV.js";
5
+ import {
6
+ ErrorCodes,
7
+ GuildCLIError,
8
+ debug,
9
+ getAuthToken,
10
+ getGuildcoreWsUrl,
11
+ getIapHeaders,
12
+ isDebugMode
13
+ } from "./chunk-JQRJ4A4S.js";
14
+ import {
15
+ wrapper_default
16
+ } from "./chunk-X3ADGWOF.js";
17
+
18
+ // src/lib/session-events-fetch.ts
19
+ async function fetchEvents(client, sessionId, options = {}) {
20
+ const { fromId, limit = 1e3 } = options;
21
+ let url = `/sessions/${sessionId}/events?limit=${limit}`;
22
+ if (fromId) {
23
+ url += `&from_id=${fromId}`;
24
+ }
25
+ const response = await client.get(url);
26
+ return response?.items || [];
27
+ }
28
+ async function fetchTasks(client, sessionId) {
29
+ const response = await client.get(
30
+ `/sessions/${sessionId}/tasks?limit=1000`
31
+ );
32
+ return response?.items || [];
33
+ }
34
+
35
+ // src/lib/session-events.ts
36
+ var FILTERED_TASK_NAMES = /* @__PURE__ */ new Set([
37
+ "ui_notify",
38
+ "ui_prompt",
39
+ "__submit__",
40
+ "guild_credentials_request"
41
+ ]);
42
+ function isFilteredTaskName(name) {
43
+ return FILTERED_TASK_NAMES.has(name);
44
+ }
45
+ function isAgentTask(task) {
46
+ return "agent" in task;
47
+ }
48
+ function isToolTask(task) {
49
+ return "tool_name" in task;
50
+ }
51
+ function getAgentName(agent) {
52
+ return agent?.full_name || "assistant";
53
+ }
54
+ function getTaskDisplayName(task) {
55
+ if (isAgentTask(task)) {
56
+ return getAgentName(task.agent);
57
+ }
58
+ if (isToolTask(task)) {
59
+ return task.tool_name;
60
+ }
61
+ return "Unknown";
62
+ }
63
+ function getEventAgentName(event, fallbackName = "assistant") {
64
+ const task = event.task;
65
+ if (!task) return fallbackName;
66
+ if ("agent" in task && task.agent) {
67
+ return getAgentName(task.agent);
68
+ }
69
+ if ("parent_task" in task && task.parent_task) {
70
+ const parent = task.parent_task;
71
+ if ("agent" in parent && parent.agent) {
72
+ return getAgentName(parent.agent);
73
+ }
74
+ }
75
+ return fallbackName;
76
+ }
77
+ function isUnfulfilledAgentInstallRequest(event) {
78
+ return event.type === "agent_install_request" && !event.is_fulfilled;
79
+ }
80
+ function isResponseStreamEvent(event) {
81
+ return event.type === "agent_notification_message" && event.content.type === "application/guild-response-stream";
82
+ }
83
+ function isDoneResponseStreamEvent(event) {
84
+ return isResponseStreamEvent(event) && event.content.status === "done";
85
+ }
86
+ function applyResponseStreamText(currentText, content) {
87
+ return content.is_delta ? currentText + content.text : content.text;
88
+ }
89
+ function getAgentNotificationText(event) {
90
+ if (event.content.type === "text") {
91
+ return event.content.data;
92
+ }
93
+ if (event.content.type === "application/guild-response-stream") {
94
+ return event.content.text;
95
+ }
96
+ if (event.content.type === "multipart/mixed" && event.content.parts.length === 1) {
97
+ const part = event.content.parts[0];
98
+ return part.type === "text" && typeof part.data === "string" ? part.data : "";
99
+ }
100
+ return "";
101
+ }
102
+ function isRootTaskEvent(event) {
103
+ const task = event.task;
104
+ if (!task) return true;
105
+ if ("parent_task_id" in task) return task.parent_task_id === null;
106
+ return task.parent_task === null;
107
+ }
108
+
109
+ // src/lib/websocket-client.ts
110
+ var BASE_RECONNECT_DELAY = 3e3;
111
+ var MAX_RECONNECT_DELAY = 3e4;
112
+ var CONNECT_TIMEOUT = 15e3;
113
+ var MAX_RECONNECT_ATTEMPTS = 10;
114
+ var AUTH_CLOSE_CODES = /* @__PURE__ */ new Set([4001, 4003, 4004]);
115
+ var GuildWebSocketClient = class _GuildWebSocketClient {
116
+ ws = null;
117
+ state = "disconnected";
118
+ options;
119
+ reconnectTimer = null;
120
+ connectTimeout = null;
121
+ reconnectAttempts = 0;
122
+ constructor(options) {
123
+ this.options = options;
124
+ }
125
+ /**
126
+ * Create and connect a WebSocket client.
127
+ * Rejects if initial connection or auth fails.
128
+ */
129
+ static async create(options) {
130
+ const client = new _GuildWebSocketClient(options);
131
+ await client.connect();
132
+ return client;
133
+ }
134
+ buildUrl() {
135
+ const baseUrl = getGuildcoreWsUrl();
136
+ const params = new URLSearchParams();
137
+ if (this.options.queryParams) {
138
+ for (const [key, value] of Object.entries(this.options.queryParams)) {
139
+ params.set(key, value);
140
+ }
141
+ }
142
+ const resumeId = this.options.getFromId?.();
143
+ if (resumeId) {
144
+ params.set("from_id", resumeId);
145
+ }
146
+ const queryString = params.toString();
147
+ const separator = queryString ? "?" : "";
148
+ return `${baseUrl}${this.options.path}${separator}${queryString}`;
149
+ }
150
+ async getHeaders() {
151
+ const headers = {};
152
+ const token = await getAuthToken();
153
+ if (!token) {
154
+ throw new GuildCLIError(
155
+ ErrorCodes.AUTH_REQUIRED,
156
+ "Authentication required. Please run: guild auth login"
157
+ );
158
+ }
159
+ headers["Authorization"] = `Bearer ${token}`;
160
+ const baseUrl = getGuildcoreWsUrl();
161
+ const httpUrl = baseUrl.replace(/^ws/, "http");
162
+ const iapHeaders = await getIapHeaders(httpUrl);
163
+ Object.assign(headers, iapHeaders);
164
+ return headers;
165
+ }
166
+ cleanupSocket() {
167
+ if (this.ws) {
168
+ this.ws.removeAllListeners();
169
+ try {
170
+ this.ws.close();
171
+ } catch {
172
+ }
173
+ this.ws = null;
174
+ }
175
+ if (this.connectTimeout) {
176
+ clearTimeout(this.connectTimeout);
177
+ this.connectTimeout = null;
178
+ }
179
+ }
180
+ async connect() {
181
+ this.cleanupSocket();
182
+ this.state = "connecting";
183
+ let headers;
184
+ try {
185
+ headers = await this.getHeaders();
186
+ } catch (err) {
187
+ this.state = "disconnected";
188
+ throw err;
189
+ }
190
+ const url = this.buildUrl();
191
+ debug(`[WS ${this.options.label}] Connecting to ${url}`);
192
+ return new Promise((resolve, reject) => {
193
+ const ws = new wrapper_default(url, { headers });
194
+ this.connectTimeout = setTimeout(() => {
195
+ this.connectTimeout = null;
196
+ if (this.state === "connecting") {
197
+ debug(
198
+ `[WS ${this.options.label}] Connection timeout after ${CONNECT_TIMEOUT}ms`
199
+ );
200
+ ws.removeAllListeners();
201
+ ws.close();
202
+ const err = new Error("WebSocket connection timeout");
203
+ if (this.reconnectAttempts === 0) {
204
+ this.state = "disconnected";
205
+ reject(err);
206
+ } else {
207
+ this.scheduleReconnect();
208
+ }
209
+ }
210
+ }, CONNECT_TIMEOUT);
211
+ ws.on("open", () => {
212
+ if (this.connectTimeout) {
213
+ clearTimeout(this.connectTimeout);
214
+ this.connectTimeout = null;
215
+ }
216
+ debug(`[WS ${this.options.label}] Connected`);
217
+ this.state = "connected";
218
+ this.reconnectAttempts = 0;
219
+ resolve();
220
+ });
221
+ ws.on("message", (data) => {
222
+ try {
223
+ const message = JSON.parse(data.toString());
224
+ this.options.onMessage(message);
225
+ } catch (err) {
226
+ debug(`[WS ${this.options.label}] Failed to parse message: ${err}`);
227
+ }
228
+ });
229
+ ws.on("error", (err) => {
230
+ debug(`[WS ${this.options.label}] Error: ${err.message}`);
231
+ });
232
+ ws.on("close", (code) => {
233
+ debug(`[WS ${this.options.label}] Closed with code ${code}`);
234
+ if (this.state === "disconnected") return;
235
+ if (code === 1e3) {
236
+ this.state = "disconnected";
237
+ return;
238
+ }
239
+ if (AUTH_CLOSE_CODES.has(code)) {
240
+ this.state = "disconnected";
241
+ const authErr = new Error(`WebSocket auth failure (close code ${code})`);
242
+ this.options.onError?.(authErr);
243
+ return;
244
+ }
245
+ this.scheduleReconnect();
246
+ });
247
+ this.ws = ws;
248
+ });
249
+ }
250
+ scheduleReconnect() {
251
+ if (this.state === "disconnected") return;
252
+ this.reconnectAttempts++;
253
+ if (this.reconnectAttempts > MAX_RECONNECT_ATTEMPTS) {
254
+ debug(
255
+ `[WS ${this.options.label}] Max reconnect attempts (${MAX_RECONNECT_ATTEMPTS}) reached`
256
+ );
257
+ this.state = "disconnected";
258
+ this.options.onError?.(
259
+ new Error(`WebSocket failed after ${MAX_RECONNECT_ATTEMPTS} reconnect attempts`)
260
+ );
261
+ return;
262
+ }
263
+ this.state = "reconnecting";
264
+ const backoff = Math.min(
265
+ BASE_RECONNECT_DELAY * Math.pow(2, this.reconnectAttempts - 1),
266
+ MAX_RECONNECT_DELAY
267
+ );
268
+ const jitter = Math.random() * 2e3;
269
+ const delay = backoff + jitter;
270
+ debug(
271
+ `[WS ${this.options.label}] Reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts}/${MAX_RECONNECT_ATTEMPTS})`
272
+ );
273
+ this.reconnectTimer = setTimeout(() => {
274
+ this.reconnectTimer = null;
275
+ if (this.state === "disconnected") return;
276
+ this.connect().catch((err) => {
277
+ debug(`[WS ${this.options.label}] Reconnect failed: ${err}`);
278
+ if (err instanceof GuildCLIError && err.code === ErrorCodes.AUTH_REQUIRED) {
279
+ this.state = "disconnected";
280
+ this.options.onError?.(err);
281
+ } else {
282
+ this.scheduleReconnect();
283
+ }
284
+ });
285
+ }, delay);
286
+ }
287
+ /** Close the connection cleanly. No reconnection will be attempted. */
288
+ close() {
289
+ this.state = "disconnected";
290
+ if (this.reconnectTimer) {
291
+ clearTimeout(this.reconnectTimer);
292
+ this.reconnectTimer = null;
293
+ }
294
+ this.cleanupSocket();
295
+ debug(`[WS ${this.options.label}] Closed by client`);
296
+ }
297
+ /** Current connection state */
298
+ getState() {
299
+ return this.state;
300
+ }
301
+ };
302
+
303
+ // src/lib/session-polling.ts
304
+ async function pollForResponse(client, sessionId, afterEventId, maxWaitTime = 6e4) {
305
+ const existingEvents = await fetchEvents(client, sessionId, {
306
+ fromId: afterEventId
307
+ });
308
+ let lastAgentRuntimeDone = null;
309
+ let latestEventId = afterEventId;
310
+ let rootRuntimeDone = false;
311
+ let responseStreamDone = null;
312
+ const responseStreamTexts = /* @__PURE__ */ new Map();
313
+ for (const event of existingEvents) {
314
+ latestEventId = event.id;
315
+ if (event.type === "agent_notification_message") {
316
+ if (isResponseStreamEvent(event)) {
317
+ const streamText = applyResponseStreamText(
318
+ responseStreamTexts.get(event.content.stream_id) ?? "",
319
+ event.content
320
+ );
321
+ responseStreamTexts.set(event.content.stream_id, streamText);
322
+ if (isRootTaskEvent(event) && isDoneResponseStreamEvent(event)) {
323
+ responseStreamDone = {
324
+ response: streamText,
325
+ lastEventId: event.id
326
+ };
327
+ }
328
+ continue;
329
+ }
330
+ if (!isRootTaskEvent(event)) continue;
331
+ return {
332
+ response: getAgentNotificationText(event),
333
+ lastEventId: event.id
334
+ };
335
+ }
336
+ if (event.type === "runtime_done" && event.task && "agent" in event.task && isRootTaskEvent(event)) {
337
+ rootRuntimeDone = true;
338
+ if (event.content !== void 0) {
339
+ lastAgentRuntimeDone = JSON.stringify(event.content);
340
+ }
341
+ }
342
+ if (event.type === "runtime_error" && event.task && "agent" in event.task && isRootTaskEvent(event)) {
343
+ return {
344
+ response: JSON.stringify({ error: event.content }),
345
+ lastEventId: event.id
346
+ };
347
+ }
348
+ if (event.type === "agent_console" && isDebugMode()) {
349
+ process.stderr.write(`[console.${event.level}] ${event.content}
350
+ `);
351
+ }
352
+ }
353
+ if (lastAgentRuntimeDone !== null) {
354
+ return { response: lastAgentRuntimeDone, lastEventId: latestEventId };
355
+ }
356
+ if (rootRuntimeDone && responseStreamDone !== null) {
357
+ return { response: responseStreamDone.response, lastEventId: latestEventId };
358
+ }
359
+ try {
360
+ return await pollViaWebSocket(
361
+ sessionId,
362
+ latestEventId,
363
+ maxWaitTime,
364
+ responseStreamTexts
365
+ );
366
+ } catch (err) {
367
+ debug(`pollForResponse: WebSocket failed (${err}), falling back to HTTP polling`);
368
+ return await pollViaHttp(
369
+ client,
370
+ sessionId,
371
+ latestEventId,
372
+ maxWaitTime,
373
+ responseStreamTexts
374
+ );
375
+ }
376
+ }
377
+ function pollViaWebSocket(sessionId, fromId, maxWaitTime, inheritedStreamTexts) {
378
+ return new Promise((resolve, reject) => {
379
+ let settled = false;
380
+ let pendingRuntimeDone = null;
381
+ let latestEventId = fromId;
382
+ let runtimeDoneTimer = null;
383
+ let wsClient = null;
384
+ const seenIds = /* @__PURE__ */ new Set();
385
+ let responseStreamDone = null;
386
+ const responseStreamTexts = new Map(inheritedStreamTexts);
387
+ const timer = setTimeout(() => {
388
+ if (!settled) {
389
+ settled = true;
390
+ debug("pollViaWebSocket: timeout reached");
391
+ if (runtimeDoneTimer) clearTimeout(runtimeDoneTimer);
392
+ wsClient?.close();
393
+ const fallback = responseStreamDone ? { response: responseStreamDone.response, lastEventId: latestEventId } : { response: pendingRuntimeDone, lastEventId: latestEventId };
394
+ resolve(fallback);
395
+ }
396
+ }, maxWaitTime);
397
+ const cleanup = (result) => {
398
+ if (settled) return;
399
+ settled = true;
400
+ clearTimeout(timer);
401
+ if (runtimeDoneTimer) clearTimeout(runtimeDoneTimer);
402
+ wsClient?.close();
403
+ resolve(result);
404
+ };
405
+ GuildWebSocketClient.create({
406
+ path: `/sessions/${sessionId}/events/ws`,
407
+ label: `poll-${sessionId.substring(0, 8)}`,
408
+ getFromId: () => latestEventId,
409
+ onMessage: (event) => {
410
+ if (seenIds.has(event.id)) {
411
+ debug(`pollViaWebSocket: skipping duplicate event ${event.id}`);
412
+ return;
413
+ }
414
+ seenIds.add(event.id);
415
+ latestEventId = event.id;
416
+ if (event.type === "agent_notification_message") {
417
+ if (isResponseStreamEvent(event)) {
418
+ const streamText = applyResponseStreamText(
419
+ responseStreamTexts.get(event.content.stream_id) ?? "",
420
+ event.content
421
+ );
422
+ responseStreamTexts.set(event.content.stream_id, streamText);
423
+ if (isRootTaskEvent(event) && isDoneResponseStreamEvent(event)) {
424
+ responseStreamDone = {
425
+ response: streamText,
426
+ lastEventId: event.id
427
+ };
428
+ if (pendingRuntimeDone !== null) {
429
+ cleanup({
430
+ response: streamText,
431
+ lastEventId: event.id
432
+ });
433
+ }
434
+ }
435
+ return;
436
+ }
437
+ if (!isRootTaskEvent(event)) return;
438
+ cleanup({
439
+ response: getAgentNotificationText(event),
440
+ lastEventId: event.id
441
+ });
442
+ return;
443
+ }
444
+ if (event.type === "runtime_done" && event.task && "agent" in event.task && isRootTaskEvent(event)) {
445
+ if (event.content !== void 0) {
446
+ pendingRuntimeDone = JSON.stringify(event.content);
447
+ }
448
+ if (responseStreamDone !== null) {
449
+ cleanup({
450
+ response: responseStreamDone.response,
451
+ lastEventId: latestEventId
452
+ });
453
+ return;
454
+ }
455
+ if (runtimeDoneTimer) clearTimeout(runtimeDoneTimer);
456
+ runtimeDoneTimer = setTimeout(() => {
457
+ runtimeDoneTimer = null;
458
+ if (!settled && pendingRuntimeDone !== null) {
459
+ cleanup({
460
+ response: pendingRuntimeDone,
461
+ lastEventId: latestEventId
462
+ });
463
+ }
464
+ }, 500);
465
+ }
466
+ if (event.type === "runtime_error" && event.task && "agent" in event.task && isRootTaskEvent(event)) {
467
+ cleanup({
468
+ response: JSON.stringify({ error: event.content }),
469
+ lastEventId: event.id
470
+ });
471
+ return;
472
+ }
473
+ if (event.type === "agent_console" && isDebugMode()) {
474
+ process.stderr.write(`[console.${event.level}] ${event.content}
475
+ `);
476
+ }
477
+ },
478
+ onError: (err) => {
479
+ debug(`pollViaWebSocket: fatal error: ${err.message}`);
480
+ if (!settled) {
481
+ settled = true;
482
+ clearTimeout(timer);
483
+ if (runtimeDoneTimer) clearTimeout(runtimeDoneTimer);
484
+ reject(err);
485
+ }
486
+ }
487
+ }).then((ws) => {
488
+ wsClient = ws;
489
+ if (settled) {
490
+ ws.close();
491
+ }
492
+ }).catch((err) => {
493
+ debug(`pollViaWebSocket: connection failed: ${err}`);
494
+ if (!settled) {
495
+ settled = true;
496
+ clearTimeout(timer);
497
+ if (runtimeDoneTimer) clearTimeout(runtimeDoneTimer);
498
+ reject(err);
499
+ }
500
+ });
501
+ });
502
+ }
503
+ async function pollViaHttp(client, sessionId, fromId, maxWaitTime, inheritedStreamTexts) {
504
+ const startTime = Date.now();
505
+ let currentFromId = fromId;
506
+ let responseStreamDone = null;
507
+ const responseStreamTexts = new Map(inheritedStreamTexts);
508
+ while (Date.now() - startTime < maxWaitTime) {
509
+ const events = await fetchEvents(client, sessionId, {
510
+ fromId: currentFromId
511
+ });
512
+ let lastAgentRuntimeDone = null;
513
+ let rootRuntimeDone = false;
514
+ for (const event of events) {
515
+ debug(`pollViaHttp event: ${event.type}`);
516
+ if (event.type === "agent_notification_message") {
517
+ if (isResponseStreamEvent(event)) {
518
+ const streamText = applyResponseStreamText(
519
+ responseStreamTexts.get(event.content.stream_id) ?? "",
520
+ event.content
521
+ );
522
+ responseStreamTexts.set(event.content.stream_id, streamText);
523
+ if (isRootTaskEvent(event) && isDoneResponseStreamEvent(event)) {
524
+ responseStreamDone = {
525
+ response: streamText,
526
+ lastEventId: event.id
527
+ };
528
+ }
529
+ continue;
530
+ }
531
+ if (!isRootTaskEvent(event)) continue;
532
+ return {
533
+ response: getAgentNotificationText(event),
534
+ lastEventId: event.id
535
+ };
536
+ }
537
+ if (event.type === "runtime_done" && event.task && "agent" in event.task && isRootTaskEvent(event)) {
538
+ rootRuntimeDone = true;
539
+ if (event.content !== void 0) {
540
+ lastAgentRuntimeDone = JSON.stringify(event.content);
541
+ }
542
+ }
543
+ if (event.type === "runtime_error" && event.task && "agent" in event.task && isRootTaskEvent(event)) {
544
+ return {
545
+ response: JSON.stringify({ error: event.content }),
546
+ lastEventId: event.id
547
+ };
548
+ }
549
+ if (event.type === "agent_console" && isDebugMode()) {
550
+ process.stderr.write(`[console.${event.level}] ${event.content}
551
+ `);
552
+ }
553
+ }
554
+ if (events.length > 0) {
555
+ currentFromId = events[events.length - 1].id;
556
+ }
557
+ if (lastAgentRuntimeDone !== null) {
558
+ return { response: lastAgentRuntimeDone, lastEventId: currentFromId };
559
+ }
560
+ if (rootRuntimeDone && responseStreamDone !== null) {
561
+ return { response: responseStreamDone.response, lastEventId: currentFromId };
562
+ }
563
+ await new Promise((resolve) => setTimeout(resolve, 2e3));
564
+ }
565
+ return responseStreamDone ? { response: responseStreamDone.response, lastEventId: currentFromId } : { response: null, lastEventId: currentFromId };
566
+ }
567
+ async function pollForResponseWithEvents(client, sessionId, eventFilter, afterEventId, maxWaitTime = 6e4) {
568
+ const startTime = Date.now();
569
+ let fromId = afterEventId;
570
+ let responseStreamDone = null;
571
+ const responseStreamTexts = /* @__PURE__ */ new Map();
572
+ while (Date.now() - startTime < maxWaitTime) {
573
+ const events = await fetchEvents(client, sessionId, { fromId });
574
+ let lastAgentRuntimeDone = null;
575
+ let rootRuntimeDone = false;
576
+ for (const event of events) {
577
+ debug(`pollForResponseWithEvents event: ${event.type}`);
578
+ if (shouldShowEvent(event.type, eventFilter) && !isResponseStreamEvent(event)) {
579
+ process.stdout.write(JSON.stringify(event) + "\n");
580
+ }
581
+ if (event.type === "agent_notification_message") {
582
+ if (isResponseStreamEvent(event)) {
583
+ const streamText = applyResponseStreamText(
584
+ responseStreamTexts.get(event.content.stream_id) ?? "",
585
+ event.content
586
+ );
587
+ responseStreamTexts.set(event.content.stream_id, streamText);
588
+ if (isRootTaskEvent(event) && isDoneResponseStreamEvent(event)) {
589
+ responseStreamDone = {
590
+ response: streamText,
591
+ lastEventId: event.id
592
+ };
593
+ }
594
+ continue;
595
+ }
596
+ if (!isRootTaskEvent(event)) continue;
597
+ return {
598
+ response: getAgentNotificationText(event),
599
+ lastEventId: event.id
600
+ };
601
+ }
602
+ if (event.type === "runtime_done" && event.task && "agent" in event.task && isRootTaskEvent(event)) {
603
+ rootRuntimeDone = true;
604
+ if (event.content !== void 0) {
605
+ lastAgentRuntimeDone = JSON.stringify(event.content);
606
+ }
607
+ }
608
+ if (event.type === "runtime_error" && event.task && "agent" in event.task && isRootTaskEvent(event)) {
609
+ return {
610
+ response: JSON.stringify({ error: event.content }),
611
+ lastEventId: event.id
612
+ };
613
+ }
614
+ if (event.type === "agent_console" && isDebugMode()) {
615
+ process.stderr.write(`[console.${event.level}] ${event.content}
616
+ `);
617
+ }
618
+ }
619
+ if (events.length > 0) {
620
+ fromId = events[events.length - 1].id;
621
+ }
622
+ if (lastAgentRuntimeDone !== null) {
623
+ return { response: lastAgentRuntimeDone, lastEventId: fromId };
624
+ }
625
+ if (rootRuntimeDone && responseStreamDone !== null) {
626
+ return { response: responseStreamDone.response, lastEventId: fromId };
627
+ }
628
+ await new Promise((resolve) => setTimeout(resolve, 2e3));
629
+ }
630
+ return responseStreamDone ? { response: responseStreamDone.response, lastEventId: fromId } : { response: null, lastEventId: fromId };
631
+ }
632
+ function checkOnceCompletion(events) {
633
+ const hasRootError = events.some(
634
+ (e) => e.type === "runtime_error" && isRootTaskEvent(e)
635
+ );
636
+ if (hasRootError) return "error";
637
+ const hasUIPrompt = events.some(
638
+ (e) => e.type === "agent_notification_message" && !isResponseStreamEvent(e) && e.task?.tool_name === "ui_prompt"
639
+ );
640
+ if (hasUIPrompt) return "ui_prompt";
641
+ const hasRootDone = events.some(
642
+ (e) => e.type === "runtime_done" && isRootTaskEvent(e)
643
+ );
644
+ const hasAgentMessage = events.some(
645
+ (e) => e.type === "agent_notification_message" && isRootTaskEvent(e) && !isResponseStreamEvent(e)
646
+ );
647
+ if (hasRootDone || hasAgentMessage) return "completion";
648
+ return null;
649
+ }
650
+ async function pollForOnce(client, sessionId, options) {
651
+ const inactivityTimeoutMs = options?.inactivityTimeoutMs ?? 3e5;
652
+ const pollIntervalMs = options?.pollIntervalMs ?? 2e3;
653
+ const initialEvents = await fetchEvents(client, sessionId, {});
654
+ const allEvents = [...initialEvents];
655
+ let latestEventId = initialEvents.length > 0 ? initialEvents[initialEvents.length - 1].id : void 0;
656
+ for (const evt of initialEvents) {
657
+ logOnceEvent(evt);
658
+ }
659
+ const immediateReason = checkOnceCompletion(allEvents);
660
+ if (immediateReason) {
661
+ debug("pollForOnce: immediate completion via initial fetch");
662
+ return { events: allEvents, lastEventId: latestEventId, reason: immediateReason };
663
+ }
664
+ try {
665
+ return await pollOnceViaWebSocket(
666
+ sessionId,
667
+ allEvents,
668
+ latestEventId,
669
+ inactivityTimeoutMs
670
+ );
671
+ } catch (err) {
672
+ debug(`pollForOnce: WebSocket failed (${err}), falling back to HTTP`);
673
+ return await pollOnceViaHttp(
674
+ client,
675
+ sessionId,
676
+ allEvents,
677
+ latestEventId,
678
+ inactivityTimeoutMs,
679
+ pollIntervalMs
680
+ );
681
+ }
682
+ }
683
+ function logOnceEvent(evt) {
684
+ const taskInfo = evt.task;
685
+ if (taskInfo) {
686
+ debug(
687
+ `Event: ${evt.type}, task=${taskInfo.agent || taskInfo.tool_name || "unknown"}:${(taskInfo.id || "").substring(0, 8)}, status=${taskInfo.status}`
688
+ );
689
+ } else {
690
+ debug(`Event: ${evt.type} (no task info)`);
691
+ }
692
+ }
693
+ function pollOnceViaWebSocket(sessionId, initialEvents, fromId, inactivityTimeoutMs) {
694
+ return new Promise((resolve, reject) => {
695
+ let settled = false;
696
+ let latestEventId = fromId;
697
+ let wsClient = null;
698
+ const allEvents = [...initialEvents];
699
+ const seenIds = new Set(initialEvents.map((e) => e.id));
700
+ let runtimeDoneTimer = null;
701
+ let inactivityTimer = null;
702
+ const resetInactivityTimer = () => {
703
+ if (inactivityTimer) clearTimeout(inactivityTimer);
704
+ inactivityTimer = setTimeout(() => {
705
+ if (!settled) {
706
+ debug("pollOnceViaWebSocket: inactivity timeout");
707
+ cleanup({
708
+ events: allEvents,
709
+ lastEventId: latestEventId,
710
+ reason: "inactivity_timeout"
711
+ });
712
+ }
713
+ }, inactivityTimeoutMs);
714
+ };
715
+ const cleanup = (result) => {
716
+ if (settled) return;
717
+ settled = true;
718
+ if (runtimeDoneTimer) clearTimeout(runtimeDoneTimer);
719
+ if (inactivityTimer) clearTimeout(inactivityTimer);
720
+ wsClient?.close();
721
+ resolve(result);
722
+ };
723
+ resetInactivityTimer();
724
+ GuildWebSocketClient.create({
725
+ path: `/sessions/${sessionId}/events/ws`,
726
+ label: `poll-${sessionId.substring(0, 8)}`,
727
+ getFromId: () => latestEventId,
728
+ onMessage: (event) => {
729
+ if (seenIds.has(event.id)) return;
730
+ seenIds.add(event.id);
731
+ latestEventId = event.id;
732
+ allEvents.push(event);
733
+ logOnceEvent(event);
734
+ resetInactivityTimer();
735
+ const reason = checkOnceCompletion(allEvents);
736
+ if (reason) {
737
+ if (reason === "completion" && !runtimeDoneTimer) {
738
+ runtimeDoneTimer = setTimeout(() => {
739
+ runtimeDoneTimer = null;
740
+ const finalReason = checkOnceCompletion(allEvents) ?? "completion";
741
+ cleanup({
742
+ events: allEvents,
743
+ lastEventId: latestEventId,
744
+ reason: finalReason
745
+ });
746
+ }, 500);
747
+ return;
748
+ }
749
+ if (reason !== "completion") {
750
+ cleanup({ events: allEvents, lastEventId: latestEventId, reason });
751
+ }
752
+ }
753
+ },
754
+ onError: (err) => {
755
+ debug(`pollOnceViaWebSocket: fatal error: ${err.message}`);
756
+ if (!settled) {
757
+ settled = true;
758
+ if (runtimeDoneTimer) clearTimeout(runtimeDoneTimer);
759
+ if (inactivityTimer) clearTimeout(inactivityTimer);
760
+ reject(err);
761
+ }
762
+ }
763
+ }).then((ws) => {
764
+ wsClient = ws;
765
+ if (settled) ws.close();
766
+ }).catch((err) => {
767
+ debug(`pollOnceViaWebSocket: connection failed: ${err}`);
768
+ if (!settled) {
769
+ settled = true;
770
+ if (runtimeDoneTimer) clearTimeout(runtimeDoneTimer);
771
+ if (inactivityTimer) clearTimeout(inactivityTimer);
772
+ reject(err);
773
+ }
774
+ });
775
+ });
776
+ }
777
+ async function pollOnceViaHttp(client, sessionId, initialEvents, fromId, inactivityTimeoutMs, pollIntervalMs) {
778
+ const allEvents = [...initialEvents];
779
+ let currentFromId = fromId;
780
+ const maxInactivityAttempts = inactivityTimeoutMs / pollIntervalMs;
781
+ let inactivityCounter = 0;
782
+ while (true) {
783
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
784
+ const newEvents = await fetchEvents(client, sessionId, {
785
+ fromId: currentFromId
786
+ });
787
+ if (newEvents.length > 0) {
788
+ for (const evt of newEvents) {
789
+ logOnceEvent(evt);
790
+ }
791
+ allEvents.push(...newEvents);
792
+ currentFromId = newEvents[newEvents.length - 1].id;
793
+ inactivityCounter = 0;
794
+ } else {
795
+ inactivityCounter++;
796
+ }
797
+ const reason = checkOnceCompletion(allEvents);
798
+ if (reason) {
799
+ await new Promise((resolve) => setTimeout(resolve, 500));
800
+ const trailingEvents = await fetchEvents(client, sessionId, {
801
+ fromId: currentFromId
802
+ });
803
+ if (trailingEvents.length > 0) {
804
+ for (const evt of trailingEvents) {
805
+ logOnceEvent(evt);
806
+ }
807
+ allEvents.push(...trailingEvents);
808
+ currentFromId = trailingEvents[trailingEvents.length - 1].id;
809
+ }
810
+ const finalReason = checkOnceCompletion(allEvents) ?? reason;
811
+ return { events: allEvents, lastEventId: currentFromId, reason: finalReason };
812
+ }
813
+ if (inactivityCounter >= maxInactivityAttempts) {
814
+ debug(`pollOnceViaHttp: inactivity timeout (${inactivityCounter} empty polls)`);
815
+ return {
816
+ events: allEvents,
817
+ lastEventId: currentFromId,
818
+ reason: "inactivity_timeout"
819
+ };
820
+ }
821
+ }
822
+ }
823
+
824
+ export {
825
+ fetchEvents,
826
+ fetchTasks,
827
+ isFilteredTaskName,
828
+ getAgentName,
829
+ getTaskDisplayName,
830
+ getEventAgentName,
831
+ isUnfulfilledAgentInstallRequest,
832
+ isResponseStreamEvent,
833
+ isDoneResponseStreamEvent,
834
+ applyResponseStreamText,
835
+ getAgentNotificationText,
836
+ isRootTaskEvent,
837
+ pollForResponse,
838
+ pollForResponseWithEvents,
839
+ pollForOnce
840
+ };
841
+ //# sourceMappingURL=chunk-F3F5CUO3.js.map