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.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: `Gadget "${call.invocationId}" cannot depend on itself (self-referential dependency)`
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;