@nylorun/runtime 0.16.0-beta → 0.19.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 (256) hide show
  1. package/CHANGELOG.md +207 -0
  2. package/README.md +105 -63
  3. package/dist/adapters/execution/restate.d.ts +1 -3
  4. package/dist/adapters/execution/restate.js +4 -31
  5. package/dist/adapters/replication/pgoutput.js +1 -1
  6. package/dist/adapters/sandbox/local.js +1 -1
  7. package/dist/adapters/sandbox/virtual.js +1 -1
  8. package/dist/api/ag-ui/endpoint.js +1 -2
  9. package/dist/api/ag-ui/routes.d.ts +1 -1
  10. package/dist/api/ag-ui/routes.js +11 -13
  11. package/dist/api/ag-ui/translate.d.ts +1 -3
  12. package/dist/api/ag-ui/translate.js +2 -17
  13. package/dist/api/components.d.ts +4783 -2588
  14. package/dist/api/components.js +19 -21
  15. package/dist/api/gate/routes.d.ts +7 -8
  16. package/dist/api/gate/routes.js +58 -52
  17. package/dist/api/http/app.d.ts +6 -0
  18. package/dist/api/http/app.js +20 -14
  19. package/dist/api/http/define.d.ts +22 -13
  20. package/dist/api/http/define.js +43 -39
  21. package/dist/api/http/routes/access.d.ts +3 -19
  22. package/dist/api/http/routes/access.js +25 -184
  23. package/dist/api/http/routes/artifacts.js +3 -7
  24. package/dist/api/http/routes/files.d.ts +8 -0
  25. package/dist/api/http/routes/files.js +77 -0
  26. package/dist/api/http/routes/keys.d.ts +10 -0
  27. package/dist/api/http/routes/keys.js +64 -0
  28. package/dist/api/http/routes/me.d.ts +13 -0
  29. package/dist/api/http/routes/me.js +48 -0
  30. package/dist/api/http/routes/reads.d.ts +66 -0
  31. package/dist/api/http/routes/reads.js +127 -0
  32. package/dist/api/http/routes/sandboxes.d.ts +2 -2
  33. package/dist/api/http/routes/sandboxes.js +8 -7
  34. package/dist/api/http/routes/sessions.js +31 -20
  35. package/dist/api/http/routes/tenant.js +15 -18
  36. package/dist/api/http/routes/vaults.d.ts +13 -3
  37. package/dist/api/http/routes/vaults.js +136 -64
  38. package/dist/api/openapi.d.ts +10 -11
  39. package/dist/api/openapi.js +292 -68
  40. package/dist/artifacts/links.js +6 -6
  41. package/dist/artifacts/service.js +1 -1
  42. package/dist/core/flow-host.d.ts +44 -23
  43. package/dist/core/flow-host.js +88 -106
  44. package/dist/core/provider.d.ts +4 -1
  45. package/dist/core/provider.js +6 -1
  46. package/dist/core/sandbox-routes.d.ts +0 -9
  47. package/dist/core/sandbox-routes.js +2 -21
  48. package/dist/execution/memory.d.ts +4 -5
  49. package/dist/execution/memory.js +11 -25
  50. package/dist/execution/types.d.ts +3 -33
  51. package/dist/execution/types.js +2 -12
  52. package/dist/gates/http-tool.d.ts +86 -0
  53. package/dist/gates/http-tool.js +197 -0
  54. package/dist/gates/mcp-handler.d.ts +3 -0
  55. package/dist/gates/mcp-handler.js +6 -4
  56. package/dist/gates/meter.d.ts +2 -2
  57. package/dist/gates/meter.js +6 -0
  58. package/dist/gates/tenant-vaults.d.ts +19 -14
  59. package/dist/gates/tenant-vaults.js +17 -12
  60. package/dist/gates/tool-calls.d.ts +7 -15
  61. package/dist/gates/tool-calls.js +4 -4
  62. package/dist/gates/tool-client.d.ts +1 -1
  63. package/dist/gates/tool-client.js +23 -47
  64. package/dist/gates/tool-contract.d.ts +27 -39
  65. package/dist/gates/tool-contract.js +30 -21
  66. package/dist/gates/tool-gate.d.ts +25 -24
  67. package/dist/gates/tool-gate.js +11 -7
  68. package/dist/harness/calls.d.ts +10 -4
  69. package/dist/harness/calls.js +15 -6
  70. package/dist/harness/executors.d.ts +1 -1
  71. package/dist/harness/executors.js +17 -12
  72. package/dist/harness/main.d.ts +2 -2
  73. package/dist/harness/main.js +5 -13
  74. package/dist/harness/service.d.ts +4 -5
  75. package/dist/harness/service.js +9 -2
  76. package/dist/harness-api/in-process.js +2 -2
  77. package/dist/harness-api/record.d.ts +6 -3
  78. package/dist/harness-api/record.js +65 -72
  79. package/dist/harness-api/server.d.ts +1 -9
  80. package/dist/harness-api/server.js +19 -17
  81. package/dist/harness-api/start.js +1 -5
  82. package/dist/harness-api/workspace.js +2 -3
  83. package/dist/harness-api/ws-server.js +1 -1
  84. package/dist/host/app.d.ts +2 -10
  85. package/dist/host/app.js +24 -44
  86. package/dist/host/config-for.d.ts +5 -5
  87. package/dist/host/config-for.js +2 -3
  88. package/dist/host/config.d.ts +0 -11
  89. package/dist/host/create-host.d.ts +3 -40
  90. package/dist/host/create-host.js +18 -91
  91. package/dist/host/environment.d.ts +0 -3
  92. package/dist/host/environment.js +0 -9
  93. package/dist/host/gates.d.ts +4 -1
  94. package/dist/host/gates.js +9 -3
  95. package/dist/host/http.d.ts +1 -2
  96. package/dist/host/http.js +1 -7
  97. package/dist/host/index.d.ts +2 -2
  98. package/dist/host/index.js +2 -2
  99. package/dist/host/main.js +55 -40
  100. package/dist/host/operate.d.ts +29 -0
  101. package/dist/host/operate.js +223 -0
  102. package/dist/host/stack-config.d.ts +23 -20
  103. package/dist/host/stack-config.js +28 -44
  104. package/dist/index.d.ts +4 -1
  105. package/dist/index.js +3 -1
  106. package/dist/infra/workers.d.ts +1 -1
  107. package/dist/keys/client.js +9 -1
  108. package/dist/keys/keys.d.ts +12 -2
  109. package/dist/keys/keys.js +10 -2
  110. package/dist/management-openapi.json +6491 -0
  111. package/dist/mcp/connect.d.ts +8 -4
  112. package/dist/mcp/connect.js +8 -27
  113. package/dist/mcp/pool.d.ts +6 -9
  114. package/dist/mcp/pool.js +8 -18
  115. package/dist/mcp/snapshot.d.ts +8 -2
  116. package/dist/mcp/snapshot.js +29 -2
  117. package/dist/media.d.ts +1 -1
  118. package/dist/media.js +1 -1
  119. package/dist/model/pi-model.js +3 -0
  120. package/dist/openapi.json +6228 -15615
  121. package/dist/reads/access.d.ts +4 -0
  122. package/dist/reads/access.js +12 -0
  123. package/dist/reads/cursor.d.ts +11 -0
  124. package/dist/reads/cursor.js +80 -0
  125. package/dist/reads/types.d.ts +25 -0
  126. package/dist/reads/types.js +1 -0
  127. package/dist/sandbox/manager.d.ts +16 -0
  128. package/dist/sandbox/manager.js +40 -0
  129. package/dist/sandbox/session-sandbox.js +13 -3
  130. package/dist/sandbox/skills.d.ts +13 -0
  131. package/dist/sandbox/skills.js +46 -0
  132. package/dist/sandbox/types.d.ts +2 -2
  133. package/dist/store/ownership.d.ts +9 -0
  134. package/dist/store/ownership.js +13 -0
  135. package/dist/store/postgres/connect.d.ts +2 -0
  136. package/dist/store/postgres/connect.js +29 -0
  137. package/dist/store/postgres/drizzle/0008_installation_vaults.sql +2 -0
  138. package/dist/store/postgres/drizzle/0009_oauth_pending.sql +19 -0
  139. package/dist/store/postgres/drizzle/0010_oss_auth_removals.sql +3 -0
  140. package/dist/store/postgres/drizzle/0011_key_roles.sql +3 -0
  141. package/dist/store/postgres/drizzle/0012_session_reads.sql +8 -0
  142. package/dist/store/postgres/drizzle/0013_definition_files.sql +16 -0
  143. package/dist/store/postgres/drizzle/0014_action_endpoints_removed.sql +2 -0
  144. package/dist/store/postgres/drizzle/meta/_journal.json +49 -0
  145. package/dist/store/postgres/reads.d.ts +3 -0
  146. package/dist/store/postgres/reads.js +272 -0
  147. package/dist/store/postgres/schema.d.ts +423 -594
  148. package/dist/store/postgres/schema.js +84 -101
  149. package/dist/store/postgres/store.js +96 -248
  150. package/dist/store/postgres/tenant.d.ts +34 -2
  151. package/dist/store/postgres/tenant.js +16 -32
  152. package/dist/store/types.d.ts +44 -119
  153. package/dist/store/types.js +0 -1
  154. package/dist/streams/control.d.ts +0 -7
  155. package/dist/streams/control.js +0 -13
  156. package/dist/streams/types.d.ts +2 -20
  157. package/dist/streams/types.js +1 -1
  158. package/dist/tenant/advance.d.ts +3 -3
  159. package/dist/tenant/advance.js +10 -7
  160. package/dist/tenant/auth.d.ts +24 -15
  161. package/dist/tenant/auth.js +44 -55
  162. package/dist/tenant/cause.d.ts +3 -3
  163. package/dist/tenant/cause.js +1 -1
  164. package/dist/tenant/commands.d.ts +2 -18
  165. package/dist/tenant/commands.js +38 -179
  166. package/dist/tenant/context.d.ts +33 -45
  167. package/dist/tenant/definition-files.d.ts +24 -0
  168. package/dist/tenant/definition-files.js +103 -0
  169. package/dist/tenant/effects.d.ts +20 -18
  170. package/dist/tenant/effects.js +59 -133
  171. package/dist/tenant/ephemeral.d.ts +21 -8
  172. package/dist/tenant/ephemeral.js +11 -12
  173. package/dist/tenant/host-token.js +5 -5
  174. package/dist/tenant/identity-file.d.ts +75 -0
  175. package/dist/tenant/identity-file.js +202 -0
  176. package/dist/tenant/issuers.d.ts +48 -0
  177. package/dist/tenant/issuers.js +311 -0
  178. package/dist/tenant/jwt.js +3 -3
  179. package/dist/tenant/module.d.ts +1 -4
  180. package/dist/tenant/module.js +3 -12
  181. package/dist/tenant/operator-keys.d.ts +44 -0
  182. package/dist/tenant/operator-keys.js +87 -0
  183. package/dist/tenant/outbound.d.ts +40 -1
  184. package/dist/tenant/outbound.js +167 -18
  185. package/dist/tenant/paths.d.ts +1 -1
  186. package/dist/tenant/paths.js +1 -3
  187. package/dist/tenant/principals.d.ts +13 -13
  188. package/dist/tenant/principals.js +35 -36
  189. package/dist/tenant/run-token.js +6 -6
  190. package/dist/tenant/runtime.d.ts +5 -3
  191. package/dist/tenant/runtime.js +29 -15
  192. package/dist/tenant/sandboxes.d.ts +9 -6
  193. package/dist/tenant/sandboxes.js +16 -5
  194. package/dist/tenant/scheduler.d.ts +1 -5
  195. package/dist/tenant/scheduler.js +2 -5
  196. package/dist/tenant/session-streams.d.ts +8 -11
  197. package/dist/tenant/session-streams.js +48 -32
  198. package/dist/tenant/session.d.ts +8 -41
  199. package/dist/tenant/session.js +0 -37
  200. package/dist/tenant/sessions.d.ts +2 -2
  201. package/dist/tenant/sessions.js +17 -9
  202. package/dist/tenant/signing-keys.d.ts +3 -2
  203. package/dist/tenant/signing-keys.js +5 -5
  204. package/dist/tenant/skill-tool.d.ts +20 -0
  205. package/dist/tenant/skill-tool.js +72 -0
  206. package/dist/tenant/slim.d.ts +1 -1
  207. package/dist/tenant/slim.js +1 -1
  208. package/dist/tenant/status.js +7 -12
  209. package/dist/tenant/store-pg.d.ts +15 -0
  210. package/dist/tenant/store-pg.js +7 -3
  211. package/dist/tenant/streams.d.ts +3 -11
  212. package/dist/tenant/streams.js +2 -29
  213. package/dist/tenant/sweep.js +0 -5
  214. package/dist/tenant/transcript.d.ts +2 -2
  215. package/dist/tenant/transcript.js +2 -2
  216. package/dist/tenant/types.d.ts +33 -19
  217. package/dist/tenant/worker.d.ts +1 -3
  218. package/dist/tenant/worker.js +3 -8
  219. package/dist/vault/crypto.d.ts +7 -0
  220. package/dist/vault/crypto.js +16 -0
  221. package/dist/vault/oauth.d.ts +55 -0
  222. package/dist/vault/oauth.js +186 -0
  223. package/dist/vault/service.d.ts +54 -7
  224. package/dist/vault/service.js +261 -17
  225. package/dist/vault/sources.d.ts +60 -0
  226. package/dist/vault/sources.js +196 -0
  227. package/dist/version.d.ts +1 -1
  228. package/dist/version.js +1 -1
  229. package/package.json +5 -4
  230. package/dist/admin-openapi.json +0 -604
  231. package/dist/api/http/routes/actions.d.ts +0 -8
  232. package/dist/api/http/routes/actions.js +0 -76
  233. package/dist/api/http/routes/endpoints.d.ts +0 -7
  234. package/dist/api/http/routes/endpoints.js +0 -100
  235. package/dist/host/admin-api.d.ts +0 -23
  236. package/dist/host/admin-api.js +0 -74
  237. package/dist/host/cors.d.ts +0 -27
  238. package/dist/host/cors.js +0 -64
  239. package/dist/mcp/stdio.d.ts +0 -17
  240. package/dist/mcp/stdio.js +0 -82
  241. package/dist/tenant/access-policy.d.ts +0 -30
  242. package/dist/tenant/access-policy.js +0 -52
  243. package/dist/tenant/actions.d.ts +0 -14
  244. package/dist/tenant/actions.js +0 -29
  245. package/dist/tenant/browser.d.ts +0 -15
  246. package/dist/tenant/browser.js +0 -39
  247. package/dist/tenant/delivery-token.d.ts +0 -41
  248. package/dist/tenant/delivery-token.js +0 -104
  249. package/dist/tenant/delivery.d.ts +0 -62
  250. package/dist/tenant/delivery.js +0 -481
  251. package/dist/tenant/endpoints.d.ts +0 -67
  252. package/dist/tenant/endpoints.js +0 -90
  253. package/dist/tenant/subject-limits.d.ts +0 -16
  254. package/dist/tenant/subject-limits.js +0 -45
  255. package/dist/tenant/tokens.d.ts +0 -14
  256. package/dist/tenant/tokens.js +0 -187
@@ -1,40 +1,3 @@
1
- /**
2
- * The tables of a Tenant database (session-store.md §2–§3): the source drizzle-kit generates
3
- * the migrations from (`drizzle/`, `CONTRIBUTING.md` "Adding a migration") and the query
4
- * builder's view of them. Column names are the camelCase keys in snake_case (`casing:
5
- * "snake_case"`, here, in `db.ts` and in `drizzle.config.ts`).
6
- *
7
- * - `nylorun` holds the Tenant's state: the one `tenant` row, the document tables, Action
8
- * endpoints, principals, vaults and credentials, signing keys, publishable keys, subject
9
- * epochs and usage, settings, the model usage ledger, the model budgets, the Tool Gate's
10
- * crossings and file artifacts with their versions.
11
- * - `nylorun_streams` holds the record (Durable Streams §6): `session_events`,
12
- * `session_log_heads` and the relay's `relay_slots`. The relay's publication is custom SQL
13
- * (`drizzle/0002_stream_relay.sql`).
14
- *
15
- * What the columns keep:
16
- *
17
- * - **Bodies are `json`, not `jsonb`** (`jsonText`), written as the text `JSON.stringify`
18
- * wrote, so every string round-trips exactly, key order included. `jsonb` rejects the
19
- * escapes `\u0000` (`22P05`) and unpaired surrogates (`\ud800`), which tool output can
20
- * contain; `json` stores the text verbatim and checks only its syntax.
21
- * - **Indexed fields of a body are stored generated columns** read through
22
- * `nylorun.doc(body)` (custom SQL, `drizzle/0000_foundation.sql`), which casts to `jsonb`
23
- * after replacing those two escapes with `\ufffd`: the body is untouched, and only an indexed
24
- * field that itself contained one (never an id, status or timestamp) would see U+FFFD.
25
- * Queries never apply `->`/`->>` to a `json` body (Postgres de-escapes the whole text and
26
- * fails on the same escapes); they read the generated columns.
27
- * - **Ids and timestamps compared as text are `COLLATE "C"`** (`textC`), so they order by code
28
- * point whatever the database's collation.
29
- * - **Timestamps are ISO text**, except the session lease `owner_expires_at` and the record's
30
- * `committed_at` (`timestamptz`).
31
- * - **Sealed secrets are `bytea` columns** (`bytes`), never inside a JSON body.
32
- * - Sessions carry the store-managed ownership columns (`owner`, `epoch`,
33
- * `owner_expires_at`), which are never in `body`.
34
- *
35
- * Columns are listed in the order the tables have them, so a database created by these
36
- * migrations and one created by the hand-written migrations they replaced dump the same.
37
- */
38
1
  import { sql } from "drizzle-orm";
39
2
  import { bigint, boolean, check, customType, doublePrecision, foreignKey, index, integer, pgSchema, primaryKey, text, timestamp, uniqueIndex, } from "drizzle-orm/pg-core";
40
3
  export const TENANT_SCHEMA = "nylorun";
@@ -92,11 +55,14 @@ export const tenant = nylorun.table("tenant", {
92
55
  retiredGenerations: integer().array().notNull().default(sql `'{}'`),
93
56
  }, () => [check("tenant_singleton_check", sql `singleton`)]);
94
57
  export const definitions = documents("definitions");
58
+ const xid8 = customType({ dataType: () => "xid8" });
95
59
  export const sessions = nylorun.table("sessions", {
96
60
  id: textC().primaryKey(),
97
61
  body: jsonText().notNull(),
98
62
  status: field("->>'status'"),
99
63
  agentId: field("->>'agentId'"),
64
+ /** Unknown for legacy sessions; assigned only on insert. */
65
+ createdAt: timestamp({ withTimezone: true, mode: "string" }).defaultNow(),
100
66
  /** The lease holder; store-managed, never in `body`. */
101
67
  owner: text(),
102
68
  epoch: bigint({ mode: "number" }).notNull().default(0),
@@ -106,6 +72,7 @@ export const sessions = nylorun.table("sessions", {
106
72
  /** The sandbox resource the session is attached to (`sandbox: { id }`). */
107
73
  sandboxId: field("->>'sandboxId'"),
108
74
  }, (t) => [
75
+ index("sessions_created").on(t.createdAt.desc().nullsLast(), t.id.desc().nullsFirst()),
109
76
  index("sessions_status").on(t.status, t.ownerExpiresAt),
110
77
  index("sessions_agent").on(t.agentId),
111
78
  index("sessions_owner_user").on(t.ownerUserId),
@@ -123,29 +90,16 @@ export const effects = nylorun.table("effects", {
123
90
  index("effects_session").on(t.sessionId, t.turnId, t.status),
124
91
  index("effects_status").on(t.status, t.kind),
125
92
  ]);
126
- export const actions = nylorun.table("actions", {
127
- id: textC().primaryKey(),
128
- body: jsonText().notNull(),
129
- sessionId: field("->>'sessionId'"),
130
- turnId: field("->>'turnId'"),
131
- agentId: field("->>'agentId'"),
132
- status: field("->>'status'"),
133
- kind: field("->>'kind'"),
134
- /** When the Action being delivered is lost (ISO text). */
135
- deadlineAt: field("->>'deadlineAt'"),
136
- }, (t) => [
137
- index("actions_session").on(t.sessionId, t.turnId, t.status),
138
- index("actions_agent").on(t.agentId, t.status),
139
- index("actions_status").on(t.status, t.kind),
140
- index("actions_deadline").on(t.status, t.deadlineAt),
141
- ]);
142
93
  export const sandboxes = documents("sandboxes");
143
94
  export const links = nylorun.table("links", {
144
95
  id: textC().primaryKey(),
145
96
  body: jsonText().notNull(),
146
97
  workflowSessionId: field("->>'workflowSessionId'"),
147
98
  }, (t) => [index("links_workflow").on(t.workflowSessionId)]);
148
- /** An application principal: who holds a key, by its SHA-256. */
99
+ /**
100
+ * A principal: who holds a key, by its SHA-256, and what the key reaches (`role`, protocol 8):
101
+ * `application` the Runtime API, `management` the Management API, `studio` both.
102
+ */
149
103
  export const principals = nylorun.table("principals", {
150
104
  id: textC().primaryKey(),
151
105
  role: text().$type().notNull(),
@@ -160,11 +114,15 @@ export const vaults = nylorun.table("vaults", {
160
114
  /** JSON text, or null. */
161
115
  metadataJson: text(),
162
116
  createdAt: textC().notNull(),
163
- scope: text({ enum: ["user", "host"] }).notNull().default("user"),
117
+ /**
118
+ * `user`: one person's (owner `ownerUserId`); `installation`: the installation's own,
119
+ * attachable to any session (owner `installation`); `host`: the model vault, never attached.
120
+ */
121
+ scope: text({ enum: ["user", "installation", "host"] }).notNull().default("user"),
164
122
  }, (t) => [
165
123
  index("vaults_owner").on(t.ownerUserId, t.createdAt, t.id),
166
124
  uniqueIndex("vaults_one_host").on(t.scope).where(sql `scope = 'host'`),
167
- check("vaults_scope_check", sql `scope IN ('user', 'host')`),
125
+ check("vaults_scope_check", sql `scope IN ('user', 'installation', 'host')`),
168
126
  ]);
169
127
  /** A credential of a vault: its binding in the clear, its secret sealed. */
170
128
  export const vaultCredentials = nylorun.table("vault_credentials", {
@@ -207,11 +165,48 @@ export const vaultIdempotency = nylorun.table("vault_idempotency", {
207
165
  /** JSON text of the original response. */
208
166
  response: text().notNull(),
209
167
  });
168
+ /**
169
+ * An MCP OAuth connect between its start and its callback (F9 C2): found by the SHA-256 of its
170
+ * `state`, used once, for ten minutes. The PKCE verifier and any client secret are sealed under
171
+ * the vault key (`sealBytes`), which only the keys module holds.
172
+ */
173
+ export const oauthPending = nylorun.table("oauth_pending", {
174
+ stateHash: text().primaryKey(),
175
+ vaultId: text().notNull(),
176
+ /** The MCP server's name in the agent, the credential's name. */
177
+ server: text().notNull(),
178
+ /** The MCP server's URL (normalized): the credential's binding. */
179
+ url: text().notNull(),
180
+ tokenEndpoint: text().notNull(),
181
+ clientId: text().notNull(),
182
+ /** How the client authenticates at the token endpoint: `none`, `client_secret_basic` or `client_secret_post`. */
183
+ tokenEndpointAuth: text({ enum: ["none", "client_secret_basic", "client_secret_post"] }).notNull(),
184
+ /** The RFC 8707 resource indicator sent with the authorization request, if any. */
185
+ resource: text(),
186
+ kekId: text().notNull(),
187
+ /** Sealed; null for a public client. */
188
+ clientSecret: bytes(),
189
+ /** Sealed. */
190
+ codeVerifier: bytes().notNull(),
191
+ redirectUri: text().notNull(),
192
+ expiresAt: textC().notNull(),
193
+ createdAt: textC().notNull(),
194
+ }, (t) => [
195
+ foreignKey({
196
+ name: "oauth_pending_vault_id_fkey",
197
+ columns: [t.vaultId],
198
+ foreignColumns: [vaults.id],
199
+ }).onDelete("cascade"),
200
+ index("oauth_pending_expires").on(t.expiresAt),
201
+ ]);
210
202
  export const tenantSettings = nylorun.table("tenant_settings", {
211
203
  key: text().primaryKey(),
212
204
  value: text().notNull(),
213
205
  });
214
- /** The Tenant's signing keys (subject tokens): the private half sealed, the public JWK not. */
206
+ /**
207
+ * The Tenant's signing keys (capability links, run and host tokens): the
208
+ * private half sealed, the public JWK not.
209
+ */
215
210
  export const signingKeys = nylorun.table("signing_keys", {
216
211
  id: textC().primaryKey(),
217
212
  state: text({ enum: ["standby", "current", "previous", "revoked"] }).notNull(),
@@ -233,50 +228,6 @@ export const signingKeys = nylorun.table("signing_keys", {
233
228
  uniqueIndex("signing_keys_one_current").on(t.state).where(sql `state = 'current'`),
234
229
  uniqueIndex("signing_keys_one_previous").on(t.state).where(sql `state = 'previous'`),
235
230
  ]);
236
- /** Each subject's revocation epoch. */
237
- export const subjectEpochs = nylorun.table("subject_epochs", {
238
- subject: textC().primaryKey(),
239
- epoch: bigint({ mode: "number" }).notNull(),
240
- revokedAt: text().notNull(),
241
- });
242
- /** Each subject's turn bucket: tokens left and when they were last refilled. */
243
- export const subjectUsage = nylorun.table("subject_usage", {
244
- subject: textC().primaryKey(),
245
- turnTokens: doublePrecision().notNull(),
246
- refilledAt: text().notNull(),
247
- });
248
- /** Publishable keys (Host feature `browser-access`): public by design. */
249
- export const publishableKeys = nylorun.table("publishable_keys", {
250
- id: textC().primaryKey(),
251
- key: textC().notNull().unique("publishable_keys_key_key"),
252
- name: text().notNull().unique("publishable_keys_name_key"),
253
- /** JSON array of allowed origins. */
254
- originsJson: text().notNull(),
255
- createdAt: text().notNull(),
256
- revokedAt: text(),
257
- });
258
- /**
259
- * Action endpoints: where the Runtime delivers each agent's Actions over HTTP, and the health
260
- * recent deliveries and the last ping report.
261
- */
262
- export const endpoints = nylorun.table("endpoints", {
263
- agentId: textC().primaryKey(),
264
- url: text().notNull(),
265
- implementationVersion: text().notNull(),
266
- manifestHash: text(),
267
- timeoutMs: integer().notNull(),
268
- maxConcurrent: integer().notNull(),
269
- principalId: text(),
270
- lastDeliveryAt: text(),
271
- lastSuccessAt: text(),
272
- lastErrorCode: text(),
273
- lastErrorMessage: text(),
274
- consecutiveFailures: integer().notNull().default(0),
275
- servedImplementationVersion: text(),
276
- servedManifestHash: text(),
277
- createdAt: text().notNull(),
278
- updatedAt: text().notNull(),
279
- });
280
231
  /**
281
232
  * The model usage ledger (P1.3): one row per model call a gate served, written after the call.
282
233
  * A second row for the same effect (a call the gate ran again after a gateway restart) is
@@ -287,6 +238,9 @@ export const modelUsage = nylorun.table("model_usage", {
287
238
  id: textC().primaryKey(),
288
239
  /** The model effect's id; unique per Tenant, since it carries the turn id. */
289
240
  effectKey: textC().notNull(),
241
+ tokensReported: boolean(),
242
+ costKnown: boolean(),
243
+ txid: xid8().notNull().default(sql `pg_current_xact_id()`),
290
244
  sessionId: textC().notNull(),
291
245
  turnId: textC().notNull(),
292
246
  agentId: textC().notNull(),
@@ -303,6 +257,8 @@ export const modelUsage = nylorun.table("model_usage", {
303
257
  duplicate: boolean().notNull(),
304
258
  createdAt: text().notNull(),
305
259
  }, (t) => [
260
+ index("model_usage_session").on(t.sessionId, t.createdAt, t.id),
261
+ index("model_usage_export").on(t.txid, t.id),
306
262
  index("model_usage_effect").on(t.effectKey),
307
263
  index("model_usage_agent").on(t.agentId, t.createdAt),
308
264
  index("model_usage_turn").on(t.turnId),
@@ -452,6 +408,33 @@ export const artifactContent = nylorun.table("artifact_content", {
452
408
  }).onDelete("cascade"),
453
409
  index("artifact_content_sha256").on(t.sha256),
454
410
  ]);
411
+ /**
412
+ * The definition files the Tenant holds (track R2 M4): files a definition names by the SHA-256
413
+ * of their bytes (a skill's folder), uploaded with `PUT /v1/files/sha256:<hex>`. The bytes are
414
+ * in the Object store at `definitions/sha256/<hex>`; a row counts them only once they are
415
+ * stored. `sha256` is `sha256:<hex>`.
416
+ */
417
+ export const definitionFiles = nylorun.table("definition_files", {
418
+ sha256: textC().primaryKey(),
419
+ /** What the file is part of: `skill` for now. */
420
+ kind: text().notNull(),
421
+ size: bigint({ mode: "number" }).notNull(),
422
+ contentType: text(),
423
+ createdAt: textC().notNull(),
424
+ });
425
+ /**
426
+ * Which definition version names which definition file: one row per agent id, manifest hash
427
+ * and file, written when the definition is stored. A later sweep deletes the files no
428
+ * definition uses.
429
+ */
430
+ export const definitionFileUses = nylorun.table("definition_file_uses", {
431
+ agentId: textC().notNull(),
432
+ manifestHash: textC().notNull(),
433
+ sha256: textC().notNull(),
434
+ }, (t) => [
435
+ primaryKey({ name: "definition_file_uses_pkey", columns: [t.agentId, t.manifestHash, t.sha256] }),
436
+ index("definition_file_uses_sha256").on(t.sha256),
437
+ ]);
455
438
  // ---------------------------------------------------------------------------
456
439
  // nylorun_streams: the record
457
440
  /**