@nylorun/runtime 0.27.0-beta → 0.28.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 (148) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/api/a2a/card.d.ts +4 -3
  3. package/dist/api/a2a/card.js +3 -3
  4. package/dist/api/a2a/routes.js +18 -7
  5. package/dist/api/ag-ui/routes.js +4 -7
  6. package/dist/api/components.d.ts +5823 -2720
  7. package/dist/api/components.js +39 -30
  8. package/dist/api/http/app.js +9 -4
  9. package/dist/api/http/body.d.ts +2 -0
  10. package/dist/api/http/body.js +20 -0
  11. package/dist/api/http/routes/agent-manifests.d.ts +10 -0
  12. package/dist/api/http/routes/agent-manifests.js +135 -0
  13. package/dist/api/http/routes/agents.d.ts +11 -0
  14. package/dist/api/http/routes/agents.js +418 -0
  15. package/dist/api/http/routes/artifacts.js +2 -2
  16. package/dist/api/http/routes/coverage.d.ts +4 -4
  17. package/dist/api/http/routes/coverage.js +12 -6
  18. package/dist/api/http/routes/files.js +1 -1
  19. package/dist/api/http/routes/mcp.js +2 -2
  20. package/dist/api/http/routes/me.d.ts +1 -1
  21. package/dist/api/http/routes/me.js +1 -2
  22. package/dist/api/http/routes/memories.d.ts +9 -0
  23. package/dist/api/http/routes/memories.js +152 -0
  24. package/dist/api/http/routes/reads.d.ts +1 -137
  25. package/dist/api/http/routes/reads.js +2 -8
  26. package/dist/api/http/routes/sessions.js +21 -50
  27. package/dist/api/http/routes/tenant.js +8 -8
  28. package/dist/api/http/routes/triggers.d.ts +10 -0
  29. package/dist/api/http/routes/triggers.js +180 -0
  30. package/dist/api/openapi.js +69 -47
  31. package/dist/artifacts/disk.d.ts +10 -10
  32. package/dist/artifacts/disk.js +27 -27
  33. package/dist/artifacts/quota.d.ts +1 -1
  34. package/dist/artifacts/quota.js +2 -2
  35. package/dist/artifacts/service.js +2 -2
  36. package/dist/core/flow-host.d.ts +0 -1
  37. package/dist/gates/egress-credentials.js +1 -1
  38. package/dist/gates/egress.d.ts +5 -5
  39. package/dist/gates/egress.js +6 -6
  40. package/dist/gates/http-tool.js +1 -1
  41. package/dist/gates/meter.js +6 -5
  42. package/dist/gates/policy.d.ts +8 -3
  43. package/dist/gates/policy.js +7 -2
  44. package/dist/harness/pod.d.ts +2 -0
  45. package/dist/harness/setup.js +17 -6
  46. package/dist/harness-api/record.js +11 -0
  47. package/dist/harness-api/server.js +4 -0
  48. package/dist/harness-api/start.d.ts +11 -7
  49. package/dist/harness-api/start.js +49 -5
  50. package/dist/harness-api/workspace.js +2 -2
  51. package/dist/host/http.d.ts +2 -2
  52. package/dist/host/http.js +5 -2
  53. package/dist/keys/keys.d.ts +15 -4
  54. package/dist/keys/keys.js +16 -0
  55. package/dist/keys/webhooks.d.ts +25 -0
  56. package/dist/keys/webhooks.js +62 -0
  57. package/dist/management-openapi.json +245 -123
  58. package/dist/mcp/preview.js +7 -7
  59. package/dist/memory/service.d.ts +97 -0
  60. package/dist/memory/service.js +335 -0
  61. package/dist/memory/tool.d.ts +36 -0
  62. package/dist/memory/tool.js +84 -0
  63. package/dist/openapi.json +12837 -8790
  64. package/dist/reads/types.d.ts +3 -3
  65. package/dist/record/agent.d.ts +27 -0
  66. package/dist/record/agent.js +46 -0
  67. package/dist/record/index.d.ts +1 -1
  68. package/dist/record/index.js +1 -1
  69. package/dist/sandbox/join.js +5 -5
  70. package/dist/sandbox/placement.d.ts +1 -1
  71. package/dist/sandbox/placement.js +3 -3
  72. package/dist/sandbox/pods/lifecycle.d.ts +6 -6
  73. package/dist/sandbox/pods/lifecycle.js +6 -6
  74. package/dist/sandbox/pods/reconcile.js +10 -2
  75. package/dist/sandbox/resolve.d.ts +3 -3
  76. package/dist/sandbox/resolve.js +7 -7
  77. package/dist/sandbox/setup.d.ts +3 -1
  78. package/dist/sandbox/setup.js +14 -4
  79. package/dist/store/postgres/drizzle/0032_agents.sql +54 -0
  80. package/dist/store/postgres/drizzle/0033_agent_versions.sql +7 -0
  81. package/dist/store/postgres/drizzle/0034_protocol_17_session_queue.sql +13 -0
  82. package/dist/store/postgres/drizzle/0035_t4_triggers.sql +41 -0
  83. package/dist/store/postgres/drizzle/0036_t5_memories.sql +30 -0
  84. package/dist/store/postgres/drizzle/meta/_journal.json +35 -0
  85. package/dist/store/postgres/reads.js +13 -86
  86. package/dist/store/postgres/record-writer.d.ts +4 -4
  87. package/dist/store/postgres/record-writer.js +9 -9
  88. package/dist/store/postgres/schema.d.ts +1373 -161
  89. package/dist/store/postgres/schema.js +184 -37
  90. package/dist/store/postgres/store.js +329 -79
  91. package/dist/store/postgres/tenant.js +1 -2
  92. package/dist/store/types.d.ts +155 -50
  93. package/dist/store/types.js +0 -1
  94. package/dist/tenant/advance.js +20 -8
  95. package/dist/tenant/agent-manifests.d.ts +72 -0
  96. package/dist/tenant/agent-manifests.js +359 -0
  97. package/dist/tenant/agent-versions.d.ts +126 -0
  98. package/dist/tenant/agent-versions.js +389 -0
  99. package/dist/tenant/agents.d.ts +230 -0
  100. package/dist/tenant/{environments.js → agents.js} +464 -320
  101. package/dist/tenant/auth.d.ts +1 -1
  102. package/dist/tenant/auth.js +3 -3
  103. package/dist/tenant/commands.d.ts +63 -2
  104. package/dist/tenant/commands.js +240 -83
  105. package/dist/tenant/context.d.ts +46 -19
  106. package/dist/tenant/context.js +6 -2
  107. package/dist/tenant/effects.js +7 -16
  108. package/dist/tenant/identity-file.d.ts +6 -6
  109. package/dist/tenant/identity-file.js +12 -10
  110. package/dist/tenant/issuers.js +3 -3
  111. package/dist/tenant/limits.d.ts +0 -3
  112. package/dist/tenant/limits.js +0 -3
  113. package/dist/tenant/memories.d.ts +38 -0
  114. package/dist/tenant/memories.js +119 -0
  115. package/dist/tenant/reset.js +2 -2
  116. package/dist/tenant/run-grants.d.ts +6 -0
  117. package/dist/tenant/run-grants.js +4 -0
  118. package/dist/tenant/runtime.d.ts +1 -1
  119. package/dist/tenant/runtime.js +8 -0
  120. package/dist/tenant/sessions.d.ts +28 -45
  121. package/dist/tenant/sessions.js +85 -208
  122. package/dist/tenant/status.js +6 -7
  123. package/dist/tenant/sweep.js +12 -3
  124. package/dist/tenant/transcript.d.ts +16 -16
  125. package/dist/tenant/triggers.d.ts +143 -0
  126. package/dist/tenant/triggers.js +715 -0
  127. package/dist/tenant/turn-timing.d.ts +11 -1
  128. package/dist/tenant/turn-timing.js +3 -1
  129. package/dist/tenant/worker.d.ts +2 -0
  130. package/dist/tenant/worker.js +5 -0
  131. package/dist/traces/map.d.ts +1 -1
  132. package/dist/traces/map.js +7 -1
  133. package/dist/tuning.d.ts +7 -0
  134. package/dist/tuning.js +19 -0
  135. package/dist/vault/service.d.ts +13 -8
  136. package/dist/vault/service.js +61 -17
  137. package/dist/version.d.ts +1 -1
  138. package/dist/version.js +1 -1
  139. package/package.json +13 -12
  140. package/dist/api/http/routes/environment-manifests.d.ts +0 -9
  141. package/dist/api/http/routes/environment-manifests.js +0 -118
  142. package/dist/api/http/routes/environments.d.ts +0 -11
  143. package/dist/api/http/routes/environments.js +0 -332
  144. package/dist/record/environment.d.ts +0 -27
  145. package/dist/record/environment.js +0 -46
  146. package/dist/tenant/environment-manifests.d.ts +0 -57
  147. package/dist/tenant/environment-manifests.js +0 -208
  148. package/dist/tenant/environments.d.ts +0 -172
@@ -225,6 +225,41 @@
225
225
  "when": 1792094620175,
226
226
  "tag": "0031_protocol_15_mcp_snapshot",
227
227
  "breakpoints": true
228
+ },
229
+ {
230
+ "idx": 32,
231
+ "version": "7",
232
+ "when": 1792098220175,
233
+ "tag": "0032_agents",
234
+ "breakpoints": true
235
+ },
236
+ {
237
+ "idx": 33,
238
+ "version": "7",
239
+ "when": 1792161078177,
240
+ "tag": "0033_agent_versions",
241
+ "breakpoints": true
242
+ },
243
+ {
244
+ "idx": 34,
245
+ "version": "7",
246
+ "when": 1792163689759,
247
+ "tag": "0034_protocol_17_session_queue",
248
+ "breakpoints": true
249
+ },
250
+ {
251
+ "idx": 35,
252
+ "version": "7",
253
+ "when": 1792164194039,
254
+ "tag": "0035_t4_triggers",
255
+ "breakpoints": true
256
+ },
257
+ {
258
+ "idx": 36,
259
+ "version": "7",
260
+ "when": 1792172016681,
261
+ "tag": "0036_t5_memories",
262
+ "breakpoints": true
228
263
  }
229
264
  ]
230
265
  }
@@ -11,7 +11,7 @@ import { database, driverError } from "./db.js";
11
11
  import { createPostgresReadClient } from "./connect.js";
12
12
  import { hostTuning } from "../../tuning.js";
13
13
  import { toolCallDuration, toolCallStatus } from "../../harness-api/tool-status.js";
14
- import { effects, artifacts, modelUsage, environments, sandboxes, sessions, sessionEvents, tenantSettings, } from "./schema.js";
14
+ import { effects, artifacts, modelUsage, sandboxes, sessions, sessionEvents, tenantSettings, } from "./schema.js";
15
15
  const sessionFields = {
16
16
  id: sessions.id,
17
17
  agentId: sessions.agentId,
@@ -19,11 +19,18 @@ const sessionFields = {
19
19
  status: sessions.status,
20
20
  activeTurnId: sql `${sessions.body}->>'activeTurnId'`,
21
21
  lastTurnId: sql `${sessions.body}->>'lastTurnId'`,
22
- environmentId: sessions.environmentId,
23
22
  createdAt: sessions.createdAt,
24
23
  };
24
+ /** Rows whose Agent id an Agent grant (`*`, an id, or a `p/*` prefix) reaches; none reach nothing. */
25
+ function grantsWhere(column, grants) {
26
+ if (grants.includes("*"))
27
+ return sql `true`;
28
+ if (grants.length === 0)
29
+ return sql `false`;
30
+ return or(...grants.map((grant) => grant.endsWith("/*") ? sql `starts_with(${column}, ${grant.slice(0, -1)})` : eq(column, grant)));
31
+ }
25
32
  function accessWhere(access) {
26
- return and(access.owner === undefined ? undefined : eq(sessions.ownerUserId, access.owner), access.agents === undefined ? undefined : inArray(sessions.agentId, [...access.agents]));
33
+ return and(access.owner === undefined ? undefined : eq(sessions.ownerUserId, access.owner), access.agents === undefined ? undefined : grantsWhere(sessions.agentId, access.agents));
27
34
  }
28
35
  function publicCall(row) {
29
36
  return {
@@ -31,7 +38,7 @@ function publicCall(row) {
31
38
  effectId: row.effectKey,
32
39
  sessionId: row.sessionId,
33
40
  turnId: row.turnId,
34
- agentId: row.agentId,
41
+ manifestName: row.manifestName,
35
42
  provider: row.provider,
36
43
  model: row.model,
37
44
  at: row.createdAt,
@@ -166,9 +173,7 @@ export function createPostgresReadStore(source, tenantId) {
166
173
  const rows = await tx
167
174
  .select(fields)
168
175
  .from(sessions)
169
- .where(and(accessWhere(access), position, filters.agentId === undefined ? undefined : eq(sessions.agentId, filters.agentId), filters.status === undefined ? undefined : eq(sessions.status, filters.status), filters.environmentId === undefined
170
- ? undefined
171
- : eq(sessions.environmentId, filters.environmentId), filters.ownerUserId === undefined
176
+ .where(and(accessWhere(access), position, filters.agentId === undefined ? undefined : eq(sessions.agentId, filters.agentId), filters.status === undefined ? undefined : eq(sessions.status, filters.status), filters.manifest === undefined ? undefined : eq(sessions.manifestName, filters.manifest), filters.ownerUserId === undefined
172
177
  ? undefined
173
178
  : eq(sessions.ownerUserId, filters.ownerUserId)))
174
179
  .orderBy(sql `${sessions.createdAt} desc nulls last`, desc(sessions.id))
@@ -189,8 +194,8 @@ export function createPostgresReadStore(source, tenantId) {
189
194
  .select({
190
195
  sessionId: sessions.id,
191
196
  agentId: sessions.agentId,
197
+ definition: sql `${sessions.body}->'definition'`,
192
198
  manifestHash: sql `${sessions.body}->>'manifestHash'`,
193
- implementationVersion: sql `${sessions.body}->>'implementationVersion'`,
194
199
  manifest: sql `${sessions.body}->'manifest'`,
195
200
  })
196
201
  .from(sessions)
@@ -304,83 +309,5 @@ export function createPostgresReadStore(source, tenantId) {
304
309
  asOf: new Date().toISOString(),
305
310
  };
306
311
  }),
307
- environments: (labels, page, access, grants) => read(async (tx) => {
308
- const cursor = readCursor(tenantId, "environments", labels);
309
- const key = keyOf(cursor.decode(page.cursor), 1);
310
- const allowed = grants === undefined
311
- ? undefined
312
- : or(...grants.map((grant) => grant.endsWith("/*")
313
- ? sql `starts_with(${environments.id}, ${grant.slice(0, -1)})`
314
- : eq(environments.id, grant)));
315
- const rows = await tx
316
- .select()
317
- .from(environments)
318
- .where(and(grants?.length === 0 ? sql `false` : allowed, key ? gt(environments.id, key[0]) : undefined, or(isNull(environments.desired), ne(environments.desired, "deleted")), ...Object.entries(labels).map(([k, v]) => sql `${environments.labels}::jsonb->>${k} = ${v}`)))
319
- .orderBy(asc(environments.id))
320
- .limit(page.limit + 1);
321
- const tenantLimits = await readTenantLimits({
322
- getSetting: async (setting) => (await tx.select({ value: tenantSettings.value }).from(tenantSettings).where(eq(tenantSettings.key, setting)))[0]
323
- ?.value,
324
- });
325
- const items = [];
326
- for (const row of rows.slice(0, page.limit)) {
327
- const [related] = await tx
328
- .select({
329
- items: sql `coalesce(json_agg(json_build_object('id', ${sessions.id}, 'activeTurnId', ${sessions.body}->>'activeTurnId') order by ${sessions.id}), '[]'::json)`,
330
- })
331
- .from(sessions)
332
- .where(and(eq(sessions.environmentId, row.id), accessWhere(access)));
333
- const [compute] = await tx
334
- .select({ body: sandboxes.body })
335
- .from(sandboxes)
336
- .where(eq(sandboxes.id, sandboxWorkspaceKey(tenantId, row.id)))
337
- .limit(1);
338
- const isPod = row.kind === "pod";
339
- items.push({
340
- id: row.id,
341
- kind: row.kind,
342
- labels: row.labels,
343
- manifest: row.recipe,
344
- ...(row.manifestName === null ? {} : { manifestName: row.manifestName }),
345
- ...(row.manifestVersion === null ? {} : { manifestVersion: row.manifestVersion }),
346
- ...(row.manifestHash === null ? {} : { manifestHash: row.manifestHash }),
347
- limits: limitsInForce(tenantLimits, row.recipe.limits),
348
- ...(row.forkedFrom ? { forkedFrom: row.forkedFrom } : {}),
349
- version: row.version,
350
- appliedVersion: row.appliedVersion,
351
- ownerUserId: row.ownerUserId,
352
- state: isPod
353
- ? row.observed === "running"
354
- ? "running"
355
- : row.observed === "creating"
356
- ? "creating"
357
- : "stopped"
358
- : row.kind === "none"
359
- ? "ready"
360
- : (compute?.body?.state ?? "ready"),
361
- ...(isPod
362
- ? {
363
- pod: {
364
- desired: row.desired,
365
- observed: row.observed,
366
- volumeGeneration: row.volumeGen,
367
- hostEpoch: row.hostEpoch,
368
- ...(row.reason ? { reason: row.reason } : {}),
369
- ...(row.imageDigest ? { imageDigest: row.imageDigest } : {}),
370
- },
371
- }
372
- : {}),
373
- lastUsedAt: new Date(row.lastUsedAt).toISOString(),
374
- sessions: related.items,
375
- createdAt: row.createdAt,
376
- updatedAt: row.updatedAt,
377
- });
378
- }
379
- const last = items.at(-1);
380
- return {
381
- environments: items,
382
- nextCursor: rows.length > page.limit && last ? cursor.encode([last.id]) : null,
383
- };
384
- }),
385
312
  };
386
313
  }
@@ -1,9 +1,9 @@
1
- import type { RecordWriter, EnvironmentRecordWriter } from "../../record/index.js";
1
+ import type { RecordWriter, AgentRecordWriter } from "../../record/index.js";
2
2
  import type { Transaction } from "./db.js";
3
3
  /**
4
- * The Environment stream writer of transaction `db` (`record/environment.ts`): the only inserts
5
- * into `environment_events`. The caller holds the Environment row's lock, which orders its events.
4
+ * The Agent stream writer of transaction `db` (`record/agent.ts`): the only inserts into
5
+ * `agent_events`. The caller holds the Agent row's lock, which orders its events.
6
6
  */
7
- export declare function postgresEnvironmentRecordWriter(db: Transaction): EnvironmentRecordWriter;
7
+ export declare function postgresAgentRecordWriter(db: Transaction): AgentRecordWriter;
8
8
  /** The record writer of transaction `db`. */
9
9
  export declare function postgresRecordWriter(db: Transaction): RecordWriter;
@@ -5,22 +5,22 @@
5
5
  * run in the store's transaction under the caller's session row lock.
6
6
  */
7
7
  import { eq, sql } from "drizzle-orm";
8
- import { environmentEvents, sessionEvents, sessionLogHeads, tenant } from "./schema.js";
8
+ import { agentEvents, sessionEvents, sessionLogHeads, tenant } from "./schema.js";
9
9
  /**
10
- * The Environment stream writer of transaction `db` (`record/environment.ts`): the only inserts
11
- * into `environment_events`. The caller holds the Environment row's lock, which orders its events.
10
+ * The Agent stream writer of transaction `db` (`record/agent.ts`): the only inserts into
11
+ * `agent_events`. The caller holds the Agent row's lock, which orders its events.
12
12
  */
13
- export function postgresEnvironmentRecordWriter(db) {
13
+ export function postgresAgentRecordWriter(db) {
14
14
  return {
15
- async nextSeq(environmentId) {
15
+ async nextSeq(agentId) {
16
16
  const [row] = await db
17
- .select({ next: sql `coalesce(max(${environmentEvents.seq}) + 1, 0)`.mapWith(Number) })
18
- .from(environmentEvents)
19
- .where(eq(environmentEvents.environmentId, environmentId));
17
+ .select({ next: sql `coalesce(max(${agentEvents.seq}) + 1, 0)`.mapWith(Number) })
18
+ .from(agentEvents)
19
+ .where(eq(agentEvents.agentId, agentId));
20
20
  return row?.next ?? 0;
21
21
  },
22
22
  async insert(row) {
23
- await db.insert(environmentEvents).values(row);
23
+ await db.insert(agentEvents).values(row);
24
24
  },
25
25
  };
26
26
  }