@guildai/cli 0.11.0 → 0.12.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.
- package/dist/auth-CRMO5O3N.js +29 -0
- package/dist/auth-CRMO5O3N.js.map +7 -0
- package/dist/chat-5VX2WJH2.js +303 -0
- package/dist/chat-5VX2WJH2.js.map +7 -0
- package/dist/chat-SIKDYZQK.js +31 -0
- package/dist/chat-SIKDYZQK.js.map +7 -0
- package/dist/chunk-56YCMGL3.js +522 -0
- package/dist/chunk-56YCMGL3.js.map +7 -0
- package/dist/chunk-6EX6E7WP.js +7042 -0
- package/dist/chunk-6EX6E7WP.js.map +7 -0
- package/dist/chunk-B7VAF5UG.js +532 -0
- package/dist/chunk-B7VAF5UG.js.map +7 -0
- package/dist/chunk-DOIYVBNY.js +3057 -0
- package/dist/chunk-DOIYVBNY.js.map +7 -0
- package/dist/chunk-ENKEEJ45.js +17 -0
- package/dist/chunk-ENKEEJ45.js.map +7 -0
- package/dist/chunk-IBRKVGMZ.js +97041 -0
- package/dist/chunk-IBRKVGMZ.js.map +7 -0
- package/dist/chunk-LFMQJOKC.js +19778 -0
- package/dist/chunk-LFMQJOKC.js.map +7 -0
- package/dist/chunk-M347HP6M.js +22896 -0
- package/dist/chunk-M347HP6M.js.map +7 -0
- package/dist/chunk-OYQ476FQ.js +44 -0
- package/dist/chunk-OYQ476FQ.js.map +7 -0
- package/dist/chunk-PNCUR4OB.js +257 -0
- package/dist/chunk-PNCUR4OB.js.map +7 -0
- package/dist/chunk-RIG2HZWM.js +317 -0
- package/dist/chunk-RIG2HZWM.js.map +7 -0
- package/dist/chunk-SPZPZXUN.js +826 -0
- package/dist/chunk-SPZPZXUN.js.map +7 -0
- package/dist/chunk-VVSOU6ON.js +53 -0
- package/dist/chunk-VVSOU6ON.js.map +7 -0
- package/dist/chunk-X3ADGWOF.js +3643 -0
- package/dist/chunk-X3ADGWOF.js.map +7 -0
- package/dist/commands/skill/create.d.ts +3 -0
- package/dist/commands/skill/get.d.ts +3 -0
- package/dist/commands/skill/list.d.ts +3 -0
- package/dist/commands/skill/update.d.ts +3 -0
- package/dist/commands/skill/version/create.d.ts +3 -0
- package/dist/commands/skill/version/get.d.ts +3 -0
- package/dist/commands/skill/version/list.d.ts +3 -0
- package/dist/devtools-AO7YSDOD.js +67 -0
- package/dist/devtools-AO7YSDOD.js.map +7 -0
- package/dist/dist-4CBK6X5H.js +1566 -0
- package/dist/dist-4CBK6X5H.js.map +7 -0
- package/dist/esm-FRAVZP4J.js +13 -0
- package/dist/esm-FRAVZP4J.js.map +7 -0
- package/dist/execa-XQMWSABC.js +35 -0
- package/dist/execa-XQMWSABC.js.map +7 -0
- package/dist/index.js +8230 -263
- package/dist/index.js.map +7 -0
- package/dist/lib/api-types.d.ts +44 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/errors.d.ts +1 -1
- package/dist/lib/output.d.ts +11 -1
- package/dist/lib/session-events.d.ts +1 -1
- package/dist/lib/session-polling.d.ts +24 -1
- package/dist/lib/websocket-client.d.ts +46 -0
- package/dist/open-RF4X5MOP.js +13 -0
- package/dist/open-RF4X5MOP.js.map +7 -0
- package/dist/server-JYVH64FD.js +27659 -0
- package/dist/server-JYVH64FD.js.map +7 -0
- package/dist/test-SNIYRJ32.js +692 -0
- package/dist/test-SNIYRJ32.js.map +7 -0
- package/docs/skills/codex-agent-dev.md +2 -2
- package/package.json +8 -12
- package/dist/commands/agent/chat.js +0 -281
- package/dist/commands/agent/clone.js +0 -118
- package/dist/commands/agent/code.js +0 -87
- package/dist/commands/agent/fork.js +0 -220
- package/dist/commands/agent/get.js +0 -37
- package/dist/commands/agent/grep.js +0 -107
- package/dist/commands/agent/init.js +0 -403
- package/dist/commands/agent/list.js +0 -110
- package/dist/commands/agent/logs.js +0 -62
- package/dist/commands/agent/owners.js +0 -74
- package/dist/commands/agent/publish.js +0 -91
- package/dist/commands/agent/pull.js +0 -194
- package/dist/commands/agent/revalidate.js +0 -56
- package/dist/commands/agent/save.js +0 -345
- package/dist/commands/agent/search.js +0 -61
- package/dist/commands/agent/tags/add.js +0 -73
- package/dist/commands/agent/tags/list.js +0 -43
- package/dist/commands/agent/tags/remove.js +0 -84
- package/dist/commands/agent/tags/set.js +0 -71
- package/dist/commands/agent/test.js +0 -489
- package/dist/commands/agent/unpublish.js +0 -64
- package/dist/commands/agent/update.js +0 -118
- package/dist/commands/agent/versions.js +0 -55
- package/dist/commands/agent/workspaces.js +0 -54
- package/dist/commands/auth/login.js +0 -31
- package/dist/commands/auth/logout.js +0 -24
- package/dist/commands/auth/status.js +0 -38
- package/dist/commands/auth/token.js +0 -19
- package/dist/commands/chat.js +0 -1416
- package/dist/commands/config/get.js +0 -64
- package/dist/commands/config/list.js +0 -46
- package/dist/commands/config/path.js +0 -37
- package/dist/commands/config/set.js +0 -132
- package/dist/commands/credentials/endpoint-list.js +0 -88
- package/dist/commands/credentials/list.js +0 -50
- package/dist/commands/credentials/policy-create.js +0 -66
- package/dist/commands/credentials/policy-delete.js +0 -33
- package/dist/commands/credentials/policy-list.js +0 -45
- package/dist/commands/credentials/policy-update.js +0 -66
- package/dist/commands/doctor.js +0 -233
- package/dist/commands/integration/connect.js +0 -76
- package/dist/commands/integration/create.js +0 -298
- package/dist/commands/integration/get.js +0 -95
- package/dist/commands/integration/list.js +0 -62
- package/dist/commands/integration/operation/create.js +0 -164
- package/dist/commands/integration/operation/list.js +0 -92
- package/dist/commands/integration/update.js +0 -139
- package/dist/commands/integration/version/build.js +0 -86
- package/dist/commands/integration/version/create.js +0 -45
- package/dist/commands/integration/version/get.js +0 -72
- package/dist/commands/integration/version/list.js +0 -45
- package/dist/commands/integration/version/publish.js +0 -79
- package/dist/commands/integration/version/test.js +0 -104
- package/dist/commands/job/get-step.js +0 -40
- package/dist/commands/job/get.js +0 -44
- package/dist/commands/mcp.js +0 -34
- package/dist/commands/session/create.js +0 -59
- package/dist/commands/session/events.js +0 -56
- package/dist/commands/session/get.js +0 -33
- package/dist/commands/session/interrupt.js +0 -33
- package/dist/commands/session/list.js +0 -59
- package/dist/commands/session/send.js +0 -54
- package/dist/commands/session/tasks.js +0 -45
- package/dist/commands/setup.js +0 -260
- package/dist/commands/trigger/activate.js +0 -41
- package/dist/commands/trigger/create.js +0 -197
- package/dist/commands/trigger/deactivate.js +0 -41
- package/dist/commands/trigger/get.js +0 -33
- package/dist/commands/trigger/list.js +0 -57
- package/dist/commands/trigger/sessions.js +0 -48
- package/dist/commands/trigger/update.js +0 -128
- package/dist/commands/version.js +0 -24
- package/dist/commands/workspace/agent/add.js +0 -114
- package/dist/commands/workspace/agent/list.js +0 -78
- package/dist/commands/workspace/agent/remove.js +0 -78
- package/dist/commands/workspace/clear.js +0 -45
- package/dist/commands/workspace/context/edit.js +0 -107
- package/dist/commands/workspace/context/get.js +0 -47
- package/dist/commands/workspace/context/list.js +0 -51
- package/dist/commands/workspace/context/publish.js +0 -42
- package/dist/commands/workspace/create.js +0 -51
- package/dist/commands/workspace/current.js +0 -63
- package/dist/commands/workspace/get.js +0 -39
- package/dist/commands/workspace/list.js +0 -70
- package/dist/commands/workspace/select.js +0 -184
- package/dist/components/AgentInstallPrompt.js +0 -97
- package/dist/components/SplashAnimation.js +0 -321
- package/dist/components/TaskView.js +0 -268
- package/dist/lib/agent-helpers.js +0 -306
- package/dist/lib/alternate-screen.js +0 -59
- package/dist/lib/api-client.js +0 -154
- package/dist/lib/api-types.js +0 -10
- package/dist/lib/auth.js +0 -284
- package/dist/lib/braille-canvas.js +0 -321
- package/dist/lib/colors.js +0 -46
- package/dist/lib/config-cache.js +0 -45
- package/dist/lib/config.js +0 -153
- package/dist/lib/did-you-mean.js +0 -144
- package/dist/lib/errors.js +0 -375
- package/dist/lib/event-filter.js +0 -91
- package/dist/lib/generated-types.js +0 -56
- package/dist/lib/git.js +0 -176
- package/dist/lib/gk.js +0 -91
- package/dist/lib/guild-config.js +0 -178
- package/dist/lib/iap.js +0 -117
- package/dist/lib/integration-helpers.js +0 -38
- package/dist/lib/loading-messages.js +0 -72
- package/dist/lib/logo.js +0 -141
- package/dist/lib/lottie-serverside.js +0 -181
- package/dist/lib/markdown.js +0 -38
- package/dist/lib/npmrc.js +0 -59
- package/dist/lib/output-mode.js +0 -54
- package/dist/lib/output.js +0 -622
- package/dist/lib/owner-helpers.js +0 -112
- package/dist/lib/polling.js +0 -76
- package/dist/lib/progress.js +0 -324
- package/dist/lib/session-events-fetch.js +0 -25
- package/dist/lib/session-events.js +0 -126
- package/dist/lib/session-polling.js +0 -166
- package/dist/lib/session-resume.js +0 -229
- package/dist/lib/spinners.js +0 -770
- package/dist/lib/splash.js +0 -42
- package/dist/lib/stdin.js +0 -91
- package/dist/lib/svg-to-braille.js +0 -76
- package/dist/lib/table.js +0 -59
- package/dist/lib/update-check.js +0 -65
- package/dist/lib/validate-input-schema.js +0 -208
- package/dist/lib/version-helpers.js +0 -137
- package/dist/lib/workspace-helpers.js +0 -49
- package/dist/mcp/resources.js +0 -67
- package/dist/mcp/server.js +0 -64
- package/dist/mcp/tools.js +0 -753
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Guild.ai
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { debug, isDebugMode } from './errors.js';
|
|
4
|
-
import { shouldShowEvent } from './event-filter.js';
|
|
5
|
-
import { fetchEvents } from './session-events-fetch.js';
|
|
6
|
-
import { applyResponseStreamText, getAgentNotificationText, isDoneResponseStreamEvent, isResponseStreamEvent, isRootTaskEvent, } from './session-events.js';
|
|
7
|
-
/**
|
|
8
|
-
* Poll for agent response using from_id cursor.
|
|
9
|
-
*
|
|
10
|
-
* Handles both multi-turn agents (which emit agent_notification_message)
|
|
11
|
-
* and one-shot agents (which may only emit runtime_done with output content).
|
|
12
|
-
*
|
|
13
|
-
* Priority:
|
|
14
|
-
* 1. root agent_notification_message — preferred, immediate return
|
|
15
|
-
* 2. root runtime_error — fail fast
|
|
16
|
-
* 3. root runtime_done content — fallback for one-shot agents
|
|
17
|
-
* 4. root done response-stream after root runtime_done — streaming fallback
|
|
18
|
-
*/
|
|
19
|
-
export async function pollForResponse(client, sessionId, afterEventId, maxWaitTime = 60000) {
|
|
20
|
-
const startTime = Date.now();
|
|
21
|
-
let fromId = afterEventId;
|
|
22
|
-
let responseStreamDone = null;
|
|
23
|
-
const responseStreamTexts = new Map();
|
|
24
|
-
while (Date.now() - startTime < maxWaitTime) {
|
|
25
|
-
const events = await fetchEvents(client, sessionId, { fromId });
|
|
26
|
-
let lastAgentRuntimeDone = null;
|
|
27
|
-
let rootRuntimeDone = false;
|
|
28
|
-
for (const event of events) {
|
|
29
|
-
debug(`pollForResponse event: ${event.type}`);
|
|
30
|
-
if (event.type === 'agent_notification_message') {
|
|
31
|
-
if (isResponseStreamEvent(event)) {
|
|
32
|
-
const streamText = applyResponseStreamText(responseStreamTexts.get(event.content.stream_id) ?? '', event.content);
|
|
33
|
-
responseStreamTexts.set(event.content.stream_id, streamText);
|
|
34
|
-
if (isRootTaskEvent(event) && isDoneResponseStreamEvent(event)) {
|
|
35
|
-
responseStreamDone = {
|
|
36
|
-
response: streamText,
|
|
37
|
-
lastEventId: event.id,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
if (!isRootTaskEvent(event))
|
|
43
|
-
continue;
|
|
44
|
-
return {
|
|
45
|
-
response: getAgentNotificationText(event),
|
|
46
|
-
lastEventId: event.id,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
if (event.type === 'runtime_done' &&
|
|
50
|
-
event.task &&
|
|
51
|
-
'agent' in event.task &&
|
|
52
|
-
isRootTaskEvent(event)) {
|
|
53
|
-
rootRuntimeDone = true;
|
|
54
|
-
if (event.content !== undefined) {
|
|
55
|
-
lastAgentRuntimeDone = JSON.stringify(event.content);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (event.type === 'runtime_error' &&
|
|
59
|
-
event.task &&
|
|
60
|
-
'agent' in event.task &&
|
|
61
|
-
isRootTaskEvent(event)) {
|
|
62
|
-
return {
|
|
63
|
-
response: JSON.stringify({ error: event.content }),
|
|
64
|
-
lastEventId: event.id,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
if (event.type === 'agent_console' && isDebugMode()) {
|
|
68
|
-
process.stderr.write(`[console.${event.level}] ${event.content}\n`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
if (events.length > 0) {
|
|
72
|
-
fromId = events[events.length - 1].id;
|
|
73
|
-
}
|
|
74
|
-
if (lastAgentRuntimeDone !== null) {
|
|
75
|
-
return { response: lastAgentRuntimeDone, lastEventId: fromId };
|
|
76
|
-
}
|
|
77
|
-
if (rootRuntimeDone && responseStreamDone !== null) {
|
|
78
|
-
return { response: responseStreamDone.response, lastEventId: fromId };
|
|
79
|
-
}
|
|
80
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
81
|
-
}
|
|
82
|
-
return responseStreamDone
|
|
83
|
-
? { response: responseStreamDone.response, lastEventId: fromId }
|
|
84
|
-
: { response: null, lastEventId: fromId };
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Poll for agent response while streaming matching events to stdout as JSONL.
|
|
88
|
-
*
|
|
89
|
-
* Same completion logic as pollForResponse(), but writes each event that
|
|
90
|
-
* passes the filter to stdout so callers get intermediate output (console.log,
|
|
91
|
-
* progress, etc.) in JSON/JSONL automation modes.
|
|
92
|
-
*/
|
|
93
|
-
export async function pollForResponseWithEvents(client, sessionId, eventFilter, afterEventId, maxWaitTime = 60000) {
|
|
94
|
-
const startTime = Date.now();
|
|
95
|
-
let fromId = afterEventId;
|
|
96
|
-
let responseStreamDone = null;
|
|
97
|
-
const responseStreamTexts = new Map();
|
|
98
|
-
while (Date.now() - startTime < maxWaitTime) {
|
|
99
|
-
const events = await fetchEvents(client, sessionId, { fromId });
|
|
100
|
-
let lastAgentRuntimeDone = null;
|
|
101
|
-
let rootRuntimeDone = false;
|
|
102
|
-
for (const event of events) {
|
|
103
|
-
debug(`pollForResponseWithEvents event: ${event.type}`);
|
|
104
|
-
// Stream matching events to stdout as JSONL. Response-stream events are
|
|
105
|
-
// transient drafts, so keep automation output stable and wait for the
|
|
106
|
-
// final agent message or terminal fallback.
|
|
107
|
-
if (shouldShowEvent(event.type, eventFilter) && !isResponseStreamEvent(event)) {
|
|
108
|
-
process.stdout.write(JSON.stringify(event) + '\n');
|
|
109
|
-
}
|
|
110
|
-
if (event.type === 'agent_notification_message') {
|
|
111
|
-
if (isResponseStreamEvent(event)) {
|
|
112
|
-
const streamText = applyResponseStreamText(responseStreamTexts.get(event.content.stream_id) ?? '', event.content);
|
|
113
|
-
responseStreamTexts.set(event.content.stream_id, streamText);
|
|
114
|
-
if (isRootTaskEvent(event) && isDoneResponseStreamEvent(event)) {
|
|
115
|
-
responseStreamDone = {
|
|
116
|
-
response: streamText,
|
|
117
|
-
lastEventId: event.id,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
if (!isRootTaskEvent(event))
|
|
123
|
-
continue;
|
|
124
|
-
return {
|
|
125
|
-
response: getAgentNotificationText(event),
|
|
126
|
-
lastEventId: event.id,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
if (event.type === 'runtime_done' &&
|
|
130
|
-
event.task &&
|
|
131
|
-
'agent' in event.task &&
|
|
132
|
-
isRootTaskEvent(event)) {
|
|
133
|
-
rootRuntimeDone = true;
|
|
134
|
-
if (event.content !== undefined) {
|
|
135
|
-
lastAgentRuntimeDone = JSON.stringify(event.content);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
if (event.type === 'runtime_error' &&
|
|
139
|
-
event.task &&
|
|
140
|
-
'agent' in event.task &&
|
|
141
|
-
isRootTaskEvent(event)) {
|
|
142
|
-
return {
|
|
143
|
-
response: JSON.stringify({ error: event.content }),
|
|
144
|
-
lastEventId: event.id,
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
if (event.type === 'agent_console' && isDebugMode()) {
|
|
148
|
-
process.stderr.write(`[console.${event.level}] ${event.content}\n`);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
if (events.length > 0) {
|
|
152
|
-
fromId = events[events.length - 1].id;
|
|
153
|
-
}
|
|
154
|
-
if (lastAgentRuntimeDone !== null) {
|
|
155
|
-
return { response: lastAgentRuntimeDone, lastEventId: fromId };
|
|
156
|
-
}
|
|
157
|
-
if (rootRuntimeDone && responseStreamDone !== null) {
|
|
158
|
-
return { response: responseStreamDone.response, lastEventId: fromId };
|
|
159
|
-
}
|
|
160
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
161
|
-
}
|
|
162
|
-
return responseStreamDone
|
|
163
|
-
? { response: responseStreamDone.response, lastEventId: fromId }
|
|
164
|
-
: { response: null, lastEventId: fromId };
|
|
165
|
-
}
|
|
166
|
-
//# sourceMappingURL=session-polling.js.map
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Guild.ai
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
/**
|
|
4
|
-
* Session resume utilities - shared helpers for printing resume hints
|
|
5
|
-
* and fetching/converting session events for resume.
|
|
6
|
-
*/
|
|
7
|
-
import chalk from 'chalk';
|
|
8
|
-
import { marked } from 'marked';
|
|
9
|
-
import { markedTerminal } from 'marked-terminal';
|
|
10
|
-
import { applyResponseStreamText, getAgentNotificationText, isResponseStreamEvent, isRootTaskEvent, } from './session-events.js';
|
|
11
|
-
import { fetchEvents } from './session-events-fetch.js';
|
|
12
|
-
import { brand, code as codeColor } from './colors.js';
|
|
13
|
-
// Configure marked for terminal rendering (same config as chat.tsx)
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
-
marked.use(markedTerminal({}, { theme: {} }));
|
|
16
|
-
/**
|
|
17
|
-
* Render markdown text to ANSI terminal output.
|
|
18
|
-
* Matches the live message rendering pipeline in chat.tsx.
|
|
19
|
-
*/
|
|
20
|
-
function renderMarkdown(text) {
|
|
21
|
-
let rendered = marked.parse(text);
|
|
22
|
-
// Fix unrendered inline markdown in list items (marked-terminal bug)
|
|
23
|
-
rendered = rendered.replace(/\*\*([^*]+)\*\*/g, (_, content) => chalk.bold(content));
|
|
24
|
-
rendered = rendered.replace(/`([^`]+)`/g, (_, content) => codeColor(content));
|
|
25
|
-
rendered = rendered.replace(/(?<![\\w])_([^_]+)_(?![\\w])/g, (_, content) => chalk.italic(content));
|
|
26
|
-
return rendered;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Print a dimmed resume hint to stderr on session exit.
|
|
30
|
-
* Only call when a session ID is available.
|
|
31
|
-
*/
|
|
32
|
-
export function printResumeHint(sessionId, command) {
|
|
33
|
-
console.error('');
|
|
34
|
-
console.error(chalk.dim('[Session interrupted]'));
|
|
35
|
-
console.error(chalk.dim('Resume this session later with:'));
|
|
36
|
-
console.error(chalk.dim(` ${command} --resume ${sessionId}`));
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Fetch all events for a session from the API.
|
|
40
|
-
*/
|
|
41
|
-
export async function fetchSessionEvents(client, sessionId) {
|
|
42
|
-
return fetchEvents(client, sessionId);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Fetch an existing session by ID.
|
|
46
|
-
*/
|
|
47
|
-
export async function fetchSession(client, sessionId) {
|
|
48
|
-
const session = (await client.get(`/sessions/${sessionId}`));
|
|
49
|
-
return session;
|
|
50
|
-
}
|
|
51
|
-
function renderAssistantText(key, text, timestamp) {
|
|
52
|
-
const rendered = renderMarkdown(text);
|
|
53
|
-
const messageContent = `${chalk.green('●')} ${chalk.bold('assistant')}\n${rendered.trim()}`;
|
|
54
|
-
return {
|
|
55
|
-
key,
|
|
56
|
-
content: messageContent,
|
|
57
|
-
type: 'assistant',
|
|
58
|
-
timestamp,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
function textMatches(left, right) {
|
|
62
|
-
return left === right;
|
|
63
|
-
}
|
|
64
|
-
function formatDisplayTimestamp(timestamp) {
|
|
65
|
-
if (timestamp === undefined)
|
|
66
|
-
return undefined;
|
|
67
|
-
const date = new Date(timestamp);
|
|
68
|
-
if (Number.isNaN(date.getTime()))
|
|
69
|
-
return timestamp;
|
|
70
|
-
return date.toLocaleTimeString();
|
|
71
|
-
}
|
|
72
|
-
function upsertResponseStreamEvent(events, event) {
|
|
73
|
-
const existingIndex = events.findIndex((existing) => existing.content.sequence === event.content.sequence);
|
|
74
|
-
if (existingIndex === -1) {
|
|
75
|
-
events.push(event);
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
events[existingIndex] = event;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
function collectResponseStreamResumeEntries(events) {
|
|
82
|
-
const responseStreamGroups = new Map();
|
|
83
|
-
const finalMessagesByTask = new Map();
|
|
84
|
-
for (const [index, event] of events.entries()) {
|
|
85
|
-
if (event.type !== 'agent_notification_message')
|
|
86
|
-
continue;
|
|
87
|
-
if (!isRootTaskEvent(event))
|
|
88
|
-
continue;
|
|
89
|
-
if (isResponseStreamEvent(event)) {
|
|
90
|
-
const streamId = event.content.stream_id;
|
|
91
|
-
const current = responseStreamGroups.get(streamId);
|
|
92
|
-
if (current) {
|
|
93
|
-
upsertResponseStreamEvent(current.events, event);
|
|
94
|
-
// Insertion order and sequence can diverge if backfilled events arrive out
|
|
95
|
-
// of order; use insertion index only for "later final message" dedupe.
|
|
96
|
-
current.lastIndex = Math.max(current.lastIndex, index);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
responseStreamGroups.set(streamId, {
|
|
100
|
-
events: [event],
|
|
101
|
-
lastIndex: index,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
continue;
|
|
105
|
-
}
|
|
106
|
-
const taskId = event.task?.id;
|
|
107
|
-
if (!taskId)
|
|
108
|
-
continue;
|
|
109
|
-
const text = getAgentNotificationText(event);
|
|
110
|
-
if (!text.trim())
|
|
111
|
-
continue;
|
|
112
|
-
const finalMessages = finalMessagesByTask.get(taskId) ?? [];
|
|
113
|
-
finalMessages.push({ index, text });
|
|
114
|
-
finalMessagesByTask.set(taskId, finalMessages);
|
|
115
|
-
}
|
|
116
|
-
const entries = [];
|
|
117
|
-
for (const [streamId, streamGroup] of responseStreamGroups.entries()) {
|
|
118
|
-
const streamEvents = [...streamGroup.events].sort((left, right) => left.content.sequence - right.content.sequence);
|
|
119
|
-
const latest = streamEvents[streamEvents.length - 1];
|
|
120
|
-
const text = streamEvents.reduce((currentText, streamEvent) => applyResponseStreamText(currentText, streamEvent.content), '');
|
|
121
|
-
const taskId = latest.task?.id;
|
|
122
|
-
const matchingLaterFinalMessage = taskId !== undefined &&
|
|
123
|
-
(finalMessagesByTask.get(taskId) ?? []).some((message) => message.index > streamGroup.lastIndex && textMatches(text, message.text));
|
|
124
|
-
if (latest.content.status !== 'aborted' &&
|
|
125
|
-
!matchingLaterFinalMessage &&
|
|
126
|
-
text.trim()) {
|
|
127
|
-
entries.push({
|
|
128
|
-
streamId,
|
|
129
|
-
key: `response-stream-${streamId}`,
|
|
130
|
-
contents: streamEvents.map((event) => event.content),
|
|
131
|
-
text,
|
|
132
|
-
status: latest.content.status,
|
|
133
|
-
timestamp: formatDisplayTimestamp(latest.created_at),
|
|
134
|
-
taskId,
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return entries;
|
|
139
|
-
}
|
|
140
|
-
function responseStreamResumeStateFromEntries(entries) {
|
|
141
|
-
const state = {
|
|
142
|
-
keys: new Map(),
|
|
143
|
-
contents: new Map(),
|
|
144
|
-
texts: new Map(),
|
|
145
|
-
timestamps: new Map(),
|
|
146
|
-
statuses: new Map(),
|
|
147
|
-
keysByTask: new Map(),
|
|
148
|
-
};
|
|
149
|
-
for (const entry of entries) {
|
|
150
|
-
state.keys.set(entry.streamId, entry.key);
|
|
151
|
-
state.contents.set(entry.streamId, entry.contents);
|
|
152
|
-
state.texts.set(entry.streamId, entry.text);
|
|
153
|
-
state.statuses.set(entry.streamId, entry.status);
|
|
154
|
-
if (entry.timestamp !== undefined) {
|
|
155
|
-
state.timestamps.set(entry.streamId, entry.timestamp);
|
|
156
|
-
}
|
|
157
|
-
if (entry.taskId !== undefined) {
|
|
158
|
-
const keys = state.keysByTask.get(entry.taskId) ?? new Set();
|
|
159
|
-
keys.add(entry.key);
|
|
160
|
-
state.keysByTask.set(entry.taskId, keys);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
return state;
|
|
164
|
-
}
|
|
165
|
-
export function responseStreamResumeStateFromEvents(events) {
|
|
166
|
-
return responseStreamResumeStateFromEntries(collectResponseStreamResumeEntries(events));
|
|
167
|
-
}
|
|
168
|
-
function eventsToDisplayMessagesWithResponseStreamEntries(events, responseStreamEntries) {
|
|
169
|
-
const messages = [];
|
|
170
|
-
const responseStreamEntriesById = new Map(responseStreamEntries.map((entry) => [entry.streamId, entry]));
|
|
171
|
-
const renderedResponseStreamIds = new Set();
|
|
172
|
-
for (const event of events) {
|
|
173
|
-
if (event.type === 'user_message') {
|
|
174
|
-
messages.push({
|
|
175
|
-
key: event.id,
|
|
176
|
-
content: `${brand('>')} ${event.content}`,
|
|
177
|
-
type: 'user',
|
|
178
|
-
timestamp: event.created_at,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
else if (event.type === 'agent_notification_message') {
|
|
182
|
-
if (isResponseStreamEvent(event)) {
|
|
183
|
-
if (!isRootTaskEvent(event))
|
|
184
|
-
continue;
|
|
185
|
-
const streamId = event.content.stream_id;
|
|
186
|
-
if (renderedResponseStreamIds.has(streamId))
|
|
187
|
-
continue;
|
|
188
|
-
const streamEntry = responseStreamEntriesById.get(streamId);
|
|
189
|
-
if (!streamEntry)
|
|
190
|
-
continue;
|
|
191
|
-
renderedResponseStreamIds.add(streamId);
|
|
192
|
-
messages.push(renderAssistantText(streamEntry.key, streamEntry.text, streamEntry.timestamp));
|
|
193
|
-
continue;
|
|
194
|
-
}
|
|
195
|
-
const text = getAgentNotificationText(event);
|
|
196
|
-
if (text.trim()) {
|
|
197
|
-
messages.push(renderAssistantText(event.id, text, event.created_at));
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
else if (event.type === 'agent_notification_error') {
|
|
201
|
-
const text = typeof event.content === 'string' ? event.content : event.content?.data || '';
|
|
202
|
-
if (text.trim()) {
|
|
203
|
-
messages.push({
|
|
204
|
-
key: event.id,
|
|
205
|
-
content: `${chalk.red('●')} ${chalk.bold('assistant')}\n${chalk.red(text)}`,
|
|
206
|
-
type: 'assistant',
|
|
207
|
-
timestamp: event.created_at,
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
return messages;
|
|
213
|
-
}
|
|
214
|
-
export function prepareSessionResumeDisplay(events) {
|
|
215
|
-
const responseStreamEntries = collectResponseStreamResumeEntries(events);
|
|
216
|
-
return {
|
|
217
|
-
displayMessages: eventsToDisplayMessagesWithResponseStreamEntries(events, responseStreamEntries),
|
|
218
|
-
responseStreamState: responseStreamResumeStateFromEntries(responseStreamEntries),
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Convert session events to display messages for resume.
|
|
223
|
-
* Maps user_message, agent_notification_message, and agent_notification_error
|
|
224
|
-
* to DisplayMessage objects. Skips progress, console, runtime events.
|
|
225
|
-
*/
|
|
226
|
-
export function eventsToDisplayMessages(events) {
|
|
227
|
-
return prepareSessionResumeDisplay(events).displayMessages;
|
|
228
|
-
}
|
|
229
|
-
//# sourceMappingURL=session-resume.js.map
|