@pikku/core 0.12.71 → 0.12.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +848 -0
- package/dist/crypto-utils.d.ts +30 -5
- package/dist/crypto-utils.js +146 -41
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +40 -30
- package/dist/function/functions.types.d.ts +44 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -11
- package/dist/handle-error.js +6 -18
- package/dist/index.d.ts +5 -2
- package/dist/index.js +4 -1
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +3 -40
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +3 -2
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +8 -7
- package/dist/schema.d.ts +7 -17
- package/dist/schema.js +30 -18
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.js +1 -2
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +5 -6
- package/dist/services/index.js +2 -5
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +0 -4
- package/dist/services/local-secrets.js +0 -4
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +2 -37
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +9 -41
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +0 -4
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +5 -33
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +0 -7
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +19 -63
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +0 -17
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +99 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +34 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +58 -131
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +49 -20
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +39 -1
- package/dist/wirings/ai-agent/voice-input.js +46 -3
- package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
- package/dist/wirings/ai-agent/voice-output.js +153 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +20 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
- package/dist/wirings/cli/channel/index.d.ts +4 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +1 -100
- package/dist/wirings/http/http-runner.js +12 -166
- package/dist/wirings/http/http.types.d.ts +16 -55
- package/dist/wirings/http/index.d.ts +2 -1
- package/dist/wirings/http/index.js +1 -1
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +6 -36
- package/dist/wirings/http/pikku-fetch-http-request.js +56 -50
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +2 -0
- package/dist/wirings/mcp/mcp-runner.js +6 -16
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +28 -0
- package/dist/wirings/persona/define-personas.js +27 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +125 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +102 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +18 -89
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +16 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -12
- package/dist/wirings/rpc/remote-addon-auth.js +1 -9
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +27 -0
- package/dist/wirings/virtual-user/index.js +8 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +5 -5
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -42
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +0 -18
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +72 -6
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +0 -197
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +34 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +113 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +4 -2
- package/run-tests.sh +0 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +283 -55
- package/src/data-classification.ts +1 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +75 -7
- package/src/function/function-runner.ts +73 -30
- package/src/function/functions.types.ts +56 -136
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/gopass-secrets-removed.test.ts +51 -0
- package/src/handle-error.test.ts +108 -1
- package/src/handle-error.ts +8 -18
- package/src/index.ts +60 -1
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +0 -3
- package/src/middleware/auth-bearer.ts +3 -40
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +24 -9
- package/src/middleware/remote-auth.ts +10 -2
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +172 -0
- package/src/remote.ts +17 -7
- package/src/schema.test.ts +103 -0
- package/src/schema.ts +35 -18
- package/src/scopes.ts +7 -48
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +1 -2
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/deployment-service.ts +3 -9
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +20 -15
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.ts +0 -4
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +2 -37
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.ts +9 -41
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +0 -4
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +5 -33
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +1 -7
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +19 -63
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +0 -26
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +116 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +75 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +36 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +82 -138
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +67 -33
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
- package/src/wirings/ai-agent/index.ts +35 -3
- package/src/wirings/ai-agent/voice-input.test.ts +72 -7
- package/src/wirings/ai-agent/voice-input.ts +48 -3
- package/src/wirings/ai-agent/voice-output.test.ts +422 -0
- package/src/wirings/ai-agent/voice-output.ts +216 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +155 -0
- package/src/wirings/cli/channel/index.ts +9 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +12 -168
- package/src/wirings/http/http.types.ts +17 -62
- package/src/wirings/http/index.ts +5 -1
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +88 -7
- package/src/wirings/http/pikku-fetch-http-request.ts +74 -50
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.test.ts +40 -0
- package/src/wirings/mcp/mcp-runner.ts +9 -15
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +29 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +131 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +453 -0
- package/src/wirings/queue/queue-identity.ts +173 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +19 -89
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +59 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +1 -13
- package/src/wirings/rpc/rpc-runner.test.ts +186 -2
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +76 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -52
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.ts +0 -28
- package/src/wirings/workflow/scenario-service.test.ts +2 -9
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +159 -14
- package/src/wirings/workflow/scenario-step.types.ts +82 -6
- package/src/wirings/workflow/scenario-surface.test.ts +145 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +0 -203
- package/tsconfig.tsbuildinfo +1 -1
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/services/gopass-secrets.ts +0 -78
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decodeBase64UrlText,
|
|
3
|
+
encodeBase64UrlText,
|
|
4
|
+
signWithKeyMaterial,
|
|
5
|
+
verifyWithKeyMaterial,
|
|
6
|
+
} from '../../crypto-utils.js'
|
|
7
|
+
import type { Logger } from '../../services/logger.js'
|
|
8
|
+
import type { SecretService } from '../../services/secret-service.js'
|
|
9
|
+
|
|
10
|
+
export const QUEUE_IDENTITY_SECRET_NAME = 'PIKKU_QUEUE_IDENTITY_SECRET'
|
|
11
|
+
|
|
12
|
+
/** Namespaces the queue signing key away from every other use of the same material. */
|
|
13
|
+
export const QUEUE_IDENTITY_INFO = 'pikku:queue-identity'
|
|
14
|
+
|
|
15
|
+
export const QUEUE_IDENTITY_CLAIM_VERSION = 'pq1'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* What the signature is bound to. `jobId` is only enforced when the producer
|
|
19
|
+
* knew it at signing time — most adapters mint their own id after `add`.
|
|
20
|
+
*/
|
|
21
|
+
export interface QueueIdentityBinding {
|
|
22
|
+
queueName: string
|
|
23
|
+
jobId?: string
|
|
24
|
+
data: unknown
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface QueueIdentityClaim {
|
|
28
|
+
u: string
|
|
29
|
+
q: string
|
|
30
|
+
j?: string
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const stableStringify = (value: unknown): string => {
|
|
34
|
+
if (value === null || typeof value !== 'object') {
|
|
35
|
+
return JSON.stringify(value) ?? 'null'
|
|
36
|
+
}
|
|
37
|
+
if (Array.isArray(value)) {
|
|
38
|
+
return `[${value.map(stableStringify).join(',')}]`
|
|
39
|
+
}
|
|
40
|
+
const record = value as Record<string, unknown>
|
|
41
|
+
const keys = Object.keys(record).sort()
|
|
42
|
+
return `{${keys
|
|
43
|
+
.map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)
|
|
44
|
+
.join(',')}}`
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Round-trips through JSON first so the producer hashes exactly what the
|
|
49
|
+
* transport will deliver, then sorts keys so property order cannot change the
|
|
50
|
+
* digest.
|
|
51
|
+
*/
|
|
52
|
+
const canonicalizePayload = (data: unknown): string =>
|
|
53
|
+
stableStringify(JSON.parse(JSON.stringify(data ?? null)))
|
|
54
|
+
|
|
55
|
+
const signingPayload = (encodedClaim: string, data: unknown): string =>
|
|
56
|
+
`${QUEUE_IDENTITY_CLAIM_VERSION}.${encodedClaim}.${canonicalizePayload(data)}`
|
|
57
|
+
|
|
58
|
+
export const getQueueIdentitySecret = async (
|
|
59
|
+
secrets?: SecretService
|
|
60
|
+
): Promise<string | undefined> => {
|
|
61
|
+
try {
|
|
62
|
+
return (await secrets?.getSecret(QUEUE_IDENTITY_SECRET_NAME)) || undefined
|
|
63
|
+
} catch {
|
|
64
|
+
return undefined
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const signQueueIdentity = async (
|
|
69
|
+
secret: string,
|
|
70
|
+
pikkuUserId: string,
|
|
71
|
+
binding: QueueIdentityBinding
|
|
72
|
+
): Promise<string> => {
|
|
73
|
+
const claim: QueueIdentityClaim = {
|
|
74
|
+
u: pikkuUserId,
|
|
75
|
+
q: binding.queueName,
|
|
76
|
+
...(binding.jobId ? { j: binding.jobId } : {}),
|
|
77
|
+
}
|
|
78
|
+
const encodedClaim = encodeBase64UrlText(JSON.stringify(claim))
|
|
79
|
+
const signature = await signWithKeyMaterial(
|
|
80
|
+
QUEUE_IDENTITY_SECRET_NAME,
|
|
81
|
+
secret,
|
|
82
|
+
QUEUE_IDENTITY_INFO,
|
|
83
|
+
signingPayload(encodedClaim, binding.data)
|
|
84
|
+
)
|
|
85
|
+
return `${QUEUE_IDENTITY_CLAIM_VERSION}.${encodedClaim}.${signature}`
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** The claimed user id, or undefined for anything that does not verify. */
|
|
89
|
+
export const verifyQueueIdentity = async (
|
|
90
|
+
secret: string,
|
|
91
|
+
token: string,
|
|
92
|
+
binding: QueueIdentityBinding
|
|
93
|
+
): Promise<string | undefined> => {
|
|
94
|
+
const parts = token.split('.')
|
|
95
|
+
if (parts.length !== 3) return undefined
|
|
96
|
+
const [version, encodedClaim, signature] = parts as [string, string, string]
|
|
97
|
+
if (version !== QUEUE_IDENTITY_CLAIM_VERSION) return undefined
|
|
98
|
+
|
|
99
|
+
const verified = await verifyWithKeyMaterial(
|
|
100
|
+
QUEUE_IDENTITY_SECRET_NAME,
|
|
101
|
+
secret,
|
|
102
|
+
QUEUE_IDENTITY_INFO,
|
|
103
|
+
signingPayload(encodedClaim, binding.data),
|
|
104
|
+
signature
|
|
105
|
+
)
|
|
106
|
+
if (!verified) return undefined
|
|
107
|
+
|
|
108
|
+
let claim: QueueIdentityClaim
|
|
109
|
+
try {
|
|
110
|
+
claim = JSON.parse(decodeBase64UrlText(encodedClaim)) as QueueIdentityClaim
|
|
111
|
+
} catch {
|
|
112
|
+
return undefined
|
|
113
|
+
}
|
|
114
|
+
if (typeof claim?.u !== 'string' || claim.u.length === 0) return undefined
|
|
115
|
+
if (claim.q !== binding.queueName) return undefined
|
|
116
|
+
if (claim.j !== undefined && claim.j !== binding.jobId) return undefined
|
|
117
|
+
return claim.u
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
let missingSecretLogged = false
|
|
121
|
+
|
|
122
|
+
/** Test seam: the latch is process-wide so the warning is emitted once. */
|
|
123
|
+
export const resetQueueIdentityLogLatch = () => {
|
|
124
|
+
missingSecretLogged = false
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export const warnQueueIdentitySecretMissing = (logger: Logger) => {
|
|
128
|
+
if (missingSecretLogged) return
|
|
129
|
+
missingSecretLogged = true
|
|
130
|
+
logger.warn(
|
|
131
|
+
`No '${QUEUE_IDENTITY_SECRET_NAME}' secret is configured — queue job identities cannot be signed or verified, so pikkuUserId is dropped and queue workers run without one.`
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export const resolveQueueJobIdentity = async ({
|
|
136
|
+
claimedIdentity,
|
|
137
|
+
binding,
|
|
138
|
+
secrets,
|
|
139
|
+
logger,
|
|
140
|
+
}: {
|
|
141
|
+
claimedIdentity: string | undefined
|
|
142
|
+
binding: QueueIdentityBinding
|
|
143
|
+
secrets: SecretService | undefined
|
|
144
|
+
logger: Logger
|
|
145
|
+
}): Promise<string | undefined> => {
|
|
146
|
+
if (!claimedIdentity) return undefined
|
|
147
|
+
|
|
148
|
+
const secret = await getQueueIdentitySecret(secrets)
|
|
149
|
+
if (!secret) {
|
|
150
|
+
warnQueueIdentitySecretMissing(logger)
|
|
151
|
+
return undefined
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
let pikkuUserId: string | undefined
|
|
155
|
+
try {
|
|
156
|
+
pikkuUserId = await verifyQueueIdentity(secret, claimedIdentity, binding)
|
|
157
|
+
} catch (error) {
|
|
158
|
+
logger.error(
|
|
159
|
+
`Could not verify the identity claim on job ${binding.jobId} in queue ${binding.queueName} — the job runs without a pikkuUserId.`,
|
|
160
|
+
error
|
|
161
|
+
)
|
|
162
|
+
return undefined
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (!pikkuUserId) {
|
|
166
|
+
logger.error(
|
|
167
|
+
`Rejected an unsigned or invalid identity claim on job ${binding.jobId} in queue ${binding.queueName} — the job runs without a pikkuUserId.`
|
|
168
|
+
)
|
|
169
|
+
return undefined
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return pikkuUserId
|
|
173
|
+
}
|
|
@@ -12,18 +12,14 @@ import {
|
|
|
12
12
|
pikkuState,
|
|
13
13
|
} from '../../pikku-state.js'
|
|
14
14
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
*/
|
|
15
|
+
import { resolveQueueJobIdentity } from './queue-identity.js'
|
|
16
|
+
|
|
18
17
|
class QueueWorkerNotFoundError extends PikkuError {
|
|
19
18
|
constructor(name: string) {
|
|
20
19
|
super(`Queue processor not found: ${name}`)
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
/**
|
|
25
|
-
* Error class for when a queue job is explicitly failed
|
|
26
|
-
*/
|
|
27
23
|
export class QueueJobFailedError extends PikkuError {
|
|
28
24
|
constructor(jobId: string, reason?: string) {
|
|
29
25
|
super(`Queue job ${jobId} failed${reason ? `: ${reason}` : ''}`)
|
|
@@ -31,18 +27,13 @@ export class QueueJobFailedError extends PikkuError {
|
|
|
31
27
|
}
|
|
32
28
|
}
|
|
33
29
|
|
|
34
|
-
/**
|
|
35
|
-
* Error class for when a queue job is explicitly discarded
|
|
36
|
-
*/
|
|
37
30
|
export class QueueJobDiscardedError extends PikkuError {
|
|
38
31
|
constructor(jobId: string, reason?: string) {
|
|
39
32
|
super(`Queue job ${jobId} discarded${reason ? `: ${reason}` : ''}`)
|
|
40
33
|
this.name = 'QueueJobDiscardedError'
|
|
41
34
|
}
|
|
42
35
|
}
|
|
43
|
-
|
|
44
|
-
* Add a queue processor to the system
|
|
45
|
-
*/
|
|
36
|
+
|
|
46
37
|
export const wireQueueWorker = <
|
|
47
38
|
InputData = any,
|
|
48
39
|
OutputData = any,
|
|
@@ -54,7 +45,6 @@ export const wireQueueWorker = <
|
|
|
54
45
|
>(
|
|
55
46
|
queueWorker: CoreQueueWorker<PikkuFunctionConfig>
|
|
56
47
|
) => {
|
|
57
|
-
// Get processor metadata
|
|
58
48
|
const meta = pikkuState(null, 'queue', 'meta')
|
|
59
49
|
const processorMeta = meta[queueWorker.name]
|
|
60
50
|
if (!processorMeta) {
|
|
@@ -64,7 +54,6 @@ export const wireQueueWorker = <
|
|
|
64
54
|
return
|
|
65
55
|
}
|
|
66
56
|
|
|
67
|
-
// Register the function with pikku
|
|
68
57
|
addFunction(processorMeta.pikkuFuncId, {
|
|
69
58
|
func: queueWorker.func.func,
|
|
70
59
|
auth: queueWorker.func.auth,
|
|
@@ -73,21 +62,14 @@ export const wireQueueWorker = <
|
|
|
73
62
|
tags: queueWorker.func.tags,
|
|
74
63
|
})
|
|
75
64
|
|
|
76
|
-
// Store processor definition in state - runtime adapters will pick this up
|
|
77
65
|
const registrations = pikkuState(null, 'queue', 'registrations')
|
|
78
66
|
registrations.set(queueWorker.name, queueWorker)
|
|
79
67
|
}
|
|
80
68
|
|
|
81
|
-
/**
|
|
82
|
-
* Get all registered queue processors
|
|
83
|
-
*/
|
|
84
69
|
export function getQueueWorkers(): Map<string, CoreQueueWorker> {
|
|
85
70
|
return pikkuState(null, 'queue', 'registrations')
|
|
86
71
|
}
|
|
87
72
|
|
|
88
|
-
/**
|
|
89
|
-
* Stop and remove a queue processor
|
|
90
|
-
*/
|
|
91
73
|
export async function removeQueueWorker(name: string): Promise<void> {
|
|
92
74
|
const registrations = pikkuState(null, 'queue', 'registrations')
|
|
93
75
|
const registration = registrations.get(name)
|
|
@@ -99,9 +81,6 @@ export async function removeQueueWorker(name: string): Promise<void> {
|
|
|
99
81
|
registrations.delete(name)
|
|
100
82
|
}
|
|
101
83
|
|
|
102
|
-
/**
|
|
103
|
-
* Process a single queue job - this function is called by queue consumers
|
|
104
|
-
*/
|
|
105
84
|
export async function runQueueJob({
|
|
106
85
|
job,
|
|
107
86
|
updateProgress,
|
|
@@ -109,7 +88,6 @@ export async function runQueueJob({
|
|
|
109
88
|
}: {
|
|
110
89
|
job: QueueJob
|
|
111
90
|
updateProgress?: (progress: number | string | object) => Promise<void>
|
|
112
|
-
/** Pre-resolved trace ID (e.g. from queue message metadata) */
|
|
113
91
|
traceId?: string
|
|
114
92
|
}): Promise<void> {
|
|
115
93
|
const singletonServices = getSingletonServices()
|
|
@@ -127,23 +105,28 @@ export async function runQueueJob({
|
|
|
127
105
|
)
|
|
128
106
|
}
|
|
129
107
|
|
|
130
|
-
// Get the queue worker registration to access middleware
|
|
131
108
|
const registrations = pikkuState(null, 'queue', 'registrations')
|
|
132
109
|
const queueWorker = registrations.get(job.queueName)
|
|
133
110
|
if (!queueWorker) {
|
|
134
111
|
throw new Error(`Queue worker registration not found for: ${job.queueName}`)
|
|
135
112
|
}
|
|
136
113
|
|
|
137
|
-
//
|
|
114
|
+
// knowledge: decisions/security/queue-job-identities-are-signed-at-enqueue.md
|
|
115
|
+
const pikkuUserId = await resolveQueueJobIdentity({
|
|
116
|
+
claimedIdentity: job.pikkuUserId,
|
|
117
|
+
binding: { queueName: job.queueName, jobId: job.id, data: job.data },
|
|
118
|
+
secrets: singletonServices.secrets,
|
|
119
|
+
logger,
|
|
120
|
+
})
|
|
121
|
+
|
|
138
122
|
const queue: PikkuQueue = {
|
|
139
123
|
queueName: job.queueName,
|
|
140
124
|
jobId: job.id,
|
|
141
|
-
pikkuUserId
|
|
125
|
+
pikkuUserId,
|
|
142
126
|
updateProgress:
|
|
143
127
|
updateProgress ||
|
|
144
128
|
(async (progress: number | string | object) => {
|
|
145
129
|
logger.info(`Job ${job.id} progress: ${progress}`)
|
|
146
|
-
// Default implementation - just log the progress
|
|
147
130
|
}),
|
|
148
131
|
fail: async (reason?: string) => {
|
|
149
132
|
throw new QueueJobFailedError(job.id, reason)
|
|
@@ -161,7 +144,6 @@ export async function runQueueJob({
|
|
|
161
144
|
queue,
|
|
162
145
|
}
|
|
163
146
|
|
|
164
|
-
// Execute the pikku function with the job data
|
|
165
147
|
const result = await runPikkuFunc(
|
|
166
148
|
'queue',
|
|
167
149
|
job.queueName,
|
|
@@ -194,7 +176,6 @@ export async function runQueueJob({
|
|
|
194
176
|
logger.error('Processed error response:', errorResponse)
|
|
195
177
|
}
|
|
196
178
|
|
|
197
|
-
// Re-throw the error so the queue service can handle retries/DLQ
|
|
198
179
|
throw error
|
|
199
180
|
}
|
|
200
181
|
}
|
|
@@ -2,94 +2,58 @@ import type { CommonWireMeta } from '../../types/core.types.js'
|
|
|
2
2
|
import type { CorePikkuFunctionConfig } from '../../function/functions.types.js'
|
|
3
3
|
import type { QueueConfigMapping } from './validate-worker-config.js'
|
|
4
4
|
|
|
5
|
-
/**
|
|
6
|
-
* Configuration for queue workers - how jobs are processed
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Configuration for queue workers - how jobs are processed
|
|
10
|
-
*/
|
|
11
5
|
export interface PikkuWorkerConfig {
|
|
12
|
-
/** Optional worker name for identification and monitoring */
|
|
13
6
|
name?: string
|
|
14
|
-
/**
|
|
7
|
+
/** Total worker concurrency. */
|
|
15
8
|
batchSize?: number
|
|
16
|
-
/** Number of messages to prefetch for efficiency */
|
|
17
9
|
prefetch?: number
|
|
18
|
-
/**
|
|
10
|
+
/** Milliseconds. */
|
|
19
11
|
pollInterval?: number
|
|
20
|
-
/**
|
|
12
|
+
/** Seconds. */
|
|
21
13
|
visibilityTimeout?: number
|
|
22
|
-
/**
|
|
14
|
+
/** Milliseconds. */
|
|
23
15
|
lockDuration?: number
|
|
24
|
-
/**
|
|
16
|
+
/** Seconds. */
|
|
25
17
|
drainDelay?: number
|
|
26
|
-
/**
|
|
18
|
+
/** Number of completed jobs to retain, not an age. */
|
|
27
19
|
removeOnComplete?: number
|
|
28
|
-
/**
|
|
20
|
+
/** Number of failed jobs to retain, not an age. */
|
|
29
21
|
removeOnFail?: number
|
|
30
|
-
/** Maximum number of times a job can be recovered from stalled state */
|
|
31
22
|
maxStalledCount?: number
|
|
32
|
-
/** Condition to start processor at instance creation */
|
|
33
23
|
autorun?: boolean
|
|
34
|
-
/**
|
|
35
|
-
* Cap how many jobs of any one group ({@link JobOptions.group}) may run at
|
|
36
|
-
* once, so a single group can't occupy the whole worker. Lets one shared
|
|
37
|
-
* queue stay fair across producers instead of splitting it into one queue
|
|
38
|
-
* per producer — which multiplies polling cost on pull-based backends.
|
|
39
|
-
* Must not exceed {@link batchSize}.
|
|
40
|
-
*/
|
|
24
|
+
/** Must not exceed {@link batchSize}. */
|
|
41
25
|
groupConcurrency?: number | GroupConcurrencyConfig
|
|
42
26
|
}
|
|
43
27
|
|
|
44
|
-
/**
|
|
45
|
-
* Per-group concurrency limits, optionally varied by tier so slow groups can
|
|
46
|
-
* be allowed more (or fewer) slots than the default.
|
|
47
|
-
*/
|
|
48
28
|
export interface GroupConcurrencyConfig {
|
|
49
|
-
/** Limit applied to any group without a matching tier */
|
|
29
|
+
/** Limit applied to any group without a matching tier. */
|
|
50
30
|
default: number
|
|
51
|
-
/**
|
|
31
|
+
/** Keyed by {@link JobGroup.tier}. */
|
|
52
32
|
tiers?: Record<string, number>
|
|
53
33
|
}
|
|
54
34
|
|
|
55
|
-
/**
|
|
56
|
-
* Fairness key for a job. Jobs sharing an `id` count against the same
|
|
57
|
-
* {@link PikkuWorkerConfig.groupConcurrency} limit.
|
|
58
|
-
*/
|
|
59
35
|
export interface JobGroup {
|
|
60
|
-
/** Group this job belongs to (e.g. a workflow name) */
|
|
61
36
|
id: string
|
|
62
|
-
/** Optional tier selecting a per-tier limit */
|
|
63
37
|
tier?: string
|
|
64
38
|
}
|
|
65
39
|
|
|
66
|
-
/**
|
|
67
|
-
* Configuration for individual jobs - how jobs behave
|
|
68
|
-
*/
|
|
69
40
|
export interface PikkuJobConfig {
|
|
70
|
-
/** Maximum retry attempts for failed jobs */
|
|
71
41
|
retryAttempts?: number
|
|
72
|
-
/**
|
|
42
|
+
/** Milliseconds. */
|
|
73
43
|
retryDelay?: number
|
|
74
|
-
/** Retry backoff strategy */
|
|
75
44
|
retryBackoff?: 'linear' | 'exponential' | 'fixed'
|
|
76
|
-
/** Queue for failed messages after max retries */
|
|
77
45
|
deadLetterQueue?: string
|
|
78
|
-
/**
|
|
46
|
+
/** Seconds. */
|
|
79
47
|
messageRetention?: number
|
|
80
|
-
/**
|
|
48
|
+
/** Higher numbers run first. */
|
|
81
49
|
priority?: number
|
|
82
|
-
/** Enable FIFO ordering where supported */
|
|
83
50
|
fifo?: boolean
|
|
84
|
-
/**
|
|
51
|
+
/** Milliseconds. */
|
|
85
52
|
timeout?: number
|
|
86
|
-
/**
|
|
53
|
+
/** Milliseconds. */
|
|
87
54
|
delay?: number
|
|
88
55
|
}
|
|
89
56
|
|
|
90
|
-
/**
|
|
91
|
-
* Configuration validation result with warnings and fallbacks
|
|
92
|
-
*/
|
|
93
57
|
export interface ConfigValidationResult {
|
|
94
58
|
applied: Partial<PikkuWorkerConfig>
|
|
95
59
|
ignored: Partial<PikkuWorkerConfig>
|
|
@@ -97,9 +61,6 @@ export interface ConfigValidationResult {
|
|
|
97
61
|
fallbacks: { [key: string]: any }
|
|
98
62
|
}
|
|
99
63
|
|
|
100
|
-
/**
|
|
101
|
-
* Queue job representation
|
|
102
|
-
*/
|
|
103
64
|
export type QueueJobStatus =
|
|
104
65
|
| 'waiting'
|
|
105
66
|
| 'active'
|
|
@@ -126,13 +87,9 @@ export interface QueueJob<T = any, R = any> {
|
|
|
126
87
|
result?: R
|
|
127
88
|
waitForCompletion?: (ttl?: number) => Promise<R>
|
|
128
89
|
metadata?: () => Promise<QueueJobMetadata> | QueueJobMetadata
|
|
129
|
-
/** Pikku user ID propagated from the job producer */
|
|
130
90
|
pikkuUserId?: string
|
|
131
91
|
}
|
|
132
92
|
|
|
133
|
-
/**
|
|
134
|
-
* Job options for queue operations
|
|
135
|
-
*/
|
|
136
93
|
export interface JobOptions {
|
|
137
94
|
priority?: number
|
|
138
95
|
delay?: number
|
|
@@ -141,46 +98,30 @@ export interface JobOptions {
|
|
|
141
98
|
removeOnComplete?: number
|
|
142
99
|
removeOnFail?: number
|
|
143
100
|
jobId?: string
|
|
144
|
-
|
|
101
|
+
// knowledge: decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md
|
|
145
102
|
pikkuUserId?: string
|
|
146
|
-
/**
|
|
103
|
+
/** Counts against the worker's {@link PikkuWorkerConfig.groupConcurrency}. */
|
|
147
104
|
group?: JobGroup
|
|
148
105
|
}
|
|
149
106
|
|
|
150
|
-
/**
|
|
151
|
-
* Queue provider interface for job publishing operations
|
|
152
|
-
*/
|
|
153
107
|
export interface QueueService {
|
|
154
|
-
/** Whether this queue provider supports job results */
|
|
155
108
|
readonly supportsResults: boolean
|
|
156
109
|
|
|
157
|
-
/** Add a job to the queue with type safety */
|
|
158
110
|
add<T>(queueName: string, data: T, options?: JobOptions): Promise<string>
|
|
159
111
|
|
|
160
|
-
/** Get job status and result */
|
|
161
112
|
getJob<T, R>(queueName: string, jobId: string): Promise<QueueJob<T, R> | null>
|
|
162
113
|
}
|
|
163
114
|
|
|
164
|
-
/**
|
|
165
|
-
* Queue service interface that queue adapters implement
|
|
166
|
-
*/
|
|
167
115
|
export interface QueueWorkers {
|
|
168
|
-
/** Service name identifier */
|
|
169
116
|
name: string
|
|
170
117
|
|
|
171
|
-
/** Whether this queue service supports job results */
|
|
172
118
|
supportsResults: boolean
|
|
173
119
|
|
|
174
|
-
/** Configuration mapping for validation */
|
|
175
120
|
configMappings: QueueConfigMapping
|
|
176
121
|
|
|
177
|
-
/** Scan state and register all compatible processors */
|
|
178
122
|
registerQueues(): Promise<Record<string, ConfigValidationResult[]>>
|
|
179
123
|
}
|
|
180
124
|
|
|
181
|
-
/**
|
|
182
|
-
* Queue processor metadata
|
|
183
|
-
*/
|
|
184
125
|
export type QueueWorkersMeta = Record<
|
|
185
126
|
string,
|
|
186
127
|
CommonWireMeta & {
|
|
@@ -189,9 +130,6 @@ export type QueueWorkersMeta = Record<
|
|
|
189
130
|
}
|
|
190
131
|
>
|
|
191
132
|
|
|
192
|
-
/**
|
|
193
|
-
* Core queue processor definition
|
|
194
|
-
*/
|
|
195
133
|
export type CoreQueueWorker<
|
|
196
134
|
PikkuFunctionConfig extends CorePikkuFunctionConfig<any, any, any> =
|
|
197
135
|
CorePikkuFunctionConfig<any, any, any>,
|
|
@@ -204,21 +142,13 @@ export type CoreQueueWorker<
|
|
|
204
142
|
middleware?: PikkuFunctionConfig['middleware']
|
|
205
143
|
}
|
|
206
144
|
|
|
207
|
-
/**
|
|
208
|
-
* Represents a queue wire object for middleware
|
|
209
|
-
* Provides information and actions for the current queue job execution
|
|
210
|
-
*/
|
|
211
145
|
export interface PikkuQueue {
|
|
212
|
-
/** The name of the queue being processed */
|
|
213
146
|
queueName: string
|
|
214
|
-
/** The current job ID */
|
|
215
147
|
jobId: string
|
|
216
|
-
/** Pikku user ID propagated from the job producer for credential resolution */
|
|
217
148
|
pikkuUserId?: string
|
|
218
|
-
/** Update job progress (0-100 or custom value) */
|
|
219
149
|
updateProgress: (progress: number | string | object) => Promise<void>
|
|
220
|
-
/**
|
|
150
|
+
/** Never returns — throws QueueJobFailedError. */
|
|
221
151
|
fail: (reason?: string) => Promise<void>
|
|
222
|
-
/**
|
|
152
|
+
/** Never returns — throws QueueJobDiscardedError. */
|
|
223
153
|
discard: (reason?: string) => Promise<void>
|
|
224
154
|
}
|
|
@@ -4,23 +4,11 @@ import type { QueueConfigMapping } from './validate-worker-config.js'
|
|
|
4
4
|
import { validateWorkerConfig } from './validate-worker-config.js'
|
|
5
5
|
import type { Logger } from '../../services/logger.js'
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
* Queue processor registration callback
|
|
9
|
-
*/
|
|
10
7
|
export type QueueRegistrationCallback<T = any> = (
|
|
11
8
|
queueName: string,
|
|
12
9
|
processor: CoreQueueWorker
|
|
13
10
|
) => Promise<T>
|
|
14
11
|
|
|
15
|
-
/**
|
|
16
|
-
* Helper function to register queue processors with validation
|
|
17
|
-
* This centralizes the common logic for looping over processors and validating configs
|
|
18
|
-
*
|
|
19
|
-
* @param configMappings - Configuration mapping for the queue implementation
|
|
20
|
-
* @param registerCallback - Callback to register each individual queue processor
|
|
21
|
-
* @param logger - Optional logger for info/error messages
|
|
22
|
-
* @returns Record of validation results by queue name
|
|
23
|
-
*/
|
|
24
12
|
export async function registerQueueWorkers<T = any>(
|
|
25
13
|
configMappings: QueueConfigMapping,
|
|
26
14
|
logger: Logger,
|
|
@@ -31,13 +19,11 @@ export async function registerQueueWorkers<T = any>(
|
|
|
31
19
|
|
|
32
20
|
for (const [queueName, processor] of queueWorkers) {
|
|
33
21
|
logger?.info(`Registering queue processor: ${queueName}`)
|
|
34
|
-
// Validate the processor configuration
|
|
35
22
|
const validationResult = validateWorkerConfig(
|
|
36
23
|
configMappings,
|
|
37
24
|
processor.config
|
|
38
25
|
)
|
|
39
26
|
|
|
40
|
-
// Store validation results
|
|
41
27
|
configValidation[queueName] = configValidation[queueName] || []
|
|
42
28
|
configValidation[queueName].push(validationResult)
|
|
43
29
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Logger } from '../../services/logger.js'
|
|
2
|
+
import type { SecretService } from '../../services/secret-service.js'
|
|
3
|
+
import {
|
|
4
|
+
getQueueIdentitySecret,
|
|
5
|
+
signQueueIdentity,
|
|
6
|
+
warnQueueIdentitySecretMissing,
|
|
7
|
+
} from './queue-identity.js'
|
|
8
|
+
import type { JobOptions, QueueJob, QueueService } from './queue.types.js'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Wraps any {@link QueueService} so `JobOptions.pikkuUserId` leaves the process
|
|
12
|
+
* as a signed claim that `runQueueJob` can verify.
|
|
13
|
+
*/
|
|
14
|
+
export class SignedQueueService implements QueueService {
|
|
15
|
+
constructor(
|
|
16
|
+
private readonly queueService: QueueService,
|
|
17
|
+
private readonly secrets: SecretService,
|
|
18
|
+
private readonly logger: Logger
|
|
19
|
+
) {}
|
|
20
|
+
|
|
21
|
+
get supportsResults(): boolean {
|
|
22
|
+
return this.queueService.supportsResults
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public async add<T>(
|
|
26
|
+
queueName: string,
|
|
27
|
+
data: T,
|
|
28
|
+
options?: JobOptions
|
|
29
|
+
): Promise<string> {
|
|
30
|
+
const pikkuUserId = options?.pikkuUserId
|
|
31
|
+
if (!pikkuUserId) {
|
|
32
|
+
return this.queueService.add(queueName, data, options)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const secret = await getQueueIdentitySecret(this.secrets)
|
|
36
|
+
if (!secret) {
|
|
37
|
+
warnQueueIdentitySecretMissing(this.logger)
|
|
38
|
+
const { pikkuUserId: _unsigned, ...rest } = options as JobOptions
|
|
39
|
+
return this.queueService.add(queueName, data, rest)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const signed = await signQueueIdentity(secret, pikkuUserId, {
|
|
43
|
+
queueName,
|
|
44
|
+
jobId: undefined,
|
|
45
|
+
data,
|
|
46
|
+
})
|
|
47
|
+
return this.queueService.add(queueName, data, {
|
|
48
|
+
...options,
|
|
49
|
+
pikkuUserId: signed,
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public async getJob<T, R>(
|
|
54
|
+
queueName: string,
|
|
55
|
+
jobId: string
|
|
56
|
+
): Promise<QueueJob<T, R> | null> {
|
|
57
|
+
return this.queueService.getJob<T, R>(queueName, jobId)
|
|
58
|
+
}
|
|
59
|
+
}
|