@usine/agents 0.0.0 → 0.1.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/LICENSE +21 -0
- package/README.md +28 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/pi/authentication.d.ts +13 -0
- package/dist/pi/authentication.d.ts.map +1 -0
- package/dist/pi/authentication.js +14 -0
- package/dist/pi/authentication.js.map +1 -0
- package/dist/pi/children.d.ts +5 -0
- package/dist/pi/children.d.ts.map +1 -0
- package/dist/pi/children.js +26 -0
- package/dist/pi/children.js.map +1 -0
- package/dist/pi/claude.d.ts +32 -0
- package/dist/pi/claude.d.ts.map +1 -0
- package/dist/pi/claude.js +237 -0
- package/dist/pi/claude.js.map +1 -0
- package/dist/pi/codex/app-server.d.ts +24 -0
- package/dist/pi/codex/app-server.d.ts.map +1 -0
- package/dist/pi/codex/app-server.js +188 -0
- package/dist/pi/codex/app-server.js.map +1 -0
- package/dist/pi/codex/codex.d.ts +5 -0
- package/dist/pi/codex/codex.d.ts.map +1 -0
- package/dist/pi/codex/codex.js +342 -0
- package/dist/pi/codex/codex.js.map +1 -0
- package/dist/pi/index.d.ts +11 -0
- package/dist/pi/index.d.ts.map +1 -0
- package/dist/pi/index.js +18 -0
- package/dist/pi/index.js.map +1 -0
- package/dist/pi/pi.d.ts +7 -0
- package/dist/pi/pi.d.ts.map +1 -0
- package/dist/pi/pi.js +273 -0
- package/dist/pi/pi.js.map +1 -0
- package/dist/pi/sdk.d.ts +66 -0
- package/dist/pi/sdk.d.ts.map +1 -0
- package/dist/pi/sdk.js +154 -0
- package/dist/pi/sdk.js.map +1 -0
- package/dist/pi/session.d.ts +46 -0
- package/dist/pi/session.d.ts.map +1 -0
- package/dist/pi/session.js +180 -0
- package/dist/pi/session.js.map +1 -0
- package/dist/pi/subagents.d.ts +23 -0
- package/dist/pi/subagents.d.ts.map +1 -0
- package/dist/pi/subagents.js +83 -0
- package/dist/pi/subagents.js.map +1 -0
- package/dist/prompt.d.ts +22 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +42 -0
- package/dist/prompt.js.map +1 -0
- package/dist/protocol/codex.d.ts +56 -0
- package/dist/protocol/codex.d.ts.map +1 -0
- package/dist/protocol/codex.js +2 -0
- package/dist/protocol/codex.js.map +1 -0
- package/dist/runtime.d.ts +114 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +96 -0
- package/dist/runtime.js.map +1 -0
- package/package.json +54 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../src/pi/pi.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,EAAkB,MAAM,QAAQ,CAAC;AAExE,OAAO,EAEL,YAAY,EACZ,YAAY,EAGZ,cAAc,EAKf,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,KAAK,EAAc,MAAM,UAAU,CAAC;AAG7C,OAAO,EACL,KAAK,EACL,yBAAyB,EACzB,SAAS,EACT,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,UAAU,CAAC;AAsWlB,eAAO,MAAM,aAAa,wDAA2C,CAAC;AACtE,eAAO,MAAM,mBAAmB,2CAA4C,CAAC"}
|
package/dist/pi/pi.js
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { Agent } from "@usine/core";
|
|
2
|
+
import { Deferred, Effect, Fiber, Layer, Option, Stream } from "effect";
|
|
3
|
+
import { assemblePrompt } from "../prompt.js";
|
|
4
|
+
import { AgentRuntime, ChildBackend, PiChildBackend, PoolUnavailableError, SessionOperationError, UnknownModelError, } from "../runtime.js";
|
|
5
|
+
import { lastPiMessageText, sessionChannel, subscribePiSession } from "./session.js";
|
|
6
|
+
import { PiSdk, usePiStart } from "./sdk.js";
|
|
7
|
+
import { subagentsExtension } from "./subagents.js";
|
|
8
|
+
export { PiSdk, piParentSessionToolPolicy, piSdkLive, } from "./sdk.js";
|
|
9
|
+
const parentError = (operation, request, message, cause) => new SessionOperationError({
|
|
10
|
+
operation,
|
|
11
|
+
sessionId: Option.some(Agent.SessionId.make(`parent:${request.spec.attemptId}`)),
|
|
12
|
+
message,
|
|
13
|
+
cause,
|
|
14
|
+
});
|
|
15
|
+
const childError = (operation, request, message, cause) => new SessionOperationError({
|
|
16
|
+
operation,
|
|
17
|
+
sessionId: Option.some(request.session.id),
|
|
18
|
+
message,
|
|
19
|
+
cause,
|
|
20
|
+
});
|
|
21
|
+
const makePiChild = Effect.gen(function* () {
|
|
22
|
+
const sdk = yield* PiSdk;
|
|
23
|
+
const launch = Effect.fn("PiChildBackend.launch")(function* (request) {
|
|
24
|
+
yield* Effect.annotateCurrentSpan({
|
|
25
|
+
agent: request.session.agent,
|
|
26
|
+
effort: request.session.brain.effort,
|
|
27
|
+
harness: request.session.brain.harness,
|
|
28
|
+
model: request.session.brain.model,
|
|
29
|
+
parentSessionId: request.session.parentId,
|
|
30
|
+
sessionId: request.session.id,
|
|
31
|
+
});
|
|
32
|
+
yield* Effect.logInfo("Launching Pi child session");
|
|
33
|
+
return yield* usePiStart((signal) => sdk.start({
|
|
34
|
+
cwd: request.cwd,
|
|
35
|
+
extensions: [],
|
|
36
|
+
model: Option.some(request.session.brain.model),
|
|
37
|
+
signal,
|
|
38
|
+
thinkingLevel: request.session.brain.effort,
|
|
39
|
+
toolMode: "repository",
|
|
40
|
+
}), (cause) => childError("launch", request, "Pi child session failed to start", cause), (acquired) => Effect.gen(function* () {
|
|
41
|
+
const started = acquired.result;
|
|
42
|
+
if (started._tag === "UnknownModel") {
|
|
43
|
+
yield* Effect.logError("Pi child rejected an unknown model", {
|
|
44
|
+
model: request.session.brain.model,
|
|
45
|
+
});
|
|
46
|
+
return yield* new UnknownModelError({
|
|
47
|
+
harness: "pi",
|
|
48
|
+
model: request.session.brain.model,
|
|
49
|
+
message: `Pi does not expose model ${request.session.brain.model}`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (started._tag === "AuthenticationUnavailable") {
|
|
53
|
+
yield* Effect.logError("Pi child has no credential for its model", {
|
|
54
|
+
model: started.model,
|
|
55
|
+
requiredPool: "apiKeys",
|
|
56
|
+
});
|
|
57
|
+
return yield* new PoolUnavailableError({
|
|
58
|
+
harness: "pi",
|
|
59
|
+
model: started.model,
|
|
60
|
+
pool: "apiKeys",
|
|
61
|
+
message: `Pi child model ${started.model} must use an API key`,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (started._tag === "UnsupportedAuthentication") {
|
|
65
|
+
yield* Effect.logError("Pi child model has unsupported OAuth authentication", {
|
|
66
|
+
model: started.model,
|
|
67
|
+
requiredPool: "apiKeys",
|
|
68
|
+
subscription: started.authentication.subscription,
|
|
69
|
+
});
|
|
70
|
+
return yield* new PoolUnavailableError({
|
|
71
|
+
harness: "pi",
|
|
72
|
+
model: started.model,
|
|
73
|
+
pool: "apiKeys",
|
|
74
|
+
message: `Pi child model ${started.model} must use an API key`,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (started.pool !== "apiKeys") {
|
|
78
|
+
yield* Effect.logError("Pi child resolved to an unsupported billing pool", {
|
|
79
|
+
model: started.model,
|
|
80
|
+
requiredPool: "apiKeys",
|
|
81
|
+
resolvedPool: started.pool,
|
|
82
|
+
});
|
|
83
|
+
return yield* new PoolUnavailableError({
|
|
84
|
+
harness: "pi",
|
|
85
|
+
model: started.model,
|
|
86
|
+
pool: "apiKeys",
|
|
87
|
+
message: `Pi child model ${started.model} must use an API key`,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
const session = new Agent.ChildSession({
|
|
91
|
+
id: request.session.id,
|
|
92
|
+
parentId: request.session.parentId,
|
|
93
|
+
agent: request.session.agent,
|
|
94
|
+
brain: new Agent.BrainSpec({
|
|
95
|
+
harness: "pi",
|
|
96
|
+
model: started.model,
|
|
97
|
+
effort: request.session.brain.effort,
|
|
98
|
+
}),
|
|
99
|
+
});
|
|
100
|
+
const channel = yield* sessionChannel({
|
|
101
|
+
label: "Pi child session",
|
|
102
|
+
sessionId: session.id,
|
|
103
|
+
});
|
|
104
|
+
yield* channel.emit(new Agent.SessionStarted({ session }));
|
|
105
|
+
const subscription = yield* subscribePiSession(started.session, session, channel);
|
|
106
|
+
// Once setup succeeds, the ambient scope owns both subscription and SDK session.
|
|
107
|
+
yield* Effect.addFinalizer(() => Effect.sync(subscription.unsubscribe).pipe(Effect.andThen(Effect.sync(acquired.dispose))));
|
|
108
|
+
yield* Effect.tryPromise({
|
|
109
|
+
try: () => started.session.prompt(request.prompt),
|
|
110
|
+
catch: (cause) => childError("stream", request, "Pi child session failed", cause),
|
|
111
|
+
}).pipe(Effect.flatMap(() => channel.finish(session, subscription.lastText() ??
|
|
112
|
+
lastPiMessageText(started.session.messages) ??
|
|
113
|
+
"Pi child session completed")), Effect.catch((error) => channel.fail(error)), Effect.forkScoped);
|
|
114
|
+
const steer = Effect.fn("PiChildBackend.steer")((message) => Effect.logDebug("Steering Pi child session", {
|
|
115
|
+
sessionId: session.id,
|
|
116
|
+
}).pipe(Effect.andThen(Effect.tryPromise({
|
|
117
|
+
try: () => started.session.steer(message),
|
|
118
|
+
catch: (cause) => childError("steer", request, "Could not steer Pi child", cause),
|
|
119
|
+
}))));
|
|
120
|
+
const interrupt = Effect.logInfo("Interrupting Pi child session", {
|
|
121
|
+
sessionId: session.id,
|
|
122
|
+
}).pipe(Effect.andThen(Effect.tryPromise({
|
|
123
|
+
try: () => started.session.abort(),
|
|
124
|
+
catch: (cause) => childError("interrupt", request, "Could not interrupt Pi child", cause),
|
|
125
|
+
})));
|
|
126
|
+
return {
|
|
127
|
+
session,
|
|
128
|
+
events: Stream.fromQueue(channel.events),
|
|
129
|
+
interrupt,
|
|
130
|
+
result: Deferred.await(channel.result),
|
|
131
|
+
steer,
|
|
132
|
+
};
|
|
133
|
+
}));
|
|
134
|
+
});
|
|
135
|
+
return PiChildBackend.of({ launch });
|
|
136
|
+
});
|
|
137
|
+
const makePiParent = Effect.gen(function* () {
|
|
138
|
+
const children = yield* ChildBackend;
|
|
139
|
+
const sdk = yield* PiSdk;
|
|
140
|
+
const launch = Effect.fn("PiParentRuntime.launch")(function* (request) {
|
|
141
|
+
const parentId = Agent.SessionId.make(`parent:${request.spec.attemptId}`);
|
|
142
|
+
yield* Effect.annotateCurrentSpan({
|
|
143
|
+
agent: request.spec.agent.name,
|
|
144
|
+
attemptId: request.spec.attemptId,
|
|
145
|
+
effort: request.spec.agent.brain.effort,
|
|
146
|
+
parentModel: Option.getOrUndefined(request.spec.parentModel),
|
|
147
|
+
repository: request.spec.repository,
|
|
148
|
+
sessionId: parentId,
|
|
149
|
+
});
|
|
150
|
+
yield* Effect.logInfo("Launching Pi parent session");
|
|
151
|
+
const channel = yield* sessionChannel({
|
|
152
|
+
label: "Pi parent session",
|
|
153
|
+
sessionId: parentId,
|
|
154
|
+
});
|
|
155
|
+
// The Pi tool callback runs outside any usine fiber. Child programs must
|
|
156
|
+
// still carry this fiber's services (stderr logging, tracing) and die
|
|
157
|
+
// with this launch scope, so the extension receives a runner instead of
|
|
158
|
+
// reaching for the default runtime.
|
|
159
|
+
const scope = yield* Effect.scope;
|
|
160
|
+
const context = yield* Effect.context();
|
|
161
|
+
const runChild = (program) => Effect.runPromise(program.pipe(Effect.provideContext(context), Effect.forkIn(scope), Effect.flatMap(Fiber.join)));
|
|
162
|
+
return yield* usePiStart((signal) => sdk.start({
|
|
163
|
+
cwd: request.cwd,
|
|
164
|
+
extensions: [
|
|
165
|
+
subagentsExtension({
|
|
166
|
+
agent: request.spec.agent,
|
|
167
|
+
backend: children,
|
|
168
|
+
cwd: request.cwd,
|
|
169
|
+
emit: channel.emit,
|
|
170
|
+
parentId,
|
|
171
|
+
run: runChild,
|
|
172
|
+
}),
|
|
173
|
+
],
|
|
174
|
+
model: request.spec.parentModel,
|
|
175
|
+
signal,
|
|
176
|
+
thinkingLevel: request.spec.agent.brain.effort,
|
|
177
|
+
toolMode: "orchestration",
|
|
178
|
+
}), (cause) => parentError("launch", request, "Pi parent session failed to start", cause), (acquired) => Effect.gen(function* () {
|
|
179
|
+
const started = acquired.result;
|
|
180
|
+
if (started._tag === "UnknownModel") {
|
|
181
|
+
const model = Option.getOrElse(request.spec.parentModel, () => Agent.ModelId.make("unknown"));
|
|
182
|
+
yield* Effect.logError("Pi parent rejected an unknown model", {
|
|
183
|
+
model,
|
|
184
|
+
});
|
|
185
|
+
return yield* new UnknownModelError({
|
|
186
|
+
harness: "pi",
|
|
187
|
+
model,
|
|
188
|
+
message: `Pi does not expose model ${model}`,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
if (started._tag === "AuthenticationUnavailable") {
|
|
192
|
+
yield* Effect.logError("Pi parent has no credential for its model", {
|
|
193
|
+
model: started.model,
|
|
194
|
+
requiredPool: started.requiredPool,
|
|
195
|
+
});
|
|
196
|
+
return yield* new PoolUnavailableError({
|
|
197
|
+
harness: "pi",
|
|
198
|
+
model: started.model,
|
|
199
|
+
pool: started.requiredPool,
|
|
200
|
+
message: `Pi parent model ${started.model} requires a credential from the ${started.requiredPool} pool`,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
if (started._tag === "UnsupportedAuthentication") {
|
|
204
|
+
yield* Effect.logError("Pi parent model has unsupported OAuth authentication", {
|
|
205
|
+
model: started.model,
|
|
206
|
+
requiredPool: started.requiredPool,
|
|
207
|
+
subscription: started.authentication.subscription,
|
|
208
|
+
});
|
|
209
|
+
return yield* new PoolUnavailableError({
|
|
210
|
+
harness: "pi",
|
|
211
|
+
model: started.model,
|
|
212
|
+
pool: started.requiredPool,
|
|
213
|
+
message: `Pi parent model ${started.model} requires a credential from the ${started.requiredPool} pool`,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
yield* Effect.annotateCurrentSpan({ parentPool: started.pool });
|
|
217
|
+
yield* Effect.logInfo("Pi parent session authenticated", {
|
|
218
|
+
model: started.model,
|
|
219
|
+
pool: started.pool,
|
|
220
|
+
});
|
|
221
|
+
const parent = new Agent.ParentSession({
|
|
222
|
+
id: parentId,
|
|
223
|
+
agent: request.spec.agent.name,
|
|
224
|
+
brain: new Agent.BrainSpec({
|
|
225
|
+
harness: "pi",
|
|
226
|
+
model: started.model,
|
|
227
|
+
effort: request.spec.agent.brain.effort,
|
|
228
|
+
}),
|
|
229
|
+
});
|
|
230
|
+
yield* channel.emit(new Agent.SessionStarted({ session: parent }));
|
|
231
|
+
const subscription = yield* subscribePiSession(started.session, parent, channel);
|
|
232
|
+
// Once setup succeeds, the ambient scope owns both subscription and SDK session.
|
|
233
|
+
yield* Effect.addFinalizer(() => Effect.sync(subscription.unsubscribe).pipe(Effect.andThen(Effect.sync(acquired.dispose))));
|
|
234
|
+
const prompt = assemblePrompt({
|
|
235
|
+
repository: request.spec.repository,
|
|
236
|
+
payload: request.spec.payload,
|
|
237
|
+
agent: request.spec.agent.name,
|
|
238
|
+
persona: request.spec.agent.persona,
|
|
239
|
+
task: request.spec.task,
|
|
240
|
+
});
|
|
241
|
+
const run = Effect.tryPromise({
|
|
242
|
+
try: () => started.session.prompt(prompt),
|
|
243
|
+
catch: (cause) => parentError("stream", request, "Pi parent session failed", cause),
|
|
244
|
+
}).pipe(Effect.flatMap(() => channel.finish(parent, subscription.lastText() ??
|
|
245
|
+
lastPiMessageText(started.session.messages) ??
|
|
246
|
+
"Pi parent session completed")), Effect.catch((error) => channel.fail(error)));
|
|
247
|
+
yield* Effect.forkScoped(run);
|
|
248
|
+
const steer = Effect.fn("PiParentRuntime.steer")((message) => Effect.logDebug("Steering Pi parent session", {
|
|
249
|
+
sessionId: parentId,
|
|
250
|
+
}).pipe(Effect.andThen(Effect.tryPromise({
|
|
251
|
+
try: () => started.session.steer(message),
|
|
252
|
+
catch: (cause) => parentError("steer", request, "Could not steer Pi", cause),
|
|
253
|
+
}))));
|
|
254
|
+
const interrupt = Effect.logInfo("Interrupting Pi parent session", {
|
|
255
|
+
sessionId: parentId,
|
|
256
|
+
}).pipe(Effect.andThen(Effect.tryPromise({
|
|
257
|
+
try: () => started.session.abort(),
|
|
258
|
+
catch: (cause) => parentError("interrupt", request, "Could not interrupt Pi", cause),
|
|
259
|
+
})));
|
|
260
|
+
return {
|
|
261
|
+
session: parent,
|
|
262
|
+
events: Stream.fromQueue(channel.events),
|
|
263
|
+
interrupt,
|
|
264
|
+
result: Deferred.await(channel.result),
|
|
265
|
+
steer,
|
|
266
|
+
};
|
|
267
|
+
}));
|
|
268
|
+
});
|
|
269
|
+
return AgentRuntime.of({ launch });
|
|
270
|
+
});
|
|
271
|
+
export const piParentLayer = Layer.effect(AgentRuntime, makePiParent);
|
|
272
|
+
export const piChildBackendLayer = Layer.effect(PiChildBackend, makePiChild);
|
|
273
|
+
//# sourceMappingURL=pi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi.js","sourceRoot":"","sources":["../../src/pi/pi.ts"],"names":[],"mappings":"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"}
|
package/dist/pi/sdk.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createAgentSession, type AgentSessionEvent, type InlineExtension } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { Agent } from "@usine/core";
|
|
3
|
+
import { Context, Effect, Layer, Option } from "effect";
|
|
4
|
+
import { type PiAuthentication, type PiPool } from "./authentication.ts";
|
|
5
|
+
export type PiSessionEvent = AgentSessionEvent;
|
|
6
|
+
export type PiMessage = Awaited<ReturnType<typeof createAgentSession>>["session"]["messages"][number];
|
|
7
|
+
/** Narrow in-process Pi session surface consumed by the adapter. */
|
|
8
|
+
export interface PiSession {
|
|
9
|
+
readonly messages: ReadonlyArray<PiMessage>;
|
|
10
|
+
readonly subscribe: (listener: (event: PiSessionEvent) => void) => () => void;
|
|
11
|
+
readonly prompt: (prompt: string) => Promise<void>;
|
|
12
|
+
readonly steer: (message: string) => Promise<void>;
|
|
13
|
+
readonly abort: () => Promise<void>;
|
|
14
|
+
readonly dispose: () => void;
|
|
15
|
+
}
|
|
16
|
+
export interface PiStartOptions {
|
|
17
|
+
readonly cwd: string;
|
|
18
|
+
readonly extensions: ReadonlyArray<InlineExtension>;
|
|
19
|
+
readonly model: Option.Option<Agent.ModelId>;
|
|
20
|
+
readonly signal: AbortSignal;
|
|
21
|
+
readonly thinkingLevel: Agent.Effort;
|
|
22
|
+
readonly toolMode: "orchestration" | "repository";
|
|
23
|
+
}
|
|
24
|
+
export type PiStartResult = {
|
|
25
|
+
readonly _tag: "AuthenticationUnavailable";
|
|
26
|
+
readonly model: Agent.ModelId;
|
|
27
|
+
readonly requiredPool: PiPool;
|
|
28
|
+
} | {
|
|
29
|
+
readonly _tag: "UnsupportedAuthentication";
|
|
30
|
+
readonly authentication: Extract<PiAuthentication, {
|
|
31
|
+
readonly _tag: "OAuth";
|
|
32
|
+
}>;
|
|
33
|
+
readonly model: Agent.ModelId;
|
|
34
|
+
readonly requiredPool: PiPool;
|
|
35
|
+
} | {
|
|
36
|
+
readonly _tag: "UnknownModel";
|
|
37
|
+
} | {
|
|
38
|
+
readonly _tag: "Started";
|
|
39
|
+
readonly model: Agent.ModelId;
|
|
40
|
+
readonly pool: PiPool;
|
|
41
|
+
readonly session: PiSession;
|
|
42
|
+
};
|
|
43
|
+
/** The parent orchestrates through usine extensions; harnesses own repository tools. */
|
|
44
|
+
export declare const piParentSessionToolPolicy: {
|
|
45
|
+
readonly noTools: "builtin";
|
|
46
|
+
};
|
|
47
|
+
declare const PiSdk_base: Context.ServiceClass<PiSdk, "@usine/agents/pi/PiSdk", {
|
|
48
|
+
readonly start: (options: PiStartOptions) => Promise<PiStartResult>;
|
|
49
|
+
}>;
|
|
50
|
+
/** Narrow SDK seam keeps vendor setup testable without module replacement. */
|
|
51
|
+
export declare class PiSdk extends PiSdk_base {
|
|
52
|
+
}
|
|
53
|
+
export declare const piSdkLive: Layer.Layer<PiSdk, never, never>;
|
|
54
|
+
export interface AcquiredPiStart {
|
|
55
|
+
readonly result: PiStartResult;
|
|
56
|
+
/** Idempotent because both failed setup and the ambient scope may request cleanup. */
|
|
57
|
+
readonly dispose: () => void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Keeps SDK startup interruptible while retaining ownership until setup succeeds.
|
|
61
|
+
* A result that loses the race with interruption is disposed in its Promise
|
|
62
|
+
* continuation; a result already handed to `use` is disposed by `onExit`.
|
|
63
|
+
*/
|
|
64
|
+
export declare const usePiStart: <A, E, R, E2>(start: (signal: AbortSignal) => Promise<PiStartResult>, onError: (cause: unknown) => E, use: (acquired: AcquiredPiStart) => Effect.Effect<A, E2, R>) => Effect.Effect<A, E | E2, R>;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/pi/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/pi/sdk.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { createAgentSession, DefaultResourceLoader, getAgentDir, ModelRuntime, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { Agent } from "@usine/core";
|
|
3
|
+
import { Context, Effect, Exit, Layer, Option } from "effect";
|
|
4
|
+
import { requiredPiPool, resolvePiPool, } from "./authentication.js";
|
|
5
|
+
/** The parent orchestrates through usine extensions; harnesses own repository tools. */
|
|
6
|
+
export const piParentSessionToolPolicy = { noTools: "builtin" };
|
|
7
|
+
/** Narrow SDK seam keeps vendor setup testable without module replacement. */
|
|
8
|
+
export class PiSdk extends Context.Service()("@usine/agents/pi/PiSdk") {
|
|
9
|
+
}
|
|
10
|
+
const splitModel = (model) => {
|
|
11
|
+
const separator = model.indexOf("/");
|
|
12
|
+
return separator <= 0 || separator === model.length - 1
|
|
13
|
+
? undefined
|
|
14
|
+
: [model.slice(0, separator), model.slice(separator + 1)];
|
|
15
|
+
};
|
|
16
|
+
export const piSdkLive = Layer.succeed(PiSdk)({
|
|
17
|
+
start: async (options) => {
|
|
18
|
+
const modelRuntime = await ModelRuntime.create({ signal: options.signal });
|
|
19
|
+
let selected;
|
|
20
|
+
if (Option.isSome(options.model)) {
|
|
21
|
+
const parts = splitModel(options.model.value);
|
|
22
|
+
if (parts === undefined)
|
|
23
|
+
return { _tag: "UnknownModel" };
|
|
24
|
+
selected = modelRuntime.getModel(parts[0], parts[1]);
|
|
25
|
+
if (selected === undefined)
|
|
26
|
+
return { _tag: "UnknownModel" };
|
|
27
|
+
}
|
|
28
|
+
const agentDir = getAgentDir();
|
|
29
|
+
// The Attempt worktree is repository-controlled input: never trust its
|
|
30
|
+
// `.pi/` settings, SYSTEM.md, extensions, or skills. The subagents tool
|
|
31
|
+
// arrives as an inline factory, which the loader registers regardless.
|
|
32
|
+
const settingsManager = SettingsManager.create(options.cwd, agentDir, {
|
|
33
|
+
projectTrusted: false,
|
|
34
|
+
});
|
|
35
|
+
const resourceLoader = new DefaultResourceLoader({
|
|
36
|
+
agentDir,
|
|
37
|
+
cwd: options.cwd,
|
|
38
|
+
extensionFactories: [...options.extensions],
|
|
39
|
+
settingsManager,
|
|
40
|
+
noExtensions: true,
|
|
41
|
+
noPromptTemplates: true,
|
|
42
|
+
noSkills: true,
|
|
43
|
+
noThemes: true,
|
|
44
|
+
});
|
|
45
|
+
await resourceLoader.reload();
|
|
46
|
+
const sessionOptions = {
|
|
47
|
+
cwd: options.cwd,
|
|
48
|
+
modelRuntime,
|
|
49
|
+
resourceLoader,
|
|
50
|
+
sessionManager: SessionManager.inMemory(options.cwd),
|
|
51
|
+
settingsManager,
|
|
52
|
+
thinkingLevel: options.thinkingLevel,
|
|
53
|
+
};
|
|
54
|
+
const toolScopedSessionOptions = options.toolMode === "orchestration"
|
|
55
|
+
? { ...sessionOptions, ...piParentSessionToolPolicy }
|
|
56
|
+
: sessionOptions;
|
|
57
|
+
const { session } = selected === undefined
|
|
58
|
+
? await createAgentSession(toolScopedSessionOptions)
|
|
59
|
+
: await createAgentSession({ ...toolScopedSessionOptions, model: selected });
|
|
60
|
+
let ownershipTransferred = false;
|
|
61
|
+
try {
|
|
62
|
+
const active = session.model;
|
|
63
|
+
if (active === undefined)
|
|
64
|
+
throw new Error("Pi started without an active model");
|
|
65
|
+
const model = Agent.ModelId.make(`${active.provider}/${active.id}`);
|
|
66
|
+
const resolvedAuthentication = await modelRuntime.checkAuth(active.provider, {
|
|
67
|
+
signal: options.signal,
|
|
68
|
+
});
|
|
69
|
+
const authentication = resolvedAuthentication?.type === "api_key"
|
|
70
|
+
? { _tag: "ApiKey" }
|
|
71
|
+
: resolvedAuthentication?.type === "oauth"
|
|
72
|
+
? {
|
|
73
|
+
_tag: "OAuth",
|
|
74
|
+
subscription: modelRuntime.getProvider(active.provider)?.auth.oauth?.isSubscription === true,
|
|
75
|
+
}
|
|
76
|
+
: undefined;
|
|
77
|
+
const requiredPool = requiredPiPool(active.provider);
|
|
78
|
+
const pool = resolvePiPool(active.provider, authentication);
|
|
79
|
+
if (authentication === undefined) {
|
|
80
|
+
return { _tag: "AuthenticationUnavailable", model, requiredPool };
|
|
81
|
+
}
|
|
82
|
+
if (pool === undefined && authentication._tag === "OAuth") {
|
|
83
|
+
return {
|
|
84
|
+
_tag: "UnsupportedAuthentication",
|
|
85
|
+
authentication,
|
|
86
|
+
model,
|
|
87
|
+
requiredPool,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (pool === undefined) {
|
|
91
|
+
throw new Error("Pi could not map a configured API key to a billing pool");
|
|
92
|
+
}
|
|
93
|
+
ownershipTransferred = true;
|
|
94
|
+
return {
|
|
95
|
+
_tag: "Started",
|
|
96
|
+
model,
|
|
97
|
+
pool,
|
|
98
|
+
session,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
if (!ownershipTransferred)
|
|
103
|
+
session.dispose();
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
/**
|
|
108
|
+
* Keeps SDK startup interruptible while retaining ownership until setup succeeds.
|
|
109
|
+
* A result that loses the race with interruption is disposed in its Promise
|
|
110
|
+
* continuation; a result already handed to `use` is disposed by `onExit`.
|
|
111
|
+
*/
|
|
112
|
+
export const usePiStart = (start, onError, use) => Effect.suspend(() => {
|
|
113
|
+
let acquired;
|
|
114
|
+
let abandoned = false;
|
|
115
|
+
let pending = true;
|
|
116
|
+
const acquire = Effect.tryPromise({
|
|
117
|
+
try: (signal) => start(signal).then((result) => {
|
|
118
|
+
pending = false;
|
|
119
|
+
let disposed = false;
|
|
120
|
+
acquired = {
|
|
121
|
+
result,
|
|
122
|
+
dispose: () => {
|
|
123
|
+
if (disposed)
|
|
124
|
+
return;
|
|
125
|
+
disposed = true;
|
|
126
|
+
if (result._tag === "Started")
|
|
127
|
+
result.session.dispose();
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
if (abandoned || signal.aborted)
|
|
131
|
+
acquired.dispose();
|
|
132
|
+
return acquired;
|
|
133
|
+
}, (cause) => {
|
|
134
|
+
pending = false;
|
|
135
|
+
throw cause;
|
|
136
|
+
}),
|
|
137
|
+
catch: onError,
|
|
138
|
+
});
|
|
139
|
+
return acquire.pipe(Effect.flatMap(use), Effect.onExit((exit) => {
|
|
140
|
+
if (Exit.isSuccess(exit))
|
|
141
|
+
return Effect.void;
|
|
142
|
+
abandoned = true;
|
|
143
|
+
if (acquired?.result._tag === "Started") {
|
|
144
|
+
return Effect.logWarning("Disposing Pi session after an incomplete launch", {
|
|
145
|
+
model: acquired.result.model,
|
|
146
|
+
pool: acquired.result.pool,
|
|
147
|
+
}).pipe(Effect.andThen(Effect.sync(acquired.dispose)));
|
|
148
|
+
}
|
|
149
|
+
return pending
|
|
150
|
+
? Effect.logWarning("Pi launch ended during SDK startup; any late-created session will be disposed")
|
|
151
|
+
: Effect.void;
|
|
152
|
+
}));
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/pi/sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Agent } from "@usine/core";
|
|
2
|
+
import { Cause, Deferred, Effect, Queue } from "effect";
|
|
3
|
+
import { type AgentSessionError, SessionResult } from "../runtime.ts";
|
|
4
|
+
import type { PiMessage, PiSession } from "./sdk.ts";
|
|
5
|
+
export interface SessionChannelOptions {
|
|
6
|
+
/** Human-readable adapter name used in the terminal log lines. */
|
|
7
|
+
readonly label: string;
|
|
8
|
+
readonly sessionId: Agent.SessionId;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Terminal-once state every session adapter shares: one event queue, one
|
|
12
|
+
* result, and a latch guaranteeing exactly one terminal transition. Cleanups
|
|
13
|
+
* registered through `onTerminal` run on whichever transition wins.
|
|
14
|
+
*/
|
|
15
|
+
export interface SessionChannel {
|
|
16
|
+
readonly events: Queue.Queue<Agent.SessionEvent, AgentSessionError | Cause.Done>;
|
|
17
|
+
readonly result: Deferred.Deferred<SessionResult, AgentSessionError>;
|
|
18
|
+
readonly isTerminal: Effect.Effect<boolean>;
|
|
19
|
+
readonly onTerminal: (cleanup: () => void) => void;
|
|
20
|
+
/** Offers one event, logging instead of silently dropping it after the terminal transition. */
|
|
21
|
+
readonly emit: (event: Agent.SessionEvent) => Effect.Effect<void>;
|
|
22
|
+
readonly fail: (error: AgentSessionError) => Effect.Effect<void>;
|
|
23
|
+
readonly finish: (session: Agent.Session, message: string) => Effect.Effect<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare const sessionChannel: (options: SessionChannelOptions) => Effect.Effect<{
|
|
26
|
+
events: Queue.Queue<Agent.PoolRateLimitsUpdated | Agent.SessionFinished | Agent.SessionStarted | Agent.TextOutput | Agent.ToolFinished | Agent.ToolStarted, import("../runtime.ts").AgentResultError | 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").PoolUnavailableError | import("../runtime.ts").SessionOperationError | import("../runtime.ts").UnknownModelError | import("../runtime.ts").UnsupportedEffortError>;
|
|
28
|
+
isTerminal: Effect.Effect<boolean, never, never>;
|
|
29
|
+
onTerminal: (cleanup: () => void) => void;
|
|
30
|
+
emit: (event: Agent.SessionEvent) => Effect.Effect<void, never, never>;
|
|
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: Agent.ChildSession | Agent.ParentSession, message: string) => Effect.Effect<void, never, never>;
|
|
33
|
+
}, never, never>;
|
|
34
|
+
export declare const lastPiMessageText: (messages: ReadonlyArray<PiMessage>) => string | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Bridges the Pi SDK's synchronous subscriber onto one session channel.
|
|
37
|
+
* Normalized events reach the queue on the SDK's own tick — no async hop, so
|
|
38
|
+
* nothing can trail the prompt's resolution — while operational events with
|
|
39
|
+
* no normalized shape (retry backoffs, compactions) are logged through the
|
|
40
|
+
* launch fiber's captured services so a silent wait stays explainable.
|
|
41
|
+
*/
|
|
42
|
+
export declare const subscribePiSession: (piSession: PiSession, session: Agent.Session, channel: SessionChannel) => Effect.Effect<{
|
|
43
|
+
lastText: () => string | undefined;
|
|
44
|
+
unsubscribe: () => void;
|
|
45
|
+
}, never, never>;
|
|
46
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAe,MAAM,QAAQ,CAAC;AACrE,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,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;CACrC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACjF,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,+FAA+F;IAC/F,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CACnF;AAED,eAAO,MAAM,cAAc;;;;0BAqDD,MAAM,IAAI;kBA1Cb,KAAK,CAAC,YAAY;;;gBAiDvC,CAAC;AAyCH,eAAO,MAAM,iBAAiB,aAAc,aAAa,CAAC,SAAS,CAAC,KAAG,MAAM,GAAG,SAQ/E,CAAC;AA8BF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,cAClB,SAAS,WACX,KAAK,CAAC,OAAO,WACb,cAAc;;;gBAsDrB,CAAC"}
|