@kindgi/api 0.0.0-bootstrap.0 → 0.1.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/LICENSE +201 -0
- package/README.md +216 -1
- package/dist/adapter-binding.d.ts +177 -0
- package/dist/adapter-binding.d.ts.map +1 -0
- package/dist/adapter-binding.js +12 -0
- package/dist/adapter-binding.js.map +1 -0
- package/dist/agent-binding.d.ts +207 -0
- package/dist/agent-binding.d.ts.map +1 -0
- package/dist/agent-binding.js +4 -0
- package/dist/agent-binding.js.map +1 -0
- package/dist/app.d.ts +770 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +396 -0
- package/dist/app.js.map +1 -0
- package/dist/capability-binding.d.ts +76 -0
- package/dist/capability-binding.d.ts.map +1 -0
- package/dist/capability-binding.js +4 -0
- package/dist/capability-binding.js.map +1 -0
- package/dist/cost-binding.d.ts +175 -0
- package/dist/cost-binding.d.ts.map +1 -0
- package/dist/cost-binding.js +13 -0
- package/dist/cost-binding.js.map +1 -0
- package/dist/deployment-binding.d.ts +201 -0
- package/dist/deployment-binding.d.ts.map +1 -0
- package/dist/deployment-binding.js +4 -0
- package/dist/deployment-binding.js.map +1 -0
- package/dist/env-binding.d.ts +132 -0
- package/dist/env-binding.d.ts.map +1 -0
- package/dist/env-binding.js +4 -0
- package/dist/env-binding.js.map +1 -0
- package/dist/errors.d.ts +37 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +264 -0
- package/dist/errors.js.map +1 -0
- package/dist/eval-run-binding.d.ts +196 -0
- package/dist/eval-run-binding.d.ts.map +1 -0
- package/dist/eval-run-binding.js +16 -0
- package/dist/eval-run-binding.js.map +1 -0
- package/dist/eval-run-dispatcher.d.ts +131 -0
- package/dist/eval-run-dispatcher.d.ts.map +1 -0
- package/dist/eval-run-dispatcher.js +368 -0
- package/dist/eval-run-dispatcher.js.map +1 -0
- package/dist/eval-suite-binding.d.ts +227 -0
- package/dist/eval-suite-binding.d.ts.map +1 -0
- package/dist/eval-suite-binding.js +24 -0
- package/dist/eval-suite-binding.js.map +1 -0
- package/dist/event-bus-binding.d.ts +107 -0
- package/dist/event-bus-binding.d.ts.map +1 -0
- package/dist/event-bus-binding.js +5 -0
- package/dist/event-bus-binding.js.map +1 -0
- package/dist/flow-binding.d.ts +194 -0
- package/dist/flow-binding.d.ts.map +1 -0
- package/dist/flow-binding.js +4 -0
- package/dist/flow-binding.js.map +1 -0
- package/dist/guardrail-binding.d.ts +138 -0
- package/dist/guardrail-binding.d.ts.map +1 -0
- package/dist/guardrail-binding.js +4 -0
- package/dist/guardrail-binding.js.map +1 -0
- package/dist/handler-binding.d.ts +126 -0
- package/dist/handler-binding.d.ts.map +1 -0
- package/dist/handler-binding.js +4 -0
- package/dist/handler-binding.js.map +1 -0
- package/dist/hitl-binding.d.ts +115 -0
- package/dist/hitl-binding.d.ts.map +1 -0
- package/dist/hitl-binding.js +4 -0
- package/dist/hitl-binding.js.map +1 -0
- package/dist/identity-directory-binding.d.ts +116 -0
- package/dist/identity-directory-binding.d.ts.map +1 -0
- package/dist/identity-directory-binding.js +4 -0
- package/dist/identity-directory-binding.js.map +1 -0
- package/dist/identity-provider-binding.d.ts +184 -0
- package/dist/identity-provider-binding.d.ts.map +1 -0
- package/dist/identity-provider-binding.js +4 -0
- package/dist/identity-provider-binding.js.map +1 -0
- package/dist/image-registry-binding.d.ts +165 -0
- package/dist/image-registry-binding.d.ts.map +1 -0
- package/dist/image-registry-binding.js +4 -0
- package/dist/image-registry-binding.js.map +1 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/key-management-binding.d.ts +101 -0
- package/dist/key-management-binding.d.ts.map +1 -0
- package/dist/key-management-binding.js +4 -0
- package/dist/key-management-binding.js.map +1 -0
- package/dist/mcp-endpoint-binding.d.ts +312 -0
- package/dist/mcp-endpoint-binding.d.ts.map +1 -0
- package/dist/mcp-endpoint-binding.js +12 -0
- package/dist/mcp-endpoint-binding.js.map +1 -0
- package/dist/memory-binding.d.ts +209 -0
- package/dist/memory-binding.d.ts.map +1 -0
- package/dist/memory-binding.js +4 -0
- package/dist/memory-binding.js.map +1 -0
- package/dist/middleware/auth.d.ts +168 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +247 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/authorize.d.ts +26 -0
- package/dist/middleware/authorize.d.ts.map +1 -0
- package/dist/middleware/authorize.js +65 -0
- package/dist/middleware/authorize.js.map +1 -0
- package/dist/middleware/error-mapper.d.ts +13 -0
- package/dist/middleware/error-mapper.d.ts.map +1 -0
- package/dist/middleware/error-mapper.js +32 -0
- package/dist/middleware/error-mapper.js.map +1 -0
- package/dist/middleware/idempotency.d.ts +43 -0
- package/dist/middleware/idempotency.d.ts.map +1 -0
- package/dist/middleware/idempotency.js +118 -0
- package/dist/middleware/idempotency.js.map +1 -0
- package/dist/middleware/principal.d.ts +4 -0
- package/dist/middleware/principal.d.ts.map +1 -0
- package/dist/middleware/principal.js +42 -0
- package/dist/middleware/principal.js.map +1 -0
- package/dist/middleware/public-run-routes.d.ts +16 -0
- package/dist/middleware/public-run-routes.d.ts.map +1 -0
- package/dist/middleware/public-run-routes.js +43 -0
- package/dist/middleware/public-run-routes.js.map +1 -0
- package/dist/middleware/request-id.d.ts +14 -0
- package/dist/middleware/request-id.d.ts.map +1 -0
- package/dist/middleware/request-id.js +24 -0
- package/dist/middleware/request-id.js.map +1 -0
- package/dist/middleware/sigv4-verify.d.ts +64 -0
- package/dist/middleware/sigv4-verify.d.ts.map +1 -0
- package/dist/middleware/sigv4-verify.js +286 -0
- package/dist/middleware/sigv4-verify.js.map +1 -0
- package/dist/middleware/sigv4.d.ts +25 -0
- package/dist/middleware/sigv4.d.ts.map +1 -0
- package/dist/middleware/sigv4.js +120 -0
- package/dist/middleware/sigv4.js.map +1 -0
- package/dist/openapi/generate.d.ts +15 -0
- package/dist/openapi/generate.d.ts.map +1 -0
- package/dist/openapi/generate.js +241 -0
- package/dist/openapi/generate.js.map +1 -0
- package/dist/openapi/operations.d.ts +70 -0
- package/dist/openapi/operations.d.ts.map +1 -0
- package/dist/openapi/operations.js +5051 -0
- package/dist/openapi/operations.js.map +1 -0
- package/dist/openapi/schemas.d.ts +590 -0
- package/dist/openapi/schemas.d.ts.map +1 -0
- package/dist/openapi/schemas.js +5820 -0
- package/dist/openapi/schemas.js.map +1 -0
- package/dist/provenance-binding.d.ts +116 -0
- package/dist/provenance-binding.d.ts.map +1 -0
- package/dist/provenance-binding.js +31 -0
- package/dist/provenance-binding.js.map +1 -0
- package/dist/provider-binding.d.ts +174 -0
- package/dist/provider-binding.d.ts.map +1 -0
- package/dist/provider-binding.js +4 -0
- package/dist/provider-binding.js.map +1 -0
- package/dist/public-run-token.d.ts +97 -0
- package/dist/public-run-token.d.ts.map +1 -0
- package/dist/public-run-token.js +167 -0
- package/dist/public-run-token.js.map +1 -0
- package/dist/retention-binding.d.ts +69 -0
- package/dist/retention-binding.d.ts.map +1 -0
- package/dist/retention-binding.js +4 -0
- package/dist/retention-binding.js.map +1 -0
- package/dist/reviewer-binding.d.ts +84 -0
- package/dist/reviewer-binding.d.ts.map +1 -0
- package/dist/reviewer-binding.js +4 -0
- package/dist/reviewer-binding.js.map +1 -0
- package/dist/rotation-status-store.d.ts +96 -0
- package/dist/rotation-status-store.d.ts.map +1 -0
- package/dist/rotation-status-store.js +106 -0
- package/dist/rotation-status-store.js.map +1 -0
- package/dist/routes/adapters.d.ts +29 -0
- package/dist/routes/adapters.d.ts.map +1 -0
- package/dist/routes/adapters.js +230 -0
- package/dist/routes/adapters.js.map +1 -0
- package/dist/routes/agents.d.ts +17 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +342 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/approvals.d.ts +37 -0
- package/dist/routes/approvals.d.ts.map +1 -0
- package/dist/routes/approvals.js +551 -0
- package/dist/routes/approvals.js.map +1 -0
- package/dist/routes/artifacts.d.ts +25 -0
- package/dist/routes/artifacts.d.ts.map +1 -0
- package/dist/routes/artifacts.js +265 -0
- package/dist/routes/artifacts.js.map +1 -0
- package/dist/routes/audit.d.ts +6 -0
- package/dist/routes/audit.d.ts.map +1 -0
- package/dist/routes/audit.js +162 -0
- package/dist/routes/audit.js.map +1 -0
- package/dist/routes/auth.d.ts +47 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +630 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/capabilities.d.ts +14 -0
- package/dist/routes/capabilities.d.ts.map +1 -0
- package/dist/routes/capabilities.js +62 -0
- package/dist/routes/capabilities.js.map +1 -0
- package/dist/routes/compliance.d.ts +37 -0
- package/dist/routes/compliance.d.ts.map +1 -0
- package/dist/routes/compliance.js +321 -0
- package/dist/routes/compliance.js.map +1 -0
- package/dist/routes/conversations.d.ts +13 -0
- package/dist/routes/conversations.d.ts.map +1 -0
- package/dist/routes/conversations.js +295 -0
- package/dist/routes/conversations.js.map +1 -0
- package/dist/routes/cost.d.ts +24 -0
- package/dist/routes/cost.d.ts.map +1 -0
- package/dist/routes/cost.js +243 -0
- package/dist/routes/cost.js.map +1 -0
- package/dist/routes/deployments.d.ts +122 -0
- package/dist/routes/deployments.d.ts.map +1 -0
- package/dist/routes/deployments.js +1036 -0
- package/dist/routes/deployments.js.map +1 -0
- package/dist/routes/env.d.ts +62 -0
- package/dist/routes/env.d.ts.map +1 -0
- package/dist/routes/env.js +311 -0
- package/dist/routes/env.js.map +1 -0
- package/dist/routes/eval-runs.d.ts +28 -0
- package/dist/routes/eval-runs.d.ts.map +1 -0
- package/dist/routes/eval-runs.js +479 -0
- package/dist/routes/eval-runs.js.map +1 -0
- package/dist/routes/eval-suites.d.ts +24 -0
- package/dist/routes/eval-suites.d.ts.map +1 -0
- package/dist/routes/eval-suites.js +381 -0
- package/dist/routes/eval-suites.js.map +1 -0
- package/dist/routes/event-triggers.d.ts +12 -0
- package/dist/routes/event-triggers.d.ts.map +1 -0
- package/dist/routes/event-triggers.js +218 -0
- package/dist/routes/event-triggers.js.map +1 -0
- package/dist/routes/flows.d.ts +23 -0
- package/dist/routes/flows.d.ts.map +1 -0
- package/dist/routes/flows.js +344 -0
- package/dist/routes/flows.js.map +1 -0
- package/dist/routes/guardrails.d.ts +33 -0
- package/dist/routes/guardrails.d.ts.map +1 -0
- package/dist/routes/guardrails.js +236 -0
- package/dist/routes/guardrails.js.map +1 -0
- package/dist/routes/identity.d.ts +39 -0
- package/dist/routes/identity.d.ts.map +1 -0
- package/dist/routes/identity.js +138 -0
- package/dist/routes/identity.js.map +1 -0
- package/dist/routes/mcp.d.ts +23 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +727 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/memory.d.ts +16 -0
- package/dist/routes/memory.d.ts.map +1 -0
- package/dist/routes/memory.js +353 -0
- package/dist/routes/memory.js.map +1 -0
- package/dist/routes/observations.d.ts +19 -0
- package/dist/routes/observations.d.ts.map +1 -0
- package/dist/routes/observations.js +135 -0
- package/dist/routes/observations.js.map +1 -0
- package/dist/routes/orgs.d.ts +24 -0
- package/dist/routes/orgs.d.ts.map +1 -0
- package/dist/routes/orgs.js +208 -0
- package/dist/routes/orgs.js.map +1 -0
- package/dist/routes/pagination.d.ts +18 -0
- package/dist/routes/pagination.d.ts.map +1 -0
- package/dist/routes/pagination.js +35 -0
- package/dist/routes/pagination.js.map +1 -0
- package/dist/routes/policies.d.ts +23 -0
- package/dist/routes/policies.d.ts.map +1 -0
- package/dist/routes/policies.js +314 -0
- package/dist/routes/policies.js.map +1 -0
- package/dist/routes/projects.d.ts +45 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +485 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/proposals.d.ts +24 -0
- package/dist/routes/proposals.d.ts.map +1 -0
- package/dist/routes/proposals.js +581 -0
- package/dist/routes/proposals.js.map +1 -0
- package/dist/routes/provenance.d.ts +34 -0
- package/dist/routes/provenance.d.ts.map +1 -0
- package/dist/routes/provenance.js +274 -0
- package/dist/routes/provenance.js.map +1 -0
- package/dist/routes/providers.d.ts +32 -0
- package/dist/routes/providers.d.ts.map +1 -0
- package/dist/routes/providers.js +490 -0
- package/dist/routes/providers.js.map +1 -0
- package/dist/routes/public-run-tokens.d.ts +17 -0
- package/dist/routes/public-run-tokens.d.ts.map +1 -0
- package/dist/routes/public-run-tokens.js +69 -0
- package/dist/routes/public-run-tokens.js.map +1 -0
- package/dist/routes/retention.d.ts +19 -0
- package/dist/routes/retention.d.ts.map +1 -0
- package/dist/routes/retention.js +152 -0
- package/dist/routes/retention.js.map +1 -0
- package/dist/routes/reviewers.d.ts +5 -0
- package/dist/routes/reviewers.d.ts.map +1 -0
- package/dist/routes/reviewers.js +161 -0
- package/dist/routes/reviewers.js.map +1 -0
- package/dist/routes/runs.d.ts +34 -0
- package/dist/routes/runs.d.ts.map +1 -0
- package/dist/routes/runs.js +773 -0
- package/dist/routes/runs.js.map +1 -0
- package/dist/routes/s3.d.ts +31 -0
- package/dist/routes/s3.d.ts.map +1 -0
- package/dist/routes/s3.js +433 -0
- package/dist/routes/s3.js.map +1 -0
- package/dist/routes/schedules.d.ts +20 -0
- package/dist/routes/schedules.d.ts.map +1 -0
- package/dist/routes/schedules.js +234 -0
- package/dist/routes/schedules.js.map +1 -0
- package/dist/routes/scope-params.d.ts +57 -0
- package/dist/routes/scope-params.d.ts.map +1 -0
- package/dist/routes/scope-params.js +105 -0
- package/dist/routes/scope-params.js.map +1 -0
- package/dist/routes/secret-ref.d.ts +20 -0
- package/dist/routes/secret-ref.d.ts.map +1 -0
- package/dist/routes/secret-ref.js +42 -0
- package/dist/routes/secret-ref.js.map +1 -0
- package/dist/routes/secrets.d.ts +53 -0
- package/dist/routes/secrets.d.ts.map +1 -0
- package/dist/routes/secrets.js +715 -0
- package/dist/routes/secrets.js.map +1 -0
- package/dist/routes/signing-keys.d.ts +23 -0
- package/dist/routes/signing-keys.d.ts.map +1 -0
- package/dist/routes/signing-keys.js +212 -0
- package/dist/routes/signing-keys.js.map +1 -0
- package/dist/routes/sse.d.ts +58 -0
- package/dist/routes/sse.d.ts.map +1 -0
- package/dist/routes/sse.js +92 -0
- package/dist/routes/sse.js.map +1 -0
- package/dist/routes/teams.d.ts +30 -0
- package/dist/routes/teams.d.ts.map +1 -0
- package/dist/routes/teams.js +443 -0
- package/dist/routes/teams.js.map +1 -0
- package/dist/routes/tenant.d.ts +57 -0
- package/dist/routes/tenant.d.ts.map +1 -0
- package/dist/routes/tenant.js +352 -0
- package/dist/routes/tenant.js.map +1 -0
- package/dist/routes/tokens.d.ts +14 -0
- package/dist/routes/tokens.d.ts.map +1 -0
- package/dist/routes/tokens.js +231 -0
- package/dist/routes/tokens.js.map +1 -0
- package/dist/routes/tools.d.ts +33 -0
- package/dist/routes/tools.d.ts.map +1 -0
- package/dist/routes/tools.js +380 -0
- package/dist/routes/tools.js.map +1 -0
- package/dist/routes/webhook-endpoints.d.ts +10 -0
- package/dist/routes/webhook-endpoints.d.ts.map +1 -0
- package/dist/routes/webhook-endpoints.js +407 -0
- package/dist/routes/webhook-endpoints.js.map +1 -0
- package/dist/routes/webhooks.d.ts +21 -0
- package/dist/routes/webhooks.d.ts.map +1 -0
- package/dist/routes/webhooks.js +228 -0
- package/dist/routes/webhooks.js.map +1 -0
- package/dist/s3-credential-binding.d.ts +54 -0
- package/dist/s3-credential-binding.d.ts.map +1 -0
- package/dist/s3-credential-binding.js +4 -0
- package/dist/s3-credential-binding.js.map +1 -0
- package/dist/secrets-binding.d.ts +281 -0
- package/dist/secrets-binding.d.ts.map +1 -0
- package/dist/secrets-binding.js +10 -0
- package/dist/secrets-binding.js.map +1 -0
- package/dist/secrets-provider-binding.d.ts +164 -0
- package/dist/secrets-provider-binding.d.ts.map +1 -0
- package/dist/secrets-provider-binding.js +4 -0
- package/dist/secrets-provider-binding.js.map +1 -0
- package/dist/session-store-binding.d.ts +148 -0
- package/dist/session-store-binding.d.ts.map +1 -0
- package/dist/session-store-binding.js +4 -0
- package/dist/session-store-binding.js.map +1 -0
- package/dist/signing-key-binding.d.ts +210 -0
- package/dist/signing-key-binding.d.ts.map +1 -0
- package/dist/signing-key-binding.js +4 -0
- package/dist/signing-key-binding.js.map +1 -0
- package/dist/state-store-binding.d.ts +53 -0
- package/dist/state-store-binding.d.ts.map +1 -0
- package/dist/state-store-binding.js +38 -0
- package/dist/state-store-binding.js.map +1 -0
- package/dist/supervisor-binding.d.ts +526 -0
- package/dist/supervisor-binding.d.ts.map +1 -0
- package/dist/supervisor-binding.js +4 -0
- package/dist/supervisor-binding.js.map +1 -0
- package/dist/tenant-host-access.d.ts +41 -0
- package/dist/tenant-host-access.d.ts.map +1 -0
- package/dist/tenant-host-access.js +42 -0
- package/dist/tenant-host-access.js.map +1 -0
- package/dist/token-admin.d.ts +99 -0
- package/dist/token-admin.d.ts.map +1 -0
- package/dist/token-admin.js +4 -0
- package/dist/token-admin.js.map +1 -0
- package/dist/tool-binding.d.ts +247 -0
- package/dist/tool-binding.d.ts.map +1 -0
- package/dist/tool-binding.js +4 -0
- package/dist/tool-binding.js.map +1 -0
- package/dist/trigger-binding.d.ts +13 -0
- package/dist/trigger-binding.d.ts.map +1 -0
- package/dist/trigger-binding.js +4 -0
- package/dist/trigger-binding.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/webhook-endpoint-binding.d.ts +230 -0
- package/dist/webhook-endpoint-binding.d.ts.map +1 -0
- package/dist/webhook-endpoint-binding.js +12 -0
- package/dist/webhook-endpoint-binding.js.map +1 -0
- package/dist/xml.d.ts +79 -0
- package/dist/xml.d.ts.map +1 -0
- package/dist/xml.js +115 -0
- package/dist/xml.js.map +1 -0
- package/openapi.json +29659 -0
- package/package.json +76 -4
- package/scripts/emit-openapi.mjs +44 -0
- package/src/adapter-binding.ts +204 -0
- package/src/agent-binding.ts +231 -0
- package/src/app.ts +1285 -0
- package/src/capability-binding.ts +83 -0
- package/src/cost-binding.ts +213 -0
- package/src/deployment-binding.ts +225 -0
- package/src/env-binding.ts +140 -0
- package/src/errors.ts +291 -0
- package/src/eval-run-binding.ts +209 -0
- package/src/eval-run-dispatcher.ts +497 -0
- package/src/eval-suite-binding.ts +257 -0
- package/src/event-bus-binding.ts +127 -0
- package/src/flow-binding.ts +213 -0
- package/src/guardrail-binding.ts +151 -0
- package/src/handler-binding.ts +132 -0
- package/src/hitl-binding.ts +172 -0
- package/src/identity-directory-binding.ts +128 -0
- package/src/identity-provider-binding.ts +203 -0
- package/src/image-registry-binding.ts +193 -0
- package/src/index.ts +606 -0
- package/src/key-management-binding.ts +91 -0
- package/src/mcp-endpoint-binding.ts +311 -0
- package/src/memory-binding.ts +239 -0
- package/src/middleware/auth.ts +437 -0
- package/src/middleware/authorize.ts +125 -0
- package/src/middleware/error-mapper.ts +37 -0
- package/src/middleware/idempotency.ts +160 -0
- package/src/middleware/principal.ts +64 -0
- package/src/middleware/public-run-routes.ts +50 -0
- package/src/middleware/request-id.ts +28 -0
- package/src/middleware/sigv4-verify.ts +374 -0
- package/src/middleware/sigv4.ts +165 -0
- package/src/openapi/generate.ts +307 -0
- package/src/openapi/operations.ts +5445 -0
- package/src/openapi/schemas.ts +6363 -0
- package/src/provenance-binding.ts +169 -0
- package/src/provider-binding.ts +196 -0
- package/src/public-run-token.ts +263 -0
- package/src/retention-binding.ts +78 -0
- package/src/reviewer-binding.ts +99 -0
- package/src/rotation-status-store.ts +209 -0
- package/src/routes/adapters.ts +319 -0
- package/src/routes/agents.ts +424 -0
- package/src/routes/approvals.ts +759 -0
- package/src/routes/artifacts.ts +317 -0
- package/src/routes/audit.ts +219 -0
- package/src/routes/auth.ts +806 -0
- package/src/routes/capabilities.ts +79 -0
- package/src/routes/compliance.ts +482 -0
- package/src/routes/conversations.ts +369 -0
- package/src/routes/cost.ts +327 -0
- package/src/routes/deployments.ts +1493 -0
- package/src/routes/env.ts +429 -0
- package/src/routes/eval-runs.ts +631 -0
- package/src/routes/eval-suites.ts +490 -0
- package/src/routes/event-triggers.ts +283 -0
- package/src/routes/flows.ts +423 -0
- package/src/routes/guardrails.ts +320 -0
- package/src/routes/identity.ts +203 -0
- package/src/routes/mcp.ts +940 -0
- package/src/routes/memory.ts +430 -0
- package/src/routes/observations.ts +175 -0
- package/src/routes/orgs.ts +273 -0
- package/src/routes/pagination.ts +51 -0
- package/src/routes/policies.ts +413 -0
- package/src/routes/projects.ts +634 -0
- package/src/routes/proposals.ts +719 -0
- package/src/routes/provenance.ts +406 -0
- package/src/routes/providers.ts +624 -0
- package/src/routes/public-run-tokens.ts +104 -0
- package/src/routes/retention.ts +193 -0
- package/src/routes/reviewers.ts +209 -0
- package/src/routes/runs.ts +981 -0
- package/src/routes/s3.ts +519 -0
- package/src/routes/schedules.ts +300 -0
- package/src/routes/scope-params.ts +133 -0
- package/src/routes/secret-ref.ts +52 -0
- package/src/routes/secrets.ts +975 -0
- package/src/routes/signing-keys.ts +259 -0
- package/src/routes/sse.ts +148 -0
- package/src/routes/teams.ts +584 -0
- package/src/routes/tenant.ts +530 -0
- package/src/routes/tokens.ts +285 -0
- package/src/routes/tools.ts +491 -0
- package/src/routes/webhook-endpoints.ts +534 -0
- package/src/routes/webhooks.ts +296 -0
- package/src/s3-credential-binding.ts +58 -0
- package/src/secrets-binding.ts +308 -0
- package/src/secrets-provider-binding.ts +167 -0
- package/src/session-store-binding.ts +163 -0
- package/src/signing-key-binding.ts +235 -0
- package/src/state-store-binding.ts +84 -0
- package/src/supervisor-binding.ts +554 -0
- package/src/tenant-host-access.ts +62 -0
- package/src/token-admin.ts +104 -0
- package/src/tool-binding.ts +274 -0
- package/src/trigger-binding.ts +38 -0
- package/src/types.ts +74 -0
- package/src/webhook-endpoint-binding.ts +246 -0
- package/src/xml.ts +196 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
import { Hono } from 'hono';
|
|
4
|
+
import { statusFor, toWireError } from '../errors.js';
|
|
5
|
+
import { clampLimit } from './pagination.js';
|
|
6
|
+
/**
|
|
7
|
+
* Schedules — cron-kind triggers.
|
|
8
|
+
*
|
|
9
|
+
* Seven routes, all soft-delete-shaped per framework convention:
|
|
10
|
+
* - POST /v1/schedules (register)
|
|
11
|
+
* - GET /v1/schedules (list, cursor-paginated)
|
|
12
|
+
* - GET /v1/schedules/:triggerId (get)
|
|
13
|
+
* - PATCH /v1/schedules/:triggerId (update cron/label/flowVersion)
|
|
14
|
+
* - POST /v1/schedules/:triggerId/pause
|
|
15
|
+
* - POST /v1/schedules/:triggerId/resume
|
|
16
|
+
* - POST /v1/schedules/:triggerId/unregister (tombstone — GC per policy)
|
|
17
|
+
*
|
|
18
|
+
* The `triggerId` URL param is the trigger's id; the response body
|
|
19
|
+
* aliases it as `scheduleId` for a friendlier client surface.
|
|
20
|
+
*/
|
|
21
|
+
export function schedulesRouter(binding) {
|
|
22
|
+
const r = new Hono();
|
|
23
|
+
// ---------- POST / (register) ----------
|
|
24
|
+
r.post('/', async (c) => {
|
|
25
|
+
const requestId = c.get('requestId');
|
|
26
|
+
const tenantId = c.get('tenantId');
|
|
27
|
+
const parsed = await parseJsonObject(c, requestId);
|
|
28
|
+
if (parsed.kind === 'err')
|
|
29
|
+
return parsed.response;
|
|
30
|
+
const body = parsed.value;
|
|
31
|
+
const flowId = requireString(body, 'flowId');
|
|
32
|
+
const flowVersion = requireString(body, 'flowVersion');
|
|
33
|
+
const cronExpression = requireString(body.config, 'config.cronExpression');
|
|
34
|
+
if (flowId.kind === 'err')
|
|
35
|
+
return bad(c, requestId, flowId.message);
|
|
36
|
+
if (flowVersion.kind === 'err')
|
|
37
|
+
return bad(c, requestId, flowVersion.message);
|
|
38
|
+
if (cronExpression.kind === 'err')
|
|
39
|
+
return bad(c, requestId, cronExpression.message);
|
|
40
|
+
const rawConfig = (body.config ?? {});
|
|
41
|
+
const registerInput = {
|
|
42
|
+
kind: 'cron',
|
|
43
|
+
tenantId,
|
|
44
|
+
flowId: flowId.value,
|
|
45
|
+
flowVersion: flowVersion.value,
|
|
46
|
+
config: {
|
|
47
|
+
cronExpression: cronExpression.value,
|
|
48
|
+
...(typeof rawConfig.timezone === 'string' && { timezone: rawConfig.timezone }),
|
|
49
|
+
...('input' in rawConfig && { input: rawConfig.input }),
|
|
50
|
+
},
|
|
51
|
+
...(typeof body.label === 'string' && body.label.length > 0 && { label: body.label }),
|
|
52
|
+
};
|
|
53
|
+
const result = await binding.register(registerInput);
|
|
54
|
+
if (result.kind === 'err') {
|
|
55
|
+
c.status(statusFor(result.error.code));
|
|
56
|
+
return c.json(toWireError({ code: result.error.code, message: result.error.message }, requestId));
|
|
57
|
+
}
|
|
58
|
+
c.status(201);
|
|
59
|
+
return c.json(serializeSchedule(result.value));
|
|
60
|
+
});
|
|
61
|
+
// ---------- GET / (list) ----------
|
|
62
|
+
r.get('/', async (c) => {
|
|
63
|
+
const tenantId = c.get('tenantId');
|
|
64
|
+
const limit = clampLimit(c.req.query('limit'));
|
|
65
|
+
const cursorRaw = c.req.query('cursor');
|
|
66
|
+
const statusRaw = c.req.query('status');
|
|
67
|
+
let statusFilter;
|
|
68
|
+
if (statusRaw === 'active' || statusRaw === 'paused')
|
|
69
|
+
statusFilter = statusRaw;
|
|
70
|
+
const page = await binding.list({
|
|
71
|
+
tenantId,
|
|
72
|
+
kind: 'cron',
|
|
73
|
+
limit,
|
|
74
|
+
...(cursorRaw !== undefined && cursorRaw.length > 0 && { cursor: cursorRaw }),
|
|
75
|
+
...(statusFilter !== undefined && { status: statusFilter }),
|
|
76
|
+
});
|
|
77
|
+
return c.json({
|
|
78
|
+
data: page.data.map((row) => serializeSchedule(row)),
|
|
79
|
+
hasMore: page.nextCursor !== undefined,
|
|
80
|
+
...(page.nextCursor !== undefined && { nextCursor: page.nextCursor }),
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
// ---------- GET /:triggerId (get) ----------
|
|
84
|
+
r.get('/:triggerId', async (c) => {
|
|
85
|
+
const requestId = c.get('requestId');
|
|
86
|
+
const tenantId = c.get('tenantId');
|
|
87
|
+
const triggerId = c.req.param('triggerId');
|
|
88
|
+
const rec = await binding.get({ tenantId, triggerId });
|
|
89
|
+
if (rec === null || rec.kind !== 'cron')
|
|
90
|
+
return notFound(c, requestId, triggerId);
|
|
91
|
+
return c.json(serializeSchedule(rec));
|
|
92
|
+
});
|
|
93
|
+
// ---------- PATCH /:triggerId (update) ----------
|
|
94
|
+
r.patch('/:triggerId', async (c) => {
|
|
95
|
+
const requestId = c.get('requestId');
|
|
96
|
+
const tenantId = c.get('tenantId');
|
|
97
|
+
const triggerId = c.req.param('triggerId');
|
|
98
|
+
const parsed = await parseJsonObject(c, requestId);
|
|
99
|
+
if (parsed.kind === 'err')
|
|
100
|
+
return parsed.response;
|
|
101
|
+
const body = parsed.value;
|
|
102
|
+
const patchConfig = body.config;
|
|
103
|
+
const cfg = {};
|
|
104
|
+
if (patchConfig !== undefined) {
|
|
105
|
+
if (typeof patchConfig.cronExpression === 'string')
|
|
106
|
+
cfg.cronExpression = patchConfig.cronExpression;
|
|
107
|
+
if (typeof patchConfig.timezone === 'string')
|
|
108
|
+
cfg.timezone = patchConfig.timezone;
|
|
109
|
+
if ('input' in patchConfig)
|
|
110
|
+
cfg.input = patchConfig.input;
|
|
111
|
+
}
|
|
112
|
+
const updateInput = {
|
|
113
|
+
kind: 'cron',
|
|
114
|
+
tenantId,
|
|
115
|
+
triggerId,
|
|
116
|
+
...(Object.keys(cfg).length > 0 && { config: cfg }),
|
|
117
|
+
...('label' in body && { label: body.label === null ? null : body.label }),
|
|
118
|
+
...(typeof body.flowVersion === 'string' && { flowVersion: body.flowVersion }),
|
|
119
|
+
};
|
|
120
|
+
const result = await binding.update(updateInput);
|
|
121
|
+
if (result.kind === 'err') {
|
|
122
|
+
c.status(statusFor(result.error.code));
|
|
123
|
+
return c.json(toWireError({
|
|
124
|
+
code: result.error.code,
|
|
125
|
+
message: result.error.message,
|
|
126
|
+
triggerId: triggerId,
|
|
127
|
+
}, requestId));
|
|
128
|
+
}
|
|
129
|
+
return c.json(serializeSchedule(result.value));
|
|
130
|
+
});
|
|
131
|
+
// ---------- POST /:triggerId/pause ----------
|
|
132
|
+
r.post('/:triggerId/pause', async (c) => {
|
|
133
|
+
const requestId = c.get('requestId');
|
|
134
|
+
const tenantId = c.get('tenantId');
|
|
135
|
+
const triggerId = c.req.param('triggerId');
|
|
136
|
+
const result = await binding.pause({ tenantId, triggerId });
|
|
137
|
+
if (result.kind === 'err')
|
|
138
|
+
return lifecycleError(c, requestId, result.error, triggerId);
|
|
139
|
+
return c.json(serializeSchedule(result.value));
|
|
140
|
+
});
|
|
141
|
+
// ---------- POST /:triggerId/resume ----------
|
|
142
|
+
r.post('/:triggerId/resume', async (c) => {
|
|
143
|
+
const requestId = c.get('requestId');
|
|
144
|
+
const tenantId = c.get('tenantId');
|
|
145
|
+
const triggerId = c.req.param('triggerId');
|
|
146
|
+
const result = await binding.resume({ tenantId, triggerId });
|
|
147
|
+
if (result.kind === 'err')
|
|
148
|
+
return lifecycleError(c, requestId, result.error, triggerId);
|
|
149
|
+
return c.json(serializeSchedule(result.value));
|
|
150
|
+
});
|
|
151
|
+
// ---------- POST /:triggerId/unregister (soft delete) ----------
|
|
152
|
+
r.post('/:triggerId/unregister', async (c) => {
|
|
153
|
+
const tenantId = c.get('tenantId');
|
|
154
|
+
const triggerId = c.req.param('triggerId');
|
|
155
|
+
const outcome = await binding.unregister({ tenantId, triggerId });
|
|
156
|
+
return c.json({
|
|
157
|
+
scheduleId: triggerId,
|
|
158
|
+
unregistered: outcome.unregistered,
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
return r;
|
|
162
|
+
}
|
|
163
|
+
// -----------------------------------------------------------------------
|
|
164
|
+
// Shared helpers (co-located to keep each router self-contained).
|
|
165
|
+
// -----------------------------------------------------------------------
|
|
166
|
+
function serializeSchedule(r) {
|
|
167
|
+
return {
|
|
168
|
+
scheduleId: r.triggerId,
|
|
169
|
+
triggerId: r.triggerId,
|
|
170
|
+
flowId: r.flowId,
|
|
171
|
+
flowVersion: r.flowVersion,
|
|
172
|
+
cronExpression: r.config.cronExpression,
|
|
173
|
+
...(r.config.timezone !== undefined && { timezone: r.config.timezone }),
|
|
174
|
+
...(r.config.input !== undefined && { input: r.config.input }),
|
|
175
|
+
label: r.label,
|
|
176
|
+
status: r.status,
|
|
177
|
+
nextFireAt: r.nextFireAt,
|
|
178
|
+
lastFiredAt: r.lastFiredAt,
|
|
179
|
+
createdAt: r.createdAt,
|
|
180
|
+
updatedAt: r.updatedAt,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async function parseJsonObject(c, requestId) {
|
|
184
|
+
let body;
|
|
185
|
+
try {
|
|
186
|
+
body = await c.req.json();
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
c.status(statusFor('bad-input'));
|
|
190
|
+
return {
|
|
191
|
+
kind: 'err',
|
|
192
|
+
response: c.json(toWireError({ code: 'bad-input', message: 'Request body must be valid JSON' }, requestId)),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
if (body === null || typeof body !== 'object' || Array.isArray(body)) {
|
|
196
|
+
c.status(statusFor('bad-input'));
|
|
197
|
+
return {
|
|
198
|
+
kind: 'err',
|
|
199
|
+
response: c.json(toWireError({ code: 'bad-input', message: 'Request body must be a JSON object' }, requestId)),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
return { kind: 'ok', value: body };
|
|
203
|
+
}
|
|
204
|
+
function requireString(obj, path) {
|
|
205
|
+
const parts = path.split('.');
|
|
206
|
+
let cur = obj;
|
|
207
|
+
for (const part of parts) {
|
|
208
|
+
if (cur === null || typeof cur !== 'object') {
|
|
209
|
+
return { kind: 'err', message: `\`${path}\` is required` };
|
|
210
|
+
}
|
|
211
|
+
cur = cur[part];
|
|
212
|
+
}
|
|
213
|
+
if (typeof cur !== 'string' || cur.length === 0) {
|
|
214
|
+
return { kind: 'err', message: `\`${path}\` is required` };
|
|
215
|
+
}
|
|
216
|
+
return { kind: 'ok', value: cur };
|
|
217
|
+
}
|
|
218
|
+
function bad(c, requestId, message) {
|
|
219
|
+
c.status(statusFor('bad-input'));
|
|
220
|
+
return c.json(toWireError({ code: 'bad-input', message }, requestId));
|
|
221
|
+
}
|
|
222
|
+
function notFound(c, requestId, triggerId) {
|
|
223
|
+
c.status(statusFor('trigger-not-found'));
|
|
224
|
+
return c.json(toWireError({
|
|
225
|
+
code: 'trigger-not-found',
|
|
226
|
+
message: `No trigger with id "${triggerId}"`,
|
|
227
|
+
triggerId: triggerId,
|
|
228
|
+
}, requestId));
|
|
229
|
+
}
|
|
230
|
+
function lifecycleError(c, requestId, error, triggerId) {
|
|
231
|
+
c.status(statusFor(error.code));
|
|
232
|
+
return c.json(toWireError({ code: error.code, message: error.message, triggerId: triggerId }, requestId));
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=schedules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedules.js","sourceRoot":"","sources":["../../src/routes/schedules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type ResourceRef } from '@kindgi/authz';
|
|
2
|
+
import type { Scope } from '@kindgi/platform';
|
|
3
|
+
import type { TenantId } from '@kindgi/types';
|
|
4
|
+
/**
|
|
5
|
+
* The authorization resource for a request scope: the project or org it
|
|
6
|
+
* names, else the tenant. A route's authorization middleware derives the
|
|
7
|
+
* scope with the same parser as its handler and passes the result here, so
|
|
8
|
+
* the scope that is checked is the scope that is acted on. An absent or
|
|
9
|
+
* unparseable scope checks the tenant, the strictest resource; the handler
|
|
10
|
+
* then rejects the request.
|
|
11
|
+
*/
|
|
12
|
+
export declare function scopeResourceRef(scope: Scope | undefined, tenantId: TenantId): ResourceRef;
|
|
13
|
+
/** {@link scopeResourceRef} for the `?scopeKind` + `?scopeId` query parameters. */
|
|
14
|
+
export declare function queryScopeResourceRef(query: QuerySource, session: {
|
|
15
|
+
readonly tenantId: TenantId;
|
|
16
|
+
}): ResourceRef;
|
|
17
|
+
/**
|
|
18
|
+
* Outcome of parsing the `?scopeKind + ?scopeId + ?inherit` triplet.
|
|
19
|
+
* `ok` carries the decoded `Scope` (undefined if no scope params were
|
|
20
|
+
* supplied) plus the parsed `inherit` boolean (undefined if elided —
|
|
21
|
+
* caller leaves the binding to apply its own default).
|
|
22
|
+
*/
|
|
23
|
+
export type ParseScopeParamsOutcome = {
|
|
24
|
+
readonly kind: 'ok';
|
|
25
|
+
readonly scope?: Scope;
|
|
26
|
+
readonly inherit?: boolean;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: 'err';
|
|
29
|
+
readonly message: string;
|
|
30
|
+
};
|
|
31
|
+
type QuerySource = Record<string, string> | ((name: string) => string | undefined);
|
|
32
|
+
/**
|
|
33
|
+
* Parse the `?scopeKind + ?scopeId + ?inherit` triplet. The wire shape
|
|
34
|
+
* is a discriminated triplet by design — human-readable, curl / browser
|
|
35
|
+
* / access-log auditable for regulated verticals.
|
|
36
|
+
*
|
|
37
|
+
* Cross-field validation (all return 400 `scope-invalid`):
|
|
38
|
+
* - `scopeKind === 'tenant' && scopeId !== undefined` → err (tenant carries no id).
|
|
39
|
+
* - `scopeKind in {'org','project'} && scopeId === undefined` → err (missing id).
|
|
40
|
+
* - `scopeKind === undefined && scopeId !== undefined` → err (orphan id).
|
|
41
|
+
* - `inherit` — accepts literal 'true' / 'false' strings; anything else → err.
|
|
42
|
+
*
|
|
43
|
+
* `tenantId` for the decoded Scope always comes from the session —
|
|
44
|
+
* cross-tenant scopes are denied by policy.
|
|
45
|
+
*
|
|
46
|
+
* `inherit` is load-bearing for policy/config-scoped bindings
|
|
47
|
+
* (e.g. MCP endpoints, secrets, env values) — controls the
|
|
48
|
+
* upward-hierarchy walk. For content-scoped bindings the flag is a
|
|
49
|
+
* documented no-op; the route passes it through so the binding-side
|
|
50
|
+
* field-passthrough shape stays uniform across the scope-aware
|
|
51
|
+
* bindings.
|
|
52
|
+
*/
|
|
53
|
+
export declare function parseScopeParams(query: QuerySource, session: {
|
|
54
|
+
readonly tenantId: TenantId;
|
|
55
|
+
}): ParseScopeParamsOutcome;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=scope-params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-params.d.ts","sourceRoot":"","sources":["../../src/routes/scope-params.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAO,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAoB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEhE;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAI1F;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GACvC,WAAW,CAGb;AAED;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;AAEnF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GACvC,uBAAuB,CAkEzB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
import { ref } from '@kindgi/authz';
|
|
4
|
+
/**
|
|
5
|
+
* The authorization resource for a request scope: the project or org it
|
|
6
|
+
* names, else the tenant. A route's authorization middleware derives the
|
|
7
|
+
* scope with the same parser as its handler and passes the result here, so
|
|
8
|
+
* the scope that is checked is the scope that is acted on. An absent or
|
|
9
|
+
* unparseable scope checks the tenant, the strictest resource; the handler
|
|
10
|
+
* then rejects the request.
|
|
11
|
+
*/
|
|
12
|
+
export function scopeResourceRef(scope, tenantId) {
|
|
13
|
+
if (scope?.kind === 'project')
|
|
14
|
+
return ref('project', scope.projectId);
|
|
15
|
+
if (scope?.kind === 'org')
|
|
16
|
+
return ref('org', scope.orgId);
|
|
17
|
+
return ref('tenant', tenantId);
|
|
18
|
+
}
|
|
19
|
+
/** {@link scopeResourceRef} for the `?scopeKind` + `?scopeId` query parameters. */
|
|
20
|
+
export function queryScopeResourceRef(query, session) {
|
|
21
|
+
const parsed = parseScopeParams(query, session);
|
|
22
|
+
return scopeResourceRef(parsed.kind === 'ok' ? parsed.scope : undefined, session.tenantId);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse the `?scopeKind + ?scopeId + ?inherit` triplet. The wire shape
|
|
26
|
+
* is a discriminated triplet by design — human-readable, curl / browser
|
|
27
|
+
* / access-log auditable for regulated verticals.
|
|
28
|
+
*
|
|
29
|
+
* Cross-field validation (all return 400 `scope-invalid`):
|
|
30
|
+
* - `scopeKind === 'tenant' && scopeId !== undefined` → err (tenant carries no id).
|
|
31
|
+
* - `scopeKind in {'org','project'} && scopeId === undefined` → err (missing id).
|
|
32
|
+
* - `scopeKind === undefined && scopeId !== undefined` → err (orphan id).
|
|
33
|
+
* - `inherit` — accepts literal 'true' / 'false' strings; anything else → err.
|
|
34
|
+
*
|
|
35
|
+
* `tenantId` for the decoded Scope always comes from the session —
|
|
36
|
+
* cross-tenant scopes are denied by policy.
|
|
37
|
+
*
|
|
38
|
+
* `inherit` is load-bearing for policy/config-scoped bindings
|
|
39
|
+
* (e.g. MCP endpoints, secrets, env values) — controls the
|
|
40
|
+
* upward-hierarchy walk. For content-scoped bindings the flag is a
|
|
41
|
+
* documented no-op; the route passes it through so the binding-side
|
|
42
|
+
* field-passthrough shape stays uniform across the scope-aware
|
|
43
|
+
* bindings.
|
|
44
|
+
*/
|
|
45
|
+
export function parseScopeParams(query, session) {
|
|
46
|
+
const get = typeof query === 'function' ? query : (n) => query[n];
|
|
47
|
+
const scopeKindRaw = get('scopeKind');
|
|
48
|
+
const scopeIdRaw = get('scopeId');
|
|
49
|
+
const inheritRaw = get('inherit');
|
|
50
|
+
// ---- inherit ----
|
|
51
|
+
let inherit;
|
|
52
|
+
if (inheritRaw !== undefined && inheritRaw.length > 0) {
|
|
53
|
+
if (inheritRaw === 'true')
|
|
54
|
+
inherit = true;
|
|
55
|
+
else if (inheritRaw === 'false')
|
|
56
|
+
inherit = false;
|
|
57
|
+
else {
|
|
58
|
+
return {
|
|
59
|
+
kind: 'err',
|
|
60
|
+
message: `scope query parameters malformed: inherit must be 'true' or 'false', got "${inheritRaw}"`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// ---- scope triplet ----
|
|
65
|
+
if (scopeKindRaw === undefined || scopeKindRaw.length === 0) {
|
|
66
|
+
if (scopeIdRaw !== undefined && scopeIdRaw.length > 0) {
|
|
67
|
+
return {
|
|
68
|
+
kind: 'err',
|
|
69
|
+
message: `scope query parameters malformed: scopeId="${scopeIdRaw}" requires scopeKind`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return { kind: 'ok', ...(inherit !== undefined && { inherit }) };
|
|
73
|
+
}
|
|
74
|
+
if (scopeKindRaw !== 'tenant' && scopeKindRaw !== 'org' && scopeKindRaw !== 'project') {
|
|
75
|
+
return {
|
|
76
|
+
kind: 'err',
|
|
77
|
+
message: `scope query parameters malformed: scopeKind must be one of 'tenant' | 'org' | 'project', got "${scopeKindRaw}"`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (scopeKindRaw === 'tenant') {
|
|
81
|
+
if (scopeIdRaw !== undefined && scopeIdRaw.length > 0) {
|
|
82
|
+
return {
|
|
83
|
+
kind: 'err',
|
|
84
|
+
message: `scope query parameters malformed: scopeKind='tenant' takes no scopeId (tenant is implicit from the session)`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
kind: 'ok',
|
|
89
|
+
scope: { kind: 'tenant', tenantId: session.tenantId },
|
|
90
|
+
...(inherit !== undefined && { inherit }),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// 'org' | 'project' — both require scopeId
|
|
94
|
+
if (scopeIdRaw === undefined || scopeIdRaw.length === 0) {
|
|
95
|
+
return {
|
|
96
|
+
kind: 'err',
|
|
97
|
+
message: `scope query parameters malformed: scopeKind='${scopeKindRaw}' requires scopeId`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const scope = scopeKindRaw === 'org'
|
|
101
|
+
? { kind: 'org', tenantId: session.tenantId, orgId: scopeIdRaw }
|
|
102
|
+
: { kind: 'project', tenantId: session.tenantId, projectId: scopeIdRaw };
|
|
103
|
+
return { kind: 'ok', scope, ...(inherit !== undefined && { inherit }) };
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=scope-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-params.js","sourceRoot":"","sources":["../../src/routes/scope-params.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type EnvName } from '@kindgi/types';
|
|
2
|
+
/** The longest secret name a `secretRef` can carry. */
|
|
3
|
+
export declare const MAX_SECRET_NAME_LENGTH = 256;
|
|
4
|
+
/**
|
|
5
|
+
* `{ envName, name }`: a secret by name in the deployment's secrets
|
|
6
|
+
* store, resolved at the owner's scope. The shape webhooks, MCP
|
|
7
|
+
* endpoints and providers share. `field` names it in messages.
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseSecretRef(raw: unknown, field?: string): {
|
|
10
|
+
readonly kind: 'ok';
|
|
11
|
+
readonly value: {
|
|
12
|
+
readonly envName: EnvName;
|
|
13
|
+
readonly name: string;
|
|
14
|
+
};
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: 'err';
|
|
17
|
+
readonly message: string;
|
|
18
|
+
readonly unknownField?: string;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=secret-ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-ref.d.ts","sourceRoot":"","sources":["../../src/routes/secret-ref.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAe,MAAM,eAAe,CAAC;AAE1D,uDAAuD;AACvD,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAI1C;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,KAAK,SAAc,GAEjB;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC7F;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CA+BrF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
import { makeEnvName } from '@kindgi/types';
|
|
4
|
+
/** The longest secret name a `secretRef` can carry. */
|
|
5
|
+
export const MAX_SECRET_NAME_LENGTH = 256;
|
|
6
|
+
const SECRET_REF_FIELDS = new Set(['envName', 'name']);
|
|
7
|
+
/**
|
|
8
|
+
* `{ envName, name }`: a secret by name in the deployment's secrets
|
|
9
|
+
* store, resolved at the owner's scope. The shape webhooks, MCP
|
|
10
|
+
* endpoints and providers share. `field` names it in messages.
|
|
11
|
+
*/
|
|
12
|
+
export function parseSecretRef(raw, field = 'secretRef') {
|
|
13
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
14
|
+
return { kind: 'err', message: `\`${field}\` must be an object \`{ envName, name }\`` };
|
|
15
|
+
}
|
|
16
|
+
const ref = raw;
|
|
17
|
+
const unknown = Object.keys(ref).find((key) => !SECRET_REF_FIELDS.has(key));
|
|
18
|
+
if (unknown !== undefined) {
|
|
19
|
+
return {
|
|
20
|
+
kind: 'err',
|
|
21
|
+
message: `Unknown field \`${field}.${unknown}\``,
|
|
22
|
+
unknownField: `${field}.${unknown}`,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const envName = typeof ref.envName === 'string' ? makeEnvName(ref.envName) : null;
|
|
26
|
+
if (envName === null) {
|
|
27
|
+
return {
|
|
28
|
+
kind: 'err',
|
|
29
|
+
message: `\`${field}.envName\` must be a lowercase name (letters, digits, hyphens)`,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (typeof ref.name !== 'string' ||
|
|
33
|
+
ref.name.length === 0 ||
|
|
34
|
+
ref.name.length > MAX_SECRET_NAME_LENGTH) {
|
|
35
|
+
return {
|
|
36
|
+
kind: 'err',
|
|
37
|
+
message: `\`${field}.name\` must be a non-empty string of at most ${MAX_SECRET_NAME_LENGTH} characters`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return { kind: 'ok', value: { envName, name: ref.name } };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=secret-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-ref.js","sourceRoot":"","sources":["../../src/routes/secret-ref.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,EAAgB,WAAW,EAAE,MAAM,eAAe,CAAC;AAE1D,uDAAuD;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAY,EACZ,KAAK,GAAG,WAAW;IAInB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,KAAK,4CAA4C,EAAE,CAAC;IAC1F,CAAC;IACD,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,mBAAmB,KAAK,IAAI,OAAO,IAAI;YAChD,YAAY,EAAE,GAAG,KAAK,IAAI,OAAO,EAAE;SACpC,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO;YACL,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,KAAK,KAAK,gEAAgE;SACpF,CAAC;IACJ,CAAC;IACD,IACE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QACrB,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,sBAAsB,EACxC,CAAC;QACD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,KAAK,KAAK,iDAAiD,sBAAsB,aAAa;SACxG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import type { Authorizer } from '../middleware/authorize.js';
|
|
3
|
+
import type { RotationStatusStore } from '../rotation-status-store.js';
|
|
4
|
+
import type { SecretBinding } from '../secrets-binding.js';
|
|
5
|
+
import type { AppEnv } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* `/v1/secrets/*` — HTTP surface for `SecretBinding`. Nine endpoints
|
|
8
|
+
* covering the full
|
|
9
|
+
* lifecycle: list / get / set / rotate (sync + async) / rotation-status
|
|
10
|
+
* poll / rotation-status SSE / revoke / version list / version get.
|
|
11
|
+
*
|
|
12
|
+
* Wire-safety:
|
|
13
|
+
* - `value` NEVER returns from list / get / getVersion / listVersions.
|
|
14
|
+
* - Within `/v1/secrets`, plaintext is accepted only by `POST /`
|
|
15
|
+
* (`value`, `secrets:write` capability) and `POST /:name/rotate`
|
|
16
|
+
* (optional `newValue`, `secrets:rotate` capability).
|
|
17
|
+
* - Async rotation returns 202 with `{ rotationId, statusUrl,
|
|
18
|
+
* eventsUrl }`; sync rotation returns 201 with the outcome inline.
|
|
19
|
+
*
|
|
20
|
+
* Capability gates:
|
|
21
|
+
* - `secrets:write` → POST /
|
|
22
|
+
* - `secrets:rotate` → POST /:name/rotate
|
|
23
|
+
* - `secrets:revoke` → DELETE /:name (soft)
|
|
24
|
+
* - `secrets:revoke:hard` → DELETE /:name?hard=true
|
|
25
|
+
* - `secrets:reveal` → not used by these routes; there is no HTTP
|
|
26
|
+
* `resolve` path.
|
|
27
|
+
*
|
|
28
|
+
* SSE:
|
|
29
|
+
* - `GET /:name/rotations/:rotationId/events` streams
|
|
30
|
+
* `event: rotation-update\ndata: <json>\n\n` frames on each status
|
|
31
|
+
* change. An `event: ping` heartbeat (empty data) every 15s keeps
|
|
32
|
+
* proxies from timing the stream out; the stream closes on terminal
|
|
33
|
+
* state.
|
|
34
|
+
*/
|
|
35
|
+
export interface SecretsRouterOptions {
|
|
36
|
+
readonly secretsBinding: SecretBinding;
|
|
37
|
+
readonly rotationStatusStore: RotationStatusStore;
|
|
38
|
+
/**
|
|
39
|
+
* Overrideable SSE heartbeat interval. Default 15_000 ms; tests
|
|
40
|
+
* pass a low value to keep suites fast.
|
|
41
|
+
*/
|
|
42
|
+
readonly sseHeartbeatMs?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Optional fine-grained authorizer. When present, gates every route
|
|
45
|
+
* on `admin` on the request's `scope` (query for GET/DELETE, body for
|
|
46
|
+
* create, body or query for rotate). Reads are STRICT: strict-read means `admin from scope`
|
|
47
|
+
* or explicit `reader` grant — cascade via the scope tuple written
|
|
48
|
+
* by `secretsBinding.set` on fresh create.
|
|
49
|
+
*/
|
|
50
|
+
readonly authorizer?: Authorizer;
|
|
51
|
+
}
|
|
52
|
+
export declare function secretsRouter(options: SecretsRouterOptions): Hono<AppEnv>;
|
|
53
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/routes/secrets.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAkB,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,KAAK,EACV,aAAa,EAId,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAK1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC;IACvC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,CA4uBzE"}
|