@mono-agent/agent-runtime 0.11.1 → 0.11.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mono-agent/agent-runtime",
3
- "version": "0.11.1",
3
+ "version": "0.11.3",
4
4
  "description": "Agent runtime supporting Claude SDK/CLI, Codex, OpenCode, and Pi SDK bridges out of the box",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-only",
@@ -94,9 +94,9 @@ export function emitCapabilitiesResolved(onEvent, { sdk, model, capabilitiesUsed
94
94
 
95
95
  /**
96
96
  * The aborted-run result (entry pre-check / pre-request abort). Pure factory.
97
- * @param {{resolved: any, options: any, events: any[], runtimeWarnings: any[], start: number, providerSessionId: string}} params
97
+ * @param {{resolved: any, options: any, events: any[], runtimeWarnings: any[], start: number, providerSessionId: string, piTransport: string}} params
98
98
  */
99
- export function abortedResult({ resolved, options, events, runtimeWarnings, start, providerSessionId }) {
99
+ export function abortedResult({ resolved, options, events, runtimeWarnings, start, providerSessionId, piTransport }) {
100
100
  return {
101
101
  text: null,
102
102
  thinking: "",
@@ -116,6 +116,7 @@ export function abortedResult({ resolved, options, events, runtimeWarnings, star
116
116
  provider_session_id: providerSessionId,
117
117
  pi_stop_reason: "aborted",
118
118
  pi_engine: "native",
119
+ pi_transport_requested: piTransport,
119
120
  external_abort: true,
120
121
  },
121
122
  };
@@ -201,6 +202,7 @@ export function buildErrorResult(params) {
201
202
  providerSessionId,
202
203
  runtimeWarnings,
203
204
  isRetryable,
205
+ piTransport,
204
206
  } = params;
205
207
  return {
206
208
  text: assistantTexts.join("") || null,
@@ -221,6 +223,7 @@ export function buildErrorResult(params) {
221
223
  max_turns_hit: maxTurnsHit,
222
224
  provider_session_id: providerSessionId,
223
225
  pi_engine: "native",
226
+ pi_transport_requested: piTransport,
224
227
  pi_error_retryable: isRetryable,
225
228
  },
226
229
  failureKind: externalAbort ? null : failureKindForPiError(errorMessage, {}, { maxTurnsHit }),
@@ -230,6 +233,7 @@ export function buildErrorResult(params) {
230
233
  provider_session_id: providerSessionId,
231
234
  pi_stop_reason: externalAbort ? "aborted" : "error",
232
235
  pi_engine: "native",
236
+ pi_transport_requested: piTransport,
233
237
  max_turns_hit: maxTurnsHit,
234
238
  turn_count: turnCount,
235
239
  external_abort: externalAbort,
@@ -252,6 +256,7 @@ export function buildDiagnostics(params) {
252
256
  runAssistantCount,
253
257
  externalAbort,
254
258
  maxRetries,
259
+ piTransport,
255
260
  lastToolName,
256
261
  structuredRetry,
257
262
  contextCompactionDiagnostics,
@@ -265,6 +270,7 @@ export function buildDiagnostics(params) {
265
270
  turn_count: turnCount || runAssistantCount,
266
271
  external_abort: externalAbort,
267
272
  pi_max_retries: maxRetries,
273
+ pi_transport_requested: piTransport,
268
274
  ...(lastToolName ? { last_tool_name: lastToolName } : {}),
269
275
  ...structuredOutputRetryDiagnostics(
270
276
  structuredRetry.attempts,
@@ -177,6 +177,7 @@ function sessionUnavailableResult({
177
177
  errorMessage,
178
178
  failureKind,
179
179
  piErrorCode,
180
+ piTransport,
180
181
  }) {
181
182
  return {
182
183
  text: null,
@@ -196,6 +197,7 @@ function sessionUnavailableResult({
196
197
  provider_session_id: sessionId,
197
198
  pi_error_code: piErrorCode,
198
199
  pi_engine: "native",
200
+ pi_transport_requested: piTransport,
199
201
  },
200
202
  };
201
203
  }
@@ -221,6 +223,7 @@ export async function resolveSession(runState, {
221
223
  events,
222
224
  runtimeWarnings,
223
225
  start,
226
+ piTransport,
224
227
  }) {
225
228
  // Resume check first: a session miss must stay cheap (no tool/MCP/harness
226
229
  // init). This mirrors the legacy bridge's fail-fast contract.
@@ -307,6 +310,7 @@ export async function resolveSession(runState, {
307
310
  errorMessage: `Pi session ${requestedSessionId} is not live`,
308
311
  failureKind: "session_not_found",
309
312
  piErrorCode: "pi_session_not_found",
313
+ piTransport,
310
314
  }),
311
315
  };
312
316
  }
@@ -344,6 +348,7 @@ export async function resolveSession(runState, {
344
348
  : `Pi session ${requestedSessionId} is busy with another turn`,
345
349
  failureKind: missing ? "session_not_found" : "session_busy",
346
350
  piErrorCode: missing ? "pi_session_not_found" : "pi_session_busy",
351
+ piTransport,
347
352
  }),
348
353
  };
349
354
  }
@@ -0,0 +1,16 @@
1
+ // @ts-check
2
+
3
+ const PI_TRANSPORTS = new Set(["auto", "sse", "websocket", "websocket-cached"]);
4
+
5
+ /**
6
+ * Normalize the public runtime option at the untyped JS boundary. Typed/config
7
+ * callers already validate it; direct JavaScript callers fail safely to Pi's
8
+ * compatibility-preserving automatic transport selection.
9
+ * @param {unknown} value
10
+ * @returns {"auto" | "sse" | "websocket" | "websocket-cached"}
11
+ */
12
+ export function resolvePiTransport(value) {
13
+ return typeof value === "string" && PI_TRANSPORTS.has(value)
14
+ ? /** @type {"auto" | "sse" | "websocket" | "websocket-cached"} */ (value)
15
+ : "auto";
16
+ }
@@ -172,6 +172,7 @@ export function buildTurnHarness(runState, {
172
172
  systemPrompt,
173
173
  outputSchema,
174
174
  tools,
175
+ transport,
175
176
  maxRetries,
176
177
  maxRetryDelayMs,
177
178
  steeringMode,
@@ -187,7 +188,7 @@ export function buildTurnHarness(runState, {
187
188
  thinkingLevel,
188
189
  systemPrompt: appendStructuredOutputInstruction(systemPrompt, outputSchema, options.prompts),
189
190
  tools,
190
- streamOptions: { maxRetries, maxRetryDelayMs },
191
+ streamOptions: { transport, maxRetries, maxRetryDelayMs },
191
192
  steeringMode,
192
193
  followUpMode: steeringMode,
193
194
  });
@@ -76,6 +76,7 @@ import {
76
76
  startLiveInput,
77
77
  thinkingLevelForEffort,
78
78
  } from "./pi-native/turn-runner.js";
79
+ import { resolvePiTransport } from "./pi-native/transport.js";
79
80
 
80
81
  async function resolveApiKey(provider, { apiKeys, resolvePiApiKey, runtimeWarnings }) {
81
82
  if (apiKeys?.has(provider)) return apiKeys.get(provider);
@@ -302,6 +303,7 @@ export async function generatePiNativeResponse(systemPrompt, options = {}) {
302
303
  let structuredOutputFinalizationRetryAttempts = 0;
303
304
  let structuredOutputFinalizationRetryReason = null;
304
305
  let structuredOutputFinalizationRetryFailed = false;
306
+ const piTransport = resolvePiTransport(options.piTransport);
305
307
 
306
308
  const onEvent = (event) => emitCaptured(events, options.onEvent, event);
307
309
  const approvalManager = options.onToolApprovalRequest
@@ -316,7 +318,7 @@ export async function generatePiNativeResponse(systemPrompt, options = {}) {
316
318
  : null;
317
319
 
318
320
  if (options.abortSignal?.aborted) {
319
- return abortedResult({ resolved, options, events, runtimeWarnings, start, providerSessionId });
321
+ return abortedResult({ resolved, options, events, runtimeWarnings, start, providerSessionId, piTransport });
320
322
  }
321
323
 
322
324
  const durableRepo = resolveDurableNativeSessionRepo(options.piSessionsRoot);
@@ -341,6 +343,7 @@ export async function generatePiNativeResponse(systemPrompt, options = {}) {
341
343
  events,
342
344
  runtimeWarnings,
343
345
  start,
346
+ piTransport,
344
347
  });
345
348
  if (resolvedSession.done) return resolvedSession.result;
346
349
 
@@ -432,6 +435,7 @@ export async function generatePiNativeResponse(systemPrompt, options = {}) {
432
435
  systemPrompt,
433
436
  outputSchema: options.outputSchema,
434
437
  tools,
438
+ transport: piTransport,
435
439
  maxRetries,
436
440
  maxRetryDelayMs,
437
441
  steeringMode: toolSteeringMode,
@@ -484,7 +488,7 @@ export async function generatePiNativeResponse(systemPrompt, options = {}) {
484
488
  // and closes MCP clients. For a resume no transcript was appended yet
485
489
  // (prompt never ran), so the live session needs no rollback.
486
490
  await discardUncommittedSession(runState, { durableRepo });
487
- return abortedResult({ resolved, options, events, runtimeWarnings, start, providerSessionId });
491
+ return abortedResult({ resolved, options, events, runtimeWarnings, start, providerSessionId, piTransport });
488
492
  }
489
493
 
490
494
  // Compaction policy against the LIVE model's context window, then proactive
@@ -619,6 +623,7 @@ export async function generatePiNativeResponse(systemPrompt, options = {}) {
619
623
  runAssistantCount,
620
624
  externalAbort: runState.externalAbort,
621
625
  maxRetries,
626
+ piTransport,
622
627
  lastToolName: runState.lastToolName,
623
628
  structuredRetry,
624
629
  contextCompactionDiagnostics: runState.compaction.diagnostics,
@@ -737,6 +742,7 @@ export async function generatePiNativeResponse(systemPrompt, options = {}) {
737
742
  providerSessionId,
738
743
  runtimeWarnings,
739
744
  isRetryable,
745
+ piTransport,
740
746
  });
741
747
  } finally {
742
748
  if (runState.sessionEntry) runState.sessionEntry.busy = false;
@@ -53,15 +53,16 @@ export function emitCapabilitiesResolved(onEvent: (event: any) => void, { sdk, m
53
53
  }): void;
54
54
  /**
55
55
  * The aborted-run result (entry pre-check / pre-request abort). Pure factory.
56
- * @param {{resolved: any, options: any, events: any[], runtimeWarnings: any[], start: number, providerSessionId: string}} params
56
+ * @param {{resolved: any, options: any, events: any[], runtimeWarnings: any[], start: number, providerSessionId: string, piTransport: string}} params
57
57
  */
58
- export function abortedResult({ resolved, options, events, runtimeWarnings, start, providerSessionId }: {
58
+ export function abortedResult({ resolved, options, events, runtimeWarnings, start, providerSessionId, piTransport }: {
59
59
  resolved: any;
60
60
  options: any;
61
61
  events: any[];
62
62
  runtimeWarnings: any[];
63
63
  start: number;
64
64
  providerSessionId: string;
65
+ piTransport: string;
65
66
  }): {
66
67
  text: any;
67
68
  thinking: string;
@@ -81,6 +82,7 @@ export function abortedResult({ resolved, options, events, runtimeWarnings, star
81
82
  provider_session_id: string;
82
83
  pi_stop_reason: string;
83
84
  pi_engine: string;
85
+ pi_transport_requested: string;
84
86
  external_abort: boolean;
85
87
  };
86
88
  };
@@ -140,6 +142,7 @@ export function buildErrorResult(params: object): {
140
142
  max_turns_hit: any;
141
143
  provider_session_id: any;
142
144
  pi_engine: string;
145
+ pi_transport_requested: any;
143
146
  pi_error_retryable: any;
144
147
  };
145
148
  failureKind: string;
@@ -149,6 +152,7 @@ export function buildErrorResult(params: object): {
149
152
  provider_session_id: any;
150
153
  pi_stop_reason: string;
151
154
  pi_engine: string;
155
+ pi_transport_requested: any;
152
156
  max_turns_hit: any;
153
157
  turn_count: any;
154
158
  external_abort: any;
@@ -17,7 +17,7 @@ export function retireDurableNativeSession(providerSessionId: any, piSessionsRoo
17
17
  * @param {any} params
18
18
  * @returns {Promise<{done: true, result: any} | {done: false}>}
19
19
  */
20
- export function resolveSession(runState: any, { requestedSessionId, providerSessionId, durableRepo, sessionTtlMs, cwd, resolved, options, events, runtimeWarnings, start, }: any): Promise<{
20
+ export function resolveSession(runState: any, { requestedSessionId, providerSessionId, durableRepo, sessionTtlMs, cwd, resolved, options, events, runtimeWarnings, start, piTransport, }: any): Promise<{
21
21
  done: true;
22
22
  result: any;
23
23
  } | {
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Normalize the public runtime option at the untyped JS boundary. Typed/config
3
+ * callers already validate it; direct JavaScript callers fail safely to Pi's
4
+ * compatibility-preserving automatic transport selection.
5
+ * @param {unknown} value
6
+ * @returns {"auto" | "sse" | "websocket" | "websocket-cached"}
7
+ */
8
+ export function resolvePiTransport(value: unknown): "auto" | "sse" | "websocket" | "websocket-cached";
@@ -30,7 +30,7 @@ export function thinkingLevelForEffort(effort: string, capabilities: any): strin
30
30
  * @param {any} params
31
31
  * @returns {any}
32
32
  */
33
- export function buildTurnHarness(runState: any, { cwd, session, piModels, model, thinkingLevel, systemPrompt, outputSchema, tools, maxRetries, maxRetryDelayMs, steeringMode, onEvent, options, toolLimits, }: any): any;
33
+ export function buildTurnHarness(runState: any, { cwd, session, piModels, model, thinkingLevel, systemPrompt, outputSchema, tools, transport, maxRetries, maxRetryDelayMs, steeringMode, onEvent, options, toolLimits, }: any): any;
34
34
  /**
35
35
  * Start the live-input steering consumer. Consumes follow-up messages and steers
36
36
  * the harness mid-run; the consumer is tied to run completion (an internal