@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,9 +1,8 @@
|
|
|
1
1
|
import { parse as parseQuery } from 'picoquery';
|
|
2
2
|
import { parse as parseCookie } from 'cookie';
|
|
3
|
-
import { UnprocessableContentError } from '../../errors/errors.js';
|
|
3
|
+
import { PayloadTooLargeError, UnprocessableContentError, } from '../../errors/errors.js';
|
|
4
|
+
export const DEFAULT_MAX_BODY_SIZE = 10 * 1024 * 1024;
|
|
4
5
|
/**
|
|
5
|
-
* Abstract class representing a pikku request.
|
|
6
|
-
* @template In - The type of the request body.
|
|
7
6
|
* @group RequestResponse
|
|
8
7
|
*/
|
|
9
8
|
export class PikkuFetchHTTPRequest {
|
|
@@ -14,9 +13,11 @@ export class PikkuFetchHTTPRequest {
|
|
|
14
13
|
#rawBodyText;
|
|
15
14
|
#rawBodyBuffer;
|
|
16
15
|
#rawBufferPromise;
|
|
17
|
-
|
|
16
|
+
#maxBodySize;
|
|
17
|
+
constructor(request, { maxBodySize = DEFAULT_MAX_BODY_SIZE } = {}) {
|
|
18
18
|
this.request = request;
|
|
19
19
|
this.#url = new URL(request.url);
|
|
20
|
+
this.#maxBodySize = maxBodySize;
|
|
20
21
|
}
|
|
21
22
|
method() {
|
|
22
23
|
return this.request.method.toLowerCase();
|
|
@@ -24,33 +25,13 @@ export class PikkuFetchHTTPRequest {
|
|
|
24
25
|
path() {
|
|
25
26
|
return this.#url.pathname;
|
|
26
27
|
}
|
|
27
|
-
/**
|
|
28
|
-
* Retrieves the request body.
|
|
29
|
-
* @returns A promise that resolves to the request body.
|
|
30
|
-
*/
|
|
31
28
|
async json() {
|
|
32
29
|
const text = await this.#readRawText();
|
|
33
30
|
return JSON.parse(text);
|
|
34
31
|
}
|
|
35
|
-
/**
|
|
36
|
-
* Retrieves the raw request body as a Buffer.
|
|
37
|
-
* @returns A promise that resolves to the raw request body.
|
|
38
|
-
*/
|
|
39
32
|
async arrayBuffer() {
|
|
40
33
|
return this.#readRawBuffer();
|
|
41
34
|
}
|
|
42
|
-
/**
|
|
43
|
-
* Reads the underlying single-use request body exactly once and memoises both
|
|
44
|
-
* the in-flight promise and the result. `json()`, `arrayBuffer()`, `body()`
|
|
45
|
-
* and `toWebRequest()` all funnel through here, so a request whose body is
|
|
46
|
-
* consumed in more than one place can no longer race on the underlying stream
|
|
47
|
-
* and fail with "Body has already been used".
|
|
48
|
-
*
|
|
49
|
-
* If a second consumer asks for the body while the first read is still in
|
|
50
|
-
* flight, that is the concurrent double-read that used to crash — now safe,
|
|
51
|
-
* but warned about so the redundant consumer is found and removed at the
|
|
52
|
-
* source rather than silently leaning on this cache.
|
|
53
|
-
*/
|
|
54
35
|
async #readRawBuffer() {
|
|
55
36
|
if (this.#rawBodyBuffer !== undefined) {
|
|
56
37
|
return this.#rawBodyBuffer;
|
|
@@ -68,12 +49,59 @@ export class PikkuFetchHTTPRequest {
|
|
|
68
49
|
`toWebRequest just for headers) should be removed.`);
|
|
69
50
|
return this.#rawBufferPromise;
|
|
70
51
|
}
|
|
71
|
-
this.#rawBufferPromise = this
|
|
52
|
+
this.#rawBufferPromise = this.#readBoundedBuffer().then((buf) => {
|
|
72
53
|
this.#rawBodyBuffer = buf;
|
|
73
54
|
return buf;
|
|
74
55
|
});
|
|
75
56
|
return this.#rawBufferPromise;
|
|
76
57
|
}
|
|
58
|
+
async #readBoundedBuffer() {
|
|
59
|
+
const contentLength = this.request.headers.get('content-length');
|
|
60
|
+
if (contentLength !== null) {
|
|
61
|
+
const declaredSize = Number(contentLength);
|
|
62
|
+
if (Number.isFinite(declaredSize) && declaredSize > this.#maxBodySize) {
|
|
63
|
+
throw this.#payloadTooLarge();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const stream = this.request.body;
|
|
67
|
+
if (stream === null) {
|
|
68
|
+
const buffer = await this.request.arrayBuffer();
|
|
69
|
+
if (buffer.byteLength > this.#maxBodySize) {
|
|
70
|
+
throw this.#payloadTooLarge();
|
|
71
|
+
}
|
|
72
|
+
return buffer;
|
|
73
|
+
}
|
|
74
|
+
const reader = stream.getReader();
|
|
75
|
+
const chunks = [];
|
|
76
|
+
let size = 0;
|
|
77
|
+
try {
|
|
78
|
+
while (true) {
|
|
79
|
+
const { done, value } = await reader.read();
|
|
80
|
+
if (done) {
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
size += value.byteLength;
|
|
84
|
+
if (size > this.#maxBodySize) {
|
|
85
|
+
await reader.cancel();
|
|
86
|
+
throw this.#payloadTooLarge();
|
|
87
|
+
}
|
|
88
|
+
chunks.push(value);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
reader.releaseLock();
|
|
93
|
+
}
|
|
94
|
+
const body = new Uint8Array(size);
|
|
95
|
+
let offset = 0;
|
|
96
|
+
for (const chunk of chunks) {
|
|
97
|
+
body.set(chunk, offset);
|
|
98
|
+
offset += chunk.byteLength;
|
|
99
|
+
}
|
|
100
|
+
return body.buffer;
|
|
101
|
+
}
|
|
102
|
+
#payloadTooLarge() {
|
|
103
|
+
return new PayloadTooLargeError(`Request body exceeds the maximum size of ${this.#maxBodySize} bytes`);
|
|
104
|
+
}
|
|
77
105
|
async #readRawText() {
|
|
78
106
|
if (this.#rawBodyText !== undefined) {
|
|
79
107
|
return this.#rawBodyText;
|
|
@@ -85,18 +113,9 @@ export class PikkuFetchHTTPRequest {
|
|
|
85
113
|
headers() {
|
|
86
114
|
return Object.fromEntries(this.request.headers.entries());
|
|
87
115
|
}
|
|
88
|
-
/**
|
|
89
|
-
* Retrieves the value of a specific header.
|
|
90
|
-
* @param headerName - The name of the header to retrieve.
|
|
91
|
-
* @returns The value of the header, or undefined if the header is not found.
|
|
92
|
-
*/
|
|
93
116
|
header(headerName) {
|
|
94
117
|
return this.request.headers.get(headerName.toLowerCase());
|
|
95
118
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Retrieves the cookies from the request.
|
|
98
|
-
* @returns An object containing the cookies.
|
|
99
|
-
*/
|
|
100
119
|
cookie(cookieName) {
|
|
101
120
|
if (this.#cookies?.[cookieName]) {
|
|
102
121
|
return this.#cookies[cookieName];
|
|
@@ -105,31 +124,15 @@ export class PikkuFetchHTTPRequest {
|
|
|
105
124
|
this.#cookies = cookieHeader ? parseCookie(cookieHeader) : {};
|
|
106
125
|
return this.#cookies[cookieName] || null;
|
|
107
126
|
}
|
|
108
|
-
/**
|
|
109
|
-
* Retrieves the request parameters.
|
|
110
|
-
* @returns An object containing the request parameters.
|
|
111
|
-
*/
|
|
112
127
|
params() {
|
|
113
128
|
return this.#params;
|
|
114
129
|
}
|
|
115
|
-
/**
|
|
116
|
-
* Sets the request parameters.
|
|
117
|
-
* @param params - An object containing the request parameters to set.
|
|
118
|
-
*/
|
|
119
130
|
setParams(params) {
|
|
120
131
|
this.#params = params;
|
|
121
132
|
}
|
|
122
|
-
/**
|
|
123
|
-
* Retrieves the query parameters from the request.
|
|
124
|
-
* @returns An object containing the query parameters.
|
|
125
|
-
*/
|
|
126
133
|
query() {
|
|
127
134
|
return parseQuery(this.#url.searchParams.toString());
|
|
128
135
|
}
|
|
129
|
-
/**
|
|
130
|
-
* Retrieves the combined data from the request, including parameters, query, and body.
|
|
131
|
-
* @returns A promise that resolves to an object containing the combined data.
|
|
132
|
-
*/
|
|
133
136
|
async data() {
|
|
134
137
|
const body = await this.body();
|
|
135
138
|
const parts = [this.params(), this.query(), body];
|
|
@@ -191,6 +194,9 @@ export class PikkuFetchHTTPRequest {
|
|
|
191
194
|
}
|
|
192
195
|
}
|
|
193
196
|
catch (e) {
|
|
197
|
+
if (e instanceof PayloadTooLargeError) {
|
|
198
|
+
throw e;
|
|
199
|
+
}
|
|
194
200
|
throw new UnprocessableContentError(`Error parsing body: ${e}`);
|
|
195
201
|
}
|
|
196
202
|
return body;
|
|
@@ -96,8 +96,6 @@ export class PikkuFetchHTTPResponse {
|
|
|
96
96
|
}
|
|
97
97
|
toResponse(args) {
|
|
98
98
|
const cookieHeader = Array.from(this.#cookies.entries()).map(([name, { value, flags }]) => serializeCookie(name, value, flags));
|
|
99
|
-
// Multiple Set-Cookie headers must be appended separately, not joined with commas
|
|
100
|
-
// per HTTP specification (RFC 6265)
|
|
101
99
|
cookieHeader.forEach((cookie) => this.#headers.append('Set-Cookie', cookie));
|
|
102
100
|
return new Response(this.#body, {
|
|
103
101
|
...args,
|
|
@@ -117,7 +115,6 @@ export class PikkuFetchHTTPResponse {
|
|
|
117
115
|
};
|
|
118
116
|
this.#send = send;
|
|
119
117
|
this.#close = close;
|
|
120
|
-
// Force initial flush
|
|
121
118
|
controller.enqueue(encoder.encode(':\n\n'));
|
|
122
119
|
},
|
|
123
120
|
});
|
|
@@ -12,42 +12,35 @@ export class PathToRegexRouter {
|
|
|
12
12
|
initialize() {
|
|
13
13
|
const routes = pikkuState(null, 'http', 'routes');
|
|
14
14
|
const channelRoutes = pikkuState(null, 'channel', 'channels');
|
|
15
|
-
// Helper function to compile routes for a given method
|
|
16
15
|
const compileRoutesForMethod = (method, routeEntries) => {
|
|
17
16
|
const methodCompiledRoutes = this.compiledRoutes.get(method) || new Map();
|
|
18
17
|
const methodStaticRoutes = this.staticRoutes.get(method) || new Map();
|
|
19
18
|
for (const [routePath] of routeEntries) {
|
|
20
|
-
// Normalize route path - ensure it starts with /
|
|
21
19
|
const normalizedRoutePath = routePath.startsWith('/')
|
|
22
20
|
? routePath
|
|
23
21
|
: `/${routePath}`;
|
|
24
|
-
// Check if route is static (no parameters or wildcards)
|
|
25
22
|
const isStaticRoute = !/\*|:/.test(normalizedRoutePath);
|
|
26
23
|
if (isStaticRoute) {
|
|
27
|
-
// Store static routes for O(1) lookup
|
|
28
24
|
methodStaticRoutes.set(normalizedRoutePath, {
|
|
29
|
-
route: routePath,
|
|
25
|
+
route: routePath,
|
|
30
26
|
});
|
|
31
27
|
}
|
|
32
28
|
else {
|
|
33
|
-
// Compile dynamic routes with path-to-regexp
|
|
34
29
|
const matcher = match(normalizedRoutePath, {
|
|
35
30
|
decode: decodeURIComponent,
|
|
36
31
|
});
|
|
37
32
|
methodCompiledRoutes.set(normalizedRoutePath, {
|
|
38
33
|
matcher,
|
|
39
|
-
route: routePath,
|
|
34
|
+
route: routePath,
|
|
40
35
|
});
|
|
41
36
|
}
|
|
42
37
|
}
|
|
43
38
|
this.compiledRoutes.set(method, methodCompiledRoutes);
|
|
44
39
|
this.staticRoutes.set(method, methodStaticRoutes);
|
|
45
40
|
};
|
|
46
|
-
// Precompile all HTTP route matchers
|
|
47
41
|
for (const [method, routeMap] of routes.entries()) {
|
|
48
42
|
compileRoutesForMethod(method, routeMap.entries());
|
|
49
43
|
}
|
|
50
|
-
// Precompile all channel route matchers (treating them as GET routes for WebSocket upgrades)
|
|
51
44
|
const channelRoutesArray = Array.from(channelRoutes.entries()).map(([, channel]) => [channel.route, channel]);
|
|
52
45
|
compileRoutesForMethod('get', channelRoutesArray);
|
|
53
46
|
this.isInitialized = true;
|
|
@@ -56,9 +49,7 @@ export class PathToRegexRouter {
|
|
|
56
49
|
if (!this.isInitialized) {
|
|
57
50
|
this.initialize();
|
|
58
51
|
}
|
|
59
|
-
// Normalize path - ensure it starts with /
|
|
60
52
|
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
61
|
-
// First, try static routes for O(1) lookup
|
|
62
53
|
const methodStaticRoutes = this.staticRoutes.get(method);
|
|
63
54
|
if (methodStaticRoutes) {
|
|
64
55
|
const staticRoute = methodStaticRoutes.get(normalizedPath);
|
|
@@ -69,12 +60,10 @@ export class PathToRegexRouter {
|
|
|
69
60
|
};
|
|
70
61
|
}
|
|
71
62
|
}
|
|
72
|
-
// If no static route matched, try dynamic routes
|
|
73
63
|
const methodRoutes = this.compiledRoutes.get(method);
|
|
74
64
|
if (!methodRoutes) {
|
|
75
65
|
return null;
|
|
76
66
|
}
|
|
77
|
-
// Try each compiled route for this method
|
|
78
67
|
for (const [, compiledRoute] of methodRoutes.entries()) {
|
|
79
68
|
const result = compiledRoute.matcher(normalizedPath);
|
|
80
69
|
if (result) {
|
|
@@ -1,12 +1,4 @@
|
|
|
1
1
|
import type { PikkuHTTPRequest } from './http.types.js';
|
|
2
2
|
import type { PikkuHTTPResponse } from './http.types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Converts a PikkuHTTPRequest into a Web API Request.
|
|
5
|
-
* Useful for bridging Pikku routes to libraries that expect standard Web Request objects.
|
|
6
|
-
*/
|
|
7
3
|
export declare function toWebRequest(req: PikkuHTTPRequest, baseUrl?: string): Request;
|
|
8
|
-
/**
|
|
9
|
-
* Applies a Web API Response to a PikkuHTTPResponse.
|
|
10
|
-
* Copies status, headers (including Set-Cookie), redirects, and body.
|
|
11
|
-
*/
|
|
12
4
|
export declare function applyWebResponse(res: PikkuHTTPResponse, webResponse: Response): Promise<void>;
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Converts a PikkuHTTPRequest into a Web API Request.
|
|
3
|
-
* Useful for bridging Pikku routes to libraries that expect standard Web Request objects.
|
|
4
|
-
*/
|
|
5
1
|
export function toWebRequest(req, baseUrl) {
|
|
6
2
|
const proto = req.header('x-forwarded-proto') ?? 'http';
|
|
7
3
|
const host = req.header('x-forwarded-host') ?? req.header('host') ?? 'localhost';
|
|
@@ -21,11 +17,6 @@ export function toWebRequest(req, baseUrl) {
|
|
|
21
17
|
return new Request(url, {
|
|
22
18
|
method,
|
|
23
19
|
headers,
|
|
24
|
-
// `pull` (lazy) rather than `start` (eager): the body is only read from the
|
|
25
|
-
// underlying request when this stream is actually consumed. A consumer that
|
|
26
|
-
// builds a web Request just to read its headers (e.g. a session middleware
|
|
27
|
-
// calling getSession({ headers })) never touches the body, so it does zero
|
|
28
|
-
// body I/O and cannot race the route handler's read of the same request.
|
|
29
20
|
body: new ReadableStream({
|
|
30
21
|
async pull(controller) {
|
|
31
22
|
try {
|
|
@@ -34,7 +25,6 @@ export function toWebRequest(req, baseUrl) {
|
|
|
34
25
|
controller.enqueue(new Uint8Array(buffer));
|
|
35
26
|
}
|
|
36
27
|
else {
|
|
37
|
-
// arrayBuffer may be empty if body was pre-parsed (e.g., Express middleware)
|
|
38
28
|
const contentType = (headers.get('content-type') || '').toLowerCase();
|
|
39
29
|
const parsed = await req.json();
|
|
40
30
|
if (parsed &&
|
|
@@ -51,9 +41,7 @@ export function toWebRequest(req, baseUrl) {
|
|
|
51
41
|
}
|
|
52
42
|
}
|
|
53
43
|
}
|
|
54
|
-
catch {
|
|
55
|
-
// Empty body
|
|
56
|
-
}
|
|
44
|
+
catch { }
|
|
57
45
|
controller.close();
|
|
58
46
|
},
|
|
59
47
|
}),
|
|
@@ -88,9 +76,29 @@ function collectSetCookieHeaders(webResponse) {
|
|
|
88
76
|
return values;
|
|
89
77
|
}
|
|
90
78
|
/**
|
|
91
|
-
*
|
|
92
|
-
*
|
|
79
|
+
* Content types whose bodies are text. Everything else is bytes.
|
|
80
|
+
*
|
|
81
|
+
* The distinction matters because reading a body as text is lossy for anything
|
|
82
|
+
* that is not valid UTF-8: every byte that does not decode becomes U+FFFD, and
|
|
83
|
+
* re-encoding turns each of those into three bytes. A WASM module or an ONNX
|
|
84
|
+
* model served that way arrives larger than it left and no longer parses, with
|
|
85
|
+
* a 200 and no error anywhere to say why.
|
|
93
86
|
*/
|
|
87
|
+
const TEXTUAL_CONTENT_TYPE = /^(text\/|application\/(json|javascript|ecmascript|xml|x-www-form-urlencoded)|[^;]*\+(json|xml)\b)/i;
|
|
88
|
+
/**
|
|
89
|
+
* Read a response body as text where that is meaningful, and as bytes
|
|
90
|
+
* otherwise. An absent content type is treated as text, which is what a body
|
|
91
|
+
* built from a string gets by default and so preserves existing behaviour.
|
|
92
|
+
*/
|
|
93
|
+
async function readBody(webResponse) {
|
|
94
|
+
const contentType = webResponse.headers.get('content-type');
|
|
95
|
+
if (contentType === null || TEXTUAL_CONTENT_TYPE.test(contentType)) {
|
|
96
|
+
const text = await webResponse.text();
|
|
97
|
+
return text === '' ? null : text;
|
|
98
|
+
}
|
|
99
|
+
const bytes = new Uint8Array(await webResponse.arrayBuffer());
|
|
100
|
+
return bytes.byteLength === 0 ? null : bytes;
|
|
101
|
+
}
|
|
94
102
|
export async function applyWebResponse(res, webResponse) {
|
|
95
103
|
res.status(webResponse.status);
|
|
96
104
|
const setCookieValues = collectSetCookieHeaders(webResponse);
|
|
@@ -112,8 +120,8 @@ export async function applyWebResponse(res, webResponse) {
|
|
|
112
120
|
if (setCookieValues.length > 0) {
|
|
113
121
|
res.header('Set-Cookie', setCookieValues);
|
|
114
122
|
}
|
|
115
|
-
const body = await webResponse
|
|
116
|
-
if (body) {
|
|
123
|
+
const body = await readBody(webResponse);
|
|
124
|
+
if (body !== null) {
|
|
117
125
|
if (res.send) {
|
|
118
126
|
res.send(body);
|
|
119
127
|
}
|
|
@@ -6,6 +6,8 @@ export declare class MCPError extends Error {
|
|
|
6
6
|
}
|
|
7
7
|
export type RunMCPEndpointParams<Tools extends string = any> = {
|
|
8
8
|
mcp?: PikkuMCP<Tools>;
|
|
9
|
+
/** Defaults to enabled outside production. */
|
|
10
|
+
exposeErrors?: boolean;
|
|
9
11
|
};
|
|
10
12
|
export type JsonRpcError = {
|
|
11
13
|
code: number;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getErrorResponse } from '../../errors/error-handler.js';
|
|
2
|
-
import {
|
|
2
|
+
import { isProduction } from '../../env.js';
|
|
3
3
|
import { pikkuState, getSingletonServices, getCreateWireServices, } from '../../pikku-state.js';
|
|
4
4
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
|
|
5
5
|
import { resolveNamespace } from '../rpc/rpc-runner.js';
|
|
@@ -54,16 +54,13 @@ export async function runMCPResource(request, params, uri) {
|
|
|
54
54
|
}
|
|
55
55
|
else {
|
|
56
56
|
for (const [uriTemplate, value] of endpoints.entries()) {
|
|
57
|
-
// Extract parameter names from the template
|
|
58
57
|
const paramNames = Array.from(uriTemplate.matchAll(/\{([^}]+)\}/g), (m) => m[1]);
|
|
59
|
-
// Create regex pattern to match and capture parameter values
|
|
60
58
|
const regexPattern = uriTemplate.replace(/\{[^}]+\}/g, '([^/]+)');
|
|
61
59
|
const regex = new RegExp(`^${regexPattern}$`);
|
|
62
60
|
const match = uri.match(regex);
|
|
63
61
|
if (match) {
|
|
64
62
|
endpoint = value;
|
|
65
63
|
pikkuFuncId = metas[uriTemplate]?.pikkuFuncId;
|
|
66
|
-
// Extract parameter values and create params object
|
|
67
64
|
for (let i = 0; i < paramNames.length; i++) {
|
|
68
65
|
extractedParams[paramNames[i]] = match[i + 1]; // match[0] is the full match
|
|
69
66
|
}
|
|
@@ -85,13 +82,9 @@ export async function runMCPPrompt(request, params, name) {
|
|
|
85
82
|
const meta = pikkuState(null, 'mcp', 'promptsMeta')[name];
|
|
86
83
|
return await runMCPPikkuFunc(request, 'prompt', name, endpoint, meta?.pikkuFuncId, params);
|
|
87
84
|
}
|
|
88
|
-
|
|
89
|
-
* JSON-RPC 2.0 compatible MCP endpoint runner
|
|
90
|
-
*/
|
|
91
|
-
async function runMCPPikkuFunc(request, type, name, mcp, pikkuFuncId, { mcp: mcpWire }) {
|
|
85
|
+
async function runMCPPikkuFunc(request, type, name, mcp, pikkuFuncId, { mcp: mcpWire, exposeErrors = !isProduction() }) {
|
|
92
86
|
const singletonServices = getSingletonServices();
|
|
93
87
|
const createWireServices = getCreateWireServices();
|
|
94
|
-
let wireServices;
|
|
95
88
|
try {
|
|
96
89
|
if (request.jsonrpc !== '2.0') {
|
|
97
90
|
throw new BadRequestError('Invalid JSON-RPC version, only supoorted version is 2.0');
|
|
@@ -118,7 +111,6 @@ async function runMCPPikkuFunc(request, type, name, mcp, pikkuFuncId, { mcp: mcp
|
|
|
118
111
|
else if (type === 'prompt') {
|
|
119
112
|
meta = pikkuState(null, 'mcp', 'promptsMeta')[name];
|
|
120
113
|
}
|
|
121
|
-
// Resolve namespaced function IDs (e.g., 'swaggerPetstore:findPetsByStatus')
|
|
122
114
|
let resolvedFuncName = pikkuFuncId;
|
|
123
115
|
let resolvedPackageName = meta?.packageName ?? null;
|
|
124
116
|
if (pikkuFuncId.includes(':')) {
|
|
@@ -165,15 +157,13 @@ async function runMCPPikkuFunc(request, type, name, mcp, pikkuFuncId, { mcp: mcp
|
|
|
165
157
|
id: request.id,
|
|
166
158
|
code: -32603,
|
|
167
159
|
message: 'Internal error',
|
|
168
|
-
|
|
160
|
+
// knowledge: decisions/security/mcp-internal-error-details-are-double-gated-on-production.md
|
|
161
|
+
data: exposeErrors && !isProduction() && e instanceof Error
|
|
162
|
+
? { message: e.message, stack: e.stack }
|
|
163
|
+
: undefined,
|
|
169
164
|
});
|
|
170
165
|
}
|
|
171
166
|
}
|
|
172
|
-
finally {
|
|
173
|
-
if (wireServices) {
|
|
174
|
-
await closeWireServices(singletonServices.logger, wireServices);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
167
|
}
|
|
178
168
|
export const getMCPResources = () => {
|
|
179
169
|
return pikkuState(null, 'mcp', 'resources');
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless, CorePikkuPermission } from '../../function/functions.types.js';
|
|
2
2
|
import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../types/core.types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Extract URI parameters from MCP resource URI template.
|
|
5
|
-
* E.g., "user/{userId}/post/{postId}" => "userId" | "postId"
|
|
6
|
-
*/
|
|
3
|
+
/** "user/{userId}/post/{postId}" => "userId" | "postId" */
|
|
7
4
|
type ExtractMCPURIParams<S extends string> = S extends `${string}{${infer Param}}/${infer Rest}` ? Param | ExtractMCPURIParams<Rest> : S extends `${string}{${infer Param}}` ? Param : never;
|
|
8
|
-
/**
|
|
9
|
-
* Type-level assertion that MCP resource URI parameters are present in the input type.
|
|
10
|
-
* This ensures compile-time safety for URI parameter validation.
|
|
11
|
-
*/
|
|
5
|
+
/** Resolves to a tuple of error strings, not `never`, so the mismatch surfaces in the type error. */
|
|
12
6
|
export type AssertMCPResourceURIParams<In, URI extends string> = ExtractMCPURIParams<URI> extends keyof In ? unknown : [
|
|
13
7
|
'Error: MCP Resource URI parameters',
|
|
14
8
|
ExtractMCPURIParams<URI>,
|
|
@@ -22,27 +16,18 @@ export type PikkuMCP<Tools extends string = any> = {
|
|
|
22
16
|
enablePrompts: (prompts: Record<string, boolean>) => Promise<boolean>;
|
|
23
17
|
enableTools: (tools: Record<Tools, boolean>) => Promise<boolean>;
|
|
24
18
|
};
|
|
25
|
-
/**
|
|
26
|
-
* Represents metadata for MCP resources, including name, description, and documentation.
|
|
27
|
-
*/
|
|
28
19
|
export type MCPResourceMeta = Record<string, Omit<CoreMCPResource, 'func' | 'middleware'> & {
|
|
29
20
|
pikkuFuncId: string;
|
|
30
21
|
inputSchema: string | null;
|
|
31
22
|
outputSchema: string | null;
|
|
32
23
|
middleware?: MiddlewareMetadata[];
|
|
33
24
|
}>;
|
|
34
|
-
/**
|
|
35
|
-
* Represents metadata for MCP tools, including name, description, and documentation.
|
|
36
|
-
*/
|
|
37
25
|
export type MCPToolMeta = Record<string, Omit<CoreMCPTool, 'func' | 'middleware'> & {
|
|
38
26
|
pikkuFuncId: string;
|
|
39
27
|
inputSchema: string | null;
|
|
40
28
|
outputSchema: string | null;
|
|
41
29
|
middleware?: MiddlewareMetadata[];
|
|
42
30
|
}>;
|
|
43
|
-
/**
|
|
44
|
-
* Represents metadata for MCP prompts, including name, description, and arguments.
|
|
45
|
-
*/
|
|
46
31
|
export type MCPPromptMeta = Record<string, Omit<CoreMCPPrompt, 'func' | 'middleware'> & {
|
|
47
32
|
pikkuFuncId: string;
|
|
48
33
|
inputSchema: string | null;
|
|
@@ -54,9 +39,6 @@ export type MCPPromptMeta = Record<string, Omit<CoreMCPPrompt, 'func' | 'middlew
|
|
|
54
39
|
}>;
|
|
55
40
|
middleware?: MiddlewareMetadata[];
|
|
56
41
|
}>;
|
|
57
|
-
/**
|
|
58
|
-
* Represents an MCP resource with specific properties.
|
|
59
|
-
*/
|
|
60
42
|
export type CoreMCPResource<PikkuFunctionConfig = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>, PikkuPermission = CorePikkuPermission<any, any>, PikkuMiddleware = CorePikkuMiddleware<any>> = {
|
|
61
43
|
uri: string;
|
|
62
44
|
title: string;
|
|
@@ -70,9 +52,6 @@ export type CoreMCPResource<PikkuFunctionConfig = CorePikkuFunctionConfig<CorePi
|
|
|
70
52
|
tags?: string[];
|
|
71
53
|
middleware?: PikkuMiddleware[];
|
|
72
54
|
};
|
|
73
|
-
/**
|
|
74
|
-
* Represents an MCP tool with specific properties.
|
|
75
|
-
*/
|
|
76
55
|
export type CoreMCPTool<PikkuFunctionConfig = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>, PikkuPermission = CorePikkuPermission<any, any>, PikkuMiddleware = CorePikkuMiddleware<any>> = {
|
|
77
56
|
name: string;
|
|
78
57
|
title?: string;
|
|
@@ -84,9 +63,6 @@ export type CoreMCPTool<PikkuFunctionConfig = CorePikkuFunctionConfig<CorePikkuF
|
|
|
84
63
|
streaming?: boolean;
|
|
85
64
|
middleware?: PikkuMiddleware[];
|
|
86
65
|
};
|
|
87
|
-
/**
|
|
88
|
-
* Represents an MCP prompt with specific properties.
|
|
89
|
-
*/
|
|
90
66
|
export type CoreMCPPrompt<PikkuFunctionConfig = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, MCPPromptResponse>>, PikkuPermission = CorePikkuPermission<any, any>, PikkuMiddleware = CorePikkuMiddleware<any>> = {
|
|
91
67
|
name: string;
|
|
92
68
|
description: string;
|
|
@@ -111,9 +87,6 @@ export type JsonRpcErrorResponse = {
|
|
|
111
87
|
message: string;
|
|
112
88
|
data?: any;
|
|
113
89
|
};
|
|
114
|
-
/**
|
|
115
|
-
* Represents a message in an MCP prompt response
|
|
116
|
-
*/
|
|
117
90
|
export type MCPPromptMessage = {
|
|
118
91
|
role: 'user' | 'assistant' | 'system';
|
|
119
92
|
content: {
|
|
@@ -122,18 +95,12 @@ export type MCPPromptMessage = {
|
|
|
122
95
|
data?: string;
|
|
123
96
|
};
|
|
124
97
|
};
|
|
125
|
-
/**
|
|
126
|
-
* Standard response type for MCP prompts - array of messages
|
|
127
|
-
*/
|
|
128
98
|
export type MCPPromptResponse = MCPPromptMessage[];
|
|
129
99
|
export type MCPResourceMessage = {
|
|
130
100
|
uri: string;
|
|
131
101
|
text: string;
|
|
132
102
|
};
|
|
133
103
|
export type MCPResourceResponse = MCPResourceMessage[];
|
|
134
|
-
/**
|
|
135
|
-
* Standard response type for MCP prompts - array of messages
|
|
136
|
-
*/
|
|
137
104
|
export type MCPToolMessage = {
|
|
138
105
|
type: 'text';
|
|
139
106
|
text: string;
|
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OAuth2 credential and token types.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* App credentials for OAuth2 (client ID and secret).
|
|
6
|
-
* These are typically set once and stored in the secret service.
|
|
7
|
-
*/
|
|
8
1
|
export type OAuth2AppCredential = {
|
|
9
2
|
clientId: string;
|
|
10
3
|
clientSecret?: string;
|
|
11
4
|
};
|
|
12
|
-
/**
|
|
13
|
-
* OAuth2 token data returned from token endpoint.
|
|
14
|
-
*/
|
|
15
5
|
export type OAuth2Token = {
|
|
16
6
|
accessToken: string;
|
|
17
7
|
refreshToken?: string;
|
|
@@ -19,21 +9,3 @@ export type OAuth2Token = {
|
|
|
19
9
|
tokenType: string;
|
|
20
10
|
scope?: string;
|
|
21
11
|
};
|
|
22
|
-
/**
|
|
23
|
-
* OAuth2-specific configuration that extends a credential.
|
|
24
|
-
* This is stored in SecretDefinitionMeta.oauth2 field.
|
|
25
|
-
*/
|
|
26
|
-
export type OAuth2Config = {
|
|
27
|
-
/** Where access/refresh tokens are stored */
|
|
28
|
-
tokenSecretId: string;
|
|
29
|
-
/** OAuth2 authorization URL */
|
|
30
|
-
authorizationUrl: string;
|
|
31
|
-
/** OAuth2 token exchange URL */
|
|
32
|
-
tokenUrl: string;
|
|
33
|
-
/** Required scopes */
|
|
34
|
-
scopes: string[];
|
|
35
|
-
/** Use PKCE flow */
|
|
36
|
-
pkce?: boolean;
|
|
37
|
-
/** Additional query parameters for authorization URL */
|
|
38
|
-
additionalParams?: Record<string, string>;
|
|
39
|
-
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CorePersonas } from './persona.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* No-op function for declaring personas.
|
|
4
|
+
* This exists purely for TypeScript type checking and will be tree-shaken.
|
|
5
|
+
* The CLI extracts metadata via AST parsing and generates a `PersonaId` union
|
|
6
|
+
* and a `personas.gen.json` the console and `pikku persona run` read off disk —
|
|
7
|
+
* describing, listing or running one never has to load the app.
|
|
8
|
+
*
|
|
9
|
+
* `definePersonas` rather than `defineVirtualUsers` because declaring is not
|
|
10
|
+
* running: a persona that exists only to be acted upon (the account an admin
|
|
11
|
+
* bans, the colleague a document is shared with) is seeded and never run.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* definePersonas({
|
|
16
|
+
* susan: {
|
|
17
|
+
* name: 'Susan',
|
|
18
|
+
* jobTitle: 'Buys for a small café',
|
|
19
|
+
* roles: ['buyer'],
|
|
20
|
+
* personality: 'Hunts cheap deals. Tries three coupon codes before giving up.',
|
|
21
|
+
* goals: ['Get the weekly order in under five minutes'],
|
|
22
|
+
* disposition: 'careless',
|
|
23
|
+
* account: {},
|
|
24
|
+
* },
|
|
25
|
+
* })
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare const definePersonas: (_config: CorePersonas) => void;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* No-op function for declaring personas.
|
|
3
|
+
* This exists purely for TypeScript type checking and will be tree-shaken.
|
|
4
|
+
* The CLI extracts metadata via AST parsing and generates a `PersonaId` union
|
|
5
|
+
* and a `personas.gen.json` the console and `pikku persona run` read off disk —
|
|
6
|
+
* describing, listing or running one never has to load the app.
|
|
7
|
+
*
|
|
8
|
+
* `definePersonas` rather than `defineVirtualUsers` because declaring is not
|
|
9
|
+
* running: a persona that exists only to be acted upon (the account an admin
|
|
10
|
+
* bans, the colleague a document is shared with) is seeded and never run.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* definePersonas({
|
|
15
|
+
* susan: {
|
|
16
|
+
* name: 'Susan',
|
|
17
|
+
* jobTitle: 'Buys for a small café',
|
|
18
|
+
* roles: ['buyer'],
|
|
19
|
+
* personality: 'Hunts cheap deals. Tries three coupon codes before giving up.',
|
|
20
|
+
* goals: ['Get the weekly order in under five minutes'],
|
|
21
|
+
* disposition: 'careless',
|
|
22
|
+
* account: {},
|
|
23
|
+
* },
|
|
24
|
+
* })
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export const definePersonas = (_config) => { };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export { definePersonas } from './define-personas.js';
|
|
2
|
+
export { isRunnablePersona, roleMismatchMessage, runnablePersonas, validateAndBuildPersonasMeta, verifyPersonaRoles, } from './validate-personas.js';
|
|
3
|
+
export type { RoleVerification } from './validate-personas.js';
|
|
4
|
+
export { personaEnvironmentErrors, personaEnvironmentRefusal, resolvePersonaEnvironments, } from './persona-environments.js';
|
|
5
|
+
export type { PersonaEnvironment, PersonaEnvironmentSubject, } from './persona-environments.js';
|
|
6
|
+
export { personaEmail, personaEmailLabel, personaEmails, } from './persona-email.js';
|
|
7
|
+
export { allowedLinks, applyMailboxAllowlist, isAllowedSender, } from './persona-mailbox.js';
|
|
8
|
+
export type { MailboxAllowlist, PersonaMailbox, ReceivedEmail, } from './persona-mailbox.js';
|
|
9
|
+
export type { CorePersona, CorePersonaAccount, CorePersonas, PersonaAccountMeta, PersonaDefinitions, PersonaMeta, PersonasMeta, } from './persona.types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Signing in as a persona and talking to a stage over HTTP.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately reached through this entry point rather than `@pikku/core/services`.
|
|
14
|
+
* `HttpPersona` pulls in the actor-flow conversation runner and, through it, the
|
|
15
|
+
* agent runner — none of which a production server has any use for. Exporting it
|
|
16
|
+
* from the services barrel put that chain in the module graph of every app that
|
|
17
|
+
* imports services, which only a bundler could remove and an unbundled Node or
|
|
18
|
+
* Lambda deploy would load outright.
|
|
19
|
+
*/
|
|
20
|
+
export { HttpPersona, createHttpPersonas, type HttpPersonasConfig, } from '../../services/http-personas.js';
|
|
21
|
+
export { postScenarioJson, readScenarioHttpResponse, } from '../../services/personas-service.js';
|