@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,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
|
}
|
|
@@ -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
|
export interface CredentialStatus {
|
|
3
4
|
secretId: string;
|
|
4
5
|
name: string;
|
|
@@ -18,21 +19,14 @@ export type CredentialMeta = {
|
|
|
18
19
|
export declare class TypedSecretService<TMap = Record<string, unknown>> implements SecretService {
|
|
19
20
|
private secrets;
|
|
20
21
|
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
22
|
private cache;
|
|
29
23
|
constructor(secrets: SecretService, credentialsMeta: Record<string, CredentialMeta>);
|
|
30
|
-
getSecret<K extends keyof TMap & string>(key: K): Promise<TMap[K]
|
|
31
|
-
getSecret<T = string>(key: string): Promise<T
|
|
24
|
+
getSecret<K extends keyof TMap & string>(key: K): Promise<SecretValue<TMap[K]>>;
|
|
25
|
+
getSecret<T = string>(key: string): Promise<SecretValue<T>>;
|
|
32
26
|
hasSecret(key: string): Promise<boolean>;
|
|
33
27
|
setSecret<K extends string>(key: K, value: K extends keyof TMap ? TMap[K] : unknown): Promise<void>;
|
|
34
28
|
deleteSecret(key: string): Promise<void>;
|
|
35
|
-
getSecrets<T extends Record<string, unknown> = Record<string, unknown>>(keys: (keyof T & string)[]): Promise<Partial<T
|
|
29
|
+
getSecrets<T extends Record<string, unknown> = Record<string, unknown>>(keys: (keyof T & string)[]): Promise<Partial<SecretValues<T>>>;
|
|
36
30
|
getAllStatus(): Promise<CredentialStatus[]>;
|
|
37
31
|
getMissing(): Promise<CredentialStatus[]>;
|
|
38
32
|
}
|
|
@@ -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,32 @@
|
|
|
1
|
+
import type { Safe } from '../secret-value.js';
|
|
1
2
|
export interface SendWebhookInput {
|
|
2
|
-
/** The endpoint the webhook is delivered to via HTTP POST. */
|
|
3
3
|
url: string;
|
|
4
|
-
/**
|
|
4
|
+
/** Sent as the `X-Pikku-Event` header. */
|
|
5
5
|
event?: string;
|
|
6
|
-
/** The payload, JSON-serialized into the request body. */
|
|
7
6
|
data: unknown;
|
|
8
|
-
/** Extra headers merged over the defaults. */
|
|
9
7
|
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
|
-
*/
|
|
8
|
+
/** A raw HMAC key, not a secret name — overrides `config.webhook.secret`. */
|
|
14
9
|
secret?: string;
|
|
15
|
-
/**
|
|
10
|
+
/** Overrides `config.webhook.retries`. */
|
|
16
11
|
retries?: number;
|
|
17
|
-
/**
|
|
18
|
-
* Delay between retries (`30000` or `'30s'`). A concrete value selects a
|
|
19
|
-
* fixed backoff; when omitted, backoff is exponential.
|
|
20
|
-
*/
|
|
12
|
+
/** A concrete delay (`30000` or `'30s'`) selects fixed backoff; omitted means exponential. */
|
|
21
13
|
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
|
-
*/
|
|
14
|
+
/** Persisted only by store-backed implementations; the queue-only default ignores it. */
|
|
27
15
|
organizationId?: string;
|
|
28
16
|
}
|
|
29
17
|
export interface SendWebhookResult {
|
|
30
18
|
jobId: string;
|
|
31
19
|
}
|
|
32
20
|
export interface WebhookServiceConfig {
|
|
33
|
-
/** Default retry count for failed deliveries. */
|
|
34
21
|
retries?: number;
|
|
35
|
-
/**
|
|
22
|
+
/** Omitted means exponential backoff. */
|
|
36
23
|
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
|
-
*/
|
|
24
|
+
/** A secret *name* resolved through the secret service, unlike `SendWebhookInput.secret`. */
|
|
41
25
|
secret?: string;
|
|
42
|
-
/**
|
|
43
|
-
* Header the body signature is sent in. Defaults to
|
|
44
|
-
* {@link DEFAULT_WEBHOOK_SIGNATURE_HEADER}.
|
|
45
|
-
*/
|
|
46
26
|
signatureHeader?: string;
|
|
47
27
|
/**
|
|
48
|
-
* SSRF allowlist
|
|
49
|
-
*
|
|
50
|
-
* internal hosts (loopback, private ranges, cloud metadata) are blocked and
|
|
51
|
-
* all other public hosts are permitted.
|
|
28
|
+
* SSRF allowlist. Set: only these hostnames may be delivered to. Omitted:
|
|
29
|
+
* private/internal hosts are blocked and every other public host is allowed.
|
|
52
30
|
*/
|
|
53
31
|
allowedHosts?: string[];
|
|
54
32
|
}
|
|
@@ -58,24 +36,19 @@ export interface WebhookJobData {
|
|
|
58
36
|
body: string;
|
|
59
37
|
headers: Record<string, string>;
|
|
60
38
|
/**
|
|
61
|
-
*
|
|
62
|
-
* the
|
|
63
|
-
* the queue `jobId`), so it's stable across retries.
|
|
39
|
+
* Present only when a store-backed implementation enqueued the job. Doubles
|
|
40
|
+
* as the queue `jobId`, so it is stable across retries.
|
|
64
41
|
*/
|
|
65
42
|
deliveryId?: string;
|
|
66
43
|
}
|
|
67
|
-
/** Outcome of one delivery attempt, recorded against a delivery. */
|
|
68
44
|
export interface WebhookAttemptResult {
|
|
69
|
-
/**
|
|
45
|
+
/** Absent when the request never completed. */
|
|
70
46
|
statusCode?: number;
|
|
71
|
-
/**
|
|
47
|
+
/** Truncated; captured on failure only. */
|
|
72
48
|
responseBody?: string;
|
|
73
|
-
/** Network/timeout error message, when the request threw. */
|
|
74
49
|
error?: string;
|
|
75
|
-
/** Whether this attempt was a 2xx success. */
|
|
76
50
|
delivered: boolean;
|
|
77
51
|
}
|
|
78
|
-
/** A persisted webhook delivery, as surfaced to the console. */
|
|
79
52
|
export interface WebhookDeliveryRecord {
|
|
80
53
|
deliveryId: string;
|
|
81
54
|
organizationId: string | null;
|
|
@@ -87,7 +60,6 @@ export interface WebhookDeliveryRecord {
|
|
|
87
60
|
updatedAt: Date;
|
|
88
61
|
deliveredAt: Date | null;
|
|
89
62
|
}
|
|
90
|
-
/** A single persisted delivery attempt. */
|
|
91
63
|
export interface WebhookAttemptRecord {
|
|
92
64
|
attemptId: string;
|
|
93
65
|
deliveryId: string;
|
|
@@ -97,44 +69,29 @@ export interface WebhookAttemptRecord {
|
|
|
97
69
|
error: string | null;
|
|
98
70
|
createdAt: Date;
|
|
99
71
|
}
|
|
100
|
-
/** A delivery with its full attempt history. */
|
|
101
72
|
export interface WebhookDeliveryWithAttempts {
|
|
102
73
|
delivery: WebhookDeliveryRecord;
|
|
103
74
|
attempts: WebhookAttemptRecord[];
|
|
104
75
|
}
|
|
105
76
|
export declare const PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME = "pikku-outgoing-webhooks";
|
|
106
77
|
export declare const DEFAULT_WEBHOOK_SIGNATURE_HEADER = "X-Pikku-Signature";
|
|
107
|
-
/** Fallback when neither the per-call nor `config.webhook.retries` is set. */
|
|
108
78
|
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
79
|
export declare abstract class WebhookService {
|
|
115
|
-
abstract send(input:
|
|
116
|
-
/**
|
|
117
|
-
* Sign a body with HMAC-SHA256, producing the signature header value
|
|
118
|
-
* (e.g. `sha256=abc123...`).
|
|
119
|
-
*/
|
|
80
|
+
abstract send<T extends SendWebhookInput>(input: Safe<T>): Promise<SendWebhookResult>;
|
|
81
|
+
/** Produces the header value, `sha256=<hex>`, not the bare digest. */
|
|
120
82
|
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
|
-
*/
|
|
83
|
+
/** Public because receivers verify with it; they share the signing scheme. */
|
|
125
84
|
verify(secret: string, signature: string, body: string): boolean;
|
|
126
85
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
* implementation (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides it.
|
|
86
|
+
* The three methods below are optional capability: the default queue-only
|
|
87
|
+
* service keeps no history and throws, and a store-backed implementation
|
|
88
|
+
* (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides them.
|
|
131
89
|
*/
|
|
132
90
|
recordAttempt(_deliveryId: string, _result: WebhookAttemptResult): Promise<void>;
|
|
133
|
-
/**
|
|
91
|
+
/** Most recent first. */
|
|
134
92
|
listDeliveries(_opts?: {
|
|
135
93
|
organizationId?: string;
|
|
136
94
|
limit?: number;
|
|
137
95
|
}): Promise<WebhookDeliveryRecord[]>;
|
|
138
|
-
/** A single delivery with its attempt history, or null if unknown. */
|
|
139
96
|
getDelivery(_deliveryId: string): Promise<WebhookDeliveryWithAttempts | null>;
|
|
140
97
|
}
|
|
@@ -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', {});
|
|
@@ -559,16 +542,16 @@ export function defineServiceTests(config) {
|
|
|
559
542
|
endpoint: 'https://api.example.com',
|
|
560
543
|
});
|
|
561
544
|
const result = await service.getSecret('api-key');
|
|
562
|
-
assert.deepEqual(result, {
|
|
545
|
+
assert.deepEqual(result.reveal(), {
|
|
563
546
|
token: 'sk-123',
|
|
564
547
|
endpoint: 'https://api.example.com',
|
|
565
548
|
});
|
|
566
549
|
});
|
|
567
|
-
test('getSecret
|
|
550
|
+
test('getSecret wraps the raw string rather than returning it', async () => {
|
|
568
551
|
const service = await factory({ key: kek });
|
|
569
552
|
await service.setSecret('string-secret', 'plain-value');
|
|
570
553
|
const result = await service.getSecret('string-secret');
|
|
571
|
-
assert.strictEqual(result, 'plain-value');
|
|
554
|
+
assert.strictEqual(result.reveal(), 'plain-value');
|
|
572
555
|
});
|
|
573
556
|
test('hasSecret returns true/false', async () => {
|
|
574
557
|
const service = await factory({ key: kek });
|
|
@@ -586,7 +569,7 @@ export function defineServiceTests(config) {
|
|
|
586
569
|
await service.setSecret('upsert-key', { v: 1 });
|
|
587
570
|
await service.setSecret('upsert-key', { v: 2 });
|
|
588
571
|
const result = await service.getSecret('upsert-key');
|
|
589
|
-
assert.deepEqual(result, { v: 2 });
|
|
572
|
+
assert.deepEqual(result.reveal(), { v: 2 });
|
|
590
573
|
});
|
|
591
574
|
test('deleteSecret removes the key', async () => {
|
|
592
575
|
const service = await factory({ key: kek });
|
|
@@ -605,7 +588,7 @@ export function defineServiceTests(config) {
|
|
|
605
588
|
previousKey: kek,
|
|
606
589
|
});
|
|
607
590
|
const before = await rotatedService.getSecret('rotate-test');
|
|
608
|
-
assert.deepEqual(before, { important: 'data' });
|
|
591
|
+
assert.deepEqual(before.reveal(), { important: 'data' });
|
|
609
592
|
assert.ok(rotatedService.rotateKEK);
|
|
610
593
|
const count = await rotatedService.rotateKEK();
|
|
611
594
|
assert.ok(count > 0);
|
|
@@ -614,7 +597,7 @@ export function defineServiceTests(config) {
|
|
|
614
597
|
keyVersion: 2,
|
|
615
598
|
});
|
|
616
599
|
const after = await newOnlyService.getSecret('rotate-test');
|
|
617
|
-
assert.deepEqual(after, { important: 'data' });
|
|
600
|
+
assert.deepEqual(after.reveal(), { important: 'data' });
|
|
618
601
|
});
|
|
619
602
|
test('rotateKEK throws without previousKey', async () => {
|
|
620
603
|
const service = await factory({ key: kek });
|
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' ||
|