@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 +7 -1
- package/package.json +9 -5
- package/src/agent-loop.ts +4 -0
- package/src/agent.ts +15 -1
- package/src/types.ts +10 -2
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": "
|
|
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": "
|
|
31
|
-
"
|
|
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": "
|
|
35
|
-
"@oh-my-pi/pi-utils": "
|
|
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"
|
|
31
|
-
* - "wait"
|
|
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`.
|