@rivet-dev/pi 0.1.0 → 0.5.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.
Files changed (85) hide show
  1. package/LICENSE +190 -0
  2. package/dist/actions.d.ts +1 -1
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +8 -10
  5. package/dist/actions.js.map +1 -1
  6. package/dist/actor-config.d.ts +33 -0
  7. package/dist/actor-config.d.ts.map +1 -0
  8. package/dist/actor-config.js +87 -0
  9. package/dist/actor-config.js.map +1 -0
  10. package/dist/actor-types.d.ts +34 -0
  11. package/dist/actor-types.d.ts.map +1 -0
  12. package/dist/actor-types.js +2 -0
  13. package/dist/actor-types.js.map +1 -0
  14. package/dist/actor.d.ts +17 -9
  15. package/dist/actor.d.ts.map +1 -1
  16. package/dist/actor.js +33 -68
  17. package/dist/actor.js.map +1 -1
  18. package/dist/credentials.d.ts.map +1 -1
  19. package/dist/credentials.js +2 -1
  20. package/dist/credentials.js.map +1 -1
  21. package/dist/drain.d.ts +12 -0
  22. package/dist/drain.d.ts.map +1 -0
  23. package/dist/drain.js +20 -0
  24. package/dist/drain.js.map +1 -0
  25. package/dist/durable/actions.d.ts +192 -0
  26. package/dist/durable/actions.d.ts.map +1 -0
  27. package/dist/durable/actions.js +289 -0
  28. package/dist/durable/actions.js.map +1 -0
  29. package/dist/durable/actor-sqlite.d.ts +10 -0
  30. package/dist/durable/actor-sqlite.d.ts.map +1 -0
  31. package/dist/durable/actor-sqlite.js +32 -0
  32. package/dist/durable/actor-sqlite.js.map +1 -0
  33. package/dist/durable/actor.d.ts +36 -0
  34. package/dist/durable/actor.d.ts.map +1 -0
  35. package/dist/durable/actor.js +107 -0
  36. package/dist/durable/actor.js.map +1 -0
  37. package/dist/durable/env.d.ts +13 -0
  38. package/dist/durable/env.d.ts.map +1 -0
  39. package/dist/durable/env.js +178 -0
  40. package/dist/durable/env.js.map +1 -0
  41. package/dist/durable/errors.d.ts +8 -0
  42. package/dist/durable/errors.d.ts.map +1 -0
  43. package/dist/durable/errors.js +19 -0
  44. package/dist/durable/errors.js.map +1 -0
  45. package/dist/durable/index.d.ts +5 -0
  46. package/dist/durable/index.d.ts.map +1 -0
  47. package/dist/durable/index.js +2 -0
  48. package/dist/durable/index.js.map +1 -0
  49. package/dist/durable/runtime.d.ts +92 -0
  50. package/dist/durable/runtime.d.ts.map +1 -0
  51. package/dist/durable/runtime.js +435 -0
  52. package/dist/durable/runtime.js.map +1 -0
  53. package/dist/durable/storage.d.ts +31 -0
  54. package/dist/durable/storage.d.ts.map +1 -0
  55. package/dist/durable/storage.js +53 -0
  56. package/dist/durable/storage.js.map +1 -0
  57. package/dist/durable/watches.d.ts +77 -0
  58. package/dist/durable/watches.d.ts.map +1 -0
  59. package/dist/durable/watches.js +245 -0
  60. package/dist/durable/watches.js.map +1 -0
  61. package/dist/index.d.ts +1 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -1
  64. package/dist/index.js.map +1 -1
  65. package/dist/models.d.ts +5 -0
  66. package/dist/models.d.ts.map +1 -1
  67. package/dist/models.js +13 -6
  68. package/dist/models.js.map +1 -1
  69. package/dist/runtime.d.ts +71 -6
  70. package/dist/runtime.d.ts.map +1 -1
  71. package/dist/runtime.js +276 -45
  72. package/dist/runtime.js.map +1 -1
  73. package/dist/sandbox.d.ts +9 -3
  74. package/dist/sandbox.d.ts.map +1 -1
  75. package/dist/sandbox.js +64 -25
  76. package/dist/sandbox.js.map +1 -1
  77. package/dist/storage.d.ts +18 -1
  78. package/dist/storage.d.ts.map +1 -1
  79. package/dist/storage.js +49 -0
  80. package/dist/storage.js.map +1 -1
  81. package/dist/tracing.d.ts +8 -0
  82. package/dist/tracing.d.ts.map +1 -1
  83. package/dist/tracing.js +36 -1
  84. package/dist/tracing.js.map +1 -1
  85. package/package.json +46 -15
@@ -0,0 +1,289 @@
1
+ import { UserError } from "rivetkit";
2
+ import { assertModelAllowed } from "../models.js";
3
+ import { traceDurableRun } from "../tracing.js";
4
+ import { documentsByKind, piDurableRuntime, withHarness, } from "./runtime.js";
5
+ import { unwatch, watch } from "./watches.js";
6
+ /**
7
+ * The `piDurable()` actions: Pi Durable's `Harness`, `Conversation`, and
8
+ * `Submission` methods under `harness`, `conversation`, and `submission`, with
9
+ * the same names. Ids replace objects, and conversation methods take the
10
+ * conversation id first. `prompt` is the one convenience action.
11
+ */
12
+ export function createPiDurableActions(options) {
13
+ const documents = documentsByKind(options);
14
+ const run = (c, body) => withHarness(c, options, body);
15
+ const agentChange = (change) => change === undefined ? undefined : resolveAgentChange(options, change);
16
+ /**
17
+ * Starts a watch for the calling connection. Frames go to that connection
18
+ * only. `T` is the starting value `start` in `watches.ts` returns for the
19
+ * kind in `spec`; each action below names it.
20
+ */
21
+ const watchFor = (c, spec) => run(c, async (harness, context) => {
22
+ const connId = connectionId(c);
23
+ const runtime = piDurableRuntime(c);
24
+ return (await watch(runtime.actor ?? c, runtime.watches, harness, documents, connId, spec, () => requireWatchTarget(harness, spec, context)));
25
+ });
26
+ const unwatchFor = (c, spec) => run(c, async () => {
27
+ const runtime = piDurableRuntime(c);
28
+ await unwatch(runtime.actor ?? c, runtime.watches, connectionId(c), spec);
29
+ });
30
+ const requireWatchTarget = async (harness, spec, context) => {
31
+ if (spec.kind === "doc")
32
+ requireDocument(spec.docKind);
33
+ if (spec.kind !== "taskGraph")
34
+ await requireConversation(harness, spec.conversationId, context);
35
+ };
36
+ const requireDocument = (kind) => {
37
+ const doc = documents.get(kind);
38
+ if (!doc) {
39
+ throw new UserError(`Document ${kind} is not listed in piDurable({ documents }).`);
40
+ }
41
+ return doc;
42
+ };
43
+ // Ids arrive as plain numbers and are cast to Pi's branded id types. Pi's
44
+ // lookups check that each one exists, and a missing one is a `UserError`.
45
+ return {
46
+ harness: {
47
+ root: (c, rootOptions) => run(c, async (harness, context) => ({
48
+ id: (await harness.root(context, {
49
+ agent: agentChange(rootOptions?.agent),
50
+ })).id,
51
+ })),
52
+ conversation: (c, id) => run(c, (harness, context) => harness.commit((tx) => tx.conversation(id), context)),
53
+ createConversation: (c, create) => run(c, async (harness, context) => ({
54
+ id: (await harness.createConversation({ ownership: create.ownership, agent: agentChange(create.agent) }, context)).id,
55
+ })),
56
+ submission: (c, id) => run(c, async (harness, context) => (await harness.submission(id, context))?.status(context)),
57
+ abortSubmission: (c, id, conversationId) => run(c, async (harness, context) => {
58
+ const result = await harness.abortSubmission(id, context, conversationId);
59
+ if (result === "not_found")
60
+ throw submissionNotFound(id);
61
+ return result;
62
+ }),
63
+ getTask: (c, id) => run(c, (harness, context) => harness.getTask(id, context)),
64
+ abortTask: (c, id) => run(c, async (harness, context) => {
65
+ await requireTask(harness, id, context);
66
+ return harness.abortTask(id, context);
67
+ }),
68
+ waitForTask: (c, id) => run(c, async (harness, context) => {
69
+ await requireTask(harness, id, context);
70
+ return harness.waitForTask(id, context);
71
+ }),
72
+ waitForIdle: (c) => run(c, (harness, context) => harness.waitForIdle(context)),
73
+ inspect: (c) => run(c, async (harness, context) => {
74
+ const inspection = await harness.inspect(context);
75
+ return {
76
+ ...inspection,
77
+ // A migration failure carries an Error, which does not cross the wire.
78
+ tasks: inspection.tasks.map((task) => task.state.kind === "blocked" && task.state.error !== undefined
79
+ ? {
80
+ ...task,
81
+ state: {
82
+ ...task.state,
83
+ error: errorMessage(task.state.error),
84
+ },
85
+ }
86
+ : task),
87
+ };
88
+ }),
89
+ usage: (c) => run(c, (harness, context) => harness.usage(context)),
90
+ taskGraph: (c) => run(c, async (harness, context) => {
91
+ const graph = await harness.taskGraph(context);
92
+ try {
93
+ return graph.value;
94
+ }
95
+ finally {
96
+ graph.dispose();
97
+ }
98
+ }),
99
+ snapshot: (c, kind, conversationId) => run(c, async (harness, context) => harness.snapshot(requireDocument(kind), conversationId, context)),
100
+ /** The task graph; then `pi.taskGraph` frames to this connection. */
101
+ watchTaskGraph: (c) => watchFor(c, { kind: "taskGraph" }),
102
+ unwatchTaskGraph: (c) => unwatchFor(c, { kind: "taskGraph" }),
103
+ /**
104
+ * The document's value; then `pi.doc` frames to this connection. A
105
+ * document that does not exist yet has value `undefined`, and its
106
+ * first frame arrives when a commit creates it.
107
+ */
108
+ watchDoc: (c, kind, conversationId) => watchFor(c, {
109
+ kind: "doc",
110
+ docKind: kind,
111
+ conversationId,
112
+ }),
113
+ unwatchDoc: (c, kind, conversationId) => unwatchFor(c, { kind: "doc", docKind: kind, conversationId }),
114
+ },
115
+ conversation: {
116
+ agent: (c, conversationId) => run(c, async (harness, context) => agentInfo(await (await requireConversation(harness, conversationId, context)).agent(context))),
117
+ configure: (c, conversationId, change) => run(c, async (harness, context) => {
118
+ const resolved = resolveAgentChange(options, change);
119
+ await (await requireConversation(harness, conversationId, context)).configure(resolved, context);
120
+ }),
121
+ submit: (c, conversationId, draft) => run(c, async (harness, context) => (await (await requireConversation(harness, conversationId, context)).submit(draft, context)).status(context)),
122
+ reset: (c, conversationId, handoff) => run(c, async (harness, context) => (await requireConversation(harness, conversationId, context)).reset(handoff, context)),
123
+ compact: (c, conversationId, instructions) => run(c, async (harness, context) => (await requireConversation(harness, conversationId, context)).compact(instructions, context)),
124
+ context: (c, conversationId) => run(c, async (harness, context) => (await requireConversation(harness, conversationId, context)).context(context)),
125
+ entries: (c, conversationId, query, limit, cursor) => run(c, async (harness, context) => (await requireConversation(harness, conversationId, context)).entries(query, limit, cursor, context)),
126
+ fork: (c, conversationId, at, fork) => run(c, async (harness, context) => {
127
+ const conversation = await requireConversation(harness, conversationId, context);
128
+ const forked = await conversation.fork(at, { ownership: fork.ownership, agent: agentChange(fork.agent) }, context);
129
+ return { id: forked.id };
130
+ }),
131
+ abort: (c, conversationId, abortOptions) => run(c, async (harness, context) => (await requireConversation(harness, conversationId, context)).abort(context, abortOptions)),
132
+ waitForIdle: (c, conversationId) => run(c, async (harness, context) => (await requireConversation(harness, conversationId, context)).waitForIdle(context)),
133
+ /** The structural view; then `pi.view` frames with Chord operations to this connection. */
134
+ watch: (c, conversationId) => watchFor(c, {
135
+ kind: "view",
136
+ conversationId,
137
+ }),
138
+ unwatch: (c, conversationId) => unwatchFor(c, { kind: "view", conversationId }),
139
+ /** A snapshot, partial answer included; then `pi.events` batches to this connection. Nothing is replayed. */
140
+ watchEvents: (c, conversationId) => watchFor(c, {
141
+ kind: "events",
142
+ conversationId,
143
+ }),
144
+ unwatchEvents: (c, conversationId) => unwatchFor(c, { kind: "events", conversationId }),
145
+ },
146
+ submission: {
147
+ status: (c, id) => run(c, async (harness, context) => (await requireSubmission(harness, id, context)).status(context)),
148
+ wait: (c, id) => run(c, async (harness, context) => (await requireSubmission(harness, id, context)).wait(context)),
149
+ abort: (c, id) => run(c, async (harness, context) => (await requireSubmission(harness, id, context)).abort(context)),
150
+ },
151
+ /**
152
+ * Submits user input, waits for the run to settle, and returns the
153
+ * answer's text. A model error does not reject: the status is
154
+ * `unanswered` with Pi's reason.
155
+ */
156
+ prompt: (c, content, promptOptions) => run(c, async (harness, context) => {
157
+ const conversation = promptOptions?.conversationId === undefined
158
+ ? await harness.root(context)
159
+ : await requireConversation(harness, promptOptions.conversationId, context);
160
+ const submission = await conversation.submit({
161
+ type: "input",
162
+ content,
163
+ requestId: promptOptions?.requestId,
164
+ whenBusy: promptOptions?.whenBusy,
165
+ }, context);
166
+ const model = (await conversation.agent(context)).model;
167
+ const settled = await traceDurableRun(c.actorId, conversation.id, model && `${model.provider}/${model.modelId}`, () => submission.wait(context));
168
+ if (settled.status === "unanswered") {
169
+ return {
170
+ status: settled.status,
171
+ reason: settled.reason,
172
+ submissionId: submission.id,
173
+ };
174
+ }
175
+ return {
176
+ status: settled.status,
177
+ text: settled.type === "input"
178
+ ? await answerText(conversation, settled.answer, context)
179
+ : undefined,
180
+ submissionId: submission.id,
181
+ };
182
+ }),
183
+ pi: {
184
+ /** Scheduled at the end of a long wait. Opening the harness resumes the waiting work. */
185
+ wake: (c) => run(c, async () => { }),
186
+ },
187
+ };
188
+ }
189
+ /**
190
+ * The calling connection, which receives the watch's frames. A stateless call
191
+ * gets the starting value, and its watch ends with the request. Only a call
192
+ * with no connection at all, such as a scheduled action, cannot watch.
193
+ */
194
+ function connectionId(c) {
195
+ const conn = c.conn;
196
+ if (!conn) {
197
+ throw new UserError("Watching needs a calling connection. Call it from a client handle, and use connect() to receive frames.");
198
+ }
199
+ return conn.id;
200
+ }
201
+ async function requireConversation(harness, id, context) {
202
+ const conversation = await harness.conversation(id, context);
203
+ if (!conversation) {
204
+ throw new UserError(`Conversation ${id} does not exist.`);
205
+ }
206
+ return conversation;
207
+ }
208
+ async function requireSubmission(harness, id, context) {
209
+ const submission = await harness.submission(id, context);
210
+ if (!submission)
211
+ throw submissionNotFound(id);
212
+ return submission;
213
+ }
214
+ function submissionNotFound(id) {
215
+ return new UserError(`Submission ${id} does not exist.`);
216
+ }
217
+ async function requireTask(harness, id, context) {
218
+ if (!(await harness.getTask(id, context))) {
219
+ throw new UserError(`Task ${id} does not exist.`);
220
+ }
221
+ }
222
+ /**
223
+ * Resolves extension and tool names against the installed registry. A model
224
+ * outside `scopedModels`, or other than `model` when `scopedModels` is unset,
225
+ * is rejected.
226
+ */
227
+ function resolveAgentChange(options, change) {
228
+ const snapshot = options.registry.snapshot();
229
+ const extension = (name) => {
230
+ const found = snapshot.extension(name);
231
+ if (!found)
232
+ throw new UserError(`Extension ${name} is not installed.`);
233
+ return found;
234
+ };
235
+ const tool = (name) => {
236
+ const found = snapshot.tools().find((entry) => entry.tool.name === name);
237
+ if (!found)
238
+ throw new UserError(`Tool ${name} is not installed.`);
239
+ return found.tool;
240
+ };
241
+ if (change.model) {
242
+ assertModelAllowed(options, change.model.provider, change.model.modelId);
243
+ }
244
+ const { extensions, tools, ...rest } = change;
245
+ return {
246
+ ...rest,
247
+ extensions: extensions === undefined || extensions === null
248
+ ? extensions
249
+ : isNameList(extensions)
250
+ ? extensions.map(extension)
251
+ : {
252
+ add: extensions.add?.map(extension),
253
+ remove: extensions.remove?.map(extension),
254
+ },
255
+ tools: tools === undefined || tools === null
256
+ ? tools
257
+ : isNameList(tools)
258
+ ? tools.map(tool)
259
+ : { remove: tools.remove.map(tool) },
260
+ };
261
+ }
262
+ function isNameList(value) {
263
+ return Array.isArray(value);
264
+ }
265
+ function agentInfo(agent) {
266
+ return {
267
+ model: agent.model,
268
+ thinkingLevel: agent.thinkingLevel,
269
+ extensions: agent.extensions.map((extension) => extension.name),
270
+ tools: agent.tools.map((tool) => tool.name),
271
+ sections: agent.sections.map((section) => section.key),
272
+ instructions: agent.instructions,
273
+ cwd: agent.cwd,
274
+ };
275
+ }
276
+ /** The text blocks of the answer entry, which holds the assistant message. */
277
+ async function answerText(conversation, answer, context) {
278
+ const page = await conversation.entries({ minEntryId: answer, maxEntryId: answer }, 1, undefined, context);
279
+ const message = page.items[0]?.model?.[0];
280
+ if (message?.role !== "assistant")
281
+ return undefined;
282
+ return message.content
283
+ .map((block) => (block.type === "text" ? block.text : ""))
284
+ .join("");
285
+ }
286
+ function errorMessage(error) {
287
+ return error instanceof Error ? error.message : String(error);
288
+ }
289
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/durable/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { SqliteDatabase } from "@earendil-works/pi-durable/storage/sqlite";
2
+ import type { RawAccess } from "rivetkit/db";
3
+ /**
4
+ * Pi Durable's `SqliteDatabase` over the actor's SQLite database.
5
+ *
6
+ * The actor owns the database, so `close` does nothing. Pi Durable calls it from
7
+ * `storage.close()`, and the actor closes the database itself when it stops.
8
+ */
9
+ export declare function actorSqlite(db: RawAccess): SqliteDatabase;
10
+ //# sourceMappingURL=actor-sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-sqlite.d.ts","sourceRoot":"","sources":["../../src/durable/actor-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,cAAc,EAGd,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,SAAS,GAAG,cAAc,CASzD"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Pi Durable's `SqliteDatabase` over the actor's SQLite database.
3
+ *
4
+ * The actor owns the database, so `close` does nothing. Pi Durable calls it from
5
+ * `storage.close()`, and the actor closes the database itself when it stops.
6
+ */
7
+ export function actorSqlite(db) {
8
+ return {
9
+ ...actorSqliteExecutor(db),
10
+ transaction: (callback) => db.transaction((tx) => callback(actorSqliteExecutor(tx)), {
11
+ name: "pi-durable",
12
+ }),
13
+ close: async () => { },
14
+ };
15
+ }
16
+ /**
17
+ * Pi Durable names the row type of each query it sends. SQLite returns plain
18
+ * rows, so `get` and `all` take Pi's word for their shape.
19
+ */
20
+ function actorSqliteExecutor(db) {
21
+ return {
22
+ exec: async (sql) => {
23
+ await db.execute(sql);
24
+ },
25
+ run: async (sql, ...params) => {
26
+ await db.execute(sql, ...params);
27
+ },
28
+ get: async (sql, ...params) => (await db.execute(sql, ...params)).at(0),
29
+ all: async (sql, ...params) => (await db.execute(sql, ...params)),
30
+ };
31
+ }
32
+ //# sourceMappingURL=actor-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor-sqlite.js","sourceRoot":"","sources":["../../src/durable/actor-sqlite.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,EAAa;IACxC,OAAO;QACN,GAAG,mBAAmB,CAAC,EAAE,CAAC;QAC1B,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,CACzB,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,EAAE;YACzD,IAAI,EAAE,YAAY;SAClB,CAAC;QACH,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACrB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,EAA8B;IAC1D,OAAO;QACN,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACnB,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,EAAE;YAC7B,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,GAAG,EAAE,KAAK,EAAoB,GAAW,EAAE,GAAG,MAAqB,EAAE,EAAE,CACrE,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,GAAG,EAAE,KAAK,EAAoB,GAAW,EAAE,GAAG,MAAqB,EAAE,EAAE,CACtE,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAQ;KAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Harness } from "@earendil-works/pi-durable";
2
+ import { type EventSchemaConfig, type QueueSchemaConfig, type Type } from "rivetkit";
3
+ import type { PiActorDefinition, UserActions, UserActorConfig } from "../actor-types.js";
4
+ import { type PiDurableActions } from "./actions.js";
5
+ import { type PiDurableOptions } from "./runtime.js";
6
+ import { type PiDocFrame, type PiEventsFrame, type PiTaskGraphFrame, type PiViewFrame } from "./watches.js";
7
+ /** Watch frames, sent only to the connection that asked. See `PiWatchEvents`. */
8
+ export type PiDurableEvents = {
9
+ "pi.events": Type<PiEventsFrame>;
10
+ "pi.view": Type<PiViewFrame>;
11
+ "pi.taskGraph": Type<PiTaskGraphFrame>;
12
+ "pi.doc": Type<PiDocFrame>;
13
+ };
14
+ /**
15
+ * `c.pi`: the actor's Pi Durable harness, in the app's own actions and hooks.
16
+ * Reading it throws when Pi Durable cannot open, such as after a rollback to
17
+ * an older schema. In `onSleep` and `onDestroy` it is set only when Pi Durable
18
+ * is already open in this actor generation.
19
+ */
20
+ export interface PiDurableAccess {
21
+ readonly pi: Harness;
22
+ }
23
+ /** The app's own actions, which get `c.pi`. Nested objects become dotted action names. */
24
+ export type PiDurableUserActions<TState, TConnParams, TConnState, TVars, TInput, TEvents extends EventSchemaConfig, TQueues extends QueueSchemaConfig> = UserActions<TState, TConnParams, TConnState, TVars, TInput, TEvents, TQueues, PiDurableAccess>;
25
+ /** Ordinary actor config plus the Pi Durable options. The app's actions and lifecycle hooks get `c.pi`. */
26
+ export type PiDurableActorConfigInput<TState = undefined, TConnParams = undefined, TConnState = undefined, TVars = undefined, TInput = undefined, TEvents extends EventSchemaConfig = Record<never, never>, TQueues extends QueueSchemaConfig = Record<never, never>, TUserActions extends PiDurableUserActions<TState, TConnParams, TConnState, TVars, TInput, TEvents, TQueues> = Record<never, never>> = UserActorConfig<TState, TConnParams, TConnState, TVars, TInput, TEvents, TQueues, TUserActions, PiDurableOptions, PiDurableAccess>;
27
+ /**
28
+ * Defines a Rivet Actor that owns one Pi Durable harness.
29
+ *
30
+ * Pi Durable stores conversations, tasks, and documents in the actor's SQLite
31
+ * database. Runs survive sleep, deploys, and crashes, and resume when the
32
+ * actor wakes. The actions match Pi Durable's API one to one. The app's own
33
+ * actions and lifecycle hooks get the harness as `c.pi`.
34
+ */
35
+ export declare function piDurable<TState, TConnParams, TConnState, TVars, TInput, TEvents extends EventSchemaConfig = Record<never, never>, TQueues extends QueueSchemaConfig = Record<never, never>, TUserActions extends PiDurableUserActions<TState, TConnParams, TConnState, TVars, TInput, TEvents, TQueues> = PiDurableUserActions<TState, TConnParams, TConnState, TVars, TInput, TEvents, TQueues>>(config: PiDurableActorConfigInput<TState, TConnParams, TConnState, TVars, TInput, TEvents, TQueues, TUserActions>): PiActorDefinition<TState, TConnParams, TConnState, TVars, TInput, TEvents, TQueues, TUserActions, PiDurableEvents, PiDurableActions>;
36
+ //# sourceMappingURL=actor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/durable/actor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import { actor, event, } from "rivetkit";
2
+ import { db } from "rivetkit/db";
3
+ import { assertNoReservedNames, sharedActorConfig, splitConfig, wrapActions, } from "../actor-config.js";
4
+ import { withUnavailablePi } from "../runtime.js";
5
+ import { createPiDurableActions } from "./actions.js";
6
+ import { closeHarness, createPiDurableRuntime, openOnWake, PI_DURABLE_RUNTIME, piDurableRuntime, withPiAccess, } from "./runtime.js";
7
+ import { migratePiDurableTables } from "./storage.js";
8
+ import { unwatchConnection, } from "./watches.js";
9
+ const piDurableEvents = {
10
+ "pi.events": event(),
11
+ "pi.view": event(),
12
+ "pi.taskGraph": event(),
13
+ "pi.doc": event(),
14
+ };
15
+ const piDurableOptionKeys = [
16
+ "registry",
17
+ "models",
18
+ "settings",
19
+ "env",
20
+ "conversationCreated",
21
+ "now",
22
+ "onReport",
23
+ "model",
24
+ "thinkingLevel",
25
+ "scopedModels",
26
+ "providers",
27
+ "apiKeys",
28
+ "credentials",
29
+ "sandbox",
30
+ "documents",
31
+ ];
32
+ /**
33
+ * Defines a Rivet Actor that owns one Pi Durable harness.
34
+ *
35
+ * Pi Durable stores conversations, tasks, and documents in the actor's SQLite
36
+ * database. Runs survive sleep, deploys, and crashes, and resume when the
37
+ * actor wakes. The actions match Pi Durable's API one to one. The app's own
38
+ * actions and lifecycle hooks get the harness as `c.pi`.
39
+ */
40
+ export function piDurable(config) {
41
+ const { actorConfig, options: durableOptions } = splitConfig(config, piDurableOptionKeys);
42
+ if (!durableOptions.registry) {
43
+ throw new Error("piDurable() needs a registry; pass createRegistry() from @earendil-works/pi-durable");
44
+ }
45
+ if (actorConfig.db !== undefined) {
46
+ throw new Error("piDurable() owns the actor database; remove the db option");
47
+ }
48
+ const actions = createPiDurableActions(durableOptions);
49
+ assertNoReservedNames("piDurable()", actorConfig, {
50
+ action: actions,
51
+ event: piDurableEvents,
52
+ });
53
+ const withPi = (hook, opensHarness = true) => hook &&
54
+ ((c, ...args) => withPiAccess(c, durableOptions, () => hook(c, ...args), {
55
+ opensHarness,
56
+ }));
57
+ const userOnWake = actorConfig.onWake;
58
+ const userOnDisconnect = withPi(actorConfig.onDisconnect);
59
+ // The config is built from untyped parts, so `actor()` cannot check it
60
+ // against the generics. The declared return type is the public contract.
61
+ return actor({
62
+ ...sharedActorConfig("piDurable()", actorConfig, { slot: PI_DURABLE_RUNTIME, create: createPiDurableRuntime }, (c, stop) => closeHarness(c, durableOptions, stop), {
63
+ onSleep: withPi(actorConfig.onSleep, false),
64
+ onDestroy: withPi(actorConfig.onDestroy, false),
65
+ }),
66
+ db: db({ onMigrate: migratePiDurableTables }),
67
+ events: { ...(actorConfig.events ?? {}), ...piDurableEvents },
68
+ actions: {
69
+ ...wrapActions(actorConfig.actions ?? {}, (c, action) => withPiAccess(c, durableOptions, action)),
70
+ ...actions,
71
+ },
72
+ // Opening on wake resumes interrupted work, after the app's own onWake.
73
+ onWake: async (c) => {
74
+ let harness;
75
+ try {
76
+ harness = await openOnWake(c, durableOptions);
77
+ }
78
+ catch (error) {
79
+ // The actor stays up so actions can report the cause, such as a
80
+ // schema newer than the code. Using c.pi throws it.
81
+ c.log.error({
82
+ msg: "pi durable could not open on wake; actions will retry",
83
+ error,
84
+ });
85
+ return withUnavailablePi(c, error, () => userOnWake?.(c));
86
+ }
87
+ Object.defineProperty(c, "pi", { value: harness, configurable: true });
88
+ try {
89
+ await userOnWake?.(c);
90
+ }
91
+ finally {
92
+ harness.resume();
93
+ }
94
+ },
95
+ onConnect: withPi(actorConfig.onConnect),
96
+ onDisconnect: async (c, conn) => {
97
+ try {
98
+ await userOnDisconnect?.(c, conn);
99
+ }
100
+ finally {
101
+ const runtime = piDurableRuntime(c);
102
+ await unwatchConnection(runtime.actor ?? c, runtime.watches, conn.id);
103
+ }
104
+ },
105
+ });
106
+ }
107
+ //# sourceMappingURL=actor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor.js","sourceRoot":"","sources":["../../src/durable/actor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type ExecutionEnv } from "@earendil-works/pi-durable/env";
2
+ import type { Sandbox } from "@rivet-dev/sandbox-adapter";
3
+ /**
4
+ * Pi Durable's `ExecutionEnv` inside a sandbox, for Pi's built-in tools
5
+ * (`CodingTools`). Paths outside the sandbox `cwd` are rejected, and commands
6
+ * never receive the actor host's environment variables.
7
+ *
8
+ * Only the operations Pi's tools use are supported. Every other operation
9
+ * returns a `not_supported` error. Operations return failures instead of
10
+ * throwing. Building the environment throws when `cwd` is outside the sandbox.
11
+ */
12
+ export declare function sandboxEnv(id: string, sandbox: Sandbox, cwd: string | undefined): ExecutionEnv;
13
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/durable/env.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,YAAY,EAWjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAG1D;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACzB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,GAAG,SAAS,GACrB,YAAY,CA8Ed"}