@kindgi/api 0.1.4-rc.5 → 0.1.5-rc.0
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/dist/agent-binding.d.ts +13 -0
- package/dist/agent-binding.d.ts.map +1 -1
- package/dist/agent-pins.d.ts.map +1 -1
- package/dist/agent-pins.js +18 -2
- package/dist/agent-pins.js.map +1 -1
- package/dist/app.d.ts +110 -17
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +163 -35
- package/dist/app.js.map +1 -1
- package/dist/block-publish.d.ts +56 -0
- package/dist/block-publish.d.ts.map +1 -0
- package/dist/block-publish.js +132 -0
- package/dist/block-publish.js.map +1 -0
- package/dist/caller.d.ts +24 -0
- package/dist/caller.d.ts.map +1 -0
- package/dist/caller.js +47 -0
- package/dist/caller.js.map +1 -0
- package/dist/capability-binding.d.ts +11 -0
- package/dist/capability-binding.d.ts.map +1 -1
- package/dist/derive-agent-version.d.ts +7 -0
- package/dist/derive-agent-version.d.ts.map +1 -1
- package/dist/derive-agent-version.js +4 -0
- package/dist/derive-agent-version.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +73 -7
- package/dist/errors.js.map +1 -1
- package/dist/eval-case-binding.d.ts +16 -4
- package/dist/eval-case-binding.d.ts.map +1 -1
- package/dist/eval-run-binding.d.ts +31 -0
- package/dist/eval-run-binding.d.ts.map +1 -1
- package/dist/eval-run-dispatcher.d.ts +7 -0
- package/dist/eval-run-dispatcher.d.ts.map +1 -1
- package/dist/eval-run-dispatcher.js.map +1 -1
- package/dist/eval-sample.d.ts +11 -0
- package/dist/eval-sample.d.ts.map +1 -0
- package/dist/eval-sample.js +34 -0
- package/dist/eval-sample.js.map +1 -0
- package/dist/eval-suite-binding.d.ts +13 -0
- package/dist/eval-suite-binding.d.ts.map +1 -1
- package/dist/eval-suite-binding.js.map +1 -1
- package/dist/flow-binding.d.ts +18 -0
- package/dist/flow-binding.d.ts.map +1 -1
- package/dist/flow-pins.d.ts.map +1 -1
- package/dist/flow-pins.js +18 -2
- package/dist/flow-pins.js.map +1 -1
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +25 -0
- package/dist/gate.js.map +1 -1
- package/dist/handler-binding.d.ts +32 -0
- package/dist/handler-binding.d.ts.map +1 -1
- package/dist/hitl-binding.d.ts +23 -0
- package/dist/hitl-binding.d.ts.map +1 -1
- package/dist/identity-directory-binding.d.ts +82 -4
- package/dist/identity-directory-binding.d.ts.map +1 -1
- package/dist/identity-provider-binding.d.ts +197 -17
- package/dist/identity-provider-binding.d.ts.map +1 -1
- package/dist/improvement-pass-binding.d.ts +196 -0
- package/dist/improvement-pass-binding.d.ts.map +1 -0
- package/dist/improvement-pass-binding.js +9 -0
- package/dist/improvement-pass-binding.js.map +1 -0
- package/dist/index.d.ts +35 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/judged-dispatcher.d.ts +25 -4
- package/dist/judged-dispatcher.d.ts.map +1 -1
- package/dist/judged-dispatcher.js +43 -6
- package/dist/judged-dispatcher.js.map +1 -1
- package/dist/judgment-binding.d.ts +25 -1
- package/dist/judgment-binding.d.ts.map +1 -1
- package/dist/mcp-endpoint-binding.d.ts +7 -0
- package/dist/mcp-endpoint-binding.d.ts.map +1 -1
- package/dist/memory-binding.d.ts +124 -17
- package/dist/memory-binding.d.ts.map +1 -1
- package/dist/memory-erasure-binding.d.ts +145 -0
- package/dist/memory-erasure-binding.d.ts.map +1 -0
- package/dist/memory-erasure-binding.js +4 -0
- package/dist/memory-erasure-binding.js.map +1 -0
- package/dist/middleware/auth.d.ts +66 -13
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +150 -50
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/authorize.d.ts +6 -0
- package/dist/middleware/authorize.d.ts.map +1 -1
- package/dist/middleware/authorize.js +113 -4
- package/dist/middleware/authorize.js.map +1 -1
- package/dist/middleware/error-mapper.d.ts +5 -0
- package/dist/middleware/error-mapper.d.ts.map +1 -1
- package/dist/middleware/error-mapper.js +14 -1
- package/dist/middleware/error-mapper.js.map +1 -1
- package/dist/middleware/idempotency.d.ts +70 -5
- package/dist/middleware/idempotency.d.ts.map +1 -1
- package/dist/middleware/idempotency.js +174 -41
- package/dist/middleware/idempotency.js.map +1 -1
- package/dist/middleware/key-project.d.ts +17 -0
- package/dist/middleware/key-project.d.ts.map +1 -0
- package/dist/middleware/key-project.js +75 -0
- package/dist/middleware/key-project.js.map +1 -0
- package/dist/middleware/principal.d.ts.map +1 -1
- package/dist/middleware/principal.js +9 -5
- package/dist/middleware/principal.js.map +1 -1
- package/dist/middleware/project-ref.d.ts.map +1 -1
- package/dist/middleware/project-ref.js +3 -0
- package/dist/middleware/project-ref.js.map +1 -1
- package/dist/openapi/generate.d.ts.map +1 -1
- package/dist/openapi/generate.js +5 -2
- package/dist/openapi/generate.js.map +1 -1
- package/dist/openapi/operations.d.ts.map +1 -1
- package/dist/openapi/operations.js +918 -139
- package/dist/openapi/operations.js.map +1 -1
- package/dist/openapi/schemas.d.ts +92 -13
- package/dist/openapi/schemas.d.ts.map +1 -1
- package/dist/openapi/schemas.js +2122 -370
- package/dist/openapi/schemas.js.map +1 -1
- package/dist/person-grants-binding.d.ts +77 -0
- package/dist/person-grants-binding.d.ts.map +1 -0
- package/dist/person-grants-binding.js +4 -0
- package/dist/person-grants-binding.js.map +1 -0
- package/dist/proposal-service.d.ts +121 -0
- package/dist/proposal-service.d.ts.map +1 -0
- package/dist/proposal-service.js +447 -0
- package/dist/proposal-service.js.map +1 -0
- package/dist/proposal-status.d.ts +60 -0
- package/dist/proposal-status.d.ts.map +1 -0
- package/dist/proposal-status.js +109 -0
- package/dist/proposal-status.js.map +1 -0
- package/dist/provider-binding.d.ts +10 -0
- package/dist/provider-binding.d.ts.map +1 -1
- package/dist/publish-refused.d.ts +18 -3
- package/dist/publish-refused.d.ts.map +1 -1
- package/dist/publish-refused.js +18 -3
- package/dist/publish-refused.js.map +1 -1
- package/dist/routes/adapters.d.ts +2 -1
- package/dist/routes/adapters.d.ts.map +1 -1
- package/dist/routes/adapters.js +3 -1
- package/dist/routes/adapters.js.map +1 -1
- package/dist/routes/agent-releases.d.ts +55 -3
- package/dist/routes/agent-releases.d.ts.map +1 -1
- package/dist/routes/agent-releases.js +85 -55
- package/dist/routes/agent-releases.js.map +1 -1
- package/dist/routes/agents.d.ts +12 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +100 -2
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/approvals.d.ts +15 -3
- package/dist/routes/approvals.d.ts.map +1 -1
- package/dist/routes/approvals.js +133 -122
- package/dist/routes/approvals.js.map +1 -1
- package/dist/routes/artifacts.d.ts +25 -3
- package/dist/routes/artifacts.d.ts.map +1 -1
- package/dist/routes/artifacts.js +116 -7
- package/dist/routes/artifacts.js.map +1 -1
- package/dist/routes/auth.d.ts +25 -1
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +655 -281
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/blocks.d.ts.map +1 -1
- package/dist/routes/blocks.js +2 -42
- package/dist/routes/blocks.js.map +1 -1
- package/dist/routes/capabilities.d.ts +2 -1
- package/dist/routes/capabilities.d.ts.map +1 -1
- package/dist/routes/capabilities.js +6 -1
- package/dist/routes/capabilities.js.map +1 -1
- package/dist/routes/compliance.d.ts +9 -10
- package/dist/routes/compliance.d.ts.map +1 -1
- package/dist/routes/compliance.js +42 -61
- package/dist/routes/compliance.js.map +1 -1
- package/dist/routes/conversations.d.ts +8 -1
- package/dist/routes/conversations.d.ts.map +1 -1
- package/dist/routes/conversations.js +87 -8
- package/dist/routes/conversations.js.map +1 -1
- package/dist/routes/cost.d.ts +7 -1
- package/dist/routes/cost.d.ts.map +1 -1
- package/dist/routes/cost.js +22 -3
- package/dist/routes/cost.js.map +1 -1
- package/dist/routes/denied.d.ts +11 -0
- package/dist/routes/denied.d.ts.map +1 -0
- package/dist/routes/denied.js +17 -0
- package/dist/routes/denied.js.map +1 -0
- package/dist/routes/deployments.d.ts +2 -1
- package/dist/routes/deployments.d.ts.map +1 -1
- package/dist/routes/deployments.js +44 -12
- package/dist/routes/deployments.js.map +1 -1
- package/dist/routes/eval-comparison.d.ts.map +1 -1
- package/dist/routes/eval-comparison.js +69 -1
- package/dist/routes/eval-comparison.js.map +1 -1
- package/dist/routes/eval-overrides.d.ts +18 -0
- package/dist/routes/eval-overrides.d.ts.map +1 -0
- package/dist/routes/eval-overrides.js +81 -0
- package/dist/routes/eval-overrides.js.map +1 -0
- package/dist/routes/eval-runs.d.ts +10 -1
- package/dist/routes/eval-runs.d.ts.map +1 -1
- package/dist/routes/eval-runs.js +63 -7
- package/dist/routes/eval-runs.js.map +1 -1
- package/dist/routes/eval-suites.d.ts.map +1 -1
- package/dist/routes/eval-suites.js +20 -1
- package/dist/routes/eval-suites.js.map +1 -1
- package/dist/routes/event-triggers.d.ts +5 -1
- package/dist/routes/event-triggers.d.ts.map +1 -1
- package/dist/routes/event-triggers.js +26 -3
- package/dist/routes/event-triggers.js.map +1 -1
- package/dist/routes/export-signing-keys.d.ts +12 -0
- package/dist/routes/export-signing-keys.d.ts.map +1 -0
- package/dist/routes/export-signing-keys.js +24 -0
- package/dist/routes/export-signing-keys.js.map +1 -0
- package/dist/routes/flows.d.ts.map +1 -1
- package/dist/routes/flows.js +9 -1
- package/dist/routes/flows.js.map +1 -1
- package/dist/routes/gate-policies.d.ts +4 -1
- package/dist/routes/gate-policies.d.ts.map +1 -1
- package/dist/routes/gate-policies.js +29 -5
- package/dist/routes/gate-policies.js.map +1 -1
- package/dist/routes/guardrails.d.ts +16 -14
- package/dist/routes/guardrails.d.ts.map +1 -1
- package/dist/routes/guardrails.js +39 -3
- package/dist/routes/guardrails.js.map +1 -1
- package/dist/routes/identity.d.ts +20 -4
- package/dist/routes/identity.d.ts.map +1 -1
- package/dist/routes/identity.js +246 -6
- package/dist/routes/identity.js.map +1 -1
- package/dist/routes/improvement-passes.d.ts +52 -0
- package/dist/routes/improvement-passes.d.ts.map +1 -0
- package/dist/routes/improvement-passes.js +449 -0
- package/dist/routes/improvement-passes.js.map +1 -0
- package/dist/routes/judged-suites.d.ts +50 -0
- package/dist/routes/judged-suites.d.ts.map +1 -1
- package/dist/routes/judged-suites.js +66 -27
- package/dist/routes/judged-suites.js.map +1 -1
- package/dist/routes/judgment-context.d.ts +18 -2
- package/dist/routes/judgment-context.d.ts.map +1 -1
- package/dist/routes/judgment-context.js +63 -5
- package/dist/routes/judgment-context.js.map +1 -1
- package/dist/routes/judgment-flow-context.d.ts.map +1 -1
- package/dist/routes/judgment-flow-context.js +14 -2
- package/dist/routes/judgment-flow-context.js.map +1 -1
- package/dist/routes/judgments.d.ts.map +1 -1
- package/dist/routes/judgments.js +8 -1
- package/dist/routes/judgments.js.map +1 -1
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +26 -1
- package/dist/routes/mcp.js.map +1 -1
- package/dist/routes/memory-access.d.ts +43 -0
- package/dist/routes/memory-access.d.ts.map +1 -0
- package/dist/routes/memory-access.js +129 -0
- package/dist/routes/memory-access.js.map +1 -0
- package/dist/routes/memory-erasures.d.ts +25 -0
- package/dist/routes/memory-erasures.d.ts.map +1 -0
- package/dist/routes/memory-erasures.js +214 -0
- package/dist/routes/memory-erasures.js.map +1 -0
- package/dist/routes/memory-parse.d.ts +38 -0
- package/dist/routes/memory-parse.d.ts.map +1 -0
- package/dist/routes/memory-parse.js +199 -0
- package/dist/routes/memory-parse.js.map +1 -0
- package/dist/routes/memory.d.ts +9 -4
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +226 -234
- package/dist/routes/memory.js.map +1 -1
- package/dist/routes/observations.d.ts +4 -1
- package/dist/routes/observations.d.ts.map +1 -1
- package/dist/routes/observations.js +8 -2
- package/dist/routes/observations.js.map +1 -1
- package/dist/routes/pagination.d.ts +7 -0
- package/dist/routes/pagination.d.ts.map +1 -1
- package/dist/routes/pagination.js +10 -0
- package/dist/routes/pagination.js.map +1 -1
- package/dist/routes/policies.d.ts +2 -1
- package/dist/routes/policies.d.ts.map +1 -1
- package/dist/routes/policies.js +3 -1
- package/dist/routes/policies.js.map +1 -1
- package/dist/routes/project-mismatch.d.ts +22 -0
- package/dist/routes/project-mismatch.d.ts.map +1 -0
- package/dist/routes/project-mismatch.js +34 -0
- package/dist/routes/project-mismatch.js.map +1 -0
- package/dist/routes/projects.d.ts +15 -4
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +100 -9
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/proposals.d.ts +25 -17
- package/dist/routes/proposals.d.ts.map +1 -1
- package/dist/routes/proposals.js +340 -507
- package/dist/routes/proposals.js.map +1 -1
- package/dist/routes/provenance.d.ts +17 -3
- package/dist/routes/provenance.d.ts.map +1 -1
- package/dist/routes/provenance.js +79 -103
- package/dist/routes/provenance.js.map +1 -1
- package/dist/routes/providers.d.ts +17 -1
- package/dist/routes/providers.d.ts.map +1 -1
- package/dist/routes/providers.js +188 -8
- package/dist/routes/providers.js.map +1 -1
- package/dist/routes/public-run-tokens.d.ts.map +1 -1
- package/dist/routes/public-run-tokens.js +3 -0
- package/dist/routes/public-run-tokens.js.map +1 -1
- package/dist/routes/runs.d.ts +10 -0
- package/dist/routes/runs.d.ts.map +1 -1
- package/dist/routes/runs.js +92 -42
- package/dist/routes/runs.js.map +1 -1
- package/dist/routes/schedules.d.ts +21 -13
- package/dist/routes/schedules.d.ts.map +1 -1
- package/dist/routes/schedules.js +416 -55
- package/dist/routes/schedules.js.map +1 -1
- package/dist/routes/segments.d.ts +2 -0
- package/dist/routes/segments.d.ts.map +1 -1
- package/dist/routes/segments.js +5 -0
- package/dist/routes/segments.js.map +1 -1
- package/dist/routes/service-accounts.d.ts +17 -0
- package/dist/routes/service-accounts.d.ts.map +1 -0
- package/dist/routes/service-accounts.js +212 -0
- package/dist/routes/service-accounts.js.map +1 -0
- package/dist/routes/sign-in-options.d.ts +50 -0
- package/dist/routes/sign-in-options.d.ts.map +1 -0
- package/dist/routes/sign-in-options.js +98 -0
- package/dist/routes/sign-in-options.js.map +1 -0
- package/dist/routes/signing-keys.d.ts +2 -1
- package/dist/routes/signing-keys.d.ts.map +1 -1
- package/dist/routes/signing-keys.js +3 -1
- package/dist/routes/signing-keys.js.map +1 -1
- package/dist/routes/tenant-access.d.ts +13 -0
- package/dist/routes/tenant-access.d.ts.map +1 -0
- package/dist/routes/tenant-access.js +26 -0
- package/dist/routes/tenant-access.js.map +1 -0
- package/dist/routes/tenant.d.ts.map +1 -1
- package/dist/routes/tenant.js +4 -0
- package/dist/routes/tenant.js.map +1 -1
- package/dist/routes/token-sign-in.d.ts +36 -0
- package/dist/routes/token-sign-in.d.ts.map +1 -0
- package/dist/routes/token-sign-in.js +101 -0
- package/dist/routes/token-sign-in.js.map +1 -0
- package/dist/routes/tokens.d.ts +15 -5
- package/dist/routes/tokens.d.ts.map +1 -1
- package/dist/routes/tokens.js +162 -43
- package/dist/routes/tokens.js.map +1 -1
- package/dist/routes/tools.d.ts.map +1 -1
- package/dist/routes/tools.js +9 -1
- package/dist/routes/tools.js.map +1 -1
- package/dist/routes/trigger-access.d.ts +29 -0
- package/dist/routes/trigger-access.d.ts.map +1 -0
- package/dist/routes/trigger-access.js +33 -0
- package/dist/routes/trigger-access.js.map +1 -0
- package/dist/routes/webhook-endpoints.d.ts +2 -1
- package/dist/routes/webhook-endpoints.d.ts.map +1 -1
- package/dist/routes/webhook-endpoints.js +11 -3
- package/dist/routes/webhook-endpoints.js.map +1 -1
- package/dist/routes/webhooks.d.ts +5 -1
- package/dist/routes/webhooks.d.ts.map +1 -1
- package/dist/routes/webhooks.js +25 -2
- package/dist/routes/webhooks.js.map +1 -1
- package/dist/run-failure.d.ts +21 -0
- package/dist/run-failure.d.ts.map +1 -0
- package/dist/run-failure.js +29 -0
- package/dist/run-failure.js.map +1 -0
- package/dist/service-account-binding.d.ts +108 -0
- package/dist/service-account-binding.d.ts.map +1 -0
- package/dist/service-account-binding.js +4 -0
- package/dist/service-account-binding.js.map +1 -0
- package/dist/session-store-binding.d.ts +61 -13
- package/dist/session-store-binding.d.ts.map +1 -1
- package/dist/signed-export.d.ts +89 -0
- package/dist/signed-export.d.ts.map +1 -0
- package/dist/signed-export.js +149 -0
- package/dist/signed-export.js.map +1 -0
- package/dist/supervisor-binding.d.ts +186 -413
- package/dist/supervisor-binding.d.ts.map +1 -1
- package/dist/testing/app-bindings.d.ts +33 -0
- package/dist/testing/app-bindings.d.ts.map +1 -0
- package/dist/testing/app-bindings.js +112 -0
- package/dist/testing/app-bindings.js.map +1 -0
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +13 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/stub-binding.d.ts +34 -0
- package/dist/testing/stub-binding.d.ts.map +1 -0
- package/dist/testing/stub-binding.js +42 -0
- package/dist/testing/stub-binding.js.map +1 -0
- package/dist/testing/trigger-registry.d.ts +21 -0
- package/dist/testing/trigger-registry.d.ts.map +1 -0
- package/dist/testing/trigger-registry.js +206 -0
- package/dist/testing/trigger-registry.js.map +1 -0
- package/dist/token-admin.d.ts +46 -8
- package/dist/token-admin.d.ts.map +1 -1
- package/dist/token-admin.js.map +1 -1
- package/dist/tool-binding.d.ts +13 -0
- package/dist/tool-binding.d.ts.map +1 -1
- package/dist/trigger-binding.d.ts +2 -2
- package/dist/trigger-binding.d.ts.map +1 -1
- package/dist/trigger-binding.js +1 -1
- package/dist/trigger-binding.js.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/webhook-endpoint-binding.d.ts +19 -3
- package/dist/webhook-endpoint-binding.d.ts.map +1 -1
- package/dist/webhook-endpoint-binding.js +1 -1
- package/dist/webhook-endpoint-binding.js.map +1 -1
- package/openapi.json +15286 -8653
- package/package.json +26 -22
- package/src/agent-binding.ts +14 -0
- package/src/agent-pins.ts +18 -2
- package/src/app.ts +366 -80
- package/src/block-publish.ts +181 -0
- package/src/caller.ts +62 -0
- package/src/capability-binding.ts +12 -0
- package/src/derive-agent-version.ts +9 -1
- package/src/errors.ts +73 -7
- package/src/eval-case-binding.ts +17 -1
- package/src/eval-run-binding.ts +31 -0
- package/src/eval-run-dispatcher.ts +7 -0
- package/src/eval-sample.ts +42 -0
- package/src/eval-suite-binding.ts +14 -0
- package/src/flow-binding.ts +19 -0
- package/src/flow-pins.ts +18 -2
- package/src/gate.ts +26 -0
- package/src/handler-binding.ts +36 -1
- package/src/hitl-binding.ts +24 -0
- package/src/identity-directory-binding.ts +85 -4
- package/src/identity-provider-binding.ts +216 -21
- package/src/improvement-pass-binding.ts +193 -0
- package/src/index.ts +153 -31
- package/src/judged-dispatcher.ts +78 -11
- package/src/judgment-binding.ts +25 -1
- package/src/mcp-endpoint-binding.ts +7 -0
- package/src/memory-binding.ts +121 -17
- package/src/memory-erasure-binding.ts +156 -0
- package/src/middleware/auth.ts +228 -62
- package/src/middleware/authorize.ts +139 -3
- package/src/middleware/error-mapper.ts +15 -1
- package/src/middleware/idempotency.ts +230 -43
- package/src/middleware/key-project.ts +86 -0
- package/src/middleware/principal.ts +9 -5
- package/src/middleware/project-ref.ts +3 -0
- package/src/openapi/generate.ts +11 -2
- package/src/openapi/operations.ts +1059 -142
- package/src/openapi/schemas.ts +2438 -485
- package/src/person-grants-binding.ts +76 -0
- package/src/proposal-service.ts +640 -0
- package/src/proposal-status.ts +176 -0
- package/src/provider-binding.ts +10 -0
- package/src/publish-refused.ts +38 -9
- package/src/routes/adapters.ts +4 -0
- package/src/routes/agent-releases.ts +121 -69
- package/src/routes/agents.ts +128 -1
- package/src/routes/approvals.ts +164 -154
- package/src/routes/artifacts.ts +181 -11
- package/src/routes/auth.ts +804 -336
- package/src/routes/blocks.ts +2 -53
- package/src/routes/capabilities.ts +10 -1
- package/src/routes/compliance.ts +60 -99
- package/src/routes/conversations.ts +101 -7
- package/src/routes/cost.ts +32 -3
- package/src/routes/denied.ts +28 -0
- package/src/routes/deployments.ts +62 -16
- package/src/routes/eval-comparison.ts +81 -2
- package/src/routes/eval-overrides.ts +108 -0
- package/src/routes/eval-runs.ts +86 -6
- package/src/routes/eval-suites.ts +25 -1
- package/src/routes/event-triggers.ts +27 -3
- package/src/routes/export-signing-keys.ts +31 -0
- package/src/routes/flows.ts +12 -1
- package/src/routes/gate-policies.ts +37 -6
- package/src/routes/guardrails.ts +61 -2
- package/src/routes/identity.ts +328 -10
- package/src/routes/improvement-passes.ts +541 -0
- package/src/routes/judged-suites.ts +113 -43
- package/src/routes/judgment-context.ts +76 -5
- package/src/routes/judgment-flow-context.ts +16 -2
- package/src/routes/judgments.ts +17 -3
- package/src/routes/mcp.ts +29 -1
- package/src/routes/memory-access.ts +179 -0
- package/src/routes/memory-erasures.ts +240 -0
- package/src/routes/memory-parse.ts +250 -0
- package/src/routes/memory.ts +244 -286
- package/src/routes/observations.ts +15 -2
- package/src/routes/pagination.ts +12 -0
- package/src/routes/policies.ts +7 -1
- package/src/routes/project-mismatch.ts +56 -0
- package/src/routes/projects.ts +107 -13
- package/src/routes/proposals.ts +370 -611
- package/src/routes/provenance.ts +99 -133
- package/src/routes/providers.ts +223 -8
- package/src/routes/public-run-tokens.ts +3 -0
- package/src/routes/runs.ts +119 -39
- package/src/routes/schedules.ts +472 -60
- package/src/routes/segments.ts +11 -0
- package/src/routes/service-accounts.ts +262 -0
- package/src/routes/sign-in-options.ts +168 -0
- package/src/routes/signing-keys.ts +7 -1
- package/src/routes/tenant-access.ts +37 -0
- package/src/routes/tenant.ts +6 -0
- package/src/routes/token-sign-in.ts +161 -0
- package/src/routes/tokens.ts +172 -46
- package/src/routes/tools.ts +12 -1
- package/src/routes/trigger-access.ts +72 -0
- package/src/routes/webhook-endpoints.ts +15 -3
- package/src/routes/webhooks.ts +26 -2
- package/src/run-failure.ts +42 -0
- package/src/service-account-binding.ts +113 -0
- package/src/session-store-binding.ts +65 -13
- package/src/signed-export.ts +250 -0
- package/src/supervisor-binding.ts +169 -409
- package/src/testing/app-bindings.ts +142 -0
- package/src/testing/index.ts +21 -0
- package/src/testing/stub-binding.ts +53 -0
- package/src/testing/trigger-registry.ts +259 -0
- package/src/token-admin.ts +40 -8
- package/src/tool-binding.ts +14 -0
- package/src/trigger-binding.ts +8 -1
- package/src/types.ts +16 -0
- package/src/webhook-endpoint-binding.ts +18 -3
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { ProjectRole } from '@kindgi/platform';
|
|
2
|
+
import type { Cursor, Result, TenantId, Timestamp } from '@kindgi/types';
|
|
3
|
+
/**
|
|
4
|
+
* Service accounts: named, non-human principals (`service_account:<id>`)
|
|
5
|
+
* for an app, a pipeline or a schedule's runs. A service account holds
|
|
6
|
+
* its own grants, set when it's created and changed by a tenant admin,
|
|
7
|
+
* and acts through API keys minted for it (`POST /v1/tokens` with `for`),
|
|
8
|
+
* several at once for rotation. Every route needs a tenant admin.
|
|
9
|
+
*
|
|
10
|
+
* Grants are written before a call answers, so a key minted for a new
|
|
11
|
+
* account works on its first request. Unregistering an account is a
|
|
12
|
+
* tombstone: its grants go, its keys stop working, and it stays readable.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* What a service account may do: tenant admin, tenant member (read the
|
|
16
|
+
* tenant's settings), or a role on one project. Unlike a person, an
|
|
17
|
+
* account isn't a tenant member unless it's granted that.
|
|
18
|
+
*/
|
|
19
|
+
export type ServiceAccountGrant = {
|
|
20
|
+
readonly kind: 'tenant-admin';
|
|
21
|
+
} | {
|
|
22
|
+
readonly kind: 'tenant-member';
|
|
23
|
+
} | {
|
|
24
|
+
readonly kind: 'project';
|
|
25
|
+
readonly projectId: string;
|
|
26
|
+
readonly role: ProjectRole;
|
|
27
|
+
};
|
|
28
|
+
/** A grant to remove: tenant admin, tenant member, or whatever role the account has on a project. */
|
|
29
|
+
export type ServiceAccountGrantTarget = {
|
|
30
|
+
readonly kind: 'tenant-admin';
|
|
31
|
+
} | {
|
|
32
|
+
readonly kind: 'tenant-member';
|
|
33
|
+
} | {
|
|
34
|
+
readonly kind: 'project';
|
|
35
|
+
readonly projectId: string;
|
|
36
|
+
};
|
|
37
|
+
export interface ServiceAccount {
|
|
38
|
+
readonly serviceAccountId: string;
|
|
39
|
+
readonly tenantId: TenantId;
|
|
40
|
+
/** Unique among the tenant's active accounts, e.g. `acme-ci`. */
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly description?: string;
|
|
43
|
+
/** Its grants, at the time of the read. */
|
|
44
|
+
readonly grants: readonly ServiceAccountGrant[];
|
|
45
|
+
/** Who created it: `user:<id>` or `service_account:<id>`. */
|
|
46
|
+
readonly createdBy?: string;
|
|
47
|
+
readonly createdAt: Timestamp;
|
|
48
|
+
/** Set once unregistered: no grants, and its keys no longer work. */
|
|
49
|
+
readonly unregisteredAt?: Timestamp;
|
|
50
|
+
}
|
|
51
|
+
export interface ServiceAccountCreateInput {
|
|
52
|
+
readonly tenantId: TenantId;
|
|
53
|
+
readonly name: string;
|
|
54
|
+
readonly description?: string;
|
|
55
|
+
/** Written with the account, before `create` returns. */
|
|
56
|
+
readonly grants: readonly ServiceAccountGrant[];
|
|
57
|
+
readonly createdBy?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ServiceAccountRef {
|
|
60
|
+
readonly tenantId: TenantId;
|
|
61
|
+
readonly serviceAccountId: string;
|
|
62
|
+
}
|
|
63
|
+
/** A change to an account, and who made it: `user:<id>` or `service_account:<id>`. */
|
|
64
|
+
export interface ServiceAccountChange extends ServiceAccountRef {
|
|
65
|
+
readonly by?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface ServiceAccountListInput {
|
|
68
|
+
readonly tenantId: TenantId;
|
|
69
|
+
readonly limit: number;
|
|
70
|
+
readonly cursor?: Cursor;
|
|
71
|
+
/** Unregistered accounts too (default: active only). */
|
|
72
|
+
readonly includeUnregistered?: boolean;
|
|
73
|
+
}
|
|
74
|
+
export type ServiceAccountErrorCode =
|
|
75
|
+
/** An active account of the tenant already has this name. */
|
|
76
|
+
'service-account-name-taken' | 'service-account-not-found'
|
|
77
|
+
/** A grant for an unregistered account. */
|
|
78
|
+
| 'service-account-unregistered'
|
|
79
|
+
/** A grant names a project the tenant doesn't have. */
|
|
80
|
+
| 'project-not-found';
|
|
81
|
+
export interface ServiceAccountError {
|
|
82
|
+
readonly code: ServiceAccountErrorCode;
|
|
83
|
+
readonly message: string;
|
|
84
|
+
}
|
|
85
|
+
export interface ServiceAccountBinding {
|
|
86
|
+
create(input: ServiceAccountCreateInput): Promise<Result<ServiceAccount, ServiceAccountError>>;
|
|
87
|
+
/** Unregistered accounts too, or `null`. */
|
|
88
|
+
get(input: ServiceAccountRef): Promise<ServiceAccount | null>;
|
|
89
|
+
/** Oldest first. */
|
|
90
|
+
list(input: ServiceAccountListInput): Promise<{
|
|
91
|
+
readonly data: readonly ServiceAccount[];
|
|
92
|
+
readonly nextCursor?: Cursor;
|
|
93
|
+
}>;
|
|
94
|
+
/**
|
|
95
|
+
* Add a grant (a no-op when held). A project role replaces the
|
|
96
|
+
* account's role on that project. Not for an unregistered account.
|
|
97
|
+
*/
|
|
98
|
+
grant(input: ServiceAccountChange & {
|
|
99
|
+
readonly grant: ServiceAccountGrant;
|
|
100
|
+
}): Promise<Result<ServiceAccount, ServiceAccountError>>;
|
|
101
|
+
/** Remove a grant (a no-op when not held). */
|
|
102
|
+
ungrant(input: ServiceAccountChange & {
|
|
103
|
+
readonly grant: ServiceAccountGrantTarget;
|
|
104
|
+
}): Promise<Result<ServiceAccount, ServiceAccountError>>;
|
|
105
|
+
/** Tombstone the account: its grants go and its keys stop working. Idempotent. */
|
|
106
|
+
unregister(input: ServiceAccountChange): Promise<Result<ServiceAccount, ServiceAccountError>>;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=service-account-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-account-binding.d.ts","sourceRoot":"","sources":["../src/service-account-binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-account-binding.js","sourceRoot":"","sources":["../src/service-account-binding.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC"}
|
|
@@ -9,15 +9,19 @@ import type { Cursor, SessionId, TenantId, Timestamp, UserId } from '@kindgi/typ
|
|
|
9
9
|
* `POST /v1/auth/callback/:providerId` exchanges the authorization code
|
|
10
10
|
* for provider tokens, fetches the userinfo, and calls
|
|
11
11
|
* `SessionStoreBinding.create` to persist the resulting session; the
|
|
12
|
-
* route then hands the caller an opaque
|
|
13
|
-
*
|
|
14
|
-
* refresh-token to the client.
|
|
12
|
+
* route then hands the caller an opaque session token (`kgi_sk_…`) that
|
|
13
|
+
* never leaks the provider access-token or refresh-token to the client.
|
|
15
14
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
15
|
+
* A store that implements `resolveToken` owns the token: `create` mints it
|
|
16
|
+
* (returned once, as `token`), the store keeps only a hash, and the
|
|
17
|
+
* bearer-auth middleware hands every `kgi_sk_` token to `resolveToken`.
|
|
18
|
+
* A store without it gets the older token, `kgi_sk_<sessionId>`, which
|
|
19
|
+
* the middleware resolves through `get` with `MULTI_TENANT_LOOKUP`;
|
|
20
|
+
* anyone who can read such a store's session ids can use the sessions.
|
|
21
|
+
*
|
|
22
|
+
* The resolver hot path runs on every authenticated request that carries
|
|
23
|
+
* a session token, so implementations SHOULD keep it cheap (a single
|
|
24
|
+
* indexed lookup, or a cache).
|
|
21
25
|
*/
|
|
22
26
|
export interface SessionStoreBinding {
|
|
23
27
|
create(input: SessionCreateInput): Promise<SessionCreateOutput>;
|
|
@@ -25,6 +29,21 @@ export interface SessionStoreBinding {
|
|
|
25
29
|
list(input: SessionListInput): Promise<SessionPage>;
|
|
26
30
|
revoke(input: SessionRevokeInput): Promise<SessionRevokeOutcome>;
|
|
27
31
|
revokeAllForUser(input: SessionRevokeAllForUserInput): Promise<SessionRevokeAllForUserOutcome>;
|
|
32
|
+
/**
|
|
33
|
+
* The session a token names, or `null` when it names none: an unknown,
|
|
34
|
+
* malformed or tampered token, or one in a format this store didn't
|
|
35
|
+
* mint. The store reads the token's tenant from the token itself and
|
|
36
|
+
* looks only in that tenant, comparing a hash of the token with what it
|
|
37
|
+
* stored (in constant time); nothing is read across tenants before the
|
|
38
|
+
* token is authenticated.
|
|
39
|
+
*
|
|
40
|
+
* A revoked, rotated or expired session is still returned (with
|
|
41
|
+
* `revokedAt`, `rotatedAt`, `expiresAt`): the middleware says which.
|
|
42
|
+
*
|
|
43
|
+
* When present, the middleware never calls `get` with
|
|
44
|
+
* `MULTI_TENANT_LOOKUP`, and `create` must return `token`.
|
|
45
|
+
*/
|
|
46
|
+
readonly resolveToken?: (input: SessionResolveTokenInput) => Promise<Session | null>;
|
|
28
47
|
/**
|
|
29
48
|
* Update the session's `lastActiveAt` marker. Called by the auth
|
|
30
49
|
* middleware on each successful authenticated request (throttled, by
|
|
@@ -32,18 +51,39 @@ export interface SessionStoreBinding {
|
|
|
32
51
|
* doesn't hot-spot under load). Absent = the middleware only enforces absolute
|
|
33
52
|
* TTL; inactivity timeout is disabled.
|
|
34
53
|
*
|
|
35
|
-
* The
|
|
36
|
-
*
|
|
54
|
+
* The middleware passes the session's own tenant. A store without
|
|
55
|
+
* `resolveToken` must also honor the sentinel `MULTI_TENANT_LOOKUP`,
|
|
56
|
+
* as `get` does.
|
|
37
57
|
*/
|
|
38
58
|
readonly touch?: (input: SessionTouchInput) => Promise<SessionTouchOutcome>;
|
|
59
|
+
/**
|
|
60
|
+
* End every live session one provider opened, in one tenant: the console
|
|
61
|
+
* sessions an API key opened (`api-token:<tokenId>`, from token sign-in)
|
|
62
|
+
* when it's revoked; an identity provider's sign-ins when it's removed.
|
|
63
|
+
* Absent → those sessions run until they expire.
|
|
64
|
+
*/
|
|
65
|
+
readonly revokeByProvider?: (input: SessionRevokeByProviderInput) => Promise<SessionRevokeAllForUserOutcome>;
|
|
66
|
+
}
|
|
67
|
+
export interface SessionRevokeByProviderInput {
|
|
68
|
+
readonly tenantId: TenantId;
|
|
69
|
+
/** The `providerId` the sessions were created with. */
|
|
70
|
+
readonly providerId: string;
|
|
71
|
+
}
|
|
72
|
+
export interface SessionResolveTokenInput {
|
|
73
|
+
/** The whole token, as the caller sent it (`kgi_sk_…`). */
|
|
74
|
+
readonly token: string;
|
|
39
75
|
}
|
|
40
76
|
export interface SessionCreateInput {
|
|
41
77
|
readonly tenantId: TenantId;
|
|
42
78
|
readonly userId: UserId;
|
|
43
79
|
/** ProviderId of the `IdentityProviderBinding` that authenticated the user. */
|
|
44
80
|
readonly providerId: string;
|
|
45
|
-
/**
|
|
46
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Opaque provider access-token, server-side only. Absent when the
|
|
83
|
+
* deployment keeps no identity-provider tokens (a sign-in that only
|
|
84
|
+
* establishes who the person is).
|
|
85
|
+
*/
|
|
86
|
+
readonly accessToken?: string;
|
|
47
87
|
/** Opaque provider refresh-token — server-side only, may be absent. */
|
|
48
88
|
readonly refreshToken?: string;
|
|
49
89
|
readonly expiresAt: Timestamp;
|
|
@@ -54,6 +94,13 @@ export interface SessionCreateInput {
|
|
|
54
94
|
export interface SessionCreateOutput {
|
|
55
95
|
readonly sessionId: SessionId;
|
|
56
96
|
readonly expiresAt: Timestamp;
|
|
97
|
+
/**
|
|
98
|
+
* The session token the store minted, returned this once (the store
|
|
99
|
+
* keeps only its hash). Required from a store that implements
|
|
100
|
+
* `resolveToken`; absent from an older store, whose token is
|
|
101
|
+
* `kgi_sk_<sessionId>`.
|
|
102
|
+
*/
|
|
103
|
+
readonly token?: string;
|
|
57
104
|
}
|
|
58
105
|
export interface SessionGetInput {
|
|
59
106
|
readonly tenantId: TenantId;
|
|
@@ -88,7 +135,8 @@ export interface Session {
|
|
|
88
135
|
readonly tenantId: TenantId;
|
|
89
136
|
readonly userId: UserId;
|
|
90
137
|
readonly providerId: string;
|
|
91
|
-
|
|
138
|
+
/** Absent when the deployment keeps no identity-provider tokens. */
|
|
139
|
+
readonly accessToken?: string;
|
|
92
140
|
readonly refreshToken?: string;
|
|
93
141
|
readonly expiresAt: Timestamp;
|
|
94
142
|
readonly scopes: readonly string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store-binding.d.ts","sourceRoot":"","sources":["../src/session-store-binding.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEpF
|
|
1
|
+
{"version":3,"file":"session-store-binding.d.ts","sourceRoot":"","sources":["../src/session-store-binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { AuditEventBinding } from '@kindgi/audit-events';
|
|
2
|
+
import type { ExportSigningAlgorithm, ExportSigningBinding, ExportSigningError } from '@kindgi/crypto';
|
|
3
|
+
import type { ProjectId, TenantId } from '@kindgi/types';
|
|
4
|
+
import type { Context } from 'hono';
|
|
5
|
+
import type { AppEnv } from './types.js';
|
|
6
|
+
export type SignedExportKind = 'audit-bundle' | 'provenance' | 'compliance';
|
|
7
|
+
/** The audit-event kind each signed export is recorded under. */
|
|
8
|
+
export declare const EXPORT_SIGNED_EVENT_KIND = "export-signed";
|
|
9
|
+
/** What every signed export answers, before its subject field (`approvalId`, `runId`, `tenantId`). */
|
|
10
|
+
export interface SignedExportEnvelope {
|
|
11
|
+
readonly kind: SignedExportKind;
|
|
12
|
+
/** Base64 of the signed bytes: the body, as sorted-key JSON. */
|
|
13
|
+
readonly bundle: string;
|
|
14
|
+
readonly bundleSchemaVersion: string;
|
|
15
|
+
/** The signing key's algorithm: `ed25519`, or `ecdsa-p256-sha256` for a KMS without Ed25519. */
|
|
16
|
+
readonly algorithm: ExportSigningAlgorithm;
|
|
17
|
+
readonly signingKeyId: string;
|
|
18
|
+
/**
|
|
19
|
+
* Base64 of the signature over the `bundle` bytes: 64 bytes either way,
|
|
20
|
+
* Ed25519's, or ECDSA P-256's as IEEE P1363 `r‖s`.
|
|
21
|
+
*/
|
|
22
|
+
readonly signature: string;
|
|
23
|
+
/** The signing key's public half, PEM SPKI. Check it against `GET /v1/export-signing-keys`. */
|
|
24
|
+
readonly publicKey: string;
|
|
25
|
+
readonly canonicalization: 'sorted-key-json';
|
|
26
|
+
/** The same instant as the signed body's `exportedAt`. */
|
|
27
|
+
readonly exportedAt: string;
|
|
28
|
+
}
|
|
29
|
+
export interface SignExportInput {
|
|
30
|
+
readonly signer: ExportSigningBinding;
|
|
31
|
+
readonly kind: SignedExportKind;
|
|
32
|
+
readonly bundleSchemaVersion: string;
|
|
33
|
+
/** The body without `bundleSchemaVersion` and `exportedAt`: both are added, and signed. */
|
|
34
|
+
readonly body: Readonly<Record<string, unknown>>;
|
|
35
|
+
readonly signingKeyId?: string;
|
|
36
|
+
readonly now?: () => Date;
|
|
37
|
+
/** Record the export (an `export-signed` audit event) before answering. */
|
|
38
|
+
readonly record?: {
|
|
39
|
+
readonly auditEvents: AuditEventBinding;
|
|
40
|
+
readonly tenantId: TenantId;
|
|
41
|
+
readonly projectId?: ProjectId;
|
|
42
|
+
readonly runId?: string;
|
|
43
|
+
readonly actor: string;
|
|
44
|
+
/** The exported thing: `{ approvalId }`, `{ runId }`, or the compliance filter. */
|
|
45
|
+
readonly subject: Readonly<Record<string, unknown>>;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export type SignExportError = ExportSigningError | {
|
|
49
|
+
readonly code: 'persistence-error';
|
|
50
|
+
readonly message: string;
|
|
51
|
+
};
|
|
52
|
+
/** Sign an export's body and, when asked, record it. */
|
|
53
|
+
export declare function signExport(input: SignExportInput): Promise<{
|
|
54
|
+
readonly kind: 'ok';
|
|
55
|
+
readonly value: SignedExportEnvelope;
|
|
56
|
+
} | {
|
|
57
|
+
readonly kind: 'err';
|
|
58
|
+
readonly error: SignExportError;
|
|
59
|
+
}>;
|
|
60
|
+
/**
|
|
61
|
+
* An export request's body: JSON, an object, or nothing at all (read as
|
|
62
|
+
* `{}`, so `curl -X POST` and a bodiless POST work).
|
|
63
|
+
*/
|
|
64
|
+
export declare function readExportBody(c: Context<AppEnv>): Promise<{
|
|
65
|
+
readonly kind: 'ok';
|
|
66
|
+
readonly value: Record<string, unknown>;
|
|
67
|
+
} | {
|
|
68
|
+
readonly kind: 'err';
|
|
69
|
+
readonly message: string;
|
|
70
|
+
}>;
|
|
71
|
+
/** `signingKeyId`, when the body names one: a non-empty string. */
|
|
72
|
+
export declare function parseSigningKeyId(body: Readonly<Record<string, unknown>>): {
|
|
73
|
+
readonly kind: 'ok';
|
|
74
|
+
readonly value: string | undefined;
|
|
75
|
+
} | {
|
|
76
|
+
readonly kind: 'err';
|
|
77
|
+
readonly message: string;
|
|
78
|
+
};
|
|
79
|
+
/** `404 signing-not-configured`: this deployment has no export signing key. */
|
|
80
|
+
export declare function signingNotConfigured(c: Context<AppEnv>, what: string): Response;
|
|
81
|
+
/**
|
|
82
|
+
* A `signExport` failure as the route answers it: `404
|
|
83
|
+
* signing-key-not-found`, `500 persistence-error`, or `500` with
|
|
84
|
+
* `failureCode` (each route keeps the code it answered before).
|
|
85
|
+
*/
|
|
86
|
+
export declare function signExportFailure(c: Context<AppEnv>, error: SignExportError, failureCode: 'export-key-error' | 'compliance-export-failed'): Response;
|
|
87
|
+
/** The caller as an audit actor: `user:<id>`, `service_account:<tokenId>`, or `service_account:unknown`. */
|
|
88
|
+
export declare function exportActor(c: Context<AppEnv>): string;
|
|
89
|
+
//# sourceMappingURL=signed-export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signed-export.d.ts","sourceRoot":"","sources":["../src/signed-export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* Signed exports: one envelope and one signing path for the three
|
|
5
|
+
* exports a deployment signs (an approval's audit bundle, a run's
|
|
6
|
+
* provenance, compliance evidence).
|
|
7
|
+
*
|
|
8
|
+
* The envelope carries the exact bytes that were signed (`bundle`,
|
|
9
|
+
* base64 of the sorted-key JSON body), so a verifier checks those bytes
|
|
10
|
+
* and never re-serializes anything. `exportedAt` is inside the signed
|
|
11
|
+
* body, and the envelope's copy is the same value.
|
|
12
|
+
*
|
|
13
|
+
* Each export is recorded as an `export-signed` audit event (who, what,
|
|
14
|
+
* which key, the bundle's SHA-256) when the app has an audit-event
|
|
15
|
+
* binding. Recording comes before the bundle is returned: a bundle the
|
|
16
|
+
* record couldn't be written for isn't handed out.
|
|
17
|
+
*/
|
|
18
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
19
|
+
import { canonicalize } from '@kindgi/schema';
|
|
20
|
+
import { statusFor, toWireError } from './errors.js';
|
|
21
|
+
/** The audit-event kind each signed export is recorded under. */
|
|
22
|
+
export const EXPORT_SIGNED_EVENT_KIND = 'export-signed';
|
|
23
|
+
/** Sign an export's body and, when asked, record it. */
|
|
24
|
+
export async function signExport(input) {
|
|
25
|
+
const exportedAt = (input.now?.() ?? new Date()).toISOString();
|
|
26
|
+
const body = { ...input.body, bundleSchemaVersion: input.bundleSchemaVersion, exportedAt };
|
|
27
|
+
const bytes = new TextEncoder().encode(canonicalize(body));
|
|
28
|
+
const signed = await input.signer.sign(bytes, input.signingKeyId !== undefined ? { keyId: input.signingKeyId } : undefined);
|
|
29
|
+
if (signed.kind === 'err')
|
|
30
|
+
return signed;
|
|
31
|
+
const envelope = {
|
|
32
|
+
kind: input.kind,
|
|
33
|
+
bundle: Buffer.from(bytes).toString('base64'),
|
|
34
|
+
bundleSchemaVersion: input.bundleSchemaVersion,
|
|
35
|
+
algorithm: signed.value.key.algorithm,
|
|
36
|
+
signingKeyId: signed.value.key.keyId,
|
|
37
|
+
signature: Buffer.from(signed.value.signature).toString('base64'),
|
|
38
|
+
publicKey: signed.value.key.publicKeyPem,
|
|
39
|
+
canonicalization: 'sorted-key-json',
|
|
40
|
+
exportedAt,
|
|
41
|
+
};
|
|
42
|
+
if (input.record !== undefined) {
|
|
43
|
+
const recorded = await recordExport(input.record, envelope, bytes);
|
|
44
|
+
if (recorded !== undefined)
|
|
45
|
+
return { kind: 'err', error: recorded };
|
|
46
|
+
}
|
|
47
|
+
return { kind: 'ok', value: envelope };
|
|
48
|
+
}
|
|
49
|
+
async function recordExport(record, envelope, bytes) {
|
|
50
|
+
const event = {
|
|
51
|
+
id: randomUUID(),
|
|
52
|
+
tenantId: record.tenantId,
|
|
53
|
+
...(record.projectId !== undefined && { projectId: record.projectId }),
|
|
54
|
+
kind: EXPORT_SIGNED_EVENT_KIND,
|
|
55
|
+
timestamp: envelope.exportedAt,
|
|
56
|
+
actor: record.actor,
|
|
57
|
+
...(record.runId !== undefined && { runId: record.runId }),
|
|
58
|
+
outcome: 'succeeded',
|
|
59
|
+
payload: {
|
|
60
|
+
v: 1,
|
|
61
|
+
doc: {
|
|
62
|
+
exportKind: envelope.kind,
|
|
63
|
+
subject: record.subject,
|
|
64
|
+
signingKeyId: envelope.signingKeyId,
|
|
65
|
+
bundleSha256: createHash('sha256').update(bytes).digest('hex'),
|
|
66
|
+
bundleSchemaVersion: envelope.bundleSchemaVersion,
|
|
67
|
+
exportedAt: envelope.exportedAt,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
const appended = await record.auditEvents.append([event]);
|
|
72
|
+
if (appended.kind === 'ok')
|
|
73
|
+
return undefined;
|
|
74
|
+
return {
|
|
75
|
+
code: 'persistence-error',
|
|
76
|
+
message: `The export was signed, but recording it failed, so it isn't returned: ${appended.error.message}. Try again.`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* An export request's body: JSON, an object, or nothing at all (read as
|
|
81
|
+
* `{}`, so `curl -X POST` and a bodiless POST work).
|
|
82
|
+
*/
|
|
83
|
+
export async function readExportBody(c) {
|
|
84
|
+
const text = await c.req.text();
|
|
85
|
+
if (text.trim() === '')
|
|
86
|
+
return { kind: 'ok', value: {} };
|
|
87
|
+
let body;
|
|
88
|
+
try {
|
|
89
|
+
body = JSON.parse(text);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return { kind: 'err', message: 'Request body must be valid JSON' };
|
|
93
|
+
}
|
|
94
|
+
if (body === null || typeof body !== 'object' || Array.isArray(body)) {
|
|
95
|
+
return { kind: 'err', message: 'Request body must be an object' };
|
|
96
|
+
}
|
|
97
|
+
return { kind: 'ok', value: body };
|
|
98
|
+
}
|
|
99
|
+
/** `signingKeyId`, when the body names one: a non-empty string. */
|
|
100
|
+
export function parseSigningKeyId(body) {
|
|
101
|
+
if (!('signingKeyId' in body) || body.signingKeyId === undefined) {
|
|
102
|
+
return { kind: 'ok', value: undefined };
|
|
103
|
+
}
|
|
104
|
+
const raw = body.signingKeyId;
|
|
105
|
+
if (typeof raw !== 'string' || raw.length === 0) {
|
|
106
|
+
return {
|
|
107
|
+
kind: 'err',
|
|
108
|
+
message: 'Field `signingKeyId` must be a non-empty string when present; leave it out to sign with the active key.',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
return { kind: 'ok', value: raw };
|
|
112
|
+
}
|
|
113
|
+
/** `404 signing-not-configured`: this deployment has no export signing key. */
|
|
114
|
+
export function signingNotConfigured(c, what) {
|
|
115
|
+
c.status(statusFor('signing-not-configured'));
|
|
116
|
+
return c.json(toWireError({
|
|
117
|
+
code: 'signing-not-configured',
|
|
118
|
+
message: `This deployment doesn't sign exports, so ${what} are unavailable: it has no export signing key. On the Kindgi runtime, set KINDGI_EXPORT_SIGNING_KEY_PATH, KINDGI_EXPORT_SIGNING_KEY or KINDGI_EXPORT_SIGNING_KMS_KEY.`,
|
|
119
|
+
}, c.get('requestId')));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* A `signExport` failure as the route answers it: `404
|
|
123
|
+
* signing-key-not-found`, `500 persistence-error`, or `500` with
|
|
124
|
+
* `failureCode` (each route keeps the code it answered before).
|
|
125
|
+
*/
|
|
126
|
+
export function signExportFailure(c, error, failureCode) {
|
|
127
|
+
const requestId = c.get('requestId');
|
|
128
|
+
if (error.code === 'signing-key-not-found') {
|
|
129
|
+
c.status(statusFor('signing-key-not-found'));
|
|
130
|
+
return c.json(toWireError({ code: 'signing-key-not-found', message: error.message, signingKeyId: error.keyId }, requestId));
|
|
131
|
+
}
|
|
132
|
+
if (error.code === 'persistence-error') {
|
|
133
|
+
c.status(statusFor('persistence-error'));
|
|
134
|
+
return c.json(toWireError({ code: 'persistence-error', message: error.message }, requestId));
|
|
135
|
+
}
|
|
136
|
+
c.status(statusFor(failureCode));
|
|
137
|
+
return c.json(toWireError({ code: failureCode, message: `Signing the export failed: ${error.message}` }, requestId));
|
|
138
|
+
}
|
|
139
|
+
/** The caller as an audit actor: `user:<id>`, `service_account:<tokenId>`, or `service_account:unknown`. */
|
|
140
|
+
export function exportActor(c) {
|
|
141
|
+
const userId = c.get('userId');
|
|
142
|
+
if (userId !== undefined)
|
|
143
|
+
return `user:${userId}`;
|
|
144
|
+
const tokenId = c.get('tokenId');
|
|
145
|
+
if (tokenId !== undefined)
|
|
146
|
+
return `service_account:${tokenId}`;
|
|
147
|
+
return 'service_account:unknown';
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=signed-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signed-export.js","sourceRoot":"","sources":["../src/signed-export.ts"],"names":[],"mappings":"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"}
|