@nylorun/runtime 0.13.0-beta → 0.15.0-beta

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 (309) hide show
  1. package/CHANGELOG.md +434 -0
  2. package/README.md +137 -41
  3. package/dist/adapters/execution/restate.d.ts +7 -2
  4. package/dist/adapters/execution/restate.js +40 -10
  5. package/dist/adapters/replication/pgoutput.d.ts +21 -0
  6. package/dist/adapters/replication/pgoutput.js +170 -0
  7. package/dist/adapters/streams/s2.js +37 -20
  8. package/dist/admin-openapi.json +570 -0
  9. package/dist/api/a2a/card.d.ts +15 -0
  10. package/dist/api/a2a/card.js +24 -0
  11. package/dist/api/a2a/endpoint.d.ts +8 -0
  12. package/dist/api/a2a/endpoint.js +81 -0
  13. package/dist/api/a2a/protocol.d.ts +144 -0
  14. package/dist/api/a2a/protocol.js +188 -0
  15. package/dist/api/a2a/routes.d.ts +19 -0
  16. package/dist/api/a2a/routes.js +289 -0
  17. package/dist/api/a2a/tasks.d.ts +50 -0
  18. package/dist/api/a2a/tasks.js +186 -0
  19. package/dist/api/ag-ui/endpoint.d.ts +8 -0
  20. package/dist/api/ag-ui/endpoint.js +126 -0
  21. package/dist/api/ag-ui/history.d.ts +7 -0
  22. package/dist/api/ag-ui/history.js +60 -0
  23. package/dist/api/ag-ui/routes.d.ts +32 -0
  24. package/dist/api/ag-ui/routes.js +305 -0
  25. package/dist/api/ag-ui/session-id.d.ts +1 -0
  26. package/dist/api/ag-ui/session-id.js +12 -0
  27. package/dist/api/ag-ui/sse.d.ts +9 -0
  28. package/dist/api/ag-ui/sse.js +7 -0
  29. package/dist/api/ag-ui/translate.d.ts +38 -0
  30. package/dist/api/ag-ui/translate.js +222 -0
  31. package/dist/api/components.d.ts +8065 -0
  32. package/dist/api/components.js +82 -0
  33. package/dist/api/gate/keys.d.ts +14 -0
  34. package/dist/api/gate/keys.js +59 -0
  35. package/dist/api/gate/routes.d.ts +34 -0
  36. package/dist/api/gate/routes.js +235 -0
  37. package/dist/api/http/app.d.ts +18 -0
  38. package/dist/api/http/app.js +58 -0
  39. package/dist/api/http/body.d.ts +4 -0
  40. package/dist/api/http/body.js +37 -0
  41. package/dist/api/http/define.d.ts +39 -0
  42. package/dist/api/http/define.js +122 -0
  43. package/dist/api/http/respond.d.ts +9 -0
  44. package/dist/api/http/respond.js +44 -0
  45. package/dist/api/http/routes/access.d.ts +24 -0
  46. package/dist/api/http/routes/access.js +266 -0
  47. package/dist/api/http/routes/actions.d.ts +8 -0
  48. package/dist/api/http/routes/actions.js +76 -0
  49. package/dist/api/http/routes/endpoints.d.ts +7 -0
  50. package/dist/api/http/routes/endpoints.js +100 -0
  51. package/dist/api/http/routes/sessions.d.ts +3 -0
  52. package/dist/api/http/routes/sessions.js +205 -0
  53. package/dist/api/http/routes/tenant.d.ts +11 -0
  54. package/dist/api/http/routes/tenant.js +244 -0
  55. package/dist/api/http/routes/vaults.d.ts +8 -0
  56. package/dist/api/http/routes/vaults.js +167 -0
  57. package/dist/api/openapi.d.ts +19 -0
  58. package/dist/api/openapi.js +137 -0
  59. package/dist/api/route.d.ts +12 -0
  60. package/dist/api/route.js +4 -0
  61. package/dist/core/bearer.d.ts +8 -0
  62. package/dist/core/bearer.js +11 -0
  63. package/dist/core/flow-host.d.ts +7 -15
  64. package/dist/core/flow-host.js +16 -41
  65. package/dist/core/sandbox-routes.d.ts +12 -7
  66. package/dist/core/sandbox-routes.js +24 -25
  67. package/dist/execution/memory.d.ts +8 -5
  68. package/dist/execution/memory.js +33 -13
  69. package/dist/execution/types.d.ts +38 -6
  70. package/dist/execution/types.js +12 -3
  71. package/dist/gates/contract.d.ts +51 -0
  72. package/dist/gates/contract.js +37 -0
  73. package/dist/gates/handler.d.ts +21 -0
  74. package/dist/gates/handler.js +55 -0
  75. package/dist/gates/http-client.d.ts +12 -0
  76. package/dist/gates/http-client.js +160 -0
  77. package/dist/gates/in-process.d.ts +32 -0
  78. package/dist/gates/in-process.js +42 -0
  79. package/dist/gates/inflight.d.ts +39 -0
  80. package/dist/gates/inflight.js +70 -0
  81. package/dist/gates/mcp-handler.d.ts +35 -0
  82. package/dist/gates/mcp-handler.js +142 -0
  83. package/dist/gates/meter.d.ts +24 -0
  84. package/dist/gates/meter.js +165 -0
  85. package/dist/gates/model-gate.d.ts +45 -0
  86. package/dist/gates/model-gate.js +1 -0
  87. package/dist/gates/tenant-vaults.d.ts +64 -0
  88. package/dist/gates/tenant-vaults.js +94 -0
  89. package/dist/gates/tool-calls.d.ts +51 -0
  90. package/dist/gates/tool-calls.js +64 -0
  91. package/dist/gates/tool-client.d.ts +12 -0
  92. package/dist/gates/tool-client.js +201 -0
  93. package/dist/gates/tool-contract.d.ts +116 -0
  94. package/dist/gates/tool-contract.js +64 -0
  95. package/dist/gates/tool-gate.d.ts +45 -0
  96. package/dist/gates/tool-gate.js +10 -0
  97. package/dist/host/admin-api.d.ts +23 -0
  98. package/dist/host/admin-api.js +74 -0
  99. package/dist/host/app.d.ts +34 -0
  100. package/dist/host/app.js +181 -0
  101. package/dist/host/config-for.d.ts +3 -1
  102. package/dist/host/config-for.js +3 -2
  103. package/dist/host/config.d.ts +11 -0
  104. package/dist/host/cors.d.ts +27 -0
  105. package/dist/host/cors.js +64 -0
  106. package/dist/host/create-host.d.ts +36 -8
  107. package/dist/host/create-host.js +161 -330
  108. package/dist/host/execution.d.ts +20 -18
  109. package/dist/host/execution.js +2 -2
  110. package/dist/host/gates.d.ts +58 -0
  111. package/dist/host/gates.js +127 -0
  112. package/dist/host/http.d.ts +20 -4
  113. package/dist/host/http.js +81 -23
  114. package/dist/host/index.d.ts +1 -1
  115. package/dist/host/main.js +189 -58
  116. package/dist/host/stack-config.d.ts +91 -19
  117. package/dist/host/stack-config.js +246 -17
  118. package/dist/infra/database.d.ts +2 -2
  119. package/dist/infra/execution.d.ts +5 -5
  120. package/dist/infra/execution.js +8 -6
  121. package/dist/infra/index.d.ts +1 -1
  122. package/dist/infra/workers.d.ts +17 -17
  123. package/dist/infra/workers.js +9 -9
  124. package/dist/keys/client.d.ts +9 -0
  125. package/dist/keys/client.js +70 -0
  126. package/dist/keys/contract.d.ts +24 -0
  127. package/dist/keys/contract.js +12 -0
  128. package/dist/keys/keys.d.ts +41 -0
  129. package/dist/keys/keys.js +50 -0
  130. package/dist/mcp/connect.d.ts +43 -3
  131. package/dist/mcp/connect.js +12 -5
  132. package/dist/mcp/pool.d.ts +39 -3
  133. package/dist/mcp/pool.js +74 -11
  134. package/dist/model/catalog.d.ts +2 -10
  135. package/dist/model/classify.d.ts +13 -0
  136. package/dist/model/classify.js +61 -0
  137. package/dist/model/models.d.ts +10 -1
  138. package/dist/model/models.js +14 -6
  139. package/dist/model/pi-model.d.ts +17 -2
  140. package/dist/model/pi-model.js +366 -222
  141. package/dist/openapi.json +25889 -0
  142. package/dist/record/append.d.ts +51 -0
  143. package/dist/record/append.js +20 -0
  144. package/dist/record/envelope.d.ts +19 -0
  145. package/dist/record/envelope.js +49 -0
  146. package/dist/record/index.d.ts +11 -0
  147. package/dist/record/index.js +11 -0
  148. package/dist/sandbox/manager.d.ts +13 -1
  149. package/dist/sandbox/manager.js +8 -11
  150. package/dist/sandbox/resolve.d.ts +33 -0
  151. package/dist/sandbox/resolve.js +81 -0
  152. package/dist/sandbox/session-sandbox.d.ts +11 -0
  153. package/dist/sandbox/session-sandbox.js +51 -0
  154. package/dist/sandbox/share.d.ts +14 -2
  155. package/dist/sandbox/share.js +33 -3
  156. package/dist/sandbox/tenant-config.d.ts +37 -0
  157. package/dist/sandbox/tenant-config.js +51 -0
  158. package/dist/sandbox/tools.d.ts +7 -9
  159. package/dist/sandbox/tools.js +11 -3
  160. package/dist/sandbox/types.d.ts +8 -2
  161. package/dist/store/postgres/connect.d.ts +25 -9
  162. package/dist/store/postgres/connect.js +27 -10
  163. package/dist/store/postgres/db.d.ts +16 -0
  164. package/dist/store/postgres/db.js +28 -0
  165. package/dist/store/postgres/drizzle/0000_foundation.sql +22 -0
  166. package/dist/store/postgres/drizzle/0001_baseline.sql +255 -0
  167. package/dist/store/postgres/drizzle/0002_stream_relay.sql +4 -0
  168. package/dist/store/postgres/drizzle/0003_tool_crossings.sql +9 -0
  169. package/dist/store/postgres/drizzle/meta/_journal.json +34 -0
  170. package/dist/store/postgres/migrate.d.ts +68 -0
  171. package/dist/store/postgres/migrate.js +183 -0
  172. package/dist/store/postgres/record-writer.d.ts +4 -0
  173. package/dist/store/postgres/record-writer.js +34 -0
  174. package/dist/store/postgres/record.d.ts +5 -0
  175. package/dist/store/postgres/record.js +60 -0
  176. package/dist/store/postgres/schema.d.ts +3096 -0
  177. package/dist/store/postgres/schema.js +363 -0
  178. package/dist/store/postgres/store.d.ts +2 -4
  179. package/dist/store/postgres/store.js +590 -434
  180. package/dist/store/postgres/tenant.d.ts +56 -0
  181. package/dist/store/postgres/tenant.js +154 -0
  182. package/dist/store/types.d.ts +183 -132
  183. package/dist/store/types.js +0 -1
  184. package/dist/streams/basin.d.ts +18 -1
  185. package/dist/streams/basin.js +34 -2
  186. package/dist/streams/control.d.ts +18 -0
  187. package/dist/streams/control.js +33 -0
  188. package/dist/streams/memory.d.ts +3 -1
  189. package/dist/streams/memory.js +14 -8
  190. package/dist/streams/relay/core.d.ts +35 -0
  191. package/dist/streams/relay/core.js +366 -0
  192. package/dist/streams/relay/types.d.ts +78 -0
  193. package/dist/streams/relay/types.js +8 -0
  194. package/dist/streams/types.d.ts +71 -36
  195. package/dist/streams/types.js +18 -53
  196. package/dist/tenant/access-policy.d.ts +30 -0
  197. package/dist/tenant/access-policy.js +52 -0
  198. package/dist/tenant/actions.d.ts +10 -149
  199. package/dist/tenant/actions.js +5 -167
  200. package/dist/tenant/advance.d.ts +7 -2
  201. package/dist/tenant/advance.js +125 -14
  202. package/dist/tenant/auth.d.ts +19 -17
  203. package/dist/tenant/auth.js +90 -93
  204. package/dist/tenant/browser.d.ts +15 -0
  205. package/dist/tenant/browser.js +39 -0
  206. package/dist/tenant/cause.d.ts +25 -0
  207. package/dist/tenant/cause.js +45 -0
  208. package/dist/tenant/commands.d.ts +18 -2
  209. package/dist/tenant/commands.js +111 -115
  210. package/dist/tenant/context.d.ts +101 -21
  211. package/dist/tenant/context.js +14 -10
  212. package/dist/tenant/delivery-token.d.ts +41 -0
  213. package/dist/tenant/delivery-token.js +104 -0
  214. package/dist/tenant/delivery.d.ts +62 -0
  215. package/dist/tenant/delivery.js +481 -0
  216. package/dist/tenant/effects.d.ts +20 -1
  217. package/dist/tenant/effects.js +159 -42
  218. package/dist/tenant/endpoints.d.ts +67 -0
  219. package/dist/tenant/endpoints.js +90 -0
  220. package/dist/tenant/ephemeral.d.ts +22 -7
  221. package/dist/tenant/ephemeral.js +83 -125
  222. package/dist/tenant/history.d.ts +64 -0
  223. package/dist/tenant/history.js +120 -0
  224. package/dist/tenant/http.d.ts +8 -9
  225. package/dist/tenant/http.js +13 -27
  226. package/dist/tenant/jwt.d.ts +16 -0
  227. package/dist/tenant/jwt.js +50 -0
  228. package/dist/tenant/model-setting.d.ts +2 -2
  229. package/dist/tenant/module.d.ts +17 -28
  230. package/dist/tenant/module.js +133 -279
  231. package/dist/tenant/outbound.d.ts +44 -0
  232. package/dist/tenant/outbound.js +127 -0
  233. package/dist/tenant/paths.d.ts +11 -16
  234. package/dist/tenant/paths.js +24 -68
  235. package/dist/tenant/pool.d.ts +1 -3
  236. package/dist/tenant/pool.js +1 -19
  237. package/dist/tenant/principals.d.ts +23 -11
  238. package/dist/tenant/principals.js +61 -49
  239. package/dist/tenant/reset.d.ts +0 -4
  240. package/dist/tenant/reset.js +0 -5
  241. package/dist/tenant/runtime.d.ts +28 -20
  242. package/dist/tenant/runtime.js +95 -64
  243. package/dist/tenant/scheduler.d.ts +10 -3
  244. package/dist/tenant/scheduler.js +9 -5
  245. package/dist/tenant/session-streams.d.ts +127 -0
  246. package/dist/tenant/session-streams.js +404 -0
  247. package/dist/tenant/sessions.d.ts +28 -4
  248. package/dist/tenant/sessions.js +118 -24
  249. package/dist/tenant/signing-keys.d.ts +55 -0
  250. package/dist/tenant/signing-keys.js +172 -0
  251. package/dist/tenant/slim.d.ts +8 -0
  252. package/dist/tenant/slim.js +21 -0
  253. package/dist/tenant/status.d.ts +3 -3
  254. package/dist/tenant/status.js +20 -13
  255. package/dist/tenant/store-pg.d.ts +9 -6
  256. package/dist/tenant/store-pg.js +60 -125
  257. package/dist/tenant/streams.d.ts +62 -85
  258. package/dist/tenant/streams.js +143 -226
  259. package/dist/tenant/subject-limits.d.ts +16 -0
  260. package/dist/tenant/subject-limits.js +45 -0
  261. package/dist/tenant/sweep.d.ts +1 -10
  262. package/dist/tenant/sweep.js +29 -69
  263. package/dist/tenant/tokens.d.ts +14 -0
  264. package/dist/tenant/tokens.js +180 -0
  265. package/dist/tenant/transcript.d.ts +48 -5
  266. package/dist/tenant/transcript.js +58 -1
  267. package/dist/tenant/types.d.ts +69 -98
  268. package/dist/tenant/types.js +4 -15
  269. package/dist/tenant/worker.d.ts +3 -1
  270. package/dist/tenant/worker.js +13 -7
  271. package/dist/vault/host-model.d.ts +31 -0
  272. package/dist/vault/host-model.js +57 -0
  273. package/dist/vault/service.d.ts +44 -17
  274. package/dist/vault/service.js +126 -121
  275. package/dist/version.d.ts +1 -1
  276. package/dist/version.js +1 -1
  277. package/package.json +25 -9
  278. package/dist/core/executors.d.ts +0 -44
  279. package/dist/core/executors.js +0 -95
  280. package/dist/store/memory.d.ts +0 -57
  281. package/dist/store/memory.js +0 -645
  282. package/dist/store/postgres/migrations/001_initial.d.ts +0 -27
  283. package/dist/store/postgres/migrations/001_initial.js +0 -196
  284. package/dist/store/postgres/migrations/002_session_owner.d.ts +0 -6
  285. package/dist/store/postgres/migrations/002_session_owner.js +0 -13
  286. package/dist/store/postgres/migrations/index.d.ts +0 -49
  287. package/dist/store/postgres/migrations/index.js +0 -76
  288. package/dist/store/postgres/names.d.ts +0 -11
  289. package/dist/store/postgres/names.js +0 -42
  290. package/dist/store/postgres/tenants.d.ts +0 -90
  291. package/dist/store/postgres/tenants.js +0 -214
  292. package/dist/streams/relay.d.ts +0 -37
  293. package/dist/streams/relay.js +0 -254
  294. package/dist/tenant/envelope.d.ts +0 -7
  295. package/dist/tenant/envelope.js +0 -22
  296. package/dist/tenant/live.d.ts +0 -92
  297. package/dist/tenant/live.js +0 -290
  298. package/dist/tenant/quarantine-error.d.ts +0 -6
  299. package/dist/tenant/quarantine-error.js +0 -9
  300. package/dist/tenant/quarantine.d.ts +0 -27
  301. package/dist/tenant/quarantine.js +0 -72
  302. package/dist/tenant/routes-tenant.d.ts +0 -12
  303. package/dist/tenant/routes-tenant.js +0 -137
  304. package/dist/tenant/routes.d.ts +0 -9
  305. package/dist/tenant/routes.js +0 -151
  306. package/dist/tenant/store-memory.d.ts +0 -16
  307. package/dist/tenant/store-memory.js +0 -111
  308. /package/dist/{store → record}/cursor.d.ts +0 -0
  309. /package/dist/{store → record}/cursor.js +0 -0
@@ -1,151 +0,0 @@
1
- import { PutAgentRequestSchema, PutSessionRequestSchema, RegisterExecutorsRequestSchema, SessionCommandSchema, } from "@nylorun/core/contracts";
2
- import { VaultError } from "../vault/error.js";
3
- import { SandboxRouteError, handleSessionSandboxTool, } from "../core/sandbox-routes.js";
4
- import { loadSession, sessionOf } from "./context.js";
5
- import { HttpError, OpaqueAuthError, fail, readBody, requestAborted, } from "./http.js";
6
- import { authenticate, authorize, ownerOf, requireApplication, requirePrincipal, } from "./auth.js";
7
- import { command } from "./commands.js";
8
- import { actionSandboxTool, deleteExecutor, listExecutors, listPendingActions, registerExecutors, sandboxRouteDeps, updateAction, } from "./actions.js";
9
- import { listDefinitions, listSessions, putDefinition, putSession, sessionView, } from "./sessions.js";
10
- import { readHistory, requestCursor, streamExecutorWork, streamSessionEvents, } from "./live.js";
11
- import { dispatchTenant, dispatchVault } from "./routes-tenant.js";
12
- export async function handle(ctx, request, response, _url) {
13
- const json = (value, status = 200) => {
14
- const payload = JSON.stringify(value);
15
- response.writeHead(status, {
16
- "content-type": "application/json",
17
- "content-length": Buffer.byteLength(payload),
18
- });
19
- response.end(payload);
20
- };
21
- try {
22
- const url = _url ?? new URL(request.url ?? "/", "http://runtime");
23
- const path = url.pathname
24
- .split("/")
25
- .filter(Boolean)
26
- .map(decodeURIComponent);
27
- const method = request.method;
28
- const scope = await authenticate(ctx, request);
29
- if (path[0] !== "v1")
30
- fail(404, "Route not found");
31
- authorize(scope, method, path);
32
- // Set when the request acts for a subject: only the subject's own sessions are reachable.
33
- const owner = ownerOf(scope);
34
- if (path[1] === "executors" && path[2] === "connect" && method === "GET") {
35
- if (scope.kind !== "executor")
36
- return fail(403, "Executor credential required");
37
- streamExecutorWork(ctx.live, request, response, scope.executor.tokenHash);
38
- return;
39
- }
40
- if (path[1] === "actions") {
41
- if (scope.kind !== "executor")
42
- return fail(403, "Executor credential required");
43
- if (path.length === 2 && method === "GET")
44
- return json(await listPendingActions(ctx, scope.executor));
45
- const actionId = path[2];
46
- if (!actionId)
47
- fail(404, "Action not found");
48
- if (method === "POST" &&
49
- path[3] === "sandbox" &&
50
- path[4] &&
51
- path.length === 5)
52
- return json(await actionSandboxTool(ctx, scope, actionId, path[4], request));
53
- const body = await readBody(request);
54
- return json(await updateAction(ctx, scope, actionId, method, path[3], body));
55
- }
56
- if (path[1] === "sessions" &&
57
- path[2] &&
58
- path[3] === "commands" &&
59
- method === "POST")
60
- return json(await command(ctx, path[2], SessionCommandSchema.parse(await readBody(request)), scope));
61
- if (path[1] === "vaults")
62
- return json(await dispatchVault(ctx, scope, method, path, url, request));
63
- if (path[1] === "tenant")
64
- return json(await dispatchTenant(ctx, scope, method, path, request));
65
- const principalId = requirePrincipal(scope);
66
- if (path[1] === "executors" && path.length === 2 && method === "GET")
67
- return json(listExecutors(ctx));
68
- // The length guard matters: the connect branch above only matches GET, so without it a
69
- // PUT to /v1/executors/connect would register an agent literally named "connect".
70
- if (path[1] === "executors" && path.length === 2 && method === "PUT")
71
- return json(await registerExecutors(ctx, principalId, RegisterExecutorsRequestSchema.parse(await readBody(request))));
72
- if (path[1] === "executors" &&
73
- path.length === 3 &&
74
- path[2] &&
75
- method === "DELETE")
76
- return json(await deleteExecutor(ctx, path[2]));
77
- if (path[1] === "agents" && path.length === 2 && method === "GET")
78
- return json(await listDefinitions(ctx));
79
- if (path[1] === "sessions" && path.length === 2 && method === "GET")
80
- return json(await listSessions(ctx, url.searchParams.get("agentId"), owner));
81
- if (path[1] === "agents" &&
82
- path[2] &&
83
- path.length === 3 &&
84
- method === "PUT")
85
- return json(await putDefinition(ctx, path[2], PutAgentRequestSchema.parse(await readBody(request))));
86
- if (path[1] === "sessions" && path[2]) {
87
- const id = path[2];
88
- if (method === "PUT" && path.length === 3) {
89
- const body = PutSessionRequestSchema.parse(await readBody(request));
90
- const session = await putSession(ctx, id, body, owner);
91
- return json(await ctx.store.tx((t) => sessionView(t, session)));
92
- }
93
- if (method === "GET" && path.length === 3)
94
- return json(await ctx.store.tx(async (t) => sessionView(t, await sessionOf(t, id, owner))));
95
- // Every other session route needs the session to exist.
96
- await loadSession(ctx, id, owner);
97
- const cursor = requestCursor(request, url);
98
- if (method === "GET" && path[3] === "items")
99
- return json(await readHistory(ctx, id, cursor, url.searchParams.get("agent") ?? undefined));
100
- if (method === "GET" && path[3] === "events") {
101
- await streamSessionEvents(ctx, request, response, id, cursor);
102
- return;
103
- }
104
- if (method === "POST" &&
105
- path[3] === "sandbox" &&
106
- path[4] &&
107
- path.length === 5) {
108
- requireApplication(scope);
109
- try {
110
- const outcome = await handleSessionSandboxTool(sandboxRouteDeps(ctx), id, path[4], await readBody(request), requestAborted(request));
111
- return json(outcome);
112
- }
113
- catch (error) {
114
- if (error instanceof SandboxRouteError)
115
- fail(error.status, error.message);
116
- throw error;
117
- }
118
- }
119
- }
120
- fail(404, "Route not found");
121
- }
122
- catch (error) {
123
- if (response.headersSent) {
124
- response.end();
125
- return;
126
- }
127
- if (error instanceof OpaqueAuthError) {
128
- json(error.body, error.status);
129
- return;
130
- }
131
- const status = error instanceof HttpError ||
132
- error instanceof VaultError ||
133
- error instanceof SandboxRouteError
134
- ? error.status
135
- : error?.name === "ZodError" ||
136
- error?.message === "Invalid cursor"
137
- ? 400
138
- : 500;
139
- const rejection = error instanceof HttpError ? error.rejection : {};
140
- json({
141
- status: "rejected",
142
- code: status === 500
143
- ? "internal_error"
144
- : rejection.code ?? "request_rejected",
145
- message: status === 500 ? "Runtime request failed" : error.message,
146
- ...(rejection.details === undefined
147
- ? {}
148
- : { details: rejection.details }),
149
- }, status);
150
- }
151
- }
@@ -1,16 +0,0 @@
1
- import type { SessionStore } from "../store/types.js";
2
- import { type Logger, type OpenTenantRuntime, type TenantConfig, type TenantStore } from "./types.js";
3
- export interface MemoryTenantStoreOptions {
4
- /** When set, each Tenant's directory under this Host root lives as long as the Tenant. */
5
- hostRoot?: string;
6
- openRuntime: OpenTenantRuntime;
7
- configFor: (tenantId: string) => TenantConfig;
8
- logger?: Logger;
9
- }
10
- export type MemoryTenantStore = TenantStore & {
11
- /** Test helper: current Tenant ids. */
12
- ids(): string[];
13
- /** Test helper: a Session Store on a Tenant's data, as another process would open it. */
14
- sessionStore(id: string): SessionStore;
15
- };
16
- export declare function createMemoryTenantStore(options: MemoryTenantStoreOptions): MemoryTenantStore;
@@ -1,111 +0,0 @@
1
- /**
2
- * An in-memory Tenant store for tests: each Tenant is a `MemoryStoreData` (its Session
3
- * Store's data) and an envelope. It behaves like the Postgres store (`store-pg.ts`): the
4
- * Tenant directory under the Host root, when one is given, is created with the Tenant and
5
- * removed with it, and `open` hands the Tenant Runtime a fresh Session Store on the Tenant's
6
- * data. Not a supported profile.
7
- */
8
- import { mkdirSync, rmSync } from "node:fs";
9
- import { isTenantId } from "@nylorun/core/compatibility";
10
- import { MEMORY_SCHEMA_VERSION, MemorySessionStore, MemoryStoreData, } from "../store/memory.js";
11
- import { quarantine } from "./quarantine.js";
12
- import { parseEnvelope } from "./envelope.js";
13
- import { tenantPaths } from "./paths.js";
14
- import { bootstrapPrincipal, bootstrapPrincipalMatches } from "./principals.js";
15
- import { TenantNotFoundError, } from "./types.js";
16
- export function createMemoryTenantStore(options) {
17
- const records = new Map();
18
- function sessionStore(id, data) {
19
- return new MemorySessionStore({
20
- tenantId: id,
21
- onError: (error) => options.logger?.error("post-commit step failed", {
22
- message: error instanceof Error ? error.message : String(error),
23
- }),
24
- }, data);
25
- }
26
- function makeDirectory(id) {
27
- if (!options.hostRoot)
28
- return;
29
- const p = tenantPaths(options.hostRoot, id);
30
- mkdirSync(p.root, { recursive: true, mode: 0o700 });
31
- for (const dir of [p.home, p.tmp, p.sandboxes, p.pluginData, p.logs])
32
- mkdirSync(dir, { recursive: true });
33
- }
34
- function removeDirectory(id) {
35
- if (options.hostRoot)
36
- rmSync(tenantPaths(options.hostRoot, id).root, {
37
- recursive: true,
38
- force: true,
39
- });
40
- }
41
- async function withStore(id, data, fn) {
42
- const store = sessionStore(id, data);
43
- try {
44
- return await fn(store);
45
- }
46
- finally {
47
- await store.close();
48
- }
49
- }
50
- return {
51
- ids() {
52
- return [...records.keys()];
53
- },
54
- sessionStore(id) {
55
- const record = records.get(id);
56
- if (!record)
57
- throw new TenantNotFoundError(id);
58
- return sessionStore(id, record.data);
59
- },
60
- async enumerate() {
61
- return [...records.keys()].filter(isTenantId).sort();
62
- },
63
- async readEnvelope(id) {
64
- const record = records.get(id);
65
- if (!record)
66
- throw new TenantNotFoundError(id);
67
- return parseEnvelope(record.envelope, id);
68
- },
69
- async create(envelope, bootstrap) {
70
- const parsed = parseEnvelope({ ...envelope, schemaVersion: MEMORY_SCHEMA_VERSION }, envelope.id);
71
- if (records.has(parsed.id))
72
- return "exists";
73
- makeDirectory(parsed.id);
74
- const data = new MemoryStoreData();
75
- await withStore(parsed.id, data, (store) => store.tx((t) => bootstrapPrincipal(t, bootstrap)));
76
- records.set(parsed.id, { envelope: parsed, data });
77
- return "created";
78
- },
79
- async bootstrapMatches(id, bootstrap) {
80
- const record = records.get(id);
81
- if (!record)
82
- return false;
83
- return withStore(id, record.data, (store) => store.tx((t) => bootstrapPrincipalMatches(t, bootstrap)));
84
- },
85
- async open(id) {
86
- const record = records.get(id);
87
- if (!record)
88
- throw new TenantNotFoundError(id);
89
- if (record.envelope.schemaVersion > MEMORY_SCHEMA_VERSION)
90
- throw quarantine("schema-too-new", `Tenant schema version ${record.envelope.schemaVersion} is newer than this Runtime's ${MEMORY_SCHEMA_VERSION}`, { tenantId: id });
91
- makeDirectory(id);
92
- const store = sessionStore(id, record.data);
93
- try {
94
- return await options.openRuntime({ ...options.configFor(id), tenantId: id }, { store, envelope: record.envelope });
95
- }
96
- catch (error) {
97
- await store.close().catch(() => undefined);
98
- throw error;
99
- }
100
- },
101
- async trash(id) {
102
- records.delete(id);
103
- removeDirectory(id);
104
- },
105
- async removePartial(id) {
106
- if (records.has(id))
107
- return;
108
- removeDirectory(id);
109
- },
110
- };
111
- }
File without changes
File without changes