llmist 12.2.2 → 12.2.3
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/index.cjs +210 -237
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +210 -237
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -10303,6 +10303,137 @@ var init_executor = __esm({
|
|
|
10303
10303
|
}
|
|
10304
10304
|
});
|
|
10305
10305
|
|
|
10306
|
+
// src/agent/tree-hook-bridge.ts
|
|
10307
|
+
function findParentGadgetInvocationId(tree, nodeId) {
|
|
10308
|
+
let currentId = nodeId;
|
|
10309
|
+
while (currentId) {
|
|
10310
|
+
const node = tree.getNode(currentId);
|
|
10311
|
+
if (!node) break;
|
|
10312
|
+
currentId = node.parentId;
|
|
10313
|
+
if (!currentId) break;
|
|
10314
|
+
const parentNode = tree.getNode(currentId);
|
|
10315
|
+
if (parentNode?.type === "gadget") {
|
|
10316
|
+
return parentNode.invocationId;
|
|
10317
|
+
}
|
|
10318
|
+
}
|
|
10319
|
+
return void 0;
|
|
10320
|
+
}
|
|
10321
|
+
function buildSubagentContext(tree, event) {
|
|
10322
|
+
const parentGadgetInvocationId = findParentGadgetInvocationId(tree, event.nodeId);
|
|
10323
|
+
if (!parentGadgetInvocationId) {
|
|
10324
|
+
return void 0;
|
|
10325
|
+
}
|
|
10326
|
+
return {
|
|
10327
|
+
parentGadgetInvocationId,
|
|
10328
|
+
depth: event.depth
|
|
10329
|
+
};
|
|
10330
|
+
}
|
|
10331
|
+
function getSubagentContextForNode(tree, nodeId) {
|
|
10332
|
+
const node = tree.getNode(nodeId);
|
|
10333
|
+
if (!node) return void 0;
|
|
10334
|
+
const parentGadgetInvocationId = findParentGadgetInvocationId(tree, nodeId);
|
|
10335
|
+
if (!parentGadgetInvocationId) {
|
|
10336
|
+
return void 0;
|
|
10337
|
+
}
|
|
10338
|
+
return {
|
|
10339
|
+
parentGadgetInvocationId,
|
|
10340
|
+
depth: node.depth
|
|
10341
|
+
};
|
|
10342
|
+
}
|
|
10343
|
+
async function safeObserve(fn, logger, eventType) {
|
|
10344
|
+
try {
|
|
10345
|
+
await fn();
|
|
10346
|
+
} catch (error) {
|
|
10347
|
+
logger.warn(`Observer error in ${eventType}:`, error);
|
|
10348
|
+
}
|
|
10349
|
+
}
|
|
10350
|
+
function bridgeTreeToHooks(tree, hooks, logger) {
|
|
10351
|
+
return tree.onAll((event) => {
|
|
10352
|
+
const subagentContext = buildSubagentContext(tree, event);
|
|
10353
|
+
switch (event.type) {
|
|
10354
|
+
// NOTE: gadget_start, gadget_complete, gadget_error, gadget_skipped are NOT
|
|
10355
|
+
// handled here. They are called directly in stream-processor.ts with await
|
|
10356
|
+
// to ensure proper ordering of observer commands.
|
|
10357
|
+
// LLM events - bridged for subagent visibility
|
|
10358
|
+
// When a subagent makes LLM calls, these events propagate through the shared tree
|
|
10359
|
+
// to the parent's hooks, enabling unified monitoring of all LLM activity
|
|
10360
|
+
case "llm_call_start": {
|
|
10361
|
+
if (subagentContext && hooks.observers?.onLLMCallStart) {
|
|
10362
|
+
const llmEvent = event;
|
|
10363
|
+
const context = {
|
|
10364
|
+
iteration: llmEvent.iteration,
|
|
10365
|
+
options: {
|
|
10366
|
+
model: llmEvent.model,
|
|
10367
|
+
messages: llmEvent.request ?? [],
|
|
10368
|
+
// These fields are not available from tree events, use defaults
|
|
10369
|
+
temperature: void 0,
|
|
10370
|
+
maxTokens: void 0
|
|
10371
|
+
},
|
|
10372
|
+
logger,
|
|
10373
|
+
subagentContext
|
|
10374
|
+
};
|
|
10375
|
+
safeObserve(() => hooks.observers.onLLMCallStart(context), logger, "onLLMCallStart");
|
|
10376
|
+
}
|
|
10377
|
+
break;
|
|
10378
|
+
}
|
|
10379
|
+
case "llm_call_complete": {
|
|
10380
|
+
if (subagentContext && hooks.observers?.onLLMCallComplete) {
|
|
10381
|
+
const llmEvent = event;
|
|
10382
|
+
const llmNode = tree.getNode(event.nodeId);
|
|
10383
|
+
const context = {
|
|
10384
|
+
iteration: llmNode?.iteration ?? 1,
|
|
10385
|
+
options: {
|
|
10386
|
+
model: llmNode?.model ?? "unknown",
|
|
10387
|
+
messages: llmNode?.request ?? [],
|
|
10388
|
+
temperature: void 0,
|
|
10389
|
+
maxTokens: void 0
|
|
10390
|
+
},
|
|
10391
|
+
finishReason: llmEvent.finishReason ?? null,
|
|
10392
|
+
usage: llmEvent.usage,
|
|
10393
|
+
rawResponse: llmEvent.response,
|
|
10394
|
+
// Use rawResponse as finalMessage since interceptor modifications aren't available from tree events
|
|
10395
|
+
finalMessage: llmEvent.response,
|
|
10396
|
+
logger,
|
|
10397
|
+
subagentContext
|
|
10398
|
+
};
|
|
10399
|
+
safeObserve(
|
|
10400
|
+
() => hooks.observers.onLLMCallComplete(context),
|
|
10401
|
+
logger,
|
|
10402
|
+
"onLLMCallComplete"
|
|
10403
|
+
);
|
|
10404
|
+
}
|
|
10405
|
+
break;
|
|
10406
|
+
}
|
|
10407
|
+
case "llm_call_error": {
|
|
10408
|
+
if (subagentContext && hooks.observers?.onLLMCallError) {
|
|
10409
|
+
const llmEvent = event;
|
|
10410
|
+
const llmNode = tree.getNode(event.nodeId);
|
|
10411
|
+
const context = {
|
|
10412
|
+
iteration: llmNode?.iteration ?? 1,
|
|
10413
|
+
options: {
|
|
10414
|
+
model: llmNode?.model ?? "unknown",
|
|
10415
|
+
messages: llmNode?.request ?? [],
|
|
10416
|
+
temperature: void 0,
|
|
10417
|
+
maxTokens: void 0
|
|
10418
|
+
},
|
|
10419
|
+
error: llmEvent.error,
|
|
10420
|
+
recovered: llmEvent.recovered,
|
|
10421
|
+
logger,
|
|
10422
|
+
subagentContext
|
|
10423
|
+
};
|
|
10424
|
+
safeObserve(() => hooks.observers.onLLMCallError(context), logger, "onLLMCallError");
|
|
10425
|
+
}
|
|
10426
|
+
break;
|
|
10427
|
+
}
|
|
10428
|
+
}
|
|
10429
|
+
});
|
|
10430
|
+
}
|
|
10431
|
+
var init_tree_hook_bridge = __esm({
|
|
10432
|
+
"src/agent/tree-hook-bridge.ts"() {
|
|
10433
|
+
"use strict";
|
|
10434
|
+
}
|
|
10435
|
+
});
|
|
10436
|
+
|
|
10306
10437
|
// src/agent/stream-processor.ts
|
|
10307
10438
|
var StreamProcessor;
|
|
10308
10439
|
var init_stream_processor = __esm({
|
|
@@ -10312,6 +10443,7 @@ var init_stream_processor = __esm({
|
|
|
10312
10443
|
init_parser();
|
|
10313
10444
|
init_logger();
|
|
10314
10445
|
init_hook_validators();
|
|
10446
|
+
init_tree_hook_bridge();
|
|
10315
10447
|
StreamProcessor = class {
|
|
10316
10448
|
iteration;
|
|
10317
10449
|
registry;
|
|
@@ -10573,15 +10705,31 @@ var init_stream_processor = __esm({
|
|
|
10573
10705
|
invocationId: call.invocationId
|
|
10574
10706
|
});
|
|
10575
10707
|
this.failedInvocations.add(call.invocationId);
|
|
10708
|
+
const errorMessage = `Gadget "${call.invocationId}" cannot depend on itself (self-referential dependency)`;
|
|
10576
10709
|
const skipEvent = {
|
|
10577
10710
|
type: "gadget_skipped",
|
|
10578
10711
|
gadgetName: call.gadgetName,
|
|
10579
10712
|
invocationId: call.invocationId,
|
|
10580
10713
|
parameters: call.parameters ?? {},
|
|
10581
10714
|
failedDependency: call.invocationId,
|
|
10582
|
-
failedDependencyError:
|
|
10715
|
+
failedDependencyError: errorMessage
|
|
10583
10716
|
};
|
|
10584
10717
|
yield skipEvent;
|
|
10718
|
+
if (this.hooks.observers?.onGadgetSkipped) {
|
|
10719
|
+
const gadgetNode = this.tree?.getNodeByInvocationId(call.invocationId);
|
|
10720
|
+
const subagentContext = this.tree && gadgetNode ? getSubagentContextForNode(this.tree, gadgetNode.id) : void 0;
|
|
10721
|
+
const context = {
|
|
10722
|
+
iteration: this.iteration,
|
|
10723
|
+
gadgetName: call.gadgetName,
|
|
10724
|
+
invocationId: call.invocationId,
|
|
10725
|
+
parameters: call.parameters ?? {},
|
|
10726
|
+
failedDependency: call.invocationId,
|
|
10727
|
+
failedDependencyError: errorMessage,
|
|
10728
|
+
logger: this.logger,
|
|
10729
|
+
subagentContext
|
|
10730
|
+
};
|
|
10731
|
+
await this.safeObserve(() => this.hooks.observers.onGadgetSkipped(context));
|
|
10732
|
+
}
|
|
10585
10733
|
return;
|
|
10586
10734
|
}
|
|
10587
10735
|
const failedDep = call.dependencies.find(
|
|
@@ -10724,6 +10872,19 @@ var init_stream_processor = __esm({
|
|
|
10724
10872
|
this.tree.startGadget(gadgetNode.id);
|
|
10725
10873
|
}
|
|
10726
10874
|
}
|
|
10875
|
+
if (this.hooks.observers?.onGadgetExecutionStart) {
|
|
10876
|
+
const gadgetNode = this.tree?.getNodeByInvocationId(call.invocationId);
|
|
10877
|
+
const subagentContext = this.tree && gadgetNode ? getSubagentContextForNode(this.tree, gadgetNode.id) : void 0;
|
|
10878
|
+
const context = {
|
|
10879
|
+
iteration: this.iteration,
|
|
10880
|
+
gadgetName: call.gadgetName,
|
|
10881
|
+
invocationId: call.invocationId,
|
|
10882
|
+
parameters,
|
|
10883
|
+
logger: this.logger,
|
|
10884
|
+
subagentContext
|
|
10885
|
+
};
|
|
10886
|
+
await this.safeObserve(() => this.hooks.observers.onGadgetExecutionStart(context));
|
|
10887
|
+
}
|
|
10727
10888
|
let result;
|
|
10728
10889
|
if (shouldSkip) {
|
|
10729
10890
|
result = {
|
|
@@ -10791,6 +10952,23 @@ var init_stream_processor = __esm({
|
|
|
10791
10952
|
}
|
|
10792
10953
|
}
|
|
10793
10954
|
}
|
|
10955
|
+
if (this.hooks.observers?.onGadgetExecutionComplete) {
|
|
10956
|
+
const gadgetNode = this.tree?.getNodeByInvocationId(result.invocationId);
|
|
10957
|
+
const subagentContext = this.tree && gadgetNode ? getSubagentContextForNode(this.tree, gadgetNode.id) : void 0;
|
|
10958
|
+
const context = {
|
|
10959
|
+
iteration: this.iteration,
|
|
10960
|
+
gadgetName: result.gadgetName,
|
|
10961
|
+
invocationId: result.invocationId,
|
|
10962
|
+
parameters,
|
|
10963
|
+
finalResult: result.result,
|
|
10964
|
+
error: result.error,
|
|
10965
|
+
executionTimeMs: result.executionTimeMs,
|
|
10966
|
+
cost: result.cost,
|
|
10967
|
+
logger: this.logger,
|
|
10968
|
+
subagentContext
|
|
10969
|
+
};
|
|
10970
|
+
await this.safeObserve(() => this.hooks.observers.onGadgetExecutionComplete(context));
|
|
10971
|
+
}
|
|
10794
10972
|
this.completedResults.set(result.invocationId, result);
|
|
10795
10973
|
if (result.error) {
|
|
10796
10974
|
this.failedInvocations.add(result.invocationId);
|
|
@@ -10916,6 +11094,21 @@ var init_stream_processor = __esm({
|
|
|
10916
11094
|
failedDependencyError: depError
|
|
10917
11095
|
};
|
|
10918
11096
|
events.push(skipEvent);
|
|
11097
|
+
if (this.hooks.observers?.onGadgetSkipped) {
|
|
11098
|
+
const gadgetNode = this.tree?.getNodeByInvocationId(call.invocationId);
|
|
11099
|
+
const subagentContext = this.tree && gadgetNode ? getSubagentContextForNode(this.tree, gadgetNode.id) : void 0;
|
|
11100
|
+
const context = {
|
|
11101
|
+
iteration: this.iteration,
|
|
11102
|
+
gadgetName: call.gadgetName,
|
|
11103
|
+
invocationId: call.invocationId,
|
|
11104
|
+
parameters: call.parameters ?? {},
|
|
11105
|
+
failedDependency: failedDep,
|
|
11106
|
+
failedDependencyError: depError,
|
|
11107
|
+
logger: this.logger,
|
|
11108
|
+
subagentContext
|
|
11109
|
+
};
|
|
11110
|
+
await this.safeObserve(() => this.hooks.observers.onGadgetSkipped(context));
|
|
11111
|
+
}
|
|
10919
11112
|
this.logger.info("Gadget skipped due to failed dependency", {
|
|
10920
11113
|
gadgetName: call.gadgetName,
|
|
10921
11114
|
invocationId: call.invocationId,
|
|
@@ -11043,6 +11236,21 @@ var init_stream_processor = __esm({
|
|
|
11043
11236
|
failedDependencyError: errorMessage
|
|
11044
11237
|
};
|
|
11045
11238
|
yield skipEvent;
|
|
11239
|
+
if (this.hooks.observers?.onGadgetSkipped) {
|
|
11240
|
+
const gadgetNode = this.tree?.getNodeByInvocationId(invocationId);
|
|
11241
|
+
const subagentContext = this.tree && gadgetNode ? getSubagentContextForNode(this.tree, gadgetNode.id) : void 0;
|
|
11242
|
+
const context = {
|
|
11243
|
+
iteration: this.iteration,
|
|
11244
|
+
gadgetName: call.gadgetName,
|
|
11245
|
+
invocationId,
|
|
11246
|
+
parameters: call.parameters ?? {},
|
|
11247
|
+
failedDependency: missingDeps[0],
|
|
11248
|
+
failedDependencyError: errorMessage,
|
|
11249
|
+
logger: this.logger,
|
|
11250
|
+
subagentContext
|
|
11251
|
+
};
|
|
11252
|
+
await this.safeObserve(() => this.hooks.observers.onGadgetSkipped(context));
|
|
11253
|
+
}
|
|
11046
11254
|
}
|
|
11047
11255
|
this.gadgetsAwaitingDependencies.clear();
|
|
11048
11256
|
}
|
|
@@ -11068,9 +11276,7 @@ var init_stream_processor = __esm({
|
|
|
11068
11276
|
*/
|
|
11069
11277
|
async runObserversInParallel(observers) {
|
|
11070
11278
|
if (observers.length === 0) return;
|
|
11071
|
-
await Promise.allSettled(
|
|
11072
|
-
observers.map((observer) => this.safeObserve(observer))
|
|
11073
|
-
);
|
|
11279
|
+
await Promise.allSettled(observers.map((observer) => this.safeObserve(observer)));
|
|
11074
11280
|
}
|
|
11075
11281
|
// ==========================================================================
|
|
11076
11282
|
// Public accessors for cross-iteration dependency tracking
|
|
@@ -11093,239 +11299,6 @@ var init_stream_processor = __esm({
|
|
|
11093
11299
|
}
|
|
11094
11300
|
});
|
|
11095
11301
|
|
|
11096
|
-
// src/agent/tree-hook-bridge.ts
|
|
11097
|
-
function findParentGadgetInvocationId(tree, nodeId) {
|
|
11098
|
-
let currentId = nodeId;
|
|
11099
|
-
while (currentId) {
|
|
11100
|
-
const node = tree.getNode(currentId);
|
|
11101
|
-
if (!node) break;
|
|
11102
|
-
currentId = node.parentId;
|
|
11103
|
-
if (!currentId) break;
|
|
11104
|
-
const parentNode = tree.getNode(currentId);
|
|
11105
|
-
if (parentNode?.type === "gadget") {
|
|
11106
|
-
return parentNode.invocationId;
|
|
11107
|
-
}
|
|
11108
|
-
}
|
|
11109
|
-
return void 0;
|
|
11110
|
-
}
|
|
11111
|
-
function getIterationFromTree(tree, nodeId) {
|
|
11112
|
-
let currentId = nodeId;
|
|
11113
|
-
while (currentId) {
|
|
11114
|
-
const node = tree.getNode(currentId);
|
|
11115
|
-
if (!node) break;
|
|
11116
|
-
if (node.type === "llm_call") {
|
|
11117
|
-
return node.iteration;
|
|
11118
|
-
}
|
|
11119
|
-
currentId = node.parentId;
|
|
11120
|
-
}
|
|
11121
|
-
return 0;
|
|
11122
|
-
}
|
|
11123
|
-
function buildSubagentContext(tree, event) {
|
|
11124
|
-
const parentGadgetInvocationId = findParentGadgetInvocationId(tree, event.nodeId);
|
|
11125
|
-
if (!parentGadgetInvocationId) {
|
|
11126
|
-
return void 0;
|
|
11127
|
-
}
|
|
11128
|
-
return {
|
|
11129
|
-
parentGadgetInvocationId,
|
|
11130
|
-
depth: event.depth
|
|
11131
|
-
};
|
|
11132
|
-
}
|
|
11133
|
-
function getSubagentContextForNode(tree, nodeId) {
|
|
11134
|
-
const node = tree.getNode(nodeId);
|
|
11135
|
-
if (!node) return void 0;
|
|
11136
|
-
const parentGadgetInvocationId = findParentGadgetInvocationId(tree, nodeId);
|
|
11137
|
-
if (!parentGadgetInvocationId) {
|
|
11138
|
-
return void 0;
|
|
11139
|
-
}
|
|
11140
|
-
return {
|
|
11141
|
-
parentGadgetInvocationId,
|
|
11142
|
-
depth: node.depth
|
|
11143
|
-
};
|
|
11144
|
-
}
|
|
11145
|
-
async function safeObserve(fn, logger, eventType) {
|
|
11146
|
-
try {
|
|
11147
|
-
await fn();
|
|
11148
|
-
} catch (error) {
|
|
11149
|
-
logger.warn(`Observer error in ${eventType}:`, error);
|
|
11150
|
-
}
|
|
11151
|
-
}
|
|
11152
|
-
function bridgeTreeToHooks(tree, hooks, logger) {
|
|
11153
|
-
return tree.onAll((event) => {
|
|
11154
|
-
const subagentContext = buildSubagentContext(tree, event);
|
|
11155
|
-
switch (event.type) {
|
|
11156
|
-
case "gadget_start": {
|
|
11157
|
-
if (hooks.observers?.onGadgetExecutionStart) {
|
|
11158
|
-
const gadgetEvent = event;
|
|
11159
|
-
const gadgetNode = tree.getNodeByInvocationId(gadgetEvent.invocationId);
|
|
11160
|
-
const context = {
|
|
11161
|
-
iteration: getIterationFromTree(tree, event.nodeId),
|
|
11162
|
-
gadgetName: gadgetEvent.name,
|
|
11163
|
-
invocationId: gadgetEvent.invocationId,
|
|
11164
|
-
parameters: gadgetNode?.parameters ?? {},
|
|
11165
|
-
logger,
|
|
11166
|
-
subagentContext
|
|
11167
|
-
};
|
|
11168
|
-
safeObserve(
|
|
11169
|
-
() => hooks.observers.onGadgetExecutionStart(context),
|
|
11170
|
-
logger,
|
|
11171
|
-
"onGadgetExecutionStart"
|
|
11172
|
-
);
|
|
11173
|
-
}
|
|
11174
|
-
break;
|
|
11175
|
-
}
|
|
11176
|
-
case "gadget_complete": {
|
|
11177
|
-
if (hooks.observers?.onGadgetExecutionComplete) {
|
|
11178
|
-
const gadgetEvent = event;
|
|
11179
|
-
const gadgetNode = tree.getNodeByInvocationId(gadgetEvent.invocationId);
|
|
11180
|
-
const context = {
|
|
11181
|
-
iteration: getIterationFromTree(tree, event.nodeId),
|
|
11182
|
-
gadgetName: gadgetEvent.name,
|
|
11183
|
-
invocationId: gadgetEvent.invocationId,
|
|
11184
|
-
parameters: gadgetNode?.parameters ?? {},
|
|
11185
|
-
finalResult: gadgetEvent.result,
|
|
11186
|
-
executionTimeMs: gadgetEvent.executionTimeMs,
|
|
11187
|
-
cost: gadgetEvent.cost,
|
|
11188
|
-
logger,
|
|
11189
|
-
subagentContext
|
|
11190
|
-
};
|
|
11191
|
-
safeObserve(
|
|
11192
|
-
() => hooks.observers.onGadgetExecutionComplete(context),
|
|
11193
|
-
logger,
|
|
11194
|
-
"onGadgetExecutionComplete"
|
|
11195
|
-
);
|
|
11196
|
-
}
|
|
11197
|
-
break;
|
|
11198
|
-
}
|
|
11199
|
-
case "gadget_error": {
|
|
11200
|
-
if (hooks.observers?.onGadgetExecutionComplete) {
|
|
11201
|
-
const gadgetNode = tree.getNodeByInvocationId(event.invocationId);
|
|
11202
|
-
const context = {
|
|
11203
|
-
iteration: getIterationFromTree(tree, event.nodeId),
|
|
11204
|
-
gadgetName: event.name,
|
|
11205
|
-
invocationId: event.invocationId,
|
|
11206
|
-
parameters: gadgetNode?.parameters ?? {},
|
|
11207
|
-
error: event.error,
|
|
11208
|
-
executionTimeMs: event.executionTimeMs,
|
|
11209
|
-
logger,
|
|
11210
|
-
subagentContext
|
|
11211
|
-
};
|
|
11212
|
-
safeObserve(
|
|
11213
|
-
() => hooks.observers.onGadgetExecutionComplete(context),
|
|
11214
|
-
logger,
|
|
11215
|
-
"onGadgetExecutionComplete"
|
|
11216
|
-
);
|
|
11217
|
-
}
|
|
11218
|
-
break;
|
|
11219
|
-
}
|
|
11220
|
-
case "gadget_skipped": {
|
|
11221
|
-
if (hooks.observers?.onGadgetSkipped) {
|
|
11222
|
-
const gadgetNode = tree.getNodeByInvocationId(event.invocationId);
|
|
11223
|
-
const context = {
|
|
11224
|
-
iteration: getIterationFromTree(tree, event.nodeId),
|
|
11225
|
-
gadgetName: event.name,
|
|
11226
|
-
invocationId: event.invocationId,
|
|
11227
|
-
parameters: gadgetNode?.parameters ?? {},
|
|
11228
|
-
failedDependency: event.failedDependency ?? "unknown",
|
|
11229
|
-
failedDependencyError: event.failedDependencyError ?? event.error,
|
|
11230
|
-
logger,
|
|
11231
|
-
subagentContext
|
|
11232
|
-
};
|
|
11233
|
-
safeObserve(
|
|
11234
|
-
() => hooks.observers.onGadgetSkipped(context),
|
|
11235
|
-
logger,
|
|
11236
|
-
"onGadgetSkipped"
|
|
11237
|
-
);
|
|
11238
|
-
}
|
|
11239
|
-
break;
|
|
11240
|
-
}
|
|
11241
|
-
// LLM events - bridged for subagent visibility
|
|
11242
|
-
// When a subagent makes LLM calls, these events propagate through the shared tree
|
|
11243
|
-
// to the parent's hooks, enabling unified monitoring of all LLM activity
|
|
11244
|
-
case "llm_call_start": {
|
|
11245
|
-
if (subagentContext && hooks.observers?.onLLMCallStart) {
|
|
11246
|
-
const llmEvent = event;
|
|
11247
|
-
const context = {
|
|
11248
|
-
iteration: llmEvent.iteration,
|
|
11249
|
-
options: {
|
|
11250
|
-
model: llmEvent.model,
|
|
11251
|
-
messages: llmEvent.request ?? [],
|
|
11252
|
-
// These fields are not available from tree events, use defaults
|
|
11253
|
-
temperature: void 0,
|
|
11254
|
-
maxTokens: void 0
|
|
11255
|
-
},
|
|
11256
|
-
logger,
|
|
11257
|
-
subagentContext
|
|
11258
|
-
};
|
|
11259
|
-
safeObserve(
|
|
11260
|
-
() => hooks.observers.onLLMCallStart(context),
|
|
11261
|
-
logger,
|
|
11262
|
-
"onLLMCallStart"
|
|
11263
|
-
);
|
|
11264
|
-
}
|
|
11265
|
-
break;
|
|
11266
|
-
}
|
|
11267
|
-
case "llm_call_complete": {
|
|
11268
|
-
if (subagentContext && hooks.observers?.onLLMCallComplete) {
|
|
11269
|
-
const llmEvent = event;
|
|
11270
|
-
const llmNode = tree.getNode(event.nodeId);
|
|
11271
|
-
const context = {
|
|
11272
|
-
iteration: llmNode?.iteration ?? 1,
|
|
11273
|
-
options: {
|
|
11274
|
-
model: llmNode?.model ?? "unknown",
|
|
11275
|
-
messages: llmNode?.request ?? [],
|
|
11276
|
-
temperature: void 0,
|
|
11277
|
-
maxTokens: void 0
|
|
11278
|
-
},
|
|
11279
|
-
finishReason: llmEvent.finishReason ?? null,
|
|
11280
|
-
usage: llmEvent.usage,
|
|
11281
|
-
rawResponse: llmEvent.response,
|
|
11282
|
-
// Use rawResponse as finalMessage since interceptor modifications aren't available from tree events
|
|
11283
|
-
finalMessage: llmEvent.response,
|
|
11284
|
-
logger,
|
|
11285
|
-
subagentContext
|
|
11286
|
-
};
|
|
11287
|
-
safeObserve(
|
|
11288
|
-
() => hooks.observers.onLLMCallComplete(context),
|
|
11289
|
-
logger,
|
|
11290
|
-
"onLLMCallComplete"
|
|
11291
|
-
);
|
|
11292
|
-
}
|
|
11293
|
-
break;
|
|
11294
|
-
}
|
|
11295
|
-
case "llm_call_error": {
|
|
11296
|
-
if (subagentContext && hooks.observers?.onLLMCallError) {
|
|
11297
|
-
const llmEvent = event;
|
|
11298
|
-
const llmNode = tree.getNode(event.nodeId);
|
|
11299
|
-
const context = {
|
|
11300
|
-
iteration: llmNode?.iteration ?? 1,
|
|
11301
|
-
options: {
|
|
11302
|
-
model: llmNode?.model ?? "unknown",
|
|
11303
|
-
messages: llmNode?.request ?? [],
|
|
11304
|
-
temperature: void 0,
|
|
11305
|
-
maxTokens: void 0
|
|
11306
|
-
},
|
|
11307
|
-
error: llmEvent.error,
|
|
11308
|
-
recovered: llmEvent.recovered,
|
|
11309
|
-
logger,
|
|
11310
|
-
subagentContext
|
|
11311
|
-
};
|
|
11312
|
-
safeObserve(
|
|
11313
|
-
() => hooks.observers.onLLMCallError(context),
|
|
11314
|
-
logger,
|
|
11315
|
-
"onLLMCallError"
|
|
11316
|
-
);
|
|
11317
|
-
}
|
|
11318
|
-
break;
|
|
11319
|
-
}
|
|
11320
|
-
}
|
|
11321
|
-
});
|
|
11322
|
-
}
|
|
11323
|
-
var init_tree_hook_bridge = __esm({
|
|
11324
|
-
"src/agent/tree-hook-bridge.ts"() {
|
|
11325
|
-
"use strict";
|
|
11326
|
-
}
|
|
11327
|
-
});
|
|
11328
|
-
|
|
11329
11302
|
// src/agent/agent.ts
|
|
11330
11303
|
var import_p_retry, Agent;
|
|
11331
11304
|
var init_agent = __esm({
|