@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
|
@@ -3,27 +3,9 @@ import { NotFoundError, UnauthorizedError } from '../../errors/errors.js';
|
|
|
3
3
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
|
|
4
4
|
import { runMiddleware } from '../../middleware-runner.js';
|
|
5
5
|
import { httpRouter } from '../http/routers/http-router.js';
|
|
6
|
-
/**
|
|
7
|
-
* Lazily resolve a gateway's adapter. Factories are invoked once with the
|
|
8
|
-
* singleton services and cached (promise-cached, so concurrent first
|
|
9
|
-
* requests share one construction).
|
|
10
|
-
*/
|
|
11
6
|
const resolvedAdapters = new WeakMap();
|
|
12
|
-
/**
|
|
13
|
-
* The generated function id a gateway's handler is registered under.
|
|
14
|
-
*/
|
|
15
7
|
const gatewayHandlerFuncId = (name) => `gateway__${name}__handler`;
|
|
16
|
-
|
|
17
|
-
* Bridges a session established by gateway middleware onto the wire so the
|
|
18
|
-
* handler's gate can see it.
|
|
19
|
-
*
|
|
20
|
-
* Gateway middleware is the only place a webhook can acquire a session (e.g.
|
|
21
|
-
* mapping a verified platform sender to a user). Middleware that assigns
|
|
22
|
-
* `wire.session` needs nothing, but middleware using the idiomatic
|
|
23
|
-
* `wire.setSession()` writes to the enclosing wiring's session service, which
|
|
24
|
-
* the handler's own invocation does not read — without this the session would
|
|
25
|
-
* be silently invisible to `auth` and `scopes`.
|
|
26
|
-
*/
|
|
8
|
+
// knowledge: decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md
|
|
27
9
|
const bridgeMiddlewareSession = async (wire) => {
|
|
28
10
|
if (wire.session || !wire.getSession)
|
|
29
11
|
return;
|
|
@@ -32,17 +14,7 @@ const bridgeMiddlewareSession = async (wire) => {
|
|
|
32
14
|
wire.session = session;
|
|
33
15
|
}
|
|
34
16
|
};
|
|
35
|
-
|
|
36
|
-
* Registers a gateway's handler as a real pikku function so that invoking it
|
|
37
|
-
* goes through the function runner's gate. Without this the handler is called
|
|
38
|
-
* directly and its own `auth`, `scopes` and `permissions` are never evaluated.
|
|
39
|
-
*
|
|
40
|
-
* The handler is registered as sessionless: a gateway's inbound traffic is
|
|
41
|
-
* platform-authenticated (adapter signature verification), not session-bearing,
|
|
42
|
-
* so requiring a session by default would break every webhook. A handler that
|
|
43
|
-
* does need one declares `auth: true`, exactly like `pikkuSessionlessFunc`.
|
|
44
|
-
* `scopes` and `permissions` are always enforced when declared.
|
|
45
|
-
*/
|
|
17
|
+
// knowledge: decisions/security/gateway-handlers-run-through-the-function-runner-gate.md
|
|
46
18
|
const registerGatewayHandler = (config) => {
|
|
47
19
|
const funcId = gatewayHandlerFuncId(config.name);
|
|
48
20
|
const funcMeta = pikkuState(null, 'function', 'meta');
|
|
@@ -66,17 +38,7 @@ export const resolveGatewayAdapter = (config, services) => {
|
|
|
66
38
|
}
|
|
67
39
|
return resolved;
|
|
68
40
|
};
|
|
69
|
-
/**
|
|
70
|
-
* Register a messaging gateway.
|
|
71
|
-
*
|
|
72
|
-
* `wireGateway` is a meta-wiring that composes existing primitives
|
|
73
|
-
* (`wireHTTP`, `wireChannel`) under the hood. It does not replace them;
|
|
74
|
-
* it layers on top.
|
|
75
|
-
*
|
|
76
|
-
* @param config - Gateway configuration (name, type, adapter, func, middleware, etc.)
|
|
77
|
-
*/
|
|
78
41
|
export const wireGateway = (config) => {
|
|
79
|
-
// Store gateway config
|
|
80
42
|
pikkuState(null, 'gateway', 'gateways').set(config.name, config);
|
|
81
43
|
switch (config.type) {
|
|
82
44
|
case 'webhook':
|
|
@@ -92,9 +54,6 @@ export const wireGateway = (config) => {
|
|
|
92
54
|
throw new Error(`Unknown gateway type '${config.type}' for gateway '${config.name}'`);
|
|
93
55
|
}
|
|
94
56
|
};
|
|
95
|
-
// ---------------------------------------------------------------------------
|
|
96
|
-
// Webhook gateway — platform POSTs to us
|
|
97
|
-
// ---------------------------------------------------------------------------
|
|
98
57
|
const wireWebhookGateway = (config) => {
|
|
99
58
|
const { name, route, adapter } = config;
|
|
100
59
|
if (!route) {
|
|
@@ -102,10 +61,6 @@ const wireWebhookGateway = (config) => {
|
|
|
102
61
|
}
|
|
103
62
|
const postFuncId = `gateway__${name}__post`;
|
|
104
63
|
const routes = pikkuState(null, 'http', 'routes');
|
|
105
|
-
// --- POST handler (main message receiver) --------------------------------
|
|
106
|
-
// Meta for these wrapper funcs/routes is compiled — the inspector projects
|
|
107
|
-
// wireGateway into the generated HTTP + function meta; only the handler
|
|
108
|
-
// implementations register here, same as every other wire.
|
|
109
64
|
const postHandler = {
|
|
110
65
|
auth: false,
|
|
111
66
|
func: createWebhookPostHandler(config),
|
|
@@ -120,9 +75,7 @@ const wireWebhookGateway = (config) => {
|
|
|
120
75
|
func: postHandler,
|
|
121
76
|
auth: false,
|
|
122
77
|
});
|
|
123
|
-
//
|
|
124
|
-
// Factory adapters can't be probed for verifyWebhook until first resolve,
|
|
125
|
-
// so register the GET route unconditionally for them.
|
|
78
|
+
// knowledge: decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md
|
|
126
79
|
if (typeof adapter === 'function' || adapter.verifyWebhook) {
|
|
127
80
|
const verifyFuncId = `gateway__${name}__verify`;
|
|
128
81
|
const verifyHandler = {
|
|
@@ -138,44 +91,27 @@ const wireWebhookGateway = (config) => {
|
|
|
138
91
|
route,
|
|
139
92
|
func: verifyHandler,
|
|
140
93
|
auth: false,
|
|
141
|
-
//
|
|
94
|
+
// knowledge: decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md
|
|
142
95
|
returnsJSON: false,
|
|
143
96
|
});
|
|
144
97
|
}
|
|
145
|
-
// Force router to re-initialize on next match
|
|
146
98
|
httpRouter.reset();
|
|
147
99
|
};
|
|
148
|
-
/**
|
|
149
|
-
* Creates the POST handler function for a webhook gateway.
|
|
150
|
-
*
|
|
151
|
-
* Flow:
|
|
152
|
-
* 1. Check for POST-based verification (e.g. Slack `url_verification`)
|
|
153
|
-
* 2. Parse body via adapter → GatewayInboundMessage (or null to ignore)
|
|
154
|
-
* 3. Populate `wire.gateway`
|
|
155
|
-
* 4. Run user middleware (which can read `wire.gateway` for auth)
|
|
156
|
-
* 5. Invoke the handler through the function runner, which enforces its
|
|
157
|
-
* `auth`/`scopes`/`permissions` before running it
|
|
158
|
-
* 6. Auto-send response via adapter if func returns outbound content
|
|
159
|
-
*/
|
|
160
100
|
const createWebhookPostHandler = (config) => {
|
|
161
101
|
const { name, middleware: userMiddleware } = config;
|
|
162
102
|
const handlerFuncId = registerGatewayHandler(config);
|
|
163
103
|
return async (services, data, wire) => {
|
|
164
104
|
const adapter = await resolveGatewayAdapter(config, services);
|
|
165
|
-
// Check for POST-based webhook verification (e.g. Slack url_verification)
|
|
166
105
|
if (adapter.verifyWebhook) {
|
|
167
106
|
const verifyResult = await adapter.verifyWebhook(data, wire.http?.request);
|
|
168
107
|
if (verifyResult.verified) {
|
|
169
108
|
return verifyResult.response;
|
|
170
109
|
}
|
|
171
110
|
}
|
|
172
|
-
// Parse the platform-specific payload
|
|
173
111
|
const parsed = adapter.parse(data);
|
|
174
112
|
if (!parsed) {
|
|
175
|
-
// Ignored event (delivery receipt, typing indicator, etc.)
|
|
176
113
|
return { ok: true };
|
|
177
114
|
}
|
|
178
|
-
// Populate wire.gateway
|
|
179
115
|
const gateway = {
|
|
180
116
|
gatewayName: name,
|
|
181
117
|
senderId: parsed.senderId,
|
|
@@ -183,10 +119,7 @@ const createWebhookPostHandler = (config) => {
|
|
|
183
119
|
send: (msg) => adapter.send(parsed.senderId, msg),
|
|
184
120
|
};
|
|
185
121
|
wire.gateway = gateway;
|
|
186
|
-
// Gateway middleware runs
|
|
187
|
-
// the session the gate then checks. The handler is invoked through the
|
|
188
|
-
// function runner, which enforces its auth, scopes and permissions and
|
|
189
|
-
// applies the handler's own middleware.
|
|
122
|
+
// Gateway middleware runs outside the gate so it can establish the session the gate checks.
|
|
190
123
|
const invoke = async () => {
|
|
191
124
|
await bridgeMiddlewareSession(wire);
|
|
192
125
|
return await runPikkuFunc('gateway', name, handlerFuncId, {
|
|
@@ -200,17 +133,12 @@ const createWebhookPostHandler = (config) => {
|
|
|
200
133
|
const result = gatewayMiddleware?.length
|
|
201
134
|
? await runMiddleware(services, wire, gatewayMiddleware, invoke)
|
|
202
135
|
: await invoke();
|
|
203
|
-
// Auto-send response if the func returns outbound content
|
|
204
136
|
if (result && (result.text || result.richContent || result.attachments)) {
|
|
205
137
|
await adapter.send(parsed.senderId, result);
|
|
206
138
|
}
|
|
207
139
|
return { ok: true };
|
|
208
140
|
};
|
|
209
141
|
};
|
|
210
|
-
/**
|
|
211
|
-
* Creates the GET handler for webhook verification challenges.
|
|
212
|
-
* Passes query parameters to the adapter's verifyWebhook method.
|
|
213
|
-
*/
|
|
214
142
|
const createWebhookVerifyHandler = (config) => {
|
|
215
143
|
return async (services, _data, wire) => {
|
|
216
144
|
const adapter = await resolveGatewayAdapter(config, services);
|
|
@@ -222,7 +150,7 @@ const createWebhookVerifyHandler = (config) => {
|
|
|
222
150
|
if (!result.verified) {
|
|
223
151
|
throw new UnauthorizedError('Webhook verification failed');
|
|
224
152
|
}
|
|
225
|
-
//
|
|
153
|
+
// knowledge: decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md
|
|
226
154
|
const response = result.response;
|
|
227
155
|
if (typeof response === 'string' || typeof response === 'number') {
|
|
228
156
|
return String(response);
|
|
@@ -231,21 +159,16 @@ const createWebhookVerifyHandler = (config) => {
|
|
|
231
159
|
return JSON.stringify(response);
|
|
232
160
|
};
|
|
233
161
|
};
|
|
234
|
-
// ---------------------------------------------------------------------------
|
|
235
|
-
// WebSocket gateway — client connects via WebSocket
|
|
236
|
-
// ---------------------------------------------------------------------------
|
|
237
162
|
const wireWebsocketGateway = (config) => {
|
|
238
163
|
const { name, route } = config;
|
|
239
164
|
if (!route) {
|
|
240
165
|
throw new Error(`WebSocket gateway '${name}' requires a route`);
|
|
241
166
|
}
|
|
242
|
-
// Store gateway config — the channel runner will reference this
|
|
243
167
|
pikkuState(null, 'gateway', 'gateways').set(config.name, config);
|
|
244
168
|
const channelsMeta = pikkuState(null, 'channel', 'meta');
|
|
245
169
|
const channels = pikkuState(null, 'channel', 'channels');
|
|
246
170
|
const messageFuncId = `gateway__${name}__message`;
|
|
247
171
|
const connectFuncId = `gateway__${name}__connect`;
|
|
248
|
-
// Add function metadata
|
|
249
172
|
const funcMeta = pikkuState(null, 'function', 'meta');
|
|
250
173
|
funcMeta[messageFuncId] = {
|
|
251
174
|
pikkuFuncId: messageFuncId,
|
|
@@ -259,7 +182,6 @@ const wireWebsocketGateway = (config) => {
|
|
|
259
182
|
outputSchemaName: null,
|
|
260
183
|
sessionless: true,
|
|
261
184
|
};
|
|
262
|
-
// Add channel metadata
|
|
263
185
|
channelsMeta[name] = {
|
|
264
186
|
name,
|
|
265
187
|
route,
|
|
@@ -269,7 +191,6 @@ const wireWebsocketGateway = (config) => {
|
|
|
269
191
|
};
|
|
270
192
|
const userMiddleware = config.middleware;
|
|
271
193
|
const handlerFuncId = registerGatewayHandler(config);
|
|
272
|
-
// Register onConnect
|
|
273
194
|
addFunction(connectFuncId, {
|
|
274
195
|
auth: false,
|
|
275
196
|
func: async (services, _data, wire) => {
|
|
@@ -284,7 +205,6 @@ const wireWebsocketGateway = (config) => {
|
|
|
284
205
|
};
|
|
285
206
|
},
|
|
286
207
|
});
|
|
287
|
-
// Register onMessage
|
|
288
208
|
addFunction(messageFuncId, {
|
|
289
209
|
auth: false,
|
|
290
210
|
func: async (services, data, wire) => {
|
|
@@ -319,7 +239,7 @@ const wireWebsocketGateway = (config) => {
|
|
|
319
239
|
}
|
|
320
240
|
},
|
|
321
241
|
});
|
|
322
|
-
//
|
|
242
|
+
// knowledge: decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md
|
|
323
243
|
channels.set(name, {
|
|
324
244
|
name,
|
|
325
245
|
route,
|
|
@@ -327,29 +247,12 @@ const wireWebsocketGateway = (config) => {
|
|
|
327
247
|
onConnect: { func: async () => { } },
|
|
328
248
|
onMessage: { func: async () => { } },
|
|
329
249
|
});
|
|
330
|
-
// Force router to re-initialize
|
|
331
250
|
httpRouter.reset();
|
|
332
251
|
};
|
|
333
|
-
// ---------------------------------------------------------------------------
|
|
334
|
-
// Listener gateway — standalone event loop, no route
|
|
335
|
-
// ---------------------------------------------------------------------------
|
|
336
252
|
const wireListenerGateway = (config) => {
|
|
337
|
-
// Listener gateways don't register routes.
|
|
338
|
-
// They are started manually and call into the gateway's func directly.
|
|
339
|
-
// The gateway config is already stored in pikkuState.
|
|
340
253
|
pikkuState(null, 'gateway', 'gateways').set(config.name, config);
|
|
341
254
|
};
|
|
342
|
-
/**
|
|
343
|
-
* Create the message handler callback for a listener gateway.
|
|
344
|
-
*
|
|
345
|
-
* Returns a function `(rawData: unknown) => Promise<void>` that can be
|
|
346
|
-
* passed to `adapter.init()`. Used by `LocalGatewayService` (and any
|
|
347
|
-
* other GatewayService implementation) to wire up listener gateways.
|
|
348
|
-
*
|
|
349
|
-
* @param name - Gateway name (for wire.gateway metadata)
|
|
350
|
-
* @param config - The gateway configuration (adapter, func, middleware)
|
|
351
|
-
* @param singletonServices - Singleton services to pass to handler/middleware
|
|
352
|
-
*/
|
|
255
|
+
/** The returned callback is what a GatewayService passes to `adapter.init()`. */
|
|
353
256
|
export const createListenerMessageHandler = (name, config, singletonServices) => {
|
|
354
257
|
const userMiddleware = config.middleware;
|
|
355
258
|
const handlerFuncId = registerGatewayHandler(config);
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import type { CommonWireMeta, CorePikkuMiddleware, CorePikkuMiddlewareGroup, CoreSingletonServices } from '../../types/core.types.js';
|
|
2
2
|
import type { CorePikkuFunctionConfig } from '../../function/functions.types.js';
|
|
3
3
|
import type { PikkuHTTPRequest } from '../http/http.types.js';
|
|
4
|
-
/**
|
|
5
|
-
* Attachment in gateway messages (images, files, etc.)
|
|
6
|
-
*/
|
|
7
4
|
export interface GatewayAttachment {
|
|
8
5
|
type: string;
|
|
9
6
|
url?: string;
|
|
@@ -11,125 +8,58 @@ export interface GatewayAttachment {
|
|
|
11
8
|
mimeType?: string;
|
|
12
9
|
filename?: string;
|
|
13
10
|
}
|
|
14
|
-
/**
|
|
15
|
-
* Normalized inbound message from any platform
|
|
16
|
-
*/
|
|
17
11
|
export interface GatewayInboundMessage {
|
|
18
|
-
/** Platform-specific
|
|
12
|
+
/** Platform-specific: a phone number, a Slack user id, and so on. */
|
|
19
13
|
senderId: string;
|
|
20
|
-
/** Message text content */
|
|
21
14
|
text: string;
|
|
22
|
-
/** Original platform-specific payload */
|
|
23
15
|
raw: unknown;
|
|
24
|
-
/** Optional file/media attachments */
|
|
25
16
|
attachments?: GatewayAttachment[];
|
|
26
|
-
/** Optional platform-specific metadata */
|
|
27
17
|
metadata?: Record<string, unknown>;
|
|
28
18
|
}
|
|
29
|
-
/**
|
|
30
|
-
* Outbound message to send back via the platform
|
|
31
|
-
*/
|
|
32
19
|
export interface GatewayOutboundMessage {
|
|
33
|
-
/** Plain text response */
|
|
34
20
|
text?: string;
|
|
35
|
-
/** Platform-specific rich content (Slack blocks, WhatsApp templates, etc.) */
|
|
36
21
|
richContent?: Record<string, unknown>;
|
|
37
|
-
/** Optional file/media attachments */
|
|
38
22
|
attachments?: GatewayAttachment[];
|
|
39
23
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Result of webhook verification (e.g., WhatsApp GET challenge, Slack url_verification)
|
|
42
|
-
*/
|
|
43
24
|
export type WebhookVerificationResult = {
|
|
44
25
|
verified: true;
|
|
45
26
|
response: unknown;
|
|
46
27
|
} | {
|
|
47
28
|
verified: false;
|
|
48
29
|
};
|
|
49
|
-
/**
|
|
50
|
-
* Gateway adapter interface — implemented by platform-specific addon packages.
|
|
51
|
-
*
|
|
52
|
-
* Two responsibilities:
|
|
53
|
-
* 1. Parse incoming platform-specific format into normalized GatewayInboundMessage
|
|
54
|
-
* 2. Send outgoing GatewayOutboundMessage via the platform's API
|
|
55
|
-
*/
|
|
56
30
|
export interface GatewayAdapter {
|
|
57
|
-
/** Platform name (e.g., 'whatsapp', 'slack', 'telegram') */
|
|
58
31
|
name: string;
|
|
59
|
-
/**
|
|
32
|
+
/** Return null to ignore the event, e.g. a delivery receipt. */
|
|
60
33
|
parse(data: unknown): GatewayInboundMessage | null;
|
|
61
|
-
/** Send a message to a specific sender via the platform's API */
|
|
62
34
|
send(senderId: string, message: GatewayOutboundMessage): Promise<void>;
|
|
63
|
-
/**
|
|
64
|
-
* Called by GatewayService.start() — the adapter should call onMessage for each incoming event. */
|
|
35
|
+
/** Called by GatewayService.start(); must call onMessage per incoming event. */
|
|
65
36
|
init(onMessage: (data: unknown) => Promise<void>): Promise<void>;
|
|
66
|
-
/** Tear down the adapter (disconnect, release resources). */
|
|
67
37
|
close(): Promise<void>;
|
|
68
|
-
/**
|
|
69
|
-
* Receives the data (body or query params) and the Pikku HTTP request for additional inspection. */
|
|
38
|
+
/** Receives the GET query params, or the POST body when called from the POST handler. */
|
|
70
39
|
verifyWebhook?(data: unknown, request?: PikkuHTTPRequest): WebhookVerificationResult | Promise<WebhookVerificationResult>;
|
|
71
40
|
}
|
|
72
|
-
/**
|
|
73
|
-
* Factory that builds a GatewayAdapter from singleton services.
|
|
74
|
-
*
|
|
75
|
-
* Real platform adapters (WhatsApp Cloud API, Slack, …) need secrets or
|
|
76
|
-
* services that only exist after boot, while `wireGateway` runs at module
|
|
77
|
-
* load. Pass a factory instead of an instance and it is resolved lazily on
|
|
78
|
-
* the first inbound request (webhook/websocket) or on gateway start
|
|
79
|
-
* (listener), then cached for the lifetime of the gateway.
|
|
80
|
-
*/
|
|
81
41
|
export type GatewayAdapterFactory = (services: CoreSingletonServices) => GatewayAdapter | Promise<GatewayAdapter>;
|
|
82
|
-
/**
|
|
83
|
-
* The gateway wire object available on wire.gateway inside handler functions and middleware
|
|
84
|
-
*/
|
|
85
42
|
export interface PikkuGateway {
|
|
86
|
-
/** Name of this gateway instance */
|
|
87
43
|
gatewayName: string;
|
|
88
|
-
/** Platform-specific sender identifier */
|
|
89
44
|
senderId: string;
|
|
90
|
-
/** Platform name from adapter.name */
|
|
91
45
|
platform: string;
|
|
92
|
-
/** Send a proactive message to the sender */
|
|
93
46
|
send(msg: GatewayOutboundMessage): Promise<void>;
|
|
94
47
|
}
|
|
95
|
-
/**
|
|
96
|
-
* Gateway transport type:
|
|
97
|
-
* - 'webhook': Platform POSTs to us (WhatsApp Cloud API, Slack Events API, Telegram webhooks)
|
|
98
|
-
* - 'websocket': Client connects via WebSocket (WebChat, browser widget)
|
|
99
|
-
* - 'listener': Standalone event loop, no route (Baileys, Signal CLI, Matrix sync)
|
|
100
|
-
*/
|
|
48
|
+
/** 'webhook' the platform POSTs to us, 'websocket' the client connects to us, 'listener' no route at all. */
|
|
101
49
|
export type GatewayTransportType = 'webhook' | 'websocket' | 'listener';
|
|
102
|
-
/**
|
|
103
|
-
* Core gateway configuration for wireGateway()
|
|
104
|
-
*/
|
|
105
50
|
export type CoreGateway<PikkuFunctionConfig = CorePikkuFunctionConfig<any, any>, PikkuMiddleware extends CorePikkuMiddleware = CorePikkuMiddleware> = Partial<Pick<CommonWireMeta, 'title' | 'summary' | 'description' | 'errors'>> & {
|
|
106
|
-
/** Unique name for this gateway */
|
|
107
51
|
name: string;
|
|
108
|
-
/** Transport type */
|
|
109
52
|
type: GatewayTransportType;
|
|
110
|
-
/**
|
|
53
|
+
/** Required for 'webhook' and 'websocket'; unused for 'listener'. */
|
|
111
54
|
route?: string;
|
|
112
55
|
platform?: string;
|
|
113
|
-
/** The gateway adapter (parse inbound, send outbound), or a factory
|
|
114
|
-
* resolved lazily from singleton services (for adapters needing secrets) */
|
|
115
56
|
adapter: GatewayAdapter | GatewayAdapterFactory;
|
|
116
|
-
/** The handler function that processes parsed messages */
|
|
117
57
|
func: PikkuFunctionConfig;
|
|
118
|
-
/** Optional middleware chain (e.g., auth) */
|
|
119
58
|
middleware?: CorePikkuMiddlewareGroup<any, any>;
|
|
120
|
-
/** Optional tags for categorization */
|
|
121
59
|
tags?: string[];
|
|
122
|
-
/**
|
|
123
|
-
* Whether the handler requires a session. Left unset, the handler's own
|
|
124
|
-
* `auth` governs, and a gateway handler is sessionless by default — inbound
|
|
125
|
-
* gateway traffic is platform-authenticated by the adapter, not
|
|
126
|
-
* session-bearing. Set `true` to require a session for every message.
|
|
127
|
-
*/
|
|
60
|
+
/** Unset lets the handler's own `auth` govern; gateway handlers are sessionless by default. */
|
|
128
61
|
auth?: boolean;
|
|
129
62
|
};
|
|
130
|
-
/**
|
|
131
|
-
* Metadata for a registered gateway, stored in state
|
|
132
|
-
*/
|
|
133
63
|
export type GatewayMeta = CommonWireMeta & {
|
|
134
64
|
name: string;
|
|
135
65
|
type: GatewayTransportType;
|
|
@@ -138,7 +68,4 @@ export type GatewayMeta = CommonWireMeta & {
|
|
|
138
68
|
auth?: boolean;
|
|
139
69
|
gateway: true;
|
|
140
70
|
};
|
|
141
|
-
/**
|
|
142
|
-
* All gateway metadata keyed by name
|
|
143
|
-
*/
|
|
144
71
|
export type GatewaysMeta = Record<string, GatewayMeta>;
|
|
@@ -1,69 +1,6 @@
|
|
|
1
1
|
import type { HTTPRouteMap, HTTPRouteContract, HTTPRoutesGroupConfig, WireHTTPRoutesConfig } from './http.types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Type-safe helper for defining route contracts that can be composed.
|
|
4
|
-
* Supports optional group-level config that cascades to all routes.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* ```typescript
|
|
8
|
-
* // Simple routes without group config
|
|
9
|
-
* export const todosRoutes = defineHTTPRoutes({
|
|
10
|
-
* list: { method: 'get', route: '/todos', func: listTodos },
|
|
11
|
-
* get: { method: 'get', route: '/todos/:id', func: getTodo },
|
|
12
|
-
* })
|
|
13
|
-
*
|
|
14
|
-
* // Routes with group-level config
|
|
15
|
-
* export const todosRoutes = defineHTTPRoutes({
|
|
16
|
-
* auth: true,
|
|
17
|
-
* tags: ['todos'],
|
|
18
|
-
* routes: {
|
|
19
|
-
* list: { method: 'get', route: '/todos', func: listTodos },
|
|
20
|
-
* get: { method: 'get', route: '/todos/:id', func: getTodo },
|
|
21
|
-
* }
|
|
22
|
-
* })
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
2
|
export declare function defineHTTPRoutes<T extends HTTPRouteMap>(routes: T): HTTPRouteContract<T>;
|
|
26
3
|
export declare function defineHTTPRoutes<T extends HTTPRouteMap>(config: HTTPRoutesGroupConfig & {
|
|
27
4
|
routes: T;
|
|
28
5
|
}): HTTPRouteContract<T>;
|
|
29
|
-
/**
|
|
30
|
-
* Wires multiple HTTP routes from a nested map or array configuration.
|
|
31
|
-
* Inspired by ts-rest's contract pattern, provides a single place to wire an entire API.
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```typescript
|
|
35
|
-
* // Nested object format
|
|
36
|
-
* wireHTTPRoutes({
|
|
37
|
-
* basePath: '/api/v1',
|
|
38
|
-
* tags: ['api'],
|
|
39
|
-
* routes: {
|
|
40
|
-
* todos: {
|
|
41
|
-
* list: { method: 'get', route: '/todos', func: listTodos },
|
|
42
|
-
* get: { method: 'get', route: '/todos/:id', func: getTodo },
|
|
43
|
-
* },
|
|
44
|
-
* auth: {
|
|
45
|
-
* login: { method: 'post', route: '/auth/login', func: login, auth: false },
|
|
46
|
-
* },
|
|
47
|
-
* },
|
|
48
|
-
* })
|
|
49
|
-
*
|
|
50
|
-
* // Flat array format
|
|
51
|
-
* wireHTTPRoutes({
|
|
52
|
-
* basePath: '/api',
|
|
53
|
-
* routes: [
|
|
54
|
-
* { method: 'get', route: '/todos', func: listTodos },
|
|
55
|
-
* { method: 'post', route: '/todos', func: createTodo },
|
|
56
|
-
* ],
|
|
57
|
-
* })
|
|
58
|
-
*
|
|
59
|
-
* // Composing route contracts
|
|
60
|
-
* wireHTTPRoutes({
|
|
61
|
-
* basePath: '/api/v1',
|
|
62
|
-
* routes: {
|
|
63
|
-
* todos: todosRoutes, // from defineHTTPRoutes()
|
|
64
|
-
* auth: authRoutes, // from defineHTTPRoutes()
|
|
65
|
-
* },
|
|
66
|
-
* })
|
|
67
|
-
* ```
|
|
68
|
-
*/
|
|
69
6
|
export declare const wireHTTPRoutes: (config: WireHTTPRoutesConfig) => void;
|
|
@@ -1,54 +1,12 @@
|
|
|
1
1
|
import { wireHTTP } from './http-runner.js';
|
|
2
2
|
export function defineHTTPRoutes(configOrRoutes) {
|
|
3
|
-
// If it has a 'routes' property and contains a map (not a route config), it's config + routes
|
|
4
3
|
if ('routes' in configOrRoutes &&
|
|
5
4
|
typeof configOrRoutes.routes === 'object' &&
|
|
6
5
|
!isRouteConfig(configOrRoutes.routes)) {
|
|
7
6
|
return configOrRoutes;
|
|
8
7
|
}
|
|
9
|
-
// Otherwise it's just routes
|
|
10
8
|
return { routes: configOrRoutes };
|
|
11
9
|
}
|
|
12
|
-
/**
|
|
13
|
-
* Wires multiple HTTP routes from a nested map or array configuration.
|
|
14
|
-
* Inspired by ts-rest's contract pattern, provides a single place to wire an entire API.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* // Nested object format
|
|
19
|
-
* wireHTTPRoutes({
|
|
20
|
-
* basePath: '/api/v1',
|
|
21
|
-
* tags: ['api'],
|
|
22
|
-
* routes: {
|
|
23
|
-
* todos: {
|
|
24
|
-
* list: { method: 'get', route: '/todos', func: listTodos },
|
|
25
|
-
* get: { method: 'get', route: '/todos/:id', func: getTodo },
|
|
26
|
-
* },
|
|
27
|
-
* auth: {
|
|
28
|
-
* login: { method: 'post', route: '/auth/login', func: login, auth: false },
|
|
29
|
-
* },
|
|
30
|
-
* },
|
|
31
|
-
* })
|
|
32
|
-
*
|
|
33
|
-
* // Flat array format
|
|
34
|
-
* wireHTTPRoutes({
|
|
35
|
-
* basePath: '/api',
|
|
36
|
-
* routes: [
|
|
37
|
-
* { method: 'get', route: '/todos', func: listTodos },
|
|
38
|
-
* { method: 'post', route: '/todos', func: createTodo },
|
|
39
|
-
* ],
|
|
40
|
-
* })
|
|
41
|
-
*
|
|
42
|
-
* // Composing route contracts
|
|
43
|
-
* wireHTTPRoutes({
|
|
44
|
-
* basePath: '/api/v1',
|
|
45
|
-
* routes: {
|
|
46
|
-
* todos: todosRoutes, // from defineHTTPRoutes()
|
|
47
|
-
* auth: authRoutes, // from defineHTTPRoutes()
|
|
48
|
-
* },
|
|
49
|
-
* })
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
10
|
export const wireHTTPRoutes = (config) => {
|
|
53
11
|
const { routes, ...groupConfig } = config;
|
|
54
12
|
if (Array.isArray(routes)) {
|
|
@@ -58,32 +16,20 @@ export const wireHTTPRoutes = (config) => {
|
|
|
58
16
|
processRouteMap(routes, groupConfig);
|
|
59
17
|
}
|
|
60
18
|
};
|
|
61
|
-
/**
|
|
62
|
-
* Recursively processes a route map, handling nested maps and contracts
|
|
63
|
-
*/
|
|
64
19
|
function processRouteMap(map, parentConfig) {
|
|
65
20
|
for (const [_key, value] of Object.entries(map)) {
|
|
66
21
|
if (isRouteConfig(value)) {
|
|
67
22
|
registerRoute(value, parentConfig);
|
|
68
23
|
}
|
|
69
24
|
else if (isRouteContract(value)) {
|
|
70
|
-
// Merge parent config with contract config, then process routes
|
|
71
25
|
const mergedConfig = mergeGroupConfig(parentConfig, value);
|
|
72
26
|
processRouteMap(value.routes, mergedConfig);
|
|
73
27
|
}
|
|
74
28
|
else {
|
|
75
|
-
// Nested map without config
|
|
76
29
|
processRouteMap(value, parentConfig);
|
|
77
30
|
}
|
|
78
31
|
}
|
|
79
32
|
}
|
|
80
|
-
/**
|
|
81
|
-
* Merge group configs with proper cascading behavior:
|
|
82
|
-
* - basePath: Concatenates
|
|
83
|
-
* - tags: Merges (parent + child)
|
|
84
|
-
* - middleware: Merges (parent runs first)
|
|
85
|
-
* - auth: Inner overrides outer
|
|
86
|
-
*/
|
|
87
33
|
function mergeGroupConfig(parent, child) {
|
|
88
34
|
return {
|
|
89
35
|
basePath: (parent.basePath || '') + (child.basePath || ''),
|
|
@@ -92,9 +38,6 @@ function mergeGroupConfig(parent, child) {
|
|
|
92
38
|
auth: child.auth ?? parent.auth,
|
|
93
39
|
};
|
|
94
40
|
}
|
|
95
|
-
/**
|
|
96
|
-
* Registers a single route by calling wireHTTP with merged configuration
|
|
97
|
-
*/
|
|
98
41
|
function registerRoute(route, groupConfig) {
|
|
99
42
|
const fullRoute = (groupConfig.basePath || '') + route.route;
|
|
100
43
|
wireHTTP({
|
|
@@ -113,9 +56,6 @@ function registerRoute(route, groupConfig) {
|
|
|
113
56
|
sse: route.sse,
|
|
114
57
|
});
|
|
115
58
|
}
|
|
116
|
-
/**
|
|
117
|
-
* Type guard to check if a value is an individual route config
|
|
118
|
-
*/
|
|
119
59
|
function isRouteConfig(value) {
|
|
120
60
|
return (typeof value === 'object' &&
|
|
121
61
|
value !== null &&
|
|
@@ -123,9 +63,6 @@ function isRouteConfig(value) {
|
|
|
123
63
|
'func' in value &&
|
|
124
64
|
'route' in value);
|
|
125
65
|
}
|
|
126
|
-
/**
|
|
127
|
-
* Type guard to check if a value is a route contract (has routes property but is not a route config)
|
|
128
|
-
*/
|
|
129
66
|
function isRouteContract(value) {
|
|
130
67
|
return (typeof value === 'object' &&
|
|
131
68
|
value !== null &&
|