@botbotgo/common 1.0.65
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/README.md +54 -0
- package/dist/chunk-GQZFDM3S.js +51 -0
- package/dist/chunk-GQZFDM3S.js.map +1 -0
- package/dist/chunk-HBCZVEUG.js +92 -0
- package/dist/chunk-HBCZVEUG.js.map +1 -0
- package/dist/chunk-OTWARMTU.js +182 -0
- package/dist/chunk-OTWARMTU.js.map +1 -0
- package/dist/chunk-P6CL7XSX.js +463 -0
- package/dist/chunk-P6CL7XSX.js.map +1 -0
- package/dist/chunk-QG6CT2GZ.js +31 -0
- package/dist/chunk-QG6CT2GZ.js.map +1 -0
- package/dist/chunk-RQSSJFDP.js +33 -0
- package/dist/chunk-RQSSJFDP.js.map +1 -0
- package/dist/chunk-X4TDNR4V.js +206 -0
- package/dist/chunk-X4TDNR4V.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +13 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/startup.d.ts +14 -0
- package/dist/config/hydrate.d.ts +15 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.js +27 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/kind.d.ts +28 -0
- package/dist/config/path.d.ts +14 -0
- package/dist/config/yaml.d.ts +32 -0
- package/dist/connectivity/check.d.ts +19 -0
- package/dist/connectivity/index.d.ts +3 -0
- package/dist/connectivity/index.js +102 -0
- package/dist/connectivity/index.js.map +1 -0
- package/dist/connectivity/types.d.ts +12 -0
- package/dist/context/default-context.d.ts +10 -0
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.js +16 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/tokens.d.ts +29 -0
- package/dist/events/index.d.ts +17 -0
- package/dist/events/index.js +20 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/progress-listener.d.ts +8 -0
- package/dist/events/runtime2-tree-listener.d.ts +26 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/npm/cache.d.ts +9 -0
- package/dist/npm/command.d.ts +36 -0
- package/dist/npm/index.d.ts +1 -0
- package/dist/npm/index.js +29 -0
- package/dist/npm/index.js.map +1 -0
- package/dist/npm/install.d.ts +8 -0
- package/dist/npm/provider.d.ts +14 -0
- package/dist/npm/version.d.ts +11 -0
- package/dist/security-store/backends/file/index.d.ts +19 -0
- package/dist/security-store/backends/index.d.ts +7 -0
- package/dist/security-store/backends/keychain/constants.d.ts +4 -0
- package/dist/security-store/backends/keychain/index.d.ts +17 -0
- package/dist/security-store/backends/keychain/keytar.d.ts +5 -0
- package/dist/security-store/backends/keychain/swift-bridge.d.ts +17 -0
- package/dist/security-store/backends/keychain/utils.d.ts +11 -0
- package/dist/security-store/backends/memory/index.d.ts +10 -0
- package/dist/security-store/backends/types.d.ts +29 -0
- package/dist/security-store/backends/utils.d.ts +2 -0
- package/dist/security-store/index.d.ts +2 -0
- package/dist/security-store/index.js +819 -0
- package/dist/security-store/index.js.map +1 -0
- package/dist/security-store/store.d.ts +49 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.js +7 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/utils/agent-result.d.ts +4 -0
- package/dist/utils/checksum.d.ts +16 -0
- package/dist/utils/deep-merge.d.ts +4 -0
- package/dist/utils/frontmatter.d.ts +12 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.js +38 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/log.d.ts +1 -0
- package/dist/utils/object.d.ts +4 -0
- package/dist/utils/override-with-config.d.ts +12 -0
- package/dist/utils/parsing.d.ts +4 -0
- package/dist/utils/selection/tool-choice.d.ts +1 -0
- package/dist/utils/selection/tool-registry.d.ts +5 -0
- package/package.json +128 -0
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import {
|
|
2
|
+
asRecord,
|
|
3
|
+
asTrimmedString,
|
|
4
|
+
parseJsonObject,
|
|
5
|
+
shortToolName
|
|
6
|
+
} from "./chunk-OTWARMTU.js";
|
|
7
|
+
import {
|
|
8
|
+
AgentContextTokens
|
|
9
|
+
} from "./chunk-RQSSJFDP.js";
|
|
10
|
+
import {
|
|
11
|
+
getDefaultAgentContext
|
|
12
|
+
} from "./chunk-GQZFDM3S.js";
|
|
13
|
+
|
|
14
|
+
// src/events/progress-listener.ts
|
|
15
|
+
function formatElapsed(ms) {
|
|
16
|
+
return `${Math.max(0, Math.round(ms))}ms`;
|
|
17
|
+
}
|
|
18
|
+
function formatStepNumber(stepNumber) {
|
|
19
|
+
return String(Math.max(0, stepNumber)).padStart(2, "0");
|
|
20
|
+
}
|
|
21
|
+
function hasAny(record, keys) {
|
|
22
|
+
return keys.some((key) => key in record);
|
|
23
|
+
}
|
|
24
|
+
function summarizeAction(args, toolName, fallback) {
|
|
25
|
+
const record = asRecord(args) ?? parseJsonObject(args);
|
|
26
|
+
if (!record) return fallback;
|
|
27
|
+
const tool = shortToolName(toolName);
|
|
28
|
+
const command = asTrimmedString(record.command);
|
|
29
|
+
const path = asTrimmedString(record.path);
|
|
30
|
+
const isListDirShape = hasAny(record, ["maxEntries", "recursive", "maxDepth", "includeHidden"]);
|
|
31
|
+
const isReadTextShape = hasAny(record, ["maxBytes", "startLine", "endLine", "encoding"]);
|
|
32
|
+
if (tool === "runCommand" && command) return `run command: ${command}`;
|
|
33
|
+
if (tool.includes("itermRunCommandInSession") && command) return `run command: ${command}`;
|
|
34
|
+
if (tool === "listDir" || Boolean(path) && isListDirShape) {
|
|
35
|
+
if (!path || path === ".") return "list directory";
|
|
36
|
+
return `list directory: ${path}`;
|
|
37
|
+
}
|
|
38
|
+
if (tool === "readText" || Boolean(path) && isReadTextShape) {
|
|
39
|
+
if (!path) return "read file";
|
|
40
|
+
return `read file: ${path}`;
|
|
41
|
+
}
|
|
42
|
+
if (command) return `run command: ${command}`;
|
|
43
|
+
const query = asTrimmedString(record.query);
|
|
44
|
+
if (query) return `search/query: ${query}`;
|
|
45
|
+
if (path) return `read path: ${path}`;
|
|
46
|
+
return fallback;
|
|
47
|
+
}
|
|
48
|
+
function getResultError(payload) {
|
|
49
|
+
const payloadRecord = asRecord(payload);
|
|
50
|
+
const result = payloadRecord?.result;
|
|
51
|
+
const resultRecord = asRecord(result) ?? parseJsonObject(result);
|
|
52
|
+
const nestedResult = asRecord(resultRecord?.result);
|
|
53
|
+
return asTrimmedString(nestedResult?.error) ?? asTrimmedString(resultRecord?.error);
|
|
54
|
+
}
|
|
55
|
+
function getResultPreview(payload) {
|
|
56
|
+
const payloadRecord = asRecord(payload);
|
|
57
|
+
const directPreview = asTrimmedString(payloadRecord?.resultPreview);
|
|
58
|
+
if (directPreview) return directPreview;
|
|
59
|
+
const result = payloadRecord?.result;
|
|
60
|
+
const resultRecord = asRecord(result) ?? parseJsonObject(result);
|
|
61
|
+
const nestedResult = asRecord(resultRecord?.result);
|
|
62
|
+
const preview = asTrimmedString(nestedResult?.outputText) ?? asTrimmedString(nestedResult?.output) ?? asTrimmedString(resultRecord?.output) ?? asTrimmedString(resultRecord?.outputText);
|
|
63
|
+
return preview ? preview.replace(/\s+/g, " ").trim() : null;
|
|
64
|
+
}
|
|
65
|
+
function writeProgress(writer, state) {
|
|
66
|
+
writer(` progress ${state.completedSteps}/${state.startedSteps}`);
|
|
67
|
+
}
|
|
68
|
+
function onRunStart(writer, state, runLabelText) {
|
|
69
|
+
state.runStartedAtMs = Date.now();
|
|
70
|
+
state.startedSteps = 0;
|
|
71
|
+
state.completedSteps = 0;
|
|
72
|
+
state.currentStep = 0;
|
|
73
|
+
state.steps.clear();
|
|
74
|
+
state.pendingStepNumbers = [];
|
|
75
|
+
writer("");
|
|
76
|
+
writer(`=== Steps: ${runLabelText} ===`);
|
|
77
|
+
writer(`[${formatStepNumber(0)}] \u25B6 understand request and plan next action`);
|
|
78
|
+
}
|
|
79
|
+
function onRunDone(writer, state) {
|
|
80
|
+
const elapsed = state.runStartedAtMs === null ? "?" : formatElapsed(Date.now() - state.runStartedAtMs);
|
|
81
|
+
writer(`[${formatStepNumber(0)}] \u2713 understand request and plan next action`);
|
|
82
|
+
writeProgress(writer, state);
|
|
83
|
+
writer(`=== Steps complete: ${state.completedSteps} step(s), ${elapsed} ===`);
|
|
84
|
+
writer("");
|
|
85
|
+
}
|
|
86
|
+
function onToolStart(writer, state, event, reasonForAction) {
|
|
87
|
+
state.currentStep += 1;
|
|
88
|
+
state.startedSteps += 1;
|
|
89
|
+
const stepNumber = state.currentStep;
|
|
90
|
+
const payload = asRecord(event.payload);
|
|
91
|
+
const action = summarizeAction(payload?.args, event.to, `invoke tool: ${shortToolName(event.to)}`);
|
|
92
|
+
state.steps.set(stepNumber, { action, startedAtMs: Date.now() });
|
|
93
|
+
state.pendingStepNumbers.push(stepNumber);
|
|
94
|
+
writer(`[${formatStepNumber(stepNumber)}] \u25B6 ${action}`);
|
|
95
|
+
writer(` tool: ${shortToolName(event.to)}`);
|
|
96
|
+
const reason = reasonForAction?.(action);
|
|
97
|
+
if (reason) writer(` reason: ${reason}`);
|
|
98
|
+
}
|
|
99
|
+
function onToolDoneWithPayload(writer, state, event) {
|
|
100
|
+
const stepNumber = state.pendingStepNumbers.shift() ?? state.currentStep;
|
|
101
|
+
const step = state.steps.get(stepNumber);
|
|
102
|
+
const error = getResultError(event.payload);
|
|
103
|
+
const preview = getResultPreview(event.payload);
|
|
104
|
+
const elapsed = step ? formatElapsed(Date.now() - step.startedAtMs) : "?";
|
|
105
|
+
if (error) {
|
|
106
|
+
writer(`[${formatStepNumber(stepNumber)}] \u2716 ${step?.action ?? "tool invocation"}`);
|
|
107
|
+
writer(` error: ${error}`);
|
|
108
|
+
} else {
|
|
109
|
+
writer(`[${formatStepNumber(stepNumber)}] \u2713 ${step?.action ?? "tool invocation"} (${elapsed})`);
|
|
110
|
+
if (preview) writer(` observation: ${preview}`);
|
|
111
|
+
}
|
|
112
|
+
state.steps.delete(stepNumber);
|
|
113
|
+
state.completedSteps += 1;
|
|
114
|
+
writeProgress(writer, state);
|
|
115
|
+
}
|
|
116
|
+
function onToolError(writer, state, event) {
|
|
117
|
+
const stepNumber = state.pendingStepNumbers.shift() ?? state.currentStep;
|
|
118
|
+
const step = state.steps.get(stepNumber);
|
|
119
|
+
const payload = asRecord(event.payload);
|
|
120
|
+
const error = asTrimmedString(payload?.error) ?? "unknown error";
|
|
121
|
+
writer(`[${formatStepNumber(stepNumber)}] \u2716 ${step?.action ?? "tool invocation"}`);
|
|
122
|
+
writer(` error: ${error}`);
|
|
123
|
+
state.steps.delete(stepNumber);
|
|
124
|
+
state.completedSteps += 1;
|
|
125
|
+
writeProgress(writer, state);
|
|
126
|
+
}
|
|
127
|
+
function createProgressAgentEventListener(options = {}) {
|
|
128
|
+
const writer = options.writer ?? console.log;
|
|
129
|
+
const runLabelReact = options.runLabelReact ?? "analysis";
|
|
130
|
+
const runLabelDeep = options.runLabelDeep ?? "deep analysis";
|
|
131
|
+
const state = {
|
|
132
|
+
runStartedAtMs: null,
|
|
133
|
+
startedSteps: 0,
|
|
134
|
+
completedSteps: 0,
|
|
135
|
+
currentStep: 0,
|
|
136
|
+
steps: /* @__PURE__ */ new Map(),
|
|
137
|
+
pendingStepNumbers: []
|
|
138
|
+
};
|
|
139
|
+
return (event) => {
|
|
140
|
+
switch (event.name) {
|
|
141
|
+
case "agent.react.run.start":
|
|
142
|
+
onRunStart(writer, state, runLabelReact);
|
|
143
|
+
return;
|
|
144
|
+
case "agent.deep.run.start":
|
|
145
|
+
onRunStart(writer, state, runLabelDeep);
|
|
146
|
+
return;
|
|
147
|
+
case "agent.react.skill.matched":
|
|
148
|
+
case "agent.deep.skill.matched": {
|
|
149
|
+
const payload = asRecord(event.payload);
|
|
150
|
+
const skillName = asTrimmedString(payload?.skill) ?? "unknown";
|
|
151
|
+
writer(` skill: ${skillName}`);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
case "agent.react.context.truncated":
|
|
155
|
+
case "agent.deep.context.truncated":
|
|
156
|
+
writer(" context: truncated and compacted");
|
|
157
|
+
return;
|
|
158
|
+
case "agent.react.tool.invoke.start":
|
|
159
|
+
onToolStart(writer, state, event, options.reasonForAction);
|
|
160
|
+
return;
|
|
161
|
+
case "agent.react.tool.invoke.done":
|
|
162
|
+
onToolDoneWithPayload(writer, state, event);
|
|
163
|
+
return;
|
|
164
|
+
case "agent.react.tool.invoke.error":
|
|
165
|
+
onToolError(writer, state, event);
|
|
166
|
+
return;
|
|
167
|
+
case "agent.react.memory.write.start":
|
|
168
|
+
writer(" memory: write started");
|
|
169
|
+
return;
|
|
170
|
+
case "agent.react.memory.write.done":
|
|
171
|
+
writer(" memory: write completed");
|
|
172
|
+
return;
|
|
173
|
+
case "agent.react.memory.write.error":
|
|
174
|
+
writer(" memory: write failed");
|
|
175
|
+
return;
|
|
176
|
+
case "agent.react.ptc.retry": {
|
|
177
|
+
const payload = asRecord(event.payload);
|
|
178
|
+
const retry = payload?.retry;
|
|
179
|
+
const reason = asTrimmedString(payload?.reason);
|
|
180
|
+
writer(` planning retry: attempt ${String(retry ?? "?")}${reason ? `, reason=${reason}` : ""}`);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
case "agent.react.run.done":
|
|
184
|
+
case "agent.deep.run.done":
|
|
185
|
+
onRunDone(writer, state);
|
|
186
|
+
return;
|
|
187
|
+
default:
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// src/events/runtime2-tree-listener.ts
|
|
194
|
+
function createRuntime2TreeEventListener(options = {}) {
|
|
195
|
+
const writer = options.writer ?? console.error;
|
|
196
|
+
const debugConfig = resolveRuntime2DebugConfig(options.runtimeConfig);
|
|
197
|
+
let currentRunThread = null;
|
|
198
|
+
const toolCalls = /* @__PURE__ */ new Map();
|
|
199
|
+
return (event) => {
|
|
200
|
+
const payload = asRecord2(event.payload);
|
|
201
|
+
if (shouldSkipRuntime2Event(event.name, debugConfig)) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const lines = buildTreeLines(event, payload, currentRunThread, toolCalls);
|
|
205
|
+
if (event.name === "agent.runtime2.run.start") {
|
|
206
|
+
currentRunThread = typeof payload?.threadId === "string" ? payload.threadId : null;
|
|
207
|
+
toolCalls.clear();
|
|
208
|
+
} else if (event.name === "agent.runtime2.run.done" || event.name === "agent.runtime2.run.error") {
|
|
209
|
+
currentRunThread = null;
|
|
210
|
+
toolCalls.clear();
|
|
211
|
+
}
|
|
212
|
+
for (const line of lines) {
|
|
213
|
+
writer(line);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
function resolveRuntime2DebugConfig(runtimeConfig) {
|
|
218
|
+
if (runtimeConfig?.debug) {
|
|
219
|
+
return {
|
|
220
|
+
run: runtimeConfig.debug.run ?? true,
|
|
221
|
+
workspace: runtimeConfig.debug.workspace ?? true,
|
|
222
|
+
toolCall: runtimeConfig.debug.toolCall ?? true,
|
|
223
|
+
stream: runtimeConfig.debug.stream ?? false,
|
|
224
|
+
close: runtimeConfig.debug.close ?? true
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
switch (runtimeConfig?.eventLogLevel ?? "tools") {
|
|
228
|
+
case "silent":
|
|
229
|
+
return { run: false, workspace: false, toolCall: false, stream: false, close: false };
|
|
230
|
+
case "lifecycle":
|
|
231
|
+
return { run: true, workspace: true, toolCall: false, stream: false, close: true };
|
|
232
|
+
case "verbose":
|
|
233
|
+
return { run: true, workspace: true, toolCall: true, stream: true, close: true };
|
|
234
|
+
case "tools":
|
|
235
|
+
default:
|
|
236
|
+
return { run: true, workspace: true, toolCall: true, stream: false, close: true };
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function shouldSkipRuntime2Event(name, debugConfig) {
|
|
240
|
+
if (name.startsWith("agent.runtime2.stream.")) {
|
|
241
|
+
return !debugConfig.stream;
|
|
242
|
+
}
|
|
243
|
+
if (name.startsWith("agent.runtime2.tool.call.")) {
|
|
244
|
+
return !debugConfig.toolCall;
|
|
245
|
+
}
|
|
246
|
+
if (name.startsWith("agent.runtime2.workspace.")) {
|
|
247
|
+
if (name === "agent.runtime2.workspace.prepare" || name === "agent.runtime2.workspace.run.update") {
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
return !debugConfig.workspace;
|
|
251
|
+
}
|
|
252
|
+
if (name.startsWith("agent.runtime2.run.")) {
|
|
253
|
+
if (name === "agent.runtime2.run.prepare") {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
return !debugConfig.run;
|
|
257
|
+
}
|
|
258
|
+
if (name.startsWith("agent.runtime2.close.")) {
|
|
259
|
+
return !debugConfig.close;
|
|
260
|
+
}
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
function buildTreeLines(event, payload, currentRunThread, toolCalls) {
|
|
264
|
+
const from = shortComponent(event.from);
|
|
265
|
+
const to = shortComponent(event.to);
|
|
266
|
+
const action = event.name.replace(/^agent\.runtime2\./, "");
|
|
267
|
+
const details = summarizePayload(event.name, payload);
|
|
268
|
+
const suffix = details ? ` | ${details}` : "";
|
|
269
|
+
if (event.name === "agent.runtime2.run.start") {
|
|
270
|
+
return [
|
|
271
|
+
`run ${typeof payload?.threadId === "string" ? payload.threadId : ""}`.trim(),
|
|
272
|
+
`\u251C\u2500 ${from} -> ${to} | ${action}${suffix}`
|
|
273
|
+
];
|
|
274
|
+
}
|
|
275
|
+
if (event.name === "agent.runtime2.run.done" || event.name === "agent.runtime2.run.error") {
|
|
276
|
+
return [`\u2514\u2500 ${from} -> ${to} | ${action}${suffix}`];
|
|
277
|
+
}
|
|
278
|
+
if (event.name === "agent.runtime2.tool.call.start") {
|
|
279
|
+
const id = typeof payload?.toolCallId === "string" ? payload.toolCallId : "";
|
|
280
|
+
if (id) {
|
|
281
|
+
toolCalls.set(id, {
|
|
282
|
+
toolName: to,
|
|
283
|
+
args: asRecord2(payload?.args)
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
return [];
|
|
287
|
+
}
|
|
288
|
+
if (event.name === "agent.runtime2.tool.call.done" || event.name === "agent.runtime2.tool.call.error" || event.name === "agent.runtime2.tool.call.blocked") {
|
|
289
|
+
const id = typeof payload?.toolCallId === "string" ? payload.toolCallId : "";
|
|
290
|
+
const remembered = id ? toolCalls.get(id) : void 0;
|
|
291
|
+
if (id) {
|
|
292
|
+
toolCalls.delete(id);
|
|
293
|
+
}
|
|
294
|
+
const icon = event.name === "agent.runtime2.tool.call.done" ? "OK" : event.name === "agent.runtime2.tool.call.blocked" ? "BLOCKED" : "ERROR";
|
|
295
|
+
const combined = compactFields([
|
|
296
|
+
summarizeToolArgs(remembered?.args),
|
|
297
|
+
details
|
|
298
|
+
]);
|
|
299
|
+
return [`\u251C\u2500 ${icon} ${remembered?.toolName ?? from}${combined ? ` | ${combined}` : ""}`];
|
|
300
|
+
}
|
|
301
|
+
const prefix = currentRunThread ? "\u251C\u2500" : "\u2022";
|
|
302
|
+
return [`${prefix} ${from} -> ${to} | ${action}${suffix}`];
|
|
303
|
+
}
|
|
304
|
+
function summarizePayload(name, payload) {
|
|
305
|
+
switch (name) {
|
|
306
|
+
case "agent.runtime2.run.start":
|
|
307
|
+
return typeof payload?.threadId === "string" ? `thread=${payload.threadId}` : null;
|
|
308
|
+
case "agent.runtime2.run.done":
|
|
309
|
+
return compactFields([
|
|
310
|
+
formatField("steps", payload?.stepCount),
|
|
311
|
+
formatDuration(payload?.durationMs),
|
|
312
|
+
formatField("summary", payload?.lastSummary)
|
|
313
|
+
]);
|
|
314
|
+
case "agent.runtime2.run.error":
|
|
315
|
+
return compactFields([
|
|
316
|
+
formatField("summary", payload?.lastSummary),
|
|
317
|
+
formatField("error", payload?.error)
|
|
318
|
+
]);
|
|
319
|
+
case "agent.runtime2.stream.summary":
|
|
320
|
+
return typeof payload?.summary === "string" ? payload.summary : null;
|
|
321
|
+
case "agent.runtime2.stream.heartbeat":
|
|
322
|
+
return formatDuration(payload?.elapsedMs);
|
|
323
|
+
case "agent.runtime2.tool.call.done":
|
|
324
|
+
case "agent.runtime2.tool.call.error":
|
|
325
|
+
case "agent.runtime2.tool.call.blocked":
|
|
326
|
+
return compactFields([
|
|
327
|
+
formatDuration(payload?.durationMs),
|
|
328
|
+
formatField("reason", payload?.reason),
|
|
329
|
+
formatField("error", payload?.error)
|
|
330
|
+
]);
|
|
331
|
+
case "agent.runtime2.workspace.run.update":
|
|
332
|
+
case "agent.runtime2.workspace.run.finish":
|
|
333
|
+
return compactFields([
|
|
334
|
+
formatField("steps", payload?.stepCount),
|
|
335
|
+
formatField("summary", payload?.lastSummary),
|
|
336
|
+
formatField("status", payload?.status)
|
|
337
|
+
]);
|
|
338
|
+
case "agent.runtime2.run.retry.empty":
|
|
339
|
+
case "agent.runtime2.run.retry.incomplete":
|
|
340
|
+
case "agent.runtime2.run.retry.idle_timeout":
|
|
341
|
+
case "agent.runtime2.run.retry.transient_model":
|
|
342
|
+
case "agent.runtime2.run.retry.tool_call":
|
|
343
|
+
return compactFields([
|
|
344
|
+
formatField("attempt", formatAttempt(payload?.attempt, payload?.maxRetries)),
|
|
345
|
+
formatField("summary", payload?.lastSummary),
|
|
346
|
+
formatField("error", payload?.error)
|
|
347
|
+
]);
|
|
348
|
+
default:
|
|
349
|
+
return compactFields([
|
|
350
|
+
formatField("thread", payload?.threadId),
|
|
351
|
+
formatField("steps", payload?.stepCount),
|
|
352
|
+
formatField("status", payload?.status)
|
|
353
|
+
]);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function summarizeToolArgs(args) {
|
|
357
|
+
if (!args) {
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
return compactFields([
|
|
361
|
+
formatArg("path", args.file_path ?? args.path),
|
|
362
|
+
formatArg("query", args.query),
|
|
363
|
+
formatArg("symbol", args.symbol),
|
|
364
|
+
formatArg("ticker", args.ticker),
|
|
365
|
+
formatArg("command", args.command),
|
|
366
|
+
formatArg("subagent_type", args.subagent_type)
|
|
367
|
+
]);
|
|
368
|
+
}
|
|
369
|
+
function formatArg(key, value) {
|
|
370
|
+
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
const text = String(value).trim();
|
|
374
|
+
if (!text) {
|
|
375
|
+
return null;
|
|
376
|
+
}
|
|
377
|
+
return `${key}=${truncate(text, 80)}`;
|
|
378
|
+
}
|
|
379
|
+
function formatField(key, value) {
|
|
380
|
+
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
383
|
+
const text = String(value).trim();
|
|
384
|
+
if (!text) {
|
|
385
|
+
return null;
|
|
386
|
+
}
|
|
387
|
+
return `${key}=${truncate(text, 80)}`;
|
|
388
|
+
}
|
|
389
|
+
function formatAttempt(attempt, maxRetries) {
|
|
390
|
+
if (typeof attempt !== "number") {
|
|
391
|
+
return null;
|
|
392
|
+
}
|
|
393
|
+
return typeof maxRetries === "number" ? `${attempt}/${maxRetries}` : String(attempt);
|
|
394
|
+
}
|
|
395
|
+
function formatDuration(durationMs) {
|
|
396
|
+
if (typeof durationMs !== "number") {
|
|
397
|
+
return null;
|
|
398
|
+
}
|
|
399
|
+
if (durationMs < 1e3) {
|
|
400
|
+
return `elapsed=${Math.round(durationMs)}ms`;
|
|
401
|
+
}
|
|
402
|
+
if (durationMs < 1e4) {
|
|
403
|
+
return `elapsed=${(durationMs / 1e3).toFixed(2)}s`;
|
|
404
|
+
}
|
|
405
|
+
return `elapsed=${(durationMs / 1e3).toFixed(1)}s`;
|
|
406
|
+
}
|
|
407
|
+
function shortComponent(value) {
|
|
408
|
+
return (value ?? "?").replace(/^agent-runtime2\./, "");
|
|
409
|
+
}
|
|
410
|
+
function compactFields(fields) {
|
|
411
|
+
const items = fields.filter((field) => Boolean(field));
|
|
412
|
+
return items.length > 0 ? items.join(", ") : null;
|
|
413
|
+
}
|
|
414
|
+
function truncate(value, maxLength) {
|
|
415
|
+
return value.length > maxLength ? `${value.slice(0, maxLength - 3)}...` : value;
|
|
416
|
+
}
|
|
417
|
+
function asRecord2(value) {
|
|
418
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// src/events/index.ts
|
|
422
|
+
var DefaultAgentEventBus = class {
|
|
423
|
+
listeners = /* @__PURE__ */ new Set();
|
|
424
|
+
publish(event) {
|
|
425
|
+
const resolved = {
|
|
426
|
+
...event,
|
|
427
|
+
id: `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`,
|
|
428
|
+
at: (/* @__PURE__ */ new Date()).toISOString()
|
|
429
|
+
};
|
|
430
|
+
for (const listener of this.listeners) {
|
|
431
|
+
try {
|
|
432
|
+
listener(resolved);
|
|
433
|
+
} catch {
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return resolved;
|
|
437
|
+
}
|
|
438
|
+
subscribe(listener) {
|
|
439
|
+
this.listeners.add(listener);
|
|
440
|
+
return () => {
|
|
441
|
+
this.listeners.delete(listener);
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
function createAgentEventBus() {
|
|
446
|
+
const bus = new DefaultAgentEventBus();
|
|
447
|
+
getDefaultAgentContext().set(AgentContextTokens.EventBus, bus);
|
|
448
|
+
return bus;
|
|
449
|
+
}
|
|
450
|
+
function createConsoleAgentEventListener(writer = console.error) {
|
|
451
|
+
return (event) => {
|
|
452
|
+
writer(`[${event.at}] ${event.from} -> ${event.to} ${event.name}`);
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
export {
|
|
457
|
+
createProgressAgentEventListener,
|
|
458
|
+
createRuntime2TreeEventListener,
|
|
459
|
+
resolveRuntime2DebugConfig,
|
|
460
|
+
createAgentEventBus,
|
|
461
|
+
createConsoleAgentEventListener
|
|
462
|
+
};
|
|
463
|
+
//# sourceMappingURL=chunk-P6CL7XSX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/events/progress-listener.ts","../src/events/runtime2-tree-listener.ts","../src/events/index.ts"],"sourcesContent":["import type { AgentEvent, AgentEventListener } from \"./index.js\";\nimport { asRecord, asTrimmedString, parseJsonObject, shortToolName } from \"../utils/index.js\";\n\ninterface ToolStep {\n action: string;\n startedAtMs: number;\n}\n\ninterface ProgressState {\n runStartedAtMs: number | null;\n startedSteps: number;\n completedSteps: number;\n currentStep: number;\n steps: Map<number, ToolStep>;\n pendingStepNumbers: number[];\n}\n\nexport interface ProgressEventListenerOptions {\n writer?: (line: string) => void;\n runLabelReact?: string;\n runLabelDeep?: string;\n reasonForAction?: (action: string) => string | null;\n}\n\nfunction formatElapsed(ms: number): string {\n return `${Math.max(0, Math.round(ms))}ms`;\n}\n\nfunction formatStepNumber(stepNumber: number): string {\n return String(Math.max(0, stepNumber)).padStart(2, \"0\");\n}\n\nfunction hasAny(record: Record<string, unknown>, keys: string[]): boolean {\n return keys.some((key) => key in record);\n}\n\nfunction summarizeAction(args: unknown, toolName: string, fallback: string): string {\n const record = asRecord(args) ?? parseJsonObject(args);\n if (!record) return fallback;\n const tool = shortToolName(toolName);\n const command = asTrimmedString(record.command);\n const path = asTrimmedString(record.path);\n const isListDirShape = hasAny(record, [\"maxEntries\", \"recursive\", \"maxDepth\", \"includeHidden\"]);\n const isReadTextShape = hasAny(record, [\"maxBytes\", \"startLine\", \"endLine\", \"encoding\"]);\n if (tool === \"runCommand\" && command) return `run command: ${command}`;\n if (tool.includes(\"itermRunCommandInSession\") && command) return `run command: ${command}`;\n if (tool === \"listDir\" || (Boolean(path) && isListDirShape)) {\n if (!path || path === \".\") return \"list directory\";\n return `list directory: ${path}`;\n }\n if (tool === \"readText\" || (Boolean(path) && isReadTextShape)) {\n if (!path) return \"read file\";\n return `read file: ${path}`;\n }\n if (command) return `run command: ${command}`;\n const query = asTrimmedString(record.query);\n if (query) return `search/query: ${query}`;\n if (path) return `read path: ${path}`;\n return fallback;\n}\n\nfunction getResultError(payload: unknown): string | null {\n const payloadRecord = asRecord(payload);\n const result = payloadRecord?.result;\n const resultRecord = asRecord(result) ?? parseJsonObject(result);\n const nestedResult = asRecord(resultRecord?.result);\n return asTrimmedString(nestedResult?.error) ?? asTrimmedString(resultRecord?.error);\n}\n\nfunction getResultPreview(payload: unknown): string | null {\n const payloadRecord = asRecord(payload);\n const directPreview = asTrimmedString(payloadRecord?.resultPreview);\n if (directPreview) return directPreview;\n\n const result = payloadRecord?.result;\n const resultRecord = asRecord(result) ?? parseJsonObject(result);\n const nestedResult = asRecord(resultRecord?.result);\n const preview =\n asTrimmedString(nestedResult?.outputText)\n ?? asTrimmedString(nestedResult?.output)\n ?? asTrimmedString(resultRecord?.output)\n ?? asTrimmedString(resultRecord?.outputText);\n return preview ? preview.replace(/\\s+/g, \" \").trim() : null;\n}\n\nfunction writeProgress(writer: (line: string) => void, state: ProgressState): void {\n writer(` progress ${state.completedSteps}/${state.startedSteps}`);\n}\n\nfunction onRunStart(writer: (line: string) => void, state: ProgressState, runLabelText: string): void {\n state.runStartedAtMs = Date.now();\n state.startedSteps = 0;\n state.completedSteps = 0;\n state.currentStep = 0;\n state.steps.clear();\n state.pendingStepNumbers = [];\n writer(\"\");\n writer(`=== Steps: ${runLabelText} ===`);\n writer(`[${formatStepNumber(0)}] ▶ understand request and plan next action`);\n}\n\nfunction onRunDone(writer: (line: string) => void, state: ProgressState): void {\n const elapsed = state.runStartedAtMs === null ? \"?\" : formatElapsed(Date.now() - state.runStartedAtMs);\n writer(`[${formatStepNumber(0)}] ✓ understand request and plan next action`);\n writeProgress(writer, state);\n writer(`=== Steps complete: ${state.completedSteps} step(s), ${elapsed} ===`);\n writer(\"\");\n}\n\nfunction onToolStart(\n writer: (line: string) => void,\n state: ProgressState,\n event: AgentEvent,\n reasonForAction?: (action: string) => string | null,\n): void {\n state.currentStep += 1;\n state.startedSteps += 1;\n const stepNumber = state.currentStep;\n const payload = asRecord(event.payload);\n const action = summarizeAction(payload?.args, event.to, `invoke tool: ${shortToolName(event.to)}`);\n state.steps.set(stepNumber, { action, startedAtMs: Date.now() });\n state.pendingStepNumbers.push(stepNumber);\n writer(`[${formatStepNumber(stepNumber)}] ▶ ${action}`);\n writer(` tool: ${shortToolName(event.to)}`);\n const reason = reasonForAction?.(action);\n if (reason) writer(` reason: ${reason}`);\n}\n\nfunction onToolDoneWithPayload(writer: (line: string) => void, state: ProgressState, event: AgentEvent): void {\n const stepNumber = state.pendingStepNumbers.shift() ?? state.currentStep;\n const step = state.steps.get(stepNumber);\n const error = getResultError(event.payload);\n const preview = getResultPreview(event.payload);\n const elapsed = step ? formatElapsed(Date.now() - step.startedAtMs) : \"?\";\n if (error) {\n writer(`[${formatStepNumber(stepNumber)}] ✖ ${step?.action ?? \"tool invocation\"}`);\n writer(` error: ${error}`);\n } else {\n writer(`[${formatStepNumber(stepNumber)}] ✓ ${step?.action ?? \"tool invocation\"} (${elapsed})`);\n if (preview) writer(` observation: ${preview}`);\n }\n state.steps.delete(stepNumber);\n state.completedSteps += 1;\n writeProgress(writer, state);\n}\n\nfunction onToolError(writer: (line: string) => void, state: ProgressState, event: AgentEvent): void {\n const stepNumber = state.pendingStepNumbers.shift() ?? state.currentStep;\n const step = state.steps.get(stepNumber);\n const payload = asRecord(event.payload);\n const error = asTrimmedString(payload?.error) ?? \"unknown error\";\n writer(`[${formatStepNumber(stepNumber)}] ✖ ${step?.action ?? \"tool invocation\"}`);\n writer(` error: ${error}`);\n state.steps.delete(stepNumber);\n state.completedSteps += 1;\n writeProgress(writer, state);\n}\n\nexport function createProgressAgentEventListener(options: ProgressEventListenerOptions = {}): AgentEventListener {\n const writer = options.writer ?? console.log;\n const runLabelReact = options.runLabelReact ?? \"analysis\";\n const runLabelDeep = options.runLabelDeep ?? \"deep analysis\";\n\n const state: ProgressState = {\n runStartedAtMs: null,\n startedSteps: 0,\n completedSteps: 0,\n currentStep: 0,\n steps: new Map(),\n pendingStepNumbers: [],\n };\n\n return (event: AgentEvent): void => {\n switch (event.name) {\n case \"agent.react.run.start\":\n onRunStart(writer, state, runLabelReact);\n return;\n case \"agent.deep.run.start\":\n onRunStart(writer, state, runLabelDeep);\n return;\n case \"agent.react.skill.matched\":\n case \"agent.deep.skill.matched\": {\n const payload = asRecord(event.payload);\n const skillName = asTrimmedString(payload?.skill) ?? \"unknown\";\n writer(` skill: ${skillName}`);\n return;\n }\n case \"agent.react.context.truncated\":\n case \"agent.deep.context.truncated\":\n writer(\" context: truncated and compacted\");\n return;\n case \"agent.react.tool.invoke.start\":\n onToolStart(writer, state, event, options.reasonForAction);\n return;\n case \"agent.react.tool.invoke.done\":\n onToolDoneWithPayload(writer, state, event);\n return;\n case \"agent.react.tool.invoke.error\":\n onToolError(writer, state, event);\n return;\n case \"agent.react.memory.write.start\":\n writer(\" memory: write started\");\n return;\n case \"agent.react.memory.write.done\":\n writer(\" memory: write completed\");\n return;\n case \"agent.react.memory.write.error\":\n writer(\" memory: write failed\");\n return;\n case \"agent.react.ptc.retry\": {\n const payload = asRecord(event.payload);\n const retry = payload?.retry;\n const reason = asTrimmedString(payload?.reason);\n writer(` planning retry: attempt ${String(retry ?? \"?\")}${reason ? `, reason=${reason}` : \"\"}`);\n return;\n }\n case \"agent.react.run.done\":\n case \"agent.deep.run.done\":\n onRunDone(writer, state);\n return;\n default:\n return;\n }\n };\n}\n","import type { AgentEvent, AgentEventListener } from \"./index.js\";\n\nexport interface Runtime2EventDebugConfig {\n run?: boolean;\n workspace?: boolean;\n toolCall?: boolean;\n stream?: boolean;\n close?: boolean;\n}\n\nexport interface Runtime2EventRuntimeConfig {\n debug?: Runtime2EventDebugConfig;\n eventLogLevel?: \"silent\" | \"lifecycle\" | \"tools\" | \"verbose\";\n}\n\nexport interface Runtime2TreeEventListenerOptions {\n runtimeConfig?: Runtime2EventRuntimeConfig;\n writer?: (line: string) => void;\n}\n\ninterface ResolvedDebugConfig {\n run: boolean;\n workspace: boolean;\n toolCall: boolean;\n stream: boolean;\n close: boolean;\n}\n\nexport function createRuntime2TreeEventListener(\n options: Runtime2TreeEventListenerOptions = {}\n): AgentEventListener {\n const writer = options.writer ?? console.error;\n const debugConfig = resolveRuntime2DebugConfig(options.runtimeConfig);\n let currentRunThread: string | null = null;\n const toolCalls = new Map<string, { toolName: string; args?: Record<string, unknown> }>();\n\n return (event: AgentEvent): void => {\n const payload = asRecord(event.payload);\n if (shouldSkipRuntime2Event(event.name, debugConfig)) {\n return;\n }\n\n const lines = buildTreeLines(event, payload, currentRunThread, toolCalls);\n if (event.name === \"agent.runtime2.run.start\") {\n currentRunThread = typeof payload?.threadId === \"string\" ? payload.threadId : null;\n toolCalls.clear();\n } else if (event.name === \"agent.runtime2.run.done\" || event.name === \"agent.runtime2.run.error\") {\n currentRunThread = null;\n toolCalls.clear();\n }\n\n for (const line of lines) {\n writer(line);\n }\n };\n}\n\nexport function resolveRuntime2DebugConfig(\n runtimeConfig?: Runtime2EventRuntimeConfig\n): ResolvedDebugConfig {\n if (runtimeConfig?.debug) {\n return {\n run: runtimeConfig.debug.run ?? true,\n workspace: runtimeConfig.debug.workspace ?? true,\n toolCall: runtimeConfig.debug.toolCall ?? true,\n stream: runtimeConfig.debug.stream ?? false,\n close: runtimeConfig.debug.close ?? true,\n };\n }\n\n switch (runtimeConfig?.eventLogLevel ?? \"tools\") {\n case \"silent\":\n return { run: false, workspace: false, toolCall: false, stream: false, close: false };\n case \"lifecycle\":\n return { run: true, workspace: true, toolCall: false, stream: false, close: true };\n case \"verbose\":\n return { run: true, workspace: true, toolCall: true, stream: true, close: true };\n case \"tools\":\n default:\n return { run: true, workspace: true, toolCall: true, stream: false, close: true };\n }\n}\n\nfunction shouldSkipRuntime2Event(name: string, debugConfig: ResolvedDebugConfig): boolean {\n if (name.startsWith(\"agent.runtime2.stream.\")) {\n return !debugConfig.stream;\n }\n if (name.startsWith(\"agent.runtime2.tool.call.\")) {\n return !debugConfig.toolCall;\n }\n if (name.startsWith(\"agent.runtime2.workspace.\")) {\n if (name === \"agent.runtime2.workspace.prepare\" || name === \"agent.runtime2.workspace.run.update\") {\n return true;\n }\n return !debugConfig.workspace;\n }\n if (name.startsWith(\"agent.runtime2.run.\")) {\n if (name === \"agent.runtime2.run.prepare\") {\n return true;\n }\n return !debugConfig.run;\n }\n if (name.startsWith(\"agent.runtime2.close.\")) {\n return !debugConfig.close;\n }\n return false;\n}\n\nfunction buildTreeLines(\n event: Pick<AgentEvent, \"name\" | \"from\" | \"to\">,\n payload: Record<string, unknown> | undefined,\n currentRunThread: string | null,\n toolCalls: Map<string, { toolName: string; args?: Record<string, unknown> }>,\n): string[] {\n const from = shortComponent(event.from);\n const to = shortComponent(event.to);\n const action = event.name.replace(/^agent\\.runtime2\\./, \"\");\n const details = summarizePayload(event.name, payload);\n const suffix = details ? ` | ${details}` : \"\";\n\n if (event.name === \"agent.runtime2.run.start\") {\n return [\n `run ${typeof payload?.threadId === \"string\" ? payload.threadId : \"\"}`.trim(),\n `├─ ${from} -> ${to} | ${action}${suffix}`,\n ];\n }\n\n if (event.name === \"agent.runtime2.run.done\" || event.name === \"agent.runtime2.run.error\") {\n return [`└─ ${from} -> ${to} | ${action}${suffix}`];\n }\n\n if (event.name === \"agent.runtime2.tool.call.start\") {\n const id = typeof payload?.toolCallId === \"string\" ? payload.toolCallId : \"\";\n if (id) {\n toolCalls.set(id, {\n toolName: to,\n args: asRecord(payload?.args),\n });\n }\n return [];\n }\n\n if (\n event.name === \"agent.runtime2.tool.call.done\"\n || event.name === \"agent.runtime2.tool.call.error\"\n || event.name === \"agent.runtime2.tool.call.blocked\"\n ) {\n const id = typeof payload?.toolCallId === \"string\" ? payload.toolCallId : \"\";\n const remembered = id ? toolCalls.get(id) : undefined;\n if (id) {\n toolCalls.delete(id);\n }\n const icon = event.name === \"agent.runtime2.tool.call.done\"\n ? \"OK\"\n : event.name === \"agent.runtime2.tool.call.blocked\"\n ? \"BLOCKED\"\n : \"ERROR\";\n const combined = compactFields([\n summarizeToolArgs(remembered?.args),\n details,\n ]);\n return [`├─ ${icon} ${remembered?.toolName ?? from}${combined ? ` | ${combined}` : \"\"}`];\n }\n\n const prefix = currentRunThread ? \"├─\" : \"•\";\n return [`${prefix} ${from} -> ${to} | ${action}${suffix}`];\n}\n\nfunction summarizePayload(name: string, payload?: Record<string, unknown>): string | null {\n switch (name) {\n case \"agent.runtime2.run.start\":\n return typeof payload?.threadId === \"string\" ? `thread=${payload.threadId}` : null;\n case \"agent.runtime2.run.done\":\n return compactFields([\n formatField(\"steps\", payload?.stepCount),\n formatDuration(payload?.durationMs),\n formatField(\"summary\", payload?.lastSummary),\n ]);\n case \"agent.runtime2.run.error\":\n return compactFields([\n formatField(\"summary\", payload?.lastSummary),\n formatField(\"error\", payload?.error),\n ]);\n case \"agent.runtime2.stream.summary\":\n return typeof payload?.summary === \"string\" ? payload.summary : null;\n case \"agent.runtime2.stream.heartbeat\":\n return formatDuration(payload?.elapsedMs);\n case \"agent.runtime2.tool.call.done\":\n case \"agent.runtime2.tool.call.error\":\n case \"agent.runtime2.tool.call.blocked\":\n return compactFields([\n formatDuration(payload?.durationMs),\n formatField(\"reason\", payload?.reason),\n formatField(\"error\", payload?.error),\n ]);\n case \"agent.runtime2.workspace.run.update\":\n case \"agent.runtime2.workspace.run.finish\":\n return compactFields([\n formatField(\"steps\", payload?.stepCount),\n formatField(\"summary\", payload?.lastSummary),\n formatField(\"status\", payload?.status),\n ]);\n case \"agent.runtime2.run.retry.empty\":\n case \"agent.runtime2.run.retry.incomplete\":\n case \"agent.runtime2.run.retry.idle_timeout\":\n case \"agent.runtime2.run.retry.transient_model\":\n case \"agent.runtime2.run.retry.tool_call\":\n return compactFields([\n formatField(\"attempt\", formatAttempt(payload?.attempt, payload?.maxRetries)),\n formatField(\"summary\", payload?.lastSummary),\n formatField(\"error\", payload?.error),\n ]);\n default:\n return compactFields([\n formatField(\"thread\", payload?.threadId),\n formatField(\"steps\", payload?.stepCount),\n formatField(\"status\", payload?.status),\n ]);\n }\n}\n\nfunction summarizeToolArgs(args: Record<string, unknown> | undefined): string | null {\n if (!args) {\n return null;\n }\n\n return compactFields([\n formatArg(\"path\", args.file_path ?? args.path),\n formatArg(\"query\", args.query),\n formatArg(\"symbol\", args.symbol),\n formatArg(\"ticker\", args.ticker),\n formatArg(\"command\", args.command),\n formatArg(\"subagent_type\", args.subagent_type),\n ]);\n}\n\nfunction formatArg(key: string, value: unknown): string | null {\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n return null;\n }\n const text = String(value).trim();\n if (!text) {\n return null;\n }\n return `${key}=${truncate(text, 80)}`;\n}\n\nfunction formatField(key: string, value: unknown): string | null {\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n return null;\n }\n const text = String(value).trim();\n if (!text) {\n return null;\n }\n return `${key}=${truncate(text, 80)}`;\n}\n\nfunction formatAttempt(attempt: unknown, maxRetries: unknown): string | null {\n if (typeof attempt !== \"number\") {\n return null;\n }\n return typeof maxRetries === \"number\" ? `${attempt}/${maxRetries}` : String(attempt);\n}\n\nfunction formatDuration(durationMs: unknown): string | null {\n if (typeof durationMs !== \"number\") {\n return null;\n }\n if (durationMs < 1_000) {\n return `elapsed=${Math.round(durationMs)}ms`;\n }\n if (durationMs < 10_000) {\n return `elapsed=${(durationMs / 1000).toFixed(2)}s`;\n }\n return `elapsed=${(durationMs / 1000).toFixed(1)}s`;\n}\n\nfunction shortComponent(value: string | undefined): string {\n return (value ?? \"?\").replace(/^agent-runtime2\\./, \"\");\n}\n\nfunction compactFields(fields: Array<string | null>): string | null {\n const items = fields.filter((field): field is string => Boolean(field));\n return items.length > 0 ? items.join(\", \") : null;\n}\n\nfunction truncate(value: string, maxLength: number): string {\n return value.length > maxLength ? `${value.slice(0, maxLength - 3)}...` : value;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\n","import { getDefaultAgentContext, AgentContextTokens } from \"../context/index.js\";\n\nexport interface AgentEvent<TPayload = unknown> {\n id: string;\n name: string;\n from: string;\n to: string;\n at: string;\n payload?: TPayload;\n}\n\nexport interface AgentEventBus {\n publish<TPayload = unknown>(event: Omit<AgentEvent<TPayload>, \"id\" | \"at\">): AgentEvent<TPayload>;\n subscribe(listener: AgentEventListener): () => void;\n}\n\nexport type AgentEventListener = (event: AgentEvent) => void;\n\nclass DefaultAgentEventBus implements AgentEventBus {\n private listeners = new Set<AgentEventListener>();\n\n publish<TPayload = unknown>(\n event: Omit<AgentEvent<TPayload>, \"id\" | \"at\">\n ): AgentEvent<TPayload> {\n const resolved: AgentEvent<TPayload> = {\n ...event,\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`,\n at: new Date().toISOString(),\n };\n for (const listener of this.listeners) {\n try {\n listener(resolved);\n } catch {\n // Listener failures must not break agent runtime.\n }\n }\n return resolved;\n }\n\n subscribe(listener: AgentEventListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n}\n\nexport function createAgentEventBus(): AgentEventBus {\n const bus = new DefaultAgentEventBus();\n getDefaultAgentContext().set(AgentContextTokens.EventBus, bus);\n return bus;\n}\n\nexport function createConsoleAgentEventListener(\n writer: (line: string) => void = console.error\n): AgentEventListener {\n return (event) => {\n writer(`[${event.at}] ${event.from} -> ${event.to} ${event.name}`);\n };\n}\n\nexport {\n createProgressAgentEventListener,\n type ProgressEventListenerOptions,\n} from \"./progress-listener.js\";\nexport {\n createRuntime2TreeEventListener,\n resolveRuntime2DebugConfig,\n type Runtime2EventDebugConfig,\n type Runtime2EventRuntimeConfig,\n type Runtime2TreeEventListenerOptions,\n} from \"./runtime2-tree-listener.js\";\n"],"mappings":"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","names":["asRecord"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// src/utils/checksum.ts
|
|
2
|
+
import { createHash } from "crypto";
|
|
3
|
+
function computeChecksum(input, options = {}) {
|
|
4
|
+
const algorithm = options.algorithm ?? "sha256";
|
|
5
|
+
const digest = createHash(algorithm).update(input).digest("hex");
|
|
6
|
+
const length = options.length;
|
|
7
|
+
if (!Number.isInteger(length) || length === void 0) return digest;
|
|
8
|
+
if (length <= 0) return "";
|
|
9
|
+
return digest.slice(0, length);
|
|
10
|
+
}
|
|
11
|
+
function createChecksumAccumulator(options = {}) {
|
|
12
|
+
const algorithm = options.algorithm ?? "sha256";
|
|
13
|
+
const hasher = createHash(algorithm);
|
|
14
|
+
return {
|
|
15
|
+
update(input) {
|
|
16
|
+
hasher.update(input);
|
|
17
|
+
},
|
|
18
|
+
digest(length) {
|
|
19
|
+
const full = hasher.digest("hex");
|
|
20
|
+
if (!Number.isInteger(length) || length === void 0) return full;
|
|
21
|
+
if (length <= 0) return "";
|
|
22
|
+
return full.slice(0, length);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
computeChecksum,
|
|
29
|
+
createChecksumAccumulator
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=chunk-QG6CT2GZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/checksum.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport interface ComputeChecksumOptions {\n algorithm?: \"sha256\";\n length?: number;\n}\n\nexport interface ChecksumAccumulator {\n update(input: string | Uint8Array): void;\n digest(length?: number): string;\n}\n\n/**\n * Deterministic short checksum for signatures/tokens.\n */\nexport function computeChecksum(input: string, options: ComputeChecksumOptions = {}): string {\n const algorithm = options.algorithm ?? \"sha256\";\n const digest = createHash(algorithm).update(input).digest(\"hex\");\n const length = options.length;\n if (!Number.isInteger(length) || length === undefined) return digest;\n if (length <= 0) return \"\";\n return digest.slice(0, length);\n}\n\n/**\n * Create an incremental checksum accumulator for streaming/chunked data.\n */\nexport function createChecksumAccumulator(options: Omit<ComputeChecksumOptions, \"length\"> = {}): ChecksumAccumulator {\n const algorithm = options.algorithm ?? \"sha256\";\n const hasher = createHash(algorithm);\n return {\n update(input: string | Uint8Array): void {\n hasher.update(input);\n },\n digest(length?: number): string {\n const full = hasher.digest(\"hex\");\n if (!Number.isInteger(length) || length === undefined) return full;\n if (length <= 0) return \"\";\n return full.slice(0, length);\n },\n };\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AAepB,SAAS,gBAAgB,OAAe,UAAkC,CAAC,GAAW;AAC3F,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,SAAS,WAAW,SAAS,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AAC/D,QAAM,SAAS,QAAQ;AACvB,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,WAAW,OAAW,QAAO;AAC9D,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,OAAO,MAAM,GAAG,MAAM;AAC/B;AAKO,SAAS,0BAA0B,UAAkD,CAAC,GAAwB;AACnH,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,SAAS,WAAW,SAAS;AACnC,SAAO;AAAA,IACL,OAAO,OAAkC;AACvC,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,IACA,OAAO,QAAyB;AAC9B,YAAM,OAAO,OAAO,OAAO,KAAK;AAChC,UAAI,CAAC,OAAO,UAAU,MAAM,KAAK,WAAW,OAAW,QAAO;AAC9D,UAAI,UAAU,EAAG,QAAO;AACxB,aAAO,KAAK,MAAM,GAAG,MAAM;AAAA,IAC7B;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {
|
|
2
|
+
computeChecksum
|
|
3
|
+
} from "./chunk-QG6CT2GZ.js";
|
|
4
|
+
|
|
5
|
+
// src/context/tokens.ts
|
|
6
|
+
function createChecksummedToken(scope, name) {
|
|
7
|
+
const seed = `${scope}:${name}`;
|
|
8
|
+
const checksum = computeChecksum(seed, { length: 12 });
|
|
9
|
+
return /* @__PURE__ */ Symbol.for(`${scope}.${name}.${checksum}`);
|
|
10
|
+
}
|
|
11
|
+
var AgentContextTokens = {
|
|
12
|
+
/** The shared AgentEventBus instance */
|
|
13
|
+
EventBus: createChecksummedToken("easynet.agent.context", "eventBus"),
|
|
14
|
+
/** The primary chat model (BaseChatModel) */
|
|
15
|
+
ChatModel: createChecksummedToken("easynet.agent.context", "chatModel"),
|
|
16
|
+
/** The embedding model (Embeddings) */
|
|
17
|
+
EmbedModel: createChecksummedToken("easynet.agent.context", "embedModel"),
|
|
18
|
+
/** The vision-language chat model (BaseChatModel) */
|
|
19
|
+
VlmModel: createChecksummedToken("easynet.agent.context", "vlmModel"),
|
|
20
|
+
/** The memory client (AgentMemory) */
|
|
21
|
+
Memory: createChecksummedToken("easynet.agent.context", "memory"),
|
|
22
|
+
/** The initialized tool list */
|
|
23
|
+
Tools: createChecksummedToken("easynet.agent.context", "tools"),
|
|
24
|
+
/** The loaded skill set (SkillSet | undefined) */
|
|
25
|
+
SkillSet: createChecksummedToken("easynet.agent.context", "skillSet"),
|
|
26
|
+
/** The initialized agent runtime instance (react/deep) */
|
|
27
|
+
Runtime: createChecksummedToken("easynet.agent.context", "runtime")
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
AgentContextTokens
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=chunk-RQSSJFDP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/tokens.ts"],"sourcesContent":["import { computeChecksum } from \"../utils/checksum.js\";\n\nfunction createChecksummedToken(scope: string, name: string): symbol {\n const seed = `${scope}:${name}`;\n const checksum = computeChecksum(seed, { length: 12 });\n return Symbol.for(`${scope}.${name}.${checksum}`);\n}\n\n/**\n * Well-known Symbol tokens for AgentContext.\n * Use these to register and retrieve modules from an AgentContext.\n *\n * @example\n * ```ts\n * ctx.set(AgentContextTokens.ChatModel, llm);\n * const llm = ctx.get<BaseChatModel>(AgentContextTokens.ChatModel);\n * ```\n */\nexport const AgentContextTokens = {\n /** The shared AgentEventBus instance */\n EventBus: createChecksummedToken(\"easynet.agent.context\", \"eventBus\"),\n /** The primary chat model (BaseChatModel) */\n ChatModel: createChecksummedToken(\"easynet.agent.context\", \"chatModel\"),\n /** The embedding model (Embeddings) */\n EmbedModel: createChecksummedToken(\"easynet.agent.context\", \"embedModel\"),\n /** The vision-language chat model (BaseChatModel) */\n VlmModel: createChecksummedToken(\"easynet.agent.context\", \"vlmModel\"),\n /** The memory client (AgentMemory) */\n Memory: createChecksummedToken(\"easynet.agent.context\", \"memory\"),\n /** The initialized tool list */\n Tools: createChecksummedToken(\"easynet.agent.context\", \"tools\"),\n /** The loaded skill set (SkillSet | undefined) */\n SkillSet: createChecksummedToken(\"easynet.agent.context\", \"skillSet\"),\n /** The initialized agent runtime instance (react/deep) */\n Runtime: createChecksummedToken(\"easynet.agent.context\", \"runtime\"),\n} as const;\n\nexport type AgentContextTokenKey = (typeof AgentContextTokens)[keyof typeof AgentContextTokens];\n"],"mappings":";;;;;AAEA,SAAS,uBAAuB,OAAe,MAAsB;AACnE,QAAM,OAAO,GAAG,KAAK,IAAI,IAAI;AAC7B,QAAM,WAAW,gBAAgB,MAAM,EAAE,QAAQ,GAAG,CAAC;AACrD,SAAO,uBAAO,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE;AAClD;AAYO,IAAM,qBAAqB;AAAA;AAAA,EAEhC,UAAU,uBAAuB,yBAAyB,UAAU;AAAA;AAAA,EAEpE,WAAW,uBAAuB,yBAAyB,WAAW;AAAA;AAAA,EAEtE,YAAY,uBAAuB,yBAAyB,YAAY;AAAA;AAAA,EAExE,UAAU,uBAAuB,yBAAyB,UAAU;AAAA;AAAA,EAEpE,QAAQ,uBAAuB,yBAAyB,QAAQ;AAAA;AAAA,EAEhE,OAAO,uBAAuB,yBAAyB,OAAO;AAAA;AAAA,EAE9D,UAAU,uBAAuB,yBAAyB,UAAU;AAAA;AAAA,EAEpE,SAAS,uBAAuB,yBAAyB,SAAS;AACpE;","names":[]}
|