@pikku/core 0.12.72 → 0.12.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1171 -0
- package/dist/column-form.d.ts +32 -0
- package/dist/column-form.js +42 -0
- package/dist/crypto-utils.d.ts +43 -7
- package/dist/crypto-utils.js +163 -42
- package/dist/data-classification.d.ts +44 -0
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +37 -32
- package/dist/function/functions.types.d.ts +57 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/index.d.ts +1 -1
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -13
- package/dist/handle-error.js +0 -18
- package/dist/index.d.ts +11 -5
- package/dist/index.js +7 -2
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +5 -41
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +4 -3
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +9 -8
- package/dist/schema.d.ts +5 -39
- package/dist/schema.js +5 -39
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/secret-value.d.ts +56 -0
- package/dist/secret-value.js +46 -0
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.d.ts +74 -4
- package/dist/services/audit-service.js +8 -7
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/credential-wire-service.d.ts +5 -0
- package/dist/services/credential-wire-service.js +9 -1
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/email-service.d.ts +2 -1
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +8 -9
- package/dist/services/index.js +3 -6
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content-request-handler.d.ts +29 -0
- package/dist/services/local-content-request-handler.js +176 -0
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +4 -7
- package/dist/services/local-secrets.js +7 -7
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +22 -40
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +10 -42
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +4 -7
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +12 -35
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +5 -11
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +21 -64
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +6 -23
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +120 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +46 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +65 -132
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +63 -22
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +180 -64
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +124 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +59 -1
- package/dist/wirings/ai-agent/voice-input.js +90 -12
- package/dist/wirings/ai-agent/voice-output.d.ts +69 -1
- package/dist/wirings/ai-agent/voice-output.js +162 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +38 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +129 -0
- package/dist/wirings/cli/channel/index.d.ts +5 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +0 -99
- package/dist/wirings/http/http-runner.js +9 -165
- package/dist/wirings/http/http.types.d.ts +14 -55
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +0 -40
- package/dist/wirings/http/pikku-fetch-http-request.js +0 -58
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -4
- package/dist/wirings/mcp/mcp-runner.js +1 -14
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +32 -0
- package/dist/wirings/persona/define-personas.js +31 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +136 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +103 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +20 -90
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +17 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +3 -13
- package/dist/wirings/rpc/remote-addon-auth.js +7 -11
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +30 -0
- package/dist/wirings/virtual-user/index.js +10 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +54 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +49 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.d.ts +90 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +19 -15
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -43
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +1 -19
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +84 -12
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +5 -195
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +48 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +84 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +41 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +117 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +53 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +48 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/validate-checks-personas-through-a-shared-module.md +43 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +6 -2
- package/run-tests.sh +0 -0
- package/src/column-form.test.ts +97 -0
- package/src/column-form.ts +58 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +306 -59
- package/src/data-classification.ts +45 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +0 -7
- package/src/function/function-runner.ts +62 -32
- package/src/function/functions.types.ts +95 -138
- package/src/function/index.ts +1 -0
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/handle-error.ts +0 -18
- package/src/index.ts +84 -3
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +3 -5
- package/src/middleware/auth-bearer.ts +5 -41
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +26 -10
- package/src/middleware/remote-auth.ts +11 -3
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +173 -0
- package/src/remote.ts +18 -8
- package/src/schema.ts +5 -39
- package/src/scopes.ts +7 -48
- package/src/secret-value.test.ts +204 -0
- package/src/secret-value.ts +111 -0
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +88 -11
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/credential-wire-service.ts +9 -1
- package/src/services/deployment-service.ts +3 -9
- package/src/services/email-service.ts +3 -1
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +23 -18
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content-request-handler.test.ts +202 -0
- package/src/services/local-content-request-handler.ts +267 -0
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.test.ts +20 -5
- package/src/services/local-secrets.ts +15 -11
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +31 -46
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.test.ts +2 -1
- package/src/services/queue-webhook-service.ts +10 -42
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +4 -7
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +12 -35
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +12 -14
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +23 -64
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +6 -32
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +137 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +91 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +49 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +89 -139
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +85 -35
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +224 -76
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +130 -5
- package/src/wirings/ai-agent/index.ts +37 -3
- package/src/wirings/ai-agent/voice-input.test.ts +137 -7
- package/src/wirings/ai-agent/voice-input.ts +96 -12
- package/src/wirings/ai-agent/voice-output.test.ts +512 -0
- package/src/wirings/ai-agent/voice-output.ts +243 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +185 -0
- package/src/wirings/cli/channel/index.ts +13 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +8 -167
- package/src/wirings/http/http.types.ts +15 -62
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +2 -10
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -58
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.ts +2 -17
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +33 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +142 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +454 -0
- package/src/wirings/queue/queue-identity.ts +176 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +25 -90
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +60 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +9 -16
- package/src/wirings/rpc/rpc-runner.test.ts +192 -6
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +88 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +115 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +95 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-run-store.ts +98 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +19 -20
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -61
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.test.ts +5 -7
- package/src/wirings/workflow/scenario-prose.ts +1 -29
- package/src/wirings/workflow/scenario-service.test.ts +2 -10
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +163 -19
- package/src/wirings/workflow/scenario-step.types.ts +94 -12
- package/src/wirings/workflow/scenario-surface.test.ts +146 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +5 -201
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +12 -0
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -16,14 +16,16 @@ import {
|
|
|
16
16
|
type WorkflowRunExtension,
|
|
17
17
|
} from './pikku-workflow-service.js'
|
|
18
18
|
import type { PikkuWire } from '../../types/core.types.js'
|
|
19
|
-
import type {
|
|
19
|
+
import type { ScenarioPersonas } from '../../services/personas-service.js'
|
|
20
20
|
import type { CorePikkuFunctionConfig } from '../../function/functions.types.js'
|
|
21
21
|
import type {
|
|
22
22
|
ScenarioBrowserProvider,
|
|
23
23
|
ScenarioEnvironment,
|
|
24
24
|
ScenarioStepOptions,
|
|
25
25
|
ScenarioStepPhase,
|
|
26
|
+
ScenarioSurface,
|
|
26
27
|
} from './scenario-step.types.js'
|
|
28
|
+
import { resolveScenarioSurfaces, witnessesAgree } from './scenario-surface.js'
|
|
27
29
|
import type {
|
|
28
30
|
PikkuScenarioWire,
|
|
29
31
|
PikkuWorkflowWire,
|
|
@@ -103,6 +105,118 @@ addError(ScenarioHookError, {
|
|
|
103
105
|
message: 'A scenario lifecycle hook failed.',
|
|
104
106
|
})
|
|
105
107
|
|
|
108
|
+
/**
|
|
109
|
+
* Two witnesses of the same `then` disagreed.
|
|
110
|
+
*
|
|
111
|
+
* This is the failure the whole additive-witness design exists to produce: the
|
|
112
|
+
* system of record is right and the surface the actor was looking at is not, or
|
|
113
|
+
* the other way round. Both observations go in the message, because either one
|
|
114
|
+
* alone reads as a passing assertion.
|
|
115
|
+
*/
|
|
116
|
+
export class ScenarioWitnessDisagreement extends PikkuError {
|
|
117
|
+
constructor(
|
|
118
|
+
public readonly stepFunc: string,
|
|
119
|
+
public readonly expected: { surface: ScenarioSurface; observed: unknown },
|
|
120
|
+
public readonly actual: { surface: ScenarioSurface; observed: unknown }
|
|
121
|
+
) {
|
|
122
|
+
super(
|
|
123
|
+
`Scenario step '${stepFunc}' observed different things on different surfaces — ` +
|
|
124
|
+
`${expected.surface}: ${JSON.stringify(expected.observed)}, ` +
|
|
125
|
+
`${actual.surface}: ${JSON.stringify(actual.observed)}.`
|
|
126
|
+
)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
addError(ScenarioWitnessDisagreement, {
|
|
130
|
+
status: 500,
|
|
131
|
+
message: 'Two surfaces disagreed about what happened.',
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* A step resolved to its browser binding but nothing can provide a browser.
|
|
136
|
+
*/
|
|
137
|
+
export class ScenarioBrowserUnavailable extends PikkuError {
|
|
138
|
+
constructor(public readonly stepFunc: string) {
|
|
139
|
+
super(
|
|
140
|
+
`[scenario] step '${stepFunc}' resolved to its browser binding but no browser provider is registered. ` +
|
|
141
|
+
`Install @pikku/playwright and register its provider, or run with --run default to take the server-side path.`
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
addError(ScenarioBrowserUnavailable, {
|
|
146
|
+
status: 500,
|
|
147
|
+
message: 'No browser provider is registered.',
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* A browser binding was reached without an actor, so there is no persona whose
|
|
152
|
+
* window it would run in.
|
|
153
|
+
*/
|
|
154
|
+
export class ScenarioBrowserActorRequired extends PikkuError {
|
|
155
|
+
constructor(public readonly stepFunc: string) {
|
|
156
|
+
super(
|
|
157
|
+
`[scenario] step '${stepFunc}' resolved to its browser binding but was called without an actor. ` +
|
|
158
|
+
`Pass { actor: actors.<name> } so the browser signs in as that persona.`
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
addError(ScenarioBrowserActorRequired, {
|
|
163
|
+
status: 500,
|
|
164
|
+
message: 'A browser binding needs an actor.',
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* A step declares no binding the run can execute.
|
|
169
|
+
*
|
|
170
|
+
* Reached when a step has no `default` and the run targets a surface it does not
|
|
171
|
+
* implement — an action step with nothing to run is a broken ladder, not a
|
|
172
|
+
* coverage gap. (A `then` that ran somewhere, just not on the run surface, is
|
|
173
|
+
* the coverage gap; it is reported rather than thrown. See
|
|
174
|
+
* {@link ScenarioNoWitness} for one that ran nowhere.)
|
|
175
|
+
*/
|
|
176
|
+
export class ScenarioNoSurfaceBinding extends PikkuError {
|
|
177
|
+
constructor(
|
|
178
|
+
public readonly stepFunc: string,
|
|
179
|
+
public readonly declared: ScenarioSurface[],
|
|
180
|
+
public readonly runSurface: ScenarioSurface
|
|
181
|
+
) {
|
|
182
|
+
super(
|
|
183
|
+
`[scenario] step '${stepFunc}' declares no binding for '${runSurface}' and no 'default' to fall back to ` +
|
|
184
|
+
`(declares: ${declared.join(', ') || 'nothing'}).`
|
|
185
|
+
)
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
addError(ScenarioNoSurfaceBinding, {
|
|
189
|
+
status: 500,
|
|
190
|
+
message: 'Step has no runnable binding for this surface.',
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* An assertion had no witness this run could execute.
|
|
195
|
+
*
|
|
196
|
+
* Distinct from an unwitnessed `then`, which ran server-side and merely did not
|
|
197
|
+
* look at the surface its prose claims. This one ran nowhere: without the throw
|
|
198
|
+
* the step returns `undefined` and renders as a tick, reporting a pass for
|
|
199
|
+
* something nobody checked. That is the exact failure the phase exists to
|
|
200
|
+
* prevent, so it is fatal regardless of `--strict`.
|
|
201
|
+
*/
|
|
202
|
+
export class ScenarioNoWitness extends PikkuError {
|
|
203
|
+
constructor(
|
|
204
|
+
public readonly stepFunc: string,
|
|
205
|
+
public readonly declared: ScenarioSurface[],
|
|
206
|
+
public readonly runSurface: ScenarioSurface
|
|
207
|
+
) {
|
|
208
|
+
super(
|
|
209
|
+
`[scenario] assertion '${stepFunc}' has no witness to run on '${runSurface}' ` +
|
|
210
|
+
`(declares: ${declared.join(', ') || 'nothing'}). Add a 'default' witness so the ` +
|
|
211
|
+
`assertion is checked server-side even when the surface cannot check it.`
|
|
212
|
+
)
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
addError(ScenarioNoWitness, {
|
|
216
|
+
status: 500,
|
|
217
|
+
message: 'Assertion has no witness for this surface.',
|
|
218
|
+
})
|
|
219
|
+
|
|
106
220
|
/**
|
|
107
221
|
* The scenario capability, layered onto a workflow service rather than being
|
|
108
222
|
* one.
|
|
@@ -130,12 +244,25 @@ addError(ScenarioHookError, {
|
|
|
130
244
|
export class PikkuScenarioService implements WorkflowRunExtension {
|
|
131
245
|
// Scenario actors per run: live authenticated clients (cookie jars) are
|
|
132
246
|
// process-local by nature, so they ride this map, never the persisted wire.
|
|
133
|
-
private runActors = new Map<string,
|
|
247
|
+
private runActors = new Map<string, ScenarioPersonas>()
|
|
134
248
|
private scenarioBrowserProvider?: ScenarioBrowserProvider
|
|
135
249
|
private scenarioEnvironment?: ScenarioEnvironment
|
|
250
|
+
private runSurface: ScenarioSurface = 'default'
|
|
136
251
|
|
|
137
252
|
constructor(private readonly engine: WorkflowRunEngine) {}
|
|
138
253
|
|
|
254
|
+
/**
|
|
255
|
+
* The surface every actor drives the system through for this run, set once by
|
|
256
|
+
* the runner from `--run`. `default` is the server-side path — the fast suite.
|
|
257
|
+
*/
|
|
258
|
+
public setRunSurface(surface: ScenarioSurface) {
|
|
259
|
+
this.runSurface = surface
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
public getRunSurface(): ScenarioSurface {
|
|
263
|
+
return this.runSurface
|
|
264
|
+
}
|
|
265
|
+
|
|
139
266
|
/**
|
|
140
267
|
* Registered by `@pikku/playwright` (or any other driver) before a scenario
|
|
141
268
|
* runs. Absent means browser steps cannot run, which the CLI checks up front
|
|
@@ -167,12 +294,12 @@ export class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
167
294
|
public async attachRunContext(
|
|
168
295
|
runId: string,
|
|
169
296
|
workflowMeta: any,
|
|
170
|
-
options?: { actors?:
|
|
297
|
+
options?: { actors?: ScenarioPersonas }
|
|
171
298
|
): Promise<void> {
|
|
172
299
|
const actors =
|
|
173
300
|
options?.actors ??
|
|
174
301
|
(workflowMeta.source === 'scenario'
|
|
175
|
-
? await this.
|
|
302
|
+
? await this.resolvePersonas()
|
|
176
303
|
: undefined)
|
|
177
304
|
if (actors) {
|
|
178
305
|
this.runActors.set(runId, actors)
|
|
@@ -323,7 +450,7 @@ export class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
323
450
|
* for the AI persona conversation loop it pulls in when a scenario actually
|
|
324
451
|
* signs an actor in.
|
|
325
452
|
*/
|
|
326
|
-
public async
|
|
453
|
+
public async resolvePersonas(): Promise<ScenarioPersonas | undefined> {
|
|
327
454
|
const services = getSingletonServices()
|
|
328
455
|
const variables = services?.variables
|
|
329
456
|
const metaService = services?.metaService
|
|
@@ -334,12 +461,12 @@ export class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
334
461
|
const apiUrl = await variables.get('API_URL')
|
|
335
462
|
if (!secret || !apiUrl) {
|
|
336
463
|
services?.logger?.warn(
|
|
337
|
-
'A scenario was started without
|
|
464
|
+
'A scenario was started without personas but SCENARIO_ACTOR_SECRET / API_URL is not configured — running without them.'
|
|
338
465
|
)
|
|
339
466
|
return undefined
|
|
340
467
|
}
|
|
341
|
-
const
|
|
342
|
-
if (!
|
|
468
|
+
const personas = await metaService.getPersonasMeta()
|
|
469
|
+
if (!personas || Object.keys(personas).length === 0) {
|
|
343
470
|
return undefined
|
|
344
471
|
}
|
|
345
472
|
const signInPath =
|
|
@@ -351,12 +478,12 @@ export class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
351
478
|
apiUrl,
|
|
352
479
|
appUrl: (await variables.get('APP_URL')) ?? undefined,
|
|
353
480
|
}
|
|
354
|
-
const {
|
|
355
|
-
await import('../../services/http-
|
|
356
|
-
return
|
|
481
|
+
const { createHttpPersonas } =
|
|
482
|
+
await import('../../services/http-personas.js')
|
|
483
|
+
return createHttpPersonas({
|
|
357
484
|
apiUrl,
|
|
358
485
|
secret,
|
|
359
|
-
|
|
486
|
+
personas,
|
|
360
487
|
signInPath,
|
|
361
488
|
rpcPath,
|
|
362
489
|
})
|
|
@@ -522,17 +649,11 @@ export class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
522
649
|
},
|
|
523
650
|
|
|
524
651
|
// Scenario steps: a named `pikkuScenarioStep` run as one durable step.
|
|
525
|
-
// `given`/`when
|
|
526
|
-
//
|
|
527
|
-
step
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
scenarioStepContext(),
|
|
531
|
-
stepName,
|
|
532
|
-
stepFunc,
|
|
533
|
-
data,
|
|
534
|
-
options
|
|
535
|
-
),
|
|
652
|
+
// `given`/`when` are sugar for each other, differing only in the
|
|
653
|
+
// prose a reporter renders. `then` is not: the phase is what decides
|
|
654
|
+
// whether the step's bindings are alternatives or witnesses, so the same
|
|
655
|
+
// step function called two ways runs differently. See
|
|
656
|
+
// {@link resolveScenarioSurfaces}.
|
|
536
657
|
given: (stepName, stepFunc, data, options) =>
|
|
537
658
|
this.scenarioStep(
|
|
538
659
|
'given',
|
|
@@ -592,56 +713,104 @@ export class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
592
713
|
? `${addonNamespace}:${stepFunc}`
|
|
593
714
|
: stepFunc
|
|
594
715
|
|
|
595
|
-
const actor = options?.actor as
|
|
716
|
+
const actor = options?.actor as ScenarioPersonas[string] | undefined
|
|
596
717
|
const description =
|
|
597
718
|
options?.description ??
|
|
598
719
|
this.scenarioStepDescription(packageName, resolvedStepFunc) ??
|
|
599
720
|
stepName
|
|
600
721
|
|
|
722
|
+
const declared = this.declaredSurfaces(packageName, resolvedStepFunc)
|
|
723
|
+
const resolution = resolveScenarioSurfaces(phase, declared, this.runSurface)
|
|
724
|
+
|
|
601
725
|
return await this.engine.inlineStep(
|
|
602
726
|
runId,
|
|
603
727
|
stepName,
|
|
604
728
|
async () => {
|
|
605
|
-
const
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
729
|
+
const runOnSurface = async (surface: ScenarioSurface) => {
|
|
730
|
+
const wire: PikkuWire = {
|
|
731
|
+
workflow: workflowWire,
|
|
732
|
+
scenario: workflowWire,
|
|
733
|
+
rpc: rpcService?.wire?.rpc,
|
|
734
|
+
session: rpcService?.wire?.session,
|
|
735
|
+
pikkuUserId: workflowWire.pikkuUserId,
|
|
736
|
+
actors: this.runActors.get(runId),
|
|
737
|
+
scenarioStep: {
|
|
738
|
+
name: resolvedStepFunc,
|
|
739
|
+
stepName,
|
|
740
|
+
runId,
|
|
741
|
+
phase,
|
|
742
|
+
surface,
|
|
743
|
+
actor,
|
|
744
|
+
env: this.scenarioEnvironment,
|
|
745
|
+
},
|
|
746
|
+
}
|
|
747
|
+
if (surface === 'browser') {
|
|
748
|
+
if (!this.scenarioBrowserProvider) {
|
|
749
|
+
throw new ScenarioBrowserUnavailable(resolvedStepFunc)
|
|
750
|
+
}
|
|
751
|
+
if (!actor) {
|
|
752
|
+
throw new ScenarioBrowserActorRequired(resolvedStepFunc)
|
|
753
|
+
}
|
|
754
|
+
wire.browser = await this.scenarioBrowserProvider.sessionFor(
|
|
755
|
+
actor.name
|
|
626
756
|
)
|
|
627
757
|
}
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
758
|
+
return await runPikkuFunc(
|
|
759
|
+
'workflow',
|
|
760
|
+
workflowName,
|
|
761
|
+
resolvedStepFunc,
|
|
762
|
+
{
|
|
763
|
+
singletonServices: getSingletonServices()!,
|
|
764
|
+
createWireServices: getCreateWireServices(),
|
|
765
|
+
data: () => data,
|
|
766
|
+
wire,
|
|
767
|
+
packageName: packageName ?? undefined,
|
|
768
|
+
}
|
|
769
|
+
)
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
if (resolution.kind === 'action') {
|
|
773
|
+
if (resolution.fellBack && !declared.includes('default')) {
|
|
774
|
+
throw new ScenarioNoSurfaceBinding(
|
|
775
|
+
resolvedStepFunc,
|
|
776
|
+
declared,
|
|
777
|
+
this.runSurface
|
|
632
778
|
)
|
|
633
779
|
}
|
|
634
|
-
|
|
635
|
-
|
|
780
|
+
return await runOnSurface(resolution.surface)
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
if (resolution.surfaces.length === 0) {
|
|
784
|
+
throw new ScenarioNoWitness(
|
|
785
|
+
resolvedStepFunc,
|
|
786
|
+
declared,
|
|
787
|
+
this.runSurface
|
|
636
788
|
)
|
|
637
789
|
}
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
790
|
+
|
|
791
|
+
// A `then` runs every witness it has and they must agree. The surface
|
|
792
|
+
// witness runs first so that when the page is the thing that is wrong,
|
|
793
|
+
// it is the failure that surfaces.
|
|
794
|
+
let first: { surface: ScenarioSurface; observed: unknown } | undefined
|
|
795
|
+
for (const surface of resolution.surfaces) {
|
|
796
|
+
const observed = await runOnSurface(surface)
|
|
797
|
+
if (!first) {
|
|
798
|
+
first = { surface, observed }
|
|
799
|
+
continue
|
|
800
|
+
}
|
|
801
|
+
if (!witnessesAgree(first.observed, observed)) {
|
|
802
|
+
throw new ScenarioWitnessDisagreement(resolvedStepFunc, first, {
|
|
803
|
+
surface,
|
|
804
|
+
observed,
|
|
805
|
+
})
|
|
806
|
+
}
|
|
807
|
+
// Keep whichever witness actually reported a value, so a step pairing
|
|
808
|
+
// a returning witness with a throwing one still records an output.
|
|
809
|
+
if (first.observed === undefined) {
|
|
810
|
+
first = { surface, observed }
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
return first?.observed
|
|
645
814
|
},
|
|
646
815
|
{
|
|
647
816
|
description,
|
|
@@ -673,10 +842,15 @@ export class PikkuScenarioService implements WorkflowRunExtension {
|
|
|
673
842
|
return this.scenarioStepConfig(packageName, stepFunc)?.description
|
|
674
843
|
}
|
|
675
844
|
|
|
676
|
-
|
|
845
|
+
/**
|
|
846
|
+
* Which surfaces a step declares a binding for. A step that declares none is
|
|
847
|
+
* treated as server-side only, which is what an ordinary function is.
|
|
848
|
+
*/
|
|
849
|
+
private declaredSurfaces(
|
|
677
850
|
packageName: string | null,
|
|
678
851
|
stepFunc: string
|
|
679
|
-
):
|
|
680
|
-
|
|
852
|
+
): ScenarioSurface[] {
|
|
853
|
+
const surfaces = this.scenarioStepConfig(packageName, stepFunc)?.surfaces
|
|
854
|
+
return surfaces?.length ? surfaces : ['default']
|
|
681
855
|
}
|
|
682
856
|
}
|
|
@@ -30,9 +30,6 @@ describe('pikku-workflow-service worker registration', () => {
|
|
|
30
30
|
})
|
|
31
31
|
|
|
32
32
|
describe('pikku-workflow-service per-workflow queue warning', () => {
|
|
33
|
-
// Losing the per-workflow orchestrator queues is silent — dispatch just falls
|
|
34
|
-
// back to the single shared queue and one slow step starves every workflow
|
|
35
|
-
// behind it. These assert the misconfiguration is announced at wiring time.
|
|
36
33
|
const setup = (workflowNames: string[], perWorkflowQueues: string[] = []) => {
|
|
37
34
|
resetPikkuState()
|
|
38
35
|
const warnings: string[] = []
|
|
@@ -106,7 +103,6 @@ describe('pikku-workflow-service run-level inline', () => {
|
|
|
106
103
|
const workflowName = 'testRunInlineNoQueue'
|
|
107
104
|
const graphHash = 'run-inline-no-queue-hash'
|
|
108
105
|
|
|
109
|
-
// No queueService configured at all → the run executes inline.
|
|
110
106
|
pikkuState(null, 'package', 'singletonServices', {
|
|
111
107
|
logger: {
|
|
112
108
|
error: () => {},
|
|
@@ -139,7 +135,6 @@ describe('pikku-workflow-service run-level inline', () => {
|
|
|
139
135
|
|
|
140
136
|
const { runId } = await ws.startWorkflow(workflowName, {}, {}, {})
|
|
141
137
|
|
|
142
|
-
// With no queue service the run is created as inline.
|
|
143
138
|
const run = await ws.getRun(runId)
|
|
144
139
|
assert.equal(run?.inline, true, 'run should be marked as inline')
|
|
145
140
|
|
|
@@ -168,7 +163,6 @@ describe('pikku-workflow-service run-level inline', () => {
|
|
|
168
163
|
pikkuFuncId: workflowName,
|
|
169
164
|
source: 'dsl',
|
|
170
165
|
graphHash,
|
|
171
|
-
// no inline flag
|
|
172
166
|
}
|
|
173
167
|
|
|
174
168
|
const functionMetaState = pikkuState(null, 'function', 'meta')
|
|
@@ -186,7 +180,6 @@ describe('pikku-workflow-service run-level inline', () => {
|
|
|
186
180
|
|
|
187
181
|
await ws.startWorkflow(workflowName, {}, {})
|
|
188
182
|
|
|
189
|
-
// Wait a tick
|
|
190
183
|
await new Promise((r) => setTimeout(r, 50))
|
|
191
184
|
|
|
192
185
|
assert.equal(queued, true, 'workflow should have been queued')
|
|
@@ -198,9 +191,6 @@ describe('pikku-workflow-service run-level inline', () => {
|
|
|
198
191
|
})
|
|
199
192
|
|
|
200
193
|
describe('pikku-workflow-service per-function step dispatch', () => {
|
|
201
|
-
// Expose the protected dispatchStep so we can assert the dispatch decision
|
|
202
|
-
// in isolation: a step queues only when its function opts out of inline
|
|
203
|
-
// execution (workflowQueued: true).
|
|
204
194
|
class TestWorkflowService extends InMemoryWorkflowService {
|
|
205
195
|
public callDispatchStep(rpcName: string) {
|
|
206
196
|
return this.dispatchStep('run-1', 'step-1', rpcName, {})
|
|
@@ -263,7 +253,6 @@ describe('pikku-workflow-service per-function step dispatch', () => {
|
|
|
263
253
|
const ws = new TestWorkflowService()
|
|
264
254
|
pikkuState(null, 'package', 'singletonServices', {
|
|
265
255
|
logger: { error() {}, info() {}, warn() {}, debug() {} },
|
|
266
|
-
// no queueService
|
|
267
256
|
} as any)
|
|
268
257
|
|
|
269
258
|
setupFunction('queuedStepNoQueue', true)
|
|
@@ -504,7 +493,6 @@ describe('pikku-workflow-service suspend', () => {
|
|
|
504
493
|
type: 'test',
|
|
505
494
|
})
|
|
506
495
|
|
|
507
|
-
// First suspend: 'await_build' pauses the run.
|
|
508
496
|
await assert.rejects(
|
|
509
497
|
ws.runWorkflowJob(runId, {}),
|
|
510
498
|
(error: unknown) => error instanceof WorkflowSuspendedException
|
|
@@ -513,8 +501,6 @@ describe('pikku-workflow-service suspend', () => {
|
|
|
513
501
|
assert.equal(run?.status, 'suspended')
|
|
514
502
|
assert.equal(run?.error?.message, 'Building')
|
|
515
503
|
|
|
516
|
-
// Resuming must hit the SECOND suspend ('awaiting_approval'), not fall
|
|
517
|
-
// through it — this is what the shared-step-name bug broke.
|
|
518
504
|
await ws.resumeWorkflow(runId)
|
|
519
505
|
await assert.rejects(
|
|
520
506
|
ws.runWorkflowJob(runId, {}),
|
|
@@ -524,7 +510,6 @@ describe('pikku-workflow-service suspend', () => {
|
|
|
524
510
|
assert.equal(run?.status, 'suspended')
|
|
525
511
|
assert.equal(run?.error?.message, 'Awaiting approval')
|
|
526
512
|
|
|
527
|
-
// Resuming again completes the workflow.
|
|
528
513
|
await ws.resumeWorkflow(runId)
|
|
529
514
|
await ws.runWorkflowJob(runId, {})
|
|
530
515
|
run = await ws.getRun(runId)
|
|
@@ -537,11 +522,6 @@ describe('pikku-workflow-service suspend', () => {
|
|
|
537
522
|
})
|
|
538
523
|
})
|
|
539
524
|
|
|
540
|
-
/**
|
|
541
|
-
* A minimal StandardSchemaV1 — the same interface zod/valibot/arktype expose via
|
|
542
|
-
* `~standard`. Hand-rolled here because @pikku/core deliberately has no zod
|
|
543
|
-
* dependency: schemas reach it through the standard-schema spec only.
|
|
544
|
-
*/
|
|
545
525
|
const approvalDecisionSchema: StandardSchemaV1<
|
|
546
526
|
{ approved: boolean; comment?: string },
|
|
547
527
|
{ approved: boolean; comment?: string }
|
|
@@ -638,8 +618,6 @@ describe('pikku-workflow-service approval', () => {
|
|
|
638
618
|
)
|
|
639
619
|
assert.equal((await ws.getRun(runId))?.status, 'suspended')
|
|
640
620
|
|
|
641
|
-
// THE point of an approval vs a suspend: a bare resume with no decision
|
|
642
|
-
// recorded must re-suspend, not walk past the gate.
|
|
643
621
|
await ws.resumeWorkflow(runId)
|
|
644
622
|
await assert.rejects(
|
|
645
623
|
ws.runWorkflowJob(runId, {}),
|
|
@@ -717,19 +695,14 @@ describe('pikku-workflow-service approval', () => {
|
|
|
717
695
|
(error: unknown) => error instanceof WorkflowSuspendedException
|
|
718
696
|
)
|
|
719
697
|
|
|
720
|
-
// The resume payload crosses an HTTP boundary from an untrusted caller.
|
|
721
|
-
// approveStep only records it; validation happens on replay, inside the
|
|
722
|
-
// workflow body, which is the only place the schema value is in scope.
|
|
723
698
|
await ws.approveStep(runId, 'Approve invoice', { approved: 'yes-please' })
|
|
724
699
|
|
|
725
|
-
// An invalid decision must leave the gate closed rather than fail the run.
|
|
726
700
|
await assert.rejects(
|
|
727
701
|
ws.runWorkflowJob(runId, {}),
|
|
728
702
|
(error: unknown) => error instanceof WorkflowSuspendedException
|
|
729
703
|
)
|
|
730
704
|
assert.equal((await ws.getRun(runId))?.status, 'suspended')
|
|
731
705
|
|
|
732
|
-
// ...and the rejection is legible to whoever tries to approve next.
|
|
733
706
|
const state = await ws.getRunState(runId)
|
|
734
707
|
assert.match(
|
|
735
708
|
JSON.stringify(state),
|
|
@@ -737,7 +710,6 @@ describe('pikku-workflow-service approval', () => {
|
|
|
737
710
|
'expected the validation failure to be recorded in run state'
|
|
738
711
|
)
|
|
739
712
|
|
|
740
|
-
// A subsequent valid decision still lands.
|
|
741
713
|
await ws.approveStep(runId, 'Approve invoice', { approved: false })
|
|
742
714
|
await ws.runWorkflowJob(runId, {})
|
|
743
715
|
const run = await ws.getRun(runId)
|
|
@@ -811,14 +783,11 @@ describe('pikku-workflow-service approval', () => {
|
|
|
811
783
|
(error: unknown) => error instanceof WorkflowSuspendedException
|
|
812
784
|
)
|
|
813
785
|
|
|
814
|
-
// Let the gate expire and resolve.
|
|
815
786
|
await new Promise((resolve) => setTimeout(resolve, 25))
|
|
816
787
|
await ws.resumeWorkflow(runId)
|
|
817
788
|
await ws.runWorkflowJob(runId, {})
|
|
818
789
|
assert.equal((await ws.getRun(runId))?.status, 'completed')
|
|
819
790
|
|
|
820
|
-
// The gate caches its outcome and never re-reads state, so accepting this
|
|
821
|
-
// would discard it silently. The approver must be told it did not land.
|
|
822
791
|
await assert.rejects(
|
|
823
792
|
ws.approveStep(runId, 'Approve invoice', { approved: true }),
|
|
824
793
|
(error: unknown) =>
|
|
@@ -826,7 +795,6 @@ describe('pikku-workflow-service approval', () => {
|
|
|
826
795
|
error.payload.outcome === 'expired'
|
|
827
796
|
)
|
|
828
797
|
|
|
829
|
-
// The resolved outcome stands.
|
|
830
798
|
const run = await ws.getRun(runId)
|
|
831
799
|
assert.deepEqual(run?.output, { decision: { status: 'expired' } })
|
|
832
800
|
|
|
@@ -860,8 +828,6 @@ describe('pikku-workflow-service approval', () => {
|
|
|
860
828
|
|
|
861
829
|
await ws.approveStep(runId, 'Approve invoice', { approved: true })
|
|
862
830
|
|
|
863
|
-
// Expiry fires unconditionally (an enqueued durable timer can't be
|
|
864
|
-
// retracted), so it must no-op once a decision has landed.
|
|
865
831
|
await new Promise((resolve) => setTimeout(resolve, 25))
|
|
866
832
|
await ws.resumeWorkflow(runId)
|
|
867
833
|
await ws.runWorkflowJob(runId, {})
|
|
@@ -877,11 +843,6 @@ describe('pikku-workflow-service approval', () => {
|
|
|
877
843
|
})
|
|
878
844
|
|
|
879
845
|
describe('pikku-workflow-service run identity on failure', () => {
|
|
880
|
-
// A failing inline run throws before startWorkflow can return `{ runId }`,
|
|
881
|
-
// so a caller that wants to read the run back — its steps, which one failed,
|
|
882
|
-
// what it was called with — has nothing to read it by. `onRunCreated` fires
|
|
883
|
-
// as soon as the run exists, which is the only moment guaranteed to happen
|
|
884
|
-
// whether the run goes on to pass, fail, or suspend.
|
|
885
846
|
const runFailing = async (name: string) => {
|
|
886
847
|
resetPikkuState()
|
|
887
848
|
const ws = new InMemoryWorkflowService()
|