@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
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { AgentSession, PromptOptions, SessionManager } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type PiContext, type PiSessionOptions } from "./runtime.js";
|
|
3
|
+
import { type PiModelInfo } from "./models.js";
|
|
4
|
+
/** An action that mirrors one `AgentSession` method: same arguments, same result. */
|
|
5
|
+
type SessionMethodAction<K extends keyof AgentSession> = AgentSession[K] extends (...args: infer TArgs) => infer TResult ? (c: PiContext, ...args: TArgs) => Promise<Awaited<TResult>> : never;
|
|
6
|
+
export type PiPromptOptions = Omit<PromptOptions, "preflightResult">;
|
|
7
|
+
export type PiBashResult = Awaited<ReturnType<AgentSession["executeBash"]>>;
|
|
8
|
+
export interface PiSessionInfo {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
sessionName: string | undefined;
|
|
11
|
+
cwd: string;
|
|
12
|
+
model: AgentSession["model"];
|
|
13
|
+
thinkingLevel: AgentSession["thinkingLevel"];
|
|
14
|
+
isStreaming: boolean;
|
|
15
|
+
isIdle: boolean;
|
|
16
|
+
isCompacting: boolean;
|
|
17
|
+
isRetrying: boolean;
|
|
18
|
+
isBashRunning: boolean;
|
|
19
|
+
pendingMessageCount: number;
|
|
20
|
+
activeTools: string[];
|
|
21
|
+
steeringMode: AgentSession["steeringMode"];
|
|
22
|
+
followUpMode: AgentSession["followUpMode"];
|
|
23
|
+
autoCompactionEnabled: boolean;
|
|
24
|
+
autoRetryEnabled: boolean;
|
|
25
|
+
retryAttempt: number;
|
|
26
|
+
}
|
|
27
|
+
export interface PiActions {
|
|
28
|
+
/**
|
|
29
|
+
* Sends a prompt and resolves when Pi's run ends, after retries and tool
|
|
30
|
+
* calls. Progress streams through the `event` event. A model error does not
|
|
31
|
+
* reject: the last assistant message has `stopReason: "error"`. A prompt
|
|
32
|
+
* queued with `streamingBehavior` resolves once it is queued.
|
|
33
|
+
*/
|
|
34
|
+
prompt: (c: PiContext, text: string, options?: PiPromptOptions) => Promise<void>;
|
|
35
|
+
steer: SessionMethodAction<"steer">;
|
|
36
|
+
followUp: SessionMethodAction<"followUp">;
|
|
37
|
+
clearQueue: SessionMethodAction<"clearQueue">;
|
|
38
|
+
abort: SessionMethodAction<"abort">;
|
|
39
|
+
waitForIdle: SessionMethodAction<"waitForIdle">;
|
|
40
|
+
/** Allowed models that have a credential. */
|
|
41
|
+
getAvailableModels: (c: PiContext) => Promise<PiModelInfo[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Switches to an allowed model by provider and model id. Throws
|
|
44
|
+
* `user.model_not_allowed` outside the allowlist and `user.model_unavailable`
|
|
45
|
+
* when the provider has no credential.
|
|
46
|
+
*/
|
|
47
|
+
setModel: (c: PiContext, provider: string, modelId: string) => Promise<void>;
|
|
48
|
+
setThinkingLevel: SessionMethodAction<"setThinkingLevel">;
|
|
49
|
+
cycleThinkingLevel: SessionMethodAction<"cycleThinkingLevel">;
|
|
50
|
+
getAvailableThinkingLevels: SessionMethodAction<"getAvailableThinkingLevels">;
|
|
51
|
+
supportsThinking: SessionMethodAction<"supportsThinking">;
|
|
52
|
+
getActiveToolNames: SessionMethodAction<"getActiveToolNames">;
|
|
53
|
+
getCallableToolNames: SessionMethodAction<"getCallableToolNames">;
|
|
54
|
+
getAllTools: SessionMethodAction<"getAllTools">;
|
|
55
|
+
setActiveToolsByName: SessionMethodAction<"setActiveToolsByName">;
|
|
56
|
+
executeBash: (c: PiContext, command: string, options?: {
|
|
57
|
+
excludeFromContext?: boolean;
|
|
58
|
+
id?: string;
|
|
59
|
+
}) => Promise<PiBashResult>;
|
|
60
|
+
abortBash: SessionMethodAction<"abortBash">;
|
|
61
|
+
setSteeringMode: SessionMethodAction<"setSteeringMode">;
|
|
62
|
+
setFollowUpMode: SessionMethodAction<"setFollowUpMode">;
|
|
63
|
+
compact: SessionMethodAction<"compact">;
|
|
64
|
+
abortCompaction: SessionMethodAction<"abortCompaction">;
|
|
65
|
+
setAutoCompactionEnabled: SessionMethodAction<"setAutoCompactionEnabled">;
|
|
66
|
+
abortRetry: SessionMethodAction<"abortRetry">;
|
|
67
|
+
setAutoRetryEnabled: SessionMethodAction<"setAutoRetryEnabled">;
|
|
68
|
+
setSessionName: SessionMethodAction<"setSessionName">;
|
|
69
|
+
navigateTree: SessionMethodAction<"navigateTree">;
|
|
70
|
+
getSessionTree: (c: PiContext) => Promise<ReturnType<SessionManager["getTree"]>>;
|
|
71
|
+
getSession: (c: PiContext) => Promise<PiSessionInfo>;
|
|
72
|
+
getMessages: (c: PiContext) => Promise<AgentSession["messages"]>;
|
|
73
|
+
getSteeringMessages: SessionMethodAction<"getSteeringMessages">;
|
|
74
|
+
getFollowUpMessages: SessionMethodAction<"getFollowUpMessages">;
|
|
75
|
+
getSessionStats: SessionMethodAction<"getSessionStats">;
|
|
76
|
+
getContextUsage: SessionMethodAction<"getContextUsage">;
|
|
77
|
+
getLastAssistantText: SessionMethodAction<"getLastAssistantText">;
|
|
78
|
+
}
|
|
79
|
+
export declare function createPiActions(options: PiSessionOptions): PiActions;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
|
package/dist/actions.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { ensurePiSession, persistPiState, } from "./runtime.js";
|
|
2
|
+
import { availableModels, requireCredential, switchModel, } from "./models.js";
|
|
3
|
+
import { traceRun } from "./tracing.js";
|
|
4
|
+
export function createPiActions(options) {
|
|
5
|
+
/** Runs a read-only session method. */
|
|
6
|
+
const read = async (c, callback) => callback(await ensurePiSession(c, options));
|
|
7
|
+
/** Runs a session method that may change settings and persists them after. */
|
|
8
|
+
const mutate = async (c, callback) => {
|
|
9
|
+
const handle = await ensurePiSession(c, options);
|
|
10
|
+
let result;
|
|
11
|
+
try {
|
|
12
|
+
result = await callback(handle);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
await persistPiState(c, handle).catch((writeError) => {
|
|
16
|
+
c.log.error({ msg: "pi state write failed after an action error", error: writeError });
|
|
17
|
+
});
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
await persistPiState(c, handle);
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
prompt: (c, text, promptOptions) => mutate(c, async (handle) => {
|
|
25
|
+
await reloadCredentials(handle);
|
|
26
|
+
const { session } = handle;
|
|
27
|
+
requireCredential(session);
|
|
28
|
+
const abort = () => void session.abort();
|
|
29
|
+
c.abortSignal.addEventListener("abort", abort, { once: true });
|
|
30
|
+
try {
|
|
31
|
+
await traceRun(session, c.actorId, () => session.prompt(text, promptOptions));
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
c.abortSignal.removeEventListener("abort", abort);
|
|
35
|
+
}
|
|
36
|
+
}),
|
|
37
|
+
steer: (c, ...args) => mutate(c, ({ session }) => session.steer(...args)),
|
|
38
|
+
followUp: (c, ...args) => mutate(c, ({ session }) => session.followUp(...args)),
|
|
39
|
+
clearQueue: (c) => mutate(c, ({ session }) => session.clearQueue()),
|
|
40
|
+
abort: (c) => mutate(c, ({ session }) => session.abort()),
|
|
41
|
+
waitForIdle: (c) => read(c, ({ session }) => session.waitForIdle()),
|
|
42
|
+
getAvailableModels: (c) => read(c, async (handle) => {
|
|
43
|
+
await reloadCredentials(handle);
|
|
44
|
+
return availableModels(options, handle.session);
|
|
45
|
+
}),
|
|
46
|
+
setModel: (c, provider, modelId) => mutate(c, async (handle) => {
|
|
47
|
+
await reloadCredentials(handle);
|
|
48
|
+
await switchModel(options, handle.session, provider, modelId);
|
|
49
|
+
}),
|
|
50
|
+
setThinkingLevel: (c, ...args) => mutate(c, ({ session }) => session.setThinkingLevel(...args)),
|
|
51
|
+
cycleThinkingLevel: (c, ...args) => mutate(c, ({ session }) => session.cycleThinkingLevel(...args)),
|
|
52
|
+
getAvailableThinkingLevels: (c) => read(c, ({ session }) => session.getAvailableThinkingLevels()),
|
|
53
|
+
supportsThinking: (c) => read(c, ({ session }) => session.supportsThinking()),
|
|
54
|
+
getActiveToolNames: (c) => read(c, ({ session }) => session.getActiveToolNames()),
|
|
55
|
+
getCallableToolNames: (c) => read(c, ({ session }) => session.getCallableToolNames()),
|
|
56
|
+
getAllTools: (c) => read(c, ({ session }) => session.getAllTools()),
|
|
57
|
+
setActiveToolsByName: (c, ...args) => mutate(c, ({ session }) => session.setActiveToolsByName(...args)),
|
|
58
|
+
executeBash: (c, command, bashOptions) => mutate(c, ({ session, bashOperations }) => {
|
|
59
|
+
if (!bashOperations) {
|
|
60
|
+
throw new Error("executeBash needs a sandbox; this pi() actor has none configured");
|
|
61
|
+
}
|
|
62
|
+
return session.executeBash(command, undefined, {
|
|
63
|
+
...bashOptions,
|
|
64
|
+
operations: bashOperations,
|
|
65
|
+
});
|
|
66
|
+
}),
|
|
67
|
+
abortBash: (c) => read(c, ({ session }) => session.abortBash()),
|
|
68
|
+
setSteeringMode: (c, ...args) => mutate(c, ({ session }) => session.setSteeringMode(...args)),
|
|
69
|
+
setFollowUpMode: (c, ...args) => mutate(c, ({ session }) => session.setFollowUpMode(...args)),
|
|
70
|
+
compact: (c, ...args) => mutate(c, ({ session }) => session.compact(...args)),
|
|
71
|
+
abortCompaction: (c) => read(c, ({ session }) => session.abortCompaction()),
|
|
72
|
+
setAutoCompactionEnabled: (c, ...args) => mutate(c, ({ session }) => session.setAutoCompactionEnabled(...args)),
|
|
73
|
+
abortRetry: (c) => read(c, ({ session }) => session.abortRetry()),
|
|
74
|
+
setAutoRetryEnabled: (c, ...args) => mutate(c, ({ session }) => session.setAutoRetryEnabled(...args)),
|
|
75
|
+
setSessionName: (c, ...args) => mutate(c, ({ session }) => session.setSessionName(...args)),
|
|
76
|
+
navigateTree: (c, ...args) => mutate(c, ({ session }) => session.navigateTree(...args)),
|
|
77
|
+
getSessionTree: (c) => read(c, ({ session }) => session.sessionManager.getTree()),
|
|
78
|
+
getSession: (c) => read(c, ({ session, cwd }) => ({
|
|
79
|
+
sessionId: session.sessionId,
|
|
80
|
+
sessionName: session.sessionName,
|
|
81
|
+
cwd,
|
|
82
|
+
model: session.model,
|
|
83
|
+
thinkingLevel: session.thinkingLevel,
|
|
84
|
+
isStreaming: session.isStreaming,
|
|
85
|
+
isIdle: session.isIdle,
|
|
86
|
+
isCompacting: session.isCompacting,
|
|
87
|
+
isRetrying: session.isRetrying,
|
|
88
|
+
isBashRunning: session.isBashRunning,
|
|
89
|
+
pendingMessageCount: session.pendingMessageCount,
|
|
90
|
+
activeTools: session.getActiveToolNames(),
|
|
91
|
+
steeringMode: session.steeringMode,
|
|
92
|
+
followUpMode: session.followUpMode,
|
|
93
|
+
autoCompactionEnabled: session.autoCompactionEnabled,
|
|
94
|
+
autoRetryEnabled: session.autoRetryEnabled,
|
|
95
|
+
retryAttempt: session.retryAttempt,
|
|
96
|
+
})),
|
|
97
|
+
getMessages: (c) => read(c, ({ session }) => session.messages),
|
|
98
|
+
getSteeringMessages: (c) => read(c, ({ session }) => [...session.getSteeringMessages()]),
|
|
99
|
+
getFollowUpMessages: (c) => read(c, ({ session }) => [...session.getFollowUpMessages()]),
|
|
100
|
+
getSessionStats: (c) => read(c, ({ session }) => session.getSessionStats()),
|
|
101
|
+
getContextUsage: (c) => read(c, ({ session }) => session.getContextUsage()),
|
|
102
|
+
getLastAssistantText: (c) => read(c, ({ session }) => session.getLastAssistantText()),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Picks up logins and logouts made since the session opened. An error from the
|
|
107
|
+
* application's credential source rejects the action.
|
|
108
|
+
*/
|
|
109
|
+
async function reloadCredentials(handle) {
|
|
110
|
+
if (!handle.credentials)
|
|
111
|
+
return;
|
|
112
|
+
handle.credentials.invalidate();
|
|
113
|
+
await handle.credentials.list();
|
|
114
|
+
await handle.session.modelRuntime.refresh({ allowNetwork: false });
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
|
package/dist/actor.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentSessionEvent } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type Actions, type ActorConfigInput, type ActorDefinition, type EventSchemaConfig, type QueueSchemaConfig, type Type } from "rivetkit";
|
|
3
|
+
import { type PiActions } from "./actions.js";
|
|
4
|
+
import { type PiDatabaseProvider, type PiSessionOptions } from "./runtime.js";
|
|
5
|
+
/** Every Pi `AgentSessionEvent`, in order, for connected clients. */
|
|
6
|
+
export type PiEvents = {
|
|
7
|
+
event: Type<AgentSessionEvent>;
|
|
8
|
+
};
|
|
9
|
+
export type PiActorConfigInput<TState = undefined, TConnParams = undefined, TConnState = undefined, TVars = undefined, TInput = undefined, TEvents extends EventSchemaConfig = Record<never, never>, TQueues extends QueueSchemaConfig = Record<never, never>, TUserActions extends Actions<TState, TConnParams, TConnState, TVars, TInput, PiDatabaseProvider, TEvents, TQueues> = Record<never, never>> = ActorConfigInput<TState, TConnParams, TConnState, TVars, TInput, PiDatabaseProvider, TEvents, TQueues, TUserActions> & PiSessionOptions;
|
|
10
|
+
/**
|
|
11
|
+
* The actions the user defined. With no `actions` option, TypeScript uses the
|
|
12
|
+
* default, a record with an index signature, which would hide the Pi actions.
|
|
13
|
+
*/
|
|
14
|
+
type UserActions<T> = string extends keyof T ? Record<never, never> : T;
|
|
15
|
+
/**
|
|
16
|
+
* Defines a Rivet Actor that owns one Pi coding-agent session.
|
|
17
|
+
*
|
|
18
|
+
* The session transcript and settings live in the actor's SQLite database and
|
|
19
|
+
* are restored when the actor wakes. Pi events are broadcast on `event`.
|
|
20
|
+
* Ordinary actor config (state, vars, actions, events, hooks) is passed through.
|
|
21
|
+
*/
|
|
22
|
+
export declare function pi<TState, TConnParams, TConnState, TVars, TInput, TEvents extends EventSchemaConfig = Record<never, never>, TQueues extends QueueSchemaConfig = Record<never, never>, TUserActions extends Actions<TState, TConnParams, TConnState, TVars, TInput, PiDatabaseProvider, TEvents, TQueues> = Actions<TState, TConnParams, TConnState, TVars, TInput, PiDatabaseProvider, TEvents, TQueues>>(config?: PiActorConfigInput<TState, TConnParams, TConnState, TVars, TInput, TEvents, TQueues, TUserActions>): ActorDefinition<TState, TConnParams, TConnState, TVars, TInput, PiDatabaseProvider, TEvents & PiEvents, TQueues, UserActions<TUserActions> & PiActions>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=actor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../src/actor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EACN,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAGpB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,IAAI,EACT,MAAM,UAAU,CAAC;AAElB,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAKN,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,MAAM,cAAc,CAAC;AAMtB,qEAAqE;AACrE,MAAM,MAAM,QAAQ,GAAG;IACtB,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;CAC/B,CAAC;AAyBF,MAAM,MAAM,kBAAkB,CAC7B,MAAM,GAAG,SAAS,EAClB,WAAW,GAAG,SAAS,EACvB,UAAU,GAAG,SAAS,EACtB,KAAK,GAAG,SAAS,EACjB,MAAM,GAAG,SAAS,EAClB,OAAO,SAAS,iBAAiB,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACxD,OAAO,SAAS,iBAAiB,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACxD,YAAY,SAAS,OAAO,CAC3B,MAAM,EACN,WAAW,EACX,UAAU,EACV,KAAK,EACL,MAAM,EACN,kBAAkB,EAClB,OAAO,EACP,OAAO,CACP,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IACrB,gBAAgB,CACnB,MAAM,EACN,WAAW,EACX,UAAU,EACV,KAAK,EACL,MAAM,EACN,kBAAkB,EAClB,OAAO,EACP,OAAO,EACP,YAAY,CACZ,GACA,gBAAgB,CAAC;AAElB;;;GAGG;AACH,KAAK,WAAW,CAAC,CAAC,IAAI,MAAM,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AAExE;;;;;;GAMG;AACH,wBAAgB,EAAE,CACjB,MAAM,EACN,WAAW,EACX,UAAU,EACV,KAAK,EACL,MAAM,EACN,OAAO,SAAS,iBAAiB,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACxD,OAAO,SAAS,iBAAiB,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACxD,YAAY,SAAS,OAAO,CAC3B,MAAM,EACN,WAAW,EACX,UAAU,EACV,KAAK,EACL,MAAM,EACN,kBAAkB,EAClB,OAAO,EACP,OAAO,CACP,GAAG,OAAO,CACV,MAAM,EACN,WAAW,EACX,UAAU,EACV,KAAK,EACL,MAAM,EACN,kBAAkB,EAClB,OAAO,EACP,OAAO,CACP,EAED,MAAM,GAAE,kBAAkB,CACzB,MAAM,EACN,WAAW,EACX,UAAU,EACV,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,YAAY,CAUZ,GACC,eAAe,CACjB,MAAM,EACN,WAAW,EACX,UAAU,EACV,KAAK,EACL,MAAM,EACN,kBAAkB,EAClB,OAAO,GAAG,QAAQ,EAClB,OAAO,EACP,WAAW,CAAC,YAAY,CAAC,GAAG,SAAS,CACrC,CAyDA"}
|
package/dist/actor.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { actor, event, } from "rivetkit";
|
|
2
|
+
import { db } from "rivetkit/db";
|
|
3
|
+
import { createPiActions } from "./actions.js";
|
|
4
|
+
import { closePiSession, createPiRuntime, PI_RUNTIME, } from "./runtime.js";
|
|
5
|
+
import { migratePiTables } from "./storage.js";
|
|
6
|
+
/** Ten minutes. Pi actions such as `waitForIdle` and `compact` outlive RivetKit's one-minute default. */
|
|
7
|
+
const DEFAULT_ACTION_TIMEOUT_MS = 10 * 60_000;
|
|
8
|
+
const piEvents = {
|
|
9
|
+
event: event(),
|
|
10
|
+
};
|
|
11
|
+
const piOptionKeys = [
|
|
12
|
+
"cwd",
|
|
13
|
+
"agentDir",
|
|
14
|
+
"providers",
|
|
15
|
+
"apiKeys",
|
|
16
|
+
"credentials",
|
|
17
|
+
"model",
|
|
18
|
+
"thinkingLevel",
|
|
19
|
+
"scopedModels",
|
|
20
|
+
"noTools",
|
|
21
|
+
"tools",
|
|
22
|
+
"excludeTools",
|
|
23
|
+
"customTools",
|
|
24
|
+
"resourceLoader",
|
|
25
|
+
"sessionStartEvent",
|
|
26
|
+
"settings",
|
|
27
|
+
"sandbox",
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Defines a Rivet Actor that owns one Pi coding-agent session.
|
|
31
|
+
*
|
|
32
|
+
* The session transcript and settings live in the actor's SQLite database and
|
|
33
|
+
* are restored when the actor wakes. Pi events are broadcast on `event`.
|
|
34
|
+
* Ordinary actor config (state, vars, actions, events, hooks) is passed through.
|
|
35
|
+
*/
|
|
36
|
+
export function pi(config = {}) {
|
|
37
|
+
const { actorConfig, sessionOptions } = splitConfig(config);
|
|
38
|
+
if (actorConfig.db !== undefined) {
|
|
39
|
+
throw new Error("pi() owns the actor database; remove the db option");
|
|
40
|
+
}
|
|
41
|
+
const actions = createPiActions(sessionOptions);
|
|
42
|
+
assertNoReservedKeys("action", actorConfig.actions, actions);
|
|
43
|
+
assertNoReservedKeys("event", actorConfig.events, piEvents);
|
|
44
|
+
const userVars = actorConfig.vars;
|
|
45
|
+
const userCreateVars = actorConfig.createVars;
|
|
46
|
+
const userOnSleep = actorConfig.onSleep;
|
|
47
|
+
const userOnDestroy = actorConfig.onDestroy;
|
|
48
|
+
delete actorConfig.vars;
|
|
49
|
+
return actor({
|
|
50
|
+
...actorConfig,
|
|
51
|
+
options: {
|
|
52
|
+
actionTimeout: DEFAULT_ACTION_TIMEOUT_MS,
|
|
53
|
+
...actorConfig.options,
|
|
54
|
+
},
|
|
55
|
+
db: db({ onMigrate: migratePiTables }),
|
|
56
|
+
events: { ...(actorConfig.events ?? {}), ...piEvents },
|
|
57
|
+
actions: { ...(actorConfig.actions ?? {}), ...actions },
|
|
58
|
+
createVars: async (c, driverCtx) => {
|
|
59
|
+
const vars = userCreateVars
|
|
60
|
+
? await userCreateVars(c, driverCtx)
|
|
61
|
+
: userVars === undefined
|
|
62
|
+
? undefined
|
|
63
|
+
: structuredClone(userVars);
|
|
64
|
+
return attachRuntime(vars);
|
|
65
|
+
},
|
|
66
|
+
onSleep: async (c) => {
|
|
67
|
+
try {
|
|
68
|
+
await userOnSleep?.(c);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
await closePiSession(c, sessionOptions, "sleep");
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
onDestroy: async (c) => {
|
|
75
|
+
try {
|
|
76
|
+
await userOnDestroy?.(c);
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await closePiSession(c, sessionOptions, "destroy");
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function splitConfig(config) {
|
|
85
|
+
const actorConfig = { ...config };
|
|
86
|
+
const sessionOptions = {};
|
|
87
|
+
for (const key of piOptionKeys) {
|
|
88
|
+
if (key in actorConfig) {
|
|
89
|
+
sessionOptions[key] = actorConfig[key];
|
|
90
|
+
delete actorConfig[key];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { actorConfig, sessionOptions: sessionOptions };
|
|
94
|
+
}
|
|
95
|
+
/** Adds the Pi runtime slot to the user's vars without changing their shape. */
|
|
96
|
+
function attachRuntime(vars) {
|
|
97
|
+
const runtime = createPiRuntime();
|
|
98
|
+
if (vars === undefined) {
|
|
99
|
+
return { [PI_RUNTIME]: runtime };
|
|
100
|
+
}
|
|
101
|
+
if (typeof vars !== "object" || vars === null) {
|
|
102
|
+
throw new Error("pi() requires actor vars to be an object");
|
|
103
|
+
}
|
|
104
|
+
return Object.assign(vars, { [PI_RUNTIME]: runtime });
|
|
105
|
+
}
|
|
106
|
+
function assertNoReservedKeys(kind, custom, builtIns) {
|
|
107
|
+
for (const key of Object.keys(custom ?? {})) {
|
|
108
|
+
if (key in builtIns) {
|
|
109
|
+
throw new Error(`pi() ${kind} name is reserved: ${key}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=actor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actor.js","sourceRoot":"","sources":["../src/actor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { PiCredential, PiCredentialStore } from "./models.js";
|
|
2
|
+
/**
|
|
3
|
+
* A provider credential an application supplies. A subscription login never
|
|
4
|
+
* includes its refresh token, because the application refreshes it.
|
|
5
|
+
*/
|
|
6
|
+
export type PiProviderCredential = Extract<PiCredential, {
|
|
7
|
+
type: "api_key";
|
|
8
|
+
}> | {
|
|
9
|
+
type: "oauth";
|
|
10
|
+
access: string;
|
|
11
|
+
expires: number;
|
|
12
|
+
[field: string]: unknown;
|
|
13
|
+
};
|
|
14
|
+
/** A provider that has a credential, without the secret. */
|
|
15
|
+
export interface PiCredentialInfo {
|
|
16
|
+
providerId: string;
|
|
17
|
+
type: PiProviderCredential["type"];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Provider credentials an application supplies to a Pi actor. The application
|
|
21
|
+
* owns login, storage, and refresh. Errors reject the model call that needed
|
|
22
|
+
* the credential, so their messages must not contain secrets.
|
|
23
|
+
*/
|
|
24
|
+
export interface PiCredentialSource {
|
|
25
|
+
/** Providers that have a credential. */
|
|
26
|
+
list(): Promise<PiCredentialInfo[]>;
|
|
27
|
+
/** A provider's credential, possibly expired. */
|
|
28
|
+
read(providerId: string): Promise<PiProviderCredential | undefined>;
|
|
29
|
+
/**
|
|
30
|
+
* A provider's credential after the application refreshed it. Pi calls this
|
|
31
|
+
* when a subscription token expires within five minutes, so the result must
|
|
32
|
+
* be valid for longer than that.
|
|
33
|
+
*/
|
|
34
|
+
refresh(providerId: string): Promise<PiProviderCredential | undefined>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Adapts an application's credential source to Pi's credential store. It
|
|
38
|
+
* reads only providers the source lists, keeps what it read until
|
|
39
|
+
* `invalidate` runs, and never writes.
|
|
40
|
+
*/
|
|
41
|
+
export declare class SourceCredentialStore implements PiCredentialStore {
|
|
42
|
+
#private;
|
|
43
|
+
constructor(source: PiCredentialSource);
|
|
44
|
+
/** Drops what was read so the next read sees new logins and logouts. */
|
|
45
|
+
invalidate(): void;
|
|
46
|
+
list(): Promise<PiCredentialInfo[]>;
|
|
47
|
+
read(providerId: string): Promise<PiCredential | undefined>;
|
|
48
|
+
/**
|
|
49
|
+
* Pi calls this to refresh a subscription token that expires soon. The
|
|
50
|
+
* source refreshes it, so `fn` sees a fresh credential and never writes.
|
|
51
|
+
*/
|
|
52
|
+
modify(providerId: string, fn: (current: PiCredential | undefined) => Promise<PiCredential | undefined>): Promise<PiCredential | undefined>;
|
|
53
|
+
delete(providerId: string): Promise<void>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEnE;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAC7B,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GAC1C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAEhF,4DAA4D;AAC5D,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;CACnC;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAClC,wCAAwC;IACxC,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACpC,iDAAiD;IACjD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;IACpE;;;;OAIG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;CACvE;AAKD;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,iBAAiB;;gBAKlD,MAAM,EAAE,kBAAkB;IAItC,wEAAwE;IACxE,UAAU,IAAI,IAAI;IAKlB,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQ7B,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAgBjE;;;OAGG;IACG,MAAM,CACX,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,KAAK,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,GAC1E,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAkB9B,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/C"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/** How long Pi requires an OAuth token to stay valid before it refreshes it. */
|
|
2
|
+
const PI_OAUTH_MIN_VALIDITY_MS = 5 * 60_000;
|
|
3
|
+
/**
|
|
4
|
+
* Adapts an application's credential source to Pi's credential store. It
|
|
5
|
+
* reads only providers the source lists, keeps what it read until
|
|
6
|
+
* `invalidate` runs, and never writes.
|
|
7
|
+
*/
|
|
8
|
+
export class SourceCredentialStore {
|
|
9
|
+
#source;
|
|
10
|
+
#listed;
|
|
11
|
+
#read = new Map();
|
|
12
|
+
constructor(source) {
|
|
13
|
+
this.#source = source;
|
|
14
|
+
}
|
|
15
|
+
/** Drops what was read so the next read sees new logins and logouts. */
|
|
16
|
+
invalidate() {
|
|
17
|
+
this.#listed = undefined;
|
|
18
|
+
this.#read.clear();
|
|
19
|
+
}
|
|
20
|
+
list() {
|
|
21
|
+
this.#listed ??= this.#source.list().catch((error) => {
|
|
22
|
+
this.#listed = undefined;
|
|
23
|
+
throw error;
|
|
24
|
+
});
|
|
25
|
+
return this.#listed;
|
|
26
|
+
}
|
|
27
|
+
async read(providerId) {
|
|
28
|
+
if (!(await this.list()).some((entry) => entry.providerId === providerId))
|
|
29
|
+
return undefined;
|
|
30
|
+
let read = this.#read.get(providerId);
|
|
31
|
+
if (!read) {
|
|
32
|
+
read = this.#source
|
|
33
|
+
.read(providerId)
|
|
34
|
+
.then(toPiCredential)
|
|
35
|
+
.catch((error) => {
|
|
36
|
+
this.#read.delete(providerId);
|
|
37
|
+
throw error;
|
|
38
|
+
});
|
|
39
|
+
this.#read.set(providerId, read);
|
|
40
|
+
}
|
|
41
|
+
return read;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Pi calls this to refresh a subscription token that expires soon. The
|
|
45
|
+
* source refreshes it, so `fn` sees a fresh credential and never writes.
|
|
46
|
+
*/
|
|
47
|
+
async modify(providerId, fn) {
|
|
48
|
+
const refreshed = this.#source.refresh(providerId).then((credential) => {
|
|
49
|
+
if (credential?.type === "oauth" && credential.expires - Date.now() <= PI_OAUTH_MIN_VALIDITY_MS) {
|
|
50
|
+
throw new Error(`the credential source returned a ${providerId} token that expires within five minutes`);
|
|
51
|
+
}
|
|
52
|
+
return toPiCredential(credential);
|
|
53
|
+
});
|
|
54
|
+
this.#read.set(providerId, refreshed);
|
|
55
|
+
refreshed.catch(() => {
|
|
56
|
+
if (this.#read.get(providerId) === refreshed)
|
|
57
|
+
this.#read.delete(providerId);
|
|
58
|
+
});
|
|
59
|
+
const current = await refreshed;
|
|
60
|
+
if ((await fn(current)) !== undefined) {
|
|
61
|
+
throw new Error(`pi actor cannot store credentials for ${providerId}; the credential source owns them`);
|
|
62
|
+
}
|
|
63
|
+
return current;
|
|
64
|
+
}
|
|
65
|
+
async delete(providerId) {
|
|
66
|
+
throw new Error(`pi actor cannot delete credentials for ${providerId}; the credential source owns them`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Pi's OAuth credential type needs a refresh token field. Pi never uses it, because `modify` refreshes through the source. */
|
|
70
|
+
function toPiCredential(credential) {
|
|
71
|
+
if (!credential)
|
|
72
|
+
return undefined;
|
|
73
|
+
if (credential.type === "api_key")
|
|
74
|
+
return credential;
|
|
75
|
+
return { ...credential, refresh: "" };
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { PiActions, PiBashResult, PiPromptOptions, PiSessionInfo, } from "./actions.js";
|
|
2
|
+
export { pi, type PiActorConfigInput, type PiEvents } from "./actor.js";
|
|
3
|
+
export type { PiCredentialInfo, PiCredentialSource, PiProviderCredential, } from "./credentials.js";
|
|
4
|
+
export type { PiModelInfo, PiModelOptions, PiProviderConfig, } from "./models.js";
|
|
5
|
+
export type { PiSessionOptions } from "./runtime.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,SAAS,EACT,YAAY,EACZ,eAAe,EACf,aAAa,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,EAAE,EAAE,KAAK,kBAAkB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACxE,YAAY,EACX,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACX,WAAW,EACX,cAAc,EACd,gBAAgB,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,EAAE,EAA0C,MAAM,YAAY,CAAC"}
|
package/dist/models.d.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type AgentSession, type CreateModelRuntimeOptions, ModelRuntime } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { PiCredentialSource } from "./credentials.js";
|
|
3
|
+
import type { PiContext } from "./runtime.js";
|
|
4
|
+
/** Pi's credential store interface. `read`, `list`, `modify`, and `delete`, keyed by provider id. */
|
|
5
|
+
export type PiCredentialStore = NonNullable<CreateModelRuntimeOptions["credentials"]>;
|
|
6
|
+
/** A stored Pi credential: an API key or a subscription (OAuth) login. */
|
|
7
|
+
export type PiCredential = NonNullable<Awaited<ReturnType<PiCredentialStore["read"]>>>;
|
|
8
|
+
/** A custom provider, the same shape as one entry of Pi's `models.json` `providers`. */
|
|
9
|
+
export type PiProviderConfig = Parameters<ModelRuntime["registerProvider"]>[1];
|
|
10
|
+
/** A model from Pi's catalog. */
|
|
11
|
+
export type PiModel = NonNullable<ReturnType<ModelRuntime["getModel"]>>;
|
|
12
|
+
/** Model and credential options accepted by `pi()`. */
|
|
13
|
+
export interface PiModelOptions {
|
|
14
|
+
/** The model for a new session, as `provider/modelId`, such as `anthropic/claude-opus-5-5`. */
|
|
15
|
+
model?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Models a client may switch to with `setModel`, as `provider/modelId`.
|
|
18
|
+
* Without it, only `model`. Unlike Pi's scoped models, which only limit
|
|
19
|
+
* cycling, this is a hard limit.
|
|
20
|
+
*/
|
|
21
|
+
scopedModels?: string[];
|
|
22
|
+
/** Custom providers registered on the actor's model runtime. */
|
|
23
|
+
providers?: Record<string, PiProviderConfig>;
|
|
24
|
+
/**
|
|
25
|
+
* API keys by provider id. They stay in the actor's memory and win over
|
|
26
|
+
* every other source.
|
|
27
|
+
*/
|
|
28
|
+
apiKeys?: Record<string, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Provider credentials the application manages, such as subscription
|
|
31
|
+
* logins. Called once per actor generation with the actor's context.
|
|
32
|
+
*/
|
|
33
|
+
credentials?: (c: PiContext) => PiCredentialSource;
|
|
34
|
+
}
|
|
35
|
+
/** A model a client may switch to. */
|
|
36
|
+
export interface PiModelInfo {
|
|
37
|
+
provider: string;
|
|
38
|
+
id: string;
|
|
39
|
+
name: string;
|
|
40
|
+
reasoning: boolean;
|
|
41
|
+
input: PiModel["input"];
|
|
42
|
+
contextWindow: number;
|
|
43
|
+
maxTokens: number;
|
|
44
|
+
}
|
|
45
|
+
/** The model options that decide which models a client may use. */
|
|
46
|
+
type AllowlistOptions = Pick<PiModelOptions, "model" | "scopedModels">;
|
|
47
|
+
/**
|
|
48
|
+
* Creates the model runtime for one actor generation. It never reads Pi's
|
|
49
|
+
* `~/.pi/agent/auth.json` or `models.json`; credentials come from `apiKeys`,
|
|
50
|
+
* then `credentials`, then the server environment.
|
|
51
|
+
*/
|
|
52
|
+
export declare function createActorModelRuntime(options: Omit<PiModelOptions, "credentials">, credentials: PiCredentialStore): Promise<ModelRuntime>;
|
|
53
|
+
/** A credential store that holds nothing and refuses writes. */
|
|
54
|
+
export declare const emptyCredentialStore: PiCredentialStore;
|
|
55
|
+
/**
|
|
56
|
+
* The model a session opens with: the model saved in the session when it is
|
|
57
|
+
* still allowed, otherwise the configured default. Undefined lets Pi choose,
|
|
58
|
+
* which only happens when no model is configured.
|
|
59
|
+
*/
|
|
60
|
+
export declare function openingModel(options: AllowlistOptions, runtime: ModelRuntime, saved: {
|
|
61
|
+
provider: string;
|
|
62
|
+
modelId: string;
|
|
63
|
+
} | null): PiModel | undefined;
|
|
64
|
+
/** Allowed models that have a credential, for a client's model picker. */
|
|
65
|
+
export declare function availableModels(options: AllowlistOptions, session: AgentSession): PiModelInfo[];
|
|
66
|
+
/** Throws `model_unavailable` when the session's model has no credential, for example after a logout. */
|
|
67
|
+
export declare function requireCredential(session: AgentSession): void;
|
|
68
|
+
/**
|
|
69
|
+
* Switches the session to an allowed model. The model object comes from the
|
|
70
|
+
* runtime's catalog, so a client can never choose the URL a key is sent to.
|
|
71
|
+
*/
|
|
72
|
+
export declare function switchModel(options: AllowlistOptions, session: AgentSession, provider: string, modelId: string): Promise<void>;
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,yBAAyB,EAC9B,YAAY,EACZ,MAAM,iCAAiC,CAAC;AAEzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,qGAAqG;AACrG,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC,CAAC;AAEtF,0EAA0E;AAC1E,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvF,wFAAwF;AACxF,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/E,iCAAiC;AACjC,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAExE,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC9B,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,kBAAkB,CAAC;CACnD;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,mEAAmE;AACnE,KAAK,gBAAgB,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,cAAc,CAAC,CAAC;AAEvE;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC5C,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,EAC5C,WAAW,EAAE,iBAAiB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAUvB;AAED,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,iBAalC,CAAC;AAqBF;;;;GAIG;AACH,wBAAgB,YAAY,CAC3B,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GACjD,OAAO,GAAG,SAAS,CAOrB;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAC9B,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,YAAY,GACnB,WAAW,EAAE,CAaf;AAED,yGAAyG;AACzG,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAW7D;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAChC,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAef"}
|