@pikku/core 0.12.71 → 0.12.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +848 -0
- package/dist/crypto-utils.d.ts +30 -5
- package/dist/crypto-utils.js +146 -41
- package/dist/dev/hot-reload.js +11 -30
- package/dist/dev/module-runner.d.ts +3 -7
- package/dist/dev/module-runner.js +4 -10
- package/dist/dev/reload-meta.d.ts +8 -20
- package/dist/dev/reload-meta.js +9 -29
- package/dist/errors/error-handler.d.ts +5 -30
- package/dist/errors/error-handler.js +16 -32
- package/dist/errors/errors.d.ts +32 -151
- package/dist/errors/errors.js +55 -157
- package/dist/function/abort-scope.d.ts +47 -0
- package/dist/function/abort-scope.js +63 -0
- package/dist/function/function-runner.js +40 -30
- package/dist/function/functions.types.d.ts +44 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/list.types.d.ts +12 -62
- package/dist/function/list.types.js +4 -25
- package/dist/handle-error.d.ts +0 -11
- package/dist/handle-error.js +6 -18
- package/dist/index.d.ts +5 -2
- package/dist/index.js +4 -1
- package/dist/middleware/auth-apikey.d.ts +3 -18
- package/dist/middleware/auth-apikey.js +0 -17
- package/dist/middleware/auth-bearer.d.ts +6 -41
- package/dist/middleware/auth-bearer.js +3 -40
- package/dist/middleware/auth-cookie.d.ts +5 -27
- package/dist/middleware/auth-cookie.js +2 -26
- package/dist/middleware/cors.d.ts +7 -34
- package/dist/middleware/cors.js +7 -34
- package/dist/middleware/remote-auth.d.ts +3 -1
- package/dist/middleware/remote-auth.js +3 -2
- package/dist/middleware/telemetry.d.ts +8 -33
- package/dist/middleware/telemetry.js +2 -31
- package/dist/middleware-runner.d.ts +4 -55
- package/dist/middleware-runner.js +5 -74
- package/dist/permissions.d.ts +3 -44
- package/dist/permissions.js +19 -71
- package/dist/pikku-request.d.ts +0 -6
- package/dist/pikku-request.js +0 -6
- package/dist/pikku-state.d.ts +0 -26
- package/dist/pikku-state.js +2 -30
- package/dist/remote.d.ts +3 -5
- package/dist/remote.js +8 -7
- package/dist/schema.d.ts +7 -17
- package/dist/schema.js +30 -18
- package/dist/scopes.d.ts +4 -23
- package/dist/scopes.js +7 -48
- package/dist/services/ai-agent-runner-service.d.ts +20 -0
- package/dist/services/ai-embedding-service.d.ts +2 -25
- package/dist/services/audit-service.js +1 -2
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/gateway-service.d.ts +0 -15
- package/dist/services/http-personas.d.ts +80 -0
- package/dist/services/http-personas.js +233 -0
- package/dist/services/in-memory-queue-service.d.ts +0 -14
- package/dist/services/in-memory-queue-service.js +1 -15
- package/dist/services/in-memory-trigger-service.d.ts +0 -18
- package/dist/services/in-memory-trigger-service.js +1 -18
- package/dist/services/in-memory-workflow-service.d.ts +0 -16
- package/dist/services/in-memory-workflow-service.js +4 -33
- package/dist/services/index.d.ts +5 -6
- package/dist/services/index.js +2 -5
- package/dist/services/istanbul-coverage-service.d.ts +1 -5
- package/dist/services/istanbul-coverage-service.js +2 -8
- package/dist/services/jwt-service.d.ts +1 -16
- package/dist/services/local-content.d.ts +13 -2
- package/dist/services/local-content.js +40 -13
- package/dist/services/local-gateway-service.d.ts +0 -16
- package/dist/services/local-gateway-service.js +2 -17
- package/dist/services/local-secrets.d.ts +0 -4
- package/dist/services/local-secrets.js +0 -4
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +2 -37
- package/dist/services/meta-service.d.ts +23 -26
- package/dist/services/meta-service.js +22 -36
- package/dist/services/personas-service.d.ts +134 -0
- package/dist/services/personas-service.js +40 -0
- package/dist/services/pikku-user-id.js +0 -4
- package/dist/services/queue-webhook-service.d.ts +2 -36
- package/dist/services/queue-webhook-service.js +9 -41
- package/dist/services/scheduler-service.d.ts +1 -50
- package/dist/services/scheduler-service.js +0 -10
- package/dist/services/schema-service.d.ts +1 -24
- package/dist/services/scope-service.d.ts +49 -34
- package/dist/services/scoped-secret-service.d.ts +0 -4
- package/dist/services/scoped-secret-service.js +0 -4
- package/dist/services/secret-host-binding.d.ts +8 -0
- package/dist/services/secret-host-binding.js +36 -0
- package/dist/services/secret-service.d.ts +5 -33
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +21 -0
- package/dist/services/stub-tracker.d.ts +7 -18
- package/dist/services/stub-tracker.js +8 -18
- package/dist/services/system-role-guard.d.ts +33 -0
- package/dist/services/system-role-guard.js +38 -0
- package/dist/services/trigger-service.d.ts +0 -12
- package/dist/services/typed-secret-service.d.ts +0 -7
- package/dist/services/typed-secret-service.js +1 -7
- package/dist/services/v8-coverage-service.d.ts +2 -3
- package/dist/services/v8-coverage-service.js +1 -2
- package/dist/services/variables-service.d.ts +1 -8
- package/dist/services/webhook-service.d.ts +19 -63
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +0 -17
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +99 -219
- package/dist/types/core.types.js +0 -42
- package/dist/types/state.types.d.ts +4 -9
- package/dist/utils/hmac.d.ts +4 -10
- package/dist/utils/hmac.js +4 -10
- package/dist/utils/safe-fetch.d.ts +7 -35
- package/dist/utils/safe-fetch.js +13 -53
- package/dist/utils.d.ts +1 -6
- package/dist/utils.js +6 -15
- package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
- package/dist/wirings/actor-flow/index.d.ts +0 -9
- package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
- package/dist/wirings/actor-flow/run-conversation.js +14 -7
- package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
- package/dist/wirings/ai-agent/ai-agent-agui.js +34 -12
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
- package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
- package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
- package/dist/wirings/ai-agent/ai-agent-prepare.js +58 -131
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +49 -20
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -4
- package/dist/wirings/ai-agent/index.d.ts +6 -4
- package/dist/wirings/ai-agent/index.js +5 -4
- package/dist/wirings/ai-agent/voice-input.d.ts +39 -1
- package/dist/wirings/ai-agent/voice-input.js +46 -3
- package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
- package/dist/wirings/ai-agent/voice-output.js +153 -50
- package/dist/wirings/channel/channel-common.d.ts +7 -20
- package/dist/wirings/channel/channel-common.js +7 -21
- package/dist/wirings/channel/channel-handler.js +25 -6
- package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
- package/dist/wirings/channel/channel-host-rpc.js +38 -0
- package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
- package/dist/wirings/channel/channel-middleware-runner.js +0 -12
- package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
- package/dist/wirings/channel/channel-rpc-registry.js +89 -0
- package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
- package/dist/wirings/channel/channel-rpc-responder.js +71 -0
- package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
- package/dist/wirings/channel/channel-rpc-service.js +106 -0
- package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
- package/dist/wirings/channel/channel-rpc-validators.js +30 -0
- package/dist/wirings/channel/channel-rpc.d.ts +5 -0
- package/dist/wirings/channel/channel-rpc.js +5 -0
- package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
- package/dist/wirings/channel/channel-rpc.types.js +50 -0
- package/dist/wirings/channel/channel-runner.d.ts +0 -4
- package/dist/wirings/channel/channel-runner.js +0 -14
- package/dist/wirings/channel/channel-store.d.ts +0 -10
- package/dist/wirings/channel/channel.types.d.ts +12 -1
- package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
- package/dist/wirings/channel/define-channel-routes.js +0 -20
- package/dist/wirings/channel/eventhub-service.d.ts +0 -18
- package/dist/wirings/channel/index.d.ts +4 -1
- package/dist/wirings/channel/index.js +2 -0
- package/dist/wirings/channel/local/local-channel-runner.js +3 -1
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
- package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
- package/dist/wirings/channel/log-channels.d.ts +0 -4
- package/dist/wirings/channel/log-channels.js +0 -4
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
- package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
- package/dist/wirings/cli/channel/cli-approval.js +81 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
- package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
- package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +20 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
- package/dist/wirings/cli/channel/index.d.ts +4 -0
- package/dist/wirings/cli/channel/index.js +2 -0
- package/dist/wirings/cli/cli-runner.d.ts +20 -20
- package/dist/wirings/cli/cli-runner.js +28 -89
- package/dist/wirings/cli/cli.types.d.ts +14 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -10
- package/dist/wirings/cli/command-parser.js +10 -87
- package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
- package/dist/wirings/cli/define-cli-commands.js +1 -17
- package/dist/wirings/credential/credential.types.d.ts +0 -12
- package/dist/wirings/credential/define-credential.d.ts +48 -0
- package/dist/wirings/credential/define-credential.js +47 -0
- package/dist/wirings/credential/index.d.ts +1 -1
- package/dist/wirings/credential/index.js +1 -1
- package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
- package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
- package/dist/wirings/gateway/gateway-runner.js +8 -105
- package/dist/wirings/gateway/gateway.types.d.ts +7 -80
- package/dist/wirings/http/http-routes.d.ts +0 -63
- package/dist/wirings/http/http-routes.js +0 -63
- package/dist/wirings/http/http-runner.d.ts +1 -100
- package/dist/wirings/http/http-runner.js +12 -166
- package/dist/wirings/http/http.types.d.ts +16 -55
- package/dist/wirings/http/index.d.ts +2 -1
- package/dist/wirings/http/index.js +1 -1
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +6 -36
- package/dist/wirings/http/pikku-fetch-http-request.js +56 -50
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +2 -0
- package/dist/wirings/mcp/mcp-runner.js +6 -16
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +28 -0
- package/dist/wirings/persona/define-personas.js +27 -0
- package/dist/wirings/persona/index.d.ts +21 -0
- package/dist/wirings/persona/index.js +17 -0
- package/dist/wirings/persona/persona-email.d.ts +37 -0
- package/dist/wirings/persona/persona-email.js +69 -0
- package/dist/wirings/persona/persona-environments.d.ts +45 -0
- package/dist/wirings/persona/persona-environments.js +81 -0
- package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
- package/dist/wirings/persona/persona-mailbox.js +53 -0
- package/dist/wirings/persona/persona.types.d.ts +125 -0
- package/dist/wirings/persona/persona.types.js +1 -0
- package/dist/wirings/persona/validate-personas.d.ts +53 -0
- package/dist/wirings/persona/validate-personas.js +94 -0
- package/dist/wirings/queue/index.d.ts +3 -0
- package/dist/wirings/queue/index.js +2 -3
- package/dist/wirings/queue/queue-identity.d.ts +28 -0
- package/dist/wirings/queue/queue-identity.js +102 -0
- package/dist/wirings/queue/queue-runner.d.ts +0 -19
- package/dist/wirings/queue/queue-runner.js +9 -30
- package/dist/wirings/queue/queue.types.d.ts +18 -89
- package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
- package/dist/wirings/queue/register-queue-helper.js +0 -11
- package/dist/wirings/queue/signed-queue-service.d.ts +16 -0
- package/dist/wirings/queue/signed-queue-service.js +42 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
- package/dist/wirings/queue/validate-worker-config.js +0 -14
- package/dist/wirings/role/define-system-role.d.ts +32 -0
- package/dist/wirings/role/define-system-role.js +31 -0
- package/dist/wirings/role/index.d.ts +3 -0
- package/dist/wirings/role/index.js +2 -0
- package/dist/wirings/role/role.types.d.ts +43 -0
- package/dist/wirings/role/role.types.js +1 -0
- package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
- package/dist/wirings/role/validate-role-definitions.js +71 -0
- package/dist/wirings/rpc/addon-runner.d.ts +0 -19
- package/dist/wirings/rpc/addon-runner.js +0 -51
- package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -12
- package/dist/wirings/rpc/remote-addon-auth.js +1 -9
- package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
- package/dist/wirings/rpc/rpc-runner.js +88 -105
- package/dist/wirings/rpc/rpc-types.d.ts +7 -6
- package/dist/wirings/rpc/wire-addon.d.ts +25 -0
- package/dist/wirings/rpc/wire-addon.js +62 -0
- package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
- package/dist/wirings/rpc/wire-remote-addon.js +0 -8
- package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
- package/dist/wirings/scheduler/log-schedulers.js +0 -4
- package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
- package/dist/wirings/scheduler/scheduler-runner.js +0 -1
- package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
- package/dist/wirings/scope/define-scope.d.ts +32 -0
- package/dist/wirings/scope/define-scope.js +31 -0
- package/dist/wirings/scope/index.d.ts +1 -1
- package/dist/wirings/scope/index.js +1 -1
- package/dist/wirings/scope/scope.types.d.ts +7 -9
- package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
- package/dist/wirings/scope/validate-scope-definitions.js +3 -21
- package/dist/wirings/secret/index.d.ts +1 -1
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +19 -15
- package/dist/wirings/secret/secret.types.js +1 -1
- package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
- package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
- package/dist/wirings/trigger/trigger-runner.js +1 -24
- package/dist/wirings/trigger/trigger.types.d.ts +1 -82
- package/dist/wirings/trigger/trigger.types.js +0 -34
- package/dist/wirings/variable/index.d.ts +1 -1
- package/dist/wirings/variable/index.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
- package/dist/wirings/variable/variable.types.d.ts +1 -13
- package/dist/wirings/variable/variable.types.js +1 -1
- package/dist/wirings/virtual-user/index.d.ts +27 -0
- package/dist/wirings/virtual-user/index.js +8 -0
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
- package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
- package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
- package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
- package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
- package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
- package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
- package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
- package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
- package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
- package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
- package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
- package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
- package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
- package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +5 -5
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
- package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
- package/dist/wirings/workflow/feature.d.ts +0 -19
- package/dist/wirings/workflow/feature.js +0 -19
- package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
- package/dist/wirings/workflow/graph/graph-node.js +0 -34
- package/dist/wirings/workflow/graph/graph-runner.js +6 -41
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
- package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
- package/dist/wirings/workflow/index.d.ts +5 -7
- package/dist/wirings/workflow/index.js +3 -17
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
- package/dist/wirings/workflow/pikku-scenario-service.js +204 -42
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
- package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
- package/dist/wirings/workflow/run-timeline.d.ts +0 -47
- package/dist/wirings/workflow/run-timeline.js +0 -22
- package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
- package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
- package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
- package/dist/wirings/workflow/scenario-poll.js +0 -12
- package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
- package/dist/wirings/workflow/scenario-prose.js +0 -18
- package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
- package/dist/wirings/workflow/scenario-step-guards.js +1 -14
- package/dist/wirings/workflow/scenario-step.types.d.ts +72 -6
- package/dist/wirings/workflow/scenario-step.types.js +5 -1
- package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
- package/dist/wirings/workflow/scenario-surface.js +56 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
- package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
- package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
- package/dist/wirings/workflow/workflow.types.d.ts +0 -197
- package/knowledge/decisions/index.md +19 -0
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
- package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
- package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
- package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
- package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
- package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
- package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
- package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
- package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
- package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
- package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
- package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
- package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
- package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
- package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
- package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
- package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +34 -0
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
- package/knowledge/decisions/internals/index.md +113 -0
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
- package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
- package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
- package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
- package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
- package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
- package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
- package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
- package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
- package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
- package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
- package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
- package/knowledge/decisions/security/index.md +55 -0
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
- package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
- package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
- package/knowledge/index.md +24 -0
- package/knowledge/questions/index.md +15 -0
- package/package.json +4 -2
- package/run-tests.sh +0 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +283 -55
- package/src/data-classification.ts +1 -7
- package/src/dev/hot-reload.test.ts +0 -4
- package/src/dev/hot-reload.ts +11 -30
- package/src/dev/module-runner.ts +7 -32
- package/src/dev/reload-meta.ts +9 -29
- package/src/errors/error-handler.ts +20 -35
- package/src/errors/error.test.ts +30 -1
- package/src/errors/errors.ts +73 -157
- package/src/function/abort-scope.test.ts +97 -0
- package/src/function/abort-scope.ts +80 -0
- package/src/function/function-runner.test.ts +75 -7
- package/src/function/function-runner.ts +73 -30
- package/src/function/functions.types.ts +56 -136
- package/src/function/list.types.test.ts +3 -25
- package/src/function/list.types.ts +12 -62
- package/src/gopass-secrets-removed.test.ts +51 -0
- package/src/handle-error.test.ts +108 -1
- package/src/handle-error.ts +8 -18
- package/src/index.ts +60 -1
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +0 -3
- package/src/middleware/auth-bearer.ts +3 -40
- package/src/middleware/auth-cookie.test.ts +0 -6
- package/src/middleware/auth-cookie.ts +2 -26
- package/src/middleware/cors.test.ts +34 -0
- package/src/middleware/cors.ts +12 -33
- package/src/middleware/remote-auth.test.ts +24 -9
- package/src/middleware/remote-auth.ts +10 -2
- package/src/middleware/telemetry.ts +2 -31
- package/src/middleware-runner.test.ts +0 -2
- package/src/middleware-runner.ts +5 -74
- package/src/permissions.test.ts +30 -0
- package/src/permissions.ts +24 -74
- package/src/pikku-request.ts +0 -6
- package/src/pikku-state.ts +2 -30
- package/src/production-barrels-stay-lean.test.ts +110 -0
- package/src/remote.test.ts +172 -0
- package/src/remote.ts +17 -7
- package/src/schema.test.ts +103 -0
- package/src/schema.ts +35 -18
- package/src/scopes.ts +7 -48
- package/src/services/ai-agent-runner-service.ts +20 -0
- package/src/services/ai-embedding-service.ts +3 -25
- package/src/services/audit-service.ts +1 -2
- package/src/services/content-service.ts +1 -46
- package/src/services/credential-service.ts +3 -40
- package/src/services/credential-wire-service.test.ts +0 -2
- package/src/services/deployment-service.ts +3 -9
- package/src/services/gateway-service.ts +0 -15
- package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
- package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
- package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
- package/src/services/in-memory-queue-service.ts +1 -15
- package/src/services/in-memory-trigger-service.ts +1 -18
- package/src/services/in-memory-workflow-service.test.ts +0 -13
- package/src/services/in-memory-workflow-service.ts +4 -38
- package/src/services/index.ts +20 -15
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content.test.ts +159 -27
- package/src/services/local-content.ts +55 -23
- package/src/services/local-gateway-service.ts +2 -17
- package/src/services/local-secrets.ts +0 -4
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +2 -37
- package/src/services/meta-service.test.ts +1 -5
- package/src/services/meta-service.ts +41 -61
- package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
- package/src/services/pikku-user-id.ts +0 -4
- package/src/services/queue-webhook-service.ts +9 -41
- package/src/services/scheduler-service.ts +1 -50
- package/src/services/schema-service.ts +1 -24
- package/src/services/scope-service.ts +50 -34
- package/src/services/scoped-secret-service.ts +0 -4
- package/src/services/secret-host-binding.test.ts +138 -0
- package/src/services/secret-host-binding.ts +51 -0
- package/src/services/secret-service.ts +5 -33
- package/src/services/secretless.test.ts +54 -0
- package/src/services/secretless.ts +29 -0
- package/src/services/stub-tracker.ts +8 -18
- package/src/services/system-role-guard.test.ts +93 -0
- package/src/services/system-role-guard.ts +71 -0
- package/src/services/trigger-service.ts +0 -12
- package/src/services/typed-secret-service.ts +1 -7
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +19 -63
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +0 -26
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +116 -229
- package/src/types/state.types.ts +7 -9
- package/src/utils/hmac.ts +4 -10
- package/src/utils/safe-fetch.ts +13 -54
- package/src/utils.test.ts +11 -2
- package/src/utils.ts +6 -15
- package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
- package/src/wirings/actor-flow/index.ts +0 -9
- package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
- package/src/wirings/actor-flow/run-conversation.ts +19 -12
- package/src/wirings/ai-agent/ai-agent-agui.test.ts +75 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +36 -17
- package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
- package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
- package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
- package/src/wirings/ai-agent/ai-agent-prepare.ts +82 -138
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
- package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
- package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
- package/src/wirings/ai-agent/ai-agent-runner.ts +67 -33
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
- package/src/wirings/ai-agent/index.ts +35 -3
- package/src/wirings/ai-agent/voice-input.test.ts +72 -7
- package/src/wirings/ai-agent/voice-input.ts +48 -3
- package/src/wirings/ai-agent/voice-output.test.ts +422 -0
- package/src/wirings/ai-agent/voice-output.ts +216 -56
- package/src/wirings/channel/channel-common.ts +15 -20
- package/src/wirings/channel/channel-handler.test.ts +50 -0
- package/src/wirings/channel/channel-handler.ts +32 -11
- package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
- package/src/wirings/channel/channel-host-rpc.ts +69 -0
- package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
- package/src/wirings/channel/channel-middleware-runner.ts +0 -12
- package/src/wirings/channel/channel-rpc-registry.ts +116 -0
- package/src/wirings/channel/channel-rpc-responder.ts +117 -0
- package/src/wirings/channel/channel-rpc-service.ts +146 -0
- package/src/wirings/channel/channel-rpc-validators.ts +65 -0
- package/src/wirings/channel/channel-rpc.test.ts +820 -0
- package/src/wirings/channel/channel-rpc.ts +5 -0
- package/src/wirings/channel/channel-rpc.types.ts +150 -0
- package/src/wirings/channel/channel-runner.ts +0 -14
- package/src/wirings/channel/channel-store.ts +0 -10
- package/src/wirings/channel/channel.types.ts +19 -8
- package/src/wirings/channel/define-channel-routes.ts +0 -20
- package/src/wirings/channel/eventhub-service.ts +0 -18
- package/src/wirings/channel/index.ts +35 -0
- package/src/wirings/channel/local/local-channel-handler.ts +3 -1
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
- package/src/wirings/channel/local/local-channel-runner.ts +3 -1
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
- package/src/wirings/channel/log-channels.ts +0 -4
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
- package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
- package/src/wirings/cli/channel/cli-approval.ts +135 -0
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
- package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
- package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
- package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
- package/src/wirings/cli/channel/cli-raw-client-runner.ts +155 -0
- package/src/wirings/cli/channel/index.ts +9 -0
- package/src/wirings/cli/cli-runner.test.ts +0 -1
- package/src/wirings/cli/cli-runner.ts +46 -88
- package/src/wirings/cli/cli.types.ts +14 -3
- package/src/wirings/cli/command-parser.test.ts +0 -4
- package/src/wirings/cli/command-parser.ts +11 -91
- package/src/wirings/cli/define-cli-commands.ts +1 -17
- package/src/wirings/credential/credential.types.ts +0 -12
- package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
- package/src/wirings/credential/index.ts +1 -1
- package/src/wirings/credential/validate-credential-definitions.ts +2 -4
- package/src/wirings/gateway/gateway-runner.test.ts +1 -21
- package/src/wirings/gateway/gateway-runner.ts +8 -110
- package/src/wirings/gateway/gateway.types.ts +7 -80
- package/src/wirings/http/http-routes.test.ts +0 -3
- package/src/wirings/http/http-routes.ts +0 -86
- package/src/wirings/http/http-runner.test.ts +0 -1
- package/src/wirings/http/http-runner.ts +12 -168
- package/src/wirings/http/http.types.ts +17 -62
- package/src/wirings/http/index.ts +5 -1
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +88 -7
- package/src/wirings/http/pikku-fetch-http-request.ts +74 -50
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.test.ts +40 -0
- package/src/wirings/mcp/mcp-runner.ts +9 -15
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +29 -0
- package/src/wirings/persona/index.ts +62 -0
- package/src/wirings/persona/persona-email.ts +87 -0
- package/src/wirings/persona/persona-environments.test.ts +183 -0
- package/src/wirings/persona/persona-environments.ts +138 -0
- package/src/wirings/persona/persona-mailbox.ts +156 -0
- package/src/wirings/persona/persona.test.ts +220 -0
- package/src/wirings/persona/persona.types.ts +131 -0
- package/src/wirings/persona/validate-personas.ts +133 -0
- package/src/wirings/queue/index.ts +13 -3
- package/src/wirings/queue/queue-identity.test.ts +453 -0
- package/src/wirings/queue/queue-identity.ts +173 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +19 -89
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +59 -0
- package/src/wirings/queue/validate-worker-config.ts +2 -28
- package/src/wirings/role/define-system-role.ts +33 -0
- package/src/wirings/role/index.ts +13 -0
- package/src/wirings/role/role.test.ts +104 -0
- package/src/wirings/role/role.types.ts +47 -0
- package/src/wirings/role/validate-role-definitions.ts +93 -0
- package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
- package/src/wirings/rpc/addon-runner.ts +0 -56
- package/src/wirings/rpc/addon-scopes.test.ts +225 -0
- package/src/wirings/rpc/remote-addon-auth.ts +1 -13
- package/src/wirings/rpc/rpc-runner.test.ts +186 -2
- package/src/wirings/rpc/rpc-runner.ts +145 -127
- package/src/wirings/rpc/rpc-types.ts +11 -6
- package/src/wirings/rpc/wire-addon.test.ts +43 -1
- package/src/wirings/rpc/wire-addon.ts +99 -0
- package/src/wirings/rpc/wire-remote-addon.ts +9 -29
- package/src/wirings/scheduler/log-schedulers.ts +0 -4
- package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
- package/src/wirings/scheduler/scheduler-runner.ts +0 -2
- package/src/wirings/scheduler/scheduler.types.ts +1 -14
- package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
- package/src/wirings/scope/index.ts +1 -1
- package/src/wirings/scope/scope.test.ts +1 -2
- package/src/wirings/scope/scope.types.ts +7 -9
- package/src/wirings/scope/validate-scope-definitions.ts +3 -21
- package/src/wirings/secret/index.ts +1 -1
- package/src/wirings/secret/secret.types.ts +19 -15
- package/src/wirings/secret/validate-secret-definitions.ts +2 -4
- package/src/wirings/trigger/trigger-runner.ts +1 -27
- package/src/wirings/trigger/trigger.types.ts +1 -82
- package/src/wirings/variable/index.ts +1 -1
- package/src/wirings/variable/validate-variable-definitions.ts +2 -4
- package/src/wirings/variable/variable.types.ts +1 -13
- package/src/wirings/virtual-user/index.ts +76 -0
- package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
- package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
- package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
- package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
- package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
- package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
- package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
- package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
- package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
- package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
- package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
- package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
- package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
- package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
- package/src/wirings/workflow/feature.ts +0 -19
- package/src/wirings/workflow/graph/graph-node.ts +0 -136
- package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
- package/src/wirings/workflow/graph/graph-runner.ts +6 -41
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
- package/src/wirings/workflow/index.ts +10 -44
- package/src/wirings/workflow/pikku-scenario-service.ts +235 -52
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
- package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
- package/src/wirings/workflow/run-timeline.test.ts +7 -19
- package/src/wirings/workflow/run-timeline.ts +0 -56
- package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
- package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
- package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
- package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
- package/src/wirings/workflow/scenario-poll.test.ts +0 -2
- package/src/wirings/workflow/scenario-poll.ts +0 -15
- package/src/wirings/workflow/scenario-prose.ts +0 -28
- package/src/wirings/workflow/scenario-service.test.ts +2 -9
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +159 -14
- package/src/wirings/workflow/scenario-step.types.ts +82 -6
- package/src/wirings/workflow/scenario-surface.test.ts +145 -0
- package/src/wirings/workflow/scenario-surface.ts +71 -0
- package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
- package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
- package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
- package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
- package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
- package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
- package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
- package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
- package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
- package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
- package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
- package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
- package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
- package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
- package/src/wirings/workflow/workflow.types.ts +0 -203
- package/tsconfig.tsbuildinfo +1 -1
- package/src/middleware/timeout.ts +0 -22
- package/src/pikku-response.ts +0 -5
- package/src/services/gopass-secrets.ts +0 -78
- package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
- package/src/wirings/workflow/dsl/index.ts +0 -36
- package/src/wirings/workflow/graph/index.ts +0 -15
|
@@ -12,7 +12,7 @@ import type {
|
|
|
12
12
|
CorePikkuFunctionSessionless,
|
|
13
13
|
} from '../../function/functions.types.js'
|
|
14
14
|
import { getErrorResponse } from '../../errors/error-handler.js'
|
|
15
|
-
import {
|
|
15
|
+
import { isProduction } from '../../env.js'
|
|
16
16
|
import {
|
|
17
17
|
pikkuState,
|
|
18
18
|
getSingletonServices,
|
|
@@ -35,6 +35,8 @@ export class MCPError extends Error {
|
|
|
35
35
|
|
|
36
36
|
export type RunMCPEndpointParams<Tools extends string = any> = {
|
|
37
37
|
mcp?: PikkuMCP<Tools>
|
|
38
|
+
/** Defaults to enabled outside production. */
|
|
39
|
+
exposeErrors?: boolean
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
export type JsonRpcError = {
|
|
@@ -106,13 +108,11 @@ export async function runMCPResource(
|
|
|
106
108
|
pikkuFuncId = metas[uri]?.pikkuFuncId
|
|
107
109
|
} else {
|
|
108
110
|
for (const [uriTemplate, value] of endpoints.entries()) {
|
|
109
|
-
// Extract parameter names from the template
|
|
110
111
|
const paramNames = Array.from(
|
|
111
112
|
uriTemplate.matchAll(/\{([^}]+)\}/g),
|
|
112
113
|
(m) => m[1]
|
|
113
114
|
)
|
|
114
115
|
|
|
115
|
-
// Create regex pattern to match and capture parameter values
|
|
116
116
|
const regexPattern = uriTemplate.replace(/\{[^}]+\}/g, '([^/]+)')
|
|
117
117
|
const regex = new RegExp(`^${regexPattern}$`)
|
|
118
118
|
const match = uri.match(regex)
|
|
@@ -121,7 +121,6 @@ export async function runMCPResource(
|
|
|
121
121
|
endpoint = value
|
|
122
122
|
pikkuFuncId = metas[uriTemplate]?.pikkuFuncId
|
|
123
123
|
|
|
124
|
-
// Extract parameter values and create params object
|
|
125
124
|
for (let i = 0; i < paramNames.length; i++) {
|
|
126
125
|
extractedParams[paramNames[i]!] = match[i + 1]! // match[0] is the full match
|
|
127
126
|
}
|
|
@@ -178,20 +177,16 @@ export async function runMCPPrompt(
|
|
|
178
177
|
)
|
|
179
178
|
}
|
|
180
179
|
|
|
181
|
-
/**
|
|
182
|
-
* JSON-RPC 2.0 compatible MCP endpoint runner
|
|
183
|
-
*/
|
|
184
180
|
async function runMCPPikkuFunc(
|
|
185
181
|
request: JsonRpcRequest,
|
|
186
182
|
type: 'resource' | 'tool' | 'prompt',
|
|
187
183
|
name: string,
|
|
188
184
|
mcp: CoreMCPResource | CoreMCPPrompt | undefined,
|
|
189
185
|
pikkuFuncId: string | undefined,
|
|
190
|
-
{ mcp: mcpWire }: RunMCPEndpointParams
|
|
186
|
+
{ mcp: mcpWire, exposeErrors = !isProduction() }: RunMCPEndpointParams
|
|
191
187
|
): Promise<JsonRpcResponse> {
|
|
192
188
|
const singletonServices = getSingletonServices()
|
|
193
189
|
const createWireServices = getCreateWireServices()
|
|
194
|
-
let wireServices: any
|
|
195
190
|
|
|
196
191
|
try {
|
|
197
192
|
if (request.jsonrpc !== '2.0') {
|
|
@@ -231,7 +226,6 @@ async function runMCPPikkuFunc(
|
|
|
231
226
|
meta = pikkuState(null, 'mcp', 'promptsMeta')[name]
|
|
232
227
|
}
|
|
233
228
|
|
|
234
|
-
// Resolve namespaced function IDs (e.g., 'swaggerPetstore:findPetsByStatus')
|
|
235
229
|
let resolvedFuncName = pikkuFuncId
|
|
236
230
|
let resolvedPackageName: string | null = meta?.packageName ?? null
|
|
237
231
|
if (pikkuFuncId.includes(':')) {
|
|
@@ -289,13 +283,13 @@ async function runMCPPikkuFunc(
|
|
|
289
283
|
id: request.id,
|
|
290
284
|
code: -32603,
|
|
291
285
|
message: 'Internal error',
|
|
292
|
-
|
|
286
|
+
// knowledge: decisions/security/mcp-internal-error-details-are-double-gated-on-production.md
|
|
287
|
+
data:
|
|
288
|
+
exposeErrors && !isProduction() && e instanceof Error
|
|
289
|
+
? { message: e.message, stack: e.stack }
|
|
290
|
+
: undefined,
|
|
293
291
|
})
|
|
294
292
|
}
|
|
295
|
-
} finally {
|
|
296
|
-
if (wireServices) {
|
|
297
|
-
await closeWireServices(singletonServices.logger, wireServices)
|
|
298
|
-
}
|
|
299
293
|
}
|
|
300
294
|
}
|
|
301
295
|
|
|
@@ -8,10 +8,7 @@ import type {
|
|
|
8
8
|
MiddlewareMetadata,
|
|
9
9
|
} from '../../types/core.types.js'
|
|
10
10
|
|
|
11
|
-
/**
|
|
12
|
-
* Extract URI parameters from MCP resource URI template.
|
|
13
|
-
* E.g., "user/{userId}/post/{postId}" => "userId" | "postId"
|
|
14
|
-
*/
|
|
11
|
+
/** "user/{userId}/post/{postId}" => "userId" | "postId" */
|
|
15
12
|
type ExtractMCPURIParams<S extends string> =
|
|
16
13
|
S extends `${string}{${infer Param}}/${infer Rest}`
|
|
17
14
|
? Param | ExtractMCPURIParams<Rest>
|
|
@@ -19,10 +16,7 @@ type ExtractMCPURIParams<S extends string> =
|
|
|
19
16
|
? Param
|
|
20
17
|
: never
|
|
21
18
|
|
|
22
|
-
/**
|
|
23
|
-
* Type-level assertion that MCP resource URI parameters are present in the input type.
|
|
24
|
-
* This ensures compile-time safety for URI parameter validation.
|
|
25
|
-
*/
|
|
19
|
+
/** Resolves to a tuple of error strings, not `never`, so the mismatch surfaces in the type error. */
|
|
26
20
|
export type AssertMCPResourceURIParams<In, URI extends string> =
|
|
27
21
|
ExtractMCPURIParams<URI> extends keyof In
|
|
28
22
|
? unknown
|
|
@@ -34,7 +28,6 @@ export type AssertMCPResourceURIParams<In, URI extends string> =
|
|
|
34
28
|
]
|
|
35
29
|
|
|
36
30
|
export type PikkuMCP<Tools extends string = any> = {
|
|
37
|
-
// elicitInput: <Input>(message: string) => Promise<{ action: string, content: Input }>
|
|
38
31
|
uri?: string
|
|
39
32
|
sendResourceUpdated: (uri: string) => void
|
|
40
33
|
enableResources: (resources: Record<string, boolean>) => Promise<boolean>
|
|
@@ -42,35 +35,26 @@ export type PikkuMCP<Tools extends string = any> = {
|
|
|
42
35
|
enableTools: (tools: Record<Tools, boolean>) => Promise<boolean>
|
|
43
36
|
}
|
|
44
37
|
|
|
45
|
-
/**
|
|
46
|
-
* Represents metadata for MCP resources, including name, description, and documentation.
|
|
47
|
-
*/
|
|
48
38
|
export type MCPResourceMeta = Record<
|
|
49
39
|
string,
|
|
50
40
|
Omit<CoreMCPResource, 'func' | 'middleware'> & {
|
|
51
41
|
pikkuFuncId: string
|
|
52
42
|
inputSchema: string | null
|
|
53
43
|
outputSchema: string | null
|
|
54
|
-
middleware?: MiddlewareMetadata[] //
|
|
44
|
+
middleware?: MiddlewareMetadata[] // tag + explicit, already merged
|
|
55
45
|
}
|
|
56
46
|
>
|
|
57
47
|
|
|
58
|
-
/**
|
|
59
|
-
* Represents metadata for MCP tools, including name, description, and documentation.
|
|
60
|
-
*/
|
|
61
48
|
export type MCPToolMeta = Record<
|
|
62
49
|
string,
|
|
63
50
|
Omit<CoreMCPTool, 'func' | 'middleware'> & {
|
|
64
51
|
pikkuFuncId: string
|
|
65
52
|
inputSchema: string | null
|
|
66
53
|
outputSchema: string | null
|
|
67
|
-
middleware?: MiddlewareMetadata[] //
|
|
54
|
+
middleware?: MiddlewareMetadata[] // tag + explicit, already merged
|
|
68
55
|
}
|
|
69
56
|
>
|
|
70
57
|
|
|
71
|
-
/**
|
|
72
|
-
* Represents metadata for MCP prompts, including name, description, and arguments.
|
|
73
|
-
*/
|
|
74
58
|
export type MCPPromptMeta = Record<
|
|
75
59
|
string,
|
|
76
60
|
Omit<CoreMCPPrompt, 'func' | 'middleware'> & {
|
|
@@ -82,13 +66,10 @@ export type MCPPromptMeta = Record<
|
|
|
82
66
|
description: string
|
|
83
67
|
required: boolean
|
|
84
68
|
}>
|
|
85
|
-
middleware?: MiddlewareMetadata[] //
|
|
69
|
+
middleware?: MiddlewareMetadata[] // tag + explicit, already merged
|
|
86
70
|
}
|
|
87
71
|
>
|
|
88
72
|
|
|
89
|
-
/**
|
|
90
|
-
* Represents an MCP resource with specific properties.
|
|
91
|
-
*/
|
|
92
73
|
export type CoreMCPResource<
|
|
93
74
|
PikkuFunctionConfig = CorePikkuFunctionConfig<
|
|
94
75
|
CorePikkuFunctionSessionless<any, any>
|
|
@@ -109,9 +90,6 @@ export type CoreMCPResource<
|
|
|
109
90
|
middleware?: PikkuMiddleware[]
|
|
110
91
|
}
|
|
111
92
|
|
|
112
|
-
/**
|
|
113
|
-
* Represents an MCP tool with specific properties.
|
|
114
|
-
*/
|
|
115
93
|
export type CoreMCPTool<
|
|
116
94
|
PikkuFunctionConfig = CorePikkuFunctionConfig<
|
|
117
95
|
CorePikkuFunctionSessionless<any, any>
|
|
@@ -130,9 +108,6 @@ export type CoreMCPTool<
|
|
|
130
108
|
middleware?: PikkuMiddleware[]
|
|
131
109
|
}
|
|
132
110
|
|
|
133
|
-
/**
|
|
134
|
-
* Represents an MCP prompt with specific properties.
|
|
135
|
-
*/
|
|
136
111
|
export type CoreMCPPrompt<
|
|
137
112
|
PikkuFunctionConfig = CorePikkuFunctionConfig<
|
|
138
113
|
CorePikkuFunctionSessionless<any, MCPPromptResponse>
|
|
@@ -167,21 +142,15 @@ export type JsonRpcErrorResponse = {
|
|
|
167
142
|
data?: any
|
|
168
143
|
}
|
|
169
144
|
|
|
170
|
-
/**
|
|
171
|
-
* Represents a message in an MCP prompt response
|
|
172
|
-
*/
|
|
173
145
|
export type MCPPromptMessage = {
|
|
174
146
|
role: 'user' | 'assistant' | 'system'
|
|
175
147
|
content: {
|
|
176
148
|
type: 'text' | 'image'
|
|
177
149
|
text: string
|
|
178
|
-
data?: string
|
|
150
|
+
data?: string
|
|
179
151
|
}
|
|
180
152
|
}
|
|
181
153
|
|
|
182
|
-
/**
|
|
183
|
-
* Standard response type for MCP prompts - array of messages
|
|
184
|
-
*/
|
|
185
154
|
export type MCPPromptResponse = MCPPromptMessage[]
|
|
186
155
|
|
|
187
156
|
export type MCPResourceMessage = {
|
|
@@ -191,10 +160,6 @@ export type MCPResourceMessage = {
|
|
|
191
160
|
|
|
192
161
|
export type MCPResourceResponse = MCPResourceMessage[]
|
|
193
162
|
|
|
194
|
-
/**
|
|
195
|
-
* Standard response type for MCP prompts - array of messages
|
|
196
|
-
*/
|
|
197
|
-
|
|
198
163
|
export type MCPToolMessage =
|
|
199
164
|
| {
|
|
200
165
|
type: 'text'
|
|
@@ -202,7 +167,7 @@ export type MCPToolMessage =
|
|
|
202
167
|
}
|
|
203
168
|
| {
|
|
204
169
|
type: 'image'
|
|
205
|
-
data: string // base64
|
|
170
|
+
data: string // base64
|
|
206
171
|
}
|
|
207
172
|
|
|
208
173
|
export type MCPToolResponse = MCPToolMessage[]
|
|
@@ -1,19 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OAuth2 credential and token types.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* App credentials for OAuth2 (client ID and secret).
|
|
7
|
-
* These are typically set once and stored in the secret service.
|
|
8
|
-
*/
|
|
9
1
|
export type OAuth2AppCredential = {
|
|
10
2
|
clientId: string
|
|
11
3
|
clientSecret?: string // Optional for PKCE flows
|
|
12
4
|
}
|
|
13
5
|
|
|
14
|
-
/**
|
|
15
|
-
* OAuth2 token data returned from token endpoint.
|
|
16
|
-
*/
|
|
17
6
|
export type OAuth2Token = {
|
|
18
7
|
accessToken: string
|
|
19
8
|
refreshToken?: string
|
|
@@ -21,22 +10,3 @@ export type OAuth2Token = {
|
|
|
21
10
|
tokenType: string
|
|
22
11
|
scope?: string
|
|
23
12
|
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* OAuth2-specific configuration that extends a credential.
|
|
27
|
-
* This is stored in SecretDefinitionMeta.oauth2 field.
|
|
28
|
-
*/
|
|
29
|
-
export type OAuth2Config = {
|
|
30
|
-
/** Where access/refresh tokens are stored */
|
|
31
|
-
tokenSecretId: string
|
|
32
|
-
/** OAuth2 authorization URL */
|
|
33
|
-
authorizationUrl: string
|
|
34
|
-
/** OAuth2 token exchange URL */
|
|
35
|
-
tokenUrl: string
|
|
36
|
-
/** Required scopes */
|
|
37
|
-
scopes: string[]
|
|
38
|
-
/** Use PKCE flow */
|
|
39
|
-
pkce?: boolean
|
|
40
|
-
/** Additional query parameters for authorization URL */
|
|
41
|
-
additionalParams?: Record<string, string>
|
|
42
|
-
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { CorePersonas } from './persona.types.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* No-op function for declaring personas.
|
|
5
|
+
* This exists purely for TypeScript type checking and will be tree-shaken.
|
|
6
|
+
* The CLI extracts metadata via AST parsing and generates a `PersonaId` union
|
|
7
|
+
* and a `personas.gen.json` the console and `pikku persona run` read off disk —
|
|
8
|
+
* describing, listing or running one never has to load the app.
|
|
9
|
+
*
|
|
10
|
+
* `definePersonas` rather than `defineVirtualUsers` because declaring is not
|
|
11
|
+
* running: a persona that exists only to be acted upon (the account an admin
|
|
12
|
+
* bans, the colleague a document is shared with) is seeded and never run.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* definePersonas({
|
|
17
|
+
* susan: {
|
|
18
|
+
* name: 'Susan',
|
|
19
|
+
* jobTitle: 'Buys for a small café',
|
|
20
|
+
* roles: ['buyer'],
|
|
21
|
+
* personality: 'Hunts cheap deals. Tries three coupon codes before giving up.',
|
|
22
|
+
* goals: ['Get the weekly order in under five minutes'],
|
|
23
|
+
* disposition: 'careless',
|
|
24
|
+
* account: {},
|
|
25
|
+
* },
|
|
26
|
+
* })
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const definePersonas = (_config: CorePersonas): void => {}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export { definePersonas } from './define-personas.js'
|
|
2
|
+
export {
|
|
3
|
+
isRunnablePersona,
|
|
4
|
+
roleMismatchMessage,
|
|
5
|
+
runnablePersonas,
|
|
6
|
+
validateAndBuildPersonasMeta,
|
|
7
|
+
verifyPersonaRoles,
|
|
8
|
+
} from './validate-personas.js'
|
|
9
|
+
export type { RoleVerification } from './validate-personas.js'
|
|
10
|
+
export {
|
|
11
|
+
personaEnvironmentErrors,
|
|
12
|
+
personaEnvironmentRefusal,
|
|
13
|
+
resolvePersonaEnvironments,
|
|
14
|
+
} from './persona-environments.js'
|
|
15
|
+
export type {
|
|
16
|
+
PersonaEnvironment,
|
|
17
|
+
PersonaEnvironmentSubject,
|
|
18
|
+
} from './persona-environments.js'
|
|
19
|
+
export {
|
|
20
|
+
personaEmail,
|
|
21
|
+
personaEmailLabel,
|
|
22
|
+
personaEmails,
|
|
23
|
+
} from './persona-email.js'
|
|
24
|
+
export {
|
|
25
|
+
allowedLinks,
|
|
26
|
+
applyMailboxAllowlist,
|
|
27
|
+
isAllowedSender,
|
|
28
|
+
} from './persona-mailbox.js'
|
|
29
|
+
export type {
|
|
30
|
+
MailboxAllowlist,
|
|
31
|
+
PersonaMailbox,
|
|
32
|
+
ReceivedEmail,
|
|
33
|
+
} from './persona-mailbox.js'
|
|
34
|
+
export type {
|
|
35
|
+
CorePersona,
|
|
36
|
+
CorePersonaAccount,
|
|
37
|
+
CorePersonas,
|
|
38
|
+
PersonaAccountMeta,
|
|
39
|
+
PersonaDefinitions,
|
|
40
|
+
PersonaMeta,
|
|
41
|
+
PersonasMeta,
|
|
42
|
+
} from './persona.types.js'
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Signing in as a persona and talking to a stage over HTTP.
|
|
46
|
+
*
|
|
47
|
+
* Deliberately reached through this entry point rather than `@pikku/core/services`.
|
|
48
|
+
* `HttpPersona` pulls in the actor-flow conversation runner and, through it, the
|
|
49
|
+
* agent runner — none of which a production server has any use for. Exporting it
|
|
50
|
+
* from the services barrel put that chain in the module graph of every app that
|
|
51
|
+
* imports services, which only a bundler could remove and an unbundled Node or
|
|
52
|
+
* Lambda deploy would load outright.
|
|
53
|
+
*/
|
|
54
|
+
export {
|
|
55
|
+
HttpPersona,
|
|
56
|
+
createHttpPersonas,
|
|
57
|
+
type HttpPersonasConfig,
|
|
58
|
+
} from '../../services/http-personas.js'
|
|
59
|
+
export {
|
|
60
|
+
postScenarioJson,
|
|
61
|
+
readScenarioHttpResponse,
|
|
62
|
+
} from '../../services/personas-service.js'
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A persona's email address is computed, never declared.
|
|
3
|
+
*
|
|
4
|
+
* A persona that cannot read its own email cannot complete sign-up, magic
|
|
5
|
+
* links, invites or password resets — which are most of the flows worth
|
|
6
|
+
* exercising. So addresses are real and deliverable against a domain the stage
|
|
7
|
+
* actually receives mail on, rather than a synthetic `.local` dead end.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const LABEL = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Lower-cases and strips a persona id down to something an address can carry.
|
|
14
|
+
*
|
|
15
|
+
* Personas are declared as object keys, so they are already identifier-shaped;
|
|
16
|
+
* this exists for the ones that are not (`'susan.buyer'`, `'Susan_2'`) rather
|
|
17
|
+
* than to permit arbitrary input.
|
|
18
|
+
*/
|
|
19
|
+
export const personaEmailLabel = (personaId: string): string => {
|
|
20
|
+
const label = personaId
|
|
21
|
+
.toLowerCase()
|
|
22
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
23
|
+
.replace(/^-+|-+$/g, '')
|
|
24
|
+
if (!LABEL.test(label)) {
|
|
25
|
+
throw new Error(
|
|
26
|
+
`Persona '${personaId}' has no usable email label. A persona id must contain at least one letter or digit.`
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
return label
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The address a persona reads mail at during a run.
|
|
34
|
+
*
|
|
35
|
+
* The `runId` suffix is not decoration. Without it two concurrent runs share an
|
|
36
|
+
* inbox *and* a user row, and run B reads run A's magic link. Sub-addressing
|
|
37
|
+
* also buys isolation for free: a different address is a different account in
|
|
38
|
+
* the app, so two runs cannot collide on sign-up either.
|
|
39
|
+
*
|
|
40
|
+
* Omitting `runId` gives the bare form, which is what a seeded fixture that has
|
|
41
|
+
* to stay stable across runs wants.
|
|
42
|
+
*/
|
|
43
|
+
export const personaEmail = (
|
|
44
|
+
personaId: string,
|
|
45
|
+
domain: string,
|
|
46
|
+
runId?: string
|
|
47
|
+
): string => {
|
|
48
|
+
const label = personaEmailLabel(personaId)
|
|
49
|
+
const cleanDomain = domain.trim().toLowerCase().replace(/^@/, '')
|
|
50
|
+
if (!cleanDomain || cleanDomain.includes('@') || !cleanDomain.includes('.')) {
|
|
51
|
+
throw new Error(
|
|
52
|
+
`Persona email domain '${domain}' is not a domain. Set it to a domain the stage actually receives mail on.`
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
const suffix = runId ? `+${personaEmailLabel(runId)}` : ''
|
|
56
|
+
return `${label}${suffix}@${cleanDomain}`
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Every address in a run, keyed by persona.
|
|
61
|
+
*
|
|
62
|
+
* All of a persona's logins share one address. That is not a simplification:
|
|
63
|
+
* better-auth keeps `email` on the `user` and defaults `allowDifferentEmails`
|
|
64
|
+
* to false, so giving a linked account its own address would have the library
|
|
65
|
+
* under test refuse to link the very thing the persona declared as linked.
|
|
66
|
+
*/
|
|
67
|
+
export const personaEmails = (
|
|
68
|
+
personaIds: readonly string[],
|
|
69
|
+
domain: string,
|
|
70
|
+
runId?: string
|
|
71
|
+
): Record<string, string> => {
|
|
72
|
+
const emails: Record<string, string> = {}
|
|
73
|
+
const seen = new Map<string, string>()
|
|
74
|
+
for (const id of personaIds) {
|
|
75
|
+
const address = personaEmail(id, domain, runId)
|
|
76
|
+
const collidesWith = seen.get(address)
|
|
77
|
+
if (collidesWith !== undefined) {
|
|
78
|
+
throw new Error(
|
|
79
|
+
`Personas '${collidesWith}' and '${id}' both compute the address ${address}. ` +
|
|
80
|
+
`They would share a user row and read each other's email.`
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
seen.set(address, id)
|
|
84
|
+
emails[id] = address
|
|
85
|
+
}
|
|
86
|
+
return emails
|
|
87
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import assert from 'node:assert/strict'
|
|
2
|
+
import { describe, test } from 'node:test'
|
|
3
|
+
import {
|
|
4
|
+
personaEnvironmentErrors,
|
|
5
|
+
personaEnvironmentRefusal,
|
|
6
|
+
resolvePersonaEnvironments,
|
|
7
|
+
} from './persona-environments.js'
|
|
8
|
+
|
|
9
|
+
const ENVIRONMENTS = {
|
|
10
|
+
local: {},
|
|
11
|
+
staging: {},
|
|
12
|
+
prod: { production: true },
|
|
13
|
+
'eu-prod': { production: true },
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe('resolvePersonaEnvironments', () => {
|
|
17
|
+
// The default that makes production opt-in: a persona nobody thought about
|
|
18
|
+
// runs everywhere it is harmless and nowhere it is not.
|
|
19
|
+
test('omitting environments means everywhere but production', () => {
|
|
20
|
+
assert.deepEqual(resolvePersonaEnvironments({}, ENVIRONMENTS), [
|
|
21
|
+
'local',
|
|
22
|
+
'staging',
|
|
23
|
+
])
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
test('a declared list is taken verbatim, production included', () => {
|
|
27
|
+
assert.deepEqual(
|
|
28
|
+
resolvePersonaEnvironments(
|
|
29
|
+
{ disposition: 'accountable', environments: ['staging', 'prod'] },
|
|
30
|
+
ENVIRONMENTS
|
|
31
|
+
),
|
|
32
|
+
['staging', 'prod']
|
|
33
|
+
)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test('more than one environment can be production', () => {
|
|
37
|
+
assert.deepEqual(
|
|
38
|
+
resolvePersonaEnvironments({}, { a: {}, b: { production: true } }),
|
|
39
|
+
['a']
|
|
40
|
+
)
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
describe('personaEnvironmentErrors', () => {
|
|
45
|
+
test('a persona that declares nothing cannot be wrong', () => {
|
|
46
|
+
assert.deepEqual(
|
|
47
|
+
personaEnvironmentErrors('shopper', { disposition: 'careless' }, ENVIRONMENTS),
|
|
48
|
+
[]
|
|
49
|
+
)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
test('an accountable persona may name production', () => {
|
|
53
|
+
assert.deepEqual(
|
|
54
|
+
personaEnvironmentErrors(
|
|
55
|
+
'robin',
|
|
56
|
+
{ disposition: 'accountable', environments: ['staging', 'prod'] },
|
|
57
|
+
ENVIRONMENTS
|
|
58
|
+
),
|
|
59
|
+
[]
|
|
60
|
+
)
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
test('a testing disposition naming production is an error', () => {
|
|
64
|
+
const [error, ...rest] = personaEnvironmentErrors(
|
|
65
|
+
'shopper',
|
|
66
|
+
{ disposition: 'careless', environments: ['prod'] },
|
|
67
|
+
ENVIRONMENTS
|
|
68
|
+
)
|
|
69
|
+
assert.deepEqual(rest, [])
|
|
70
|
+
assert.match(error!, /names production environment 'prod'/)
|
|
71
|
+
assert.match(error!, /'careless'/)
|
|
72
|
+
assert.match(error!, /disposition 'accountable'/)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
// The default disposition is `realistic`, which is still a testing one. A
|
|
76
|
+
// persona that declares no disposition at all must not slip into production
|
|
77
|
+
// on the strength of having said nothing.
|
|
78
|
+
test('no disposition at all is reported as realistic, and refused', () => {
|
|
79
|
+
const [error] = personaEnvironmentErrors(
|
|
80
|
+
'quiet',
|
|
81
|
+
{ environments: ['prod'] },
|
|
82
|
+
ENVIRONMENTS
|
|
83
|
+
)
|
|
84
|
+
assert.match(error!, /'realistic'/)
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
test('every offending environment is reported, not just the first', () => {
|
|
88
|
+
const errors = personaEnvironmentErrors(
|
|
89
|
+
'shopper',
|
|
90
|
+
{ disposition: 'careless', environments: ['prod', 'eu-prod'] },
|
|
91
|
+
ENVIRONMENTS
|
|
92
|
+
)
|
|
93
|
+
assert.equal(errors.length, 2)
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
// A typo silently narrows the persona to nothing, which is the same class of
|
|
97
|
+
// bug the rule exists to prevent — only quieter.
|
|
98
|
+
test('an unknown environment names the ones that exist', () => {
|
|
99
|
+
const [error] = personaEnvironmentErrors(
|
|
100
|
+
'shopper',
|
|
101
|
+
{ environments: ['stagng'] },
|
|
102
|
+
ENVIRONMENTS
|
|
103
|
+
)
|
|
104
|
+
assert.match(error!, /'stagng', which is not configured/)
|
|
105
|
+
assert.match(error!, /local, staging, prod, eu-prod/)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
test('with nothing configured it says where environments go', () => {
|
|
109
|
+
const [error] = personaEnvironmentErrors('shopper', { environments: ['x'] }, {})
|
|
110
|
+
assert.match(error!, /Declare it under 'environments' in pikku\.config\.json/)
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
describe('personaEnvironmentRefusal', () => {
|
|
115
|
+
const accountable = {
|
|
116
|
+
disposition: 'accountable' as const,
|
|
117
|
+
environments: ['staging', 'prod'],
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
test('lets a declared environment through', () => {
|
|
121
|
+
assert.equal(
|
|
122
|
+
personaEnvironmentRefusal('robin', accountable, 'prod', ENVIRONMENTS),
|
|
123
|
+
null
|
|
124
|
+
)
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
// Fail closed. An unresolved PIKKU_ENV is precisely the case where the build
|
|
128
|
+
// check was passed by a different artifact than the one now running, so
|
|
129
|
+
// "I don't know where I am" must not read as permission.
|
|
130
|
+
test('an unresolved environment refuses everybody', () => {
|
|
131
|
+
const refusal = personaEnvironmentRefusal(
|
|
132
|
+
'robin',
|
|
133
|
+
accountable,
|
|
134
|
+
undefined,
|
|
135
|
+
ENVIRONMENTS
|
|
136
|
+
)
|
|
137
|
+
assert.match(refusal!, /no environment is resolved/)
|
|
138
|
+
assert.match(refusal!, /PIKKU_ENV/)
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
test('an unrecognised environment refuses rather than assuming staging', () => {
|
|
142
|
+
const refusal = personaEnvironmentRefusal(
|
|
143
|
+
'robin',
|
|
144
|
+
accountable,
|
|
145
|
+
'somewhere-else',
|
|
146
|
+
ENVIRONMENTS
|
|
147
|
+
)
|
|
148
|
+
assert.match(refusal!, /is not configured/)
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
// The check the deployed artifact cannot have been trusted on: whatever the
|
|
152
|
+
// file said, this persona is not allowed to act on real data.
|
|
153
|
+
test('production refuses a testing disposition whatever it declared', () => {
|
|
154
|
+
const refusal = personaEnvironmentRefusal(
|
|
155
|
+
'shopper',
|
|
156
|
+
{ disposition: 'adversarial', environments: ['prod'] },
|
|
157
|
+
'prod',
|
|
158
|
+
ENVIRONMENTS
|
|
159
|
+
)
|
|
160
|
+
assert.match(refusal!, /only 'accountable' may act on real data/)
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
test('an environment outside the declared list is refused', () => {
|
|
164
|
+
const refusal = personaEnvironmentRefusal(
|
|
165
|
+
'robin',
|
|
166
|
+
accountable,
|
|
167
|
+
'local',
|
|
168
|
+
ENVIRONMENTS
|
|
169
|
+
)
|
|
170
|
+
assert.match(refusal!, /it declares environments staging, prod/)
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
test('a persona declaring nothing still runs everywhere but production', () => {
|
|
174
|
+
assert.equal(
|
|
175
|
+
personaEnvironmentRefusal('shopper', {}, 'staging', ENVIRONMENTS),
|
|
176
|
+
null
|
|
177
|
+
)
|
|
178
|
+
assert.match(
|
|
179
|
+
personaEnvironmentRefusal('shopper', {}, 'prod', ENVIRONMENTS)!,
|
|
180
|
+
/only 'accountable' may act on real data/
|
|
181
|
+
)
|
|
182
|
+
})
|
|
183
|
+
})
|