@nylorun/runtime 0.26.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 +171 -0
- package/README.md +18 -14
- package/dist/adapters/execution/restate.d.ts +15 -18
- package/dist/adapters/execution/restate.js +31 -27
- package/dist/adapters/replication/pgoutput.d.ts +1 -1
- package/dist/adapters/replication/pgoutput.js +3 -2
- package/dist/adapters/sandbox/local.js +8 -5
- package/dist/adapters/sandbox/virtual.js +2 -2
- package/dist/adapters/streams/s2.d.ts +1 -1
- package/dist/adapters/streams/s2.js +18 -14
- package/dist/api/a2a/card.d.ts +4 -3
- package/dist/api/a2a/card.js +4 -4
- package/dist/api/a2a/endpoint.js +3 -4
- package/dist/api/a2a/protocol.js +4 -0
- package/dist/api/a2a/routes.d.ts +2 -6
- package/dist/api/a2a/routes.js +30 -25
- package/dist/api/ag-ui/endpoint.js +2 -3
- package/dist/api/ag-ui/routes.js +8 -11
- package/dist/api/components.d.ts +6789 -3405
- package/dist/api/components.js +43 -30
- package/dist/api/gate/keys.js +7 -4
- package/dist/api/gate/routes.d.ts +6 -2
- package/dist/api/gate/routes.js +15 -11
- package/dist/api/http/app.js +9 -4
- package/dist/api/http/body.d.ts +17 -3
- package/dist/api/http/body.js +35 -7
- package/dist/api/http/respond.js +6 -2
- package/dist/api/http/routes/access.js +5 -4
- 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 +21 -9
- package/dist/api/http/routes/coverage.d.ts +4 -4
- package/dist/api/http/routes/coverage.js +13 -7
- package/dist/api/http/routes/files.d.ts +2 -1
- package/dist/api/http/routes/files.js +31 -5
- package/dist/api/http/routes/mcp.js +3 -3
- 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 +10 -111
- package/dist/api/http/routes/reads.js +51 -29
- package/dist/api/http/routes/sessions.js +26 -54
- package/dist/api/http/routes/tenant.d.ts +2 -2
- package/dist/api/http/routes/tenant.js +77 -24
- package/dist/api/http/routes/triggers.d.ts +10 -0
- package/dist/api/http/routes/triggers.js +180 -0
- package/dist/api/inbound-files.d.ts +3 -9
- package/dist/api/inbound-files.js +18 -24
- package/dist/api/openapi.js +73 -47
- package/dist/artifacts/disk.d.ts +10 -14
- package/dist/artifacts/disk.js +99 -95
- package/dist/artifacts/files.d.ts +13 -4
- package/dist/artifacts/files.js +27 -9
- package/dist/artifacts/folder-upload.d.ts +75 -0
- package/dist/artifacts/folder-upload.js +263 -0
- package/dist/artifacts/folders.d.ts +14 -8
- package/dist/artifacts/folders.js +19 -11
- package/dist/artifacts/links.js +7 -6
- package/dist/artifacts/parts.d.ts +9 -14
- package/dist/artifacts/parts.js +11 -9
- package/dist/artifacts/pipe.d.ts +15 -0
- package/dist/artifacts/pipe.js +71 -0
- package/dist/artifacts/quota.d.ts +36 -0
- package/dist/artifacts/quota.js +44 -0
- package/dist/artifacts/service.d.ts +25 -1
- package/dist/artifacts/service.js +72 -27
- package/dist/blob/fs.js +2 -1
- package/dist/blob/s3.d.ts +6 -2
- package/dist/blob/s3.js +9 -7
- package/dist/blob/types.d.ts +1 -1
- package/dist/blob/types.js +1 -1
- package/dist/core/flow-host.d.ts +0 -1
- package/dist/core/limits.d.ts +11 -35
- package/dist/core/limits.js +5 -73
- package/dist/core/sandbox-routes.js +0 -1
- package/dist/core/turn-manifest.d.ts +1 -2
- package/dist/core/turn-manifest.js +4 -28
- package/dist/execution/memory.d.ts +8 -5
- package/dist/execution/memory.js +8 -6
- package/dist/execution/types.d.ts +1 -6
- package/dist/execution/types.js +0 -5
- package/dist/gates/contract.d.ts +3 -2
- package/dist/gates/contract.js +1 -1
- package/dist/gates/egress-credentials.js +5 -4
- package/dist/gates/egress.d.ts +13 -13
- package/dist/gates/egress.js +19 -21
- package/dist/gates/fixture-model.js +13 -2
- package/dist/gates/handler.d.ts +1 -3
- package/dist/gates/handler.js +4 -3
- package/dist/gates/http-client.d.ts +4 -3
- package/dist/gates/http-client.js +5 -7
- package/dist/gates/http-tool.d.ts +24 -4
- package/dist/gates/http-tool.js +41 -13
- package/dist/gates/in-process.d.ts +2 -1
- package/dist/gates/in-process.js +17 -9
- package/dist/gates/inflight.d.ts +2 -2
- package/dist/gates/inflight.js +3 -2
- package/dist/gates/journal.js +5 -7
- package/dist/gates/mcp-handler.d.ts +4 -3
- package/dist/gates/mcp-handler.js +15 -5
- package/dist/gates/meter.js +6 -5
- package/dist/gates/model-gate.d.ts +11 -2
- package/dist/gates/policy.d.ts +34 -6
- package/dist/gates/policy.js +66 -18
- package/dist/gates/provider-gate.d.ts +22 -0
- package/dist/gates/provider-gate.js +30 -0
- package/dist/gates/tool-calls.d.ts +1 -3
- package/dist/gates/tool-calls.js +2 -3
- package/dist/gates/tool-client.d.ts +1 -1
- package/dist/gates/tool-client.js +5 -6
- package/dist/gates/tool-contract.d.ts +8 -5
- package/dist/gates/tool-contract.js +1 -1
- package/dist/gates/tool-gate.d.ts +18 -7
- package/dist/gates/tool-gate.js +49 -7
- package/dist/harness/calls.d.ts +27 -25
- package/dist/harness/calls.js +40 -46
- package/dist/harness/executors.d.ts +10 -3
- package/dist/harness/executors.js +53 -23
- package/dist/harness/main.js +2 -2
- package/dist/harness/pod.d.ts +2 -2
- package/dist/harness/pod.js +7 -6
- package/dist/harness/run-tokens.d.ts +4 -1
- package/dist/harness/run-tokens.js +6 -2
- package/dist/harness/service.d.ts +17 -14
- package/dist/harness/service.js +21 -35
- package/dist/harness/setup.d.ts +0 -2
- package/dist/harness/setup.js +21 -15
- package/dist/harness/ws-client.d.ts +2 -2
- package/dist/harness/ws-client.js +7 -5
- package/dist/harness/ws-port.d.ts +3 -4
- package/dist/harness/ws-port.js +3 -4
- package/dist/harness-api/artifacts.d.ts +20 -0
- package/dist/harness-api/artifacts.js +478 -0
- package/dist/harness-api/in-process.d.ts +2 -2
- package/dist/harness-api/in-process.js +18 -16
- package/dist/harness-api/record.d.ts +10 -9
- package/dist/harness-api/record.js +113 -157
- package/dist/harness-api/renew.d.ts +1 -1
- package/dist/harness-api/renew.js +2 -2
- package/dist/harness-api/server.d.ts +1 -16
- package/dist/harness-api/server.js +86 -73
- package/dist/harness-api/start.d.ts +27 -5
- package/dist/harness-api/start.js +102 -19
- package/dist/harness-api/tool-journal.d.ts +15 -10
- package/dist/harness-api/tool-journal.js +26 -24
- package/dist/harness-api/workspace.d.ts +0 -4
- package/dist/harness-api/workspace.js +4 -47
- package/dist/harness-api/ws-server.js +10 -10
- package/dist/host/create-host.js +2 -3
- package/dist/host/execution.js +2 -3
- package/dist/host/gates.d.ts +2 -9
- package/dist/host/gates.js +15 -12
- package/dist/host/http.d.ts +2 -4
- package/dist/host/http.js +5 -29
- package/dist/host/main.js +10 -3
- package/dist/host/operate.js +12 -3
- package/dist/host/stack-config.d.ts +11 -0
- package/dist/host/stack-config.js +21 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/infra/index.js +2 -1
- package/dist/infra/readiness.d.ts +0 -2
- package/dist/infra/readiness.js +4 -3
- package/dist/keys/client.d.ts +1 -0
- package/dist/keys/client.js +2 -3
- package/dist/keys/contract.d.ts +0 -2
- package/dist/keys/contract.js +0 -2
- package/dist/keys/egress-ca.d.ts +0 -2
- package/dist/keys/egress-ca.js +2 -3
- package/dist/keys/keys.d.ts +15 -4
- package/dist/keys/keys.js +22 -1
- package/dist/keys/webhooks.d.ts +25 -0
- package/dist/keys/webhooks.js +62 -0
- package/dist/keys/x509.d.ts +8 -4
- package/dist/keys/x509.js +14 -5
- package/dist/management-openapi.json +3043 -1954
- package/dist/mcp/connect.d.ts +35 -26
- package/dist/mcp/connect.js +112 -141
- package/dist/mcp/pool.d.ts +27 -22
- package/dist/mcp/pool.js +34 -48
- package/dist/mcp/preview.d.ts +12 -5
- package/dist/mcp/preview.js +43 -26
- package/dist/mcp/snapshot.d.ts +35 -86
- package/dist/mcp/snapshot.js +93 -135
- 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/model/auth-store.js +5 -3
- package/dist/model/capabilities.d.ts +1 -1
- package/dist/model/catalog.d.ts +9 -36
- package/dist/model/catalog.js +6 -33
- package/dist/model/descriptor.d.ts +51 -0
- package/dist/model/descriptor.js +83 -0
- package/dist/model/models.d.ts +0 -3
- package/dist/model/models.js +3 -5
- package/dist/model/native-blocks.js +1 -1
- package/dist/model/pi-model.d.ts +16 -5
- package/dist/model/pi-model.js +86 -105
- package/dist/openapi.json +13653 -9986
- package/dist/reads/cursor.js +3 -1
- 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/append.d.ts +34 -2
- package/dist/record/append.js +50 -1
- package/dist/record/index.d.ts +2 -2
- package/dist/record/index.js +2 -2
- package/dist/redact.d.ts +1 -1
- package/dist/redact.js +3 -2
- package/dist/sandbox/egress-token.d.ts +3 -3
- package/dist/sandbox/egress-token.js +3 -3
- package/dist/sandbox/join.js +8 -7
- package/dist/sandbox/manager.d.ts +41 -41
- package/dist/sandbox/manager.js +112 -44
- package/dist/sandbox/placement.d.ts +2 -2
- package/dist/sandbox/placement.js +7 -10
- package/dist/sandbox/pods/client.d.ts +1 -10
- package/dist/sandbox/pods/client.js +8 -4
- package/dist/sandbox/pods/lifecycle.d.ts +25 -17
- package/dist/sandbox/pods/lifecycle.js +51 -29
- package/dist/sandbox/pods/network-gate.d.ts +4 -5
- package/dist/sandbox/pods/network-gate.js +7 -7
- package/dist/sandbox/pods/reconcile.js +14 -3
- package/dist/sandbox/pods/spec.js +8 -5
- package/dist/sandbox/policy.d.ts +7 -1
- package/dist/sandbox/policy.js +10 -3
- package/dist/sandbox/resolve.d.ts +11 -6
- package/dist/sandbox/resolve.js +19 -9
- package/dist/sandbox/setup.d.ts +6 -2
- package/dist/sandbox/setup.js +47 -14
- package/dist/sandbox/share.d.ts +5 -14
- package/dist/sandbox/share.js +5 -34
- package/dist/sandbox/skills.d.ts +7 -13
- package/dist/sandbox/skills.js +16 -31
- package/dist/sandbox/tenant-config.d.ts +2 -2
- package/dist/sandbox/tenant-config.js +4 -3
- package/dist/sandbox/tools.d.ts +7 -1
- package/dist/sandbox/tools.js +26 -26
- package/dist/sandbox/types.d.ts +10 -3
- package/dist/sandbox/types.js +9 -0
- package/dist/store/postgres/connect.d.ts +6 -5
- package/dist/store/postgres/connect.js +14 -11
- package/dist/store/postgres/control.js +13 -13
- package/dist/store/postgres/drizzle/0028_artifact_write_keys.sql +2 -0
- package/dist/store/postgres/drizzle/0029_protocol_15.sql +11 -0
- package/dist/store/postgres/drizzle/0030_protocol_15_runtime_block.sql +11 -0
- package/dist/store/postgres/drizzle/0031_protocol_15_mcp_snapshot.sql +8 -0
- 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 +63 -0
- package/dist/store/postgres/reads.js +17 -82
- 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 +1382 -151
- package/dist/store/postgres/schema.js +191 -37
- package/dist/store/postgres/store.js +384 -105
- package/dist/store/postgres/tenant.js +1 -2
- package/dist/store/types.d.ts +172 -57
- package/dist/store/types.js +0 -1
- package/dist/streams/relay/core.d.ts +3 -3
- package/dist/streams/relay/core.js +9 -10
- package/dist/tenant/advance.js +41 -39
- 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} +493 -328
- 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 -90
- package/dist/tenant/context.d.ts +57 -33
- package/dist/tenant/context.js +6 -2
- package/dist/tenant/definition-files.d.ts +25 -4
- package/dist/tenant/definition-files.js +85 -47
- package/dist/tenant/effects.js +15 -51
- package/dist/tenant/ephemeral.js +2 -1
- package/dist/tenant/history.d.ts +1 -1
- package/dist/tenant/history.js +1 -1
- package/dist/tenant/host-token.d.ts +3 -3
- package/dist/tenant/host-token.js +11 -10
- package/dist/tenant/http.d.ts +5 -8
- package/dist/tenant/http.js +9 -0
- package/dist/tenant/identity-file.d.ts +29 -6
- package/dist/tenant/identity-file.js +45 -15
- package/dist/tenant/issuers.d.ts +5 -5
- package/dist/tenant/issuers.js +34 -26
- package/dist/tenant/jwt.d.ts +8 -2
- package/dist/tenant/jwt.js +10 -2
- package/dist/tenant/limits.d.ts +87 -0
- package/dist/tenant/limits.js +172 -0
- package/dist/tenant/memories.d.ts +38 -0
- package/dist/tenant/memories.js +119 -0
- package/dist/tenant/module.d.ts +4 -1
- package/dist/tenant/module.js +9 -8
- package/dist/tenant/outbound.d.ts +11 -14
- package/dist/tenant/outbound.js +10 -15
- package/dist/tenant/reset.js +2 -2
- package/dist/tenant/run-grants.d.ts +6 -0
- package/dist/tenant/run-grants.js +7 -2
- package/dist/tenant/run-token.d.ts +0 -4
- package/dist/tenant/run-token.js +6 -11
- package/dist/tenant/runtime-limits.d.ts +24 -0
- package/dist/tenant/runtime-limits.js +27 -0
- package/dist/tenant/runtime.d.ts +1 -1
- package/dist/tenant/runtime.js +38 -43
- package/dist/tenant/session-streams.js +7 -6
- package/dist/tenant/session.d.ts +1 -1
- package/dist/tenant/session.js +1 -1
- package/dist/tenant/sessions.d.ts +28 -45
- package/dist/tenant/sessions.js +89 -209
- package/dist/tenant/signing-keys.d.ts +1 -1
- package/dist/tenant/signing-keys.js +5 -6
- package/dist/tenant/status.js +10 -10
- package/dist/tenant/streams.js +18 -20
- package/dist/tenant/sweep.d.ts +1 -21
- package/dist/tenant/sweep.js +51 -51
- package/dist/tenant/transcript.d.ts +70 -23
- package/dist/tenant/transcript.js +28 -22
- 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/types.d.ts +9 -14
- package/dist/tenant/worker.d.ts +4 -10
- package/dist/tenant/worker.js +10 -14
- package/dist/traces/ids.js +5 -1
- package/dist/traces/map.d.ts +10 -7
- package/dist/traces/map.js +16 -12
- package/dist/traces/otlp.d.ts +3 -3
- package/dist/traces/otlp.js +5 -3
- package/dist/traces/projector.d.ts +9 -4
- package/dist/traces/projector.js +13 -7
- package/dist/traces/read.js +6 -1
- package/dist/tuning.d.ts +390 -0
- package/dist/tuning.js +677 -0
- package/dist/vault/headers.js +4 -2
- 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/artifacts/export.d.ts +0 -8
- package/dist/artifacts/export.js +0 -204
- package/dist/artifacts/media-types.d.ts +0 -30
- package/dist/artifacts/media-types.js +0 -137
- package/dist/artifacts/workspace.d.ts +0 -60
- package/dist/artifacts/workspace.js +0 -45
- package/dist/media.d.ts +0 -10
- package/dist/media.js +0 -58
- package/dist/record/environment.d.ts +0 -25
- package/dist/record/environment.js +0 -44
- package/dist/sandbox/runtime-tools.d.ts +0 -9
- package/dist/sandbox/runtime-tools.js +0 -16
- package/dist/sandbox/session-sandbox.d.ts +0 -16
- package/dist/sandbox/session-sandbox.js +0 -77
- package/dist/tenant/artifact-tool.d.ts +0 -13
- package/dist/tenant/artifact-tool.js +0 -243
- package/dist/tenant/environment-manifests.d.ts +0 -57
- package/dist/tenant/environment-manifests.js +0 -200
- package/dist/tenant/environments.d.ts +0 -174
- package/dist/tenant/skill-tool.d.ts +0 -20
- package/dist/tenant/skill-tool.js +0 -67
- package/dist/tenant/tool-results.d.ts +0 -57
- package/dist/tenant/tool-results.js +0 -298
- package/dist/tenant/tool-search.d.ts +0 -39
- package/dist/tenant/tool-search.js +0 -103
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);
|
|
@@ -50,14 +52,25 @@ export const CreateArtifactLinkRequest = named("CreateArtifactLinkRequest", Crea
|
|
|
50
52
|
export const ArtifactLink = named("ArtifactLink", ArtifactLinkSchema);
|
|
51
53
|
export const PutTenantArtifactsRequest = named("PutTenantArtifactsRequest", PutTenantArtifactsRequestSchema);
|
|
52
54
|
export const TenantArtifactsView = named("TenantArtifactsView", TenantArtifactsViewSchema);
|
|
55
|
+
export const PutTenantSkillsRequest = named("PutTenantSkillsRequest", PutTenantSkillsRequestSchema);
|
|
56
|
+
export const TenantSkillsView = named("TenantSkillsView", TenantSkillsViewSchema);
|
|
57
|
+
export const PutTenantLimitsRequest = named("PutTenantLimitsRequest", PutTenantLimitsRequestSchema);
|
|
58
|
+
export const TenantLimitsView = named("TenantLimitsView", TenantLimitsViewSchema);
|
|
53
59
|
export const ArtifactTree = named("ArtifactTree", ArtifactTreeSchema);
|
|
54
60
|
export const ArtifactDiff = named("ArtifactDiff", ArtifactDiffSchema);
|
|
55
61
|
export const SessionCommand = named("SessionCommand", SessionCommandSchema);
|
|
56
62
|
export const AcceptedResponse = named("AcceptedResponse", AcceptedResponseSchema);
|
|
57
|
-
export const
|
|
58
|
-
export const
|
|
59
|
-
export const
|
|
60
|
-
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);
|
|
61
74
|
export const ListSessionsResponse = named("ListSessionsResponse", ListSessionsResponseSchema);
|
|
62
75
|
export const PutSessionRequest = named("PutSessionRequest", PutSessionRequestSchema);
|
|
63
76
|
export const SessionView = named("SessionView", SessionViewSchema);
|
|
@@ -92,9 +105,9 @@ export const ListProvidersResponse = named("ListProvidersResponse", ListProvider
|
|
|
92
105
|
export const HostModelView = named("HostModelView", HostModelViewSchema);
|
|
93
106
|
export const PutHostModelRequest = named("PutHostModelRequest", PutHostModelRequestSchema);
|
|
94
107
|
export const SelectHostModelRequest = named("SelectHostModelRequest", SelectHostModelRequestSchema);
|
|
95
|
-
export const
|
|
96
|
-
export const
|
|
97
|
-
export const
|
|
108
|
+
export const PutAgentSecretRequest = named("PutAgentSecretRequest", PutAgentSecretRequestSchema);
|
|
109
|
+
export const AgentSecretView = named("AgentSecretView", AgentSecretViewSchema);
|
|
110
|
+
export const ListAgentSecretsResponse = named("ListAgentSecretsResponse", ListAgentSecretsResponseSchema);
|
|
98
111
|
export const DeletedResponse = named("DeletedResponse", DeletedResponseSchema);
|
|
99
112
|
export const McpPreviewRequest = named("McpPreviewRequest", McpPreviewRequestSchema);
|
|
100
113
|
export const McpPreview = named("McpPreview", McpPreviewSchema);
|
|
@@ -113,7 +126,7 @@ export const HistoryPage = named("HistoryPage", HistoryPageSchema.extend({ items
|
|
|
113
126
|
export const SessionUsageTotals = named("SessionUsageTotals", SessionUsageTotalsSchema);
|
|
114
127
|
export const ModelCallsPage = named("ModelCallsPage", ModelCallsPageSchema.extend({ calls: z.array(ModelCall) }));
|
|
115
128
|
export const ModelCallExportPage = named("ModelCallExportPage", ModelCallExportPageSchema.extend({ calls: z.array(ModelCall) }));
|
|
116
|
-
export const
|
|
129
|
+
export const AgentPage = named("AgentPage", AgentPageSchema.extend({ environments: z.array(AgentView) }));
|
|
117
130
|
export const ToolCall = named("ToolCall", ToolCallSchema);
|
|
118
131
|
export const ToolCallsPage = named("ToolCallsPage", ToolCallsPageSchema.extend({ calls: z.array(ToolCall) }));
|
|
119
132
|
export const TurnTrace = named("TurnTrace", TurnTraceSchema);
|
package/dist/api/gate/keys.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { bodyLimit } from "hono/body-limit";
|
|
2
2
|
import { HttpError } from "../../tenant/http.js";
|
|
3
3
|
import { VaultError } from "../../vault/error.js";
|
|
4
|
-
import { KEYS_PATH
|
|
4
|
+
import { KEYS_PATH } from "../../keys/contract.js";
|
|
5
|
+
import { hostTuning } from "../../tuning.js";
|
|
5
6
|
import { KEYS_OPERATIONS } from "../../keys/keys.js";
|
|
6
7
|
export function mountKeysRoutes(app, options) {
|
|
7
|
-
app.post(`${KEYS_PATH}/:operation`, options.authorized,
|
|
8
|
-
|
|
8
|
+
app.post(`${KEYS_PATH}/:operation`, options.authorized,
|
|
9
|
+
// The largest request body: a credential with its secret, or a token's claims (`keys.bodyBytes`).
|
|
10
|
+
(c, next) => bodyLimit({
|
|
11
|
+
maxSize: hostTuning().keys.bodyBytes,
|
|
9
12
|
onError: (c) => c.json({ error: { code: "invalid_request", message: "The body is too large" } }, 400),
|
|
10
|
-
}), async (c) => {
|
|
13
|
+
})(c, next), async (c) => {
|
|
11
14
|
const operation = c.req.param("operation");
|
|
12
15
|
if (!KEYS_OPERATIONS.includes(operation))
|
|
13
16
|
return c.json({ error: { code: "invalid_request", message: `Unknown keys operation ${operation}` } }, 404);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
+
import type { RuntimeLimits } from "@nylorun/core/contracts";
|
|
2
3
|
import type { ModelCallHandler } from "../../gates/handler.js";
|
|
3
4
|
import { type InflightCalls } from "../../gates/inflight.js";
|
|
4
5
|
import type { McpHandler } from "../../gates/mcp-handler.js";
|
|
@@ -25,8 +26,11 @@ export interface GatesAppOptions {
|
|
|
25
26
|
readonly inflight: InflightCalls;
|
|
26
27
|
/** Whether the gate's dependencies answer (Postgres). */
|
|
27
28
|
readonly ready: () => Promise<boolean>;
|
|
28
|
-
/**
|
|
29
|
-
|
|
29
|
+
/**
|
|
30
|
+
* The Tenant's Runtime limits, read from its database for each call (`modelCallBytes` bounds a
|
|
31
|
+
* model call's body, `toolAnswerBytes` a tool request's).
|
|
32
|
+
*/
|
|
33
|
+
readonly limits: () => Promise<RuntimeLimits>;
|
|
30
34
|
/** Remote MCP servers (F4.1). Without it the MCP routes answer 404. */
|
|
31
35
|
readonly mcp?: McpHandler;
|
|
32
36
|
/** HTTP tool calls (R2 M3). Without it the HTTP calls route answers 404. */
|
package/dist/api/gate/routes.js
CHANGED
|
@@ -22,10 +22,10 @@ import { Hono } from "hono";
|
|
|
22
22
|
import { bodyLimit } from "hono/body-limit";
|
|
23
23
|
import { HTTPException } from "hono/http-exception";
|
|
24
24
|
import { isTenantId } from "@nylorun/core/compatibility";
|
|
25
|
-
import {
|
|
25
|
+
import { MODEL_CALLS_PATH, ModelCallBodySchema, TENANT_HEADER, } from "../../gates/contract.js";
|
|
26
26
|
import { InflightConflict, InflightStale } from "../../gates/inflight.js";
|
|
27
27
|
import { mountKeysRoutes } from "./keys.js";
|
|
28
|
-
import { HTTP_CALLS_PATH, HttpCallBodySchema,
|
|
28
|
+
import { HTTP_CALLS_PATH, HttpCallBodySchema, MCP_CLOSE_PATH, MCP_CONNECT_PATH, MCP_LIST_PATH, McpListBodySchema, McpServerBodySchema, TOOL_CALLS_PATH, ToolCallBodySchema, } from "../../gates/tool-contract.js";
|
|
29
29
|
import { looksLikeToken } from "../../tenant/jwt.js";
|
|
30
30
|
import { adminKeyMatches } from "../../host/http.js";
|
|
31
31
|
import { canonical } from "../../store/canonical.js";
|
|
@@ -37,7 +37,6 @@ const gateError = (code, message) => ({
|
|
|
37
37
|
});
|
|
38
38
|
export function createGatesApp(options) {
|
|
39
39
|
const app = new Hono();
|
|
40
|
-
const maxSize = options.maxBodyBytes ?? MAX_MODEL_CALL_BYTES;
|
|
41
40
|
const logger = options.logger ?? { info() { }, warn() { }, error() { } };
|
|
42
41
|
// Hono's default, but logged through the logger: never the body, which may hold secrets.
|
|
43
42
|
app.onError((error, c) => {
|
|
@@ -105,10 +104,18 @@ export function createGatesApp(options) {
|
|
|
105
104
|
return claims?.tenantId ?? tenantId;
|
|
106
105
|
};
|
|
107
106
|
const badTenant = (c) => c.json(invalid(`The ${TENANT_HEADER} header must name a Tenant, the run token's when there is one`), 400);
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
107
|
+
/**
|
|
108
|
+
* A body of at most the Tenant's limit `name`, read for this request: a larger one is `400`,
|
|
109
|
+
* naming the limit.
|
|
110
|
+
*/
|
|
111
|
+
const limited = (name, what) => async (c, next) => {
|
|
112
|
+
const maxSize = (await options.limits())[name];
|
|
113
|
+
return bodyLimit({
|
|
114
|
+
maxSize,
|
|
115
|
+
onError: (c) => c.json(invalid(`${what} may be at most ${maxSize} bytes (the Runtime limit ${name})`), 400),
|
|
116
|
+
})(c, next);
|
|
117
|
+
};
|
|
118
|
+
const toolBodies = limited("toolAnswerBytes", "A request body");
|
|
112
119
|
/** The parsed body, or the 400 to answer. */
|
|
113
120
|
async function read(c, schema) {
|
|
114
121
|
const tenantId = tenantOf(c);
|
|
@@ -322,10 +329,7 @@ export function createGatesApp(options) {
|
|
|
322
329
|
return c.json(gateError("gate_forbidden", "The call is another session's"), 403);
|
|
323
330
|
return c.body(null, 204);
|
|
324
331
|
});
|
|
325
|
-
app.post(MODEL_CALLS_PATH, run({ live: true }),
|
|
326
|
-
maxSize,
|
|
327
|
-
onError: (c) => c.json(invalid(`A model call body may be at most ${maxSize} bytes`), 400),
|
|
328
|
-
}), async (c) => {
|
|
332
|
+
app.post(MODEL_CALLS_PATH, run({ live: true }), limited("modelCallBytes", "A model call body"), async (c) => {
|
|
329
333
|
// Optional: the gate serves its database's one Tenant, and refuses a call naming another.
|
|
330
334
|
const tenantId = tenantOf(c);
|
|
331
335
|
if (tenantId === false)
|
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
|
@@ -1,4 +1,18 @@
|
|
|
1
|
+
import type { TenantContext } from "../../tenant/context.js";
|
|
2
|
+
/** What a body is: a JSON request (`requestBodyBytes`), or a message that may carry files inline. */
|
|
3
|
+
export type BodyKind = "json" | "inline";
|
|
4
|
+
/** The most bytes the Tenant's route reads of a body of `kind`. */
|
|
5
|
+
export declare function bodyLimit(tenant: TenantContext, kind?: BodyKind): Promise<number>;
|
|
1
6
|
/** The body as text; past `maxBytes`, `413 Request too large`. */
|
|
2
|
-
export declare function readText(request: Request, maxBytes
|
|
3
|
-
/** The body
|
|
4
|
-
export declare function
|
|
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>;
|
|
10
|
+
/** The body of a Tenant route's request as JSON, before any schema. */
|
|
11
|
+
export declare function readJson(c: {
|
|
12
|
+
readonly req: {
|
|
13
|
+
readonly raw: Request;
|
|
14
|
+
};
|
|
15
|
+
readonly env: {
|
|
16
|
+
readonly tenant: TenantContext;
|
|
17
|
+
};
|
|
18
|
+
}, kind?: BodyKind): Promise<unknown>;
|
package/dist/api/http/body.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Request bodies of Tenant routes, read as the router they replace read them
|
|
3
|
-
* (`tenant/http.ts`): at most
|
|
4
|
-
*
|
|
3
|
+
* (`tenant/http.ts`): at most the Tenant's Runtime limit `requestBodyBytes`, or for an endpoint
|
|
4
|
+
* that takes files inline `inlineBodyBytes` of its limits (one file at `inlineFileBytes` in
|
|
5
|
+
* base64, and the rest), UTF-8, and a missing or malformed JSON body is `400 Invalid JSON`. The
|
|
6
|
+
* limits are read for each request.
|
|
5
7
|
*/
|
|
8
|
+
import { inlineBodyBytes } from "@nylorun/core/contracts";
|
|
6
9
|
import { fail } from "../../tenant/http.js";
|
|
7
|
-
|
|
10
|
+
import { readRuntimeLimits } from "../../tenant/runtime-limits.js";
|
|
11
|
+
/** The most bytes the Tenant's route reads of a body of `kind`. */
|
|
12
|
+
export async function bodyLimit(tenant, kind = "json") {
|
|
13
|
+
const limits = await tenant.store.tx((t) => readRuntimeLimits(t));
|
|
14
|
+
return kind === "inline" ? inlineBodyBytes(limits) : limits.requestBodyBytes;
|
|
15
|
+
}
|
|
8
16
|
/** The body as text; past `maxBytes`, `413 Request too large`. */
|
|
9
|
-
export async function readText(request, maxBytes
|
|
17
|
+
export async function readText(request, maxBytes) {
|
|
10
18
|
if (request.body === null)
|
|
11
19
|
return "";
|
|
12
20
|
const chunks = [];
|
|
@@ -25,9 +33,29 @@ export async function readText(request, maxBytes = MAX_BODY_BYTES) {
|
|
|
25
33
|
}
|
|
26
34
|
return Buffer.concat(chunks).toString("utf8");
|
|
27
35
|
}
|
|
28
|
-
/** The body
|
|
29
|
-
export async function
|
|
30
|
-
|
|
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
|
+
}
|
|
56
|
+
/** The body of a Tenant route's request as JSON, before any schema. */
|
|
57
|
+
export async function readJson(c, kind = "json") {
|
|
58
|
+
const text = await readText(c.req.raw, await bodyLimit(c.env.tenant, kind));
|
|
31
59
|
try {
|
|
32
60
|
return JSON.parse(text);
|
|
33
61
|
}
|
package/dist/api/http/respond.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* (`routes.ts`) both answer through here, so a route answers the same wherever it runs.
|
|
5
5
|
*/
|
|
6
6
|
import { SandboxRouteError } from "../../core/sandbox-routes.js";
|
|
7
|
+
import { RecordEntryTooLargeError } from "../../record/index.js";
|
|
7
8
|
import { HttpError, OpaqueAuthError } from "../../tenant/http.js";
|
|
8
9
|
import { VaultError } from "../../vault/error.js";
|
|
9
10
|
/** A JSON answer. CORS headers a browser needs are already on the Node response. */
|
|
@@ -24,13 +25,16 @@ export function rejectionOf(error) {
|
|
|
24
25
|
return { status: error.status, body: error.body, headers: {} };
|
|
25
26
|
const status = error instanceof HttpError ||
|
|
26
27
|
error instanceof VaultError ||
|
|
27
|
-
error instanceof SandboxRouteError
|
|
28
|
+
error instanceof SandboxRouteError ||
|
|
29
|
+
error instanceof RecordEntryTooLargeError
|
|
28
30
|
? error.status
|
|
29
31
|
: error?.name === "ZodError" ||
|
|
30
32
|
error?.message === "Invalid cursor"
|
|
31
33
|
? 400
|
|
32
34
|
: 500;
|
|
33
|
-
const rejection = error instanceof HttpError || error instanceof VaultError
|
|
35
|
+
const rejection = error instanceof HttpError || error instanceof VaultError || error instanceof RecordEntryTooLargeError
|
|
36
|
+
? error.rejection
|
|
37
|
+
: {};
|
|
34
38
|
return {
|
|
35
39
|
status,
|
|
36
40
|
body: {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { RevokeSigningKeyRequestSchema, RotateSigningKeysRequestSchema,
|
|
2
|
+
import { RevokeSigningKeyRequestSchema, RotateSigningKeysRequestSchema, } from "@nylorun/core/contracts";
|
|
3
3
|
import { Jwks, RevokeSigningKeyRequest, RotateSigningKeysRequest, SigningKeyList, SigningKeyView, } from "../../components.js";
|
|
4
4
|
import { publicJwk, signingKeyView } from "../../../tenant/signing-keys.js";
|
|
5
5
|
import { readJson } from "../body.js";
|
|
6
6
|
import { tenantRoute } from "../define.js";
|
|
7
7
|
import { jsonResponse } from "../respond.js";
|
|
8
|
+
import { hostTuning } from "../../../tuning.js";
|
|
8
9
|
/** The Management API's signing-key routes: a management key. */
|
|
9
10
|
const MANAGEMENT = { credentials: ["management"], scopes: "never" };
|
|
10
11
|
const json = (schema, description) => ({
|
|
@@ -74,10 +75,10 @@ function signingKeyRoutesAt(api, base, access) {
|
|
|
74
75
|
},
|
|
75
76
|
}, async (c) => {
|
|
76
77
|
const ctx = c.env.tenant;
|
|
77
|
-
const request = RotateSigningKeysRequestSchema.parse(await readJson(c
|
|
78
|
+
const request = RotateSigningKeysRequestSchema.parse(await readJson(c));
|
|
78
79
|
// The longest any token the Runtime signs lives (capability links, run tokens).
|
|
79
80
|
const keys = await ctx.keys.rotateSigningKeys({
|
|
80
|
-
maxTtlSeconds:
|
|
81
|
+
maxTtlSeconds: hostTuning().keys.tokenTtlMaxSeconds,
|
|
81
82
|
force: request.force === true,
|
|
82
83
|
});
|
|
83
84
|
ctx.config.logger.info("signing keys rotated", { force: request.force === true });
|
|
@@ -95,7 +96,7 @@ function signingKeyRoutesAt(api, base, access) {
|
|
|
95
96
|
},
|
|
96
97
|
}, async (c) => {
|
|
97
98
|
const ctx = c.env.tenant;
|
|
98
|
-
RevokeSigningKeyRequestSchema.parse(await readJson(c
|
|
99
|
+
RevokeSigningKeyRequestSchema.parse(await readJson(c));
|
|
99
100
|
const row = await ctx.store.tx((t) => ctx.signingKeys.revoke(t, c.req.param("kid")));
|
|
100
101
|
ctx.config.logger.info("signing key revoked", { kid: row.id });
|
|
101
102
|
return jsonResponse(200, signingKeyView(row));
|
|
@@ -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;
|