@usine/agents 0.2.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.
- package/README.md +93 -29
- package/dist/child-host/child-host.d.ts +60 -0
- package/dist/child-host/child-host.d.ts.map +1 -0
- package/dist/child-host/child-host.js +84 -0
- package/dist/child-host/child-host.js.map +1 -0
- package/dist/child-host/command.d.ts +11 -0
- package/dist/child-host/command.d.ts.map +1 -0
- package/dist/child-host/command.js +26 -0
- package/dist/child-host/command.js.map +1 -0
- package/dist/pi/authentication.d.ts +11 -2
- package/dist/pi/authentication.d.ts.map +1 -1
- package/dist/pi/authentication.js +15 -2
- package/dist/pi/authentication.js.map +1 -1
- package/dist/pi/children.d.ts +1 -4
- package/dist/pi/children.d.ts.map +1 -1
- package/dist/pi/children.js +1 -4
- package/dist/pi/children.js.map +1 -1
- package/dist/pi/claude.d.ts +8 -9
- package/dist/pi/claude.d.ts.map +1 -1
- package/dist/pi/claude.js +413 -39
- package/dist/pi/claude.js.map +1 -1
- package/dist/pi/codex/account.d.ts +3 -3
- package/dist/pi/codex/account.d.ts.map +1 -1
- package/dist/pi/codex/account.js +5 -5
- package/dist/pi/codex/account.js.map +1 -1
- package/dist/pi/codex/app-server.d.ts +19 -7
- package/dist/pi/codex/app-server.d.ts.map +1 -1
- package/dist/pi/codex/app-server.js +41 -36
- package/dist/pi/codex/app-server.js.map +1 -1
- package/dist/pi/codex/codec.d.ts +118 -0
- package/dist/pi/codex/codec.d.ts.map +1 -0
- package/dist/pi/codex/codec.js +137 -0
- package/dist/pi/codex/codec.js.map +1 -0
- package/dist/pi/codex/codex.d.ts +0 -1
- package/dist/pi/codex/codex.d.ts.map +1 -1
- package/dist/pi/codex/codex.js +169 -133
- package/dist/pi/codex/codex.js.map +1 -1
- package/dist/pi/conversation.d.ts +43 -0
- package/dist/pi/conversation.d.ts.map +1 -0
- package/dist/pi/conversation.js +129 -0
- package/dist/pi/conversation.js.map +1 -0
- package/dist/pi/pi.d.ts +1 -4
- package/dist/pi/pi.d.ts.map +1 -1
- package/dist/pi/pi.js +38 -201
- package/dist/pi/pi.js.map +1 -1
- package/dist/pi/sdk.d.ts +11 -15
- package/dist/pi/sdk.d.ts.map +1 -1
- package/dist/pi/sdk.js +35 -53
- package/dist/pi/sdk.js.map +1 -1
- package/dist/pi/session.d.ts +13 -14
- package/dist/pi/session.d.ts.map +1 -1
- package/dist/pi/session.js +68 -16
- package/dist/pi/session.js.map +1 -1
- package/dist/pi/turns.d.ts +28 -0
- package/dist/pi/turns.d.ts.map +1 -0
- package/dist/pi/turns.js +67 -0
- package/dist/pi/turns.js.map +1 -0
- package/dist/pi/usage.d.ts +39 -0
- package/dist/pi/usage.d.ts.map +1 -0
- package/dist/pi/usage.js +96 -0
- package/dist/pi/usage.js.map +1 -0
- package/dist/preflight/command.d.ts +16 -3
- package/dist/preflight/command.d.ts.map +1 -1
- package/dist/preflight/command.js +30 -17
- package/dist/preflight/command.js.map +1 -1
- package/dist/preflight/preflight.d.ts +10 -5
- package/dist/preflight/preflight.d.ts.map +1 -1
- package/dist/preflight/preflight.js +52 -25
- package/dist/preflight/preflight.js.map +1 -1
- package/dist/prompt.d.ts +12 -9
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +33 -4
- package/dist/prompt.js.map +1 -1
- package/dist/protocol/codex.d.ts +4 -7
- package/dist/protocol/codex.d.ts.map +1 -1
- package/dist/protocol/codex.js +1 -1
- package/dist/protocol/codex.js.map +1 -1
- package/dist/runtime.d.ts +101 -40
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +108 -27
- package/dist/runtime.js.map +1 -1
- package/package.json +22 -10
- package/dist/pi/live.d.ts +0 -4
- package/dist/pi/live.d.ts.map +0 -1
- package/dist/pi/live.js +0 -11
- package/dist/pi/live.js.map +0 -1
- package/dist/pi/subagents.d.ts +0 -27
- package/dist/pi/subagents.d.ts.map +0 -1
- package/dist/pi/subagents.js +0 -113
- package/dist/pi/subagents.js.map +0 -1
- package/dist/pi/thinking.d.ts +0 -8
- package/dist/pi/thinking.d.ts.map +0 -1
- package/dist/pi/thinking.js +0 -15
- package/dist/pi/thinking.js.map +0 -1
package/dist/pi/sdk.js
CHANGED
|
@@ -1,35 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getSupportedThinkingLevels } from "@earendil-works/pi-ai";
|
|
2
|
+
import { createAgentSession, createBashToolDefinition, DefaultResourceLoader, defineTool, getAgentDir, ModelRuntime, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
|
|
2
3
|
import { Effort, ModelId } from "@usine/core/agent/brain";
|
|
3
4
|
import { Context, Effect, Exit, Layer, Option } from "effect";
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
import { piAuthentication, resolvePiPool, splitPiModel, } from "./authentication.js";
|
|
6
|
+
/** Returns a bash tool whose commands run with exactly `environment`; Pi's `PI_*` variables are not added. */
|
|
7
|
+
export const environmentBashTool = (cwd, environment) => {
|
|
8
|
+
const exact = (context) => ({ ...context, env: { ...environment } });
|
|
9
|
+
return defineTool(createBashToolDefinition(cwd, { exposeSessionEnvironment: false, spawnHook: exact }));
|
|
10
|
+
};
|
|
11
|
+
/** The service that starts a Pi session with the selected model and its repository tools. */
|
|
9
12
|
export class PiSdk extends Context.Service()("@usine/agents/pi/PiSdk") {
|
|
10
13
|
}
|
|
11
|
-
const splitModel = (model) => {
|
|
12
|
-
const separator = model.indexOf("/");
|
|
13
|
-
return separator <= 0 || separator === model.length - 1
|
|
14
|
-
? undefined
|
|
15
|
-
: [model.slice(0, separator), model.slice(separator + 1)];
|
|
16
|
-
};
|
|
17
14
|
export const piSdkLive = Layer.succeed(PiSdk)({
|
|
18
15
|
start: async (options) => {
|
|
19
16
|
const modelRuntime = await ModelRuntime.create({ signal: options.signal });
|
|
20
|
-
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (selected === undefined)
|
|
27
|
-
return { _tag: "UnknownModel" };
|
|
28
|
-
}
|
|
17
|
+
const parts = splitPiModel(options.model);
|
|
18
|
+
if (parts === undefined)
|
|
19
|
+
return { _tag: "UnknownModel" };
|
|
20
|
+
const selected = modelRuntime.getModel(parts.provider, parts.modelId);
|
|
21
|
+
if (selected === undefined)
|
|
22
|
+
return { _tag: "UnknownModel" };
|
|
29
23
|
const agentDir = getAgentDir();
|
|
30
|
-
// The worktree is
|
|
31
|
-
//
|
|
32
|
-
// inline factory, which the loader registers regardless.
|
|
24
|
+
// The worktree is untrusted, so its `.pi/` settings, SYSTEM.md, extensions, and skills are not
|
|
25
|
+
// loaded; inline extension factories, such as the pause gate, still register.
|
|
33
26
|
const settingsManager = SettingsManager.create(options.cwd, agentDir, {
|
|
34
27
|
projectTrusted: false,
|
|
35
28
|
});
|
|
@@ -52,45 +45,35 @@ export const piSdkLive = Layer.succeed(PiSdk)({
|
|
|
52
45
|
settingsManager,
|
|
53
46
|
thinkingLevel: options.thinkingLevel,
|
|
54
47
|
};
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
: sessionOptions
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
48
|
+
// A custom tool replaces the built-in tool of the same name.
|
|
49
|
+
const environmentScopedSessionOptions = Option.match(options.environment, {
|
|
50
|
+
onNone: () => sessionOptions,
|
|
51
|
+
onSome: (environment) => ({
|
|
52
|
+
...sessionOptions,
|
|
53
|
+
customTools: [environmentBashTool(options.cwd, environment)],
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
const { session } = await createAgentSession({
|
|
57
|
+
...environmentScopedSessionOptions,
|
|
58
|
+
model: selected,
|
|
59
|
+
});
|
|
61
60
|
let ownershipTransferred = false;
|
|
62
61
|
try {
|
|
63
62
|
const active = session.model;
|
|
64
63
|
if (active === undefined)
|
|
65
64
|
throw new Error("Pi started without an active model");
|
|
66
65
|
const model = ModelId.make(`${active.provider}/${active.id}`);
|
|
67
|
-
const supported =
|
|
66
|
+
const supported = getSupportedThinkingLevels(active);
|
|
68
67
|
if (!supported.includes(options.thinkingLevel)) {
|
|
69
68
|
return { _tag: "UnsupportedEffort", effort: options.thinkingLevel, model, supported };
|
|
70
69
|
}
|
|
71
|
-
const
|
|
72
|
-
signal: options.signal,
|
|
73
|
-
});
|
|
74
|
-
const authentication = resolvedAuthentication?.type === "api_key"
|
|
75
|
-
? { _tag: "ApiKey" }
|
|
76
|
-
: resolvedAuthentication?.type === "oauth"
|
|
77
|
-
? {
|
|
78
|
-
_tag: "OAuth",
|
|
79
|
-
subscription: modelRuntime.getProvider(active.provider)?.auth.oauth?.isSubscription === true,
|
|
80
|
-
}
|
|
81
|
-
: undefined;
|
|
82
|
-
const requiredPool = requiredPiPool(active.provider);
|
|
70
|
+
const authentication = piAuthentication(await modelRuntime.checkAuth(active.provider, { signal: options.signal }), modelRuntime.getProvider(active.provider)?.auth.oauth?.isSubscription === true);
|
|
83
71
|
const pool = resolvePiPool(active.provider, authentication);
|
|
84
72
|
if (authentication === undefined) {
|
|
85
|
-
return { _tag: "AuthenticationUnavailable", model
|
|
73
|
+
return { _tag: "AuthenticationUnavailable", model };
|
|
86
74
|
}
|
|
87
75
|
if (pool === undefined && authentication._tag === "OAuth") {
|
|
88
|
-
return {
|
|
89
|
-
_tag: "UnsupportedAuthentication",
|
|
90
|
-
authentication,
|
|
91
|
-
model,
|
|
92
|
-
requiredPool,
|
|
93
|
-
};
|
|
76
|
+
return { _tag: "UnsupportedAuthentication", authentication, model };
|
|
94
77
|
}
|
|
95
78
|
if (pool === undefined) {
|
|
96
79
|
throw new Error("Pi could not map a configured API key to a billing pool");
|
|
@@ -110,9 +93,8 @@ export const piSdkLive = Layer.succeed(PiSdk)({
|
|
|
110
93
|
},
|
|
111
94
|
});
|
|
112
95
|
/**
|
|
113
|
-
* Runs SDK startup so an interruption cannot leak a session
|
|
114
|
-
*
|
|
115
|
-
* one already handed to `use` is disposed by `onExit`.
|
|
96
|
+
* Runs SDK startup so an interruption cannot leak a session: a result that arrives after the
|
|
97
|
+
* interruption is disposed when its Promise settles, and one passed to `use` is disposed on exit.
|
|
116
98
|
*/
|
|
117
99
|
export const usePiStart = (start, onError, use) => Effect.suspend(() => {
|
|
118
100
|
let acquired;
|
package/dist/pi/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/pi/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/pi/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/pi/session.d.ts
CHANGED
|
@@ -1,42 +1,41 @@
|
|
|
1
|
-
import { AgentSession, AgentSessionEvent, AgentSessionId, SessionFinished, 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
|
-
/**
|
|
6
|
+
/** The adapter name in log lines. */
|
|
7
7
|
readonly label: string;
|
|
8
8
|
readonly sessionId: AgentSessionId;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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
|
|
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").SessionStarted | 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
|
|
37
|
-
*
|
|
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;
|
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,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,UAAU,EACV,YAAY,EACZ,WAAW,EACZ,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAe,MAAM,QAAQ,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"}
|
package/dist/pi/session.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { AgentSession, AgentSessionEvent, AgentSessionId, SessionFinished, TextOutput, ToolFinished, ToolStarted, } from "@usine/core/agent/session";
|
|
2
|
-
import { Cause, Deferred, Effect, Queue, Ref, Schema } from "effect";
|
|
3
|
-
import {
|
|
1
|
+
import { AgentSession, AgentSessionEvent, AgentSessionId, ProviderRecovered, ProviderRetries, ProviderRetrying, SessionFinished, SessionTokensUpdated, TokenCount, TextOutput, ToolFinished, ToolStarted, } from "@usine/core/agent/session";
|
|
2
|
+
import { Cause, Deferred, Effect, Option, Queue, Ref, Schema } from "effect";
|
|
3
|
+
import { addUsage, piMessageUsage } from "./usage.js";
|
|
4
|
+
import { reportedOutcome, SessionResult } from "../runtime.js";
|
|
4
5
|
export const sessionChannel = Effect.fn("SessionChannel.make")(function* (options) {
|
|
5
6
|
const events = yield* Queue.make();
|
|
6
7
|
const result = yield* Deferred.make();
|
|
@@ -17,6 +18,7 @@ export const sessionChannel = Effect.fn("SessionChannel.make")(function* (option
|
|
|
17
18
|
sessionId: options.sessionId,
|
|
18
19
|
})));
|
|
19
20
|
const fail = Effect.fn("SessionChannel.fail")(function* (error) {
|
|
21
|
+
yield* Effect.annotateCurrentSpan({ sessionId: options.sessionId });
|
|
20
22
|
if (yield* Ref.getAndSet(terminal, true))
|
|
21
23
|
return;
|
|
22
24
|
yield* Effect.logError(`${options.label} failed`, {
|
|
@@ -29,6 +31,10 @@ export const sessionChannel = Effect.fn("SessionChannel.make")(function* (option
|
|
|
29
31
|
yield* runCleanups;
|
|
30
32
|
});
|
|
31
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);
|
|
32
38
|
if (yield* Ref.getAndSet(terminal, true))
|
|
33
39
|
return;
|
|
34
40
|
yield* Queue.offer(events, new SessionFinished({ session }));
|
|
@@ -88,6 +94,21 @@ const messageText = (message) => {
|
|
|
88
94
|
.trim();
|
|
89
95
|
return text || undefined;
|
|
90
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
|
+
};
|
|
91
112
|
export const lastPiMessageText = (messages) => {
|
|
92
113
|
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
93
114
|
const message = messages[index];
|
|
@@ -124,28 +145,59 @@ const sessionEventFrom = (event, session) => {
|
|
|
124
145
|
return undefined;
|
|
125
146
|
};
|
|
126
147
|
/**
|
|
127
|
-
* Subscribes
|
|
128
|
-
*
|
|
129
|
-
* the prompt's resolution; operational events with no normalized shape (retry
|
|
130
|
-
* 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`.
|
|
131
150
|
*/
|
|
132
151
|
export const subscribePiSession = (piSession, session, channel) => Effect.gen(function* () {
|
|
133
152
|
const context = yield* Effect.context();
|
|
134
153
|
const log = Effect.runForkWith(context);
|
|
135
154
|
let lastText;
|
|
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
|
+
};
|
|
136
167
|
const unsubscribe = piSession.subscribe((event) => {
|
|
168
|
+
if (event.type === "message_end") {
|
|
169
|
+
const usage = piMessageUsage(event.message);
|
|
170
|
+
if (Option.isSome(usage)) {
|
|
171
|
+
total = addUsage(total, usage.value);
|
|
172
|
+
offer(new SessionTokensUpdated({ session, ...total }));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
137
175
|
if (event.type === "auto_retry_start") {
|
|
138
|
-
|
|
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", {
|
|
139
180
|
attempt: event.attempt,
|
|
140
181
|
delayMillis: event.delayMs,
|
|
141
|
-
errorMessage: event.errorMessage,
|
|
142
182
|
maxAttempts: event.maxAttempts,
|
|
183
|
+
message,
|
|
184
|
+
retries,
|
|
143
185
|
sessionId: session.id,
|
|
144
186
|
}));
|
|
187
|
+
offer(new ProviderRetrying({ session, message, retries: ProviderRetries.make(retries) }));
|
|
145
188
|
return;
|
|
146
189
|
}
|
|
147
190
|
if (event.type === "auto_retry_end") {
|
|
148
|
-
|
|
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", {
|
|
149
201
|
attempt: event.attempt,
|
|
150
202
|
finalError: event.finalError,
|
|
151
203
|
sessionId: session.id,
|
|
@@ -153,6 +205,11 @@ export const subscribePiSession = (piSession, session, channel) => Effect.gen(fu
|
|
|
153
205
|
}));
|
|
154
206
|
return;
|
|
155
207
|
}
|
|
208
|
+
if (event.type === "agent_settled") {
|
|
209
|
+
retries = 0;
|
|
210
|
+
retrying = false;
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
156
213
|
if (event.type === "compaction_start" || event.type === "compaction_end") {
|
|
157
214
|
log(Effect.logInfo("Pi session context compaction", {
|
|
158
215
|
phase: event.type,
|
|
@@ -166,12 +223,7 @@ export const subscribePiSession = (piSession, session, channel) => Effect.gen(fu
|
|
|
166
223
|
return;
|
|
167
224
|
if (sessionEvent._tag === "TextOutput")
|
|
168
225
|
lastText = sessionEvent.text;
|
|
169
|
-
|
|
170
|
-
log(Effect.logWarning("Dropped a Pi session event after the terminal transition", {
|
|
171
|
-
event: sessionEvent._tag,
|
|
172
|
-
sessionId: session.id,
|
|
173
|
-
}));
|
|
174
|
-
}
|
|
226
|
+
offer(sessionEvent);
|
|
175
227
|
});
|
|
176
228
|
channel.onTerminal(unsubscribe);
|
|
177
229
|
return { lastText: () => lastText, unsubscribe };
|
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,EACL,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ChildSession } 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
|
+
/** Creates a gate that blocks Pi tool calls and provider requests at their next boundary while an operator pause is active. */
|
|
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; the conversation decides when the session completes. */
|
|
15
|
+
export declare const piTurns: (options: {
|
|
16
|
+
readonly session: ChildSession;
|
|
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, 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
|
+
}, 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,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
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { ChildSession } from "@usine/core/agent/session";
|
|
2
|
+
import { Effect, Fiber, Option } from "effect";
|
|
3
|
+
import {} from "../runtime.js";
|
|
4
|
+
import { sessionConversation } from "./conversation.js";
|
|
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
|
+
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; the conversation decides when the session completes. */
|
|
26
|
+
export const piTurns = Effect.fn("PiTurns.start")(function* (options) {
|
|
27
|
+
const scope = yield* Effect.scope;
|
|
28
|
+
const context = yield* Effect.context();
|
|
29
|
+
const startTurn = (message) => Effect.tryPromise({
|
|
30
|
+
try: () => options.sdk.prompt(message),
|
|
31
|
+
catch: (cause) => options.error("stream", cause),
|
|
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);
|
|
33
|
+
// Pi delivers a steering message after the running tool calls return, before its next model request.
|
|
34
|
+
const queueSteer = (message) => Effect.tryPromise({
|
|
35
|
+
try: () => options.sdk.steer(message),
|
|
36
|
+
catch: (cause) => options.error("steer", cause),
|
|
37
|
+
}).pipe(Effect.map((disposition) => (disposition === "handled" ? "read" : "queued")));
|
|
38
|
+
const conversation = yield* sessionConversation({
|
|
39
|
+
session: options.session,
|
|
40
|
+
channel: options.channel,
|
|
41
|
+
send: (message, activity) => activity === "idle"
|
|
42
|
+
? startTurn(message).pipe(Effect.as("read"))
|
|
43
|
+
: queueSteer(message),
|
|
44
|
+
pause: Effect.void,
|
|
45
|
+
beforeFinish: Effect.void,
|
|
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));
|
|
56
|
+
options.gate.set(conversation.awaitUnpaused);
|
|
57
|
+
yield* startTurn(options.prompt);
|
|
58
|
+
return {
|
|
59
|
+
intervene: conversation.intervene,
|
|
60
|
+
steer: (message) => queueSteer(message).pipe(Effect.asVoid),
|
|
61
|
+
interrupt: Effect.tryPromise({
|
|
62
|
+
try: () => options.sdk.abort(),
|
|
63
|
+
catch: (cause) => options.error("interrupt", cause),
|
|
64
|
+
}),
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
//# 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,39 @@
|
|
|
1
|
+
import { TokenCount, UsdAmount } from "@usine/core/agent/session";
|
|
2
|
+
import { Option, Schema } from "effect";
|
|
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.
|
|
20
|
+
*/
|
|
21
|
+
export declare const claudeTokenMeter: () => (message: Schema.Json) => Option.Option<SessionUsage>;
|
|
22
|
+
/** The Codex thread token usage, cumulative across turns; `inputTokens` includes cached input. */
|
|
23
|
+
export declare const CodexTokenUsage: Schema.Struct<{
|
|
24
|
+
readonly threadId: Schema.NonEmptyString;
|
|
25
|
+
readonly tokenUsage: Schema.Struct<{
|
|
26
|
+
readonly total: Schema.Struct<{
|
|
27
|
+
readonly inputTokens: Schema.Int;
|
|
28
|
+
readonly cachedInputTokens: Schema.Int;
|
|
29
|
+
readonly outputTokens: Schema.Int;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
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;
|
|
39
|
+
//# 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,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"}
|