@kindgi/api 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-binding.d.ts +13 -0
- package/dist/agent-binding.d.ts.map +1 -1
- package/dist/agent-pins.d.ts.map +1 -1
- package/dist/agent-pins.js +18 -2
- package/dist/agent-pins.js.map +1 -1
- package/dist/app.d.ts +110 -17
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +163 -35
- package/dist/app.js.map +1 -1
- package/dist/block-publish.d.ts +56 -0
- package/dist/block-publish.d.ts.map +1 -0
- package/dist/block-publish.js +132 -0
- package/dist/block-publish.js.map +1 -0
- package/dist/caller.d.ts +24 -0
- package/dist/caller.d.ts.map +1 -0
- package/dist/caller.js +47 -0
- package/dist/caller.js.map +1 -0
- package/dist/capability-binding.d.ts +11 -0
- package/dist/capability-binding.d.ts.map +1 -1
- package/dist/cost-binding.d.ts +19 -0
- package/dist/cost-binding.d.ts.map +1 -1
- package/dist/cost-binding.js.map +1 -1
- package/dist/derive-agent-version.d.ts +7 -0
- package/dist/derive-agent-version.d.ts.map +1 -1
- package/dist/derive-agent-version.js +4 -0
- package/dist/derive-agent-version.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +75 -7
- package/dist/errors.js.map +1 -1
- package/dist/eval-case-binding.d.ts +16 -4
- package/dist/eval-case-binding.d.ts.map +1 -1
- package/dist/eval-run-binding.d.ts +31 -0
- package/dist/eval-run-binding.d.ts.map +1 -1
- package/dist/eval-run-dispatcher.d.ts +7 -0
- package/dist/eval-run-dispatcher.d.ts.map +1 -1
- package/dist/eval-run-dispatcher.js.map +1 -1
- package/dist/eval-sample.d.ts +11 -0
- package/dist/eval-sample.d.ts.map +1 -0
- package/dist/eval-sample.js +34 -0
- package/dist/eval-sample.js.map +1 -0
- package/dist/eval-suite-binding.d.ts +13 -0
- package/dist/eval-suite-binding.d.ts.map +1 -1
- package/dist/eval-suite-binding.js.map +1 -1
- package/dist/flow-binding.d.ts +18 -0
- package/dist/flow-binding.d.ts.map +1 -1
- package/dist/flow-pins.d.ts.map +1 -1
- package/dist/flow-pins.js +18 -2
- package/dist/flow-pins.js.map +1 -1
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +25 -0
- package/dist/gate.js.map +1 -1
- package/dist/handler-binding.d.ts +32 -0
- package/dist/handler-binding.d.ts.map +1 -1
- package/dist/hitl-binding.d.ts +23 -0
- package/dist/hitl-binding.d.ts.map +1 -1
- package/dist/identity-directory-binding.d.ts +82 -4
- package/dist/identity-directory-binding.d.ts.map +1 -1
- package/dist/identity-provider-binding.d.ts +197 -17
- package/dist/identity-provider-binding.d.ts.map +1 -1
- package/dist/improvement-pass-binding.d.ts +196 -0
- package/dist/improvement-pass-binding.d.ts.map +1 -0
- package/dist/improvement-pass-binding.js +9 -0
- package/dist/improvement-pass-binding.js.map +1 -0
- package/dist/index.d.ts +35 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/judged-dispatcher.d.ts +25 -4
- package/dist/judged-dispatcher.d.ts.map +1 -1
- package/dist/judged-dispatcher.js +43 -6
- package/dist/judged-dispatcher.js.map +1 -1
- package/dist/judgment-binding.d.ts +25 -1
- package/dist/judgment-binding.d.ts.map +1 -1
- package/dist/mcp-endpoint-binding.d.ts +7 -0
- package/dist/mcp-endpoint-binding.d.ts.map +1 -1
- package/dist/memory-binding.d.ts +124 -17
- package/dist/memory-binding.d.ts.map +1 -1
- package/dist/memory-erasure-binding.d.ts +145 -0
- package/dist/memory-erasure-binding.d.ts.map +1 -0
- package/dist/memory-erasure-binding.js +4 -0
- package/dist/memory-erasure-binding.js.map +1 -0
- package/dist/middleware/auth.d.ts +66 -13
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +150 -50
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/authorize.d.ts +9 -0
- package/dist/middleware/authorize.d.ts.map +1 -1
- package/dist/middleware/authorize.js +122 -4
- package/dist/middleware/authorize.js.map +1 -1
- package/dist/middleware/error-mapper.d.ts +5 -0
- package/dist/middleware/error-mapper.d.ts.map +1 -1
- package/dist/middleware/error-mapper.js +14 -1
- package/dist/middleware/error-mapper.js.map +1 -1
- package/dist/middleware/idempotency.d.ts +70 -5
- package/dist/middleware/idempotency.d.ts.map +1 -1
- package/dist/middleware/idempotency.js +174 -41
- package/dist/middleware/idempotency.js.map +1 -1
- package/dist/middleware/key-project.d.ts +17 -0
- package/dist/middleware/key-project.d.ts.map +1 -0
- package/dist/middleware/key-project.js +75 -0
- package/dist/middleware/key-project.js.map +1 -0
- package/dist/middleware/principal.d.ts.map +1 -1
- package/dist/middleware/principal.js +9 -5
- package/dist/middleware/principal.js.map +1 -1
- package/dist/middleware/project-ref.d.ts.map +1 -1
- package/dist/middleware/project-ref.js +3 -0
- package/dist/middleware/project-ref.js.map +1 -1
- package/dist/openapi/generate.d.ts.map +1 -1
- package/dist/openapi/generate.js +5 -2
- package/dist/openapi/generate.js.map +1 -1
- package/dist/openapi/operations.d.ts.map +1 -1
- package/dist/openapi/operations.js +919 -140
- package/dist/openapi/operations.js.map +1 -1
- package/dist/openapi/schemas.d.ts +90 -13
- package/dist/openapi/schemas.d.ts.map +1 -1
- package/dist/openapi/schemas.js +2081 -359
- package/dist/openapi/schemas.js.map +1 -1
- package/dist/person-grants-binding.d.ts +77 -0
- package/dist/person-grants-binding.d.ts.map +1 -0
- package/dist/person-grants-binding.js +4 -0
- package/dist/person-grants-binding.js.map +1 -0
- package/dist/proposal-service.d.ts +121 -0
- package/dist/proposal-service.d.ts.map +1 -0
- package/dist/proposal-service.js +447 -0
- package/dist/proposal-service.js.map +1 -0
- package/dist/proposal-status.d.ts +60 -0
- package/dist/proposal-status.d.ts.map +1 -0
- package/dist/proposal-status.js +109 -0
- package/dist/proposal-status.js.map +1 -0
- package/dist/provider-binding.d.ts +10 -0
- package/dist/provider-binding.d.ts.map +1 -1
- package/dist/publish-refused.d.ts +28 -3
- package/dist/publish-refused.d.ts.map +1 -1
- package/dist/publish-refused.js +24 -3
- package/dist/publish-refused.js.map +1 -1
- package/dist/routes/adapters.d.ts +2 -1
- package/dist/routes/adapters.d.ts.map +1 -1
- package/dist/routes/adapters.js +3 -1
- package/dist/routes/adapters.js.map +1 -1
- package/dist/routes/agent-releases.d.ts +55 -3
- package/dist/routes/agent-releases.d.ts.map +1 -1
- package/dist/routes/agent-releases.js +85 -55
- package/dist/routes/agent-releases.js.map +1 -1
- package/dist/routes/agents.d.ts +12 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +100 -2
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/approvals.d.ts +15 -3
- package/dist/routes/approvals.d.ts.map +1 -1
- package/dist/routes/approvals.js +133 -122
- package/dist/routes/approvals.js.map +1 -1
- package/dist/routes/artifacts.d.ts +25 -3
- package/dist/routes/artifacts.d.ts.map +1 -1
- package/dist/routes/artifacts.js +116 -7
- package/dist/routes/artifacts.js.map +1 -1
- package/dist/routes/auth.d.ts +25 -1
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +655 -281
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/blocks.d.ts.map +1 -1
- package/dist/routes/blocks.js +2 -42
- package/dist/routes/blocks.js.map +1 -1
- package/dist/routes/capabilities.d.ts +2 -1
- package/dist/routes/capabilities.d.ts.map +1 -1
- package/dist/routes/capabilities.js +6 -1
- package/dist/routes/capabilities.js.map +1 -1
- package/dist/routes/compliance.d.ts +9 -10
- package/dist/routes/compliance.d.ts.map +1 -1
- package/dist/routes/compliance.js +42 -61
- package/dist/routes/compliance.js.map +1 -1
- package/dist/routes/conversations.d.ts +8 -1
- package/dist/routes/conversations.d.ts.map +1 -1
- package/dist/routes/conversations.js +87 -8
- package/dist/routes/conversations.js.map +1 -1
- package/dist/routes/cost.d.ts +12 -1
- package/dist/routes/cost.d.ts.map +1 -1
- package/dist/routes/cost.js +74 -3
- package/dist/routes/cost.js.map +1 -1
- package/dist/routes/denied.d.ts +11 -0
- package/dist/routes/denied.d.ts.map +1 -0
- package/dist/routes/denied.js +17 -0
- package/dist/routes/denied.js.map +1 -0
- package/dist/routes/deployments.d.ts +10 -1
- package/dist/routes/deployments.d.ts.map +1 -1
- package/dist/routes/deployments.js +171 -13
- package/dist/routes/deployments.js.map +1 -1
- package/dist/routes/eval-comparison.d.ts.map +1 -1
- package/dist/routes/eval-comparison.js +69 -1
- package/dist/routes/eval-comparison.js.map +1 -1
- package/dist/routes/eval-overrides.d.ts +18 -0
- package/dist/routes/eval-overrides.d.ts.map +1 -0
- package/dist/routes/eval-overrides.js +81 -0
- package/dist/routes/eval-overrides.js.map +1 -0
- package/dist/routes/eval-runs.d.ts +10 -1
- package/dist/routes/eval-runs.d.ts.map +1 -1
- package/dist/routes/eval-runs.js +66 -7
- package/dist/routes/eval-runs.js.map +1 -1
- package/dist/routes/eval-suites.d.ts.map +1 -1
- package/dist/routes/eval-suites.js +28 -2
- package/dist/routes/eval-suites.js.map +1 -1
- package/dist/routes/event-triggers.d.ts +5 -1
- package/dist/routes/event-triggers.d.ts.map +1 -1
- package/dist/routes/event-triggers.js +26 -3
- package/dist/routes/event-triggers.js.map +1 -1
- package/dist/routes/export-signing-keys.d.ts +12 -0
- package/dist/routes/export-signing-keys.d.ts.map +1 -0
- package/dist/routes/export-signing-keys.js +24 -0
- package/dist/routes/export-signing-keys.js.map +1 -0
- package/dist/routes/flows.d.ts.map +1 -1
- package/dist/routes/flows.js +9 -1
- package/dist/routes/flows.js.map +1 -1
- package/dist/routes/gate-policies.d.ts +4 -1
- package/dist/routes/gate-policies.d.ts.map +1 -1
- package/dist/routes/gate-policies.js +29 -5
- package/dist/routes/gate-policies.js.map +1 -1
- package/dist/routes/guardrails.d.ts +16 -14
- package/dist/routes/guardrails.d.ts.map +1 -1
- package/dist/routes/guardrails.js +39 -3
- package/dist/routes/guardrails.js.map +1 -1
- package/dist/routes/identity.d.ts +20 -4
- package/dist/routes/identity.d.ts.map +1 -1
- package/dist/routes/identity.js +246 -6
- package/dist/routes/identity.js.map +1 -1
- package/dist/routes/improvement-passes.d.ts +52 -0
- package/dist/routes/improvement-passes.d.ts.map +1 -0
- package/dist/routes/improvement-passes.js +449 -0
- package/dist/routes/improvement-passes.js.map +1 -0
- package/dist/routes/judged-suites.d.ts +50 -0
- package/dist/routes/judged-suites.d.ts.map +1 -1
- package/dist/routes/judged-suites.js +66 -27
- package/dist/routes/judged-suites.js.map +1 -1
- package/dist/routes/judgment-context.d.ts +18 -2
- package/dist/routes/judgment-context.d.ts.map +1 -1
- package/dist/routes/judgment-context.js +63 -5
- package/dist/routes/judgment-context.js.map +1 -1
- package/dist/routes/judgment-flow-context.d.ts.map +1 -1
- package/dist/routes/judgment-flow-context.js +14 -2
- package/dist/routes/judgment-flow-context.js.map +1 -1
- package/dist/routes/judgments.d.ts.map +1 -1
- package/dist/routes/judgments.js +8 -1
- package/dist/routes/judgments.js.map +1 -1
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +26 -1
- package/dist/routes/mcp.js.map +1 -1
- package/dist/routes/memory-access.d.ts +43 -0
- package/dist/routes/memory-access.d.ts.map +1 -0
- package/dist/routes/memory-access.js +114 -0
- package/dist/routes/memory-access.js.map +1 -0
- package/dist/routes/memory-erasures.d.ts +25 -0
- package/dist/routes/memory-erasures.d.ts.map +1 -0
- package/dist/routes/memory-erasures.js +214 -0
- package/dist/routes/memory-erasures.js.map +1 -0
- package/dist/routes/memory-parse.d.ts +38 -0
- package/dist/routes/memory-parse.d.ts.map +1 -0
- package/dist/routes/memory-parse.js +199 -0
- package/dist/routes/memory-parse.js.map +1 -0
- package/dist/routes/memory.d.ts +9 -4
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +226 -234
- package/dist/routes/memory.js.map +1 -1
- package/dist/routes/observations.d.ts +4 -1
- package/dist/routes/observations.d.ts.map +1 -1
- package/dist/routes/observations.js +8 -2
- package/dist/routes/observations.js.map +1 -1
- package/dist/routes/pagination.d.ts +7 -0
- package/dist/routes/pagination.d.ts.map +1 -1
- package/dist/routes/pagination.js +10 -0
- package/dist/routes/pagination.js.map +1 -1
- package/dist/routes/policies.d.ts +2 -1
- package/dist/routes/policies.d.ts.map +1 -1
- package/dist/routes/policies.js +3 -1
- package/dist/routes/policies.js.map +1 -1
- package/dist/routes/project-mismatch.d.ts +22 -0
- package/dist/routes/project-mismatch.d.ts.map +1 -0
- package/dist/routes/project-mismatch.js +34 -0
- package/dist/routes/project-mismatch.js.map +1 -0
- package/dist/routes/projects.d.ts +15 -4
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +100 -9
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/proposals.d.ts +25 -17
- package/dist/routes/proposals.d.ts.map +1 -1
- package/dist/routes/proposals.js +340 -507
- package/dist/routes/proposals.js.map +1 -1
- package/dist/routes/provenance.d.ts +17 -3
- package/dist/routes/provenance.d.ts.map +1 -1
- package/dist/routes/provenance.js +79 -103
- package/dist/routes/provenance.js.map +1 -1
- package/dist/routes/providers.d.ts +17 -1
- package/dist/routes/providers.d.ts.map +1 -1
- package/dist/routes/providers.js +110 -3
- package/dist/routes/providers.js.map +1 -1
- package/dist/routes/public-run-tokens.d.ts.map +1 -1
- package/dist/routes/public-run-tokens.js +3 -0
- package/dist/routes/public-run-tokens.js.map +1 -1
- package/dist/routes/readable-projects.d.ts +26 -0
- package/dist/routes/readable-projects.d.ts.map +1 -0
- package/dist/routes/readable-projects.js +39 -0
- package/dist/routes/readable-projects.js.map +1 -0
- package/dist/routes/runs.d.ts +10 -0
- package/dist/routes/runs.d.ts.map +1 -1
- package/dist/routes/runs.js +92 -42
- package/dist/routes/runs.js.map +1 -1
- package/dist/routes/schedules.d.ts +21 -13
- package/dist/routes/schedules.d.ts.map +1 -1
- package/dist/routes/schedules.js +416 -55
- package/dist/routes/schedules.js.map +1 -1
- package/dist/routes/segments.d.ts +2 -0
- package/dist/routes/segments.d.ts.map +1 -1
- package/dist/routes/segments.js +5 -0
- package/dist/routes/segments.js.map +1 -1
- package/dist/routes/service-accounts.d.ts +17 -0
- package/dist/routes/service-accounts.d.ts.map +1 -0
- package/dist/routes/service-accounts.js +212 -0
- package/dist/routes/service-accounts.js.map +1 -0
- package/dist/routes/sign-in-options.d.ts +50 -0
- package/dist/routes/sign-in-options.d.ts.map +1 -0
- package/dist/routes/sign-in-options.js +98 -0
- package/dist/routes/sign-in-options.js.map +1 -0
- package/dist/routes/signing-keys.d.ts +2 -1
- package/dist/routes/signing-keys.d.ts.map +1 -1
- package/dist/routes/signing-keys.js +3 -1
- package/dist/routes/signing-keys.js.map +1 -1
- package/dist/routes/tenant-access.d.ts +13 -0
- package/dist/routes/tenant-access.d.ts.map +1 -0
- package/dist/routes/tenant-access.js +26 -0
- package/dist/routes/tenant-access.js.map +1 -0
- package/dist/routes/tenant.d.ts.map +1 -1
- package/dist/routes/tenant.js +4 -0
- package/dist/routes/tenant.js.map +1 -1
- package/dist/routes/token-sign-in.d.ts +36 -0
- package/dist/routes/token-sign-in.d.ts.map +1 -0
- package/dist/routes/token-sign-in.js +101 -0
- package/dist/routes/token-sign-in.js.map +1 -0
- package/dist/routes/tokens.d.ts +15 -5
- package/dist/routes/tokens.d.ts.map +1 -1
- package/dist/routes/tokens.js +162 -43
- package/dist/routes/tokens.js.map +1 -1
- package/dist/routes/tools.d.ts.map +1 -1
- package/dist/routes/tools.js +9 -1
- package/dist/routes/tools.js.map +1 -1
- package/dist/routes/trigger-access.d.ts +29 -0
- package/dist/routes/trigger-access.d.ts.map +1 -0
- package/dist/routes/trigger-access.js +33 -0
- package/dist/routes/trigger-access.js.map +1 -0
- package/dist/routes/webhook-endpoints.d.ts +2 -1
- package/dist/routes/webhook-endpoints.d.ts.map +1 -1
- package/dist/routes/webhook-endpoints.js +11 -3
- package/dist/routes/webhook-endpoints.js.map +1 -1
- package/dist/routes/webhooks.d.ts +5 -1
- package/dist/routes/webhooks.d.ts.map +1 -1
- package/dist/routes/webhooks.js +25 -2
- package/dist/routes/webhooks.js.map +1 -1
- package/dist/run-failure.d.ts +21 -0
- package/dist/run-failure.d.ts.map +1 -0
- package/dist/run-failure.js +29 -0
- package/dist/run-failure.js.map +1 -0
- package/dist/service-account-binding.d.ts +108 -0
- package/dist/service-account-binding.d.ts.map +1 -0
- package/dist/service-account-binding.js +4 -0
- package/dist/service-account-binding.js.map +1 -0
- package/dist/session-store-binding.d.ts +61 -13
- package/dist/session-store-binding.d.ts.map +1 -1
- package/dist/signed-export.d.ts +89 -0
- package/dist/signed-export.d.ts.map +1 -0
- package/dist/signed-export.js +149 -0
- package/dist/signed-export.js.map +1 -0
- package/dist/supervisor-binding.d.ts +186 -413
- package/dist/supervisor-binding.d.ts.map +1 -1
- package/dist/testing/app-bindings.d.ts +33 -0
- package/dist/testing/app-bindings.d.ts.map +1 -0
- package/dist/testing/app-bindings.js +112 -0
- package/dist/testing/app-bindings.js.map +1 -0
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +13 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/stub-binding.d.ts +34 -0
- package/dist/testing/stub-binding.d.ts.map +1 -0
- package/dist/testing/stub-binding.js +42 -0
- package/dist/testing/stub-binding.js.map +1 -0
- package/dist/testing/trigger-registry.d.ts +21 -0
- package/dist/testing/trigger-registry.d.ts.map +1 -0
- package/dist/testing/trigger-registry.js +206 -0
- package/dist/testing/trigger-registry.js.map +1 -0
- package/dist/token-admin.d.ts +46 -8
- package/dist/token-admin.d.ts.map +1 -1
- package/dist/token-admin.js.map +1 -1
- package/dist/tool-binding.d.ts +13 -0
- package/dist/tool-binding.d.ts.map +1 -1
- package/dist/trigger-binding.d.ts +2 -2
- package/dist/trigger-binding.d.ts.map +1 -1
- package/dist/trigger-binding.js +1 -1
- package/dist/trigger-binding.js.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/webhook-endpoint-binding.d.ts +19 -3
- package/dist/webhook-endpoint-binding.d.ts.map +1 -1
- package/dist/webhook-endpoint-binding.js +1 -1
- package/dist/webhook-endpoint-binding.js.map +1 -1
- package/openapi.json +15387 -8789
- package/package.json +26 -22
- package/src/agent-binding.ts +14 -0
- package/src/agent-pins.ts +18 -2
- package/src/app.ts +366 -80
- package/src/block-publish.ts +181 -0
- package/src/caller.ts +62 -0
- package/src/capability-binding.ts +12 -0
- package/src/cost-binding.ts +19 -0
- package/src/derive-agent-version.ts +9 -1
- package/src/errors.ts +75 -7
- package/src/eval-case-binding.ts +17 -1
- package/src/eval-run-binding.ts +31 -0
- package/src/eval-run-dispatcher.ts +7 -0
- package/src/eval-sample.ts +42 -0
- package/src/eval-suite-binding.ts +14 -0
- package/src/flow-binding.ts +19 -0
- package/src/flow-pins.ts +18 -2
- package/src/gate.ts +26 -0
- package/src/handler-binding.ts +36 -1
- package/src/hitl-binding.ts +24 -0
- package/src/identity-directory-binding.ts +85 -4
- package/src/identity-provider-binding.ts +216 -21
- package/src/improvement-pass-binding.ts +193 -0
- package/src/index.ts +153 -31
- package/src/judged-dispatcher.ts +78 -11
- package/src/judgment-binding.ts +25 -1
- package/src/mcp-endpoint-binding.ts +7 -0
- package/src/memory-binding.ts +121 -17
- package/src/memory-erasure-binding.ts +156 -0
- package/src/middleware/auth.ts +228 -62
- package/src/middleware/authorize.ts +155 -3
- package/src/middleware/error-mapper.ts +15 -1
- package/src/middleware/idempotency.ts +230 -43
- package/src/middleware/key-project.ts +86 -0
- package/src/middleware/principal.ts +9 -5
- package/src/middleware/project-ref.ts +3 -0
- package/src/openapi/generate.ts +11 -2
- package/src/openapi/operations.ts +1060 -143
- package/src/openapi/schemas.ts +2387 -469
- package/src/person-grants-binding.ts +76 -0
- package/src/proposal-service.ts +640 -0
- package/src/proposal-status.ts +176 -0
- package/src/provider-binding.ts +10 -0
- package/src/publish-refused.ts +56 -9
- package/src/routes/adapters.ts +4 -0
- package/src/routes/agent-releases.ts +121 -69
- package/src/routes/agents.ts +128 -1
- package/src/routes/approvals.ts +164 -154
- package/src/routes/artifacts.ts +181 -11
- package/src/routes/auth.ts +804 -336
- package/src/routes/blocks.ts +2 -53
- package/src/routes/capabilities.ts +10 -1
- package/src/routes/compliance.ts +60 -99
- package/src/routes/conversations.ts +101 -7
- package/src/routes/cost.ts +110 -4
- package/src/routes/denied.ts +28 -0
- package/src/routes/deployments.ts +210 -17
- package/src/routes/eval-comparison.ts +81 -2
- package/src/routes/eval-overrides.ts +108 -0
- package/src/routes/eval-runs.ts +89 -6
- package/src/routes/eval-suites.ts +32 -2
- package/src/routes/event-triggers.ts +27 -3
- package/src/routes/export-signing-keys.ts +31 -0
- package/src/routes/flows.ts +12 -1
- package/src/routes/gate-policies.ts +37 -6
- package/src/routes/guardrails.ts +61 -2
- package/src/routes/identity.ts +328 -10
- package/src/routes/improvement-passes.ts +541 -0
- package/src/routes/judged-suites.ts +113 -43
- package/src/routes/judgment-context.ts +76 -5
- package/src/routes/judgment-flow-context.ts +16 -2
- package/src/routes/judgments.ts +17 -3
- package/src/routes/mcp.ts +29 -1
- package/src/routes/memory-access.ts +160 -0
- package/src/routes/memory-erasures.ts +240 -0
- package/src/routes/memory-parse.ts +250 -0
- package/src/routes/memory.ts +244 -286
- package/src/routes/observations.ts +15 -2
- package/src/routes/pagination.ts +12 -0
- package/src/routes/policies.ts +7 -1
- package/src/routes/project-mismatch.ts +56 -0
- package/src/routes/projects.ts +107 -13
- package/src/routes/proposals.ts +370 -611
- package/src/routes/provenance.ts +99 -133
- package/src/routes/providers.ts +142 -3
- package/src/routes/public-run-tokens.ts +3 -0
- package/src/routes/readable-projects.ts +66 -0
- package/src/routes/runs.ts +119 -39
- package/src/routes/schedules.ts +472 -60
- package/src/routes/segments.ts +11 -0
- package/src/routes/service-accounts.ts +262 -0
- package/src/routes/sign-in-options.ts +168 -0
- package/src/routes/signing-keys.ts +7 -1
- package/src/routes/tenant-access.ts +37 -0
- package/src/routes/tenant.ts +6 -0
- package/src/routes/token-sign-in.ts +161 -0
- package/src/routes/tokens.ts +172 -46
- package/src/routes/tools.ts +12 -1
- package/src/routes/trigger-access.ts +72 -0
- package/src/routes/webhook-endpoints.ts +15 -3
- package/src/routes/webhooks.ts +26 -2
- package/src/run-failure.ts +42 -0
- package/src/service-account-binding.ts +113 -0
- package/src/session-store-binding.ts +65 -13
- package/src/signed-export.ts +250 -0
- package/src/supervisor-binding.ts +169 -409
- package/src/testing/app-bindings.ts +142 -0
- package/src/testing/index.ts +21 -0
- package/src/testing/stub-binding.ts +53 -0
- package/src/testing/trigger-registry.ts +259 -0
- package/src/token-admin.ts +40 -8
- package/src/tool-binding.ts +14 -0
- package/src/trigger-binding.ts +8 -1
- package/src/types.ts +16 -0
- package/src/webhook-endpoint-binding.ts +18 -3
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
|
|
4
|
+
import type { ConversationBinding, RunSnapshotBinding } from '@kindgi/agents';
|
|
5
|
+
import type { MemoryQueryBinding } from '@kindgi/memory';
|
|
6
|
+
import type { TenantHierarchyBinding } from '@kindgi/platform';
|
|
7
|
+
import type {
|
|
8
|
+
KernelBinding,
|
|
9
|
+
RunBinding,
|
|
10
|
+
RunRetentionBinding,
|
|
11
|
+
SchedulerBinding,
|
|
12
|
+
TriggerRegistryBinding,
|
|
13
|
+
WaitpointBinding,
|
|
14
|
+
} from '@kindgi/runtime';
|
|
15
|
+
import type { CreateAppInput } from '../app.js';
|
|
16
|
+
|
|
17
|
+
import { createStubBinding } from './stub-binding.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The bindings `createApp` requires that tests usually don't exercise —
|
|
21
|
+
* everything in `CreateAppInput` that is mandatory except the
|
|
22
|
+
* caller-specific `resolveToken` and `runHandler`.
|
|
23
|
+
*/
|
|
24
|
+
export type StubAppBindings = Pick<
|
|
25
|
+
CreateAppInput,
|
|
26
|
+
| 'conversationBinding'
|
|
27
|
+
| 'runSnapshotBinding'
|
|
28
|
+
| 'kernelBinding'
|
|
29
|
+
| 'tenantHierarchyBinding'
|
|
30
|
+
| 'memoryBinding'
|
|
31
|
+
| 'provenanceBinding'
|
|
32
|
+
>;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Stubs for every required `createApp` binding. Mount the API for
|
|
36
|
+
* contract, route-shape, and handler tests without a database or the
|
|
37
|
+
* Kindgi runtime; any route that reaches one of these bindings fails
|
|
38
|
+
* loudly with a `StubBindingError` naming the binding and method.
|
|
39
|
+
*
|
|
40
|
+
* Override the ones a test needs:
|
|
41
|
+
*
|
|
42
|
+
* ```ts
|
|
43
|
+
* const app = createApp({
|
|
44
|
+
* ...createStubAppBindings(),
|
|
45
|
+
* resolveToken,
|
|
46
|
+
* runHandler,
|
|
47
|
+
* agentRegistry: myInMemoryAgentRegistry,
|
|
48
|
+
* });
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export function createStubAppBindings(): StubAppBindings {
|
|
52
|
+
return {
|
|
53
|
+
conversationBinding: createStubBinding<ConversationBinding>('conversationBinding', {
|
|
54
|
+
openConversation: true,
|
|
55
|
+
getConversation: true,
|
|
56
|
+
listConversations: true,
|
|
57
|
+
listConversationsPage: true,
|
|
58
|
+
closeConversation: true,
|
|
59
|
+
unregisterConversation: true,
|
|
60
|
+
deleteConversation: true,
|
|
61
|
+
appendMessage: true,
|
|
62
|
+
readMessages: true,
|
|
63
|
+
}),
|
|
64
|
+
runSnapshotBinding: createStubBinding<RunSnapshotBinding>('runSnapshotBinding', {
|
|
65
|
+
write: true,
|
|
66
|
+
read: true,
|
|
67
|
+
}),
|
|
68
|
+
kernelBinding: createStubKernelBinding(),
|
|
69
|
+
tenantHierarchyBinding: createStubBinding<TenantHierarchyBinding>('tenantHierarchyBinding', {
|
|
70
|
+
createOrg: true,
|
|
71
|
+
createTeam: true,
|
|
72
|
+
createProject: true,
|
|
73
|
+
addTeamMember: true,
|
|
74
|
+
addProjectMember: true,
|
|
75
|
+
removeTeamMember: true,
|
|
76
|
+
updateTeamMemberRole: true,
|
|
77
|
+
removeProjectMember: true,
|
|
78
|
+
updateProjectMemberRole: true,
|
|
79
|
+
getTenant: true,
|
|
80
|
+
}),
|
|
81
|
+
memoryBinding: createStubBinding<MemoryQueryBinding>('memoryBinding', {
|
|
82
|
+
listFacts: true,
|
|
83
|
+
searchByKeyword: true,
|
|
84
|
+
searchBySemantic: true,
|
|
85
|
+
appendLog: true,
|
|
86
|
+
readLog: true,
|
|
87
|
+
searchConversations: true,
|
|
88
|
+
}),
|
|
89
|
+
provenanceBinding: createStubBinding<CreateAppInput['provenanceBinding']>('provenanceBinding', {
|
|
90
|
+
listRecords: true,
|
|
91
|
+
getByRunId: true,
|
|
92
|
+
getCallUsage: true,
|
|
93
|
+
}),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Stub `KernelBinding`: each sub-binding is a stub named
|
|
99
|
+
* `kernelBinding.<sub>`. The optional `eventBus` is omitted (absent), so
|
|
100
|
+
* code that feature-checks it takes the no-event-bus path.
|
|
101
|
+
*/
|
|
102
|
+
export function createStubKernelBinding(): KernelBinding {
|
|
103
|
+
return {
|
|
104
|
+
run: createStubBinding<RunBinding>('kernelBinding.run', {
|
|
105
|
+
runGraph: true,
|
|
106
|
+
resumeRun: true,
|
|
107
|
+
cancelRun: true,
|
|
108
|
+
cancelToken: true,
|
|
109
|
+
completeToken: true,
|
|
110
|
+
readJournal: true,
|
|
111
|
+
startRun: true,
|
|
112
|
+
deleteRun: true,
|
|
113
|
+
getRun: true,
|
|
114
|
+
listRuns: true,
|
|
115
|
+
}),
|
|
116
|
+
scheduler: createStubBinding<SchedulerBinding>('kernelBinding.scheduler', {
|
|
117
|
+
startCronScheduler: true,
|
|
118
|
+
startEventTriggerScheduler: true,
|
|
119
|
+
fireByWebhookId: true,
|
|
120
|
+
initialNextFireAt: true,
|
|
121
|
+
}),
|
|
122
|
+
waitpoint: createStubBinding<WaitpointBinding>('kernelBinding.waitpoint', {
|
|
123
|
+
startTimeoutSleeper: true,
|
|
124
|
+
}),
|
|
125
|
+
retention: createStubBinding<RunRetentionBinding>('kernelBinding.retention', {
|
|
126
|
+
createRetentionAdapter: true,
|
|
127
|
+
}),
|
|
128
|
+
triggers: createStubBinding<TriggerRegistryBinding>('kernelBinding.triggers', {
|
|
129
|
+
register: true,
|
|
130
|
+
update: true,
|
|
131
|
+
list: true,
|
|
132
|
+
get: true,
|
|
133
|
+
pause: true,
|
|
134
|
+
resume: true,
|
|
135
|
+
unregister: true,
|
|
136
|
+
fetchActiveByWebhookId: true,
|
|
137
|
+
listFires: true,
|
|
138
|
+
fireNow: true,
|
|
139
|
+
setOwner: true,
|
|
140
|
+
}),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `@kindgi/api/testing`: typed, fail-loud stub bindings for `createApp`,
|
|
6
|
+
* for tests that mount the API without a database or the Kindgi runtime.
|
|
7
|
+
* They live here, beside the `CreateAppInput` they stub, so `@kindgi/api`'s
|
|
8
|
+
* own tests use them without depending on `@kindgi/testing` (which
|
|
9
|
+
* re-exports them, unchanged).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
createStubAppBindings,
|
|
14
|
+
createStubKernelBinding,
|
|
15
|
+
type StubAppBindings,
|
|
16
|
+
} from './app-bindings.js';
|
|
17
|
+
export { StubBindingError, createStubBinding, type StubMethods } from './stub-binding.js';
|
|
18
|
+
export {
|
|
19
|
+
createInMemoryTriggerRegistry,
|
|
20
|
+
type InMemoryTriggerRegistry,
|
|
21
|
+
} from './trigger-registry.js';
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Thrown when code under test calls a method on a stub binding. The
|
|
6
|
+
* message names the binding and method so the fix — supply a real
|
|
7
|
+
* implementation or a test double for that binding — is obvious.
|
|
8
|
+
*/
|
|
9
|
+
export class StubBindingError extends Error {
|
|
10
|
+
readonly binding: string;
|
|
11
|
+
readonly method: string;
|
|
12
|
+
|
|
13
|
+
constructor(binding: string, method: string) {
|
|
14
|
+
super(
|
|
15
|
+
`${binding}.${method}() was called on a stub binding from @kindgi/testing. ` +
|
|
16
|
+
`Pass a real implementation or a test double for \`${binding}\` to exercise this code path.`,
|
|
17
|
+
);
|
|
18
|
+
this.name = 'StubBindingError';
|
|
19
|
+
this.binding = binding;
|
|
20
|
+
this.method = method;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* One `true` entry per method of `T`. Typed as a complete mapping, so a
|
|
26
|
+
* method added to the interface (or a stale one left behind) fails to
|
|
27
|
+
* compile at the stub definition instead of slipping through at runtime.
|
|
28
|
+
*/
|
|
29
|
+
export type StubMethods<T> = { readonly [K in keyof T]-?: true };
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Build a stub implementation of the binding interface `T`: every method
|
|
33
|
+
* listed in `methods` throws {@link StubBindingError} when called.
|
|
34
|
+
*
|
|
35
|
+
* ```ts
|
|
36
|
+
* const memory = createStubBinding<MemoryQueryBinding>('memoryBinding', {
|
|
37
|
+
* listFacts: true,
|
|
38
|
+
* searchByKeyword: true,
|
|
39
|
+
* searchBySemantic: true,
|
|
40
|
+
* appendLog: true,
|
|
41
|
+
* readLog: true,
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export function createStubBinding<T extends object>(name: string, methods: StubMethods<T>): T {
|
|
46
|
+
const stub: Record<string, () => never> = {};
|
|
47
|
+
for (const method of Object.keys(methods)) {
|
|
48
|
+
stub[method] = () => {
|
|
49
|
+
throw new StubBindingError(name, method);
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return stub as T;
|
|
53
|
+
}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
type CronTriggerRecord,
|
|
8
|
+
type ListTriggerFiresInput,
|
|
9
|
+
type RegisterTriggerInput,
|
|
10
|
+
SCHEDULE_DEFAULTS,
|
|
11
|
+
type TriggerFire,
|
|
12
|
+
type TriggerFirePage,
|
|
13
|
+
type TriggerLifecycleInput,
|
|
14
|
+
type TriggerOwner,
|
|
15
|
+
type TriggerRecord,
|
|
16
|
+
type TriggerRegistryBinding,
|
|
17
|
+
type UpdateTriggerInput,
|
|
18
|
+
} from '@kindgi/runtime';
|
|
19
|
+
import type { Cursor, ProjectId, TenantId, TriggerId } from '@kindgi/types';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* An in-memory `TriggerRegistryBinding` for app and route tests: the
|
|
23
|
+
* admin surface over stored triggers, with fire history and `run-now`.
|
|
24
|
+
* It computes no occurrences (`nextFireAt` stays `null`) and starts no
|
|
25
|
+
* runs; `fireNow` records a `pending` fire, and `recordFire` lets a test
|
|
26
|
+
* add fires as a scheduler would.
|
|
27
|
+
*/
|
|
28
|
+
export interface InMemoryTriggerRegistry extends TriggerRegistryBinding {
|
|
29
|
+
/** Add a fire to a trigger's history, as a scheduler would. */
|
|
30
|
+
recordFire(fire: Omit<TriggerFire, 'fireId'> & { readonly fireId?: string }): TriggerFire;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function createInMemoryTriggerRegistry(
|
|
34
|
+
options: {
|
|
35
|
+
/** The project a schedule registered without one goes to. */
|
|
36
|
+
readonly defaultProjectId?: ProjectId;
|
|
37
|
+
readonly now?: () => Date;
|
|
38
|
+
} = {},
|
|
39
|
+
): InMemoryTriggerRegistry {
|
|
40
|
+
const rows = new Map<string, TriggerRecord & { unregistered?: boolean }>();
|
|
41
|
+
const fires: TriggerFire[] = [];
|
|
42
|
+
const now = () => (options.now ?? (() => new Date()))().toISOString();
|
|
43
|
+
const defaultProject =
|
|
44
|
+
options.defaultProjectId ?? ('00000000-0000-4000-8000-000000000000' as ProjectId);
|
|
45
|
+
|
|
46
|
+
const live = (tenantId: TenantId, triggerId: TriggerId) => {
|
|
47
|
+
const row = rows.get(triggerId as unknown as string);
|
|
48
|
+
return row !== undefined && row.tenantId === tenantId && row.unregistered !== true
|
|
49
|
+
? row
|
|
50
|
+
: undefined;
|
|
51
|
+
};
|
|
52
|
+
const notFound = (triggerId: TriggerId) => ({
|
|
53
|
+
kind: 'err' as const,
|
|
54
|
+
error: {
|
|
55
|
+
code: 'trigger-not-found' as const,
|
|
56
|
+
message: `No trigger "${triggerId as unknown as string}"`,
|
|
57
|
+
triggerId,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
const save = (row: TriggerRecord): TriggerRecord => {
|
|
61
|
+
rows.set(row.triggerId as unknown as string, row);
|
|
62
|
+
return row;
|
|
63
|
+
};
|
|
64
|
+
const strip = (row: TriggerRecord & { unregistered?: boolean }): TriggerRecord => {
|
|
65
|
+
const { unregistered: _, ...rest } = row;
|
|
66
|
+
return rest as TriggerRecord;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const registry: InMemoryTriggerRegistry = {
|
|
70
|
+
async register(input: RegisterTriggerInput) {
|
|
71
|
+
const base = {
|
|
72
|
+
triggerId: randomUUID() as TriggerId,
|
|
73
|
+
tenantId: input.tenantId,
|
|
74
|
+
status: 'active' as const,
|
|
75
|
+
label: input.label ?? null,
|
|
76
|
+
lastFiredAt: null,
|
|
77
|
+
createdAt: now(),
|
|
78
|
+
updatedAt: now(),
|
|
79
|
+
};
|
|
80
|
+
if (input.kind === 'cron') {
|
|
81
|
+
return {
|
|
82
|
+
kind: 'ok',
|
|
83
|
+
value: save({
|
|
84
|
+
...base,
|
|
85
|
+
kind: 'cron',
|
|
86
|
+
target: input.target,
|
|
87
|
+
projectId: input.projectId ?? defaultProject,
|
|
88
|
+
owner: input.owner,
|
|
89
|
+
config: input.config,
|
|
90
|
+
catchUp: input.catchUp ?? SCHEDULE_DEFAULTS.catchUp,
|
|
91
|
+
overlap: input.overlap ?? SCHEDULE_DEFAULTS.overlap,
|
|
92
|
+
startingDeadlineSeconds:
|
|
93
|
+
input.startingDeadlineSeconds ?? SCHEDULE_DEFAULTS.startingDeadlineSeconds,
|
|
94
|
+
nextFireAt: null,
|
|
95
|
+
}),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const flow = { flowId: input.flowId, flowVersion: input.flowVersion };
|
|
99
|
+
return {
|
|
100
|
+
kind: 'ok',
|
|
101
|
+
value: save(
|
|
102
|
+
input.kind === 'event'
|
|
103
|
+
? { ...base, ...flow, kind: 'event', config: input.config }
|
|
104
|
+
: {
|
|
105
|
+
...base,
|
|
106
|
+
...flow,
|
|
107
|
+
kind: 'webhook',
|
|
108
|
+
config: input.config,
|
|
109
|
+
webhookId: input.webhookId,
|
|
110
|
+
hmacSecretName: input.hmacSecretName,
|
|
111
|
+
},
|
|
112
|
+
),
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
async update(input: UpdateTriggerInput) {
|
|
117
|
+
const row = live(input.tenantId, input.triggerId);
|
|
118
|
+
if (row === undefined || row.kind !== input.kind) return notFound(input.triggerId);
|
|
119
|
+
const common = {
|
|
120
|
+
updatedAt: now(),
|
|
121
|
+
...(input.label !== undefined && { label: input.label }),
|
|
122
|
+
};
|
|
123
|
+
if (row.kind === 'cron' && input.kind === 'cron') {
|
|
124
|
+
return {
|
|
125
|
+
kind: 'ok',
|
|
126
|
+
value: save({
|
|
127
|
+
...row,
|
|
128
|
+
...common,
|
|
129
|
+
config: { ...row.config, ...input.config },
|
|
130
|
+
...(input.target !== undefined && { target: input.target }),
|
|
131
|
+
...(input.catchUp !== undefined && { catchUp: input.catchUp }),
|
|
132
|
+
...(input.overlap !== undefined && { overlap: input.overlap }),
|
|
133
|
+
...(input.startingDeadlineSeconds !== undefined && {
|
|
134
|
+
startingDeadlineSeconds: input.startingDeadlineSeconds,
|
|
135
|
+
}),
|
|
136
|
+
} as CronTriggerRecord),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
kind: 'ok',
|
|
141
|
+
value: save({
|
|
142
|
+
...row,
|
|
143
|
+
...common,
|
|
144
|
+
config: { ...row.config, ...input.config },
|
|
145
|
+
...(input.kind !== 'cron' &&
|
|
146
|
+
input.flowVersion !== undefined && { flowVersion: input.flowVersion }),
|
|
147
|
+
} as TriggerRecord),
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
async list(input) {
|
|
152
|
+
const all = [...rows.values()]
|
|
153
|
+
.filter(
|
|
154
|
+
(r) =>
|
|
155
|
+
r.tenantId === input.tenantId &&
|
|
156
|
+
r.unregistered !== true &&
|
|
157
|
+
(input.kind === undefined || r.kind === input.kind) &&
|
|
158
|
+
(input.status === undefined || r.status === input.status),
|
|
159
|
+
)
|
|
160
|
+
.map(strip);
|
|
161
|
+
const start = input.cursor === undefined ? 0 : Number(input.cursor);
|
|
162
|
+
const limit = input.limit ?? 50;
|
|
163
|
+
const data = all.slice(start, start + limit);
|
|
164
|
+
return {
|
|
165
|
+
data,
|
|
166
|
+
...(start + limit < all.length && { nextCursor: String(start + limit) as Cursor }),
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
async get(input) {
|
|
171
|
+
const row = live(input.tenantId, input.triggerId);
|
|
172
|
+
return row === undefined ? null : strip(row);
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
async pause(input: TriggerLifecycleInput) {
|
|
176
|
+
return setStatus(input, 'paused');
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
async resume(input: TriggerLifecycleInput) {
|
|
180
|
+
return setStatus(input, 'active');
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
async unregister(input) {
|
|
184
|
+
const row = live(input.tenantId, input.triggerId);
|
|
185
|
+
if (row === undefined) return { triggerId: input.triggerId, unregistered: false };
|
|
186
|
+
rows.set(input.triggerId as unknown as string, { ...row, unregistered: true });
|
|
187
|
+
return { triggerId: input.triggerId, unregistered: true };
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
async fetchActiveByWebhookId(input) {
|
|
191
|
+
const row = [...rows.values()].find(
|
|
192
|
+
(r) =>
|
|
193
|
+
r.kind === 'webhook' &&
|
|
194
|
+
r.tenantId === input.tenantId &&
|
|
195
|
+
r.webhookId === input.webhookId &&
|
|
196
|
+
r.status === 'active' &&
|
|
197
|
+
r.unregistered !== true,
|
|
198
|
+
);
|
|
199
|
+
return row?.kind === 'webhook' ? row : null;
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
async listFires(input: ListTriggerFiresInput): Promise<TriggerFirePage> {
|
|
203
|
+
const mine = fires
|
|
204
|
+
.filter((f) => f.triggerId === input.triggerId && live(input.tenantId, f.triggerId))
|
|
205
|
+
.reverse();
|
|
206
|
+
const start = input.cursor === undefined ? 0 : Number(input.cursor);
|
|
207
|
+
const limit = input.limit ?? 50;
|
|
208
|
+
return {
|
|
209
|
+
data: mine.slice(start, start + limit),
|
|
210
|
+
...(start + limit < mine.length && { nextCursor: String(start + limit) as Cursor }),
|
|
211
|
+
};
|
|
212
|
+
},
|
|
213
|
+
|
|
214
|
+
async fireNow(input: TriggerLifecycleInput) {
|
|
215
|
+
const row = live(input.tenantId, input.triggerId);
|
|
216
|
+
if (row === undefined || row.kind !== 'cron') return notFound(input.triggerId);
|
|
217
|
+
return {
|
|
218
|
+
kind: 'ok',
|
|
219
|
+
value: registry.recordFire({
|
|
220
|
+
triggerId: input.triggerId,
|
|
221
|
+
kind: 'schedule',
|
|
222
|
+
firedAt: now(),
|
|
223
|
+
outcome: 'pending',
|
|
224
|
+
manual: true,
|
|
225
|
+
}),
|
|
226
|
+
};
|
|
227
|
+
},
|
|
228
|
+
|
|
229
|
+
async setOwner(input: TriggerLifecycleInput & { readonly owner: TriggerOwner }) {
|
|
230
|
+
const row = live(input.tenantId, input.triggerId);
|
|
231
|
+
if (row === undefined || row.kind !== 'cron') return notFound(input.triggerId);
|
|
232
|
+
return { kind: 'ok', value: save({ ...row, owner: input.owner, updatedAt: now() }) };
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
recordFire(fire) {
|
|
236
|
+
const recorded: TriggerFire = { ...fire, fireId: fire.fireId ?? randomUUID() };
|
|
237
|
+
fires.push(recorded);
|
|
238
|
+
return recorded;
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
async function setStatus(input: TriggerLifecycleInput, status: 'active' | 'paused') {
|
|
243
|
+
const row = live(input.tenantId, input.triggerId);
|
|
244
|
+
if (row === undefined) return notFound(input.triggerId);
|
|
245
|
+
if (row.status === status) {
|
|
246
|
+
return {
|
|
247
|
+
kind: 'err' as const,
|
|
248
|
+
error: {
|
|
249
|
+
code: 'trigger-already-in-state' as const,
|
|
250
|
+
message: `The trigger is already ${status}`,
|
|
251
|
+
triggerId: input.triggerId,
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
return { kind: 'ok' as const, value: save({ ...row, status, updatedAt: now() }) };
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return registry;
|
|
259
|
+
}
|
package/src/token-admin.ts
CHANGED
|
@@ -9,29 +9,46 @@ import type { ApiTokenId, ProjectId, TenantId } from '@kindgi/types';
|
|
|
9
9
|
* Splitting keeps the auth hot path free of write concerns and lets
|
|
10
10
|
* deployments plug in different implementations.
|
|
11
11
|
*
|
|
12
|
-
* An API key
|
|
13
|
-
* (`
|
|
14
|
-
*
|
|
15
|
-
*
|
|
12
|
+
* An API key always acts for one principal (`TokenPrincipal`): a person
|
|
13
|
+
* (`user:<id>`) or a service account (`service_account:<id>`), with that
|
|
14
|
+
* principal's grants and nothing more. Its `role` is a ceiling under those
|
|
15
|
+
* grants, and its `projectId` narrows it to one project; neither ever
|
|
16
|
+
* widens it. `POST /v1/tokens` mints; `GET /v1/tokens` and
|
|
17
|
+
* `GET /v1/tokens/:tokenId` read (never the secret);
|
|
16
18
|
* `POST /v1/tokens/:tokenId/revoke` revokes.
|
|
17
19
|
*/
|
|
18
20
|
export interface TokenAdmin {
|
|
19
|
-
|
|
21
|
+
/** The new key and its secret, or why the store refused it. */
|
|
22
|
+
mint(input: TokenMintInput): Promise<TokenMintOutput | TokenMintRefusal>;
|
|
20
23
|
list(input: TokenListInput): Promise<readonly ApiTokenRecord[]>;
|
|
21
24
|
get(input: TokenGetInput): Promise<ApiTokenRecord | undefined>;
|
|
22
25
|
revoke(input: TokenRevokeInput): Promise<TokenRevokeOutcome>;
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
/**
|
|
26
|
-
* A key's role
|
|
27
|
-
*
|
|
29
|
+
* A key's role: the most it may do, under its principal's grants. An
|
|
30
|
+
* `admin` key may administer the tenant when its principal can; a `member`
|
|
31
|
+
* key administers nothing, even when its principal is an admin (a
|
|
32
|
+
* day-to-day key that can't change keys, grants or policies).
|
|
28
33
|
*/
|
|
29
34
|
export type ApiTokenRole = 'admin' | 'member';
|
|
30
35
|
|
|
31
36
|
export const API_TOKEN_ROLES: readonly ApiTokenRole[] = ['admin', 'member'];
|
|
32
37
|
|
|
38
|
+
/** Whom a key acts for: a person, or a service account. */
|
|
39
|
+
export type TokenPrincipal =
|
|
40
|
+
| { readonly kind: 'user'; readonly userId: string }
|
|
41
|
+
| { readonly kind: 'service-account'; readonly serviceAccountId: string };
|
|
42
|
+
|
|
33
43
|
export interface TokenMintInput {
|
|
34
44
|
readonly tenantId: TenantId;
|
|
45
|
+
/**
|
|
46
|
+
* Whom the key acts for: the caller, unless a tenant admin names
|
|
47
|
+
* someone else. Absent when a tenant admin whose token names no
|
|
48
|
+
* principal mints for themselves; the key is then a service account of
|
|
49
|
+
* its own, as every key was before principals.
|
|
50
|
+
*/
|
|
51
|
+
readonly principal?: TokenPrincipal;
|
|
35
52
|
readonly role: ApiTokenRole;
|
|
36
53
|
/**
|
|
37
54
|
* Framework capabilities the key carries (`env:write`, `secrets:write`,
|
|
@@ -42,7 +59,7 @@ export interface TokenMintInput {
|
|
|
42
59
|
readonly label?: string;
|
|
43
60
|
/** Optional expiration date. */
|
|
44
61
|
readonly expiresAt?: Date;
|
|
45
|
-
/** Optional project
|
|
62
|
+
/** Optional project: the key is narrowed to it, refused on any other. */
|
|
46
63
|
readonly projectId?: ProjectId;
|
|
47
64
|
/**
|
|
48
65
|
* Who minted it, as a principal reference: `user:<id>` or
|
|
@@ -51,6 +68,15 @@ export interface TokenMintInput {
|
|
|
51
68
|
readonly createdBy?: string;
|
|
52
69
|
}
|
|
53
70
|
|
|
71
|
+
/**
|
|
72
|
+
* A mint the store refused: the principal doesn't exist (or is
|
|
73
|
+
* unregistered), or an `admin` key for a principal that isn't a tenant
|
|
74
|
+
* admin.
|
|
75
|
+
*/
|
|
76
|
+
export type TokenMintRefusal =
|
|
77
|
+
| { readonly kind: 'principal-not-found'; readonly message: string }
|
|
78
|
+
| { readonly kind: 'role-exceeds-principal'; readonly message: string };
|
|
79
|
+
|
|
54
80
|
export interface TokenMintOutput {
|
|
55
81
|
/** The new key, as `list` and `get` will show it. */
|
|
56
82
|
readonly record: ApiTokenRecord;
|
|
@@ -65,6 +91,8 @@ export interface TokenMintOutput {
|
|
|
65
91
|
/** What a key looks like after minting: everything but its secret. */
|
|
66
92
|
export interface ApiTokenRecord {
|
|
67
93
|
readonly tokenId: ApiTokenId;
|
|
94
|
+
/** Whom it acts for. Absent from stores built before principals. */
|
|
95
|
+
readonly principal?: TokenPrincipal;
|
|
68
96
|
readonly role: ApiTokenRole;
|
|
69
97
|
readonly capabilities: readonly string[];
|
|
70
98
|
readonly label?: string;
|
|
@@ -87,6 +115,8 @@ export interface ApiTokenRecord {
|
|
|
87
115
|
export interface TokenListInput {
|
|
88
116
|
readonly tenantId: TenantId;
|
|
89
117
|
readonly limit: number;
|
|
118
|
+
/** Only the keys that act for this principal (a person sees only their own). */
|
|
119
|
+
readonly principal?: TokenPrincipal;
|
|
90
120
|
/** The last record of the previous page. */
|
|
91
121
|
readonly after?: { readonly createdAt: Date; readonly tokenId: ApiTokenId };
|
|
92
122
|
}
|
|
@@ -99,6 +129,8 @@ export interface TokenGetInput {
|
|
|
99
129
|
export interface TokenRevokeInput {
|
|
100
130
|
readonly tenantId: TenantId;
|
|
101
131
|
readonly tokenId: ApiTokenId;
|
|
132
|
+
/** Who revoked it: `user:<id>` or `service_account:<id>`. */
|
|
133
|
+
readonly revokedBy?: string;
|
|
102
134
|
}
|
|
103
135
|
|
|
104
136
|
export type TokenRevokeOutcome = { readonly kind: 'ok' } | { readonly kind: 'not-found' };
|
package/src/tool-binding.ts
CHANGED
|
@@ -96,6 +96,8 @@ export interface ToolRegistryBinding {
|
|
|
96
96
|
* same `(toolId, version)` is re-published; the route maps that to
|
|
97
97
|
* `409`. Semver hygiene: version numbers are single-use even after
|
|
98
98
|
* unregister — reinstate instead of republishing the same bytes.
|
|
99
|
+
* A version of a tool whose versions live in another project is
|
|
100
|
+
* `project-mismatch` (tools never move between projects; `409 tool-project-mismatch`).
|
|
99
101
|
*/
|
|
100
102
|
publish(input: ToolPublishInput): Promise<ToolPublishOutcome>;
|
|
101
103
|
/**
|
|
@@ -236,6 +238,18 @@ export type ToolPublishOutcome =
|
|
|
236
238
|
readonly toolId: ToolId;
|
|
237
239
|
readonly version: Semver;
|
|
238
240
|
readonly projectId: ProjectId;
|
|
241
|
+
}
|
|
242
|
+
| {
|
|
243
|
+
/**
|
|
244
|
+
* The tool's versions live in another project: a tool belongs to
|
|
245
|
+
* the project its first version was published into, and never
|
|
246
|
+
* moves. Nothing is written (the route answers `409 tool-project-mismatch`).
|
|
247
|
+
*/
|
|
248
|
+
readonly kind: 'project-mismatch';
|
|
249
|
+
readonly toolId: ToolId;
|
|
250
|
+
readonly version: Semver;
|
|
251
|
+
/** The project the tool belongs to. */
|
|
252
|
+
readonly projectId: ProjectId;
|
|
239
253
|
};
|
|
240
254
|
|
|
241
255
|
export type ToolUnregisterOutcome = {
|
package/src/trigger-binding.ts
CHANGED
|
@@ -16,18 +16,25 @@ export type {
|
|
|
16
16
|
CronTriggerRecord,
|
|
17
17
|
EventTriggerRecord,
|
|
18
18
|
GetTriggerInput,
|
|
19
|
+
ListTriggerFiresInput,
|
|
19
20
|
ListTriggersInput,
|
|
20
21
|
RegisterCronTriggerInput,
|
|
21
22
|
RegisterEventTriggerInput,
|
|
22
23
|
RegisterTriggerError,
|
|
23
24
|
RegisterTriggerInput,
|
|
24
25
|
RegisterWebhookTriggerInput,
|
|
26
|
+
ScheduleCatchUp,
|
|
27
|
+
ScheduleOverlap,
|
|
28
|
+
TriggerFire,
|
|
29
|
+
TriggerFirePage,
|
|
25
30
|
TriggerKind,
|
|
26
31
|
TriggerLifecycleError,
|
|
27
32
|
TriggerLifecycleInput,
|
|
28
33
|
TriggerListPage,
|
|
29
34
|
TriggerRecord,
|
|
35
|
+
TriggerOwner,
|
|
30
36
|
TriggerRegistryBinding,
|
|
37
|
+
TriggerTarget,
|
|
31
38
|
UpdateCronTriggerInput,
|
|
32
39
|
UpdateEventTriggerInput,
|
|
33
40
|
UpdateTriggerError,
|
|
@@ -35,4 +42,4 @@ export type {
|
|
|
35
42
|
UpdateWebhookTriggerInput,
|
|
36
43
|
WebhookTriggerRecord,
|
|
37
44
|
} from '@kindgi/runtime';
|
|
38
|
-
export { TRIGGER_KINDS } from '@kindgi/runtime';
|
|
45
|
+
export { SCHEDULE_DEFAULTS, TRIGGER_KINDS } from '@kindgi/runtime';
|
package/src/types.ts
CHANGED
|
@@ -42,6 +42,20 @@ export interface AppEnv {
|
|
|
42
42
|
* account.
|
|
43
43
|
*/
|
|
44
44
|
tokenId?: ApiTokenId;
|
|
45
|
+
/** The service account an API key acts for. */
|
|
46
|
+
serviceAccountId?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Set by a route whose answer carries a secret (`withholdFromReplay`):
|
|
49
|
+
* the Idempotency-Key middleware keeps that the request succeeded, not
|
|
50
|
+
* its answer.
|
|
51
|
+
*/
|
|
52
|
+
idempotencyWithhold?: boolean;
|
|
53
|
+
/** An API key's role ceiling (`member` keys can't administer the tenant). */
|
|
54
|
+
tokenRole?: 'admin' | 'member';
|
|
55
|
+
/** The project an API key is narrowed to. */
|
|
56
|
+
tokenProjectId?: string;
|
|
57
|
+
/** When the API token the request came with expires, if it does. */
|
|
58
|
+
tokenExpiresAt?: Date;
|
|
45
59
|
/**
|
|
46
60
|
* Set by `bearerAuthMiddleware` when the caller presented a
|
|
47
61
|
* framework-issued OAuth session token (`kgi_sk_*`).
|
|
@@ -49,6 +63,8 @@ export interface AppEnv {
|
|
|
49
63
|
* revoke without a second lookup. Absent for static bearer tokens.
|
|
50
64
|
*/
|
|
51
65
|
sessionId?: SessionId;
|
|
66
|
+
/** Set when the session token came from a cookie (not a header): that cookie's name. */
|
|
67
|
+
sessionCookieName?: string;
|
|
52
68
|
/** Identity-provider id behind a session token. Absent for bearer. */
|
|
53
69
|
providerId?: string;
|
|
54
70
|
/** Set by `sigv4Middleware` on `/s3/*`: the bucket the credential may access. */
|