@oh-my-pi/pi-agent-core 15.2.2 → 15.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/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [15.2.3] - 2026-05-22
6
+ ### Added
7
+
8
+ - Added `onBeforeYield` hook support so user code can run right before the agent loop checks for follow-up messages
9
+
5
10
  ## [15.1.3] - 2026-05-17
6
11
  ### Added
7
12
 
@@ -265,6 +265,7 @@ export declare class Agent {
265
265
  setProviderResponseInterceptor(fn: SimpleStreamOptions["onResponse"] | undefined): void;
266
266
  setRawSseEventInterceptor(fn: SimpleStreamOptions["onSseEvent"] | undefined): void;
267
267
  setAssistantMessageEventInterceptor(fn: ((message: AssistantMessage, event: AssistantMessageEvent) => void) | undefined): void;
268
+ setOnBeforeYield(fn: (() => Promise<void> | void) | undefined): void;
268
269
  emitExternalEvent(event: AgentEvent): void;
269
270
  setSystemPrompt(v: string[]): void;
270
271
  setModel(m: Model): void;
@@ -94,6 +94,13 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
94
94
  * continues with another turn.
95
95
  */
96
96
  getFollowUpMessages?: () => Promise<AgentMessage[]>;
97
+ /**
98
+ * Hook fired right before the loop would exit.
99
+ *
100
+ * Called when the agent has no more tool calls and no steering messages,
101
+ * immediately before polling follow-up messages.
102
+ */
103
+ onBeforeYield?: () => Promise<void> | void;
97
104
  /**
98
105
  * Provides tool execution context, resolved per tool call.
99
106
  * Use for late-bound UI or session state access.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oh-my-pi/pi-agent-core",
4
- "version": "15.2.2",
4
+ "version": "15.2.3",
5
5
  "description": "General-purpose agent with transport abstraction, state management, and attachment support",
6
6
  "homepage": "https://omp.sh",
7
7
  "author": "Can Boluk",
@@ -35,9 +35,9 @@
35
35
  "fmt": "biome format --write ."
36
36
  },
37
37
  "dependencies": {
38
- "@oh-my-pi/pi-ai": "15.2.2",
39
- "@oh-my-pi/pi-natives": "15.2.2",
40
- "@oh-my-pi/pi-utils": "15.2.2",
38
+ "@oh-my-pi/pi-ai": "15.2.3",
39
+ "@oh-my-pi/pi-natives": "15.2.3",
40
+ "@oh-my-pi/pi-utils": "15.2.3",
41
41
  "@opentelemetry/api": "^1.9.0"
42
42
  },
43
43
  "devDependencies": {
package/src/agent-loop.ts CHANGED
@@ -589,6 +589,7 @@ async function runLoopBody(
589
589
  }
590
590
 
591
591
  // Agent would stop here. Check for follow-up messages.
592
+ await config.onBeforeYield?.();
592
593
  const followUpMessages = (await config.getFollowUpMessages?.()) || [];
593
594
  if (followUpMessages.length > 0) {
594
595
  // Set as pending so inner loop processes them
package/src/agent.ts CHANGED
@@ -290,6 +290,7 @@ export class Agent {
290
290
  #onSseEvent?: SimpleStreamOptions["onSseEvent"];
291
291
  #onAssistantMessageEvent?: (message: AssistantMessage, event: AssistantMessageEvent) => void;
292
292
  #onHarmonyLeak?: (event: HarmonyAuditEvent) => void | Promise<void>;
293
+ #onBeforeYield?: () => Promise<void> | void;
293
294
  #telemetry?: AgentLoopConfig["telemetry"];
294
295
 
295
296
  /** Buffered Cursor tool results with text length at time of call (for correct ordering) */
@@ -559,6 +560,10 @@ export class Agent {
559
560
  this.#onAssistantMessageEvent = fn;
560
561
  }
561
562
 
563
+ setOnBeforeYield(fn: (() => Promise<void> | void) | undefined): void {
564
+ this.#onBeforeYield = fn;
565
+ }
566
+
562
567
  emitExternalEvent(event: AgentEvent) {
563
568
  switch (event.type) {
564
569
  case "message_start":
@@ -934,6 +939,7 @@ export class Agent {
934
939
  return this.#dequeueSteeringMessages();
935
940
  },
936
941
  getFollowUpMessages: async () => this.#dequeueFollowUpMessages(),
942
+ onBeforeYield: () => this.#onBeforeYield?.(),
937
943
  telemetry: this.#telemetry,
938
944
  };
939
945
 
package/src/types.ts CHANGED
@@ -122,6 +122,13 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
122
122
  * continues with another turn.
123
123
  */
124
124
  getFollowUpMessages?: () => Promise<AgentMessage[]>;
125
+ /**
126
+ * Hook fired right before the loop would exit.
127
+ *
128
+ * Called when the agent has no more tool calls and no steering messages,
129
+ * immediately before polling follow-up messages.
130
+ */
131
+ onBeforeYield?: () => Promise<void> | void;
125
132
 
126
133
  /**
127
134
  * Provides tool execution context, resolved per tool call.