rivetkit 2.3.27 → 2.3.28

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/dist/browser/client.js +1 -4
  2. package/dist/browser/client.js.map +1 -1
  3. package/dist/browser/inspector/client.js +1 -4
  4. package/dist/browser/inspector/client.js.map +1 -1
  5. package/dist/tsup/agent-os/index.cjs +3 -2652
  6. package/dist/tsup/agent-os/index.cjs.map +1 -1
  7. package/dist/tsup/agent-os/index.d.cts +1 -2717
  8. package/dist/tsup/agent-os/index.d.ts +1 -2717
  9. package/dist/tsup/agent-os/index.js +3 -2652
  10. package/dist/tsup/agent-os/index.js.map +1 -1
  11. package/dist/tsup/{chunk-DIIXK2AW.js → chunk-3EYXDC64.js} +6 -6
  12. package/dist/tsup/chunk-3EYXDC64.js.map +1 -0
  13. package/dist/tsup/{chunk-HD5Y64WY.cjs → chunk-3X3QZVH6.cjs} +141 -141
  14. package/dist/tsup/chunk-3X3QZVH6.cjs.map +1 -0
  15. package/dist/tsup/{chunk-36WJAWHE.cjs → chunk-4LMR7FES.cjs} +7 -7
  16. package/dist/tsup/{chunk-36WJAWHE.cjs.map → chunk-4LMR7FES.cjs.map} +1 -1
  17. package/dist/tsup/{chunk-NEECPYAK.cjs → chunk-67PPGBOA.cjs} +3 -3
  18. package/dist/tsup/{chunk-NEECPYAK.cjs.map → chunk-67PPGBOA.cjs.map} +1 -1
  19. package/dist/tsup/{chunk-2WAICEBJ.cjs → chunk-DRG3YQ42.cjs} +3 -3
  20. package/dist/tsup/{chunk-2WAICEBJ.cjs.map → chunk-DRG3YQ42.cjs.map} +1 -1
  21. package/dist/tsup/{chunk-UR6UKRJW.cjs → chunk-FHZZ6PLK.cjs} +2 -5
  22. package/dist/tsup/chunk-FHZZ6PLK.cjs.map +1 -0
  23. package/dist/tsup/{chunk-NRYPHQWQ.js → chunk-IKMLO5KS.js} +4 -4
  24. package/dist/tsup/{chunk-M763VP2Z.js → chunk-KJBV7M2J.js} +3 -3
  25. package/dist/tsup/{chunk-PIRTTV4D.js → chunk-QLIVFNLT.js} +2 -2
  26. package/dist/tsup/{chunk-WU6DYFFQ.cjs → chunk-S5EZP52Q.cjs} +3 -3
  27. package/dist/tsup/{chunk-WU6DYFFQ.cjs.map → chunk-S5EZP52Q.cjs.map} +1 -1
  28. package/dist/tsup/{chunk-6JIDCRGT.cjs → chunk-SRRUW63T.cjs} +4 -4
  29. package/dist/tsup/{chunk-6JIDCRGT.cjs.map → chunk-SRRUW63T.cjs.map} +1 -1
  30. package/dist/tsup/{chunk-SREEDRMF.js → chunk-SWESH3VP.js} +2 -2
  31. package/dist/tsup/{chunk-ISPGIGCR.js → chunk-UEQ5NN24.js} +2 -2
  32. package/dist/tsup/{chunk-TCZ2DONE.js → chunk-WB3BJJWJ.js} +2 -5
  33. package/dist/tsup/chunk-WB3BJJWJ.js.map +1 -0
  34. package/dist/tsup/{chunk-AGGXTWDS.cjs → chunk-XQIPFU3I.cjs} +10 -10
  35. package/dist/tsup/{chunk-AGGXTWDS.cjs.map → chunk-XQIPFU3I.cjs.map} +1 -1
  36. package/dist/tsup/{chunk-V43A2WB2.js → chunk-XQVCT3CM.js} +2 -2
  37. package/dist/tsup/client/mod.cjs +5 -5
  38. package/dist/tsup/client/mod.js +4 -4
  39. package/dist/tsup/common/log.cjs +2 -2
  40. package/dist/tsup/common/log.js +1 -1
  41. package/dist/tsup/common/websocket.cjs +3 -3
  42. package/dist/tsup/common/websocket.js +2 -2
  43. package/dist/tsup/db/drizzle.cjs +2 -2
  44. package/dist/tsup/db/drizzle.js +1 -1
  45. package/dist/tsup/db/mod.cjs +3 -3
  46. package/dist/tsup/db/mod.js +2 -2
  47. package/dist/tsup/inspector/mod.cjs +5 -5
  48. package/dist/tsup/inspector/mod.js +4 -4
  49. package/dist/tsup/inspector/workflow.cjs +4 -4
  50. package/dist/tsup/inspector/workflow.js +3 -3
  51. package/dist/tsup/mod.cjs +84 -84
  52. package/dist/tsup/mod.cjs.map +1 -1
  53. package/dist/tsup/mod.js +5 -5
  54. package/dist/tsup/test/mod.cjs +6 -6
  55. package/dist/tsup/test/mod.js +4 -4
  56. package/dist/tsup/utils.cjs +2 -2
  57. package/dist/tsup/utils.js +1 -1
  58. package/dist/tsup/workflow/mod.cjs +7 -7
  59. package/dist/tsup/workflow/mod.js +4 -4
  60. package/package.json +9 -12
  61. package/src/agent-os/index.ts +5 -65
  62. package/src/client/actor-handle.ts +3 -1
  63. package/src/client/client.ts +8 -4
  64. package/dist/tsup/chunk-DIIXK2AW.js.map +0 -1
  65. package/dist/tsup/chunk-HD5Y64WY.cjs.map +0 -1
  66. package/dist/tsup/chunk-TCZ2DONE.js.map +0 -1
  67. package/dist/tsup/chunk-UR6UKRJW.cjs.map +0 -1
  68. package/src/agent-os/actor/cron.ts +0 -84
  69. package/src/agent-os/actor/db.ts +0 -54
  70. package/src/agent-os/actor/filesystem.ts +0 -131
  71. package/src/agent-os/actor/index.ts +0 -285
  72. package/src/agent-os/actor/network.ts +0 -58
  73. package/src/agent-os/actor/preview.ts +0 -190
  74. package/src/agent-os/actor/process.ts +0 -177
  75. package/src/agent-os/actor/session.ts +0 -518
  76. package/src/agent-os/actor/shell.ts +0 -60
  77. package/src/agent-os/config.ts +0 -79
  78. package/src/agent-os/fs/database-vfs.ts +0 -624
  79. package/src/agent-os/types.ts +0 -148
  80. /package/dist/tsup/{chunk-NRYPHQWQ.js.map → chunk-IKMLO5KS.js.map} +0 -0
  81. /package/dist/tsup/{chunk-M763VP2Z.js.map → chunk-KJBV7M2J.js.map} +0 -0
  82. /package/dist/tsup/{chunk-PIRTTV4D.js.map → chunk-QLIVFNLT.js.map} +0 -0
  83. /package/dist/tsup/{chunk-SREEDRMF.js.map → chunk-SWESH3VP.js.map} +0 -0
  84. /package/dist/tsup/{chunk-ISPGIGCR.js.map → chunk-UEQ5NN24.js.map} +0 -0
  85. /package/dist/tsup/{chunk-V43A2WB2.js.map → chunk-XQVCT3CM.js.map} +0 -0
@@ -1,177 +0,0 @@
1
- import type {
2
- ProcessInfo,
3
- ProcessTreeNode,
4
- SpawnedProcessInfo,
5
- } from "@rivet-dev/agent-os-core";
6
- import { isRivetErrorCode } from "@/actor/errors";
7
- import type { AgentOsActorConfig } from "../config";
8
- import type { AgentOsActionContext } from "../types";
9
- import { ensureVm, syncPreventSleep } from "./index";
10
-
11
- // Infer types from AgentOs methods since @secure-exec/core is not a direct dep.
12
- type ExecResult = Awaited<
13
- ReturnType<import("@rivet-dev/agent-os-core").AgentOs["exec"]>
14
- >;
15
- type ExecOptions = Parameters<
16
- import("@rivet-dev/agent-os-core").AgentOs["exec"]
17
- >[1];
18
- type SpawnOptions = Parameters<
19
- import("@rivet-dev/agent-os-core").AgentOs["spawn"]
20
- >[2];
21
-
22
- function broadcastProcessEvent<TConnParams>(
23
- c: AgentOsActionContext<TConnParams>,
24
- name: "processOutput" | "processExit",
25
- payload: unknown,
26
- ) {
27
- try {
28
- c.broadcast(name, payload);
29
- } catch (error) {
30
- if (isRivetErrorCode(error, "actor", "stopping")) {
31
- return;
32
- }
33
- throw error;
34
- }
35
- }
36
-
37
- // Build process execution actions for the actor factory.
38
- export function buildProcessActions<TConnParams>(
39
- config: AgentOsActorConfig<TConnParams>,
40
- ) {
41
- return {
42
- exec: async (
43
- c: AgentOsActionContext<TConnParams>,
44
- command: string,
45
- options?: ExecOptions,
46
- ): Promise<ExecResult> => {
47
- const agentOs = await ensureVm(c, config);
48
- return agentOs.exec(command, options);
49
- },
50
-
51
- spawn: async (
52
- c: AgentOsActionContext<TConnParams>,
53
- command: string,
54
- args: string[],
55
- options?: SpawnOptions,
56
- ): Promise<{ pid: number }> => {
57
- const agentOs = await ensureVm(c, config);
58
- const { pid } = agentOs.spawn(command, args, {
59
- ...options,
60
- onStdout: (data: Uint8Array) => {
61
- broadcastProcessEvent(c, "processOutput", {
62
- pid,
63
- stream: "stdout" as const,
64
- data,
65
- });
66
- options?.onStdout?.(data);
67
- },
68
- onStderr: (data: Uint8Array) => {
69
- broadcastProcessEvent(c, "processOutput", {
70
- pid,
71
- stream: "stderr" as const,
72
- data,
73
- });
74
- options?.onStderr?.(data);
75
- },
76
- });
77
-
78
- c.vars.activeProcesses.add(pid);
79
- syncPreventSleep(c);
80
- c.log.info({
81
- msg: "agent-os process spawned",
82
- pid,
83
- command,
84
- });
85
-
86
- agentOs
87
- .waitProcess(pid)
88
- .then((exitCode) => {
89
- broadcastProcessEvent(c, "processExit", { pid, exitCode });
90
- c.log.info({
91
- msg: "agent-os process exited",
92
- pid,
93
- exitCode,
94
- });
95
- })
96
- .catch(() => {
97
- // Process killed during dispose. Silently clean up.
98
- })
99
- .finally(() => {
100
- c.vars.activeProcesses.delete(pid);
101
- syncPreventSleep(c);
102
- });
103
-
104
- return { pid };
105
- },
106
-
107
- writeProcessStdin: async (
108
- c: AgentOsActionContext<TConnParams>,
109
- pid: number,
110
- data: string | Uint8Array,
111
- ): Promise<void> => {
112
- const agentOs = await ensureVm(c, config);
113
- agentOs.writeProcessStdin(pid, data);
114
- },
115
-
116
- closeProcessStdin: async (
117
- c: AgentOsActionContext<TConnParams>,
118
- pid: number,
119
- ): Promise<void> => {
120
- const agentOs = await ensureVm(c, config);
121
- agentOs.closeProcessStdin(pid);
122
- },
123
-
124
- waitProcess: async (
125
- c: AgentOsActionContext<TConnParams>,
126
- pid: number,
127
- ): Promise<number> => {
128
- const agentOs = await ensureVm(c, config);
129
- return agentOs.waitProcess(pid);
130
- },
131
-
132
- listProcesses: async (
133
- c: AgentOsActionContext<TConnParams>,
134
- ): Promise<SpawnedProcessInfo[]> => {
135
- const agentOs = await ensureVm(c, config);
136
- return agentOs.listProcesses();
137
- },
138
-
139
- allProcesses: async (
140
- c: AgentOsActionContext<TConnParams>,
141
- ): Promise<ProcessInfo[]> => {
142
- const agentOs = await ensureVm(c, config);
143
- return agentOs.allProcesses();
144
- },
145
-
146
- processTree: async (
147
- c: AgentOsActionContext<TConnParams>,
148
- ): Promise<ProcessTreeNode[]> => {
149
- const agentOs = await ensureVm(c, config);
150
- return agentOs.processTree();
151
- },
152
-
153
- getProcess: async (
154
- c: AgentOsActionContext<TConnParams>,
155
- pid: number,
156
- ): Promise<SpawnedProcessInfo> => {
157
- const agentOs = await ensureVm(c, config);
158
- return agentOs.getProcess(pid);
159
- },
160
-
161
- stopProcess: async (
162
- c: AgentOsActionContext<TConnParams>,
163
- pid: number,
164
- ): Promise<void> => {
165
- const agentOs = await ensureVm(c, config);
166
- agentOs.stopProcess(pid);
167
- },
168
-
169
- killProcess: async (
170
- c: AgentOsActionContext<TConnParams>,
171
- pid: number,
172
- ): Promise<void> => {
173
- const agentOs = await ensureVm(c, config);
174
- agentOs.killProcess(pid);
175
- },
176
- };
177
- }
@@ -1,518 +0,0 @@
1
- import type {
2
- AgentOs,
3
- AgentType,
4
- CreateSessionOptions,
5
- GetEventsOptions,
6
- JsonRpcNotification,
7
- JsonRpcResponse,
8
- PermissionReply,
9
- SequencedEvent,
10
- SessionConfigOption,
11
- SessionInfo,
12
- SessionModeState,
13
- } from "@rivet-dev/agent-os-core";
14
- import type { AgentOsActorConfig } from "../config";
15
- import type {
16
- AgentOsActionContext,
17
- PersistedSessionEvent,
18
- PersistedSessionRecord,
19
- PromptResult,
20
- SessionRecord,
21
- } from "../types";
22
- import { ensureVm, runHook, syncPreventSleep } from "./index";
23
-
24
- // Strip non-serializable values (functions) from agent-os-core responses so
25
- // CBOR/BARE encoding doesn't fail. The JsonRpcResponse objects from
26
- // secure-exec can contain function properties.
27
- function stripFunctions(value: unknown): unknown {
28
- if (value === null || value === undefined) return value;
29
- if (typeof value === "function") return undefined;
30
- if (typeof value !== "object") return value;
31
- if (Array.isArray(value)) return value.map(stripFunctions);
32
- const out: Record<string, unknown> = {};
33
- for (const [k, v] of Object.entries(value as Record<string, unknown>)) {
34
- if (typeof v !== "function") {
35
- out[k] = stripFunctions(v);
36
- }
37
- }
38
- return out;
39
- }
40
-
41
- // Helper to verify a session exists in the VM. Throws via AgentOs if not found.
42
- function assertSessionExists<TConnParams>(
43
- c: AgentOsActionContext<TConnParams>,
44
- sessionId: string,
45
- ): void {
46
- if (!c.vars.sessions.has(sessionId)) {
47
- throw new Error(`session not found: ${sessionId}`);
48
- }
49
- }
50
-
51
- // Build a SessionRecord from AgentOs flat API.
52
- function toSessionRecord(
53
- agentOs: AgentOs,
54
- sessionId: string,
55
- agentType: string,
56
- ): SessionRecord {
57
- return {
58
- sessionId,
59
- agentType,
60
- capabilities: agentOs.getSessionCapabilities(sessionId) ?? {},
61
- agentInfo: agentOs.getSessionAgentInfo(sessionId),
62
- };
63
- }
64
-
65
- // --- Session persistence helpers ---
66
-
67
- // Persist a session record to SQLite when it is created.
68
- async function persistSession<TConnParams>(
69
- c: AgentOsActionContext<TConnParams>,
70
- agentOs: AgentOs,
71
- sessionId: string,
72
- agentType: string,
73
- ): Promise<void> {
74
- const now = Date.now();
75
- const capabilities = agentOs.getSessionCapabilities(sessionId) ?? {};
76
- const agentInfo = agentOs.getSessionAgentInfo(sessionId);
77
- await c.db.execute(
78
- `INSERT OR REPLACE INTO agent_os_sessions (session_id, agent_type, capabilities, agent_info, created_at)
79
- VALUES (?, ?, ?, ?, ?)`,
80
- sessionId,
81
- agentType,
82
- JSON.stringify(capabilities),
83
- agentInfo ? JSON.stringify(agentInfo) : null,
84
- now,
85
- );
86
- }
87
-
88
- // Persist a session event to SQLite with an auto-incrementing sequence number.
89
- async function persistSessionEvent<TConnParams>(
90
- c: AgentOsActionContext<TConnParams>,
91
- sessionId: string,
92
- event: JsonRpcNotification,
93
- ): Promise<void> {
94
- const now = Date.now();
95
-
96
- // Compute next sequence number for this session.
97
- const rows: { max_seq: number | null }[] = await c.db.execute(
98
- `SELECT MAX(seq) as max_seq FROM agent_os_session_events WHERE session_id = ?`,
99
- sessionId,
100
- );
101
- const nextSeq = (rows[0]?.max_seq ?? -1) + 1;
102
-
103
- await c.db.execute(
104
- `INSERT INTO agent_os_session_events (session_id, seq, event, created_at)
105
- VALUES (?, ?, ?, ?)`,
106
- sessionId,
107
- nextSeq,
108
- JSON.stringify(event),
109
- now,
110
- );
111
- }
112
-
113
- // Remove a session and its events from SQLite.
114
- async function deletePersistedSession<TConnParams>(
115
- c: AgentOsActionContext<TConnParams>,
116
- sessionId: string,
117
- ): Promise<void> {
118
- await c.db.execute(
119
- `DELETE FROM agent_os_session_events WHERE session_id = ?`,
120
- sessionId,
121
- );
122
- await c.db.execute(
123
- `DELETE FROM agent_os_sessions WHERE session_id = ?`,
124
- sessionId,
125
- );
126
- }
127
-
128
- // Subscribe to a session's event and permission streams via the flat AgentOs API,
129
- // broadcasting events and running user-provided hooks.
130
- export function subscribeToSession<TConnParams>(
131
- c: AgentOsActionContext<TConnParams>,
132
- agentOs: AgentOs,
133
- sessionId: string,
134
- parsedConfig: AgentOsActorConfig<TConnParams>,
135
- ): void {
136
- agentOs.onSessionEvent(sessionId, (event) => {
137
- c.broadcast(
138
- "sessionEvent",
139
- JSON.parse(JSON.stringify({ sessionId, event })),
140
- );
141
-
142
- // Persist event to SQLite for sleep/wake recovery.
143
- persistSessionEvent(c, sessionId, event).catch((error) =>
144
- c.log.error({
145
- msg: "agent-os failed to persist session event",
146
- sessionId,
147
- error,
148
- }),
149
- );
150
-
151
- if (parsedConfig.onSessionEvent) {
152
- runHook(c, "onSessionEvent", () =>
153
- parsedConfig.onSessionEvent?.(c, sessionId, event),
154
- );
155
- }
156
- });
157
-
158
- agentOs.onPermissionRequest(sessionId, (request) => {
159
- c.broadcast(
160
- "permissionRequest",
161
- JSON.parse(JSON.stringify({ sessionId, request })),
162
- );
163
-
164
- if (parsedConfig.onPermissionRequest) {
165
- runHook(c, "onPermissionRequest", () =>
166
- parsedConfig.onPermissionRequest?.(c, sessionId, request),
167
- );
168
- }
169
- });
170
-
171
- c.vars.sessions.add(sessionId);
172
- }
173
-
174
- // Build session management actions for the actor factory.
175
- export function buildSessionActions<TConnParams>(
176
- config: AgentOsActorConfig<TConnParams>,
177
- ) {
178
- return {
179
- createSession: async (
180
- c: AgentOsActionContext<TConnParams>,
181
- agentType: AgentType,
182
- options?: CreateSessionOptions,
183
- ): Promise<SessionRecord> => {
184
- const agentOs = await ensureVm(c, config);
185
- const { sessionId } = await agentOs.createSession(
186
- agentType,
187
- options,
188
- );
189
- subscribeToSession(c, agentOs, sessionId, config);
190
-
191
- // Persist session metadata to SQLite for sleep/wake recovery.
192
- await persistSession(c, agentOs, sessionId, agentType);
193
-
194
- c.log.info({
195
- msg: "agent-os session created",
196
- sessionId,
197
- agentType,
198
- });
199
- return toSessionRecord(agentOs, sessionId, agentType);
200
- },
201
-
202
- listSessions: async (
203
- c: AgentOsActionContext<TConnParams>,
204
- ): Promise<SessionInfo[]> => {
205
- const agentOs = await ensureVm(c, config);
206
- return agentOs.listSessions();
207
- },
208
-
209
- getSession: async (
210
- c: AgentOsActionContext<TConnParams>,
211
- sessionId: string,
212
- ): Promise<SessionRecord> => {
213
- assertSessionExists(c, sessionId);
214
- const agentOs = await ensureVm(c, config);
215
- const info = agentOs
216
- .listSessions()
217
- .find((s) => s.sessionId === sessionId);
218
- if (!info) {
219
- throw new Error(`session not found: ${sessionId}`);
220
- }
221
- return toSessionRecord(agentOs, sessionId, info.agentType);
222
- },
223
-
224
- destroySession: async (
225
- c: AgentOsActionContext<TConnParams>,
226
- sessionId: string,
227
- ): Promise<void> => {
228
- const agentOs = await ensureVm(c, config);
229
- await agentOs.destroySession(sessionId);
230
- c.vars.sessions.delete(sessionId);
231
- c.vars.activeSessionIds.delete(sessionId);
232
- syncPreventSleep(c);
233
-
234
- // Clean up persisted session and events from SQLite.
235
- await deletePersistedSession(c, sessionId);
236
-
237
- c.log.info({ msg: "agent-os session destroyed", sessionId });
238
- },
239
-
240
- resumeSession: async (
241
- c: AgentOsActionContext<TConnParams>,
242
- sessionId: string,
243
- ): Promise<{ sessionId: string }> => {
244
- const agentOs = await ensureVm(c, config);
245
- return agentOs.resumeSession(sessionId);
246
- },
247
-
248
- closeSession: async (
249
- c: AgentOsActionContext<TConnParams>,
250
- sessionId: string,
251
- ): Promise<void> => {
252
- const agentOs = await ensureVm(c, config);
253
- agentOs.closeSession(sessionId);
254
- c.vars.sessions.delete(sessionId);
255
- c.vars.activeSessionIds.delete(sessionId);
256
- syncPreventSleep(c);
257
-
258
- // Clean up persisted session and events from SQLite.
259
- await deletePersistedSession(c, sessionId);
260
-
261
- c.log.info({ msg: "agent-os session closed", sessionId });
262
- },
263
- };
264
- }
265
-
266
- // Build prompt, cancel, and permission actions for the actor factory.
267
- export function buildPromptActions<TConnParams>(
268
- _config: AgentOsActorConfig<TConnParams>,
269
- ) {
270
- return {
271
- sendPrompt: async (
272
- c: AgentOsActionContext<TConnParams>,
273
- sessionId: string,
274
- text: string,
275
- ): Promise<PromptResult> => {
276
- if (c.aborted) {
277
- throw new Error(
278
- "actor is shutting down, cannot start new prompt",
279
- );
280
- }
281
-
282
- assertSessionExists(c, sessionId);
283
- const agentOs = c.vars.agentOs;
284
- if (!agentOs) {
285
- throw new Error("VM not initialized");
286
- }
287
-
288
- c.vars.activeSessionIds.add(sessionId);
289
- syncPreventSleep(c);
290
- c.log.info({ msg: "agent-os prompt turn started", sessionId });
291
-
292
- const start = Date.now();
293
- try {
294
- const result = await agentOs.prompt(sessionId, text);
295
- return {
296
- response: JSON.parse(JSON.stringify(result.response)),
297
- text: result.text,
298
- };
299
- } finally {
300
- c.vars.activeSessionIds.delete(sessionId);
301
- syncPreventSleep(c);
302
- c.log.info({
303
- msg: "agent-os prompt turn ended",
304
- sessionId,
305
- durationMs: Date.now() - start,
306
- });
307
- }
308
- },
309
-
310
- cancelPrompt: async (
311
- c: AgentOsActionContext<TConnParams>,
312
- sessionId: string,
313
- ): Promise<JsonRpcResponse> => {
314
- assertSessionExists(c, sessionId);
315
- const agentOs = c.vars.agentOs;
316
- if (!agentOs) {
317
- throw new Error("VM not initialized");
318
- }
319
- return stripFunctions(
320
- agentOs.cancelSession(sessionId),
321
- ) as JsonRpcResponse;
322
- },
323
-
324
- respondPermission: async (
325
- c: AgentOsActionContext<TConnParams>,
326
- sessionId: string,
327
- permissionId: string,
328
- reply: PermissionReply,
329
- ): Promise<JsonRpcResponse> => {
330
- assertSessionExists(c, sessionId);
331
- const agentOs = c.vars.agentOs;
332
- if (!agentOs) {
333
- throw new Error("VM not initialized");
334
- }
335
- return stripFunctions(
336
- agentOs.respondPermission(sessionId, permissionId, reply),
337
- ) as JsonRpcResponse;
338
- },
339
- };
340
- }
341
-
342
- // Build session configuration proxy actions for the actor factory.
343
- export function buildConfigActions<TConnParams>(
344
- _config: AgentOsActorConfig<TConnParams>,
345
- ) {
346
- return {
347
- setMode: async (
348
- c: AgentOsActionContext<TConnParams>,
349
- sessionId: string,
350
- modeId: string,
351
- ): Promise<JsonRpcResponse> => {
352
- assertSessionExists(c, sessionId);
353
- const agentOs = c.vars.agentOs;
354
- if (!agentOs) {
355
- throw new Error("VM not initialized");
356
- }
357
- return stripFunctions(
358
- agentOs.setSessionMode(sessionId, modeId),
359
- ) as JsonRpcResponse;
360
- },
361
-
362
- getModes: async (
363
- c: AgentOsActionContext<TConnParams>,
364
- sessionId: string,
365
- ): Promise<SessionModeState | null> => {
366
- assertSessionExists(c, sessionId);
367
- const agentOs = c.vars.agentOs;
368
- if (!agentOs) {
369
- throw new Error("VM not initialized");
370
- }
371
- return agentOs.getSessionModes(sessionId);
372
- },
373
-
374
- setModel: async (
375
- c: AgentOsActionContext<TConnParams>,
376
- sessionId: string,
377
- model: string,
378
- ): Promise<JsonRpcResponse> => {
379
- assertSessionExists(c, sessionId);
380
- const agentOs = c.vars.agentOs;
381
- if (!agentOs) {
382
- throw new Error("VM not initialized");
383
- }
384
- return stripFunctions(
385
- agentOs.setSessionModel(sessionId, model),
386
- ) as JsonRpcResponse;
387
- },
388
-
389
- setThoughtLevel: async (
390
- c: AgentOsActionContext<TConnParams>,
391
- sessionId: string,
392
- level: string,
393
- ): Promise<JsonRpcResponse> => {
394
- assertSessionExists(c, sessionId);
395
- const agentOs = c.vars.agentOs;
396
- if (!agentOs) {
397
- throw new Error("VM not initialized");
398
- }
399
- return stripFunctions(
400
- agentOs.setSessionThoughtLevel(sessionId, level),
401
- ) as JsonRpcResponse;
402
- },
403
-
404
- getConfigOptions: async (
405
- c: AgentOsActionContext<TConnParams>,
406
- sessionId: string,
407
- ): Promise<SessionConfigOption[]> => {
408
- assertSessionExists(c, sessionId);
409
- const agentOs = c.vars.agentOs;
410
- if (!agentOs) {
411
- throw new Error("VM not initialized");
412
- }
413
- return agentOs.getSessionConfigOptions(sessionId);
414
- },
415
-
416
- getEvents: async (
417
- c: AgentOsActionContext<TConnParams>,
418
- sessionId: string,
419
- options?: GetEventsOptions,
420
- ): Promise<JsonRpcNotification[]> => {
421
- assertSessionExists(c, sessionId);
422
- const agentOs = c.vars.agentOs;
423
- if (!agentOs) {
424
- throw new Error("VM not initialized");
425
- }
426
- return agentOs
427
- .getSessionEvents(sessionId, options)
428
- .map((e) => e.notification);
429
- },
430
-
431
- getSequencedEvents: async (
432
- c: AgentOsActionContext<TConnParams>,
433
- sessionId: string,
434
- options?: GetEventsOptions,
435
- ): Promise<SequencedEvent[]> => {
436
- assertSessionExists(c, sessionId);
437
- const agentOs = c.vars.agentOs;
438
- if (!agentOs) {
439
- throw new Error("VM not initialized");
440
- }
441
- return agentOs.getSessionEvents(sessionId, options);
442
- },
443
-
444
- rawSend: async (
445
- c: AgentOsActionContext<TConnParams>,
446
- sessionId: string,
447
- method: string,
448
- params?: Record<string, unknown>,
449
- ): Promise<JsonRpcResponse> => {
450
- assertSessionExists(c, sessionId);
451
- const agentOs = c.vars.agentOs;
452
- if (!agentOs) {
453
- throw new Error("VM not initialized");
454
- }
455
- return stripFunctions(
456
- agentOs.rawSessionSend(sessionId, method, params),
457
- ) as JsonRpcResponse;
458
- },
459
- };
460
- }
461
-
462
- // Build actions for querying persisted session data from SQLite.
463
- // These work without a running VM and return data from prior sessions
464
- // that survived sleep/wake cycles.
465
- export function buildSessionPersistenceActions<TConnParams>(
466
- _config: AgentOsActorConfig<TConnParams>,
467
- ) {
468
- return {
469
- listPersistedSessions: async (
470
- c: AgentOsActionContext<TConnParams>,
471
- ): Promise<PersistedSessionRecord[]> => {
472
- const rows: {
473
- session_id: string;
474
- agent_type: string;
475
- capabilities: string;
476
- agent_info: string | null;
477
- created_at: number;
478
- }[] = await c.db.execute(
479
- `SELECT session_id, agent_type, capabilities, agent_info, created_at
480
- FROM agent_os_sessions
481
- ORDER BY created_at ASC`,
482
- );
483
-
484
- return rows.map((row) => ({
485
- sessionId: row.session_id,
486
- agentType: row.agent_type,
487
- capabilities: JSON.parse(row.capabilities),
488
- agentInfo: row.agent_info ? JSON.parse(row.agent_info) : null,
489
- createdAt: row.created_at,
490
- }));
491
- },
492
-
493
- getSessionEvents: async (
494
- c: AgentOsActionContext<TConnParams>,
495
- sessionId: string,
496
- ): Promise<PersistedSessionEvent[]> => {
497
- const rows: {
498
- session_id: string;
499
- seq: number;
500
- event: string;
501
- created_at: number;
502
- }[] = await c.db.execute(
503
- `SELECT session_id, seq, event, created_at
504
- FROM agent_os_session_events
505
- WHERE session_id = ?
506
- ORDER BY seq ASC`,
507
- sessionId,
508
- );
509
-
510
- return rows.map((row) => ({
511
- sessionId: row.session_id,
512
- seq: row.seq,
513
- event: JSON.parse(row.event),
514
- createdAt: row.created_at,
515
- }));
516
- },
517
- };
518
- }