@usine/agents 0.3.0 → 0.4.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.
Files changed (94) hide show
  1. package/README.md +92 -30
  2. package/dist/child-host/child-host.d.ts +60 -0
  3. package/dist/child-host/child-host.d.ts.map +1 -0
  4. package/dist/child-host/child-host.js +84 -0
  5. package/dist/child-host/child-host.js.map +1 -0
  6. package/dist/child-host/command.d.ts +11 -0
  7. package/dist/child-host/command.d.ts.map +1 -0
  8. package/dist/child-host/command.js +26 -0
  9. package/dist/child-host/command.js.map +1 -0
  10. package/dist/pi/authentication.d.ts +11 -2
  11. package/dist/pi/authentication.d.ts.map +1 -1
  12. package/dist/pi/authentication.js +15 -2
  13. package/dist/pi/authentication.js.map +1 -1
  14. package/dist/pi/children.d.ts +1 -4
  15. package/dist/pi/children.d.ts.map +1 -1
  16. package/dist/pi/children.js +1 -4
  17. package/dist/pi/children.js.map +1 -1
  18. package/dist/pi/claude.d.ts +8 -9
  19. package/dist/pi/claude.d.ts.map +1 -1
  20. package/dist/pi/claude.js +366 -50
  21. package/dist/pi/claude.js.map +1 -1
  22. package/dist/pi/codex/account.d.ts +3 -3
  23. package/dist/pi/codex/account.d.ts.map +1 -1
  24. package/dist/pi/codex/account.js +5 -5
  25. package/dist/pi/codex/account.js.map +1 -1
  26. package/dist/pi/codex/app-server.d.ts +19 -7
  27. package/dist/pi/codex/app-server.d.ts.map +1 -1
  28. package/dist/pi/codex/app-server.js +41 -36
  29. package/dist/pi/codex/app-server.js.map +1 -1
  30. package/dist/pi/codex/codec.d.ts +35 -13
  31. package/dist/pi/codex/codec.d.ts.map +1 -1
  32. package/dist/pi/codex/codec.js +42 -15
  33. package/dist/pi/codex/codec.js.map +1 -1
  34. package/dist/pi/codex/codex.d.ts +0 -1
  35. package/dist/pi/codex/codex.d.ts.map +1 -1
  36. package/dist/pi/codex/codex.js +75 -14
  37. package/dist/pi/codex/codex.js.map +1 -1
  38. package/dist/pi/conversation.d.ts +29 -12
  39. package/dist/pi/conversation.d.ts.map +1 -1
  40. package/dist/pi/conversation.js +54 -18
  41. package/dist/pi/conversation.js.map +1 -1
  42. package/dist/pi/pi.d.ts +1 -4
  43. package/dist/pi/pi.d.ts.map +1 -1
  44. package/dist/pi/pi.js +24 -175
  45. package/dist/pi/pi.js.map +1 -1
  46. package/dist/pi/sdk.d.ts +11 -15
  47. package/dist/pi/sdk.d.ts.map +1 -1
  48. package/dist/pi/sdk.js +35 -53
  49. package/dist/pi/sdk.js.map +1 -1
  50. package/dist/pi/session.d.ts +13 -14
  51. package/dist/pi/session.d.ts.map +1 -1
  52. package/dist/pi/session.js +63 -24
  53. package/dist/pi/session.js.map +1 -1
  54. package/dist/pi/turns.d.ts +7 -7
  55. package/dist/pi/turns.d.ts.map +1 -1
  56. package/dist/pi/turns.js +22 -9
  57. package/dist/pi/turns.js.map +1 -1
  58. package/dist/pi/usage.d.ts +29 -15
  59. package/dist/pi/usage.d.ts.map +1 -1
  60. package/dist/pi/usage.js +48 -24
  61. package/dist/pi/usage.js.map +1 -1
  62. package/dist/preflight/command.d.ts +16 -3
  63. package/dist/preflight/command.d.ts.map +1 -1
  64. package/dist/preflight/command.js +30 -17
  65. package/dist/preflight/command.js.map +1 -1
  66. package/dist/preflight/preflight.d.ts +10 -5
  67. package/dist/preflight/preflight.d.ts.map +1 -1
  68. package/dist/preflight/preflight.js +52 -25
  69. package/dist/preflight/preflight.js.map +1 -1
  70. package/dist/prompt.d.ts +12 -9
  71. package/dist/prompt.d.ts.map +1 -1
  72. package/dist/prompt.js +33 -4
  73. package/dist/prompt.js.map +1 -1
  74. package/dist/protocol/codex.d.ts +4 -7
  75. package/dist/protocol/codex.d.ts.map +1 -1
  76. package/dist/protocol/codex.js +1 -1
  77. package/dist/protocol/codex.js.map +1 -1
  78. package/dist/runtime.d.ts +100 -55
  79. package/dist/runtime.d.ts.map +1 -1
  80. package/dist/runtime.js +108 -27
  81. package/dist/runtime.js.map +1 -1
  82. package/package.json +22 -10
  83. package/dist/pi/live.d.ts +0 -4
  84. package/dist/pi/live.d.ts.map +0 -1
  85. package/dist/pi/live.js +0 -11
  86. package/dist/pi/live.js.map +0 -1
  87. package/dist/pi/subagents.d.ts +0 -29
  88. package/dist/pi/subagents.d.ts.map +0 -1
  89. package/dist/pi/subagents.js +0 -120
  90. package/dist/pi/subagents.js.map +0 -1
  91. package/dist/pi/thinking.d.ts +0 -8
  92. package/dist/pi/thinking.d.ts.map +0 -1
  93. package/dist/pi/thinking.js +0 -15
  94. package/dist/pi/thinking.js.map +0 -1
@@ -1,42 +1,41 @@
1
- import { AgentSession, AgentSessionEvent, AgentSessionId, SessionFinished, SessionTokensUpdated, TextOutput, ToolFinished, ToolStarted } from "@usine/core/agent/session";
2
- import { Cause, Deferred, Effect, Queue } from "effect";
1
+ import { AgentSession, AgentSessionEvent, AgentSessionId, ProviderRecovered, ProviderRetrying, SessionFinished, SessionTokensUpdated, TextOutput, ToolFinished, ToolStarted } from "@usine/core/agent/session";
2
+ import { Cause, Deferred, Effect, Option, Queue } from "effect";
3
3
  import { type AgentSessionError, SessionResult } from "../runtime.ts";
4
4
  import type { PiMessage, PiSession } from "./sdk.ts";
5
5
  export interface SessionChannelOptions {
6
- /** Adapter name printed in the terminal log lines. */
6
+ /** The adapter name in log lines. */
7
7
  readonly label: string;
8
8
  readonly sessionId: AgentSessionId;
9
9
  }
10
10
  /**
11
- * Shared session state: one event queue, one result, and a latch so exactly
12
- * one terminal transition wins. Cleanups registered through `onTerminal` run
13
- * on that transition.
11
+ * The state of one session: an event queue, a result, and a latch that allows one terminal
12
+ * transition. Cleanups registered with `onTerminal` run on that transition.
14
13
  */
15
14
  export interface SessionChannel {
16
15
  readonly events: Queue.Queue<AgentSessionEvent, AgentSessionError | Cause.Done>;
17
16
  readonly result: Deferred.Deferred<SessionResult, AgentSessionError>;
18
17
  readonly isTerminal: Effect.Effect<boolean>;
19
18
  readonly onTerminal: (cleanup: () => void) => void;
20
- /** Queues one event; after the terminal transition the event is logged and dropped. */
19
+ /** Queues an event; after the terminal transition, logs and drops it. */
21
20
  readonly emit: (event: AgentSessionEvent) => Effect.Effect<void>;
22
21
  readonly fail: (error: AgentSessionError) => Effect.Effect<void>;
23
22
  readonly finish: (session: AgentSession, message: string) => Effect.Effect<void>;
24
23
  }
25
24
  export declare const sessionChannel: (options: SessionChannelOptions) => Effect.Effect<{
26
- events: Queue.Queue<import("@usine/core/agent/session").PoolRateLimitsUpdated | SessionFinished | import("@usine/core/agent/session").SessionIdle | import("@usine/core/agent/session").SessionResumed | import("@usine/core/agent/session").SessionStarted | SessionTokensUpdated | TextOutput | ToolFinished | ToolStarted, import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | Cause.Done<void> | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError>;
27
- result: Deferred.Deferred<SessionResult, import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError>;
25
+ events: Queue.Queue<import("@usine/core/agent/session").PoolRateLimitsUpdated | ProviderRecovered | ProviderRetrying | SessionFinished | import("@usine/core/agent/session").SessionIdle | import("@usine/core/agent/session").SessionResumed | import("@usine/core/agent/session").SessionStarted | SessionTokensUpdated | TextOutput | ToolFinished | ToolStarted, import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | Cause.Done<void> | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError>;
26
+ result: Deferred.Deferred<SessionResult, import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError>;
28
27
  isTerminal: Effect.Effect<boolean, never, never>;
29
28
  onTerminal: (cleanup: () => void) => void;
30
29
  emit: (event: AgentSessionEvent) => Effect.Effect<void, never, never>;
31
- fail: (error: import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError) => Effect.Effect<void, never, never>;
30
+ fail: (error: import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError) => Effect.Effect<void, never, never>;
32
31
  finish: (session: import("@usine/core/agent/session").ChildSession | import("@usine/core/agent/session").ParentSession, message: string) => Effect.Effect<void, never, never>;
33
32
  }, never, never>;
33
+ /** Returns the text of a user message as Pi compares it with its queued messages, or `None` for other messages. */
34
+ export declare const piUserMessageText: (message: PiMessage) => Option.Option<string>;
34
35
  export declare const lastPiMessageText: (messages: ReadonlyArray<PiMessage>) => string | undefined;
35
36
  /**
36
- * Subscribes the Pi SDK's synchronous listener to one session channel.
37
- * Normalized events reach the queue on the SDK's own tick so none can trail
38
- * the prompt's resolution; operational events with no normalized shape (retry
39
- * backoffs, compactions) are logged so a silent wait stays explainable.
37
+ * Subscribes to `piSession` and queues normalized events synchronously, so none arrive after the
38
+ * prompt resolves. Provider retries are counted per turn and reset on `agent_settled`.
40
39
  */
41
40
  export declare const subscribePiSession: (piSession: PiSession, session: AgentSession, channel: SessionChannel) => Effect.Effect<{
42
41
  lastText: () => string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,oBAAoB,EAEpB,UAAU,EACV,YAAY,EACZ,WAAW,EACZ,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAU,KAAK,EAAe,MAAM,QAAQ,CAAC;AAE7E,OAAO,EAAE,KAAK,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAkB,MAAM,UAAU,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;CACpC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAChF,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IACrE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACnD,uFAAuF;IACvF,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAClF;AAED,eAAO,MAAM,cAAc;;;;0BAqDD,MAAM,IAAI;kBA1Cb,iBAAiB;;;gBAiDtC,CAAC;AAyCH,eAAO,MAAM,iBAAiB,aAAc,aAAa,CAAC,SAAS,CAAC,KAAG,MAAM,GAAG,SAQ/E,CAAC;AA8BF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,cAClB,SAAS,WACX,YAAY,WACZ,cAAc;;;gBAyErB,CAAC"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EAEjB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EAEpB,UAAU,EACV,YAAY,EACZ,WAAW,EACZ,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAe,MAAM,QAAQ,CAAC;AAE7E,OAAO,EAAE,KAAK,iBAAiB,EAAmB,aAAa,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAkB,MAAM,UAAU,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAChF,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IACrE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACnD,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAClF;AAED,eAAO,MAAM,cAAc;;;;0BAyDD,MAAM,IAAI;kBA9Cb,iBAAiB;;;gBAqDtC,CAAC;AA8CH,mHAAmH;AACnH,eAAO,MAAM,iBAAiB,YAAa,SAAS,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAS1E,CAAC;AAEF,eAAO,MAAM,iBAAiB,aAAc,aAAa,CAAC,SAAS,CAAC,KAAG,MAAM,GAAG,SAQ/E,CAAC;AA8BF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,cAClB,SAAS,WACX,YAAY,WACZ,cAAc;;;gBAyFrB,CAAC"}
@@ -1,7 +1,7 @@
1
- import { AgentSession, AgentSessionEvent, AgentSessionId, SessionFinished, SessionTokensUpdated, TokenCount, TextOutput, ToolFinished, ToolStarted, } from "@usine/core/agent/session";
1
+ import { AgentSession, AgentSessionEvent, AgentSessionId, ProviderRecovered, ProviderRetries, ProviderRetrying, SessionFinished, SessionTokensUpdated, TokenCount, TextOutput, ToolFinished, ToolStarted, } from "@usine/core/agent/session";
2
2
  import { Cause, Deferred, Effect, Option, Queue, Ref, Schema } from "effect";
3
- import { piMessageTokens } from "./usage.js";
4
- import { SessionResult } from "../runtime.js";
3
+ import { addUsage, piMessageUsage } from "./usage.js";
4
+ import { reportedOutcome, SessionResult } from "../runtime.js";
5
5
  export const sessionChannel = Effect.fn("SessionChannel.make")(function* (options) {
6
6
  const events = yield* Queue.make();
7
7
  const result = yield* Deferred.make();
@@ -18,6 +18,7 @@ export const sessionChannel = Effect.fn("SessionChannel.make")(function* (option
18
18
  sessionId: options.sessionId,
19
19
  })));
20
20
  const fail = Effect.fn("SessionChannel.fail")(function* (error) {
21
+ yield* Effect.annotateCurrentSpan({ sessionId: options.sessionId });
21
22
  if (yield* Ref.getAndSet(terminal, true))
22
23
  return;
23
24
  yield* Effect.logError(`${options.label} failed`, {
@@ -30,6 +31,10 @@ export const sessionChannel = Effect.fn("SessionChannel.make")(function* (option
30
31
  yield* runCleanups;
31
32
  });
32
33
  const finish = Effect.fn("SessionChannel.finish")(function* (session, message) {
34
+ yield* Effect.annotateCurrentSpan({ sessionId: session.id });
35
+ const own = reportedOutcome(Option.some(session.id), message);
36
+ if (Option.isSome(own))
37
+ return yield* fail(own.value);
33
38
  if (yield* Ref.getAndSet(terminal, true))
34
39
  return;
35
40
  yield* Queue.offer(events, new SessionFinished({ session }));
@@ -89,6 +94,21 @@ const messageText = (message) => {
89
94
  .trim();
90
95
  return text || undefined;
91
96
  };
97
+ const PiUserMessage = Schema.Struct({
98
+ role: Schema.Literal("user"),
99
+ content: Schema.Union([Schema.String, Schema.Array(Schema.Json)]),
100
+ });
101
+ /** Returns the text of a user message as Pi compares it with its queued messages, or `None` for other messages. */
102
+ export const piUserMessageText = (message) => {
103
+ if (!Schema.is(PiUserMessage)(message))
104
+ return Option.none();
105
+ if (Schema.is(Schema.String)(message.content))
106
+ return Option.some(message.content);
107
+ return Option.some(message.content
108
+ .filter(Schema.is(PiTextBlock))
109
+ .map(({ text }) => text)
110
+ .join(""));
111
+ };
92
112
  export const lastPiMessageText = (messages) => {
93
113
  for (let index = messages.length - 1; index >= 0; index -= 1) {
94
114
  const message = messages[index];
@@ -125,40 +145,59 @@ const sessionEventFrom = (event, session) => {
125
145
  return undefined;
126
146
  };
127
147
  /**
128
- * Subscribes the Pi SDK's synchronous listener to one session channel.
129
- * Normalized events reach the queue on the SDK's own tick so none can trail
130
- * the prompt's resolution; operational events with no normalized shape (retry
131
- * backoffs, compactions) are logged so a silent wait stays explainable.
148
+ * Subscribes to `piSession` and queues normalized events synchronously, so none arrive after the
149
+ * prompt resolves. Provider retries are counted per turn and reset on `agent_settled`.
132
150
  */
133
151
  export const subscribePiSession = (piSession, session, channel) => Effect.gen(function* () {
134
152
  const context = yield* Effect.context();
135
153
  const log = Effect.runForkWith(context);
136
154
  let lastText;
137
- let totalTokens = 0;
155
+ let total = { totalTokens: TokenCount.make(0), costUsd: Option.none() };
156
+ // Provider retries reported in the current turn, and whether the last retry is unresolved.
157
+ let retries = 0;
158
+ let retrying = false;
159
+ const offer = (sessionEvent) => {
160
+ if (!Queue.offerUnsafe(channel.events, sessionEvent)) {
161
+ log(Effect.logWarning("Dropped a Pi session event after the terminal transition", {
162
+ event: sessionEvent._tag,
163
+ sessionId: session.id,
164
+ }));
165
+ }
166
+ };
138
167
  const unsubscribe = piSession.subscribe((event) => {
139
168
  if (event.type === "message_end") {
140
- const usage = piMessageTokens(event.message);
169
+ const usage = piMessageUsage(event.message);
141
170
  if (Option.isSome(usage)) {
142
- totalTokens += usage.value.usage.totalTokens;
143
- if (!Queue.offerUnsafe(channel.events, new SessionTokensUpdated({ session, totalTokens: TokenCount.make(totalTokens) }))) {
144
- log(Effect.logWarning("Dropped Pi usage after the terminal transition", {
145
- sessionId: session.id,
146
- }));
147
- }
171
+ total = addUsage(total, usage.value);
172
+ offer(new SessionTokensUpdated({ session, ...total }));
148
173
  }
149
174
  }
150
175
  if (event.type === "auto_retry_start") {
151
- log(Effect.logWarning("Pi session is backing off before a retry", {
176
+ retries += 1;
177
+ retrying = true;
178
+ const message = event.errorMessage || "Unknown error";
179
+ log(Effect.logWarning("Pi session cannot reach its provider and will retry", {
152
180
  attempt: event.attempt,
153
181
  delayMillis: event.delayMs,
154
- errorMessage: event.errorMessage,
155
182
  maxAttempts: event.maxAttempts,
183
+ message,
184
+ retries,
156
185
  sessionId: session.id,
157
186
  }));
187
+ offer(new ProviderRetrying({ session, message, retries: ProviderRetries.make(retries) }));
158
188
  return;
159
189
  }
160
190
  if (event.type === "auto_retry_end") {
161
- log(Effect.logInfo("Pi session finished retrying", {
191
+ if (event.success && retrying) {
192
+ retrying = false;
193
+ log(Effect.logInfo("Pi session reached its provider again", {
194
+ retries,
195
+ sessionId: session.id,
196
+ }));
197
+ offer(new ProviderRecovered({ session, retries: ProviderRetries.make(retries) }));
198
+ return;
199
+ }
200
+ log(Effect.logInfo("Pi session stopped retrying its provider", {
162
201
  attempt: event.attempt,
163
202
  finalError: event.finalError,
164
203
  sessionId: session.id,
@@ -166,6 +205,11 @@ export const subscribePiSession = (piSession, session, channel) => Effect.gen(fu
166
205
  }));
167
206
  return;
168
207
  }
208
+ if (event.type === "agent_settled") {
209
+ retries = 0;
210
+ retrying = false;
211
+ return;
212
+ }
169
213
  if (event.type === "compaction_start" || event.type === "compaction_end") {
170
214
  log(Effect.logInfo("Pi session context compaction", {
171
215
  phase: event.type,
@@ -179,12 +223,7 @@ export const subscribePiSession = (piSession, session, channel) => Effect.gen(fu
179
223
  return;
180
224
  if (sessionEvent._tag === "TextOutput")
181
225
  lastText = sessionEvent.text;
182
- if (!Queue.offerUnsafe(channel.events, sessionEvent)) {
183
- log(Effect.logWarning("Dropped a Pi session event after the terminal transition", {
184
- event: sessionEvent._tag,
185
- sessionId: session.id,
186
- }));
187
- }
226
+ offer(sessionEvent);
188
227
  });
189
228
  channel.onTerminal(unsubscribe);
190
229
  return { lastText: () => lastText, unsubscribe };
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { AgentSession } from "@usine/core/agent/session";
1
+ import { ChildSession } from "@usine/core/agent/session";
2
2
  import { Effect } from "effect";
3
3
  import { type AgentSessionError } from "../runtime.ts";
4
4
  import type { PiSession } from "./sdk.ts";
5
5
  import { type SessionChannel } from "./session.ts";
6
- /** Gates Pi tools and provider requests without aborting a parent's still-live children. */
6
+ /** Creates a gate that blocks Pi tool calls and provider requests at their next boundary while an operator pause is active. */
7
7
  export declare const piPauseGate: Effect.Effect<{
8
8
  set: (next: Effect.Effect<void>) => void;
9
9
  extension: {
@@ -11,9 +11,9 @@ export declare const piPauseGate: Effect.Effect<{
11
11
  factory: (pi: import("@earendil-works/pi-coding-agent").ExtensionAPI) => void;
12
12
  };
13
13
  }, never, import("effect/Scope").Scope>;
14
- /** Runs successive Pi turns in one SDK session while the conversation owns completion. */
14
+ /** Runs successive Pi turns in one SDK session; the conversation decides when the session completes. */
15
15
  export declare const piTurns: (options: {
16
- readonly session: AgentSession;
16
+ readonly session: ChildSession;
17
17
  readonly sdk: PiSession;
18
18
  readonly channel: SessionChannel;
19
19
  readonly prompt: string;
@@ -21,8 +21,8 @@ export declare const piTurns: (options: {
21
21
  readonly error: (operation: "stream" | "steer" | "interrupt", cause: unknown) => AgentSessionError;
22
22
  readonly gate: Effect.Success<typeof piPauseGate>;
23
23
  }) => Effect.Effect<{
24
- intervene: (action: import("@usine/core/attempt/channel").Interrupt | import("@usine/core/attempt/channel").OperatorMessage | import("@usine/core/attempt/channel").Release | import("@usine/core/attempt/channel").Steer) => Effect.Effect<import("@usine/core/attempt/channel").InterventionState, import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
25
- steer: (message: string) => Effect.Effect<void, import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
26
- interrupt: Effect.Effect<void, import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
24
+ intervene: (action: import("@usine/core/attempt/channel").Interrupt | import("@usine/core/attempt/channel").OperatorMessage | import("@usine/core/attempt/channel").Release | import("@usine/core/attempt/channel").Steer, onDelivery: import("../runtime.ts").OnDelivery) => Effect.Effect<import("@usine/core/attempt/channel").InterventionState, import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
25
+ steer: (message: string) => Effect.Effect<void, import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
26
+ interrupt: Effect.Effect<void, import("../runtime.ts").AgentBlockedError | import("../runtime.ts").AgentQuestionError | import("../runtime.ts").AgentResultError | import("../runtime.ts").ChildSessionBudgetExceededError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError, never>;
27
27
  }, never, import("effect/Scope").Scope>;
28
28
  //# sourceMappingURL=turns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"turns.d.ts","sourceRoot":"","sources":["../../src/pi/turns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAS,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,eAAe,CAAC;AAE5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAEtE,4FAA4F;AAC5F,eAAO,MAAM,WAAW;gBASR,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;uCAWjC,CAAC;AAEH,0FAA0F;AAC1F,eAAO,MAAM,OAAO;sBACA,YAAY;kBAChB,SAAS;sBACL,cAAc;qBACf,MAAM;uBACJ,MAAM,MAAM,GAAG,SAAS;oBAC3B,CACd,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,EAC3C,KAAK,EAAE,OAAO,KACX,iBAAiB;mBACP,MAAM,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC;;;qBAiBzB,MAAM;;uCAsB9B,CAAC"}
1
+ {"version":3,"file":"turns.d.ts","sourceRoot":"","sources":["../../src/pi/turns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAiB,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,eAAe,CAAC;AAE5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAwC,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAEzF,+HAA+H;AAC/H,eAAO,MAAM,WAAW;gBASR,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;uCAWjC,CAAC;AAEH,wGAAwG;AACxG,eAAO,MAAM,OAAO;sBACA,YAAY;kBAChB,SAAS;sBACL,cAAc;qBACf,MAAM;uBACJ,MAAM,MAAM,GAAG,SAAS;oBAC3B,CACd,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,EAC3C,KAAK,EAAE,OAAO,KACX,iBAAiB;mBACP,MAAM,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC;;;qBAgD9B,MAAM;;uCAMzB,CAAC"}
package/dist/pi/turns.js CHANGED
@@ -1,9 +1,9 @@
1
- import { AgentSession } from "@usine/core/agent/session";
2
- import { Effect, Fiber } from "effect";
1
+ import { ChildSession } from "@usine/core/agent/session";
2
+ import { Effect, Fiber, Option } from "effect";
3
3
  import {} from "../runtime.js";
4
4
  import { sessionConversation } from "./conversation.js";
5
- import { lastPiMessageText } from "./session.js";
6
- /** Gates Pi tools and provider requests without aborting a parent's still-live children. */
5
+ import { lastPiMessageText, piUserMessageText } from "./session.js";
6
+ /** Creates a gate that blocks Pi tool calls and provider requests at their next boundary while an operator pause is active. */
7
7
  export const piPauseGate = Effect.gen(function* () {
8
8
  const context = yield* Effect.context();
9
9
  const scope = yield* Effect.scope;
@@ -22,29 +22,42 @@ export const piPauseGate = Effect.gen(function* () {
22
22
  },
23
23
  };
24
24
  });
25
- /** Runs successive Pi turns in one SDK session while the conversation owns completion. */
25
+ /** Runs successive Pi turns in one SDK session; the conversation decides when the session completes. */
26
26
  export const piTurns = Effect.fn("PiTurns.start")(function* (options) {
27
27
  const scope = yield* Effect.scope;
28
+ const context = yield* Effect.context();
28
29
  const startTurn = (message) => Effect.tryPromise({
29
30
  try: () => options.sdk.prompt(message),
30
31
  catch: (cause) => options.error("stream", cause),
31
32
  }).pipe(Effect.flatMap(() => conversation.finish(options.lastText() ?? lastPiMessageText(options.sdk.messages) ?? "Pi session completed")), Effect.catch(options.channel.fail), Effect.forkIn(scope), Effect.asVoid);
32
- const steer = (message) => Effect.tryPromise({
33
+ // Pi delivers a steering message after the running tool calls return, before its next model request.
34
+ const queueSteer = (message) => Effect.tryPromise({
33
35
  try: () => options.sdk.steer(message),
34
36
  catch: (cause) => options.error("steer", cause),
35
- });
37
+ }).pipe(Effect.map((disposition) => (disposition === "handled" ? "read" : "queued")));
36
38
  const conversation = yield* sessionConversation({
37
39
  session: options.session,
38
40
  channel: options.channel,
39
- send: (message, activity) => (activity === "idle" ? startTurn(message) : steer(message)),
41
+ send: (message, activity) => activity === "idle"
42
+ ? startTurn(message).pipe(Effect.as("read"))
43
+ : queueSteer(message),
40
44
  pause: Effect.void,
41
45
  beforeFinish: Effect.void,
42
46
  });
47
+ // Pi removes a steering message from its queue when the message starts in the conversation.
48
+ const unsubscribe = options.sdk.subscribe((event) => {
49
+ if (event.type !== "message_start")
50
+ return;
51
+ const text = piUserMessageText(event.message);
52
+ if (Option.isSome(text))
53
+ Effect.runForkWith(context)(conversation.read((queued) => queued.indexOf(text.value) + 1));
54
+ });
55
+ yield* Effect.addFinalizer(() => Effect.sync(unsubscribe));
43
56
  options.gate.set(conversation.awaitUnpaused);
44
57
  yield* startTurn(options.prompt);
45
58
  return {
46
59
  intervene: conversation.intervene,
47
- steer,
60
+ steer: (message) => queueSteer(message).pipe(Effect.asVoid),
48
61
  interrupt: Effect.tryPromise({
49
62
  try: () => options.sdk.abort(),
50
63
  catch: (cause) => options.error("interrupt", cause),
@@ -1 +1 @@
1
- {"version":3,"file":"turns.js","sourceRoot":"","sources":["../../src/pi/turns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"turns.js","sourceRoot":"","sources":["../../src/pi/turns.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,39 @@
1
- import { TokenCount } from "@usine/core/agent/session";
1
+ import { TokenCount, UsdAmount } from "@usine/core/agent/session";
2
2
  import { Option, Schema } from "effect";
3
- /** Pi assistant usage is per completed message, including cache tokens. */
4
- export declare const piMessageTokens: (input: unknown, options?: import("effect/SchemaAST").ParseOptions) => Option.Option<{
5
- readonly role: "assistant";
6
- readonly usage: {
7
- readonly totalTokens: number;
8
- };
9
- }>;
10
- /** Tracks Claude's live message usage and reconciles its cumulative query meter at each result.
11
- * Repeated blocks with the same message id count only their additional tokens.
12
- * The SDK's result.usage is per-turn and excludes auxiliary work; modelUsage
13
- * includes that work and stays cumulative across streaming-input turns.
3
+ /** A session's token count and, if the harness reports one, its cost in dollars. */
4
+ export interface SessionUsage {
5
+ readonly totalTokens: TokenCount;
6
+ readonly costUsd: Option.Option<UsdAmount>;
7
+ }
8
+ /**
9
+ * Returns the usage of one completed Pi assistant message: output plus uncached input, where cache
10
+ * writes count and cache reads do not, and the dollar cost if Pi reports one.
11
+ */
12
+ export declare const piMessageUsage: (input: unknown, options?: import("effect/SchemaAST").ParseOptions | undefined) => Option.Option<SessionUsage>;
13
+ /** Adds a message's usage to a session total; the cost is `Some` once any message has a cost. */
14
+ export declare const addUsage: (total: SessionUsage, message: SessionUsage) => SessionUsage;
15
+ /**
16
+ * Returns a Claude token meter: live message usage between results, reconciled with the cumulative
17
+ * `modelUsage` at each result. Consumption is output plus input plus cache creation, because the
18
+ * SDK's input counts exclude cache reads and writes; repeated blocks with one message ID count only
19
+ * their added tokens. The cost is the SDK's `costUSD` estimate and changes only at a result.
14
20
  */
15
- export declare const claudeTokenMeter: () => (message: Schema.Json) => Option.Option<TokenCount>;
16
- /** Codex's thread meter is cumulative across turns on the same thread. */
21
+ export declare const claudeTokenMeter: () => (message: Schema.Json) => Option.Option<SessionUsage>;
22
+ /** The Codex thread token usage, cumulative across turns; `inputTokens` includes cached input. */
17
23
  export declare const CodexTokenUsage: Schema.Struct<{
18
24
  readonly threadId: Schema.NonEmptyString;
19
25
  readonly tokenUsage: Schema.Struct<{
20
26
  readonly total: Schema.Struct<{
21
- readonly totalTokens: Schema.brand<Schema.Int, "TokenCount">;
27
+ readonly inputTokens: Schema.Int;
28
+ readonly cachedInputTokens: Schema.Int;
29
+ readonly outputTokens: Schema.Int;
22
30
  }>;
23
31
  }>;
24
32
  }>;
33
+ export type CodexTokenUsage = typeof CodexTokenUsage.Type;
34
+ /**
35
+ * Returns a Codex thread's consumption: output plus uncached input. The thread's `totalTokens` counts
36
+ * the whole context on every turn, so it is not used.
37
+ */
38
+ export declare const codexThreadTokens: (total: CodexTokenUsage["tokenUsage"]["total"]) => TokenCount;
25
39
  //# sourceMappingURL=usage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/pi/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAQxC,2EAA2E;AAC3E,eAAO,MAAM,eAAe;;;;;EAAsC,CAAC;AA2BnE;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,kBAGV,MAAM,CAAC,IAAI,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CA4BxD,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,eAAe;;;;;;;EAG1B,CAAC"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/pi/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAQ,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAc9C,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;CAC5C;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,gHAM1B,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,QAAQ,UAAW,YAAY,WAAW,YAAY,KAAG,YAKpE,CAAC;AA0BH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,kBAIV,MAAM,CAAC,IAAI,KAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAwB1D,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,eAAe;;;;;;;;;EAK1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,UAAW,eAAe,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAG,UACc,CAAC"}
package/dist/pi/usage.js CHANGED
@@ -1,12 +1,31 @@
1
- import { TokenCount } from "@usine/core/agent/session";
2
- import { Option, Schema } from "effect";
1
+ import { TokenCount, UsdAmount } from "@usine/core/agent/session";
2
+ import { flow, Option, Schema } from "effect";
3
3
  const Count = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
4
+ const Dollars = Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0));
4
5
  const PiUsage = Schema.Struct({
5
6
  role: Schema.Literal("assistant"),
6
- usage: Schema.Struct({ totalTokens: Count }),
7
+ usage: Schema.Struct({
8
+ input: Count,
9
+ output: Count,
10
+ cacheWrite: Count,
11
+ cost: Schema.optionalKey(Schema.Struct({ total: Dollars })),
12
+ }),
13
+ });
14
+ /**
15
+ * Returns the usage of one completed Pi assistant message: output plus uncached input, where cache
16
+ * writes count and cache reads do not, and the dollar cost if Pi reports one.
17
+ */
18
+ export const piMessageUsage = flow(Schema.decodeUnknownOption(PiUsage), Option.map(({ usage }) => ({
19
+ totalTokens: TokenCount.make(usage.output + usage.input + usage.cacheWrite),
20
+ costUsd: Option.map(Option.fromNullishOr(usage.cost), ({ total }) => UsdAmount.make(total)),
21
+ })));
22
+ /** Adds a message's usage to a session total; the cost is `Some` once any message has a cost. */
23
+ export const addUsage = (total, message) => ({
24
+ totalTokens: TokenCount.make(total.totalTokens + message.totalTokens),
25
+ costUsd: Option.isNone(message.costUsd)
26
+ ? total.costUsd
27
+ : Option.some(UsdAmount.make(Option.getOrElse(total.costUsd, () => 0) + message.costUsd.value)),
7
28
  });
8
- /** Pi assistant usage is per completed message, including cache tokens. */
9
- export const piMessageTokens = Schema.decodeUnknownOption(PiUsage);
10
29
  const ClaudeAssistantUsage = Schema.Struct({
11
30
  type: Schema.Literal("assistant"),
12
31
  message: Schema.Struct({
@@ -14,7 +33,6 @@ const ClaudeAssistantUsage = Schema.Struct({
14
33
  usage: Schema.Struct({
15
34
  input_tokens: Count,
16
35
  output_tokens: Count,
17
- cache_read_input_tokens: Schema.optionalKey(Schema.NullOr(Count)),
18
36
  cache_creation_input_tokens: Schema.optionalKey(Schema.NullOr(Count)),
19
37
  }),
20
38
  }),
@@ -22,8 +40,8 @@ const ClaudeAssistantUsage = Schema.Struct({
22
40
  const ClaudeModelUsage = Schema.Struct({
23
41
  inputTokens: Count,
24
42
  outputTokens: Count,
25
- cacheReadInputTokens: Count,
26
43
  cacheCreationInputTokens: Count,
44
+ costUSD: Schema.optionalKey(Dollars),
27
45
  });
28
46
  const ClaudeResultUsage = Schema.Struct({
29
47
  type: Schema.Literal("result"),
@@ -31,42 +49,48 @@ const ClaudeResultUsage = Schema.Struct({
31
49
  });
32
50
  const decodeAssistant = Schema.decodeUnknownOption(ClaudeAssistantUsage);
33
51
  const decodeResult = Schema.decodeUnknownOption(ClaudeResultUsage);
34
- /** Tracks Claude's live message usage and reconciles its cumulative query meter at each result.
35
- * Repeated blocks with the same message id count only their additional tokens.
36
- * The SDK's result.usage is per-turn and excludes auxiliary work; modelUsage
37
- * includes that work and stays cumulative across streaming-input turns.
52
+ /**
53
+ * Returns a Claude token meter: live message usage between results, reconciled with the cumulative
54
+ * `modelUsage` at each result. Consumption is output plus input plus cache creation, because the
55
+ * SDK's input counts exclude cache reads and writes; repeated blocks with one message ID count only
56
+ * their added tokens. The cost is the SDK's `costUSD` estimate and changes only at a result.
38
57
  */
39
58
  export const claudeTokenMeter = () => {
40
59
  let total = 0;
60
+ let cost = Option.none();
41
61
  const messages = new Map();
42
62
  return (message) => {
43
63
  const assistant = decodeAssistant(message);
44
64
  if (Option.isSome(assistant)) {
45
65
  const { id, usage } = assistant.value.message;
46
- const consumed = usage.input_tokens +
47
- usage.output_tokens +
48
- (usage.cache_read_input_tokens ?? 0) +
49
- (usage.cache_creation_input_tokens ?? 0);
66
+ const consumed = usage.output_tokens + usage.input_tokens + (usage.cache_creation_input_tokens ?? 0);
50
67
  const previous = messages.get(id) ?? 0;
51
68
  total += Math.max(0, consumed - previous);
52
69
  messages.set(id, Math.max(previous, consumed));
53
- return Option.some(TokenCount.make(total));
70
+ return Option.some({ totalTokens: TokenCount.make(total), costUsd: cost });
54
71
  }
55
72
  const result = decodeResult(message);
56
73
  if (Option.isNone(result))
57
74
  return Option.none();
58
- const consumed = Object.values(result.value.modelUsage).reduce((sum, usage) => sum +
59
- usage.inputTokens +
60
- usage.outputTokens +
61
- usage.cacheReadInputTokens +
62
- usage.cacheCreationInputTokens, 0);
75
+ const models = Object.values(result.value.modelUsage);
76
+ const consumed = models.reduce((sum, usage) => sum + usage.outputTokens + usage.inputTokens + usage.cacheCreationInputTokens, 0);
63
77
  total = Math.max(total, consumed);
64
- return Option.some(TokenCount.make(total));
78
+ const priced = models.flatMap(({ costUSD }) => (costUSD === undefined ? [] : [costUSD]));
79
+ if (priced.length > 0)
80
+ cost = Option.some(UsdAmount.make(priced.reduce((sum, value) => sum + value, 0)));
81
+ return Option.some({ totalTokens: TokenCount.make(total), costUsd: cost });
65
82
  };
66
83
  };
67
- /** Codex's thread meter is cumulative across turns on the same thread. */
84
+ /** The Codex thread token usage, cumulative across turns; `inputTokens` includes cached input. */
68
85
  export const CodexTokenUsage = Schema.Struct({
69
86
  threadId: Schema.NonEmptyString,
70
- tokenUsage: Schema.Struct({ total: Schema.Struct({ totalTokens: TokenCount }) }),
87
+ tokenUsage: Schema.Struct({
88
+ total: Schema.Struct({ inputTokens: Count, cachedInputTokens: Count, outputTokens: Count }),
89
+ }),
71
90
  });
91
+ /**
92
+ * Returns a Codex thread's consumption: output plus uncached input. The thread's `totalTokens` counts
93
+ * the whole context on every turn, so it is not used.
94
+ */
95
+ export const codexThreadTokens = (total) => TokenCount.make(total.outputTokens + Math.max(0, total.inputTokens - total.cachedInputTokens));
72
96
  //# sourceMappingURL=usage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/pi/usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/pi/usage.ts"],"names":[],"mappings":"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"}