@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
|
@@ -1,51 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* static, developer-configured values).
|
|
2
|
+
* Dynamic credentials — OAuth tokens, per-user API keys — that change at
|
|
3
|
+
* runtime, as opposed to `SecretService`'s static developer-configured values.
|
|
4
|
+
* Throughout, an omitted `userId` means the platform-level credential.
|
|
6
5
|
*/
|
|
7
6
|
export interface CredentialService {
|
|
8
|
-
/**
|
|
9
|
-
* Retrieves a credential by name and optional user ID.
|
|
10
|
-
* @param name - The credential name (e.g. 'stripe', 'google-sheets').
|
|
11
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
12
|
-
* @returns The credential value, or null if not found.
|
|
13
|
-
*/
|
|
14
7
|
get<T = unknown>(name: string, userId?: string): Promise<T | null>;
|
|
15
|
-
/**
|
|
16
|
-
* Stores a credential.
|
|
17
|
-
* @param name - The credential name.
|
|
18
|
-
* @param value - The credential value to store.
|
|
19
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
20
|
-
*/
|
|
21
8
|
set(name: string, value: unknown, userId?: string): Promise<void>;
|
|
22
|
-
/**
|
|
23
|
-
* Deletes a credential.
|
|
24
|
-
* @param name - The credential name.
|
|
25
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
26
|
-
*/
|
|
27
9
|
delete(name: string, userId?: string): Promise<void>;
|
|
28
|
-
/**
|
|
29
|
-
* Checks if a credential exists.
|
|
30
|
-
* @param name - The credential name.
|
|
31
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
32
|
-
*/
|
|
33
10
|
has(name: string, userId?: string): Promise<boolean>;
|
|
34
|
-
/**
|
|
35
|
-
* Retrieves all credentials for a user.
|
|
36
|
-
* @param userId - The user ID.
|
|
37
|
-
* @returns A record of credential name to value.
|
|
38
|
-
*/
|
|
39
11
|
getAll(userId: string): Promise<Record<string, unknown>>;
|
|
40
|
-
/**
|
|
41
|
-
* Lists all user IDs that have a specific credential configured.
|
|
42
|
-
* @param name - The credential name.
|
|
43
|
-
* @returns Array of user IDs.
|
|
44
|
-
*/
|
|
45
12
|
getUsersWithCredential(name: string): Promise<string[]>;
|
|
46
|
-
/**
|
|
47
|
-
* Lists all unique user IDs that have any credential configured.
|
|
48
|
-
* @returns Array of user IDs.
|
|
49
|
-
*/
|
|
50
13
|
getAllUsers(): Promise<string[]>;
|
|
51
14
|
}
|
|
@@ -9,6 +9,11 @@ export declare class PikkuCredentialWireService {
|
|
|
9
9
|
private loadPromise;
|
|
10
10
|
constructor(credentialService?: CredentialService | undefined, wire?: PikkuRawWire | undefined, aliases?: Record<string, string> | undefined);
|
|
11
11
|
private resolveName;
|
|
12
|
+
/**
|
|
13
|
+
* A credential is one of the few places vault material is meant to end up, so
|
|
14
|
+
* a `SecretValue` is unwrapped here rather than rejected — `get` promises the
|
|
15
|
+
* raw material, and storing the wrapper would make that a lie.
|
|
16
|
+
*/
|
|
12
17
|
set(name: string, value: unknown): void;
|
|
13
18
|
get<T = unknown>(name: string): T | null | Promise<T | null>;
|
|
14
19
|
getAll(): Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isSecretValue } from '../secret-value.js';
|
|
1
2
|
import { defaultPikkuUserIdResolver } from './pikku-user-id.js';
|
|
2
3
|
export class PikkuCredentialWireService {
|
|
3
4
|
credentialService;
|
|
@@ -14,8 +15,15 @@ export class PikkuCredentialWireService {
|
|
|
14
15
|
resolveName(name) {
|
|
15
16
|
return this.aliases?.[name] ?? name;
|
|
16
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* A credential is one of the few places vault material is meant to end up, so
|
|
20
|
+
* a `SecretValue` is unwrapped here rather than rejected — `get` promises the
|
|
21
|
+
* raw material, and storing the wrapper would make that a lie.
|
|
22
|
+
*/
|
|
17
23
|
set(name, value) {
|
|
18
|
-
this.credentials[this.resolveName(name)] = value
|
|
24
|
+
this.credentials[this.resolveName(name)] = isSecretValue(value)
|
|
25
|
+
? value.reveal()
|
|
26
|
+
: value;
|
|
19
27
|
}
|
|
20
28
|
get(name) {
|
|
21
29
|
const key = this.resolveName(name);
|
|
@@ -16,15 +16,9 @@ export interface DeploymentService {
|
|
|
16
16
|
start(config: DeploymentConfig): Promise<void>;
|
|
17
17
|
stop(): Promise<void>;
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* - Session propagation (JWT signing, headers)
|
|
23
|
-
* - The actual network call
|
|
24
|
-
*
|
|
25
|
-
* @param funcName - The function to invoke
|
|
26
|
-
* @param data - Input data for the function
|
|
27
|
-
* @param session - User session to propagate (optional)
|
|
19
|
+
* The implementation owns the whole transport: resolving the target
|
|
20
|
+
* (endpoint, service binding), propagating the session (JWT signing,
|
|
21
|
+
* headers) and making the call. Callers supply no transport detail.
|
|
28
22
|
*/
|
|
29
23
|
invoke(funcName: string, data: unknown, session?: unknown, traceId?: string): Promise<unknown>;
|
|
30
24
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Safe } from '../secret-value.js';
|
|
1
2
|
export interface EmailTemplateReference {
|
|
2
3
|
name: string;
|
|
3
4
|
locale?: string;
|
|
@@ -32,5 +33,5 @@ export interface SendEmailResult {
|
|
|
32
33
|
messageId?: string;
|
|
33
34
|
}
|
|
34
35
|
export interface EmailService {
|
|
35
|
-
send(input:
|
|
36
|
+
send<T extends SendEmailInput>(input: Safe<T>): Promise<SendEmailResult>;
|
|
36
37
|
}
|
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Abstract GatewayService interface.
|
|
3
|
-
*
|
|
4
|
-
* Implementations manage listener gateway lifecycle — initializing adapters
|
|
5
|
-
* and delivering messages to handler functions.
|
|
6
|
-
*
|
|
7
|
-
* A `LocalGatewayService` starts all listeners unconditionally;
|
|
8
|
-
* a distributed implementation could check leader election first.
|
|
9
|
-
*/
|
|
10
1
|
export interface GatewayService {
|
|
11
|
-
/**
|
|
12
|
-
* Start all listener gateways
|
|
13
|
-
*/
|
|
14
2
|
start(): Promise<void>;
|
|
15
|
-
/**
|
|
16
|
-
* Stop all listener gateways
|
|
17
|
-
*/
|
|
18
3
|
stop(): Promise<void>;
|
|
19
4
|
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { ScenarioPersona, ResolvedPersona, ScenarioPersonas, ScenarioInvokeOptions, ScenarioHttpResponse } from './personas-service.js';
|
|
2
|
+
import type { ConverseOptions, ActorFlowVerdict } from '../wirings/actor-flow/actor-flow.types.js';
|
|
3
|
+
export interface HttpPersonasConfig {
|
|
4
|
+
/**
|
|
5
|
+
* Base API URL of the target app, INCLUDING the HTTP prefix — e.g.
|
|
6
|
+
* `https://app.example.com/api` or `http://localhost:4000/api`. Sign-in is
|
|
7
|
+
* reached at `${apiUrl}${signInPath}` and exposed RPCs at
|
|
8
|
+
* `${apiUrl}${rpcPath}/:rpcName`.
|
|
9
|
+
*/
|
|
10
|
+
apiUrl: string;
|
|
11
|
+
/**
|
|
12
|
+
* The impersonation secret. Sign-in only ever works for user rows flagged
|
|
13
|
+
* `actor: true` — knowing the secret never impersonates real users.
|
|
14
|
+
*/
|
|
15
|
+
secret: string;
|
|
16
|
+
/** Persona id → the declaration with its address filled in. */
|
|
17
|
+
personas: Record<string, ResolvedPersona>;
|
|
18
|
+
/** Sign-in path under apiUrl. Default: the actor plugin's `/auth/sign-in/actor`. */
|
|
19
|
+
signInPath?: string;
|
|
20
|
+
/** Where the session (and its roles) is read back. Default `/auth/get-session`. */
|
|
21
|
+
sessionPath?: string;
|
|
22
|
+
/** Exposed-RPC path prefix under apiUrl. Default `/rpc`. */
|
|
23
|
+
rpcPath?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Default model a persona thinks with when `converse(...)` is called without
|
|
26
|
+
* an explicit `model`. Its own turns/approvals/evaluation run in-process via
|
|
27
|
+
* the configured `aiAgentRunner`.
|
|
28
|
+
*/
|
|
29
|
+
model?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Default HTTP-backed persona. Signs in lazily on first invoke via the Better
|
|
33
|
+
* Auth actor plugin (`POST /auth/sign-in/actor` with `{ email, secret }` —
|
|
34
|
+
* the plugin upserts the actor-flagged user row and mints a session whose
|
|
35
|
+
* `actor` flag flows into audits/analytics). Holds the session cookies for
|
|
36
|
+
* its lifetime; a 401 mid-run re-logs-in once (long health-check runs can
|
|
37
|
+
* outlive a session).
|
|
38
|
+
*/
|
|
39
|
+
export declare class HttpPersona implements ScenarioPersona {
|
|
40
|
+
readonly name: string;
|
|
41
|
+
private persona;
|
|
42
|
+
private config;
|
|
43
|
+
private jar;
|
|
44
|
+
/**
|
|
45
|
+
* Whether `login()` has succeeded since the last time the session was
|
|
46
|
+
* dropped. The jar cannot answer this — a target may set a cookie before
|
|
47
|
+
* anyone signs in, and it would then look like a session that was never
|
|
48
|
+
* established.
|
|
49
|
+
*/
|
|
50
|
+
private signedIn;
|
|
51
|
+
constructor(name: string, persona: ResolvedPersona, config: HttpPersonasConfig);
|
|
52
|
+
get email(): string;
|
|
53
|
+
invoke(rpcName: string, data: unknown): Promise<unknown>;
|
|
54
|
+
invokeRaw(rpcName: string, data: unknown, options?: ScenarioInvokeOptions): Promise<ScenarioHttpResponse>;
|
|
55
|
+
converse(options: ConverseOptions): Promise<ActorFlowVerdict>;
|
|
56
|
+
/**
|
|
57
|
+
* The roles the stage says this session holds.
|
|
58
|
+
*
|
|
59
|
+
* Read from better-auth's `get-session`, which is what most pikku apps are
|
|
60
|
+
* running and where its admin plugin puts `role` — on the user, as a
|
|
61
|
+
* comma-separated list. A target that answers something else returns `null`
|
|
62
|
+
* rather than an empty list, because "this stage does not report roles" and
|
|
63
|
+
* "this person has none" call for opposite responses from the caller.
|
|
64
|
+
*/
|
|
65
|
+
sessionRoles(): Promise<string[] | null>;
|
|
66
|
+
/** Start/continue the target agent's run over HTTP as this persona. */
|
|
67
|
+
private agentRun;
|
|
68
|
+
/** Answer the target agent's pending approvals over HTTP and continue. */
|
|
69
|
+
private agentApprove;
|
|
70
|
+
private postAgent;
|
|
71
|
+
private postRpc;
|
|
72
|
+
/** Drop the session, so the next call signs in again before it goes out. */
|
|
73
|
+
private signOut;
|
|
74
|
+
private login;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Build the injected `personas` service from the declared personas: id → lazy
|
|
78
|
+
* HTTP persona. Wire the result as the `personas` singleton service.
|
|
79
|
+
*/
|
|
80
|
+
export declare function createHttpPersonas(config: HttpPersonasConfig): ScenarioPersonas;
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { readScenarioHttpResponse } from './personas-service.js';
|
|
2
|
+
import { runConversation } from '../wirings/actor-flow/run-conversation.js';
|
|
3
|
+
import { createCookieJar, } from '../wirings/workflow/scenario-cookie-jar.js';
|
|
4
|
+
import { getSingletonServices } from '../pikku-state.js';
|
|
5
|
+
import { AIProviderNotConfiguredError } from '../errors/errors.js';
|
|
6
|
+
/**
|
|
7
|
+
* Default HTTP-backed persona. Signs in lazily on first invoke via the Better
|
|
8
|
+
* Auth actor plugin (`POST /auth/sign-in/actor` with `{ email, secret }` —
|
|
9
|
+
* the plugin upserts the actor-flagged user row and mints a session whose
|
|
10
|
+
* `actor` flag flows into audits/analytics). Holds the session cookies for
|
|
11
|
+
* its lifetime; a 401 mid-run re-logs-in once (long health-check runs can
|
|
12
|
+
* outlive a session).
|
|
13
|
+
*/
|
|
14
|
+
export class HttpPersona {
|
|
15
|
+
name;
|
|
16
|
+
persona;
|
|
17
|
+
config;
|
|
18
|
+
jar;
|
|
19
|
+
/**
|
|
20
|
+
* Whether `login()` has succeeded since the last time the session was
|
|
21
|
+
* dropped. The jar cannot answer this — a target may set a cookie before
|
|
22
|
+
* anyone signs in, and it would then look like a session that was never
|
|
23
|
+
* established.
|
|
24
|
+
*/
|
|
25
|
+
signedIn = false;
|
|
26
|
+
constructor(name, persona, config) {
|
|
27
|
+
this.name = name;
|
|
28
|
+
this.persona = persona;
|
|
29
|
+
this.config = config;
|
|
30
|
+
this.jar = createCookieJar(config.apiUrl);
|
|
31
|
+
}
|
|
32
|
+
get email() {
|
|
33
|
+
return this.persona.email;
|
|
34
|
+
}
|
|
35
|
+
async invoke(rpcName, data) {
|
|
36
|
+
const res = await this.invokeRaw(rpcName, data);
|
|
37
|
+
if (!res.ok) {
|
|
38
|
+
throw new Error(`[scenario] '${rpcName}' as '${this.name}' returned ${res.status}: ${res.serialized.slice(0, 300)}`);
|
|
39
|
+
}
|
|
40
|
+
return res.body;
|
|
41
|
+
}
|
|
42
|
+
async invokeRaw(rpcName, data, options) {
|
|
43
|
+
if (!this.signedIn) {
|
|
44
|
+
await this.login();
|
|
45
|
+
}
|
|
46
|
+
let res = await this.postRpc(rpcName, data, options?.headers);
|
|
47
|
+
if (res.status === 401) {
|
|
48
|
+
// Session expired mid-run — re-login once and retry.
|
|
49
|
+
this.signOut();
|
|
50
|
+
await this.login();
|
|
51
|
+
res = await this.postRpc(rpcName, data, options?.headers);
|
|
52
|
+
}
|
|
53
|
+
return readScenarioHttpResponse(res);
|
|
54
|
+
}
|
|
55
|
+
async converse(options) {
|
|
56
|
+
const { aiAgentRunner } = getSingletonServices();
|
|
57
|
+
if (!aiAgentRunner) {
|
|
58
|
+
throw new AIProviderNotConfiguredError();
|
|
59
|
+
}
|
|
60
|
+
const model = options.model ?? this.config.model;
|
|
61
|
+
if (!model) {
|
|
62
|
+
throw new Error(`[scenario] persona '${this.name}' converse needs a model — pass options.model or set 'model' on the personas service`);
|
|
63
|
+
}
|
|
64
|
+
const threadId = globalThis.crypto.randomUUID();
|
|
65
|
+
const resourceId = `persona:${this.name}`;
|
|
66
|
+
return runConversation({
|
|
67
|
+
persona: this.persona,
|
|
68
|
+
personaId: this.name,
|
|
69
|
+
agentName: options.agent,
|
|
70
|
+
task: options.task,
|
|
71
|
+
evaluate: options.evaluate,
|
|
72
|
+
approvals: options.approvals,
|
|
73
|
+
model,
|
|
74
|
+
maxTurns: options.maxTurns,
|
|
75
|
+
llm: (params) => aiAgentRunner.run(params),
|
|
76
|
+
target: {
|
|
77
|
+
run: (message) => this.agentRun(options.agent, message, threadId, resourceId),
|
|
78
|
+
approve: (runId, decisions) => this.agentApprove(options.agent, runId, decisions),
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The roles the stage says this session holds.
|
|
84
|
+
*
|
|
85
|
+
* Read from better-auth's `get-session`, which is what most pikku apps are
|
|
86
|
+
* running and where its admin plugin puts `role` — on the user, as a
|
|
87
|
+
* comma-separated list. A target that answers something else returns `null`
|
|
88
|
+
* rather than an empty list, because "this stage does not report roles" and
|
|
89
|
+
* "this person has none" call for opposite responses from the caller.
|
|
90
|
+
*/
|
|
91
|
+
async sessionRoles() {
|
|
92
|
+
if (!this.signedIn) {
|
|
93
|
+
await this.login();
|
|
94
|
+
}
|
|
95
|
+
const sessionPath = this.config.sessionPath ?? '/auth/get-session';
|
|
96
|
+
const res = await this.jar.fetch(`${this.config.apiUrl}${sessionPath}`);
|
|
97
|
+
if (!res.ok) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const text = await res.text().catch(() => '');
|
|
101
|
+
if (!text) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
let payload;
|
|
105
|
+
try {
|
|
106
|
+
payload = JSON.parse(text);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const user = payload?.user;
|
|
112
|
+
const role = user?.role;
|
|
113
|
+
if (typeof role === 'string') {
|
|
114
|
+
return role
|
|
115
|
+
.split(',')
|
|
116
|
+
.map((name) => name.trim())
|
|
117
|
+
.filter(Boolean);
|
|
118
|
+
}
|
|
119
|
+
if (Array.isArray(role)) {
|
|
120
|
+
return role.filter((name) => typeof name === 'string');
|
|
121
|
+
}
|
|
122
|
+
// The session came back and carried a user, but no role field — that is a
|
|
123
|
+
// stage reporting "none", not a stage that cannot report.
|
|
124
|
+
return user ? [] : null;
|
|
125
|
+
}
|
|
126
|
+
/** Start/continue the target agent's run over HTTP as this persona. */
|
|
127
|
+
async agentRun(agentName, message, threadId, resourceId) {
|
|
128
|
+
const raw = await this.postAgent(`agent/${agentName}`, {
|
|
129
|
+
message,
|
|
130
|
+
threadId,
|
|
131
|
+
resourceId,
|
|
132
|
+
});
|
|
133
|
+
return normalizeAgentReply(raw);
|
|
134
|
+
}
|
|
135
|
+
/** Answer the target agent's pending approvals over HTTP and continue. */
|
|
136
|
+
async agentApprove(agentName, runId, decisions) {
|
|
137
|
+
const raw = await this.postAgent(`agent/${agentName}/approve`, {
|
|
138
|
+
runId,
|
|
139
|
+
approvals: decisions,
|
|
140
|
+
});
|
|
141
|
+
return normalizeAgentReply(raw);
|
|
142
|
+
}
|
|
143
|
+
// knowledge: decisions/internals/scenario-agent-calls-sign-in-on-401-only.md
|
|
144
|
+
async postAgent(subPath, body) {
|
|
145
|
+
const rpcPath = this.config.rpcPath ?? '/rpc';
|
|
146
|
+
const url = `${this.config.apiUrl}${rpcPath}/${subPath}`;
|
|
147
|
+
const send = () => this.jar.fetch(url, {
|
|
148
|
+
method: 'POST',
|
|
149
|
+
headers: { 'content-type': 'application/json' },
|
|
150
|
+
body: JSON.stringify(body),
|
|
151
|
+
});
|
|
152
|
+
let res = await send();
|
|
153
|
+
if (res.status === 401) {
|
|
154
|
+
this.signOut();
|
|
155
|
+
await this.login();
|
|
156
|
+
res = await send();
|
|
157
|
+
}
|
|
158
|
+
if (!res.ok) {
|
|
159
|
+
const text = (await res.text().catch(() => '')).slice(0, 300);
|
|
160
|
+
throw new Error(`[scenario] agent call '${subPath}' as '${this.name}' returned ${res.status}: ${text}`);
|
|
161
|
+
}
|
|
162
|
+
if (res.status === 204)
|
|
163
|
+
return undefined;
|
|
164
|
+
const text = await res.text();
|
|
165
|
+
return text ? JSON.parse(text) : undefined;
|
|
166
|
+
}
|
|
167
|
+
async postRpc(rpcName, data, extraHeaders) {
|
|
168
|
+
const rpcPath = this.config.rpcPath ?? '/rpc';
|
|
169
|
+
return this.jar.fetch(`${this.config.apiUrl}${rpcPath}/${rpcName}`, {
|
|
170
|
+
method: 'POST',
|
|
171
|
+
headers: { 'content-type': 'application/json', ...extraHeaders },
|
|
172
|
+
body: JSON.stringify({ data }),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/** Drop the session, so the next call signs in again before it goes out. */
|
|
176
|
+
signOut() {
|
|
177
|
+
this.jar.clear();
|
|
178
|
+
this.signedIn = false;
|
|
179
|
+
}
|
|
180
|
+
async login() {
|
|
181
|
+
const signInPath = this.config.signInPath ?? '/auth/sign-in/actor';
|
|
182
|
+
const res = await this.jar.fetch(`${this.config.apiUrl}${signInPath}`, {
|
|
183
|
+
method: 'POST',
|
|
184
|
+
headers: { 'content-type': 'application/json' },
|
|
185
|
+
body: JSON.stringify({
|
|
186
|
+
email: this.persona.email,
|
|
187
|
+
name: this.persona.name,
|
|
188
|
+
secret: this.config.secret,
|
|
189
|
+
}),
|
|
190
|
+
});
|
|
191
|
+
if (!res.ok) {
|
|
192
|
+
const body = (await res.text().catch(() => '')).slice(0, 300);
|
|
193
|
+
throw new Error(`[scenario] persona sign-in failed for '${this.name}' (${res.status}): ${body}`);
|
|
194
|
+
}
|
|
195
|
+
// What proves a session was established is this response setting a cookie,
|
|
196
|
+
// not the jar being non-empty — the target may have set one earlier.
|
|
197
|
+
if (res.headers.getSetCookie().length === 0) {
|
|
198
|
+
throw new Error(`[scenario] persona sign-in for '${this.name}' returned no session cookie`);
|
|
199
|
+
}
|
|
200
|
+
this.signedIn = true;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/** Normalize an agentRun/agentApprove HTTP response into a TargetAgentReply. */
|
|
204
|
+
function normalizeAgentReply(raw) {
|
|
205
|
+
const r = (raw ?? {});
|
|
206
|
+
const pending = Array.isArray(r.pendingApprovals)
|
|
207
|
+
? r.pendingApprovals.map((p) => ({
|
|
208
|
+
toolCallId: String(p.toolCallId),
|
|
209
|
+
toolName: String(p.toolName),
|
|
210
|
+
args: p.args,
|
|
211
|
+
reason: typeof p.reason === 'string' ? p.reason : undefined,
|
|
212
|
+
}))
|
|
213
|
+
: undefined;
|
|
214
|
+
return {
|
|
215
|
+
text: typeof r.text === 'string' ? r.text : '',
|
|
216
|
+
runId: typeof r.runId === 'string' ? r.runId : '',
|
|
217
|
+
status: r.status === 'completed' || r.status === 'suspended'
|
|
218
|
+
? r.status
|
|
219
|
+
: undefined,
|
|
220
|
+
pendingApprovals: pending,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Build the injected `personas` service from the declared personas: id → lazy
|
|
225
|
+
* HTTP persona. Wire the result as the `personas` singleton service.
|
|
226
|
+
*/
|
|
227
|
+
export function createHttpPersonas(config) {
|
|
228
|
+
const personas = {};
|
|
229
|
+
for (const [id, persona] of Object.entries(config.personas)) {
|
|
230
|
+
personas[id] = new HttpPersona(id, persona, config);
|
|
231
|
+
}
|
|
232
|
+
return personas;
|
|
233
|
+
}
|
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
import type { QueueService, JobOptions } from '../wirings/queue/queue.types.js';
|
|
2
|
-
/**
|
|
3
|
-
* In-process queue for local/dev runs. Schedules jobs on the macrotask queue
|
|
4
|
-
* (setTimeout) so dispatch is genuinely asynchronous — the same timing shape as
|
|
5
|
-
* a real queue — and redelivers a failed job up to `options.attempts` times with
|
|
6
|
-
* backoff, so a transiently-failing workflow step recovers exactly as it would
|
|
7
|
-
* on pg-boss/bullmq instead of being silently dropped on its first error.
|
|
8
|
-
*
|
|
9
|
-
* Payloads are JSON round-tripped on the way in, because every real backend
|
|
10
|
-
* puts the job on a wire (SQS body, Redis value, jsonb column) and the worker
|
|
11
|
-
* therefore never sees the caller's live object. Doing it here keeps dev
|
|
12
|
-
* behaviour honest, and keeps the callers — who cannot know which backend they
|
|
13
|
-
* are talking to — from having to serialise defensively.
|
|
14
|
-
*/
|
|
15
2
|
export declare class InMemoryQueueService implements QueueService {
|
|
16
3
|
readonly supportsResults = false;
|
|
17
4
|
private jobCounter;
|
|
18
5
|
add<T>(queueName: string, data: T, options?: JobOptions): Promise<string>;
|
|
19
|
-
/** Delay before the next redelivery, honoring the job's backoff policy. */
|
|
20
6
|
private backoffDelay;
|
|
21
7
|
getJob(): Promise<null>;
|
|
22
8
|
}
|
|
@@ -1,17 +1,5 @@
|
|
|
1
1
|
import { runQueueJob } from '../wirings/queue/queue-runner.js';
|
|
2
|
-
|
|
3
|
-
* In-process queue for local/dev runs. Schedules jobs on the macrotask queue
|
|
4
|
-
* (setTimeout) so dispatch is genuinely asynchronous — the same timing shape as
|
|
5
|
-
* a real queue — and redelivers a failed job up to `options.attempts` times with
|
|
6
|
-
* backoff, so a transiently-failing workflow step recovers exactly as it would
|
|
7
|
-
* on pg-boss/bullmq instead of being silently dropped on its first error.
|
|
8
|
-
*
|
|
9
|
-
* Payloads are JSON round-tripped on the way in, because every real backend
|
|
10
|
-
* puts the job on a wire (SQS body, Redis value, jsonb column) and the worker
|
|
11
|
-
* therefore never sees the caller's live object. Doing it here keeps dev
|
|
12
|
-
* behaviour honest, and keeps the callers — who cannot know which backend they
|
|
13
|
-
* are talking to — from having to serialise defensively.
|
|
14
|
-
*/
|
|
2
|
+
// knowledge: decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md
|
|
15
3
|
export class InMemoryQueueService {
|
|
16
4
|
supportsResults = false;
|
|
17
5
|
jobCounter = 0;
|
|
@@ -36,7 +24,6 @@ export class InMemoryQueueService {
|
|
|
36
24
|
}
|
|
37
25
|
catch (e) {
|
|
38
26
|
if (attemptsMade < maxAttempts) {
|
|
39
|
-
// Transient failure — redeliver with backoff, mirroring a real queue.
|
|
40
27
|
setTimeout(runAttempt, this.backoffDelay(options?.backoff, attemptsMade));
|
|
41
28
|
}
|
|
42
29
|
else {
|
|
@@ -48,7 +35,6 @@ export class InMemoryQueueService {
|
|
|
48
35
|
setTimeout(runAttempt, delay);
|
|
49
36
|
return jobId;
|
|
50
37
|
}
|
|
51
|
-
/** Delay before the next redelivery, honoring the job's backoff policy. */
|
|
52
38
|
backoffDelay(backoff, attemptsMade) {
|
|
53
39
|
const baseDelay = typeof backoff === 'object' ? (backoff.delay ?? 50) : 50;
|
|
54
40
|
if (backoff === 'exponential' ||
|
|
@@ -1,22 +1,4 @@
|
|
|
1
1
|
import { PikkuTriggerService } from '../wirings/trigger/pikku-trigger-service.js';
|
|
2
|
-
/**
|
|
3
|
-
* In-memory TriggerService implementation.
|
|
4
|
-
*
|
|
5
|
-
* Reads both `wireTrigger` declarations and `wireTriggerSource` registrations
|
|
6
|
-
* from pikkuState. Only starts triggers that have both a declaration and a source.
|
|
7
|
-
* On fire, invokes target via `ContextAwareRPCService`.
|
|
8
|
-
*
|
|
9
|
-
* Single owner — one process runs triggers, no distributed claiming.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* const triggerService = new InMemoryTriggerService()
|
|
14
|
-
* await triggerService.start()
|
|
15
|
-
*
|
|
16
|
-
* // On shutdown
|
|
17
|
-
* await triggerService.stop()
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
2
|
export declare class InMemoryTriggerService extends PikkuTriggerService {
|
|
21
3
|
start(): Promise<void>;
|
|
22
4
|
}
|
|
@@ -1,23 +1,6 @@
|
|
|
1
1
|
import { PikkuTriggerService } from '../wirings/trigger/pikku-trigger-service.js';
|
|
2
2
|
import { getSingletonServices } from '../pikku-state.js';
|
|
3
|
-
|
|
4
|
-
* In-memory TriggerService implementation.
|
|
5
|
-
*
|
|
6
|
-
* Reads both `wireTrigger` declarations and `wireTriggerSource` registrations
|
|
7
|
-
* from pikkuState. Only starts triggers that have both a declaration and a source.
|
|
8
|
-
* On fire, invokes target via `ContextAwareRPCService`.
|
|
9
|
-
*
|
|
10
|
-
* Single owner — one process runs triggers, no distributed claiming.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const triggerService = new InMemoryTriggerService()
|
|
15
|
-
* await triggerService.start()
|
|
16
|
-
*
|
|
17
|
-
* // On shutdown
|
|
18
|
-
* await triggerService.stop()
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
3
|
+
// knowledge: decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md
|
|
21
4
|
export class InMemoryTriggerService extends PikkuTriggerService {
|
|
22
5
|
async start() {
|
|
23
6
|
const singletonServices = getSingletonServices();
|
|
@@ -1,21 +1,6 @@
|
|
|
1
1
|
import { PikkuWorkflowService } from '../wirings/workflow/pikku-workflow-service.js';
|
|
2
2
|
import type { SerializedError } from '../types/core.types.js';
|
|
3
3
|
import type { WorkflowPlannedStep, WorkflowQueueOptions, WorkflowRun, WorkflowRunService, WorkflowRunWire, StepState, StepStatus, WorkflowStatus, WorkflowVersionStatus, WorkflowStepOptions } from '../wirings/workflow/workflow.types.js';
|
|
4
|
-
/**
|
|
5
|
-
* In-memory implementation of WorkflowService for inline-only execution
|
|
6
|
-
*
|
|
7
|
-
* This is a lightweight workflow service that stores all state in memory.
|
|
8
|
-
* It only supports inline execution (no queue workers) and is ideal for:
|
|
9
|
-
* - CLI tools that need workflow-like step orchestration
|
|
10
|
-
* - Testing and development
|
|
11
|
-
* - Single-process applications without persistence requirements
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const workflowService = new InMemoryWorkflowService()
|
|
16
|
-
* await workflowService.startWorkflow('myWorkflow', input, { type: 'cli' }, rpc, { inline: true })
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
4
|
export declare class InMemoryWorkflowService extends PikkuWorkflowService implements WorkflowRunService {
|
|
20
5
|
constructor(options?: WorkflowQueueOptions);
|
|
21
6
|
private sleepTimers;
|
|
@@ -65,7 +50,6 @@ export declare class InMemoryWorkflowService extends PikkuWorkflowService implem
|
|
|
65
50
|
failedNodeIds: string[];
|
|
66
51
|
branchKeys: Record<string, string>;
|
|
67
52
|
}>;
|
|
68
|
-
getNodesWithoutSteps(runId: string, nodeIds: string[]): Promise<string[]>;
|
|
69
53
|
protected listStepStates(runId: string): Promise<Array<StepState & {
|
|
70
54
|
stepName: string;
|
|
71
55
|
}>>;
|