@usine/agents 0.1.0 → 0.3.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.
- package/README.md +35 -6
- package/dist/pi/authentication.d.ts +4 -4
- package/dist/pi/authentication.d.ts.map +1 -1
- package/dist/pi/authentication.js +2 -2
- package/dist/pi/authentication.js.map +1 -1
- package/dist/pi/children.d.ts +4 -1
- package/dist/pi/children.d.ts.map +1 -1
- package/dist/pi/children.js +4 -1
- package/dist/pi/children.js.map +1 -1
- package/dist/pi/claude.d.ts +6 -2
- package/dist/pi/claude.d.ts.map +1 -1
- package/dist/pi/claude.js +80 -15
- package/dist/pi/claude.js.map +1 -1
- package/dist/pi/codex/account.d.ts +11 -0
- package/dist/pi/codex/account.d.ts.map +1 -0
- package/dist/pi/codex/account.js +43 -0
- package/dist/pi/codex/account.js.map +1 -0
- package/dist/pi/codex/app-server.d.ts +15 -6
- package/dist/pi/codex/app-server.d.ts.map +1 -1
- package/dist/pi/codex/app-server.js +61 -22
- package/dist/pi/codex/app-server.js.map +1 -1
- package/dist/pi/codex/codec.d.ts +96 -0
- package/dist/pi/codex/codec.d.ts.map +1 -0
- package/dist/pi/codex/codec.js +110 -0
- package/dist/pi/codex/codec.js.map +1 -0
- package/dist/pi/codex/codex.d.ts +2 -0
- package/dist/pi/codex/codex.d.ts.map +1 -1
- package/dist/pi/codex/codex.js +143 -148
- package/dist/pi/codex/codex.js.map +1 -1
- package/dist/pi/conversation.d.ts +26 -0
- package/dist/pi/conversation.d.ts.map +1 -0
- package/dist/pi/conversation.js +93 -0
- package/dist/pi/conversation.js.map +1 -0
- package/dist/pi/live.d.ts +4 -0
- package/dist/pi/live.d.ts.map +1 -0
- package/dist/pi/{index.js → live.js} +2 -9
- package/dist/pi/live.js.map +1 -0
- package/dist/pi/pi.d.ts +3 -1
- package/dist/pi/pi.d.ts.map +1 -1
- package/dist/pi/pi.js +90 -64
- package/dist/pi/pi.js.map +1 -1
- package/dist/pi/sdk.d.ts +18 -13
- package/dist/pi/sdk.d.ts.map +1 -1
- package/dist/pi/sdk.js +15 -10
- package/dist/pi/sdk.js.map +1 -1
- package/dist/pi/session.d.ts +20 -21
- package/dist/pi/session.d.ts.map +1 -1
- package/dist/pi/session.js +23 -11
- package/dist/pi/session.js.map +1 -1
- package/dist/pi/subagents.d.ts +17 -11
- package/dist/pi/subagents.d.ts.map +1 -1
- package/dist/pi/subagents.js +81 -44
- package/dist/pi/subagents.js.map +1 -1
- package/dist/pi/thinking.d.ts +8 -0
- package/dist/pi/thinking.d.ts.map +1 -0
- package/dist/pi/thinking.js +15 -0
- package/dist/pi/thinking.js.map +1 -0
- package/dist/pi/turns.d.ts +28 -0
- package/dist/pi/turns.d.ts.map +1 -0
- package/dist/pi/turns.js +54 -0
- package/dist/pi/turns.js.map +1 -0
- package/dist/pi/usage.d.ts +25 -0
- package/dist/pi/usage.d.ts.map +1 -0
- package/dist/pi/usage.js +72 -0
- package/dist/pi/usage.js.map +1 -0
- package/dist/preflight/command.d.ts +7 -0
- package/dist/preflight/command.d.ts.map +1 -0
- package/dist/preflight/command.js +42 -0
- package/dist/preflight/command.js.map +1 -0
- package/dist/preflight/preflight.d.ts +13 -0
- package/dist/preflight/preflight.d.ts.map +1 -0
- package/dist/preflight/preflight.js +100 -0
- package/dist/preflight/preflight.js.map +1 -0
- package/dist/prompt.d.ts +15 -11
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +14 -11
- package/dist/prompt.js.map +1 -1
- package/dist/protocol/codex.d.ts +20 -6
- package/dist/protocol/codex.d.ts.map +1 -1
- package/dist/protocol/codex.js +7 -1
- package/dist/protocol/codex.js.map +1 -1
- package/dist/runtime.d.ts +59 -25
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +47 -34
- package/dist/runtime.js.map +1 -1
- package/package.json +34 -10
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +0 -1
- package/dist/pi/index.d.ts +0 -11
- package/dist/pi/index.d.ts.map +0 -1
- package/dist/pi/index.js.map +0 -1
package/dist/pi/session.d.ts
CHANGED
|
@@ -1,45 +1,44 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AgentSession, AgentSessionEvent, AgentSessionId, SessionFinished, SessionTokensUpdated, TextOutput, ToolFinished, ToolStarted } from "@usine/core/agent/session";
|
|
2
2
|
import { Cause, Deferred, Effect, 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
|
-
/**
|
|
6
|
+
/** Adapter name printed in the terminal log lines. */
|
|
7
7
|
readonly label: string;
|
|
8
|
-
readonly sessionId:
|
|
8
|
+
readonly sessionId: AgentSessionId;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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.
|
|
14
14
|
*/
|
|
15
15
|
export interface SessionChannel {
|
|
16
|
-
readonly events: Queue.Queue<
|
|
16
|
+
readonly events: Queue.Queue<AgentSessionEvent, AgentSessionError | Cause.Done>;
|
|
17
17
|
readonly result: Deferred.Deferred<SessionResult, AgentSessionError>;
|
|
18
18
|
readonly isTerminal: Effect.Effect<boolean>;
|
|
19
19
|
readonly onTerminal: (cleanup: () => void) => void;
|
|
20
|
-
/**
|
|
21
|
-
readonly emit: (event:
|
|
20
|
+
/** Queues one event; after the terminal transition the event is logged and dropped. */
|
|
21
|
+
readonly emit: (event: AgentSessionEvent) => Effect.Effect<void>;
|
|
22
22
|
readonly fail: (error: AgentSessionError) => Effect.Effect<void>;
|
|
23
|
-
readonly finish: (session:
|
|
23
|
+
readonly finish: (session: AgentSession, message: string) => Effect.Effect<void>;
|
|
24
24
|
}
|
|
25
25
|
export declare const sessionChannel: (options: SessionChannelOptions) => Effect.Effect<{
|
|
26
|
-
events: Queue.Queue<
|
|
27
|
-
result: Deferred.Deferred<SessionResult, import("../runtime.ts").AgentResultError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError>;
|
|
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>;
|
|
28
28
|
isTerminal: Effect.Effect<boolean, never, never>;
|
|
29
29
|
onTerminal: (cleanup: () => void) => void;
|
|
30
|
-
emit: (event:
|
|
31
|
-
fail: (error: import("../runtime.ts").AgentResultError | import("../runtime.ts").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError) => Effect.Effect<void, never, never>;
|
|
32
|
-
finish: (session:
|
|
30
|
+
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>;
|
|
32
|
+
finish: (session: import("@usine/core/agent/session").ChildSession | import("@usine/core/agent/session").ParentSession, message: string) => Effect.Effect<void, never, never>;
|
|
33
33
|
}, never, never>;
|
|
34
34
|
export declare const lastPiMessageText: (messages: ReadonlyArray<PiMessage>) => string | undefined;
|
|
35
35
|
/**
|
|
36
|
-
*
|
|
37
|
-
* Normalized events reach the queue on the SDK's own tick
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* launch fiber's captured services so a silent wait stays explainable.
|
|
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.
|
|
41
40
|
*/
|
|
42
|
-
export declare const subscribePiSession: (piSession: PiSession, session:
|
|
41
|
+
export declare const subscribePiSession: (piSession: PiSession, session: AgentSession, channel: SessionChannel) => Effect.Effect<{
|
|
43
42
|
lastText: () => string | undefined;
|
|
44
43
|
unsubscribe: () => void;
|
|
45
44
|
}, never, never>;
|
package/dist/pi/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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"}
|
package/dist/pi/session.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Cause, Deferred, Effect, Queue, Ref, Schema } from "effect";
|
|
1
|
+
import { AgentSession, AgentSessionEvent, AgentSessionId, SessionFinished, SessionTokensUpdated, TokenCount, TextOutput, ToolFinished, ToolStarted, } from "@usine/core/agent/session";
|
|
2
|
+
import { Cause, Deferred, Effect, Option, Queue, Ref, Schema } from "effect";
|
|
3
|
+
import { piMessageTokens } from "./usage.js";
|
|
3
4
|
import { SessionResult } from "../runtime.js";
|
|
4
5
|
export const sessionChannel = Effect.fn("SessionChannel.make")(function* (options) {
|
|
5
6
|
const events = yield* Queue.make();
|
|
@@ -31,7 +32,7 @@ export const sessionChannel = Effect.fn("SessionChannel.make")(function* (option
|
|
|
31
32
|
const finish = Effect.fn("SessionChannel.finish")(function* (session, message) {
|
|
32
33
|
if (yield* Ref.getAndSet(terminal, true))
|
|
33
34
|
return;
|
|
34
|
-
yield* Queue.offer(events, new
|
|
35
|
+
yield* Queue.offer(events, new SessionFinished({ session }));
|
|
35
36
|
yield* Deferred.succeed(result, new SessionResult({ message }));
|
|
36
37
|
yield* Queue.end(events);
|
|
37
38
|
yield* runCleanups;
|
|
@@ -102,10 +103,10 @@ export const lastPiMessageText = (messages) => {
|
|
|
102
103
|
const sessionEventFrom = (event, session) => {
|
|
103
104
|
if (event.type === "message_end") {
|
|
104
105
|
const text = messageText(event.message);
|
|
105
|
-
return text === undefined ? undefined : new
|
|
106
|
+
return text === undefined ? undefined : new TextOutput({ session, text });
|
|
106
107
|
}
|
|
107
108
|
if (event.type === "tool_execution_start") {
|
|
108
|
-
return new
|
|
109
|
+
return new ToolStarted({
|
|
109
110
|
session,
|
|
110
111
|
callId: event.toolCallId,
|
|
111
112
|
tool: event.toolName,
|
|
@@ -113,7 +114,7 @@ const sessionEventFrom = (event, session) => {
|
|
|
113
114
|
});
|
|
114
115
|
}
|
|
115
116
|
if (event.type === "tool_execution_end") {
|
|
116
|
-
return new
|
|
117
|
+
return new ToolFinished({
|
|
117
118
|
session,
|
|
118
119
|
callId: event.toolCallId,
|
|
119
120
|
tool: event.toolName,
|
|
@@ -124,17 +125,28 @@ const sessionEventFrom = (event, session) => {
|
|
|
124
125
|
return undefined;
|
|
125
126
|
};
|
|
126
127
|
/**
|
|
127
|
-
*
|
|
128
|
-
* Normalized events reach the queue on the SDK's own tick
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
* launch fiber's captured services so a silent wait stays explainable.
|
|
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.
|
|
132
132
|
*/
|
|
133
133
|
export const subscribePiSession = (piSession, session, channel) => Effect.gen(function* () {
|
|
134
134
|
const context = yield* Effect.context();
|
|
135
135
|
const log = Effect.runForkWith(context);
|
|
136
136
|
let lastText;
|
|
137
|
+
let totalTokens = 0;
|
|
137
138
|
const unsubscribe = piSession.subscribe((event) => {
|
|
139
|
+
if (event.type === "message_end") {
|
|
140
|
+
const usage = piMessageTokens(event.message);
|
|
141
|
+
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
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
138
150
|
if (event.type === "auto_retry_start") {
|
|
139
151
|
log(Effect.logWarning("Pi session is backing off before a retry", {
|
|
140
152
|
attempt: event.attempt,
|
package/dist/pi/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"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"}
|
package/dist/pi/subagents.d.ts
CHANGED
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
import { type ExtensionFactory, type InlineExtension } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { Agent } from "@usine/core";
|
|
2
|
+
import { Agent } from "@usine/core/agent";
|
|
3
|
+
import { AgentSessionEvent, AgentSessionId, ChildSessionBudget } from "@usine/core/agent/session";
|
|
3
4
|
import { Effect } from "effect";
|
|
4
|
-
import { type AgentSessionError, type ChildBackend, type WorkingDirectory } from "../runtime.ts";
|
|
5
|
+
import { type AgentSessionError, type ChildBackend, ChildSessionBudgetExceededError, type ChildSessions, type WorkingDirectory } from "../runtime.ts";
|
|
5
6
|
export interface SubagentsExtensionOptions {
|
|
6
|
-
readonly agent: Agent
|
|
7
|
+
readonly agent: Agent;
|
|
7
8
|
readonly backend: ChildBackend["Service"];
|
|
8
9
|
readonly cwd: WorkingDirectory;
|
|
9
|
-
readonly emit: (event:
|
|
10
|
-
readonly
|
|
10
|
+
readonly emit: (event: AgentSessionEvent) => Effect.Effect<void>;
|
|
11
|
+
readonly maxChildren: ChildSessionBudget;
|
|
12
|
+
/** Called on every rejected spawn; the parent decides what a repeat means. */
|
|
13
|
+
readonly onBudgetExceeded: (error: ChildSessionBudgetExceededError) => Effect.Effect<void>;
|
|
14
|
+
readonly parentId: AgentSessionId;
|
|
15
|
+
/** Records a launched child so the run host can address operator input to it by id. */
|
|
16
|
+
readonly register: ChildSessions["register"];
|
|
11
17
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
18
|
+
* Runs one child program on the parent launch's services and scope. Pi
|
|
19
|
+
* calls the tool outside any usine fiber, so the default runtime would lose
|
|
20
|
+
* the stderr log redirect (corrupting the protocol stdout) and detach the
|
|
21
|
+
* child from the Attempt's lifetime.
|
|
16
22
|
*/
|
|
17
23
|
readonly run: <A>(program: Effect.Effect<A, AgentSessionError>) => Promise<A>;
|
|
18
24
|
}
|
|
19
|
-
/**
|
|
25
|
+
/** Builds the subagents extension; its single tool creates first-level child sessions only. */
|
|
20
26
|
export declare const createSubagentsExtension: (options: SubagentsExtensionOptions) => ExtensionFactory;
|
|
21
|
-
/**
|
|
27
|
+
/** Names the extension so Pi startup diagnostics can identify it. */
|
|
22
28
|
export declare const subagentsExtension: (options: SubagentsExtensionOptions) => InlineExtension;
|
|
23
29
|
//# sourceMappingURL=subagents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagents.d.ts","sourceRoot":"","sources":["../../src/pi/subagents.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"subagents.d.ts","sourceRoot":"","sources":["../../src/pi/subagents.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,cAAc,EAEd,kBAAkB,EAGnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,MAAM,EAAuB,MAAM,QAAQ,CAAC;AAGrD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAEjB,+BAA+B,EAC/B,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjE,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,8EAA8E;IAC9E,QAAQ,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,+BAA+B,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3F,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,iBAAiB,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/E;AA8BD,+FAA+F;AAC/F,eAAO,MAAM,wBAAwB,YAAa,yBAAyB,KAAG,gBA2G7E,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,YAAa,yBAAyB,KAAG,eAGtE,CAAC"}
|
package/dist/pi/subagents.js
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import { defineTool, } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { Agent } from "@usine/core";
|
|
3
|
-
import {
|
|
2
|
+
import { Agent } from "@usine/core/agent";
|
|
3
|
+
import { AgentSessionEvent, AgentSessionId, ChildSession, ChildSessionBudget, ChildSessionCount, SessionFinished, } from "@usine/core/agent/session";
|
|
4
|
+
import { Effect, Exit, Fiber, Stream } from "effect";
|
|
4
5
|
import { Type } from "typebox";
|
|
5
6
|
import { assembleChildPrompt } from "../prompt.js";
|
|
6
|
-
import { ChildRequest, } from "../runtime.js";
|
|
7
|
+
import { ChildRequest, ChildSessionBudgetExceededError, } from "../runtime.js";
|
|
8
|
+
const TASK_EXCERPT_CHARACTERS = 160;
|
|
9
|
+
const taskExcerpt = (task) => {
|
|
10
|
+
const collapsed = task.replace(/\s+/gu, " ").trim();
|
|
11
|
+
return collapsed.length > TASK_EXCERPT_CHARACTERS
|
|
12
|
+
? `${collapsed.slice(0, TASK_EXCERPT_CHARACTERS)}…`
|
|
13
|
+
: collapsed;
|
|
14
|
+
};
|
|
7
15
|
const interrupted = (signal, sessionId) => signal === undefined
|
|
8
16
|
? Effect.logWarning("Pi supplied no abort signal; the child outlives only its scope", {
|
|
9
17
|
sessionId,
|
|
@@ -16,9 +24,76 @@ const interrupted = (signal, sessionId) => signal === undefined
|
|
|
16
24
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
17
25
|
return Effect.sync(() => signal.removeEventListener("abort", onAbort));
|
|
18
26
|
});
|
|
19
|
-
/**
|
|
27
|
+
/** Builds the subagents extension; its single tool creates first-level child sessions only. */
|
|
20
28
|
export const createSubagentsExtension = (options) => {
|
|
21
29
|
let childNumber = 0;
|
|
30
|
+
const spawn = Effect.fn("Subagents.spawn")(function* (attemptedChildren, task, signal, onUpdate) {
|
|
31
|
+
const excerpt = taskExcerpt(task);
|
|
32
|
+
yield* Effect.annotateCurrentSpan({
|
|
33
|
+
attemptedChildren,
|
|
34
|
+
maxChildren: options.maxChildren,
|
|
35
|
+
parentSessionId: options.parentId,
|
|
36
|
+
});
|
|
37
|
+
if (attemptedChildren > options.maxChildren) {
|
|
38
|
+
const error = new ChildSessionBudgetExceededError({
|
|
39
|
+
attemptedChildren,
|
|
40
|
+
maxChildren: options.maxChildren,
|
|
41
|
+
message: `Attempt tried to spawn child ${attemptedChildren} after reaching its ${options.maxChildren}-child budget`,
|
|
42
|
+
});
|
|
43
|
+
yield* Effect.logWarning("Child session budget exceeded", {
|
|
44
|
+
attemptedChildren,
|
|
45
|
+
maxChildren: options.maxChildren,
|
|
46
|
+
parentSessionId: options.parentId,
|
|
47
|
+
taskExcerpt: excerpt,
|
|
48
|
+
});
|
|
49
|
+
yield* options.onBudgetExceeded(error);
|
|
50
|
+
return yield* error;
|
|
51
|
+
}
|
|
52
|
+
const session = new ChildSession({
|
|
53
|
+
id: AgentSessionId.make(`${options.parentId}:child:${attemptedChildren}`),
|
|
54
|
+
parentId: options.parentId,
|
|
55
|
+
agent: options.agent.name,
|
|
56
|
+
brain: options.agent.brain,
|
|
57
|
+
});
|
|
58
|
+
const request = new ChildRequest({
|
|
59
|
+
session,
|
|
60
|
+
cwd: options.cwd,
|
|
61
|
+
prompt: assembleChildPrompt({
|
|
62
|
+
agent: options.agent.name,
|
|
63
|
+
persona: options.agent.persona,
|
|
64
|
+
task,
|
|
65
|
+
}),
|
|
66
|
+
});
|
|
67
|
+
yield* Effect.annotateCurrentSpan({
|
|
68
|
+
agent: request.session.agent,
|
|
69
|
+
sessionId: request.session.id,
|
|
70
|
+
});
|
|
71
|
+
yield* Effect.logInfo("Spawning child session", {
|
|
72
|
+
attemptedChildren,
|
|
73
|
+
maxChildren: options.maxChildren,
|
|
74
|
+
taskExcerpt: excerpt,
|
|
75
|
+
});
|
|
76
|
+
const child = yield* options.backend.launch(request);
|
|
77
|
+
// Registered on the spawn scope, so the child stops being addressable when it returns.
|
|
78
|
+
yield* options.register(child);
|
|
79
|
+
yield* Effect.addFinalizer((exit) => Exit.isFailure(exit)
|
|
80
|
+
? Effect.logWarning("Child session ended before returning a result", {
|
|
81
|
+
sessionId: session.id,
|
|
82
|
+
}).pipe(Effect.andThen(options.emit(new SessionFinished({ session: child.session }))))
|
|
83
|
+
: Effect.void);
|
|
84
|
+
const forward = yield* child.events.pipe(Stream.runForEach(options.emit), Effect.forkScoped);
|
|
85
|
+
const result = yield* Effect.raceFirst(child.result, interrupted(signal, request.session.id).pipe(Effect.andThen(child.interrupt), Effect.andThen(Effect.interrupt)));
|
|
86
|
+
yield* Fiber.join(forward);
|
|
87
|
+
yield* Effect.logInfo("Child session returned to Pi parent", {
|
|
88
|
+
sessionId: request.session.id,
|
|
89
|
+
});
|
|
90
|
+
const report = {
|
|
91
|
+
content: [{ type: "text", text: result.message }],
|
|
92
|
+
details: { childSessionId: request.session.id },
|
|
93
|
+
};
|
|
94
|
+
onUpdate?.(report);
|
|
95
|
+
return report;
|
|
96
|
+
}, Effect.scoped);
|
|
22
97
|
return (pi) => {
|
|
23
98
|
pi.registerTool(defineTool({
|
|
24
99
|
name: "subagent",
|
|
@@ -32,50 +107,12 @@ export const createSubagentsExtension = (options) => {
|
|
|
32
107
|
executionMode: "parallel",
|
|
33
108
|
execute: (_toolCallId, params, signal, onUpdate) => {
|
|
34
109
|
childNumber += 1;
|
|
35
|
-
|
|
36
|
-
id: Agent.SessionId.make(`${options.parentId}:child:${childNumber}`),
|
|
37
|
-
parentId: options.parentId,
|
|
38
|
-
agent: options.agent.name,
|
|
39
|
-
brain: options.agent.brain,
|
|
40
|
-
});
|
|
41
|
-
const request = new ChildRequest({
|
|
42
|
-
session,
|
|
43
|
-
cwd: options.cwd,
|
|
44
|
-
prompt: assembleChildPrompt({
|
|
45
|
-
agent: options.agent.name,
|
|
46
|
-
persona: options.agent.persona,
|
|
47
|
-
task: params.task,
|
|
48
|
-
}),
|
|
49
|
-
});
|
|
50
|
-
const program = Effect.scoped(Effect.gen(function* () {
|
|
51
|
-
yield* Effect.annotateCurrentSpan({
|
|
52
|
-
agent: request.session.agent,
|
|
53
|
-
parentSessionId: request.session.parentId,
|
|
54
|
-
sessionId: request.session.id,
|
|
55
|
-
});
|
|
56
|
-
yield* Effect.logInfo("Delegating task to child session");
|
|
57
|
-
const child = yield* options.backend.launch(request);
|
|
58
|
-
const forward = yield* child.events.pipe(Stream.runForEach(options.emit), Effect.forkScoped);
|
|
59
|
-
const result = yield* Effect.raceFirst(child.result, interrupted(signal, request.session.id).pipe(Effect.andThen(child.interrupt), Effect.andThen(Effect.interrupt)));
|
|
60
|
-
yield* Fiber.join(forward);
|
|
61
|
-
yield* Effect.logInfo("Child session returned to Pi parent", {
|
|
62
|
-
sessionId: request.session.id,
|
|
63
|
-
});
|
|
64
|
-
onUpdate?.({
|
|
65
|
-
content: [{ type: "text", text: result.message }],
|
|
66
|
-
details: { childSessionId: session.id },
|
|
67
|
-
});
|
|
68
|
-
return {
|
|
69
|
-
content: [{ type: "text", text: result.message }],
|
|
70
|
-
details: { childSessionId: session.id },
|
|
71
|
-
};
|
|
72
|
-
}));
|
|
73
|
-
return options.run(program);
|
|
110
|
+
return options.run(spawn(ChildSessionCount.make(childNumber), params.task, signal, onUpdate));
|
|
74
111
|
},
|
|
75
112
|
}));
|
|
76
113
|
};
|
|
77
114
|
};
|
|
78
|
-
/**
|
|
115
|
+
/** Names the extension so Pi startup diagnostics can identify it. */
|
|
79
116
|
export const subagentsExtension = (options) => ({
|
|
80
117
|
name: "usine-subagents",
|
|
81
118
|
factory: createSubagentsExtension(options),
|
package/dist/pi/subagents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagents.js","sourceRoot":"","sources":["../../src/pi/subagents.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"subagents.js","sourceRoot":"","sources":["../../src/pi/subagents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Effort } from "@usine/core/agent/brain";
|
|
2
|
+
export interface ThinkingCapableModel {
|
|
3
|
+
readonly reasoning: boolean;
|
|
4
|
+
readonly thinkingLevelMap?: Partial<Record<Effort, string | null>> | undefined;
|
|
5
|
+
}
|
|
6
|
+
/** The thinking levels a model supports; the SDK clamps to this set without exposing it. */
|
|
7
|
+
export declare const supportedThinkingLevels: (model: ThinkingCapableModel) => ReadonlyArray<Effort>;
|
|
8
|
+
//# sourceMappingURL=thinking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking.d.ts","sourceRoot":"","sources":["../../src/pi/thinking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAW,MAAM,yBAAyB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CAChF;AAED,4FAA4F;AAC5F,eAAO,MAAM,uBAAuB,UAAW,oBAAoB,KAAG,aAAa,CAAC,MAAM,CAQzF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Effort, EFFORTS } from "@usine/core/agent/brain";
|
|
2
|
+
/** The thinking levels a model supports; the SDK clamps to this set without exposing it. */
|
|
3
|
+
export const supportedThinkingLevels = (model) => {
|
|
4
|
+
if (!model.reasoning)
|
|
5
|
+
return ["off"];
|
|
6
|
+
return EFFORTS.filter((level) => {
|
|
7
|
+
const mapped = model.thinkingLevelMap?.[level];
|
|
8
|
+
if (mapped === null)
|
|
9
|
+
return false;
|
|
10
|
+
if (level === "xhigh" || level === "max")
|
|
11
|
+
return mapped !== undefined;
|
|
12
|
+
return true;
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=thinking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking.js","sourceRoot":"","sources":["../../src/pi/thinking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAO1D,4FAA4F;AAC5F,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAA2B,EAAyB,EAAE;IAC5F,IAAI,CAAC,KAAK,CAAC,SAAS;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAClC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK;YAAE,OAAO,MAAM,KAAK,SAAS,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AgentSession } from "@usine/core/agent/session";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { type AgentSessionError } from "../runtime.ts";
|
|
4
|
+
import type { PiSession } from "./sdk.ts";
|
|
5
|
+
import { type SessionChannel } from "./session.ts";
|
|
6
|
+
/** Gates Pi tools and provider requests without aborting a parent's still-live children. */
|
|
7
|
+
export declare const piPauseGate: Effect.Effect<{
|
|
8
|
+
set: (next: Effect.Effect<void>) => void;
|
|
9
|
+
extension: {
|
|
10
|
+
name: string;
|
|
11
|
+
factory: (pi: import("@earendil-works/pi-coding-agent").ExtensionAPI) => void;
|
|
12
|
+
};
|
|
13
|
+
}, never, import("effect/Scope").Scope>;
|
|
14
|
+
/** Runs successive Pi turns in one SDK session while the conversation owns completion. */
|
|
15
|
+
export declare const piTurns: (options: {
|
|
16
|
+
readonly session: AgentSession;
|
|
17
|
+
readonly sdk: PiSession;
|
|
18
|
+
readonly channel: SessionChannel;
|
|
19
|
+
readonly prompt: string;
|
|
20
|
+
readonly lastText: () => string | undefined;
|
|
21
|
+
readonly error: (operation: "stream" | "steer" | "interrupt", cause: unknown) => AgentSessionError;
|
|
22
|
+
readonly gate: Effect.Success<typeof piPauseGate>;
|
|
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>;
|
|
27
|
+
}, never, import("effect/Scope").Scope>;
|
|
28
|
+
//# sourceMappingURL=turns.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/pi/turns.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AgentSession } from "@usine/core/agent/session";
|
|
2
|
+
import { Effect, Fiber } from "effect";
|
|
3
|
+
import {} from "../runtime.js";
|
|
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. */
|
|
7
|
+
export const piPauseGate = Effect.gen(function* () {
|
|
8
|
+
const context = yield* Effect.context();
|
|
9
|
+
const scope = yield* Effect.scope;
|
|
10
|
+
let boundary = Effect.void;
|
|
11
|
+
const wait = () => Effect.runPromiseWith(context)(Effect.suspend(() => boundary).pipe(Effect.forkIn(scope), Effect.flatMap(Fiber.join)));
|
|
12
|
+
return {
|
|
13
|
+
set: (next) => {
|
|
14
|
+
boundary = next;
|
|
15
|
+
},
|
|
16
|
+
extension: {
|
|
17
|
+
name: "usine-session-intervention",
|
|
18
|
+
factory: (pi) => {
|
|
19
|
+
pi.on("tool_call", wait);
|
|
20
|
+
pi.on("before_provider_request", wait);
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
/** Runs successive Pi turns in one SDK session while the conversation owns completion. */
|
|
26
|
+
export const piTurns = Effect.fn("PiTurns.start")(function* (options) {
|
|
27
|
+
const scope = yield* Effect.scope;
|
|
28
|
+
const startTurn = (message) => Effect.tryPromise({
|
|
29
|
+
try: () => options.sdk.prompt(message),
|
|
30
|
+
catch: (cause) => options.error("stream", cause),
|
|
31
|
+
}).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
|
+
try: () => options.sdk.steer(message),
|
|
34
|
+
catch: (cause) => options.error("steer", cause),
|
|
35
|
+
});
|
|
36
|
+
const conversation = yield* sessionConversation({
|
|
37
|
+
session: options.session,
|
|
38
|
+
channel: options.channel,
|
|
39
|
+
send: (message, activity) => (activity === "idle" ? startTurn(message) : steer(message)),
|
|
40
|
+
pause: Effect.void,
|
|
41
|
+
beforeFinish: Effect.void,
|
|
42
|
+
});
|
|
43
|
+
options.gate.set(conversation.awaitUnpaused);
|
|
44
|
+
yield* startTurn(options.prompt);
|
|
45
|
+
return {
|
|
46
|
+
intervene: conversation.intervene,
|
|
47
|
+
steer,
|
|
48
|
+
interrupt: Effect.tryPromise({
|
|
49
|
+
try: () => options.sdk.abort(),
|
|
50
|
+
catch: (cause) => options.error("interrupt", cause),
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=turns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turns.js","sourceRoot":"","sources":["../../src/pi/turns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TokenCount } from "@usine/core/agent/session";
|
|
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.
|
|
14
|
+
*/
|
|
15
|
+
export declare const claudeTokenMeter: () => (message: Schema.Json) => Option.Option<TokenCount>;
|
|
16
|
+
/** Codex's thread meter is cumulative across turns on the same thread. */
|
|
17
|
+
export declare const CodexTokenUsage: Schema.Struct<{
|
|
18
|
+
readonly threadId: Schema.NonEmptyString;
|
|
19
|
+
readonly tokenUsage: Schema.Struct<{
|
|
20
|
+
readonly total: Schema.Struct<{
|
|
21
|
+
readonly totalTokens: Schema.brand<Schema.Int, "TokenCount">;
|
|
22
|
+
}>;
|
|
23
|
+
}>;
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +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"}
|