@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
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Queue worker functions for workflow orchestration.
|
|
3
|
-
*
|
|
4
|
-
* These are registered as queue consumers by the codegen pipeline
|
|
5
|
-
* (injected into queue meta when workflows exist). They provide
|
|
6
|
-
* the runtime implementations that process queued workflow jobs.
|
|
7
|
-
*/
|
|
8
1
|
import type { PikkuRPC } from '../rpc/rpc-types.js';
|
|
9
2
|
export interface WorkflowStepInput {
|
|
10
3
|
runId: string;
|
|
11
4
|
stepName: string;
|
|
12
5
|
rpcName: string;
|
|
13
6
|
data: unknown;
|
|
14
|
-
/** Predecessor step name (the walked transition); undefined for entry steps. */
|
|
15
7
|
fromStepName?: string;
|
|
16
8
|
}
|
|
17
9
|
export interface PikkuWorkflowOrchestratorInput {
|
|
@@ -21,22 +13,10 @@ export interface PikkuWorkflowSleeperInput {
|
|
|
21
13
|
runId: string;
|
|
22
14
|
stepId: string;
|
|
23
15
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Step worker — executes individual workflow steps dispatched via queue.
|
|
26
|
-
* The orchestrator queues steps here when they're async (not inline).
|
|
27
|
-
*/
|
|
28
16
|
export declare function pikkuWorkflowWorkerFunc(_services: Record<string, unknown>, { runId, stepName, rpcName, data }: WorkflowStepInput, { rpc }: {
|
|
29
17
|
rpc: PikkuRPC;
|
|
30
18
|
}): Promise<void>;
|
|
31
|
-
/**
|
|
32
|
-
* Orchestrator — resumes workflow execution after an async step completes.
|
|
33
|
-
* Called when a step worker finishes and the workflow needs to continue.
|
|
34
|
-
*/
|
|
35
19
|
export declare function pikkuWorkflowOrchestratorFunc(_services: Record<string, unknown>, { runId }: PikkuWorkflowOrchestratorInput, { rpc }: {
|
|
36
20
|
rpc: PikkuRPC;
|
|
37
21
|
}): Promise<void>;
|
|
38
|
-
/**
|
|
39
|
-
* Sleeper — wakes a workflow after a workflow.sleep() duration expires.
|
|
40
|
-
* Triggered by a delayed queue message or scheduler callback.
|
|
41
|
-
*/
|
|
42
22
|
export declare function pikkuWorkflowSleeperFunc(_services: Record<string, unknown>, { runId, stepId }: PikkuWorkflowSleeperInput): Promise<void>;
|
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Queue worker functions for workflow orchestration.
|
|
3
|
-
*
|
|
4
|
-
* These are registered as queue consumers by the codegen pipeline
|
|
5
|
-
* (injected into queue meta when workflows exist). They provide
|
|
6
|
-
* the runtime implementations that process queued workflow jobs.
|
|
7
|
-
*/
|
|
8
1
|
import { getSingletonServices } from '../../pikku-state.js';
|
|
9
|
-
/**
|
|
10
|
-
* Step worker — executes individual workflow steps dispatched via queue.
|
|
11
|
-
* The orchestrator queues steps here when they're async (not inline).
|
|
12
|
-
*/
|
|
13
2
|
export async function pikkuWorkflowWorkerFunc(_services, { runId, stepName, rpcName, data }, { rpc }) {
|
|
14
3
|
const services = getSingletonServices();
|
|
15
4
|
if (!services?.workflowService) {
|
|
@@ -17,10 +6,6 @@ export async function pikkuWorkflowWorkerFunc(_services, { runId, stepName, rpcN
|
|
|
17
6
|
}
|
|
18
7
|
await services.workflowService.executeWorkflowStep(runId, stepName, rpcName, data, rpc);
|
|
19
8
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Orchestrator — resumes workflow execution after an async step completes.
|
|
22
|
-
* Called when a step worker finishes and the workflow needs to continue.
|
|
23
|
-
*/
|
|
24
9
|
export async function pikkuWorkflowOrchestratorFunc(_services, { runId }, { rpc }) {
|
|
25
10
|
const services = getSingletonServices();
|
|
26
11
|
if (!services?.workflowService) {
|
|
@@ -28,10 +13,6 @@ export async function pikkuWorkflowOrchestratorFunc(_services, { runId }, { rpc
|
|
|
28
13
|
}
|
|
29
14
|
await services.workflowService.orchestrateWorkflow(runId, rpc);
|
|
30
15
|
}
|
|
31
|
-
/**
|
|
32
|
-
* Sleeper — wakes a workflow after a workflow.sleep() duration expires.
|
|
33
|
-
* Triggered by a delayed queue message or scheduler callback.
|
|
34
|
-
*/
|
|
35
16
|
export async function pikkuWorkflowSleeperFunc(_services, { runId, stepId }) {
|
|
36
17
|
const services = getSingletonServices();
|
|
37
18
|
if (!services?.workflowService) {
|
|
@@ -10,7 +10,6 @@ export interface WorkflowRunWire {
|
|
|
10
10
|
id?: string;
|
|
11
11
|
parentRunId?: string;
|
|
12
12
|
parentStepId?: string;
|
|
13
|
-
/** Pikku user ID propagated from the originating request for credential resolution */
|
|
14
13
|
pikkuUserId?: string;
|
|
15
14
|
}
|
|
16
15
|
export interface WorkflowServiceConfig {
|
|
@@ -20,126 +19,48 @@ export interface WorkflowServiceConfig {
|
|
|
20
19
|
stepWorkerQueueName: string;
|
|
21
20
|
sleeperRPCName: string;
|
|
22
21
|
}
|
|
23
|
-
/**
|
|
24
|
-
* How a workflow service spreads its jobs across queues.
|
|
25
|
-
*
|
|
26
|
-
* Passed to the service constructor rather than read from `config.workflow`:
|
|
27
|
-
* the queues are wired during construction, before singleton services (and so
|
|
28
|
-
* before `config`) exist.
|
|
29
|
-
*/
|
|
30
22
|
export interface WorkflowQueueOptions {
|
|
31
|
-
/**
|
|
32
|
-
* - `'per-workflow'` (default) — each workflow gets its own
|
|
33
|
-
* `wf-orchestrator-*` / `wf-step-*` queue. Complete isolation, and it's
|
|
34
|
-
* what lets serverless providers deploy one unit per workflow. Costs one
|
|
35
|
-
* set of pollers per queue, which adds up on pull-based backends.
|
|
36
|
-
* - `'shared-groups'` — every workflow shares the orchestrator/step-worker
|
|
37
|
-
* queues and stays isolated via {@link queueGroupConcurrency}, so no
|
|
38
|
-
* workflow can occupy more than its share. One set of pollers total.
|
|
39
|
-
* Only for single-process (monolith) runtimes; a per-unit serverless
|
|
40
|
-
* deploy needs the per-workflow queues to route to its units.
|
|
41
|
-
*/
|
|
42
23
|
queueStrategy?: 'per-workflow' | 'shared-groups';
|
|
43
|
-
/**
|
|
44
|
-
* Total concurrent workflow jobs per node under `'shared-groups'`.
|
|
45
|
-
* Defaults to 20.
|
|
46
|
-
*/
|
|
47
24
|
queueConcurrency?: number;
|
|
48
|
-
/**
|
|
49
|
-
* How many jobs of one workflow may run at once under `'shared-groups'`.
|
|
50
|
-
* Defaults to 2. Tiers are keyed by workflow name, so a specific workflow
|
|
51
|
-
* can be given its own limit without any extra wiring.
|
|
52
|
-
*
|
|
53
|
-
* Note tiers can only lower a workflow's limit, not raise it above
|
|
54
|
-
* `default`: the backend's pre-fetch exclusion is applied per group using
|
|
55
|
-
* `default` alone. To give one workflow more room, raise `default` and
|
|
56
|
-
* restrict the others by tier.
|
|
57
|
-
*/
|
|
58
25
|
queueGroupConcurrency?: number | GroupConcurrencyConfig;
|
|
59
26
|
}
|
|
60
27
|
export interface WorkflowPlannedStep {
|
|
61
|
-
/** Durable step key — matches the runtime step name stored in the DB */
|
|
62
28
|
stepName: string;
|
|
63
|
-
/** Optional human-readable label for the UI timeline (falls back to stepName) */
|
|
64
29
|
displayName?: string;
|
|
65
30
|
}
|
|
66
|
-
/**
|
|
67
|
-
* Workflow run status
|
|
68
|
-
*/
|
|
69
31
|
export type WorkflowStatus = 'running' | 'suspended' | 'completed' | 'failed' | 'cancelled';
|
|
70
|
-
/**
|
|
71
|
-
* Workflow version status (for AI-generated workflows)
|
|
72
|
-
*/
|
|
73
32
|
export type WorkflowVersionStatus = 'draft' | 'active' | 'declined';
|
|
74
|
-
/**
|
|
75
|
-
* Workflow step status
|
|
76
|
-
*/
|
|
77
33
|
export type StepStatus = 'pending' | 'running' | 'scheduled' | 'succeeded' | 'failed' | 'suspended';
|
|
78
|
-
/**
|
|
79
|
-
* Workflow run representation
|
|
80
|
-
*/
|
|
81
34
|
export interface WorkflowRun {
|
|
82
|
-
/** Unique run ID */
|
|
83
35
|
id: string;
|
|
84
|
-
/** Workflow name */
|
|
85
36
|
workflow: string;
|
|
86
|
-
/** Current status */
|
|
87
37
|
status: WorkflowStatus;
|
|
88
|
-
/** Input data */
|
|
89
38
|
input: any;
|
|
90
|
-
/** Output data (if completed) */
|
|
91
39
|
output?: any;
|
|
92
|
-
/** Error (if failed) */
|
|
93
40
|
error?: SerializedError;
|
|
94
|
-
/** If true, workflow executes inline without queues */
|
|
95
41
|
inline?: boolean;
|
|
96
|
-
/** Graph hash of the workflow definition at run creation time */
|
|
97
42
|
graphHash?: string;
|
|
98
|
-
/** True when the workflow has a static, pre-computable step timeline */
|
|
99
43
|
deterministic?: boolean;
|
|
100
|
-
/** Static planned steps snapshot captured at run start */
|
|
101
44
|
plannedSteps?: WorkflowPlannedStep[];
|
|
102
|
-
/** Wire origin info (how this run was started) */
|
|
103
45
|
wire: WorkflowRunWire;
|
|
104
|
-
/** Creation timestamp */
|
|
105
46
|
createdAt: Date;
|
|
106
|
-
/** Last update timestamp */
|
|
107
47
|
updatedAt: Date;
|
|
108
48
|
}
|
|
109
|
-
/**
|
|
110
|
-
* Step state representation
|
|
111
|
-
*/
|
|
112
49
|
export interface StepState {
|
|
113
|
-
/** Unique step ID */
|
|
114
50
|
stepId: string;
|
|
115
|
-
/** Step status */
|
|
116
51
|
status: StepStatus;
|
|
117
|
-
/** Step result (if done) */
|
|
118
52
|
result?: any;
|
|
119
|
-
/** Step error (if error) */
|
|
120
53
|
error?: SerializedError;
|
|
121
|
-
/** Number of attempts made (starts at 1) */
|
|
122
54
|
attemptCount: number;
|
|
123
|
-
/** Maximum retry attempts allowed */
|
|
124
55
|
retries?: number;
|
|
125
|
-
/** Delay between retries */
|
|
126
56
|
retryDelay?: string | number;
|
|
127
|
-
/** Step name of the predecessor that scheduled this step (the transition/edge
|
|
128
|
-
* walked to reach it); undefined for entry steps. Reconstructs the path. */
|
|
129
57
|
fromStepName?: string;
|
|
130
|
-
/** Creation timestamp */
|
|
131
58
|
createdAt: Date;
|
|
132
|
-
/** Last update timestamp */
|
|
133
59
|
updatedAt: Date;
|
|
134
|
-
/** Child workflow run ID (if this step spawned a sub-workflow) */
|
|
135
60
|
childRunId?: string;
|
|
136
|
-
/** Timestamp when step started running */
|
|
137
61
|
runningAt?: Date;
|
|
138
|
-
/** Timestamp when step was scheduled */
|
|
139
62
|
scheduledAt?: Date;
|
|
140
|
-
/** Timestamp when step succeeded */
|
|
141
63
|
succeededAt?: Date;
|
|
142
|
-
/** Timestamp when step failed */
|
|
143
64
|
failedAt?: Date;
|
|
144
65
|
}
|
|
145
66
|
export interface WorkflowRunStatus {
|
|
@@ -153,7 +74,6 @@ export interface WorkflowRunStatus {
|
|
|
153
74
|
name: string;
|
|
154
75
|
status: StepStatus;
|
|
155
76
|
duration?: number;
|
|
156
|
-
/** Number of attempts for this step (1 = first try; > 1 means it retried). */
|
|
157
77
|
attempts?: number;
|
|
158
78
|
}>;
|
|
159
79
|
output?: unknown;
|
|
@@ -184,16 +104,6 @@ export interface WorkflowRunService {
|
|
|
184
104
|
} | null>;
|
|
185
105
|
deleteRun(id: string): Promise<boolean>;
|
|
186
106
|
}
|
|
187
|
-
/**
|
|
188
|
-
* Write-only companion to `WorkflowRunService`. An executor (a
|
|
189
|
-
* `PikkuWorkflowService` subclass) can be given a mirror; every write
|
|
190
|
-
* the executor makes to its own canonical store is then forwarded here,
|
|
191
|
-
* so an external read store (e.g. a DB queried by the console UI) stays
|
|
192
|
-
* in sync with DO/Redis/etc-driven runs.
|
|
193
|
-
*
|
|
194
|
-
* Mirror failures are logged but never fail the workflow — the mirror is
|
|
195
|
-
* an index, not the source of truth.
|
|
196
|
-
*/
|
|
197
107
|
export interface WorkflowRunMirror {
|
|
198
108
|
createRun(runId: string, workflowName: string, input: any, inline: boolean, graphHash: string, wire: WorkflowRunWire, options?: {
|
|
199
109
|
deterministic?: boolean;
|
|
@@ -218,187 +128,80 @@ export interface WorkflowRunMirror {
|
|
|
218
128
|
upsertWorkflowVersion(name: string, graphHash: string, graph: any, source: string, status?: WorkflowVersionStatus): Promise<void>;
|
|
219
129
|
updateWorkflowVersionStatus(name: string, graphHash: string, status: WorkflowVersionStatus): Promise<void>;
|
|
220
130
|
}
|
|
221
|
-
/**
|
|
222
|
-
* Core workflow definition
|
|
223
|
-
*/
|
|
224
131
|
export type CoreWorkflow<PikkuFunctionConfig extends CorePikkuFunctionConfig<any, any, any> = CorePikkuFunctionConfig<any, any, any>> = {
|
|
225
|
-
/** Unique workflow name */
|
|
226
132
|
name: string;
|
|
227
|
-
/** The workflow function */
|
|
228
133
|
func: PikkuFunctionConfig;
|
|
229
|
-
/** Middleware chain for this workflow */
|
|
230
134
|
middleware?: PikkuFunctionConfig['middleware'];
|
|
231
|
-
/** Tags for organization and filtering */
|
|
232
135
|
tags?: string[];
|
|
233
136
|
};
|
|
234
|
-
/**
|
|
235
|
-
* A scenario as a feature references it: either the scenario itself, or the
|
|
236
|
-
* scenario paired with the input to run it with. The paired form is gherkin's
|
|
237
|
-
* `Examples:` — the same scenario run once per row, written as an ordinary
|
|
238
|
-
* loop rather than a table.
|
|
239
|
-
*/
|
|
240
137
|
export type CoreFeatureScenario = CorePikkuFunctionConfig<any, any, any> | {
|
|
241
138
|
scenario: CorePikkuFunctionConfig<any, any, any>;
|
|
242
139
|
data: unknown;
|
|
243
140
|
};
|
|
244
|
-
/**
|
|
245
|
-
* A feature: an ordered group of scenarios, mirroring gherkin's Feature ↔
|
|
246
|
-
* Scenario structure. Scenarios are referenced by imported identifier, so a
|
|
247
|
-
* renamed or deleted scenario is a compile error rather than a silent skip.
|
|
248
|
-
*
|
|
249
|
-
* Hooks run **once around the whole group** (`before → a → b → c → after`),
|
|
250
|
-
* not per scenario — per-scenario setup is the scenario's own `before`. That
|
|
251
|
-
* is the one thing a feature deliberately cannot express: gherkin's
|
|
252
|
-
* `Background:` runs per scenario.
|
|
253
|
-
*/
|
|
254
141
|
export type CoreFeature = {
|
|
255
|
-
/** Human-readable name. The export identifier is the id. */
|
|
256
142
|
name: string;
|
|
257
143
|
description?: string;
|
|
258
144
|
tags?: string[];
|
|
259
|
-
/** Readonly because `pikkuFeature`'s `const` generic infers a readonly tuple. */
|
|
260
145
|
scenarios: readonly CoreFeatureScenario[];
|
|
261
146
|
before?: CorePikkuFunctionHook;
|
|
262
147
|
after?: CorePikkuFunctionHook;
|
|
263
148
|
};
|
|
264
|
-
/** One entry of a feature's scenario list, as extracted from the source. */
|
|
265
149
|
export type FeatureMetaEntry = {
|
|
266
|
-
/** The scenario's declared export name — its key in `WorkflowsMeta`. */
|
|
267
150
|
scenario: string;
|
|
268
|
-
/** The input this entry runs the scenario with — gherkin's `Examples:`. */
|
|
269
151
|
data?: unknown;
|
|
270
152
|
};
|
|
271
|
-
/**
|
|
272
|
-
* A feature as the console reads it: the document structure around a group of
|
|
273
|
-
* scenarios. Generated to `scenarios/features.gen.json` and read off disk, so
|
|
274
|
-
* nothing app-facing has to import the scenario bootstrap to describe one.
|
|
275
|
-
*/
|
|
276
153
|
export type FeatureMeta = {
|
|
277
|
-
/** The export identifier. */
|
|
278
154
|
id: string;
|
|
279
155
|
name: string;
|
|
280
156
|
description?: string;
|
|
281
157
|
tags: string[];
|
|
282
|
-
/** In declared order — a feature's reading order is its declaration order. */
|
|
283
158
|
entries: FeatureMetaEntry[];
|
|
284
|
-
/**
|
|
285
|
-
* Entries that could not be read statically (a spread, a `.map()`). Their
|
|
286
|
-
* membership is only known once the scenario bootstrap has been evaluated,
|
|
287
|
-
* so a non-zero count means this listing is partial.
|
|
288
|
-
*/
|
|
289
159
|
unresolvedEntries: number;
|
|
290
|
-
/** Hooks are runtime-only; only their presence is knowable from meta. */
|
|
291
160
|
hasBefore: boolean;
|
|
292
161
|
hasAfter: boolean;
|
|
293
162
|
};
|
|
294
163
|
export type FeaturesMeta = Record<string, FeatureMeta>;
|
|
295
|
-
/** One planned scenario run, resolved from a feature's scenario list. */
|
|
296
164
|
export type FeaturePlanEntry = {
|
|
297
165
|
featureId: string;
|
|
298
166
|
featureName: string;
|
|
299
167
|
scenarioName: string;
|
|
300
|
-
/** The input this entry runs the scenario with, if the feature supplied one. */
|
|
301
168
|
data?: unknown;
|
|
302
|
-
/** The scenario's own tags unioned with the containing feature's. */
|
|
303
169
|
tags: string[];
|
|
304
170
|
};
|
|
305
|
-
/**
|
|
306
|
-
* Workflow client interface
|
|
307
|
-
*/
|
|
308
171
|
export interface PikkuWorkflow {
|
|
309
|
-
/** Start a new workflow run */
|
|
310
172
|
start: <I>(input: I) => Promise<{
|
|
311
173
|
runId: string;
|
|
312
174
|
}>;
|
|
313
|
-
/** Get a workflow run by ID */
|
|
314
175
|
getRun: (runId: string) => Promise<WorkflowRun>;
|
|
315
|
-
/** Cancel a running workflow */
|
|
316
176
|
cancelRun: (runId: string) => Promise<void>;
|
|
317
177
|
}
|
|
318
|
-
/**
|
|
319
|
-
* Context variable definition (serialized from Zod schema or type inference)
|
|
320
|
-
*/
|
|
321
178
|
export interface ContextVariable {
|
|
322
|
-
/** Variable type */
|
|
323
179
|
type: 'string' | 'number' | 'boolean' | 'object' | 'array';
|
|
324
|
-
/** Default value */
|
|
325
180
|
default?: unknown;
|
|
326
|
-
/** Description for UI/docs */
|
|
327
181
|
description?: string;
|
|
328
182
|
}
|
|
329
|
-
/**
|
|
330
|
-
* Workflow context - state variables with defaults and types
|
|
331
|
-
*/
|
|
332
183
|
export type WorkflowContext = Record<string, ContextVariable>;
|
|
333
|
-
/**
|
|
334
|
-
* Workflows metadata for inspector/CLI (DSL step-based format)
|
|
335
|
-
*/
|
|
336
184
|
export type WorkflowsMeta = Record<string, CommonWireMeta & {
|
|
337
185
|
name: string;
|
|
338
186
|
steps: WorkflowStepMeta[];
|
|
339
187
|
context?: WorkflowContext;
|
|
340
188
|
dsl?: boolean;
|
|
341
189
|
expose?: boolean;
|
|
342
|
-
/** True for pikkuScenario workflows (complex + actor steps). */
|
|
343
190
|
scenario?: boolean;
|
|
344
|
-
/**
|
|
345
|
-
* Why a scenario is held out of a default run. Stating the reason in code
|
|
346
|
-
* keeps the quarantine next to the scenario it applies to, rather than in
|
|
347
|
-
* a CI invocation nobody reads. Naming the scenario with `--flows` runs it
|
|
348
|
-
* regardless.
|
|
349
|
-
*/
|
|
350
191
|
skip?: string;
|
|
351
|
-
/** Actor names a scenario declares (personas it runs steps as). */
|
|
352
192
|
actors?: string[];
|
|
353
193
|
}>;
|
|
354
|
-
/**
|
|
355
|
-
* Unified workflow runtime meta (used by runtime to execute workflows)
|
|
356
|
-
* This is the format stored in pikkuState('workflows', 'meta')
|
|
357
|
-
* Both DSL and graph-based workflows are converted to this format
|
|
358
|
-
*/
|
|
359
194
|
export interface WorkflowRuntimeMeta {
|
|
360
|
-
/** Workflow name (used as key in registrations) */
|
|
361
195
|
name: string;
|
|
362
|
-
/** Pikku function name (for execution) */
|
|
363
196
|
pikkuFuncId: string;
|
|
364
|
-
/** Source type: 'dsl' (serializable), 'complex' (has inline steps), 'graph', 'scenario' (complex + actor steps) */
|
|
365
197
|
source: 'dsl' | 'complex' | 'graph' | 'scenario';
|
|
366
|
-
/** Optional description */
|
|
367
198
|
description?: string;
|
|
368
|
-
/** Tags for organization */
|
|
369
199
|
tags?: string[];
|
|
370
|
-
/** Actor names a scenario declares (personas it runs steps as). */
|
|
371
200
|
actors?: string[];
|
|
372
|
-
/** Serialized nodes */
|
|
373
201
|
nodes?: Record<string, any>;
|
|
374
|
-
/** Entry node IDs for graph workflows (computed at build time) */
|
|
375
202
|
entryNodeIds?: string[];
|
|
376
|
-
/** Hash of graph topology (nodes, edges, input mappings) */
|
|
377
203
|
graphHash?: string;
|
|
378
|
-
/** True when the workflow has a static, pre-computable step timeline */
|
|
379
204
|
deterministic?: boolean;
|
|
380
|
-
/** Static planned steps metadata for deterministic workflows */
|
|
381
205
|
plannedSteps?: WorkflowPlannedStep[];
|
|
382
206
|
}
|
|
383
|
-
/**
|
|
384
|
-
* Unified workflow runtime metadata map
|
|
385
|
-
*/
|
|
386
207
|
export type WorkflowsRuntimeMeta = Record<string, WorkflowRuntimeMeta>;
|
|
387
|
-
/**
|
|
388
|
-
* Worker input types for generated queue workers
|
|
389
|
-
*/
|
|
390
|
-
export type WorkflowStepInput = {
|
|
391
|
-
runId: string;
|
|
392
|
-
stepName: string;
|
|
393
|
-
rpcName: string;
|
|
394
|
-
data: any;
|
|
395
|
-
/** Predecessor step name (the walked transition); undefined for entry steps. */
|
|
396
|
-
fromStepName?: string;
|
|
397
|
-
};
|
|
398
|
-
export type WorkflowOrchestratorInput = {
|
|
399
|
-
runId: string;
|
|
400
|
-
};
|
|
401
|
-
export type WorkflowSleeperInput = {
|
|
402
|
-
runId: string;
|
|
403
|
-
stepId: string;
|
|
404
|
-
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: overview
|
|
3
|
+
title: Decisions
|
|
4
|
+
description: Rules chosen in @pikku/core, and what each one rules out
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Decisions
|
|
8
|
+
|
|
9
|
+
A rule that was chosen, and what it rules out.
|
|
10
|
+
|
|
11
|
+
Each note here replaces a comment that was carrying reasoning inside the source.
|
|
12
|
+
If you are about to "clean up" something in core that looks pointless, search
|
|
13
|
+
here first — several of these exist because the obvious simplification was tried
|
|
14
|
+
and broke something.
|
|
15
|
+
|
|
16
|
+
<!-- pikku:knowledge-index -->
|
|
17
|
+
- [internals](internals/index.md) — a rule about how it works under the hood, and why
|
|
18
|
+
- [security](security/index.md) — a rule about who may do what
|
|
19
|
+
<!-- /pikku:knowledge-index -->
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: A secret that fails to decrypt fails the whole read
|
|
4
|
+
description: getSecrets throws naming the key and its key_version rather than omitting the row, because a silent omission surfaces as an unrelated failure much later
|
|
5
|
+
tags: crypto, storage
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# A secret that fails to decrypt fails the whole read
|
|
9
|
+
|
|
10
|
+
Every store's bulk read — `getSecrets` in the kysely, mongodb and redis secret
|
|
11
|
+
services — wraps the `getKEK` + `envelopeDecrypt` pair in a try/catch that
|
|
12
|
+
rethrows:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Failed to decrypt secret "<key>" (key_version <n>): the configured KEK does not
|
|
16
|
+
match the key it was wrapped under
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
with the original crypto error as `cause`. A key that has no row at all is still
|
|
20
|
+
simply absent from the returned object; only a row that exists and will not
|
|
21
|
+
decrypt is fatal.
|
|
22
|
+
|
|
23
|
+
Those two cases look similar and are not. A missing key is an ordinary, callable
|
|
24
|
+
state — the caller asked for something that was never stored, and the typed
|
|
25
|
+
secret layer above already decides what to do about an absent value. A stored
|
|
26
|
+
row that will not decrypt means the service is holding ciphertext it cannot
|
|
27
|
+
read: a `PIKKU_SECRET_KEK` that does not match what the value was wrapped under,
|
|
28
|
+
a `previousKey` missing for an older `keyVersion`, or a change to the derivation
|
|
29
|
+
itself. Nothing the caller can do downstream makes that better.
|
|
30
|
+
|
|
31
|
+
Dropping the row instead hands back a partial map, and the failure re-emerges
|
|
32
|
+
somewhere with no connection to secrets — an auth middleware reading an
|
|
33
|
+
undefined signing key and answering "server configuration error", a provider
|
|
34
|
+
client constructed with `undefined` credentials and 401-ing. The name of the
|
|
35
|
+
secret and the `key_version` it was wrapped under are precisely the two facts
|
|
36
|
+
that turn that into a one-line fix, and they are known at the catch site and
|
|
37
|
+
nowhere after it.
|
|
38
|
+
|
|
39
|
+
This matters most at exactly the moment it is least convenient: a change to
|
|
40
|
+
`deriveKEK` makes *every* previously stored secret undecryptable at once. Loud
|
|
41
|
+
failure names the first one; silence produces an empty map and a support ticket.
|
|
42
|
+
|
|
43
|
+
**What this rules out:** a `getSecrets` that skips unreadable rows; returning
|
|
44
|
+
`undefined` for a row that exists; collecting failures and returning them
|
|
45
|
+
alongside the successes, which just moves the ignoring one level up; and
|
|
46
|
+
treating a missing key as an error, which would break callers that legitimately
|
|
47
|
+
probe for optional secrets.
|
|
48
|
+
|
|
49
|
+
See [[the-kek-salt-is-scoped-to-the-key-version]].
|
package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: An actor conversation starts from a seeded kickoff message
|
|
4
|
+
description: The actor's first turn needs a non-empty message list because providers reject an empty prompt; the seed is an instruction and stays out of the transcript
|
|
5
|
+
tags: actor-flow
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# An actor conversation starts from a seeded kickoff message
|
|
9
|
+
|
|
10
|
+
`runConversation` in
|
|
11
|
+
`packages/core/src/wirings/actor-flow/run-conversation.ts` primes
|
|
12
|
+
`actorMessages` with a single user message telling the persona to begin, before
|
|
13
|
+
the first turn is generated.
|
|
14
|
+
|
|
15
|
+
The actor speaks first, so at that point there is nothing for it to reply to —
|
|
16
|
+
and LLM providers reject a completion request with no messages. The seed is
|
|
17
|
+
addressed to the actor rather than to the target agent, which is why it is never
|
|
18
|
+
pushed onto `transcript`: it is scaffolding, not something the simulated user
|
|
19
|
+
said, and including it would corrupt the transcript the final evaluation reads.
|
|
20
|
+
|
|
21
|
+
**What this rules out:** starting from an empty `actorMessages` array, folding
|
|
22
|
+
the kickoff into the persona instructions where a provider may weight it
|
|
23
|
+
differently, and pushing the seed into the transcript for symmetry.
|
package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: The actor-flow conversation engine only sees a transport-agnostic target driver
|
|
4
|
+
description: The engine never imports the agent runner; the target is injected as run/approve, so scenarios exercise the real wire path
|
|
5
|
+
tags: actor-flow
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# The actor-flow conversation engine only sees a transport-agnostic target driver
|
|
9
|
+
|
|
10
|
+
`runConversation` reaches the target agent exclusively through the injected
|
|
11
|
+
`TargetAgentDriver` — `run(message)` and `approve(runId, decisions)` — declared
|
|
12
|
+
in `packages/core/src/wirings/actor-flow/actor-flow.types.ts`. In production that
|
|
13
|
+
driver is HTTP-backed, issuing the actor's `agentRun` and `agentApprove` calls as
|
|
14
|
+
the signed-in actor.
|
|
15
|
+
|
|
16
|
+
Keeping the seam transport-agnostic is what makes the conversation a real test:
|
|
17
|
+
the agent is exercised through the same authenticated wire path a user takes,
|
|
18
|
+
including middleware, permissions and session handling, rather than through an
|
|
19
|
+
in-process call that skips all of it. It also lets the engine be unit-tested
|
|
20
|
+
against scripted targets with no server at all.
|
|
21
|
+
|
|
22
|
+
**What this rules out:** calling `runAIAgent` / `streamAIAgent` directly from the
|
|
23
|
+
conversation engine, and widening `TargetAgentDriver` with transport details
|
|
24
|
+
(headers, cookies, channels) that would tie the engine to HTTP.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: An actor-flow verdict is the persona's self-evaluation, not an assertion
|
|
4
|
+
description: The engine returns what the actor judged plus the transcript; deterministic checks stay with the caller
|
|
5
|
+
tags: actor-flow
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# An actor-flow verdict is the persona's self-evaluation, not an assertion
|
|
9
|
+
|
|
10
|
+
`runConversation` ends by asking the persona LLM whether the `evaluate`
|
|
11
|
+
criterion was met and returns that as `ActorFlowVerdict` — `passed`, `reasoning`
|
|
12
|
+
and the full `transcript`
|
|
13
|
+
(`packages/core/src/wirings/actor-flow/`). Nothing in the engine inspects the
|
|
14
|
+
system the agent acted on.
|
|
15
|
+
|
|
16
|
+
The verdict is deliberately soft because the thing it judges is soft: whether a
|
|
17
|
+
conversation accomplished a natural-language task. Deterministic checks — that a
|
|
18
|
+
row was written, that an email went out — belong to the caller, which already
|
|
19
|
+
holds the actor and can `actor.invoke(...)` after the conversation returns. The
|
|
20
|
+
`reasoning` and `transcript` fields exist so a soft failure is debuggable rather
|
|
21
|
+
than merely red.
|
|
22
|
+
|
|
23
|
+
**What this rules out:** having `runConversation` assert or throw on a failed
|
|
24
|
+
verdict, and adding deterministic post-conditions to `ConverseOptions` instead of
|
|
25
|
+
running them at the call site.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: Addon package roots resolve by walking node module search paths
|
|
4
|
+
description: LocalMetaService finds an addon's directory by scanning resolve.paths, not by require.resolve, because addon packages expose no main entry
|
|
5
|
+
tags: services
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Addon package roots resolve by walking node module search paths
|
|
9
|
+
|
|
10
|
+
`LocalMetaService.resolvePackageRoot` (`packages/core/src/services/meta-service.ts`)
|
|
11
|
+
builds a `createRequire` anchored one level above `.pikku` — the app root — then
|
|
12
|
+
walks `require.resolve.paths(packageName)` and takes the first candidate
|
|
13
|
+
directory that contains a `package.json`. The result is memoised in
|
|
14
|
+
`packageRootCache`.
|
|
15
|
+
|
|
16
|
+
The obvious call, `require.resolve(packageName)`, throws for these packages:
|
|
17
|
+
Pikku addon packages ship a `.pikku` directory and subpath exports but no main
|
|
18
|
+
`exports` entry, so there is nothing for Node to resolve to. Walking the search
|
|
19
|
+
paths asks the same question Node would ask — where would this package be
|
|
20
|
+
found from the app root — without requiring the package to be importable.
|
|
21
|
+
|
|
22
|
+
**What this rules out:** replacing the loop with `require.resolve(pkg)`,
|
|
23
|
+
`import.meta.resolve`, or `createRequire(import.meta.url)`. The first two fail on
|
|
24
|
+
every addon; the third anchors resolution at `@pikku/core`'s own location rather
|
|
25
|
+
than the app's, so an addon installed only in the app's `node_modules` becomes
|
|
26
|
+
invisible.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: Addon singleton services are cached per namespace, not per package
|
|
4
|
+
description: Each wireAddon instance gets its own services built from its own overrides, at the cost of one service graph per wired instance
|
|
5
|
+
tags: rpc
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Addon singleton services are cached per namespace, not per package
|
|
9
|
+
|
|
10
|
+
`getOrCreatePackageSingletonServices` in
|
|
11
|
+
`packages/core/src/wirings/rpc/addon-runner.ts` keys its `pikkuState` cache on
|
|
12
|
+
`addonInstance?.namespace ?? packageName`. The namespace is the consumer-facing
|
|
13
|
+
name given to `wireAddon`/`wireRemoteAddon`, and it is what selects the
|
|
14
|
+
instance's `secretOverrides`, `variableOverrides` and `credentialOverrides`.
|
|
15
|
+
|
|
16
|
+
One package may be wired twice — the same payments addon against a live and a
|
|
17
|
+
sandbox account, say — with different secret and variable names. Caching by
|
|
18
|
+
package name would build the service graph once, from whichever instance called
|
|
19
|
+
first, and silently hand the other instance the wrong credentials. Because the
|
|
20
|
+
overrides have to be visible to the addon's *own* `createSingletonServices`, they
|
|
21
|
+
are applied by wrapping the parent `secrets` and `variables` services
|
|
22
|
+
(`aliasSecretService`, `aliasVariablesService`) so that every logical name the
|
|
23
|
+
addon reads is remapped to the real project name before resolution. A call with
|
|
24
|
+
no instance attached still falls back to per-package caching.
|
|
25
|
+
|
|
26
|
+
`addonInstanceForNamespace` rebuilds this descriptor for bare intra-addon calls
|
|
27
|
+
from the namespace currently executing on the wire, and returns `undefined`
|
|
28
|
+
unless that namespace maps to the package being resolved — so a bare call cannot
|
|
29
|
+
pick up another instance's overrides.
|
|
30
|
+
|
|
31
|
+
**What this rules out:** simplifying the cache key to `packageName`, resolving
|
|
32
|
+
overrides at the call site instead of aliasing the resolver services, and
|
|
33
|
+
assuming two `wireAddon` entries for one package share a service instance.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: decision
|
|
3
|
+
title: Bare workflow names from inside an addon are prefixed with the consumer's namespace
|
|
4
|
+
description: The addon's workflowService is proxied so an addon never has to hardcode the name its consumer chose
|
|
5
|
+
tags: rpc
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Bare workflow names from inside an addon are prefixed with the consumer's namespace
|
|
9
|
+
|
|
10
|
+
`wrapWorkflowServiceForPackage` in
|
|
11
|
+
`packages/core/src/wirings/rpc/addon-runner.ts` proxies an addon package's
|
|
12
|
+
`workflowService`, intercepting `startWorkflow` and `runToCompletion`. A bare
|
|
13
|
+
name — one with no `:` — is rewritten to `${namespace}:${name}`, using the
|
|
14
|
+
instance namespace when known and otherwise the package's sole namespace via
|
|
15
|
+
`findAddonNamespaceForPackage`.
|
|
16
|
+
|
|
17
|
+
Workflows declared by an addon are registered under the addon's package scope,
|
|
18
|
+
but the namespace they answer to is chosen by the *consumer* in `wireAddon`.
|
|
19
|
+
Without the proxy, `runToCompletion('myWorkflow')` written inside the addon
|
|
20
|
+
resolves against root meta, misses, and throws `WorkflowNotFoundError` — leaving
|
|
21
|
+
the addon author no option but to hardcode the consumer-defined namespace, which
|
|
22
|
+
couples a reusable package to one particular caller. Explicit `'ns:name'` calls
|
|
23
|
+
and bare names that already resolve in root are untouched; only bare names that
|
|
24
|
+
would otherwise miss get prefixed.
|
|
25
|
+
|
|
26
|
+
**What this rules out:** dropping the proxy and requiring addons to namespace
|
|
27
|
+
their own workflow calls, and widening the rewrite to names that already contain
|
|
28
|
+
a `:` or already exist at root — either turns a working call into a lookup miss.
|