@usine/agents 0.0.1 → 0.2.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 +52 -2
- 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 +8 -0
- package/dist/pi/children.d.ts.map +1 -0
- package/dist/pi/children.js +29 -0
- package/dist/pi/children.js.map +1 -0
- package/dist/pi/claude.d.ts +36 -0
- package/dist/pi/claude.d.ts.map +1 -0
- package/dist/pi/claude.js +244 -0
- package/dist/pi/claude.js.map +1 -0
- 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 +33 -0
- package/dist/pi/codex/app-server.d.ts.map +1 -0
- package/dist/pi/codex/app-server.js +227 -0
- package/dist/pi/codex/app-server.js.map +1 -0
- package/dist/pi/codex/codex.d.ts +7 -0
- package/dist/pi/codex/codex.d.ts.map +1 -0
- package/dist/pi/codex/codex.js +362 -0
- package/dist/pi/codex/codex.js.map +1 -0
- package/dist/pi/live.d.ts +4 -0
- package/dist/pi/live.d.ts.map +1 -0
- package/dist/pi/live.js +11 -0
- package/dist/pi/live.js.map +1 -0
- package/dist/pi/pi.d.ts +9 -0
- package/dist/pi/pi.d.ts.map +1 -0
- package/dist/pi/pi.js +311 -0
- package/dist/pi/pi.js.map +1 -0
- package/dist/pi/sdk.d.ts +71 -0
- package/dist/pi/sdk.d.ts.map +1 -0
- package/dist/pi/sdk.js +159 -0
- package/dist/pi/sdk.js.map +1 -0
- package/dist/pi/session.d.ts +45 -0
- package/dist/pi/session.d.ts.map +1 -0
- package/dist/pi/session.js +179 -0
- package/dist/pi/session.js.map +1 -0
- package/dist/pi/subagents.d.ts +27 -0
- package/dist/pi/subagents.d.ts.map +1 -0
- package/dist/pi/subagents.js +113 -0
- package/dist/pi/subagents.js.map +1 -0
- 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/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 +26 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +45 -0
- package/dist/prompt.js.map +1 -0
- package/dist/protocol/codex.d.ts +70 -0
- package/dist/protocol/codex.d.ts.map +1 -0
- package/dist/protocol/codex.js +8 -0
- package/dist/protocol/codex.js.map +1 -0
- package/dist/runtime.d.ts +132 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +109 -0
- package/dist/runtime.js.map +1 -0
- package/package.json +48 -5
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -8
- package/dist/index.js.map +0 -1
package/dist/pi/sdk.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { createAgentSession, DefaultResourceLoader, getAgentDir, ModelRuntime, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { Effort, ModelId } from "@usine/core/agent/brain";
|
|
3
|
+
import { Context, Effect, Exit, Layer, Option } from "effect";
|
|
4
|
+
import { requiredPiPool, resolvePiPool, } from "./authentication.js";
|
|
5
|
+
import { supportedThinkingLevels } from "./thinking.js";
|
|
6
|
+
/** The parent works only through usine extensions; repository tools belong to the harness children. */
|
|
7
|
+
export const piParentSessionToolPolicy = { noTools: "builtin" };
|
|
8
|
+
/** Opens a Pi session with the selected model and the tools allowed for its parent or child role. */
|
|
9
|
+
export class PiSdk extends Context.Service()("@usine/agents/pi/PiSdk") {
|
|
10
|
+
}
|
|
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
|
+
export const piSdkLive = Layer.succeed(PiSdk)({
|
|
18
|
+
start: async (options) => {
|
|
19
|
+
const modelRuntime = await ModelRuntime.create({ signal: options.signal });
|
|
20
|
+
let selected;
|
|
21
|
+
if (Option.isSome(options.model)) {
|
|
22
|
+
const parts = splitModel(options.model.value);
|
|
23
|
+
if (parts === undefined)
|
|
24
|
+
return { _tag: "UnknownModel" };
|
|
25
|
+
selected = modelRuntime.getModel(parts[0], parts[1]);
|
|
26
|
+
if (selected === undefined)
|
|
27
|
+
return { _tag: "UnknownModel" };
|
|
28
|
+
}
|
|
29
|
+
const agentDir = getAgentDir();
|
|
30
|
+
// The worktree is repository-controlled input, so its `.pi/` settings,
|
|
31
|
+
// SYSTEM.md, extensions, and skills never load. The subagents tool is an
|
|
32
|
+
// inline factory, which the loader registers regardless.
|
|
33
|
+
const settingsManager = SettingsManager.create(options.cwd, agentDir, {
|
|
34
|
+
projectTrusted: false,
|
|
35
|
+
});
|
|
36
|
+
const resourceLoader = new DefaultResourceLoader({
|
|
37
|
+
agentDir,
|
|
38
|
+
cwd: options.cwd,
|
|
39
|
+
extensionFactories: [...options.extensions],
|
|
40
|
+
settingsManager,
|
|
41
|
+
noExtensions: true,
|
|
42
|
+
noPromptTemplates: true,
|
|
43
|
+
noSkills: true,
|
|
44
|
+
noThemes: true,
|
|
45
|
+
});
|
|
46
|
+
await resourceLoader.reload();
|
|
47
|
+
const sessionOptions = {
|
|
48
|
+
cwd: options.cwd,
|
|
49
|
+
modelRuntime,
|
|
50
|
+
resourceLoader,
|
|
51
|
+
sessionManager: SessionManager.inMemory(options.cwd),
|
|
52
|
+
settingsManager,
|
|
53
|
+
thinkingLevel: options.thinkingLevel,
|
|
54
|
+
};
|
|
55
|
+
const toolScopedSessionOptions = options.toolMode === "orchestration"
|
|
56
|
+
? { ...sessionOptions, ...piParentSessionToolPolicy }
|
|
57
|
+
: sessionOptions;
|
|
58
|
+
const { session } = selected === undefined
|
|
59
|
+
? await createAgentSession(toolScopedSessionOptions)
|
|
60
|
+
: await createAgentSession({ ...toolScopedSessionOptions, model: selected });
|
|
61
|
+
let ownershipTransferred = false;
|
|
62
|
+
try {
|
|
63
|
+
const active = session.model;
|
|
64
|
+
if (active === undefined)
|
|
65
|
+
throw new Error("Pi started without an active model");
|
|
66
|
+
const model = ModelId.make(`${active.provider}/${active.id}`);
|
|
67
|
+
const supported = supportedThinkingLevels(active);
|
|
68
|
+
if (!supported.includes(options.thinkingLevel)) {
|
|
69
|
+
return { _tag: "UnsupportedEffort", effort: options.thinkingLevel, model, supported };
|
|
70
|
+
}
|
|
71
|
+
const resolvedAuthentication = await modelRuntime.checkAuth(active.provider, {
|
|
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);
|
|
83
|
+
const pool = resolvePiPool(active.provider, authentication);
|
|
84
|
+
if (authentication === undefined) {
|
|
85
|
+
return { _tag: "AuthenticationUnavailable", model, requiredPool };
|
|
86
|
+
}
|
|
87
|
+
if (pool === undefined && authentication._tag === "OAuth") {
|
|
88
|
+
return {
|
|
89
|
+
_tag: "UnsupportedAuthentication",
|
|
90
|
+
authentication,
|
|
91
|
+
model,
|
|
92
|
+
requiredPool,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (pool === undefined) {
|
|
96
|
+
throw new Error("Pi could not map a configured API key to a billing pool");
|
|
97
|
+
}
|
|
98
|
+
ownershipTransferred = true;
|
|
99
|
+
return {
|
|
100
|
+
_tag: "Started",
|
|
101
|
+
model,
|
|
102
|
+
pool,
|
|
103
|
+
session,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
if (!ownershipTransferred)
|
|
108
|
+
session.dispose();
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
/**
|
|
113
|
+
* Runs SDK startup so an interruption cannot leak a session. A result that
|
|
114
|
+
* loses the race with interruption is disposed in its Promise continuation;
|
|
115
|
+
* one already handed to `use` is disposed by `onExit`.
|
|
116
|
+
*/
|
|
117
|
+
export const usePiStart = (start, onError, use) => Effect.suspend(() => {
|
|
118
|
+
let acquired;
|
|
119
|
+
let abandoned = false;
|
|
120
|
+
let pending = true;
|
|
121
|
+
const acquire = Effect.tryPromise({
|
|
122
|
+
try: (signal) => start(signal).then((result) => {
|
|
123
|
+
pending = false;
|
|
124
|
+
let disposed = false;
|
|
125
|
+
acquired = {
|
|
126
|
+
result,
|
|
127
|
+
dispose: () => {
|
|
128
|
+
if (disposed)
|
|
129
|
+
return;
|
|
130
|
+
disposed = true;
|
|
131
|
+
if (result._tag === "Started")
|
|
132
|
+
result.session.dispose();
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
if (abandoned || signal.aborted)
|
|
136
|
+
acquired.dispose();
|
|
137
|
+
return acquired;
|
|
138
|
+
}, (cause) => {
|
|
139
|
+
pending = false;
|
|
140
|
+
throw cause;
|
|
141
|
+
}),
|
|
142
|
+
catch: onError,
|
|
143
|
+
});
|
|
144
|
+
return acquire.pipe(Effect.flatMap(use), Effect.onExit((exit) => {
|
|
145
|
+
if (Exit.isSuccess(exit))
|
|
146
|
+
return Effect.void;
|
|
147
|
+
abandoned = true;
|
|
148
|
+
if (acquired?.result._tag === "Started") {
|
|
149
|
+
return Effect.logWarning("Disposing Pi session after an incomplete launch", {
|
|
150
|
+
model: acquired.result.model,
|
|
151
|
+
pool: acquired.result.pool,
|
|
152
|
+
}).pipe(Effect.andThen(Effect.sync(acquired.dispose)));
|
|
153
|
+
}
|
|
154
|
+
return pending
|
|
155
|
+
? Effect.logWarning("Pi launch ended during SDK startup; any late-created session will be disposed")
|
|
156
|
+
: Effect.void;
|
|
157
|
+
}));
|
|
158
|
+
});
|
|
159
|
+
//# 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,45 @@
|
|
|
1
|
+
import { AgentSession, AgentSessionEvent, AgentSessionId, SessionFinished, TextOutput, ToolFinished, ToolStarted } from "@usine/core/agent/session";
|
|
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
|
+
/** Adapter name printed in the terminal log lines. */
|
|
7
|
+
readonly label: string;
|
|
8
|
+
readonly sessionId: AgentSessionId;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Shared session state: one event queue, one result, and a latch so exactly
|
|
12
|
+
* one terminal transition wins. Cleanups registered through `onTerminal` run
|
|
13
|
+
* on that transition.
|
|
14
|
+
*/
|
|
15
|
+
export interface SessionChannel {
|
|
16
|
+
readonly events: Queue.Queue<AgentSessionEvent, AgentSessionError | Cause.Done>;
|
|
17
|
+
readonly result: Deferred.Deferred<SessionResult, AgentSessionError>;
|
|
18
|
+
readonly isTerminal: Effect.Effect<boolean>;
|
|
19
|
+
readonly onTerminal: (cleanup: () => void) => void;
|
|
20
|
+
/** Queues one event; after the terminal transition the event is logged and dropped. */
|
|
21
|
+
readonly emit: (event: AgentSessionEvent) => Effect.Effect<void>;
|
|
22
|
+
readonly fail: (error: AgentSessionError) => Effect.Effect<void>;
|
|
23
|
+
readonly finish: (session: AgentSession, message: string) => Effect.Effect<void>;
|
|
24
|
+
}
|
|
25
|
+
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>;
|
|
28
|
+
isTerminal: Effect.Effect<boolean, never, never>;
|
|
29
|
+
onTerminal: (cleanup: () => void) => void;
|
|
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
|
+
}, never, never>;
|
|
34
|
+
export declare const lastPiMessageText: (messages: ReadonlyArray<PiMessage>) => string | undefined;
|
|
35
|
+
/**
|
|
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.
|
|
40
|
+
*/
|
|
41
|
+
export declare const subscribePiSession: (piSession: PiSession, session: AgentSession, channel: SessionChannel) => Effect.Effect<{
|
|
42
|
+
lastText: () => string | undefined;
|
|
43
|
+
unsubscribe: () => void;
|
|
44
|
+
}, never, never>;
|
|
45
|
+
//# 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,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;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,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;;;gBAsDrB,CAAC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
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 { SessionResult } from "../runtime.js";
|
|
4
|
+
export const sessionChannel = Effect.fn("SessionChannel.make")(function* (options) {
|
|
5
|
+
const events = yield* Queue.make();
|
|
6
|
+
const result = yield* Deferred.make();
|
|
7
|
+
const terminal = yield* Ref.make(false);
|
|
8
|
+
const cleanups = [];
|
|
9
|
+
const runCleanups = Effect.sync(() => {
|
|
10
|
+
for (const cleanup of cleanups.splice(0))
|
|
11
|
+
cleanup();
|
|
12
|
+
});
|
|
13
|
+
const emit = (event) => Queue.offer(events, event).pipe(Effect.flatMap((accepted) => accepted
|
|
14
|
+
? Effect.void
|
|
15
|
+
: Effect.logWarning(`${options.label} dropped an event after the terminal transition`, {
|
|
16
|
+
event: event._tag,
|
|
17
|
+
sessionId: options.sessionId,
|
|
18
|
+
})));
|
|
19
|
+
const fail = Effect.fn("SessionChannel.fail")(function* (error) {
|
|
20
|
+
if (yield* Ref.getAndSet(terminal, true))
|
|
21
|
+
return;
|
|
22
|
+
yield* Effect.logError(`${options.label} failed`, {
|
|
23
|
+
errorTag: error._tag,
|
|
24
|
+
message: error.message,
|
|
25
|
+
sessionId: options.sessionId,
|
|
26
|
+
});
|
|
27
|
+
yield* Deferred.fail(result, error);
|
|
28
|
+
yield* Queue.fail(events, error);
|
|
29
|
+
yield* runCleanups;
|
|
30
|
+
});
|
|
31
|
+
const finish = Effect.fn("SessionChannel.finish")(function* (session, message) {
|
|
32
|
+
if (yield* Ref.getAndSet(terminal, true))
|
|
33
|
+
return;
|
|
34
|
+
yield* Queue.offer(events, new SessionFinished({ session }));
|
|
35
|
+
yield* Deferred.succeed(result, new SessionResult({ message }));
|
|
36
|
+
yield* Queue.end(events);
|
|
37
|
+
yield* runCleanups;
|
|
38
|
+
yield* Effect.logInfo(`${options.label} finished`, {
|
|
39
|
+
sessionId: options.sessionId,
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
events,
|
|
44
|
+
result,
|
|
45
|
+
isTerminal: Ref.get(terminal),
|
|
46
|
+
onTerminal: (cleanup) => {
|
|
47
|
+
cleanups.push(cleanup);
|
|
48
|
+
},
|
|
49
|
+
emit,
|
|
50
|
+
fail,
|
|
51
|
+
finish,
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
const PiAssistantMessage = Schema.Struct({
|
|
55
|
+
role: Schema.Literal("assistant"),
|
|
56
|
+
content: Schema.Union([Schema.String, Schema.Array(Schema.Json)]),
|
|
57
|
+
});
|
|
58
|
+
const PiTextBlock = Schema.Struct({
|
|
59
|
+
type: Schema.Literal("text"),
|
|
60
|
+
text: Schema.String,
|
|
61
|
+
});
|
|
62
|
+
const decodeSerializedJson = Schema.decodeUnknownSync(Schema.fromJsonString(Schema.Json));
|
|
63
|
+
const toolInputJson = (event) => {
|
|
64
|
+
try {
|
|
65
|
+
return decodeSerializedJson(JSON.stringify(event.args) ?? "null");
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return String(event.args);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const toolOutputJson = (event) => {
|
|
72
|
+
try {
|
|
73
|
+
return decodeSerializedJson(JSON.stringify(event.result) ?? "null");
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return String(event.result);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const messageText = (message) => {
|
|
80
|
+
if (!Schema.is(PiAssistantMessage)(message))
|
|
81
|
+
return undefined;
|
|
82
|
+
if (Schema.is(Schema.String)(message.content))
|
|
83
|
+
return message.content.trim() || undefined;
|
|
84
|
+
const text = message.content
|
|
85
|
+
.filter(Schema.is(PiTextBlock))
|
|
86
|
+
.map(({ text }) => text)
|
|
87
|
+
.join("")
|
|
88
|
+
.trim();
|
|
89
|
+
return text || undefined;
|
|
90
|
+
};
|
|
91
|
+
export const lastPiMessageText = (messages) => {
|
|
92
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
93
|
+
const message = messages[index];
|
|
94
|
+
if (message === undefined)
|
|
95
|
+
continue;
|
|
96
|
+
const text = messageText(message);
|
|
97
|
+
if (text !== undefined)
|
|
98
|
+
return text;
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
};
|
|
102
|
+
const sessionEventFrom = (event, session) => {
|
|
103
|
+
if (event.type === "message_end") {
|
|
104
|
+
const text = messageText(event.message);
|
|
105
|
+
return text === undefined ? undefined : new TextOutput({ session, text });
|
|
106
|
+
}
|
|
107
|
+
if (event.type === "tool_execution_start") {
|
|
108
|
+
return new ToolStarted({
|
|
109
|
+
session,
|
|
110
|
+
callId: event.toolCallId,
|
|
111
|
+
tool: event.toolName,
|
|
112
|
+
input: toolInputJson(event),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (event.type === "tool_execution_end") {
|
|
116
|
+
return new ToolFinished({
|
|
117
|
+
session,
|
|
118
|
+
callId: event.toolCallId,
|
|
119
|
+
tool: event.toolName,
|
|
120
|
+
output: toolOutputJson(event),
|
|
121
|
+
isError: event.isError,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return undefined;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Subscribes the Pi SDK's synchronous listener to one session channel.
|
|
128
|
+
* Normalized events reach the queue on the SDK's own tick so none can trail
|
|
129
|
+
* the prompt's resolution; operational events with no normalized shape (retry
|
|
130
|
+
* backoffs, compactions) are logged so a silent wait stays explainable.
|
|
131
|
+
*/
|
|
132
|
+
export const subscribePiSession = (piSession, session, channel) => Effect.gen(function* () {
|
|
133
|
+
const context = yield* Effect.context();
|
|
134
|
+
const log = Effect.runForkWith(context);
|
|
135
|
+
let lastText;
|
|
136
|
+
const unsubscribe = piSession.subscribe((event) => {
|
|
137
|
+
if (event.type === "auto_retry_start") {
|
|
138
|
+
log(Effect.logWarning("Pi session is backing off before a retry", {
|
|
139
|
+
attempt: event.attempt,
|
|
140
|
+
delayMillis: event.delayMs,
|
|
141
|
+
errorMessage: event.errorMessage,
|
|
142
|
+
maxAttempts: event.maxAttempts,
|
|
143
|
+
sessionId: session.id,
|
|
144
|
+
}));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (event.type === "auto_retry_end") {
|
|
148
|
+
log(Effect.logInfo("Pi session finished retrying", {
|
|
149
|
+
attempt: event.attempt,
|
|
150
|
+
finalError: event.finalError,
|
|
151
|
+
sessionId: session.id,
|
|
152
|
+
success: event.success,
|
|
153
|
+
}));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (event.type === "compaction_start" || event.type === "compaction_end") {
|
|
157
|
+
log(Effect.logInfo("Pi session context compaction", {
|
|
158
|
+
phase: event.type,
|
|
159
|
+
reason: event.reason,
|
|
160
|
+
sessionId: session.id,
|
|
161
|
+
}));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const sessionEvent = sessionEventFrom(event, session);
|
|
165
|
+
if (sessionEvent === undefined)
|
|
166
|
+
return;
|
|
167
|
+
if (sessionEvent._tag === "TextOutput")
|
|
168
|
+
lastText = sessionEvent.text;
|
|
169
|
+
if (!Queue.offerUnsafe(channel.events, sessionEvent)) {
|
|
170
|
+
log(Effect.logWarning("Dropped a Pi session event after the terminal transition", {
|
|
171
|
+
event: sessionEvent._tag,
|
|
172
|
+
sessionId: session.id,
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
channel.onTerminal(unsubscribe);
|
|
177
|
+
return { lastText: () => lastText, unsubscribe };
|
|
178
|
+
});
|
|
179
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type ExtensionFactory, type InlineExtension } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { Agent } from "@usine/core/agent";
|
|
3
|
+
import { AgentSessionEvent, AgentSessionId, ChildSessionBudget } from "@usine/core/agent/session";
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { type AgentSessionError, type ChildBackend, ChildSessionBudgetExceededError, type WorkingDirectory } from "../runtime.ts";
|
|
6
|
+
export interface SubagentsExtensionOptions {
|
|
7
|
+
readonly agent: Agent;
|
|
8
|
+
readonly backend: ChildBackend["Service"];
|
|
9
|
+
readonly cwd: WorkingDirectory;
|
|
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
|
+
/**
|
|
16
|
+
* Runs one child program on the parent launch's services and scope. Pi
|
|
17
|
+
* calls the tool outside any usine fiber, so the default runtime would lose
|
|
18
|
+
* the stderr log redirect (corrupting the protocol stdout) and detach the
|
|
19
|
+
* child from the Attempt's lifetime.
|
|
20
|
+
*/
|
|
21
|
+
readonly run: <A>(program: Effect.Effect<A, AgentSessionError>) => Promise<A>;
|
|
22
|
+
}
|
|
23
|
+
/** Builds the subagents extension; its single tool creates first-level child sessions only. */
|
|
24
|
+
export declare const createSubagentsExtension: (options: SubagentsExtensionOptions) => ExtensionFactory;
|
|
25
|
+
/** Names the extension so Pi startup diagnostics can identify it. */
|
|
26
|
+
export declare const subagentsExtension: (options: SubagentsExtensionOptions) => InlineExtension;
|
|
27
|
+
//# sourceMappingURL=subagents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,EAEnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,MAAM,EAAiB,MAAM,QAAQ,CAAC;AAG/C,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAEjB,+BAA+B,EAC/B,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;;;;;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,gBAkG7E,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,YAAa,yBAAyB,KAAG,eAGtE,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { defineTool, } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { Agent } from "@usine/core/agent";
|
|
3
|
+
import { AgentSessionEvent, AgentSessionId, ChildSession, ChildSessionBudget, ChildSessionCount, } from "@usine/core/agent/session";
|
|
4
|
+
import { Effect, Fiber, Stream } from "effect";
|
|
5
|
+
import { Type } from "typebox";
|
|
6
|
+
import { assembleChildPrompt } from "../prompt.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
|
+
};
|
|
15
|
+
const interrupted = (signal, sessionId) => signal === undefined
|
|
16
|
+
? Effect.logWarning("Pi supplied no abort signal; the child outlives only its scope", {
|
|
17
|
+
sessionId,
|
|
18
|
+
}).pipe(Effect.andThen(Effect.never))
|
|
19
|
+
: Effect.callback((resume) => {
|
|
20
|
+
const onAbort = () => resume(Effect.void);
|
|
21
|
+
if (signal.aborted)
|
|
22
|
+
onAbort();
|
|
23
|
+
else
|
|
24
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
25
|
+
return Effect.sync(() => signal.removeEventListener("abort", onAbort));
|
|
26
|
+
});
|
|
27
|
+
/** Builds the subagents extension; its single tool creates first-level child sessions only. */
|
|
28
|
+
export const createSubagentsExtension = (options) => {
|
|
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
|
+
const forward = yield* child.events.pipe(Stream.runForEach(options.emit), Effect.forkScoped);
|
|
78
|
+
const result = yield* Effect.raceFirst(child.result, interrupted(signal, request.session.id).pipe(Effect.andThen(child.interrupt), Effect.andThen(Effect.interrupt)));
|
|
79
|
+
yield* Fiber.join(forward);
|
|
80
|
+
yield* Effect.logInfo("Child session returned to Pi parent", {
|
|
81
|
+
sessionId: request.session.id,
|
|
82
|
+
});
|
|
83
|
+
const report = {
|
|
84
|
+
content: [{ type: "text", text: result.message }],
|
|
85
|
+
details: { childSessionId: request.session.id },
|
|
86
|
+
};
|
|
87
|
+
onUpdate?.(report);
|
|
88
|
+
return report;
|
|
89
|
+
}, Effect.scoped);
|
|
90
|
+
return (pi) => {
|
|
91
|
+
pi.registerTool(defineTool({
|
|
92
|
+
name: "subagent",
|
|
93
|
+
label: "Subagent",
|
|
94
|
+
description: "Delegate one focused task to the configured isolated child agent and wait for its report.",
|
|
95
|
+
promptSnippet: "Delegate a focused task to an isolated child agent.",
|
|
96
|
+
promptGuidelines: [
|
|
97
|
+
"Delegate only independent, focused work; the child cannot create more children.",
|
|
98
|
+
],
|
|
99
|
+
parameters: Type.Object({ task: Type.String({ minLength: 1 }) }, { additionalProperties: false }),
|
|
100
|
+
executionMode: "parallel",
|
|
101
|
+
execute: (_toolCallId, params, signal, onUpdate) => {
|
|
102
|
+
childNumber += 1;
|
|
103
|
+
return options.run(spawn(ChildSessionCount.make(childNumber), params.task, signal, onUpdate));
|
|
104
|
+
},
|
|
105
|
+
}));
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
/** Names the extension so Pi startup diagnostics can identify it. */
|
|
109
|
+
export const subagentsExtension = (options) => ({
|
|
110
|
+
name: "usine-subagents",
|
|
111
|
+
factory: createSubagentsExtension(options),
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=subagents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,7 @@
|
|
|
1
|
+
import { HarnessUnavailableError } from "@usine/core/agent/capability";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { ChildProcessSpawner } from "effect/unstable/process";
|
|
4
|
+
import { SessionOperationError } from "../runtime.ts";
|
|
5
|
+
/** Runs a bounded readiness command without retaining its potentially sensitive diagnostics. */
|
|
6
|
+
export declare const probeCommand: (harness: "claude" | "codex" | "pi", capability: "binary" | "login" | "version", command: string, args: readonly string[]) => Effect.Effect<string, HarnessUnavailableError | SessionOperationError, ChildProcessSpawner.ChildProcessSpawner>;
|
|
7
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/preflight/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAA0B,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAgB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,gGAAgG;AAChG,eAAO,MAAM,YAAY,+OAmDvB,CAAC"}
|