llmist 12.2.2 → 12.2.4
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.js
CHANGED
|
@@ -10290,6 +10290,137 @@ var init_executor = __esm({
|
|
|
10290
10290
|
}
|
|
10291
10291
|
});
|
|
10292
10292
|
|
|
10293
|
+
// src/agent/tree-hook-bridge.ts
|
|
10294
|
+
function findParentGadgetInvocationId(tree, nodeId) {
|
|
10295
|
+
let currentId = nodeId;
|
|
10296
|
+
while (currentId) {
|
|
10297
|
+
const node = tree.getNode(currentId);
|
|
10298
|
+
if (!node) break;
|
|
10299
|
+
currentId = node.parentId;
|
|
10300
|
+
if (!currentId) break;
|
|
10301
|
+
const parentNode = tree.getNode(currentId);
|
|
10302
|
+
if (parentNode?.type === "gadget") {
|
|
10303
|
+
return parentNode.invocationId;
|
|
10304
|
+
}
|
|
10305
|
+
}
|
|
10306
|
+
return void 0;
|
|
10307
|
+
}
|
|
10308
|
+
function buildSubagentContext(tree, event) {
|
|
10309
|
+
const parentGadgetInvocationId = findParentGadgetInvocationId(tree, event.nodeId);
|
|
10310
|
+
if (!parentGadgetInvocationId) {
|
|
10311
|
+
return void 0;
|
|
10312
|
+
}
|
|
10313
|
+
return {
|
|
10314
|
+
parentGadgetInvocationId,
|
|
10315
|
+
depth: event.depth
|
|
10316
|
+
};
|
|
10317
|
+
}
|
|
10318
|
+
function getSubagentContextForNode(tree, nodeId) {
|
|
10319
|
+
const node = tree.getNode(nodeId);
|
|
10320
|
+
if (!node) return void 0;
|
|
10321
|
+
const parentGadgetInvocationId = findParentGadgetInvocationId(tree, nodeId);
|
|
10322
|
+
if (!parentGadgetInvocationId) {
|
|
10323
|
+
return void 0;
|
|
10324
|
+
}
|
|
10325
|
+
return {
|
|
10326
|
+
parentGadgetInvocationId,
|
|
10327
|
+
depth: node.depth
|
|
10328
|
+
};
|
|
10329
|
+
}
|
|
10330
|
+
async function safeObserve(fn, logger, eventType) {
|
|
10331
|
+
try {
|
|
10332
|
+
await fn();
|
|
10333
|
+
} catch (error) {
|
|
10334
|
+
logger.warn(`Observer error in ${eventType}:`, error);
|
|
10335
|
+
}
|
|
10336
|
+
}
|
|
10337
|
+
function bridgeTreeToHooks(tree, hooks, logger) {
|
|
10338
|
+
return tree.onAll((event) => {
|
|
10339
|
+
const subagentContext = buildSubagentContext(tree, event);
|
|
10340
|
+
switch (event.type) {
|
|
10341
|
+
// NOTE: gadget_start, gadget_complete, gadget_error, gadget_skipped are NOT
|
|
10342
|
+
// handled here. They are called directly in stream-processor.ts with await
|
|
10343
|
+
// to ensure proper ordering of observer commands.
|
|
10344
|
+
// LLM events - bridged for subagent visibility
|
|
10345
|
+
// When a subagent makes LLM calls, these events propagate through the shared tree
|
|
10346
|
+
// to the parent's hooks, enabling unified monitoring of all LLM activity
|
|
10347
|
+
case "llm_call_start": {
|
|
10348
|
+
if (subagentContext && hooks.observers?.onLLMCallStart) {
|
|
10349
|
+
const llmEvent = event;
|
|
10350
|
+
const context = {
|
|
10351
|
+
iteration: llmEvent.iteration,
|
|
10352
|
+
options: {
|
|
10353
|
+
model: llmEvent.model,
|
|
10354
|
+
messages: llmEvent.request ?? [],
|
|
10355
|
+
// These fields are not available from tree events, use defaults
|
|
10356
|
+
temperature: void 0,
|
|
10357
|
+
maxTokens: void 0
|
|
10358
|
+
},
|
|
10359
|
+
logger,
|
|
10360
|
+
subagentContext
|
|
10361
|
+
};
|
|
10362
|
+
safeObserve(() => hooks.observers.onLLMCallStart(context), logger, "onLLMCallStart");
|
|
10363
|
+
}
|
|
10364
|
+
break;
|
|
10365
|
+
}
|
|
10366
|
+
case "llm_call_complete": {
|
|
10367
|
+
if (subagentContext && hooks.observers?.onLLMCallComplete) {
|
|
10368
|
+
const llmEvent = event;
|
|
10369
|
+
const llmNode = tree.getNode(event.nodeId);
|
|
10370
|
+
const context = {
|
|
10371
|
+
iteration: llmNode?.iteration ?? 1,
|
|
10372
|
+
options: {
|
|
10373
|
+
model: llmNode?.model ?? "unknown",
|
|
10374
|
+
messages: llmNode?.request ?? [],
|
|
10375
|
+
temperature: void 0,
|
|
10376
|
+
maxTokens: void 0
|
|
10377
|
+
},
|
|
10378
|
+
finishReason: llmEvent.finishReason ?? null,
|
|
10379
|
+
usage: llmEvent.usage,
|
|
10380
|
+
rawResponse: llmEvent.response,
|
|
10381
|
+
// Use rawResponse as finalMessage since interceptor modifications aren't available from tree events
|
|
10382
|
+
finalMessage: llmEvent.response,
|
|
10383
|
+
logger,
|
|
10384
|
+
subagentContext
|
|
10385
|
+
};
|
|
10386
|
+
safeObserve(
|
|
10387
|
+
() => hooks.observers.onLLMCallComplete(context),
|
|
10388
|
+
logger,
|
|
10389
|
+
"onLLMCallComplete"
|
|
10390
|
+
);
|
|
10391
|
+
}
|
|
10392
|
+
break;
|
|
10393
|
+
}
|
|
10394
|
+
case "llm_call_error": {
|
|
10395
|
+
if (subagentContext && hooks.observers?.onLLMCallError) {
|
|
10396
|
+
const llmEvent = event;
|
|
10397
|
+
const llmNode = tree.getNode(event.nodeId);
|
|
10398
|
+
const context = {
|
|
10399
|
+
iteration: llmNode?.iteration ?? 1,
|
|
10400
|
+
options: {
|
|
10401
|
+
model: llmNode?.model ?? "unknown",
|
|
10402
|
+
messages: llmNode?.request ?? [],
|
|
10403
|
+
temperature: void 0,
|
|
10404
|
+
maxTokens: void 0
|
|
10405
|
+
},
|
|
10406
|
+
error: llmEvent.error,
|
|
10407
|
+
recovered: llmEvent.recovered,
|
|
10408
|
+
logger,
|
|
10409
|
+
subagentContext
|
|
10410
|
+
};
|
|
10411
|
+
safeObserve(() => hooks.observers.onLLMCallError(context), logger, "onLLMCallError");
|
|
10412
|
+
}
|
|
10413
|
+
break;
|
|
10414
|
+
}
|
|
10415
|
+
}
|
|
10416
|
+
});
|
|
10417
|
+
}
|
|
10418
|
+
var init_tree_hook_bridge = __esm({
|
|
10419
|
+
"src/agent/tree-hook-bridge.ts"() {
|
|
10420
|
+
"use strict";
|
|
10421
|
+
}
|
|
10422
|
+
});
|
|
10423
|
+
|
|
10293
10424
|
// src/agent/stream-processor.ts
|
|
10294
10425
|
var StreamProcessor;
|
|
10295
10426
|
var init_stream_processor = __esm({
|
|
@@ -10299,6 +10430,7 @@ var init_stream_processor = __esm({
|
|
|
10299
10430
|
init_parser();
|
|
10300
10431
|
init_logger();
|
|
10301
10432
|
init_hook_validators();
|
|
10433
|
+
init_tree_hook_bridge();
|
|
10302
10434
|
StreamProcessor = class {
|
|
10303
10435
|
iteration;
|
|
10304
10436
|
registry;
|
|
@@ -10560,15 +10692,31 @@ var init_stream_processor = __esm({
|
|
|
10560
10692
|
invocationId: call.invocationId
|
|
10561
10693
|
});
|
|
10562
10694
|
this.failedInvocations.add(call.invocationId);
|
|
10695
|
+
const errorMessage = `Gadget "${call.invocationId}" cannot depend on itself (self-referential dependency)`;
|
|
10563
10696
|
const skipEvent = {
|
|
10564
10697
|
type: "gadget_skipped",
|
|
10565
10698
|
gadgetName: call.gadgetName,
|
|
10566
10699
|
invocationId: call.invocationId,
|
|
10567
10700
|
parameters: call.parameters ?? {},
|
|
10568
10701
|
failedDependency: call.invocationId,
|
|
10569
|
-
failedDependencyError:
|
|
10702
|
+
failedDependencyError: errorMessage
|
|
10570
10703
|
};
|
|
10571
10704
|
yield skipEvent;
|
|
10705
|
+
if (this.hooks.observers?.onGadgetSkipped) {
|
|
10706
|
+
const gadgetNode = this.tree?.getNodeByInvocationId(call.invocationId);
|
|
10707
|
+
const subagentContext = this.tree && gadgetNode ? getSubagentContextForNode(this.tree, gadgetNode.id) : void 0;
|
|
10708
|
+
const context = {
|
|
10709
|
+
iteration: this.iteration,
|
|
10710
|
+
gadgetName: call.gadgetName,
|
|
10711
|
+
invocationId: call.invocationId,
|
|
10712
|
+
parameters: call.parameters ?? {},
|
|
10713
|
+
failedDependency: call.invocationId,
|
|
10714
|
+
failedDependencyError: errorMessage,
|
|
10715
|
+
logger: this.logger,
|
|
10716
|
+
subagentContext
|
|
10717
|
+
};
|
|
10718
|
+
await this.safeObserve(() => this.hooks.observers.onGadgetSkipped(context));
|
|
10719
|
+
}
|
|
10572
10720
|
return;
|
|
10573
10721
|
}
|
|
10574
10722
|
const failedDep = call.dependencies.find(
|
|
@@ -10711,6 +10859,19 @@ var init_stream_processor = __esm({
|
|
|
10711
10859
|
this.tree.startGadget(gadgetNode.id);
|
|
10712
10860
|
}
|
|
10713
10861
|
}
|
|
10862
|
+
if (this.hooks.observers?.onGadgetExecutionStart) {
|
|
10863
|
+
const gadgetNode = this.tree?.getNodeByInvocationId(call.invocationId);
|
|
10864
|
+
const subagentContext = this.tree && gadgetNode ? getSubagentContextForNode(this.tree, gadgetNode.id) : void 0;
|
|
10865
|
+
const context = {
|
|
10866
|
+
iteration: this.iteration,
|
|
10867
|
+
gadgetName: call.gadgetName,
|
|
10868
|
+
invocationId: call.invocationId,
|
|
10869
|
+
parameters,
|
|
10870
|
+
logger: this.logger,
|
|
10871
|
+
subagentContext
|
|
10872
|
+
};
|
|
10873
|
+
await this.safeObserve(() => this.hooks.observers.onGadgetExecutionStart(context));
|
|
10874
|
+
}
|
|
10714
10875
|
let result;
|
|
10715
10876
|
if (shouldSkip) {
|
|
10716
10877
|
result = {
|
|
@@ -10778,6 +10939,23 @@ var init_stream_processor = __esm({
|
|
|
10778
10939
|
}
|
|
10779
10940
|
}
|
|
10780
10941
|
}
|
|
10942
|
+
if (this.hooks.observers?.onGadgetExecutionComplete) {
|
|
10943
|
+
const gadgetNode = this.tree?.getNodeByInvocationId(result.invocationId);
|
|
10944
|
+
const subagentContext = this.tree && gadgetNode ? getSubagentContextForNode(this.tree, gadgetNode.id) : void 0;
|
|
10945
|
+
const context = {
|
|
10946
|
+
iteration: this.iteration,
|
|
10947
|
+
gadgetName: result.gadgetName,
|
|
10948
|
+
invocationId: result.invocationId,
|
|
10949
|
+
parameters,
|
|
10950
|
+
finalResult: result.result,
|
|
10951
|
+
error: result.error,
|
|
10952
|
+
executionTimeMs: result.executionTimeMs,
|
|
10953
|
+
cost: result.cost,
|
|
10954
|
+
logger: this.logger,
|
|
10955
|
+
subagentContext
|
|
10956
|
+
};
|
|
10957
|
+
await this.safeObserve(() => this.hooks.observers.onGadgetExecutionComplete(context));
|
|
10958
|
+
}
|
|
10781
10959
|
this.completedResults.set(result.invocationId, result);
|
|
10782
10960
|
if (result.error) {
|
|
10783
10961
|
this.failedInvocations.add(result.invocationId);
|
|
@@ -10903,6 +11081,21 @@ var init_stream_processor = __esm({
|
|
|
10903
11081
|
failedDependencyError: depError
|
|
10904
11082
|
};
|
|
10905
11083
|
events.push(skipEvent);
|
|
11084
|
+
if (this.hooks.observers?.onGadgetSkipped) {
|
|
11085
|
+
const gadgetNode = this.tree?.getNodeByInvocationId(call.invocationId);
|
|
11086
|
+
const subagentContext = this.tree && gadgetNode ? getSubagentContextForNode(this.tree, gadgetNode.id) : void 0;
|
|
11087
|
+
const context = {
|
|
11088
|
+
iteration: this.iteration,
|
|
11089
|
+
gadgetName: call.gadgetName,
|
|
11090
|
+
invocationId: call.invocationId,
|
|
11091
|
+
parameters: call.parameters ?? {},
|
|
11092
|
+
failedDependency: failedDep,
|
|
11093
|
+
failedDependencyError: depError,
|
|
11094
|
+
logger: this.logger,
|
|
11095
|
+
subagentContext
|
|
11096
|
+
};
|
|
11097
|
+
await this.safeObserve(() => this.hooks.observers.onGadgetSkipped(context));
|
|
11098
|
+
}
|
|
10906
11099
|
this.logger.info("Gadget skipped due to failed dependency", {
|
|
10907
11100
|
gadgetName: call.gadgetName,
|
|
10908
11101
|
invocationId: call.invocationId,
|
|
@@ -11030,6 +11223,21 @@ var init_stream_processor = __esm({
|
|
|
11030
11223
|
failedDependencyError: errorMessage
|
|
11031
11224
|
};
|
|
11032
11225
|
yield skipEvent;
|
|
11226
|
+
if (this.hooks.observers?.onGadgetSkipped) {
|
|
11227
|
+
const gadgetNode = this.tree?.getNodeByInvocationId(invocationId);
|
|
11228
|
+
const subagentContext = this.tree && gadgetNode ? getSubagentContextForNode(this.tree, gadgetNode.id) : void 0;
|
|
11229
|
+
const context = {
|
|
11230
|
+
iteration: this.iteration,
|
|
11231
|
+
gadgetName: call.gadgetName,
|
|
11232
|
+
invocationId,
|
|
11233
|
+
parameters: call.parameters ?? {},
|
|
11234
|
+
failedDependency: missingDeps[0],
|
|
11235
|
+
failedDependencyError: errorMessage,
|
|
11236
|
+
logger: this.logger,
|
|
11237
|
+
subagentContext
|
|
11238
|
+
};
|
|
11239
|
+
await this.safeObserve(() => this.hooks.observers.onGadgetSkipped(context));
|
|
11240
|
+
}
|
|
11033
11241
|
}
|
|
11034
11242
|
this.gadgetsAwaitingDependencies.clear();
|
|
11035
11243
|
}
|
|
@@ -11055,9 +11263,7 @@ var init_stream_processor = __esm({
|
|
|
11055
11263
|
*/
|
|
11056
11264
|
async runObserversInParallel(observers) {
|
|
11057
11265
|
if (observers.length === 0) return;
|
|
11058
|
-
await Promise.allSettled(
|
|
11059
|
-
observers.map((observer) => this.safeObserve(observer))
|
|
11060
|
-
);
|
|
11266
|
+
await Promise.allSettled(observers.map((observer) => this.safeObserve(observer)));
|
|
11061
11267
|
}
|
|
11062
11268
|
// ==========================================================================
|
|
11063
11269
|
// Public accessors for cross-iteration dependency tracking
|
|
@@ -11080,239 +11286,6 @@ var init_stream_processor = __esm({
|
|
|
11080
11286
|
}
|
|
11081
11287
|
});
|
|
11082
11288
|
|
|
11083
|
-
// src/agent/tree-hook-bridge.ts
|
|
11084
|
-
function findParentGadgetInvocationId(tree, nodeId) {
|
|
11085
|
-
let currentId = nodeId;
|
|
11086
|
-
while (currentId) {
|
|
11087
|
-
const node = tree.getNode(currentId);
|
|
11088
|
-
if (!node) break;
|
|
11089
|
-
currentId = node.parentId;
|
|
11090
|
-
if (!currentId) break;
|
|
11091
|
-
const parentNode = tree.getNode(currentId);
|
|
11092
|
-
if (parentNode?.type === "gadget") {
|
|
11093
|
-
return parentNode.invocationId;
|
|
11094
|
-
}
|
|
11095
|
-
}
|
|
11096
|
-
return void 0;
|
|
11097
|
-
}
|
|
11098
|
-
function getIterationFromTree(tree, nodeId) {
|
|
11099
|
-
let currentId = nodeId;
|
|
11100
|
-
while (currentId) {
|
|
11101
|
-
const node = tree.getNode(currentId);
|
|
11102
|
-
if (!node) break;
|
|
11103
|
-
if (node.type === "llm_call") {
|
|
11104
|
-
return node.iteration;
|
|
11105
|
-
}
|
|
11106
|
-
currentId = node.parentId;
|
|
11107
|
-
}
|
|
11108
|
-
return 0;
|
|
11109
|
-
}
|
|
11110
|
-
function buildSubagentContext(tree, event) {
|
|
11111
|
-
const parentGadgetInvocationId = findParentGadgetInvocationId(tree, event.nodeId);
|
|
11112
|
-
if (!parentGadgetInvocationId) {
|
|
11113
|
-
return void 0;
|
|
11114
|
-
}
|
|
11115
|
-
return {
|
|
11116
|
-
parentGadgetInvocationId,
|
|
11117
|
-
depth: event.depth
|
|
11118
|
-
};
|
|
11119
|
-
}
|
|
11120
|
-
function getSubagentContextForNode(tree, nodeId) {
|
|
11121
|
-
const node = tree.getNode(nodeId);
|
|
11122
|
-
if (!node) return void 0;
|
|
11123
|
-
const parentGadgetInvocationId = findParentGadgetInvocationId(tree, nodeId);
|
|
11124
|
-
if (!parentGadgetInvocationId) {
|
|
11125
|
-
return void 0;
|
|
11126
|
-
}
|
|
11127
|
-
return {
|
|
11128
|
-
parentGadgetInvocationId,
|
|
11129
|
-
depth: node.depth
|
|
11130
|
-
};
|
|
11131
|
-
}
|
|
11132
|
-
async function safeObserve(fn, logger, eventType) {
|
|
11133
|
-
try {
|
|
11134
|
-
await fn();
|
|
11135
|
-
} catch (error) {
|
|
11136
|
-
logger.warn(`Observer error in ${eventType}:`, error);
|
|
11137
|
-
}
|
|
11138
|
-
}
|
|
11139
|
-
function bridgeTreeToHooks(tree, hooks, logger) {
|
|
11140
|
-
return tree.onAll((event) => {
|
|
11141
|
-
const subagentContext = buildSubagentContext(tree, event);
|
|
11142
|
-
switch (event.type) {
|
|
11143
|
-
case "gadget_start": {
|
|
11144
|
-
if (hooks.observers?.onGadgetExecutionStart) {
|
|
11145
|
-
const gadgetEvent = event;
|
|
11146
|
-
const gadgetNode = tree.getNodeByInvocationId(gadgetEvent.invocationId);
|
|
11147
|
-
const context = {
|
|
11148
|
-
iteration: getIterationFromTree(tree, event.nodeId),
|
|
11149
|
-
gadgetName: gadgetEvent.name,
|
|
11150
|
-
invocationId: gadgetEvent.invocationId,
|
|
11151
|
-
parameters: gadgetNode?.parameters ?? {},
|
|
11152
|
-
logger,
|
|
11153
|
-
subagentContext
|
|
11154
|
-
};
|
|
11155
|
-
safeObserve(
|
|
11156
|
-
() => hooks.observers.onGadgetExecutionStart(context),
|
|
11157
|
-
logger,
|
|
11158
|
-
"onGadgetExecutionStart"
|
|
11159
|
-
);
|
|
11160
|
-
}
|
|
11161
|
-
break;
|
|
11162
|
-
}
|
|
11163
|
-
case "gadget_complete": {
|
|
11164
|
-
if (hooks.observers?.onGadgetExecutionComplete) {
|
|
11165
|
-
const gadgetEvent = event;
|
|
11166
|
-
const gadgetNode = tree.getNodeByInvocationId(gadgetEvent.invocationId);
|
|
11167
|
-
const context = {
|
|
11168
|
-
iteration: getIterationFromTree(tree, event.nodeId),
|
|
11169
|
-
gadgetName: gadgetEvent.name,
|
|
11170
|
-
invocationId: gadgetEvent.invocationId,
|
|
11171
|
-
parameters: gadgetNode?.parameters ?? {},
|
|
11172
|
-
finalResult: gadgetEvent.result,
|
|
11173
|
-
executionTimeMs: gadgetEvent.executionTimeMs,
|
|
11174
|
-
cost: gadgetEvent.cost,
|
|
11175
|
-
logger,
|
|
11176
|
-
subagentContext
|
|
11177
|
-
};
|
|
11178
|
-
safeObserve(
|
|
11179
|
-
() => hooks.observers.onGadgetExecutionComplete(context),
|
|
11180
|
-
logger,
|
|
11181
|
-
"onGadgetExecutionComplete"
|
|
11182
|
-
);
|
|
11183
|
-
}
|
|
11184
|
-
break;
|
|
11185
|
-
}
|
|
11186
|
-
case "gadget_error": {
|
|
11187
|
-
if (hooks.observers?.onGadgetExecutionComplete) {
|
|
11188
|
-
const gadgetNode = tree.getNodeByInvocationId(event.invocationId);
|
|
11189
|
-
const context = {
|
|
11190
|
-
iteration: getIterationFromTree(tree, event.nodeId),
|
|
11191
|
-
gadgetName: event.name,
|
|
11192
|
-
invocationId: event.invocationId,
|
|
11193
|
-
parameters: gadgetNode?.parameters ?? {},
|
|
11194
|
-
error: event.error,
|
|
11195
|
-
executionTimeMs: event.executionTimeMs,
|
|
11196
|
-
logger,
|
|
11197
|
-
subagentContext
|
|
11198
|
-
};
|
|
11199
|
-
safeObserve(
|
|
11200
|
-
() => hooks.observers.onGadgetExecutionComplete(context),
|
|
11201
|
-
logger,
|
|
11202
|
-
"onGadgetExecutionComplete"
|
|
11203
|
-
);
|
|
11204
|
-
}
|
|
11205
|
-
break;
|
|
11206
|
-
}
|
|
11207
|
-
case "gadget_skipped": {
|
|
11208
|
-
if (hooks.observers?.onGadgetSkipped) {
|
|
11209
|
-
const gadgetNode = tree.getNodeByInvocationId(event.invocationId);
|
|
11210
|
-
const context = {
|
|
11211
|
-
iteration: getIterationFromTree(tree, event.nodeId),
|
|
11212
|
-
gadgetName: event.name,
|
|
11213
|
-
invocationId: event.invocationId,
|
|
11214
|
-
parameters: gadgetNode?.parameters ?? {},
|
|
11215
|
-
failedDependency: event.failedDependency ?? "unknown",
|
|
11216
|
-
failedDependencyError: event.failedDependencyError ?? event.error,
|
|
11217
|
-
logger,
|
|
11218
|
-
subagentContext
|
|
11219
|
-
};
|
|
11220
|
-
safeObserve(
|
|
11221
|
-
() => hooks.observers.onGadgetSkipped(context),
|
|
11222
|
-
logger,
|
|
11223
|
-
"onGadgetSkipped"
|
|
11224
|
-
);
|
|
11225
|
-
}
|
|
11226
|
-
break;
|
|
11227
|
-
}
|
|
11228
|
-
// LLM events - bridged for subagent visibility
|
|
11229
|
-
// When a subagent makes LLM calls, these events propagate through the shared tree
|
|
11230
|
-
// to the parent's hooks, enabling unified monitoring of all LLM activity
|
|
11231
|
-
case "llm_call_start": {
|
|
11232
|
-
if (subagentContext && hooks.observers?.onLLMCallStart) {
|
|
11233
|
-
const llmEvent = event;
|
|
11234
|
-
const context = {
|
|
11235
|
-
iteration: llmEvent.iteration,
|
|
11236
|
-
options: {
|
|
11237
|
-
model: llmEvent.model,
|
|
11238
|
-
messages: llmEvent.request ?? [],
|
|
11239
|
-
// These fields are not available from tree events, use defaults
|
|
11240
|
-
temperature: void 0,
|
|
11241
|
-
maxTokens: void 0
|
|
11242
|
-
},
|
|
11243
|
-
logger,
|
|
11244
|
-
subagentContext
|
|
11245
|
-
};
|
|
11246
|
-
safeObserve(
|
|
11247
|
-
() => hooks.observers.onLLMCallStart(context),
|
|
11248
|
-
logger,
|
|
11249
|
-
"onLLMCallStart"
|
|
11250
|
-
);
|
|
11251
|
-
}
|
|
11252
|
-
break;
|
|
11253
|
-
}
|
|
11254
|
-
case "llm_call_complete": {
|
|
11255
|
-
if (subagentContext && hooks.observers?.onLLMCallComplete) {
|
|
11256
|
-
const llmEvent = event;
|
|
11257
|
-
const llmNode = tree.getNode(event.nodeId);
|
|
11258
|
-
const context = {
|
|
11259
|
-
iteration: llmNode?.iteration ?? 1,
|
|
11260
|
-
options: {
|
|
11261
|
-
model: llmNode?.model ?? "unknown",
|
|
11262
|
-
messages: llmNode?.request ?? [],
|
|
11263
|
-
temperature: void 0,
|
|
11264
|
-
maxTokens: void 0
|
|
11265
|
-
},
|
|
11266
|
-
finishReason: llmEvent.finishReason ?? null,
|
|
11267
|
-
usage: llmEvent.usage,
|
|
11268
|
-
rawResponse: llmEvent.response,
|
|
11269
|
-
// Use rawResponse as finalMessage since interceptor modifications aren't available from tree events
|
|
11270
|
-
finalMessage: llmEvent.response,
|
|
11271
|
-
logger,
|
|
11272
|
-
subagentContext
|
|
11273
|
-
};
|
|
11274
|
-
safeObserve(
|
|
11275
|
-
() => hooks.observers.onLLMCallComplete(context),
|
|
11276
|
-
logger,
|
|
11277
|
-
"onLLMCallComplete"
|
|
11278
|
-
);
|
|
11279
|
-
}
|
|
11280
|
-
break;
|
|
11281
|
-
}
|
|
11282
|
-
case "llm_call_error": {
|
|
11283
|
-
if (subagentContext && hooks.observers?.onLLMCallError) {
|
|
11284
|
-
const llmEvent = event;
|
|
11285
|
-
const llmNode = tree.getNode(event.nodeId);
|
|
11286
|
-
const context = {
|
|
11287
|
-
iteration: llmNode?.iteration ?? 1,
|
|
11288
|
-
options: {
|
|
11289
|
-
model: llmNode?.model ?? "unknown",
|
|
11290
|
-
messages: llmNode?.request ?? [],
|
|
11291
|
-
temperature: void 0,
|
|
11292
|
-
maxTokens: void 0
|
|
11293
|
-
},
|
|
11294
|
-
error: llmEvent.error,
|
|
11295
|
-
recovered: llmEvent.recovered,
|
|
11296
|
-
logger,
|
|
11297
|
-
subagentContext
|
|
11298
|
-
};
|
|
11299
|
-
safeObserve(
|
|
11300
|
-
() => hooks.observers.onLLMCallError(context),
|
|
11301
|
-
logger,
|
|
11302
|
-
"onLLMCallError"
|
|
11303
|
-
);
|
|
11304
|
-
}
|
|
11305
|
-
break;
|
|
11306
|
-
}
|
|
11307
|
-
}
|
|
11308
|
-
});
|
|
11309
|
-
}
|
|
11310
|
-
var init_tree_hook_bridge = __esm({
|
|
11311
|
-
"src/agent/tree-hook-bridge.ts"() {
|
|
11312
|
-
"use strict";
|
|
11313
|
-
}
|
|
11314
|
-
});
|
|
11315
|
-
|
|
11316
11289
|
// src/agent/agent.ts
|
|
11317
11290
|
import pRetry from "p-retry";
|
|
11318
11291
|
var Agent;
|