@pikku/core 0.12.72 → 0.12.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1171 -0
- package/dist/column-form.d.ts +32 -0
- package/dist/column-form.js +42 -0
- package/dist/crypto-utils.d.ts +43 -7
- package/dist/crypto-utils.js +163 -42
- package/dist/data-classification.d.ts +44 -0
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +37 -32
- package/dist/function/functions.types.d.ts +57 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/index.d.ts +1 -1
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -13
- package/dist/handle-error.js +0 -18
- package/dist/index.d.ts +11 -5
- package/dist/index.js +7 -2
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +5 -41
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +4 -3
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +9 -8
- package/dist/schema.d.ts +5 -39
- package/dist/schema.js +5 -39
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/secret-value.d.ts +56 -0
- package/dist/secret-value.js +46 -0
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.d.ts +74 -4
- package/dist/services/audit-service.js +8 -7
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/credential-wire-service.d.ts +5 -0
- package/dist/services/credential-wire-service.js +9 -1
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/email-service.d.ts +2 -1
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +8 -9
- package/dist/services/index.js +3 -6
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content-request-handler.d.ts +29 -0
- package/dist/services/local-content-request-handler.js +176 -0
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +4 -7
- package/dist/services/local-secrets.js +7 -7
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +22 -40
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +10 -42
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +4 -7
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +12 -35
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +5 -11
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +21 -64
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +6 -23
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +120 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +46 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +65 -132
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +63 -22
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +180 -64
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +124 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +59 -1
- package/dist/wirings/ai-agent/voice-input.js +90 -12
- package/dist/wirings/ai-agent/voice-output.d.ts +69 -1
- package/dist/wirings/ai-agent/voice-output.js +162 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +38 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +129 -0
- package/dist/wirings/cli/channel/index.d.ts +5 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +0 -99
- package/dist/wirings/http/http-runner.js +9 -165
- package/dist/wirings/http/http.types.d.ts +14 -55
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +0 -40
- package/dist/wirings/http/pikku-fetch-http-request.js +0 -58
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -4
- package/dist/wirings/mcp/mcp-runner.js +1 -14
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +32 -0
- package/dist/wirings/persona/define-personas.js +31 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +136 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +103 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +20 -90
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +17 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +3 -13
- package/dist/wirings/rpc/remote-addon-auth.js +7 -11
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +30 -0
- package/dist/wirings/virtual-user/index.js +10 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +54 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +49 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.d.ts +90 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +19 -15
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -43
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +1 -19
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +84 -12
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +5 -195
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +48 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +84 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +41 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +117 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +53 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +48 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/validate-checks-personas-through-a-shared-module.md +43 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +6 -2
- package/run-tests.sh +0 -0
- package/src/column-form.test.ts +97 -0
- package/src/column-form.ts +58 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +306 -59
- package/src/data-classification.ts +45 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +0 -7
- package/src/function/function-runner.ts +62 -32
- package/src/function/functions.types.ts +95 -138
- package/src/function/index.ts +1 -0
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/handle-error.ts +0 -18
- package/src/index.ts +84 -3
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +3 -5
- package/src/middleware/auth-bearer.ts +5 -41
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +26 -10
- package/src/middleware/remote-auth.ts +11 -3
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +173 -0
- package/src/remote.ts +18 -8
- package/src/schema.ts +5 -39
- package/src/scopes.ts +7 -48
- package/src/secret-value.test.ts +204 -0
- package/src/secret-value.ts +111 -0
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +88 -11
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/credential-wire-service.ts +9 -1
- package/src/services/deployment-service.ts +3 -9
- package/src/services/email-service.ts +3 -1
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +23 -18
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content-request-handler.test.ts +202 -0
- package/src/services/local-content-request-handler.ts +267 -0
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.test.ts +20 -5
- package/src/services/local-secrets.ts +15 -11
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +31 -46
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.test.ts +2 -1
- package/src/services/queue-webhook-service.ts +10 -42
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +4 -7
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +12 -35
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +12 -14
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +23 -64
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +6 -32
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +137 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +91 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +49 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +89 -139
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +85 -35
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +224 -76
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +130 -5
- package/src/wirings/ai-agent/index.ts +37 -3
- package/src/wirings/ai-agent/voice-input.test.ts +137 -7
- package/src/wirings/ai-agent/voice-input.ts +96 -12
- package/src/wirings/ai-agent/voice-output.test.ts +512 -0
- package/src/wirings/ai-agent/voice-output.ts +243 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +185 -0
- package/src/wirings/cli/channel/index.ts +13 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +8 -167
- package/src/wirings/http/http.types.ts +15 -62
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +2 -10
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -58
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.ts +2 -17
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +33 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +142 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +454 -0
- package/src/wirings/queue/queue-identity.ts +176 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +25 -90
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +60 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +9 -16
- package/src/wirings/rpc/rpc-runner.test.ts +192 -6
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +88 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +115 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +95 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-run-store.ts +98 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +19 -20
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -61
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.test.ts +5 -7
- package/src/wirings/workflow/scenario-prose.ts +1 -29
- package/src/wirings/workflow/scenario-service.test.ts +2 -10
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +163 -19
- package/src/wirings/workflow/scenario-step.types.ts +94 -12
- package/src/wirings/workflow/scenario-surface.test.ts +146 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +5 -201
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +12 -0
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
package/dist/schema.d.ts
CHANGED
|
@@ -1,48 +1,14 @@
|
|
|
1
1
|
import type { Logger } from './services/logger.js';
|
|
2
2
|
import type { SchemaService } from './services/schema-service.js';
|
|
3
|
-
/**
|
|
4
|
-
* Adds a schema to the schemas map for a specific package.
|
|
5
|
-
* @param name - The name of the schema.
|
|
6
|
-
* @param value - The schema value.
|
|
7
|
-
* @param packageName - The package name (null for main package, '@scope/package' for addon packages).
|
|
8
|
-
* @ignore
|
|
9
|
-
*/
|
|
10
3
|
export declare const addSchema: (name: string, value: any, packageName?: string | null) => void;
|
|
11
|
-
/**
|
|
12
|
-
* Retrieves a schema from the schemas map for a specific package.
|
|
13
|
-
* @param name - The name of the schema.
|
|
14
|
-
* @param packageName - The package name (null for main package, '@scope/package' for addon packages).
|
|
15
|
-
* @returns The schema value or undefined if not found.
|
|
16
|
-
* @ignore
|
|
17
|
-
*/
|
|
18
4
|
export declare const getSchema: (name: string, packageName?: string | null) => Record<string, unknown> | undefined;
|
|
19
|
-
/**
|
|
20
|
-
* Loads a schema and compiles it into a validator.
|
|
21
|
-
* @param logger - A logger for logging information.
|
|
22
|
-
*/
|
|
23
5
|
export declare const compileAllSchemas: (logger: Logger, schemaService?: SchemaService) => void;
|
|
24
6
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* ships with (`@cfworker/json-schema`, and Ajv unless `useDefaults` is set)
|
|
31
|
-
* annotate the instance, so the function received `undefined` for a property
|
|
32
|
-
* its generated type declares as present. That is the worst shape a mismatch
|
|
33
|
-
* can take: validation permits the omission, the type says the value is there,
|
|
34
|
-
* and the body reads `undefined`.
|
|
35
|
-
*
|
|
36
|
-
* Applied unconditionally rather than alongside `coerceTopLevelDataFromSchema`,
|
|
37
|
-
* whose `coerceDataFromSchema` flag is about decoding transport-encoded values
|
|
38
|
-
* (a query string's `"1,2"` into an array). Defaults are a property of the
|
|
39
|
-
* schema, not of how the call arrived, so gating them on that flag would apply
|
|
40
|
-
* them over HTTP and skip them on a direct RPC invocation.
|
|
41
|
-
*
|
|
42
|
-
* Returns the data to use, which is a new object only when defaults had to be
|
|
43
|
-
* added to a nullish input — a call made with no arguments at all still gets
|
|
44
|
-
* them. Values are cloned so an object or array default (`[]`, `{}`) is never
|
|
45
|
-
* shared as one mutable instance across every request.
|
|
7
|
+
* Fills in absent top-level properties from their schema `default`. Applied
|
|
8
|
+
* unconditionally: a default belongs to the schema, not to the transport the
|
|
9
|
+
* call arrived on, and runs before coercion so a defaulted and a supplied
|
|
10
|
+
* value are treated identically from here on. Values are cloned so an object
|
|
11
|
+
* or array default is never shared as one mutable instance across requests.
|
|
46
12
|
*/
|
|
47
13
|
export declare const applyDefaultsFromSchema: (schemaName: string, data: any, packageName?: string | null) => any;
|
|
48
14
|
export declare const coerceTopLevelDataFromSchema: (schemaName: string, data: any, packageName?: string | null) => void;
|
package/dist/schema.js
CHANGED
|
@@ -1,31 +1,13 @@
|
|
|
1
1
|
import { MissingSchemaError, UnprocessableContentError, } from './errors/errors.js';
|
|
2
2
|
import { pikkuState, getAllPackageStates } from './pikku-state.js';
|
|
3
3
|
const schemaKey = (name, packageName) => packageName ? `${packageName}:${name}` : name;
|
|
4
|
-
/**
|
|
5
|
-
* Adds a schema to the schemas map for a specific package.
|
|
6
|
-
* @param name - The name of the schema.
|
|
7
|
-
* @param value - The schema value.
|
|
8
|
-
* @param packageName - The package name (null for main package, '@scope/package' for addon packages).
|
|
9
|
-
* @ignore
|
|
10
|
-
*/
|
|
11
4
|
export const addSchema = (name, value, packageName = null) => {
|
|
12
5
|
const schema = value?.default ?? value;
|
|
13
6
|
pikkuState(packageName, 'misc', 'schemas').set(name, schema);
|
|
14
7
|
};
|
|
15
|
-
/**
|
|
16
|
-
* Retrieves a schema from the schemas map for a specific package.
|
|
17
|
-
* @param name - The name of the schema.
|
|
18
|
-
* @param packageName - The package name (null for main package, '@scope/package' for addon packages).
|
|
19
|
-
* @returns The schema value or undefined if not found.
|
|
20
|
-
* @ignore
|
|
21
|
-
*/
|
|
22
8
|
export const getSchema = (name, packageName = null) => {
|
|
23
9
|
return pikkuState(packageName, 'misc', 'schemas').get(name);
|
|
24
10
|
};
|
|
25
|
-
/**
|
|
26
|
-
* Loads a schema and compiles it into a validator.
|
|
27
|
-
* @param logger - A logger for logging information.
|
|
28
|
-
*/
|
|
29
11
|
export const compileAllSchemas = (logger, schemaService) => {
|
|
30
12
|
if (!schemaService) {
|
|
31
13
|
schemaService = pikkuState(null, 'package', 'singletonServices')?.schema;
|
|
@@ -66,27 +48,11 @@ const validateAllSchemasLoaded = (logger, schemaService) => {
|
|
|
66
48
|
}
|
|
67
49
|
};
|
|
68
50
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* ships with (`@cfworker/json-schema`, and Ajv unless `useDefaults` is set)
|
|
75
|
-
* annotate the instance, so the function received `undefined` for a property
|
|
76
|
-
* its generated type declares as present. That is the worst shape a mismatch
|
|
77
|
-
* can take: validation permits the omission, the type says the value is there,
|
|
78
|
-
* and the body reads `undefined`.
|
|
79
|
-
*
|
|
80
|
-
* Applied unconditionally rather than alongside `coerceTopLevelDataFromSchema`,
|
|
81
|
-
* whose `coerceDataFromSchema` flag is about decoding transport-encoded values
|
|
82
|
-
* (a query string's `"1,2"` into an array). Defaults are a property of the
|
|
83
|
-
* schema, not of how the call arrived, so gating them on that flag would apply
|
|
84
|
-
* them over HTTP and skip them on a direct RPC invocation.
|
|
85
|
-
*
|
|
86
|
-
* Returns the data to use, which is a new object only when defaults had to be
|
|
87
|
-
* added to a nullish input — a call made with no arguments at all still gets
|
|
88
|
-
* them. Values are cloned so an object or array default (`[]`, `{}`) is never
|
|
89
|
-
* shared as one mutable instance across every request.
|
|
51
|
+
* Fills in absent top-level properties from their schema `default`. Applied
|
|
52
|
+
* unconditionally: a default belongs to the schema, not to the transport the
|
|
53
|
+
* call arrived on, and runs before coercion so a defaulted and a supplied
|
|
54
|
+
* value are treated identically from here on. Values are cloned so an object
|
|
55
|
+
* or array default is never shared as one mutable instance across requests.
|
|
90
56
|
*/
|
|
91
57
|
export const applyDefaultsFromSchema = (schemaName, data, packageName = null) => {
|
|
92
58
|
const schema = pikkuState(packageName, 'misc', 'schemas').get(schemaName);
|
package/dist/scopes.d.ts
CHANGED
|
@@ -1,31 +1,12 @@
|
|
|
1
1
|
import type { CoreUserSession } from './types/core.types.js';
|
|
2
2
|
/**
|
|
3
|
-
* Whether a set of held grants satisfies every required scope.
|
|
4
|
-
*
|
|
5
3
|
* The non-throwing counterpart to {@link verifyScopes}, for deciding rather
|
|
6
|
-
* than enforcing
|
|
7
|
-
* it is not satisfied, rather than rejecting the request outright.
|
|
8
|
-
*
|
|
9
|
-
* Fails closed: an absent or empty `held` satisfies nothing. An empty
|
|
10
|
-
* `required` is satisfied by anything.
|
|
11
|
-
*
|
|
12
|
-
* @param required - Scopes to check for. Empty means no gate.
|
|
13
|
-
* @param held - The grants held, e.g. `session.scopes`. May be undefined.
|
|
4
|
+
* than enforcing. Fails closed; an empty `required` is satisfied by anything.
|
|
14
5
|
*/
|
|
15
6
|
export declare const hasScopes: (required: readonly string[] | undefined, held: Iterable<string> | undefined) => boolean;
|
|
16
7
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* Scopes are an AND gate: every entry in `required` must be satisfied. This is
|
|
21
|
-
* deliberately distinct from `permissions`, which OR together — a scope can
|
|
22
|
-
* only ever narrow access, so adding one to a function can never widen it.
|
|
23
|
-
*
|
|
24
|
-
* Fails closed: a session without a `scopes` field, or no session at all,
|
|
25
|
-
* satisfies nothing.
|
|
26
|
-
*
|
|
27
|
-
* @param required - Scopes the function declares. Empty means no gate.
|
|
28
|
-
* @param session - The session to check. May be undefined.
|
|
29
|
-
* @throws {MissingScopeError} Naming the first unsatisfied scope.
|
|
8
|
+
* Throws {@link MissingScopeError} naming the first scope the session does not
|
|
9
|
+
* hold. Fails closed: no session, or a session without `scopes`, satisfies
|
|
10
|
+
* nothing.
|
|
30
11
|
*/
|
|
31
12
|
export declare const verifyScopes: (required: readonly string[] | undefined, session: CoreUserSession | undefined) => void;
|
package/dist/scopes.js
CHANGED
|
@@ -2,13 +2,9 @@ import { MissingScopeError } from './errors/errors.js';
|
|
|
2
2
|
const SEPARATOR = ':';
|
|
3
3
|
const WILDCARD = '*';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Every grant that would satisfy `scope`: the scope itself, a wildcard
|
|
6
6
|
* directly beneath it, a wildcard at each ancestor level, and each plain
|
|
7
|
-
* ancestor id
|
|
8
|
-
*
|
|
9
|
-
* For `admin:invoices:create` that is:
|
|
10
|
-
* admin:invoices:create, admin:invoices:create:*, *, admin:*, admin:invoices:*,
|
|
11
|
-
* admin, admin:invoices
|
|
7
|
+
* ancestor id.
|
|
12
8
|
*/
|
|
13
9
|
const satisfyingGrants = (scope) => {
|
|
14
10
|
const segments = scope.split(SEPARATOR);
|
|
@@ -21,26 +17,8 @@ const satisfyingGrants = (scope) => {
|
|
|
21
17
|
}
|
|
22
18
|
return grants;
|
|
23
19
|
};
|
|
24
|
-
/**
|
|
25
|
-
* Checks whether `held` satisfies a single required scope.
|
|
26
|
-
*
|
|
27
|
-
* A grant satisfies a requirement when it is the scope itself, a plain ancestor
|
|
28
|
-
* (`admin` covers `admin:invoices:create`), a wildcard at or above it (`admin:*`
|
|
29
|
-
* covers `admin` and `admin:invoices:create`), or the bare `*`. A narrower grant
|
|
30
|
-
* never satisfies a broader requirement — `admin:invoices` does not grant
|
|
31
|
-
* `admin`.
|
|
32
|
-
*/
|
|
33
20
|
const holds = (held, scope) => satisfyingGrants(scope).some((grant) => held.has(grant));
|
|
34
|
-
/**
|
|
35
|
-
* The first required scope a set of held grants does not satisfy, or `null`
|
|
36
|
-
* when every one is satisfied.
|
|
37
|
-
*
|
|
38
|
-
* Scopes are an AND gate: every entry in `required` must be satisfied. This is
|
|
39
|
-
* deliberately distinct from `permissions`, which OR together — a scope can
|
|
40
|
-
* only ever narrow access, so adding one to a function can never widen it.
|
|
41
|
-
*
|
|
42
|
-
* Fails closed: an absent `held` satisfies nothing.
|
|
43
|
-
*/
|
|
21
|
+
/** The first required scope `held` does not satisfy, or `null`. Fails closed. */
|
|
44
22
|
const firstUnsatisfied = (required, held) => {
|
|
45
23
|
if (!required || required.length === 0) {
|
|
46
24
|
return null;
|
|
@@ -54,33 +32,14 @@ const firstUnsatisfied = (required, held) => {
|
|
|
54
32
|
return null;
|
|
55
33
|
};
|
|
56
34
|
/**
|
|
57
|
-
* Whether a set of held grants satisfies every required scope.
|
|
58
|
-
*
|
|
59
35
|
* The non-throwing counterpart to {@link verifyScopes}, for deciding rather
|
|
60
|
-
* than enforcing
|
|
61
|
-
* it is not satisfied, rather than rejecting the request outright.
|
|
62
|
-
*
|
|
63
|
-
* Fails closed: an absent or empty `held` satisfies nothing. An empty
|
|
64
|
-
* `required` is satisfied by anything.
|
|
65
|
-
*
|
|
66
|
-
* @param required - Scopes to check for. Empty means no gate.
|
|
67
|
-
* @param held - The grants held, e.g. `session.scopes`. May be undefined.
|
|
36
|
+
* than enforcing. Fails closed; an empty `required` is satisfied by anything.
|
|
68
37
|
*/
|
|
69
38
|
export const hasScopes = (required, held) => firstUnsatisfied(required, held) === null;
|
|
70
39
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* Scopes are an AND gate: every entry in `required` must be satisfied. This is
|
|
75
|
-
* deliberately distinct from `permissions`, which OR together — a scope can
|
|
76
|
-
* only ever narrow access, so adding one to a function can never widen it.
|
|
77
|
-
*
|
|
78
|
-
* Fails closed: a session without a `scopes` field, or no session at all,
|
|
79
|
-
* satisfies nothing.
|
|
80
|
-
*
|
|
81
|
-
* @param required - Scopes the function declares. Empty means no gate.
|
|
82
|
-
* @param session - The session to check. May be undefined.
|
|
83
|
-
* @throws {MissingScopeError} Naming the first unsatisfied scope.
|
|
40
|
+
* Throws {@link MissingScopeError} naming the first scope the session does not
|
|
41
|
+
* hold. Fails closed: no session, or a session without `scopes`, satisfies
|
|
42
|
+
* nothing.
|
|
84
43
|
*/
|
|
85
44
|
export const verifyScopes = (required, session) => {
|
|
86
45
|
const missing = firstUnsatisfied(required, session?.scopes);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Secret } from './data-classification.js';
|
|
2
|
+
declare const secretValueBrand: unique symbol;
|
|
3
|
+
export declare const REDACTED = "[secret]";
|
|
4
|
+
/** Runtime marker, resilient to duplicate copies of core. */
|
|
5
|
+
declare const SECRET_VALUE: unique symbol;
|
|
6
|
+
declare const NODE_INSPECT: unique symbol;
|
|
7
|
+
export declare class SecretCoercionError extends Error {
|
|
8
|
+
constructor();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A vault secret. Nominal, so it is not assignable to `string` and every
|
|
12
|
+
* concretely-typed sink rejects it; `.reveal()` is the one way out, and every
|
|
13
|
+
* call is a deliberate, greppable disclosure.
|
|
14
|
+
*
|
|
15
|
+
* The revealed value carries the erasable `Secret<T>` classification brand, so
|
|
16
|
+
* the inspector can still follow it one hop past the call.
|
|
17
|
+
*
|
|
18
|
+
* Structured serialization redacts to `[secret]` — an audit or log write must
|
|
19
|
+
* stay honest about the field without crashing the request. String coercion
|
|
20
|
+
* throws, because a template literal or concatenation is always a leak.
|
|
21
|
+
*/
|
|
22
|
+
export declare class SecretValue<T = string> {
|
|
23
|
+
#private;
|
|
24
|
+
readonly [secretValueBrand]: true;
|
|
25
|
+
readonly [SECRET_VALUE] = true;
|
|
26
|
+
constructor(value: T);
|
|
27
|
+
reveal(): Secret<T>;
|
|
28
|
+
toJSON(): string;
|
|
29
|
+
[NODE_INSPECT](): string;
|
|
30
|
+
toString(): never;
|
|
31
|
+
[Symbol.toPrimitive](): never;
|
|
32
|
+
}
|
|
33
|
+
export declare const createSecretValue: <T>(value: T) => SecretValue<T>;
|
|
34
|
+
export declare const isSecretValue: (value: unknown) => value is SecretValue<unknown>;
|
|
35
|
+
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
36
|
+
type Passthrough = Function | Date | RegExp | Error | ArrayBuffer | ArrayBufferView;
|
|
37
|
+
/**
|
|
38
|
+
* Rejects a `SecretValue` anywhere in `T`, however deeply nested, by collapsing
|
|
39
|
+
* it to `never`.
|
|
40
|
+
*
|
|
41
|
+
* For sinks whose parameters are `any`, `unknown` or a free generic — loggers,
|
|
42
|
+
* queue payloads, channel messages — where nominality alone cannot help.
|
|
43
|
+
* `any` is passed through untouched: it cannot be guarded, and collapsing it
|
|
44
|
+
* would reject every legitimate call.
|
|
45
|
+
*
|
|
46
|
+
* `Promise`, `Map` and `Set` are recursed into rather than passed through. A
|
|
47
|
+
* mapped type cannot reach what they hold — mapping their keys yields their
|
|
48
|
+
* methods, not their contents — so treating them as opaque let a secret ride
|
|
49
|
+
* through inside one. `Promise` is the case that bites: `getSecret()` returns
|
|
50
|
+
* `Promise<SecretValue<T>>`, so a forgotten `await` would otherwise log a
|
|
51
|
+
* secret.
|
|
52
|
+
*/
|
|
53
|
+
export type Safe<T> = IsAny<T> extends true ? T : [Extract<T, SecretValue<any>>] extends [never] ? T extends Promise<infer V> ? Promise<Safe<V>> : T extends Map<infer K, infer V> ? Map<Safe<K>, Safe<V>> : T extends Set<infer V> ? Set<Safe<V>> : T extends Passthrough ? T : T extends object ? {
|
|
54
|
+
[K in keyof T]: Safe<T[K]>;
|
|
55
|
+
} : T : never;
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export const REDACTED = '[secret]';
|
|
2
|
+
/** Runtime marker, resilient to duplicate copies of core. */
|
|
3
|
+
const SECRET_VALUE = Symbol.for('pikku.secretValue');
|
|
4
|
+
const NODE_INSPECT = Symbol.for('nodejs.util.inspect.custom');
|
|
5
|
+
export class SecretCoercionError extends Error {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(`A secret was coerced to a string, which would write it out in the clear. Unwrap it deliberately with .reveal() at the point it reaches the wire.`);
|
|
8
|
+
this.name = 'SecretCoercionError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A vault secret. Nominal, so it is not assignable to `string` and every
|
|
13
|
+
* concretely-typed sink rejects it; `.reveal()` is the one way out, and every
|
|
14
|
+
* call is a deliberate, greppable disclosure.
|
|
15
|
+
*
|
|
16
|
+
* The revealed value carries the erasable `Secret<T>` classification brand, so
|
|
17
|
+
* the inspector can still follow it one hop past the call.
|
|
18
|
+
*
|
|
19
|
+
* Structured serialization redacts to `[secret]` — an audit or log write must
|
|
20
|
+
* stay honest about the field without crashing the request. String coercion
|
|
21
|
+
* throws, because a template literal or concatenation is always a leak.
|
|
22
|
+
*/
|
|
23
|
+
export class SecretValue {
|
|
24
|
+
[SECRET_VALUE] = true;
|
|
25
|
+
#value;
|
|
26
|
+
constructor(value) {
|
|
27
|
+
this.#value = value;
|
|
28
|
+
}
|
|
29
|
+
reveal() {
|
|
30
|
+
return this.#value;
|
|
31
|
+
}
|
|
32
|
+
toJSON() {
|
|
33
|
+
return REDACTED;
|
|
34
|
+
}
|
|
35
|
+
[NODE_INSPECT]() {
|
|
36
|
+
return REDACTED;
|
|
37
|
+
}
|
|
38
|
+
toString() {
|
|
39
|
+
throw new SecretCoercionError();
|
|
40
|
+
}
|
|
41
|
+
[Symbol.toPrimitive]() {
|
|
42
|
+
throw new SecretCoercionError();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export const createSecretValue = (value) => new SecretValue(value);
|
|
46
|
+
export const isSecretValue = (value) => typeof value === 'object' && value !== null && SECRET_VALUE in value;
|
|
@@ -12,6 +12,26 @@ export type AIAgentRunnerParams = {
|
|
|
12
12
|
/** Pikku agent function name — forwarded to the LLM proxy (LiteLLM) as
|
|
13
13
|
* request-level metadata so usage can be broken down per agent. */
|
|
14
14
|
agentId?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Cancels the model call itself, not just delivery of its output. Set by
|
|
17
|
+
* `streamAIAgent` from the run's interrupt handle so a voice barge-in stops
|
|
18
|
+
* generation upstream rather than leaving tokens being billed into a stream
|
|
19
|
+
* nobody reads. A runner that ignores it degrades to "the caller stops
|
|
20
|
+
* listening", which is the behaviour before this field existed.
|
|
21
|
+
*/
|
|
22
|
+
abortSignal?: AbortSignal;
|
|
23
|
+
/**
|
|
24
|
+
* Per-provider settings passed to the model untouched — the escape hatch for
|
|
25
|
+
* anything the shared params above cannot express because only one vendor
|
|
26
|
+
* has it.
|
|
27
|
+
*
|
|
28
|
+
* The setting that motivated it is `reasoningEffort`. A voice turn is heard
|
|
29
|
+
* rather than read, so the wait before the first word is most of the
|
|
30
|
+
* experience: `{ openai: { reasoningEffort: 'minimal' } }` on gpt-5-mini
|
|
31
|
+
* measured 0.9s to first token against 2.5s at the default, and 1.6s of
|
|
32
|
+
* silence is a long time to sit through having just finished speaking.
|
|
33
|
+
*/
|
|
34
|
+
providerOptions?: AIProviderOptions;
|
|
15
35
|
};
|
|
16
36
|
export type AIAgentRunnerResult = {
|
|
17
37
|
text: string;
|
|
@@ -1,31 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A narrow, dedicated embedding service.
|
|
3
|
-
*
|
|
4
|
-
* Vector stores (Qdrant, Pinecone, Supabase/pgvector, …) depend on this to turn
|
|
5
|
-
* text into vectors, at BOTH index time (ingest) and query time (search). The
|
|
6
|
-
* embedding model is fixed at construction so those two moments cannot drift
|
|
7
|
-
* into different vector spaces — a mismatch would silently break similarity
|
|
8
|
-
* search. Provider addons (e.g. `@pikku/addon-openai`) implement it; the app
|
|
9
|
-
* wires a single instance into `singletonServices.aiEmbedding`.
|
|
10
|
-
*
|
|
11
|
-
* This is deliberately smaller than {@link AIAgentRunnerService} (whose optional
|
|
12
|
-
* `embed`/`embedMany` take a per-call model): a vector store should not have to
|
|
13
|
-
* pull in the whole agent-runner tool loop just to embed, and pinning the model
|
|
14
|
-
* to the service is what guarantees index/query consistency.
|
|
15
|
-
*
|
|
16
|
-
* Documents (ingested corpus) and queries (search text) are embedded through
|
|
17
|
-
* separate methods because some models are asymmetric — Cohere's `input_type`,
|
|
18
|
-
* E5's `query:`/`passage:` prefixes, BGE's query instruction — and must know
|
|
19
|
-
* which side they are embedding to produce comparable vectors. Symmetric
|
|
20
|
-
* providers (e.g. OpenAI) point both methods at the same call.
|
|
21
|
-
*/
|
|
22
1
|
export interface AIEmbeddingService {
|
|
23
|
-
/** The embedding model backing this service. Index and query share it. */
|
|
24
2
|
readonly model: string;
|
|
25
|
-
/** The vector dimensionality this model produces, when known. */
|
|
26
3
|
readonly dimensions?: number;
|
|
27
|
-
/**
|
|
4
|
+
/** Index time. Preserves input order. */
|
|
28
5
|
embedDocuments(values: string[]): Promise<number[][]>;
|
|
29
|
-
/**
|
|
6
|
+
/** Query time. */
|
|
30
7
|
embedQuery(value: string): Promise<number[]>;
|
|
31
8
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CoreUserSession, PikkuWire, PikkuWiringTypes } from '../types/core.types.js';
|
|
2
2
|
import type { Logger } from './logger.js';
|
|
3
|
+
import type { Safe } from '../secret-value.js';
|
|
3
4
|
export type AuditDurability = 'best-effort' | 'transactional';
|
|
4
5
|
export type AuditOutcome = 'success' | 'failed' | 'denied';
|
|
5
6
|
export type AuditSource = 'auto' | 'explicit';
|
|
@@ -9,7 +10,19 @@ export type AuditConfig = boolean | {
|
|
|
9
10
|
export type ResolvedAuditConfig = {
|
|
10
11
|
durability: AuditDurability;
|
|
11
12
|
};
|
|
12
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Who an event happened under.
|
|
15
|
+
*
|
|
16
|
+
* A user, not an "actor": in pikku an actor is a synthetic person a scenario
|
|
17
|
+
* drives, flagged `actor` on the user row, and the overwhelming majority of
|
|
18
|
+
* audited events are caused by ordinary customers. Naming this `actor` made the
|
|
19
|
+
* synthetic case unsayable — `actor.actor === true` — and implied every
|
|
20
|
+
* recorded action was a test.
|
|
21
|
+
*
|
|
22
|
+
* `pikkuUserId` is the identity pikku resolves for every wire, so it is the one
|
|
23
|
+
* field a signed-out caller still leaves behind.
|
|
24
|
+
*/
|
|
25
|
+
export type AuditUserIdentity = {
|
|
13
26
|
userId?: string;
|
|
14
27
|
orgId?: string;
|
|
15
28
|
pikkuUserId?: string;
|
|
@@ -26,26 +39,83 @@ export type AuditEvent = {
|
|
|
26
39
|
traceId?: string;
|
|
27
40
|
transactionId?: string | null;
|
|
28
41
|
queryId?: string | null;
|
|
29
|
-
|
|
42
|
+
userIdentity?: AuditUserIdentity;
|
|
30
43
|
input?: unknown;
|
|
31
44
|
metadata?: Record<string, unknown>;
|
|
32
45
|
};
|
|
33
46
|
export type AuditEventBatch = AuditEvent[];
|
|
47
|
+
/**
|
|
48
|
+
* A page of the trail, newest first, narrowed by the filters a reader picked.
|
|
49
|
+
*
|
|
50
|
+
* Every field is a conjunction, and an empty array is not a filter — it is
|
|
51
|
+
* "match nothing", which would otherwise read as "match everything" and quietly
|
|
52
|
+
* widen a scoped query.
|
|
53
|
+
*/
|
|
54
|
+
export type AuditQuery = {
|
|
55
|
+
/** Restrict to these users. */
|
|
56
|
+
userIds?: string[];
|
|
57
|
+
/** Restrict to these `AuditEvent['type']` values. */
|
|
58
|
+
types?: string[];
|
|
59
|
+
/** Restrict to one organisation. */
|
|
60
|
+
orgId?: string;
|
|
61
|
+
/** Inclusive lower bound on `occurredAt` (ISO 8601). */
|
|
62
|
+
from?: string;
|
|
63
|
+
/** Exclusive upper bound on `occurredAt` (ISO 8601). */
|
|
64
|
+
to?: string;
|
|
65
|
+
limit?: number;
|
|
66
|
+
offset?: number;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* The distinct values present in the trail, for populating filter controls.
|
|
70
|
+
*
|
|
71
|
+
* Computed over the whole trail rather than the current page — a filter list
|
|
72
|
+
* that only offered what the current page happens to show could never be used
|
|
73
|
+
* to reach anything else.
|
|
74
|
+
*/
|
|
75
|
+
export type AuditFacets = {
|
|
76
|
+
userIds: string[];
|
|
77
|
+
types: string[];
|
|
78
|
+
};
|
|
79
|
+
export type AuditQueryResult = {
|
|
80
|
+
events: AuditEvent[];
|
|
81
|
+
/** Offset of the next page, or `null` at the end. */
|
|
82
|
+
nextCursor: number | null;
|
|
83
|
+
/** Present only when the caller asked for it — it costs two extra scans. */
|
|
84
|
+
facets?: AuditFacets;
|
|
85
|
+
};
|
|
34
86
|
export interface AuditService {
|
|
35
87
|
audit(event: AuditEvent): Promise<void>;
|
|
36
88
|
write?(batch: AuditEventBatch): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* The read side. Optional because a sink can legitimately be write-only — a
|
|
91
|
+
* queue producer that hands events to another system has nothing to read
|
|
92
|
+
* back. A reader that finds this absent should say the trail is not readable
|
|
93
|
+
* here rather than that it is empty; the two are very different answers.
|
|
94
|
+
*/
|
|
95
|
+
query?(query: AuditQuery): Promise<AuditQueryResult>;
|
|
96
|
+
/** Distinct users and types across the whole trail. Paired with {@link query}. */
|
|
97
|
+
facets?(): Promise<AuditFacets>;
|
|
37
98
|
}
|
|
38
99
|
export declare class NoopAuditService implements AuditService {
|
|
39
100
|
audit(_event: AuditEvent): Promise<void>;
|
|
40
101
|
write(_batch: AuditEventBatch): Promise<void>;
|
|
41
102
|
}
|
|
42
103
|
export type AuditLogWriteInput = Omit<AuditEvent, 'occurredAt'>;
|
|
104
|
+
/**
|
|
105
|
+
* The audit an invocation writes to. `write` is `Safe<>`-guarded like the
|
|
106
|
+
* logger: an audit event carries `input` and `metadata` as `unknown`, so
|
|
107
|
+
* nominality alone cannot stop a `SecretValue` landing in one. A secret
|
|
108
|
+
* anywhere in the event, however deeply nested, collapses to `never`.
|
|
109
|
+
*
|
|
110
|
+
* An unrevealed `SecretValue` would serialize as `[secret]` anyway; the guard
|
|
111
|
+
* is what makes that an explicit choice rather than a near miss.
|
|
112
|
+
*/
|
|
43
113
|
export interface AuditLog {
|
|
44
114
|
readonly config: ResolvedAuditConfig | undefined;
|
|
45
|
-
write(event:
|
|
115
|
+
write<E extends AuditLogWriteInput>(event: Safe<E>): Promise<void>;
|
|
46
116
|
flush(): Promise<void>;
|
|
47
117
|
close(): Promise<void>;
|
|
48
118
|
}
|
|
49
119
|
export declare const resolveAuditConfig: (config?: AuditConfig) => ResolvedAuditConfig | undefined;
|
|
50
120
|
export declare const createInvocationAudit: (service: AuditService, wire: PikkuWire<any, any, any, CoreUserSession>, logger?: Logger) => AuditLog;
|
|
51
|
-
export declare const
|
|
121
|
+
export declare const resolveAuditUserIdentityFromWire: (wire: PikkuWire<any, any, any, CoreUserSession>) => AuditUserIdentity | undefined;
|
|
@@ -14,8 +14,7 @@ class DisabledInvocationAudit {
|
|
|
14
14
|
async write(_event) {
|
|
15
15
|
if (!this.warned) {
|
|
16
16
|
this.warned = true;
|
|
17
|
-
//
|
|
18
|
-
// a dropped audit write must never be invisible.
|
|
17
|
+
// knowledge: decisions/security/a-dropped-audit-write-is-always-logged.md
|
|
19
18
|
const logger = this.wire.logger ?? this.logger;
|
|
20
19
|
logger?.warn?.(`audit.write() dropped for '${this.wire.functionId ?? 'unknown function'}' — the function has no audit config (set audit: true on it)`);
|
|
21
20
|
}
|
|
@@ -76,7 +75,7 @@ class InvocationAuditLog {
|
|
|
76
75
|
wireType: this.wire.wireType,
|
|
77
76
|
wireId: this.wire.wireId,
|
|
78
77
|
traceId: this.wire.traceId,
|
|
79
|
-
|
|
78
|
+
userIdentity: event.userIdentity ?? resolveAuditUserIdentityFromWire(this.wire),
|
|
80
79
|
...event,
|
|
81
80
|
occurredAt: new Date().toISOString(),
|
|
82
81
|
};
|
|
@@ -99,15 +98,17 @@ export const createInvocationAudit = (service, wire, logger) => {
|
|
|
99
98
|
}
|
|
100
99
|
return new InvocationAuditLog(wire.audit, service, wire, logger);
|
|
101
100
|
};
|
|
102
|
-
export const
|
|
101
|
+
export const resolveAuditUserIdentityFromWire = (wire) => {
|
|
103
102
|
const session = wire.session;
|
|
104
|
-
const
|
|
103
|
+
const userIdentity = {
|
|
105
104
|
userId: session?.userId,
|
|
106
105
|
orgId: session?.orgId,
|
|
107
106
|
pikkuUserId: wire.pikkuUserId,
|
|
108
107
|
};
|
|
109
|
-
if (!
|
|
108
|
+
if (!userIdentity.userId &&
|
|
109
|
+
!userIdentity.orgId &&
|
|
110
|
+
!userIdentity.pikkuUserId) {
|
|
110
111
|
return undefined;
|
|
111
112
|
}
|
|
112
|
-
return
|
|
113
|
+
return userIdentity;
|
|
113
114
|
};
|
|
@@ -1,23 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Arguments for signing a content key into a time-limited URL.
|
|
3
|
-
*/
|
|
4
1
|
export interface SignContentKeyArgs<TBucket extends string = string> {
|
|
5
2
|
bucket: TBucket;
|
|
6
3
|
contentKey: string;
|
|
7
4
|
dateLessThan: Date;
|
|
8
5
|
dateGreaterThan?: Date;
|
|
9
6
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Arguments for signing an arbitrary URL.
|
|
12
|
-
*/
|
|
13
7
|
export interface SignURLArgs {
|
|
14
8
|
url: string;
|
|
15
9
|
dateLessThan: Date;
|
|
16
10
|
dateGreaterThan?: Date;
|
|
17
11
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Arguments for minting a presigned upload URL.
|
|
20
|
-
*/
|
|
21
12
|
export interface GetUploadURLArgs<TBucket extends string = string> {
|
|
22
13
|
bucket: TBucket;
|
|
23
14
|
fileKey: string;
|
|
@@ -25,66 +16,30 @@ export interface GetUploadURLArgs<TBucket extends string = string> {
|
|
|
25
16
|
size?: number;
|
|
26
17
|
visibility?: 'private' | 'public';
|
|
27
18
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Result of minting a presigned upload URL.
|
|
30
|
-
*/
|
|
31
19
|
export interface UploadURLResult {
|
|
32
20
|
uploadUrl: string;
|
|
33
21
|
assetKey: string;
|
|
34
22
|
uploadHeaders?: Record<string, string>;
|
|
35
23
|
uploadMethod?: 'PUT' | 'POST';
|
|
36
24
|
}
|
|
37
|
-
/**
|
|
38
|
-
* Arguments for an operation that targets a single object by key.
|
|
39
|
-
*/
|
|
40
25
|
export interface BucketKeyArgs<TBucket extends string = string> {
|
|
41
26
|
bucket: TBucket;
|
|
42
27
|
key: string;
|
|
43
28
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Arguments for writing a stream to storage.
|
|
46
|
-
*/
|
|
47
29
|
export interface WriteFileArgs<TBucket extends string = string> extends BucketKeyArgs<TBucket> {
|
|
48
30
|
stream: ReadableStream | NodeJS.ReadableStream;
|
|
49
31
|
}
|
|
50
|
-
/**
|
|
51
|
-
* Arguments for copying a local file into storage.
|
|
52
|
-
*/
|
|
53
32
|
export interface CopyFileArgs<TBucket extends string = string> extends BucketKeyArgs<TBucket> {
|
|
54
33
|
fromAbsolutePath: string;
|
|
55
34
|
}
|
|
56
35
|
export interface ContentService<TBucket extends string = string> {
|
|
57
|
-
/**
|
|
58
|
-
* Signs a content key to generate a secure, time-limited access URL.
|
|
59
|
-
*/
|
|
60
36
|
signContentKey(args: SignContentKeyArgs<TBucket>): Promise<string>;
|
|
61
|
-
/**
|
|
62
|
-
* Signs an arbitrary URL to generate a secure, time-limited access URL.
|
|
63
|
-
*/
|
|
64
37
|
signURL(args: SignURLArgs): Promise<string>;
|
|
65
|
-
/**
|
|
66
|
-
* Generates a signed URL for uploading a file directly to storage.
|
|
67
|
-
* Bucket policy (size limits, MIME allowlist) is enforced by the implementation.
|
|
68
|
-
*/
|
|
38
|
+
/** Bucket policy (size limits, MIME allowlist) is enforced by the implementation, not the caller. */
|
|
69
39
|
getUploadURL(args: GetUploadURLArgs<TBucket>): Promise<UploadURLResult>;
|
|
70
|
-
/**
|
|
71
|
-
* Deletes a file from the storage backend.
|
|
72
|
-
*/
|
|
73
40
|
deleteFile(args: BucketKeyArgs<TBucket>): Promise<boolean>;
|
|
74
|
-
/**
|
|
75
|
-
* Uploads a file stream to storage under the specified bucket + key.
|
|
76
|
-
*/
|
|
77
41
|
writeFile(args: WriteFileArgs<TBucket>): Promise<boolean>;
|
|
78
|
-
/**
|
|
79
|
-
* Copies a file from a local absolute path into storage.
|
|
80
|
-
*/
|
|
81
42
|
copyFile(args: CopyFileArgs<TBucket>): Promise<boolean>;
|
|
82
|
-
/**
|
|
83
|
-
* Reads a file from storage as a readable stream.
|
|
84
|
-
*/
|
|
85
43
|
readFile(args: BucketKeyArgs<TBucket>): Promise<ReadableStream | NodeJS.ReadableStream>;
|
|
86
|
-
/**
|
|
87
|
-
* Reads an entire file from storage into a Buffer.
|
|
88
|
-
*/
|
|
89
44
|
readFileAsBuffer(args: BucketKeyArgs<TBucket>): Promise<Buffer>;
|
|
90
45
|
}
|