@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,6 +1,8 @@
|
|
|
1
|
+
import { beginChanges } from './abort-scope.js';
|
|
1
2
|
import { runMiddleware, combineMiddleware } from '../middleware-runner.js';
|
|
2
3
|
import { combineChannelMiddleware, wrapChannelWithMiddleware, } from '../wirings/channel/channel-middleware-runner.js';
|
|
3
4
|
import { runPermissions } from '../permissions.js';
|
|
5
|
+
import { withoutSecrets } from '../services/secretless.js';
|
|
4
6
|
import { pikkuState } from '../pikku-state.js';
|
|
5
7
|
import { applyDefaultsFromSchema, coerceTopLevelDataFromSchema, validateSchema, } from '../schema.js';
|
|
6
8
|
import { parseVersionedId } from '../version.js';
|
|
@@ -12,6 +14,7 @@ import { defaultPikkuUserIdResolver } from '../services/pikku-user-id.js';
|
|
|
12
14
|
import { createInvocationAudit, resolveAuditConfig, } from '../services/audit-service.js';
|
|
13
15
|
import { rpcService } from '../wirings/rpc/rpc-runner.js';
|
|
14
16
|
import { getOrCreatePackageSingletonServices } from '../wirings/rpc/addon-runner.js';
|
|
17
|
+
import { resolveAddonAuth, resolveAddonScopes, resolveAddonTagMiddleware, } from '../wirings/rpc/wire-addon.js';
|
|
15
18
|
import { closeWireServices } from '../utils.js';
|
|
16
19
|
async function resolveSession(wire, singletonServices, sessionService) {
|
|
17
20
|
const pikkuUserId = defaultPikkuUserIdResolver(wire);
|
|
@@ -81,11 +84,10 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
81
84
|
throw new Error(`Function meta not found: ${funcName}`);
|
|
82
85
|
}
|
|
83
86
|
const resolvedFunctionId = funcMeta.pikkuFuncId ?? funcName;
|
|
84
|
-
|
|
87
|
+
const keepsSecrets = funcMeta.secretBroker === true;
|
|
85
88
|
const resolvedSingletonServices = packageName
|
|
86
89
|
? await getOrCreatePackageSingletonServices(packageName, singletonServices, addonInstance)
|
|
87
90
|
: singletonServices;
|
|
88
|
-
// Get the package's createWireServices if available
|
|
89
91
|
let resolvedCreateWireServices = createWireServices;
|
|
90
92
|
if (packageName) {
|
|
91
93
|
const factories = pikkuState(packageName, 'package', 'factories');
|
|
@@ -101,11 +103,9 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
101
103
|
const resolvedWire = allChannelMiddleware.length > 0 && wire.channel
|
|
102
104
|
? wrapChannelWithMiddleware(wire, resolvedSingletonServices, allChannelMiddleware)
|
|
103
105
|
: wire;
|
|
104
|
-
// Set up
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
// even when a parent credential service is already present on the wire.
|
|
108
|
-
// Otherwise skip if already set up (e.g. addon functions reuse the parent wire).
|
|
106
|
+
// Set up early so middleware can use setCredential. An addon instance with
|
|
107
|
+
// credentialOverrides always gets a fresh alias-aware service, even when a
|
|
108
|
+
// parent credential service is already present on the wire.
|
|
109
109
|
if (addonInstance?.credentialOverrides) {
|
|
110
110
|
// Credentials belong to the consuming project, so resolve them via the
|
|
111
111
|
// project's credentialService (the addon's own singletons may not carry it).
|
|
@@ -131,7 +131,6 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
131
131
|
if (addonInstance) {
|
|
132
132
|
invocationWire.addonNamespace = addonInstance.namespace;
|
|
133
133
|
}
|
|
134
|
-
// Helper function to run permissions and execute the function
|
|
135
134
|
const executeFunction = async () => {
|
|
136
135
|
await resolveSession(invocationWire, resolvedSingletonServices, sessionService);
|
|
137
136
|
if (sessionService) {
|
|
@@ -143,7 +142,9 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
143
142
|
}
|
|
144
143
|
const session = invocationWire.session;
|
|
145
144
|
if (funcMeta.sessionless) {
|
|
146
|
-
if (wiringAuth === true ||
|
|
145
|
+
if (wiringAuth === true ||
|
|
146
|
+
funcConfig.auth === true ||
|
|
147
|
+
resolveAddonAuth(packageName, addonInstance?.namespace)) {
|
|
147
148
|
if (!session) {
|
|
148
149
|
throw new ForbiddenError('Authentication required');
|
|
149
150
|
}
|
|
@@ -160,31 +161,32 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
160
161
|
if (session?.readonly && !funcMeta.readonly) {
|
|
161
162
|
throw new ReadonlySessionError();
|
|
162
163
|
}
|
|
163
|
-
//
|
|
164
|
-
//
|
|
165
|
-
//
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
164
|
+
// Only mutating functions get a checkpoint. A read has nothing to declare,
|
|
165
|
+
// and offering it there would invite the contradiction of a `readonly`
|
|
166
|
+
// function announcing where its changes begin.
|
|
167
|
+
if (!funcMeta.readonly) {
|
|
168
|
+
invocationWire.beginChanges = beginChanges;
|
|
169
|
+
}
|
|
170
|
+
// knowledge: decisions/security/addon-scopes-are-resolved-where-the-function-runs.md
|
|
171
|
+
const addonScopes = resolveAddonScopes(packageName, addonInstance?.namespace);
|
|
172
|
+
const functionScopes = funcConfig.scopes ?? funcMeta.scopes;
|
|
173
|
+
verifyScopes(addonScopes.length > 0
|
|
174
|
+
? [...addonScopes, ...(functionScopes ?? [])]
|
|
175
|
+
: functionScopes, session);
|
|
169
176
|
let actualData = await data();
|
|
170
|
-
// Validate and coerce data if schema is defined
|
|
171
177
|
const inputSchemaName = funcMeta.inputSchemaName;
|
|
172
178
|
if (inputSchemaName) {
|
|
173
|
-
// Fill in schema defaults before anything reads the data. Unconditional:
|
|
174
|
-
// a default belongs to the schema, not to the transport the call arrived
|
|
175
|
-
// on. Runs before coercion so a defaulted value and a supplied one are
|
|
176
|
-
// treated identically from here on.
|
|
177
179
|
actualData = applyDefaultsFromSchema(inputSchemaName, actualData, packageName);
|
|
178
|
-
// Coerce (top level) data types before validation (e.g. string→array, string→date)
|
|
179
180
|
if (coerceDataFromSchema) {
|
|
180
181
|
coerceTopLevelDataFromSchema(inputSchemaName, actualData, packageName);
|
|
181
182
|
}
|
|
182
|
-
// Validate request data against the defined schema, if any
|
|
183
183
|
await validateSchema(resolvedSingletonServices.logger, resolvedSingletonServices.schema, inputSchemaName, actualData, packageName);
|
|
184
184
|
}
|
|
185
185
|
await runPermissions({
|
|
186
186
|
funcPermissions: funcConfig.permissions,
|
|
187
|
-
services:
|
|
187
|
+
services: keepsSecrets
|
|
188
|
+
? resolvedSingletonServices
|
|
189
|
+
: withoutSecrets(resolvedSingletonServices, 'a permission'),
|
|
188
190
|
wire: invocationWire,
|
|
189
191
|
data: actualData,
|
|
190
192
|
packageName,
|
|
@@ -196,13 +198,7 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
196
198
|
let services = wireServices && Object.keys(wireServices).length > 0
|
|
197
199
|
? { ...resolvedSingletonServices, ...wireServices }
|
|
198
200
|
: resolvedSingletonServices;
|
|
199
|
-
//
|
|
200
|
-
// created per-transport-invocation — a nested/exposed-RPC call would
|
|
201
|
-
// otherwise inherit an auditLog constructed while the OUTER wire's
|
|
202
|
-
// audit was unset (e.g. the generated rpcCaller has no audit config),
|
|
203
|
-
// silently dropping every write. Re-gate here: if this function
|
|
204
|
-
// declares audit and the inherited auditLog wasn't built for this
|
|
205
|
-
// invocation (config identity check), bind a fresh one to this wire.
|
|
201
|
+
// knowledge: decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md
|
|
206
202
|
if (resolvedAuditConfig &&
|
|
207
203
|
resolvedSingletonServices.audit &&
|
|
208
204
|
services.auditLog?.config !== resolvedAuditConfig) {
|
|
@@ -223,7 +219,7 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
223
219
|
configurable: true,
|
|
224
220
|
enumerable: true,
|
|
225
221
|
});
|
|
226
|
-
return await funcConfig.func(services, actualData, invocationWire);
|
|
222
|
+
return await funcConfig.func(keepsSecrets ? services : withoutSecrets(services, 'a pikku function'), actualData, invocationWire);
|
|
227
223
|
}
|
|
228
224
|
finally {
|
|
229
225
|
// Flush the runner-installed audit buffer before wire services close.
|
|
@@ -233,9 +229,12 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
233
229
|
}
|
|
234
230
|
}
|
|
235
231
|
};
|
|
232
|
+
const addonTagMiddleware = resolveAddonTagMiddleware(packageName, addonInstance?.namespace);
|
|
236
233
|
const allMiddleware = combineMiddleware(wireType, wireId, {
|
|
237
234
|
wireInheritedMiddleware: inheritedMiddleware,
|
|
238
|
-
wireMiddleware
|
|
235
|
+
wireMiddleware: addonTagMiddleware.length > 0
|
|
236
|
+
? [...addonTagMiddleware, ...(wireMiddleware ?? [])]
|
|
237
|
+
: wireMiddleware,
|
|
239
238
|
funcInheritedMiddleware: funcMeta.middleware,
|
|
240
239
|
funcMiddleware: funcConfig.middleware,
|
|
241
240
|
packageName,
|
|
@@ -287,5 +286,11 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
|
|
|
287
286
|
else {
|
|
288
287
|
invocationWire.audit = previousAudit;
|
|
289
288
|
}
|
|
289
|
+
if (previousAddonNamespace === undefined) {
|
|
290
|
+
delete invocationWire.addonNamespace;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
invocationWire.addonNamespace = previousAddonNamespace;
|
|
294
|
+
}
|
|
290
295
|
}
|
|
291
296
|
};
|
|
@@ -1,156 +1,67 @@
|
|
|
1
|
-
import type { CoreServices,
|
|
1
|
+
import type { CoreServices, CoreSecretlessSingletonServices, CoreUserSession, CorePikkuMiddleware, PikkuWire, PickRequired, SecretlessServices } from '../types/core.types.js';
|
|
2
2
|
import type { PikkuRPC } from '../wirings/rpc/rpc-types.js';
|
|
3
3
|
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
4
4
|
import type { PikkuError } from '../errors/error-handler.js';
|
|
5
5
|
import type { CoreNodeConfig } from '../wirings/node/node.types.js';
|
|
6
|
+
import type { ScenarioSurface } from '../wirings/workflow/scenario-step.types.js';
|
|
7
|
+
import type { Safe } from '../secret-value.js';
|
|
6
8
|
/**
|
|
7
9
|
* @deprecated Use StandardSchemaV1 from @standard-schema/spec instead.
|
|
8
10
|
* This alias exists only for backward compatibility with generated code.
|
|
9
11
|
*/
|
|
10
12
|
export type ZodLike<T = any> = StandardSchemaV1<T, T>;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* @template Out - The output type.
|
|
16
|
-
* @template Services - The services type, defaults to `CoreServices`.
|
|
17
|
-
* @template Wire - The wire type, defaults to `PikkuWire<In, Out>`.
|
|
18
|
-
*/
|
|
19
|
-
export type CorePikkuFunction<In, Out, Services extends CoreSingletonServices = CoreServices, Session extends CoreUserSession = CoreUserSession, Wire extends PikkuWire<In, Out, true, Session, PikkuRPC, null, string> = PikkuWire<In, Out, true, Session>> = (services: Services, data: In, wire: Wire) => Wire['channel'] extends null ? Promise<Out> : Promise<Out> | Promise<void>;
|
|
20
|
-
/**
|
|
21
|
-
* Represents a core API function that can be used without a 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
|
-
export type CorePikkuFunctionSessionless<In, Out, Services extends CoreSingletonServices = CoreServices, Session extends CoreUserSession = CoreUserSession, Wire extends PikkuWire<In, Out, false, Session, PikkuRPC, null, string> = PikkuWire<In, Out, false, Session>> = (services: Services, data: In, wire: Wire) => Wire['channel'] extends null ? Promise<Out> : Promise<Out> | Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* Represents a function that checks permissions for a given operation.
|
|
31
|
-
*
|
|
32
|
-
* @template In - The input type.
|
|
33
|
-
* @template Services - The services type, defaults to `CoreServices`.
|
|
34
|
-
* @template Session - The session type, defaults to `CoreUserSession`.
|
|
35
|
-
*/
|
|
36
|
-
export type CorePikkuPermission<In = any, Services extends CoreSingletonServices = CoreServices, Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> = PikkuWire<In, never, false, any, PikkuRPC, never, never>> = (services: Services, data: In, wire: Wire) => Promise<boolean>;
|
|
37
|
-
/**
|
|
38
|
-
* Configuration object for creating a permission with metadata
|
|
39
|
-
*
|
|
40
|
-
* @template In - The input type.
|
|
41
|
-
* @template Services - The services type, defaults to `CoreServices`.
|
|
42
|
-
* @template Session - The session type, defaults to `CoreUserSession`.
|
|
43
|
-
*/
|
|
44
|
-
export type CorePikkuPermissionConfig<In = any, Services extends CoreSingletonServices = CoreServices, Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> = PikkuWire<In, never, false, any, PikkuRPC, never, never>> = {
|
|
45
|
-
/** The permission function */
|
|
13
|
+
export type CorePikkuFunction<In, Out, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Session extends CoreUserSession = CoreUserSession, Wire extends PikkuWire<In, Out, true, Session, PikkuRPC, null, string> = PikkuWire<In, Out, true, Session>> = (services: Services, data: In, wire: Wire) => Wire['channel'] extends null ? Promise<Safe<Out>> : Promise<Safe<Out>> | Promise<void>;
|
|
14
|
+
export type CorePikkuFunctionSessionless<In, Out, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Session extends CoreUserSession = CoreUserSession, Wire extends PikkuWire<In, Out, false, Session, PikkuRPC, null, string> = PikkuWire<In, Out, false, Session>> = (services: Services, data: In, wire: Wire) => Wire['channel'] extends null ? Promise<Safe<Out>> : Promise<Safe<Out>> | Promise<void>;
|
|
15
|
+
export type CorePikkuPermission<In = any, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> = PikkuWire<In, never, false, any, PikkuRPC, never, never>> = (services: Services, data: In, wire: Wire) => Promise<boolean>;
|
|
16
|
+
export type CorePikkuPermissionConfig<In = any, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> = PikkuWire<In, never, false, any, PikkuRPC, never, never>> = {
|
|
46
17
|
func: CorePikkuPermission<In, Services, Wire>;
|
|
47
|
-
/** Optional human-readable name for the permission */
|
|
48
18
|
name?: string;
|
|
49
|
-
/** Optional description of what the permission checks */
|
|
50
19
|
description?: string;
|
|
51
20
|
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
* Supports both direct function and configuration object syntax
|
|
55
|
-
*
|
|
56
|
-
* @example
|
|
57
|
-
* ```typescript
|
|
58
|
-
* // Direct function syntax
|
|
59
|
-
* export const adminPermission = pikkuPermission(
|
|
60
|
-
* async ({ logger }, _data, { getSession }) => {
|
|
61
|
-
* const currentSession = await getSession()
|
|
62
|
-
* return currentSession?.role === 'admin'
|
|
63
|
-
* }
|
|
64
|
-
* )
|
|
65
|
-
*
|
|
66
|
-
* // Configuration object syntax with metadata
|
|
67
|
-
* export const adminPermission = pikkuPermission({
|
|
68
|
-
* name: 'Admin Permission',
|
|
69
|
-
* description: 'Checks if user has admin role',
|
|
70
|
-
* func: async ({ logger }, _data, { getSession }) => {
|
|
71
|
-
* const currentSession = await getSession()
|
|
72
|
-
* return currentSession?.role === 'admin'
|
|
73
|
-
* }
|
|
74
|
-
* })
|
|
75
|
-
* ```
|
|
76
|
-
*/
|
|
77
|
-
export declare const pikkuPermission: <In = any, Services extends CoreSingletonServices = CoreServices, Wire extends PickRequired<PikkuWire<In, never, false, any, PikkuRPC, never, never>, "session"> = PickRequired<PikkuWire<In, never, false, any, PikkuRPC, never, never>, "session">>(permission: CorePikkuPermission<In, Services, Wire> | CorePikkuPermissionConfig<In, Services, Wire>) => CorePikkuPermission<In, Services, Wire>;
|
|
78
|
-
/**
|
|
79
|
-
* A factory function that takes input and returns a permission
|
|
80
|
-
* Used when permissions need configuration/input parameters
|
|
81
|
-
*
|
|
82
|
-
* @template In - The input type for the factory.
|
|
83
|
-
* @template Services - The services type, defaults to `CoreServices`.
|
|
84
|
-
* @template Session - The session type, defaults to `CoreUserSession`.
|
|
85
|
-
*/
|
|
86
|
-
export type CorePikkuPermissionFactory<In = any, Services extends CoreSingletonServices = CoreServices, Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> = PikkuWire<In, never, false, any, PikkuRPC, never, never>> = (input: In) => CorePikkuPermission<any, Services, Wire>;
|
|
87
|
-
/**
|
|
88
|
-
* Factory function for creating permission factories
|
|
89
|
-
* Use this when your permission needs configuration/input parameters
|
|
90
|
-
*
|
|
91
|
-
* @example
|
|
92
|
-
* ```typescript
|
|
93
|
-
* export const requireRole = pikkuPermissionFactory<{ role: string }>(({
|
|
94
|
-
* role
|
|
95
|
-
* }) => {
|
|
96
|
-
* return pikkuPermission(async ({ logger }, data, { getSession }) => {
|
|
97
|
-
* const currentSession = await getSession()
|
|
98
|
-
* if (!currentSession || currentSession.role !== role) {
|
|
99
|
-
* logger.warn(`Permission denied: required role '${role}'`)
|
|
100
|
-
* return false
|
|
101
|
-
* }
|
|
102
|
-
* return true
|
|
103
|
-
* })
|
|
104
|
-
* })
|
|
105
|
-
* ```
|
|
106
|
-
*/
|
|
21
|
+
export declare const pikkuPermission: <In = any, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Wire extends PickRequired<PikkuWire<In, never, false, any, PikkuRPC, never, never>, "session"> = PickRequired<PikkuWire<In, never, false, any, PikkuRPC, never, never>, "session">>(permission: CorePikkuPermission<In, Services, Wire> | CorePikkuPermissionConfig<In, Services, Wire>) => CorePikkuPermission<In, Services, Wire>;
|
|
22
|
+
export type CorePikkuPermissionFactory<In = any, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> = PikkuWire<In, never, false, any, PikkuRPC, never, never>> = (input: In) => CorePikkuPermission<any, Services, Wire>;
|
|
107
23
|
export declare const pikkuPermissionFactory: <In = any>(factory: CorePikkuPermissionFactory<In>) => CorePikkuPermissionFactory<In>;
|
|
108
24
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* @template In - The input type (same as the function it describes).
|
|
113
|
-
* @template Services - The services type, defaults to `CoreSingletonServices`.
|
|
25
|
+
* Renders a human-readable approval prompt for an AI agent, in place of the
|
|
26
|
+
* raw tool arguments.
|
|
114
27
|
*/
|
|
115
|
-
export type CorePikkuApprovalDescription<In = any, Services extends
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
* @example
|
|
120
|
-
* ```typescript
|
|
121
|
-
* export const deleteTodoApproval = pikkuApprovalDescription(
|
|
122
|
-
* async ({ todoStore }, { id }) => {
|
|
123
|
-
* const todo = await todoStore.get(id)
|
|
124
|
-
* return `Delete todo: "${todo.title}"`
|
|
125
|
-
* }
|
|
126
|
-
* )
|
|
127
|
-
* ```
|
|
128
|
-
*/
|
|
129
|
-
export declare const pikkuApprovalDescription: <In = any, Services extends CoreSingletonServices = CoreSingletonServices>(fn: CorePikkuApprovalDescription<In, Services>) => CorePikkuApprovalDescription<In, Services>;
|
|
130
|
-
export type CorePikkuAuth<Services extends CoreSingletonServices = CoreServices, Session extends CoreUserSession = CoreUserSession> = (services: Services, session: Session) => Promise<boolean> | boolean;
|
|
131
|
-
export type CorePikkuAuthConfig<Services extends CoreSingletonServices = CoreServices, Session extends CoreUserSession = CoreUserSession> = {
|
|
28
|
+
export type CorePikkuApprovalDescription<In = any, Services extends CoreSecretlessSingletonServices = CoreSecretlessSingletonServices> = (services: Services, data: In) => Promise<string>;
|
|
29
|
+
export declare const pikkuApprovalDescription: <In = any, Services extends CoreSecretlessSingletonServices = CoreSecretlessSingletonServices>(fn: CorePikkuApprovalDescription<In, Services>) => CorePikkuApprovalDescription<In, Services>;
|
|
30
|
+
export type CorePikkuAuth<Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Session extends CoreUserSession = CoreUserSession> = (services: Services, session: Session) => Promise<boolean> | boolean;
|
|
31
|
+
export type CorePikkuAuthConfig<Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Session extends CoreUserSession = CoreUserSession> = {
|
|
132
32
|
func: CorePikkuAuth<Services, Session>;
|
|
133
33
|
name?: string;
|
|
134
34
|
description?: string;
|
|
135
35
|
};
|
|
136
|
-
export declare const pikkuAuth: <Services extends
|
|
36
|
+
export declare const pikkuAuth: <Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Session extends CoreUserSession = CoreUserSession>(auth: CorePikkuAuth<Services, Session> | CorePikkuAuthConfig<Services, Session>) => CorePikkuPermission<any, Services, any>;
|
|
137
37
|
export type CorePermissionGroup<PikkuPermission = CorePikkuPermission<any>> = Record<string, PikkuPermission | PikkuPermission[]> | undefined;
|
|
138
38
|
/**
|
|
139
|
-
* A lifecycle hook:
|
|
140
|
-
*
|
|
141
|
-
*
|
|
39
|
+
* A lifecycle hook: same call signature as the function it hangs off, return
|
|
40
|
+
* value discarded. Setup/teardown, not a step — no id, no meta, no schema, so
|
|
41
|
+
* it is never recorded and never replayed.
|
|
142
42
|
*/
|
|
143
43
|
export type CorePikkuFunctionHook<Services = any, Data = any, Wire = any> = (services: Services, data: Data, wire: Wire) => Promise<void> | void;
|
|
144
44
|
export type CorePikkuFunctionConfig<PikkuFunction extends CorePikkuFunction<any, any, any, any, any> | CorePikkuFunctionSessionless<any, any, any, any, any>, PikkuPermission extends CorePikkuPermission<any, any, any> = CorePikkuPermission<any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any, any>, InputSchema extends StandardSchemaV1 | undefined = undefined, OutputSchema extends StandardSchemaV1 | undefined = undefined, Scope extends string = string> = {
|
|
145
|
-
/** Short human-readable name (e.g. "Create Todo") */
|
|
146
45
|
title?: string;
|
|
147
|
-
/** Longer-form description of what the function does */
|
|
148
46
|
description?: string;
|
|
149
47
|
/** Explicit logical name override; lets multiple exports share a versioned base */
|
|
150
48
|
override?: string;
|
|
151
49
|
version?: number;
|
|
152
50
|
tags?: string[];
|
|
153
51
|
expose?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* The permission check for this function lives in its body — verifying a
|
|
54
|
+
* signed token, checking a webhook signature, matching an invite code — so
|
|
55
|
+
* it is not open despite declaring no session, scope or permission.
|
|
56
|
+
*
|
|
57
|
+
* A last resort. Prefer `permissions`, which are declared, inspectable, and
|
|
58
|
+
* reusable; reach for this only when the check cannot be expressed as one.
|
|
59
|
+
*
|
|
60
|
+
* Purely declarative — it grants nothing, and asserting it falsely disables
|
|
61
|
+
* the audit that would have caught the mistake. Requires
|
|
62
|
+
* `allow.permissionsInBody` in `pikku.config.json`.
|
|
63
|
+
*/
|
|
64
|
+
permissionsInBody?: boolean;
|
|
154
65
|
remote?: boolean;
|
|
155
66
|
mcp?: boolean;
|
|
156
67
|
readonly?: boolean;
|
|
@@ -162,8 +73,12 @@ export type CorePikkuFunctionConfig<PikkuFunction extends CorePikkuFunction<any,
|
|
|
162
73
|
workflowRetries?: number;
|
|
163
74
|
/** Timeout for this function when used as a workflow step (e.g. '30s', '5m'). */
|
|
164
75
|
workflowTimeout?: string;
|
|
165
|
-
/**
|
|
166
|
-
|
|
76
|
+
/**
|
|
77
|
+
* Scenario steps only: which surfaces this step declares a binding for. The
|
|
78
|
+
* runner uses it to pick a binding, decide whether to provision a browser,
|
|
79
|
+
* and report how much of the flow each surface actually covers.
|
|
80
|
+
*/
|
|
81
|
+
surfaces?: ScenarioSurface[];
|
|
167
82
|
audit?: boolean | {
|
|
168
83
|
durability?: 'best-effort' | 'transactional';
|
|
169
84
|
};
|
|
@@ -176,26 +91,23 @@ export type CorePikkuFunctionConfig<PikkuFunction extends CorePikkuFunction<any,
|
|
|
176
91
|
*/
|
|
177
92
|
before?: CorePikkuFunctionHook;
|
|
178
93
|
/**
|
|
179
|
-
* Scenarios only: always runs after the
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
* original error.
|
|
94
|
+
* Scenarios only: always runs after the body, in a `finally`. Throwing fails
|
|
95
|
+
* an otherwise-passing run; on an already-failed run it attaches as `cause`
|
|
96
|
+
* and never replaces the original error.
|
|
183
97
|
*/
|
|
184
98
|
after?: CorePikkuFunctionHook;
|
|
185
99
|
/**
|
|
186
|
-
* Scenarios only: why this scenario is held out of a default run.
|
|
187
|
-
*
|
|
188
|
-
* with `--flows` runs it anyway.
|
|
100
|
+
* Scenarios only: why this scenario is held out of a default run. Reported
|
|
101
|
+
* as skipped rather than quietly omitted; naming it in `--flows` runs it.
|
|
189
102
|
*/
|
|
190
103
|
skip?: string;
|
|
191
104
|
auth?: boolean;
|
|
192
105
|
/**
|
|
193
|
-
* Scopes the session must hold
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
* `pikku-types.gen.ts`, so an undeclared scope is a compile error.
|
|
106
|
+
* Scopes the session must hold; all are required (AND) and checked before
|
|
107
|
+
* `permissions`, which OR together — a scope can only narrow access.
|
|
108
|
+
* Narrowed to the generated `ScopeId` union, so an undeclared scope is a
|
|
109
|
+
* compile error. Requires a session — see
|
|
110
|
+
* {@link CorePikkuSessionlessFunctionConfig}.
|
|
199
111
|
*/
|
|
200
112
|
scopes?: Scope[];
|
|
201
113
|
permissions?: CorePermissionGroup<PikkuPermission>;
|
|
@@ -205,3 +117,12 @@ export type CorePikkuFunctionConfig<PikkuFunction extends CorePikkuFunction<any,
|
|
|
205
117
|
node?: CoreNodeConfig;
|
|
206
118
|
errors?: Array<typeof PikkuError>;
|
|
207
119
|
};
|
|
120
|
+
/**
|
|
121
|
+
* {@link CorePikkuFunctionConfig} for a function that runs without a session.
|
|
122
|
+
*
|
|
123
|
+
* Identical, minus `scopes`. Scopes are AND-ed and `verifyScopes` fails closed,
|
|
124
|
+
* so an anonymous caller holds none and satisfies none — a sessionless function
|
|
125
|
+
* with scopes rejects every caller it exists to serve. Gate it with
|
|
126
|
+
* `permissions`, which receive the optional session and may pass anonymous.
|
|
127
|
+
*/
|
|
128
|
+
export type CorePikkuSessionlessFunctionConfig<PikkuFunction extends CorePikkuFunctionSessionless<any, any, any, any, any>, PikkuPermission extends CorePikkuPermission<any, any, any> = CorePikkuPermission<any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any, any>, InputSchema extends StandardSchemaV1 | undefined = undefined, OutputSchema extends StandardSchemaV1 | undefined = undefined> = Omit<CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware, InputSchema, OutputSchema>, 'scopes'>;
|
|
@@ -1,67 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Factory function for creating permissions with tree-shaking support
|
|
3
|
-
* Supports both direct function and configuration object syntax
|
|
4
|
-
*
|
|
5
|
-
* @example
|
|
6
|
-
* ```typescript
|
|
7
|
-
* // Direct function syntax
|
|
8
|
-
* export const adminPermission = pikkuPermission(
|
|
9
|
-
* async ({ logger }, _data, { getSession }) => {
|
|
10
|
-
* const currentSession = await getSession()
|
|
11
|
-
* return currentSession?.role === 'admin'
|
|
12
|
-
* }
|
|
13
|
-
* )
|
|
14
|
-
*
|
|
15
|
-
* // Configuration object syntax with metadata
|
|
16
|
-
* export const adminPermission = pikkuPermission({
|
|
17
|
-
* name: 'Admin Permission',
|
|
18
|
-
* description: 'Checks if user has admin role',
|
|
19
|
-
* func: async ({ logger }, _data, { getSession }) => {
|
|
20
|
-
* const currentSession = await getSession()
|
|
21
|
-
* return currentSession?.role === 'admin'
|
|
22
|
-
* }
|
|
23
|
-
* })
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
1
|
export const pikkuPermission = (permission) => {
|
|
27
2
|
return typeof permission === 'function' ? permission : permission.func;
|
|
28
3
|
};
|
|
29
|
-
/**
|
|
30
|
-
* Factory function for creating permission factories
|
|
31
|
-
* Use this when your permission needs configuration/input parameters
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```typescript
|
|
35
|
-
* export const requireRole = pikkuPermissionFactory<{ role: string }>(({
|
|
36
|
-
* role
|
|
37
|
-
* }) => {
|
|
38
|
-
* return pikkuPermission(async ({ logger }, data, { getSession }) => {
|
|
39
|
-
* const currentSession = await getSession()
|
|
40
|
-
* if (!currentSession || currentSession.role !== role) {
|
|
41
|
-
* logger.warn(`Permission denied: required role '${role}'`)
|
|
42
|
-
* return false
|
|
43
|
-
* }
|
|
44
|
-
* return true
|
|
45
|
-
* })
|
|
46
|
-
* })
|
|
47
|
-
* ```
|
|
48
|
-
*/
|
|
49
4
|
export const pikkuPermissionFactory = (factory) => {
|
|
50
5
|
return factory;
|
|
51
6
|
};
|
|
52
|
-
/**
|
|
53
|
-
* Factory function for creating approval description functions with tree-shaking support.
|
|
54
|
-
*
|
|
55
|
-
* @example
|
|
56
|
-
* ```typescript
|
|
57
|
-
* export const deleteTodoApproval = pikkuApprovalDescription(
|
|
58
|
-
* async ({ todoStore }, { id }) => {
|
|
59
|
-
* const todo = await todoStore.get(id)
|
|
60
|
-
* return `Delete todo: "${todo.title}"`
|
|
61
|
-
* }
|
|
62
|
-
* )
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
7
|
export const pikkuApprovalDescription = (fn) => {
|
|
66
8
|
return fn;
|
|
67
9
|
};
|
package/dist/function/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { addFunction, getAllFunctionNames } from './function-runner.js';
|
|
2
2
|
export { pikkuAuth, pikkuPermission, pikkuPermissionFactory, pikkuApprovalDescription, } from './functions.types.js';
|
|
3
|
-
export type { CorePikkuFunction, CorePikkuFunctionSessionless, CorePikkuFunctionConfig, CorePikkuAuth, CorePikkuAuthConfig, CorePikkuPermission, } from './functions.types.js';
|
|
3
|
+
export type { CorePikkuFunction, CorePikkuFunctionSessionless, CorePikkuFunctionConfig, CorePikkuSessionlessFunctionConfig, CorePikkuAuth, CorePikkuAuthConfig, CorePikkuPermission, } from './functions.types.js';
|
|
4
4
|
export type { ListInput, ListOutput, Filter, LeafFilter, LeafValue, } from './list.types.js';
|
|
@@ -1,35 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* MCP tools, AI agents, typed RPC clients, and widget libraries — they
|
|
7
|
-
* all reason about cursor, filter, sort, and search uniformly.
|
|
8
|
-
*
|
|
9
|
-
* Under the hood, a list function is still a normal `pikkuFunc`. These
|
|
10
|
-
* types are purely structural constraints; no runtime behaviour change.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```ts
|
|
14
|
-
* import { pikkuFunc } from '#pikku'
|
|
15
|
-
* import type { ListInput, ListOutput } from '@pikku/core'
|
|
16
|
-
*
|
|
17
|
-
* export const listSessions = pikkuFunc<
|
|
18
|
-
* ListInput<{ status?: SessionStatus[] }, 'user' | 'status' | 'uploaded_at'>,
|
|
19
|
-
* ListOutput<Session>
|
|
20
|
-
* >({
|
|
21
|
-
* func: async ({ kysely }, input) => {
|
|
22
|
-
* // input.sort / input.filter / input.cursor / input.search are typed
|
|
23
|
-
* return { rows, nextCursor, totalCount }
|
|
24
|
-
* },
|
|
25
|
-
* })
|
|
26
|
-
* ```
|
|
27
|
-
*/
|
|
28
|
-
/**
|
|
29
|
-
* Shape every list function accepts as input.
|
|
30
|
-
*
|
|
31
|
-
* @template F - User-defined filter shape. Each key is a filterable field.
|
|
32
|
-
* @template S - String union of sortable column names.
|
|
2
|
+
* A list function is an ordinary `pikkuFunc` whose input and output adopt
|
|
3
|
+
* these shapes. They are purely structural — no runtime behaviour attaches to
|
|
4
|
+
* them — and exist so MCP tools, agents, RPC clients and widget libraries all
|
|
5
|
+
* reason about cursor, filter, sort and search the same way.
|
|
33
6
|
*/
|
|
34
7
|
export interface ListInput<F extends Record<string, unknown> = Record<string, never>, S extends string = never> {
|
|
35
8
|
/** Opaque cursor from the previous page's `nextCursor`. */
|
|
@@ -41,14 +14,10 @@ export interface ListInput<F extends Record<string, unknown> = Record<string, ne
|
|
|
41
14
|
column: S;
|
|
42
15
|
direction: 'asc' | 'desc';
|
|
43
16
|
}>;
|
|
44
|
-
/** Structured filter tree. See {@link Filter}. */
|
|
45
17
|
filter?: Filter<F>;
|
|
46
18
|
/** Unstructured text search across server-configured fields. */
|
|
47
19
|
search?: string;
|
|
48
20
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Shape every list function returns.
|
|
51
|
-
*/
|
|
52
21
|
export interface ListOutput<Row> {
|
|
53
22
|
rows: Row[];
|
|
54
23
|
/** Null when no more pages. */
|
|
@@ -57,12 +26,9 @@ export interface ListOutput<Row> {
|
|
|
57
26
|
totalCount?: number;
|
|
58
27
|
}
|
|
59
28
|
/**
|
|
60
|
-
* Leaf predicate
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* `lte`, `contains`, `startsWith`, `endsWith`, `mode`) mirror Prisma's
|
|
64
|
-
* vocabulary for dev familiarity. These keys are reserved and cannot be
|
|
65
|
-
* used as user field names in a Filter's `F` type.
|
|
29
|
+
* Leaf predicate on a single field. The operator keywords mirror Prisma's
|
|
30
|
+
* vocabulary; they are reserved and cannot be used as user field names in a
|
|
31
|
+
* Filter's `F` type.
|
|
66
32
|
*/
|
|
67
33
|
export type LeafValue<T> = T | null | T[] | {
|
|
68
34
|
equals?: T | null;
|
|
@@ -79,9 +45,8 @@ export type LeafValue<T> = T | null | T[] | {
|
|
|
79
45
|
mode?: 'sensitive' | 'insensitive';
|
|
80
46
|
};
|
|
81
47
|
/**
|
|
82
|
-
* A single-key object keyed by a field
|
|
83
|
-
*
|
|
84
|
-
* multi-key objects are OR groups.
|
|
48
|
+
* A single-key object keyed by a field of F. Single-key so the runtime
|
|
49
|
+
* discriminator is unambiguous — multi-key objects are OR groups.
|
|
85
50
|
*/
|
|
86
51
|
export type LeafFilter<F extends Record<string, unknown>> = {
|
|
87
52
|
[K in keyof F]: {
|
|
@@ -89,24 +54,9 @@ export type LeafFilter<F extends Record<string, unknown>> = {
|
|
|
89
54
|
};
|
|
90
55
|
}[keyof F];
|
|
91
56
|
/**
|
|
92
|
-
* Recursive filter tree
|
|
93
|
-
*
|
|
94
|
-
* -
|
|
95
|
-
* - `{ [label: string]: Filter<F> }` — OR of children. Keys are arbitrary
|
|
96
|
-
* labels (unique strings), ignored at evaluation time.
|
|
97
|
-
* - `LeafFilter<F>` — single-key predicate on a declared field.
|
|
98
|
-
*
|
|
99
|
-
* @example "status = pending AND (therapist = kim OR therapist = park) AND uploaded_at > 2026-04-10"
|
|
100
|
-
* ```ts
|
|
101
|
-
* const filter: Filter<{ status: string; therapistId: string; uploadedAt: string }> = [
|
|
102
|
-
* { status: 'pending' },
|
|
103
|
-
* {
|
|
104
|
-
* kim: { therapistId: 'kim' },
|
|
105
|
-
* park: { therapistId: 'park' },
|
|
106
|
-
* },
|
|
107
|
-
* { uploadedAt: { gt: '2026-04-10' } },
|
|
108
|
-
* ]
|
|
109
|
-
* ```
|
|
57
|
+
* Recursive filter tree: an array is an AND of its children; an object is an
|
|
58
|
+
* OR of its children, keyed by arbitrary unique labels that are ignored at
|
|
59
|
+
* evaluation time; a single-key object is a leaf predicate.
|
|
110
60
|
*/
|
|
111
61
|
export type Filter<F extends Record<string, unknown>> = LeafFilter<F> | Filter<F>[] | {
|
|
112
62
|
[label: string]: Filter<F>;
|
|
@@ -1,28 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* MCP tools, AI agents, typed RPC clients, and widget libraries — they
|
|
7
|
-
* all reason about cursor, filter, sort, and search uniformly.
|
|
8
|
-
*
|
|
9
|
-
* Under the hood, a list function is still a normal `pikkuFunc`. These
|
|
10
|
-
* types are purely structural constraints; no runtime behaviour change.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```ts
|
|
14
|
-
* import { pikkuFunc } from '#pikku'
|
|
15
|
-
* import type { ListInput, ListOutput } from '@pikku/core'
|
|
16
|
-
*
|
|
17
|
-
* export const listSessions = pikkuFunc<
|
|
18
|
-
* ListInput<{ status?: SessionStatus[] }, 'user' | 'status' | 'uploaded_at'>,
|
|
19
|
-
* ListOutput<Session>
|
|
20
|
-
* >({
|
|
21
|
-
* func: async ({ kysely }, input) => {
|
|
22
|
-
* // input.sort / input.filter / input.cursor / input.search are typed
|
|
23
|
-
* return { rows, nextCursor, totalCount }
|
|
24
|
-
* },
|
|
25
|
-
* })
|
|
26
|
-
* ```
|
|
2
|
+
* A list function is an ordinary `pikkuFunc` whose input and output adopt
|
|
3
|
+
* these shapes. They are purely structural — no runtime behaviour attaches to
|
|
4
|
+
* them — and exist so MCP tools, agents, RPC clients and widget libraries all
|
|
5
|
+
* reason about cursor, filter, sort and search the same way.
|
|
27
6
|
*/
|
|
28
7
|
export {};
|