@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.
- package/CHANGELOG.md +41 -0
- package/dist/api/a2a/card.d.ts +4 -3
- package/dist/api/a2a/card.js +3 -3
- package/dist/api/a2a/routes.js +18 -7
- package/dist/api/ag-ui/routes.js +4 -7
- package/dist/api/components.d.ts +5823 -2720
- package/dist/api/components.js +39 -30
- package/dist/api/http/app.js +9 -4
- package/dist/api/http/body.d.ts +2 -0
- package/dist/api/http/body.js +20 -0
- package/dist/api/http/routes/agent-manifests.d.ts +10 -0
- package/dist/api/http/routes/agent-manifests.js +135 -0
- package/dist/api/http/routes/agents.d.ts +11 -0
- package/dist/api/http/routes/agents.js +418 -0
- package/dist/api/http/routes/artifacts.js +2 -2
- package/dist/api/http/routes/coverage.d.ts +4 -4
- package/dist/api/http/routes/coverage.js +12 -6
- package/dist/api/http/routes/files.js +1 -1
- package/dist/api/http/routes/mcp.js +2 -2
- package/dist/api/http/routes/me.d.ts +1 -1
- package/dist/api/http/routes/me.js +1 -2
- package/dist/api/http/routes/memories.d.ts +9 -0
- package/dist/api/http/routes/memories.js +152 -0
- package/dist/api/http/routes/reads.d.ts +1 -137
- package/dist/api/http/routes/reads.js +2 -8
- package/dist/api/http/routes/sessions.js +21 -50
- package/dist/api/http/routes/tenant.js +8 -8
- package/dist/api/http/routes/triggers.d.ts +10 -0
- package/dist/api/http/routes/triggers.js +180 -0
- package/dist/api/openapi.js +69 -47
- package/dist/artifacts/disk.d.ts +10 -10
- package/dist/artifacts/disk.js +27 -27
- package/dist/artifacts/quota.d.ts +1 -1
- package/dist/artifacts/quota.js +2 -2
- package/dist/artifacts/service.js +2 -2
- package/dist/core/flow-host.d.ts +0 -1
- package/dist/gates/egress-credentials.js +1 -1
- package/dist/gates/egress.d.ts +5 -5
- package/dist/gates/egress.js +6 -6
- package/dist/gates/http-tool.js +1 -1
- package/dist/gates/meter.js +6 -5
- package/dist/gates/policy.d.ts +8 -3
- package/dist/gates/policy.js +7 -2
- package/dist/harness/pod.d.ts +2 -0
- package/dist/harness/setup.js +17 -6
- package/dist/harness-api/record.js +11 -0
- package/dist/harness-api/server.js +4 -0
- package/dist/harness-api/start.d.ts +11 -7
- package/dist/harness-api/start.js +49 -5
- package/dist/harness-api/workspace.js +2 -2
- package/dist/host/http.d.ts +2 -2
- package/dist/host/http.js +5 -2
- package/dist/keys/keys.d.ts +15 -4
- package/dist/keys/keys.js +16 -0
- package/dist/keys/webhooks.d.ts +25 -0
- package/dist/keys/webhooks.js +62 -0
- package/dist/management-openapi.json +245 -123
- package/dist/mcp/preview.js +7 -7
- package/dist/memory/service.d.ts +97 -0
- package/dist/memory/service.js +335 -0
- package/dist/memory/tool.d.ts +36 -0
- package/dist/memory/tool.js +84 -0
- package/dist/openapi.json +12837 -8790
- package/dist/reads/types.d.ts +3 -3
- package/dist/record/agent.d.ts +27 -0
- package/dist/record/agent.js +46 -0
- package/dist/record/index.d.ts +1 -1
- package/dist/record/index.js +1 -1
- package/dist/sandbox/join.js +5 -5
- package/dist/sandbox/placement.d.ts +1 -1
- package/dist/sandbox/placement.js +3 -3
- package/dist/sandbox/pods/lifecycle.d.ts +6 -6
- package/dist/sandbox/pods/lifecycle.js +6 -6
- package/dist/sandbox/pods/reconcile.js +10 -2
- package/dist/sandbox/resolve.d.ts +3 -3
- package/dist/sandbox/resolve.js +7 -7
- package/dist/sandbox/setup.d.ts +3 -1
- package/dist/sandbox/setup.js +14 -4
- package/dist/store/postgres/drizzle/0032_agents.sql +54 -0
- package/dist/store/postgres/drizzle/0033_agent_versions.sql +7 -0
- package/dist/store/postgres/drizzle/0034_protocol_17_session_queue.sql +13 -0
- package/dist/store/postgres/drizzle/0035_t4_triggers.sql +41 -0
- package/dist/store/postgres/drizzle/0036_t5_memories.sql +30 -0
- package/dist/store/postgres/drizzle/meta/_journal.json +35 -0
- package/dist/store/postgres/reads.js +13 -86
- package/dist/store/postgres/record-writer.d.ts +4 -4
- package/dist/store/postgres/record-writer.js +9 -9
- package/dist/store/postgres/schema.d.ts +1373 -161
- package/dist/store/postgres/schema.js +184 -37
- package/dist/store/postgres/store.js +329 -79
- package/dist/store/postgres/tenant.js +1 -2
- package/dist/store/types.d.ts +155 -50
- package/dist/store/types.js +0 -1
- package/dist/tenant/advance.js +20 -8
- package/dist/tenant/agent-manifests.d.ts +72 -0
- package/dist/tenant/agent-manifests.js +359 -0
- package/dist/tenant/agent-versions.d.ts +126 -0
- package/dist/tenant/agent-versions.js +389 -0
- package/dist/tenant/agents.d.ts +230 -0
- package/dist/tenant/{environments.js → agents.js} +464 -320
- package/dist/tenant/auth.d.ts +1 -1
- package/dist/tenant/auth.js +3 -3
- package/dist/tenant/commands.d.ts +63 -2
- package/dist/tenant/commands.js +240 -83
- package/dist/tenant/context.d.ts +46 -19
- package/dist/tenant/context.js +6 -2
- package/dist/tenant/effects.js +7 -16
- package/dist/tenant/identity-file.d.ts +6 -6
- package/dist/tenant/identity-file.js +12 -10
- package/dist/tenant/issuers.js +3 -3
- package/dist/tenant/limits.d.ts +0 -3
- package/dist/tenant/limits.js +0 -3
- package/dist/tenant/memories.d.ts +38 -0
- package/dist/tenant/memories.js +119 -0
- package/dist/tenant/reset.js +2 -2
- package/dist/tenant/run-grants.d.ts +6 -0
- package/dist/tenant/run-grants.js +4 -0
- package/dist/tenant/runtime.d.ts +1 -1
- package/dist/tenant/runtime.js +8 -0
- package/dist/tenant/sessions.d.ts +28 -45
- package/dist/tenant/sessions.js +85 -208
- package/dist/tenant/status.js +6 -7
- package/dist/tenant/sweep.js +12 -3
- package/dist/tenant/transcript.d.ts +16 -16
- package/dist/tenant/triggers.d.ts +143 -0
- package/dist/tenant/triggers.js +715 -0
- package/dist/tenant/turn-timing.d.ts +11 -1
- package/dist/tenant/turn-timing.js +3 -1
- package/dist/tenant/worker.d.ts +2 -0
- package/dist/tenant/worker.js +5 -0
- package/dist/traces/map.d.ts +1 -1
- package/dist/traces/map.js +7 -1
- package/dist/tuning.d.ts +7 -0
- package/dist/tuning.js +19 -0
- package/dist/vault/service.d.ts +13 -8
- package/dist/vault/service.js +61 -17
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +13 -12
- package/dist/api/http/routes/environment-manifests.d.ts +0 -9
- package/dist/api/http/routes/environment-manifests.js +0 -118
- package/dist/api/http/routes/environments.d.ts +0 -11
- package/dist/api/http/routes/environments.js +0 -332
- package/dist/record/environment.d.ts +0 -27
- package/dist/record/environment.js +0 -46
- package/dist/tenant/environment-manifests.d.ts +0 -57
- package/dist/tenant/environment-manifests.js +0 -208
- package/dist/tenant/environments.d.ts +0 -172
package/dist/api/components.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* global registry.
|
|
6
6
|
*/
|
|
7
7
|
import { z } from "zod";
|
|
8
|
-
import {
|
|
8
|
+
import { QueuedResponseSchema, TriggerListSchema, MemoryListSchema, MemorySchema, PutMemoryRequestSchema, MemoryVersionPageSchema, MemoryVersionDetailSchema, TriggerRunPageSchema, RunTriggerResponseSchema, WebhookSecretResponseSchema, WebhookAcceptedResponseSchema, AgentManifestV8Schema, EnvironmentSecretSlotsSchema, DeleteAgentManifestResponseSchema, AgentManifestPlanSchema, AgentManifestVersionsSchema, AgentManifestViewSchema, ListAgentManifestsResponseSchema, PutAgentManifestRequestSchema, PutAgentSecretValueRequestSchema, SaveAgentManifestResponseSchema, SessionListItemSchema, ModelCallSchema, SessionPageSchema, SessionManifestViewSchema, HistoryPageSchema, SessionUsageTotalsSchema, ModelCallsPageSchema, ModelCallExportPageSchema, AgentPageSchema, ToolCallSchema, ToolCallsPageSchema, TurnTraceSchema, JwksSchema, SigningKeyListSchema, SigningKeyViewSchema, RotateSigningKeysRequestSchema, RevokeSigningKeyRequestSchema, MeResponseSchema, TenantStatusSchema, ResetTenantRequestSchema, ResetTenantResponseSchema, SeedTenantConfigRequestSchema, SeedTenantConfigResponseSchema, HostModelCatalogSchema, TenantSandboxViewSchema, ModelUsageTotalsSchema, ModelBudgetsSchema, PutModelBudgetsRequestSchema, ToolPolicySchema, PutToolPolicyRequestSchema, PutModelInputsRequestSchema, ModelInputsViewSchema, PutTenantEnvironmentsRequestSchema, ListProvidersResponseSchema, HostModelViewSchema, PutHostModelRequestSchema, SelectHostModelRequestSchema, PutAgentSecretRequestSchema, AgentSecretViewSchema, ListAgentSecretsResponseSchema, McpPreviewRequestSchema, McpPreviewSchema, CredentialCoverageRequestSchema, CredentialCoverageSchema, DeletedResponseSchema, ListSessionsResponseSchema, LiveEventSchema, PutAgentRequestSchema, PutSessionRequestSchema, SessionItemsResponseSchema, SessionViewSchema, StreamClosedFrameSchema, AcceptedResponseSchema, SandboxToolOutcomeSchema, AgentViewSchema, AgentSnapshotSchema, RestoreAgentRequestSchema, ForkAgentRequestSchema, AgentForkPlanSchema, ForkAgentResponseSchema, PutAgentDryRunResponseSchema, RestartAgentRequestSchema, AgentRestoreSchema, AgentDiskVersionsSchema, ListAgentsResponseSchema, DeleteAgentResponseSchema, ListAgentEventsResponseSchema, ArtifactViewSchema, ArtifactListItemSchema, ArtifactPageSchema, ArtifactVersionViewSchema, ListArtifactsResponseSchema, UploadArtifactResponseSchema, DefinitionFileViewSchema, DeleteArtifactResponseSchema, CreateArtifactLinkRequestSchema, ArtifactLinkSchema, PutTenantArtifactsRequestSchema, PutTenantSkillsRequestSchema, PutTenantLimitsRequestSchema, TenantLimitsViewSchema, TenantArtifactsViewSchema, TenantSkillsViewSchema, ArtifactTreeSchema, ArtifactDiffSchema, SessionCommandSchema, ListOperatorKeysResponseSchema, PutOperatorKeyResponseSchema, DeleteOperatorKeyResponseSchema, OperatorKeySchema, ProtocolRejectedResponseSchema, RejectedResponseSchema, EVENT_SCHEMAS, EVENT_TYPES, } from "@nylorun/core/contracts";
|
|
9
9
|
function named(id, schema) {
|
|
10
10
|
return schema.meta({ id });
|
|
11
11
|
}
|
|
@@ -16,28 +16,30 @@ export const ListOperatorKeysResponse = named("ListOperatorKeysResponse", ListOp
|
|
|
16
16
|
export const PutOperatorKeyResponse = named("PutOperatorKeyResponse", PutOperatorKeyResponseSchema);
|
|
17
17
|
export const DeleteOperatorKeyResponse = named("DeleteOperatorKeyResponse", DeleteOperatorKeyResponseSchema);
|
|
18
18
|
export const SandboxToolOutcome = named("SandboxToolOutcome", SandboxToolOutcomeSchema);
|
|
19
|
-
export const
|
|
20
|
-
export const
|
|
19
|
+
export const PutAgentRequest = named("PutAgentRequest", PutAgentRequestSchema);
|
|
20
|
+
export const AgentView = named("AgentView", AgentViewSchema);
|
|
21
21
|
export const EnvironmentSecretSlots = named("EnvironmentSecretSlots", EnvironmentSecretSlotsSchema);
|
|
22
|
-
export const
|
|
23
|
-
export const
|
|
24
|
-
export const
|
|
25
|
-
export const
|
|
26
|
-
export const
|
|
27
|
-
export const
|
|
28
|
-
export const
|
|
29
|
-
export const
|
|
30
|
-
export const
|
|
31
|
-
export const
|
|
32
|
-
export const
|
|
33
|
-
export const
|
|
34
|
-
export const
|
|
35
|
-
export const
|
|
36
|
-
export const
|
|
37
|
-
export const
|
|
38
|
-
export const
|
|
39
|
-
export const
|
|
40
|
-
export const
|
|
22
|
+
export const AgentManifest = named("AgentManifest", AgentManifestV8Schema);
|
|
23
|
+
export const PutAgentManifestRequest = named("PutAgentManifestRequest", PutAgentManifestRequestSchema);
|
|
24
|
+
export const AgentManifestView = named("AgentManifestView", AgentManifestViewSchema);
|
|
25
|
+
export const AgentManifestPlan = named("AgentManifestPlan", AgentManifestPlanSchema);
|
|
26
|
+
export const SaveAgentManifestResponse = named("SaveAgentManifestResponse", SaveAgentManifestResponseSchema);
|
|
27
|
+
export const ListAgentManifestsResponse = named("ListAgentManifestsResponse", ListAgentManifestsResponseSchema);
|
|
28
|
+
export const AgentManifestVersions = named("AgentManifestVersions", AgentManifestVersionsSchema);
|
|
29
|
+
export const DeleteAgentManifestResponse = named("DeleteAgentManifestResponse", DeleteAgentManifestResponseSchema);
|
|
30
|
+
export const PutAgentSecretValueRequest = named("PutAgentSecretValueRequest", PutAgentSecretValueRequestSchema);
|
|
31
|
+
export const AgentSnapshot = named("AgentSnapshot", AgentSnapshotSchema);
|
|
32
|
+
export const RestoreAgentRequest = named("RestoreAgentRequest", RestoreAgentRequestSchema);
|
|
33
|
+
export const AgentRestore = named("AgentRestore", AgentRestoreSchema);
|
|
34
|
+
export const ForkAgentRequest = named("ForkAgentRequest", ForkAgentRequestSchema);
|
|
35
|
+
export const AgentForkPlan = named("AgentForkPlan", AgentForkPlanSchema);
|
|
36
|
+
export const ForkAgentResponse = named("ForkAgentResponse", ForkAgentResponseSchema);
|
|
37
|
+
export const PutAgentDryRunResponse = named("PutAgentDryRunResponse", PutAgentDryRunResponseSchema);
|
|
38
|
+
export const RestartAgentRequest = named("RestartAgentRequest", RestartAgentRequestSchema);
|
|
39
|
+
export const AgentDiskVersions = named("AgentDiskVersions", AgentDiskVersionsSchema);
|
|
40
|
+
export const ListAgentsResponse = named("ListAgentsResponse", ListAgentsResponseSchema);
|
|
41
|
+
export const DeleteAgentResponse = named("DeleteAgentResponse", DeleteAgentResponseSchema);
|
|
42
|
+
export const ListAgentEventsResponse = named("ListAgentEventsResponse", ListAgentEventsResponseSchema);
|
|
41
43
|
export const ArtifactVersionView = named("ArtifactVersionView", ArtifactVersionViewSchema);
|
|
42
44
|
export const ArtifactView = named("ArtifactView", ArtifactViewSchema);
|
|
43
45
|
export const ArtifactListItem = named("ArtifactListItem", ArtifactListItemSchema);
|
|
@@ -58,10 +60,17 @@ export const ArtifactTree = named("ArtifactTree", ArtifactTreeSchema);
|
|
|
58
60
|
export const ArtifactDiff = named("ArtifactDiff", ArtifactDiffSchema);
|
|
59
61
|
export const SessionCommand = named("SessionCommand", SessionCommandSchema);
|
|
60
62
|
export const AcceptedResponse = named("AcceptedResponse", AcceptedResponseSchema);
|
|
61
|
-
export const
|
|
62
|
-
export const
|
|
63
|
-
export const
|
|
64
|
-
export const
|
|
63
|
+
export const QueuedResponse = named("QueuedResponse", QueuedResponseSchema);
|
|
64
|
+
export const TriggerList = named("TriggerList", TriggerListSchema);
|
|
65
|
+
export const MemoryList = named("MemoryList", MemoryListSchema);
|
|
66
|
+
export const MemoryView = named("Memory", MemorySchema);
|
|
67
|
+
export const PutMemoryRequest = named("PutMemoryRequest", PutMemoryRequestSchema);
|
|
68
|
+
export const MemoryVersionPage = named("MemoryVersionPage", MemoryVersionPageSchema);
|
|
69
|
+
export const MemoryVersionDetail = named("MemoryVersionDetail", MemoryVersionDetailSchema);
|
|
70
|
+
export const TriggerRunPage = named("TriggerRunPage", TriggerRunPageSchema);
|
|
71
|
+
export const RunTriggerResponse = named("RunTriggerResponse", RunTriggerResponseSchema);
|
|
72
|
+
export const WebhookSecretResponse = named("WebhookSecretResponse", WebhookSecretResponseSchema);
|
|
73
|
+
export const WebhookAcceptedResponse = named("WebhookAcceptedResponse", WebhookAcceptedResponseSchema);
|
|
65
74
|
export const ListSessionsResponse = named("ListSessionsResponse", ListSessionsResponseSchema);
|
|
66
75
|
export const PutSessionRequest = named("PutSessionRequest", PutSessionRequestSchema);
|
|
67
76
|
export const SessionView = named("SessionView", SessionViewSchema);
|
|
@@ -96,9 +105,9 @@ export const ListProvidersResponse = named("ListProvidersResponse", ListProvider
|
|
|
96
105
|
export const HostModelView = named("HostModelView", HostModelViewSchema);
|
|
97
106
|
export const PutHostModelRequest = named("PutHostModelRequest", PutHostModelRequestSchema);
|
|
98
107
|
export const SelectHostModelRequest = named("SelectHostModelRequest", SelectHostModelRequestSchema);
|
|
99
|
-
export const
|
|
100
|
-
export const
|
|
101
|
-
export const
|
|
108
|
+
export const PutAgentSecretRequest = named("PutAgentSecretRequest", PutAgentSecretRequestSchema);
|
|
109
|
+
export const AgentSecretView = named("AgentSecretView", AgentSecretViewSchema);
|
|
110
|
+
export const ListAgentSecretsResponse = named("ListAgentSecretsResponse", ListAgentSecretsResponseSchema);
|
|
102
111
|
export const DeletedResponse = named("DeletedResponse", DeletedResponseSchema);
|
|
103
112
|
export const McpPreviewRequest = named("McpPreviewRequest", McpPreviewRequestSchema);
|
|
104
113
|
export const McpPreview = named("McpPreview", McpPreviewSchema);
|
|
@@ -117,7 +126,7 @@ export const HistoryPage = named("HistoryPage", HistoryPageSchema.extend({ items
|
|
|
117
126
|
export const SessionUsageTotals = named("SessionUsageTotals", SessionUsageTotalsSchema);
|
|
118
127
|
export const ModelCallsPage = named("ModelCallsPage", ModelCallsPageSchema.extend({ calls: z.array(ModelCall) }));
|
|
119
128
|
export const ModelCallExportPage = named("ModelCallExportPage", ModelCallExportPageSchema.extend({ calls: z.array(ModelCall) }));
|
|
120
|
-
export const
|
|
129
|
+
export const AgentPage = named("AgentPage", AgentPageSchema.extend({ environments: z.array(AgentView) }));
|
|
121
130
|
export const ToolCall = named("ToolCall", ToolCallSchema);
|
|
122
131
|
export const ToolCallsPage = named("ToolCallsPage", ToolCallsPageSchema.extend({ calls: z.array(ToolCall) }));
|
|
123
132
|
export const TurnTrace = named("TurnTrace", TurnTraceSchema);
|
package/dist/api/http/app.js
CHANGED
|
@@ -12,8 +12,10 @@ import { declaredRoute, pathSegments, routeNotFound } from "./define.js";
|
|
|
12
12
|
import { jsonResponse, rejectionOf } from "./respond.js";
|
|
13
13
|
import { accessRoutes } from "./routes/access.js";
|
|
14
14
|
import { meRoutes } from "./routes/me.js";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { agentRoutes } from "./routes/agents.js";
|
|
16
|
+
import { triggerRoutes, webhookRoutes } from "./routes/triggers.js";
|
|
17
|
+
import { memoryRoutes } from "./routes/memories.js";
|
|
18
|
+
import { agentManifestRoutes } from "./routes/agent-manifests.js";
|
|
17
19
|
import { artifactRoutes } from "./routes/artifacts.js";
|
|
18
20
|
import { readRoutes } from "./routes/reads.js";
|
|
19
21
|
import { sessionRoutes } from "./routes/sessions.js";
|
|
@@ -45,8 +47,11 @@ function build() {
|
|
|
45
47
|
});
|
|
46
48
|
sessionRoutes(api);
|
|
47
49
|
fileRoutes(api);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
agentRoutes(api);
|
|
51
|
+
triggerRoutes(api);
|
|
52
|
+
memoryRoutes(api);
|
|
53
|
+
webhookRoutes(api);
|
|
54
|
+
agentManifestRoutes(api);
|
|
50
55
|
artifactRoutes(api);
|
|
51
56
|
tenantRoutes(api);
|
|
52
57
|
keyRoutes(api);
|
package/dist/api/http/body.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export type BodyKind = "json" | "inline";
|
|
|
5
5
|
export declare function bodyLimit(tenant: TenantContext, kind?: BodyKind): Promise<number>;
|
|
6
6
|
/** The body as text; past `maxBytes`, `413 Request too large`. */
|
|
7
7
|
export declare function readText(request: Request, maxBytes: number): Promise<string>;
|
|
8
|
+
/** The body's bytes; past `maxBytes`, `413` with code `limit_exceeded`. */
|
|
9
|
+
export declare function readBytes(request: Request, maxBytes: number, limit: string): Promise<Buffer>;
|
|
8
10
|
/** The body of a Tenant route's request as JSON, before any schema. */
|
|
9
11
|
export declare function readJson(c: {
|
|
10
12
|
readonly req: {
|
package/dist/api/http/body.js
CHANGED
|
@@ -33,6 +33,26 @@ export async function readText(request, maxBytes) {
|
|
|
33
33
|
}
|
|
34
34
|
return Buffer.concat(chunks).toString("utf8");
|
|
35
35
|
}
|
|
36
|
+
/** The body's bytes; past `maxBytes`, `413` with code `limit_exceeded`. */
|
|
37
|
+
export async function readBytes(request, maxBytes, limit) {
|
|
38
|
+
if (request.body === null)
|
|
39
|
+
return Buffer.alloc(0);
|
|
40
|
+
const chunks = [];
|
|
41
|
+
let bytes = 0;
|
|
42
|
+
const reader = request.body.getReader();
|
|
43
|
+
for (;;) {
|
|
44
|
+
const { done, value } = await reader.read();
|
|
45
|
+
if (done)
|
|
46
|
+
break;
|
|
47
|
+
bytes += value.byteLength;
|
|
48
|
+
if (bytes > maxBytes) {
|
|
49
|
+
await reader.cancel();
|
|
50
|
+
fail(413, `The body is over ${maxBytes} bytes, the Runtime limit ${limit}`, { code: "limit_exceeded" });
|
|
51
|
+
}
|
|
52
|
+
chunks.push(value);
|
|
53
|
+
}
|
|
54
|
+
return Buffer.concat(chunks);
|
|
55
|
+
}
|
|
36
56
|
/** The body of a Tenant route's request as JSON, before any schema. */
|
|
37
57
|
export async function readJson(c, kind = "json") {
|
|
38
58
|
const text = await readText(c.req.raw, await bodyLimit(c.env.tenant, kind));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent manifests (`/v1/agent-manifests/**`, protocol 16): save, read, list and delete the named,
|
|
3
|
+
* versioned documents Agents are made from, each with a harness and a runtime section. A save
|
|
4
|
+
* never changes an Agent. Reading needs `agents:read` (or a write scope), saving and deleting
|
|
5
|
+
* `agent-manifests:write`, from any client (Q12). A token caller reaches none: a manifest holds
|
|
6
|
+
* an agent's instructions, tools and servers.
|
|
7
|
+
*/
|
|
8
|
+
import type { OpenAPIHono } from "@hono/zod-openapi";
|
|
9
|
+
import type { TenantEnv } from "../app.js";
|
|
10
|
+
export declare function agentManifestRoutes(api: OpenAPIHono<TenantEnv>): void;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { isAgentManifestName, PutAgentManifestRequestSchema } from "@nylorun/core/contracts";
|
|
3
|
+
import { AgentManifestPlan, AgentManifestVersions, AgentManifestView, DeleteAgentManifestResponse, ListAgentManifestsResponse, PutAgentManifestRequest, SaveAgentManifestResponse, } from "../../components.js";
|
|
4
|
+
import { requirePrincipal } from "../../../tenant/auth.js";
|
|
5
|
+
import { fail } from "../../../tenant/http.js";
|
|
6
|
+
import { agentManifestVersions, deleteAgentManifest, getAgentManifest, listAgentManifests, saveAgentManifest, } from "../../../tenant/agent-manifests.js";
|
|
7
|
+
import { readJson } from "../body.js";
|
|
8
|
+
import { tenantRoute } from "../define.js";
|
|
9
|
+
import { jsonResponse } from "../respond.js";
|
|
10
|
+
const READ = {
|
|
11
|
+
credentials: ["application", "subject"],
|
|
12
|
+
scopes: ["agents:read", "agents:write", "agent-manifests:write"],
|
|
13
|
+
};
|
|
14
|
+
const WRITE = {
|
|
15
|
+
credentials: ["application", "subject"],
|
|
16
|
+
scopes: ["agent-manifests:write"],
|
|
17
|
+
};
|
|
18
|
+
const json = (schema, description) => ({
|
|
19
|
+
description,
|
|
20
|
+
content: { "application/json": { schema } },
|
|
21
|
+
});
|
|
22
|
+
const namePath = z.object({
|
|
23
|
+
name: z.string().meta({ description: "The agent manifest's name, such as `triage`" }),
|
|
24
|
+
});
|
|
25
|
+
function nameOf(value) {
|
|
26
|
+
if (!isAgentManifestName(value))
|
|
27
|
+
return fail(400, "An agent manifest's name is 1-64 letters, digits, '.', '_' and '-', starting with a letter or digit");
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
function versionOf(value) {
|
|
31
|
+
const version = Number(value);
|
|
32
|
+
if (!Number.isInteger(version) || version < 1)
|
|
33
|
+
return fail(400, "version is a positive integer");
|
|
34
|
+
return version;
|
|
35
|
+
}
|
|
36
|
+
/** `If-Match: <version>` (or `"<version>"`), when sent. */
|
|
37
|
+
function ifMatchOf(value) {
|
|
38
|
+
if (value === undefined || value.trim() === "")
|
|
39
|
+
return undefined;
|
|
40
|
+
const version = Number(value.trim().replace(/^W\//, "").replace(/^"|"$/g, ""));
|
|
41
|
+
if (!Number.isInteger(version) || version < 0)
|
|
42
|
+
return fail(400, "If-Match is the version you read: a whole number, 0 for none yet");
|
|
43
|
+
return version;
|
|
44
|
+
}
|
|
45
|
+
export function agentManifestRoutes(api) {
|
|
46
|
+
tenantRoute(api, READ, {
|
|
47
|
+
method: "get",
|
|
48
|
+
path: "/v1/agent-manifests",
|
|
49
|
+
tags: ["Agent manifests"],
|
|
50
|
+
summary: "List agent manifests",
|
|
51
|
+
description: "Each manifest's latest version, by name, with how many Agents were made from it.",
|
|
52
|
+
responses: { 200: json(ListAgentManifestsResponse, "The manifests") },
|
|
53
|
+
}, async (c) => {
|
|
54
|
+
requirePrincipal(c.get("scope"));
|
|
55
|
+
return jsonResponse(200, await listAgentManifests(c.env.tenant));
|
|
56
|
+
});
|
|
57
|
+
tenantRoute(api, WRITE, {
|
|
58
|
+
method: "put",
|
|
59
|
+
path: "/v1/agent-manifests/{name}",
|
|
60
|
+
tags: ["Agent manifests"],
|
|
61
|
+
summary: "Save an agent manifest",
|
|
62
|
+
description: "Saves the manifest as its next version, or answers the latest unchanged when nothing differs. Every Agent that tracks the manifest moves to the new version (track T3): at once, at its pod's next start for a runtime change a pod applies only when it starts, or once a required secret the version adds is set; a pinned one stays, and so does one whose kind, harness or storage the version changes (`agents_behind`). The Runtime checks the harness and runtime sections against each other: a custom harness needs a pod with an image, every credential the harness names is a declared slot of the right type, and the runtime's kind gives the loop the sandbox it needs; every gap is named in one `422 manifest_inconsistent` (`details.gaps`). `If-Match: <version>` refuses the save with `412 manifest_changed` when the latest version is no longer the one you read (`0` for a manifest that does not exist yet). With `?dryRun=true` the answer is the plan: the changes by section, every reason a save would be refused (`errors`, the gaps first), warnings, the Agents it would move (`moves`) and how many stay on older versions (`behind`); nothing is saved. Clients compose the authoring files and drop their `$schema` before they send one document.",
|
|
63
|
+
request: {
|
|
64
|
+
params: namePath,
|
|
65
|
+
query: z.object({
|
|
66
|
+
dryRun: z.enum(["true", "false"]).optional().meta({ description: "`true`: answer the plan and save nothing" }),
|
|
67
|
+
}),
|
|
68
|
+
body: { required: true, content: { "application/json": { schema: PutAgentManifestRequest } } },
|
|
69
|
+
},
|
|
70
|
+
responses: {
|
|
71
|
+
200: json(z.union([SaveAgentManifestResponse, AgentManifestPlan]), "The version saved, or the plan with dryRun"),
|
|
72
|
+
400: {
|
|
73
|
+
description: "The manifest breaks the Tenant's limits, has a tool that runs code, or names files the Runtime does not hold (`definition_files_missing`)",
|
|
74
|
+
},
|
|
75
|
+
412: { description: "If-Match named a version that is no longer the latest (`manifest_changed`)" },
|
|
76
|
+
413: { description: "A skill's files hold more than the manifest's skill limit together (`limit_exceeded`)" },
|
|
77
|
+
422: { description: "The harness and runtime sections do not fit (`manifest_inconsistent`, `details.gaps`)" },
|
|
78
|
+
},
|
|
79
|
+
}, async (c) => {
|
|
80
|
+
const name = nameOf(c.req.param("name"));
|
|
81
|
+
const body = PutAgentManifestRequestSchema.parse(await readJson(c));
|
|
82
|
+
const ifMatch = ifMatchOf(c.req.header("if-match"));
|
|
83
|
+
const options = ifMatch === undefined ? {} : { ifMatch };
|
|
84
|
+
return jsonResponse(200, c.req.query("dryRun") === "true"
|
|
85
|
+
? await saveAgentManifest(c.env.tenant, name, body, c.get("scope"), { ...options, dryRun: true })
|
|
86
|
+
: await saveAgentManifest(c.env.tenant, name, body, c.get("scope"), options));
|
|
87
|
+
});
|
|
88
|
+
tenantRoute(api, READ, {
|
|
89
|
+
method: "get",
|
|
90
|
+
path: "/v1/agent-manifests/{name}",
|
|
91
|
+
tags: ["Agent manifests"],
|
|
92
|
+
summary: "Get an agent manifest",
|
|
93
|
+
description: "Its latest version.",
|
|
94
|
+
request: { params: namePath },
|
|
95
|
+
responses: { 200: json(AgentManifestView, "The latest version") },
|
|
96
|
+
}, async (c) => {
|
|
97
|
+
requirePrincipal(c.get("scope"));
|
|
98
|
+
return jsonResponse(200, await getAgentManifest(c.env.tenant, nameOf(c.req.param("name"))));
|
|
99
|
+
});
|
|
100
|
+
tenantRoute(api, READ, {
|
|
101
|
+
method: "get",
|
|
102
|
+
path: "/v1/agent-manifests/{name}/versions",
|
|
103
|
+
tags: ["Agent manifests"],
|
|
104
|
+
summary: "List an agent manifest's versions",
|
|
105
|
+
description: "Every version, newest first, with who saved it and how many Agents were made from it.",
|
|
106
|
+
request: { params: namePath },
|
|
107
|
+
responses: { 200: json(AgentManifestVersions, "The versions") },
|
|
108
|
+
}, async (c) => {
|
|
109
|
+
requirePrincipal(c.get("scope"));
|
|
110
|
+
return jsonResponse(200, await agentManifestVersions(c.env.tenant, nameOf(c.req.param("name"))));
|
|
111
|
+
});
|
|
112
|
+
tenantRoute(api, READ, {
|
|
113
|
+
method: "get",
|
|
114
|
+
path: "/v1/agent-manifests/{name}/versions/{version}",
|
|
115
|
+
tags: ["Agent manifests"],
|
|
116
|
+
summary: "Get one version of an agent manifest",
|
|
117
|
+
request: { params: namePath.extend({ version: z.string().meta({ description: "The version number" }) }) },
|
|
118
|
+
responses: { 200: json(AgentManifestView, "The version") },
|
|
119
|
+
}, async (c) => {
|
|
120
|
+
requirePrincipal(c.get("scope"));
|
|
121
|
+
return jsonResponse(200, await getAgentManifest(c.env.tenant, nameOf(c.req.param("name")), versionOf(c.req.param("version"))));
|
|
122
|
+
});
|
|
123
|
+
tenantRoute(api, WRITE, {
|
|
124
|
+
method: "delete",
|
|
125
|
+
path: "/v1/agent-manifests/{name}",
|
|
126
|
+
tags: ["Agent manifests"],
|
|
127
|
+
summary: "Delete an agent manifest",
|
|
128
|
+
description: "Deletes every version. Refused while any Agent was made from one (`409 manifest_in_use`).",
|
|
129
|
+
request: { params: namePath },
|
|
130
|
+
responses: {
|
|
131
|
+
200: json(DeleteAgentManifestResponse, "Deleted, or there was none"),
|
|
132
|
+
409: { description: "An Agent was made from one of its versions (`manifest_in_use`)" },
|
|
133
|
+
},
|
|
134
|
+
}, async (c) => jsonResponse(200, await deleteAgentManifest(c.env.tenant, nameOf(c.req.param("name")))));
|
|
135
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agents (`/v1/agents/**`, protocol 16; Environments from protocol 11, D55, D56): make one from a
|
|
3
|
+
* saved agent manifest or find it by id, read it, list them by label, state or manifest, read its
|
|
4
|
+
* lifecycle stream, stop, reset, fork and delete it, work its disk versions, and write its vault's
|
|
5
|
+
* secrets. Ids may hold `/`, sent percent-encoded as one path segment (`users%2Falice%2Ftriage`).
|
|
6
|
+
* A token caller reaches only the ids its Agent grants match, and changes them only with
|
|
7
|
+
* `agents:write`. Secret values are write-only: no route reads one back.
|
|
8
|
+
*/
|
|
9
|
+
import type { OpenAPIHono } from "@hono/zod-openapi";
|
|
10
|
+
import type { TenantEnv } from "../app.js";
|
|
11
|
+
export declare function agentRoutes(api: OpenAPIHono<TenantEnv>): void;
|