@pikku/core 0.12.72 → 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 +793 -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 +37 -32
- 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 -13
- package/dist/handle-error.js +0 -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 +5 -39
- package/dist/schema.js +5 -39
- 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 +0 -99
- package/dist/wirings/http/http-runner.js +9 -165
- package/dist/wirings/http/http.types.d.ts +14 -55
- package/dist/wirings/http/log-http-routes.d.ts +0 -4
- package/dist/wirings/http/log-http-routes.js +0 -4
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +0 -40
- package/dist/wirings/http/pikku-fetch-http-request.js +0 -58
- package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
- package/dist/wirings/http/routers/path-to-regex.js +2 -13
- package/dist/wirings/http/web-request.d.ts +0 -8
- package/dist/wirings/http/web-request.js +25 -17
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -4
- package/dist/wirings/mcp/mcp-runner.js +1 -14
- package/dist/wirings/mcp/mcp.types.d.ts +2 -35
- package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
- package/dist/wirings/oauth2/oauth2.types.js +0 -3
- package/dist/wirings/persona/define-personas.d.ts +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 -1
- 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 +0 -7
- package/src/function/function-runner.ts +62 -32
- 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/handle-error.ts +0 -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.ts +5 -39
- 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 +8 -167
- package/src/wirings/http/http.types.ts +15 -62
- package/src/wirings/http/log-http-routes.ts +0 -4
- package/src/wirings/http/pikku-fetch-http-request.test.ts +2 -10
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -58
- package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
- package/src/wirings/http/routers/path-to-regex.ts +2 -13
- package/src/wirings/http/web-request.test.ts +33 -2
- package/src/wirings/http/web-request.ts +30 -17
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
- package/src/wirings/mcp/mcp-runner.ts +2 -17
- package/src/wirings/mcp/mcp.types.ts +7 -42
- package/src/wirings/oauth2/oauth2.types.ts +0 -30
- package/src/wirings/persona/define-personas.ts +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/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
package/src/scopes.ts
CHANGED
|
@@ -5,13 +5,9 @@ const SEPARATOR = ':'
|
|
|
5
5
|
const WILDCARD = '*'
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Every grant that would satisfy `scope`: the scope itself, a wildcard
|
|
9
9
|
* directly beneath it, a wildcard at each ancestor level, and each plain
|
|
10
|
-
* ancestor id
|
|
11
|
-
*
|
|
12
|
-
* For `admin:invoices:create` that is:
|
|
13
|
-
* admin:invoices:create, admin:invoices:create:*, *, admin:*, admin:invoices:*,
|
|
14
|
-
* admin, admin:invoices
|
|
10
|
+
* ancestor id.
|
|
15
11
|
*/
|
|
16
12
|
const satisfyingGrants = (scope: string): string[] => {
|
|
17
13
|
const segments = scope.split(SEPARATOR)
|
|
@@ -25,28 +21,10 @@ const satisfyingGrants = (scope: string): string[] => {
|
|
|
25
21
|
return grants
|
|
26
22
|
}
|
|
27
23
|
|
|
28
|
-
/**
|
|
29
|
-
* Checks whether `held` satisfies a single required scope.
|
|
30
|
-
*
|
|
31
|
-
* A grant satisfies a requirement when it is the scope itself, a plain ancestor
|
|
32
|
-
* (`admin` covers `admin:invoices:create`), a wildcard at or above it (`admin:*`
|
|
33
|
-
* covers `admin` and `admin:invoices:create`), or the bare `*`. A narrower grant
|
|
34
|
-
* never satisfies a broader requirement — `admin:invoices` does not grant
|
|
35
|
-
* `admin`.
|
|
36
|
-
*/
|
|
37
24
|
const holds = (held: ReadonlySet<string>, scope: string): boolean =>
|
|
38
25
|
satisfyingGrants(scope).some((grant) => held.has(grant))
|
|
39
26
|
|
|
40
|
-
/**
|
|
41
|
-
* The first required scope a set of held grants does not satisfy, or `null`
|
|
42
|
-
* when every one is satisfied.
|
|
43
|
-
*
|
|
44
|
-
* Scopes are an AND gate: every entry in `required` must be satisfied. This is
|
|
45
|
-
* deliberately distinct from `permissions`, which OR together — a scope can
|
|
46
|
-
* only ever narrow access, so adding one to a function can never widen it.
|
|
47
|
-
*
|
|
48
|
-
* Fails closed: an absent `held` satisfies nothing.
|
|
49
|
-
*/
|
|
27
|
+
/** The first required scope `held` does not satisfy, or `null`. Fails closed. */
|
|
50
28
|
const firstUnsatisfied = (
|
|
51
29
|
required: readonly string[] | undefined,
|
|
52
30
|
held: Iterable<string> | undefined
|
|
@@ -65,17 +43,8 @@ const firstUnsatisfied = (
|
|
|
65
43
|
}
|
|
66
44
|
|
|
67
45
|
/**
|
|
68
|
-
* Whether a set of held grants satisfies every required scope.
|
|
69
|
-
*
|
|
70
46
|
* The non-throwing counterpart to {@link verifyScopes}, for deciding rather
|
|
71
|
-
* than enforcing
|
|
72
|
-
* it is not satisfied, rather than rejecting the request outright.
|
|
73
|
-
*
|
|
74
|
-
* Fails closed: an absent or empty `held` satisfies nothing. An empty
|
|
75
|
-
* `required` is satisfied by anything.
|
|
76
|
-
*
|
|
77
|
-
* @param required - Scopes to check for. Empty means no gate.
|
|
78
|
-
* @param held - The grants held, e.g. `session.scopes`. May be undefined.
|
|
47
|
+
* than enforcing. Fails closed; an empty `required` is satisfied by anything.
|
|
79
48
|
*/
|
|
80
49
|
export const hasScopes = (
|
|
81
50
|
required: readonly string[] | undefined,
|
|
@@ -83,19 +52,9 @@ export const hasScopes = (
|
|
|
83
52
|
): boolean => firstUnsatisfied(required, held) === null
|
|
84
53
|
|
|
85
54
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* Scopes are an AND gate: every entry in `required` must be satisfied. This is
|
|
90
|
-
* deliberately distinct from `permissions`, which OR together — a scope can
|
|
91
|
-
* only ever narrow access, so adding one to a function can never widen it.
|
|
92
|
-
*
|
|
93
|
-
* Fails closed: a session without a `scopes` field, or no session at all,
|
|
94
|
-
* satisfies nothing.
|
|
95
|
-
*
|
|
96
|
-
* @param required - Scopes the function declares. Empty means no gate.
|
|
97
|
-
* @param session - The session to check. May be undefined.
|
|
98
|
-
* @throws {MissingScopeError} Naming the first unsatisfied scope.
|
|
55
|
+
* Throws {@link MissingScopeError} naming the first scope the session does not
|
|
56
|
+
* hold. Fails closed: no session, or a session without `scopes`, satisfies
|
|
57
|
+
* nothing.
|
|
99
58
|
*/
|
|
100
59
|
export const verifyScopes = (
|
|
101
60
|
required: readonly string[] | undefined,
|
|
@@ -19,6 +19,26 @@ export type AIAgentRunnerParams = {
|
|
|
19
19
|
/** Pikku agent function name — forwarded to the LLM proxy (LiteLLM) as
|
|
20
20
|
* request-level metadata so usage can be broken down per agent. */
|
|
21
21
|
agentId?: string
|
|
22
|
+
/**
|
|
23
|
+
* Cancels the model call itself, not just delivery of its output. Set by
|
|
24
|
+
* `streamAIAgent` from the run's interrupt handle so a voice barge-in stops
|
|
25
|
+
* generation upstream rather than leaving tokens being billed into a stream
|
|
26
|
+
* nobody reads. A runner that ignores it degrades to "the caller stops
|
|
27
|
+
* listening", which is the behaviour before this field existed.
|
|
28
|
+
*/
|
|
29
|
+
abortSignal?: AbortSignal
|
|
30
|
+
/**
|
|
31
|
+
* Per-provider settings passed to the model untouched — the escape hatch for
|
|
32
|
+
* anything the shared params above cannot express because only one vendor
|
|
33
|
+
* has it.
|
|
34
|
+
*
|
|
35
|
+
* The setting that motivated it is `reasoningEffort`. A voice turn is heard
|
|
36
|
+
* rather than read, so the wait before the first word is most of the
|
|
37
|
+
* experience: `{ openai: { reasoningEffort: 'minimal' } }` on gpt-5-mini
|
|
38
|
+
* measured 0.9s to first token against 2.5s at the default, and 1.6s of
|
|
39
|
+
* silence is a long time to sit through having just finished speaking.
|
|
40
|
+
*/
|
|
41
|
+
providerOptions?: AIProviderOptions
|
|
22
42
|
}
|
|
23
43
|
|
|
24
44
|
export type AIAgentRunnerResult = {
|
|
@@ -1,31 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
* A narrow, dedicated embedding service.
|
|
3
|
-
*
|
|
4
|
-
* Vector stores (Qdrant, Pinecone, Supabase/pgvector, …) depend on this to turn
|
|
5
|
-
* text into vectors, at BOTH index time (ingest) and query time (search). The
|
|
6
|
-
* embedding model is fixed at construction so those two moments cannot drift
|
|
7
|
-
* into different vector spaces — a mismatch would silently break similarity
|
|
8
|
-
* search. Provider addons (e.g. `@pikku/addon-openai`) implement it; the app
|
|
9
|
-
* wires a single instance into `singletonServices.aiEmbedding`.
|
|
10
|
-
*
|
|
11
|
-
* This is deliberately smaller than {@link AIAgentRunnerService} (whose optional
|
|
12
|
-
* `embed`/`embedMany` take a per-call model): a vector store should not have to
|
|
13
|
-
* pull in the whole agent-runner tool loop just to embed, and pinning the model
|
|
14
|
-
* to the service is what guarantees index/query consistency.
|
|
15
|
-
*
|
|
16
|
-
* Documents (ingested corpus) and queries (search text) are embedded through
|
|
17
|
-
* separate methods because some models are asymmetric — Cohere's `input_type`,
|
|
18
|
-
* E5's `query:`/`passage:` prefixes, BGE's query instruction — and must know
|
|
19
|
-
* which side they are embedding to produce comparable vectors. Symmetric
|
|
20
|
-
* providers (e.g. OpenAI) point both methods at the same call.
|
|
21
|
-
*/
|
|
1
|
+
// knowledge: decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md
|
|
22
2
|
export interface AIEmbeddingService {
|
|
23
|
-
/** The embedding model backing this service. Index and query share it. */
|
|
24
3
|
readonly model: string
|
|
25
|
-
/** The vector dimensionality this model produces, when known. */
|
|
26
4
|
readonly dimensions?: number
|
|
27
|
-
/**
|
|
5
|
+
/** Index time. Preserves input order. */
|
|
28
6
|
embedDocuments(values: string[]): Promise<number[][]>
|
|
29
|
-
/**
|
|
7
|
+
/** Query time. */
|
|
30
8
|
embedQuery(value: string): Promise<number[]>
|
|
31
9
|
}
|
|
@@ -76,8 +76,7 @@ class DisabledInvocationAudit implements AuditLog {
|
|
|
76
76
|
async write(_event: AuditLogWriteInput): Promise<void> {
|
|
77
77
|
if (!this.warned) {
|
|
78
78
|
this.warned = true
|
|
79
|
-
//
|
|
80
|
-
// a dropped audit write must never be invisible.
|
|
79
|
+
// knowledge: decisions/security/a-dropped-audit-write-is-always-logged.md
|
|
81
80
|
const logger = (this.wire as any).logger ?? this.logger
|
|
82
81
|
logger?.warn?.(
|
|
83
82
|
`audit.write() dropped for '${this.wire.functionId ?? 'unknown function'}' — the function has no audit config (set audit: true on it)`
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Arguments for signing a content key into a time-limited URL.
|
|
3
|
-
*/
|
|
4
1
|
export interface SignContentKeyArgs<TBucket extends string = string> {
|
|
5
2
|
bucket: TBucket
|
|
6
3
|
contentKey: string
|
|
@@ -8,18 +5,12 @@ export interface SignContentKeyArgs<TBucket extends string = string> {
|
|
|
8
5
|
dateGreaterThan?: Date
|
|
9
6
|
}
|
|
10
7
|
|
|
11
|
-
/**
|
|
12
|
-
* Arguments for signing an arbitrary URL.
|
|
13
|
-
*/
|
|
14
8
|
export interface SignURLArgs {
|
|
15
9
|
url: string
|
|
16
10
|
dateLessThan: Date
|
|
17
11
|
dateGreaterThan?: Date
|
|
18
12
|
}
|
|
19
13
|
|
|
20
|
-
/**
|
|
21
|
-
* Arguments for minting a presigned upload URL.
|
|
22
|
-
*/
|
|
23
14
|
export interface GetUploadURLArgs<TBucket extends string = string> {
|
|
24
15
|
bucket: TBucket
|
|
25
16
|
fileKey: string
|
|
@@ -28,9 +19,6 @@ export interface GetUploadURLArgs<TBucket extends string = string> {
|
|
|
28
19
|
visibility?: 'private' | 'public'
|
|
29
20
|
}
|
|
30
21
|
|
|
31
|
-
/**
|
|
32
|
-
* Result of minting a presigned upload URL.
|
|
33
|
-
*/
|
|
34
22
|
export interface UploadURLResult {
|
|
35
23
|
uploadUrl: string
|
|
36
24
|
assetKey: string
|
|
@@ -38,26 +26,17 @@ export interface UploadURLResult {
|
|
|
38
26
|
uploadMethod?: 'PUT' | 'POST'
|
|
39
27
|
}
|
|
40
28
|
|
|
41
|
-
/**
|
|
42
|
-
* Arguments for an operation that targets a single object by key.
|
|
43
|
-
*/
|
|
44
29
|
export interface BucketKeyArgs<TBucket extends string = string> {
|
|
45
30
|
bucket: TBucket
|
|
46
31
|
key: string
|
|
47
32
|
}
|
|
48
33
|
|
|
49
|
-
/**
|
|
50
|
-
* Arguments for writing a stream to storage.
|
|
51
|
-
*/
|
|
52
34
|
export interface WriteFileArgs<
|
|
53
35
|
TBucket extends string = string,
|
|
54
36
|
> extends BucketKeyArgs<TBucket> {
|
|
55
37
|
stream: ReadableStream | NodeJS.ReadableStream
|
|
56
38
|
}
|
|
57
39
|
|
|
58
|
-
/**
|
|
59
|
-
* Arguments for copying a local file into storage.
|
|
60
|
-
*/
|
|
61
40
|
export interface CopyFileArgs<
|
|
62
41
|
TBucket extends string = string,
|
|
63
42
|
> extends BucketKeyArgs<TBucket> {
|
|
@@ -65,46 +44,22 @@ export interface CopyFileArgs<
|
|
|
65
44
|
}
|
|
66
45
|
|
|
67
46
|
export interface ContentService<TBucket extends string = string> {
|
|
68
|
-
/**
|
|
69
|
-
* Signs a content key to generate a secure, time-limited access URL.
|
|
70
|
-
*/
|
|
71
47
|
signContentKey(args: SignContentKeyArgs<TBucket>): Promise<string>
|
|
72
48
|
|
|
73
|
-
/**
|
|
74
|
-
* Signs an arbitrary URL to generate a secure, time-limited access URL.
|
|
75
|
-
*/
|
|
76
49
|
signURL(args: SignURLArgs): Promise<string>
|
|
77
50
|
|
|
78
|
-
/**
|
|
79
|
-
* Generates a signed URL for uploading a file directly to storage.
|
|
80
|
-
* Bucket policy (size limits, MIME allowlist) is enforced by the implementation.
|
|
81
|
-
*/
|
|
51
|
+
/** Bucket policy (size limits, MIME allowlist) is enforced by the implementation, not the caller. */
|
|
82
52
|
getUploadURL(args: GetUploadURLArgs<TBucket>): Promise<UploadURLResult>
|
|
83
53
|
|
|
84
|
-
/**
|
|
85
|
-
* Deletes a file from the storage backend.
|
|
86
|
-
*/
|
|
87
54
|
deleteFile(args: BucketKeyArgs<TBucket>): Promise<boolean>
|
|
88
55
|
|
|
89
|
-
/**
|
|
90
|
-
* Uploads a file stream to storage under the specified bucket + key.
|
|
91
|
-
*/
|
|
92
56
|
writeFile(args: WriteFileArgs<TBucket>): Promise<boolean>
|
|
93
57
|
|
|
94
|
-
/**
|
|
95
|
-
* Copies a file from a local absolute path into storage.
|
|
96
|
-
*/
|
|
97
58
|
copyFile(args: CopyFileArgs<TBucket>): Promise<boolean>
|
|
98
59
|
|
|
99
|
-
/**
|
|
100
|
-
* Reads a file from storage as a readable stream.
|
|
101
|
-
*/
|
|
102
60
|
readFile(
|
|
103
61
|
args: BucketKeyArgs<TBucket>
|
|
104
62
|
): Promise<ReadableStream | NodeJS.ReadableStream>
|
|
105
63
|
|
|
106
|
-
/**
|
|
107
|
-
* Reads an entire file from storage into a Buffer.
|
|
108
|
-
*/
|
|
109
64
|
readFileAsBuffer(args: BucketKeyArgs<TBucket>): Promise<Buffer>
|
|
110
65
|
}
|
|
@@ -1,57 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* static, developer-configured values).
|
|
2
|
+
* Dynamic credentials — OAuth tokens, per-user API keys — that change at
|
|
3
|
+
* runtime, as opposed to `SecretService`'s static developer-configured values.
|
|
4
|
+
* Throughout, an omitted `userId` means the platform-level credential.
|
|
6
5
|
*/
|
|
7
6
|
export interface CredentialService {
|
|
8
|
-
/**
|
|
9
|
-
* Retrieves a credential by name and optional user ID.
|
|
10
|
-
* @param name - The credential name (e.g. 'stripe', 'google-sheets').
|
|
11
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
12
|
-
* @returns The credential value, or null if not found.
|
|
13
|
-
*/
|
|
14
7
|
get<T = unknown>(name: string, userId?: string): Promise<T | null>
|
|
15
8
|
|
|
16
|
-
/**
|
|
17
|
-
* Stores a credential.
|
|
18
|
-
* @param name - The credential name.
|
|
19
|
-
* @param value - The credential value to store.
|
|
20
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
21
|
-
*/
|
|
22
9
|
set(name: string, value: unknown, userId?: string): Promise<void>
|
|
23
10
|
|
|
24
|
-
/**
|
|
25
|
-
* Deletes a credential.
|
|
26
|
-
* @param name - The credential name.
|
|
27
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
28
|
-
*/
|
|
29
11
|
delete(name: string, userId?: string): Promise<void>
|
|
30
12
|
|
|
31
|
-
/**
|
|
32
|
-
* Checks if a credential exists.
|
|
33
|
-
* @param name - The credential name.
|
|
34
|
-
* @param userId - Optional user ID for per-user credentials. Omit for platform-level.
|
|
35
|
-
*/
|
|
36
13
|
has(name: string, userId?: string): Promise<boolean>
|
|
37
14
|
|
|
38
|
-
/**
|
|
39
|
-
* Retrieves all credentials for a user.
|
|
40
|
-
* @param userId - The user ID.
|
|
41
|
-
* @returns A record of credential name to value.
|
|
42
|
-
*/
|
|
43
15
|
getAll(userId: string): Promise<Record<string, unknown>>
|
|
44
16
|
|
|
45
|
-
/**
|
|
46
|
-
* Lists all user IDs that have a specific credential configured.
|
|
47
|
-
* @param name - The credential name.
|
|
48
|
-
* @returns Array of user IDs.
|
|
49
|
-
*/
|
|
50
17
|
getUsersWithCredential(name: string): Promise<string[]>
|
|
51
18
|
|
|
52
|
-
/**
|
|
53
|
-
* Lists all unique user IDs that have any credential configured.
|
|
54
|
-
* @returns Array of user IDs.
|
|
55
|
-
*/
|
|
56
19
|
getAllUsers(): Promise<string[]>
|
|
57
20
|
}
|
|
@@ -29,9 +29,7 @@ describe('PikkuCredentialWireService', () => {
|
|
|
29
29
|
test('should return sync after first load (no credential service)', async () => {
|
|
30
30
|
const service = new PikkuCredentialWireService()
|
|
31
31
|
service.set('foo', 'bar')
|
|
32
|
-
// First call triggers lazy load (no-op without credentialService)
|
|
33
32
|
await service.getAll()
|
|
34
|
-
// Second call should be sync
|
|
35
33
|
const result = service.getAll()
|
|
36
34
|
assert.ok(!(result instanceof Promise), 'expected sync return')
|
|
37
35
|
assert.deepStrictEqual(result, { foo: 'bar' })
|
|
@@ -19,15 +19,9 @@ export interface DeploymentService {
|
|
|
19
19
|
start(config: DeploymentConfig): Promise<void>
|
|
20
20
|
stop(): Promise<void>
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* - Session propagation (JWT signing, headers)
|
|
26
|
-
* - The actual network call
|
|
27
|
-
*
|
|
28
|
-
* @param funcName - The function to invoke
|
|
29
|
-
* @param data - Input data for the function
|
|
30
|
-
* @param session - User session to propagate (optional)
|
|
22
|
+
* The implementation owns the whole transport: resolving the target
|
|
23
|
+
* (endpoint, service binding), propagating the session (JWT signing,
|
|
24
|
+
* headers) and making the call. Callers supply no transport detail.
|
|
31
25
|
*/
|
|
32
26
|
invoke(
|
|
33
27
|
funcName: string,
|
|
@@ -1,20 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Abstract GatewayService interface.
|
|
3
|
-
*
|
|
4
|
-
* Implementations manage listener gateway lifecycle — initializing adapters
|
|
5
|
-
* and delivering messages to handler functions.
|
|
6
|
-
*
|
|
7
|
-
* A `LocalGatewayService` starts all listeners unconditionally;
|
|
8
|
-
* a distributed implementation could check leader election first.
|
|
9
|
-
*/
|
|
10
1
|
export interface GatewayService {
|
|
11
|
-
/**
|
|
12
|
-
* Start all listener gateways
|
|
13
|
-
*/
|
|
14
2
|
start(): Promise<void>
|
|
15
3
|
|
|
16
|
-
/**
|
|
17
|
-
* Stop all listener gateways
|
|
18
|
-
*/
|
|
19
4
|
stop(): Promise<void>
|
|
20
5
|
}
|
package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts}
RENAMED
|
@@ -2,7 +2,7 @@ import { describe, test, after } from 'node:test'
|
|
|
2
2
|
import assert from 'node:assert/strict'
|
|
3
3
|
import { createServer, type Server } from 'node:http'
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { createHttpPersonas } from './http-personas.js'
|
|
6
6
|
import { pikkuState, resetPikkuState } from '../pikku-state.js'
|
|
7
7
|
import type { AIAgentStepResult } from './ai-agent-runner-service.js'
|
|
8
8
|
|
|
@@ -139,7 +139,7 @@ const wireRunner = () => {
|
|
|
139
139
|
} as any)
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
-
describe('
|
|
142
|
+
describe('HttpPersona.converse', async () => {
|
|
143
143
|
const target = await startAgentTarget()
|
|
144
144
|
after(() => {
|
|
145
145
|
target.server.close()
|
|
@@ -150,12 +150,21 @@ describe('HttpScenarioActor.converse', async () => {
|
|
|
150
150
|
wireRunner()
|
|
151
151
|
target.reset()
|
|
152
152
|
|
|
153
|
-
const actors =
|
|
153
|
+
const actors = createHttpPersonas({
|
|
154
154
|
apiUrl: target.apiUrl,
|
|
155
155
|
secret: 'impersonation-secret',
|
|
156
156
|
model: 'test/test-model',
|
|
157
|
-
|
|
158
|
-
pm: {
|
|
157
|
+
personas: {
|
|
158
|
+
pm: {
|
|
159
|
+
id: 'pm',
|
|
160
|
+
name: 'Priya',
|
|
161
|
+
email: 'pm@personas.invalid',
|
|
162
|
+
personality: 'concise',
|
|
163
|
+
roles: [],
|
|
164
|
+
goals: [],
|
|
165
|
+
tags: [],
|
|
166
|
+
runnable: true,
|
|
167
|
+
},
|
|
159
168
|
},
|
|
160
169
|
})
|
|
161
170
|
|
|
@@ -179,11 +188,21 @@ describe('HttpScenarioActor.converse', async () => {
|
|
|
179
188
|
wireRunner()
|
|
180
189
|
target.reset({ authRequired: true })
|
|
181
190
|
|
|
182
|
-
const actors =
|
|
191
|
+
const actors = createHttpPersonas({
|
|
183
192
|
apiUrl: target.apiUrl,
|
|
184
193
|
secret: 'impersonation-secret',
|
|
185
194
|
model: 'test/test-model',
|
|
186
|
-
|
|
195
|
+
personas: {
|
|
196
|
+
pm: {
|
|
197
|
+
id: 'pm',
|
|
198
|
+
name: 'Priya',
|
|
199
|
+
email: 'pm@personas.invalid',
|
|
200
|
+
roles: [],
|
|
201
|
+
goals: [],
|
|
202
|
+
tags: [],
|
|
203
|
+
runnable: true,
|
|
204
|
+
},
|
|
205
|
+
},
|
|
187
206
|
})
|
|
188
207
|
|
|
189
208
|
const verdict = await actors.pm!.converse({
|
|
@@ -208,11 +227,21 @@ describe('HttpScenarioActor.converse', async () => {
|
|
|
208
227
|
},
|
|
209
228
|
} as any)
|
|
210
229
|
|
|
211
|
-
const actors =
|
|
230
|
+
const actors = createHttpPersonas({
|
|
212
231
|
apiUrl: target.apiUrl,
|
|
213
232
|
secret: 'impersonation-secret',
|
|
214
233
|
model: 'test/test-model',
|
|
215
|
-
|
|
234
|
+
personas: {
|
|
235
|
+
pm: {
|
|
236
|
+
id: 'pm',
|
|
237
|
+
name: 'Priya',
|
|
238
|
+
email: 'pm@personas.invalid',
|
|
239
|
+
roles: [],
|
|
240
|
+
goals: [],
|
|
241
|
+
tags: [],
|
|
242
|
+
runnable: true,
|
|
243
|
+
},
|
|
244
|
+
},
|
|
216
245
|
})
|
|
217
246
|
|
|
218
247
|
await assert.rejects(
|
|
@@ -2,10 +2,10 @@ import { describe, test, after } from 'node:test'
|
|
|
2
2
|
import assert from 'node:assert/strict'
|
|
3
3
|
import { createServer, type Server } from 'node:http'
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { createHttpPersonas } from './http-personas.js'
|
|
6
6
|
|
|
7
|
-
// Minimal target app
|
|
8
|
-
//
|
|
7
|
+
// Minimal target app mirroring the Better Auth actor plugin's contract:
|
|
8
|
+
// sign-in endpoint, exposed RPC endpoint, session by cookie.
|
|
9
9
|
const startTarget = async () => {
|
|
10
10
|
let logins = 0
|
|
11
11
|
let expireNext = false
|
|
@@ -78,29 +78,46 @@ const startTarget = async () => {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
describe('
|
|
81
|
+
describe('HttpPersona', async () => {
|
|
82
82
|
const target = await startTarget()
|
|
83
83
|
after(() => target.server.close())
|
|
84
84
|
|
|
85
|
-
const
|
|
86
|
-
|
|
85
|
+
const makePersonas = (secret = 'impersonation-secret') =>
|
|
86
|
+
createHttpPersonas({
|
|
87
87
|
apiUrl: target.apiUrl,
|
|
88
88
|
secret,
|
|
89
|
-
|
|
90
|
-
customer: {
|
|
91
|
-
|
|
89
|
+
personas: {
|
|
90
|
+
customer: {
|
|
91
|
+
id: 'customer',
|
|
92
|
+
name: 'Customer',
|
|
93
|
+
email: 'customer@personas.invalid',
|
|
94
|
+
jobTitle: 'Buyer',
|
|
95
|
+
roles: [],
|
|
96
|
+
goals: [],
|
|
97
|
+
tags: [],
|
|
98
|
+
runnable: true,
|
|
99
|
+
},
|
|
100
|
+
manager: {
|
|
101
|
+
id: 'manager',
|
|
102
|
+
name: 'Manager',
|
|
103
|
+
email: 'manager@personas.invalid',
|
|
104
|
+
roles: [],
|
|
105
|
+
goals: [],
|
|
106
|
+
tags: [],
|
|
107
|
+
runnable: true,
|
|
108
|
+
},
|
|
92
109
|
},
|
|
93
110
|
})
|
|
94
111
|
|
|
95
|
-
test('builds one lazy
|
|
96
|
-
const actors =
|
|
112
|
+
test('builds one lazy persona per declaration', () => {
|
|
113
|
+
const actors = makePersonas()
|
|
97
114
|
assert.deepEqual(Object.keys(actors).sort(), ['customer', 'manager'])
|
|
98
115
|
assert.equal(actors.customer!.name, 'customer')
|
|
99
116
|
assert.equal(target.loginCount(), 0, 'no login until first invoke')
|
|
100
117
|
})
|
|
101
118
|
|
|
102
119
|
test('logs in lazily once and replays the session cookie on RPCs', async () => {
|
|
103
|
-
const actors =
|
|
120
|
+
const actors = makePersonas()
|
|
104
121
|
|
|
105
122
|
const first = (await actors.customer!.invoke('createTodo', {
|
|
106
123
|
title: 'x',
|
|
@@ -120,7 +137,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
120
137
|
})
|
|
121
138
|
|
|
122
139
|
test('re-logs-in once when the session expires mid-run', async () => {
|
|
123
|
-
const actors =
|
|
140
|
+
const actors = makePersonas()
|
|
124
141
|
await actors.manager!.invoke('ping', {})
|
|
125
142
|
const loginsBefore = target.loginCount()
|
|
126
143
|
|
|
@@ -132,7 +149,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
132
149
|
})
|
|
133
150
|
|
|
134
151
|
test('invokeRaw returns the status and body instead of throwing', async () => {
|
|
135
|
-
const actors =
|
|
152
|
+
const actors = makePersonas()
|
|
136
153
|
|
|
137
154
|
// A refusal is the expected outcome of a permissions scenario, so the
|
|
138
155
|
// status and the payload that names the missing scope both have to survive.
|
|
@@ -147,7 +164,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
147
164
|
})
|
|
148
165
|
|
|
149
166
|
test('invokeRaw reports a success the same way', async () => {
|
|
150
|
-
const actors =
|
|
167
|
+
const actors = makePersonas()
|
|
151
168
|
const res = await actors.manager!.invokeRaw('listTodos', { page: 2 })
|
|
152
169
|
|
|
153
170
|
assert.equal(res.status, 200)
|
|
@@ -156,7 +173,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
156
173
|
})
|
|
157
174
|
|
|
158
175
|
test('invokeRaw carries the response text so a step can search it', async () => {
|
|
159
|
-
const actors =
|
|
176
|
+
const actors = makePersonas()
|
|
160
177
|
const res = await actors.customer!.invokeRaw('forbidden', {})
|
|
161
178
|
|
|
162
179
|
assert.match(res.serialized, /MissingScopeError/)
|
|
@@ -164,7 +181,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
164
181
|
})
|
|
165
182
|
|
|
166
183
|
test('invokeRaw keeps a non-JSON error body instead of failing to parse it', async () => {
|
|
167
|
-
const actors =
|
|
184
|
+
const actors = makePersonas()
|
|
168
185
|
const res = await actors.manager!.invokeRaw('html-error', {})
|
|
169
186
|
|
|
170
187
|
assert.equal(res.status, 500)
|
|
@@ -174,14 +191,14 @@ describe('HttpScenarioActor', async () => {
|
|
|
174
191
|
})
|
|
175
192
|
|
|
176
193
|
test('invokeRaw reports an empty body as an empty string', async () => {
|
|
177
|
-
const actors =
|
|
194
|
+
const actors = makePersonas()
|
|
178
195
|
const res = await actors.manager!.invokeRaw('listTodos', {})
|
|
179
196
|
|
|
180
197
|
assert.equal(typeof res.serialized, 'string')
|
|
181
198
|
})
|
|
182
199
|
|
|
183
200
|
test('invokeRaw passes extra headers through', async () => {
|
|
184
|
-
const actors =
|
|
201
|
+
const actors = makePersonas()
|
|
185
202
|
const res = await actors.manager!.invokeRaw(
|
|
186
203
|
'whoAmI',
|
|
187
204
|
{},
|
|
@@ -192,7 +209,7 @@ describe('HttpScenarioActor', async () => {
|
|
|
192
209
|
})
|
|
193
210
|
|
|
194
211
|
test('invoke still throws on a refusal, naming the status and body', async () => {
|
|
195
|
-
const actors =
|
|
212
|
+
const actors = makePersonas()
|
|
196
213
|
await assert.rejects(
|
|
197
214
|
actors.customer!.invoke('forbidden', {}),
|
|
198
215
|
/'forbidden' as 'customer' returned 403.*MissingScopeError/
|
|
@@ -200,10 +217,10 @@ describe('HttpScenarioActor', async () => {
|
|
|
200
217
|
})
|
|
201
218
|
|
|
202
219
|
test('a wrong impersonation secret surfaces status and body', async () => {
|
|
203
|
-
const actors =
|
|
220
|
+
const actors = makePersonas('wrong-secret')
|
|
204
221
|
await assert.rejects(
|
|
205
222
|
actors.customer!.invoke('ping', {}),
|
|
206
|
-
/
|
|
223
|
+
/persona sign-in failed for 'customer' \(401\).*bad actor secret/
|
|
207
224
|
)
|
|
208
225
|
})
|
|
209
226
|
})
|