@best-agent/cli 0.0.2-beta.8 → 0.0.3-beta.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.
- package/LICENSE +21 -0
- package/README.md +44 -181
- package/dist/launcher.js +32 -0
- package/package.json +15 -27
- package/dist/best-agent-native-bridge.d.ts +0 -389
- package/dist/best-agent-native-bridge.js +0 -4645
- package/dist/cli-storage.d.ts +0 -5
- package/dist/cli-storage.js +0 -7
- package/dist/dimsdk/ask-user.d.ts +0 -21
- package/dist/dimsdk/ask-user.js +0 -131
- package/dist/dimsdk/cli/version.d.ts +0 -6
- package/dist/dimsdk/cli/version.js +0 -36
- package/dist/dimsdk/compat/archships/dim-agent/runtime-host.d.ts +0 -49
- package/dist/dimsdk/compat/archships/dim-agent/runtime-host.js +0 -215
- package/dist/dimsdk/compat/runtime-host.d.ts +0 -2
- package/dist/dimsdk/compat/runtime-host.js +0 -2
- package/dist/dimsdk/core/debug-log.d.ts +0 -8
- package/dist/dimsdk/core/debug-log.js +0 -100
- package/dist/dimsdk/core/env.d.ts +0 -26
- package/dist/dimsdk/core/env.js +0 -130
- package/dist/dimsdk/core/markdown/sanitize.d.ts +0 -2
- package/dist/dimsdk/core/markdown/sanitize.js +0 -43
- package/dist/dimsdk/core/markdown/wrap.d.ts +0 -9
- package/dist/dimsdk/core/markdown/wrap.js +0 -139
- package/dist/dimsdk/core/markdown.d.ts +0 -18
- package/dist/dimsdk/core/markdown.js +0 -62
- package/dist/dimsdk/core/model.d.ts +0 -273
- package/dist/dimsdk/core/model.js +0 -16
- package/dist/dimsdk/core/observability/perf-log.d.ts +0 -18
- package/dist/dimsdk/core/observability/perf-log.js +0 -236
- package/dist/dimsdk/core/store/agent-event-mappers.d.ts +0 -26
- package/dist/dimsdk/core/store/agent-event-mappers.js +0 -109
- package/dist/dimsdk/core/store/message-mutations.d.ts +0 -105
- package/dist/dimsdk/core/store/message-mutations.js +0 -1528
- package/dist/dimsdk/core/store/semantic-readers.d.ts +0 -2
- package/dist/dimsdk/core/store/semantic-readers.js +0 -4
- package/dist/dimsdk/core/store/transcript-projector.d.ts +0 -164
- package/dist/dimsdk/core/store/transcript-projector.js +0 -580
- package/dist/dimsdk/core/tool-metadata.d.ts +0 -12
- package/dist/dimsdk/core/tool-metadata.js +0 -70
- package/dist/dimsdk/core/transcript-part-id.d.ts +0 -6
- package/dist/dimsdk/core/transcript-part-id.js +0 -22
- package/dist/dimsdk/i18n/index.d.ts +0 -18
- package/dist/dimsdk/i18n/index.js +0 -141
- package/dist/dimsdk/i18n/locales/en.d.ts +0 -988
- package/dist/dimsdk/i18n/locales/en.js +0 -987
- package/dist/dimsdk/i18n/locales/index.d.ts +0 -1976
- package/dist/dimsdk/i18n/locales/index.js +0 -8
- package/dist/dimsdk/i18n/locales/zh-CN.d.ts +0 -988
- package/dist/dimsdk/i18n/locales/zh-CN.js +0 -987
- package/dist/dimsdk/i18n/types.d.ts +0 -13
- package/dist/dimsdk/i18n/types.js +0 -2
- package/dist/dimsdk/shared/value-normalizers.d.ts +0 -7
- package/dist/dimsdk/shared/value-normalizers.js +0 -48
- package/dist/dimsdk-tui.bundle-size.json +0 -169
- package/dist/dimsdk-tui.bundle.js +0 -330756
- package/dist/goatchain-adapter.d.ts +0 -41
- package/dist/goatchain-adapter.js +0 -499
- package/dist/index.d.ts +0 -3
- package/dist/index.js +0 -1405
- package/dist/native-runtime-bridge.d.ts +0 -387
- package/dist/native-runtime-bridge.js +0 -4624
- package/dist/provider-config-env.d.ts +0 -7
- package/dist/provider-config-env.js +0 -286
- package/dist/provider-model-limit-index.generated.d.ts +0 -3
- package/dist/provider-model-limit-index.generated.js +0 -7818
- package/dist/provider-model-limits.d.ts +0 -8
- package/dist/provider-model-limits.js +0 -43
- package/dist/runtime.d.ts +0 -47
- package/dist/runtime.js +0 -516
|
@@ -1,580 +0,0 @@
|
|
|
1
|
-
import { createLocalThinkingPartId } from "../transcript-part-id.js";
|
|
2
|
-
import { canonicalToolName } from "../tool-metadata.js";
|
|
3
|
-
import { isDelegationRecordedFinalMessage } from "../../compat/runtime-host.js";
|
|
4
|
-
import { t } from "../../i18n/index.js";
|
|
5
|
-
import { readTrimmedString } from "./semantic-readers.js";
|
|
6
|
-
import { buildApprovalRequestFromEvent as buildApprovalRequest, buildToolResultFromEvent as buildToolResult, } from "./agent-event-mappers.js";
|
|
7
|
-
const DEFAULT_ASSISTANT_MARKDOWN_STREAM_ID = "__assistant_markdown__";
|
|
8
|
-
function normalizeText(value) {
|
|
9
|
-
return readTrimmedString(value) ?? "";
|
|
10
|
-
}
|
|
11
|
-
function asRecord(value) {
|
|
12
|
-
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
13
|
-
return {};
|
|
14
|
-
return value;
|
|
15
|
-
}
|
|
16
|
-
function extractTextParts(value) {
|
|
17
|
-
if (!Array.isArray(value))
|
|
18
|
-
return [];
|
|
19
|
-
return value
|
|
20
|
-
.map((part) => {
|
|
21
|
-
const record = asRecord(part);
|
|
22
|
-
return typeof record.text === "string" ? record.text : "";
|
|
23
|
-
})
|
|
24
|
-
.filter(Boolean);
|
|
25
|
-
}
|
|
26
|
-
function extractTextContent(content) {
|
|
27
|
-
if (typeof content === "string")
|
|
28
|
-
return content;
|
|
29
|
-
if (!Array.isArray(content))
|
|
30
|
-
return "";
|
|
31
|
-
return extractTextParts(content).join("");
|
|
32
|
-
}
|
|
33
|
-
function compactActivityText(value, max = 80) {
|
|
34
|
-
const normalized = String(value ?? "")
|
|
35
|
-
.replace(/\r/g, "")
|
|
36
|
-
.replace(/\s+/g, " ")
|
|
37
|
-
.trim();
|
|
38
|
-
if (!normalized)
|
|
39
|
-
return "";
|
|
40
|
-
if (normalized.length <= max)
|
|
41
|
-
return normalized;
|
|
42
|
-
if (max <= 1)
|
|
43
|
-
return normalized.slice(0, max);
|
|
44
|
-
return `${normalized.slice(0, max - 1).trimEnd()}…`;
|
|
45
|
-
}
|
|
46
|
-
function subagentToolInputSummary(input) {
|
|
47
|
-
const value = input.file_path ??
|
|
48
|
-
input.path ??
|
|
49
|
-
input.query ??
|
|
50
|
-
input.pattern ??
|
|
51
|
-
input.command ??
|
|
52
|
-
input.file ??
|
|
53
|
-
input.url;
|
|
54
|
-
if (Array.isArray(value))
|
|
55
|
-
return value.map((entry) => compactActivityText(entry, 40)).join(", ");
|
|
56
|
-
return compactActivityText(value, 60);
|
|
57
|
-
}
|
|
58
|
-
function tryParseInputObject(value) {
|
|
59
|
-
if (value && typeof value === "object" && !Array.isArray(value))
|
|
60
|
-
return value;
|
|
61
|
-
if (typeof value !== "string")
|
|
62
|
-
return null;
|
|
63
|
-
const text = value.trim();
|
|
64
|
-
if (!text)
|
|
65
|
-
return null;
|
|
66
|
-
try {
|
|
67
|
-
const parsed = JSON.parse(text);
|
|
68
|
-
if (parsed && typeof parsed === "object" && !Array.isArray(parsed))
|
|
69
|
-
return parsed;
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
function formatSubagentToolActivity(toolName, input) {
|
|
77
|
-
const name = canonicalToolName(toolName) || normalizeText(toolName);
|
|
78
|
-
if (!name)
|
|
79
|
-
return "";
|
|
80
|
-
const inputObject = tryParseInputObject(input);
|
|
81
|
-
const rawSummary = compactActivityText(input);
|
|
82
|
-
const summary = inputObject
|
|
83
|
-
? subagentToolInputSummary(inputObject)
|
|
84
|
-
: rawSummary.startsWith("{") || rawSummary.startsWith("[")
|
|
85
|
-
? ""
|
|
86
|
-
: rawSummary;
|
|
87
|
-
return compactActivityText(summary ? `${name} ${summary}` : name);
|
|
88
|
-
}
|
|
89
|
-
function hasVisibleReasoningText(value) {
|
|
90
|
-
return normalizeText(value).length > 0;
|
|
91
|
-
}
|
|
92
|
-
function findAssistant(messages, assistantId) {
|
|
93
|
-
const message = messages.find((entry) => entry?.id === assistantId);
|
|
94
|
-
return message?.role === "assistant" ? message : null;
|
|
95
|
-
}
|
|
96
|
-
function hasThinkingBlockWithId(messages, assistantId, partId) {
|
|
97
|
-
const normalizedPartId = normalizeText(partId);
|
|
98
|
-
if (!normalizedPartId)
|
|
99
|
-
return false;
|
|
100
|
-
const message = findAssistant(messages, assistantId);
|
|
101
|
-
return Boolean(message?.parts.some((part) => part.type === "thinking" && normalizeText(part.partId) === normalizedPartId));
|
|
102
|
-
}
|
|
103
|
-
function readThinkingBlockContent(messages, assistantId, partId) {
|
|
104
|
-
const normalizedPartId = normalizeText(partId);
|
|
105
|
-
if (!normalizedPartId)
|
|
106
|
-
return undefined;
|
|
107
|
-
const message = findAssistant(messages, assistantId);
|
|
108
|
-
const part = message?.parts.find((entry) => entry.type === "thinking" && normalizeText(entry.partId) === normalizedPartId);
|
|
109
|
-
return part?.type === "thinking" ? String(part.content ?? "") : undefined;
|
|
110
|
-
}
|
|
111
|
-
function readAssistantMarkdownText(messages, assistantId) {
|
|
112
|
-
const message = findAssistant(messages, assistantId);
|
|
113
|
-
if (!message)
|
|
114
|
-
return "";
|
|
115
|
-
return message.parts
|
|
116
|
-
.filter((part) => part.type === "markdown")
|
|
117
|
-
.map((part) => String(part.markdown ?? ""))
|
|
118
|
-
.join("");
|
|
119
|
-
}
|
|
120
|
-
function hasToolCall(messages, assistantId, callId) {
|
|
121
|
-
const normalizedCallId = normalizeText(callId);
|
|
122
|
-
if (!normalizedCallId)
|
|
123
|
-
return false;
|
|
124
|
-
const message = findAssistant(messages, assistantId);
|
|
125
|
-
return Boolean(message?.parts.some((part) => part.type === "tool_call" && normalizeText(part.call.id) === normalizedCallId));
|
|
126
|
-
}
|
|
127
|
-
function removeThinkingBlock(updateAssistant, assistantId, partId) {
|
|
128
|
-
const normalizedPartId = normalizeText(partId);
|
|
129
|
-
if (!normalizedPartId)
|
|
130
|
-
return;
|
|
131
|
-
updateAssistant(assistantId, (message) => {
|
|
132
|
-
const parts = message.parts.filter((part) => part.type !== "thinking" || normalizeText(part.partId) !== normalizedPartId);
|
|
133
|
-
return parts.length === message.parts.length ? message : { ...message, parts };
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
function setSubagentHeaderState(updateAssistant, assistantId, subagentId, state) {
|
|
137
|
-
const normalizedSubagentId = normalizeText(subagentId);
|
|
138
|
-
if (!normalizedSubagentId)
|
|
139
|
-
return;
|
|
140
|
-
updateAssistant(assistantId, (message) => {
|
|
141
|
-
const headerIndex = message.parts.findIndex((part) => {
|
|
142
|
-
const record = asRecord(part);
|
|
143
|
-
return (part.type === "info" &&
|
|
144
|
-
record._subagent === "header" &&
|
|
145
|
-
normalizeText(record._subagentId) === normalizedSubagentId);
|
|
146
|
-
});
|
|
147
|
-
if (headerIndex < 0)
|
|
148
|
-
return message;
|
|
149
|
-
const parts = message.parts.slice();
|
|
150
|
-
const header = parts[headerIndex];
|
|
151
|
-
if (!header || header.type !== "info")
|
|
152
|
-
return message;
|
|
153
|
-
const headerWithMeta = header;
|
|
154
|
-
if (state) {
|
|
155
|
-
const updatedHeader = { ...headerWithMeta, _subagentState: state };
|
|
156
|
-
parts[headerIndex] = updatedHeader;
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
const { _subagentState: _ignored, ...rest } = headerWithMeta;
|
|
160
|
-
parts[headerIndex] = rest;
|
|
161
|
-
}
|
|
162
|
-
return { ...message, parts };
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
function isTodoToolName(toolName) {
|
|
166
|
-
return toolName === "todowrite";
|
|
167
|
-
}
|
|
168
|
-
function isPlanToolName(toolName) {
|
|
169
|
-
return toolName === "todoplan" || toolName === "plan_mode_todoplan";
|
|
170
|
-
}
|
|
171
|
-
export function createTranscriptProjector(opts) {
|
|
172
|
-
const stateByAssistantId = new Map();
|
|
173
|
-
const getAssistantState = (assistantId) => {
|
|
174
|
-
const existing = stateByAssistantId.get(assistantId);
|
|
175
|
-
if (existing)
|
|
176
|
-
return existing;
|
|
177
|
-
const next = {
|
|
178
|
-
assistantMarkdownByStreamId: new Map(),
|
|
179
|
-
placeholderThinkingPartIds: new Set(),
|
|
180
|
-
projectMarkdownByStreamOrder: false,
|
|
181
|
-
sawAssistantDelta: false,
|
|
182
|
-
streamedThinkingContentByPartId: new Map(),
|
|
183
|
-
toolOutputStarted: new Set(),
|
|
184
|
-
reusedPlaceholderThinkingContentByPartId: new Map(),
|
|
185
|
-
};
|
|
186
|
-
stateByAssistantId.set(assistantId, next);
|
|
187
|
-
return next;
|
|
188
|
-
};
|
|
189
|
-
const replaceAssistantMarkdown = (assistantId, content) => {
|
|
190
|
-
opts.flushPendingAssistantOutput?.(assistantId);
|
|
191
|
-
opts.updateAssistant(assistantId, (message) => {
|
|
192
|
-
const nextParts = message.parts.filter((part) => part.type !== "markdown");
|
|
193
|
-
return nextParts.length === message.parts.length ? message : { ...message, parts: nextParts };
|
|
194
|
-
});
|
|
195
|
-
if (content)
|
|
196
|
-
opts.appendAssistantMarkdown(assistantId, content);
|
|
197
|
-
};
|
|
198
|
-
const markAssistantMarkdownSettled = (assistantId) => {
|
|
199
|
-
opts.updateAssistant(assistantId, (message) => {
|
|
200
|
-
let changed = false;
|
|
201
|
-
const parts = message.parts.map((part) => {
|
|
202
|
-
if (part.type !== "markdown" ||
|
|
203
|
-
Boolean(part._subagentTranscript) ||
|
|
204
|
-
part.streamMeta?.settled) {
|
|
205
|
-
return part;
|
|
206
|
-
}
|
|
207
|
-
changed = true;
|
|
208
|
-
return {
|
|
209
|
-
...part,
|
|
210
|
-
streamMeta: { ...part.streamMeta, settled: true },
|
|
211
|
-
};
|
|
212
|
-
});
|
|
213
|
-
return changed ? { ...message, parts } : message;
|
|
214
|
-
});
|
|
215
|
-
};
|
|
216
|
-
const replaceAssistantMarkdownSnapshot = (assistantId, content) => {
|
|
217
|
-
const finalContent = String(content ?? "");
|
|
218
|
-
opts.flushPendingAssistantOutput?.(assistantId);
|
|
219
|
-
opts.updateAssistant(assistantId, (message) => {
|
|
220
|
-
const nextParts = message.parts.filter((part) => part.type !== "markdown" || Boolean(part._subagentTranscript));
|
|
221
|
-
if (finalContent) {
|
|
222
|
-
nextParts.push({
|
|
223
|
-
type: "markdown",
|
|
224
|
-
markdown: finalContent,
|
|
225
|
-
streamMeta: { settled: true },
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
return { ...message, parts: nextParts };
|
|
229
|
-
});
|
|
230
|
-
};
|
|
231
|
-
const renderAssistantMarkdownStreams = (assistantId) => [...getAssistantState(assistantId).assistantMarkdownByStreamId.values()].join("");
|
|
232
|
-
const appendAssistantMarkdownDelta = (assistantId, delta, streamId) => {
|
|
233
|
-
const assistantState = getAssistantState(assistantId);
|
|
234
|
-
const resolvedStreamId = streamId ?? DEFAULT_ASSISTANT_MARKDOWN_STREAM_ID;
|
|
235
|
-
assistantState.assistantMarkdownByStreamId.set(resolvedStreamId, `${assistantState.assistantMarkdownByStreamId.get(resolvedStreamId) ?? ""}${delta}`);
|
|
236
|
-
if (assistantState.projectMarkdownByStreamOrder) {
|
|
237
|
-
replaceAssistantMarkdown(assistantId, renderAssistantMarkdownStreams(assistantId));
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
opts.appendAssistantMarkdown(assistantId, delta);
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
const replaceAssistantMarkdownWithFinalMessage = (assistantId, content) => {
|
|
244
|
-
const finalContent = String(content ?? "");
|
|
245
|
-
if (!finalContent)
|
|
246
|
-
return;
|
|
247
|
-
const previousText = readAssistantMarkdownText(opts.state.messages, assistantId);
|
|
248
|
-
if (previousText === finalContent) {
|
|
249
|
-
markAssistantMarkdownSettled(assistantId);
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
const assistantState = getAssistantState(assistantId);
|
|
253
|
-
assistantState.assistantMarkdownByStreamId.clear();
|
|
254
|
-
assistantState.assistantMarkdownByStreamId.set(DEFAULT_ASSISTANT_MARKDOWN_STREAM_ID, finalContent);
|
|
255
|
-
assistantState.projectMarkdownByStreamOrder = false;
|
|
256
|
-
replaceAssistantMarkdownSnapshot(assistantId, finalContent);
|
|
257
|
-
};
|
|
258
|
-
const resetAssistantMarkdown = (assistantId, streamId) => {
|
|
259
|
-
const assistantState = getAssistantState(assistantId);
|
|
260
|
-
if (streamId) {
|
|
261
|
-
if (assistantState.assistantMarkdownByStreamId.has(streamId)) {
|
|
262
|
-
assistantState.assistantMarkdownByStreamId.set(streamId, "");
|
|
263
|
-
assistantState.projectMarkdownByStreamOrder = true;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
else if (!streamId) {
|
|
267
|
-
assistantState.assistantMarkdownByStreamId.clear();
|
|
268
|
-
assistantState.projectMarkdownByStreamOrder = false;
|
|
269
|
-
}
|
|
270
|
-
replaceAssistantMarkdown(assistantId, renderAssistantMarkdownStreams(assistantId));
|
|
271
|
-
assistantState.sawAssistantDelta = assistantState.assistantMarkdownByStreamId.size > 0;
|
|
272
|
-
};
|
|
273
|
-
const findReusablePlaceholderThinkingPartId = (assistantId) => {
|
|
274
|
-
const assistantState = getAssistantState(assistantId);
|
|
275
|
-
for (const placeholderPartId of assistantState.placeholderThinkingPartIds) {
|
|
276
|
-
if (hasThinkingBlockWithId(opts.state.messages, assistantId, placeholderPartId)) {
|
|
277
|
-
return placeholderPartId;
|
|
278
|
-
}
|
|
279
|
-
assistantState.placeholderThinkingPartIds.delete(placeholderPartId);
|
|
280
|
-
}
|
|
281
|
-
return undefined;
|
|
282
|
-
};
|
|
283
|
-
const retargetThinkingBlockPartId = (assistantId, fromPartId, toPartId) => {
|
|
284
|
-
const normalizedFromPartId = normalizeText(fromPartId);
|
|
285
|
-
const normalizedToPartId = normalizeText(toPartId);
|
|
286
|
-
if (!normalizedFromPartId || !normalizedToPartId)
|
|
287
|
-
return false;
|
|
288
|
-
let retargeted = false;
|
|
289
|
-
opts.updateAssistant(assistantId, (message) => {
|
|
290
|
-
const parts = message.parts.slice();
|
|
291
|
-
const fromIndex = parts.findIndex((part) => part.type === "thinking" && normalizeText(part.partId) === normalizedFromPartId);
|
|
292
|
-
if (fromIndex < 0)
|
|
293
|
-
return message;
|
|
294
|
-
if (parts.some((part) => part.type === "thinking" && normalizeText(part.partId) === normalizedToPartId)) {
|
|
295
|
-
return message;
|
|
296
|
-
}
|
|
297
|
-
const previous = parts[fromIndex];
|
|
298
|
-
if (previous?.type !== "thinking")
|
|
299
|
-
return message;
|
|
300
|
-
parts[fromIndex] = { ...previous, partId: normalizedToPartId };
|
|
301
|
-
retargeted = true;
|
|
302
|
-
return { ...message, parts };
|
|
303
|
-
});
|
|
304
|
-
return retargeted;
|
|
305
|
-
};
|
|
306
|
-
const ensureVisibleToolCall = (assistantId, toolCallId, toolName, input = {}, meta) => {
|
|
307
|
-
const callId = normalizeText(toolCallId);
|
|
308
|
-
if (!callId)
|
|
309
|
-
return;
|
|
310
|
-
if (!hasToolCall(opts.state.messages, assistantId, callId)) {
|
|
311
|
-
opts.upsertToolCallDelta(assistantId, callId, canonicalToolName(toolName), "", undefined, meta);
|
|
312
|
-
}
|
|
313
|
-
opts.upsertToolCallEnd(assistantId, callId, canonicalToolName(toolName), input, undefined, meta);
|
|
314
|
-
};
|
|
315
|
-
const appendHiddenSubagentMarkdown = (assistantId, subagentId, turnId, delta) => {
|
|
316
|
-
const normalizedSubagentId = normalizeText(subagentId);
|
|
317
|
-
const text = String(delta ?? "");
|
|
318
|
-
if (!normalizedSubagentId || !text)
|
|
319
|
-
return;
|
|
320
|
-
const normalizedTurnId = normalizeText(turnId);
|
|
321
|
-
const updateHiddenAssistant = opts.updateAssistantHidden ?? opts.updateAssistant;
|
|
322
|
-
updateHiddenAssistant(assistantId, (message) => {
|
|
323
|
-
const parts = message.parts.slice();
|
|
324
|
-
let idx = -1;
|
|
325
|
-
for (let i = parts.length - 1; i >= 0; i--) {
|
|
326
|
-
const part = parts[i];
|
|
327
|
-
if (part?.type === "markdown" &&
|
|
328
|
-
part?._subagentTranscript === "text" &&
|
|
329
|
-
part?._subagentId === normalizedSubagentId &&
|
|
330
|
-
String(part?._subagentTurnId ?? "") === normalizedTurnId) {
|
|
331
|
-
idx = i;
|
|
332
|
-
break;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
if (idx >= 0) {
|
|
336
|
-
const prev = parts[idx];
|
|
337
|
-
if (prev?.type !== "markdown")
|
|
338
|
-
return message;
|
|
339
|
-
parts[idx] = {
|
|
340
|
-
...prev,
|
|
341
|
-
markdown: `${prev.markdown}${text}`,
|
|
342
|
-
streamMeta: {
|
|
343
|
-
...prev.streamMeta,
|
|
344
|
-
appendSeq: Number(prev.streamMeta?.appendSeq ?? 0) + 1,
|
|
345
|
-
lastAppendDelta: text,
|
|
346
|
-
},
|
|
347
|
-
};
|
|
348
|
-
return { ...message, parts };
|
|
349
|
-
}
|
|
350
|
-
parts.push({
|
|
351
|
-
type: "markdown",
|
|
352
|
-
markdown: text,
|
|
353
|
-
streamMeta: {
|
|
354
|
-
appendSeq: 1,
|
|
355
|
-
lastAppendDelta: text,
|
|
356
|
-
},
|
|
357
|
-
_subagentId: normalizedSubagentId,
|
|
358
|
-
_subagentTranscript: "text",
|
|
359
|
-
...(normalizedTurnId ? { _subagentTurnId: normalizedTurnId } : {}),
|
|
360
|
-
});
|
|
361
|
-
return { ...message, parts };
|
|
362
|
-
});
|
|
363
|
-
};
|
|
364
|
-
return {
|
|
365
|
-
apply(assistantId, event) {
|
|
366
|
-
const assistantState = getAssistantState(assistantId);
|
|
367
|
-
if (event.type === "thinking.started") {
|
|
368
|
-
if (event.subagentId)
|
|
369
|
-
return;
|
|
370
|
-
const existingLiveBlock = hasThinkingBlockWithId(opts.state.messages, assistantId, event.partId);
|
|
371
|
-
let reusesPlaceholder = false;
|
|
372
|
-
if (!existingLiveBlock) {
|
|
373
|
-
const reusablePlaceholderPartId = findReusablePlaceholderThinkingPartId(assistantId);
|
|
374
|
-
if (reusablePlaceholderPartId) {
|
|
375
|
-
const placeholderContent = readThinkingBlockContent(opts.state.messages, assistantId, reusablePlaceholderPartId);
|
|
376
|
-
reusesPlaceholder = retargetThinkingBlockPartId(assistantId, reusablePlaceholderPartId, event.partId);
|
|
377
|
-
if (reusesPlaceholder) {
|
|
378
|
-
assistantState.placeholderThinkingPartIds.delete(reusablePlaceholderPartId);
|
|
379
|
-
if (placeholderContent) {
|
|
380
|
-
assistantState.reusedPlaceholderThinkingContentByPartId.set(event.partId, placeholderContent);
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
if (!reusesPlaceholder) {
|
|
386
|
-
assistantState.streamedThinkingContentByPartId.set(event.partId, "");
|
|
387
|
-
}
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
if (event.type === "thinking.delta") {
|
|
391
|
-
if (event.subagentId)
|
|
392
|
-
return;
|
|
393
|
-
const nextThinking = `${assistantState.streamedThinkingContentByPartId.get(event.partId) ?? ""}${event.delta}`;
|
|
394
|
-
assistantState.streamedThinkingContentByPartId.set(event.partId, nextThinking);
|
|
395
|
-
const reusedPlaceholderContent = assistantState.reusedPlaceholderThinkingContentByPartId.get(event.partId);
|
|
396
|
-
const resolvedThinking = reusedPlaceholderContent?.startsWith(nextThinking)
|
|
397
|
-
? reusedPlaceholderContent
|
|
398
|
-
: nextThinking;
|
|
399
|
-
if (resolvedThinking !== reusedPlaceholderContent) {
|
|
400
|
-
assistantState.reusedPlaceholderThinkingContentByPartId.delete(event.partId);
|
|
401
|
-
}
|
|
402
|
-
if (!hasVisibleReasoningText(resolvedThinking))
|
|
403
|
-
return;
|
|
404
|
-
if (!hasThinkingBlockWithId(opts.state.messages, assistantId, event.partId)) {
|
|
405
|
-
opts.startNewThinkingBlock(assistantId, event.partId);
|
|
406
|
-
}
|
|
407
|
-
opts.setAssistantThinking(assistantId, resolvedThinking, event.partId);
|
|
408
|
-
return;
|
|
409
|
-
}
|
|
410
|
-
if (event.type === "thinking.finished") {
|
|
411
|
-
if (event.subagentId)
|
|
412
|
-
return;
|
|
413
|
-
const finalThinking = typeof event.content === "string"
|
|
414
|
-
? event.content
|
|
415
|
-
: assistantState.streamedThinkingContentByPartId.get(event.partId);
|
|
416
|
-
assistantState.streamedThinkingContentByPartId.delete(event.partId);
|
|
417
|
-
assistantState.reusedPlaceholderThinkingContentByPartId.delete(event.partId);
|
|
418
|
-
if (!hasVisibleReasoningText(finalThinking)) {
|
|
419
|
-
removeThinkingBlock(opts.updateAssistant, assistantId, event.partId);
|
|
420
|
-
return;
|
|
421
|
-
}
|
|
422
|
-
if (!hasThinkingBlockWithId(opts.state.messages, assistantId, event.partId)) {
|
|
423
|
-
opts.startNewThinkingBlock(assistantId, event.partId);
|
|
424
|
-
}
|
|
425
|
-
opts.setAssistantThinking(assistantId, finalThinking ?? "", event.partId);
|
|
426
|
-
opts.endThinkingBlock(assistantId, event.partId, finalThinking);
|
|
427
|
-
return;
|
|
428
|
-
}
|
|
429
|
-
if (event.type === "assistant.delta") {
|
|
430
|
-
if (isDelegationRecordedFinalMessage(event.delta))
|
|
431
|
-
return;
|
|
432
|
-
assistantState.sawAssistantDelta = true;
|
|
433
|
-
appendAssistantMarkdownDelta(assistantId, event.delta, event.streamId);
|
|
434
|
-
return;
|
|
435
|
-
}
|
|
436
|
-
if (event.type === "assistant.reset") {
|
|
437
|
-
resetAssistantMarkdown(assistantId, event.streamId);
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
if (event.type === "assistant.message") {
|
|
441
|
-
if (typeof event.message.thinking === "string") {
|
|
442
|
-
const thinking = event.message.thinking;
|
|
443
|
-
const hasThinkingPart = Boolean(findAssistant(opts.state.messages, assistantId)?.parts.some((part) => part.type === "thinking"));
|
|
444
|
-
if (!hasThinkingPart && hasVisibleReasoningText(thinking)) {
|
|
445
|
-
const partId = createLocalThinkingPartId(assistantId, 0);
|
|
446
|
-
opts.startNewThinkingBlock(assistantId, partId);
|
|
447
|
-
opts.setAssistantThinking(assistantId, thinking, partId);
|
|
448
|
-
opts.endThinkingBlock(assistantId, partId, thinking);
|
|
449
|
-
assistantState.placeholderThinkingPartIds.add(partId);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
const content = extractTextContent(event.message.content);
|
|
453
|
-
if (content && !isDelegationRecordedFinalMessage(content)) {
|
|
454
|
-
if (assistantState.sawAssistantDelta)
|
|
455
|
-
replaceAssistantMarkdownWithFinalMessage(assistantId, content);
|
|
456
|
-
else
|
|
457
|
-
replaceAssistantMarkdownSnapshot(assistantId, content);
|
|
458
|
-
}
|
|
459
|
-
return;
|
|
460
|
-
}
|
|
461
|
-
if (event.type === "tool.started") {
|
|
462
|
-
if (event.subagentId) {
|
|
463
|
-
const activity = formatSubagentToolActivity(event.toolName, event.input);
|
|
464
|
-
if (activity)
|
|
465
|
-
opts.upsertSubagentInfo(assistantId, event.subagentId, "activity", activity, {
|
|
466
|
-
subagentStream: "tool",
|
|
467
|
-
subagentTurnId: event.subagentTurnId,
|
|
468
|
-
});
|
|
469
|
-
return;
|
|
470
|
-
}
|
|
471
|
-
const meta = event.subagentTurnId || typeof event.startedAtMs === "number"
|
|
472
|
-
? {
|
|
473
|
-
subagentTurnId: event.subagentTurnId,
|
|
474
|
-
startedAtMs: event.startedAtMs,
|
|
475
|
-
}
|
|
476
|
-
: undefined;
|
|
477
|
-
ensureVisibleToolCall(assistantId, event.toolCallId, event.toolName, event.input, meta);
|
|
478
|
-
return;
|
|
479
|
-
}
|
|
480
|
-
if (event.type === "tool.delta") {
|
|
481
|
-
if (event.subagentId)
|
|
482
|
-
return;
|
|
483
|
-
const meta = event.subagentTurnId ? { subagentTurnId: event.subagentTurnId } : undefined;
|
|
484
|
-
if (event.kind === "input") {
|
|
485
|
-
if (!hasToolCall(opts.state.messages, assistantId, event.toolCallId)) {
|
|
486
|
-
opts.upsertToolCallDelta(assistantId, event.toolCallId, event.toolName, "", event.linesWritten, meta);
|
|
487
|
-
}
|
|
488
|
-
opts.upsertToolCallDelta(assistantId, event.toolCallId, event.toolName, event.delta, event.linesWritten, meta);
|
|
489
|
-
return;
|
|
490
|
-
}
|
|
491
|
-
const toolName = normalizeText(event.toolName) || event.toolCallId;
|
|
492
|
-
if (!assistantState.toolOutputStarted.has(event.toolCallId)) {
|
|
493
|
-
assistantState.toolOutputStarted.add(event.toolCallId);
|
|
494
|
-
opts.upsertToolOutputStart(assistantId, event.toolCallId, toolName, meta);
|
|
495
|
-
}
|
|
496
|
-
opts.appendToolOutputDelta(assistantId, event.toolCallId, toolName, event.delta, meta);
|
|
497
|
-
return;
|
|
498
|
-
}
|
|
499
|
-
if (event.type === "tool.finished") {
|
|
500
|
-
if (event.subagentId) {
|
|
501
|
-
assistantState.toolOutputStarted.delete(event.toolCallId);
|
|
502
|
-
if (event.isError) {
|
|
503
|
-
const name = canonicalToolName(event.toolName) || normalizeText(event.toolName) || "tool";
|
|
504
|
-
opts.upsertSubagentInfo(assistantId, event.subagentId, "activity", `${name} error`, {
|
|
505
|
-
subagentStream: "error",
|
|
506
|
-
subagentTurnId: event.subagentTurnId,
|
|
507
|
-
});
|
|
508
|
-
}
|
|
509
|
-
return;
|
|
510
|
-
}
|
|
511
|
-
const result = buildToolResult(event);
|
|
512
|
-
opts.attachToolResultPart(assistantId, result);
|
|
513
|
-
opts.scheduleToolResultHighlight?.(assistantId, result);
|
|
514
|
-
const toolNameLower = normalizeText(event.toolName).toLowerCase();
|
|
515
|
-
if (result.structuredContent && opts.upsertChecklistPartFromDimSdk) {
|
|
516
|
-
if (isTodoToolName(toolNameLower)) {
|
|
517
|
-
opts.upsertChecklistPartFromDimSdk(assistantId, "todo", event.toolCallId, result.structuredContent);
|
|
518
|
-
}
|
|
519
|
-
else if (isPlanToolName(toolNameLower)) {
|
|
520
|
-
opts.upsertChecklistPartFromDimSdk(assistantId, "plan", event.toolCallId, result.structuredContent);
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
return;
|
|
524
|
-
}
|
|
525
|
-
if (event.type === "action.required" && event.kind === "tool_approval") {
|
|
526
|
-
ensureVisibleToolCall(assistantId, event.toolCallId, event.toolName, event.args ?? {}, event.subagentId
|
|
527
|
-
? { subagentId: event.subagentId, subagentTurnId: event.subagentTurnId }
|
|
528
|
-
: undefined);
|
|
529
|
-
opts.insertApprovalPart(assistantId, buildApprovalRequest(event));
|
|
530
|
-
opts.setAssistantStatus(assistantId, t("chatStatus.awaitingApproval"));
|
|
531
|
-
return;
|
|
532
|
-
}
|
|
533
|
-
if (event.type === "action.required" && event.kind === "ask_user") {
|
|
534
|
-
if (!hasToolCall(opts.state.messages, assistantId, event.toolCallId ?? "")) {
|
|
535
|
-
ensureVisibleToolCall(assistantId, event.toolCallId, event.toolName, {});
|
|
536
|
-
}
|
|
537
|
-
opts.setAssistantStatus(assistantId, t("chatStatus.awaitingAnswers"));
|
|
538
|
-
return;
|
|
539
|
-
}
|
|
540
|
-
if (event.type === "subagent.started") {
|
|
541
|
-
const desc = normalizeText(event.taskDescription) || normalizeText(event.subagentId);
|
|
542
|
-
if (desc)
|
|
543
|
-
opts.upsertSubagentInfo(assistantId, event.subagentId, "header", desc);
|
|
544
|
-
return;
|
|
545
|
-
}
|
|
546
|
-
if (event.type === "subagent.output") {
|
|
547
|
-
const label = normalizeText(event.delta);
|
|
548
|
-
if (event.stream === "error") {
|
|
549
|
-
appendHiddenSubagentMarkdown(assistantId, event.subagentId, event.subagentTurnId, event.transcriptDelta ?? event.delta);
|
|
550
|
-
}
|
|
551
|
-
if (label && event.stream !== "text")
|
|
552
|
-
opts.upsertSubagentInfo(assistantId, event.subagentId, "activity", label, {
|
|
553
|
-
subagentStream: event.stream,
|
|
554
|
-
subagentTurnId: event.subagentTurnId,
|
|
555
|
-
});
|
|
556
|
-
return;
|
|
557
|
-
}
|
|
558
|
-
if (event.type === "subagent.state") {
|
|
559
|
-
if (event.state === "paused") {
|
|
560
|
-
setSubagentHeaderState(opts.updateAssistant, assistantId, event.subagentId, "paused");
|
|
561
|
-
return;
|
|
562
|
-
}
|
|
563
|
-
setSubagentHeaderState(opts.updateAssistant, assistantId, event.subagentId, undefined);
|
|
564
|
-
return;
|
|
565
|
-
}
|
|
566
|
-
if (event.type === "subagent.finished") {
|
|
567
|
-
const stateLabel = event.state === "completed" ? "done" : event.state;
|
|
568
|
-
opts.upsertSubagentInfo(assistantId, event.subagentId, "finished", stateLabel);
|
|
569
|
-
return;
|
|
570
|
-
}
|
|
571
|
-
if (event.type === "error.recorded") {
|
|
572
|
-
opts.appendAssistantMarkdown(assistantId, ["# Error", "", "```text", event.message, "```"].join("\n"));
|
|
573
|
-
}
|
|
574
|
-
},
|
|
575
|
-
clearAssistant(assistantId) {
|
|
576
|
-
stateByAssistantId.delete(assistantId);
|
|
577
|
-
},
|
|
578
|
-
};
|
|
579
|
-
}
|
|
580
|
-
//# sourceMappingURL=transcript-projector.js.map
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export type ToolSemantic = "ask_user" | "delegate" | "fetch_like" | "other" | "read_like" | "search_like" | "shell_like" | "write_like";
|
|
2
|
-
export declare function canonicalToolName(rawName: unknown): string;
|
|
3
|
-
export declare function toolSemantic(rawName: unknown): ToolSemantic;
|
|
4
|
-
export declare function toolDisplayLabel(rawName: unknown): string;
|
|
5
|
-
export declare function isAskUserToolName(rawName: unknown): boolean;
|
|
6
|
-
export declare function isDelegateToolName(rawName: unknown): boolean;
|
|
7
|
-
export declare function isShellLikeToolName(rawName: unknown): boolean;
|
|
8
|
-
export declare function isFetchLikeToolName(rawName: unknown): boolean;
|
|
9
|
-
export declare function isReadLikeToolName(rawName: unknown): boolean;
|
|
10
|
-
export declare function isSearchLikeToolName(rawName: unknown): boolean;
|
|
11
|
-
export declare function isWriteLikeToolName(rawName: unknown): boolean;
|
|
12
|
-
//# sourceMappingURL=tool-metadata.d.ts.map
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
const TOOL_ALIAS_MAP = {
|
|
2
|
-
ask_user: "ask-user",
|
|
3
|
-
askuserquestion: "ask-user",
|
|
4
|
-
contentsearch: "content-search",
|
|
5
|
-
glob: "workspace-search",
|
|
6
|
-
grep: "content-search",
|
|
7
|
-
read: "read-file",
|
|
8
|
-
websearch: "web-search",
|
|
9
|
-
webfetch: "fetch-url",
|
|
10
|
-
};
|
|
11
|
-
function normalizeText(value) {
|
|
12
|
-
return typeof value === "string" ? value.trim().toLowerCase() : "";
|
|
13
|
-
}
|
|
14
|
-
export function canonicalToolName(rawName) {
|
|
15
|
-
const normalized = normalizeText(rawName);
|
|
16
|
-
if (!normalized)
|
|
17
|
-
return "";
|
|
18
|
-
return TOOL_ALIAS_MAP[normalized] ?? normalized;
|
|
19
|
-
}
|
|
20
|
-
export function toolSemantic(rawName) {
|
|
21
|
-
switch (canonicalToolName(rawName)) {
|
|
22
|
-
case "ask-user":
|
|
23
|
-
return "ask_user";
|
|
24
|
-
case "delegate_tasks":
|
|
25
|
-
return "delegate";
|
|
26
|
-
case "shell":
|
|
27
|
-
return "shell_like";
|
|
28
|
-
case "fetch-url":
|
|
29
|
-
return "fetch_like";
|
|
30
|
-
case "read-file":
|
|
31
|
-
return "read_like";
|
|
32
|
-
case "content-search":
|
|
33
|
-
case "workspace-search":
|
|
34
|
-
case "web-search":
|
|
35
|
-
return "search_like";
|
|
36
|
-
case "write-artifact":
|
|
37
|
-
case "write-scratch":
|
|
38
|
-
case "write-workspace":
|
|
39
|
-
case "edit":
|
|
40
|
-
case "apply_patch":
|
|
41
|
-
return "write_like";
|
|
42
|
-
default:
|
|
43
|
-
return "other";
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
export function toolDisplayLabel(rawName) {
|
|
47
|
-
return canonicalToolName(rawName);
|
|
48
|
-
}
|
|
49
|
-
export function isAskUserToolName(rawName) {
|
|
50
|
-
return toolSemantic(rawName) === "ask_user";
|
|
51
|
-
}
|
|
52
|
-
export function isDelegateToolName(rawName) {
|
|
53
|
-
return toolSemantic(rawName) === "delegate";
|
|
54
|
-
}
|
|
55
|
-
export function isShellLikeToolName(rawName) {
|
|
56
|
-
return toolSemantic(rawName) === "shell_like";
|
|
57
|
-
}
|
|
58
|
-
export function isFetchLikeToolName(rawName) {
|
|
59
|
-
return toolSemantic(rawName) === "fetch_like";
|
|
60
|
-
}
|
|
61
|
-
export function isReadLikeToolName(rawName) {
|
|
62
|
-
return toolSemantic(rawName) === "read_like";
|
|
63
|
-
}
|
|
64
|
-
export function isSearchLikeToolName(rawName) {
|
|
65
|
-
return toolSemantic(rawName) === "search_like";
|
|
66
|
-
}
|
|
67
|
-
export function isWriteLikeToolName(rawName) {
|
|
68
|
-
return toolSemantic(rawName) === "write_like";
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=tool-metadata.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export declare function createLocalInteractivePartId(kind: 'thinking' | 'todo' | 'plan', ownerId: string, blockOrdinal: number): string;
|
|
2
|
-
export declare function createThinkingPartIdFromReasoningItem(itemId: string): string;
|
|
3
|
-
export declare function createThinkingPartIdFromStream(turnId: string, streamId: string): string;
|
|
4
|
-
export declare function createLocalThinkingPartId(ownerId: string, blockOrdinal: number): string;
|
|
5
|
-
export declare function createChecklistPartId(kind: 'todo' | 'plan', toolCallId: string): string;
|
|
6
|
-
//# sourceMappingURL=transcript-part-id.d.ts.map
|