@pikku/core 0.12.72 → 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 +793 -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 +37 -32
- 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 -13
- package/dist/handle-error.js +0 -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 +5 -39
- package/dist/schema.js +5 -39
- 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 +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 +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 -1
- 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 +0 -7
- package/src/function/function-runner.ts +62 -32
- 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/handle-error.ts +0 -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.ts +5 -39
- 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 +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 +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/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,28 @@
|
|
|
1
|
+
import type { Logger } from '../../services/logger.js';
|
|
2
|
+
import type { SecretService } from '../../services/secret-service.js';
|
|
3
|
+
export declare const QUEUE_IDENTITY_SECRET_NAME = "PIKKU_QUEUE_IDENTITY_SECRET";
|
|
4
|
+
/** Namespaces the queue signing key away from every other use of the same material. */
|
|
5
|
+
export declare const QUEUE_IDENTITY_INFO = "pikku:queue-identity";
|
|
6
|
+
export declare const QUEUE_IDENTITY_CLAIM_VERSION = "pq1";
|
|
7
|
+
/**
|
|
8
|
+
* What the signature is bound to. `jobId` is only enforced when the producer
|
|
9
|
+
* knew it at signing time — most adapters mint their own id after `add`.
|
|
10
|
+
*/
|
|
11
|
+
export interface QueueIdentityBinding {
|
|
12
|
+
queueName: string;
|
|
13
|
+
jobId?: string;
|
|
14
|
+
data: unknown;
|
|
15
|
+
}
|
|
16
|
+
export declare const getQueueIdentitySecret: (secrets?: SecretService) => Promise<string | undefined>;
|
|
17
|
+
export declare const signQueueIdentity: (secret: string, pikkuUserId: string, binding: QueueIdentityBinding) => Promise<string>;
|
|
18
|
+
/** The claimed user id, or undefined for anything that does not verify. */
|
|
19
|
+
export declare const verifyQueueIdentity: (secret: string, token: string, binding: QueueIdentityBinding) => Promise<string | undefined>;
|
|
20
|
+
/** Test seam: the latch is process-wide so the warning is emitted once. */
|
|
21
|
+
export declare const resetQueueIdentityLogLatch: () => void;
|
|
22
|
+
export declare const warnQueueIdentitySecretMissing: (logger: Logger) => void;
|
|
23
|
+
export declare const resolveQueueJobIdentity: ({ claimedIdentity, binding, secrets, logger, }: {
|
|
24
|
+
claimedIdentity: string | undefined;
|
|
25
|
+
binding: QueueIdentityBinding;
|
|
26
|
+
secrets: SecretService | undefined;
|
|
27
|
+
logger: Logger;
|
|
28
|
+
}) => Promise<string | undefined>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { decodeBase64UrlText, encodeBase64UrlText, signWithKeyMaterial, verifyWithKeyMaterial, } from '../../crypto-utils.js';
|
|
2
|
+
export const QUEUE_IDENTITY_SECRET_NAME = 'PIKKU_QUEUE_IDENTITY_SECRET';
|
|
3
|
+
/** Namespaces the queue signing key away from every other use of the same material. */
|
|
4
|
+
export const QUEUE_IDENTITY_INFO = 'pikku:queue-identity';
|
|
5
|
+
export const QUEUE_IDENTITY_CLAIM_VERSION = 'pq1';
|
|
6
|
+
const stableStringify = (value) => {
|
|
7
|
+
if (value === null || typeof value !== 'object') {
|
|
8
|
+
return JSON.stringify(value) ?? 'null';
|
|
9
|
+
}
|
|
10
|
+
if (Array.isArray(value)) {
|
|
11
|
+
return `[${value.map(stableStringify).join(',')}]`;
|
|
12
|
+
}
|
|
13
|
+
const record = value;
|
|
14
|
+
const keys = Object.keys(record).sort();
|
|
15
|
+
return `{${keys
|
|
16
|
+
.map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)
|
|
17
|
+
.join(',')}}`;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Round-trips through JSON first so the producer hashes exactly what the
|
|
21
|
+
* transport will deliver, then sorts keys so property order cannot change the
|
|
22
|
+
* digest.
|
|
23
|
+
*/
|
|
24
|
+
const canonicalizePayload = (data) => stableStringify(JSON.parse(JSON.stringify(data ?? null)));
|
|
25
|
+
const signingPayload = (encodedClaim, data) => `${QUEUE_IDENTITY_CLAIM_VERSION}.${encodedClaim}.${canonicalizePayload(data)}`;
|
|
26
|
+
export const getQueueIdentitySecret = async (secrets) => {
|
|
27
|
+
try {
|
|
28
|
+
return (await secrets?.getSecret(QUEUE_IDENTITY_SECRET_NAME)) || undefined;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
export const signQueueIdentity = async (secret, pikkuUserId, binding) => {
|
|
35
|
+
const claim = {
|
|
36
|
+
u: pikkuUserId,
|
|
37
|
+
q: binding.queueName,
|
|
38
|
+
...(binding.jobId ? { j: binding.jobId } : {}),
|
|
39
|
+
};
|
|
40
|
+
const encodedClaim = encodeBase64UrlText(JSON.stringify(claim));
|
|
41
|
+
const signature = await signWithKeyMaterial(QUEUE_IDENTITY_SECRET_NAME, secret, QUEUE_IDENTITY_INFO, signingPayload(encodedClaim, binding.data));
|
|
42
|
+
return `${QUEUE_IDENTITY_CLAIM_VERSION}.${encodedClaim}.${signature}`;
|
|
43
|
+
};
|
|
44
|
+
/** The claimed user id, or undefined for anything that does not verify. */
|
|
45
|
+
export const verifyQueueIdentity = async (secret, token, binding) => {
|
|
46
|
+
const parts = token.split('.');
|
|
47
|
+
if (parts.length !== 3)
|
|
48
|
+
return undefined;
|
|
49
|
+
const [version, encodedClaim, signature] = parts;
|
|
50
|
+
if (version !== QUEUE_IDENTITY_CLAIM_VERSION)
|
|
51
|
+
return undefined;
|
|
52
|
+
const verified = await verifyWithKeyMaterial(QUEUE_IDENTITY_SECRET_NAME, secret, QUEUE_IDENTITY_INFO, signingPayload(encodedClaim, binding.data), signature);
|
|
53
|
+
if (!verified)
|
|
54
|
+
return undefined;
|
|
55
|
+
let claim;
|
|
56
|
+
try {
|
|
57
|
+
claim = JSON.parse(decodeBase64UrlText(encodedClaim));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
if (typeof claim?.u !== 'string' || claim.u.length === 0)
|
|
63
|
+
return undefined;
|
|
64
|
+
if (claim.q !== binding.queueName)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (claim.j !== undefined && claim.j !== binding.jobId)
|
|
67
|
+
return undefined;
|
|
68
|
+
return claim.u;
|
|
69
|
+
};
|
|
70
|
+
let missingSecretLogged = false;
|
|
71
|
+
/** Test seam: the latch is process-wide so the warning is emitted once. */
|
|
72
|
+
export const resetQueueIdentityLogLatch = () => {
|
|
73
|
+
missingSecretLogged = false;
|
|
74
|
+
};
|
|
75
|
+
export const warnQueueIdentitySecretMissing = (logger) => {
|
|
76
|
+
if (missingSecretLogged)
|
|
77
|
+
return;
|
|
78
|
+
missingSecretLogged = true;
|
|
79
|
+
logger.warn(`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.`);
|
|
80
|
+
};
|
|
81
|
+
export const resolveQueueJobIdentity = async ({ claimedIdentity, binding, secrets, logger, }) => {
|
|
82
|
+
if (!claimedIdentity)
|
|
83
|
+
return undefined;
|
|
84
|
+
const secret = await getQueueIdentitySecret(secrets);
|
|
85
|
+
if (!secret) {
|
|
86
|
+
warnQueueIdentitySecretMissing(logger);
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
let pikkuUserId;
|
|
90
|
+
try {
|
|
91
|
+
pikkuUserId = await verifyQueueIdentity(secret, claimedIdentity, binding);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
logger.error(`Could not verify the identity claim on job ${binding.jobId} in queue ${binding.queueName} — the job runs without a pikkuUserId.`, error);
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
if (!pikkuUserId) {
|
|
98
|
+
logger.error(`Rejected an unsigned or invalid identity claim on job ${binding.jobId} in queue ${binding.queueName} — the job runs without a pikkuUserId.`);
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
return pikkuUserId;
|
|
102
|
+
};
|
|
@@ -1,36 +1,17 @@
|
|
|
1
1
|
import type { CoreQueueWorker, QueueJob } from './queue.types.js';
|
|
2
2
|
import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
3
3
|
import { PikkuError } from '../../errors/error-handler.js';
|
|
4
|
-
/**
|
|
5
|
-
* Error class for when a queue job is explicitly failed
|
|
6
|
-
*/
|
|
7
4
|
export declare class QueueJobFailedError extends PikkuError {
|
|
8
5
|
constructor(jobId: string, reason?: string);
|
|
9
6
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Error class for when a queue job is explicitly discarded
|
|
12
|
-
*/
|
|
13
7
|
export declare class QueueJobDiscardedError extends PikkuError {
|
|
14
8
|
constructor(jobId: string, reason?: string);
|
|
15
9
|
}
|
|
16
|
-
/**
|
|
17
|
-
* Add a queue processor to the system
|
|
18
|
-
*/
|
|
19
10
|
export declare const wireQueueWorker: <InputData = any, OutputData = any, PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<InputData, OutputData>> = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<InputData, OutputData>>>(queueWorker: CoreQueueWorker<PikkuFunctionConfig>) => void;
|
|
20
|
-
/**
|
|
21
|
-
* Get all registered queue processors
|
|
22
|
-
*/
|
|
23
11
|
export declare function getQueueWorkers(): Map<string, CoreQueueWorker>;
|
|
24
|
-
/**
|
|
25
|
-
* Stop and remove a queue processor
|
|
26
|
-
*/
|
|
27
12
|
export declare function removeQueueWorker(name: string): Promise<void>;
|
|
28
|
-
/**
|
|
29
|
-
* Process a single queue job - this function is called by queue consumers
|
|
30
|
-
*/
|
|
31
13
|
export declare function runQueueJob({ job, updateProgress, traceId, }: {
|
|
32
14
|
job: QueueJob;
|
|
33
15
|
updateProgress?: (progress: number | string | object) => Promise<void>;
|
|
34
|
-
/** Pre-resolved trace ID (e.g. from queue message metadata) */
|
|
35
16
|
traceId?: string;
|
|
36
17
|
}): Promise<void>;
|
|
@@ -2,44 +2,31 @@ import { getErrorResponse, PikkuError } from '../../errors/error-handler.js';
|
|
|
2
2
|
import { PikkuMissingMetaError } from '../../errors/errors.js';
|
|
3
3
|
import { getSingletonServices, getCreateWireServices, pikkuState, } from '../../pikku-state.js';
|
|
4
4
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
|
|
5
|
-
|
|
6
|
-
* Error class for queue processor not found
|
|
7
|
-
*/
|
|
5
|
+
import { resolveQueueJobIdentity } from './queue-identity.js';
|
|
8
6
|
class QueueWorkerNotFoundError extends PikkuError {
|
|
9
7
|
constructor(name) {
|
|
10
8
|
super(`Queue processor not found: ${name}`);
|
|
11
9
|
}
|
|
12
10
|
}
|
|
13
|
-
/**
|
|
14
|
-
* Error class for when a queue job is explicitly failed
|
|
15
|
-
*/
|
|
16
11
|
export class QueueJobFailedError extends PikkuError {
|
|
17
12
|
constructor(jobId, reason) {
|
|
18
13
|
super(`Queue job ${jobId} failed${reason ? `: ${reason}` : ''}`);
|
|
19
14
|
this.name = 'QueueJobFailedError';
|
|
20
15
|
}
|
|
21
16
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Error class for when a queue job is explicitly discarded
|
|
24
|
-
*/
|
|
25
17
|
export class QueueJobDiscardedError extends PikkuError {
|
|
26
18
|
constructor(jobId, reason) {
|
|
27
19
|
super(`Queue job ${jobId} discarded${reason ? `: ${reason}` : ''}`);
|
|
28
20
|
this.name = 'QueueJobDiscardedError';
|
|
29
21
|
}
|
|
30
22
|
}
|
|
31
|
-
/**
|
|
32
|
-
* Add a queue processor to the system
|
|
33
|
-
*/
|
|
34
23
|
export const wireQueueWorker = (queueWorker) => {
|
|
35
|
-
// Get processor metadata
|
|
36
24
|
const meta = pikkuState(null, 'queue', 'meta');
|
|
37
25
|
const processorMeta = meta[queueWorker.name];
|
|
38
26
|
if (!processorMeta) {
|
|
39
27
|
console.warn(`[pikku] Skipping queue worker '${queueWorker.name}' — metadata not found. Consider moving this wiring to its own file.`);
|
|
40
28
|
return;
|
|
41
29
|
}
|
|
42
|
-
// Register the function with pikku
|
|
43
30
|
addFunction(processorMeta.pikkuFuncId, {
|
|
44
31
|
func: queueWorker.func.func,
|
|
45
32
|
auth: queueWorker.func.auth,
|
|
@@ -47,19 +34,12 @@ export const wireQueueWorker = (queueWorker) => {
|
|
|
47
34
|
middleware: queueWorker.func.middleware,
|
|
48
35
|
tags: queueWorker.func.tags,
|
|
49
36
|
});
|
|
50
|
-
// Store processor definition in state - runtime adapters will pick this up
|
|
51
37
|
const registrations = pikkuState(null, 'queue', 'registrations');
|
|
52
38
|
registrations.set(queueWorker.name, queueWorker);
|
|
53
39
|
};
|
|
54
|
-
/**
|
|
55
|
-
* Get all registered queue processors
|
|
56
|
-
*/
|
|
57
40
|
export function getQueueWorkers() {
|
|
58
41
|
return pikkuState(null, 'queue', 'registrations');
|
|
59
42
|
}
|
|
60
|
-
/**
|
|
61
|
-
* Stop and remove a queue processor
|
|
62
|
-
*/
|
|
63
43
|
export async function removeQueueWorker(name) {
|
|
64
44
|
const registrations = pikkuState(null, 'queue', 'registrations');
|
|
65
45
|
const registration = registrations.get(name);
|
|
@@ -68,9 +48,6 @@ export async function removeQueueWorker(name) {
|
|
|
68
48
|
}
|
|
69
49
|
registrations.delete(name);
|
|
70
50
|
}
|
|
71
|
-
/**
|
|
72
|
-
* Process a single queue job - this function is called by queue consumers
|
|
73
|
-
*/
|
|
74
51
|
export async function runQueueJob({ job, updateProgress, traceId, }) {
|
|
75
52
|
const singletonServices = getSingletonServices();
|
|
76
53
|
const createWireServices = getCreateWireServices();
|
|
@@ -82,21 +59,25 @@ export async function runQueueJob({ job, updateProgress, traceId, }) {
|
|
|
82
59
|
if (!processorMeta) {
|
|
83
60
|
throw new PikkuMissingMetaError(`Missing generated metadata for queue worker '${job.queueName}'`);
|
|
84
61
|
}
|
|
85
|
-
// Get the queue worker registration to access middleware
|
|
86
62
|
const registrations = pikkuState(null, 'queue', 'registrations');
|
|
87
63
|
const queueWorker = registrations.get(job.queueName);
|
|
88
64
|
if (!queueWorker) {
|
|
89
65
|
throw new Error(`Queue worker registration not found for: ${job.queueName}`);
|
|
90
66
|
}
|
|
91
|
-
//
|
|
67
|
+
// knowledge: decisions/security/queue-job-identities-are-signed-at-enqueue.md
|
|
68
|
+
const pikkuUserId = await resolveQueueJobIdentity({
|
|
69
|
+
claimedIdentity: job.pikkuUserId,
|
|
70
|
+
binding: { queueName: job.queueName, jobId: job.id, data: job.data },
|
|
71
|
+
secrets: singletonServices.secrets,
|
|
72
|
+
logger,
|
|
73
|
+
});
|
|
92
74
|
const queue = {
|
|
93
75
|
queueName: job.queueName,
|
|
94
76
|
jobId: job.id,
|
|
95
|
-
pikkuUserId
|
|
77
|
+
pikkuUserId,
|
|
96
78
|
updateProgress: updateProgress ||
|
|
97
79
|
(async (progress) => {
|
|
98
80
|
logger.info(`Job ${job.id} progress: ${progress}`);
|
|
99
|
-
// Default implementation - just log the progress
|
|
100
81
|
}),
|
|
101
82
|
fail: async (reason) => {
|
|
102
83
|
throw new QueueJobFailedError(job.id, reason);
|
|
@@ -111,7 +92,6 @@ export async function runQueueJob({ job, updateProgress, traceId, }) {
|
|
|
111
92
|
traceId: resolvedTraceId,
|
|
112
93
|
queue,
|
|
113
94
|
};
|
|
114
|
-
// Execute the pikku function with the job data
|
|
115
95
|
const result = await runPikkuFunc('queue', job.queueName, processorMeta.pikkuFuncId, {
|
|
116
96
|
singletonServices,
|
|
117
97
|
createWireServices,
|
|
@@ -131,7 +111,6 @@ export async function runQueueJob({ job, updateProgress, traceId, }) {
|
|
|
131
111
|
if (errorResponse != null) {
|
|
132
112
|
logger.error('Processed error response:', errorResponse);
|
|
133
113
|
}
|
|
134
|
-
// Re-throw the error so the queue service can handle retries/DLQ
|
|
135
114
|
throw error;
|
|
136
115
|
}
|
|
137
116
|
}
|
|
@@ -1,90 +1,54 @@
|
|
|
1
1
|
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
|
-
/**
|
|
5
|
-
* Configuration for queue workers - how jobs are processed
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Configuration for queue workers - how jobs are processed
|
|
9
|
-
*/
|
|
10
4
|
export interface PikkuWorkerConfig {
|
|
11
|
-
/** Optional worker name for identification and monitoring */
|
|
12
5
|
name?: string;
|
|
13
|
-
/**
|
|
6
|
+
/** Total worker concurrency. */
|
|
14
7
|
batchSize?: number;
|
|
15
|
-
/** Number of messages to prefetch for efficiency */
|
|
16
8
|
prefetch?: number;
|
|
17
|
-
/**
|
|
9
|
+
/** Milliseconds. */
|
|
18
10
|
pollInterval?: number;
|
|
19
|
-
/**
|
|
11
|
+
/** Seconds. */
|
|
20
12
|
visibilityTimeout?: number;
|
|
21
|
-
/**
|
|
13
|
+
/** Milliseconds. */
|
|
22
14
|
lockDuration?: number;
|
|
23
|
-
/**
|
|
15
|
+
/** Seconds. */
|
|
24
16
|
drainDelay?: number;
|
|
25
|
-
/**
|
|
17
|
+
/** Number of completed jobs to retain, not an age. */
|
|
26
18
|
removeOnComplete?: number;
|
|
27
|
-
/**
|
|
19
|
+
/** Number of failed jobs to retain, not an age. */
|
|
28
20
|
removeOnFail?: number;
|
|
29
|
-
/** Maximum number of times a job can be recovered from stalled state */
|
|
30
21
|
maxStalledCount?: number;
|
|
31
|
-
/** Condition to start processor at instance creation */
|
|
32
22
|
autorun?: boolean;
|
|
33
|
-
/**
|
|
34
|
-
* Cap how many jobs of any one group ({@link JobOptions.group}) may run at
|
|
35
|
-
* once, so a single group can't occupy the whole worker. Lets one shared
|
|
36
|
-
* queue stay fair across producers instead of splitting it into one queue
|
|
37
|
-
* per producer — which multiplies polling cost on pull-based backends.
|
|
38
|
-
* Must not exceed {@link batchSize}.
|
|
39
|
-
*/
|
|
23
|
+
/** Must not exceed {@link batchSize}. */
|
|
40
24
|
groupConcurrency?: number | GroupConcurrencyConfig;
|
|
41
25
|
}
|
|
42
|
-
/**
|
|
43
|
-
* Per-group concurrency limits, optionally varied by tier so slow groups can
|
|
44
|
-
* be allowed more (or fewer) slots than the default.
|
|
45
|
-
*/
|
|
46
26
|
export interface GroupConcurrencyConfig {
|
|
47
|
-
/** Limit applied to any group without a matching tier */
|
|
27
|
+
/** Limit applied to any group without a matching tier. */
|
|
48
28
|
default: number;
|
|
49
|
-
/**
|
|
29
|
+
/** Keyed by {@link JobGroup.tier}. */
|
|
50
30
|
tiers?: Record<string, number>;
|
|
51
31
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Fairness key for a job. Jobs sharing an `id` count against the same
|
|
54
|
-
* {@link PikkuWorkerConfig.groupConcurrency} limit.
|
|
55
|
-
*/
|
|
56
32
|
export interface JobGroup {
|
|
57
|
-
/** Group this job belongs to (e.g. a workflow name) */
|
|
58
33
|
id: string;
|
|
59
|
-
/** Optional tier selecting a per-tier limit */
|
|
60
34
|
tier?: string;
|
|
61
35
|
}
|
|
62
|
-
/**
|
|
63
|
-
* Configuration for individual jobs - how jobs behave
|
|
64
|
-
*/
|
|
65
36
|
export interface PikkuJobConfig {
|
|
66
|
-
/** Maximum retry attempts for failed jobs */
|
|
67
37
|
retryAttempts?: number;
|
|
68
|
-
/**
|
|
38
|
+
/** Milliseconds. */
|
|
69
39
|
retryDelay?: number;
|
|
70
|
-
/** Retry backoff strategy */
|
|
71
40
|
retryBackoff?: 'linear' | 'exponential' | 'fixed';
|
|
72
|
-
/** Queue for failed messages after max retries */
|
|
73
41
|
deadLetterQueue?: string;
|
|
74
|
-
/**
|
|
42
|
+
/** Seconds. */
|
|
75
43
|
messageRetention?: number;
|
|
76
|
-
/**
|
|
44
|
+
/** Higher numbers run first. */
|
|
77
45
|
priority?: number;
|
|
78
|
-
/** Enable FIFO ordering where supported */
|
|
79
46
|
fifo?: boolean;
|
|
80
|
-
/**
|
|
47
|
+
/** Milliseconds. */
|
|
81
48
|
timeout?: number;
|
|
82
|
-
/**
|
|
49
|
+
/** Milliseconds. */
|
|
83
50
|
delay?: number;
|
|
84
51
|
}
|
|
85
|
-
/**
|
|
86
|
-
* Configuration validation result with warnings and fallbacks
|
|
87
|
-
*/
|
|
88
52
|
export interface ConfigValidationResult {
|
|
89
53
|
applied: Partial<PikkuWorkerConfig>;
|
|
90
54
|
ignored: Partial<PikkuWorkerConfig>;
|
|
@@ -93,9 +57,6 @@ export interface ConfigValidationResult {
|
|
|
93
57
|
[key: string]: any;
|
|
94
58
|
};
|
|
95
59
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Queue job representation
|
|
98
|
-
*/
|
|
99
60
|
export type QueueJobStatus = 'waiting' | 'active' | 'completed' | 'failed' | 'delayed';
|
|
100
61
|
export type QueueJobMetadata = {
|
|
101
62
|
progress?: number | string | object | undefined | boolean;
|
|
@@ -115,12 +76,8 @@ export interface QueueJob<T = any, R = any> {
|
|
|
115
76
|
result?: R;
|
|
116
77
|
waitForCompletion?: (ttl?: number) => Promise<R>;
|
|
117
78
|
metadata?: () => Promise<QueueJobMetadata> | QueueJobMetadata;
|
|
118
|
-
/** Pikku user ID propagated from the job producer */
|
|
119
79
|
pikkuUserId?: string;
|
|
120
80
|
}
|
|
121
|
-
/**
|
|
122
|
-
* Job options for queue operations
|
|
123
|
-
*/
|
|
124
81
|
export interface JobOptions {
|
|
125
82
|
priority?: number;
|
|
126
83
|
delay?: number;
|
|
@@ -132,45 +89,25 @@ export interface JobOptions {
|
|
|
132
89
|
removeOnComplete?: number;
|
|
133
90
|
removeOnFail?: number;
|
|
134
91
|
jobId?: string;
|
|
135
|
-
/** Pikku user ID to propagate to the queue worker for credential resolution */
|
|
136
92
|
pikkuUserId?: string;
|
|
137
|
-
/**
|
|
93
|
+
/** Counts against the worker's {@link PikkuWorkerConfig.groupConcurrency}. */
|
|
138
94
|
group?: JobGroup;
|
|
139
95
|
}
|
|
140
|
-
/**
|
|
141
|
-
* Queue provider interface for job publishing operations
|
|
142
|
-
*/
|
|
143
96
|
export interface QueueService {
|
|
144
|
-
/** Whether this queue provider supports job results */
|
|
145
97
|
readonly supportsResults: boolean;
|
|
146
|
-
/** Add a job to the queue with type safety */
|
|
147
98
|
add<T>(queueName: string, data: T, options?: JobOptions): Promise<string>;
|
|
148
|
-
/** Get job status and result */
|
|
149
99
|
getJob<T, R>(queueName: string, jobId: string): Promise<QueueJob<T, R> | null>;
|
|
150
100
|
}
|
|
151
|
-
/**
|
|
152
|
-
* Queue service interface that queue adapters implement
|
|
153
|
-
*/
|
|
154
101
|
export interface QueueWorkers {
|
|
155
|
-
/** Service name identifier */
|
|
156
102
|
name: string;
|
|
157
|
-
/** Whether this queue service supports job results */
|
|
158
103
|
supportsResults: boolean;
|
|
159
|
-
/** Configuration mapping for validation */
|
|
160
104
|
configMappings: QueueConfigMapping;
|
|
161
|
-
/** Scan state and register all compatible processors */
|
|
162
105
|
registerQueues(): Promise<Record<string, ConfigValidationResult[]>>;
|
|
163
106
|
}
|
|
164
|
-
/**
|
|
165
|
-
* Queue processor metadata
|
|
166
|
-
*/
|
|
167
107
|
export type QueueWorkersMeta = Record<string, CommonWireMeta & {
|
|
168
108
|
name: string;
|
|
169
109
|
config?: PikkuWorkerConfig;
|
|
170
110
|
}>;
|
|
171
|
-
/**
|
|
172
|
-
* Core queue processor definition
|
|
173
|
-
*/
|
|
174
111
|
export type CoreQueueWorker<PikkuFunctionConfig extends CorePikkuFunctionConfig<any, any, any> = CorePikkuFunctionConfig<any, any, any>> = {
|
|
175
112
|
name: string;
|
|
176
113
|
func: PikkuFunctionConfig;
|
|
@@ -179,21 +116,13 @@ export type CoreQueueWorker<PikkuFunctionConfig extends CorePikkuFunctionConfig<
|
|
|
179
116
|
tags?: string[];
|
|
180
117
|
middleware?: PikkuFunctionConfig['middleware'];
|
|
181
118
|
};
|
|
182
|
-
/**
|
|
183
|
-
* Represents a queue wire object for middleware
|
|
184
|
-
* Provides information and actions for the current queue job execution
|
|
185
|
-
*/
|
|
186
119
|
export interface PikkuQueue {
|
|
187
|
-
/** The name of the queue being processed */
|
|
188
120
|
queueName: string;
|
|
189
|
-
/** The current job ID */
|
|
190
121
|
jobId: string;
|
|
191
|
-
/** Pikku user ID propagated from the job producer for credential resolution */
|
|
192
122
|
pikkuUserId?: string;
|
|
193
|
-
/** Update job progress (0-100 or custom value) */
|
|
194
123
|
updateProgress: (progress: number | string | object) => Promise<void>;
|
|
195
|
-
/**
|
|
124
|
+
/** Never returns — throws QueueJobFailedError. */
|
|
196
125
|
fail: (reason?: string) => Promise<void>;
|
|
197
|
-
/**
|
|
126
|
+
/** Never returns — throws QueueJobDiscardedError. */
|
|
198
127
|
discard: (reason?: string) => Promise<void>;
|
|
199
128
|
}
|
|
@@ -1,17 +1,5 @@
|
|
|
1
1
|
import type { ConfigValidationResult, CoreQueueWorker } from './queue.types.js';
|
|
2
2
|
import type { QueueConfigMapping } from './validate-worker-config.js';
|
|
3
3
|
import type { Logger } from '../../services/logger.js';
|
|
4
|
-
/**
|
|
5
|
-
* Queue processor registration callback
|
|
6
|
-
*/
|
|
7
4
|
export type QueueRegistrationCallback<T = any> = (queueName: string, processor: CoreQueueWorker) => Promise<T>;
|
|
8
|
-
/**
|
|
9
|
-
* Helper function to register queue processors with validation
|
|
10
|
-
* This centralizes the common logic for looping over processors and validating configs
|
|
11
|
-
*
|
|
12
|
-
* @param configMappings - Configuration mapping for the queue implementation
|
|
13
|
-
* @param registerCallback - Callback to register each individual queue processor
|
|
14
|
-
* @param logger - Optional logger for info/error messages
|
|
15
|
-
* @returns Record of validation results by queue name
|
|
16
|
-
*/
|
|
17
5
|
export declare function registerQueueWorkers<T = any>(configMappings: QueueConfigMapping, logger: Logger, registerCallback: QueueRegistrationCallback<T>): Promise<Record<string, ConfigValidationResult[]>>;
|
|
@@ -1,22 +1,11 @@
|
|
|
1
1
|
import { getQueueWorkers } from './queue-runner.js';
|
|
2
2
|
import { validateWorkerConfig } from './validate-worker-config.js';
|
|
3
|
-
/**
|
|
4
|
-
* Helper function to register queue processors with validation
|
|
5
|
-
* This centralizes the common logic for looping over processors and validating configs
|
|
6
|
-
*
|
|
7
|
-
* @param configMappings - Configuration mapping for the queue implementation
|
|
8
|
-
* @param registerCallback - Callback to register each individual queue processor
|
|
9
|
-
* @param logger - Optional logger for info/error messages
|
|
10
|
-
* @returns Record of validation results by queue name
|
|
11
|
-
*/
|
|
12
3
|
export async function registerQueueWorkers(configMappings, logger, registerCallback) {
|
|
13
4
|
const configValidation = {};
|
|
14
5
|
const queueWorkers = getQueueWorkers();
|
|
15
6
|
for (const [queueName, processor] of queueWorkers) {
|
|
16
7
|
logger?.info(`Registering queue processor: ${queueName}`);
|
|
17
|
-
// Validate the processor configuration
|
|
18
8
|
const validationResult = validateWorkerConfig(configMappings, processor.config);
|
|
19
|
-
// Store validation results
|
|
20
9
|
configValidation[queueName] = configValidation[queueName] || [];
|
|
21
10
|
configValidation[queueName].push(validationResult);
|
|
22
11
|
if (validationResult.warnings.length > 0) {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Logger } from '../../services/logger.js';
|
|
2
|
+
import type { SecretService } from '../../services/secret-service.js';
|
|
3
|
+
import type { JobOptions, QueueJob, QueueService } from './queue.types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Wraps any {@link QueueService} so `JobOptions.pikkuUserId` leaves the process
|
|
6
|
+
* as a signed claim that `runQueueJob` can verify.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SignedQueueService implements QueueService {
|
|
9
|
+
private readonly queueService;
|
|
10
|
+
private readonly secrets;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(queueService: QueueService, secrets: SecretService, logger: Logger);
|
|
13
|
+
get supportsResults(): boolean;
|
|
14
|
+
add<T>(queueName: string, data: T, options?: JobOptions): Promise<string>;
|
|
15
|
+
getJob<T, R>(queueName: string, jobId: string): Promise<QueueJob<T, R> | null>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getQueueIdentitySecret, signQueueIdentity, warnQueueIdentitySecretMissing, } from './queue-identity.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wraps any {@link QueueService} so `JobOptions.pikkuUserId` leaves the process
|
|
4
|
+
* as a signed claim that `runQueueJob` can verify.
|
|
5
|
+
*/
|
|
6
|
+
export class SignedQueueService {
|
|
7
|
+
queueService;
|
|
8
|
+
secrets;
|
|
9
|
+
logger;
|
|
10
|
+
constructor(queueService, secrets, logger) {
|
|
11
|
+
this.queueService = queueService;
|
|
12
|
+
this.secrets = secrets;
|
|
13
|
+
this.logger = logger;
|
|
14
|
+
}
|
|
15
|
+
get supportsResults() {
|
|
16
|
+
return this.queueService.supportsResults;
|
|
17
|
+
}
|
|
18
|
+
async add(queueName, data, options) {
|
|
19
|
+
const pikkuUserId = options?.pikkuUserId;
|
|
20
|
+
if (!pikkuUserId) {
|
|
21
|
+
return this.queueService.add(queueName, data, options);
|
|
22
|
+
}
|
|
23
|
+
const secret = await getQueueIdentitySecret(this.secrets);
|
|
24
|
+
if (!secret) {
|
|
25
|
+
warnQueueIdentitySecretMissing(this.logger);
|
|
26
|
+
const { pikkuUserId: _unsigned, ...rest } = options;
|
|
27
|
+
return this.queueService.add(queueName, data, rest);
|
|
28
|
+
}
|
|
29
|
+
const signed = await signQueueIdentity(secret, pikkuUserId, {
|
|
30
|
+
queueName,
|
|
31
|
+
jobId: undefined,
|
|
32
|
+
data,
|
|
33
|
+
});
|
|
34
|
+
return this.queueService.add(queueName, data, {
|
|
35
|
+
...options,
|
|
36
|
+
pikkuUserId: signed,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async getJob(queueName, jobId) {
|
|
40
|
+
return this.queueService.getJob(queueName, jobId);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -1,41 +1,20 @@
|
|
|
1
1
|
import type { PikkuWorkerConfig, ConfigValidationResult } from './queue.types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Configuration mapping structure for queue implementations
|
|
4
|
-
*/
|
|
5
2
|
export interface QueueConfigMapping {
|
|
6
|
-
/** Configurations that are directly supported */
|
|
7
3
|
supported: Partial<Record<keyof PikkuWorkerConfig, {
|
|
8
|
-
/** The property name in the underlying queue system */
|
|
9
4
|
queueProperty?: string;
|
|
10
|
-
/** Optional transform function for the value */
|
|
11
5
|
transform?: (value: any) => any;
|
|
12
|
-
/** Description of what this configuration does */
|
|
13
6
|
description: string;
|
|
14
7
|
}>>;
|
|
15
|
-
/**
|
|
8
|
+
/** Rejected: the value is dropped and a warning raised. */
|
|
16
9
|
unsupported: Partial<Record<keyof PikkuWorkerConfig, {
|
|
17
|
-
/** Why this configuration is not supported */
|
|
18
10
|
reason: string;
|
|
19
|
-
/** Detailed explanation of what the queue system does instead */
|
|
20
11
|
explanation: string;
|
|
21
12
|
}>>;
|
|
22
|
-
/**
|
|
13
|
+
/** Applied anyway, but with a warning describing the substituted behaviour. */
|
|
23
14
|
fallbacks: Partial<Record<keyof PikkuWorkerConfig, {
|
|
24
|
-
/** Why this configuration uses a fallback */
|
|
25
15
|
reason: string;
|
|
26
|
-
/** Detailed explanation of the fallback behavior */
|
|
27
16
|
explanation: string;
|
|
28
|
-
/** The fallback value or description */
|
|
29
17
|
fallbackValue: string;
|
|
30
18
|
}>>;
|
|
31
19
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Validates worker configuration using a mapping table
|
|
34
|
-
* This provides a flexible, maintainable way to validate configurations
|
|
35
|
-
* across different queue implementations
|
|
36
|
-
*
|
|
37
|
-
* @param config - The worker configuration to validate
|
|
38
|
-
* @param configMapping - The mapping table defining supported/unsupported configurations
|
|
39
|
-
* @returns Validation result with applied, ignored, warnings, and fallbacks
|
|
40
|
-
*/
|
|
41
20
|
export declare function validateWorkerConfig(configMapping: QueueConfigMapping, config?: PikkuWorkerConfig): ConfigValidationResult;
|