@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
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { beginChanges } from './abort-scope.js'
|
|
1
2
|
import { runMiddleware, combineMiddleware } from '../middleware-runner.js'
|
|
2
3
|
import {
|
|
3
4
|
combineChannelMiddleware,
|
|
4
5
|
wrapChannelWithMiddleware,
|
|
5
6
|
} from '../wirings/channel/channel-middleware-runner.js'
|
|
6
7
|
import { runPermissions } from '../permissions.js'
|
|
8
|
+
import { withoutSecrets } from '../services/secretless.js'
|
|
7
9
|
import { pikkuState } from '../pikku-state.js'
|
|
8
10
|
import {
|
|
9
11
|
applyDefaultsFromSchema,
|
|
@@ -39,6 +41,11 @@ import {
|
|
|
39
41
|
} from '../services/audit-service.js'
|
|
40
42
|
import { rpcService } from '../wirings/rpc/rpc-runner.js'
|
|
41
43
|
import { getOrCreatePackageSingletonServices } from '../wirings/rpc/addon-runner.js'
|
|
44
|
+
import {
|
|
45
|
+
resolveAddonAuth,
|
|
46
|
+
resolveAddonScopes,
|
|
47
|
+
resolveAddonTagMiddleware,
|
|
48
|
+
} from '../wirings/rpc/wire-addon.js'
|
|
42
49
|
import type { AddonInstance } from '../wirings/rpc/addon-runner.js'
|
|
43
50
|
import { closeWireServices } from '../utils.js'
|
|
44
51
|
|
|
@@ -170,7 +177,8 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
170
177
|
|
|
171
178
|
const resolvedFunctionId = funcMeta.pikkuFuncId ?? funcName
|
|
172
179
|
|
|
173
|
-
|
|
180
|
+
const keepsSecrets = funcMeta.secretBroker === true
|
|
181
|
+
|
|
174
182
|
const resolvedSingletonServices = packageName
|
|
175
183
|
? await getOrCreatePackageSingletonServices(
|
|
176
184
|
packageName,
|
|
@@ -179,7 +187,6 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
179
187
|
)
|
|
180
188
|
: singletonServices
|
|
181
189
|
|
|
182
|
-
// Get the package's createWireServices if available
|
|
183
190
|
let resolvedCreateWireServices = createWireServices
|
|
184
191
|
if (packageName) {
|
|
185
192
|
const factories = pikkuState(packageName, 'package', 'factories')
|
|
@@ -203,11 +210,9 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
203
210
|
)
|
|
204
211
|
: wire
|
|
205
212
|
|
|
206
|
-
// Set up
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
// even when a parent credential service is already present on the wire.
|
|
210
|
-
// Otherwise skip if already set up (e.g. addon functions reuse the parent wire).
|
|
213
|
+
// Set up early so middleware can use setCredential. An addon instance with
|
|
214
|
+
// credentialOverrides always gets a fresh alias-aware service, even when a
|
|
215
|
+
// parent credential service is already present on the wire.
|
|
211
216
|
if (addonInstance?.credentialOverrides) {
|
|
212
217
|
// Credentials belong to the consuming project, so resolve them via the
|
|
213
218
|
// project's credentialService (the addon's own singletons may not carry it).
|
|
@@ -251,7 +256,6 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
251
256
|
invocationWire.addonNamespace = addonInstance.namespace
|
|
252
257
|
}
|
|
253
258
|
|
|
254
|
-
// Helper function to run permissions and execute the function
|
|
255
259
|
const executeFunction = async () => {
|
|
256
260
|
await resolveSession(
|
|
257
261
|
invocationWire,
|
|
@@ -270,7 +274,11 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
270
274
|
const session = invocationWire.session
|
|
271
275
|
|
|
272
276
|
if (funcMeta.sessionless) {
|
|
273
|
-
if (
|
|
277
|
+
if (
|
|
278
|
+
wiringAuth === true ||
|
|
279
|
+
funcConfig.auth === true ||
|
|
280
|
+
resolveAddonAuth(packageName, addonInstance?.namespace)
|
|
281
|
+
) {
|
|
274
282
|
if (!session) {
|
|
275
283
|
throw new ForbiddenError('Authentication required')
|
|
276
284
|
}
|
|
@@ -290,32 +298,38 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
290
298
|
throw new ReadonlySessionError()
|
|
291
299
|
}
|
|
292
300
|
|
|
293
|
-
//
|
|
294
|
-
//
|
|
295
|
-
//
|
|
296
|
-
|
|
297
|
-
|
|
301
|
+
// Only mutating functions get a checkpoint. A read has nothing to declare,
|
|
302
|
+
// and offering it there would invite the contradiction of a `readonly`
|
|
303
|
+
// function announcing where its changes begin.
|
|
304
|
+
if (!funcMeta.readonly) {
|
|
305
|
+
invocationWire.beginChanges = beginChanges
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// knowledge: decisions/security/addon-scopes-are-resolved-where-the-function-runs.md
|
|
309
|
+
const addonScopes = resolveAddonScopes(
|
|
310
|
+
packageName,
|
|
311
|
+
addonInstance?.namespace
|
|
312
|
+
)
|
|
313
|
+
const functionScopes = funcConfig.scopes ?? funcMeta.scopes
|
|
314
|
+
verifyScopes(
|
|
315
|
+
addonScopes.length > 0
|
|
316
|
+
? [...addonScopes, ...(functionScopes ?? [])]
|
|
317
|
+
: functionScopes,
|
|
318
|
+
session
|
|
319
|
+
)
|
|
298
320
|
|
|
299
|
-
// Evaluate the data from the lazy function
|
|
300
321
|
let actualData = await data()
|
|
301
322
|
|
|
302
|
-
// Validate and coerce data if schema is defined
|
|
303
323
|
const inputSchemaName = funcMeta.inputSchemaName
|
|
304
324
|
if (inputSchemaName) {
|
|
305
|
-
// Fill in schema defaults before anything reads the data. Unconditional:
|
|
306
|
-
// a default belongs to the schema, not to the transport the call arrived
|
|
307
|
-
// on. Runs before coercion so a defaulted value and a supplied one are
|
|
308
|
-
// treated identically from here on.
|
|
309
325
|
actualData = applyDefaultsFromSchema(
|
|
310
326
|
inputSchemaName,
|
|
311
327
|
actualData,
|
|
312
328
|
packageName
|
|
313
329
|
)
|
|
314
|
-
// Coerce (top level) data types before validation (e.g. string→array, string→date)
|
|
315
330
|
if (coerceDataFromSchema) {
|
|
316
331
|
coerceTopLevelDataFromSchema(inputSchemaName, actualData, packageName)
|
|
317
332
|
}
|
|
318
|
-
// Validate request data against the defined schema, if any
|
|
319
333
|
await validateSchema(
|
|
320
334
|
resolvedSingletonServices.logger,
|
|
321
335
|
resolvedSingletonServices.schema,
|
|
@@ -327,7 +341,12 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
327
341
|
|
|
328
342
|
await runPermissions({
|
|
329
343
|
funcPermissions: funcConfig.permissions,
|
|
330
|
-
services:
|
|
344
|
+
services: keepsSecrets
|
|
345
|
+
? resolvedSingletonServices
|
|
346
|
+
: (withoutSecrets(
|
|
347
|
+
resolvedSingletonServices,
|
|
348
|
+
'a permission'
|
|
349
|
+
) as CoreSingletonServices),
|
|
331
350
|
wire: invocationWire as any,
|
|
332
351
|
data: actualData,
|
|
333
352
|
packageName,
|
|
@@ -344,13 +363,7 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
344
363
|
wireServices && Object.keys(wireServices).length > 0
|
|
345
364
|
? { ...resolvedSingletonServices, ...wireServices }
|
|
346
365
|
: resolvedSingletonServices
|
|
347
|
-
//
|
|
348
|
-
// created per-transport-invocation — a nested/exposed-RPC call would
|
|
349
|
-
// otherwise inherit an auditLog constructed while the OUTER wire's
|
|
350
|
-
// audit was unset (e.g. the generated rpcCaller has no audit config),
|
|
351
|
-
// silently dropping every write. Re-gate here: if this function
|
|
352
|
-
// declares audit and the inherited auditLog wasn't built for this
|
|
353
|
-
// invocation (config identity check), bind a fresh one to this wire.
|
|
366
|
+
// knowledge: decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md
|
|
354
367
|
if (
|
|
355
368
|
resolvedAuditConfig &&
|
|
356
369
|
resolvedSingletonServices.audit &&
|
|
@@ -383,7 +396,11 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
383
396
|
configurable: true,
|
|
384
397
|
enumerable: true,
|
|
385
398
|
})
|
|
386
|
-
return await funcConfig.func(
|
|
399
|
+
return await funcConfig.func(
|
|
400
|
+
keepsSecrets ? services : withoutSecrets(services, 'a pikku function'),
|
|
401
|
+
actualData,
|
|
402
|
+
invocationWire
|
|
403
|
+
)
|
|
387
404
|
} finally {
|
|
388
405
|
// Flush the runner-installed audit buffer before wire services close.
|
|
389
406
|
await invocationAuditLog?.close()
|
|
@@ -393,9 +410,17 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
393
410
|
}
|
|
394
411
|
}
|
|
395
412
|
|
|
413
|
+
const addonTagMiddleware = resolveAddonTagMiddleware(
|
|
414
|
+
packageName,
|
|
415
|
+
addonInstance?.namespace
|
|
416
|
+
)
|
|
417
|
+
|
|
396
418
|
const allMiddleware = combineMiddleware(wireType, wireId, {
|
|
397
419
|
wireInheritedMiddleware: inheritedMiddleware,
|
|
398
|
-
wireMiddleware
|
|
420
|
+
wireMiddleware:
|
|
421
|
+
addonTagMiddleware.length > 0
|
|
422
|
+
? [...addonTagMiddleware, ...(wireMiddleware ?? [])]
|
|
423
|
+
: wireMiddleware,
|
|
399
424
|
funcInheritedMiddleware: funcMeta.middleware,
|
|
400
425
|
funcMiddleware: funcConfig.middleware,
|
|
401
426
|
packageName,
|
|
@@ -447,5 +472,10 @@ export const runPikkuFunc = async <In = any, Out = any>(
|
|
|
447
472
|
} else {
|
|
448
473
|
invocationWire.audit = previousAudit
|
|
449
474
|
}
|
|
475
|
+
if (previousAddonNamespace === undefined) {
|
|
476
|
+
delete (invocationWire as any).addonNamespace
|
|
477
|
+
} else {
|
|
478
|
+
invocationWire.addonNamespace = previousAddonNamespace
|
|
479
|
+
}
|
|
450
480
|
}
|
|
451
481
|
}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
CoreServices,
|
|
3
|
-
|
|
3
|
+
CoreSecretlessSingletonServices,
|
|
4
4
|
CoreUserSession,
|
|
5
5
|
CorePikkuMiddleware,
|
|
6
6
|
PikkuWire,
|
|
7
7
|
PickRequired,
|
|
8
|
+
SecretlessServices,
|
|
8
9
|
} from '../types/core.types.js'
|
|
9
10
|
import type { PikkuRPC } from '../wirings/rpc/rpc-types.js'
|
|
10
11
|
import type { StandardSchemaV1 } from '@standard-schema/spec'
|
|
11
12
|
import type { PikkuError } from '../errors/error-handler.js'
|
|
12
13
|
import type { CoreNodeConfig } from '../wirings/node/node.types.js'
|
|
14
|
+
import type { ScenarioSurface } from '../wirings/workflow/scenario-step.types.js'
|
|
15
|
+
import type { Safe } from '../secret-value.js'
|
|
13
16
|
|
|
14
17
|
/**
|
|
15
18
|
* @deprecated Use StandardSchemaV1 from @standard-schema/spec instead.
|
|
@@ -17,18 +20,11 @@ import type { CoreNodeConfig } from '../wirings/node/node.types.js'
|
|
|
17
20
|
*/
|
|
18
21
|
export type ZodLike<T = any> = StandardSchemaV1<T, T>
|
|
19
22
|
|
|
20
|
-
/**
|
|
21
|
-
* Represents a core API function that performs an operation using core services and a user session.
|
|
22
|
-
*
|
|
23
|
-
* @template In - The input type.
|
|
24
|
-
* @template Out - The output type.
|
|
25
|
-
* @template Services - The services type, defaults to `CoreServices`.
|
|
26
|
-
* @template Wire - The wire type, defaults to `PikkuWire<In, Out>`.
|
|
27
|
-
*/
|
|
28
23
|
export type CorePikkuFunction<
|
|
29
24
|
In,
|
|
30
25
|
Out,
|
|
31
|
-
Services extends
|
|
26
|
+
Services extends CoreSecretlessSingletonServices =
|
|
27
|
+
SecretlessServices<CoreServices>,
|
|
32
28
|
Session extends CoreUserSession = CoreUserSession,
|
|
33
29
|
Wire extends PikkuWire<In, Out, true, Session, PikkuRPC, null, string> =
|
|
34
30
|
PikkuWire<In, Out, true, Session>,
|
|
@@ -36,20 +32,15 @@ export type CorePikkuFunction<
|
|
|
36
32
|
services: Services,
|
|
37
33
|
data: In,
|
|
38
34
|
wire: Wire
|
|
39
|
-
) => Wire['channel'] extends null
|
|
35
|
+
) => Wire['channel'] extends null
|
|
36
|
+
? Promise<Safe<Out>>
|
|
37
|
+
: Promise<Safe<Out>> | Promise<void>
|
|
40
38
|
|
|
41
|
-
/**
|
|
42
|
-
* Represents a core API function that can be used without a session.
|
|
43
|
-
*
|
|
44
|
-
* @template In - The input type.
|
|
45
|
-
* @template Out - The output type.
|
|
46
|
-
* @template Services - The services type, defaults to `CoreServices`.
|
|
47
|
-
* @template Wire - The wire type, defaults to `PikkuWire<In, Out>`.
|
|
48
|
-
*/
|
|
49
39
|
export type CorePikkuFunctionSessionless<
|
|
50
40
|
In,
|
|
51
41
|
Out,
|
|
52
|
-
Services extends
|
|
42
|
+
Services extends CoreSecretlessSingletonServices =
|
|
43
|
+
SecretlessServices<CoreServices>,
|
|
53
44
|
Session extends CoreUserSession = CoreUserSession,
|
|
54
45
|
Wire extends PikkuWire<In, Out, false, Session, PikkuRPC, null, string> =
|
|
55
46
|
PikkuWire<In, Out, false, Session>,
|
|
@@ -57,71 +48,34 @@ export type CorePikkuFunctionSessionless<
|
|
|
57
48
|
services: Services,
|
|
58
49
|
data: In,
|
|
59
50
|
wire: Wire
|
|
60
|
-
) => Wire['channel'] extends null
|
|
51
|
+
) => Wire['channel'] extends null
|
|
52
|
+
? Promise<Safe<Out>>
|
|
53
|
+
: Promise<Safe<Out>> | Promise<void>
|
|
61
54
|
|
|
62
|
-
/**
|
|
63
|
-
* Represents a function that checks permissions for a given operation.
|
|
64
|
-
*
|
|
65
|
-
* @template In - The input type.
|
|
66
|
-
* @template Services - The services type, defaults to `CoreServices`.
|
|
67
|
-
* @template Session - The session type, defaults to `CoreUserSession`.
|
|
68
|
-
*/
|
|
69
55
|
export type CorePikkuPermission<
|
|
70
56
|
In = any,
|
|
71
|
-
Services extends
|
|
57
|
+
Services extends CoreSecretlessSingletonServices =
|
|
58
|
+
SecretlessServices<CoreServices>,
|
|
72
59
|
Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> =
|
|
73
60
|
PikkuWire<In, never, false, any, PikkuRPC, never, never>,
|
|
74
61
|
> = (services: Services, data: In, wire: Wire) => Promise<boolean>
|
|
75
62
|
|
|
76
|
-
/**
|
|
77
|
-
* Configuration object for creating a permission with metadata
|
|
78
|
-
*
|
|
79
|
-
* @template In - The input type.
|
|
80
|
-
* @template Services - The services type, defaults to `CoreServices`.
|
|
81
|
-
* @template Session - The session type, defaults to `CoreUserSession`.
|
|
82
|
-
*/
|
|
83
63
|
export type CorePikkuPermissionConfig<
|
|
84
64
|
In = any,
|
|
85
|
-
Services extends
|
|
65
|
+
Services extends CoreSecretlessSingletonServices =
|
|
66
|
+
SecretlessServices<CoreServices>,
|
|
86
67
|
Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> =
|
|
87
68
|
PikkuWire<In, never, false, any, PikkuRPC, never, never>,
|
|
88
69
|
> = {
|
|
89
|
-
/** The permission function */
|
|
90
70
|
func: CorePikkuPermission<In, Services, Wire>
|
|
91
|
-
/** Optional human-readable name for the permission */
|
|
92
71
|
name?: string
|
|
93
|
-
/** Optional description of what the permission checks */
|
|
94
72
|
description?: string
|
|
95
73
|
}
|
|
96
74
|
|
|
97
|
-
/**
|
|
98
|
-
* Factory function for creating permissions with tree-shaking support
|
|
99
|
-
* Supports both direct function and configuration object syntax
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* ```typescript
|
|
103
|
-
* // Direct function syntax
|
|
104
|
-
* export const adminPermission = pikkuPermission(
|
|
105
|
-
* async ({ logger }, _data, { getSession }) => {
|
|
106
|
-
* const currentSession = await getSession()
|
|
107
|
-
* return currentSession?.role === 'admin'
|
|
108
|
-
* }
|
|
109
|
-
* )
|
|
110
|
-
*
|
|
111
|
-
* // Configuration object syntax with metadata
|
|
112
|
-
* export const adminPermission = pikkuPermission({
|
|
113
|
-
* name: 'Admin Permission',
|
|
114
|
-
* description: 'Checks if user has admin role',
|
|
115
|
-
* func: async ({ logger }, _data, { getSession }) => {
|
|
116
|
-
* const currentSession = await getSession()
|
|
117
|
-
* return currentSession?.role === 'admin'
|
|
118
|
-
* }
|
|
119
|
-
* })
|
|
120
|
-
* ```
|
|
121
|
-
*/
|
|
122
75
|
export const pikkuPermission = <
|
|
123
76
|
In = any,
|
|
124
|
-
Services extends
|
|
77
|
+
Services extends CoreSecretlessSingletonServices =
|
|
78
|
+
SecretlessServices<CoreServices>,
|
|
125
79
|
Wire extends PickRequired<
|
|
126
80
|
PikkuWire<In, never, false, any, PikkuRPC, never, never>,
|
|
127
81
|
'session'
|
|
@@ -137,41 +91,14 @@ export const pikkuPermission = <
|
|
|
137
91
|
return typeof permission === 'function' ? permission : permission.func
|
|
138
92
|
}
|
|
139
93
|
|
|
140
|
-
/**
|
|
141
|
-
* A factory function that takes input and returns a permission
|
|
142
|
-
* Used when permissions need configuration/input parameters
|
|
143
|
-
*
|
|
144
|
-
* @template In - The input type for the factory.
|
|
145
|
-
* @template Services - The services type, defaults to `CoreServices`.
|
|
146
|
-
* @template Session - The session type, defaults to `CoreUserSession`.
|
|
147
|
-
*/
|
|
148
94
|
export type CorePikkuPermissionFactory<
|
|
149
95
|
In = any,
|
|
150
|
-
Services extends
|
|
96
|
+
Services extends CoreSecretlessSingletonServices =
|
|
97
|
+
SecretlessServices<CoreServices>,
|
|
151
98
|
Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> =
|
|
152
99
|
PikkuWire<In, never, false, any, PikkuRPC, never, never>,
|
|
153
100
|
> = (input: In) => CorePikkuPermission<any, Services, Wire>
|
|
154
101
|
|
|
155
|
-
/**
|
|
156
|
-
* Factory function for creating permission factories
|
|
157
|
-
* Use this when your permission needs configuration/input parameters
|
|
158
|
-
*
|
|
159
|
-
* @example
|
|
160
|
-
* ```typescript
|
|
161
|
-
* export const requireRole = pikkuPermissionFactory<{ role: string }>(({
|
|
162
|
-
* role
|
|
163
|
-
* }) => {
|
|
164
|
-
* return pikkuPermission(async ({ logger }, data, { getSession }) => {
|
|
165
|
-
* const currentSession = await getSession()
|
|
166
|
-
* if (!currentSession || currentSession.role !== role) {
|
|
167
|
-
* logger.warn(`Permission denied: required role '${role}'`)
|
|
168
|
-
* return false
|
|
169
|
-
* }
|
|
170
|
-
* return true
|
|
171
|
-
* })
|
|
172
|
-
* })
|
|
173
|
-
* ```
|
|
174
|
-
*/
|
|
175
102
|
export const pikkuPermissionFactory = <In = any>(
|
|
176
103
|
factory: CorePikkuPermissionFactory<In>
|
|
177
104
|
): CorePikkuPermissionFactory<In> => {
|
|
@@ -179,33 +106,19 @@ export const pikkuPermissionFactory = <In = any>(
|
|
|
179
106
|
}
|
|
180
107
|
|
|
181
108
|
/**
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
* @template In - The input type (same as the function it describes).
|
|
186
|
-
* @template Services - The services type, defaults to `CoreSingletonServices`.
|
|
109
|
+
* Renders a human-readable approval prompt for an AI agent, in place of the
|
|
110
|
+
* raw tool arguments.
|
|
187
111
|
*/
|
|
188
112
|
export type CorePikkuApprovalDescription<
|
|
189
113
|
In = any,
|
|
190
|
-
Services extends
|
|
114
|
+
Services extends CoreSecretlessSingletonServices =
|
|
115
|
+
CoreSecretlessSingletonServices,
|
|
191
116
|
> = (services: Services, data: In) => Promise<string>
|
|
192
117
|
|
|
193
|
-
/**
|
|
194
|
-
* Factory function for creating approval description functions with tree-shaking support.
|
|
195
|
-
*
|
|
196
|
-
* @example
|
|
197
|
-
* ```typescript
|
|
198
|
-
* export const deleteTodoApproval = pikkuApprovalDescription(
|
|
199
|
-
* async ({ todoStore }, { id }) => {
|
|
200
|
-
* const todo = await todoStore.get(id)
|
|
201
|
-
* return `Delete todo: "${todo.title}"`
|
|
202
|
-
* }
|
|
203
|
-
* )
|
|
204
|
-
* ```
|
|
205
|
-
*/
|
|
206
118
|
export const pikkuApprovalDescription = <
|
|
207
119
|
In = any,
|
|
208
|
-
Services extends
|
|
120
|
+
Services extends CoreSecretlessSingletonServices =
|
|
121
|
+
CoreSecretlessSingletonServices,
|
|
209
122
|
>(
|
|
210
123
|
fn: CorePikkuApprovalDescription<In, Services>
|
|
211
124
|
): CorePikkuApprovalDescription<In, Services> => {
|
|
@@ -213,12 +126,14 @@ export const pikkuApprovalDescription = <
|
|
|
213
126
|
}
|
|
214
127
|
|
|
215
128
|
export type CorePikkuAuth<
|
|
216
|
-
Services extends
|
|
129
|
+
Services extends CoreSecretlessSingletonServices =
|
|
130
|
+
SecretlessServices<CoreServices>,
|
|
217
131
|
Session extends CoreUserSession = CoreUserSession,
|
|
218
132
|
> = (services: Services, session: Session) => Promise<boolean> | boolean
|
|
219
133
|
|
|
220
134
|
export type CorePikkuAuthConfig<
|
|
221
|
-
Services extends
|
|
135
|
+
Services extends CoreSecretlessSingletonServices =
|
|
136
|
+
SecretlessServices<CoreServices>,
|
|
222
137
|
Session extends CoreUserSession = CoreUserSession,
|
|
223
138
|
> = {
|
|
224
139
|
func: CorePikkuAuth<Services, Session>
|
|
@@ -227,7 +142,8 @@ export type CorePikkuAuthConfig<
|
|
|
227
142
|
}
|
|
228
143
|
|
|
229
144
|
export const pikkuAuth = <
|
|
230
|
-
Services extends
|
|
145
|
+
Services extends CoreSecretlessSingletonServices =
|
|
146
|
+
SecretlessServices<CoreServices>,
|
|
231
147
|
Session extends CoreUserSession = CoreUserSession,
|
|
232
148
|
>(
|
|
233
149
|
auth:
|
|
@@ -249,9 +165,9 @@ export type CorePermissionGroup<PikkuPermission = CorePikkuPermission<any>> =
|
|
|
249
165
|
| undefined
|
|
250
166
|
|
|
251
167
|
/**
|
|
252
|
-
* A lifecycle hook:
|
|
253
|
-
*
|
|
254
|
-
*
|
|
168
|
+
* A lifecycle hook: same call signature as the function it hangs off, return
|
|
169
|
+
* value discarded. Setup/teardown, not a step — no id, no meta, no schema, so
|
|
170
|
+
* it is never recorded and never replayed.
|
|
255
171
|
*/
|
|
256
172
|
export type CorePikkuFunctionHook<Services = any, Data = any, Wire = any> = (
|
|
257
173
|
services: Services,
|
|
@@ -273,15 +189,26 @@ export type CorePikkuFunctionConfig<
|
|
|
273
189
|
OutputSchema extends StandardSchemaV1 | undefined = undefined,
|
|
274
190
|
Scope extends string = string,
|
|
275
191
|
> = {
|
|
276
|
-
/** Short human-readable name (e.g. "Create Todo") */
|
|
277
192
|
title?: string
|
|
278
|
-
/** Longer-form description of what the function does */
|
|
279
193
|
description?: string
|
|
280
194
|
/** Explicit logical name override; lets multiple exports share a versioned base */
|
|
281
195
|
override?: string
|
|
282
196
|
version?: number
|
|
283
197
|
tags?: string[]
|
|
284
198
|
expose?: boolean
|
|
199
|
+
/**
|
|
200
|
+
* The permission check for this function lives in its body — verifying a
|
|
201
|
+
* signed token, checking a webhook signature, matching an invite code — so
|
|
202
|
+
* it is not open despite declaring no session, scope or permission.
|
|
203
|
+
*
|
|
204
|
+
* A last resort. Prefer `permissions`, which are declared, inspectable, and
|
|
205
|
+
* reusable; reach for this only when the check cannot be expressed as one.
|
|
206
|
+
*
|
|
207
|
+
* Purely declarative — it grants nothing, and asserting it falsely disables
|
|
208
|
+
* the audit that would have caught the mistake. Requires
|
|
209
|
+
* `allow.permissionsInBody` in `pikku.config.json`.
|
|
210
|
+
*/
|
|
211
|
+
permissionsInBody?: boolean
|
|
285
212
|
remote?: boolean
|
|
286
213
|
mcp?: boolean
|
|
287
214
|
readonly?: boolean
|
|
@@ -293,8 +220,12 @@ export type CorePikkuFunctionConfig<
|
|
|
293
220
|
workflowRetries?: number
|
|
294
221
|
/** Timeout for this function when used as a workflow step (e.g. '30s', '5m'). */
|
|
295
222
|
workflowTimeout?: string
|
|
296
|
-
/**
|
|
297
|
-
|
|
223
|
+
/**
|
|
224
|
+
* Scenario steps only: which surfaces this step declares a binding for. The
|
|
225
|
+
* runner uses it to pick a binding, decide whether to provision a browser,
|
|
226
|
+
* and report how much of the flow each surface actually covers.
|
|
227
|
+
*/
|
|
228
|
+
surfaces?: ScenarioSurface[]
|
|
298
229
|
audit?:
|
|
299
230
|
| boolean
|
|
300
231
|
| {
|
|
@@ -309,26 +240,23 @@ export type CorePikkuFunctionConfig<
|
|
|
309
240
|
*/
|
|
310
241
|
before?: CorePikkuFunctionHook
|
|
311
242
|
/**
|
|
312
|
-
* Scenarios only: always runs after the
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
* original error.
|
|
243
|
+
* Scenarios only: always runs after the body, in a `finally`. Throwing fails
|
|
244
|
+
* an otherwise-passing run; on an already-failed run it attaches as `cause`
|
|
245
|
+
* and never replaces the original error.
|
|
316
246
|
*/
|
|
317
247
|
after?: CorePikkuFunctionHook
|
|
318
248
|
/**
|
|
319
|
-
* Scenarios only: why this scenario is held out of a default run.
|
|
320
|
-
*
|
|
321
|
-
* with `--flows` runs it anyway.
|
|
249
|
+
* Scenarios only: why this scenario is held out of a default run. Reported
|
|
250
|
+
* as skipped rather than quietly omitted; naming it in `--flows` runs it.
|
|
322
251
|
*/
|
|
323
252
|
skip?: string
|
|
324
253
|
auth?: boolean
|
|
325
254
|
/**
|
|
326
|
-
* Scopes the session must hold
|
|
327
|
-
*
|
|
328
|
-
*
|
|
329
|
-
*
|
|
330
|
-
*
|
|
331
|
-
* `pikku-types.gen.ts`, so an undeclared scope is a compile error.
|
|
255
|
+
* Scopes the session must hold; all are required (AND) and checked before
|
|
256
|
+
* `permissions`, which OR together — a scope can only narrow access.
|
|
257
|
+
* Narrowed to the generated `ScopeId` union, so an undeclared scope is a
|
|
258
|
+
* compile error. Requires a session — see
|
|
259
|
+
* {@link CorePikkuSessionlessFunctionConfig}.
|
|
332
260
|
*/
|
|
333
261
|
scopes?: Scope[]
|
|
334
262
|
permissions?: CorePermissionGroup<PikkuPermission>
|
|
@@ -338,3 +266,32 @@ export type CorePikkuFunctionConfig<
|
|
|
338
266
|
node?: CoreNodeConfig
|
|
339
267
|
errors?: Array<typeof PikkuError>
|
|
340
268
|
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* {@link CorePikkuFunctionConfig} for a function that runs without a session.
|
|
272
|
+
*
|
|
273
|
+
* Identical, minus `scopes`. Scopes are AND-ed and `verifyScopes` fails closed,
|
|
274
|
+
* so an anonymous caller holds none and satisfies none — a sessionless function
|
|
275
|
+
* with scopes rejects every caller it exists to serve. Gate it with
|
|
276
|
+
* `permissions`, which receive the optional session and may pass anonymous.
|
|
277
|
+
*/
|
|
278
|
+
export type CorePikkuSessionlessFunctionConfig<
|
|
279
|
+
PikkuFunction extends CorePikkuFunctionSessionless<any, any, any, any, any>,
|
|
280
|
+
PikkuPermission extends CorePikkuPermission<any, any, any> =
|
|
281
|
+
CorePikkuPermission<any>,
|
|
282
|
+
PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<
|
|
283
|
+
any,
|
|
284
|
+
any
|
|
285
|
+
>,
|
|
286
|
+
InputSchema extends StandardSchemaV1 | undefined = undefined,
|
|
287
|
+
OutputSchema extends StandardSchemaV1 | undefined = undefined,
|
|
288
|
+
> = Omit<
|
|
289
|
+
CorePikkuFunctionConfig<
|
|
290
|
+
PikkuFunction,
|
|
291
|
+
PikkuPermission,
|
|
292
|
+
PikkuMiddleware,
|
|
293
|
+
InputSchema,
|
|
294
|
+
OutputSchema
|
|
295
|
+
>,
|
|
296
|
+
'scopes'
|
|
297
|
+
>
|
package/src/function/index.ts
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Type-level tests
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* invalid shapes fail with `@ts-expect-error`. The file is excluded
|
|
6
|
-
* from `yarn build` via tsconfig's `**∕*.test.ts` pattern.
|
|
2
|
+
* Type-level tests: no runtime assertions — valid shapes must compile and
|
|
3
|
+
* invalid shapes must fail with `@ts-expect-error`. Excluded from `yarn build`
|
|
4
|
+
* via tsconfig's test-file pattern.
|
|
7
5
|
*/
|
|
8
6
|
|
|
9
7
|
import type { ListInput, ListOutput, Filter } from './list.types.js'
|
|
10
8
|
|
|
11
|
-
// -- ListInput ---------------------------------------------------------------
|
|
12
|
-
|
|
13
9
|
type SessionFilter = {
|
|
14
10
|
status?: string[]
|
|
15
11
|
therapistId?: string
|
|
@@ -32,22 +28,18 @@ void _basic
|
|
|
32
28
|
const _empty: ListInput = {}
|
|
33
29
|
void _empty
|
|
34
30
|
|
|
35
|
-
// sort.column must be from the declared union
|
|
36
31
|
// @ts-expect-error — 'created_at' is not in SessionSort
|
|
37
32
|
const _badSort: ListInput<SessionFilter, SessionSort> = {
|
|
38
33
|
sort: [{ column: 'created_at', direction: 'asc' }],
|
|
39
34
|
}
|
|
40
35
|
void _badSort
|
|
41
36
|
|
|
42
|
-
// sort.direction must be 'asc' or 'desc'
|
|
43
37
|
// @ts-expect-error — 'descending' is not a valid direction
|
|
44
38
|
const _badDirection: ListInput<SessionFilter, SessionSort> = {
|
|
45
39
|
sort: [{ column: 'user', direction: 'descending' }],
|
|
46
40
|
}
|
|
47
41
|
void _badDirection
|
|
48
42
|
|
|
49
|
-
// -- ListOutput --------------------------------------------------------------
|
|
50
|
-
|
|
51
43
|
interface Session {
|
|
52
44
|
id: string
|
|
53
45
|
user: string
|
|
@@ -61,39 +53,29 @@ const _output: ListOutput<Session> = {
|
|
|
61
53
|
}
|
|
62
54
|
void _output
|
|
63
55
|
|
|
64
|
-
// nextCursor is required (must be string or null, not undefined-only)
|
|
65
56
|
// @ts-expect-error — missing nextCursor
|
|
66
57
|
const _badOutput: ListOutput<Session> = {
|
|
67
58
|
rows: [],
|
|
68
59
|
}
|
|
69
60
|
void _badOutput
|
|
70
61
|
|
|
71
|
-
// -- Filter: leaves ----------------------------------------------------------
|
|
72
|
-
|
|
73
|
-
// Simple equality
|
|
74
62
|
const _leafEq: Filter<SessionFilter> = { therapistId: 'kim' }
|
|
75
63
|
void _leafEq
|
|
76
64
|
|
|
77
|
-
// Array = IN shorthand
|
|
78
65
|
const _leafIn: Filter<SessionFilter> = { status: ['pending', 'processed'] }
|
|
79
66
|
void _leafIn
|
|
80
67
|
|
|
81
|
-
// Operator object
|
|
82
68
|
const _leafOp: Filter<SessionFilter> = {
|
|
83
69
|
uploadedAt: { gt: '2026-04-10', lte: '2026-04-17' },
|
|
84
70
|
}
|
|
85
71
|
void _leafOp
|
|
86
72
|
|
|
87
|
-
// Null = IS NULL
|
|
88
73
|
const _leafNull: Filter<SessionFilter> = { therapistId: null }
|
|
89
74
|
void _leafNull
|
|
90
75
|
|
|
91
|
-
// NOT on a value
|
|
92
76
|
const _leafNot: Filter<SessionFilter> = { therapistId: { not: 'kim' } }
|
|
93
77
|
void _leafNot
|
|
94
78
|
|
|
95
|
-
// -- Filter: AND (array) -----------------------------------------------------
|
|
96
|
-
|
|
97
79
|
const _and: Filter<SessionFilter> = [
|
|
98
80
|
{ status: ['pending'] },
|
|
99
81
|
{ therapistId: 'kim' },
|
|
@@ -101,16 +83,12 @@ const _and: Filter<SessionFilter> = [
|
|
|
101
83
|
]
|
|
102
84
|
void _and
|
|
103
85
|
|
|
104
|
-
// -- Filter: OR (object with arbitrary label keys) --------------------------
|
|
105
|
-
|
|
106
86
|
const _or: Filter<SessionFilter> = {
|
|
107
87
|
viaKim: { therapistId: 'kim' },
|
|
108
88
|
viaPark: { therapistId: 'park' },
|
|
109
89
|
}
|
|
110
90
|
void _or
|
|
111
91
|
|
|
112
|
-
// -- Filter: nested AND/OR ---------------------------------------------------
|
|
113
|
-
|
|
114
92
|
const _nested: Filter<SessionFilter> = [
|
|
115
93
|
{ status: ['pending'] },
|
|
116
94
|
{
|