@oh-my-pi/pi-agent-core 13.18.0 → 14.0.2

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,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [14.0.1] - 2026-04-08
6
+ ### Added
7
+
8
+ - Added `onAssistantMessageEvent` callback option to inspect assistant streaming events before they are emitted, enabling abort decisions before buffered events continue flowing
9
+ - Added `setAssistantMessageEventInterceptor()` method to dynamically set or update the assistant message event interceptor
10
+
5
11
  ## [13.13.0] - 2026-03-18
6
12
 
7
13
  ### Added
@@ -310,4 +316,4 @@ Initial release under @oh-my-pi scope. See previous releases at [badlogic/pi-mon
310
316
 
311
317
  - `Agent` constructor now has all options optional (empty options use defaults).
312
318
 
313
- - `queueMessage()` is now synchronous (no longer returns a Promise).
319
+ - `queueMessage()` is now synchronous (no longer returns a Promise).
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": "13.18.0",
4
+ "version": "14.0.2",
5
5
  "description": "General-purpose agent with transport abstraction, state management, and attachment support",
6
6
  "homepage": "https://github.com/can1357/oh-my-pi",
7
7
  "author": "Can Boluk",
@@ -27,12 +27,16 @@
27
27
  "main": "./src/index.ts",
28
28
  "types": "./src/index.ts",
29
29
  "scripts": {
30
- "check": "tsgo -p tsconfig.json",
31
- "test": "bun test"
30
+ "check": "biome check . && bun run check:types",
31
+ "check:types": "tsgo -p tsconfig.json --noEmit",
32
+ "lint": "biome lint .",
33
+ "test": "bun test",
34
+ "fix": "biome check --write --unsafe .",
35
+ "fmt": "biome format --write ."
32
36
  },
33
37
  "dependencies": {
34
- "@oh-my-pi/pi-ai": "13.18.0",
35
- "@oh-my-pi/pi-utils": "13.18.0"
38
+ "@oh-my-pi/pi-ai": "14.0.2",
39
+ "@oh-my-pi/pi-utils": "14.0.2"
36
40
  },
37
41
  "devDependencies": {
38
42
  "@sinclair/typebox": "^0.34",
package/src/agent-loop.ts CHANGED
@@ -391,6 +391,10 @@ async function streamAssistantResponse(
391
391
  if (partialMessage) {
392
392
  partialMessage = event.partial;
393
393
  context.messages[context.messages.length - 1] = partialMessage;
394
+ config.onAssistantMessageEvent?.(partialMessage, event);
395
+ if (signal?.aborted) {
396
+ continue;
397
+ }
394
398
  stream.push({
395
399
  type: "message_update",
396
400
  assistantMessageEvent: event,
package/src/agent.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import {
5
5
  type AssistantMessage,
6
+ type AssistantMessageEvent,
6
7
  type CursorExecHandlers,
7
8
  type CursorToolResultHandler,
8
9
  type Effort,
@@ -130,7 +131,11 @@ export interface AgentOptions {
130
131
  * Inspect or replace provider payloads before they are sent.
131
132
  */
132
133
  onPayload?: SimpleStreamOptions["onPayload"];
133
-
134
+ /**
135
+ * Inspect assistant streaming events before they are emitted to subscribers.
136
+ * Use this when abort decisions must happen before buffered events continue flowing.
137
+ */
138
+ onAssistantMessageEvent?: (message: AssistantMessage, event: AssistantMessageEvent) => void;
134
139
  /**
135
140
  * Custom token budgets for thinking levels (token-based providers only).
136
141
  */
@@ -239,6 +244,7 @@ export class Agent {
239
244
  #intentTracing: boolean;
240
245
  #getToolChoice?: () => ToolChoice | undefined;
241
246
  #onPayload?: SimpleStreamOptions["onPayload"];
247
+ #onAssistantMessageEvent?: (message: AssistantMessage, event: AssistantMessageEvent) => void;
242
248
 
243
249
  /** Buffered Cursor tool results with text length at time of call (for correct ordering) */
244
250
  #cursorToolResultBuffer: CursorToolResultEntry[] = [];
@@ -275,6 +281,7 @@ export class Agent {
275
281
  this.#transformToolCallArguments = opts.transformToolCallArguments;
276
282
  this.#intentTracing = opts.intentTracing === true;
277
283
  this.#getToolChoice = opts.getToolChoice;
284
+ this.#onAssistantMessageEvent = opts.onAssistantMessageEvent;
278
285
  }
279
286
 
280
287
  /**
@@ -406,6 +413,12 @@ export class Agent {
406
413
  return () => this.#listeners.delete(fn);
407
414
  }
408
415
 
416
+ setAssistantMessageEventInterceptor(
417
+ fn: ((message: AssistantMessage, event: AssistantMessageEvent) => void) | undefined,
418
+ ): void {
419
+ this.#onAssistantMessageEvent = fn;
420
+ }
421
+
409
422
  emitExternalEvent(event: AgentEvent) {
410
423
  switch (event.type) {
411
424
  case "message_start":
@@ -762,6 +775,7 @@ export class Agent {
762
775
  cursorOnToolResult,
763
776
  transformToolCallArguments: this.#transformToolCallArguments,
764
777
  intentTracing: this.#intentTracing,
778
+ onAssistantMessageEvent: this.#onAssistantMessageEvent,
765
779
  getToolChoice,
766
780
  getSteeringMessages: async () => {
767
781
  if (skipInitialSteeringPoll) {
package/src/types.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type {
2
+ AssistantMessage,
2
3
  AssistantMessageEvent,
3
4
  AssistantMessageEventStream,
4
5
  Effort,
@@ -27,8 +28,8 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
27
28
 
28
29
  /**
29
30
  * When to interrupt tool execution for steering messages.
30
- * - "immediate": check after each tool call (default)
31
- * - "wait": defer steering until the current turn completes
31
+ * - "immediate" = check after each tool call (default)
32
+ * - "wait" = defer steering until the current turn completes
32
33
  */
33
34
  interruptMode?: "immediate" | "wait";
34
35
 
@@ -125,6 +126,7 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
125
126
  * Use for deobfuscating secrets or rewriting arguments.
126
127
  */
127
128
  transformToolCallArguments?: (args: Record<string, unknown>, toolName: string) => Record<string, unknown>;
129
+
128
130
  /**
129
131
  * Enable intent tracing for tool calls.
130
132
  * When enabled, the harness injects an `_i: string` field into tool schemas sent to the model,
@@ -132,6 +134,12 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
132
134
  */
133
135
  intentTracing?: boolean;
134
136
 
137
+ /**
138
+ * Inspect assistant streaming events before they are published to the outer agent event stream.
139
+ * Callers may abort synchronously to stop consuming buffered provider events.
140
+ */
141
+ onAssistantMessageEvent?: (message: AssistantMessage, event: AssistantMessageEvent) => void;
142
+
135
143
  /**
136
144
  * Dynamic tool choice override, resolved per LLM call.
137
145
  * When set and returns a value, overrides the static `toolChoice`.