@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
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Services never touched by an assertion stay lenient.
|
|
2
|
+
* Strict per service: once a scenario asserts any call on a service, every
|
|
3
|
+
* recorded call on it must be verified by the end of the scenario or the After
|
|
4
|
+
* hook fails. A service no assertion ever touched stays lenient.
|
|
6
5
|
*/
|
|
7
6
|
export class StubTracker {
|
|
8
7
|
calls = new Map();
|
|
@@ -87,16 +86,11 @@ export class StubTracker {
|
|
|
87
86
|
}
|
|
88
87
|
}
|
|
89
88
|
}
|
|
90
|
-
/**
|
|
91
|
-
* Creates a Proxy suitable for passing as `existingServices` to
|
|
92
|
-
* `createSingletonServices`. Every property returns `tracker.stub(prop)`
|
|
93
|
-
* EXCEPT `schema`, which returns `undefined` so the service factory creates
|
|
94
|
-
* a real schema service. Stubbing the schema makes validation a no-op —
|
|
95
|
-
* required fields pass silently and tests validate nothing.
|
|
96
|
-
*/
|
|
89
|
+
/** Pass as `existingServices` to `createSingletonServices`. */
|
|
97
90
|
export function createStubProxy(tracker) {
|
|
98
91
|
return new Proxy({}, {
|
|
99
92
|
get(_, prop) {
|
|
93
|
+
// knowledge: decisions/internals/the-schema-service-is-never-stubbed.md
|
|
100
94
|
if (prop === 'schema')
|
|
101
95
|
return undefined;
|
|
102
96
|
return tracker.stub(prop);
|
|
@@ -104,16 +98,12 @@ export function createStubProxy(tracker) {
|
|
|
104
98
|
});
|
|
105
99
|
}
|
|
106
100
|
const defaultStubTracker = new StubTracker();
|
|
107
|
-
/** The process-wide tracker
|
|
101
|
+
/** The process-wide tracker `stub()`/`spy()` record into; read by the console's getStubCalls/resetStubs RPCs. */
|
|
108
102
|
export const getStubTracker = () => defaultStubTracker;
|
|
109
|
-
/** True when the server was started by `pikku dev --test
|
|
103
|
+
/** True when the server was started by `pikku dev --test`, which sets PIKKU_TEST_RUN. */
|
|
110
104
|
export const isTestRun = () => globalThis
|
|
111
105
|
.process?.env?.PIKKU_TEST_RUN === 'true';
|
|
112
|
-
/**
|
|
113
|
-
* Creates a recording fake for a service. Methods present on `impl` run and
|
|
114
|
-
* their result is returned; missing methods resolve `undefined`. Every call
|
|
115
|
-
* is recorded so scenarios can assert via workflow.expectService().
|
|
116
|
-
*/
|
|
106
|
+
/** Methods on `impl` run and return; every other method resolves `undefined`. */
|
|
117
107
|
export function stub(service, impl) {
|
|
118
108
|
return new Proxy((impl ?? {}), {
|
|
119
109
|
get(target, method) {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Role } from './scope-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* The guards a {@link ScopeService} implementation must apply before mutating
|
|
4
|
+
* a role.
|
|
5
|
+
*
|
|
6
|
+
* Shared rather than left to each implementation because the rule is a
|
|
7
|
+
* contract, not a policy: a store that lets the console delete `buyer` makes
|
|
8
|
+
* every persona and scenario written against `buyer` silently stop testing
|
|
9
|
+
* what it claims to, and nothing fails at the point of the mistake. Two
|
|
10
|
+
* implementations disagreeing about that would be worse than either rule.
|
|
11
|
+
*
|
|
12
|
+
* `isSystemRole` is passed in rather than a role list, so an implementation can
|
|
13
|
+
* answer it from a column, a cached set, or a query, whichever is cheap.
|
|
14
|
+
*/
|
|
15
|
+
export type IsSystemRole = (name: string) => boolean | Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Refuses a destructive or re-scoping operation against a declared role.
|
|
18
|
+
*
|
|
19
|
+
* @param operation a verb phrase for the message, e.g. `'delete role'`.
|
|
20
|
+
*/
|
|
21
|
+
export declare const assertRoleIsMutable: (name: string, isSystemRole: IsSystemRole, operation: string) => Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Refuses a new custom role that would shadow a declared one.
|
|
24
|
+
*/
|
|
25
|
+
export declare const assertRoleNameAvailable: (name: string, isSystemRole: IsSystemRole) => Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Why the console must render a role as locked, or `null` when it is editable.
|
|
28
|
+
*
|
|
29
|
+
* Returned rather than a boolean so the UI shows a reason instead of a
|
|
30
|
+
* disabled button with no explanation — the difference between a user filing a
|
|
31
|
+
* bug and a user editing the declaration.
|
|
32
|
+
*/
|
|
33
|
+
export declare const roleLockReason: (role: Role) => string | null;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SystemRoleImmutableError, SystemRoleShadowedError, } from '../errors/errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Refuses a destructive or re-scoping operation against a declared role.
|
|
4
|
+
*
|
|
5
|
+
* @param operation a verb phrase for the message, e.g. `'delete role'`.
|
|
6
|
+
*/
|
|
7
|
+
export const assertRoleIsMutable = async (name, isSystemRole, operation) => {
|
|
8
|
+
if (await isSystemRole(name)) {
|
|
9
|
+
throw new SystemRoleImmutableError(name, operation);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Refuses a new custom role that would shadow a declared one.
|
|
14
|
+
*/
|
|
15
|
+
export const assertRoleNameAvailable = async (name, isSystemRole) => {
|
|
16
|
+
if (await isSystemRole(name)) {
|
|
17
|
+
throw new SystemRoleShadowedError(name);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Why the console must render a role as locked, or `null` when it is editable.
|
|
22
|
+
*
|
|
23
|
+
* Returned rather than a boolean so the UI shows a reason instead of a
|
|
24
|
+
* disabled button with no explanation — the difference between a user filing a
|
|
25
|
+
* bug and a user editing the declaration.
|
|
26
|
+
*/
|
|
27
|
+
export const roleLockReason = (role) => {
|
|
28
|
+
if (!role.system) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
if (role.declared === false) {
|
|
32
|
+
return (`'${role.name}' was declared in code and that declaration has been removed. ` +
|
|
33
|
+
`It is inert: still held by its current members, not offered for new grants. ` +
|
|
34
|
+
`Run 'pikku roles prune' to remove it.`);
|
|
35
|
+
}
|
|
36
|
+
return (`'${role.name}' is declared in code with defineSystemRole. ` +
|
|
37
|
+
`Edit the declaration to change what it grants.`);
|
|
38
|
+
};
|
|
@@ -1,16 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Abstract TriggerService interface.
|
|
3
|
-
*
|
|
4
|
-
* Implementations manage trigger subscriptions — listening to external events
|
|
5
|
-
* and dispatching to RPC targets or workflow starts.
|
|
6
|
-
*/
|
|
7
1
|
export interface TriggerService {
|
|
8
|
-
/**
|
|
9
|
-
* Start all triggers
|
|
10
|
-
*/
|
|
11
2
|
start(): Promise<void>;
|
|
12
|
-
/**
|
|
13
|
-
* Stop all triggers
|
|
14
|
-
*/
|
|
15
3
|
stop(): Promise<void>;
|
|
16
4
|
}
|
|
@@ -18,13 +18,6 @@ export type CredentialMeta = {
|
|
|
18
18
|
export declare class TypedSecretService<TMap = Record<string, unknown>> implements SecretService {
|
|
19
19
|
private secrets;
|
|
20
20
|
private credentialsMeta;
|
|
21
|
-
/**
|
|
22
|
-
* In-process cache of resolved secrets, so callers can read naively without
|
|
23
|
-
* re-hitting the underlying service on every call. Only successful reads are
|
|
24
|
-
* cached (a miss throws and isn't stored); `setSecret`/`deleteSecret`
|
|
25
|
-
* invalidate the key. No TTL — a secret rotated out-of-band won't refresh
|
|
26
|
-
* until restart (see pikkujs/pikku#964).
|
|
27
|
-
*/
|
|
28
21
|
private cache;
|
|
29
22
|
constructor(secrets: SecretService, credentialsMeta: Record<string, CredentialMeta>);
|
|
30
23
|
getSecret<K extends keyof TMap & string>(key: K): Promise<TMap[K]>;
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
export class TypedSecretService {
|
|
2
2
|
secrets;
|
|
3
3
|
credentialsMeta;
|
|
4
|
-
|
|
5
|
-
* In-process cache of resolved secrets, so callers can read naively without
|
|
6
|
-
* re-hitting the underlying service on every call. Only successful reads are
|
|
7
|
-
* cached (a miss throws and isn't stored); `setSecret`/`deleteSecret`
|
|
8
|
-
* invalidate the key. No TTL — a secret rotated out-of-band won't refresh
|
|
9
|
-
* until restart (see pikkujs/pikku#964).
|
|
10
|
-
*/
|
|
4
|
+
// knowledge: decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md
|
|
11
5
|
cache = new Map();
|
|
12
6
|
constructor(secrets, credentialsMeta) {
|
|
13
7
|
this.secrets = secrets;
|
|
@@ -60,9 +60,8 @@ export interface CoverageFunctionMeta {
|
|
|
60
60
|
export interface CoverageService {
|
|
61
61
|
start(): Promise<void>;
|
|
62
62
|
takeCoverage(): Promise<CoverageSnapshot>;
|
|
63
|
-
/**
|
|
64
|
-
*
|
|
65
|
-
* the runtime only exposes raw snapshots. */
|
|
63
|
+
/** Provided by the process that booted the backend (the pikku CLI); absent
|
|
64
|
+
* when the runtime only exposes raw snapshots. */
|
|
66
65
|
takeReport?(functionsMeta: Record<string, CoverageFunctionMeta>): Promise<FunctionCoverageReport>;
|
|
67
66
|
reset(): Promise<void>;
|
|
68
67
|
stop(): Promise<void>;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// node:inspector is imported lazily inside start() so this module stays
|
|
2
|
-
// loadable on runtimes without it (e.g. Cloudflare Workers).
|
|
3
1
|
export class V8CoverageService {
|
|
4
2
|
session = null;
|
|
5
3
|
startPromise = null;
|
|
@@ -17,6 +15,7 @@ export class V8CoverageService {
|
|
|
17
15
|
return this.startPromise;
|
|
18
16
|
}
|
|
19
17
|
async doStart() {
|
|
18
|
+
// knowledge: decisions/internals/node-only-builtins-are-imported-dynamically.md
|
|
20
19
|
const inspector = await import('node:inspector');
|
|
21
20
|
this.session = new inspector.Session();
|
|
22
21
|
this.session.connect();
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
export interface VariablesService {
|
|
2
2
|
get<T = string>(name: string): Promise<T | undefined> | T | undefined;
|
|
3
|
-
/**
|
|
4
|
-
* Retrieves multiple variables in a single batch operation, mirroring
|
|
5
|
-
* `SecretService.getSecrets`. Missing variables are omitted rather than
|
|
6
|
-
* throwing, so the result is typed as `Partial<T>` and callers must handle
|
|
7
|
-
* keys that may be absent at runtime. Pass a shape as `T` to get a typed
|
|
8
|
-
* result without casting, e.g.
|
|
9
|
-
* `await variables.getVariables<{ FOO: string; BAR: string }>(['FOO', 'BAR'])`.
|
|
10
|
-
*/
|
|
3
|
+
/** Same contract as `SecretService.getSecrets`: missing keys are omitted, hence `Partial<T>`. */
|
|
11
4
|
getVariables<T extends Record<string, unknown> = Record<string, unknown>>(names: (keyof T & string)[]): Promise<Partial<T>> | Partial<T>;
|
|
12
5
|
getAll: () => Promise<Record<string, string | undefined>> | Record<string, string | undefined>;
|
|
13
6
|
set: (name: string, value: unknown) => Promise<void> | void;
|
|
@@ -1,54 +1,31 @@
|
|
|
1
1
|
export interface SendWebhookInput {
|
|
2
|
-
/** The endpoint the webhook is delivered to via HTTP POST. */
|
|
3
2
|
url: string;
|
|
4
|
-
/**
|
|
3
|
+
/** Sent as the `X-Pikku-Event` header. */
|
|
5
4
|
event?: string;
|
|
6
|
-
/** The payload, JSON-serialized into the request body. */
|
|
7
5
|
data: unknown;
|
|
8
|
-
/** Extra headers merged over the defaults. */
|
|
9
6
|
headers?: Record<string, string>;
|
|
10
|
-
/**
|
|
11
|
-
* Raw HMAC signing key for this delivery. Overrides the config-level
|
|
12
|
-
* secret. When present, the body is signed into the signature header.
|
|
13
|
-
*/
|
|
7
|
+
/** A raw HMAC key, not a secret name — overrides `config.webhook.secret`. */
|
|
14
8
|
secret?: string;
|
|
15
|
-
/**
|
|
9
|
+
/** Overrides `config.webhook.retries`. */
|
|
16
10
|
retries?: number;
|
|
17
|
-
/**
|
|
18
|
-
* Delay between retries (`30000` or `'30s'`). A concrete value selects a
|
|
19
|
-
* fixed backoff; when omitted, backoff is exponential.
|
|
20
|
-
*/
|
|
11
|
+
/** A concrete delay (`30000` or `'30s'`) selects fixed backoff; omitted means exponential. */
|
|
21
12
|
retryDelay?: string | number;
|
|
22
|
-
/**
|
|
23
|
-
* Organization this delivery belongs to. Persisted by a store-backed
|
|
24
|
-
* implementation (e.g. `KyselyWebhookService`) so deliveries can be
|
|
25
|
-
* queried per org; ignored by the queue-only default.
|
|
26
|
-
*/
|
|
13
|
+
/** Persisted only by store-backed implementations; the queue-only default ignores it. */
|
|
27
14
|
organizationId?: string;
|
|
28
15
|
}
|
|
29
16
|
export interface SendWebhookResult {
|
|
30
17
|
jobId: string;
|
|
31
18
|
}
|
|
32
19
|
export interface WebhookServiceConfig {
|
|
33
|
-
/** Default retry count for failed deliveries. */
|
|
34
20
|
retries?: number;
|
|
35
|
-
/**
|
|
21
|
+
/** Omitted means exponential backoff. */
|
|
36
22
|
retryDelay?: string | number;
|
|
37
|
-
/**
|
|
38
|
-
* Name of a secret (resolved through the secret service) used as the
|
|
39
|
-
* default HMAC signing key for all outgoing webhooks.
|
|
40
|
-
*/
|
|
23
|
+
/** A secret *name* resolved through the secret service, unlike `SendWebhookInput.secret`. */
|
|
41
24
|
secret?: string;
|
|
42
|
-
/**
|
|
43
|
-
* Header the body signature is sent in. Defaults to
|
|
44
|
-
* {@link DEFAULT_WEBHOOK_SIGNATURE_HEADER}.
|
|
45
|
-
*/
|
|
46
25
|
signatureHeader?: string;
|
|
47
26
|
/**
|
|
48
|
-
* SSRF allowlist
|
|
49
|
-
*
|
|
50
|
-
* internal hosts (loopback, private ranges, cloud metadata) are blocked and
|
|
51
|
-
* all other public hosts are permitted.
|
|
27
|
+
* SSRF allowlist. Set: only these hostnames may be delivered to. Omitted:
|
|
28
|
+
* private/internal hosts are blocked and every other public host is allowed.
|
|
52
29
|
*/
|
|
53
30
|
allowedHosts?: string[];
|
|
54
31
|
}
|
|
@@ -58,24 +35,19 @@ export interface WebhookJobData {
|
|
|
58
35
|
body: string;
|
|
59
36
|
headers: Record<string, string>;
|
|
60
37
|
/**
|
|
61
|
-
*
|
|
62
|
-
* the
|
|
63
|
-
* the queue `jobId`), so it's stable across retries.
|
|
38
|
+
* Present only when a store-backed implementation enqueued the job. Doubles
|
|
39
|
+
* as the queue `jobId`, so it is stable across retries.
|
|
64
40
|
*/
|
|
65
41
|
deliveryId?: string;
|
|
66
42
|
}
|
|
67
|
-
/** Outcome of one delivery attempt, recorded against a delivery. */
|
|
68
43
|
export interface WebhookAttemptResult {
|
|
69
|
-
/**
|
|
44
|
+
/** Absent when the request never completed. */
|
|
70
45
|
statusCode?: number;
|
|
71
|
-
/**
|
|
46
|
+
/** Truncated; captured on failure only. */
|
|
72
47
|
responseBody?: string;
|
|
73
|
-
/** Network/timeout error message, when the request threw. */
|
|
74
48
|
error?: string;
|
|
75
|
-
/** Whether this attempt was a 2xx success. */
|
|
76
49
|
delivered: boolean;
|
|
77
50
|
}
|
|
78
|
-
/** A persisted webhook delivery, as surfaced to the console. */
|
|
79
51
|
export interface WebhookDeliveryRecord {
|
|
80
52
|
deliveryId: string;
|
|
81
53
|
organizationId: string | null;
|
|
@@ -87,7 +59,6 @@ export interface WebhookDeliveryRecord {
|
|
|
87
59
|
updatedAt: Date;
|
|
88
60
|
deliveredAt: Date | null;
|
|
89
61
|
}
|
|
90
|
-
/** A single persisted delivery attempt. */
|
|
91
62
|
export interface WebhookAttemptRecord {
|
|
92
63
|
attemptId: string;
|
|
93
64
|
deliveryId: string;
|
|
@@ -97,44 +68,29 @@ export interface WebhookAttemptRecord {
|
|
|
97
68
|
error: string | null;
|
|
98
69
|
createdAt: Date;
|
|
99
70
|
}
|
|
100
|
-
/** A delivery with its full attempt history. */
|
|
101
71
|
export interface WebhookDeliveryWithAttempts {
|
|
102
72
|
delivery: WebhookDeliveryRecord;
|
|
103
73
|
attempts: WebhookAttemptRecord[];
|
|
104
74
|
}
|
|
105
75
|
export declare const PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME = "pikku-outgoing-webhooks";
|
|
106
76
|
export declare const DEFAULT_WEBHOOK_SIGNATURE_HEADER = "X-Pikku-Signature";
|
|
107
|
-
/** Fallback when neither the per-call nor `config.webhook.retries` is set. */
|
|
108
77
|
export declare const DEFAULT_WEBHOOK_RETRIES = 3;
|
|
109
|
-
/**
|
|
110
|
-
* Outgoing webhook delivery. {@link QueueWebhookService} is the default
|
|
111
|
-
* implementation; apps can extend this to deliver directly, or through a
|
|
112
|
-
* provider such as Svix.
|
|
113
|
-
*/
|
|
114
78
|
export declare abstract class WebhookService {
|
|
115
79
|
abstract send(input: SendWebhookInput): Promise<SendWebhookResult>;
|
|
116
|
-
/**
|
|
117
|
-
* Sign a body with HMAC-SHA256, producing the signature header value
|
|
118
|
-
* (e.g. `sha256=abc123...`).
|
|
119
|
-
*/
|
|
80
|
+
/** Produces the header value, `sha256=<hex>`, not the bare digest. */
|
|
120
81
|
protected sign(secret: string, body: string): string;
|
|
121
|
-
/**
|
|
122
|
-
* Verify a signature produced by {@link WebhookService.sign} — for
|
|
123
|
-
* receivers, which share the signing scheme.
|
|
124
|
-
*/
|
|
82
|
+
/** Public because receivers verify with it; they share the signing scheme. */
|
|
125
83
|
verify(secret: string, signature: string, body: string): boolean;
|
|
126
84
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
* implementation (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides it.
|
|
85
|
+
* The three methods below are optional capability: the default queue-only
|
|
86
|
+
* service keeps no history and throws, and a store-backed implementation
|
|
87
|
+
* (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides them.
|
|
131
88
|
*/
|
|
132
89
|
recordAttempt(_deliveryId: string, _result: WebhookAttemptResult): Promise<void>;
|
|
133
|
-
/**
|
|
90
|
+
/** Most recent first. */
|
|
134
91
|
listDeliveries(_opts?: {
|
|
135
92
|
organizationId?: string;
|
|
136
93
|
limit?: number;
|
|
137
94
|
}): Promise<WebhookDeliveryRecord[]>;
|
|
138
|
-
/** A single delivery with its attempt history, or null if unknown. */
|
|
139
95
|
getDelivery(_deliveryId: string): Promise<WebhookDeliveryWithAttempts | null>;
|
|
140
96
|
}
|
|
@@ -2,42 +2,28 @@ import { NotImplementedError } from '../errors/errors.js';
|
|
|
2
2
|
import { hmacSha256Hex, timingSafeStringEqual } from '../utils/hmac.js';
|
|
3
3
|
export const PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME = 'pikku-outgoing-webhooks';
|
|
4
4
|
export const DEFAULT_WEBHOOK_SIGNATURE_HEADER = 'X-Pikku-Signature';
|
|
5
|
-
/** Fallback when neither the per-call nor `config.webhook.retries` is set. */
|
|
6
5
|
export const DEFAULT_WEBHOOK_RETRIES = 3;
|
|
7
|
-
/**
|
|
8
|
-
* Outgoing webhook delivery. {@link QueueWebhookService} is the default
|
|
9
|
-
* implementation; apps can extend this to deliver directly, or through a
|
|
10
|
-
* provider such as Svix.
|
|
11
|
-
*/
|
|
12
6
|
export class WebhookService {
|
|
13
|
-
/**
|
|
14
|
-
* Sign a body with HMAC-SHA256, producing the signature header value
|
|
15
|
-
* (e.g. `sha256=abc123...`).
|
|
16
|
-
*/
|
|
7
|
+
/** Produces the header value, `sha256=<hex>`, not the bare digest. */
|
|
17
8
|
sign(secret, body) {
|
|
18
9
|
return `sha256=${hmacSha256Hex(secret, body)}`;
|
|
19
10
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Verify a signature produced by {@link WebhookService.sign} — for
|
|
22
|
-
* receivers, which share the signing scheme.
|
|
23
|
-
*/
|
|
11
|
+
/** Public because receivers verify with it; they share the signing scheme. */
|
|
24
12
|
verify(secret, signature, body) {
|
|
25
13
|
return timingSafeStringEqual(this.sign(secret, body), signature);
|
|
26
14
|
}
|
|
27
15
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* implementation (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides it.
|
|
16
|
+
* The three methods below are optional capability: the default queue-only
|
|
17
|
+
* service keeps no history and throws, and a store-backed implementation
|
|
18
|
+
* (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides them.
|
|
32
19
|
*/
|
|
33
20
|
recordAttempt(_deliveryId, _result) {
|
|
34
21
|
throw new NotImplementedError('webhook delivery persistence is not configured');
|
|
35
22
|
}
|
|
36
|
-
/**
|
|
23
|
+
/** Most recent first. */
|
|
37
24
|
listDeliveries(_opts) {
|
|
38
25
|
throw new NotImplementedError('webhook delivery persistence is not configured');
|
|
39
26
|
}
|
|
40
|
-
/** A single delivery with its attempt history, or null if unknown. */
|
|
41
27
|
getDelivery(_deliveryId) {
|
|
42
28
|
throw new NotImplementedError('webhook delivery persistence is not configured');
|
|
43
29
|
}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import type { SerializedError } from '../types/core.types.js';
|
|
2
2
|
import type { WorkflowRun, WorkflowPlannedStep, WorkflowRunWire, WorkflowRunStatus, StepState, WorkflowStatus, WorkflowVersionStatus } from '../wirings/workflow/workflow.types.js';
|
|
3
3
|
import type { RunTimeline, ReconstructedRunState } from '../wirings/workflow/run-timeline.js';
|
|
4
|
-
/**
|
|
5
|
-
* Interface for workflow orchestration
|
|
6
|
-
* Handles workflow execution, replay, orchestration logic, and run-level state
|
|
7
|
-
*/
|
|
8
4
|
export interface WorkflowService {
|
|
9
5
|
wireQueueWorkers?(): void;
|
|
10
6
|
createRun(workflowName: string, input: any, inline: boolean, graphHash: string, wire: WorkflowRunWire, options?: {
|
|
@@ -23,10 +19,8 @@ export interface WorkflowService {
|
|
|
23
19
|
close(): Promise<void>;
|
|
24
20
|
resumeWorkflow(runId: string): Promise<void>;
|
|
25
21
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* workflow body — so an invalid one re-closes the gate rather than failing the
|
|
29
|
-
* run. `reason` addresses the gate's first reach.
|
|
22
|
+
* The payload is stored as given and validated on replay inside the workflow
|
|
23
|
+
* body, so an invalid one re-closes the gate rather than failing the run.
|
|
30
24
|
*/
|
|
31
25
|
approveStep(runId: string, reason: string, decision: unknown): Promise<void>;
|
|
32
26
|
startWorkflow<I>(name: string, input: I, wire: WorkflowRunWire, rpcService: any, options?: {
|
|
@@ -35,13 +29,7 @@ export interface WorkflowService {
|
|
|
35
29
|
}): Promise<{
|
|
36
30
|
runId: string;
|
|
37
31
|
}>;
|
|
38
|
-
/**
|
|
39
|
-
* Start a run and wait for it to end.
|
|
40
|
-
*
|
|
41
|
-
* `pollIntervalMs` is the ceiling on the wait between reads of the run, not a
|
|
42
|
-
* fixed cadence: polling starts far shorter than this and widens towards it,
|
|
43
|
-
* so a run that finishes quickly is not held for a whole interval.
|
|
44
|
-
*/
|
|
32
|
+
/** `pollIntervalMs` is a CEILING on the wait between reads, not a cadence. */
|
|
45
33
|
runToCompletion<I>(name: string, input: I, rpcService: any, options?: {
|
|
46
34
|
pollIntervalMs?: number;
|
|
47
35
|
wire?: WorkflowRunWire;
|
|
@@ -54,20 +54,16 @@ export function defineServiceTests(config) {
|
|
|
54
54
|
channelId: 'ch-state',
|
|
55
55
|
channelName: 'test-channel',
|
|
56
56
|
});
|
|
57
|
-
// initially undefined
|
|
58
57
|
const empty = await store.getState('ch-state');
|
|
59
58
|
assert.equal(empty, undefined);
|
|
60
|
-
// set + get
|
|
61
59
|
const payload = { userId: 'u-7', meta: { foo: 1 } };
|
|
62
60
|
await store.setState('ch-state', payload);
|
|
63
61
|
const got = await store.getState('ch-state');
|
|
64
62
|
assert.deepEqual(got, payload);
|
|
65
|
-
// overwrite
|
|
66
63
|
const next = { userId: 'u-8' };
|
|
67
64
|
await store.setState('ch-state', next);
|
|
68
65
|
const got2 = await store.getState('ch-state');
|
|
69
66
|
assert.deepEqual(got2, next);
|
|
70
|
-
// clear
|
|
71
67
|
await store.clearState('ch-state');
|
|
72
68
|
const after = await store.getState('ch-state');
|
|
73
69
|
assert.equal(after, undefined);
|
|
@@ -210,19 +206,6 @@ export function defineServiceTests(config) {
|
|
|
210
206
|
assert.equal(flaky.status, 'succeeded', 'latest attempt wins');
|
|
211
207
|
assert.equal(flaky.attempts, 2, 'attempt count surfaces in status');
|
|
212
208
|
});
|
|
213
|
-
test('getNodesWithoutSteps', async () => {
|
|
214
|
-
const runId = await service.createRun('graph-workflow', {}, false, 'hash-7', wire);
|
|
215
|
-
await service.insertStepState(runId, 'existing-node', 'rpc', {});
|
|
216
|
-
const missing = await service.getNodesWithoutSteps(runId, [
|
|
217
|
-
'existing-node',
|
|
218
|
-
'missing-node',
|
|
219
|
-
]);
|
|
220
|
-
assert.deepEqual(missing, ['missing-node']);
|
|
221
|
-
});
|
|
222
|
-
test('getNodesWithoutSteps with empty array', async () => {
|
|
223
|
-
const result = await service.getNodesWithoutSteps('any-id', []);
|
|
224
|
-
assert.deepEqual(result, []);
|
|
225
|
-
});
|
|
226
209
|
test('getNodeResults', async () => {
|
|
227
210
|
const runId = await service.createRun('results-workflow', {}, false, 'hash-8', wire);
|
|
228
211
|
const step = await service.insertStepState(runId, 'node-a', 'rpc', {});
|
package/dist/time-utils.d.ts
CHANGED
|
@@ -4,23 +4,7 @@ export interface RelativeTimeInput {
|
|
|
4
4
|
unit: TimeUnit;
|
|
5
5
|
}
|
|
6
6
|
export declare const getRelativeTimeOffset: ({ value, unit, }: RelativeTimeInput) => number;
|
|
7
|
-
/**
|
|
8
|
-
* Returns a Unix timestamp (in seconds) offset from now by the given duration.
|
|
9
|
-
* e.g. value = -1 and unit = 'day' => 1 day ago => now - 86400 seconds
|
|
10
|
-
*/
|
|
11
7
|
export declare const getRelativeTimeOffsetFromNow: (relativeTime: RelativeTimeInput) => Date;
|
|
12
|
-
/**
|
|
13
|
-
* Get duration in milliseconds from a string or number
|
|
14
|
-
* @param duration
|
|
15
|
-
* @returns
|
|
16
|
-
*/
|
|
17
8
|
export declare const getDurationInMilliseconds: (duration: string | number) => number;
|
|
18
|
-
/**
|
|
19
|
-
* Parse a duration string to milliseconds
|
|
20
|
-
* Supports formats like: '2s', '5s', '5sec', '5seconds', '5m', '5min', '5minutes', '1h', '1hour', '2d', '2day', '1w', '1week'
|
|
21
|
-
*
|
|
22
|
-
* @param duration - Duration string (e.g., '2s', '5min', '2hours', '1day')
|
|
23
|
-
* @returns Duration in milliseconds
|
|
24
|
-
*/
|
|
25
9
|
export declare const parseDurationString: (duration: string) => number;
|
|
26
10
|
export {};
|
package/dist/time-utils.js
CHANGED
|
@@ -7,33 +7,17 @@ const multipliers = {
|
|
|
7
7
|
year: Math.round(365.25 * 60 * 60 * 24),
|
|
8
8
|
};
|
|
9
9
|
export const getRelativeTimeOffset = ({ value, unit, }) => {
|
|
10
|
-
return Math.round(value * multipliers[unit]) * 1000;
|
|
10
|
+
return Math.round(value * multipliers[unit]) * 1000;
|
|
11
11
|
};
|
|
12
|
-
/**
|
|
13
|
-
* Returns a Unix timestamp (in seconds) offset from now by the given duration.
|
|
14
|
-
* e.g. value = -1 and unit = 'day' => 1 day ago => now - 86400 seconds
|
|
15
|
-
*/
|
|
16
12
|
export const getRelativeTimeOffsetFromNow = (relativeTime) => {
|
|
17
13
|
return new Date(Date.now() + getRelativeTimeOffset(relativeTime));
|
|
18
14
|
};
|
|
19
|
-
/**
|
|
20
|
-
* Get duration in milliseconds from a string or number
|
|
21
|
-
* @param duration
|
|
22
|
-
* @returns
|
|
23
|
-
*/
|
|
24
15
|
export const getDurationInMilliseconds = (duration) => {
|
|
25
16
|
if (typeof duration === 'number') {
|
|
26
17
|
return duration;
|
|
27
18
|
}
|
|
28
19
|
return parseDurationString(duration);
|
|
29
20
|
};
|
|
30
|
-
/**
|
|
31
|
-
* Parse a duration string to milliseconds
|
|
32
|
-
* Supports formats like: '2s', '5s', '5sec', '5seconds', '5m', '5min', '5minutes', '1h', '1hour', '2d', '2day', '1w', '1week'
|
|
33
|
-
*
|
|
34
|
-
* @param duration - Duration string (e.g., '2s', '5min', '2hours', '1day')
|
|
35
|
-
* @returns Duration in milliseconds
|
|
36
|
-
*/
|
|
37
21
|
export const parseDurationString = (duration) => {
|
|
38
22
|
const match = duration.match(/^(\d+)(ms|milliseconds?|s|sec|seconds?|m|min|minutes?|h|hour|hours?|d|day|days?|w|week|weeks?|y|year|years?)$/);
|
|
39
23
|
if (!match) {
|
|
@@ -41,13 +25,11 @@ export const parseDurationString = (duration) => {
|
|
|
41
25
|
}
|
|
42
26
|
const value = parseInt(match[1], 10);
|
|
43
27
|
const unitStr = match[2];
|
|
44
|
-
// Handle milliseconds specially
|
|
45
28
|
if (unitStr === 'ms' ||
|
|
46
29
|
unitStr === 'millisecond' ||
|
|
47
30
|
unitStr === 'milliseconds') {
|
|
48
31
|
return value;
|
|
49
32
|
}
|
|
50
|
-
// Map string variations to TimeUnit
|
|
51
33
|
let unit;
|
|
52
34
|
if (unitStr === 's' ||
|
|
53
35
|
unitStr === 'sec' ||
|