@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
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { describe, test } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
flattenSystemRoleDefinitions,
|
|
6
|
+
validateAndBuildSystemRoleDefinitionsMeta,
|
|
7
|
+
} from './validate-role-definitions.js'
|
|
8
|
+
import type { SystemRoleDefinitions } from './role.types.js'
|
|
9
|
+
|
|
10
|
+
const defs = (...d: SystemRoleDefinitions): SystemRoleDefinitions => d
|
|
11
|
+
|
|
12
|
+
describe('system role validation', () => {
|
|
13
|
+
test('keys definitions by name', () => {
|
|
14
|
+
const meta = validateAndBuildSystemRoleDefinitionsMeta(
|
|
15
|
+
defs(
|
|
16
|
+
{ name: 'buyer', scopes: ['orders:create'], description: 'Buys' },
|
|
17
|
+
{ name: 'admin', scopes: ['admin'] }
|
|
18
|
+
)
|
|
19
|
+
)
|
|
20
|
+
assert.deepEqual(Object.keys(meta), ['buyer', 'admin'])
|
|
21
|
+
assert.equal(meta.buyer?.description, 'Buys')
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
test('a name containing the scope separator is refused', () => {
|
|
25
|
+
assert.throws(
|
|
26
|
+
() =>
|
|
27
|
+
validateAndBuildSystemRoleDefinitionsMeta(
|
|
28
|
+
defs({ name: 'admin:billing', scopes: [] })
|
|
29
|
+
),
|
|
30
|
+
/contains the ':' separator/
|
|
31
|
+
)
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
test('an empty name is refused', () => {
|
|
35
|
+
assert.throws(
|
|
36
|
+
() =>
|
|
37
|
+
validateAndBuildSystemRoleDefinitionsMeta(
|
|
38
|
+
defs({ name: '', scopes: [] })
|
|
39
|
+
),
|
|
40
|
+
/empty name/
|
|
41
|
+
)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
// An addon and its host both declaring `admin` is legitimate; the second is
|
|
45
|
+
// redundant rather than conflicting, so long as it says the same thing.
|
|
46
|
+
test('an identical redeclaration is allowed', () => {
|
|
47
|
+
const meta = validateAndBuildSystemRoleDefinitionsMeta(
|
|
48
|
+
defs(
|
|
49
|
+
{ name: 'admin', scopes: ['admin'], sourceFile: 'a.ts' },
|
|
50
|
+
{ name: 'admin', scopes: ['admin'], sourceFile: 'b.ts' }
|
|
51
|
+
)
|
|
52
|
+
)
|
|
53
|
+
assert.equal(Object.keys(meta).length, 1)
|
|
54
|
+
assert.equal(meta.admin?.sourceFile, 'a.ts')
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test('scope order does not make two declarations different', () => {
|
|
58
|
+
assert.doesNotThrow(() =>
|
|
59
|
+
validateAndBuildSystemRoleDefinitionsMeta(
|
|
60
|
+
defs(
|
|
61
|
+
{ name: 'buyer', scopes: ['a', 'b'], sourceFile: 'a.ts' },
|
|
62
|
+
{ name: 'buyer', scopes: ['b', 'a'], sourceFile: 'b.ts' }
|
|
63
|
+
)
|
|
64
|
+
)
|
|
65
|
+
)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
test('a conflicting redeclaration names both files', () => {
|
|
69
|
+
assert.throws(
|
|
70
|
+
() =>
|
|
71
|
+
validateAndBuildSystemRoleDefinitionsMeta(
|
|
72
|
+
defs(
|
|
73
|
+
{ name: 'buyer', scopes: ['a'], sourceFile: 'a.ts' },
|
|
74
|
+
{ name: 'buyer', scopes: ['a', 'b'], sourceFile: 'b.ts' }
|
|
75
|
+
)
|
|
76
|
+
),
|
|
77
|
+
/a\.ts[\s\S]*b\.ts/
|
|
78
|
+
)
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
describe('flattening', () => {
|
|
83
|
+
test('deduplicates by name, keeping the first', () => {
|
|
84
|
+
const flat = flattenSystemRoleDefinitions(
|
|
85
|
+
defs(
|
|
86
|
+
{ name: 'admin', scopes: ['admin'], description: 'first' },
|
|
87
|
+
{ name: 'admin', scopes: ['admin'], description: 'second' },
|
|
88
|
+
{ name: 'buyer', scopes: [] }
|
|
89
|
+
)
|
|
90
|
+
)
|
|
91
|
+
assert.deepEqual(
|
|
92
|
+
flat.map((r) => r.name),
|
|
93
|
+
['admin', 'buyer']
|
|
94
|
+
)
|
|
95
|
+
assert.equal(flat[0]?.description, 'first')
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
test('copies the scope array rather than aliasing the declaration', () => {
|
|
99
|
+
const definition = { name: 'buyer', scopes: ['a'] }
|
|
100
|
+
const flat = flattenSystemRoleDefinitions(defs(definition))
|
|
101
|
+
flat[0]!.scopes.push('b')
|
|
102
|
+
assert.deepEqual(definition.scopes, ['a'])
|
|
103
|
+
})
|
|
104
|
+
})
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A system role: a named set of scopes that ships with the product.
|
|
3
|
+
*
|
|
4
|
+
* System roles are declared in code, which is what separates them from the
|
|
5
|
+
* roles an admin composes in the console. The distinction is the one AWS draws
|
|
6
|
+
* between managed and customer-managed policies — a system role is part of the
|
|
7
|
+
* application's surface, so the console may show and grant it but must not
|
|
8
|
+
* rename, re-scope or delete it.
|
|
9
|
+
*/
|
|
10
|
+
export type CoreSystemRole = {
|
|
11
|
+
/** Short human-readable name, e.g. "Buyer". */
|
|
12
|
+
displayName?: string
|
|
13
|
+
/** Longer-form description, surfaced in the console when granting. */
|
|
14
|
+
description?: string
|
|
15
|
+
/**
|
|
16
|
+
* The scopes this role grants. Every id must be declared with
|
|
17
|
+
* `defineScope` — the inspector fails the build otherwise, so a role cannot
|
|
18
|
+
* quietly grant a scope that no function checks.
|
|
19
|
+
*/
|
|
20
|
+
scopes: string[]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* System roles to declare, keyed by name. A key must be non-empty and must not
|
|
25
|
+
* contain `:` — that separator belongs to scopes, and a role that looks like a
|
|
26
|
+
* scope id is a role nobody reads correctly.
|
|
27
|
+
*/
|
|
28
|
+
export type CoreSystemRoles = Record<string, CoreSystemRole>
|
|
29
|
+
|
|
30
|
+
export type SystemRoleDefinitionMeta = {
|
|
31
|
+
name: string
|
|
32
|
+
displayName?: string
|
|
33
|
+
description?: string
|
|
34
|
+
scopes: string[]
|
|
35
|
+
sourceFile?: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export type SystemRoleDefinitions = SystemRoleDefinitionMeta[]
|
|
39
|
+
export type SystemRoleDefinitionsMeta = Record<string, SystemRoleDefinitionMeta>
|
|
40
|
+
|
|
41
|
+
/** A declared system role, ready to sync into a scope store. */
|
|
42
|
+
export type SystemRole = {
|
|
43
|
+
name: string
|
|
44
|
+
displayName?: string
|
|
45
|
+
description?: string
|
|
46
|
+
scopes: string[]
|
|
47
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
SystemRole,
|
|
3
|
+
SystemRoleDefinitions,
|
|
4
|
+
SystemRoleDefinitionsMeta,
|
|
5
|
+
} from './role.types.js'
|
|
6
|
+
|
|
7
|
+
const SEPARATOR = ':'
|
|
8
|
+
|
|
9
|
+
const assertRoleName = (name: string): void => {
|
|
10
|
+
if (name.length === 0) {
|
|
11
|
+
throw new Error('A system role is declared with an empty name.')
|
|
12
|
+
}
|
|
13
|
+
if (name.includes(SEPARATOR)) {
|
|
14
|
+
throw new Error(
|
|
15
|
+
`System role '${name}' contains the '${SEPARATOR}' separator. ` +
|
|
16
|
+
`'${SEPARATOR}' delimits scope ids; a role named like a scope reads as one.`
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The declared roles as a flat list, deduplicated by name.
|
|
23
|
+
*
|
|
24
|
+
* A role may legitimately be declared more than once — an addon and its host
|
|
25
|
+
* app both contributing `admin`, say — and
|
|
26
|
+
* {@link validateAndBuildSystemRoleDefinitionsMeta} has already guaranteed
|
|
27
|
+
* those declarations are identical, so the second is redundant rather than
|
|
28
|
+
* conflicting. Collapsing here keeps codegen (which emits an object literal
|
|
29
|
+
* keyed by name) and a ScopeService (which syncs one row per role) honest.
|
|
30
|
+
*/
|
|
31
|
+
export const flattenSystemRoleDefinitions = (
|
|
32
|
+
definitions: SystemRoleDefinitions
|
|
33
|
+
): SystemRole[] => {
|
|
34
|
+
const seen = new Set<string>()
|
|
35
|
+
const out: SystemRole[] = []
|
|
36
|
+
for (const def of definitions) {
|
|
37
|
+
if (seen.has(def.name)) {
|
|
38
|
+
continue
|
|
39
|
+
}
|
|
40
|
+
seen.add(def.name)
|
|
41
|
+
out.push({
|
|
42
|
+
name: def.name,
|
|
43
|
+
displayName: def.displayName,
|
|
44
|
+
description: def.description,
|
|
45
|
+
scopes: [...def.scopes],
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
return out
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Validates declared system roles and keys them by name.
|
|
53
|
+
*
|
|
54
|
+
* Definitions sharing a name must grant the same scope set; a conflicting
|
|
55
|
+
* redeclaration is a hard error naming both source files. Order within
|
|
56
|
+
* `scopes` is not significant — two declarations listing the same scopes
|
|
57
|
+
* differently are the same role.
|
|
58
|
+
*/
|
|
59
|
+
export function validateAndBuildSystemRoleDefinitionsMeta(
|
|
60
|
+
definitions: SystemRoleDefinitions
|
|
61
|
+
): SystemRoleDefinitionsMeta {
|
|
62
|
+
const meta: SystemRoleDefinitionsMeta = {}
|
|
63
|
+
|
|
64
|
+
for (const def of definitions) {
|
|
65
|
+
assertRoleName(def.name)
|
|
66
|
+
|
|
67
|
+
const existing = meta[def.name]
|
|
68
|
+
if (existing) {
|
|
69
|
+
const sameScopes =
|
|
70
|
+
JSON.stringify([...existing.scopes].sort()) ===
|
|
71
|
+
JSON.stringify([...def.scopes].sort())
|
|
72
|
+
if (!sameScopes) {
|
|
73
|
+
throw new Error(
|
|
74
|
+
`System role '${def.name}' is declared with different scopes.\n` +
|
|
75
|
+
` First declaration: ${existing.sourceFile ?? 'unknown'}\n` +
|
|
76
|
+
` Second declaration: ${def.sourceFile ?? 'unknown'}\n` +
|
|
77
|
+
`Roles sharing a name must grant the same scopes.`
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
continue
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
meta[def.name] = {
|
|
84
|
+
name: def.name,
|
|
85
|
+
displayName: def.displayName,
|
|
86
|
+
description: def.description,
|
|
87
|
+
scopes: [...def.scopes],
|
|
88
|
+
sourceFile: def.sourceFile,
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return meta
|
|
93
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { beforeEach, describe, test } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
3
|
+
|
|
4
|
+
import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
|
|
5
|
+
import { pikkuState, resetPikkuState } from '../../pikku-state.js'
|
|
6
|
+
import {
|
|
7
|
+
addTagMiddleware,
|
|
8
|
+
clearMiddlewareCache,
|
|
9
|
+
} from '../../middleware-runner.js'
|
|
10
|
+
import { ForbiddenError } from '../../errors/errors.js'
|
|
11
|
+
import {
|
|
12
|
+
resolveAddonAuth,
|
|
13
|
+
resolveAddonTags,
|
|
14
|
+
wireAddon,
|
|
15
|
+
} from './wire-addon.js'
|
|
16
|
+
|
|
17
|
+
const ADDON_PACKAGE = '@addon/console'
|
|
18
|
+
|
|
19
|
+
const createServices = () =>
|
|
20
|
+
({
|
|
21
|
+
logger: {
|
|
22
|
+
debug: () => {},
|
|
23
|
+
info: () => {},
|
|
24
|
+
warn: () => {},
|
|
25
|
+
error: () => {},
|
|
26
|
+
},
|
|
27
|
+
}) as never
|
|
28
|
+
|
|
29
|
+
const registerAddonFunction = (funcName: string) => {
|
|
30
|
+
addFunction(funcName, { func: async () => 'ok' } as never, ADDON_PACKAGE)
|
|
31
|
+
pikkuState(ADDON_PACKAGE, 'function', 'meta')[funcName] = {
|
|
32
|
+
name: funcName,
|
|
33
|
+
sessionless: true,
|
|
34
|
+
permissions: [],
|
|
35
|
+
} as never
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const session = () => ({ userId: 'u1' }) as never
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* How an addon function is reached over a directly-wired route: the inspector
|
|
42
|
+
* records the addon package on the wiring meta and the runner hands it to
|
|
43
|
+
* `runPikkuFunc`, never passing through namespace resolution.
|
|
44
|
+
*/
|
|
45
|
+
const callOverDirectWiring = (
|
|
46
|
+
funcName: string,
|
|
47
|
+
{
|
|
48
|
+
wireType = 'http',
|
|
49
|
+
withSession = false,
|
|
50
|
+
auth,
|
|
51
|
+
}: {
|
|
52
|
+
wireType?: string
|
|
53
|
+
withSession?: boolean
|
|
54
|
+
auth?: boolean
|
|
55
|
+
} = {}
|
|
56
|
+
) =>
|
|
57
|
+
runPikkuFunc(wireType as never, `${wireType}:/console/thing`, funcName, {
|
|
58
|
+
singletonServices: createServices(),
|
|
59
|
+
data: () => ({}),
|
|
60
|
+
auth,
|
|
61
|
+
packageName: ADDON_PACKAGE,
|
|
62
|
+
wire: (withSession ? { session: session() } : {}) as never,
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
beforeEach(() => {
|
|
66
|
+
resetPikkuState()
|
|
67
|
+
// resetPikkuState deliberately leaves runtime caches alone; combineMiddleware
|
|
68
|
+
// keys its cache on wireType/wireId, which these tests reuse.
|
|
69
|
+
clearMiddlewareCache()
|
|
70
|
+
pikkuState(null, 'package', 'singletonServices', createServices())
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
describe('resolveAddonAuth', () => {
|
|
74
|
+
test('is false for a non-addon package', () => {
|
|
75
|
+
assert.equal(resolveAddonAuth(null), false)
|
|
76
|
+
assert.equal(resolveAddonAuth('@addon/other'), false)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
test('reads the named instance when one is resolved', () => {
|
|
80
|
+
wireAddon({ name: 'live', package: ADDON_PACKAGE, auth: true })
|
|
81
|
+
wireAddon({ name: 'test', package: ADDON_PACKAGE, auth: false })
|
|
82
|
+
|
|
83
|
+
assert.equal(resolveAddonAuth(ADDON_PACKAGE, 'live'), true)
|
|
84
|
+
assert.equal(resolveAddonAuth(ADDON_PACKAGE, 'test'), false)
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
test('takes the stricter reading across namespaces on the unnamed path', () => {
|
|
88
|
+
wireAddon({ name: 'live', package: ADDON_PACKAGE, auth: true })
|
|
89
|
+
wireAddon({ name: 'test', package: ADDON_PACKAGE, auth: false })
|
|
90
|
+
|
|
91
|
+
assert.equal(resolveAddonAuth(ADDON_PACKAGE), true)
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
describe('resolveAddonTags', () => {
|
|
96
|
+
test('unions tags across every namespace the package is wired under', () => {
|
|
97
|
+
wireAddon({ name: 'live', package: ADDON_PACKAGE, tags: ['admin'] })
|
|
98
|
+
wireAddon({ name: 'test', package: ADDON_PACKAGE, tags: ['sandbox'] })
|
|
99
|
+
|
|
100
|
+
assert.deepEqual(resolveAddonTags(ADDON_PACKAGE).sort(), [
|
|
101
|
+
'admin',
|
|
102
|
+
'sandbox',
|
|
103
|
+
])
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
test('reads the named instance exactly when one is resolved', () => {
|
|
107
|
+
wireAddon({ name: 'live', package: ADDON_PACKAGE, tags: ['admin'] })
|
|
108
|
+
wireAddon({ name: 'test', package: ADDON_PACKAGE, tags: ['sandbox'] })
|
|
109
|
+
|
|
110
|
+
assert.deepEqual(resolveAddonTags(ADDON_PACKAGE, 'live'), ['admin'])
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
describe('wireAddon auth on direct wirings', () => {
|
|
115
|
+
test('requires a session for a sessionless addon function', async () => {
|
|
116
|
+
wireAddon({ name: 'console', package: ADDON_PACKAGE, auth: true })
|
|
117
|
+
registerAddonFunction('credentialGet')
|
|
118
|
+
|
|
119
|
+
await assert.rejects(
|
|
120
|
+
() => callOverDirectWiring('credentialGet'),
|
|
121
|
+
ForbiddenError
|
|
122
|
+
)
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
test('allows the call once a session is present', async () => {
|
|
126
|
+
wireAddon({ name: 'console', package: ADDON_PACKAGE, auth: true })
|
|
127
|
+
registerAddonFunction('credentialGet')
|
|
128
|
+
|
|
129
|
+
assert.equal(
|
|
130
|
+
await callOverDirectWiring('credentialGet', { withSession: true }),
|
|
131
|
+
'ok'
|
|
132
|
+
)
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
test('leaves an addon wired without auth ungated', async () => {
|
|
136
|
+
wireAddon({ name: 'console', package: ADDON_PACKAGE })
|
|
137
|
+
registerAddonFunction('credentialGet')
|
|
138
|
+
|
|
139
|
+
assert.equal(await callOverDirectWiring('credentialGet'), 'ok')
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
test('does not weaken a wiring that already requires auth', async () => {
|
|
143
|
+
wireAddon({ name: 'console', package: ADDON_PACKAGE, auth: false })
|
|
144
|
+
registerAddonFunction('credentialGet')
|
|
145
|
+
|
|
146
|
+
await assert.rejects(
|
|
147
|
+
() => callOverDirectWiring('credentialGet', { auth: true }),
|
|
148
|
+
ForbiddenError
|
|
149
|
+
)
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
test('gates every wiring kind, not just http', async () => {
|
|
153
|
+
wireAddon({ name: 'console', package: ADDON_PACKAGE, auth: true })
|
|
154
|
+
registerAddonFunction('credentialGet')
|
|
155
|
+
|
|
156
|
+
for (const wireType of [
|
|
157
|
+
'http',
|
|
158
|
+
'channel',
|
|
159
|
+
'queue',
|
|
160
|
+
'scheduler',
|
|
161
|
+
'cli',
|
|
162
|
+
'mcp',
|
|
163
|
+
'trigger',
|
|
164
|
+
'gateway',
|
|
165
|
+
]) {
|
|
166
|
+
await assert.rejects(
|
|
167
|
+
() => callOverDirectWiring('credentialGet', { wireType }),
|
|
168
|
+
ForbiddenError,
|
|
169
|
+
`${wireType} should have been gated`
|
|
170
|
+
)
|
|
171
|
+
}
|
|
172
|
+
})
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
describe('wireAddon tags on direct wirings', () => {
|
|
176
|
+
test('runs middleware the app registered for the addon tag', async () => {
|
|
177
|
+
const seen: string[] = []
|
|
178
|
+
addTagMiddleware('admin', [
|
|
179
|
+
(async (_services: never, _wire: never, next: () => Promise<void>) => {
|
|
180
|
+
seen.push('admin')
|
|
181
|
+
await next()
|
|
182
|
+
}) as never,
|
|
183
|
+
])
|
|
184
|
+
|
|
185
|
+
wireAddon({ name: 'console', package: ADDON_PACKAGE, tags: ['admin'] })
|
|
186
|
+
registerAddonFunction('credentialGet')
|
|
187
|
+
|
|
188
|
+
assert.equal(await callOverDirectWiring('credentialGet'), 'ok')
|
|
189
|
+
assert.deepEqual(seen, ['admin'])
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
test('lets that middleware reject the call', async () => {
|
|
193
|
+
addTagMiddleware('admin', [
|
|
194
|
+
(async () => {
|
|
195
|
+
throw new ForbiddenError('nope')
|
|
196
|
+
}) as never,
|
|
197
|
+
])
|
|
198
|
+
|
|
199
|
+
wireAddon({ name: 'console', package: ADDON_PACKAGE, tags: ['admin'] })
|
|
200
|
+
registerAddonFunction('credentialGet')
|
|
201
|
+
|
|
202
|
+
await assert.rejects(
|
|
203
|
+
() => callOverDirectWiring('credentialGet'),
|
|
204
|
+
ForbiddenError
|
|
205
|
+
)
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
test('leaves an addon wired without tags alone', async () => {
|
|
209
|
+
const seen: string[] = []
|
|
210
|
+
addTagMiddleware('admin', [
|
|
211
|
+
(async (_services: never, _wire: never, next: () => Promise<void>) => {
|
|
212
|
+
seen.push('admin')
|
|
213
|
+
await next()
|
|
214
|
+
}) as never,
|
|
215
|
+
])
|
|
216
|
+
|
|
217
|
+
wireAddon({ name: 'console', package: ADDON_PACKAGE })
|
|
218
|
+
registerAddonFunction('credentialGet')
|
|
219
|
+
|
|
220
|
+
assert.equal(await callOverDirectWiring('credentialGet'), 'ok')
|
|
221
|
+
assert.deepEqual(seen, [])
|
|
222
|
+
})
|
|
223
|
+
})
|
|
@@ -6,11 +6,6 @@ import type {
|
|
|
6
6
|
import type { SecretService } from '../../services/secret-service.js'
|
|
7
7
|
import type { VariablesService } from '../../services/variables-service.js'
|
|
8
8
|
|
|
9
|
-
/**
|
|
10
|
-
* A single wired addon instance: a namespace (wireAddon `name`) plus the
|
|
11
|
-
* per-instance name-aliases that remap the logical names the addon reads to
|
|
12
|
-
* the actual project secret/variable/credential names.
|
|
13
|
-
*/
|
|
14
9
|
export type AddonInstance = {
|
|
15
10
|
namespace: string
|
|
16
11
|
secretOverrides?: Record<string, string>
|
|
@@ -18,10 +13,6 @@ export type AddonInstance = {
|
|
|
18
13
|
credentialOverrides?: Record<string, string>
|
|
19
14
|
}
|
|
20
15
|
|
|
21
|
-
/**
|
|
22
|
-
* Wrap a SecretService so that the logical secret names an addon reads are
|
|
23
|
-
* remapped to the actual project secret names via the instance's overrides.
|
|
24
|
-
*/
|
|
25
16
|
const aliasSecretService = (
|
|
26
17
|
secrets: SecretService,
|
|
27
18
|
overrides: Record<string, string>
|
|
@@ -46,10 +37,6 @@ const aliasSecretService = (
|
|
|
46
37
|
}
|
|
47
38
|
}
|
|
48
39
|
|
|
49
|
-
/**
|
|
50
|
-
* Wrap a VariablesService so that the logical variable names an addon reads
|
|
51
|
-
* are remapped to the actual project variable names via the instance's overrides.
|
|
52
|
-
*/
|
|
53
40
|
const aliasVariablesService = (
|
|
54
41
|
variables: VariablesService,
|
|
55
42
|
overrides: Record<string, string>
|
|
@@ -78,10 +65,6 @@ const aliasVariablesService = (
|
|
|
78
65
|
}
|
|
79
66
|
}
|
|
80
67
|
|
|
81
|
-
/**
|
|
82
|
-
* Find the consumer-defined namespace (from wireAddon) for a given addon package.
|
|
83
|
-
* Returns null if the package isn't registered as an addon.
|
|
84
|
-
*/
|
|
85
68
|
const findAddonNamespaceForPackage = (packageName: string): string | null => {
|
|
86
69
|
const addons = pikkuState(null, 'addons', 'packages')
|
|
87
70
|
if (!addons) return null
|
|
@@ -91,18 +74,6 @@ const findAddonNamespaceForPackage = (packageName: string): string | null => {
|
|
|
91
74
|
return null
|
|
92
75
|
}
|
|
93
76
|
|
|
94
|
-
/**
|
|
95
|
-
* Wrap a workflow service so that bare workflow names passed from inside an
|
|
96
|
-
* addon function are auto-prefixed with the addon's consumer-facing namespace.
|
|
97
|
-
* Without this, `runToCompletion('myWorkflow')` from inside an addon misses
|
|
98
|
-
* the workflow registered under the addon's package scope and throws
|
|
99
|
-
* WorkflowNotFoundError — forcing addons to hardcode their consumer-defined
|
|
100
|
-
* namespace, which couples the addon to its caller.
|
|
101
|
-
*
|
|
102
|
-
* Explicit `'ns:name'` and bare names that already exist in root meta are
|
|
103
|
-
* unaffected; only bare names that would otherwise miss resolution get
|
|
104
|
-
* prefixed.
|
|
105
|
-
*/
|
|
106
77
|
const wrapWorkflowServiceForPackage = <T extends object>(
|
|
107
78
|
service: T,
|
|
108
79
|
packageName: string,
|
|
@@ -114,8 +85,6 @@ const wrapWorkflowServiceForPackage = <T extends object>(
|
|
|
114
85
|
const original = Reflect.get(target, prop, receiver) as Function
|
|
115
86
|
return function (this: any, name: string, ...rest: any[]) {
|
|
116
87
|
if (typeof name === 'string' && !name.includes(':')) {
|
|
117
|
-
// Prefer the known instance namespace; fall back to the
|
|
118
|
-
// package's sole namespace when invoked without an instance.
|
|
119
88
|
const ns = namespace ?? findAddonNamespaceForPackage(packageName)
|
|
120
89
|
if (ns) {
|
|
121
90
|
name = `${ns}:${name}`
|
|
@@ -129,23 +98,11 @@ const wrapWorkflowServiceForPackage = <T extends object>(
|
|
|
129
98
|
})
|
|
130
99
|
}
|
|
131
100
|
|
|
132
|
-
/**
|
|
133
|
-
* Get or create singleton services for an addon instance.
|
|
134
|
-
* Services are cached in pikkuState to avoid recreation on each call.
|
|
135
|
-
*
|
|
136
|
-
* @param packageName - The addon package name
|
|
137
|
-
* @param parentServices - The parent/caller's singleton services (used as base)
|
|
138
|
-
* @param addonInstance - The wired instance whose overrides shape the services
|
|
139
|
-
* @returns The instance's singleton services
|
|
140
|
-
*/
|
|
141
101
|
export const getOrCreatePackageSingletonServices = async (
|
|
142
102
|
packageName: string,
|
|
143
103
|
parentServices: CoreSingletonServices,
|
|
144
104
|
addonInstance?: AddonInstance
|
|
145
105
|
): Promise<CoreSingletonServices> => {
|
|
146
|
-
// Cache per instance (namespace), not per package, so two instances of one
|
|
147
|
-
// package get separate services built with their own overrides. A bare
|
|
148
|
-
// package-scoped call (no instance) falls back to per-package caching.
|
|
149
106
|
const cacheKey = addonInstance?.namespace ?? packageName
|
|
150
107
|
|
|
151
108
|
const cachedServices = pikkuState(cacheKey, 'package', 'singletonServices')
|
|
@@ -155,13 +112,9 @@ export const getOrCreatePackageSingletonServices = async (
|
|
|
155
112
|
|
|
156
113
|
const factories = pikkuState(packageName, 'package', 'factories')
|
|
157
114
|
if (!factories || !factories.createSingletonServices) {
|
|
158
|
-
// No factories registered, use parent services
|
|
159
115
|
return parentServices
|
|
160
116
|
}
|
|
161
117
|
|
|
162
|
-
// Apply this instance's secret/variable overrides by aliasing the resolver
|
|
163
|
-
// services the addon reads from, so its createSingletonServices resolves
|
|
164
|
-
// instance-specific secrets/variables.
|
|
165
118
|
let existingServices = parentServices
|
|
166
119
|
if (addonInstance?.secretOverrides && parentServices.secrets) {
|
|
167
120
|
existingServices = {
|
|
@@ -182,20 +135,16 @@ export const getOrCreatePackageSingletonServices = async (
|
|
|
182
135
|
}
|
|
183
136
|
}
|
|
184
137
|
|
|
185
|
-
// Create config for the package (use parent config if no factory)
|
|
186
138
|
let config: CoreConfig = existingServices.config
|
|
187
139
|
if (factories.createConfig) {
|
|
188
140
|
config = await factories.createConfig(existingServices.variables)
|
|
189
141
|
}
|
|
190
142
|
|
|
191
|
-
// Create singleton services for the package, passing parent services as existing
|
|
192
143
|
const packageServices = await factories.createSingletonServices(
|
|
193
144
|
config,
|
|
194
145
|
existingServices
|
|
195
146
|
)
|
|
196
147
|
|
|
197
|
-
// Wrap workflowService so that bare names used inside the addon's functions
|
|
198
|
-
// resolve to workflows registered under the addon's package scope.
|
|
199
148
|
if (
|
|
200
149
|
packageServices.workflowService &&
|
|
201
150
|
typeof packageServices.workflowService === 'object'
|
|
@@ -212,11 +161,6 @@ export const getOrCreatePackageSingletonServices = async (
|
|
|
212
161
|
return packageServices
|
|
213
162
|
}
|
|
214
163
|
|
|
215
|
-
/**
|
|
216
|
-
* Build the addon instance descriptor (namespace + per-instance overrides) for
|
|
217
|
-
* a bare intra-addon call, using the namespace currently executing on the wire.
|
|
218
|
-
* Returns undefined unless that namespace maps to the resolved package.
|
|
219
|
-
*/
|
|
220
164
|
export const addonInstanceForNamespace = (
|
|
221
165
|
namespace: string | undefined,
|
|
222
166
|
expectedPackage: string
|