llmist 3.1.0 → 4.0.0

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
@@ -3562,7 +3562,7 @@ var init_executor = __esm({
3562
3562
  init_exceptions();
3563
3563
  init_parser();
3564
3564
  GadgetExecutor = class {
3565
- constructor(registry, requestHumanInput, logger, defaultGadgetTimeoutMs, errorFormatterOptions, client, mediaStore, agentConfig, subagentConfig, onNestedEvent) {
3565
+ constructor(registry, requestHumanInput, logger, defaultGadgetTimeoutMs, errorFormatterOptions, client, mediaStore, agentConfig, subagentConfig, onSubagentEvent) {
3566
3566
  this.registry = registry;
3567
3567
  this.requestHumanInput = requestHumanInput;
3568
3568
  this.defaultGadgetTimeoutMs = defaultGadgetTimeoutMs;
@@ -3570,7 +3570,7 @@ var init_executor = __esm({
3570
3570
  this.mediaStore = mediaStore;
3571
3571
  this.agentConfig = agentConfig;
3572
3572
  this.subagentConfig = subagentConfig;
3573
- this.onNestedEvent = onNestedEvent;
3573
+ this.onSubagentEvent = onSubagentEvent;
3574
3574
  this.logger = logger ?? createLogger({ name: "llmist:executor" });
3575
3575
  this.errorFormatter = new GadgetExecutionErrorFormatter(errorFormatterOptions);
3576
3576
  this.argPrefix = errorFormatterOptions?.argPrefix ?? GADGET_ARG_PREFIX;
@@ -3718,7 +3718,7 @@ var init_executor = __esm({
3718
3718
  agentConfig: this.agentConfig,
3719
3719
  subagentConfig: this.subagentConfig,
3720
3720
  invocationId: call.invocationId,
3721
- onNestedEvent: this.onNestedEvent
3721
+ onSubagentEvent: this.onSubagentEvent
3722
3722
  };
3723
3723
  let rawResult;
3724
3724
  if (timeoutMs && timeoutMs > 0) {
@@ -3958,7 +3958,7 @@ var init_stream_processor = __esm({
3958
3958
  options.mediaStore,
3959
3959
  options.agentConfig,
3960
3960
  options.subagentConfig,
3961
- options.onNestedEvent
3961
+ options.onSubagentEvent
3962
3962
  );
3963
3963
  }
3964
3964
  /**
@@ -4917,8 +4917,12 @@ var init_agent = __esm({
4917
4917
  // Subagent configuration
4918
4918
  agentContextConfig;
4919
4919
  subagentConfig;
4920
- // Nested event callback for subagent gadgets
4921
- onNestedEvent;
4920
+ // Subagent event callback for subagent gadgets
4921
+ userSubagentEventCallback;
4922
+ // Internal queue for yielding subagent events in run()
4923
+ pendingSubagentEvents = [];
4924
+ // Combined callback that queues events AND calls user callback
4925
+ onSubagentEvent;
4922
4926
  /**
4923
4927
  * Creates a new Agent instance.
4924
4928
  * @internal This constructor is private. Use LLMist.createAgent() or AgentBuilder instead.
@@ -4996,7 +5000,71 @@ var init_agent = __esm({
4996
5000
  temperature: this.temperature
4997
5001
  };
4998
5002
  this.subagentConfig = options.subagentConfig;
4999
- this.onNestedEvent = options.onNestedEvent;
5003
+ this.userSubagentEventCallback = options.onSubagentEvent;
5004
+ this.onSubagentEvent = (event) => {
5005
+ this.pendingSubagentEvents.push(event);
5006
+ this.userSubagentEventCallback?.(event);
5007
+ const subagentContext = {
5008
+ parentGadgetInvocationId: event.gadgetInvocationId,
5009
+ depth: event.depth
5010
+ };
5011
+ if (event.type === "llm_call_start") {
5012
+ const info = event.event;
5013
+ void this.hooks?.observers?.onLLMCallStart?.({
5014
+ iteration: info.iteration,
5015
+ options: { model: info.model, messages: [] },
5016
+ logger: this.logger,
5017
+ subagentContext
5018
+ });
5019
+ } else if (event.type === "llm_call_end") {
5020
+ const info = event.event;
5021
+ void this.hooks?.observers?.onLLMCallComplete?.({
5022
+ iteration: info.iteration,
5023
+ options: { model: info.model, messages: [] },
5024
+ finishReason: info.finishReason ?? null,
5025
+ usage: info.outputTokens ? {
5026
+ inputTokens: info.inputTokens ?? 0,
5027
+ outputTokens: info.outputTokens,
5028
+ totalTokens: (info.inputTokens ?? 0) + info.outputTokens
5029
+ } : void 0,
5030
+ rawResponse: "",
5031
+ finalMessage: "",
5032
+ logger: this.logger,
5033
+ subagentContext
5034
+ });
5035
+ } else if (event.type === "gadget_call") {
5036
+ const gadgetEvent = event.event;
5037
+ void this.hooks?.observers?.onGadgetExecutionStart?.({
5038
+ iteration: 0,
5039
+ gadgetName: gadgetEvent.call.gadgetName,
5040
+ invocationId: gadgetEvent.call.invocationId,
5041
+ parameters: gadgetEvent.call.parameters ?? {},
5042
+ logger: this.logger,
5043
+ subagentContext
5044
+ });
5045
+ } else if (event.type === "gadget_result") {
5046
+ const resultEvent = event.event;
5047
+ void this.hooks?.observers?.onGadgetExecutionComplete?.({
5048
+ iteration: 0,
5049
+ gadgetName: resultEvent.result.gadgetName ?? "unknown",
5050
+ invocationId: resultEvent.result.invocationId,
5051
+ parameters: {},
5052
+ executionTimeMs: resultEvent.result.executionTimeMs ?? 0,
5053
+ logger: this.logger,
5054
+ subagentContext
5055
+ });
5056
+ }
5057
+ };
5058
+ }
5059
+ /**
5060
+ * Flush pending subagent events as StreamEvents.
5061
+ * Called from run() to yield queued subagent events from subagent gadgets.
5062
+ */
5063
+ *flushPendingSubagentEvents() {
5064
+ while (this.pendingSubagentEvents.length > 0) {
5065
+ const event = this.pendingSubagentEvents.shift();
5066
+ yield { type: "subagent_event", subagentEvent: event };
5067
+ }
5000
5068
  }
5001
5069
  /**
5002
5070
  * Get the gadget registry for this agent.
@@ -5228,7 +5296,7 @@ var init_agent = __esm({
5228
5296
  mediaStore: this.mediaStore,
5229
5297
  agentConfig: this.agentContextConfig,
5230
5298
  subagentConfig: this.subagentConfig,
5231
- onNestedEvent: this.onNestedEvent
5299
+ onSubagentEvent: this.onSubagentEvent
5232
5300
  });
5233
5301
  let streamMetadata = null;
5234
5302
  let gadgetCallCount = 0;
@@ -5246,6 +5314,7 @@ var init_agent = __esm({
5246
5314
  gadgetResults.push(event);
5247
5315
  }
5248
5316
  yield event;
5317
+ yield* this.flushPendingSubagentEvents();
5249
5318
  }
5250
5319
  if (!streamMetadata) {
5251
5320
  throw new Error("Stream processing completed without metadata event");
@@ -8822,7 +8891,7 @@ var init_builder = __esm({
8822
8891
  signal;
8823
8892
  trailingMessage;
8824
8893
  subagentConfig;
8825
- nestedEventCallback;
8894
+ subagentEventCallback;
8826
8895
  parentContext;
8827
8896
  constructor(client) {
8828
8897
  this.client = client;
@@ -9321,38 +9390,38 @@ var init_builder = __esm({
9321
9390
  return this;
9322
9391
  }
9323
9392
  /**
9324
- * Set the callback for nested subagent events.
9393
+ * Set the callback for subagent events.
9325
9394
  *
9326
- * Subagent gadgets (like BrowseWeb) can use ExecutionContext.onNestedEvent
9395
+ * Subagent gadgets (like BrowseWeb) can use ExecutionContext.onSubagentEvent
9327
9396
  * to report their internal LLM calls and gadget executions in real-time.
9328
9397
  * This callback receives those events, enabling hierarchical progress display.
9329
9398
  *
9330
- * @param callback - Function to handle nested agent events
9399
+ * @param callback - Function to handle subagent events
9331
9400
  * @returns This builder for chaining
9332
9401
  *
9333
9402
  * @example
9334
9403
  * ```typescript
9335
- * .withNestedEventCallback((event) => {
9404
+ * .withSubagentEventCallback((event) => {
9336
9405
  * if (event.type === "llm_call_start") {
9337
- * console.log(` Nested LLM #${event.event.iteration} starting...`);
9406
+ * console.log(` Subagent LLM #${event.event.iteration} starting...`);
9338
9407
  * } else if (event.type === "gadget_call") {
9339
9408
  * console.log(` ⏵ ${event.event.call.gadgetName}...`);
9340
9409
  * }
9341
9410
  * })
9342
9411
  * ```
9343
9412
  */
9344
- withNestedEventCallback(callback) {
9345
- this.nestedEventCallback = callback;
9413
+ withSubagentEventCallback(callback) {
9414
+ this.subagentEventCallback = callback;
9346
9415
  return this;
9347
9416
  }
9348
9417
  /**
9349
- * Enable automatic nested event forwarding to parent agent.
9418
+ * Enable automatic subagent event forwarding to parent agent.
9350
9419
  *
9351
9420
  * When building a subagent inside a gadget, call this method to automatically
9352
9421
  * forward all LLM calls and gadget events to the parent agent. This enables
9353
9422
  * hierarchical progress display without any manual event handling.
9354
9423
  *
9355
- * The method extracts `invocationId` and `onNestedEvent` from the execution
9424
+ * The method extracts `invocationId` and `onSubagentEvent` from the execution
9356
9425
  * context and sets up automatic forwarding via hooks and event wrapping.
9357
9426
  *
9358
9427
  * @param ctx - ExecutionContext passed to the gadget's execute() method
@@ -9379,10 +9448,10 @@ var init_builder = __esm({
9379
9448
  * ```
9380
9449
  */
9381
9450
  withParentContext(ctx, depth = 1) {
9382
- if (ctx.onNestedEvent && ctx.invocationId) {
9451
+ if (ctx.onSubagentEvent && ctx.invocationId) {
9383
9452
  this.parentContext = {
9384
9453
  invocationId: ctx.invocationId,
9385
- onNestedEvent: ctx.onNestedEvent,
9454
+ onSubagentEvent: ctx.onSubagentEvent,
9386
9455
  depth
9387
9456
  };
9388
9457
  }
@@ -9457,20 +9526,22 @@ ${endPrefix}`
9457
9526
  /**
9458
9527
  * Compose the final hooks, including:
9459
9528
  * - Trailing message injection (if configured)
9460
- * - Nested event forwarding for LLM calls (if parentContext is set)
9529
+ * - Subagent event forwarding for LLM calls (if parentContext is set)
9461
9530
  */
9462
9531
  composeHooks() {
9463
9532
  let hooks = this.hooks;
9464
9533
  if (this.parentContext) {
9465
- const { invocationId, onNestedEvent, depth } = this.parentContext;
9534
+ const { invocationId, onSubagentEvent, depth } = this.parentContext;
9466
9535
  const existingOnLLMCallStart = hooks?.observers?.onLLMCallStart;
9467
9536
  const existingOnLLMCallComplete = hooks?.observers?.onLLMCallComplete;
9537
+ const existingOnGadgetExecutionStart = hooks?.observers?.onGadgetExecutionStart;
9538
+ const existingOnGadgetExecutionComplete = hooks?.observers?.onGadgetExecutionComplete;
9468
9539
  hooks = {
9469
9540
  ...hooks,
9470
9541
  observers: {
9471
9542
  ...hooks?.observers,
9472
9543
  onLLMCallStart: async (context) => {
9473
- onNestedEvent({
9544
+ onSubagentEvent({
9474
9545
  type: "llm_call_start",
9475
9546
  gadgetInvocationId: invocationId,
9476
9547
  depth,
@@ -9484,7 +9555,7 @@ ${endPrefix}`
9484
9555
  }
9485
9556
  },
9486
9557
  onLLMCallComplete: async (context) => {
9487
- onNestedEvent({
9558
+ onSubagentEvent({
9488
9559
  type: "llm_call_end",
9489
9560
  gadgetInvocationId: invocationId,
9490
9561
  depth,
@@ -9498,6 +9569,38 @@ ${endPrefix}`
9498
9569
  if (existingOnLLMCallComplete) {
9499
9570
  await existingOnLLMCallComplete(context);
9500
9571
  }
9572
+ },
9573
+ onGadgetExecutionStart: async (context) => {
9574
+ onSubagentEvent({
9575
+ type: "gadget_call",
9576
+ gadgetInvocationId: invocationId,
9577
+ depth,
9578
+ event: {
9579
+ call: {
9580
+ invocationId: context.invocationId,
9581
+ gadgetName: context.gadgetName,
9582
+ parameters: context.parameters
9583
+ }
9584
+ }
9585
+ });
9586
+ if (existingOnGadgetExecutionStart) {
9587
+ await existingOnGadgetExecutionStart(context);
9588
+ }
9589
+ },
9590
+ onGadgetExecutionComplete: async (context) => {
9591
+ onSubagentEvent({
9592
+ type: "gadget_result",
9593
+ gadgetInvocationId: invocationId,
9594
+ depth,
9595
+ event: {
9596
+ result: {
9597
+ invocationId: context.invocationId
9598
+ }
9599
+ }
9600
+ });
9601
+ if (existingOnGadgetExecutionComplete) {
9602
+ await existingOnGadgetExecutionComplete(context);
9603
+ }
9501
9604
  }
9502
9605
  }
9503
9606
  };
@@ -9584,11 +9687,11 @@ ${endPrefix}`
9584
9687
  this.client = new LLMistClass();
9585
9688
  }
9586
9689
  const registry = GadgetRegistry.from(this.gadgets);
9587
- let onNestedEvent = this.nestedEventCallback;
9690
+ let onSubagentEvent = this.subagentEventCallback;
9588
9691
  if (this.parentContext) {
9589
- const { invocationId, onNestedEvent: parentCallback, depth } = this.parentContext;
9590
- const existingCallback = this.nestedEventCallback;
9591
- onNestedEvent = (event) => {
9692
+ const { invocationId, onSubagentEvent: parentCallback, depth } = this.parentContext;
9693
+ const existingCallback = this.subagentEventCallback;
9694
+ onSubagentEvent = (event) => {
9592
9695
  parentCallback({
9593
9696
  ...event,
9594
9697
  gadgetInvocationId: invocationId,
@@ -9623,7 +9726,7 @@ ${endPrefix}`
9623
9726
  compactionConfig: this.compactionConfig,
9624
9727
  signal: this.signal,
9625
9728
  subagentConfig: this.subagentConfig,
9626
- onNestedEvent
9729
+ onSubagentEvent
9627
9730
  };
9628
9731
  }
9629
9732
  ask(userPrompt) {
@@ -9780,11 +9883,11 @@ ${endPrefix}`
9780
9883
  this.client = new LLMistClass();
9781
9884
  }
9782
9885
  const registry = GadgetRegistry.from(this.gadgets);
9783
- let onNestedEvent = this.nestedEventCallback;
9886
+ let onSubagentEvent = this.subagentEventCallback;
9784
9887
  if (this.parentContext) {
9785
- const { invocationId, onNestedEvent: parentCallback, depth } = this.parentContext;
9786
- const existingCallback = this.nestedEventCallback;
9787
- onNestedEvent = (event) => {
9888
+ const { invocationId, onSubagentEvent: parentCallback, depth } = this.parentContext;
9889
+ const existingCallback = this.subagentEventCallback;
9890
+ onSubagentEvent = (event) => {
9788
9891
  parentCallback({
9789
9892
  ...event,
9790
9893
  gadgetInvocationId: invocationId,
@@ -9819,7 +9922,7 @@ ${endPrefix}`
9819
9922
  compactionConfig: this.compactionConfig,
9820
9923
  signal: this.signal,
9821
9924
  subagentConfig: this.subagentConfig,
9822
- onNestedEvent
9925
+ onSubagentEvent
9823
9926
  };
9824
9927
  return new Agent(AGENT_INTERNAL_KEY, options);
9825
9928
  }