@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,209 @@
|
|
|
1
|
+
import type { Fact, MemoryScope, Retention } from '@kindgi/memory';
|
|
2
|
+
import type { Scope as PlatformScope } from '@kindgi/platform';
|
|
3
|
+
import type { Cursor, FactId, TenantId } from '@kindgi/types';
|
|
4
|
+
/**
|
|
5
|
+
* Caller-plugged surface for the memory resource. Same shape as
|
|
6
|
+
* `AgentRegistryBinding` / `ToolRegistryBinding` / `GuardrailRegistryBinding`:
|
|
7
|
+
* the API package does NOT own memory persistence or retrieval logic.
|
|
8
|
+
* Deployments plug in a binding that wraps the memory subsystem (the
|
|
9
|
+
* Kindgi runtime provides one) together with their own
|
|
10
|
+
* `EmbeddingProviderRegistry` and per-type retrieval policies.
|
|
11
|
+
*
|
|
12
|
+
* Every method is tenant-scoped: callers pass `tenantId` explicitly so
|
|
13
|
+
* multi-tenant deployments can partition storage without exposing the
|
|
14
|
+
* scoping inside the API package.
|
|
15
|
+
*
|
|
16
|
+
* Cursors are opaque — the binding chooses its encoding (page number,
|
|
17
|
+
* ISO timestamp, `id@version`, whatever). The API layer only validates
|
|
18
|
+
* that a cursor round-trips as a string; it never inspects the payload.
|
|
19
|
+
*
|
|
20
|
+
* Supersession, not delete: facts are append-only. `supersedeFact`
|
|
21
|
+
* writes a new revision that supersedes the target; the historical row
|
|
22
|
+
* remains readable until retention sweeps it. There is no hard delete;
|
|
23
|
+
* the retention sweep handles physical removal.
|
|
24
|
+
*/
|
|
25
|
+
export interface MemoryBinding {
|
|
26
|
+
/**
|
|
27
|
+
* Cursor-paginated list of facts under the tenant. Filters:
|
|
28
|
+
* - `type` — exact fact-type match.
|
|
29
|
+
* - `scope` — partial-match filter (see `Scope` in the memory subsystem).
|
|
30
|
+
*
|
|
31
|
+
* Sort order is binding-defined — for example, the latest version
|
|
32
|
+
* per `(type, id)` sorted by `createdAt desc`.
|
|
33
|
+
*/
|
|
34
|
+
listFacts(input: MemoryListFactsInput): Promise<MemoryFactPage>;
|
|
35
|
+
/**
|
|
36
|
+
* The fact with the given id, or `null` if unknown. Latest version
|
|
37
|
+
* by default; bindings MAY accept a `version` in the input to select
|
|
38
|
+
* a specific historical revision (not exposed on the route today).
|
|
39
|
+
* The route surfaces `null` as `404 fact-not-found`.
|
|
40
|
+
*/
|
|
41
|
+
getFact(input: MemoryGetFactInput): Promise<Fact | null>;
|
|
42
|
+
/**
|
|
43
|
+
* Persist a new fact. The binding validates the write against its
|
|
44
|
+
* retrieval-policy registry (populates keyword / semantic indexes
|
|
45
|
+
* per type) and its embedding registry (for semantic-indexed types).
|
|
46
|
+
*
|
|
47
|
+
* When the fact type declares semantic indexing but no embedding
|
|
48
|
+
* provider is bound, the binding MUST return an `err` result — the
|
|
49
|
+
* route maps that to `400 bad-input`.
|
|
50
|
+
*/
|
|
51
|
+
writeFact(input: MemoryWriteFactInput): Promise<MemoryWriteFactOutcome>;
|
|
52
|
+
/**
|
|
53
|
+
* Mark a fact as superseded. The binding writes a superseding
|
|
54
|
+
* revision (or flags the row, depending on its runtime semantics).
|
|
55
|
+
* Idempotent — superseding an already-superseded fact returns
|
|
56
|
+
* `{ superseded: true }` without error. When the fact id is unknown,
|
|
57
|
+
* returns `{ superseded: false }` and the route flips that to `404`.
|
|
58
|
+
*/
|
|
59
|
+
supersedeFact(input: MemorySupersedeFactInput): Promise<MemorySupersedeFactOutcome>;
|
|
60
|
+
/**
|
|
61
|
+
* Cross-history retrieval. The `intent` mirrors the shape agents use
|
|
62
|
+
* for declarative retrieval (`packages/agents/src/retrieval.ts`):
|
|
63
|
+
*
|
|
64
|
+
* - `mode: 'list'` — plain scoped list, no query needed.
|
|
65
|
+
* - `mode: 'keyword'` — full-text keyword search.
|
|
66
|
+
* - `mode: 'semantic'` — vector cosine similarity. Requires an
|
|
67
|
+
* embedding registry in the binding; if absent, the binding
|
|
68
|
+
* MUST return `{ kind: 'embedding-unavailable' }` so the route
|
|
69
|
+
* can respond `400 bad-input`.
|
|
70
|
+
* - `mode: 'both'` — keyword + semantic union, dedup by fact id.
|
|
71
|
+
*
|
|
72
|
+
* Semantic modes MAY accept `embeddingModel` on the intent to select
|
|
73
|
+
* a specific registered provider; omit to fall back to the sole one.
|
|
74
|
+
*/
|
|
75
|
+
retrieve(input: MemoryRetrieveInput): Promise<MemoryRetrieveOutcome>;
|
|
76
|
+
}
|
|
77
|
+
export interface MemoryListFactsInput {
|
|
78
|
+
readonly tenantId: TenantId;
|
|
79
|
+
readonly limit: number;
|
|
80
|
+
readonly cursor?: Cursor;
|
|
81
|
+
/** Exact match on `Fact.type`. Undefined = no type filter. */
|
|
82
|
+
readonly type?: string;
|
|
83
|
+
/**
|
|
84
|
+
* Partial `MemoryScope` filter from the memory subsystem — the
|
|
85
|
+
* flat-struct memory scope (tenantId + optional userId / orgId /
|
|
86
|
+
* projectId / threadId / sessionId). Every provided key must match.
|
|
87
|
+
*/
|
|
88
|
+
readonly scope?: Partial<MemoryScope>;
|
|
89
|
+
/**
|
|
90
|
+
* Narrow the list to a specific scope using the platform-wide
|
|
91
|
+
* discriminated `Scope` primitive from `@kindgi/platform`.
|
|
92
|
+
* Absent = no scope narrow (return every row in the tenant the
|
|
93
|
+
* caller can see — admin/audit default).
|
|
94
|
+
*
|
|
95
|
+
* Content-scoped semantics (this binding — memory facts attribute
|
|
96
|
+
* to the project via `Scope.projectId`):
|
|
97
|
+
* - `{ kind: 'project', projectId }` — rows in that project.
|
|
98
|
+
* - `{ kind: 'org', orgId }` — rows in every project belonging to
|
|
99
|
+
* that org.
|
|
100
|
+
* - `{ kind: 'tenant', tenantId }` — every row in the tenant.
|
|
101
|
+
*
|
|
102
|
+
* Content rows always belong to a project, so `inherit` has no
|
|
103
|
+
* effect here.
|
|
104
|
+
*
|
|
105
|
+
* The `scope` field above and `platformScope` are additive filters —
|
|
106
|
+
* pass either, or both (AND-composed).
|
|
107
|
+
*/
|
|
108
|
+
readonly platformScope?: PlatformScope;
|
|
109
|
+
/**
|
|
110
|
+
* `false` = literal-at-this-scope only (admin/audit view).
|
|
111
|
+
* `true` (default) = inheritance walk (user-facing view).
|
|
112
|
+
* No-op for content-scoped bindings (rows only exist at
|
|
113
|
+
* project-level — there is no upward hierarchy to walk). Kept for
|
|
114
|
+
* uniformity: scope-aware bindings share one filter shape.
|
|
115
|
+
*/
|
|
116
|
+
readonly inherit?: boolean;
|
|
117
|
+
}
|
|
118
|
+
export interface MemoryFactPage {
|
|
119
|
+
readonly data: readonly Fact[];
|
|
120
|
+
readonly nextCursor?: Cursor;
|
|
121
|
+
}
|
|
122
|
+
export interface MemoryGetFactInput {
|
|
123
|
+
readonly tenantId: TenantId;
|
|
124
|
+
readonly factId: FactId;
|
|
125
|
+
}
|
|
126
|
+
export interface MemoryWriteFactInput {
|
|
127
|
+
/**
|
|
128
|
+
* The caller's tenant (from the token) — the tenant the fact is written
|
|
129
|
+
* to. The route rejects a `scope.tenantId` that differs from it, and an
|
|
130
|
+
* implementation must write under `tenantId`, never a tenant taken
|
|
131
|
+
* from `scope`.
|
|
132
|
+
*/
|
|
133
|
+
readonly tenantId: TenantId;
|
|
134
|
+
readonly type: string;
|
|
135
|
+
readonly scope: MemoryScope;
|
|
136
|
+
readonly content: unknown;
|
|
137
|
+
readonly retention?: Retention;
|
|
138
|
+
readonly contentHash?: string;
|
|
139
|
+
}
|
|
140
|
+
export type MemoryWriteFactOutcome = {
|
|
141
|
+
readonly kind: 'ok';
|
|
142
|
+
readonly fact: Fact;
|
|
143
|
+
} | {
|
|
144
|
+
/**
|
|
145
|
+
* The type declared semantic indexing but the binding has no
|
|
146
|
+
* embedding registry (or the registry resolves no provider).
|
|
147
|
+
* Route maps to `400 bad-input`.
|
|
148
|
+
*/
|
|
149
|
+
readonly kind: 'embedding-unavailable';
|
|
150
|
+
readonly message: string;
|
|
151
|
+
} | {
|
|
152
|
+
/** Any other write failure — persistence error, invalid content, etc. */
|
|
153
|
+
readonly kind: 'error';
|
|
154
|
+
readonly code: string;
|
|
155
|
+
readonly message: string;
|
|
156
|
+
};
|
|
157
|
+
export interface MemorySupersedeFactInput {
|
|
158
|
+
readonly tenantId: TenantId;
|
|
159
|
+
readonly factId: FactId;
|
|
160
|
+
}
|
|
161
|
+
export interface MemorySupersedeFactOutcome {
|
|
162
|
+
readonly superseded: boolean;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Retrieval intent shape used on the wire. Mirrors the agent-side
|
|
166
|
+
* `RetrievalIntent` in `packages/agents/src/types.ts` but widened to
|
|
167
|
+
* accept explicit filters + limits — the agent path derives filters
|
|
168
|
+
* from `Conversation` context, while the direct-HTTP path takes them
|
|
169
|
+
* verbatim from the request body.
|
|
170
|
+
*/
|
|
171
|
+
export interface MemoryRetrieveIntent {
|
|
172
|
+
readonly mode: 'list' | 'keyword' | 'semantic' | 'both';
|
|
173
|
+
/**
|
|
174
|
+
* Freeform text query. Required for `keyword` / `semantic` / `both`;
|
|
175
|
+
* ignored for `list`.
|
|
176
|
+
*/
|
|
177
|
+
readonly query?: string;
|
|
178
|
+
/**
|
|
179
|
+
* Fact type filter. Passed through to the binding as a single-type
|
|
180
|
+
* lookup; multi-type queries call `retrieve` per type today.
|
|
181
|
+
*/
|
|
182
|
+
readonly type?: string;
|
|
183
|
+
/** Partial scope predicate. */
|
|
184
|
+
readonly scope?: Partial<MemoryScope>;
|
|
185
|
+
readonly limit?: number;
|
|
186
|
+
/** Selects a specific embedding provider registered on the binding. */
|
|
187
|
+
readonly embeddingModel?: string;
|
|
188
|
+
}
|
|
189
|
+
export interface MemoryRetrieveInput {
|
|
190
|
+
readonly tenantId: TenantId;
|
|
191
|
+
readonly intent: MemoryRetrieveIntent;
|
|
192
|
+
}
|
|
193
|
+
export interface MemoryRetrievalHit {
|
|
194
|
+
readonly fact: Fact;
|
|
195
|
+
readonly score?: number;
|
|
196
|
+
}
|
|
197
|
+
export type MemoryRetrieveOutcome = {
|
|
198
|
+
readonly kind: 'ok';
|
|
199
|
+
readonly results: readonly MemoryRetrievalHit[];
|
|
200
|
+
} | {
|
|
201
|
+
/** Semantic mode requested but no embedding provider bound. */
|
|
202
|
+
readonly kind: 'embedding-unavailable';
|
|
203
|
+
readonly message: string;
|
|
204
|
+
} | {
|
|
205
|
+
readonly kind: 'error';
|
|
206
|
+
readonly code: string;
|
|
207
|
+
readonly message: string;
|
|
208
|
+
};
|
|
209
|
+
//# sourceMappingURL=memory-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-binding.d.ts","sourceRoot":"","sources":["../src/memory-binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-binding.js","sourceRoot":"","sources":["../src/memory-binding.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import type { ReviewerRole } from '@kindgi/authz';
|
|
3
|
+
import type { ApiTokenId, SessionId, TenantId, UserId } from '@kindgi/types';
|
|
4
|
+
import type { SigningKeyBinding } from '@kindgi/crypto';
|
|
5
|
+
import type { SessionStoreBinding } from '../session-store-binding.js';
|
|
6
|
+
/**
|
|
7
|
+
* Resolve an API token → tenant identity. For static bearer tokens this
|
|
8
|
+
* is a caller-injected function: the platform's actual token store (auth
|
|
9
|
+
* service, database, …) plugs in. Signature stays stable across
|
|
10
|
+
* implementations.
|
|
11
|
+
*
|
|
12
|
+
* Return `null` for missing / expired / revoked tokens; the middleware
|
|
13
|
+
* translates to 401 with a specific error code.
|
|
14
|
+
*/
|
|
15
|
+
export type TokenResolver = (token: string) => Promise<TokenResolution | null>;
|
|
16
|
+
export interface TokenResolution {
|
|
17
|
+
readonly tenantId: TenantId;
|
|
18
|
+
/**
|
|
19
|
+
* Optional expiration; if set and in the past, the middleware treats
|
|
20
|
+
* as expired even if the resolver returned a value.
|
|
21
|
+
*/
|
|
22
|
+
readonly expiresAt?: Date;
|
|
23
|
+
/** Optional revocation marker; `true` → 401 auth-revoked. */
|
|
24
|
+
readonly revoked?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Optional reviewer role granted to this token. When present, the
|
|
27
|
+
* middleware surfaces it as `c.get('reviewerRole')` and approvals
|
|
28
|
+
* routes gate visibility / decisions on the `standard < senior < admin`
|
|
29
|
+
* hierarchy. Absent for tokens that were never provisioned with a
|
|
30
|
+
* reviewer role — such tokens can still hit `/v1/runs` etc., but any
|
|
31
|
+
* approvals route returns `403 permission-denied`.
|
|
32
|
+
*/
|
|
33
|
+
readonly reviewerRole?: ReviewerRole;
|
|
34
|
+
/**
|
|
35
|
+
* Optional user identity behind the token. Approvals routes forward
|
|
36
|
+
* this to a `ReviewerBinding` to translate `UserId → ReviewerId`
|
|
37
|
+
* before calling `hitl.submitReview` (which needs the reviewer id).
|
|
38
|
+
*/
|
|
39
|
+
readonly userId?: UserId;
|
|
40
|
+
/**
|
|
41
|
+
* The id of a durable API key (`POST /v1/tokens`). The caller is then
|
|
42
|
+
* the key's service account (`service_account:<tokenId>`), not a user;
|
|
43
|
+
* the middleware surfaces it as `c.get('tokenId')`.
|
|
44
|
+
*/
|
|
45
|
+
readonly tokenId?: ApiTokenId;
|
|
46
|
+
/**
|
|
47
|
+
* Optional session id. Populated by the session-token verifier path
|
|
48
|
+
* (`kgi_sk_*` tokens) so `/v1/identity/whoami` and `/v1/auth/logout`
|
|
49
|
+
* can introspect / revoke the caller's own session without a second
|
|
50
|
+
* lookup. Absent for static bearer tokens.
|
|
51
|
+
*/
|
|
52
|
+
readonly sessionId?: SessionId;
|
|
53
|
+
/**
|
|
54
|
+
* Optional identity-provider id that authenticated the caller. Only
|
|
55
|
+
* populated by session-token verification.
|
|
56
|
+
*/
|
|
57
|
+
readonly providerId?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Optional OAuth scopes granted to the session. Only populated by
|
|
60
|
+
* session-token verification.
|
|
61
|
+
*/
|
|
62
|
+
readonly scopes?: readonly string[];
|
|
63
|
+
/**
|
|
64
|
+
* Optional last-observed-activity timestamp. Populated by
|
|
65
|
+
* `resolveSessionToken` when the session-store adapter carries
|
|
66
|
+
* `lastActiveAt` on the row. Used by the middleware to enforce the
|
|
67
|
+
* `inactivityTimeoutMs` policy. Absent → inactivity check is
|
|
68
|
+
* skipped.
|
|
69
|
+
*/
|
|
70
|
+
readonly lastActiveAt?: Date;
|
|
71
|
+
/**
|
|
72
|
+
* Optional flag set by `resolveSessionToken` when the session was
|
|
73
|
+
* revoked specifically via rotation (`POST /v1/auth/refresh`). The
|
|
74
|
+
* middleware maps this to `401 refresh-token-invalid` instead of
|
|
75
|
+
* the generic `401 auth-revoked`, matching OAuth 2.1 BCP refresh-
|
|
76
|
+
* token-reuse semantics.
|
|
77
|
+
*/
|
|
78
|
+
readonly rotated?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Optional framework capabilities granted to the bearer. Route
|
|
81
|
+
* handlers gate write / reveal ops on
|
|
82
|
+
* specific capability strings (`env:write`, `secrets:write`,
|
|
83
|
+
* `secrets:rotate`, `secrets:revoke`, `secrets:revoke:hard`,
|
|
84
|
+
* `secrets:reveal`, `kindgi:system`). Callers that plug their
|
|
85
|
+
* own resolver populate this list from their token store; deployments
|
|
86
|
+
* without capability data leave it absent — routes that require a
|
|
87
|
+
* capability then return 403 `permission-denied`.
|
|
88
|
+
*
|
|
89
|
+
* Kindgi's stance: fail-closed on writes when the capability is
|
|
90
|
+
* unset (a token without an explicit `secrets:write` claim cannot
|
|
91
|
+
* mutate the secrets store). Deployments that want any authenticated
|
|
92
|
+
* bearer to be able to write grant the capability on every token.
|
|
93
|
+
*/
|
|
94
|
+
readonly capabilities?: readonly string[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Session-token prefix. Framework-issued opaque tokens minted by
|
|
98
|
+
* `POST /v1/auth/callback/:providerId` carry this prefix so the auth
|
|
99
|
+
* middleware can route them to the session store instead of the caller-
|
|
100
|
+
* plugged `TokenResolver`. Distinct prefix means a static bearer token
|
|
101
|
+
* and a session token can coexist byte-shape-identical on the wire.
|
|
102
|
+
*/
|
|
103
|
+
export declare const SESSION_TOKEN_PREFIX: "kgi_sk_";
|
|
104
|
+
/**
|
|
105
|
+
* Compose the on-wire session token from a `SessionId`. Session tokens
|
|
106
|
+
* are opaque to clients — the shape below is a framework convention,
|
|
107
|
+
* not part of the wire contract. Do NOT parse it in downstream code
|
|
108
|
+
* outside the middleware.
|
|
109
|
+
*/
|
|
110
|
+
export declare function encodeSessionToken(sessionId: SessionId): string;
|
|
111
|
+
/**
|
|
112
|
+
* Optional wiring for the session-token flavor. Provided to the
|
|
113
|
+
* middleware via `bearerAuthMiddleware(resolveToken, { sessionStore })`
|
|
114
|
+
* when the deployment mounts `SessionStoreBinding`. Absent → session-
|
|
115
|
+
* shape tokens fall through to `TokenResolver` (which will typically
|
|
116
|
+
* `null` them → 401 auth-missing) so a deployment without a session
|
|
117
|
+
* store still behaves consistently.
|
|
118
|
+
*/
|
|
119
|
+
export interface BearerAuthMiddlewareOptions {
|
|
120
|
+
readonly sessionStore?: SessionStoreBinding;
|
|
121
|
+
/**
|
|
122
|
+
* Inactivity timeout — sessions whose `lastActiveAt` is older than
|
|
123
|
+
* `Date.now() - inactivityTimeoutMs` are rejected with 401
|
|
124
|
+
* `session-inactive`. Absent → inactivity enforcement disabled
|
|
125
|
+
* (only absolute TTL applies).
|
|
126
|
+
*
|
|
127
|
+
* Sensible default: 4 hours (`4 * 60 * 60 * 1000`). Deployments
|
|
128
|
+
* customize via `CreateAppInput.session.inactivityTimeout`.
|
|
129
|
+
*/
|
|
130
|
+
readonly inactivityTimeoutMs?: number;
|
|
131
|
+
/**
|
|
132
|
+
* How often (per session) the middleware should call
|
|
133
|
+
* `sessionStore.touch` to bump `lastActiveAt`. Higher throttle ⇒
|
|
134
|
+
* fewer writes but coarser inactivity enforcement. Defaults to 60s.
|
|
135
|
+
*/
|
|
136
|
+
readonly touchThrottleMs?: number;
|
|
137
|
+
/**
|
|
138
|
+
* Accept public run tokens (`kgi_pt_…`), verified against
|
|
139
|
+
* `signingKey`, on the routes `isAllowed` admits (every other route
|
|
140
|
+
* answers 403). Absent → such tokens are not recognized (401).
|
|
141
|
+
*/
|
|
142
|
+
readonly publicRunTokens?: {
|
|
143
|
+
readonly signingKey: SigningKeyBinding;
|
|
144
|
+
readonly isAllowed: (method: string, path: string) => boolean;
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Bearer-token middleware. Fails 401 on missing / malformed / expired /
|
|
149
|
+
* revoked. On success, sets `c.set('tenantId', tenantId)` for downstream
|
|
150
|
+
* handlers.
|
|
151
|
+
*
|
|
152
|
+
* Two token flavors are accepted:
|
|
153
|
+
* - `kgi_sk_<sessionId>` — framework-issued OAuth session tokens.
|
|
154
|
+
* Verified via `sessionStore.get`; expiration + revocation are pulled
|
|
155
|
+
* from the session row.
|
|
156
|
+
* - anything else — caller-plugged static bearer tokens. Verified via
|
|
157
|
+
* `resolveToken`. Byte-shape-identical with the session-less contract.
|
|
158
|
+
*/
|
|
159
|
+
export declare function bearerAuthMiddleware(resolve: TokenResolver, options?: BearerAuthMiddlewareOptions): MiddlewareHandler;
|
|
160
|
+
/**
|
|
161
|
+
* Sentinel `tenantId` value the middleware passes to
|
|
162
|
+
* `SessionStoreBinding.get` when it needs to look up a session by its
|
|
163
|
+
* id without knowing the tenant in advance. Session-store adapters
|
|
164
|
+
* MUST honor this by skipping the tenant filter — the tenant is not
|
|
165
|
+
* known until the session row has been read.
|
|
166
|
+
*/
|
|
167
|
+
export declare const MULTI_TENANT_LOOKUP: TenantId;
|
|
168
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAW,iBAAiB,EAAQ,MAAM,MAAM,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAG,SAAkB,CAAC;AAEvD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAE/D;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAC5C;;;;;;;;OAQG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE;QACzB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;QACvC,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;KAC/D,CAAC;CACH;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,2BAAgC,GACxC,iBAAiB,CA+JnB;AAiDD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAA0D,QAAQ,CAAC"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
import { statusFor, toWireError } from '../errors.js';
|
|
4
|
+
import { PUBLIC_RUN_TOKEN_PREFIX, verifyPublicRunToken } from '../public-run-token.js';
|
|
5
|
+
/**
|
|
6
|
+
* Session-token prefix. Framework-issued opaque tokens minted by
|
|
7
|
+
* `POST /v1/auth/callback/:providerId` carry this prefix so the auth
|
|
8
|
+
* middleware can route them to the session store instead of the caller-
|
|
9
|
+
* plugged `TokenResolver`. Distinct prefix means a static bearer token
|
|
10
|
+
* and a session token can coexist byte-shape-identical on the wire.
|
|
11
|
+
*/
|
|
12
|
+
export const SESSION_TOKEN_PREFIX = 'kgi_sk_';
|
|
13
|
+
/**
|
|
14
|
+
* Compose the on-wire session token from a `SessionId`. Session tokens
|
|
15
|
+
* are opaque to clients — the shape below is a framework convention,
|
|
16
|
+
* not part of the wire contract. Do NOT parse it in downstream code
|
|
17
|
+
* outside the middleware.
|
|
18
|
+
*/
|
|
19
|
+
export function encodeSessionToken(sessionId) {
|
|
20
|
+
return `${SESSION_TOKEN_PREFIX}${sessionId}`;
|
|
21
|
+
}
|
|
22
|
+
const DEFAULT_TOUCH_THROTTLE_MS = 60_000;
|
|
23
|
+
/**
|
|
24
|
+
* Bearer-token middleware. Fails 401 on missing / malformed / expired /
|
|
25
|
+
* revoked. On success, sets `c.set('tenantId', tenantId)` for downstream
|
|
26
|
+
* handlers.
|
|
27
|
+
*
|
|
28
|
+
* Two token flavors are accepted:
|
|
29
|
+
* - `kgi_sk_<sessionId>` — framework-issued OAuth session tokens.
|
|
30
|
+
* Verified via `sessionStore.get`; expiration + revocation are pulled
|
|
31
|
+
* from the session row.
|
|
32
|
+
* - anything else — caller-plugged static bearer tokens. Verified via
|
|
33
|
+
* `resolveToken`. Byte-shape-identical with the session-less contract.
|
|
34
|
+
*/
|
|
35
|
+
export function bearerAuthMiddleware(resolve, options = {}) {
|
|
36
|
+
const { sessionStore, inactivityTimeoutMs } = options;
|
|
37
|
+
const touchThrottleMs = options.touchThrottleMs ?? DEFAULT_TOUCH_THROTTLE_MS;
|
|
38
|
+
// Per-process throttle bucket: session id → last touch millis.
|
|
39
|
+
// A shared Map is fine — session ids are opaque strings and the
|
|
40
|
+
// bucket is bounded by the number of active sessions the process
|
|
41
|
+
// has recently observed.
|
|
42
|
+
const touchBucket = new Map();
|
|
43
|
+
return async (c, next) => {
|
|
44
|
+
const requestId = c.get('requestId');
|
|
45
|
+
const header = c.req.header('authorization');
|
|
46
|
+
if (header === undefined || header.length === 0) {
|
|
47
|
+
const body = toWireError({ code: 'auth-missing', message: 'Authorization header is required' }, requestId);
|
|
48
|
+
return c.json(body, statusFor('auth-missing'));
|
|
49
|
+
}
|
|
50
|
+
const match = /^Bearer\s+(.+)$/i.exec(header);
|
|
51
|
+
if (match === null) {
|
|
52
|
+
const body = toWireError({
|
|
53
|
+
code: 'auth-missing',
|
|
54
|
+
message: 'Authorization header must be "Bearer <token>"',
|
|
55
|
+
}, requestId);
|
|
56
|
+
return c.json(body, statusFor('auth-missing'));
|
|
57
|
+
}
|
|
58
|
+
const token = match[1]?.trim() ?? '';
|
|
59
|
+
if (token.length === 0) {
|
|
60
|
+
const body = toWireError({ code: 'auth-missing', message: 'Bearer token is empty' }, requestId);
|
|
61
|
+
return c.json(body, statusFor('auth-missing'));
|
|
62
|
+
}
|
|
63
|
+
if (token.startsWith(PUBLIC_RUN_TOKEN_PREFIX)) {
|
|
64
|
+
return authenticatePublicRunToken(c, next, token, requestId, options.publicRunTokens);
|
|
65
|
+
}
|
|
66
|
+
const isSessionToken = sessionStore !== undefined && token.startsWith(SESSION_TOKEN_PREFIX);
|
|
67
|
+
const resolution = isSessionToken
|
|
68
|
+
? await resolveSessionToken(sessionStore, token)
|
|
69
|
+
: await resolve(token);
|
|
70
|
+
if (resolution === null) {
|
|
71
|
+
const body = toWireError({ code: 'auth-missing', message: 'Bearer token is not recognized' }, requestId);
|
|
72
|
+
return c.json(body, statusFor('auth-missing'));
|
|
73
|
+
}
|
|
74
|
+
if (resolution.revoked === true) {
|
|
75
|
+
// Rotated sessions surface as `refresh-token-invalid` — OAuth 2.1
|
|
76
|
+
// BCP reuse detection. The old session token is no longer valid,
|
|
77
|
+
// but the semantic distinction from an explicit revoke matters
|
|
78
|
+
// to compliant clients (they retry with the fresh token instead
|
|
79
|
+
// of prompting the user to re-authenticate).
|
|
80
|
+
if (resolution.rotated === true) {
|
|
81
|
+
const body = toWireError({
|
|
82
|
+
code: 'refresh-token-invalid',
|
|
83
|
+
message: 'Session token was rotated — retry with the fresh token from the last refresh',
|
|
84
|
+
}, requestId);
|
|
85
|
+
return c.json(body, statusFor('refresh-token-invalid'));
|
|
86
|
+
}
|
|
87
|
+
const body = toWireError({ code: 'auth-revoked', message: 'Bearer token has been revoked' }, requestId);
|
|
88
|
+
return c.json(body, statusFor('auth-revoked'));
|
|
89
|
+
}
|
|
90
|
+
if (resolution.expiresAt !== undefined && resolution.expiresAt.getTime() < Date.now()) {
|
|
91
|
+
// Session tokens report `session-expired` so callers can
|
|
92
|
+
// distinguish absolute session TTL from bearer-token expiry.
|
|
93
|
+
const expiredCode = isSessionToken ? 'session-expired' : 'auth-expired';
|
|
94
|
+
const expiredMsg = isSessionToken
|
|
95
|
+
? 'Session has expired (absolute TTL reached)'
|
|
96
|
+
: 'Bearer token has expired';
|
|
97
|
+
const body = toWireError({ code: expiredCode, message: expiredMsg }, requestId);
|
|
98
|
+
return c.json(body, statusFor(expiredCode));
|
|
99
|
+
}
|
|
100
|
+
// Inactivity timeout enforcement. Only applies when the deployment
|
|
101
|
+
// opted in via `inactivityTimeoutMs` AND the token is a session
|
|
102
|
+
// token AND the store populated `lastActiveAt`. Skipping the check
|
|
103
|
+
// preserves the default contract for deployments that don't wire
|
|
104
|
+
// the config.
|
|
105
|
+
if (isSessionToken &&
|
|
106
|
+
inactivityTimeoutMs !== undefined &&
|
|
107
|
+
inactivityTimeoutMs > 0 &&
|
|
108
|
+
resolution.lastActiveAt !== undefined) {
|
|
109
|
+
const cutoff = Date.now() - inactivityTimeoutMs;
|
|
110
|
+
if (resolution.lastActiveAt.getTime() < cutoff) {
|
|
111
|
+
const body = toWireError({
|
|
112
|
+
code: 'session-inactive',
|
|
113
|
+
message: 'Session has been idle beyond the inactivity timeout',
|
|
114
|
+
}, requestId);
|
|
115
|
+
return c.json(body, statusFor('session-inactive'));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
c.set('tenantId', resolution.tenantId);
|
|
119
|
+
if (resolution.reviewerRole !== undefined) {
|
|
120
|
+
c.set('reviewerRole', resolution.reviewerRole);
|
|
121
|
+
}
|
|
122
|
+
if (resolution.userId !== undefined) {
|
|
123
|
+
c.set('userId', resolution.userId);
|
|
124
|
+
}
|
|
125
|
+
if (resolution.tokenId !== undefined) {
|
|
126
|
+
c.set('tokenId', resolution.tokenId);
|
|
127
|
+
}
|
|
128
|
+
if (resolution.sessionId !== undefined) {
|
|
129
|
+
c.set('sessionId', resolution.sessionId);
|
|
130
|
+
}
|
|
131
|
+
if (resolution.providerId !== undefined) {
|
|
132
|
+
c.set('providerId', resolution.providerId);
|
|
133
|
+
}
|
|
134
|
+
if (resolution.scopes !== undefined) {
|
|
135
|
+
c.set('scopes', resolution.scopes);
|
|
136
|
+
}
|
|
137
|
+
if (resolution.capabilities !== undefined) {
|
|
138
|
+
c.set('capabilities', resolution.capabilities);
|
|
139
|
+
}
|
|
140
|
+
// Bump `lastActiveAt` (throttled) so the inactivity timeout has
|
|
141
|
+
// a fresh signal to compare against. Only meaningful for session
|
|
142
|
+
// tokens with a wired `touch()`; bearer tokens are skipped.
|
|
143
|
+
if (isSessionToken && sessionStore?.touch !== undefined && resolution.sessionId !== undefined) {
|
|
144
|
+
const sid = resolution.sessionId;
|
|
145
|
+
const last = touchBucket.get(sid) ?? 0;
|
|
146
|
+
const now = Date.now();
|
|
147
|
+
if (now - last >= touchThrottleMs) {
|
|
148
|
+
touchBucket.set(sid, now);
|
|
149
|
+
// Fire-and-forget; we don't want the write path to hold the
|
|
150
|
+
// request. Adapter errors surface via observability, not the
|
|
151
|
+
// hot path (the next check catches a genuinely stale row).
|
|
152
|
+
void sessionStore
|
|
153
|
+
.touch({
|
|
154
|
+
tenantId: resolution.tenantId,
|
|
155
|
+
sessionId: resolution.sessionId,
|
|
156
|
+
at: new Date(now),
|
|
157
|
+
})
|
|
158
|
+
.catch(() => {
|
|
159
|
+
// Best-effort — the next request retries.
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
await next();
|
|
164
|
+
return;
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Session-token verification path. Distinct from `TokenResolver` because
|
|
169
|
+
* a session carries structured OAuth context (userId + providerId +
|
|
170
|
+
* scopes + expiration + revocation) that the store returns natively —
|
|
171
|
+
* we don't want to squeeze that shape through the resolver contract.
|
|
172
|
+
*
|
|
173
|
+
* Session-token tenant scoping: the stored session is the source of
|
|
174
|
+
* truth for `tenantId`. We look up ACROSS tenants here — the resolved
|
|
175
|
+
* `tenantId` is whatever the session was written under, so everything
|
|
176
|
+
* downstream is scoped to that tenant only. A stolen session token still
|
|
177
|
+
* can't cross tenants because the session it points to belongs to
|
|
178
|
+
* exactly one tenant.
|
|
179
|
+
*
|
|
180
|
+
* Since `SessionStoreBinding.get` requires `tenantId`, the lookup is:
|
|
181
|
+
* extract `sessionId` from the token, then call
|
|
182
|
+
* `sessionStore.get({ tenantId: MULTI_TENANT_LOOKUP, sessionId })`.
|
|
183
|
+
* Session-store implementations MUST recognize the `MULTI_TENANT_LOOKUP`
|
|
184
|
+
* sentinel and skip the tenant filter; the `tenantId` on the stored
|
|
185
|
+
* session is authoritative.
|
|
186
|
+
*/
|
|
187
|
+
async function resolveSessionToken(sessionStore, token) {
|
|
188
|
+
const sessionIdStr = token.slice(SESSION_TOKEN_PREFIX.length);
|
|
189
|
+
if (sessionIdStr.length === 0)
|
|
190
|
+
return null;
|
|
191
|
+
const sessionId = sessionIdStr;
|
|
192
|
+
const session = await sessionStore.get({
|
|
193
|
+
tenantId: MULTI_TENANT_LOOKUP,
|
|
194
|
+
sessionId,
|
|
195
|
+
});
|
|
196
|
+
if (session === null)
|
|
197
|
+
return null;
|
|
198
|
+
return {
|
|
199
|
+
tenantId: session.tenantId,
|
|
200
|
+
userId: session.userId,
|
|
201
|
+
sessionId: session.id,
|
|
202
|
+
providerId: session.providerId,
|
|
203
|
+
scopes: session.scopes,
|
|
204
|
+
expiresAt: new Date(session.expiresAt),
|
|
205
|
+
revoked: session.revokedAt !== undefined,
|
|
206
|
+
...(session.rotatedAt !== undefined && { rotated: true }),
|
|
207
|
+
...(session.lastActiveAt !== undefined && {
|
|
208
|
+
lastActiveAt: new Date(session.lastActiveAt),
|
|
209
|
+
}),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Sentinel `tenantId` value the middleware passes to
|
|
214
|
+
* `SessionStoreBinding.get` when it needs to look up a session by its
|
|
215
|
+
* id without knowing the tenant in advance. Session-store adapters
|
|
216
|
+
* MUST honor this by skipping the tenant filter — the tenant is not
|
|
217
|
+
* known until the session row has been read.
|
|
218
|
+
*/
|
|
219
|
+
export const MULTI_TENANT_LOOKUP = '__kindgi_session_multi_tenant_lookup__';
|
|
220
|
+
/**
|
|
221
|
+
* A public run token: verify it, admit only the routes it may use, and
|
|
222
|
+
* mark the request so the progress routes check it against the runs
|
|
223
|
+
* it names.
|
|
224
|
+
*/
|
|
225
|
+
async function authenticatePublicRunToken(c, next, token, requestId, config) {
|
|
226
|
+
const verified = config === undefined
|
|
227
|
+
? { kind: 'err', reason: 'unknown-key' }
|
|
228
|
+
: verifyPublicRunToken(token, { signingKey: config.signingKey });
|
|
229
|
+
if (verified.kind === 'err') {
|
|
230
|
+
const expired = verified.reason === 'expired';
|
|
231
|
+
const code = expired ? 'auth-expired' : 'auth-missing';
|
|
232
|
+
const message = expired ? 'Public run token has expired' : 'Bearer token is not recognized';
|
|
233
|
+
return c.json(toWireError({ code, message }, requestId), statusFor(code));
|
|
234
|
+
}
|
|
235
|
+
if (config === undefined || !config.isAllowed(c.req.method, c.req.path)) {
|
|
236
|
+
return c.json(toWireError({
|
|
237
|
+
code: 'permission-denied',
|
|
238
|
+
message: 'A public run token can only follow the runs it names: GET /v1/runs/{runId}/progress and GET /v1/runs/{runId}/progress/stream',
|
|
239
|
+
}, requestId), statusFor('permission-denied'));
|
|
240
|
+
}
|
|
241
|
+
c.set('tenantId', verified.claims.tenantId);
|
|
242
|
+
c.set('tokenKind', 'public-run');
|
|
243
|
+
c.set('publicRunIds', verified.claims.runIds);
|
|
244
|
+
await next();
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AASjC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AA+FvF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAkB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAoB;IACrD,OAAO,GAAG,oBAAoB,GAAG,SAA8B,EAAE,CAAC;AACpE,CAAC;AAuCD,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAsB,EACtB,UAAuC,EAAE;IAEzC,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC;IACtD,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,yBAAyB,CAAC;IAC7E,+DAA+D;IAC/D,gEAAgE;IAChE,iEAAiE;IACjE,yBAAyB;IACzB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAW,CAAC;QAC/C,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,WAAW,CACtB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,kCAAkC,EAAE,EACrE,SAAS,CACV,CAAC;YACF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,cAAc,CAAU,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,WAAW,CACtB;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,+CAA+C;aACzD,EACD,SAAS,CACV,CAAC;YACF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,cAAc,CAAU,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,WAAW,CACtB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAC1D,SAAS,CACV,CAAC;YACF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,cAAc,CAAU,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC9C,OAAO,0BAA0B,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,cAAc,GAAG,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAC5F,MAAM,UAAU,GAAG,cAAc;YAC/B,CAAC,CAAC,MAAM,mBAAmB,CAAC,YAAa,EAAE,KAAK,CAAC;YACjD,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,WAAW,CACtB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,gCAAgC,EAAE,EACnE,SAAS,CACV,CAAC;YACF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,cAAc,CAAU,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,UAAU,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAChC,kEAAkE;YAClE,iEAAiE;YACjE,+DAA+D;YAC/D,gEAAgE;YAChE,6CAA6C;YAC7C,IAAI,UAAU,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,WAAW,CACtB;oBACE,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,8EAA8E;iBACxF,EACD,SAAS,CACV,CAAC;gBACF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,uBAAuB,CAAU,CAAC,CAAC;YACnE,CAAC;YACD,MAAM,IAAI,GAAG,WAAW,CACtB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,+BAA+B,EAAE,EAClE,SAAS,CACV,CAAC;YACF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,cAAc,CAAU,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACtF,yDAAyD;YACzD,6DAA6D;YAC7D,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC;YACxE,MAAM,UAAU,GAAG,cAAc;gBAC/B,CAAC,CAAC,4CAA4C;gBAC9C,CAAC,CAAC,0BAA0B,CAAC;YAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;YAChF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAU,CAAC,CAAC;QACvD,CAAC;QACD,mEAAmE;QACnE,gEAAgE;QAChE,mEAAmE;QACnE,iEAAiE;QACjE,cAAc;QACd,IACE,cAAc;YACd,mBAAmB,KAAK,SAAS;YACjC,mBAAmB,GAAG,CAAC;YACvB,UAAU,CAAC,YAAY,KAAK,SAAS,EACrC,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,CAAC;YAChD,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;gBAC/C,MAAM,IAAI,GAAG,WAAW,CACtB;oBACE,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,qDAAqD;iBAC/D,EACD,SAAS,CACV,CAAC;gBACF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,kBAAkB,CAAU,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC1C,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACpC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACrC,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACvC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACxC,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACpC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC1C,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC;QAED,gEAAgE;QAChE,iEAAiE;QACjE,4DAA4D;QAC5D,IAAI,cAAc,IAAI,YAAY,EAAE,KAAK,KAAK,SAAS,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAC9F,MAAM,GAAG,GAAG,UAAU,CAAC,SAA8B,CAAC;YACtD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG,GAAG,IAAI,IAAI,eAAe,EAAE,CAAC;gBAClC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC1B,4DAA4D;gBAC5D,6DAA6D;gBAC7D,2DAA2D;gBAC3D,KAAK,YAAY;qBACd,KAAK,CAAC;oBACL,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,SAAS,EAAE,UAAU,CAAC,SAAS;oBAC/B,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC;iBAClB,CAAC;qBACD,KAAK,CAAC,GAAG,EAAE;oBACV,0CAA0C;gBAC5C,CAAC,CAAC,CAAC;YACP,CAAC;QACH,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;QACb,OAAO;IACT,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,KAAK,UAAU,mBAAmB,CAChC,YAAiC,EACjC,KAAa;IAEb,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,SAAS,GAAG,YAAoC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC;QACrC,QAAQ,EAAE,mBAAmB;QAC7B,SAAS;KACV,CAAC,CAAC;IACH,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAA2B;QAC3C,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAA8B,CAAC;QAC3D,OAAO,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS;QACxC,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzD,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI;YACxC,YAAY,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,YAAiC,CAAC;SAClE,CAAC;KACH,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,wCAA+D,CAAC;AAEnG;;;;GAIG;AACH,KAAK,UAAU,0BAA0B,CACvC,CAAU,EACV,IAAU,EACV,KAAa,EACb,SAAiB,EACjB,MAAsD;IAEtD,MAAM,QAAQ,GACZ,MAAM,KAAK,SAAS;QAClB,CAAC,CAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAY;QACnD,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC;QAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,gCAAgC,CAAC;QAC5F,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,IAAI,CAAU,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,CAAC,IAAI,CACX,WAAW,CACT;YACE,IAAI,EAAE,mBAAmB;YACzB,OAAO,EACL,8HAA8H;SACjI,EACD,SAAS,CACV,EACD,SAAS,CAAC,mBAAmB,CAAU,CACxC,CAAC;IACJ,CAAC;IACD,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACjC,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,IAAI,EAAE,CAAC;IACb,OAAO,SAAS,CAAC;AACnB,CAAC"}
|