@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,233 @@
|
|
|
1
|
+
import { readScenarioHttpResponse } from './personas-service.js';
|
|
2
|
+
import { runConversation } from '../wirings/actor-flow/run-conversation.js';
|
|
3
|
+
import { createCookieJar, } from '../wirings/workflow/scenario-cookie-jar.js';
|
|
4
|
+
import { getSingletonServices } from '../pikku-state.js';
|
|
5
|
+
import { AIProviderNotConfiguredError } from '../errors/errors.js';
|
|
6
|
+
/**
|
|
7
|
+
* Default HTTP-backed persona. Signs in lazily on first invoke via the Better
|
|
8
|
+
* Auth actor plugin (`POST /auth/sign-in/actor` with `{ email, secret }` —
|
|
9
|
+
* the plugin upserts the actor-flagged user row and mints a session whose
|
|
10
|
+
* `actor` flag flows into audits/analytics). Holds the session cookies for
|
|
11
|
+
* its lifetime; a 401 mid-run re-logs-in once (long health-check runs can
|
|
12
|
+
* outlive a session).
|
|
13
|
+
*/
|
|
14
|
+
export class HttpPersona {
|
|
15
|
+
name;
|
|
16
|
+
persona;
|
|
17
|
+
config;
|
|
18
|
+
jar;
|
|
19
|
+
/**
|
|
20
|
+
* Whether `login()` has succeeded since the last time the session was
|
|
21
|
+
* dropped. The jar cannot answer this — a target may set a cookie before
|
|
22
|
+
* anyone signs in, and it would then look like a session that was never
|
|
23
|
+
* established.
|
|
24
|
+
*/
|
|
25
|
+
signedIn = false;
|
|
26
|
+
constructor(name, persona, config) {
|
|
27
|
+
this.name = name;
|
|
28
|
+
this.persona = persona;
|
|
29
|
+
this.config = config;
|
|
30
|
+
this.jar = createCookieJar(config.apiUrl);
|
|
31
|
+
}
|
|
32
|
+
get email() {
|
|
33
|
+
return this.persona.email;
|
|
34
|
+
}
|
|
35
|
+
async invoke(rpcName, data) {
|
|
36
|
+
const res = await this.invokeRaw(rpcName, data);
|
|
37
|
+
if (!res.ok) {
|
|
38
|
+
throw new Error(`[scenario] '${rpcName}' as '${this.name}' returned ${res.status}: ${res.serialized.slice(0, 300)}`);
|
|
39
|
+
}
|
|
40
|
+
return res.body;
|
|
41
|
+
}
|
|
42
|
+
async invokeRaw(rpcName, data, options) {
|
|
43
|
+
if (!this.signedIn) {
|
|
44
|
+
await this.login();
|
|
45
|
+
}
|
|
46
|
+
let res = await this.postRpc(rpcName, data, options?.headers);
|
|
47
|
+
if (res.status === 401) {
|
|
48
|
+
// Session expired mid-run — re-login once and retry.
|
|
49
|
+
this.signOut();
|
|
50
|
+
await this.login();
|
|
51
|
+
res = await this.postRpc(rpcName, data, options?.headers);
|
|
52
|
+
}
|
|
53
|
+
return readScenarioHttpResponse(res);
|
|
54
|
+
}
|
|
55
|
+
async converse(options) {
|
|
56
|
+
const { aiAgentRunner } = getSingletonServices();
|
|
57
|
+
if (!aiAgentRunner) {
|
|
58
|
+
throw new AIProviderNotConfiguredError();
|
|
59
|
+
}
|
|
60
|
+
const model = options.model ?? this.config.model;
|
|
61
|
+
if (!model) {
|
|
62
|
+
throw new Error(`[scenario] persona '${this.name}' converse needs a model — pass options.model or set 'model' on the personas service`);
|
|
63
|
+
}
|
|
64
|
+
const threadId = globalThis.crypto.randomUUID();
|
|
65
|
+
const resourceId = `persona:${this.name}`;
|
|
66
|
+
return runConversation({
|
|
67
|
+
persona: this.persona,
|
|
68
|
+
personaId: this.name,
|
|
69
|
+
agentName: options.agent,
|
|
70
|
+
task: options.task,
|
|
71
|
+
evaluate: options.evaluate,
|
|
72
|
+
approvals: options.approvals,
|
|
73
|
+
model,
|
|
74
|
+
maxTurns: options.maxTurns,
|
|
75
|
+
llm: (params) => aiAgentRunner.run(params),
|
|
76
|
+
target: {
|
|
77
|
+
run: (message) => this.agentRun(options.agent, message, threadId, resourceId),
|
|
78
|
+
approve: (runId, decisions) => this.agentApprove(options.agent, runId, decisions),
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The roles the stage says this session holds.
|
|
84
|
+
*
|
|
85
|
+
* Read from better-auth's `get-session`, which is what most pikku apps are
|
|
86
|
+
* running and where its admin plugin puts `role` — on the user, as a
|
|
87
|
+
* comma-separated list. A target that answers something else returns `null`
|
|
88
|
+
* rather than an empty list, because "this stage does not report roles" and
|
|
89
|
+
* "this person has none" call for opposite responses from the caller.
|
|
90
|
+
*/
|
|
91
|
+
async sessionRoles() {
|
|
92
|
+
if (!this.signedIn) {
|
|
93
|
+
await this.login();
|
|
94
|
+
}
|
|
95
|
+
const sessionPath = this.config.sessionPath ?? '/auth/get-session';
|
|
96
|
+
const res = await this.jar.fetch(`${this.config.apiUrl}${sessionPath}`);
|
|
97
|
+
if (!res.ok) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const text = await res.text().catch(() => '');
|
|
101
|
+
if (!text) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
let payload;
|
|
105
|
+
try {
|
|
106
|
+
payload = JSON.parse(text);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const user = payload?.user;
|
|
112
|
+
const role = user?.role;
|
|
113
|
+
if (typeof role === 'string') {
|
|
114
|
+
return role
|
|
115
|
+
.split(',')
|
|
116
|
+
.map((name) => name.trim())
|
|
117
|
+
.filter(Boolean);
|
|
118
|
+
}
|
|
119
|
+
if (Array.isArray(role)) {
|
|
120
|
+
return role.filter((name) => typeof name === 'string');
|
|
121
|
+
}
|
|
122
|
+
// The session came back and carried a user, but no role field — that is a
|
|
123
|
+
// stage reporting "none", not a stage that cannot report.
|
|
124
|
+
return user ? [] : null;
|
|
125
|
+
}
|
|
126
|
+
/** Start/continue the target agent's run over HTTP as this persona. */
|
|
127
|
+
async agentRun(agentName, message, threadId, resourceId) {
|
|
128
|
+
const raw = await this.postAgent(`agent/${agentName}`, {
|
|
129
|
+
message,
|
|
130
|
+
threadId,
|
|
131
|
+
resourceId,
|
|
132
|
+
});
|
|
133
|
+
return normalizeAgentReply(raw);
|
|
134
|
+
}
|
|
135
|
+
/** Answer the target agent's pending approvals over HTTP and continue. */
|
|
136
|
+
async agentApprove(agentName, runId, decisions) {
|
|
137
|
+
const raw = await this.postAgent(`agent/${agentName}/approve`, {
|
|
138
|
+
runId,
|
|
139
|
+
approvals: decisions,
|
|
140
|
+
});
|
|
141
|
+
return normalizeAgentReply(raw);
|
|
142
|
+
}
|
|
143
|
+
// knowledge: decisions/internals/scenario-agent-calls-sign-in-on-401-only.md
|
|
144
|
+
async postAgent(subPath, body) {
|
|
145
|
+
const rpcPath = this.config.rpcPath ?? '/rpc';
|
|
146
|
+
const url = `${this.config.apiUrl}${rpcPath}/${subPath}`;
|
|
147
|
+
const send = () => this.jar.fetch(url, {
|
|
148
|
+
method: 'POST',
|
|
149
|
+
headers: { 'content-type': 'application/json' },
|
|
150
|
+
body: JSON.stringify(body),
|
|
151
|
+
});
|
|
152
|
+
let res = await send();
|
|
153
|
+
if (res.status === 401) {
|
|
154
|
+
this.signOut();
|
|
155
|
+
await this.login();
|
|
156
|
+
res = await send();
|
|
157
|
+
}
|
|
158
|
+
if (!res.ok) {
|
|
159
|
+
const text = (await res.text().catch(() => '')).slice(0, 300);
|
|
160
|
+
throw new Error(`[scenario] agent call '${subPath}' as '${this.name}' returned ${res.status}: ${text}`);
|
|
161
|
+
}
|
|
162
|
+
if (res.status === 204)
|
|
163
|
+
return undefined;
|
|
164
|
+
const text = await res.text();
|
|
165
|
+
return text ? JSON.parse(text) : undefined;
|
|
166
|
+
}
|
|
167
|
+
async postRpc(rpcName, data, extraHeaders) {
|
|
168
|
+
const rpcPath = this.config.rpcPath ?? '/rpc';
|
|
169
|
+
return this.jar.fetch(`${this.config.apiUrl}${rpcPath}/${rpcName}`, {
|
|
170
|
+
method: 'POST',
|
|
171
|
+
headers: { 'content-type': 'application/json', ...extraHeaders },
|
|
172
|
+
body: JSON.stringify({ data }),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/** Drop the session, so the next call signs in again before it goes out. */
|
|
176
|
+
signOut() {
|
|
177
|
+
this.jar.clear();
|
|
178
|
+
this.signedIn = false;
|
|
179
|
+
}
|
|
180
|
+
async login() {
|
|
181
|
+
const signInPath = this.config.signInPath ?? '/auth/sign-in/actor';
|
|
182
|
+
const res = await this.jar.fetch(`${this.config.apiUrl}${signInPath}`, {
|
|
183
|
+
method: 'POST',
|
|
184
|
+
headers: { 'content-type': 'application/json' },
|
|
185
|
+
body: JSON.stringify({
|
|
186
|
+
email: this.persona.email,
|
|
187
|
+
name: this.persona.name,
|
|
188
|
+
secret: this.config.secret,
|
|
189
|
+
}),
|
|
190
|
+
});
|
|
191
|
+
if (!res.ok) {
|
|
192
|
+
const body = (await res.text().catch(() => '')).slice(0, 300);
|
|
193
|
+
throw new Error(`[scenario] persona sign-in failed for '${this.name}' (${res.status}): ${body}`);
|
|
194
|
+
}
|
|
195
|
+
// What proves a session was established is this response setting a cookie,
|
|
196
|
+
// not the jar being non-empty — the target may have set one earlier.
|
|
197
|
+
if (res.headers.getSetCookie().length === 0) {
|
|
198
|
+
throw new Error(`[scenario] persona sign-in for '${this.name}' returned no session cookie`);
|
|
199
|
+
}
|
|
200
|
+
this.signedIn = true;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/** Normalize an agentRun/agentApprove HTTP response into a TargetAgentReply. */
|
|
204
|
+
function normalizeAgentReply(raw) {
|
|
205
|
+
const r = (raw ?? {});
|
|
206
|
+
const pending = Array.isArray(r.pendingApprovals)
|
|
207
|
+
? r.pendingApprovals.map((p) => ({
|
|
208
|
+
toolCallId: String(p.toolCallId),
|
|
209
|
+
toolName: String(p.toolName),
|
|
210
|
+
args: p.args,
|
|
211
|
+
reason: typeof p.reason === 'string' ? p.reason : undefined,
|
|
212
|
+
}))
|
|
213
|
+
: undefined;
|
|
214
|
+
return {
|
|
215
|
+
text: typeof r.text === 'string' ? r.text : '',
|
|
216
|
+
runId: typeof r.runId === 'string' ? r.runId : '',
|
|
217
|
+
status: r.status === 'completed' || r.status === 'suspended'
|
|
218
|
+
? r.status
|
|
219
|
+
: undefined,
|
|
220
|
+
pendingApprovals: pending,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Build the injected `personas` service from the declared personas: id → lazy
|
|
225
|
+
* HTTP persona. Wire the result as the `personas` singleton service.
|
|
226
|
+
*/
|
|
227
|
+
export function createHttpPersonas(config) {
|
|
228
|
+
const personas = {};
|
|
229
|
+
for (const [id, persona] of Object.entries(config.personas)) {
|
|
230
|
+
personas[id] = new HttpPersona(id, persona, config);
|
|
231
|
+
}
|
|
232
|
+
return personas;
|
|
233
|
+
}
|
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
import type { QueueService, JobOptions } from '../wirings/queue/queue.types.js';
|
|
2
|
-
/**
|
|
3
|
-
* In-process queue for local/dev runs. Schedules jobs on the macrotask queue
|
|
4
|
-
* (setTimeout) so dispatch is genuinely asynchronous — the same timing shape as
|
|
5
|
-
* a real queue — and redelivers a failed job up to `options.attempts` times with
|
|
6
|
-
* backoff, so a transiently-failing workflow step recovers exactly as it would
|
|
7
|
-
* on pg-boss/bullmq instead of being silently dropped on its first error.
|
|
8
|
-
*
|
|
9
|
-
* Payloads are JSON round-tripped on the way in, because every real backend
|
|
10
|
-
* puts the job on a wire (SQS body, Redis value, jsonb column) and the worker
|
|
11
|
-
* therefore never sees the caller's live object. Doing it here keeps dev
|
|
12
|
-
* behaviour honest, and keeps the callers — who cannot know which backend they
|
|
13
|
-
* are talking to — from having to serialise defensively.
|
|
14
|
-
*/
|
|
15
2
|
export declare class InMemoryQueueService implements QueueService {
|
|
16
3
|
readonly supportsResults = false;
|
|
17
4
|
private jobCounter;
|
|
18
5
|
add<T>(queueName: string, data: T, options?: JobOptions): Promise<string>;
|
|
19
|
-
/** Delay before the next redelivery, honoring the job's backoff policy. */
|
|
20
6
|
private backoffDelay;
|
|
21
7
|
getJob(): Promise<null>;
|
|
22
8
|
}
|
|
@@ -1,17 +1,5 @@
|
|
|
1
1
|
import { runQueueJob } from '../wirings/queue/queue-runner.js';
|
|
2
|
-
|
|
3
|
-
* In-process queue for local/dev runs. Schedules jobs on the macrotask queue
|
|
4
|
-
* (setTimeout) so dispatch is genuinely asynchronous — the same timing shape as
|
|
5
|
-
* a real queue — and redelivers a failed job up to `options.attempts` times with
|
|
6
|
-
* backoff, so a transiently-failing workflow step recovers exactly as it would
|
|
7
|
-
* on pg-boss/bullmq instead of being silently dropped on its first error.
|
|
8
|
-
*
|
|
9
|
-
* Payloads are JSON round-tripped on the way in, because every real backend
|
|
10
|
-
* puts the job on a wire (SQS body, Redis value, jsonb column) and the worker
|
|
11
|
-
* therefore never sees the caller's live object. Doing it here keeps dev
|
|
12
|
-
* behaviour honest, and keeps the callers — who cannot know which backend they
|
|
13
|
-
* are talking to — from having to serialise defensively.
|
|
14
|
-
*/
|
|
2
|
+
// knowledge: decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md
|
|
15
3
|
export class InMemoryQueueService {
|
|
16
4
|
supportsResults = false;
|
|
17
5
|
jobCounter = 0;
|
|
@@ -36,7 +24,6 @@ export class InMemoryQueueService {
|
|
|
36
24
|
}
|
|
37
25
|
catch (e) {
|
|
38
26
|
if (attemptsMade < maxAttempts) {
|
|
39
|
-
// Transient failure — redeliver with backoff, mirroring a real queue.
|
|
40
27
|
setTimeout(runAttempt, this.backoffDelay(options?.backoff, attemptsMade));
|
|
41
28
|
}
|
|
42
29
|
else {
|
|
@@ -48,7 +35,6 @@ export class InMemoryQueueService {
|
|
|
48
35
|
setTimeout(runAttempt, delay);
|
|
49
36
|
return jobId;
|
|
50
37
|
}
|
|
51
|
-
/** Delay before the next redelivery, honoring the job's backoff policy. */
|
|
52
38
|
backoffDelay(backoff, attemptsMade) {
|
|
53
39
|
const baseDelay = typeof backoff === 'object' ? (backoff.delay ?? 50) : 50;
|
|
54
40
|
if (backoff === 'exponential' ||
|
|
@@ -1,22 +1,4 @@
|
|
|
1
1
|
import { PikkuTriggerService } from '../wirings/trigger/pikku-trigger-service.js';
|
|
2
|
-
/**
|
|
3
|
-
* In-memory TriggerService implementation.
|
|
4
|
-
*
|
|
5
|
-
* Reads both `wireTrigger` declarations and `wireTriggerSource` registrations
|
|
6
|
-
* from pikkuState. Only starts triggers that have both a declaration and a source.
|
|
7
|
-
* On fire, invokes target via `ContextAwareRPCService`.
|
|
8
|
-
*
|
|
9
|
-
* Single owner — one process runs triggers, no distributed claiming.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* const triggerService = new InMemoryTriggerService()
|
|
14
|
-
* await triggerService.start()
|
|
15
|
-
*
|
|
16
|
-
* // On shutdown
|
|
17
|
-
* await triggerService.stop()
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
2
|
export declare class InMemoryTriggerService extends PikkuTriggerService {
|
|
21
3
|
start(): Promise<void>;
|
|
22
4
|
}
|
|
@@ -1,23 +1,6 @@
|
|
|
1
1
|
import { PikkuTriggerService } from '../wirings/trigger/pikku-trigger-service.js';
|
|
2
2
|
import { getSingletonServices } from '../pikku-state.js';
|
|
3
|
-
|
|
4
|
-
* In-memory TriggerService implementation.
|
|
5
|
-
*
|
|
6
|
-
* Reads both `wireTrigger` declarations and `wireTriggerSource` registrations
|
|
7
|
-
* from pikkuState. Only starts triggers that have both a declaration and a source.
|
|
8
|
-
* On fire, invokes target via `ContextAwareRPCService`.
|
|
9
|
-
*
|
|
10
|
-
* Single owner — one process runs triggers, no distributed claiming.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const triggerService = new InMemoryTriggerService()
|
|
15
|
-
* await triggerService.start()
|
|
16
|
-
*
|
|
17
|
-
* // On shutdown
|
|
18
|
-
* await triggerService.stop()
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
3
|
+
// knowledge: decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md
|
|
21
4
|
export class InMemoryTriggerService extends PikkuTriggerService {
|
|
22
5
|
async start() {
|
|
23
6
|
const singletonServices = getSingletonServices();
|
|
@@ -1,21 +1,6 @@
|
|
|
1
1
|
import { PikkuWorkflowService } from '../wirings/workflow/pikku-workflow-service.js';
|
|
2
2
|
import type { SerializedError } from '../types/core.types.js';
|
|
3
3
|
import type { WorkflowPlannedStep, WorkflowQueueOptions, WorkflowRun, WorkflowRunService, WorkflowRunWire, StepState, StepStatus, WorkflowStatus, WorkflowVersionStatus, WorkflowStepOptions } from '../wirings/workflow/workflow.types.js';
|
|
4
|
-
/**
|
|
5
|
-
* In-memory implementation of WorkflowService for inline-only execution
|
|
6
|
-
*
|
|
7
|
-
* This is a lightweight workflow service that stores all state in memory.
|
|
8
|
-
* It only supports inline execution (no queue workers) and is ideal for:
|
|
9
|
-
* - CLI tools that need workflow-like step orchestration
|
|
10
|
-
* - Testing and development
|
|
11
|
-
* - Single-process applications without persistence requirements
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const workflowService = new InMemoryWorkflowService()
|
|
16
|
-
* await workflowService.startWorkflow('myWorkflow', input, { type: 'cli' }, rpc, { inline: true })
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
4
|
export declare class InMemoryWorkflowService extends PikkuWorkflowService implements WorkflowRunService {
|
|
20
5
|
constructor(options?: WorkflowQueueOptions);
|
|
21
6
|
private sleepTimers;
|
|
@@ -65,7 +50,6 @@ export declare class InMemoryWorkflowService extends PikkuWorkflowService implem
|
|
|
65
50
|
failedNodeIds: string[];
|
|
66
51
|
branchKeys: Record<string, string>;
|
|
67
52
|
}>;
|
|
68
|
-
getNodesWithoutSteps(runId: string, nodeIds: string[]): Promise<string[]>;
|
|
69
53
|
protected listStepStates(runId: string): Promise<Array<StepState & {
|
|
70
54
|
stepName: string;
|
|
71
55
|
}>>;
|
|
@@ -1,21 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from 'crypto';
|
|
2
2
|
import { PikkuWorkflowService } from '../wirings/workflow/pikku-workflow-service.js';
|
|
3
3
|
import { isExpectedError } from '../errors/error-handler.js';
|
|
4
|
-
|
|
5
|
-
* In-memory implementation of WorkflowService for inline-only execution
|
|
6
|
-
*
|
|
7
|
-
* This is a lightweight workflow service that stores all state in memory.
|
|
8
|
-
* It only supports inline execution (no queue workers) and is ideal for:
|
|
9
|
-
* - CLI tools that need workflow-like step orchestration
|
|
10
|
-
* - Testing and development
|
|
11
|
-
* - Single-process applications without persistence requirements
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const workflowService = new InMemoryWorkflowService()
|
|
16
|
-
* await workflowService.startWorkflow('myWorkflow', input, { type: 'cli' }, rpc, { inline: true })
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
4
|
+
// knowledge: decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md
|
|
19
5
|
export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
20
6
|
constructor(options = {}) {
|
|
21
7
|
super({ ...options, wireQueues: false });
|
|
@@ -99,7 +85,7 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
99
85
|
const key = `${runId}:${stepName}`;
|
|
100
86
|
this.steps.set(key, step);
|
|
101
87
|
this.stepData.set(stepId, { rpcName, data, stepName });
|
|
102
|
-
//
|
|
88
|
+
// knowledge: decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md
|
|
103
89
|
const history = this.stepHistory.get(runId) || [];
|
|
104
90
|
history.push(step);
|
|
105
91
|
this.stepHistory.set(runId, history);
|
|
@@ -170,7 +156,6 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
170
156
|
}
|
|
171
157
|
}
|
|
172
158
|
async createRetryAttemptImpl(failedStepId, status) {
|
|
173
|
-
// Find the failed step
|
|
174
159
|
let failedStep;
|
|
175
160
|
let runId;
|
|
176
161
|
let stepName;
|
|
@@ -205,11 +190,10 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
205
190
|
}
|
|
206
191
|
const key = `${runId}:${stepName}`;
|
|
207
192
|
this.steps.set(key, newStep);
|
|
208
|
-
// Copy step data to new step
|
|
209
193
|
if (failedStepData) {
|
|
210
194
|
this.stepData.set(newStepId, { ...failedStepData });
|
|
211
195
|
}
|
|
212
|
-
//
|
|
196
|
+
// knowledge: decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md
|
|
213
197
|
const history = this.stepHistory.get(runId) || [];
|
|
214
198
|
history.push(newStep);
|
|
215
199
|
this.stepHistory.set(runId, history);
|
|
@@ -265,11 +249,10 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
265
249
|
return existed;
|
|
266
250
|
}
|
|
267
251
|
async withRunLock(_id, fn) {
|
|
268
|
-
//
|
|
252
|
+
// knowledge: decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md
|
|
269
253
|
return fn();
|
|
270
254
|
}
|
|
271
255
|
async withStepLock(_runId, _stepName, fn) {
|
|
272
|
-
// In-memory service doesn't need locking for inline execution
|
|
273
256
|
return fn();
|
|
274
257
|
}
|
|
275
258
|
async close() {
|
|
@@ -277,7 +260,6 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
277
260
|
clearTimeout(timer);
|
|
278
261
|
}
|
|
279
262
|
this.sleepTimers.clear();
|
|
280
|
-
// Clear all in-memory state
|
|
281
263
|
this.runs.clear();
|
|
282
264
|
this.steps.clear();
|
|
283
265
|
this.stepData.clear();
|
|
@@ -286,7 +268,6 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
286
268
|
this.branchKeys.clear();
|
|
287
269
|
this.workflowVersions.clear();
|
|
288
270
|
}
|
|
289
|
-
// Graph workflow methods
|
|
290
271
|
async getCompletedGraphState(runId) {
|
|
291
272
|
const completedNodeIds = [];
|
|
292
273
|
const failedNodeIds = [];
|
|
@@ -314,16 +295,6 @@ export class InMemoryWorkflowService extends PikkuWorkflowService {
|
|
|
314
295
|
}
|
|
315
296
|
return { completedNodeIds, failedNodeIds, branchKeys };
|
|
316
297
|
}
|
|
317
|
-
async getNodesWithoutSteps(runId, nodeIds) {
|
|
318
|
-
const existingSteps = new Set();
|
|
319
|
-
const prefix = `${runId}:`;
|
|
320
|
-
for (const [key] of this.steps.entries()) {
|
|
321
|
-
if (key.startsWith(prefix)) {
|
|
322
|
-
existingSteps.add(key.substring(prefix.length));
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return nodeIds.filter((id) => !existingSteps.has(id));
|
|
326
|
-
}
|
|
327
298
|
async listStepStates(runId) {
|
|
328
299
|
const prefix = `${runId}:`;
|
|
329
300
|
const steps = [];
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module @pikku/core
|
|
3
|
-
*/
|
|
4
1
|
export { LogLevel } from './logger.js';
|
|
5
2
|
export { ScopedSecretService } from './scoped-secret-service.js';
|
|
6
3
|
export { PikkuSessionService, createMiddlewareSessionWireProps, createFunctionSessionWireProps, } from './user-session-service.js';
|
|
@@ -19,9 +16,8 @@ export { InMemoryTriggerService } from './in-memory-trigger-service.js';
|
|
|
19
16
|
export { InMemoryAIRunStateService } from './in-memory-ai-run-state-service.js';
|
|
20
17
|
export { LocalGatewayService } from './local-gateway-service.js';
|
|
21
18
|
export type { ContentService, SignContentKeyArgs, SignURLArgs, GetUploadURLArgs, UploadURLResult, BucketKeyArgs, WriteFileArgs, CopyFileArgs, } from './content-service.js';
|
|
22
|
-
export type {
|
|
23
|
-
export {
|
|
24
|
-
export { HttpScenarioActor, createHttpScenarioActors, type HttpScenarioActorsConfig, } from './http-scenario-actors.js';
|
|
19
|
+
export type { ScenarioPersona, ResolvedPersona, ScenarioPersonaOf, ScenarioPersonas, ScenarioInvokeOptions, ScenarioRpcMap, ScenarioHttpResponse, } from './personas-service.js';
|
|
20
|
+
export type { HttpPersonasConfig } from './http-personas.js';
|
|
25
21
|
export type { JWTService } from './jwt-service.js';
|
|
26
22
|
export type { EmailService, EmailTemplateReference, SendEmailInput, SendEmailResult, SendHTMLEmailInput, SendTemplateEmailInput, SendTextEmailInput, } from './email-service.js';
|
|
27
23
|
export { DEFAULT_WEBHOOK_RETRIES, DEFAULT_WEBHOOK_SIGNATURE_HEADER, PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME, WebhookService, type SendWebhookInput, type SendWebhookResult, type WebhookAttemptRecord, type WebhookAttemptResult, type WebhookDeliveryRecord, type WebhookDeliveryWithAttempts, type WebhookJobData, type WebhookServiceConfig, } from './webhook-service.js';
|
|
@@ -46,9 +42,12 @@ export type { VariableStatus, VariableMeta } from './typed-variables-service.js'
|
|
|
46
42
|
export type { MetaService } from './meta-service.js';
|
|
47
43
|
export type { SessionStore } from './session-store.js';
|
|
48
44
|
export type { ScopeService, Role } from './scope-service.js';
|
|
45
|
+
export { assertRoleIsMutable, assertRoleNameAvailable, roleLockReason, } from './system-role-guard.js';
|
|
46
|
+
export type { IsSystemRole } from './system-role-guard.js';
|
|
49
47
|
export { NoopAuditService, createInvocationAudit, resolveAuditActorFromWire, resolveAuditConfig, } from './audit-service.js';
|
|
50
48
|
export type { AuditActor, AuditConfig, AuditDurability, AuditEvent, AuditEventBatch, AuditLog, AuditLogWriteInput, AuditOutcome, AuditService, AuditSource, ResolvedAuditConfig, } from './audit-service.js';
|
|
51
49
|
export { InMemorySessionStore } from './in-memory-session-store.js';
|
|
52
50
|
export type { MCPMeta, RPCMetaRecord, ServiceMeta, ServicesMetaRecord, MiddlewareDefinitionMeta, MiddlewareInstanceMeta, GroupMeta, MiddlewareGroupsMeta, PermissionDefinitionMeta, PermissionsGroupsMeta, FunctionsMeta, FunctionMeta, MiddlewareMeta, PermissionMeta, AgentsMeta, AgentMeta, EmailsMeta, EmailTemplateMeta, EmailTemplateLocaleMeta, EmailTemplateAssets, } from './meta-service.js';
|
|
53
51
|
export type { CoverageService, CoverageSnapshot, LineHits, ScriptCoverage, FunctionCoverage, CoverageRange, CoverageStatus, FunctionCoverageEntry, FunctionCoverageReport, CoverageFunctionMeta, } from './v8-coverage-service.js';
|
|
54
52
|
export { StubTracker, createStubProxy, getStubTracker, isTestRun, stub, spy, type StubCall, } from './stub-tracker.js';
|
|
53
|
+
export { SecretHostNotAllowedError, assertSecretAllowedForHost, } from './secret-host-binding.js';
|
package/dist/services/index.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module @pikku/core
|
|
3
|
-
*/
|
|
4
1
|
export { LogLevel } from './logger.js';
|
|
5
2
|
export { ScopedSecretService } from './scoped-secret-service.js';
|
|
6
3
|
export { PikkuSessionService, createMiddlewareSessionWireProps, createFunctionSessionWireProps, } from './user-session-service.js';
|
|
@@ -18,10 +15,10 @@ export { InMemoryQueueService } from './in-memory-queue-service.js';
|
|
|
18
15
|
export { InMemoryTriggerService } from './in-memory-trigger-service.js';
|
|
19
16
|
export { InMemoryAIRunStateService } from './in-memory-ai-run-state-service.js';
|
|
20
17
|
export { LocalGatewayService } from './local-gateway-service.js';
|
|
21
|
-
export { readScenarioHttpResponse } from './scenario-actors-service.js';
|
|
22
|
-
export { HttpScenarioActor, createHttpScenarioActors, } from './http-scenario-actors.js';
|
|
23
18
|
export { DEFAULT_WEBHOOK_RETRIES, DEFAULT_WEBHOOK_SIGNATURE_HEADER, PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME, WebhookService, } from './webhook-service.js';
|
|
24
19
|
export { TypedCredentialService } from './typed-credential-service.js';
|
|
20
|
+
export { assertRoleIsMutable, assertRoleNameAvailable, roleLockReason, } from './system-role-guard.js';
|
|
25
21
|
export { NoopAuditService, createInvocationAudit, resolveAuditActorFromWire, resolveAuditConfig, } from './audit-service.js';
|
|
26
22
|
export { InMemorySessionStore } from './in-memory-session-store.js';
|
|
27
23
|
export { StubTracker, createStubProxy, getStubTracker, isTestRun, stub, spy, } from './stub-tracker.js';
|
|
24
|
+
export { SecretHostNotAllowedError, assertSecretAllowedForHost, } from './secret-host-binding.js';
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import type { CoverageService, CoverageSnapshot } from './v8-coverage-service.js';
|
|
2
|
-
/**
|
|
3
|
-
* Reads istanbul-instrumented counters from the `__coverage__` global —
|
|
4
|
-
* the coverage backend for runtimes without V8 precise coverage (e.g. Bun,
|
|
5
|
-
* where source files are instrumented at load time by a Bun loader plugin).
|
|
6
|
-
*/
|
|
2
|
+
/** The coverage backend for runtimes without V8 precise coverage, e.g. Bun. */
|
|
7
3
|
export declare class IstanbulCoverageService implements CoverageService {
|
|
8
4
|
start(): Promise<void>;
|
|
9
5
|
takeCoverage(): Promise<CoverageSnapshot>;
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
const getCoverageGlobal = () => globalThis.__coverage__;
|
|
2
|
-
/**
|
|
3
|
-
* Reads istanbul-instrumented counters from the `__coverage__` global —
|
|
4
|
-
* the coverage backend for runtimes without V8 precise coverage (e.g. Bun,
|
|
5
|
-
* where source files are instrumented at load time by a Bun loader plugin).
|
|
6
|
-
*/
|
|
2
|
+
/** The coverage backend for runtimes without V8 precise coverage, e.g. Bun. */
|
|
7
3
|
export class IstanbulCoverageService {
|
|
8
4
|
async start() { }
|
|
9
5
|
async takeCoverage() {
|
|
@@ -15,9 +11,7 @@ export class IstanbulCoverageService {
|
|
|
15
11
|
hits = new Map();
|
|
16
12
|
lineHits.set(file.path, hits);
|
|
17
13
|
}
|
|
18
|
-
//
|
|
19
|
-
// line only, so an enclosing multi-line statement never masks an
|
|
20
|
-
// unexecuted inner statement (e.g. a throw inside a taken if).
|
|
14
|
+
// knowledge: decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md
|
|
21
15
|
for (const [id, location] of Object.entries(file.statementMap)) {
|
|
22
16
|
const count = file.s[id] ?? 0;
|
|
23
17
|
const line = location.start.line;
|
|
@@ -1,21 +1,6 @@
|
|
|
1
1
|
import type { RelativeTimeInput } from '../time-utils.js';
|
|
2
|
-
/**
|
|
3
|
-
* Interface for handling JSON Web Tokens (JWT).
|
|
4
|
-
*/
|
|
5
2
|
export interface JWTService {
|
|
6
|
-
/**
|
|
7
|
-
* Encodes a payload into a JWT.
|
|
8
|
-
* @param expiresIn - The expiration time of the token.
|
|
9
|
-
* @param payload - The payload to encode.
|
|
10
|
-
* @returns A promise that resolves to the encoded JWT.
|
|
11
|
-
*/
|
|
12
3
|
encode: <T extends any>(expiresIn: RelativeTimeInput, payload: T) => Promise<string>;
|
|
13
|
-
/**
|
|
14
|
-
* Decodes a JWT into its payload.
|
|
15
|
-
* @param hash - The JWT to decode.
|
|
16
|
-
* @param invalidHashError - An optional error to throw if the hash is invalid.
|
|
17
|
-
* @param debug - An optional flag for debugging.
|
|
18
|
-
* @returns A promise that resolves to the decoded payload.
|
|
19
|
-
*/
|
|
4
|
+
/** `invalidHashError` replaces the implementation's own error when the hash does not verify. */
|
|
20
5
|
decode: <T>(hash: string, invalidHashError?: Error, debug?: boolean) => Promise<T>;
|
|
21
6
|
}
|
|
@@ -6,11 +6,22 @@ export interface LocalContentConfig {
|
|
|
6
6
|
server?: string;
|
|
7
7
|
sizeLimit?: string;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* The representation of an asset that gets bound into a signed URL's
|
|
11
|
+
* signature, and that a server can reconstruct from an incoming request:
|
|
12
|
+
* the decoded path, without origin or query string.
|
|
13
|
+
*
|
|
14
|
+
* Both sides must derive it the same way, so signer and verifier share this
|
|
15
|
+
* function. Percent escapes are decoded so that a client re-encoding an
|
|
16
|
+
* optional character still matches; a malformed escape is left verbatim
|
|
17
|
+
* rather than throwing, which keeps both sides in agreement.
|
|
18
|
+
*/
|
|
19
|
+
export declare const signedContentPath: (urlOrPath: string) => string;
|
|
9
20
|
export declare class LocalContent implements ContentService {
|
|
10
21
|
private config;
|
|
11
22
|
private logger;
|
|
12
|
-
private jwt
|
|
13
|
-
constructor(config: LocalContentConfig, logger: Logger, jwt
|
|
23
|
+
private jwt;
|
|
24
|
+
constructor(config: LocalContentConfig, logger: Logger, jwt: JWTService);
|
|
14
25
|
private safePath;
|
|
15
26
|
private joinKey;
|
|
16
27
|
init(): Promise<void>;
|