@pikku/core 0.12.72 → 0.12.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1171 -0
- package/dist/column-form.d.ts +32 -0
- package/dist/column-form.js +42 -0
- package/dist/crypto-utils.d.ts +43 -7
- package/dist/crypto-utils.js +163 -42
- package/dist/data-classification.d.ts +44 -0
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +37 -32
- package/dist/function/functions.types.d.ts +57 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/index.d.ts +1 -1
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -13
- package/dist/handle-error.js +0 -18
- package/dist/index.d.ts +11 -5
- package/dist/index.js +7 -2
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +5 -41
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +4 -3
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +9 -8
- package/dist/schema.d.ts +5 -39
- package/dist/schema.js +5 -39
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/secret-value.d.ts +56 -0
- package/dist/secret-value.js +46 -0
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.d.ts +74 -4
- package/dist/services/audit-service.js +8 -7
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/credential-wire-service.d.ts +5 -0
- package/dist/services/credential-wire-service.js +9 -1
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/email-service.d.ts +2 -1
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +8 -9
- package/dist/services/index.js +3 -6
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content-request-handler.d.ts +29 -0
- package/dist/services/local-content-request-handler.js +176 -0
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +4 -7
- package/dist/services/local-secrets.js +7 -7
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +22 -40
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +10 -42
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +4 -7
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +12 -35
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +5 -11
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +21 -64
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +6 -23
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +120 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +46 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +65 -132
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +63 -22
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +180 -64
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +124 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +59 -1
- package/dist/wirings/ai-agent/voice-input.js +90 -12
- package/dist/wirings/ai-agent/voice-output.d.ts +69 -1
- package/dist/wirings/ai-agent/voice-output.js +162 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +38 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +129 -0
- package/dist/wirings/cli/channel/index.d.ts +5 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +0 -99
- package/dist/wirings/http/http-runner.js +9 -165
- package/dist/wirings/http/http.types.d.ts +14 -55
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +0 -40
- package/dist/wirings/http/pikku-fetch-http-request.js +0 -58
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -4
- package/dist/wirings/mcp/mcp-runner.js +1 -14
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +32 -0
- package/dist/wirings/persona/define-personas.js +31 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +136 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +103 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +20 -90
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +17 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +3 -13
- package/dist/wirings/rpc/remote-addon-auth.js +7 -11
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +30 -0
- package/dist/wirings/virtual-user/index.js +10 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +54 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +49 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.d.ts +90 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +19 -15
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -43
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +1 -19
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +84 -12
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +5 -195
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +48 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +84 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +41 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +117 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +53 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +48 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/validate-checks-personas-through-a-shared-module.md +43 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +6 -2
- package/run-tests.sh +0 -0
- package/src/column-form.test.ts +97 -0
- package/src/column-form.ts +58 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +306 -59
- package/src/data-classification.ts +45 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +0 -7
- package/src/function/function-runner.ts +62 -32
- package/src/function/functions.types.ts +95 -138
- package/src/function/index.ts +1 -0
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/handle-error.ts +0 -18
- package/src/index.ts +84 -3
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +3 -5
- package/src/middleware/auth-bearer.ts +5 -41
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +26 -10
- package/src/middleware/remote-auth.ts +11 -3
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +173 -0
- package/src/remote.ts +18 -8
- package/src/schema.ts +5 -39
- package/src/scopes.ts +7 -48
- package/src/secret-value.test.ts +204 -0
- package/src/secret-value.ts +111 -0
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +88 -11
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/credential-wire-service.ts +9 -1
- package/src/services/deployment-service.ts +3 -9
- package/src/services/email-service.ts +3 -1
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +23 -18
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content-request-handler.test.ts +202 -0
- package/src/services/local-content-request-handler.ts +267 -0
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.test.ts +20 -5
- package/src/services/local-secrets.ts +15 -11
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +31 -46
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.test.ts +2 -1
- package/src/services/queue-webhook-service.ts +10 -42
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +4 -7
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +12 -35
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +12 -14
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +23 -64
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +6 -32
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +137 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +91 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +49 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +89 -139
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +85 -35
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +224 -76
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +130 -5
- package/src/wirings/ai-agent/index.ts +37 -3
- package/src/wirings/ai-agent/voice-input.test.ts +137 -7
- package/src/wirings/ai-agent/voice-input.ts +96 -12
- package/src/wirings/ai-agent/voice-output.test.ts +512 -0
- package/src/wirings/ai-agent/voice-output.ts +243 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +185 -0
- package/src/wirings/cli/channel/index.ts +13 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +8 -167
- package/src/wirings/http/http.types.ts +15 -62
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +2 -10
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -58
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.ts +2 -17
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +33 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +142 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +454 -0
- package/src/wirings/queue/queue-identity.ts +176 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +25 -90
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +60 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +9 -16
- package/src/wirings/rpc/rpc-runner.test.ts +192 -6
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +88 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +115 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +95 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-run-store.ts +98 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +19 -20
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -61
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.test.ts +5 -7
- package/src/wirings/workflow/scenario-prose.ts +1 -29
- package/src/wirings/workflow/scenario-service.test.ts +2 -10
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +163 -19
- package/src/wirings/workflow/scenario-step.types.ts +94 -12
- package/src/wirings/workflow/scenario-surface.test.ts +146 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +5 -201
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +12 -0
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SystemRoleImmutableError,
|
|
3
|
+
SystemRoleShadowedError,
|
|
4
|
+
} from '../errors/errors.js'
|
|
5
|
+
import type { Role } from './scope-service.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The guards a {@link ScopeService} implementation must apply before mutating
|
|
9
|
+
* a role.
|
|
10
|
+
*
|
|
11
|
+
* Shared rather than left to each implementation because the rule is a
|
|
12
|
+
* contract, not a policy: a store that lets the console delete `buyer` makes
|
|
13
|
+
* every persona and scenario written against `buyer` silently stop testing
|
|
14
|
+
* what it claims to, and nothing fails at the point of the mistake. Two
|
|
15
|
+
* implementations disagreeing about that would be worse than either rule.
|
|
16
|
+
*
|
|
17
|
+
* `isSystemRole` is passed in rather than a role list, so an implementation can
|
|
18
|
+
* answer it from a column, a cached set, or a query, whichever is cheap.
|
|
19
|
+
*/
|
|
20
|
+
export type IsSystemRole = (name: string) => boolean | Promise<boolean>
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Refuses a destructive or re-scoping operation against a declared role.
|
|
24
|
+
*
|
|
25
|
+
* @param operation a verb phrase for the message, e.g. `'delete role'`.
|
|
26
|
+
*/
|
|
27
|
+
export const assertRoleIsMutable = async (
|
|
28
|
+
name: string,
|
|
29
|
+
isSystemRole: IsSystemRole,
|
|
30
|
+
operation: string
|
|
31
|
+
): Promise<void> => {
|
|
32
|
+
if (await isSystemRole(name)) {
|
|
33
|
+
throw new SystemRoleImmutableError(name, operation)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Refuses a new custom role that would shadow a declared one.
|
|
39
|
+
*/
|
|
40
|
+
export const assertRoleNameAvailable = async (
|
|
41
|
+
name: string,
|
|
42
|
+
isSystemRole: IsSystemRole
|
|
43
|
+
): Promise<void> => {
|
|
44
|
+
if (await isSystemRole(name)) {
|
|
45
|
+
throw new SystemRoleShadowedError(name)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Why the console must render a role as locked, or `null` when it is editable.
|
|
51
|
+
*
|
|
52
|
+
* Returned rather than a boolean so the UI shows a reason instead of a
|
|
53
|
+
* disabled button with no explanation — the difference between a user filing a
|
|
54
|
+
* bug and a user editing the declaration.
|
|
55
|
+
*/
|
|
56
|
+
export const roleLockReason = (role: Role): string | null => {
|
|
57
|
+
if (!role.system) {
|
|
58
|
+
return null
|
|
59
|
+
}
|
|
60
|
+
if (role.declared === false) {
|
|
61
|
+
return (
|
|
62
|
+
`'${role.name}' was declared in code and that declaration has been removed. ` +
|
|
63
|
+
`It is inert: still held by its current members, not offered for new grants. ` +
|
|
64
|
+
`Run 'pikku roles prune' to remove it.`
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
return (
|
|
68
|
+
`'${role.name}' is declared in code with defineSystemRole. ` +
|
|
69
|
+
`Edit the declaration to change what it grants.`
|
|
70
|
+
)
|
|
71
|
+
}
|
|
@@ -1,17 +1,5 @@
|
|
|
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
3
|
|
|
13
|
-
/**
|
|
14
|
-
* Stop all triggers
|
|
15
|
-
*/
|
|
16
4
|
stop(): Promise<void>
|
|
17
5
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { SecretValue } from '../secret-value.js'
|
|
2
|
+
import type { SecretService, SecretValues } from './secret-service.js'
|
|
2
3
|
|
|
3
4
|
export interface CredentialStatus {
|
|
4
5
|
secretId: string
|
|
@@ -17,13 +18,7 @@ export type CredentialMeta = {
|
|
|
17
18
|
export class TypedSecretService<
|
|
18
19
|
TMap = Record<string, unknown>,
|
|
19
20
|
> implements SecretService {
|
|
20
|
-
|
|
21
|
-
* In-process cache of resolved secrets, so callers can read naively without
|
|
22
|
-
* re-hitting the underlying service on every call. Only successful reads are
|
|
23
|
-
* cached (a miss throws and isn't stored); `setSecret`/`deleteSecret`
|
|
24
|
-
* invalidate the key. No TTL — a secret rotated out-of-band won't refresh
|
|
25
|
-
* until restart (see pikkujs/pikku#964).
|
|
26
|
-
*/
|
|
21
|
+
// knowledge: decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md
|
|
27
22
|
private cache = new Map<string, unknown>()
|
|
28
23
|
|
|
29
24
|
constructor(
|
|
@@ -31,8 +26,10 @@ export class TypedSecretService<
|
|
|
31
26
|
private credentialsMeta: Record<string, CredentialMeta>
|
|
32
27
|
) {}
|
|
33
28
|
|
|
34
|
-
async getSecret<K extends keyof TMap & string>(
|
|
35
|
-
|
|
29
|
+
async getSecret<K extends keyof TMap & string>(
|
|
30
|
+
key: K
|
|
31
|
+
): Promise<SecretValue<TMap[K]>>
|
|
32
|
+
async getSecret<T = string>(key: string): Promise<SecretValue<T>>
|
|
36
33
|
async getSecret(key: string): Promise<unknown> {
|
|
37
34
|
if (this.cache.has(key)) {
|
|
38
35
|
return this.cache.get(key)
|
|
@@ -64,12 +61,12 @@ export class TypedSecretService<
|
|
|
64
61
|
|
|
65
62
|
async getSecrets<T extends Record<string, unknown> = Record<string, unknown>>(
|
|
66
63
|
keys: (keyof T & string)[]
|
|
67
|
-
): Promise<Partial<T
|
|
68
|
-
const result: Partial<T
|
|
64
|
+
): Promise<Partial<SecretValues<T>>> {
|
|
65
|
+
const result: Partial<SecretValues<T>> = {}
|
|
69
66
|
const missing: (keyof T & string)[] = []
|
|
70
67
|
for (const key of keys) {
|
|
71
68
|
if (this.cache.has(key)) {
|
|
72
|
-
result[key] = this.cache.get(key) as T[keyof T & string]
|
|
69
|
+
result[key] = this.cache.get(key) as SecretValues<T>[keyof T & string]
|
|
73
70
|
} else {
|
|
74
71
|
missing.push(key)
|
|
75
72
|
}
|
|
@@ -78,7 +75,8 @@ export class TypedSecretService<
|
|
|
78
75
|
const fetched = await this.secrets.getSecrets<T>(missing)
|
|
79
76
|
for (const [key, value] of Object.entries(fetched)) {
|
|
80
77
|
this.cache.set(key, value)
|
|
81
|
-
result[key as keyof T & string] = value as T[keyof T &
|
|
78
|
+
result[key as keyof T & string] = value as SecretValues<T>[keyof T &
|
|
79
|
+
string]
|
|
82
80
|
}
|
|
83
81
|
}
|
|
84
82
|
return result
|
|
@@ -1,6 +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
|
-
|
|
4
1
|
export interface CoverageRange {
|
|
5
2
|
startOffset: number
|
|
6
3
|
endOffset: number
|
|
@@ -71,9 +68,8 @@ export interface CoverageFunctionMeta {
|
|
|
71
68
|
export interface CoverageService {
|
|
72
69
|
start(): Promise<void>
|
|
73
70
|
takeCoverage(): Promise<CoverageSnapshot>
|
|
74
|
-
/**
|
|
75
|
-
*
|
|
76
|
-
* the runtime only exposes raw snapshots. */
|
|
71
|
+
/** Provided by the process that booted the backend (the pikku CLI); absent
|
|
72
|
+
* when the runtime only exposes raw snapshots. */
|
|
77
73
|
takeReport?(
|
|
78
74
|
functionsMeta: Record<string, CoverageFunctionMeta>
|
|
79
75
|
): Promise<FunctionCoverageReport>
|
|
@@ -113,6 +109,7 @@ export class V8CoverageService implements CoverageService {
|
|
|
113
109
|
}
|
|
114
110
|
|
|
115
111
|
private async doStart(): Promise<void> {
|
|
112
|
+
// knowledge: decisions/internals/node-only-builtins-are-imported-dynamically.md
|
|
116
113
|
const inspector = await import('node:inspector')
|
|
117
114
|
this.session = new inspector.Session() as unknown as InspectorSession
|
|
118
115
|
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>>(
|
|
12
5
|
names: (keyof T & string)[]
|
|
13
6
|
): Promise<Partial<T>> | Partial<T>
|
|
@@ -1,32 +1,20 @@
|
|
|
1
1
|
import { NotImplementedError } from '../errors/errors.js'
|
|
2
2
|
import { hmacSha256Hex, timingSafeStringEqual } from '../utils/hmac.js'
|
|
3
|
+
import type { Safe } from '../secret-value.js'
|
|
3
4
|
|
|
4
5
|
export interface SendWebhookInput {
|
|
5
|
-
/** The endpoint the webhook is delivered to via HTTP POST. */
|
|
6
6
|
url: string
|
|
7
|
-
/**
|
|
7
|
+
/** Sent as the `X-Pikku-Event` header. */
|
|
8
8
|
event?: string
|
|
9
|
-
/** The payload, JSON-serialized into the request body. */
|
|
10
9
|
data: unknown
|
|
11
|
-
/** Extra headers merged over the defaults. */
|
|
12
10
|
headers?: Record<string, string>
|
|
13
|
-
/**
|
|
14
|
-
* Raw HMAC signing key for this delivery. Overrides the config-level
|
|
15
|
-
* secret. When present, the body is signed into the signature header.
|
|
16
|
-
*/
|
|
11
|
+
/** A raw HMAC key, not a secret name — overrides `config.webhook.secret`. */
|
|
17
12
|
secret?: string
|
|
18
|
-
/**
|
|
13
|
+
/** Overrides `config.webhook.retries`. */
|
|
19
14
|
retries?: number
|
|
20
|
-
/**
|
|
21
|
-
* Delay between retries (`30000` or `'30s'`). A concrete value selects a
|
|
22
|
-
* fixed backoff; when omitted, backoff is exponential.
|
|
23
|
-
*/
|
|
15
|
+
/** A concrete delay (`30000` or `'30s'`) selects fixed backoff; omitted means exponential. */
|
|
24
16
|
retryDelay?: string | number
|
|
25
|
-
/**
|
|
26
|
-
* Organization this delivery belongs to. Persisted by a store-backed
|
|
27
|
-
* implementation (e.g. `KyselyWebhookService`) so deliveries can be
|
|
28
|
-
* queried per org; ignored by the queue-only default.
|
|
29
|
-
*/
|
|
17
|
+
/** Persisted only by store-backed implementations; the queue-only default ignores it. */
|
|
30
18
|
organizationId?: string
|
|
31
19
|
}
|
|
32
20
|
|
|
@@ -35,25 +23,15 @@ export interface SendWebhookResult {
|
|
|
35
23
|
}
|
|
36
24
|
|
|
37
25
|
export interface WebhookServiceConfig {
|
|
38
|
-
/** Default retry count for failed deliveries. */
|
|
39
26
|
retries?: number
|
|
40
|
-
/**
|
|
27
|
+
/** Omitted means exponential backoff. */
|
|
41
28
|
retryDelay?: string | number
|
|
42
|
-
/**
|
|
43
|
-
* Name of a secret (resolved through the secret service) used as the
|
|
44
|
-
* default HMAC signing key for all outgoing webhooks.
|
|
45
|
-
*/
|
|
29
|
+
/** A secret *name* resolved through the secret service, unlike `SendWebhookInput.secret`. */
|
|
46
30
|
secret?: string
|
|
47
|
-
/**
|
|
48
|
-
* Header the body signature is sent in. Defaults to
|
|
49
|
-
* {@link DEFAULT_WEBHOOK_SIGNATURE_HEADER}.
|
|
50
|
-
*/
|
|
51
31
|
signatureHeader?: string
|
|
52
32
|
/**
|
|
53
|
-
* SSRF allowlist
|
|
54
|
-
*
|
|
55
|
-
* internal hosts (loopback, private ranges, cloud metadata) are blocked and
|
|
56
|
-
* all other public hosts are permitted.
|
|
33
|
+
* SSRF allowlist. Set: only these hostnames may be delivered to. Omitted:
|
|
34
|
+
* private/internal hosts are blocked and every other public host is allowed.
|
|
57
35
|
*/
|
|
58
36
|
allowedHosts?: string[]
|
|
59
37
|
}
|
|
@@ -64,26 +42,21 @@ export interface WebhookJobData {
|
|
|
64
42
|
body: string
|
|
65
43
|
headers: Record<string, string>
|
|
66
44
|
/**
|
|
67
|
-
*
|
|
68
|
-
* the
|
|
69
|
-
* the queue `jobId`), so it's stable across retries.
|
|
45
|
+
* Present only when a store-backed implementation enqueued the job. Doubles
|
|
46
|
+
* as the queue `jobId`, so it is stable across retries.
|
|
70
47
|
*/
|
|
71
48
|
deliveryId?: string
|
|
72
49
|
}
|
|
73
50
|
|
|
74
|
-
/** Outcome of one delivery attempt, recorded against a delivery. */
|
|
75
51
|
export interface WebhookAttemptResult {
|
|
76
|
-
/**
|
|
52
|
+
/** Absent when the request never completed. */
|
|
77
53
|
statusCode?: number
|
|
78
|
-
/**
|
|
54
|
+
/** Truncated; captured on failure only. */
|
|
79
55
|
responseBody?: string
|
|
80
|
-
/** Network/timeout error message, when the request threw. */
|
|
81
56
|
error?: string
|
|
82
|
-
/** Whether this attempt was a 2xx success. */
|
|
83
57
|
delivered: boolean
|
|
84
58
|
}
|
|
85
59
|
|
|
86
|
-
/** A persisted webhook delivery, as surfaced to the console. */
|
|
87
60
|
export interface WebhookDeliveryRecord {
|
|
88
61
|
deliveryId: string
|
|
89
62
|
organizationId: string | null
|
|
@@ -96,7 +69,6 @@ export interface WebhookDeliveryRecord {
|
|
|
96
69
|
deliveredAt: Date | null
|
|
97
70
|
}
|
|
98
71
|
|
|
99
|
-
/** A single persisted delivery attempt. */
|
|
100
72
|
export interface WebhookAttemptRecord {
|
|
101
73
|
attemptId: string
|
|
102
74
|
deliveryId: string
|
|
@@ -107,7 +79,6 @@ export interface WebhookAttemptRecord {
|
|
|
107
79
|
createdAt: Date
|
|
108
80
|
}
|
|
109
81
|
|
|
110
|
-
/** A delivery with its full attempt history. */
|
|
111
82
|
export interface WebhookDeliveryWithAttempts {
|
|
112
83
|
delivery: WebhookDeliveryRecord
|
|
113
84
|
attempts: WebhookAttemptRecord[]
|
|
@@ -117,38 +88,27 @@ export const PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME = 'pikku-outgoing-webhooks'
|
|
|
117
88
|
|
|
118
89
|
export const DEFAULT_WEBHOOK_SIGNATURE_HEADER = 'X-Pikku-Signature'
|
|
119
90
|
|
|
120
|
-
/** Fallback when neither the per-call nor `config.webhook.retries` is set. */
|
|
121
91
|
export const DEFAULT_WEBHOOK_RETRIES = 3
|
|
122
92
|
|
|
123
|
-
/**
|
|
124
|
-
* Outgoing webhook delivery. {@link QueueWebhookService} is the default
|
|
125
|
-
* implementation; apps can extend this to deliver directly, or through a
|
|
126
|
-
* provider such as Svix.
|
|
127
|
-
*/
|
|
128
93
|
export abstract class WebhookService {
|
|
129
|
-
abstract send
|
|
94
|
+
abstract send<T extends SendWebhookInput>(
|
|
95
|
+
input: Safe<T>
|
|
96
|
+
): Promise<SendWebhookResult>
|
|
130
97
|
|
|
131
|
-
/**
|
|
132
|
-
* Sign a body with HMAC-SHA256, producing the signature header value
|
|
133
|
-
* (e.g. `sha256=abc123...`).
|
|
134
|
-
*/
|
|
98
|
+
/** Produces the header value, `sha256=<hex>`, not the bare digest. */
|
|
135
99
|
protected sign(secret: string, body: string): string {
|
|
136
100
|
return `sha256=${hmacSha256Hex(secret, body)}`
|
|
137
101
|
}
|
|
138
102
|
|
|
139
|
-
/**
|
|
140
|
-
* Verify a signature produced by {@link WebhookService.sign} — for
|
|
141
|
-
* receivers, which share the signing scheme.
|
|
142
|
-
*/
|
|
103
|
+
/** Public because receivers verify with it; they share the signing scheme. */
|
|
143
104
|
public verify(secret: string, signature: string, body: string): boolean {
|
|
144
105
|
return timingSafeStringEqual(this.sign(secret, body), signature)
|
|
145
106
|
}
|
|
146
107
|
|
|
147
108
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
* implementation (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides it.
|
|
109
|
+
* The three methods below are optional capability: the default queue-only
|
|
110
|
+
* service keeps no history and throws, and a store-backed implementation
|
|
111
|
+
* (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides them.
|
|
152
112
|
*/
|
|
153
113
|
public recordAttempt(
|
|
154
114
|
_deliveryId: string,
|
|
@@ -159,7 +119,7 @@ export abstract class WebhookService {
|
|
|
159
119
|
)
|
|
160
120
|
}
|
|
161
121
|
|
|
162
|
-
/**
|
|
122
|
+
/** Most recent first. */
|
|
163
123
|
public listDeliveries(_opts?: {
|
|
164
124
|
organizationId?: string
|
|
165
125
|
limit?: number
|
|
@@ -169,7 +129,6 @@ export abstract class WebhookService {
|
|
|
169
129
|
)
|
|
170
130
|
}
|
|
171
131
|
|
|
172
|
-
/** A single delivery with its attempt history, or null if unknown. */
|
|
173
132
|
public getDelivery(
|
|
174
133
|
_deliveryId: string
|
|
175
134
|
): Promise<WebhookDeliveryWithAttempts | null> {
|
|
@@ -13,13 +13,8 @@ import type {
|
|
|
13
13
|
ReconstructedRunState,
|
|
14
14
|
} from '../wirings/workflow/run-timeline.js'
|
|
15
15
|
|
|
16
|
-
/**
|
|
17
|
-
* Interface for workflow orchestration
|
|
18
|
-
* Handles workflow execution, replay, orchestration logic, and run-level state
|
|
19
|
-
*/
|
|
20
16
|
export interface WorkflowService {
|
|
21
17
|
wireQueueWorkers?(): void
|
|
22
|
-
// Run-level state operations
|
|
23
18
|
createRun(
|
|
24
19
|
workflowName: string,
|
|
25
20
|
input: any,
|
|
@@ -48,13 +43,10 @@ export interface WorkflowService {
|
|
|
48
43
|
withRunLock<T>(id: string, fn: () => Promise<T>): Promise<T>
|
|
49
44
|
close(): Promise<void>
|
|
50
45
|
|
|
51
|
-
// Orchestration operations
|
|
52
46
|
resumeWorkflow(runId: string): Promise<void>
|
|
53
47
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* workflow body — so an invalid one re-closes the gate rather than failing the
|
|
57
|
-
* run. `reason` addresses the gate's first reach.
|
|
48
|
+
* The payload is stored as given and validated on replay inside the workflow
|
|
49
|
+
* body, so an invalid one re-closes the gate rather than failing the run.
|
|
58
50
|
*/
|
|
59
51
|
approveStep(runId: string, reason: string, decision: unknown): Promise<void>
|
|
60
52
|
startWorkflow<I>(
|
|
@@ -64,13 +56,7 @@ export interface WorkflowService {
|
|
|
64
56
|
rpcService: any,
|
|
65
57
|
options?: { inline?: boolean; startNode?: string }
|
|
66
58
|
): Promise<{ runId: string }>
|
|
67
|
-
/**
|
|
68
|
-
* Start a run and wait for it to end.
|
|
69
|
-
*
|
|
70
|
-
* `pollIntervalMs` is the ceiling on the wait between reads of the run, not a
|
|
71
|
-
* fixed cadence: polling starts far shorter than this and widens towards it,
|
|
72
|
-
* so a run that finishes quickly is not held for a whole interval.
|
|
73
|
-
*/
|
|
59
|
+
/** `pollIntervalMs` is a CEILING on the wait between reads, not a cadence. */
|
|
74
60
|
runToCompletion<I>(
|
|
75
61
|
name: string,
|
|
76
62
|
input: I,
|
|
@@ -81,7 +67,6 @@ export interface WorkflowService {
|
|
|
81
67
|
orchestrateWorkflow(runId: string, rpcService: any): Promise<void>
|
|
82
68
|
executeWorkflowSleepCompleted(runId: string, stepId: string): Promise<void>
|
|
83
69
|
|
|
84
|
-
// Step-level state operations
|
|
85
70
|
insertStepState(
|
|
86
71
|
runId: string,
|
|
87
72
|
stepName: string,
|
|
@@ -100,7 +85,6 @@ export interface WorkflowService {
|
|
|
100
85
|
status: 'pending' | 'running'
|
|
101
86
|
): Promise<StepState>
|
|
102
87
|
|
|
103
|
-
// Step execution
|
|
104
88
|
executeWorkflowStep(
|
|
105
89
|
runId: string,
|
|
106
90
|
stepName: string,
|
|
@@ -109,7 +93,6 @@ export interface WorkflowService {
|
|
|
109
93
|
rpcService: any
|
|
110
94
|
): Promise<void>
|
|
111
95
|
|
|
112
|
-
// Version operations
|
|
113
96
|
upsertWorkflowVersion(
|
|
114
97
|
name: string,
|
|
115
98
|
graphHash: string,
|
|
@@ -109,23 +109,19 @@ export function defineServiceTests(config: ServiceTestConfig): void {
|
|
|
109
109
|
channelName: 'test-channel',
|
|
110
110
|
})
|
|
111
111
|
|
|
112
|
-
// initially undefined
|
|
113
112
|
const empty = await store.getState('ch-state')
|
|
114
113
|
assert.equal(empty, undefined)
|
|
115
114
|
|
|
116
|
-
// set + get
|
|
117
115
|
const payload = { userId: 'u-7', meta: { foo: 1 } }
|
|
118
116
|
await store.setState('ch-state', payload)
|
|
119
117
|
const got = await store.getState('ch-state')
|
|
120
118
|
assert.deepEqual(got, payload)
|
|
121
119
|
|
|
122
|
-
// overwrite
|
|
123
120
|
const next = { userId: 'u-8' }
|
|
124
121
|
await store.setState('ch-state', next)
|
|
125
122
|
const got2 = await store.getState('ch-state')
|
|
126
123
|
assert.deepEqual(got2, next)
|
|
127
124
|
|
|
128
|
-
// clear
|
|
129
125
|
await store.clearState('ch-state')
|
|
130
126
|
const after = await store.getState('ch-state')
|
|
131
127
|
assert.equal(after, undefined)
|
|
@@ -385,28 +381,6 @@ export function defineServiceTests(config: ServiceTestConfig): void {
|
|
|
385
381
|
assert.equal(flaky.attempts, 2, 'attempt count surfaces in status')
|
|
386
382
|
})
|
|
387
383
|
|
|
388
|
-
test('getNodesWithoutSteps', async () => {
|
|
389
|
-
const runId = await service.createRun(
|
|
390
|
-
'graph-workflow',
|
|
391
|
-
{},
|
|
392
|
-
false,
|
|
393
|
-
'hash-7',
|
|
394
|
-
wire
|
|
395
|
-
)
|
|
396
|
-
await service.insertStepState(runId, 'existing-node', 'rpc', {})
|
|
397
|
-
|
|
398
|
-
const missing = await service.getNodesWithoutSteps(runId, [
|
|
399
|
-
'existing-node',
|
|
400
|
-
'missing-node',
|
|
401
|
-
])
|
|
402
|
-
assert.deepEqual(missing, ['missing-node'])
|
|
403
|
-
})
|
|
404
|
-
|
|
405
|
-
test('getNodesWithoutSteps with empty array', async () => {
|
|
406
|
-
const result = await service.getNodesWithoutSteps('any-id', [])
|
|
407
|
-
assert.deepEqual(result, [])
|
|
408
|
-
})
|
|
409
|
-
|
|
410
384
|
test('getNodeResults', async () => {
|
|
411
385
|
const runId = await service.createRun(
|
|
412
386
|
'results-workflow',
|
|
@@ -857,17 +831,17 @@ export function defineServiceTests(config: ServiceTestConfig): void {
|
|
|
857
831
|
token: string
|
|
858
832
|
endpoint: string
|
|
859
833
|
}>('api-key')
|
|
860
|
-
assert.deepEqual(result, {
|
|
834
|
+
assert.deepEqual(result.reveal(), {
|
|
861
835
|
token: 'sk-123',
|
|
862
836
|
endpoint: 'https://api.example.com',
|
|
863
837
|
})
|
|
864
838
|
})
|
|
865
839
|
|
|
866
|
-
test('getSecret
|
|
840
|
+
test('getSecret wraps the raw string rather than returning it', async () => {
|
|
867
841
|
const service = await factory({ key: kek })
|
|
868
842
|
await service.setSecret('string-secret', 'plain-value')
|
|
869
843
|
const result = await service.getSecret('string-secret')
|
|
870
|
-
assert.strictEqual(result, 'plain-value')
|
|
844
|
+
assert.strictEqual(result.reveal(), 'plain-value')
|
|
871
845
|
})
|
|
872
846
|
|
|
873
847
|
test('hasSecret returns true/false', async () => {
|
|
@@ -888,7 +862,7 @@ export function defineServiceTests(config: ServiceTestConfig): void {
|
|
|
888
862
|
await service.setSecret('upsert-key', { v: 1 })
|
|
889
863
|
await service.setSecret('upsert-key', { v: 2 })
|
|
890
864
|
const result = await service.getSecret<{ v: number }>('upsert-key')
|
|
891
|
-
assert.deepEqual(result, { v: 2 })
|
|
865
|
+
assert.deepEqual(result.reveal(), { v: 2 })
|
|
892
866
|
})
|
|
893
867
|
|
|
894
868
|
test('deleteSecret removes the key', async () => {
|
|
@@ -913,7 +887,7 @@ export function defineServiceTests(config: ServiceTestConfig): void {
|
|
|
913
887
|
const before = await rotatedService.getSecret<{
|
|
914
888
|
important: string
|
|
915
889
|
}>('rotate-test')
|
|
916
|
-
assert.deepEqual(before, { important: 'data' })
|
|
890
|
+
assert.deepEqual(before.reveal(), { important: 'data' })
|
|
917
891
|
|
|
918
892
|
assert.ok(rotatedService.rotateKEK)
|
|
919
893
|
const count = await rotatedService.rotateKEK!()
|
|
@@ -926,7 +900,7 @@ export function defineServiceTests(config: ServiceTestConfig): void {
|
|
|
926
900
|
const after = await newOnlyService.getSecret<{
|
|
927
901
|
important: string
|
|
928
902
|
}>('rotate-test')
|
|
929
|
-
assert.deepEqual(after, { important: 'data' })
|
|
903
|
+
assert.deepEqual(after.reveal(), { important: 'data' })
|
|
930
904
|
})
|
|
931
905
|
|
|
932
906
|
test('rotateKEK throws without previousKey', async () => {
|
package/src/time-utils.ts
CHANGED
|
@@ -18,24 +18,15 @@ export const getRelativeTimeOffset = ({
|
|
|
18
18
|
value,
|
|
19
19
|
unit,
|
|
20
20
|
}: RelativeTimeInput): number => {
|
|
21
|
-
return Math.round(value * multipliers[unit]) * 1000
|
|
21
|
+
return Math.round(value * multipliers[unit]) * 1000
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
/**
|
|
25
|
-
* Returns a Unix timestamp (in seconds) offset from now by the given duration.
|
|
26
|
-
* e.g. value = -1 and unit = 'day' => 1 day ago => now - 86400 seconds
|
|
27
|
-
*/
|
|
28
24
|
export const getRelativeTimeOffsetFromNow = (
|
|
29
25
|
relativeTime: RelativeTimeInput
|
|
30
26
|
): Date => {
|
|
31
27
|
return new Date(Date.now() + getRelativeTimeOffset(relativeTime))
|
|
32
28
|
}
|
|
33
29
|
|
|
34
|
-
/**
|
|
35
|
-
* Get duration in milliseconds from a string or number
|
|
36
|
-
* @param duration
|
|
37
|
-
* @returns
|
|
38
|
-
*/
|
|
39
30
|
export const getDurationInMilliseconds = (
|
|
40
31
|
duration: string | number
|
|
41
32
|
): number => {
|
|
@@ -45,13 +36,6 @@ export const getDurationInMilliseconds = (
|
|
|
45
36
|
return parseDurationString(duration)
|
|
46
37
|
}
|
|
47
38
|
|
|
48
|
-
/**
|
|
49
|
-
* Parse a duration string to milliseconds
|
|
50
|
-
* Supports formats like: '2s', '5s', '5sec', '5seconds', '5m', '5min', '5minutes', '1h', '1hour', '2d', '2day', '1w', '1week'
|
|
51
|
-
*
|
|
52
|
-
* @param duration - Duration string (e.g., '2s', '5min', '2hours', '1day')
|
|
53
|
-
* @returns Duration in milliseconds
|
|
54
|
-
*/
|
|
55
39
|
export const parseDurationString = (duration: string): number => {
|
|
56
40
|
const match = duration.match(
|
|
57
41
|
/^(\d+)(ms|milliseconds?|s|sec|seconds?|m|min|minutes?|h|hour|hours?|d|day|days?|w|week|weeks?|y|year|years?)$/
|
|
@@ -66,7 +50,6 @@ export const parseDurationString = (duration: string): number => {
|
|
|
66
50
|
const value = parseInt(match[1], 10)
|
|
67
51
|
const unitStr = match[2]
|
|
68
52
|
|
|
69
|
-
// Handle milliseconds specially
|
|
70
53
|
if (
|
|
71
54
|
unitStr === 'ms' ||
|
|
72
55
|
unitStr === 'millisecond' ||
|
|
@@ -75,7 +58,6 @@ export const parseDurationString = (duration: string): number => {
|
|
|
75
58
|
return value
|
|
76
59
|
}
|
|
77
60
|
|
|
78
|
-
// Map string variations to TimeUnit
|
|
79
61
|
let unit: TimeUnit
|
|
80
62
|
if (
|
|
81
63
|
unitStr === 's' ||
|