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