@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
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import type { Logger } from './logger.js';
|
|
2
2
|
import { LogLevel } from './logger.js';
|
|
3
|
-
/**
|
|
4
|
-
* Text-mode console logger.
|
|
5
|
-
* Output: `INFO: message` or `[traceId] INFO: message`
|
|
6
|
-
*/
|
|
3
|
+
/** Emits `INFO: message`, or `[traceId] INFO: message` when scoped. */
|
|
7
4
|
export declare class ConsoleLogger implements Logger {
|
|
8
5
|
private level;
|
|
9
6
|
private prefix;
|
|
@@ -19,9 +16,8 @@ export declare class ConsoleLogger implements Logger {
|
|
|
19
16
|
log(level: string, message: string, ...meta: any[]): void;
|
|
20
17
|
}
|
|
21
18
|
/**
|
|
22
|
-
* JSON
|
|
23
|
-
*
|
|
24
|
-
* CF Workers Logs auto-indexes JSON keys for filtering.
|
|
19
|
+
* Emits `{"level":"info","message":"...","traceId":"..."}` — one JSON object per
|
|
20
|
+
* line, because Cloudflare Workers Logs auto-indexes JSON keys for filtering.
|
|
25
21
|
*/
|
|
26
22
|
export declare class JsonConsoleLogger implements Logger {
|
|
27
23
|
private level;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { LogLevel } from './logger.js';
|
|
2
|
-
/**
|
|
3
|
-
* Text-mode console logger.
|
|
4
|
-
* Output: `INFO: message` or `[traceId] INFO: message`
|
|
5
|
-
*/
|
|
2
|
+
/** Emits `INFO: message`, or `[traceId] INFO: message` when scoped. */
|
|
6
3
|
export class ConsoleLogger {
|
|
7
4
|
level = LogLevel.info;
|
|
8
5
|
prefix;
|
|
@@ -61,9 +58,8 @@ export class ConsoleLogger {
|
|
|
61
58
|
}
|
|
62
59
|
}
|
|
63
60
|
/**
|
|
64
|
-
* JSON
|
|
65
|
-
*
|
|
66
|
-
* CF Workers Logs auto-indexes JSON keys for filtering.
|
|
61
|
+
* Emits `{"level":"info","message":"...","traceId":"..."}` — one JSON object per
|
|
62
|
+
* line, because Cloudflare Workers Logs auto-indexes JSON keys for filtering.
|
|
67
63
|
*/
|
|
68
64
|
export class JsonConsoleLogger {
|
|
69
65
|
level = LogLevel.info;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { Safe } from '../secret-value.js';
|
|
1
2
|
export declare enum LogLevel {
|
|
2
|
-
'trace' = 0
|
|
3
|
+
'trace' = 0,
|
|
3
4
|
'debug' = 1,
|
|
4
5
|
'info' = 2,
|
|
5
6
|
'warn' = 3,
|
|
@@ -7,47 +8,28 @@ export declare enum LogLevel {
|
|
|
7
8
|
'critical' = 5
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
+
* A log line is the easiest place to leak a vault secret, so every parameter is
|
|
12
|
+
* `Safe<>`-guarded: a `SecretValue` anywhere in the message or the metadata,
|
|
13
|
+
* however deeply nested, collapses to `never` and fails the build. Reveal it
|
|
14
|
+
* first if you genuinely mean to log it.
|
|
11
15
|
*/
|
|
12
16
|
export interface Logger {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
* @param meta - Additional metadata to log.
|
|
29
|
-
*/
|
|
30
|
-
error(messageOrObj: string | Record<string, any> | Error, ...meta: any[]): void;
|
|
31
|
-
/**
|
|
32
|
-
* Logs a debug message.
|
|
33
|
-
* @param message - The message to log.
|
|
34
|
-
* @param meta - Additional metadata to log.
|
|
35
|
-
*/
|
|
36
|
-
debug(message: string, ...meta: any[]): void;
|
|
37
|
-
/**
|
|
38
|
-
* Logs a trace message.
|
|
39
|
-
* @param message - The message to log.
|
|
40
|
-
* @param meta - Additional metadata to log.
|
|
41
|
-
*/
|
|
42
|
-
trace?(message: string, ...meta: any[]): void;
|
|
43
|
-
/**
|
|
44
|
-
* Sets the logging level.
|
|
45
|
-
* @param level - The logging level to set.
|
|
46
|
-
*/
|
|
17
|
+
info<M extends string | Record<string, any>, A extends unknown[]>(messageOrObj: Safe<M>, ...meta: {
|
|
18
|
+
[K in keyof A]: Safe<A[K]>;
|
|
19
|
+
}): void;
|
|
20
|
+
warn<M extends string | Record<string, any>, A extends unknown[]>(messageOrObj: Safe<M>, ...meta: {
|
|
21
|
+
[K in keyof A]: Safe<A[K]>;
|
|
22
|
+
}): void;
|
|
23
|
+
error<M extends string | Record<string, any> | Error, A extends unknown[]>(messageOrObj: Safe<M>, ...meta: {
|
|
24
|
+
[K in keyof A]: Safe<A[K]>;
|
|
25
|
+
}): void;
|
|
26
|
+
debug<A extends unknown[]>(message: string, ...meta: {
|
|
27
|
+
[K in keyof A]: Safe<A[K]>;
|
|
28
|
+
}): void;
|
|
29
|
+
trace?<A extends unknown[]>(message: string, ...meta: {
|
|
30
|
+
[K in keyof A]: Safe<A[K]>;
|
|
31
|
+
}): void;
|
|
47
32
|
setLevel(level: LogLevel): void;
|
|
48
|
-
/**
|
|
49
|
-
* Creates a scoped logger with a traceId included in every log entry.
|
|
50
|
-
* Used per-request to correlate logs across function calls.
|
|
51
|
-
*/
|
|
33
|
+
/** A logger carrying a traceId on every entry, taken per-request to correlate calls. */
|
|
52
34
|
scope?(traceId: string): Logger;
|
|
53
35
|
}
|
|
@@ -6,7 +6,8 @@ import type { QueueWorkersMeta } from '../wirings/queue/queue.types.js';
|
|
|
6
6
|
import type { CLIMeta } from '../wirings/cli/cli.types.js';
|
|
7
7
|
import type { MCPResourceMeta, MCPToolMeta, MCPPromptMeta } from '../wirings/mcp/mcp.types.js';
|
|
8
8
|
import type { FeaturesMeta, WorkflowsMeta } from '../wirings/workflow/workflow.types.js';
|
|
9
|
-
import type {
|
|
9
|
+
import type { ResolvedPersona } from './personas-service.js';
|
|
10
|
+
import type { SystemRoleDefinitionsMeta } from '../wirings/role/role.types.js';
|
|
10
11
|
import type { TriggerMeta, TriggerSourceMeta } from '../wirings/trigger/trigger.types.js';
|
|
11
12
|
import type { SecretDefinitionsMeta } from '../wirings/secret/secret.types.js';
|
|
12
13
|
import type { CredentialDefinitionsMeta } from '../wirings/credential/credential.types.js';
|
|
@@ -114,32 +115,21 @@ export interface EmailTemplateAssets {
|
|
|
114
115
|
text: string;
|
|
115
116
|
missing: string[];
|
|
116
117
|
}
|
|
117
|
-
/**
|
|
118
|
-
* Abstraction over .pikku metadata file access.
|
|
119
|
-
* All paths are relative to the .pikku root directory.
|
|
120
|
-
*
|
|
121
|
-
* Node.js uses LocalMetaService (filesystem).
|
|
122
|
-
* Cloudflare uses an R2/KV implementation.
|
|
123
|
-
*/
|
|
118
|
+
/** Every `relativePath` below is relative to the `.pikku` root directory. */
|
|
124
119
|
export interface MetaService {
|
|
125
|
-
/**
|
|
120
|
+
/** Undefined for remote/non-local implementations. */
|
|
126
121
|
readonly basePath?: string;
|
|
127
|
-
/** Read a file's content by relative path. Returns null if not found. */
|
|
128
122
|
readFile(relativePath: string): Promise<string | null>;
|
|
129
|
-
/** List files in a directory by relative path. Returns empty array if not found. */
|
|
130
123
|
readDir(relativePath: string): Promise<string[]>;
|
|
131
|
-
/**
|
|
124
|
+
/** Relative to the project root, one level above `.pikku`. */
|
|
132
125
|
readProjectFile(relativePath: string): Promise<string | null>;
|
|
133
126
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
* absent. Only local/Node implementations resolve packages; remote impls omit
|
|
139
|
-
* this and callers guard with `?.`.
|
|
127
|
+
* Reads an *installed addon package's* own `.pikku`, not the app's, with
|
|
128
|
+
* `relativePath` rooted there (`../README.md` reaches the package root).
|
|
129
|
+
* Optional because only local/Node implementations resolve packages — remote
|
|
130
|
+
* ones omit it and callers guard with `?.`.
|
|
140
131
|
*/
|
|
141
132
|
readPackageFile?(packageName: string, relativePath: string): Promise<string | null>;
|
|
142
|
-
/** List a directory inside an installed addon package's `.pikku`. */
|
|
143
133
|
readPackageDir?(packageName: string, relativePath: string): Promise<string[]>;
|
|
144
134
|
getHttpMeta(): Promise<HTTPWiringsMeta>;
|
|
145
135
|
getChannelsMeta(): Promise<ChannelsMeta>;
|
|
@@ -150,7 +140,16 @@ export interface MetaService {
|
|
|
150
140
|
getGatewayMeta(): Promise<GatewaysMeta>;
|
|
151
141
|
getRpcMeta(): Promise<RPCMetaRecord>;
|
|
152
142
|
getWorkflowMeta(): Promise<WorkflowsMeta>;
|
|
153
|
-
|
|
143
|
+
getPersonasMeta(): Promise<Record<string, ResolvedPersona>>;
|
|
144
|
+
/**
|
|
145
|
+
* The roles declared with `defineSystemRole`, keyed by name.
|
|
146
|
+
*
|
|
147
|
+
* A persona declares roles; a function checks scopes. Anything showing what a
|
|
148
|
+
* persona can reach — the console's persona page, a run's catalogue — needs
|
|
149
|
+
* this to get from one to the other, and needs it to be the same expansion the
|
|
150
|
+
* seed granted from rather than a second one.
|
|
151
|
+
*/
|
|
152
|
+
getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta>;
|
|
154
153
|
getFeaturesMeta(): Promise<FeaturesMeta>;
|
|
155
154
|
getTriggerMeta(): Promise<TriggerMeta>;
|
|
156
155
|
getTriggerSourceMeta(): Promise<TriggerSourceMeta>;
|
|
@@ -168,10 +167,6 @@ export interface MetaService {
|
|
|
168
167
|
getSchemas(schemaNames: string[]): Promise<Record<string, JSONSchema7 | null>>;
|
|
169
168
|
clearCache(): void;
|
|
170
169
|
}
|
|
171
|
-
/**
|
|
172
|
-
* Node.js filesystem implementation of MetaService.
|
|
173
|
-
* Reads .gen.json files from a local .pikku directory.
|
|
174
|
-
*/
|
|
175
170
|
export declare class LocalMetaService implements MetaService {
|
|
176
171
|
readonly basePath: string;
|
|
177
172
|
private httpMetaCache;
|
|
@@ -183,7 +178,8 @@ export declare class LocalMetaService implements MetaService {
|
|
|
183
178
|
private gatewayMetaCache;
|
|
184
179
|
private rpcMetaCache;
|
|
185
180
|
private workflowMetaCache;
|
|
186
|
-
private
|
|
181
|
+
private personasMetaCache;
|
|
182
|
+
private systemRolesMetaCache;
|
|
187
183
|
private featuresMetaCache;
|
|
188
184
|
private triggerMetaCache;
|
|
189
185
|
private triggerSourceMetaCache;
|
|
@@ -216,7 +212,8 @@ export declare class LocalMetaService implements MetaService {
|
|
|
216
212
|
getRpcMeta(): Promise<RPCMetaRecord>;
|
|
217
213
|
private readWorkflowMetaDir;
|
|
218
214
|
getWorkflowMeta(): Promise<WorkflowsMeta>;
|
|
219
|
-
|
|
215
|
+
getPersonasMeta(): Promise<Record<string, ResolvedPersona>>;
|
|
216
|
+
getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta>;
|
|
220
217
|
getFeaturesMeta(): Promise<FeaturesMeta>;
|
|
221
218
|
getTriggerMeta(): Promise<TriggerMeta>;
|
|
222
219
|
getTriggerSourceMeta(): Promise<TriggerSourceMeta>;
|
|
@@ -2,10 +2,6 @@ import { readFile, readdir } from 'node:fs/promises';
|
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { createRequire } from 'node:module';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
/**
|
|
6
|
-
* Node.js filesystem implementation of MetaService.
|
|
7
|
-
* Reads .gen.json files from a local .pikku directory.
|
|
8
|
-
*/
|
|
9
5
|
export class LocalMetaService {
|
|
10
6
|
basePath;
|
|
11
7
|
httpMetaCache = null;
|
|
@@ -17,7 +13,8 @@ export class LocalMetaService {
|
|
|
17
13
|
gatewayMetaCache = null;
|
|
18
14
|
rpcMetaCache = null;
|
|
19
15
|
workflowMetaCache = null;
|
|
20
|
-
|
|
16
|
+
personasMetaCache = null;
|
|
17
|
+
systemRolesMetaCache = null;
|
|
21
18
|
featuresMetaCache = null;
|
|
22
19
|
triggerMetaCache = null;
|
|
23
20
|
triggerSourceMetaCache = null;
|
|
@@ -57,10 +54,7 @@ export class LocalMetaService {
|
|
|
57
54
|
return null;
|
|
58
55
|
}
|
|
59
56
|
}
|
|
60
|
-
//
|
|
61
|
-
// The addon packages have no main `exports` entry, so `require.resolve(pkg)`
|
|
62
|
-
// throws; instead we walk the node_modules search paths (anchored at the app
|
|
63
|
-
// root, one level above `.pikku`) and pick the first that contains the package.
|
|
57
|
+
// knowledge: decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md
|
|
64
58
|
packageRootCache = new Map();
|
|
65
59
|
resolvePackageRoot(packageName) {
|
|
66
60
|
const cached = this.packageRootCache.get(packageName);
|
|
@@ -115,7 +109,8 @@ export class LocalMetaService {
|
|
|
115
109
|
this.gatewayMetaCache = null;
|
|
116
110
|
this.rpcMetaCache = null;
|
|
117
111
|
this.workflowMetaCache = null;
|
|
118
|
-
this.
|
|
112
|
+
this.personasMetaCache = null;
|
|
113
|
+
this.systemRolesMetaCache = null;
|
|
119
114
|
this.featuresMetaCache = null;
|
|
120
115
|
this.triggerMetaCache = null;
|
|
121
116
|
this.triggerSourceMetaCache = null;
|
|
@@ -129,7 +124,6 @@ export class LocalMetaService {
|
|
|
129
124
|
this.agentsMetaCache = null;
|
|
130
125
|
this.schemaCache.clear();
|
|
131
126
|
}
|
|
132
|
-
// -- Private helpers --
|
|
133
127
|
async readMetaJson(dir, baseName) {
|
|
134
128
|
const verbose = await this.readFile(`${dir}/${baseName}-verbose.gen.json`);
|
|
135
129
|
if (verbose)
|
|
@@ -139,7 +133,6 @@ export class LocalMetaService {
|
|
|
139
133
|
return minimal;
|
|
140
134
|
return null;
|
|
141
135
|
}
|
|
142
|
-
// -- Typed metadata accessors --
|
|
143
136
|
async getHttpMeta() {
|
|
144
137
|
if (this.httpMetaCache)
|
|
145
138
|
return this.httpMetaCache;
|
|
@@ -248,9 +241,7 @@ export class LocalMetaService {
|
|
|
248
241
|
return this.workflowMetaCache;
|
|
249
242
|
try {
|
|
250
243
|
const result = {};
|
|
251
|
-
//
|
|
252
|
-
// imports them, but they are still workflows to anything reading meta off
|
|
253
|
-
// disk — the console's scenario list among them.
|
|
244
|
+
// knowledge: decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md
|
|
254
245
|
await Promise.all([
|
|
255
246
|
this.readWorkflowMetaDir('workflow/meta', result),
|
|
256
247
|
this.readWorkflowMetaDir('scenarios/meta', result),
|
|
@@ -264,12 +255,20 @@ export class LocalMetaService {
|
|
|
264
255
|
return this.workflowMetaCache;
|
|
265
256
|
}
|
|
266
257
|
}
|
|
267
|
-
async
|
|
268
|
-
if (this.
|
|
269
|
-
return this.
|
|
270
|
-
const content = await this.readFile('workflow/
|
|
271
|
-
this.
|
|
272
|
-
return this.
|
|
258
|
+
async getPersonasMeta() {
|
|
259
|
+
if (this.personasMetaCache)
|
|
260
|
+
return this.personasMetaCache;
|
|
261
|
+
const content = await this.readFile('workflow/personas.gen.json');
|
|
262
|
+
this.personasMetaCache = content ? JSON.parse(content) : {};
|
|
263
|
+
return this.personasMetaCache;
|
|
264
|
+
}
|
|
265
|
+
async getSystemRolesMeta() {
|
|
266
|
+
if (this.systemRolesMetaCache)
|
|
267
|
+
return this.systemRolesMetaCache;
|
|
268
|
+
// Beside the scopes it is composed from, which is where codegen writes it.
|
|
269
|
+
const content = await this.readFile('scopes/pikku-roles-meta.gen.json');
|
|
270
|
+
this.systemRolesMetaCache = content ? JSON.parse(content) : {};
|
|
271
|
+
return this.systemRolesMetaCache;
|
|
273
272
|
}
|
|
274
273
|
async getFeaturesMeta() {
|
|
275
274
|
if (this.featuresMetaCache)
|
|
@@ -297,8 +296,6 @@ export class LocalMetaService {
|
|
|
297
296
|
return this.functionsMetaCache;
|
|
298
297
|
const [content, scenarioContent] = await Promise.all([
|
|
299
298
|
this.readMetaJson('function', 'pikku-functions-meta'),
|
|
300
|
-
// Scenario steps register only into the scenario bootstrap, but they are
|
|
301
|
-
// still functions to anything reading meta off disk.
|
|
302
299
|
this.readMetaJson('scenarios', 'pikku-scenario-functions-meta'),
|
|
303
300
|
]);
|
|
304
301
|
this.functionsMetaCache = {
|
|
@@ -360,12 +357,7 @@ export class LocalMetaService {
|
|
|
360
357
|
return this.variablesMetaCache;
|
|
361
358
|
}
|
|
362
359
|
async getEmailMeta() {
|
|
363
|
-
//
|
|
364
|
-
// `pikku all`/`pikku emails generate` and is regenerated DURING a long-lived
|
|
365
|
-
// session (sandbox boots the orchestrator before the user project's codegen
|
|
366
|
-
// has written it). Caching here once returned an empty {templates:{}} that
|
|
367
|
-
// then stuck for the whole session, leaving the console emails screen blank
|
|
368
|
-
// even after the file appeared. A local JSON read is essentially free.
|
|
360
|
+
// knowledge: decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md
|
|
369
361
|
const content = await this.readFile('email/pikku-emails-meta.gen.json');
|
|
370
362
|
return content
|
|
371
363
|
? JSON.parse(content)
|
|
@@ -380,9 +372,7 @@ export class LocalMetaService {
|
|
|
380
372
|
if (!emailsMeta.src) {
|
|
381
373
|
throw new Error('No generated email metadata found. Run `pikku emails generate`.');
|
|
382
374
|
}
|
|
383
|
-
//
|
|
384
|
-
// Read directly rather than through readProjectFile (which prepends the project
|
|
385
|
-
// root and produces a wrong compound path when baseDir is absolute).
|
|
375
|
+
// knowledge: decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md
|
|
386
376
|
const baseDir = emailsMeta.src;
|
|
387
377
|
const readEmailFile = async (rel) => {
|
|
388
378
|
try {
|
|
@@ -409,10 +399,6 @@ export class LocalMetaService {
|
|
|
409
399
|
...(templateText ? [] : ['text']),
|
|
410
400
|
];
|
|
411
401
|
if (missing.length > 0) {
|
|
412
|
-
// Diagnostic for the intermittent "Missing source files" report: logs which
|
|
413
|
-
// process and which resolved baseDir saw the gap. Different pids across
|
|
414
|
-
// failures => multiple runtime workers with divergent cached `src`; same pid
|
|
415
|
-
// + transient absence => files being rewritten under us (e.g. regeneration).
|
|
416
402
|
console.warn(`[email-assets] pid=${process.pid} template=${templateName} locale=${locale} baseDir=${baseDir} missing=${missing.join(',')}`);
|
|
417
403
|
}
|
|
418
404
|
return {
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { ConverseOptions, ActorFlowVerdict } from '../wirings/actor-flow/actor-flow.types.js';
|
|
2
|
+
import type { PersonaMeta } from '../wirings/persona/persona.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* What the transport answered, for a step that treats the status as data.
|
|
5
|
+
*
|
|
6
|
+
* An HTTP response with its body already drained: the stream can only be read
|
|
7
|
+
* once, and a step's return value crosses into the run record, so the response
|
|
8
|
+
* object itself cannot travel. This is the shape every caller ends up with.
|
|
9
|
+
*/
|
|
10
|
+
export interface ScenarioHttpResponse<T = unknown> {
|
|
11
|
+
status: number;
|
|
12
|
+
ok: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* The parsed JSON body — or, when the body was not JSON, the raw text it was
|
|
15
|
+
* parsed from, so an HTML error page is still readable rather than lost.
|
|
16
|
+
* `undefined` for an empty response.
|
|
17
|
+
*
|
|
18
|
+
* `T` is a claim the caller makes, not one the transport checked: a step that
|
|
19
|
+
* knows the route's payload names it here instead of casting at every use.
|
|
20
|
+
*/
|
|
21
|
+
body: T;
|
|
22
|
+
/**
|
|
23
|
+
* The whole body as text, so an assertion can search it without knowing the
|
|
24
|
+
* payload's shape — and so an error body that is HTML rather than JSON still
|
|
25
|
+
* says what went wrong.
|
|
26
|
+
*/
|
|
27
|
+
serialized: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Drain a response into the shape a step can carry: the parsed body (an empty
|
|
31
|
+
* one counting as no body at all) alongside the text it was parsed from.
|
|
32
|
+
*
|
|
33
|
+
* `invokeRaw` returns this, and a step that has to reach past a persona — a
|
|
34
|
+
* route with no RPC, an identity no persona can hold — reaches for this rather
|
|
35
|
+
* than writing the same record by hand.
|
|
36
|
+
*/
|
|
37
|
+
export declare const readScenarioHttpResponse: <T = unknown>(res: Response) => Promise<ScenarioHttpResponse<T>>;
|
|
38
|
+
/** How to send one JSON request, for `postScenarioJson`. */
|
|
39
|
+
export interface ScenarioJsonRequest {
|
|
40
|
+
/** Serialised as the JSON body. Omit for a request that carries none. */
|
|
41
|
+
body?: unknown;
|
|
42
|
+
/** Sent alongside `content-type: application/json`, and may override it. */
|
|
43
|
+
headers?: Record<string, string>;
|
|
44
|
+
/** Defaults to `POST` — the method every scenario route here answers. */
|
|
45
|
+
method?: string;
|
|
46
|
+
/**
|
|
47
|
+
* The `fetch` to send it with. Pass a `ScenarioCookieJar`'s to keep the
|
|
48
|
+
* session; the global `fetch` otherwise, which is what a step asserting on a
|
|
49
|
+
* sessionless call wants.
|
|
50
|
+
*/
|
|
51
|
+
fetch?: typeof fetch;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* POST JSON somewhere and report what came back, without throwing on a 4xx/5xx.
|
|
55
|
+
*
|
|
56
|
+
* Every scenario that reaches past a persona was writing this by hand — the same
|
|
57
|
+
* `content-type`, the same `JSON.stringify`, the same drain — and the copies had
|
|
58
|
+
* drifted: some returned `res.json()`, which loses the status and throws
|
|
59
|
+
* outright when the target answers an empty body or an HTML error page. A
|
|
60
|
+
* refusal is the expected outcome of a permissions scenario, so it has to
|
|
61
|
+
* survive as data.
|
|
62
|
+
*/
|
|
63
|
+
export declare const postScenarioJson: <T = unknown>(url: string, { body, headers, method, fetch: send, }?: ScenarioJsonRequest) => Promise<ScenarioHttpResponse<T>>;
|
|
64
|
+
/** Per-call transport options. */
|
|
65
|
+
export interface ScenarioInvokeOptions {
|
|
66
|
+
/**
|
|
67
|
+
* Headers to send alongside the persona's own session. This is how a step
|
|
68
|
+
* expresses an identity no declared persona can — an impersonation header, or
|
|
69
|
+
* one of the header-shim principals a credential scenario invents.
|
|
70
|
+
*/
|
|
71
|
+
headers?: Record<string, string>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The RPC surface a persona can reach, as name → input/output. A project binds
|
|
75
|
+
* its generated exposed RPC map here; the default leaves every name open, which
|
|
76
|
+
* is what a persona built by hand (or by a third-party driver) gets.
|
|
77
|
+
*/
|
|
78
|
+
export type ScenarioRpcMap = Record<string, {
|
|
79
|
+
input: any;
|
|
80
|
+
output: any;
|
|
81
|
+
}>;
|
|
82
|
+
/**
|
|
83
|
+
* The persona a step's `actor` slot carries, for a project whose personas are
|
|
84
|
+
* known. No declared personas keeps the open type rather than collapsing to
|
|
85
|
+
* `never` — a project may still build one itself.
|
|
86
|
+
*/
|
|
87
|
+
export type ScenarioPersonaOf<TPersonas> = [keyof TPersonas] extends [never] ? ScenarioPersona : TPersonas[keyof TPersonas];
|
|
88
|
+
/**
|
|
89
|
+
* A declared person, signed in and acting over the real transport.
|
|
90
|
+
*
|
|
91
|
+
* The runtime half of `definePersonas()`: sign-in materialises a user row
|
|
92
|
+
* flagged `actor: true`, and everything a step or a virtual user does goes
|
|
93
|
+
* through here.
|
|
94
|
+
*/
|
|
95
|
+
export interface ScenarioPersona<TAgentName extends string = string, TRpcMap extends ScenarioRpcMap = ScenarioRpcMap> {
|
|
96
|
+
/** The id it was declared under — what a step's `actor` slot names. */
|
|
97
|
+
readonly name: string;
|
|
98
|
+
/** Their address, computed from the id. Flows use it for invites/lookups. */
|
|
99
|
+
readonly email: string;
|
|
100
|
+
/** Invoke an exposed RPC as this person over the real transport. */
|
|
101
|
+
invoke<TName extends keyof TRpcMap & string>(rpcName: TName, data: TRpcMap[TName]['input']): Promise<TRpcMap[TName]['output']>;
|
|
102
|
+
/**
|
|
103
|
+
* The same call, reporting what the transport answered rather than throwing.
|
|
104
|
+
* A refusal is the expected outcome of a permissions or scopes scenario, and
|
|
105
|
+
* `invoke`'s error truncates the body that names which scope was missing.
|
|
106
|
+
*/
|
|
107
|
+
invokeRaw<TName extends keyof TRpcMap & string>(rpcName: TName, data: TRpcMap[TName]['input'], options?: ScenarioInvokeOptions): Promise<ScenarioHttpResponse>;
|
|
108
|
+
/** Converse with a Pikku AI agent in character and return its verdict. */
|
|
109
|
+
converse(options: ConverseOptions<TAgentName>): Promise<ActorFlowVerdict>;
|
|
110
|
+
/**
|
|
111
|
+
* The roles this person actually holds on the stage, read back after signing
|
|
112
|
+
* in — what a run compares against the declaration before its first step.
|
|
113
|
+
*
|
|
114
|
+
* `null` when the target does not say. That is not the same as "no roles": a
|
|
115
|
+
* run that treats silence as an empty list refuses to start against every
|
|
116
|
+
* stage whose auth reports roles somewhere else, so the caller must decide
|
|
117
|
+
* whether it can verify at all.
|
|
118
|
+
*/
|
|
119
|
+
sessionRoles(): Promise<string[] | null>;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* A declared persona with its address filled in — what codegen writes and what
|
|
123
|
+
* a seed, a scenario run and a virtual-user run all read.
|
|
124
|
+
*
|
|
125
|
+
* The address is not declared. It is derived from the persona's id and the
|
|
126
|
+
* project's persona domain, so two people can never accidentally share one and
|
|
127
|
+
* sign in as the same user row — which would silently collapse exactly the
|
|
128
|
+
* isolation scenarios a second person exists for.
|
|
129
|
+
*/
|
|
130
|
+
export type ResolvedPersona = PersonaMeta & {
|
|
131
|
+
email: string;
|
|
132
|
+
};
|
|
133
|
+
/** The injected `personas` service: persona id → persona. */
|
|
134
|
+
export type ScenarioPersonas = Record<string, ScenarioPersona>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drain a response into the shape a step can carry: the parsed body (an empty
|
|
3
|
+
* one counting as no body at all) alongside the text it was parsed from.
|
|
4
|
+
*
|
|
5
|
+
* `invokeRaw` returns this, and a step that has to reach past a persona — a
|
|
6
|
+
* route with no RPC, an identity no persona can hold — reaches for this rather
|
|
7
|
+
* than writing the same record by hand.
|
|
8
|
+
*/
|
|
9
|
+
export const readScenarioHttpResponse = async (res) => {
|
|
10
|
+
const text = res.status === 204 ? '' : await res.text().catch(() => '');
|
|
11
|
+
return {
|
|
12
|
+
status: res.status,
|
|
13
|
+
ok: res.ok,
|
|
14
|
+
body: (text ? parseJsonBody(text) : undefined),
|
|
15
|
+
serialized: text,
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
const parseJsonBody = (text) => {
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(text);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return text;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* POST JSON somewhere and report what came back, without throwing on a 4xx/5xx.
|
|
28
|
+
*
|
|
29
|
+
* Every scenario that reaches past a persona was writing this by hand — the same
|
|
30
|
+
* `content-type`, the same `JSON.stringify`, the same drain — and the copies had
|
|
31
|
+
* drifted: some returned `res.json()`, which loses the status and throws
|
|
32
|
+
* outright when the target answers an empty body or an HTML error page. A
|
|
33
|
+
* refusal is the expected outcome of a permissions scenario, so it has to
|
|
34
|
+
* survive as data.
|
|
35
|
+
*/
|
|
36
|
+
export const postScenarioJson = async (url, { body, headers, method = 'POST', fetch: send = fetch, } = {}) => readScenarioHttpResponse(await send(url, {
|
|
37
|
+
method,
|
|
38
|
+
headers: { 'content-type': 'application/json', ...headers },
|
|
39
|
+
...(body === undefined ? {} : { body: JSON.stringify(body) }),
|
|
40
|
+
}));
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
export const defaultPikkuUserIdResolver = (wire) => {
|
|
2
|
-
// Explicit pikkuUserId on wire (set by earlier middleware or runner)
|
|
3
2
|
if (wire.pikkuUserId)
|
|
4
3
|
return wire.pikkuUserId;
|
|
5
|
-
// Session userId (from auth middleware — user-defined session shape)
|
|
6
4
|
const session = wire.session;
|
|
7
5
|
if (session?.userId && typeof session.userId === 'string')
|
|
8
6
|
return session.userId;
|
|
9
|
-
// Queue job: carried in job metadata
|
|
10
7
|
if (wire.queue?.pikkuUserId)
|
|
11
8
|
return wire.queue.pikkuUserId;
|
|
12
|
-
// Workflow: carried in run wire metadata
|
|
13
9
|
if (wire.workflow?.pikkuUserId)
|
|
14
10
|
return wire.workflow.pikkuUserId;
|
|
15
11
|
return undefined;
|
|
@@ -1,54 +1,20 @@
|
|
|
1
1
|
import type { JobOptions, QueueService } from '../wirings/queue/queue.types.js';
|
|
2
2
|
import type { Logger } from './logger.js';
|
|
3
3
|
import { type SendWebhookInput, type SendWebhookResult, type WebhookJobData, WebhookService } from './webhook-service.js';
|
|
4
|
-
/**
|
|
5
|
-
* Default {@link WebhookService} implementation: serializes and signs the
|
|
6
|
-
* payload, then enqueues a delivery job onto the `pikku-outgoing-webhooks`
|
|
7
|
-
* queue. The signature is computed at enqueue time so the signing key never
|
|
8
|
-
* enters the queue payload; the actual HTTP POST happens in
|
|
9
|
-
* {@link pikkuWebhookWorkerFunc}, and the queue's `attempts`/`backoff`
|
|
10
|
-
* options drive retries.
|
|
11
|
-
*/
|
|
12
4
|
export declare class QueueWebhookService extends WebhookService {
|
|
13
5
|
protected queueService: QueueService;
|
|
14
|
-
/**
|
|
15
|
-
* The queue is a constructor dependency rather than a `getSingletonServices()`
|
|
16
|
-
* lookup so that a project wiring up outgoing webhooks without a queue fails
|
|
17
|
-
* to compile, instead of throwing on the first `send()`.
|
|
18
|
-
*/
|
|
19
6
|
constructor(queueService: QueueService);
|
|
20
7
|
send(input: SendWebhookInput): Promise<SendWebhookResult>;
|
|
21
8
|
/**
|
|
22
|
-
*
|
|
23
|
-
* `
|
|
24
|
-
* store-backed subclass can persist a delivery row and attach its
|
|
25
|
-
* `deliveryId` without re-implementing signing or the retry policy.
|
|
9
|
+
* `protected` so a store-backed subclass can persist a delivery row and attach
|
|
10
|
+
* its `deliveryId` without re-implementing signing or the retry policy.
|
|
26
11
|
*/
|
|
27
12
|
protected prepareDelivery(input: SendWebhookInput): Promise<{
|
|
28
13
|
jobData: WebhookJobData;
|
|
29
14
|
options: JobOptions;
|
|
30
15
|
}>;
|
|
31
|
-
/**
|
|
32
|
-
* Resolve a delivery's retry policy into queue job options, mirroring the
|
|
33
|
-
* workflow service: per-call values win over `config.webhook` defaults, an
|
|
34
|
-
* explicitly-set `retries` (including 0) is always honored, and `attempts`
|
|
35
|
-
* is ALWAYS passed so the queue can never fall back to its own default.
|
|
36
|
-
* Backoff is exponential unless a concrete `retryDelay` selects a fixed one.
|
|
37
|
-
*/
|
|
38
16
|
private resolveJobOptions;
|
|
39
17
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Queue worker for the `pikku-outgoing-webhooks` queue: POSTs the delivery to its
|
|
42
|
-
* target URL. Any non-2xx response (or network error) throws so the queue
|
|
43
|
-
* retries the job according to the `attempts`/`backoff` set at enqueue time;
|
|
44
|
-
* the queue runner logs each failed attempt.
|
|
45
|
-
*
|
|
46
|
-
* A `deliveryId` is only present when a store-backed `webhookService` (e.g.
|
|
47
|
-
* `KyselyWebhookService`) enqueued the job, so each attempt (success or failure)
|
|
48
|
-
* is persisted via `webhookService.recordAttempt` before the throw — the console
|
|
49
|
-
* delivery history reflects every try, not just the outcome. The queue-only
|
|
50
|
-
* default never sets a `deliveryId`, so its base `recordAttempt` is never hit.
|
|
51
|
-
*/
|
|
52
18
|
export declare function pikkuWebhookWorkerFunc(services: {
|
|
53
19
|
logger: Logger;
|
|
54
20
|
webhookService?: WebhookService;
|