@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,21 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from 'crypto';
|
|
2
2
|
import { PikkuWorkflowService } from '../wirings/workflow/pikku-workflow-service.js';
|
|
3
3
|
import { isExpectedError } from '../errors/error-handler.js';
|
|
4
|
-
|
|
5
|
-
* In-memory implementation of WorkflowService for inline-only execution
|
|
6
|
-
*
|
|
7
|
-
* This is a lightweight workflow service that stores all state in memory.
|
|
8
|
-
* It only supports inline execution (no queue workers) and is ideal for:
|
|
9
|
-
* - CLI tools that need workflow-like step orchestration
|
|
10
|
-
* - Testing and development
|
|
11
|
-
* - Single-process applications without persistence requirements
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const workflowService = new InMemoryWorkflowService()
|
|
16
|
-
* await workflowService.startWorkflow('myWorkflow', input, { type: 'cli' }, rpc, { inline: true })
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
4
|
+
// knowledge: decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md
|
|
19
5
|
export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
20
6
|
constructor(options = {}) {
|
|
21
7
|
super({ ...options, wireQueues: false });
|
|
@@ -99,7 +85,7 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
99
85
|
const key = `${runId}:${stepName}`;
|
|
100
86
|
this.steps.set(key, step);
|
|
101
87
|
this.stepData.set(stepId, { rpcName, data, stepName });
|
|
102
|
-
//
|
|
88
|
+
// knowledge: decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md
|
|
103
89
|
const history = this.stepHistory.get(runId) || [];
|
|
104
90
|
history.push(step);
|
|
105
91
|
this.stepHistory.set(runId, history);
|
|
@@ -170,7 +156,6 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
170
156
|
}
|
|
171
157
|
}
|
|
172
158
|
async createRetryAttemptImpl(failedStepId, status) {
|
|
173
|
-
// Find the failed step
|
|
174
159
|
let failedStep;
|
|
175
160
|
let runId;
|
|
176
161
|
let stepName;
|
|
@@ -205,11 +190,10 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
205
190
|
}
|
|
206
191
|
const key = `${runId}:${stepName}`;
|
|
207
192
|
this.steps.set(key, newStep);
|
|
208
|
-
// Copy step data to new step
|
|
209
193
|
if (failedStepData) {
|
|
210
194
|
this.stepData.set(newStepId, { ...failedStepData });
|
|
211
195
|
}
|
|
212
|
-
//
|
|
196
|
+
// knowledge: decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md
|
|
213
197
|
const history = this.stepHistory.get(runId) || [];
|
|
214
198
|
history.push(newStep);
|
|
215
199
|
this.stepHistory.set(runId, history);
|
|
@@ -265,11 +249,10 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
265
249
|
return existed;
|
|
266
250
|
}
|
|
267
251
|
async withRunLock(_id, fn) {
|
|
268
|
-
//
|
|
252
|
+
// knowledge: decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md
|
|
269
253
|
return fn();
|
|
270
254
|
}
|
|
271
255
|
async withStepLock(_runId, _stepName, fn) {
|
|
272
|
-
// In-memory service doesn't need locking for inline execution
|
|
273
256
|
return fn();
|
|
274
257
|
}
|
|
275
258
|
async close() {
|
|
@@ -277,7 +260,6 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
277
260
|
clearTimeout(timer);
|
|
278
261
|
}
|
|
279
262
|
this.sleepTimers.clear();
|
|
280
|
-
// Clear all in-memory state
|
|
281
263
|
this.runs.clear();
|
|
282
264
|
this.steps.clear();
|
|
283
265
|
this.stepData.clear();
|
|
@@ -286,7 +268,6 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
286
268
|
this.branchKeys.clear();
|
|
287
269
|
this.workflowVersions.clear();
|
|
288
270
|
}
|
|
289
|
-
// Graph workflow methods
|
|
290
271
|
async getCompletedGraphState(runId) {
|
|
291
272
|
const completedNodeIds = [];
|
|
292
273
|
const failedNodeIds = [];
|
|
@@ -314,16 +295,6 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
314
295
|
}
|
|
315
296
|
return { completedNodeIds, failedNodeIds, branchKeys };
|
|
316
297
|
}
|
|
317
|
-
async getNodesWithoutSteps(runId, nodeIds) {
|
|
318
|
-
const existingSteps = new Set();
|
|
319
|
-
const prefix = `${runId}:`;
|
|
320
|
-
for (const [key] of this.steps.entries()) {
|
|
321
|
-
if (key.startsWith(prefix)) {
|
|
322
|
-
existingSteps.add(key.substring(prefix.length));
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return nodeIds.filter((id) => !existingSteps.has(id));
|
|
326
|
-
}
|
|
327
298
|
async listStepStates(runId) {
|
|
328
299
|
const prefix = `${runId}:`;
|
|
329
300
|
const steps = [];
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module @pikku/core
|
|
3
|
-
*/
|
|
4
1
|
export { LogLevel } from './logger.js';
|
|
5
2
|
export { ScopedSecretService } from './scoped-secret-service.js';
|
|
6
3
|
export { PikkuSessionService, createMiddlewareSessionWireProps, createFunctionSessionWireProps, } from './user-session-service.js';
|
|
@@ -19,14 +16,13 @@ export { InMemoryTriggerService } from './in-memory-trigger-service.js';
|
|
|
19
16
|
export { InMemoryAIRunStateService } from './in-memory-ai-run-state-service.js';
|
|
20
17
|
export { LocalGatewayService } from './local-gateway-service.js';
|
|
21
18
|
export type { ContentService, SignContentKeyArgs, SignURLArgs, GetUploadURLArgs, UploadURLResult, BucketKeyArgs, WriteFileArgs, CopyFileArgs, } from './content-service.js';
|
|
22
|
-
export type {
|
|
23
|
-
export {
|
|
24
|
-
export { HttpScenarioActor, createHttpScenarioActors, type HttpScenarioActorsConfig, } from './http-scenario-actors.js';
|
|
19
|
+
export type { ScenarioPersona, ResolvedPersona, ScenarioPersonaOf, ScenarioPersonas, ScenarioInvokeOptions, ScenarioRpcMap, ScenarioHttpResponse, } from './personas-service.js';
|
|
20
|
+
export type { HttpPersonasConfig } from './http-personas.js';
|
|
25
21
|
export type { JWTService } from './jwt-service.js';
|
|
26
22
|
export type { EmailService, EmailTemplateReference, SendEmailInput, SendEmailResult, SendHTMLEmailInput, SendTemplateEmailInput, SendTextEmailInput, } from './email-service.js';
|
|
27
23
|
export { DEFAULT_WEBHOOK_RETRIES, DEFAULT_WEBHOOK_SIGNATURE_HEADER, PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME, WebhookService, type SendWebhookInput, type SendWebhookResult, type WebhookAttemptRecord, type WebhookAttemptResult, type WebhookDeliveryRecord, type WebhookDeliveryWithAttempts, type WebhookJobData, type WebhookServiceConfig, } from './webhook-service.js';
|
|
28
24
|
export type { Logger } from './logger.js';
|
|
29
|
-
export type { SecretService } from './secret-service.js';
|
|
25
|
+
export type { SecretService, SecretValues } from './secret-service.js';
|
|
30
26
|
export type { VariablesService } from './variables-service.js';
|
|
31
27
|
export type { SchemaService } from './schema-service.js';
|
|
32
28
|
export type { SessionService } from './user-session-service.js';
|
|
@@ -46,9 +42,12 @@ export type { VariableStatus, VariableMeta } from './typed-variables-service.js'
|
|
|
46
42
|
export type { MetaService } from './meta-service.js';
|
|
47
43
|
export type { SessionStore } from './session-store.js';
|
|
48
44
|
export type { ScopeService, Role } from './scope-service.js';
|
|
49
|
-
export {
|
|
50
|
-
export type {
|
|
45
|
+
export { assertRoleIsMutable, assertRoleNameAvailable, roleLockReason, } from './system-role-guard.js';
|
|
46
|
+
export type { IsSystemRole } from './system-role-guard.js';
|
|
47
|
+
export { NoopAuditService, createInvocationAudit, resolveAuditConfig, resolveAuditUserIdentityFromWire, } from './audit-service.js';
|
|
48
|
+
export type { AuditConfig, AuditDurability, AuditEvent, AuditEventBatch, AuditLog, AuditLogWriteInput, AuditOutcome, AuditService, AuditSource, AuditUserIdentity, ResolvedAuditConfig, } from './audit-service.js';
|
|
51
49
|
export { InMemorySessionStore } from './in-memory-session-store.js';
|
|
52
50
|
export type { MCPMeta, RPCMetaRecord, ServiceMeta, ServicesMetaRecord, MiddlewareDefinitionMeta, MiddlewareInstanceMeta, GroupMeta, MiddlewareGroupsMeta, PermissionDefinitionMeta, PermissionsGroupsMeta, FunctionsMeta, FunctionMeta, MiddlewareMeta, PermissionMeta, AgentsMeta, AgentMeta, EmailsMeta, EmailTemplateMeta, EmailTemplateLocaleMeta, EmailTemplateAssets, } from './meta-service.js';
|
|
53
51
|
export type { CoverageService, CoverageSnapshot, LineHits, ScriptCoverage, FunctionCoverage, CoverageRange, CoverageStatus, FunctionCoverageEntry, FunctionCoverageReport, CoverageFunctionMeta, } from './v8-coverage-service.js';
|
|
54
52
|
export { StubTracker, createStubProxy, getStubTracker, isTestRun, stub, spy, type StubCall, } from './stub-tracker.js';
|
|
53
|
+
export { SecretHostNotAllowedError, assertSecretAllowedForHost, } from './secret-host-binding.js';
|
package/dist/services/index.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module @pikku/core
|
|
3
|
-
*/
|
|
4
1
|
export { LogLevel } from './logger.js';
|
|
5
2
|
export { ScopedSecretService } from './scoped-secret-service.js';
|
|
6
3
|
export { PikkuSessionService, createMiddlewareSessionWireProps, createFunctionSessionWireProps, } from './user-session-service.js';
|
|
@@ -18,10 +15,10 @@ export { InMemoryQueueService } from './in-memory-queue-service.js';
|
|
|
18
15
|
export { InMemoryTriggerService } from './in-memory-trigger-service.js';
|
|
19
16
|
export { InMemoryAIRunStateService } from './in-memory-ai-run-state-service.js';
|
|
20
17
|
export { LocalGatewayService } from './local-gateway-service.js';
|
|
21
|
-
export { readScenarioHttpResponse } from './scenario-actors-service.js';
|
|
22
|
-
export { HttpScenarioActor, createHttpScenarioActors, } from './http-scenario-actors.js';
|
|
23
18
|
export { DEFAULT_WEBHOOK_RETRIES, DEFAULT_WEBHOOK_SIGNATURE_HEADER, PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME, WebhookService, } from './webhook-service.js';
|
|
24
19
|
export { TypedCredentialService } from './typed-credential-service.js';
|
|
25
|
-
export {
|
|
20
|
+
export { assertRoleIsMutable, assertRoleNameAvailable, roleLockReason, } from './system-role-guard.js';
|
|
21
|
+
export { NoopAuditService, createInvocationAudit, resolveAuditConfig, resolveAuditUserIdentityFromWire, } from './audit-service.js';
|
|
26
22
|
export { InMemorySessionStore } from './in-memory-session-store.js';
|
|
27
23
|
export { StubTracker, createStubProxy, getStubTracker, isTestRun, stub, spy, } from './stub-tracker.js';
|
|
24
|
+
export { SecretHostNotAllowedError, assertSecretAllowedForHost, } from './secret-host-binding.js';
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import type { CoverageService, CoverageSnapshot } from './v8-coverage-service.js';
|
|
2
|
-
/**
|
|
3
|
-
* Reads istanbul-instrumented counters from the `__coverage__` global —
|
|
4
|
-
* the coverage backend for runtimes without V8 precise coverage (e.g. Bun,
|
|
5
|
-
* where source files are instrumented at load time by a Bun loader plugin).
|
|
6
|
-
*/
|
|
2
|
+
/** The coverage backend for runtimes without V8 precise coverage, e.g. Bun. */
|
|
7
3
|
export declare class IstanbulCoverageService implements CoverageService {
|
|
8
4
|
start(): Promise<void>;
|
|
9
5
|
takeCoverage(): Promise<CoverageSnapshot>;
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
const getCoverageGlobal = () => globalThis.__coverage__;
|
|
2
|
-
/**
|
|
3
|
-
* Reads istanbul-instrumented counters from the `__coverage__` global —
|
|
4
|
-
* the coverage backend for runtimes without V8 precise coverage (e.g. Bun,
|
|
5
|
-
* where source files are instrumented at load time by a Bun loader plugin).
|
|
6
|
-
*/
|
|
2
|
+
/** The coverage backend for runtimes without V8 precise coverage, e.g. Bun. */
|
|
7
3
|
export class IstanbulCoverageService {
|
|
8
4
|
async start() { }
|
|
9
5
|
async takeCoverage() {
|
|
@@ -15,9 +11,7 @@ export class IstanbulCoverageService {
|
|
|
15
11
|
hits = new Map();
|
|
16
12
|
lineHits.set(file.path, hits);
|
|
17
13
|
}
|
|
18
|
-
//
|
|
19
|
-
// line only, so an enclosing multi-line statement never masks an
|
|
20
|
-
// unexecuted inner statement (e.g. a throw inside a taken if).
|
|
14
|
+
// knowledge: decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md
|
|
21
15
|
for (const [id, location] of Object.entries(file.statementMap)) {
|
|
22
16
|
const count = file.s[id] ?? 0;
|
|
23
17
|
const line = location.start.line;
|
|
@@ -1,21 +1,6 @@
|
|
|
1
1
|
import type { RelativeTimeInput } from '../time-utils.js';
|
|
2
|
-
/**
|
|
3
|
-
* Interface for handling JSON Web Tokens (JWT).
|
|
4
|
-
*/
|
|
5
2
|
export interface JWTService {
|
|
6
|
-
/**
|
|
7
|
-
* Encodes a payload into a JWT.
|
|
8
|
-
* @param expiresIn - The expiration time of the token.
|
|
9
|
-
* @param payload - The payload to encode.
|
|
10
|
-
* @returns A promise that resolves to the encoded JWT.
|
|
11
|
-
*/
|
|
12
3
|
encode: <T extends any>(expiresIn: RelativeTimeInput, payload: T) => Promise<string>;
|
|
13
|
-
/**
|
|
14
|
-
* Decodes a JWT into its payload.
|
|
15
|
-
* @param hash - The JWT to decode.
|
|
16
|
-
* @param invalidHashError - An optional error to throw if the hash is invalid.
|
|
17
|
-
* @param debug - An optional flag for debugging.
|
|
18
|
-
* @returns A promise that resolves to the decoded payload.
|
|
19
|
-
*/
|
|
4
|
+
/** `invalidHashError` replaces the implementation's own error when the hash does not verify. */
|
|
20
5
|
decode: <T>(hash: string, invalidHashError?: Error, debug?: boolean) => Promise<T>;
|
|
21
6
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { JWTService, Logger } from '@pikku/core/services';
|
|
2
|
+
import { type LocalContentConfig } from './local-content.js';
|
|
3
|
+
/**
|
|
4
|
+
* The server half of {@link LocalContent}.
|
|
5
|
+
*
|
|
6
|
+
* `LocalContent` hands out `PUT <uploadUrlPrefix>/<key>` upload URLs and signed
|
|
7
|
+
* `GET <assetUrlPrefix>/<key>` read URLs, but it cannot answer either: it is a
|
|
8
|
+
* `ContentService`, not a transport. Something in the serving path has to, and
|
|
9
|
+
* until now only `@pikku/node-http-server` did — so the very same project served
|
|
10
|
+
* under Bun handed the browser upload URLs that 404ed, with nothing naming the
|
|
11
|
+
* cause.
|
|
12
|
+
*
|
|
13
|
+
* Expressed in Web `Request`/`Response` so every runtime can share one
|
|
14
|
+
* implementation rather than each re-deriving the signature check. Returns
|
|
15
|
+
* `null` for anything that is not a content request, which is the caller's
|
|
16
|
+
* signal to carry on with its normal routing.
|
|
17
|
+
*/
|
|
18
|
+
export type LocalContentRequestHandler = (request: Request) => Promise<Response | null>;
|
|
19
|
+
export type LocalContentRequestHandlerOptions = {
|
|
20
|
+
content: LocalContentConfig;
|
|
21
|
+
logger: Logger;
|
|
22
|
+
/**
|
|
23
|
+
* Resolved per request rather than passed by value: a runtime may only be
|
|
24
|
+
* able to reach the signing service through `singletonServices`, which is not
|
|
25
|
+
* populated until after the server is constructed.
|
|
26
|
+
*/
|
|
27
|
+
getJWT: () => JWTService | undefined;
|
|
28
|
+
};
|
|
29
|
+
export declare const createLocalContentRequestHandler: ({ content, logger, getJWT, }: LocalContentRequestHandlerOptions) => LocalContentRequestHandler;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { createReadStream } from 'fs';
|
|
2
|
+
import { mkdir, stat, writeFile } from 'fs/promises';
|
|
3
|
+
import { normalize, resolve } from 'path';
|
|
4
|
+
import { Readable } from 'stream';
|
|
5
|
+
import { signedContentPath } from './local-content.js';
|
|
6
|
+
const matchesPrefix = (pathname, prefix) => pathname === prefix || pathname.startsWith(`${prefix}/`);
|
|
7
|
+
const contentKey = (pathname, prefix) => pathname.slice(prefix.length).replace(/^\/+/, '');
|
|
8
|
+
/**
|
|
9
|
+
* Resolve a key against the content root, or `null` if it escapes. `normalize`
|
|
10
|
+
* first so `..` segments are collapsed before the prefix check, and the
|
|
11
|
+
* comparison carries a trailing separator so a sibling directory whose name
|
|
12
|
+
* merely starts with the root's cannot pass as being inside it.
|
|
13
|
+
*/
|
|
14
|
+
const toTargetPath = (basePath, key) => {
|
|
15
|
+
const normalizedBasePath = resolve(basePath);
|
|
16
|
+
const targetPath = resolve(normalizedBasePath, normalize(key));
|
|
17
|
+
return targetPath.startsWith(`${normalizedBasePath}/`) ? targetPath : null;
|
|
18
|
+
};
|
|
19
|
+
const parseSizeLimit = (sizeLimit) => {
|
|
20
|
+
const match = /^(\d+(?:\.\d+)?)(b|kb|mb|gb)?$/i.exec(sizeLimit.trim());
|
|
21
|
+
if (!match) {
|
|
22
|
+
throw new Error(`Invalid size limit: ${sizeLimit}`);
|
|
23
|
+
}
|
|
24
|
+
const value = Number(match[1]);
|
|
25
|
+
const unit = (match[2] ?? 'b').toLowerCase();
|
|
26
|
+
const multiplier = unit === 'gb'
|
|
27
|
+
? 1024 * 1024 * 1024
|
|
28
|
+
: unit === 'mb'
|
|
29
|
+
? 1024 * 1024
|
|
30
|
+
: unit === 'kb'
|
|
31
|
+
? 1024
|
|
32
|
+
: 1;
|
|
33
|
+
return value * multiplier;
|
|
34
|
+
};
|
|
35
|
+
const text = (status, body) => new Response(body, {
|
|
36
|
+
status,
|
|
37
|
+
headers: { 'content-type': 'text/plain; charset=utf-8' },
|
|
38
|
+
});
|
|
39
|
+
export const createLocalContentRequestHandler = ({ content, logger, getJWT, }) => {
|
|
40
|
+
// Logged at most once. An unverifiable request is attacker-triggerable, so
|
|
41
|
+
// this reports a startup misconfiguration rather than per-request news.
|
|
42
|
+
let loggedMissingJWT = false;
|
|
43
|
+
const validateSignedAssetRequest = async (requestUrl) => {
|
|
44
|
+
const signedAtValue = requestUrl.searchParams.get('signedAt');
|
|
45
|
+
const expiresAtValue = requestUrl.searchParams.get('expiresAt');
|
|
46
|
+
const notBeforeValue = requestUrl.searchParams.get('notBefore');
|
|
47
|
+
const signature = requestUrl.searchParams.get('signature');
|
|
48
|
+
if (!signedAtValue || !expiresAtValue) {
|
|
49
|
+
return { ok: false, status: 403, body: 'Signed URL required' };
|
|
50
|
+
}
|
|
51
|
+
const signedAt = Number(signedAtValue);
|
|
52
|
+
const expiresAt = Number(expiresAtValue);
|
|
53
|
+
const notBefore = notBeforeValue == null ? undefined : Number(notBeforeValue);
|
|
54
|
+
if (!Number.isFinite(signedAt) ||
|
|
55
|
+
!Number.isFinite(expiresAt) ||
|
|
56
|
+
(notBefore != null && !Number.isFinite(notBefore))) {
|
|
57
|
+
return { ok: false, status: 403, body: 'Invalid signed URL' };
|
|
58
|
+
}
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
if (now > expiresAt || (notBefore != null && now < notBefore)) {
|
|
61
|
+
return { ok: false, status: 403, body: 'Signed URL expired' };
|
|
62
|
+
}
|
|
63
|
+
const jwt = getJWT();
|
|
64
|
+
if (!jwt) {
|
|
65
|
+
if (!loggedMissingJWT) {
|
|
66
|
+
loggedMissingJWT = true;
|
|
67
|
+
logger.error('pikku: refusing signed asset reads — no JWTService is available to verify them. Pass `contentSigningJWT` (the same service LocalContent signs with) or expose it as `singletonServices.jwt`.');
|
|
68
|
+
}
|
|
69
|
+
return { ok: false, status: 403, body: 'Invalid signed URL' };
|
|
70
|
+
}
|
|
71
|
+
if (!signature) {
|
|
72
|
+
return { ok: false, status: 403, body: 'Signed URL signature required' };
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const payload = await jwt.decode(signature);
|
|
76
|
+
// Every claim is compared, the path included: without it a signature
|
|
77
|
+
// minted for one asset would read any other.
|
|
78
|
+
if (payload.signedAt !== signedAt ||
|
|
79
|
+
payload.expiresAt !== expiresAt ||
|
|
80
|
+
payload.notBefore !== notBefore ||
|
|
81
|
+
payload.path !== signedContentPath(requestUrl.pathname)) {
|
|
82
|
+
return { ok: false, status: 403, body: 'Invalid signed URL' };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return { ok: false, status: 403, body: 'Invalid signed URL' };
|
|
87
|
+
}
|
|
88
|
+
return { ok: true };
|
|
89
|
+
};
|
|
90
|
+
const handleUpload = async (request, pathname) => {
|
|
91
|
+
const key = contentKey(pathname, content.uploadUrlPrefix);
|
|
92
|
+
const targetPath = toTargetPath(content.localFileUploadPath, key);
|
|
93
|
+
if (!targetPath) {
|
|
94
|
+
return text(400, 'Invalid path');
|
|
95
|
+
}
|
|
96
|
+
const maxBytes = parseSizeLimit(content.sizeLimit ?? '1mb');
|
|
97
|
+
// Counted as it arrives and abandoned the moment it goes over, so an
|
|
98
|
+
// oversized upload costs the limit rather than its own size — `arrayBuffer()`
|
|
99
|
+
// would have to hold all of it first, which hands an unauthenticated caller
|
|
100
|
+
// a way to spend the server's memory. Mirrors node-http-server's
|
|
101
|
+
// `readRequestBody`, which aborts the same way.
|
|
102
|
+
const chunks = [];
|
|
103
|
+
let bytesRead = 0;
|
|
104
|
+
const reader = request.body?.getReader();
|
|
105
|
+
if (reader) {
|
|
106
|
+
try {
|
|
107
|
+
for (;;) {
|
|
108
|
+
const { done, value } = await reader.read();
|
|
109
|
+
if (done)
|
|
110
|
+
break;
|
|
111
|
+
bytesRead += value.byteLength;
|
|
112
|
+
if (bytesRead > maxBytes) {
|
|
113
|
+
await reader.cancel();
|
|
114
|
+
return text(413, 'Content too large');
|
|
115
|
+
}
|
|
116
|
+
chunks.push(Buffer.from(value));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
reader.releaseLock();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
await mkdir(resolve(targetPath, '..'), { recursive: true });
|
|
124
|
+
await writeFile(targetPath, Buffer.concat(chunks));
|
|
125
|
+
return new Response(null, { status: 200 });
|
|
126
|
+
};
|
|
127
|
+
const handleAsset = async (request, requestUrl, pathname) => {
|
|
128
|
+
const key = contentKey(pathname, content.assetUrlPrefix);
|
|
129
|
+
const targetPath = toTargetPath(content.localFileUploadPath, key);
|
|
130
|
+
if (!targetPath) {
|
|
131
|
+
return text(400, 'Invalid path');
|
|
132
|
+
}
|
|
133
|
+
const signed = await validateSignedAssetRequest(requestUrl);
|
|
134
|
+
if (!signed.ok) {
|
|
135
|
+
return text(signed.status, signed.body);
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const file = await stat(targetPath);
|
|
139
|
+
if (!file.isFile()) {
|
|
140
|
+
return new Response(null, { status: 404 });
|
|
141
|
+
}
|
|
142
|
+
const headers = {
|
|
143
|
+
'content-length': String(file.size),
|
|
144
|
+
'content-type': 'application/octet-stream',
|
|
145
|
+
};
|
|
146
|
+
if (request.method === 'HEAD') {
|
|
147
|
+
return new Response(null, { status: 200, headers });
|
|
148
|
+
}
|
|
149
|
+
// Streamed rather than buffered: assets are user uploads, and their size
|
|
150
|
+
// is bounded by `sizeLimit` at write time, not by anything here.
|
|
151
|
+
return new Response(Readable.toWeb(createReadStream(targetPath)), { status: 200, headers });
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return new Response(null, { status: 404 });
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
return async (request) => {
|
|
158
|
+
let requestUrl;
|
|
159
|
+
try {
|
|
160
|
+
requestUrl = new URL(request.url);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
const pathname = decodeURIComponent(requestUrl.pathname);
|
|
166
|
+
if (request.method === 'PUT' &&
|
|
167
|
+
matchesPrefix(pathname, content.uploadUrlPrefix)) {
|
|
168
|
+
return handleUpload(request, pathname);
|
|
169
|
+
}
|
|
170
|
+
if ((request.method === 'GET' || request.method === 'HEAD') &&
|
|
171
|
+
matchesPrefix(pathname, content.assetUrlPrefix)) {
|
|
172
|
+
return handleAsset(request, requestUrl, pathname);
|
|
173
|
+
}
|
|
174
|
+
return null;
|
|
175
|
+
};
|
|
176
|
+
};
|
|
@@ -6,11 +6,22 @@ export interface LocalContentConfig {
|
|
|
6
6
|
server?: string;
|
|
7
7
|
sizeLimit?: string;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* The representation of an asset that gets bound into a signed URL's
|
|
11
|
+
* signature, and that a server can reconstruct from an incoming request:
|
|
12
|
+
* the decoded path, without origin or query string.
|
|
13
|
+
*
|
|
14
|
+
* Both sides must derive it the same way, so signer and verifier share this
|
|
15
|
+
* function. Percent escapes are decoded so that a client re-encoding an
|
|
16
|
+
* optional character still matches; a malformed escape is left verbatim
|
|
17
|
+
* rather than throwing, which keeps both sides in agreement.
|
|
18
|
+
*/
|
|
19
|
+
export declare const signedContentPath: (urlOrPath: string) => string;
|
|
9
20
|
export declare class LocalContent implements ContentService {
|
|
10
21
|
private config;
|
|
11
22
|
private logger;
|
|
12
|
-
private jwt
|
|
13
|
-
constructor(config: LocalContentConfig, logger: Logger, jwt
|
|
23
|
+
private jwt;
|
|
24
|
+
constructor(config: LocalContentConfig, logger: Logger, jwt: JWTService);
|
|
14
25
|
private safePath;
|
|
15
26
|
private joinKey;
|
|
16
27
|
init(): Promise<void>;
|
|
@@ -2,6 +2,31 @@ import { createReadStream, createWriteStream, promises } from 'fs';
|
|
|
2
2
|
import { mkdir, readFile } from 'fs/promises';
|
|
3
3
|
import { resolve, normalize } from 'path';
|
|
4
4
|
import { pipeline } from 'stream/promises';
|
|
5
|
+
/**
|
|
6
|
+
* The representation of an asset that gets bound into a signed URL's
|
|
7
|
+
* signature, and that a server can reconstruct from an incoming request:
|
|
8
|
+
* the decoded path, without origin or query string.
|
|
9
|
+
*
|
|
10
|
+
* Both sides must derive it the same way, so signer and verifier share this
|
|
11
|
+
* function. Percent escapes are decoded so that a client re-encoding an
|
|
12
|
+
* optional character still matches; a malformed escape is left verbatim
|
|
13
|
+
* rather than throwing, which keeps both sides in agreement.
|
|
14
|
+
*/
|
|
15
|
+
export const signedContentPath = (urlOrPath) => {
|
|
16
|
+
let pathname;
|
|
17
|
+
try {
|
|
18
|
+
pathname = new URL(urlOrPath, 'http://pikku.local').pathname;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
pathname = urlOrPath;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
return decodeURIComponent(pathname);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return pathname;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
5
30
|
export class LocalContent {
|
|
6
31
|
config;
|
|
7
32
|
logger;
|
|
@@ -10,6 +35,9 @@ export class LocalContent {
|
|
|
10
35
|
this.config = config;
|
|
11
36
|
this.logger = logger;
|
|
12
37
|
this.jwt = jwt;
|
|
38
|
+
if (!jwt) {
|
|
39
|
+
throw new Error('LocalContent requires a JWTService: without one it cannot sign asset URLs, and unsigned URLs cannot be verified.');
|
|
40
|
+
}
|
|
13
41
|
}
|
|
14
42
|
safePath(bucket, key) {
|
|
15
43
|
const base = resolve(this.config.localFileUploadPath);
|
|
@@ -24,7 +52,7 @@ export class LocalContent {
|
|
|
24
52
|
return `${bucket}/${key}`;
|
|
25
53
|
}
|
|
26
54
|
async init() { }
|
|
27
|
-
async signParams(dateLessThan, dateGreaterThan) {
|
|
55
|
+
async signParams(url, dateLessThan, dateGreaterThan) {
|
|
28
56
|
const signedAt = Date.now();
|
|
29
57
|
const expiresAt = dateLessThan.getTime();
|
|
30
58
|
const params = new URLSearchParams({
|
|
@@ -34,22 +62,21 @@ export class LocalContent {
|
|
|
34
62
|
if (dateGreaterThan) {
|
|
35
63
|
params.set('notBefore', String(dateGreaterThan.getTime()));
|
|
36
64
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
const signature = await this.jwt.encode({ value: expiresInSeconds, unit: 'second' }, payload);
|
|
47
|
-
params.set('signature', signature);
|
|
65
|
+
const expiresInSeconds = Math.max(1, Math.floor((expiresAt - signedAt) / 1000));
|
|
66
|
+
const payload = {
|
|
67
|
+
signedAt,
|
|
68
|
+
expiresAt,
|
|
69
|
+
path: signedContentPath(url),
|
|
70
|
+
};
|
|
71
|
+
if (dateGreaterThan) {
|
|
72
|
+
payload.notBefore = dateGreaterThan.getTime();
|
|
48
73
|
}
|
|
74
|
+
const signature = await this.jwt.encode({ value: expiresInSeconds, unit: 'second' }, payload);
|
|
75
|
+
params.set('signature', signature);
|
|
49
76
|
return params.toString();
|
|
50
77
|
}
|
|
51
78
|
async signURL(args) {
|
|
52
|
-
const params = await this.signParams(args.dateLessThan, args.dateGreaterThan);
|
|
79
|
+
const params = await this.signParams(args.url, args.dateLessThan, args.dateGreaterThan);
|
|
53
80
|
return `${args.url}?${params}`;
|
|
54
81
|
}
|
|
55
82
|
async signContentKey(args) {
|
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
import type { GatewayService } from './gateway-service.js';
|
|
2
|
-
/**
|
|
3
|
-
* Local GatewayService implementation.
|
|
4
|
-
*
|
|
5
|
-
* Starts all registered listener gateways unconditionally (single-process).
|
|
6
|
-
* For distributed deployments, implement `GatewayService` with leader
|
|
7
|
-
* election or similar coordination.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* const gatewayService = new LocalGatewayService()
|
|
12
|
-
* await gatewayService.start()
|
|
13
|
-
*
|
|
14
|
-
* // On shutdown
|
|
15
|
-
* await gatewayService.stop()
|
|
16
|
-
* ```
|
|
17
|
-
*/
|
|
18
2
|
export declare class LocalGatewayService implements GatewayService {
|
|
19
3
|
private activeAdapters;
|
|
20
4
|
start(): Promise<void>;
|
|
@@ -1,21 +1,6 @@
|
|
|
1
1
|
import { pikkuState, getSingletonServices } from '../pikku-state.js';
|
|
2
2
|
import { createListenerMessageHandler, resolveGatewayAdapter, } from '../wirings/gateway/gateway-runner.js';
|
|
3
|
-
|
|
4
|
-
* Local GatewayService implementation.
|
|
5
|
-
*
|
|
6
|
-
* Starts all registered listener gateways unconditionally (single-process).
|
|
7
|
-
* For distributed deployments, implement `GatewayService` with leader
|
|
8
|
-
* election or similar coordination.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* const gatewayService = new LocalGatewayService()
|
|
13
|
-
* await gatewayService.start()
|
|
14
|
-
*
|
|
15
|
-
* // On shutdown
|
|
16
|
-
* await gatewayService.stop()
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
3
|
+
// knowledge: decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md
|
|
19
4
|
export class LocalGatewayService {
|
|
20
5
|
activeAdapters = new Map();
|
|
21
6
|
async start() {
|
|
@@ -43,7 +28,7 @@ export class LocalGatewayService {
|
|
|
43
28
|
getSingletonServices().logger.error(`Error closing listener gateway '${name}':`, e);
|
|
44
29
|
}
|
|
45
30
|
catch {
|
|
46
|
-
// logger may
|
|
31
|
+
// The logger may already be gone during shutdown.
|
|
47
32
|
}
|
|
48
33
|
}
|
|
49
34
|
}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type SecretValue } from '../secret-value.js';
|
|
2
|
+
import type { SecretService, SecretValues } from './secret-service.js';
|
|
2
3
|
import type { VariablesService } from './variables-service.js';
|
|
3
|
-
/**
|
|
4
|
-
* Service for retrieving secrets from environment variables.
|
|
5
|
-
* Supports storing secrets locally in memory for CLI operations.
|
|
6
|
-
*/
|
|
7
4
|
export declare class LocalSecretService implements SecretService {
|
|
8
5
|
private variables;
|
|
9
6
|
private localSecrets;
|
|
10
7
|
private parseSecret;
|
|
11
8
|
constructor(variables?: VariablesService);
|
|
12
|
-
getSecret<T = string>(key: string): Promise<T
|
|
9
|
+
getSecret<T = string>(key: string): Promise<SecretValue<T>>;
|
|
13
10
|
setSecret(key: string, value: unknown): Promise<void>;
|
|
14
11
|
hasSecret(key: string): Promise<boolean>;
|
|
15
12
|
deleteSecret(key: string): Promise<void>;
|
|
16
|
-
getSecrets<T extends Record<string, unknown> = Record<string, unknown>>(keys: (keyof T & string)[]): Promise<Partial<T
|
|
13
|
+
getSecrets<T extends Record<string, unknown> = Record<string, unknown>>(keys: (keyof T & string)[]): Promise<Partial<SecretValues<T>>>;
|
|
17
14
|
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
+
import { createSecretValue, isSecretValue, } from '../secret-value.js';
|
|
1
2
|
import { LocalVariablesService } from './local-variables.js';
|
|
2
|
-
/**
|
|
3
|
-
* Service for retrieving secrets from environment variables.
|
|
4
|
-
* Supports storing secrets locally in memory for CLI operations.
|
|
5
|
-
*/
|
|
6
3
|
export class LocalSecretService {
|
|
7
4
|
variables;
|
|
8
5
|
localSecrets = new Map();
|
|
@@ -20,16 +17,19 @@ export class LocalSecretService {
|
|
|
20
17
|
async getSecret(key) {
|
|
21
18
|
const localValue = this.localSecrets.get(key);
|
|
22
19
|
if (localValue) {
|
|
23
|
-
return this.parseSecret(localValue);
|
|
20
|
+
return createSecretValue(this.parseSecret(localValue));
|
|
24
21
|
}
|
|
25
22
|
const value = await this.variables.get(key);
|
|
26
23
|
if (value) {
|
|
27
|
-
return this.parseSecret(value);
|
|
24
|
+
return createSecretValue(this.parseSecret(value));
|
|
28
25
|
}
|
|
29
26
|
throw new Error('Requested secret not found');
|
|
30
27
|
}
|
|
31
28
|
async setSecret(key, value) {
|
|
32
|
-
|
|
29
|
+
// Storing the wrapper would serialize it to '[secret]', so unwrap first —
|
|
30
|
+
// writing a secret back to the vault is exactly what this method is for.
|
|
31
|
+
const raw = isSecretValue(value) ? value.reveal() : value;
|
|
32
|
+
this.localSecrets.set(key, typeof raw === 'string' ? raw : JSON.stringify(raw));
|
|
33
33
|
}
|
|
34
34
|
async hasSecret(key) {
|
|
35
35
|
if (this.localSecrets.has(key)) {
|