@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
|
@@ -12,7 +12,6 @@ type HistoryEntry = StepState & { stepName: string }
|
|
|
12
12
|
|
|
13
13
|
const T = (ms: number) => new Date(1_700_000_000_000 + ms)
|
|
14
14
|
|
|
15
|
-
/** A succeeded step attempt with the standard lifecycle timestamps. */
|
|
16
15
|
const ok = (
|
|
17
16
|
stepName: string,
|
|
18
17
|
base: number,
|
|
@@ -56,25 +55,19 @@ describe('buildRunTimeline', () => {
|
|
|
56
55
|
tl.map((e) => e.type),
|
|
57
56
|
['pending', 'running', 'succeeded']
|
|
58
57
|
)
|
|
59
|
-
// seq is monotonic from 0
|
|
60
58
|
assert.deepEqual(
|
|
61
59
|
tl.map((e) => e.seq),
|
|
62
60
|
[0, 1, 2]
|
|
63
61
|
)
|
|
64
|
-
// result rides only on the succeeded event
|
|
65
62
|
assert.deepEqual(tl[2]!.result, { n: 1 })
|
|
66
63
|
assert.equal(tl[0]!.result, undefined)
|
|
67
64
|
})
|
|
68
65
|
|
|
69
66
|
test('orders across steps by timestamp, lifecycle, then history index', () => {
|
|
70
|
-
// two steps; b created at the same instant begin succeeds
|
|
71
67
|
const tl = buildRunTimeline([
|
|
72
68
|
ok('begin', 0, { result: 1 }),
|
|
73
69
|
ok('next', 2, { from: 'begin', result: 2 }),
|
|
74
70
|
])
|
|
75
|
-
// begin.pending(0) begin.running(1) begin.succeeded(2)==next.pending(2)
|
|
76
|
-
// → succeeded sorts before pending at the same instant (lifecycle 3 vs 0)?
|
|
77
|
-
// No: pending=0 < succeeded=3, so next.pending precedes begin.succeeded.
|
|
78
71
|
const at2 = tl.filter((e) => e.at.getTime() === T(2).getTime())
|
|
79
72
|
assert.deepEqual(
|
|
80
73
|
at2.map((e) => `${e.stepName}:${e.type}`),
|
|
@@ -93,8 +86,6 @@ describe('buildRunTimeline', () => {
|
|
|
93
86
|
})
|
|
94
87
|
|
|
95
88
|
test('terminal event is driven by status, not lifecycle timestamps', () => {
|
|
96
|
-
// Kysely leaves succeededAt/runningAt null but the row's status + result
|
|
97
|
-
// are authoritative — the terminal event must still fire (off updatedAt).
|
|
98
89
|
const noStamps = {
|
|
99
90
|
stepId: 's-1',
|
|
100
91
|
stepName: 'begin',
|
|
@@ -110,14 +101,17 @@ describe('buildRunTimeline', () => {
|
|
|
110
101
|
['pending', 'succeeded']
|
|
111
102
|
)
|
|
112
103
|
const succeeded = tl.find((e) => e.type === 'succeeded')!
|
|
113
|
-
assert.equal(
|
|
104
|
+
assert.equal(
|
|
105
|
+
succeeded.at.getTime(),
|
|
106
|
+
T(5).getTime(),
|
|
107
|
+
'falls back to updatedAt'
|
|
108
|
+
)
|
|
114
109
|
assert.deepEqual(succeeded.result, { ok: 1 })
|
|
115
110
|
assert.deepEqual(reconstructFinalState(tl).results, { begin: { ok: 1 } })
|
|
116
111
|
})
|
|
117
112
|
})
|
|
118
113
|
|
|
119
114
|
describe('reconstructStateAt', () => {
|
|
120
|
-
// begin → next → finish, each succeeding in order
|
|
121
115
|
const history: HistoryEntry[] = [
|
|
122
116
|
ok('begin', 0, { result: { step: 'begin' } }),
|
|
123
117
|
ok('next', 10, { from: 'begin', result: { step: 'next' } }),
|
|
@@ -134,30 +128,25 @@ describe('reconstructStateAt', () => {
|
|
|
134
128
|
})
|
|
135
129
|
|
|
136
130
|
test('mid-run by seq: only steps up to that event exist', () => {
|
|
137
|
-
// fold through begin.succeeded (seq 2)
|
|
138
131
|
const s = reconstructStateAt(tl, 2)
|
|
139
132
|
assert.deepEqual(s.path, ['begin'])
|
|
140
133
|
assert.equal(s.steps[0]!.status, 'succeeded')
|
|
141
134
|
assert.deepEqual(s.results, { begin: { step: 'begin' } })
|
|
142
|
-
// next hasn't been created yet at this point
|
|
143
135
|
assert.equal(s.phase, 'idle')
|
|
144
136
|
})
|
|
145
137
|
|
|
146
138
|
test('mid-run captures an in-flight step as running', () => {
|
|
147
|
-
// begin done (0,1,2), next created+running (3,4) but not yet succeeded
|
|
148
139
|
const s = reconstructStateAt(tl, 4)
|
|
149
140
|
assert.deepEqual(s.path, ['begin', 'next'])
|
|
150
141
|
assert.equal(s.steps[1]!.stepName, 'next')
|
|
151
142
|
assert.equal(s.steps[1]!.status, 'running')
|
|
152
143
|
assert.equal(s.steps[1]!.fromStepName, 'begin')
|
|
153
144
|
assert.equal(s.phase, 'running')
|
|
154
|
-
// next's result not yet available in the replay cache
|
|
155
145
|
assert.deepEqual(s.results, { begin: { step: 'begin' } })
|
|
156
146
|
})
|
|
157
147
|
|
|
158
148
|
test('time-travel by Date folds every event at or before the instant', () => {
|
|
159
149
|
const s = reconstructStateAt(tl, T(12))
|
|
160
|
-
// begin fully done (<=2), next created(10)+running(11) but succeeded at 12
|
|
161
150
|
assert.deepEqual(s.path, ['begin', 'next'])
|
|
162
151
|
assert.equal(s.steps[1]!.status, 'succeeded')
|
|
163
152
|
assert.deepEqual(s.results, {
|
|
@@ -179,7 +168,6 @@ describe('reconstructStateAt', () => {
|
|
|
179
168
|
})
|
|
180
169
|
|
|
181
170
|
describe('reconstructStateAt — retries', () => {
|
|
182
|
-
// attempt 1 fails, attempt 2 (created later) succeeds
|
|
183
171
|
const history: HistoryEntry[] = [
|
|
184
172
|
failed('flaky', 0, { message: 'first try' }),
|
|
185
173
|
ok('flaky', 10, { result: { ok: true }, attempt: 2 }),
|
|
@@ -187,7 +175,7 @@ describe('reconstructStateAt — retries', () => {
|
|
|
187
175
|
const tl = buildRunTimeline(history)
|
|
188
176
|
|
|
189
177
|
test('between attempts the step is failed', () => {
|
|
190
|
-
const s = reconstructStateAt(tl, T(2))
|
|
178
|
+
const s = reconstructStateAt(tl, T(2))
|
|
191
179
|
assert.equal(s.steps[0]!.status, 'failed')
|
|
192
180
|
assert.equal(s.steps[0]!.error?.message, 'first try')
|
|
193
181
|
assert.equal(s.phase, 'failed')
|
|
@@ -195,7 +183,7 @@ describe('reconstructStateAt — retries', () => {
|
|
|
195
183
|
})
|
|
196
184
|
|
|
197
185
|
test("the retry's created event reopens the step and clears the error", () => {
|
|
198
|
-
const s = reconstructStateAt(tl, T(10))
|
|
186
|
+
const s = reconstructStateAt(tl, T(10))
|
|
199
187
|
assert.equal(s.steps[0]!.status, 'pending')
|
|
200
188
|
assert.equal(s.steps[0]!.error, undefined)
|
|
201
189
|
assert.equal(s.steps[0]!.attemptCount, 2)
|
|
@@ -1,41 +1,17 @@
|
|
|
1
1
|
import type { SerializedError } from '../../types/core.types.js'
|
|
2
2
|
import type { StepState, StepStatus } from './workflow.types.js'
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Time-travel over a workflow run.
|
|
6
|
-
*
|
|
7
|
-
* A run's durable history (`getRunHistory`) is one row per step *attempt*, each
|
|
8
|
-
* carrying lifecycle timestamps (created/scheduled/running/succeeded/failed).
|
|
9
|
-
* `buildRunTimeline` explodes those rows into a flat, chronologically-ordered
|
|
10
|
-
* event stream, and `reconstructStateAt` folds the stream up to any point to
|
|
11
|
-
* recover what the run "knew" then — the same step cache a replay would hold:
|
|
12
|
-
* per-step status, accumulated results, and the walked path.
|
|
13
|
-
*
|
|
14
|
-
* These are pure functions over history — no IO — so they're trivially testable
|
|
15
|
-
* and transport-independent (the same fold works for Redis/Kysely/in-memory).
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
/** A single observable transition of one step attempt. */
|
|
19
4
|
export interface RunTimelineEvent {
|
|
20
|
-
/** Monotonic 0-based position in the timeline. */
|
|
21
5
|
seq: number
|
|
22
|
-
/** When it happened. */
|
|
23
6
|
at: Date
|
|
24
|
-
/** The step's new status at this event (matches StepStatus lifecycle). */
|
|
25
7
|
type: Extract<
|
|
26
8
|
StepStatus,
|
|
27
9
|
'pending' | 'scheduled' | 'running' | 'succeeded' | 'failed'
|
|
28
10
|
>
|
|
29
|
-
/** Physical step name (includes revisit ordinal, e.g. `attempt#2`). */
|
|
30
11
|
stepName: string
|
|
31
|
-
/** Which attempt this event belongs to (1-based). */
|
|
32
12
|
attemptCount: number
|
|
33
|
-
/** Predecessor that scheduled this step — only on the `pending` (created)
|
|
34
|
-
* event; undefined for entry steps. Reconstructs the walked edge. */
|
|
35
13
|
fromStepName?: string
|
|
36
|
-
/** Result snapshot — only on `succeeded`. */
|
|
37
14
|
result?: unknown
|
|
38
|
-
/** Error snapshot — only on `failed`. */
|
|
39
15
|
error?: SerializedError
|
|
40
16
|
}
|
|
41
17
|
|
|
@@ -43,7 +19,6 @@ export type RunTimeline = RunTimelineEvent[]
|
|
|
43
19
|
|
|
44
20
|
type HistoryEntry = StepState & { stepName: string }
|
|
45
21
|
|
|
46
|
-
/** Lifecycle tiebreak for events that share a timestamp. */
|
|
47
22
|
const LIFECYCLE_ORDER: Record<RunTimelineEvent['type'], number> = {
|
|
48
23
|
pending: 0,
|
|
49
24
|
scheduled: 1,
|
|
@@ -52,12 +27,6 @@ const LIFECYCLE_ORDER: Record<RunTimelineEvent['type'], number> = {
|
|
|
52
27
|
failed: 3,
|
|
53
28
|
}
|
|
54
29
|
|
|
55
|
-
/**
|
|
56
|
-
* Build the ordered event stream for a run from its raw history.
|
|
57
|
-
*
|
|
58
|
-
* History is expected oldest-first but is sorted defensively by (timestamp,
|
|
59
|
-
* lifecycle, original index) so simultaneous timestamps stay deterministic.
|
|
60
|
-
*/
|
|
61
30
|
export function buildRunTimeline(history: HistoryEntry[]): RunTimeline {
|
|
62
31
|
const raw: Array<Omit<RunTimelineEvent, 'seq'> & { order: number }> = []
|
|
63
32
|
|
|
@@ -67,24 +36,18 @@ export function buildRunTimeline(history: HistoryEntry[]): RunTimeline {
|
|
|
67
36
|
attemptCount: entry.attemptCount,
|
|
68
37
|
order,
|
|
69
38
|
}
|
|
70
|
-
// The created event always exists; it carries provenance.
|
|
71
39
|
raw.push({
|
|
72
40
|
...base,
|
|
73
41
|
at: entry.createdAt,
|
|
74
42
|
type: 'pending',
|
|
75
43
|
fromStepName: entry.fromStepName,
|
|
76
44
|
})
|
|
77
|
-
// Intermediate events are optional enrichment — emit only if the backend
|
|
78
|
-
// recorded their timestamp.
|
|
79
45
|
if (entry.scheduledAt) {
|
|
80
46
|
raw.push({ ...base, at: entry.scheduledAt, type: 'scheduled' })
|
|
81
47
|
}
|
|
82
48
|
if (entry.runningAt) {
|
|
83
49
|
raw.push({ ...base, at: entry.runningAt, type: 'running' })
|
|
84
50
|
}
|
|
85
|
-
// The terminal event is driven by the row's authoritative status (the
|
|
86
|
-
// lifecycle timestamps aren't populated by every backend — Kysely leaves
|
|
87
|
-
// them null), falling back to updatedAt when the specific stamp is absent.
|
|
88
51
|
if (entry.status === 'succeeded') {
|
|
89
52
|
raw.push({
|
|
90
53
|
...base,
|
|
@@ -115,7 +78,6 @@ export function buildRunTimeline(history: HistoryEntry[]): RunTimeline {
|
|
|
115
78
|
return raw.map(({ order: _order, ...event }, seq) => ({ ...event, seq }))
|
|
116
79
|
}
|
|
117
80
|
|
|
118
|
-
/** A step's reconstructed state at a point in the timeline. */
|
|
119
81
|
export interface ReconstructedStep {
|
|
120
82
|
stepName: string
|
|
121
83
|
status: StepStatus
|
|
@@ -125,24 +87,15 @@ export interface ReconstructedStep {
|
|
|
125
87
|
error?: SerializedError
|
|
126
88
|
}
|
|
127
89
|
|
|
128
|
-
/** Coarse run phase derived purely from step states (not the run's output). */
|
|
129
90
|
export type RunPhase = 'pending' | 'running' | 'failed' | 'idle'
|
|
130
91
|
|
|
131
|
-
/** The whole run's reconstructed state at a point in the timeline. */
|
|
132
92
|
export interface ReconstructedRunState {
|
|
133
93
|
/** seq of the last applied event, or -1 if the point precedes all events. */
|
|
134
94
|
seq: number
|
|
135
|
-
/** Wall-clock time of the last applied event. */
|
|
136
95
|
at?: Date
|
|
137
|
-
/** Per-step latest state, in first-seen (walked) order. */
|
|
138
96
|
steps: ReconstructedStep[]
|
|
139
|
-
/** Outputs available to downstream steps — the replay step cache at this
|
|
140
|
-
* point (succeeded steps only). */
|
|
141
97
|
results: Record<string, unknown>
|
|
142
|
-
/** Step names in the order they were first created — the walked path. */
|
|
143
98
|
path: string[]
|
|
144
|
-
/** Derived phase: `running` if any step is in-flight, else `failed` if a step
|
|
145
|
-
* is failed with no in-flight work, else `idle` (between transitions). */
|
|
146
99
|
phase: RunPhase
|
|
147
100
|
}
|
|
148
101
|
|
|
@@ -152,13 +105,6 @@ const IN_FLIGHT: ReadonlySet<StepStatus> = new Set([
|
|
|
152
105
|
'running',
|
|
153
106
|
])
|
|
154
107
|
|
|
155
|
-
/**
|
|
156
|
-
* Fold the timeline up to `at` and return the run's state at that point.
|
|
157
|
-
*
|
|
158
|
-
* `at` is either a seq index (inclusive — apply events `0..at`) or a `Date`
|
|
159
|
-
* (inclusive — apply every event at or before that instant). A point before the
|
|
160
|
-
* first event yields the empty initial state.
|
|
161
|
-
*/
|
|
162
108
|
export function reconstructStateAt(
|
|
163
109
|
timeline: RunTimeline,
|
|
164
110
|
at: number | Date
|
|
@@ -194,7 +140,6 @@ export function reconstructStateAt(
|
|
|
194
140
|
if (event.fromStepName !== undefined) {
|
|
195
141
|
step.fromStepName = event.fromStepName
|
|
196
142
|
}
|
|
197
|
-
// A retry's created event reopens the step — drop the prior outcome.
|
|
198
143
|
if (event.type === 'pending') {
|
|
199
144
|
delete step.result
|
|
200
145
|
delete step.error
|
|
@@ -226,7 +171,6 @@ export function reconstructStateAt(
|
|
|
226
171
|
}
|
|
227
172
|
}
|
|
228
173
|
|
|
229
|
-
/** Reconstruct the final state (fold the whole timeline). */
|
|
230
174
|
export function reconstructFinalState(
|
|
231
175
|
timeline: RunTimeline
|
|
232
176
|
): ReconstructedRunState {
|
|
@@ -4,7 +4,6 @@ import { createServer, type Server } from 'node:http'
|
|
|
4
4
|
|
|
5
5
|
import { createCookieJar } from './scenario-cookie-jar.js'
|
|
6
6
|
|
|
7
|
-
// Minimal target: hands out cookies, and reports back what it was sent.
|
|
8
7
|
const startTarget = async () => {
|
|
9
8
|
let issued = 0
|
|
10
9
|
const server: Server = createServer((req, res) => {
|
|
@@ -1,32 +1,9 @@
|
|
|
1
|
-
/** A session held the way a browser holds one, for code driving a real target. */
|
|
2
1
|
export interface ScenarioCookieJar {
|
|
3
|
-
/** `fetch`, but it sends what the target has set and keeps what it sets. */
|
|
4
2
|
fetch: typeof fetch
|
|
5
|
-
/** Forgets the session — what an actor does before signing in again. */
|
|
6
3
|
clear(): void
|
|
7
|
-
/**
|
|
8
|
-
* Whether the target has set anything yet. This is a fact about the jar, not
|
|
9
|
-
* about the session: a target that sets a CSRF or locale cookie before anyone
|
|
10
|
-
* signs in fills the jar without establishing one. Whoever needs to know
|
|
11
|
-
* whether a sign-in happened has to track the sign-in.
|
|
12
|
-
*/
|
|
13
4
|
readonly empty: boolean
|
|
14
5
|
}
|
|
15
6
|
|
|
16
|
-
/**
|
|
17
|
-
* A `fetch` that remembers cookies.
|
|
18
|
-
*
|
|
19
|
-
* A browser persists the session cookie on its own; anything driving a target
|
|
20
|
-
* from this process has to. Every response is read, not just the sign-in, so a
|
|
21
|
-
* cookie the target rotates mid-session is followed rather than dropped.
|
|
22
|
-
*
|
|
23
|
-
* The jar is a closure local, so two jars never share a session — which is what
|
|
24
|
-
* lets one scenario sign in as several people without one of them inheriting
|
|
25
|
-
* the other's session.
|
|
26
|
-
*
|
|
27
|
-
* It also stamps `Origin`, because Better Auth rejects a state-changing POST
|
|
28
|
-
* whose Origin does not match its baseURL.
|
|
29
|
-
*/
|
|
30
7
|
export const createCookieJar = (apiUrl: string): ScenarioCookieJar => {
|
|
31
8
|
const jar = new Map<string, string>()
|
|
32
9
|
const origin = new URL(apiUrl).origin
|
|
@@ -46,8 +23,6 @@ export const createCookieJar = (apiUrl: string): ScenarioCookieJar => {
|
|
|
46
23
|
if (separator > 0) {
|
|
47
24
|
const name = pair!.slice(0, separator)
|
|
48
25
|
const value = pair!.slice(separator + 1)
|
|
49
|
-
// An empty value is how a target deletes a cookie — drop the name
|
|
50
|
-
// rather than holding a cookie whose value says it is gone.
|
|
51
26
|
if (value) {
|
|
52
27
|
jar.set(name, value)
|
|
53
28
|
} else {
|
|
@@ -4,14 +4,14 @@ import assert from 'node:assert/strict'
|
|
|
4
4
|
import { createScenarioRunner } from './pikku-scenario-service.js'
|
|
5
5
|
import type { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js'
|
|
6
6
|
import { pikkuState, resetPikkuState } from '../../pikku-state.js'
|
|
7
|
-
import type {
|
|
7
|
+
import type { ScenarioPersona } from '../../services/personas-service.js'
|
|
8
8
|
|
|
9
9
|
const noopLogger = { error() {}, info() {}, warn() {}, debug() {} }
|
|
10
10
|
|
|
11
11
|
const fakeActor = (
|
|
12
12
|
name: string,
|
|
13
13
|
handler: (rpcName: string, data: unknown) => Promise<unknown>
|
|
14
|
-
):
|
|
14
|
+
): ScenarioPersona => ({
|
|
15
15
|
name,
|
|
16
16
|
email: `${name}@actors.local`,
|
|
17
17
|
invoke: async (rpcName: string, data: unknown) => handler(rpcName, data),
|
|
@@ -33,11 +33,6 @@ const setup = async (ws: InMemoryWorkflowService) => {
|
|
|
33
33
|
return runId
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
/**
|
|
37
|
-
* The scenario wire, wrapped rather than returned directly: it carries a
|
|
38
|
-
* `then` — the Gherkin phase, not a promise — so awaiting one is awaiting a
|
|
39
|
-
* thenable, and the runtime calls it as a step.
|
|
40
|
-
*/
|
|
41
36
|
const scenarioWire = async (rpcService: any = {}): Promise<{ wire: any }> => {
|
|
42
37
|
const { workflowService } = createScenarioRunner()
|
|
43
38
|
const ws = workflowService as InMemoryWorkflowService
|
|
@@ -4,7 +4,7 @@ import assert from 'node:assert/strict'
|
|
|
4
4
|
import { createScenarioRunner } from './pikku-scenario-service.js'
|
|
5
5
|
import { pikkuState, resetPikkuState } from '../../pikku-state.js'
|
|
6
6
|
import { addWorkflow } from './dsl/workflow-runner.js'
|
|
7
|
-
import type {
|
|
7
|
+
import type { ScenarioPersonas } from '../../services/personas-service.js'
|
|
8
8
|
|
|
9
9
|
const noopLogger = {
|
|
10
10
|
error() {},
|
|
@@ -20,18 +20,13 @@ const actors = {
|
|
|
20
20
|
invoke: async () => ({}),
|
|
21
21
|
invokeRaw: async () => ({ status: 200, ok: true, body: {} }),
|
|
22
22
|
},
|
|
23
|
-
} as unknown as
|
|
23
|
+
} as unknown as ScenarioPersonas
|
|
24
24
|
|
|
25
25
|
type ScenarioHooks = {
|
|
26
26
|
before?: (services: any, data: any, wire: any) => Promise<void> | void
|
|
27
27
|
after?: (services: any, data: any, wire: any) => Promise<void> | void
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
/**
|
|
31
|
-
* Registers a scenario (or, with `source: 'dsl'`, a plain workflow) and runs it
|
|
32
|
-
* inline, returning the error it threw rather than propagating — every hook
|
|
33
|
-
* assertion here is about what ran, not about how the caller saw it.
|
|
34
|
-
*/
|
|
35
30
|
const runScenario = async (
|
|
36
31
|
name: string,
|
|
37
32
|
config: ScenarioHooks & { func: (...args: any[]) => any },
|
|
@@ -49,8 +49,6 @@ describe('pollUntil', () => {
|
|
|
49
49
|
})
|
|
50
50
|
|
|
51
51
|
test('treats a falsy-but-defined answer as an answer', async () => {
|
|
52
|
-
// `false` is what a "did it happen?" probe returns, and it is a result —
|
|
53
|
-
// only `undefined` means "not yet".
|
|
54
52
|
let attempts = 0
|
|
55
53
|
const found = await pollUntil(
|
|
56
54
|
() => {
|
|
@@ -1,23 +1,8 @@
|
|
|
1
|
-
/** How long to keep trying, and how long to wait between tries. */
|
|
2
1
|
export interface PollOptions {
|
|
3
|
-
/** Total time to keep attempting before giving up. Default 15s. */
|
|
4
2
|
timeoutMs?: number
|
|
5
|
-
/** Gap between attempts. Default 250ms. */
|
|
6
3
|
intervalMs?: number
|
|
7
4
|
}
|
|
8
5
|
|
|
9
|
-
/**
|
|
10
|
-
* Attempt something until it answers, or the deadline passes.
|
|
11
|
-
*
|
|
12
|
-
* `undefined` means "not yet" and nothing else — `false`, `0` and `''` are all
|
|
13
|
-
* answers, because a probe asking whether something happened reports `false`
|
|
14
|
-
* when it did not. Answering `undefined` at the deadline rather than throwing
|
|
15
|
-
* leaves the error to the caller, who is the only one who knows what was being
|
|
16
|
-
* waited for.
|
|
17
|
-
*
|
|
18
|
-
* A step that polls its target — a delivery reaching a terminal status, a run
|
|
19
|
-
* finishing — reaches for this rather than writing the deadline loop again.
|
|
20
|
-
*/
|
|
21
6
|
export const pollUntil = async <T>(
|
|
22
7
|
attempt: () => Promise<T | undefined> | T | undefined,
|
|
23
8
|
{ timeoutMs = 15_000, intervalMs = 250 }: PollOptions = {}
|
|
@@ -1,23 +1,5 @@
|
|
|
1
1
|
import type { ScenarioStepPhase } from './scenario-step.types.js'
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Renders the English sentence a reporter shows for a scenario step.
|
|
5
|
-
*
|
|
6
|
-
* This is the inversion of cucumber: rather than parsing English into a call,
|
|
7
|
-
* we render English out of a typed call, so the readable report survives
|
|
8
|
-
* without a regex registry paying for it.
|
|
9
|
-
*
|
|
10
|
-
* Lives in core so the CLI reporter and the console render identically.
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* Fill a step's `template` from the input that step was actually called with,
|
|
14
|
-
* so the reported sentence names the values under test — "sees @pikku/addon-todos"
|
|
15
|
-
* rather than "sees an addon in the gallery" repeated three times.
|
|
16
|
-
*
|
|
17
|
-
* A placeholder with no recorded value renders as nothing and the surrounding
|
|
18
|
-
* whitespace collapses, so an optional input that was omitted reads as a shorter
|
|
19
|
-
* sentence rather than a literal `{state}` leaking into the report.
|
|
20
|
-
*/
|
|
21
3
|
export const renderStepTemplate = (
|
|
22
4
|
template: string,
|
|
23
5
|
input: unknown
|
|
@@ -50,19 +32,9 @@ export const composeStepProse = ({
|
|
|
50
32
|
}: {
|
|
51
33
|
phase: ScenarioStepPhase
|
|
52
34
|
description: string
|
|
53
|
-
/**
|
|
54
|
-
* The prose this step renders, with `{placeholders}` filled from `input`.
|
|
55
|
-
* Unlike `description`, which documents what the step does, this is what a
|
|
56
|
-
* reader of the report sees. Falls back to `description` when absent.
|
|
57
|
-
*/
|
|
58
35
|
template?: string
|
|
59
|
-
/** The input this step was called with, as recorded on the run. */
|
|
60
36
|
input?: unknown
|
|
61
37
|
actor?: string
|
|
62
|
-
/**
|
|
63
|
-
* Pad the keyword to this width so a ladder of steps lines its sentences up
|
|
64
|
-
* under each other. Omit for inline prose.
|
|
65
|
-
*/
|
|
66
38
|
keywordWidth?: number
|
|
67
39
|
}): string => {
|
|
68
40
|
const keyword = phase === 'step' ? '' : capitalise(phase)
|
|
@@ -10,23 +10,16 @@ import { pikkuState, resetPikkuState } from '../../pikku-state.js'
|
|
|
10
10
|
|
|
11
11
|
const noopLogger = { error() {}, info() {}, warn() {}, debug() {} }
|
|
12
12
|
|
|
13
|
-
/**
|
|
14
|
-
* Members that only a scenario run reaches. None of them may live on the class
|
|
15
|
-
* a production app instantiates: a bundler removes unused *modules*, never
|
|
16
|
-
* unused class members, so anything declared here ships in every server built
|
|
17
|
-
* on Pikku whether or not the app has a single scenario.
|
|
18
|
-
*/
|
|
19
13
|
const SCENARIO_MEMBERS = [
|
|
20
14
|
'scenarioStep',
|
|
21
15
|
'runScenarioHook',
|
|
22
|
-
'
|
|
16
|
+
'resolvePersonas',
|
|
23
17
|
'setScenarioBrowserProvider',
|
|
24
18
|
'getScenarioBrowserProvider',
|
|
25
19
|
'setScenarioEnvironment',
|
|
26
20
|
'getScenarioEnvironment',
|
|
27
21
|
]
|
|
28
22
|
|
|
29
|
-
/** Wire members declared by `PikkuScenarioWire` and absent from `PikkuWorkflowWire`. */
|
|
30
23
|
const SCENARIO_WIRE_MEMBERS = [
|
|
31
24
|
'step',
|
|
32
25
|
'given',
|
|
@@ -99,7 +92,7 @@ describe('the production workflow service carries no scenario surface', () => {
|
|
|
99
92
|
'utf8'
|
|
100
93
|
)
|
|
101
94
|
assert.ok(
|
|
102
|
-
!source.includes('http-
|
|
95
|
+
!source.includes('http-personas'),
|
|
103
96
|
'PikkuWorkflowService must not reference the HTTP actor client — it pulls the AI persona loop into every bundle'
|
|
104
97
|
)
|
|
105
98
|
})
|
|
@@ -3,14 +3,6 @@ import type {
|
|
|
3
3
|
ScenarioEnvironment,
|
|
4
4
|
} from './scenario-step.types.js'
|
|
5
5
|
|
|
6
|
-
/**
|
|
7
|
-
* The actor this step was called with, or a loud error naming the step.
|
|
8
|
-
*
|
|
9
|
-
* A step that talks to the target app needs an identity, but `actor` is
|
|
10
|
-
* optional on the wire because a pure assertion step needs none. This is the
|
|
11
|
-
* one place that narrowing happens, so every step file stops writing its own
|
|
12
|
-
* `actorOf(...)` guard.
|
|
13
|
-
*/
|
|
14
6
|
export const requireActor = <TActor>(
|
|
15
7
|
scenarioStep: PikkuScenarioStepWire<TActor> | undefined
|
|
16
8
|
): TActor => {
|
|
@@ -24,11 +16,6 @@ export const requireActor = <TActor>(
|
|
|
24
16
|
return actor
|
|
25
17
|
}
|
|
26
18
|
|
|
27
|
-
/**
|
|
28
|
-
* The environment this run targets, or a loud error naming the step. A run
|
|
29
|
-
* started outside `pikku scenario run` only carries one when the server has
|
|
30
|
-
* `API_URL` configured.
|
|
31
|
-
*/
|
|
32
19
|
export const requireScenarioEnv = (
|
|
33
20
|
scenarioStep: PikkuScenarioStepWire<unknown> | undefined
|
|
34
21
|
): ScenarioEnvironment => {
|
|
@@ -36,7 +23,7 @@ export const requireScenarioEnv = (
|
|
|
36
23
|
if (!env) {
|
|
37
24
|
throw new Error(
|
|
38
25
|
`[scenario] step '${scenarioStep?.name ?? 'unknown'}' needs the target environment, but this run carries none. ` +
|
|
39
|
-
`Run it through 'pikku scenario run <environment>' with
|
|
26
|
+
`Run it through 'pikku scenario run <environment>' with environments.<environment> declared in pikku.config.json.`
|
|
40
27
|
)
|
|
41
28
|
}
|
|
42
29
|
return env
|