@pikku/core 0.12.71 → 0.12.74
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 +848 -0
- package/dist/crypto-utils.d.ts +30 -5
- package/dist/crypto-utils.js +146 -41
- 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 +40 -30
- package/dist/function/functions.types.d.ts +44 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -11
- package/dist/handle-error.js +6 -18
- package/dist/index.d.ts +5 -2
- package/dist/index.js +4 -1
- 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 +3 -40
- 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 +3 -2
- 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 +8 -7
- package/dist/schema.d.ts +7 -17
- package/dist/schema.js +30 -18
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- 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.js +1 -2
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/deployment-service.d.ts +3 -9
- 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 +5 -6
- package/dist/services/index.js +2 -5
- 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.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 +0 -4
- package/dist/services/local-secrets.js +0 -4
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +2 -37
- 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 +9 -41
- 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 +0 -4
- 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 +5 -33
- 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 +0 -7
- 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 +19 -63
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +0 -17
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +99 -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 +34 -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 +58 -131
- 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 +49 -20
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -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 +39 -1
- package/dist/wirings/ai-agent/voice-input.js +46 -3
- package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
- package/dist/wirings/ai-agent/voice-output.js +153 -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 +20 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
- package/dist/wirings/cli/channel/index.d.ts +4 -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 +1 -100
- package/dist/wirings/http/http-runner.js +12 -166
- package/dist/wirings/http/http.types.d.ts +16 -55
- package/dist/wirings/http/index.d.ts +2 -1
- package/dist/wirings/http/index.js +1 -1
- 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 +6 -36
- package/dist/wirings/http/pikku-fetch-http-request.js +56 -50
- 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 +2 -0
- package/dist/wirings/mcp/mcp-runner.js +6 -16
- 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 +28 -0
- package/dist/wirings/persona/define-personas.js +27 -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 +125 -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 +102 -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 +18 -89
- 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 +16 -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 +1 -12
- package/dist/wirings/rpc/remote-addon-auth.js +1 -9
- 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 +27 -0
- package/dist/wirings/virtual-user/index.js +8 -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-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 +5 -5
- 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 -42
- 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 +0 -18
- 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 +72 -6
- 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 +0 -197
- 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/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-data-classification-brand-is-an-optional-property.md +34 -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 +113 -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/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/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/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 +4 -2
- package/run-tests.sh +0 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +283 -55
- package/src/data-classification.ts +1 -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 +75 -7
- package/src/function/function-runner.ts +73 -30
- package/src/function/functions.types.ts +56 -136
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/gopass-secrets-removed.test.ts +51 -0
- package/src/handle-error.test.ts +108 -1
- package/src/handle-error.ts +8 -18
- package/src/index.ts +60 -1
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +0 -3
- package/src/middleware/auth-bearer.ts +3 -40
- 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 +24 -9
- package/src/middleware/remote-auth.ts +10 -2
- 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 +172 -0
- package/src/remote.ts +17 -7
- package/src/schema.test.ts +103 -0
- package/src/schema.ts +35 -18
- package/src/scopes.ts +7 -48
- 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 +1 -2
- 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/deployment-service.ts +3 -9
- 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 +20 -15
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- 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.ts +0 -4
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +2 -37
- 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.ts +9 -41
- 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 +0 -4
- 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 +5 -33
- 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 +1 -7
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +19 -63
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +0 -26
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +116 -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 +75 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +36 -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 +82 -138
- 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 +67 -33
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
- package/src/wirings/ai-agent/index.ts +35 -3
- package/src/wirings/ai-agent/voice-input.test.ts +72 -7
- package/src/wirings/ai-agent/voice-input.ts +48 -3
- package/src/wirings/ai-agent/voice-output.test.ts +422 -0
- package/src/wirings/ai-agent/voice-output.ts +216 -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 +155 -0
- package/src/wirings/cli/channel/index.ts +9 -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 +12 -168
- package/src/wirings/http/http.types.ts +17 -62
- package/src/wirings/http/index.ts +5 -1
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +88 -7
- package/src/wirings/http/pikku-fetch-http-request.ts +74 -50
- 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.test.ts +40 -0
- package/src/wirings/mcp/mcp-runner.ts +9 -15
- 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 +29 -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 +131 -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 +453 -0
- package/src/wirings/queue/queue-identity.ts +173 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +19 -89
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +59 -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 +1 -13
- package/src/wirings/rpc/rpc-runner.test.ts +186 -2
- 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 +76 -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-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
- 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 -52
- 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.ts +0 -28
- package/src/wirings/workflow/scenario-service.test.ts +2 -9
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +159 -14
- package/src/wirings/workflow/scenario-step.types.ts +82 -6
- package/src/wirings/workflow/scenario-surface.test.ts +145 -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 +0 -203
- package/tsconfig.tsbuildinfo +1 -1
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/services/gopass-secrets.ts +0 -78
- 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
|
@@ -16,17 +16,12 @@ import type {
|
|
|
16
16
|
CoreUserSession,
|
|
17
17
|
CorePikkuMiddleware,
|
|
18
18
|
CorePikkuMiddlewareGroup,
|
|
19
|
-
WireServices,
|
|
20
19
|
PikkuRawWire,
|
|
21
20
|
PikkuWire,
|
|
22
21
|
PikkuWiringTypes,
|
|
23
22
|
} from '../../types/core.types.js'
|
|
24
23
|
import { NotFoundError } from '../../errors/errors.js'
|
|
25
|
-
import {
|
|
26
|
-
closeWireServices,
|
|
27
|
-
createWeakUID,
|
|
28
|
-
isSerializable,
|
|
29
|
-
} from '../../utils.js'
|
|
24
|
+
import { createWeakUID, isSerializable } from '../../utils.js'
|
|
30
25
|
import {
|
|
31
26
|
getSingletonServices,
|
|
32
27
|
getCreateWireServices,
|
|
@@ -39,15 +34,13 @@ import { pikkuState } from '../../pikku-state.js'
|
|
|
39
34
|
import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js'
|
|
40
35
|
import { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js'
|
|
41
36
|
import type { PikkuChannel } from '../channel/channel.types.js'
|
|
37
|
+
import { unsupportedChannelRemote } from '../channel/channel-rpc.js'
|
|
42
38
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
|
|
43
39
|
import { applyWebResponse } from './web-request.js'
|
|
44
40
|
import { httpRouter } from './routers/http-router.js'
|
|
45
41
|
import { validateSchema } from '../../schema.js'
|
|
46
42
|
import { runMiddleware } from '../../middleware-runner.js'
|
|
47
43
|
|
|
48
|
-
/**
|
|
49
|
-
* Extract headers from a PikkuHTTPRequest based on the schema keys
|
|
50
|
-
*/
|
|
51
44
|
function extractHeadersFromRequest(
|
|
52
45
|
request: PikkuHTTPRequest,
|
|
53
46
|
headerKeys: string[]
|
|
@@ -62,35 +55,6 @@ function extractHeadersFromRequest(
|
|
|
62
55
|
return headers
|
|
63
56
|
}
|
|
64
57
|
|
|
65
|
-
/**
|
|
66
|
-
* Registers HTTP middleware for a specific route pattern.
|
|
67
|
-
*
|
|
68
|
-
* This function registers middleware at runtime that will be applied to
|
|
69
|
-
* HTTP routes matching the specified pattern.
|
|
70
|
-
*
|
|
71
|
-
* For tree-shaking benefits, wrap in a factory function:
|
|
72
|
-
* `export const x = () => addHTTPMiddleware('pattern', [...])`
|
|
73
|
-
*
|
|
74
|
-
* @template PikkuMiddleware The middleware type.
|
|
75
|
-
* @param {string} pattern - Route pattern (e.g., '*' for all routes, '/api/*' for specific routes).
|
|
76
|
-
* @param {CorePikkuMiddlewareGroup} middleware - Array of middleware for this route pattern.
|
|
77
|
-
*
|
|
78
|
-
* @returns {CorePikkuMiddlewareGroup} The middleware array (for chaining/wrapping).
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* ```typescript
|
|
82
|
-
* // Recommended: tree-shakeable
|
|
83
|
-
* export const httpGlobal = () => addHTTPMiddleware('*', [
|
|
84
|
-
* corsMiddleware,
|
|
85
|
-
* loggingMiddleware
|
|
86
|
-
* ])
|
|
87
|
-
*
|
|
88
|
-
* // Also works: no tree-shaking
|
|
89
|
-
* export const apiMiddleware = addHTTPMiddleware('/api/*', [
|
|
90
|
-
* authMiddleware
|
|
91
|
-
* ])
|
|
92
|
-
* ```
|
|
93
|
-
*/
|
|
94
58
|
export const addHTTPMiddleware = <PikkuMiddleware extends CorePikkuMiddleware>(
|
|
95
59
|
pattern: string,
|
|
96
60
|
middleware: CorePikkuMiddlewareGroup,
|
|
@@ -124,21 +88,6 @@ export const addHTTPPermission = (
|
|
|
124
88
|
)
|
|
125
89
|
}
|
|
126
90
|
|
|
127
|
-
/**
|
|
128
|
-
* Adds a new route to the global HTTP route registry.
|
|
129
|
-
*
|
|
130
|
-
* The route configuration includes the HTTP method, route path, permissions,
|
|
131
|
-
* middleware, and the handler function that implements the route's logic.
|
|
132
|
-
*
|
|
133
|
-
* @template In Expected input type.
|
|
134
|
-
* @template Out Expected output type.
|
|
135
|
-
* @template Route Route pattern as a string.
|
|
136
|
-
* @template PikkuFunction Type for the route handler function.
|
|
137
|
-
* @template PikkuFunctionSessionless Type for a sessionless handler.
|
|
138
|
-
* @template PikkuPermissionGroup Type representing required permissions.
|
|
139
|
-
* @template PikkuMiddleware Middleware type to be used with the route.
|
|
140
|
-
* @param {CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction, PikkuFunctionSessionless, PikkuPermission, PikkuMiddleware>} httpWiring - The HTTP wiring configuration object.
|
|
141
|
-
*/
|
|
142
91
|
export const wireHTTP = <
|
|
143
92
|
In,
|
|
144
93
|
Out,
|
|
@@ -163,10 +112,6 @@ export const wireHTTP = <
|
|
|
163
112
|
const httpMeta = pikkuState(null, 'http', 'meta')
|
|
164
113
|
const routeMeta = httpMeta[httpWiring.method][httpWiring.route]
|
|
165
114
|
if (!routeMeta) {
|
|
166
|
-
// In deploy units with filtered metadata, wiring files may include
|
|
167
|
-
// routes for functions not in this unit. This happens when multiple
|
|
168
|
-
// wirings share a file — split them into separate files for better
|
|
169
|
-
// tree-shaking.
|
|
170
115
|
console.warn(
|
|
171
116
|
`[pikku] Skipping HTTP route '${httpWiring.method.toUpperCase()} ${httpWiring.route}' — metadata not found. Consider moving this wiring to its own file.`
|
|
172
117
|
)
|
|
@@ -184,17 +129,6 @@ export const wireHTTP = <
|
|
|
184
129
|
?.set(httpWiring.route, httpWiring as any)
|
|
185
130
|
}
|
|
186
131
|
|
|
187
|
-
/**
|
|
188
|
-
* Finds a matching route based on the HTTP method and URL path.
|
|
189
|
-
*
|
|
190
|
-
* Iterates over all registered routes, skipping those with a mismatched method.
|
|
191
|
-
* When a route pattern matches the incoming request path, this function aggregates
|
|
192
|
-
* any global middleware along with route-specific middleware and identifies any input schema.
|
|
193
|
-
*
|
|
194
|
-
* @param {string} requestType - The HTTP method (e.g., GET, POST).
|
|
195
|
-
* @param {string} requestPath - The URL path of the incoming request.
|
|
196
|
-
* @returns {Object | undefined} An object with matched route details or undefined if no match.
|
|
197
|
-
*/
|
|
198
132
|
const getMatchingRoute = (requestType: string, requestPath: string) => {
|
|
199
133
|
const matchedPath = httpRouter.match(
|
|
200
134
|
requestType.toLowerCase() as HTTPMethod,
|
|
@@ -218,16 +152,6 @@ const getMatchingRoute = (requestType: string, requestPath: string) => {
|
|
|
218
152
|
}
|
|
219
153
|
}
|
|
220
154
|
|
|
221
|
-
/**
|
|
222
|
-
* Combines the request and response objects into a single HTTP wire object.
|
|
223
|
-
*
|
|
224
|
-
* This utility function creates an object that holds both the HTTP request and response,
|
|
225
|
-
* which simplifies passing these around through middleware and route execution.
|
|
226
|
-
*
|
|
227
|
-
* @param {PikkuHTTPRequest | undefined} request - The HTTP request object.
|
|
228
|
-
* @param {PikkuHTTPResponse | undefined} response - The HTTP response object.
|
|
229
|
-
* @returns {PikkuHTTP | undefined} The combined HTTP wire object or undefined if none provided.
|
|
230
|
-
*/
|
|
231
155
|
export const createHTTPWire = (
|
|
232
156
|
request: PikkuHTTPRequest | undefined,
|
|
233
157
|
response: PikkuHTTPResponse | undefined
|
|
@@ -247,26 +171,6 @@ export const createHTTPWire = (
|
|
|
247
171
|
return http
|
|
248
172
|
}
|
|
249
173
|
|
|
250
|
-
/**
|
|
251
|
-
* Validates the input data and executes the route handler
|
|
252
|
-
*
|
|
253
|
-
* This function performs these steps:
|
|
254
|
-
* 1. Sets URL parameters on the request.
|
|
255
|
-
* 2. Validates the user session if required.
|
|
256
|
-
* 3. Creates session-specific services.
|
|
257
|
-
* 4. Validates the incoming data against a schema.
|
|
258
|
-
* 5. Optionally coerces query string values to arrays.
|
|
259
|
-
* 6. Checks route-specific permissions.
|
|
260
|
-
* 7. Executes the route handler.
|
|
261
|
-
* 8. Sends the appropriate response.
|
|
262
|
-
*
|
|
263
|
-
* @param {Object} services - A collection of shared services and utilities.
|
|
264
|
-
* @param {Object} matchedRoute - Contains route details, URL parameters, and optional schema.
|
|
265
|
-
* @param {PikkuHTTP | undefined} http - The HTTP wire object.
|
|
266
|
-
* @param {Object} options - Options for route execution (e.g., whether to coerce query strings to arrays).
|
|
267
|
-
* @returns {Promise<any>} An object containing the route handler result and wire services (if any).
|
|
268
|
-
* @throws Throws errors like MissingSessionError or ForbiddenError on validation failures.
|
|
269
|
-
*/
|
|
270
174
|
const executeRoute = async (
|
|
271
175
|
services: {
|
|
272
176
|
singletonServices: any
|
|
@@ -292,10 +196,8 @@ const executeRoute = async (
|
|
|
292
196
|
singletonServices.sessionStore
|
|
293
197
|
)
|
|
294
198
|
|
|
295
|
-
// Attach URL parameters to the request object
|
|
296
199
|
http?.request?.setParams(params)
|
|
297
200
|
|
|
298
|
-
// Validate request headers if schema is defined
|
|
299
201
|
if (meta.headersSchemaName && http.request && singletonServices.schema) {
|
|
300
202
|
const headerKeys = singletonServices.schema.getSchemaKeys(
|
|
301
203
|
meta.headersSchemaName
|
|
@@ -310,14 +212,12 @@ const executeRoute = async (
|
|
|
310
212
|
}
|
|
311
213
|
|
|
312
214
|
const requiresSession = route.auth !== false
|
|
313
|
-
let wireServices: any
|
|
314
215
|
let result: any
|
|
315
216
|
|
|
316
217
|
singletonServices.logger.info(
|
|
317
218
|
`Matched route: ${route.route} | method: ${route.method.toUpperCase()} | auth: ${requiresSession.toString()}`
|
|
318
219
|
)
|
|
319
220
|
|
|
320
|
-
// Ensure session is available when required
|
|
321
221
|
if (skipUserSession && requiresSession) {
|
|
322
222
|
throw new Error("Can't skip trying to get user session if auth is required")
|
|
323
223
|
}
|
|
@@ -365,11 +265,11 @@ const executeRoute = async (
|
|
|
365
265
|
clearState: () => {
|
|
366
266
|
sseState = undefined
|
|
367
267
|
},
|
|
268
|
+
// SSE only flows server to client — the client has no way to answer on
|
|
269
|
+
// this channel, so a remote call could never be replied to.
|
|
270
|
+
remote: unsupportedChannelRemote,
|
|
368
271
|
}
|
|
369
272
|
|
|
370
|
-
// Register the SSE channel with the eventHub (if present) so that
|
|
371
|
-
// eventHub.publish() can deliver messages to SSE subscribers.
|
|
372
|
-
// The channel handler wraps the SSE channel to match PikkuChannelHandler.
|
|
373
273
|
if (singletonServices.eventHub?.onChannelOpened) {
|
|
374
274
|
const channelRef = channel
|
|
375
275
|
const channelHandler = {
|
|
@@ -432,12 +332,11 @@ const executeRoute = async (
|
|
|
432
332
|
http?.response?.arrayBuffer(JSON.stringify({ type: 'done' }))
|
|
433
333
|
} catch {}
|
|
434
334
|
channel?.close()
|
|
435
|
-
return
|
|
335
|
+
return { result }
|
|
436
336
|
}
|
|
437
337
|
throw e
|
|
438
338
|
}
|
|
439
339
|
if (matchedRoute.route.sse) {
|
|
440
|
-
// Flush headers after middleware has run so CORS/auth headers are included
|
|
441
340
|
http?.response?.flushHeaders?.()
|
|
442
341
|
} else {
|
|
443
342
|
if (result instanceof Response) {
|
|
@@ -452,24 +351,9 @@ const executeRoute = async (
|
|
|
452
351
|
}
|
|
453
352
|
}
|
|
454
353
|
|
|
455
|
-
return
|
|
354
|
+
return { result }
|
|
456
355
|
}
|
|
457
356
|
|
|
458
|
-
/**
|
|
459
|
-
* Executes an HTTP route for a given Fetch API request.
|
|
460
|
-
*
|
|
461
|
-
* This function wraps the entire lifecycle of handling an HTTP request:
|
|
462
|
-
* - Matching the request to a registered route.
|
|
463
|
-
* - Validating input and session state.
|
|
464
|
-
* - Running middleware and the route handler.
|
|
465
|
-
* - Handling errors and forming the response.
|
|
466
|
-
*
|
|
467
|
-
* @template In Expected input data type.
|
|
468
|
-
* @template Out Expected output data type.
|
|
469
|
-
* @param {Request} request - The native Fetch API Request object.
|
|
470
|
-
* @param {RunHTTPWiringOptions} params - Additional options including services and session management.
|
|
471
|
-
* @returns {Promise<Response>} A promise that resolves to a Fetch API Response object.
|
|
472
|
-
*/
|
|
473
357
|
export const fetch = async <In, Out>(
|
|
474
358
|
request: Request,
|
|
475
359
|
params: RunHTTPWiringOptions = {}
|
|
@@ -479,18 +363,6 @@ export const fetch = async <In, Out>(
|
|
|
479
363
|
return pikkuResponse.toResponse()
|
|
480
364
|
}
|
|
481
365
|
|
|
482
|
-
/**
|
|
483
|
-
* Executes an HTTP route using a Pikku-specific request wrapper.
|
|
484
|
-
*
|
|
485
|
-
* This variant accepts either a native Request or a PikkuHTTPRequest object and returns
|
|
486
|
-
* a PikkuFetchHTTPResponse for further manipulation if needed.
|
|
487
|
-
*
|
|
488
|
-
* @template In Expected input data type.
|
|
489
|
-
* @template Out Expected output data type.
|
|
490
|
-
* @param {Request | PikkuHTTPRequest} request - The request object.
|
|
491
|
-
* @param {RunHTTPWiringOptions} params - Execution options including services and session configuration.
|
|
492
|
-
* @returns {Promise<PikkuFetchHTTPResponse>} A promise that resolves to a PikkuFetchHTTPResponse object.
|
|
493
|
-
*/
|
|
494
366
|
export const pikkuFetch = async <In, Out>(
|
|
495
367
|
request: Request | PikkuHTTPRequest,
|
|
496
368
|
params: RunHTTPWiringOptions = {}
|
|
@@ -500,24 +372,6 @@ export const pikkuFetch = async <In, Out>(
|
|
|
500
372
|
return pikkuResponse
|
|
501
373
|
}
|
|
502
374
|
|
|
503
|
-
/**
|
|
504
|
-
* Core function to process an HTTP request through route matching, validation,
|
|
505
|
-
* middleware execution, error handling, and session service cleanup.
|
|
506
|
-
*
|
|
507
|
-
* This function does the following:
|
|
508
|
-
* - Wraps the incoming request and response into an HTTP wire object.
|
|
509
|
-
* - Determines the correct route based on HTTP method and path.
|
|
510
|
-
* - Executes middleware and the route handler.
|
|
511
|
-
* - Catches and handles errors, optionally bubbling them if configured.
|
|
512
|
-
* - Cleans up any wire services created during processing.
|
|
513
|
-
*
|
|
514
|
-
* @template In Expected input data type.
|
|
515
|
-
* @template Out Expected output data type.
|
|
516
|
-
* @param {Request | PikkuHTTPRequest} request - The incoming HTTP request.
|
|
517
|
-
* @param {PikkuHTTPResponse} response - The response object to be populated.
|
|
518
|
-
* @param {RunHTTPWiringOptions} options - Options such as singleton services, session handling, and error configuration.
|
|
519
|
-
* @returns {Promise<Out | void>} The output from the route handler or void if an error occurred.
|
|
520
|
-
*/
|
|
521
375
|
export const fetchData = async <In, Out>(
|
|
522
376
|
request: Request | PikkuHTTPRequest,
|
|
523
377
|
response: PikkuHTTPResponse,
|
|
@@ -527,22 +381,21 @@ export const fetchData = async <In, Out>(
|
|
|
527
381
|
logWarningsForStatusCodes = [],
|
|
528
382
|
coerceDataFromSchema = true,
|
|
529
383
|
bubbleErrors = false,
|
|
530
|
-
// Surface the error message + stack on unexpected 500s unless in production.
|
|
531
384
|
exposeErrors = !isProduction(),
|
|
532
385
|
generateRequestId,
|
|
533
386
|
traceId: externalTraceId,
|
|
387
|
+
maxBodySize,
|
|
534
388
|
}: RunHTTPWiringOptions = {}
|
|
535
389
|
): Promise<Out | void> => {
|
|
536
390
|
const singletonServices = getSingletonServices()
|
|
537
391
|
const createWireServices = getCreateWireServices()
|
|
538
|
-
let wireServices: WireServices<typeof singletonServices> | undefined
|
|
539
392
|
let result: Out
|
|
540
393
|
|
|
541
|
-
// Combine the request and response into one wire object
|
|
542
394
|
const pikkuRequest =
|
|
543
|
-
request instanceof Request
|
|
395
|
+
request instanceof Request
|
|
396
|
+
? new PikkuFetchHTTPRequest(request, { maxBodySize })
|
|
397
|
+
: request
|
|
544
398
|
|
|
545
|
-
// Resolve traceId: external (e.g. CF-Ray) > x-request-id header > generated
|
|
546
399
|
let requestId: string | null = externalTraceId ?? null
|
|
547
400
|
if (!requestId) {
|
|
548
401
|
try {
|
|
@@ -551,15 +404,12 @@ export const fetchData = async <In, Out>(
|
|
|
551
404
|
}
|
|
552
405
|
requestId = requestId || generateRequestId?.() || createWeakUID()
|
|
553
406
|
|
|
554
|
-
// Scoped logger for HTTP runner internal logging (error handling, route matching)
|
|
555
|
-
// Functions/middleware receive singletonServices.logger directly for compatibility
|
|
556
407
|
const scopedLogger =
|
|
557
408
|
singletonServices.logger.scope?.(requestId) ?? singletonServices.logger
|
|
558
409
|
const http = createHTTPWire(pikkuRequest, response)
|
|
559
410
|
const apiType = http!.request!.method()
|
|
560
411
|
const apiRoute = http!.request!.path()
|
|
561
412
|
|
|
562
|
-
// Locate the matching route based on the HTTP method and path
|
|
563
413
|
const matchedRoute = getMatchingRoute(apiType, apiRoute)
|
|
564
414
|
try {
|
|
565
415
|
if (!matchedRoute) {
|
|
@@ -585,8 +435,7 @@ export const fetchData = async <In, Out>(
|
|
|
585
435
|
throw new NotFoundError()
|
|
586
436
|
}
|
|
587
437
|
|
|
588
|
-
|
|
589
|
-
;({ result, wireServices } = await executeRoute(
|
|
438
|
+
;({ result } = await executeRoute(
|
|
590
439
|
{
|
|
591
440
|
singletonServices,
|
|
592
441
|
createWireServices,
|
|
@@ -610,10 +459,5 @@ export const fetchData = async <In, Out>(
|
|
|
610
459
|
bubbleErrors,
|
|
611
460
|
exposeErrors
|
|
612
461
|
)
|
|
613
|
-
} finally {
|
|
614
|
-
// Clean up any session-specific services created during processing
|
|
615
|
-
if (wireServices) {
|
|
616
|
-
await closeWireServices(singletonServices.logger, wireServices)
|
|
617
|
-
}
|
|
618
462
|
}
|
|
619
463
|
}
|
|
@@ -38,11 +38,10 @@ export type RunHTTPWiringOptions = Partial<{
|
|
|
38
38
|
generateRequestId: () => string
|
|
39
39
|
/** Pre-resolved trace ID (e.g. CF-Ray). Falls back to x-request-id header or generated ID. */
|
|
40
40
|
traceId: string
|
|
41
|
+
/** Maximum request body size in bytes, applied when pikku wraps a fetch `Request`. */
|
|
42
|
+
maxBodySize: number
|
|
41
43
|
}>
|
|
42
44
|
|
|
43
|
-
/**
|
|
44
|
-
* Represents the HTTP methods supported for API HTTP wirings.
|
|
45
|
-
*/
|
|
46
45
|
export type HTTPMethod =
|
|
47
46
|
| 'post'
|
|
48
47
|
| 'get'
|
|
@@ -52,17 +51,10 @@ export type HTTPMethod =
|
|
|
52
51
|
| 'put'
|
|
53
52
|
| 'options'
|
|
54
53
|
|
|
55
|
-
/**
|
|
56
|
-
* Header schema type for request header validation.
|
|
57
|
-
* Uses Standard Schema interface - works with Zod, Valibot, ArkType, Effect Schema, etc.
|
|
58
|
-
*/
|
|
59
54
|
export type HTTPHeadersSchema = StandardSchemaV1<
|
|
60
55
|
Record<string, string | string[] | undefined>
|
|
61
56
|
>
|
|
62
57
|
|
|
63
|
-
/**
|
|
64
|
-
* Common HTTP route configuration shared between wireHTTP and wireHTTPRoutes
|
|
65
|
-
*/
|
|
66
58
|
export type HTTPRouteBaseConfig = {
|
|
67
59
|
contentType?: 'xml' | 'json'
|
|
68
60
|
timeout?: number
|
|
@@ -70,47 +62,26 @@ export type HTTPRouteBaseConfig = {
|
|
|
70
62
|
headers?: HTTPHeadersSchema
|
|
71
63
|
}
|
|
72
64
|
|
|
73
|
-
/**
|
|
74
|
-
* Represents an API HTTP wiring without a function, including metadata such as content type, route, and timeout settings.
|
|
75
|
-
*/
|
|
76
65
|
export type CoreHTTPFunction = HTTPRouteBaseConfig & {
|
|
77
66
|
route: string
|
|
78
67
|
eventChannel?: false
|
|
79
68
|
returnsJSON?: false
|
|
80
69
|
}
|
|
81
|
-
|
|
82
|
-
* Represents a http wire within Pikku, including a request and response.
|
|
83
|
-
*/
|
|
70
|
+
|
|
84
71
|
export interface PikkuHTTP<In = unknown> {
|
|
85
72
|
request?: PikkuHTTPRequest<In>
|
|
86
73
|
response?: PikkuHTTPResponse
|
|
87
74
|
}
|
|
88
75
|
|
|
89
|
-
/**
|
|
90
|
-
* Represents request headers as either a record or a function to get headers by name.
|
|
91
|
-
*/
|
|
92
76
|
export type RequestHeaders =
|
|
93
77
|
| Record<string, string | string[] | undefined>
|
|
94
78
|
| ((headerName: string) => string | string[] | undefined)
|
|
95
79
|
|
|
96
|
-
/**
|
|
97
|
-
* Represents a query object for Pikku, where each key can be a string, a value, or an array of values.
|
|
98
|
-
*/
|
|
99
80
|
export type PikkuQuery<T = Record<string, string | undefined>> = Record<
|
|
100
81
|
string,
|
|
101
82
|
string | T | null | Array<T | null>
|
|
102
83
|
>
|
|
103
84
|
|
|
104
|
-
/**
|
|
105
|
-
* Represents a core API HTTP wiring, which can have different configurations depending on whether it requires authentication and permissions.
|
|
106
|
-
*
|
|
107
|
-
* @template In - The input type.
|
|
108
|
-
* @template Out - The output type.
|
|
109
|
-
* @template R - The route string type.
|
|
110
|
-
* @template PikkuFunction - The API function type, defaults to `CorePikkuFunction`.
|
|
111
|
-
* @template PikkuFunctionSessionless - The sessionless API function type, defaults to `CorePikkuFunctionSessionless`.
|
|
112
|
-
* @template PikkuPermission - The permission function type, defaults to `CorePikkuPermission`.
|
|
113
|
-
*/
|
|
114
85
|
export type CoreHTTPFunctionWiring<
|
|
115
86
|
In,
|
|
116
87
|
Out,
|
|
@@ -206,21 +177,26 @@ export type CoreHTTPFunctionWiring<
|
|
|
206
177
|
sse?: undefined
|
|
207
178
|
})
|
|
208
179
|
|
|
209
|
-
/**
|
|
210
|
-
* Represents the input types for HTTP wiring metadata, including parameters, query, and body types.
|
|
211
|
-
*/
|
|
212
180
|
export type HTTPFunctionMetaInputTypes = {
|
|
213
181
|
params?: string
|
|
214
182
|
query?: string
|
|
215
183
|
body?: string
|
|
216
184
|
}
|
|
217
185
|
|
|
218
|
-
/**
|
|
219
|
-
* Represents metadata for a set of HTTP wirings, including HTTP wiring details, methods, input/output types, and documentation.
|
|
220
|
-
*/
|
|
221
186
|
export type HTTPWiringMeta = CommonWireMeta & {
|
|
222
187
|
route: string
|
|
223
188
|
method: HTTPMethod
|
|
189
|
+
/** The route's own `auth`, or the group's if the route did not set one. */
|
|
190
|
+
auth?: boolean
|
|
191
|
+
/**
|
|
192
|
+
* Whether reaching this route requires a session, resolved at codegen time
|
|
193
|
+
* across every layer that can demand one: the function's `sessionless`, its
|
|
194
|
+
* own `auth`, this route's `auth`, and the auth flag of the addon the
|
|
195
|
+
* function belongs to. Answering "which routes are open?" used to mean
|
|
196
|
+
* joining four separate places and knowing which of them wins; getting that
|
|
197
|
+
* join wrong reads an open route as a closed one.
|
|
198
|
+
*/
|
|
199
|
+
requiresSession?: boolean
|
|
224
200
|
refTarget?: string
|
|
225
201
|
params?: string[]
|
|
226
202
|
query?: string[]
|
|
@@ -272,16 +248,15 @@ export interface PikkuHTTPResponse<Out = unknown> {
|
|
|
272
248
|
| ReadableStream
|
|
273
249
|
): this
|
|
274
250
|
json(data: Out): this
|
|
275
|
-
|
|
251
|
+
/** `ArrayBufferView` covers `Buffer` and `Uint8Array`, which is how a body
|
|
252
|
+
* that is not text reaches here without being decoded on the way. */
|
|
253
|
+
send?(data: string | ArrayBuffer | ArrayBufferView): this
|
|
276
254
|
redirect(location: string, status?: number): this
|
|
277
255
|
close?: () => void
|
|
278
256
|
setMode?: (mode: 'stream') => void
|
|
279
257
|
flushHeaders?: () => void
|
|
280
258
|
}
|
|
281
259
|
|
|
282
|
-
/**
|
|
283
|
-
* Single route configuration - supports all wireHTTP options
|
|
284
|
-
*/
|
|
285
260
|
export type HTTPRouteConfig<
|
|
286
261
|
PikkuFunction extends
|
|
287
262
|
| CorePikkuFunction<any, any, any, any, any>
|
|
@@ -295,24 +270,14 @@ export type HTTPRouteConfig<
|
|
|
295
270
|
any
|
|
296
271
|
>,
|
|
297
272
|
> = HTTPRouteBaseConfig & {
|
|
298
|
-
// Required
|
|
299
273
|
method: HTTPMethod
|
|
300
274
|
route: string
|
|
301
275
|
func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>
|
|
302
|
-
|
|
303
|
-
// Auth
|
|
304
276
|
auth?: boolean
|
|
305
|
-
|
|
306
|
-
// Middleware
|
|
307
277
|
middleware?: PikkuMiddleware[]
|
|
308
|
-
|
|
309
|
-
// SSE support
|
|
310
278
|
sse?: boolean
|
|
311
279
|
}
|
|
312
280
|
|
|
313
|
-
/**
|
|
314
|
-
* Group-level configuration applied to all routes
|
|
315
|
-
*/
|
|
316
281
|
export type HTTPRoutesGroupConfig<
|
|
317
282
|
PikkuPermission extends CorePikkuPermission<any, any, any> =
|
|
318
283
|
CorePikkuPermission<any, any, any>,
|
|
@@ -327,25 +292,15 @@ export type HTTPRoutesGroupConfig<
|
|
|
327
292
|
middleware?: PikkuMiddleware[]
|
|
328
293
|
}
|
|
329
294
|
|
|
330
|
-
/**
|
|
331
|
-
* Nested route map - allows hierarchical organization
|
|
332
|
-
* Can contain individual routes, nested maps, or contracts with config
|
|
333
|
-
*/
|
|
334
295
|
export type HTTPRouteMap = {
|
|
335
296
|
[key: string]: HTTPRouteConfig | HTTPRouteMap | HTTPRouteContract
|
|
336
297
|
}
|
|
337
298
|
|
|
338
|
-
/**
|
|
339
|
-
* A route contract with optional group config (returned by defineRoutes)
|
|
340
|
-
*/
|
|
341
299
|
export type HTTPRouteContract<T extends HTTPRouteMap = HTTPRouteMap> =
|
|
342
300
|
HTTPRoutesGroupConfig & {
|
|
343
301
|
routes: T
|
|
344
302
|
}
|
|
345
303
|
|
|
346
|
-
/**
|
|
347
|
-
* Full configuration for wireHTTPRoutes
|
|
348
|
-
*/
|
|
349
304
|
export type WireHTTPRoutesConfig = HTTPRoutesGroupConfig & {
|
|
350
305
|
routes: HTTPRouteMap | HTTPRouteConfig[]
|
|
351
306
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {
|
|
2
|
+
PikkuFetchHTTPRequest,
|
|
3
|
+
DEFAULT_MAX_BODY_SIZE,
|
|
4
|
+
} from './pikku-fetch-http-request.js'
|
|
5
|
+
export type { PikkuFetchHTTPRequestOptions } from './pikku-fetch-http-request.js'
|
|
2
6
|
export { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js'
|
|
3
7
|
export { logRoutes } from './log-http-routes.js'
|
|
4
8
|
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { pikkuState } from '../../pikku-state.js'
|
|
2
2
|
import type { Logger } from '../../services/index.js'
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Logs all the loaded routes.
|
|
6
|
-
* @param logger - A logger for logging information.
|
|
7
|
-
*/
|
|
8
4
|
export const logRoutes = (logger: Logger) => {
|
|
9
5
|
const routesByType = pikkuState(null, 'http', 'routes')
|
|
10
6
|
if (routesByType.size === 0) {
|
|
@@ -147,8 +147,6 @@ test('data() parses application/x-www-form-urlencoded correctly', async () => {
|
|
|
147
147
|
})
|
|
148
148
|
})
|
|
149
149
|
|
|
150
|
-
// --- Compatible types
|
|
151
|
-
|
|
152
150
|
test('data() treats "123" and 123 as equivalent', async () => {
|
|
153
151
|
const req = createRequest(
|
|
154
152
|
'POST',
|
|
@@ -160,7 +158,7 @@ test('data() treats "123" and 123 as equivalent', async () => {
|
|
|
160
158
|
)
|
|
161
159
|
|
|
162
160
|
const r = new PikkuFetchHTTPRequest(req)
|
|
163
|
-
r.setParams({ id: '123' })
|
|
161
|
+
r.setParams({ id: '123' })
|
|
164
162
|
const result = await r.data()
|
|
165
163
|
assert.deepEqual(result, { id: '123' })
|
|
166
164
|
})
|
|
@@ -176,13 +174,11 @@ test('data() treats "true" and true as equivalent', async () => {
|
|
|
176
174
|
)
|
|
177
175
|
|
|
178
176
|
const r = new PikkuFetchHTTPRequest(req)
|
|
179
|
-
r.setParams({ flag: 'true' })
|
|
177
|
+
r.setParams({ flag: 'true' })
|
|
180
178
|
const result = await r.data()
|
|
181
179
|
assert.deepEqual(result, { flag: 'true' })
|
|
182
180
|
})
|
|
183
181
|
|
|
184
|
-
// --- Conflicts
|
|
185
|
-
|
|
186
182
|
test('data() throws on conflicting values', async () => {
|
|
187
183
|
const req = createRequest(
|
|
188
184
|
'POST',
|
|
@@ -219,7 +215,92 @@ test('data() throws on boolean conflict', async () => {
|
|
|
219
215
|
})
|
|
220
216
|
})
|
|
221
217
|
|
|
222
|
-
|
|
218
|
+
const streamedRequest = (chunks) =>
|
|
219
|
+
new Request('http://localhost', {
|
|
220
|
+
method: 'POST',
|
|
221
|
+
headers: { 'Content-Type': 'application/json' },
|
|
222
|
+
body: new ReadableStream({
|
|
223
|
+
start(controller) {
|
|
224
|
+
for (const chunk of chunks) {
|
|
225
|
+
controller.enqueue(new TextEncoder().encode(chunk))
|
|
226
|
+
}
|
|
227
|
+
controller.close()
|
|
228
|
+
},
|
|
229
|
+
}),
|
|
230
|
+
duplex: 'half',
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
test('arrayBuffer() rejects a body larger than the configured limit', async () => {
|
|
234
|
+
const req = new Request('http://localhost', {
|
|
235
|
+
method: 'POST',
|
|
236
|
+
headers: { 'Content-Type': 'application/octet-stream' },
|
|
237
|
+
body: 'x'.repeat(64),
|
|
238
|
+
})
|
|
239
|
+
const pikkuReq = new PikkuFetchHTTPRequest(req, { maxBodySize: 16 })
|
|
240
|
+
await assert.rejects(async () => await pikkuReq.arrayBuffer(), {
|
|
241
|
+
name: 'PayloadTooLargeError',
|
|
242
|
+
})
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
test('arrayBuffer() rejects an oversized body with no content-length header', async () => {
|
|
246
|
+
const req = streamedRequest(['x'.repeat(32), 'y'.repeat(32)])
|
|
247
|
+
assert.equal(req.headers.get('content-length'), null)
|
|
248
|
+
const pikkuReq = new PikkuFetchHTTPRequest(req, { maxBodySize: 16 })
|
|
249
|
+
await assert.rejects(async () => await pikkuReq.arrayBuffer(), {
|
|
250
|
+
name: 'PayloadTooLargeError',
|
|
251
|
+
})
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
test('arrayBuffer() rejects a body whose content-length under-reports its size', async () => {
|
|
255
|
+
const req = new Request('http://localhost', {
|
|
256
|
+
method: 'POST',
|
|
257
|
+
headers: {
|
|
258
|
+
'Content-Type': 'application/json',
|
|
259
|
+
'Content-Length': '4',
|
|
260
|
+
},
|
|
261
|
+
body: new ReadableStream({
|
|
262
|
+
start(controller) {
|
|
263
|
+
controller.enqueue(new TextEncoder().encode('z'.repeat(128)))
|
|
264
|
+
controller.close()
|
|
265
|
+
},
|
|
266
|
+
}),
|
|
267
|
+
duplex: 'half',
|
|
268
|
+
})
|
|
269
|
+
const pikkuReq = new PikkuFetchHTTPRequest(req, { maxBodySize: 16 })
|
|
270
|
+
await assert.rejects(async () => await pikkuReq.arrayBuffer(), {
|
|
271
|
+
name: 'PayloadTooLargeError',
|
|
272
|
+
})
|
|
273
|
+
})
|
|
274
|
+
|
|
275
|
+
test('data() surfaces PayloadTooLargeError rather than wrapping it', async () => {
|
|
276
|
+
const req = createRequest(
|
|
277
|
+
'POST',
|
|
278
|
+
'http://localhost',
|
|
279
|
+
{ padding: 'x'.repeat(256) },
|
|
280
|
+
{ 'Content-Type': 'application/json' }
|
|
281
|
+
)
|
|
282
|
+
const pikkuReq = new PikkuFetchHTTPRequest(req, { maxBodySize: 16 })
|
|
283
|
+
await assert.rejects(async () => await pikkuReq.data(), {
|
|
284
|
+
name: 'PayloadTooLargeError',
|
|
285
|
+
})
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
test('data() accepts a body within the configured limit', async () => {
|
|
289
|
+
const req = createRequest(
|
|
290
|
+
'POST',
|
|
291
|
+
'http://localhost',
|
|
292
|
+
{ ok: true },
|
|
293
|
+
{ 'Content-Type': 'application/json' }
|
|
294
|
+
)
|
|
295
|
+
const pikkuReq = new PikkuFetchHTTPRequest(req, { maxBodySize: 1024 })
|
|
296
|
+
assert.deepEqual(await pikkuReq.data(), { ok: true })
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
test('data() accepts a streamed body within the default limit', async () => {
|
|
300
|
+
const req = streamedRequest(['{"ok"', ':true}'])
|
|
301
|
+
const pikkuReq = new PikkuFetchHTTPRequest(req)
|
|
302
|
+
assert.deepEqual(await pikkuReq.data(), { ok: true })
|
|
303
|
+
})
|
|
223
304
|
|
|
224
305
|
test('data() works when only body has values', async () => {
|
|
225
306
|
const req = createRequest(
|