@nylorun/runtime 0.23.0-beta → 0.24.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 +148 -0
- package/README.md +79 -28
- package/dist/adapters/execution/restate.js +1 -1
- package/dist/adapters/replication/pgoutput.d.ts +2 -0
- package/dist/adapters/replication/pgoutput.js +6 -3
- package/dist/adapters/sandbox/local.d.ts +9 -1
- package/dist/adapters/sandbox/local.js +16 -4
- package/dist/adapters/sandbox/virtual.js +4 -1
- package/dist/api/a2a/endpoint.js +5 -1
- package/dist/api/a2a/routes.d.ts +2 -0
- package/dist/api/a2a/routes.js +2 -2
- package/dist/api/a2a/tasks.js +2 -1
- package/dist/api/ag-ui/endpoint.js +4 -2
- package/dist/api/ag-ui/history.js +4 -1
- package/dist/api/ag-ui/routes.d.ts +4 -1
- package/dist/api/ag-ui/routes.js +11 -10
- package/dist/api/ag-ui/translate.js +3 -2
- package/dist/api/components.d.ts +4953 -1204
- package/dist/api/components.js +25 -16
- package/dist/api/gate/keys.js +7 -1
- package/dist/api/gate/routes.d.ts +6 -0
- package/dist/api/gate/routes.js +39 -3
- package/dist/api/http/app.js +4 -4
- package/dist/api/http/define.d.ts +6 -0
- package/dist/api/http/define.js +13 -1
- package/dist/api/http/respond.js +1 -1
- package/dist/api/http/routes/artifacts.js +35 -8
- package/dist/api/http/routes/coverage.d.ts +9 -0
- package/dist/api/http/routes/coverage.js +34 -0
- package/dist/api/http/routes/environments.d.ts +11 -0
- package/dist/api/http/routes/environments.js +283 -0
- package/dist/api/http/routes/mcp.d.ts +1 -1
- package/dist/api/http/routes/mcp.js +2 -2
- package/dist/api/http/routes/me.js +1 -1
- package/dist/api/http/routes/reads.d.ts +45 -9
- package/dist/api/http/routes/reads.js +54 -5
- package/dist/api/http/routes/sessions.js +11 -6
- package/dist/api/http/routes/tenant.js +32 -10
- package/dist/api/openapi.js +31 -26
- package/dist/artifacts/disk.d.ts +59 -0
- package/dist/artifacts/disk.js +563 -0
- package/dist/artifacts/export.d.ts +1 -1
- package/dist/artifacts/export.js +2 -3
- package/dist/artifacts/folders.d.ts +6 -3
- package/dist/artifacts/folders.js +17 -12
- package/dist/artifacts/service.d.ts +2 -1
- package/dist/artifacts/service.js +6 -1
- package/dist/artifacts/workspace.d.ts +1 -1
- package/dist/artifacts/workspace.js +1 -1
- package/dist/core/flow-host.d.ts +2 -3
- package/dist/core/flow-host.js +3 -0
- package/dist/core/provider.d.ts +3 -2
- package/dist/core/provider.js +5 -37
- package/dist/core/sandbox-routes.d.ts +2 -21
- package/dist/core/sandbox-routes.js +10 -43
- package/dist/execution/types.d.ts +1 -1
- package/dist/gates/contract.d.ts +3 -24
- package/dist/gates/contract.js +1 -36
- package/dist/gates/egress-credentials.d.ts +9 -0
- package/dist/gates/egress-credentials.js +11 -4
- package/dist/gates/egress.d.ts +28 -1
- package/dist/gates/egress.js +115 -10
- package/dist/gates/fixture-model.d.ts +28 -0
- package/dist/gates/fixture-model.js +92 -0
- package/dist/gates/handler.js +4 -4
- package/dist/gates/http-tool.d.ts +6 -2
- package/dist/gates/http-tool.js +3 -5
- package/dist/gates/in-process.d.ts +5 -0
- package/dist/gates/in-process.js +12 -1
- package/dist/gates/journal.d.ts +30 -0
- package/dist/gates/journal.js +52 -0
- package/dist/gates/mcp-handler.d.ts +4 -0
- package/dist/gates/mcp-handler.js +5 -1
- package/dist/gates/meter.d.ts +10 -2
- package/dist/gates/meter.js +20 -5
- package/dist/gates/policy.d.ts +49 -0
- package/dist/gates/policy.js +134 -0
- package/dist/gates/tenant-vaults.d.ts +7 -7
- package/dist/gates/tenant-vaults.js +5 -5
- package/dist/gates/tool-calls.d.ts +10 -5
- package/dist/gates/tool-calls.js +28 -10
- package/dist/gates/tool-client.d.ts +8 -0
- package/dist/gates/tool-client.js +27 -11
- package/dist/gates/tool-contract.d.ts +10 -68
- package/dist/gates/tool-contract.js +1 -85
- package/dist/gates/tool-gate.d.ts +1 -1
- package/dist/harness/calls.d.ts +12 -5
- package/dist/harness/calls.js +21 -12
- package/dist/harness/executors.js +12 -9
- package/dist/harness/main.js +18 -5
- package/dist/harness/pod.d.ts +34 -0
- package/dist/harness/pod.js +41 -0
- package/dist/harness/service.d.ts +0 -1
- package/dist/harness/service.js +13 -5
- package/dist/harness/setup.d.ts +27 -0
- package/dist/harness/setup.js +150 -0
- package/dist/harness/ws-client.js +3 -2
- package/dist/harness/ws-port.d.ts +1 -5
- package/dist/harness/ws-port.js +1 -5
- package/dist/harness-api/in-process.js +3 -3
- package/dist/harness-api/record.d.ts +15 -1
- package/dist/harness-api/record.js +174 -44
- package/dist/harness-api/redact.d.ts +3 -0
- package/dist/harness-api/redact.js +45 -0
- package/dist/harness-api/server.d.ts +8 -0
- package/dist/harness-api/server.js +93 -13
- package/dist/harness-api/start.d.ts +10 -3
- package/dist/harness-api/start.js +40 -10
- package/dist/harness-api/tool-journal.d.ts +96 -0
- package/dist/harness-api/tool-journal.js +102 -0
- package/dist/harness-api/tool-status.d.ts +13 -0
- package/dist/harness-api/tool-status.js +26 -0
- package/dist/harness-api/workspace.d.ts +6 -3
- package/dist/harness-api/workspace.js +27 -11
- package/dist/harness-api/ws-server.d.ts +11 -3
- package/dist/harness-api/ws-server.js +94 -15
- package/dist/host/gates.d.ts +2 -1
- package/dist/host/gates.js +10 -2
- package/dist/host/main.js +54 -5
- package/dist/host/operate.js +67 -5
- package/dist/host/stack-config.d.ts +64 -0
- package/dist/host/stack-config.js +61 -1
- package/dist/keys/client.js +4 -1
- package/dist/keys/keys.d.ts +5 -5
- package/dist/keys/keys.js +5 -7
- package/dist/management-openapi.json +999 -2211
- package/dist/mcp/connect.d.ts +25 -20
- package/dist/mcp/connect.js +29 -30
- package/dist/mcp/pool.d.ts +2 -2
- package/dist/mcp/pool.js +1 -1
- package/dist/mcp/preview.d.ts +3 -3
- package/dist/mcp/preview.js +10 -20
- package/dist/mcp/snapshot.d.ts +5 -11
- package/dist/mcp/snapshot.js +6 -7
- package/dist/model/pi-model.js +8 -0
- package/dist/openapi.json +6955 -2526
- package/dist/reads/types.d.ts +16 -3
- package/dist/record/append.d.ts +3 -1
- package/dist/record/append.js +1 -0
- package/dist/record/envelope.d.ts +5 -1
- package/dist/record/envelope.js +7 -3
- package/dist/record/environment.d.ts +25 -0
- package/dist/record/environment.js +44 -0
- package/dist/record/index.d.ts +1 -1
- package/dist/record/index.js +1 -1
- package/dist/sandbox/disk-fs.d.ts +95 -0
- package/dist/sandbox/disk-fs.js +206 -0
- package/dist/sandbox/join.d.ts +17 -18
- package/dist/sandbox/join.js +42 -15
- package/dist/sandbox/manager.d.ts +16 -8
- package/dist/sandbox/manager.js +33 -17
- package/dist/sandbox/placement.d.ts +13 -12
- package/dist/sandbox/placement.js +29 -12
- package/dist/sandbox/pods/client.d.ts +6 -1
- package/dist/sandbox/pods/lifecycle.d.ts +28 -27
- package/dist/sandbox/pods/lifecycle.js +14 -26
- package/dist/sandbox/pods/reconcile.js +18 -12
- package/dist/sandbox/pods/spec.d.ts +15 -13
- package/dist/sandbox/pods/spec.js +16 -20
- package/dist/sandbox/records.d.ts +2 -2
- package/dist/sandbox/records.js +3 -3
- package/dist/sandbox/resolve.d.ts +35 -27
- package/dist/sandbox/resolve.js +66 -41
- package/dist/sandbox/session-sandbox.js +1 -1
- package/dist/sandbox/setup.d.ts +61 -0
- package/dist/sandbox/setup.js +123 -0
- package/dist/sandbox/share.d.ts +11 -21
- package/dist/sandbox/share.js +12 -41
- package/dist/sandbox/tenant-config.d.ts +12 -14
- package/dist/sandbox/tenant-config.js +12 -17
- package/dist/sandbox/types.d.ts +6 -0
- package/dist/store/postgres/drizzle/0020_environments.sql +63 -0
- package/dist/store/postgres/drizzle/0021_disk_versions.sql +7 -0
- package/dist/store/postgres/drizzle/0022_model_usage_timing.sql +5 -0
- package/dist/store/postgres/drizzle/0023_artifact_pages.sql +1 -0
- package/dist/store/postgres/drizzle/meta/_journal.json +28 -0
- package/dist/store/postgres/reads.js +117 -17
- package/dist/store/postgres/record-writer.d.ts +4 -4
- package/dist/store/postgres/record-writer.js +9 -9
- package/dist/store/postgres/record.d.ts +7 -0
- package/dist/store/postgres/record.js +23 -2
- package/dist/store/postgres/schema.d.ts +934 -761
- package/dist/store/postgres/schema.js +102 -73
- package/dist/store/postgres/store.js +119 -66
- package/dist/store/types.d.ts +109 -48
- package/dist/tenant/advance.d.ts +7 -6
- package/dist/tenant/advance.js +115 -42
- package/dist/tenant/artifact-tool.js +3 -4
- package/dist/tenant/commands.d.ts +15 -2
- package/dist/tenant/commands.js +93 -12
- package/dist/tenant/context.d.ts +48 -22
- package/dist/tenant/context.js +4 -15
- package/dist/tenant/effects.d.ts +1 -1
- package/dist/tenant/effects.js +37 -20
- package/dist/tenant/environments.d.ts +167 -0
- package/dist/tenant/environments.js +823 -0
- package/dist/tenant/harness-tokens.d.ts +21 -0
- package/dist/tenant/harness-tokens.js +61 -0
- package/dist/tenant/host-token.d.ts +1 -1
- package/dist/tenant/host-token.js +2 -4
- package/dist/tenant/identity-file.d.ts +4 -4
- package/dist/tenant/identity-file.js +17 -8
- package/dist/tenant/issuers.js +3 -3
- package/dist/tenant/principals.js +1 -1
- package/dist/tenant/reset.js +3 -3
- package/dist/tenant/runtime.d.ts +6 -1
- package/dist/tenant/runtime.js +7 -1
- package/dist/tenant/session.d.ts +3 -3
- package/dist/tenant/session.js +0 -14
- package/dist/tenant/sessions.d.ts +13 -13
- package/dist/tenant/sessions.js +61 -138
- package/dist/tenant/signing-keys.d.ts +5 -1
- package/dist/tenant/status.js +3 -3
- package/dist/tenant/sweep.js +12 -6
- package/dist/tenant/transcript.d.ts +210 -20
- package/dist/tenant/transcript.js +62 -11
- package/dist/tenant/turn-timing.d.ts +43 -0
- package/dist/tenant/turn-timing.js +39 -0
- package/dist/tenant/types.d.ts +2 -0
- package/dist/traces/ids.d.ts +42 -0
- package/dist/traces/ids.js +85 -0
- package/dist/traces/key.d.ts +6 -0
- package/dist/traces/key.js +37 -0
- package/dist/traces/map.d.ts +113 -0
- package/dist/traces/map.js +317 -0
- package/dist/traces/options.d.ts +7 -0
- package/dist/traces/options.js +1 -0
- package/dist/traces/otlp.d.ts +42 -0
- package/dist/traces/otlp.js +84 -0
- package/dist/traces/projector.d.ts +58 -0
- package/dist/traces/projector.js +200 -0
- package/dist/traces/read.d.ts +23 -0
- package/dist/traces/read.js +16 -0
- package/dist/vault/coverage.d.ts +26 -0
- package/dist/vault/coverage.js +64 -0
- package/dist/vault/error.d.ts +11 -1
- package/dist/vault/error.js +5 -1
- package/dist/vault/service.d.ts +47 -48
- package/dist/vault/service.js +321 -382
- package/dist/vault/sources.d.ts +5 -16
- package/dist/vault/sources.js +6 -8
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/package.json +13 -13
- package/dist/api/http/routes/sandboxes.d.ts +0 -9
- package/dist/api/http/routes/sandboxes.js +0 -153
- package/dist/api/http/routes/vaults.d.ts +0 -10
- package/dist/api/http/routes/vaults.js +0 -139
- package/dist/record/sandbox.d.ts +0 -25
- package/dist/record/sandbox.js +0 -43
- package/dist/tenant/sandboxes.d.ts +0 -123
- package/dist/tenant/sandboxes.js +0 -566
package/dist/api/components.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* global registry.
|
|
6
6
|
*/
|
|
7
7
|
import { z } from "zod";
|
|
8
|
-
import { SessionListItemSchema, ModelCallSchema, SessionPageSchema, SessionManifestViewSchema, HistoryPageSchema, SessionUsageTotalsSchema, ModelCallsPageSchema, ModelCallExportPageSchema,
|
|
8
|
+
import { SessionListItemSchema, ModelCallSchema, SessionPageSchema, SessionManifestViewSchema, HistoryPageSchema, SessionUsageTotalsSchema, ModelCallsPageSchema, ModelCallExportPageSchema, EnvironmentPageSchema, ToolCallSchema, ToolCallsPageSchema, TurnTraceSchema, JwksSchema, SigningKeyListSchema, SigningKeyViewSchema, RotateSigningKeysRequestSchema, RevokeSigningKeyRequestSchema, MeResponseSchema, TenantStatusSchema, ResetTenantRequestSchema, ResetTenantResponseSchema, SeedTenantConfigRequestSchema, SeedTenantConfigResponseSchema, HostModelCatalogSchema, TenantSandboxViewSchema, ModelUsageTotalsSchema, ModelBudgetsSchema, PutModelBudgetsRequestSchema, ToolPolicySchema, PutToolPolicyRequestSchema, PutTenantEnvironmentsRequestSchema, ListProvidersResponseSchema, HostModelViewSchema, PutHostModelRequestSchema, SelectHostModelRequestSchema, PutEnvironmentSecretRequestSchema, EnvironmentSecretViewSchema, ListEnvironmentSecretsResponseSchema, McpPreviewRequestSchema, McpPreviewSchema, CredentialCoverageRequestSchema, CredentialCoverageSchema, DeletedResponseSchema, ListAgentsResponseSchema, ListPublicAgentsResponseSchema, ListSessionsResponseSchema, LiveEventSchema, PutAgentRequestSchema, PutAgentResponseSchema, PutSessionRequestSchema, SessionItemsResponseSchema, SessionViewSchema, StreamClosedFrameSchema, AcceptedResponseSchema, SandboxToolOutcomeSchema, PutEnvironmentRequestSchema, EnvironmentViewSchema, EnvironmentSnapshotSchema, RestoreEnvironmentRequestSchema, EnvironmentRestoreSchema, EnvironmentVersionsSchema, ListEnvironmentsResponseSchema, DeleteEnvironmentResponseSchema, ListEnvironmentEventsResponseSchema, ArtifactViewSchema, ArtifactListItemSchema, ArtifactPageSchema, ArtifactVersionViewSchema, ListArtifactsResponseSchema, UploadArtifactResponseSchema, DefinitionFileViewSchema, DeleteArtifactResponseSchema, CreateArtifactLinkRequestSchema, ArtifactLinkSchema, PutTenantArtifactsRequestSchema, TenantArtifactsViewSchema, 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,13 +16,19 @@ 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
|
|
21
|
-
export const
|
|
22
|
-
export const
|
|
23
|
-
export const
|
|
19
|
+
export const PutEnvironmentRequest = named("PutEnvironmentRequest", PutEnvironmentRequestSchema);
|
|
20
|
+
export const EnvironmentView = named("EnvironmentView", EnvironmentViewSchema);
|
|
21
|
+
export const EnvironmentSnapshot = named("EnvironmentSnapshot", EnvironmentSnapshotSchema);
|
|
22
|
+
export const RestoreEnvironmentRequest = named("RestoreEnvironmentRequest", RestoreEnvironmentRequestSchema);
|
|
23
|
+
export const EnvironmentRestore = named("EnvironmentRestore", EnvironmentRestoreSchema);
|
|
24
|
+
export const EnvironmentVersions = named("EnvironmentVersions", EnvironmentVersionsSchema);
|
|
25
|
+
export const ListEnvironmentsResponse = named("ListEnvironmentsResponse", ListEnvironmentsResponseSchema);
|
|
26
|
+
export const DeleteEnvironmentResponse = named("DeleteEnvironmentResponse", DeleteEnvironmentResponseSchema);
|
|
27
|
+
export const ListEnvironmentEventsResponse = named("ListEnvironmentEventsResponse", ListEnvironmentEventsResponseSchema);
|
|
24
28
|
export const ArtifactVersionView = named("ArtifactVersionView", ArtifactVersionViewSchema);
|
|
25
29
|
export const ArtifactView = named("ArtifactView", ArtifactViewSchema);
|
|
30
|
+
export const ArtifactListItem = named("ArtifactListItem", ArtifactListItemSchema);
|
|
31
|
+
export const ArtifactPage = named("ArtifactPage", ArtifactPageSchema.extend({ artifacts: z.array(ArtifactListItem) }));
|
|
26
32
|
export const ListArtifactsResponse = named("ListArtifactsResponse", ListArtifactsResponseSchema);
|
|
27
33
|
export const UploadArtifactResponse = named("UploadArtifactResponse", UploadArtifactResponseSchema);
|
|
28
34
|
export const DefinitionFileView = named("DefinitionFileView", DefinitionFileViewSchema);
|
|
@@ -43,7 +49,7 @@ export const ListSessionsResponse = named("ListSessionsResponse", ListSessionsRe
|
|
|
43
49
|
export const PutSessionRequest = named("PutSessionRequest", PutSessionRequestSchema);
|
|
44
50
|
export const SessionView = named("SessionView", SessionViewSchema);
|
|
45
51
|
export const LiveEvent = named("LiveEvent", LiveEventSchema);
|
|
46
|
-
/** `
|
|
52
|
+
/** `environment.state` → `EnvironmentStateEvent`. */
|
|
47
53
|
export function eventComponentName(type) {
|
|
48
54
|
return `${type
|
|
49
55
|
.split(/[._]/)
|
|
@@ -64,21 +70,21 @@ export const TenantSandboxView = named("TenantSandboxView", TenantSandboxViewSch
|
|
|
64
70
|
export const ModelUsageTotals = named("ModelUsageTotals", ModelUsageTotalsSchema);
|
|
65
71
|
export const ModelBudgets = named("ModelBudgets", ModelBudgetsSchema);
|
|
66
72
|
export const PutModelBudgetsRequest = named("PutModelBudgetsRequest", PutModelBudgetsRequestSchema);
|
|
67
|
-
export const
|
|
73
|
+
export const ToolPolicy = named("ToolPolicy", ToolPolicySchema);
|
|
74
|
+
export const PutToolPolicyRequest = named("PutToolPolicyRequest", PutToolPolicyRequestSchema);
|
|
75
|
+
export const PutTenantEnvironmentsRequest = named("PutTenantEnvironmentsRequest", PutTenantEnvironmentsRequestSchema);
|
|
68
76
|
export const ListProvidersResponse = named("ListProvidersResponse", ListProvidersResponseSchema);
|
|
69
77
|
export const HostModelView = named("HostModelView", HostModelViewSchema);
|
|
70
78
|
export const PutHostModelRequest = named("PutHostModelRequest", PutHostModelRequestSchema);
|
|
71
79
|
export const SelectHostModelRequest = named("SelectHostModelRequest", SelectHostModelRequestSchema);
|
|
72
|
-
export const
|
|
73
|
-
export const
|
|
74
|
-
export const
|
|
75
|
-
export const CreateCredentialRequest = named("CreateCredentialRequest", CreateCredentialRequestSchema);
|
|
76
|
-
export const CredentialInfo = named("CredentialInfo", CredentialInfoSchema);
|
|
77
|
-
export const ListCredentialsResponse = named("ListCredentialsResponse", ListCredentialsResponseSchema);
|
|
78
|
-
export const RotateCredentialRequest = named("RotateCredentialRequest", RotateCredentialRequestSchema);
|
|
80
|
+
export const PutEnvironmentSecretRequest = named("PutEnvironmentSecretRequest", PutEnvironmentSecretRequestSchema);
|
|
81
|
+
export const EnvironmentSecretView = named("EnvironmentSecretView", EnvironmentSecretViewSchema);
|
|
82
|
+
export const ListEnvironmentSecretsResponse = named("ListEnvironmentSecretsResponse", ListEnvironmentSecretsResponseSchema);
|
|
79
83
|
export const DeletedResponse = named("DeletedResponse", DeletedResponseSchema);
|
|
80
84
|
export const McpPreviewRequest = named("McpPreviewRequest", McpPreviewRequestSchema);
|
|
81
85
|
export const McpPreview = named("McpPreview", McpPreviewSchema);
|
|
86
|
+
export const CredentialCoverageRequest = named("CredentialCoverageRequest", CredentialCoverageRequestSchema);
|
|
87
|
+
export const CredentialCoverage = named("CredentialCoverage", CredentialCoverageSchema);
|
|
82
88
|
export const Jwks = named("Jwks", JwksSchema);
|
|
83
89
|
export const SigningKeyList = named("SigningKeyList", SigningKeyListSchema);
|
|
84
90
|
export const SigningKeyView = named("SigningKeyView", SigningKeyViewSchema);
|
|
@@ -92,5 +98,8 @@ export const HistoryPage = named("HistoryPage", HistoryPageSchema.extend({ items
|
|
|
92
98
|
export const SessionUsageTotals = named("SessionUsageTotals", SessionUsageTotalsSchema);
|
|
93
99
|
export const ModelCallsPage = named("ModelCallsPage", ModelCallsPageSchema.extend({ calls: z.array(ModelCall) }));
|
|
94
100
|
export const ModelCallExportPage = named("ModelCallExportPage", ModelCallExportPageSchema.extend({ calls: z.array(ModelCall) }));
|
|
95
|
-
export const
|
|
101
|
+
export const EnvironmentPage = named("EnvironmentPage", EnvironmentPageSchema.extend({ environments: z.array(EnvironmentView) }));
|
|
102
|
+
export const ToolCall = named("ToolCall", ToolCallSchema);
|
|
103
|
+
export const ToolCallsPage = named("ToolCallsPage", ToolCallsPageSchema.extend({ calls: z.array(ToolCall) }));
|
|
104
|
+
export const TurnTrace = named("TurnTrace", TurnTraceSchema);
|
|
96
105
|
export const MeResponse = named("MeResponse", MeResponseSchema);
|
package/dist/api/gate/keys.js
CHANGED
|
@@ -40,7 +40,13 @@ export function mountKeysRoutes(app, options) {
|
|
|
40
40
|
}
|
|
41
41
|
function errorOf(error) {
|
|
42
42
|
if (error instanceof VaultError)
|
|
43
|
-
return {
|
|
43
|
+
return {
|
|
44
|
+
kind: "vault",
|
|
45
|
+
status: error.status,
|
|
46
|
+
message: error.message,
|
|
47
|
+
...(error.rejection.code === undefined ? {} : { code: error.rejection.code }),
|
|
48
|
+
...(error.rejection.details === undefined ? {} : { details: error.rejection.details }),
|
|
49
|
+
};
|
|
44
50
|
if (error instanceof HttpError)
|
|
45
51
|
return {
|
|
46
52
|
kind: "http",
|
|
@@ -3,6 +3,7 @@ import type { ModelCallHandler } from "../../gates/handler.js";
|
|
|
3
3
|
import { type InflightCalls } from "../../gates/inflight.js";
|
|
4
4
|
import type { McpHandler } from "../../gates/mcp-handler.js";
|
|
5
5
|
import type { ToolCalls } from "../../gates/tool-calls.js";
|
|
6
|
+
import type { JournalCheck } from "../../gates/journal.js";
|
|
6
7
|
import type { HttpOutcome, HttpToolCall } from "../../gates/http-tool.js";
|
|
7
8
|
import type { Keys } from "../../keys/keys.js";
|
|
8
9
|
import type { Logger } from "../../tenant/types.js";
|
|
@@ -34,6 +35,11 @@ export interface GatesAppOptions {
|
|
|
34
35
|
};
|
|
35
36
|
/** Keyed MCP and HTTP tool calls, which outlive their client and run once (F4.1 G3). */
|
|
36
37
|
readonly toolCalls?: ToolCalls;
|
|
38
|
+
/**
|
|
39
|
+
* The journal check (R5.6): a run's tool call must be keyed, and journaled as sent. Without
|
|
40
|
+
* it the gate sends what it is asked to.
|
|
41
|
+
*/
|
|
42
|
+
readonly journal?: JournalCheck;
|
|
37
43
|
/** The keys service's operations (F4.2). Without it the keys route answers 404. */
|
|
38
44
|
readonly keys?: () => Promise<Keys>;
|
|
39
45
|
/** Logs the keys service's requests and refused credentials. */
|
package/dist/api/gate/routes.js
CHANGED
|
@@ -146,6 +146,24 @@ export function createGatesApp(options) {
|
|
|
146
146
|
const claims = c.get("run");
|
|
147
147
|
return claims ? { sessionId: claims.sessionId, epoch: claims.epoch } : undefined;
|
|
148
148
|
};
|
|
149
|
+
/**
|
|
150
|
+
* Under a run token, the 400 or 409 for a tool call the effect journal does not hold, running,
|
|
151
|
+
* as sent (R5.6); else the call's span context from its row (R7.4), none under core's credential.
|
|
152
|
+
*/
|
|
153
|
+
const unjournaled = async (c, tenantId, key, call) => {
|
|
154
|
+
const claims = c.get("run");
|
|
155
|
+
if (!claims || !options.journal)
|
|
156
|
+
return {};
|
|
157
|
+
if (!key)
|
|
158
|
+
return {
|
|
159
|
+
refused: c.json(gateError("key_required", "A run's tool call needs its effect id as its Idempotency-Key"), 400),
|
|
160
|
+
};
|
|
161
|
+
const answer = await options.journal.check(tenantId, claims, key, call);
|
|
162
|
+
if (answer.refused === undefined)
|
|
163
|
+
return answer.traceparent ? { traceparent: answer.traceparent } : {};
|
|
164
|
+
logger.warn("gate_call_unjournaled", { route: c.req.path, session: claims.sessionId, effect: key, reason: answer.refused });
|
|
165
|
+
return { refused: c.json(gateError("effect_not_journaled", answer.refused), 409) };
|
|
166
|
+
};
|
|
149
167
|
/** 409 for a keyed re-send the in-flight map refused, or undefined. */
|
|
150
168
|
const refusedJoin = (c, error) => {
|
|
151
169
|
if (error instanceof InflightStale)
|
|
@@ -203,12 +221,21 @@ export function createGatesApp(options) {
|
|
|
203
221
|
const body = { ...request.body, server: server.server };
|
|
204
222
|
const signal = c.req.raw.signal;
|
|
205
223
|
const key = c.req.header("idempotency-key");
|
|
224
|
+
const journaled = await unjournaled(c, request.tenantId, key, {
|
|
225
|
+
kind: "mcp",
|
|
226
|
+
server: body.server,
|
|
227
|
+
name: body.name,
|
|
228
|
+
arguments: body.arguments,
|
|
229
|
+
});
|
|
230
|
+
if (journaled.refused)
|
|
231
|
+
return journaled.refused;
|
|
232
|
+
const traced = journaled.traceparent ? { traceparent: journaled.traceparent } : {};
|
|
206
233
|
try {
|
|
207
234
|
// Keyed: the call runs under its own signal, once, and outlives this request (G3). The
|
|
208
235
|
// hash covers the session, so a re-send joins only its own session's call.
|
|
209
236
|
const answer = key && toolCalls
|
|
210
|
-
? await untilAborted(toolCalls.run(request.tenantId, key, createHash("sha256").update(canonical(body)).digest("hex"), (own) => mcp.call(request.tenantId, body, own), ownerOf(c)), signal)
|
|
211
|
-
: await mcp.call(request.tenantId, body, signal);
|
|
237
|
+
? await untilAborted(toolCalls.run(request.tenantId, key, createHash("sha256").update(canonical(body)).digest("hex"), (own) => mcp.call(request.tenantId, { ...body, key, ...traced }, own), ownerOf(c)), signal)
|
|
238
|
+
: await mcp.call(request.tenantId, { ...body, ...traced }, signal);
|
|
212
239
|
if (signal.aborted)
|
|
213
240
|
return new Response(null, { status: 499 });
|
|
214
241
|
return c.json(answer);
|
|
@@ -233,13 +260,19 @@ export function createGatesApp(options) {
|
|
|
233
260
|
if (!tool.ok)
|
|
234
261
|
return tool.response;
|
|
235
262
|
// A run token's turn is the call's: it names the request's `Nylorun-Turn-Id`.
|
|
236
|
-
|
|
263
|
+
let call = {
|
|
237
264
|
...request.body,
|
|
238
265
|
tool: tool.ref,
|
|
239
266
|
turnId: c.get("run")?.turnId ?? request.body.turnId,
|
|
240
267
|
};
|
|
241
268
|
const signal = c.req.raw.signal;
|
|
242
269
|
const key = c.req.header("idempotency-key");
|
|
270
|
+
const journaled = await unjournaled(c, request.tenantId, key, { kind: "http", tool: call.tool, input: call.input });
|
|
271
|
+
if (journaled.refused)
|
|
272
|
+
return journaled.refused;
|
|
273
|
+
// The span context from the call's journal row (R7.4), never from the body.
|
|
274
|
+
if (journaled.traceparent)
|
|
275
|
+
call = { ...call, traceparent: journaled.traceparent };
|
|
243
276
|
try {
|
|
244
277
|
// Keyed: runs once under its own signal and outlives this request, as an MCP call.
|
|
245
278
|
const answer = key && toolCalls
|
|
@@ -334,6 +367,9 @@ export function createGatesApp(options) {
|
|
|
334
367
|
}
|
|
335
368
|
/** `promise`, or a rejection as soon as `signal` aborts (the call itself keeps running). */
|
|
336
369
|
function untilAborted(promise, signal) {
|
|
370
|
+
// Nobody may wait for it (the caller went away first); its rejection, a cancel or the gate's
|
|
371
|
+
// shutdown, is not an unhandled one.
|
|
372
|
+
promise.catch(() => { });
|
|
337
373
|
if (signal.aborted)
|
|
338
374
|
return Promise.reject(signal.reason);
|
|
339
375
|
return new Promise((resolve, reject) => {
|
package/dist/api/http/app.js
CHANGED
|
@@ -12,14 +12,14 @@ 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 {
|
|
15
|
+
import { environmentRoutes } from "./routes/environments.js";
|
|
16
16
|
import { artifactRoutes } from "./routes/artifacts.js";
|
|
17
17
|
import { readRoutes } from "./routes/reads.js";
|
|
18
18
|
import { sessionRoutes } from "./routes/sessions.js";
|
|
19
19
|
import { fileRoutes } from "./routes/files.js";
|
|
20
20
|
import { keyRoutes } from "./routes/keys.js";
|
|
21
21
|
import { tenantRoutes } from "./routes/tenant.js";
|
|
22
|
-
import {
|
|
22
|
+
import { coverageRoutes } from "./routes/coverage.js";
|
|
23
23
|
import { mcpRoutes } from "./routes/mcp.js";
|
|
24
24
|
let app;
|
|
25
25
|
/** The Tenant API, built on first use. */
|
|
@@ -44,11 +44,11 @@ function build() {
|
|
|
44
44
|
});
|
|
45
45
|
sessionRoutes(api);
|
|
46
46
|
fileRoutes(api);
|
|
47
|
-
|
|
47
|
+
environmentRoutes(api);
|
|
48
48
|
artifactRoutes(api);
|
|
49
49
|
tenantRoutes(api);
|
|
50
50
|
keyRoutes(api);
|
|
51
|
-
|
|
51
|
+
coverageRoutes(api);
|
|
52
52
|
mcpRoutes(api);
|
|
53
53
|
accessRoutes(api);
|
|
54
54
|
meRoutes(api);
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import type { IncomingMessage } from "node:http";
|
|
13
13
|
import type { OpenAPIHono, RouteConfig } from "@hono/zod-openapi";
|
|
14
14
|
import type { Context, Handler } from "hono";
|
|
15
|
+
import { z } from "zod";
|
|
15
16
|
import type { SubjectScope } from "@nylorun/core/contracts";
|
|
16
17
|
import { type KeyAccess } from "../../tenant/auth.js";
|
|
17
18
|
import type { AuthScope } from "../../tenant/context.js";
|
|
@@ -56,4 +57,9 @@ export declare function routeNotFound(c: Context<TenantEnv>): Promise<Response>;
|
|
|
56
57
|
export declare function keyAccess(access: RouteAccess): KeyAccess;
|
|
57
58
|
/** The declared route `method path` is, if any. `{param}` segments match any one segment. */
|
|
58
59
|
export declare function declaredRoute(method: string, segments: readonly string[]): RouteAccess | undefined;
|
|
60
|
+
/** W3C trace context a request may send (R7.4): the turn it starts joins the caller's trace. */
|
|
61
|
+
export declare const TraceHeaders: z.ZodObject<{
|
|
62
|
+
traceparent: z.ZodOptional<z.ZodString>;
|
|
63
|
+
tracestate: z.ZodOptional<z.ZodString>;
|
|
64
|
+
}, z.core.$strip>;
|
|
59
65
|
export declare function tenantRoute(api: OpenAPIHono<TenantEnv>, access: RouteAccess, route: RouteConfig, handler: Handler<TenantEnv>): void;
|
package/dist/api/http/define.js
CHANGED
|
@@ -71,6 +71,14 @@ function authenticated(access) {
|
|
|
71
71
|
await next();
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
|
+
/** W3C trace context a request may send (R7.4): the turn it starts joins the caller's trace. */
|
|
75
|
+
export const TraceHeaders = z.object({
|
|
76
|
+
traceparent: z
|
|
77
|
+
.string()
|
|
78
|
+
.optional()
|
|
79
|
+
.meta({ description: "W3C trace context: the turn this request starts joins the caller's trace (feature `traces`). A malformed value is ignored" }),
|
|
80
|
+
tracestate: z.string().optional().meta({ description: "W3C trace context, kept with `traceparent`" }),
|
|
81
|
+
});
|
|
74
82
|
export function tenantRoute(api, access, route, handler) {
|
|
75
83
|
const takes = (credential) => access.credentials.includes(credential);
|
|
76
84
|
const schemes = [...new Set(access.credentials.map((credential) => SCHEMES[credential]))];
|
|
@@ -97,7 +105,11 @@ export function tenantRoute(api, access, route, handler) {
|
|
|
97
105
|
...schemes.map((scheme) => ({ [scheme]: [] })),
|
|
98
106
|
...(access.anonymous ? [{}] : []),
|
|
99
107
|
],
|
|
100
|
-
|
|
108
|
+
// A route's own headers (`traceparent`, R7.4) beside the common ones.
|
|
109
|
+
request: {
|
|
110
|
+
...route.request,
|
|
111
|
+
headers: route.request?.headers instanceof z.ZodObject ? headers.extend(route.request.headers.shape) : headers,
|
|
112
|
+
},
|
|
101
113
|
responses: {
|
|
102
114
|
400: rejected("Invalid headers, path, body or cursor"),
|
|
103
115
|
401: rejected(takes("token")
|
package/dist/api/http/respond.js
CHANGED
|
@@ -30,7 +30,7 @@ export function rejectionOf(error) {
|
|
|
30
30
|
error?.message === "Invalid cursor"
|
|
31
31
|
? 400
|
|
32
32
|
: 500;
|
|
33
|
-
const rejection = error instanceof HttpError ? error.rejection : {};
|
|
33
|
+
const rejection = error instanceof HttpError || error instanceof VaultError ? error.rejection : {};
|
|
34
34
|
return {
|
|
35
35
|
status,
|
|
36
36
|
body: {
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { posix } from "node:path";
|
|
16
16
|
import { z } from "zod";
|
|
17
|
-
import { ArtifactLabelsSchema, CreateArtifactLinkRequestSchema, PutTenantArtifactsRequestSchema, } from "@nylorun/core/contracts";
|
|
18
|
-
import { ArtifactDiff, ArtifactTree, ArtifactLink, ArtifactView, CreateArtifactLinkRequest, DeleteArtifactResponse, ListArtifactsResponse, PutTenantArtifactsRequest, TenantArtifactsView, UploadArtifactResponse, } from "../../components.js";
|
|
17
|
+
import { ArtifactLabelsSchema, ArtifactKindSchema, CreateArtifactLinkRequestSchema, PutTenantArtifactsRequestSchema, } from "@nylorun/core/contracts";
|
|
18
|
+
import { ArtifactDiff, ArtifactTree, ArtifactLink, ArtifactView, ArtifactPage, CreateArtifactLinkRequest, DeleteArtifactResponse, ListArtifactsResponse, PutTenantArtifactsRequest, TenantArtifactsView, UploadArtifactResponse, } from "../../components.js";
|
|
19
19
|
import { BlobRangeError } from "../../../blob/index.js";
|
|
20
20
|
import { effectiveArtifactLimits, readArtifactsConfig, writeArtifactsConfig, } from "../../../artifacts/config.js";
|
|
21
21
|
import { contentKey, diffManifests, entryAt, readManifest } from "../../../artifacts/folders.js";
|
|
@@ -24,10 +24,12 @@ import { zipStream, zipTooLarge } from "../../../artifacts/zip.js";
|
|
|
24
24
|
import { normalizeContentType } from "../../../artifacts/media-types.js";
|
|
25
25
|
import { artifactContent, deleteArtifact, folderContent, getArtifact, listArtifacts, readableArtifact, uploadArtifact, versionOf, } from "../../../artifacts/service.js";
|
|
26
26
|
import { accessOf } from "../../../tenant/auth.js";
|
|
27
|
+
import { readAccess, readStoreOf } from "../../../reads/access.js";
|
|
27
28
|
import { fail } from "../../../tenant/http.js";
|
|
28
29
|
import { readJson } from "../body.js";
|
|
29
30
|
import { tenantRoute } from "../define.js";
|
|
30
31
|
import { jsonResponse } from "../respond.js";
|
|
32
|
+
import { pageQuery, parseQuery } from "./reads.js";
|
|
31
33
|
/** Reading and writing artifacts: whoever may use sessions, a person only in their own. */
|
|
32
34
|
const OWN = {
|
|
33
35
|
credentials: ["application", "subject", "token"],
|
|
@@ -78,6 +80,15 @@ const labelQuery = z
|
|
|
78
80
|
.union([z.string(), z.array(z.string())])
|
|
79
81
|
.optional()
|
|
80
82
|
.meta({ description: "`key=value`; repeat it for several labels" });
|
|
83
|
+
const artifactPageQuery = pageQuery
|
|
84
|
+
.extend({
|
|
85
|
+
sessionId: z.string().optional().meta({
|
|
86
|
+
description: "Only artifacts belonging to this session; excludes Tenant-owned artifacts",
|
|
87
|
+
}),
|
|
88
|
+
kind: ArtifactKindSchema.optional(),
|
|
89
|
+
label: labelQuery,
|
|
90
|
+
})
|
|
91
|
+
.strict();
|
|
81
92
|
/** `label=k=v`, repeated. */
|
|
82
93
|
function labelsOf(values) {
|
|
83
94
|
if (values === undefined || values.length === 0)
|
|
@@ -216,7 +227,9 @@ function zipResponse(ctx, artifact, version, manifest, request) {
|
|
|
216
227
|
const refused = zipTooLarge(manifest.entries.length, version.size);
|
|
217
228
|
if (refused)
|
|
218
229
|
fail(400, refused);
|
|
219
|
-
const iterator = zipStream(
|
|
230
|
+
const iterator = zipStream(
|
|
231
|
+
// A v2 manifest's links and empty directories are not files: the zip holds the files.
|
|
232
|
+
manifest.entries.filter((entry) => entry.type === undefined).map((entry) => ({
|
|
220
233
|
name: entry.path,
|
|
221
234
|
open: async () => {
|
|
222
235
|
const got = await ctx.blobs.get(contentKey(entry.sha256), { signal: request.signal });
|
|
@@ -311,13 +324,24 @@ export function artifactRoutes(api) {
|
|
|
311
324
|
path: "/v1/artifacts",
|
|
312
325
|
tags: ["Artifacts"],
|
|
313
326
|
summary: "List artifacts",
|
|
314
|
-
description: "
|
|
327
|
+
description: "Without limit, the existing metadata list, oldest first. Explicit limit (1–200) opts into metadata pages ordered by creation time and artifact ID descending, with an opaque nextCursor bound to the Tenant and filters. " +
|
|
328
|
+
"sessionId selects only that session's artifacts, excluding Tenant-owned artifacts. Paged reads support kind and repeated label=key=value equality filters. " +
|
|
329
|
+
"An application key as itself sees all artifacts, including Tenant-owned; a caller acting for a person sees only their sessions' artifacts of allowed agents. Authorization is checked on every page. " +
|
|
330
|
+
"Newer inserts appear on a fresh traversal, not in pages already passed.",
|
|
315
331
|
request: {
|
|
316
|
-
query:
|
|
332
|
+
query: artifactPageQuery,
|
|
333
|
+
},
|
|
334
|
+
responses: {
|
|
335
|
+
200: json(z.union([ListArtifactsResponse, ArtifactPage]), "The artifacts; explicit limit opts into pagination"),
|
|
317
336
|
},
|
|
318
|
-
responses: { 200: json(ListArtifactsResponse, "The artifacts") },
|
|
319
337
|
}, async (c) => {
|
|
320
338
|
const sessionId = c.req.query("sessionId");
|
|
339
|
+
if (c.req.query("limit") !== undefined) {
|
|
340
|
+
const { limit, cursor, kind } = parseQuery(artifactPageQuery, c.req.query());
|
|
341
|
+
if (limit === undefined)
|
|
342
|
+
return fail(400, "Pagination requires limit");
|
|
343
|
+
return jsonResponse(200, await readStoreOf(c.env.tenant).artifacts({ sessionId, kind, labels: labelsOf(c.req.queries("label")) ?? {} }, { limit, cursor }, readAccess(c.get("scope"))));
|
|
344
|
+
}
|
|
321
345
|
return jsonResponse(200, await listArtifacts(c.env.tenant, sessionId === undefined ? {} : { sessionId }, accessOf(c.get("scope"))));
|
|
322
346
|
});
|
|
323
347
|
tenantRoute(api, OWN, {
|
|
@@ -456,9 +480,12 @@ export function artifactRoutes(api) {
|
|
|
456
480
|
path: "/v1/artifacts/{artifactId}",
|
|
457
481
|
tags: ["Artifacts"],
|
|
458
482
|
summary: "Delete an artifact",
|
|
459
|
-
description: "Deletes every version and its bytes; its links stop working. A session's artifact gets `artifact.deleted` in its history.",
|
|
483
|
+
description: "Deletes every version and its bytes; its links stop working. A session's artifact gets `artifact.deleted` in its history. An Environment's disk versions are deleted through `/v1/environments/{environmentId}/versions/{version}` (`409` here).",
|
|
460
484
|
request: { params: artifactId },
|
|
461
|
-
responses: {
|
|
485
|
+
responses: {
|
|
486
|
+
200: json(DeleteArtifactResponse, "Deleted"),
|
|
487
|
+
409: { description: "The artifact holds an Environment's disk versions" },
|
|
488
|
+
},
|
|
462
489
|
}, async (c) => jsonResponse(200, await deleteArtifact(c.env.tenant, c.req.param("artifactId"), accessOf(c.get("scope")))));
|
|
463
490
|
tenantRoute(api, LINK, {
|
|
464
491
|
method: "get",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `POST /v1/tenant/credential-coverage` (the Management API): what a session of a saved agent
|
|
3
|
+
* would send for each URL it names, in a given Environment. A dry run of each call's credential
|
|
4
|
+
* choice (`VaultService.coverage`); no secret is read. An Environment's secrets themselves are
|
|
5
|
+
* written on the Runtime API (`/v1/environments/{id}/secrets`, `routes/environments.ts`).
|
|
6
|
+
*/
|
|
7
|
+
import type { OpenAPIHono } from "@hono/zod-openapi";
|
|
8
|
+
import type { TenantEnv } from "../app.js";
|
|
9
|
+
export declare function coverageRoutes(api: OpenAPIHono<TenantEnv>): void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CredentialCoverageRequestSchema } from "@nylorun/core/contracts";
|
|
3
|
+
import { CredentialCoverage, CredentialCoverageRequest, Rejected } from "../../components.js";
|
|
4
|
+
import { readJson } from "../body.js";
|
|
5
|
+
import { tenantRoute } from "../define.js";
|
|
6
|
+
import { jsonResponse } from "../respond.js";
|
|
7
|
+
import { fail } from "../../../tenant/http.js";
|
|
8
|
+
/** A Management API route: a management key. */
|
|
9
|
+
const MANAGEMENT = { credentials: ["management"], scopes: "never" };
|
|
10
|
+
const json = (schema, description) => ({
|
|
11
|
+
description,
|
|
12
|
+
content: { "application/json": { schema } },
|
|
13
|
+
});
|
|
14
|
+
export function coverageRoutes(api) {
|
|
15
|
+
tenantRoute(api, MANAGEMENT, {
|
|
16
|
+
method: "post",
|
|
17
|
+
path: "/v1/tenant/credential-coverage",
|
|
18
|
+
tags: ["Environments"],
|
|
19
|
+
summary: "Check an agent's credentials against an Environment",
|
|
20
|
+
description: "For each remote MCP server and each HTTP tool with a `credential` that the saved agent `agentId` declares (its own, its agents used as tools' and a flow's), the credential a session that names `environmentId` would send: the Environment's secret bound to the URL (`covered`), or none (`missing`). No secret is read and no server is called.",
|
|
21
|
+
request: {
|
|
22
|
+
body: { required: true, content: { "application/json": { schema: CredentialCoverageRequest } } },
|
|
23
|
+
},
|
|
24
|
+
responses: {
|
|
25
|
+
200: json(CredentialCoverage, "One entry per declared URL"),
|
|
26
|
+
404: json(Rejected, "No such agent, or no such Environment"),
|
|
27
|
+
},
|
|
28
|
+
}, async (c) => {
|
|
29
|
+
const request = CredentialCoverageRequestSchema.parse(await readJson(c.req.raw));
|
|
30
|
+
const tenant = c.env.tenant;
|
|
31
|
+
const definition = (await tenant.store.tx((t) => t.get("definitions", request.agentId))) ?? fail(404, "Definition not found");
|
|
32
|
+
return jsonResponse(200, await tenant.vault.coverage(definition.manifest, request));
|
|
33
|
+
});
|
|
34
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environments (`/v1/environments/**`, protocol 11, D55, D56): create, find or change one by id,
|
|
3
|
+
* read it, list them by label, read its lifecycle stream, stop, reset and delete it, and write
|
|
4
|
+
* its vault's secrets. Ids may hold `/`, sent percent-encoded as one path segment
|
|
5
|
+
* (`users%2Falice%2Fweb`). A token caller reaches only the ids its Environment grants match,
|
|
6
|
+
* and changes them only with `environments:write`. Secret values are write-only: no route reads
|
|
7
|
+
* one back.
|
|
8
|
+
*/
|
|
9
|
+
import type { OpenAPIHono } from "@hono/zod-openapi";
|
|
10
|
+
import type { TenantEnv } from "../app.js";
|
|
11
|
+
export declare function environmentRoutes(api: OpenAPIHono<TenantEnv>): void;
|