@rivet-dev/pi 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/dist/actions.d.ts +81 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +116 -0
- package/dist/actions.js.map +1 -0
- package/dist/actor.d.ts +24 -0
- package/dist/actor.d.ts.map +1 -0
- package/dist/actor.js +113 -0
- package/dist/actor.js.map +1 -0
- package/dist/credentials.d.ts +55 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +77 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/models.d.ts +74 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +111 -0
- package/dist/models.js.map +1 -0
- package/dist/runtime.d.ts +64 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +287 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sandbox.d.ts +21 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +185 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/storage.d.ts +39 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +87 -0
- package/dist/storage.js.map +1 -0
- package/dist/tracing.d.ts +10 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +39 -0
- package/dist/tracing.js.map +1 -0
- package/package.json +48 -0
package/dist/models.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { ModelRuntime, } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { UserError } from "rivetkit";
|
|
3
|
+
/**
|
|
4
|
+
* Creates the model runtime for one actor generation. It never reads Pi's
|
|
5
|
+
* `~/.pi/agent/auth.json` or `models.json`; credentials come from `apiKeys`,
|
|
6
|
+
* then `credentials`, then the server environment.
|
|
7
|
+
*/
|
|
8
|
+
export async function createActorModelRuntime(options, credentials) {
|
|
9
|
+
const runtime = await ModelRuntime.create({ credentials, modelsPath: null });
|
|
10
|
+
for (const [providerId, config] of Object.entries(options.providers ?? {})) {
|
|
11
|
+
runtime.registerProvider(providerId, config);
|
|
12
|
+
}
|
|
13
|
+
for (const [providerId, apiKey] of Object.entries(options.apiKeys ?? {})) {
|
|
14
|
+
await runtime.setRuntimeApiKey(providerId, apiKey);
|
|
15
|
+
}
|
|
16
|
+
await runtime.refresh({ allowNetwork: false });
|
|
17
|
+
return runtime;
|
|
18
|
+
}
|
|
19
|
+
/** A credential store that holds nothing and refuses writes. */
|
|
20
|
+
export const emptyCredentialStore = {
|
|
21
|
+
read: async () => undefined,
|
|
22
|
+
list: async () => [],
|
|
23
|
+
modify: async (providerId, fn) => {
|
|
24
|
+
const next = await fn(undefined);
|
|
25
|
+
if (next !== undefined) {
|
|
26
|
+
throw new Error(`pi actor has no credential storage for ${providerId}; configure pi({ credentials })`);
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
},
|
|
30
|
+
delete: async () => { },
|
|
31
|
+
};
|
|
32
|
+
/** The models a client may switch to: `scopedModels`, or only `model`. */
|
|
33
|
+
function allowedModels(options) {
|
|
34
|
+
return options.scopedModels ?? (options.model ? [options.model] : []);
|
|
35
|
+
}
|
|
36
|
+
function isAllowed(options, provider, modelId) {
|
|
37
|
+
return allowedModels(options).includes(`${provider}/${modelId}`);
|
|
38
|
+
}
|
|
39
|
+
/** Looks up a `provider/modelId` in the actor's catalog. */
|
|
40
|
+
function catalogModel(runtime, name) {
|
|
41
|
+
const slash = name.indexOf("/");
|
|
42
|
+
const model = slash > 0 ? runtime.getModel(name.slice(0, slash), name.slice(slash + 1)) : undefined;
|
|
43
|
+
if (!model) {
|
|
44
|
+
throw new Error(`pi() model ${name} is not in Pi's model catalog; add it with providers`);
|
|
45
|
+
}
|
|
46
|
+
return model;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The model a session opens with: the model saved in the session when it is
|
|
50
|
+
* still allowed, otherwise the configured default. Undefined lets Pi choose,
|
|
51
|
+
* which only happens when no model is configured.
|
|
52
|
+
*/
|
|
53
|
+
export function openingModel(options, runtime, saved) {
|
|
54
|
+
if (saved && isAllowed(options, saved.provider, saved.modelId)) {
|
|
55
|
+
const model = runtime.getModel(saved.provider, saved.modelId);
|
|
56
|
+
if (model)
|
|
57
|
+
return model;
|
|
58
|
+
}
|
|
59
|
+
const fallback = options.model ?? allowedModels(options)[0];
|
|
60
|
+
return fallback ? catalogModel(runtime, fallback) : undefined;
|
|
61
|
+
}
|
|
62
|
+
/** Allowed models that have a credential, for a client's model picker. */
|
|
63
|
+
export function availableModels(options, session) {
|
|
64
|
+
return session.modelRuntime
|
|
65
|
+
.getAvailableSnapshot()
|
|
66
|
+
.filter((model) => isAllowed(options, model.provider, model.id))
|
|
67
|
+
.map((model) => ({
|
|
68
|
+
provider: model.provider,
|
|
69
|
+
id: model.id,
|
|
70
|
+
name: model.name,
|
|
71
|
+
reasoning: model.reasoning,
|
|
72
|
+
input: model.input,
|
|
73
|
+
contextWindow: model.contextWindow,
|
|
74
|
+
maxTokens: model.maxTokens,
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
/** Throws `model_unavailable` when the session's model has no credential, for example after a logout. */
|
|
78
|
+
export function requireCredential(session) {
|
|
79
|
+
const model = session.model;
|
|
80
|
+
if (!model)
|
|
81
|
+
return;
|
|
82
|
+
const available = session.modelRuntime
|
|
83
|
+
.getAvailableSnapshot()
|
|
84
|
+
.some((candidate) => candidate.provider === model.provider && candidate.id === model.id);
|
|
85
|
+
if (!available) {
|
|
86
|
+
throw new UserError(`No credential is configured for ${model.provider}/${model.id}.`, {
|
|
87
|
+
code: "model_unavailable",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Switches the session to an allowed model. The model object comes from the
|
|
93
|
+
* runtime's catalog, so a client can never choose the URL a key is sent to.
|
|
94
|
+
*/
|
|
95
|
+
export async function switchModel(options, session, provider, modelId) {
|
|
96
|
+
if (!isAllowed(options, provider, modelId)) {
|
|
97
|
+
throw new UserError(`Model ${provider}/${modelId} is not allowed for this agent.`, {
|
|
98
|
+
code: "model_not_allowed",
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const model = session.modelRuntime
|
|
102
|
+
.getAvailableSnapshot()
|
|
103
|
+
.find((candidate) => candidate.provider === provider && candidate.id === modelId);
|
|
104
|
+
if (!model) {
|
|
105
|
+
throw new UserError(`No credential is configured for ${provider}/${modelId}.`, {
|
|
106
|
+
code: "model_unavailable",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
await session.setModel(model);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type AgentSession, type BashOperations, type CreateAgentSessionOptions, SettingsManager } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { Sandbox, SandboxProvider } from "@rivet-dev/sandbox-adapter";
|
|
3
|
+
import type { ActorContext } from "rivetkit";
|
|
4
|
+
import type { DatabaseProvider, RawAccess } from "rivetkit/db";
|
|
5
|
+
import { SourceCredentialStore } from "./credentials.js";
|
|
6
|
+
import { type PiModelOptions } from "./models.js";
|
|
7
|
+
import { type PiSettings } from "./storage.js";
|
|
8
|
+
export type PiDatabaseProvider = DatabaseProvider<RawAccess>;
|
|
9
|
+
/** The actor context shape every Pi helper works against. */
|
|
10
|
+
export type PiContext = ActorContext<any, any, any, any, any, PiDatabaseProvider, any, any>;
|
|
11
|
+
/** Pi options accepted by `pi()` on top of ordinary actor config. */
|
|
12
|
+
export interface PiSessionOptions extends Omit<CreateAgentSessionOptions, "sessionManager" | "settingsManager" | "modelRuntime" | "model" | "scopedModels">, PiModelOptions {
|
|
13
|
+
/** Initial Pi settings for a brand-new session. Later changes persist per actor. */
|
|
14
|
+
settings?: Partial<PiSettings>;
|
|
15
|
+
/**
|
|
16
|
+
* Runs Pi's built-in file and shell tools in a sandbox. Without one, Pi has
|
|
17
|
+
* no file or shell tools and only the `customTools` passed in.
|
|
18
|
+
*/
|
|
19
|
+
sandbox?: SandboxProvider;
|
|
20
|
+
}
|
|
21
|
+
/** One open Pi session for a live actor generation. */
|
|
22
|
+
export interface PiSession {
|
|
23
|
+
session: AgentSession;
|
|
24
|
+
settingsManager: SettingsManager;
|
|
25
|
+
cwd: string;
|
|
26
|
+
sandbox: ConnectedSandbox | undefined;
|
|
27
|
+
/** Command execution for `executeBash`. Undefined when there is no sandbox. */
|
|
28
|
+
bashOperations: BashOperations | undefined;
|
|
29
|
+
/** JSON of the settings last written to SQLite, to skip no-op writes. */
|
|
30
|
+
persistedSettings: string;
|
|
31
|
+
/** Entries (header excluded) already written to SQLite, in Pi's append order. */
|
|
32
|
+
persistedEntryCount: number;
|
|
33
|
+
/** The application's credentials, when `pi({ credentials })` is set. */
|
|
34
|
+
credentials: SourceCredentialStore | undefined;
|
|
35
|
+
}
|
|
36
|
+
/** The sandbox a session's tools run in for this actor generation. */
|
|
37
|
+
export interface ConnectedSandbox {
|
|
38
|
+
provider: SandboxProvider;
|
|
39
|
+
id: string;
|
|
40
|
+
sandbox: Sandbox;
|
|
41
|
+
}
|
|
42
|
+
/** Per-actor-generation runtime state, stored on `c.vars` under `PI_RUNTIME`. */
|
|
43
|
+
export interface PiRuntime {
|
|
44
|
+
ready?: Promise<PiSession>;
|
|
45
|
+
/** Serializes SQLite entry writes so entries keep their append order. Never rejects. */
|
|
46
|
+
writes: Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
export declare const PI_RUNTIME: unique symbol;
|
|
49
|
+
export declare function createPiRuntime(): PiRuntime;
|
|
50
|
+
export declare function piRuntime(c: PiContext): PiRuntime;
|
|
51
|
+
/** Returns the actor's Pi session, opening it from SQLite on first use. */
|
|
52
|
+
export declare function ensurePiSession(c: PiContext, options: PiSessionOptions): Promise<PiSession>;
|
|
53
|
+
/**
|
|
54
|
+
* Queues entries appended since the last flush and writes Pi's mutable settings
|
|
55
|
+
* when they changed. Called after every action and on shutdown.
|
|
56
|
+
*/
|
|
57
|
+
export declare function persistPiState(c: PiContext, handle: PiSession): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Stops the Pi session for this actor generation: aborts any run, lets
|
|
60
|
+
* extensions shut down, and flushes settings and entries. Then suspends the
|
|
61
|
+
* sandbox on sleep, or destroys it on destroy.
|
|
62
|
+
*/
|
|
63
|
+
export declare function closePiSession(c: PiContext, options: PiSessionOptions, reason: "sleep" | "destroy"): Promise<void>;
|
|
64
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,YAAY,EAEjB,KAAK,cAAc,EAEnB,KAAK,yBAAyB,EAI9B,eAAe,EACf,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAIN,KAAK,cAAc,EACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAKN,KAAK,UAAU,EAKf,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;AAE7D,6DAA6D;AAC7D,MAAM,MAAM,SAAS,GAAG,YAAY,CACnC,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,EACH,kBAAkB,EAClB,GAAG,EACH,GAAG,CACH,CAAC;AAEF,qEAAqE;AACrE,MAAM,WAAW,gBAChB,SAAQ,IAAI,CACV,yBAAyB,EACzB,gBAAgB,GAAG,iBAAiB,GAAG,cAAc,GAAG,OAAO,GAAG,cAAc,CAChF,EACD,cAAc;IACf,oFAAoF;IACpF,QAAQ,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/B;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,uDAAuD;AACvD,MAAM,WAAW,SAAS;IACzB,OAAO,EAAE,YAAY,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACtC,+EAA+E;IAC/E,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3C,yEAAyE;IACzE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,WAAW,EAAE,qBAAqB,GAAG,SAAS,CAAC;CAC/C;AAED,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,eAAe,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,WAAW,SAAS;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3B,wFAAwF;IACxF,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED,eAAO,MAAM,UAAU,EAAE,OAAO,MAA4C,CAAC;AAE7E,wBAAgB,eAAe,IAAI,SAAS,CAE3C;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,CAUjD;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAC9B,CAAC,EAAE,SAAS,EACZ,OAAO,EAAE,gBAAgB,GACvB,OAAO,CAAC,SAAS,CAAC,CASpB;AAqOD;;;GAGG;AACH,wBAAsB,cAAc,CACnC,CAAC,EAAE,SAAS,EACZ,MAAM,EAAE,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CACnC,CAAC,EAAE,SAAS,EACZ,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,OAAO,GAAG,SAAS,GACzB,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { isAbsolute } from "node:path";
|
|
2
|
+
import { createAgentSession, DefaultResourceLoader, getAgentDir, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import { SourceCredentialStore } from "./credentials.js";
|
|
4
|
+
import { createActorModelRuntime, emptyCredentialStore, openingModel, } from "./models.js";
|
|
5
|
+
import { createSandboxBashOperations, createSandboxTools } from "./sandbox.js";
|
|
6
|
+
import { appendPiEntry, createPiSession, loadPiSandbox, loadPiSession, savePiSandbox, savePiSettings, toFileEntries, } from "./storage.js";
|
|
7
|
+
export const PI_RUNTIME = Symbol.for("@rivet-dev/pi/runtime");
|
|
8
|
+
export function createPiRuntime() {
|
|
9
|
+
return { writes: Promise.resolve() };
|
|
10
|
+
}
|
|
11
|
+
export function piRuntime(c) {
|
|
12
|
+
const runtime = c.vars?.[PI_RUNTIME];
|
|
13
|
+
if (!runtime) {
|
|
14
|
+
throw new Error("pi() runtime state is missing from actor vars; this actor was not created with pi()");
|
|
15
|
+
}
|
|
16
|
+
return runtime;
|
|
17
|
+
}
|
|
18
|
+
/** Returns the actor's Pi session, opening it from SQLite on first use. */
|
|
19
|
+
export function ensurePiSession(c, options) {
|
|
20
|
+
const runtime = piRuntime(c);
|
|
21
|
+
if (!runtime.ready) {
|
|
22
|
+
runtime.ready = openPiSession(c, runtime, options).catch((error) => {
|
|
23
|
+
runtime.ready = undefined;
|
|
24
|
+
throw error;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return runtime.ready;
|
|
28
|
+
}
|
|
29
|
+
/** Pi's built-in tools, which all run on the actor host. */
|
|
30
|
+
const PI_BUILT_IN_TOOLS = ["read", "bash", "powershell", "edit", "write", "grep", "find", "ls"];
|
|
31
|
+
async function openPiSession(c, runtime, options) {
|
|
32
|
+
const { settings, sandbox: sandboxProvider, providers, apiKeys, model, scopedModels, credentials: credentialSource, ...sessionOptions } = options;
|
|
33
|
+
const stored = await loadPiSession(c.db);
|
|
34
|
+
const connected = sandboxProvider
|
|
35
|
+
? await connectSandbox(c, sandboxProvider)
|
|
36
|
+
: undefined;
|
|
37
|
+
const sandbox = connected?.sandbox;
|
|
38
|
+
const cwd = sandbox?.cwd ?? stored?.cwd ?? sessionOptions.cwd ?? process.cwd();
|
|
39
|
+
if (!isAbsolute(cwd)) {
|
|
40
|
+
throw new Error(`pi() cwd must be an absolute path, received ${cwd}`);
|
|
41
|
+
}
|
|
42
|
+
if (stored && stored.cwd !== cwd) {
|
|
43
|
+
c.log.warn({
|
|
44
|
+
msg: "pi session cwd changed since it was stored",
|
|
45
|
+
storedCwd: stored.cwd,
|
|
46
|
+
cwd,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const settingsManager = SettingsManager.inMemory(stored?.settings ?? settings ?? {});
|
|
50
|
+
const sessionManager = stored
|
|
51
|
+
? SessionManager.inMemory(cwd, undefined, toFileEntries(stored))
|
|
52
|
+
: SessionManager.inMemory(cwd);
|
|
53
|
+
const credentials = credentialSource
|
|
54
|
+
? new SourceCredentialStore(credentialSource(c))
|
|
55
|
+
: undefined;
|
|
56
|
+
const modelRuntime = await createActorModelRuntime({ providers, apiKeys }, credentials ?? emptyCredentialStore);
|
|
57
|
+
const resourceLoader = sessionOptions.resourceLoader ??
|
|
58
|
+
(await isolatedResourceLoader(cwd, sessionOptions.agentDir, settingsManager));
|
|
59
|
+
const { session, modelFallbackMessage } = await createAgentSession({
|
|
60
|
+
...sessionOptions,
|
|
61
|
+
cwd,
|
|
62
|
+
modelRuntime,
|
|
63
|
+
model: openingModel({ model, scopedModels }, modelRuntime, sessionManager.buildSessionContext().model),
|
|
64
|
+
settingsManager,
|
|
65
|
+
sessionManager,
|
|
66
|
+
resourceLoader,
|
|
67
|
+
customTools: sandbox
|
|
68
|
+
? [...(sessionOptions.customTools ?? []), ...createSandboxTools(sandbox)]
|
|
69
|
+
: sessionOptions.customTools,
|
|
70
|
+
excludeTools: [
|
|
71
|
+
...new Set([
|
|
72
|
+
...(sessionOptions.excludeTools ?? []),
|
|
73
|
+
...(sandbox ? ["powershell"] : PI_BUILT_IN_TOOLS),
|
|
74
|
+
]),
|
|
75
|
+
],
|
|
76
|
+
});
|
|
77
|
+
if (modelFallbackMessage) {
|
|
78
|
+
c.log.warn({ msg: "pi model fallback", detail: modelFallbackMessage });
|
|
79
|
+
}
|
|
80
|
+
const handle = {
|
|
81
|
+
session,
|
|
82
|
+
settingsManager,
|
|
83
|
+
cwd,
|
|
84
|
+
sandbox: connected,
|
|
85
|
+
bashOperations: sandbox ? createSandboxBashOperations(sandbox) : undefined,
|
|
86
|
+
persistedSettings: JSON.stringify(settingsManager.getGlobalSettings()),
|
|
87
|
+
persistedEntryCount: stored?.entries.length ?? 0,
|
|
88
|
+
credentials,
|
|
89
|
+
};
|
|
90
|
+
if (!stored) {
|
|
91
|
+
const header = sessionManager.getHeader();
|
|
92
|
+
if (!header) {
|
|
93
|
+
throw new Error("Pi did not create a session header");
|
|
94
|
+
}
|
|
95
|
+
await createPiSession(c.db, {
|
|
96
|
+
header,
|
|
97
|
+
cwd,
|
|
98
|
+
settings: JSON.parse(handle.persistedSettings),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
await flushPiEntries(c, runtime, handle);
|
|
102
|
+
session.subscribe((event) => {
|
|
103
|
+
broadcastSessionEvent(c, event);
|
|
104
|
+
if (!isStreamingDelta(event)) {
|
|
105
|
+
flushPiEntries(c, runtime, handle).catch((error) => {
|
|
106
|
+
c.log.error({
|
|
107
|
+
msg: "pi session entry write failed, retrying on the next flush",
|
|
108
|
+
error,
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
c.log.info({
|
|
114
|
+
msg: "pi session opened",
|
|
115
|
+
sessionId: session.sessionId,
|
|
116
|
+
restored: stored !== undefined,
|
|
117
|
+
entryCount: sessionManager.getEntries().length,
|
|
118
|
+
messageCount: session.messages.length,
|
|
119
|
+
});
|
|
120
|
+
return handle;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Connects to the actor's sandbox, creating one when none is stored or the
|
|
124
|
+
* provider reports the stored one no longer exists. A new sandbox id is saved
|
|
125
|
+
* as soon as `create` returns, so a failure later in the start reuses it. Any
|
|
126
|
+
* other connect failure is thrown, so a temporary outage never replaces a
|
|
127
|
+
* sandbox.
|
|
128
|
+
*/
|
|
129
|
+
async function connectSandbox(c, provider) {
|
|
130
|
+
const existing = await loadPiSandbox(c.db);
|
|
131
|
+
if (existing && existing.provider !== provider.name) {
|
|
132
|
+
throw new Error(`pi sandbox was created by provider ${existing.provider}, but the actor now uses ${provider.name}`);
|
|
133
|
+
}
|
|
134
|
+
if (existing) {
|
|
135
|
+
const sandbox = await provider.connect(c, existing.id);
|
|
136
|
+
if (sandbox)
|
|
137
|
+
return { provider, id: existing.id, sandbox };
|
|
138
|
+
c.log.warn({
|
|
139
|
+
msg: "pi sandbox no longer exists, creating a new one; files from the previous sandbox are lost",
|
|
140
|
+
provider: provider.name,
|
|
141
|
+
sandboxId: existing.id,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const id = await provider.create(c);
|
|
145
|
+
await savePiSandbox(c.db, { provider: provider.name, id });
|
|
146
|
+
const sandbox = await provider.connect(c, id);
|
|
147
|
+
if (!sandbox) {
|
|
148
|
+
throw new Error(`pi sandbox ${provider.name}/${id} was not found right after it was created`);
|
|
149
|
+
}
|
|
150
|
+
return { provider, id, sandbox };
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Pi's resource discovery reads the actor host's filesystem and loads host
|
|
154
|
+
* code as extensions. Extensions, skills, prompt templates, context files, and
|
|
155
|
+
* themes stay off unless the developer passes a loader.
|
|
156
|
+
*/
|
|
157
|
+
async function isolatedResourceLoader(cwd, agentDir, settingsManager) {
|
|
158
|
+
const loader = new DefaultResourceLoader({
|
|
159
|
+
cwd,
|
|
160
|
+
agentDir: agentDir ?? getAgentDir(),
|
|
161
|
+
settingsManager,
|
|
162
|
+
noExtensions: true,
|
|
163
|
+
noSkills: true,
|
|
164
|
+
noPromptTemplates: true,
|
|
165
|
+
noContextFiles: true,
|
|
166
|
+
noThemes: true,
|
|
167
|
+
});
|
|
168
|
+
await loader.reload();
|
|
169
|
+
return loader;
|
|
170
|
+
}
|
|
171
|
+
/** Token and output deltas never append entries, so they skip the entry diff. */
|
|
172
|
+
function isStreamingDelta(event) {
|
|
173
|
+
return (event.type === "message_update" ||
|
|
174
|
+
event.type === "tool_execution_update" ||
|
|
175
|
+
event.type === "bash_execution_update");
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Writes every entry Pi appended since the last successful write, in append
|
|
179
|
+
* order. The count only advances after an insert succeeds, so a failed write
|
|
180
|
+
* is retried by the next flush. Returns the write so actions can await it.
|
|
181
|
+
*/
|
|
182
|
+
function flushPiEntries(c, runtime, handle) {
|
|
183
|
+
const write = runtime.writes.then(async () => {
|
|
184
|
+
const entries = handle.session.sessionManager.getEntries();
|
|
185
|
+
while (handle.persistedEntryCount < entries.length) {
|
|
186
|
+
await appendPiEntry(c.db, entries[handle.persistedEntryCount]);
|
|
187
|
+
handle.persistedEntryCount += 1;
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
runtime.writes = write.catch(() => { });
|
|
191
|
+
return write;
|
|
192
|
+
}
|
|
193
|
+
function broadcastSessionEvent(c, event) {
|
|
194
|
+
try {
|
|
195
|
+
c.broadcast("event", event);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
if (isActorStoppingError(error))
|
|
199
|
+
return;
|
|
200
|
+
c.log.error({ msg: "failed to broadcast pi session event", error });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function isActorStoppingError(error) {
|
|
204
|
+
if (!error || typeof error !== "object")
|
|
205
|
+
return false;
|
|
206
|
+
const candidate = error;
|
|
207
|
+
return candidate.group === "actor" && candidate.code === "stopping";
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Queues entries appended since the last flush and writes Pi's mutable settings
|
|
211
|
+
* when they changed. Called after every action and on shutdown.
|
|
212
|
+
*/
|
|
213
|
+
export async function persistPiState(c, handle) {
|
|
214
|
+
await flushPiEntries(c, piRuntime(c), handle);
|
|
215
|
+
const settings = handle.settingsManager.getGlobalSettings();
|
|
216
|
+
const encoded = JSON.stringify(settings);
|
|
217
|
+
if (encoded === handle.persistedSettings)
|
|
218
|
+
return;
|
|
219
|
+
await savePiSettings(c.db, settings);
|
|
220
|
+
handle.persistedSettings = encoded;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Stops the Pi session for this actor generation: aborts any run, lets
|
|
224
|
+
* extensions shut down, and flushes settings and entries. Then suspends the
|
|
225
|
+
* sandbox on sleep, or destroys it on destroy.
|
|
226
|
+
*/
|
|
227
|
+
export async function closePiSession(c, options, reason) {
|
|
228
|
+
const runtime = piRuntime(c);
|
|
229
|
+
const ready = runtime.ready;
|
|
230
|
+
runtime.ready = undefined;
|
|
231
|
+
const errors = [];
|
|
232
|
+
let handle;
|
|
233
|
+
try {
|
|
234
|
+
handle = await ready;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
}
|
|
238
|
+
if (handle) {
|
|
239
|
+
const open = handle;
|
|
240
|
+
await attempt(errors, () => open.session.abort());
|
|
241
|
+
await attempt(errors, async () => {
|
|
242
|
+
if (open.session.hasExtensionHandlers("session_shutdown")) {
|
|
243
|
+
await open.session.extensionRunner.emit({
|
|
244
|
+
type: "session_shutdown",
|
|
245
|
+
reason: "quit",
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
await attempt(errors, () => persistPiState(c, open));
|
|
250
|
+
open.session.dispose();
|
|
251
|
+
c.log.info({ msg: "pi session closed", sessionId: open.session.sessionId });
|
|
252
|
+
}
|
|
253
|
+
const provider = options.sandbox;
|
|
254
|
+
if (provider) {
|
|
255
|
+
await attempt(errors, async () => {
|
|
256
|
+
if (reason === "sleep") {
|
|
257
|
+
if (handle?.sandbox && provider.suspend) {
|
|
258
|
+
await provider.suspend(c, handle.sandbox.id);
|
|
259
|
+
}
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
const sandbox = handle?.sandbox ?? (await storedSandbox(c, provider));
|
|
263
|
+
if (sandbox && provider.destroy) {
|
|
264
|
+
await provider.destroy(c, sandbox.id);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
if (errors.length === 1)
|
|
269
|
+
throw errors[0];
|
|
270
|
+
if (errors.length > 1) {
|
|
271
|
+
throw new AggregateError(errors, "pi session shutdown failed");
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/** The stored sandbox, when it belongs to `provider`. */
|
|
275
|
+
async function storedSandbox(c, provider) {
|
|
276
|
+
const sandbox = await loadPiSandbox(c.db);
|
|
277
|
+
return sandbox?.provider === provider.name ? sandbox : undefined;
|
|
278
|
+
}
|
|
279
|
+
async function attempt(errors, operation) {
|
|
280
|
+
try {
|
|
281
|
+
await operation();
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
errors.push(error);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type BashOperations, type ToolDefinition } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { Sandbox } from "@rivet-dev/sandbox-adapter";
|
|
3
|
+
/**
|
|
4
|
+
* Builds Pi's seven built-in coding tools with every file and shell operation
|
|
5
|
+
* routed into the sandbox. Passed as `customTools`, they replace the built-in
|
|
6
|
+
* tools of the same names.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createSandboxTools(sandbox: Sandbox): ToolDefinition<any, any, any>[];
|
|
9
|
+
/**
|
|
10
|
+
* Command execution for Pi's bash tool and `executeBash`, inside the sandbox.
|
|
11
|
+
* Follows Pi's `BashOperations` contract: `timeout` is in seconds, and abort
|
|
12
|
+
* and timeout reject with `aborted` and `timeout:<seconds>`.
|
|
13
|
+
*
|
|
14
|
+
* Pi passes the actor host's environment as `options.env`. It is not
|
|
15
|
+
* forwarded, because it holds the host's provider keys; commands run with the
|
|
16
|
+
* sandbox's own environment.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createSandboxBashOperations(sandbox: Sandbox): BashOperations;
|
|
19
|
+
/** Resolves `path` against `root` and rejects anything outside it. */
|
|
20
|
+
export declare function resolveSandboxPath(root: string, path: string): string;
|
|
21
|
+
//# sourceMappingURL=sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,cAAc,EAUnB,KAAK,cAAc,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAO1D;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,OAAO,GACd,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAgHjC;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAgB5E;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAQrE"}
|