@pikku/core 0.12.71 → 0.12.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +848 -0
- package/dist/crypto-utils.d.ts +30 -5
- package/dist/crypto-utils.js +146 -41
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +40 -30
- package/dist/function/functions.types.d.ts +44 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -11
- package/dist/handle-error.js +6 -18
- package/dist/index.d.ts +5 -2
- package/dist/index.js +4 -1
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +3 -40
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +3 -2
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +8 -7
- package/dist/schema.d.ts +7 -17
- package/dist/schema.js +30 -18
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.js +1 -2
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +5 -6
- package/dist/services/index.js +2 -5
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +0 -4
- package/dist/services/local-secrets.js +0 -4
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +2 -37
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +9 -41
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +0 -4
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +5 -33
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +0 -7
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +19 -63
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +0 -17
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +99 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +34 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +58 -131
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +49 -20
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +39 -1
- package/dist/wirings/ai-agent/voice-input.js +46 -3
- package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
- package/dist/wirings/ai-agent/voice-output.js +153 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +20 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
- package/dist/wirings/cli/channel/index.d.ts +4 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +1 -100
- package/dist/wirings/http/http-runner.js +12 -166
- package/dist/wirings/http/http.types.d.ts +16 -55
- package/dist/wirings/http/index.d.ts +2 -1
- package/dist/wirings/http/index.js +1 -1
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +6 -36
- package/dist/wirings/http/pikku-fetch-http-request.js +56 -50
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +2 -0
- package/dist/wirings/mcp/mcp-runner.js +6 -16
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +28 -0
- package/dist/wirings/persona/define-personas.js +27 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +125 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +102 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +18 -89
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +16 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -12
- package/dist/wirings/rpc/remote-addon-auth.js +1 -9
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +27 -0
- package/dist/wirings/virtual-user/index.js +8 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +5 -5
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -42
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +0 -18
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +72 -6
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +0 -197
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +34 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +113 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +4 -2
- package/run-tests.sh +0 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +283 -55
- package/src/data-classification.ts +1 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +75 -7
- package/src/function/function-runner.ts +73 -30
- package/src/function/functions.types.ts +56 -136
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/gopass-secrets-removed.test.ts +51 -0
- package/src/handle-error.test.ts +108 -1
- package/src/handle-error.ts +8 -18
- package/src/index.ts +60 -1
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +0 -3
- package/src/middleware/auth-bearer.ts +3 -40
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +24 -9
- package/src/middleware/remote-auth.ts +10 -2
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +172 -0
- package/src/remote.ts +17 -7
- package/src/schema.test.ts +103 -0
- package/src/schema.ts +35 -18
- package/src/scopes.ts +7 -48
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +1 -2
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/deployment-service.ts +3 -9
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +20 -15
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.ts +0 -4
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +2 -37
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.ts +9 -41
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +0 -4
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +5 -33
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +1 -7
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +19 -63
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +0 -26
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +116 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +75 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +36 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +82 -138
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +67 -33
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
- package/src/wirings/ai-agent/index.ts +35 -3
- package/src/wirings/ai-agent/voice-input.test.ts +72 -7
- package/src/wirings/ai-agent/voice-input.ts +48 -3
- package/src/wirings/ai-agent/voice-output.test.ts +422 -0
- package/src/wirings/ai-agent/voice-output.ts +216 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +155 -0
- package/src/wirings/cli/channel/index.ts +9 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +12 -168
- package/src/wirings/http/http.types.ts +17 -62
- package/src/wirings/http/index.ts +5 -1
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +88 -7
- package/src/wirings/http/pikku-fetch-http-request.ts +74 -50
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.test.ts +40 -0
- package/src/wirings/mcp/mcp-runner.ts +9 -15
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +29 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +131 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +453 -0
- package/src/wirings/queue/queue-identity.ts +173 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +19 -89
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +59 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +1 -13
- package/src/wirings/rpc/rpc-runner.test.ts +186 -2
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +76 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -52
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.ts +0 -28
- package/src/wirings/workflow/scenario-service.test.ts +2 -9
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +159 -14
- package/src/wirings/workflow/scenario-step.types.ts +82 -6
- package/src/wirings/workflow/scenario-surface.test.ts +145 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +0 -203
- package/tsconfig.tsbuildinfo +1 -1
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/services/gopass-secrets.ts +0 -78
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -1,57 +1,20 @@
|
|
|
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
8
|
|
|
16
|
-
/**
|
|
17
|
-
* Stores a credential.
|
|
18
|
-
* @param name - The credential name.
|
|
19
|
-
* @param value - The credential value to store.
|
|
20
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
21
|
-
*/
|
|
22
9
|
set(name: string, value: unknown, userId?: string): Promise<void>
|
|
23
10
|
|
|
24
|
-
/**
|
|
25
|
-
* Deletes a credential.
|
|
26
|
-
* @param name - The credential name.
|
|
27
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
28
|
-
*/
|
|
29
11
|
delete(name: string, userId?: string): Promise<void>
|
|
30
12
|
|
|
31
|
-
/**
|
|
32
|
-
* Checks if a credential exists.
|
|
33
|
-
* @param name - The credential name.
|
|
34
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
35
|
-
*/
|
|
36
13
|
has(name: string, userId?: string): Promise<boolean>
|
|
37
14
|
|
|
38
|
-
/**
|
|
39
|
-
* Retrieves all credentials for a user.
|
|
40
|
-
* @param userId - The user ID.
|
|
41
|
-
* @returns A record of credential name to value.
|
|
42
|
-
*/
|
|
43
15
|
getAll(userId: string): Promise<Record<string, unknown>>
|
|
44
16
|
|
|
45
|
-
/**
|
|
46
|
-
* Lists all user IDs that have a specific credential configured.
|
|
47
|
-
* @param name - The credential name.
|
|
48
|
-
* @returns Array of user IDs.
|
|
49
|
-
*/
|
|
50
17
|
getUsersWithCredential(name: string): Promise<string[]>
|
|
51
18
|
|
|
52
|
-
/**
|
|
53
|
-
* Lists all unique user IDs that have any credential configured.
|
|
54
|
-
* @returns Array of user IDs.
|
|
55
|
-
*/
|
|
56
19
|
getAllUsers(): Promise<string[]>
|
|
57
20
|
}
|
|
@@ -29,9 +29,7 @@ describe('PikkuCredentialWireService', () => {
|
|
|
29
29
|
test('should return sync after first load (no credential service)', async () => {
|
|
30
30
|
const service = new PikkuCredentialWireService()
|
|
31
31
|
service.set('foo', 'bar')
|
|
32
|
-
// First call triggers lazy load (no-op without credentialService)
|
|
33
32
|
await service.getAll()
|
|
34
|
-
// Second call should be sync
|
|
35
33
|
const result = service.getAll()
|
|
36
34
|
assert.ok(!(result instanceof Promise), 'expected sync return')
|
|
37
35
|
assert.deepStrictEqual(result, { foo: 'bar' })
|
|
@@ -19,15 +19,9 @@ export interface DeploymentService {
|
|
|
19
19
|
start(config: DeploymentConfig): Promise<void>
|
|
20
20
|
stop(): Promise<void>
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* - Session propagation (JWT signing, headers)
|
|
26
|
-
* - The actual network call
|
|
27
|
-
*
|
|
28
|
-
* @param funcName - The function to invoke
|
|
29
|
-
* @param data - Input data for the function
|
|
30
|
-
* @param session - User session to propagate (optional)
|
|
22
|
+
* The implementation owns the whole transport: resolving the target
|
|
23
|
+
* (endpoint, service binding), propagating the session (JWT signing,
|
|
24
|
+
* headers) and making the call. Callers supply no transport detail.
|
|
31
25
|
*/
|
|
32
26
|
invoke(
|
|
33
27
|
funcName: string,
|
|
@@ -1,20 +1,5 @@
|
|
|
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
3
|
|
|
16
|
-
/**
|
|
17
|
-
* Stop all listener gateways
|
|
18
|
-
*/
|
|
19
4
|
stop(): Promise<void>
|
|
20
5
|
}
|
package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts}
RENAMED
|
@@ -2,7 +2,7 @@ import { describe, test, after } from 'node:test'
|
|
|
2
2
|
import assert from 'node:assert/strict'
|
|
3
3
|
import { createServer, type Server } from 'node:http'
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { createHttpPersonas } from './http-personas.js'
|
|
6
6
|
import { pikkuState, resetPikkuState } from '../pikku-state.js'
|
|
7
7
|
import type { AIAgentStepResult } from './ai-agent-runner-service.js'
|
|
8
8
|
|
|
@@ -139,7 +139,7 @@ const wireRunner = () => {
|
|
|
139
139
|
} as any)
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
-
describe('
|
|
142
|
+
describe('HttpPersona.converse', async () => {
|
|
143
143
|
const target = await startAgentTarget()
|
|
144
144
|
after(() => {
|
|
145
145
|
target.server.close()
|
|
@@ -150,12 +150,21 @@ describe('HttpScenarioActor.converse', async () => {
|
|
|
150
150
|
wireRunner()
|
|
151
151
|
target.reset()
|
|
152
152
|
|
|
153
|
-
const actors =
|
|
153
|
+
const actors = createHttpPersonas({
|
|
154
154
|
apiUrl: target.apiUrl,
|
|
155
155
|
secret: 'impersonation-secret',
|
|
156
156
|
model: 'test/test-model',
|
|
157
|
-
|
|
158
|
-
pm: {
|
|
157
|
+
personas: {
|
|
158
|
+
pm: {
|
|
159
|
+
id: 'pm',
|
|
160
|
+
name: 'Priya',
|
|
161
|
+
email: 'pm@personas.invalid',
|
|
162
|
+
personality: 'concise',
|
|
163
|
+
roles: [],
|
|
164
|
+
goals: [],
|
|
165
|
+
tags: [],
|
|
166
|
+
runnable: true,
|
|
167
|
+
},
|
|
159
168
|
},
|
|
160
169
|
})
|
|
161
170
|
|
|
@@ -179,11 +188,21 @@ describe('HttpScenarioActor.converse', async () => {
|
|
|
179
188
|
wireRunner()
|
|
180
189
|
target.reset({ authRequired: true })
|
|
181
190
|
|
|
182
|
-
const actors =
|
|
191
|
+
const actors = createHttpPersonas({
|
|
183
192
|
apiUrl: target.apiUrl,
|
|
184
193
|
secret: 'impersonation-secret',
|
|
185
194
|
model: 'test/test-model',
|
|
186
|
-
|
|
195
|
+
personas: {
|
|
196
|
+
pm: {
|
|
197
|
+
id: 'pm',
|
|
198
|
+
name: 'Priya',
|
|
199
|
+
email: 'pm@personas.invalid',
|
|
200
|
+
roles: [],
|
|
201
|
+
goals: [],
|
|
202
|
+
tags: [],
|
|
203
|
+
runnable: true,
|
|
204
|
+
},
|
|
205
|
+
},
|
|
187
206
|
})
|
|
188
207
|
|
|
189
208
|
const verdict = await actors.pm!.converse({
|
|
@@ -208,11 +227,21 @@ describe('HttpScenarioActor.converse', async () => {
|
|
|
208
227
|
},
|
|
209
228
|
} as any)
|
|
210
229
|
|
|
211
|
-
const actors =
|
|
230
|
+
const actors = createHttpPersonas({
|
|
212
231
|
apiUrl: target.apiUrl,
|
|
213
232
|
secret: 'impersonation-secret',
|
|
214
233
|
model: 'test/test-model',
|
|
215
|
-
|
|
234
|
+
personas: {
|
|
235
|
+
pm: {
|
|
236
|
+
id: 'pm',
|
|
237
|
+
name: 'Priya',
|
|
238
|
+
email: 'pm@personas.invalid',
|
|
239
|
+
roles: [],
|
|
240
|
+
goals: [],
|
|
241
|
+
tags: [],
|
|
242
|
+
runnable: true,
|
|
243
|
+
},
|
|
244
|
+
},
|
|
216
245
|
})
|
|
217
246
|
|
|
218
247
|
await assert.rejects(
|
|
@@ -2,10 +2,10 @@ import { describe, test, after } from 'node:test'
|
|
|
2
2
|
import assert from 'node:assert/strict'
|
|
3
3
|
import { createServer, type Server } from 'node:http'
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { createHttpPersonas } from './http-personas.js'
|
|
6
6
|
|
|
7
|
-
// Minimal target app
|
|
8
|
-
//
|
|
7
|
+
// Minimal target app mirroring the Better Auth actor plugin's contract:
|
|
8
|
+
// sign-in endpoint, exposed RPC endpoint, session by cookie.
|
|
9
9
|
const startTarget = async () => {
|
|
10
10
|
let logins = 0
|
|
11
11
|
let expireNext = false
|
|
@@ -78,29 +78,46 @@ const startTarget = async () => {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
describe('
|
|
81
|
+
describe('HttpPersona', async () => {
|
|
82
82
|
const target = await startTarget()
|
|
83
83
|
after(() => target.server.close())
|
|
84
84
|
|
|
85
|
-
const
|
|
86
|
-
|
|
85
|
+
const makePersonas = (secret = 'impersonation-secret') =>
|
|
86
|
+
createHttpPersonas({
|
|
87
87
|
apiUrl: target.apiUrl,
|
|
88
88
|
secret,
|
|
89
|
-
|
|
90
|
-
customer: {
|
|
91
|
-
|
|
89
|
+
personas: {
|
|
90
|
+
customer: {
|
|
91
|
+
id: 'customer',
|
|
92
|
+
name: 'Customer',
|
|
93
|
+
email: 'customer@personas.invalid',
|
|
94
|
+
jobTitle: 'Buyer',
|
|
95
|
+
roles: [],
|
|
96
|
+
goals: [],
|
|
97
|
+
tags: [],
|
|
98
|
+
runnable: true,
|
|
99
|
+
},
|
|
100
|
+
manager: {
|
|
101
|
+
id: 'manager',
|
|
102
|
+
name: 'Manager',
|
|
103
|
+
email: 'manager@personas.invalid',
|
|
104
|
+
roles: [],
|
|
105
|
+
goals: [],
|
|
106
|
+
tags: [],
|
|
107
|
+
runnable: true,
|
|
108
|
+
},
|
|
92
109
|
},
|
|
93
110
|
})
|
|
94
111
|
|
|
95
|
-
test('builds one lazy
|
|
96
|
-
const actors =
|
|
112
|
+
test('builds one lazy persona per declaration', () => {
|
|
113
|
+
const actors = makePersonas()
|
|
97
114
|
assert.deepEqual(Object.keys(actors).sort(), ['customer', 'manager'])
|
|
98
115
|
assert.equal(actors.customer!.name, 'customer')
|
|
99
116
|
assert.equal(target.loginCount(), 0, 'no login until first invoke')
|
|
100
117
|
})
|
|
101
118
|
|
|
102
119
|
test('logs in lazily once and replays the session cookie on RPCs', async () => {
|
|
103
|
-
const actors =
|
|
120
|
+
const actors = makePersonas()
|
|
104
121
|
|
|
105
122
|
const first = (await actors.customer!.invoke('createTodo', {
|
|
106
123
|
title: 'x',
|
|
@@ -120,7 +137,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
120
137
|
})
|
|
121
138
|
|
|
122
139
|
test('re-logs-in once when the session expires mid-run', async () => {
|
|
123
|
-
const actors =
|
|
140
|
+
const actors = makePersonas()
|
|
124
141
|
await actors.manager!.invoke('ping', {})
|
|
125
142
|
const loginsBefore = target.loginCount()
|
|
126
143
|
|
|
@@ -132,7 +149,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
132
149
|
})
|
|
133
150
|
|
|
134
151
|
test('invokeRaw returns the status and body instead of throwing', async () => {
|
|
135
|
-
const actors =
|
|
152
|
+
const actors = makePersonas()
|
|
136
153
|
|
|
137
154
|
// A refusal is the expected outcome of a permissions scenario, so the
|
|
138
155
|
// status and the payload that names the missing scope both have to survive.
|
|
@@ -147,7 +164,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
147
164
|
})
|
|
148
165
|
|
|
149
166
|
test('invokeRaw reports a success the same way', async () => {
|
|
150
|
-
const actors =
|
|
167
|
+
const actors = makePersonas()
|
|
151
168
|
const res = await actors.manager!.invokeRaw('listTodos', { page: 2 })
|
|
152
169
|
|
|
153
170
|
assert.equal(res.status, 200)
|
|
@@ -156,7 +173,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
156
173
|
})
|
|
157
174
|
|
|
158
175
|
test('invokeRaw carries the response text so a step can search it', async () => {
|
|
159
|
-
const actors =
|
|
176
|
+
const actors = makePersonas()
|
|
160
177
|
const res = await actors.customer!.invokeRaw('forbidden', {})
|
|
161
178
|
|
|
162
179
|
assert.match(res.serialized, /MissingScopeError/)
|
|
@@ -164,7 +181,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
164
181
|
})
|
|
165
182
|
|
|
166
183
|
test('invokeRaw keeps a non-JSON error body instead of failing to parse it', async () => {
|
|
167
|
-
const actors =
|
|
184
|
+
const actors = makePersonas()
|
|
168
185
|
const res = await actors.manager!.invokeRaw('html-error', {})
|
|
169
186
|
|
|
170
187
|
assert.equal(res.status, 500)
|
|
@@ -174,14 +191,14 @@ describe('HttpScenarioActor', async () => {
|
|
|
174
191
|
})
|
|
175
192
|
|
|
176
193
|
test('invokeRaw reports an empty body as an empty string', async () => {
|
|
177
|
-
const actors =
|
|
194
|
+
const actors = makePersonas()
|
|
178
195
|
const res = await actors.manager!.invokeRaw('listTodos', {})
|
|
179
196
|
|
|
180
197
|
assert.equal(typeof res.serialized, 'string')
|
|
181
198
|
})
|
|
182
199
|
|
|
183
200
|
test('invokeRaw passes extra headers through', async () => {
|
|
184
|
-
const actors =
|
|
201
|
+
const actors = makePersonas()
|
|
185
202
|
const res = await actors.manager!.invokeRaw(
|
|
186
203
|
'whoAmI',
|
|
187
204
|
{},
|
|
@@ -192,7 +209,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
192
209
|
})
|
|
193
210
|
|
|
194
211
|
test('invoke still throws on a refusal, naming the status and body', async () => {
|
|
195
|
-
const actors =
|
|
212
|
+
const actors = makePersonas()
|
|
196
213
|
await assert.rejects(
|
|
197
214
|
actors.customer!.invoke('forbidden', {}),
|
|
198
215
|
/'forbidden' as 'customer' returned 403.*MissingScopeError/
|
|
@@ -200,10 +217,10 @@ describe('HttpScenarioActor', async () => {
|
|
|
200
217
|
})
|
|
201
218
|
|
|
202
219
|
test('a wrong impersonation secret surfaces status and body', async () => {
|
|
203
|
-
const actors =
|
|
220
|
+
const actors = makePersonas('wrong-secret')
|
|
204
221
|
await assert.rejects(
|
|
205
222
|
actors.customer!.invoke('ping', {}),
|
|
206
|
-
/
|
|
223
|
+
/persona sign-in failed for 'customer' \(401\).*bad actor secret/
|
|
207
224
|
)
|
|
208
225
|
})
|
|
209
226
|
})
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
ScenarioPersona,
|
|
3
|
+
ResolvedPersona,
|
|
4
|
+
ScenarioPersonas,
|
|
5
5
|
ScenarioInvokeOptions,
|
|
6
6
|
ScenarioHttpResponse,
|
|
7
|
-
} from './
|
|
8
|
-
import { readScenarioHttpResponse } from './
|
|
7
|
+
} from './personas-service.js'
|
|
8
|
+
import { readScenarioHttpResponse } from './personas-service.js'
|
|
9
9
|
import type {
|
|
10
10
|
ConverseOptions,
|
|
11
11
|
ActorFlowVerdict,
|
|
@@ -19,42 +19,44 @@ import {
|
|
|
19
19
|
import { getSingletonServices } from '../pikku-state.js'
|
|
20
20
|
import { AIProviderNotConfiguredError } from '../errors/errors.js'
|
|
21
21
|
|
|
22
|
-
export interface
|
|
22
|
+
export interface HttpPersonasConfig {
|
|
23
23
|
/**
|
|
24
24
|
* Base API URL of the target app, INCLUDING the HTTP prefix — e.g.
|
|
25
|
-
* `https://app.example.com/api` or `http://localhost:4000/api`.
|
|
26
|
-
*
|
|
25
|
+
* `https://app.example.com/api` or `http://localhost:4000/api`. Sign-in is
|
|
26
|
+
* reached at `${apiUrl}${signInPath}` and exposed RPCs at
|
|
27
27
|
* `${apiUrl}${rpcPath}/:rpcName`.
|
|
28
28
|
*/
|
|
29
29
|
apiUrl: string
|
|
30
30
|
/**
|
|
31
|
-
* The
|
|
32
|
-
*
|
|
31
|
+
* The impersonation secret. Sign-in only ever works for user rows flagged
|
|
32
|
+
* `actor: true` — knowing the secret never impersonates real users.
|
|
33
33
|
*/
|
|
34
34
|
secret: string
|
|
35
|
-
/**
|
|
36
|
-
|
|
35
|
+
/** Persona id → the declaration with its address filled in. */
|
|
36
|
+
personas: Record<string, ResolvedPersona>
|
|
37
37
|
/** Sign-in path under apiUrl. Default: the actor plugin's `/auth/sign-in/actor`. */
|
|
38
38
|
signInPath?: string
|
|
39
|
+
/** Where the session (and its roles) is read back. Default `/auth/get-session`. */
|
|
40
|
+
sessionPath?: string
|
|
39
41
|
/** Exposed-RPC path prefix under apiUrl. Default `/rpc`. */
|
|
40
42
|
rpcPath?: string
|
|
41
43
|
/**
|
|
42
|
-
* Default model
|
|
43
|
-
* an explicit `model`.
|
|
44
|
-
*
|
|
44
|
+
* Default model a persona thinks with when `converse(...)` is called without
|
|
45
|
+
* an explicit `model`. Its own turns/approvals/evaluation run in-process via
|
|
46
|
+
* the configured `aiAgentRunner`.
|
|
45
47
|
*/
|
|
46
48
|
model?: string
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
/**
|
|
50
|
-
* Default HTTP-backed
|
|
52
|
+
* Default HTTP-backed persona. Signs in lazily on first invoke via the Better
|
|
51
53
|
* Auth actor plugin (`POST /auth/sign-in/actor` with `{ email, secret }` —
|
|
52
54
|
* the plugin upserts the actor-flagged user row and mints a session whose
|
|
53
55
|
* `actor` flag flows into audits/analytics). Holds the session cookies for
|
|
54
56
|
* its lifetime; a 401 mid-run re-logs-in once (long health-check runs can
|
|
55
57
|
* outlive a session).
|
|
56
58
|
*/
|
|
57
|
-
export class
|
|
59
|
+
export class HttpPersona implements ScenarioPersona {
|
|
58
60
|
private jar: ScenarioCookieJar
|
|
59
61
|
/**
|
|
60
62
|
* Whether `login()` has succeeded since the last time the session was
|
|
@@ -66,14 +68,14 @@ export class HttpScenarioActor implements ScenarioActor {
|
|
|
66
68
|
|
|
67
69
|
constructor(
|
|
68
70
|
readonly name: string,
|
|
69
|
-
private
|
|
70
|
-
private config:
|
|
71
|
+
private persona: ResolvedPersona,
|
|
72
|
+
private config: HttpPersonasConfig
|
|
71
73
|
) {
|
|
72
74
|
this.jar = createCookieJar(config.apiUrl)
|
|
73
75
|
}
|
|
74
76
|
|
|
75
77
|
get email(): string {
|
|
76
|
-
return this.
|
|
78
|
+
return this.persona.email
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
async invoke(rpcName: string, data: unknown): Promise<unknown> {
|
|
@@ -112,15 +114,15 @@ export class HttpScenarioActor implements ScenarioActor {
|
|
|
112
114
|
const model = options.model ?? this.config.model
|
|
113
115
|
if (!model) {
|
|
114
116
|
throw new Error(
|
|
115
|
-
`[scenario]
|
|
117
|
+
`[scenario] persona '${this.name}' converse needs a model — pass options.model or set 'model' on the personas service`
|
|
116
118
|
)
|
|
117
119
|
}
|
|
118
120
|
const threadId = globalThis.crypto.randomUUID()
|
|
119
|
-
const resourceId = `
|
|
121
|
+
const resourceId = `persona:${this.name}`
|
|
120
122
|
|
|
121
123
|
return runConversation({
|
|
122
|
-
|
|
123
|
-
|
|
124
|
+
persona: this.persona,
|
|
125
|
+
personaId: this.name,
|
|
124
126
|
agentName: options.agent,
|
|
125
127
|
task: options.task,
|
|
126
128
|
evaluate: options.evaluate,
|
|
@@ -137,7 +139,51 @@ export class HttpScenarioActor implements ScenarioActor {
|
|
|
137
139
|
})
|
|
138
140
|
}
|
|
139
141
|
|
|
140
|
-
/**
|
|
142
|
+
/**
|
|
143
|
+
* The roles the stage says this session holds.
|
|
144
|
+
*
|
|
145
|
+
* Read from better-auth's `get-session`, which is what most pikku apps are
|
|
146
|
+
* running and where its admin plugin puts `role` — on the user, as a
|
|
147
|
+
* comma-separated list. A target that answers something else returns `null`
|
|
148
|
+
* rather than an empty list, because "this stage does not report roles" and
|
|
149
|
+
* "this person has none" call for opposite responses from the caller.
|
|
150
|
+
*/
|
|
151
|
+
async sessionRoles(): Promise<string[] | null> {
|
|
152
|
+
if (!this.signedIn) {
|
|
153
|
+
await this.login()
|
|
154
|
+
}
|
|
155
|
+
const sessionPath = this.config.sessionPath ?? '/auth/get-session'
|
|
156
|
+
const res = await this.jar.fetch(`${this.config.apiUrl}${sessionPath}`)
|
|
157
|
+
if (!res.ok) {
|
|
158
|
+
return null
|
|
159
|
+
}
|
|
160
|
+
const text = await res.text().catch(() => '')
|
|
161
|
+
if (!text) {
|
|
162
|
+
return null
|
|
163
|
+
}
|
|
164
|
+
let payload: unknown
|
|
165
|
+
try {
|
|
166
|
+
payload = JSON.parse(text)
|
|
167
|
+
} catch {
|
|
168
|
+
return null
|
|
169
|
+
}
|
|
170
|
+
const user = (payload as { user?: { role?: unknown } } | null)?.user
|
|
171
|
+
const role = user?.role
|
|
172
|
+
if (typeof role === 'string') {
|
|
173
|
+
return role
|
|
174
|
+
.split(',')
|
|
175
|
+
.map((name) => name.trim())
|
|
176
|
+
.filter(Boolean)
|
|
177
|
+
}
|
|
178
|
+
if (Array.isArray(role)) {
|
|
179
|
+
return role.filter((name): name is string => typeof name === 'string')
|
|
180
|
+
}
|
|
181
|
+
// The session came back and carried a user, but no role field — that is a
|
|
182
|
+
// stage reporting "none", not a stage that cannot report.
|
|
183
|
+
return user ? [] : null
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** Start/continue the target agent's run over HTTP as this persona. */
|
|
141
187
|
private async agentRun(
|
|
142
188
|
agentName: string,
|
|
143
189
|
message: string,
|
|
@@ -165,13 +211,7 @@ export class HttpScenarioActor implements ScenarioActor {
|
|
|
165
211
|
return normalizeAgentReply(raw)
|
|
166
212
|
}
|
|
167
213
|
|
|
168
|
-
|
|
169
|
-
* POST an agent HTTP route (raw body, not RPC-wrapped). Signs in lazily: the
|
|
170
|
-
* first call goes out with whatever cookie we hold (none, for a no-auth
|
|
171
|
-
* agent), and only a 401 triggers `login()` + one retry. This lets an actor
|
|
172
|
-
* converse with a no-auth agent without any sign-in wiring, while still
|
|
173
|
-
* authenticating against agents that require a session.
|
|
174
|
-
*/
|
|
214
|
+
// knowledge: decisions/internals/scenario-agent-calls-sign-in-on-401-only.md
|
|
175
215
|
private async postAgent(subPath: string, body: unknown): Promise<unknown> {
|
|
176
216
|
const rpcPath = this.config.rpcPath ?? '/rpc'
|
|
177
217
|
const url = `${this.config.apiUrl}${rpcPath}/${subPath}`
|
|
@@ -224,22 +264,22 @@ export class HttpScenarioActor implements ScenarioActor {
|
|
|
224
264
|
method: 'POST',
|
|
225
265
|
headers: { 'content-type': 'application/json' },
|
|
226
266
|
body: JSON.stringify({
|
|
227
|
-
email: this.
|
|
228
|
-
name: this.
|
|
267
|
+
email: this.persona.email,
|
|
268
|
+
name: this.persona.name,
|
|
229
269
|
secret: this.config.secret,
|
|
230
270
|
}),
|
|
231
271
|
})
|
|
232
272
|
if (!res.ok) {
|
|
233
273
|
const body = (await res.text().catch(() => '')).slice(0, 300)
|
|
234
274
|
throw new Error(
|
|
235
|
-
`[scenario]
|
|
275
|
+
`[scenario] persona sign-in failed for '${this.name}' (${res.status}): ${body}`
|
|
236
276
|
)
|
|
237
277
|
}
|
|
238
278
|
// What proves a session was established is this response setting a cookie,
|
|
239
279
|
// not the jar being non-empty — the target may have set one earlier.
|
|
240
280
|
if (res.headers.getSetCookie().length === 0) {
|
|
241
281
|
throw new Error(
|
|
242
|
-
`[scenario]
|
|
282
|
+
`[scenario] persona sign-in for '${this.name}' returned no session cookie`
|
|
243
283
|
)
|
|
244
284
|
}
|
|
245
285
|
this.signedIn = true
|
|
@@ -269,15 +309,15 @@ function normalizeAgentReply(raw: unknown): TargetAgentReply {
|
|
|
269
309
|
}
|
|
270
310
|
|
|
271
311
|
/**
|
|
272
|
-
* Build the injected `
|
|
273
|
-
*
|
|
312
|
+
* Build the injected `personas` service from the declared personas: id → lazy
|
|
313
|
+
* HTTP persona. Wire the result as the `personas` singleton service.
|
|
274
314
|
*/
|
|
275
|
-
export function
|
|
276
|
-
config:
|
|
277
|
-
):
|
|
278
|
-
const
|
|
279
|
-
for (const [
|
|
280
|
-
|
|
315
|
+
export function createHttpPersonas(
|
|
316
|
+
config: HttpPersonasConfig
|
|
317
|
+
): ScenarioPersonas {
|
|
318
|
+
const personas: ScenarioPersonas = {}
|
|
319
|
+
for (const [id, persona] of Object.entries(config.personas)) {
|
|
320
|
+
personas[id] = new HttpPersona(id, persona, config)
|
|
281
321
|
}
|
|
282
|
-
return
|
|
322
|
+
return personas
|
|
283
323
|
}
|
|
@@ -5,19 +5,7 @@ import type {
|
|
|
5
5
|
} from '../wirings/queue/queue.types.js'
|
|
6
6
|
import { runQueueJob } from '../wirings/queue/queue-runner.js'
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
* In-process queue for local/dev runs. Schedules jobs on the macrotask queue
|
|
10
|
-
* (setTimeout) so dispatch is genuinely asynchronous — the same timing shape as
|
|
11
|
-
* a real queue — and redelivers a failed job up to `options.attempts` times with
|
|
12
|
-
* backoff, so a transiently-failing workflow step recovers exactly as it would
|
|
13
|
-
* on pg-boss/bullmq instead of being silently dropped on its first error.
|
|
14
|
-
*
|
|
15
|
-
* Payloads are JSON round-tripped on the way in, because every real backend
|
|
16
|
-
* puts the job on a wire (SQS body, Redis value, jsonb column) and the worker
|
|
17
|
-
* therefore never sees the caller's live object. Doing it here keeps dev
|
|
18
|
-
* behaviour honest, and keeps the callers — who cannot know which backend they
|
|
19
|
-
* are talking to — from having to serialise defensively.
|
|
20
|
-
*/
|
|
8
|
+
// knowledge: decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md
|
|
21
9
|
export class InMemoryQueueService implements QueueService {
|
|
22
10
|
readonly supportsResults = false
|
|
23
11
|
private jobCounter = 0
|
|
@@ -48,7 +36,6 @@ export class InMemoryQueueService implements QueueService {
|
|
|
48
36
|
await runQueueJob({ job })
|
|
49
37
|
} catch (e: any) {
|
|
50
38
|
if (attemptsMade < maxAttempts) {
|
|
51
|
-
// Transient failure — redeliver with backoff, mirroring a real queue.
|
|
52
39
|
setTimeout(
|
|
53
40
|
runAttempt,
|
|
54
41
|
this.backoffDelay(options?.backoff, attemptsMade)
|
|
@@ -68,7 +55,6 @@ export class InMemoryQueueService implements QueueService {
|
|
|
68
55
|
return jobId
|
|
69
56
|
}
|
|
70
57
|
|
|
71
|
-
/** Delay before the next redelivery, honoring the job's backoff policy. */
|
|
72
58
|
private backoffDelay(
|
|
73
59
|
backoff: JobOptions['backoff'],
|
|
74
60
|
attemptsMade: number
|
|
@@ -1,24 +1,7 @@
|
|
|
1
1
|
import { PikkuTriggerService } from '../wirings/trigger/pikku-trigger-service.js'
|
|
2
2
|
import { getSingletonServices } from '../pikku-state.js'
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
* In-memory TriggerService implementation.
|
|
6
|
-
*
|
|
7
|
-
* Reads both `wireTrigger` declarations and `wireTriggerSource` registrations
|
|
8
|
-
* from pikkuState. Only starts triggers that have both a declaration and a source.
|
|
9
|
-
* On fire, invokes target via `ContextAwareRPCService`.
|
|
10
|
-
*
|
|
11
|
-
* Single owner — one process runs triggers, no distributed claiming.
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const triggerService = new InMemoryTriggerService()
|
|
16
|
-
* await triggerService.start()
|
|
17
|
-
*
|
|
18
|
-
* // On shutdown
|
|
19
|
-
* await triggerService.stop()
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
4
|
+
// knowledge: decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md
|
|
22
5
|
export class InMemoryTriggerService extends PikkuTriggerService {
|
|
23
6
|
async start(): Promise<void> {
|
|
24
7
|
const singletonServices = getSingletonServices()
|