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