@pikku/core 0.12.72 → 0.12.77
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 +1171 -0
- package/dist/column-form.d.ts +32 -0
- package/dist/column-form.js +42 -0
- package/dist/crypto-utils.d.ts +43 -7
- package/dist/crypto-utils.js +163 -42
- package/dist/data-classification.d.ts +44 -0
- 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 +57 -136
- package/dist/function/functions.types.js +0 -58
- package/dist/function/index.d.ts +1 -1
- 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 +11 -5
- package/dist/index.js +7 -2
- 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 +5 -41
- 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 +4 -3
- 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 +9 -8
- 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/secret-value.d.ts +56 -0
- package/dist/secret-value.js +46 -0
- 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.d.ts +74 -4
- package/dist/services/audit-service.js +8 -7
- package/dist/services/content-service.d.ts +1 -46
- package/dist/services/credential-service.d.ts +3 -40
- package/dist/services/credential-wire-service.d.ts +5 -0
- package/dist/services/credential-wire-service.js +9 -1
- package/dist/services/deployment-service.d.ts +3 -9
- package/dist/services/email-service.d.ts +2 -1
- 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 +8 -9
- package/dist/services/index.js +3 -6
- 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-request-handler.d.ts +29 -0
- package/dist/services/local-content-request-handler.js +176 -0
- 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 +4 -7
- package/dist/services/local-secrets.js +7 -7
- package/dist/services/logger-console.d.ts +3 -7
- package/dist/services/logger-console.js +3 -7
- package/dist/services/logger.d.ts +22 -40
- 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 +10 -42
- 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 +4 -7
- 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 +12 -35
- 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 +5 -11
- 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 +21 -64
- package/dist/services/webhook-service.js +6 -20
- package/dist/services/workflow-service.d.ts +3 -15
- package/dist/testing/service-tests.js +6 -23
- package/dist/time-utils.d.ts +0 -16
- package/dist/time-utils.js +1 -19
- package/dist/types/core.types.d.ts +120 -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 +46 -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 +65 -132
- 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 +63 -22
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
- package/dist/wirings/ai-agent/ai-agent-stream.js +180 -64
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +124 -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 +59 -1
- package/dist/wirings/ai-agent/voice-input.js +90 -12
- package/dist/wirings/ai-agent/voice-output.d.ts +69 -1
- package/dist/wirings/ai-agent/voice-output.js +162 -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 +38 -0
- package/dist/wirings/cli/channel/cli-raw-client-runner.js +129 -0
- package/dist/wirings/cli/channel/index.d.ts +5 -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 +32 -0
- package/dist/wirings/persona/define-personas.js +31 -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 +136 -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 +103 -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 +20 -90
- 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 +17 -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 +3 -13
- package/dist/wirings/rpc/remote-addon-auth.js +7 -11
- 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 +30 -0
- package/dist/wirings/virtual-user/index.js +10 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +54 -0
- package/dist/wirings/virtual-user/prepare-virtual-user-run.js +49 -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-run-store.d.ts +90 -0
- package/dist/wirings/virtual-user/virtual-user-run-store.js +1 -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 +19 -15
- 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 -43
- 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 +1 -19
- 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 +84 -12
- 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 +5 -195
- 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/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +48 -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-column-form-is-an-axis-of-its-own.md +84 -0
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +41 -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 +117 -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/one-project-shape-check-two-validators.md +53 -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/scenarios-live-in-files-named-for-them.md +48 -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/validate-checks-personas-through-a-shared-module.md +43 -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 +6 -2
- package/run-tests.sh +0 -0
- package/src/column-form.test.ts +97 -0
- package/src/column-form.ts +58 -0
- package/src/crypto-utils.test.ts +460 -19
- package/src/crypto-utils.ts +306 -59
- package/src/data-classification.ts +45 -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 +95 -138
- package/src/function/index.ts +1 -0
- 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 +84 -3
- package/src/middleware/auth-apikey.test.ts +0 -1
- package/src/middleware/auth-apikey.ts +0 -17
- package/src/middleware/auth-bearer.test.ts +3 -5
- package/src/middleware/auth-bearer.ts +5 -41
- 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 +26 -10
- package/src/middleware/remote-auth.ts +11 -3
- 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 +173 -0
- package/src/remote.ts +18 -8
- package/src/schema.ts +5 -39
- package/src/scopes.ts +7 -48
- package/src/secret-value.test.ts +204 -0
- package/src/secret-value.ts +111 -0
- 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 +88 -11
- 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/credential-wire-service.ts +9 -1
- package/src/services/deployment-service.ts +3 -9
- package/src/services/email-service.ts +3 -1
- 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 +23 -18
- package/src/services/istanbul-coverage-service.ts +2 -8
- package/src/services/jwt-service.ts +1 -16
- package/src/services/local-content-request-handler.test.ts +202 -0
- package/src/services/local-content-request-handler.ts +267 -0
- 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.test.ts +20 -5
- package/src/services/local-secrets.ts +15 -11
- package/src/services/logger-console.test.ts +0 -1
- package/src/services/logger-console.ts +3 -7
- package/src/services/logger.ts +31 -46
- 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.test.ts +2 -1
- package/src/services/queue-webhook-service.ts +10 -42
- 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 +4 -7
- 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 +12 -35
- 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 +12 -14
- package/src/services/v8-coverage-service.ts +3 -6
- package/src/services/variables-service.ts +1 -8
- package/src/services/webhook-service.ts +23 -64
- package/src/services/workflow-service.ts +3 -20
- package/src/testing/service-tests.ts +6 -32
- package/src/time-utils.ts +1 -19
- package/src/types/core.types.ts +137 -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 +91 -10
- package/src/wirings/ai-agent/ai-agent-agui.ts +49 -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 +89 -139
- 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 +85 -35
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
- package/src/wirings/ai-agent/ai-agent-stream.ts +224 -76
- package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +130 -5
- package/src/wirings/ai-agent/index.ts +37 -3
- package/src/wirings/ai-agent/voice-input.test.ts +137 -7
- package/src/wirings/ai-agent/voice-input.ts +96 -12
- package/src/wirings/ai-agent/voice-output.test.ts +512 -0
- package/src/wirings/ai-agent/voice-output.ts +243 -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 +185 -0
- package/src/wirings/cli/channel/index.ts +13 -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 +33 -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 +142 -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 +454 -0
- package/src/wirings/queue/queue-identity.ts +176 -0
- package/src/wirings/queue/queue-runner.ts +12 -31
- package/src/wirings/queue/queue.types.ts +25 -90
- package/src/wirings/queue/register-queue-helper.ts +0 -14
- package/src/wirings/queue/signed-queue-service.ts +60 -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 +9 -16
- package/src/wirings/rpc/rpc-runner.test.ts +192 -6
- 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 +88 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +115 -0
- package/src/wirings/virtual-user/prepare-virtual-user-run.ts +95 -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-run-store.ts +98 -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 +19 -20
- 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 -61
- 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.test.ts +5 -7
- package/src/wirings/workflow/scenario-prose.ts +1 -29
- package/src/wirings/workflow/scenario-service.test.ts +2 -10
- package/src/wirings/workflow/scenario-step-guards.ts +1 -14
- package/src/wirings/workflow/scenario-step.test.ts +163 -19
- package/src/wirings/workflow/scenario-step.types.ts +94 -12
- package/src/wirings/workflow/scenario-surface.test.ts +146 -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 +5 -201
- package/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.type-tests.json +12 -0
- 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,111 @@
|
|
|
1
|
+
import type { Secret } from './data-classification.js'
|
|
2
|
+
|
|
3
|
+
declare const secretValueBrand: unique symbol
|
|
4
|
+
|
|
5
|
+
export const REDACTED = '[secret]'
|
|
6
|
+
|
|
7
|
+
/** Runtime marker, resilient to duplicate copies of core. */
|
|
8
|
+
const SECRET_VALUE = Symbol.for('pikku.secretValue')
|
|
9
|
+
|
|
10
|
+
const NODE_INSPECT = Symbol.for('nodejs.util.inspect.custom')
|
|
11
|
+
|
|
12
|
+
export class SecretCoercionError extends Error {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(
|
|
15
|
+
`A secret was coerced to a string, which would write it out in the clear. Unwrap it deliberately with .reveal() at the point it reaches the wire.`
|
|
16
|
+
)
|
|
17
|
+
this.name = 'SecretCoercionError'
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A vault secret. Nominal, so it is not assignable to `string` and every
|
|
23
|
+
* concretely-typed sink rejects it; `.reveal()` is the one way out, and every
|
|
24
|
+
* call is a deliberate, greppable disclosure.
|
|
25
|
+
*
|
|
26
|
+
* The revealed value carries the erasable `Secret<T>` classification brand, so
|
|
27
|
+
* the inspector can still follow it one hop past the call.
|
|
28
|
+
*
|
|
29
|
+
* Structured serialization redacts to `[secret]` — an audit or log write must
|
|
30
|
+
* stay honest about the field without crashing the request. String coercion
|
|
31
|
+
* throws, because a template literal or concatenation is always a leak.
|
|
32
|
+
*/
|
|
33
|
+
export class SecretValue<T = string> {
|
|
34
|
+
declare readonly [secretValueBrand]: true
|
|
35
|
+
readonly [SECRET_VALUE] = true
|
|
36
|
+
|
|
37
|
+
readonly #value: T
|
|
38
|
+
|
|
39
|
+
constructor(value: T) {
|
|
40
|
+
this.#value = value
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
reveal(): Secret<T> {
|
|
44
|
+
return this.#value as Secret<T>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
toJSON(): string {
|
|
48
|
+
return REDACTED
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
[NODE_INSPECT](): string {
|
|
52
|
+
return REDACTED
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
toString(): never {
|
|
56
|
+
throw new SecretCoercionError()
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
[Symbol.toPrimitive](): never {
|
|
60
|
+
throw new SecretCoercionError()
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const createSecretValue = <T>(value: T): SecretValue<T> =>
|
|
65
|
+
new SecretValue(value)
|
|
66
|
+
|
|
67
|
+
export const isSecretValue = (value: unknown): value is SecretValue<unknown> =>
|
|
68
|
+
typeof value === 'object' && value !== null && SECRET_VALUE in value
|
|
69
|
+
|
|
70
|
+
type IsAny<T> = 0 extends 1 & T ? true : false
|
|
71
|
+
|
|
72
|
+
type Passthrough =
|
|
73
|
+
| Function
|
|
74
|
+
| Date
|
|
75
|
+
| RegExp
|
|
76
|
+
| Error
|
|
77
|
+
| ArrayBuffer
|
|
78
|
+
| ArrayBufferView
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Rejects a `SecretValue` anywhere in `T`, however deeply nested, by collapsing
|
|
82
|
+
* it to `never`.
|
|
83
|
+
*
|
|
84
|
+
* For sinks whose parameters are `any`, `unknown` or a free generic — loggers,
|
|
85
|
+
* queue payloads, channel messages — where nominality alone cannot help.
|
|
86
|
+
* `any` is passed through untouched: it cannot be guarded, and collapsing it
|
|
87
|
+
* would reject every legitimate call.
|
|
88
|
+
*
|
|
89
|
+
* `Promise`, `Map` and `Set` are recursed into rather than passed through. A
|
|
90
|
+
* mapped type cannot reach what they hold — mapping their keys yields their
|
|
91
|
+
* methods, not their contents — so treating them as opaque let a secret ride
|
|
92
|
+
* through inside one. `Promise` is the case that bites: `getSecret()` returns
|
|
93
|
+
* `Promise<SecretValue<T>>`, so a forgotten `await` would otherwise log a
|
|
94
|
+
* secret.
|
|
95
|
+
*/
|
|
96
|
+
export type Safe<T> =
|
|
97
|
+
IsAny<T> extends true
|
|
98
|
+
? T
|
|
99
|
+
: [Extract<T, SecretValue<any>>] extends [never]
|
|
100
|
+
? T extends Promise<infer V>
|
|
101
|
+
? Promise<Safe<V>>
|
|
102
|
+
: T extends Map<infer K, infer V>
|
|
103
|
+
? Map<Safe<K>, Safe<V>>
|
|
104
|
+
: T extends Set<infer V>
|
|
105
|
+
? Set<Safe<V>>
|
|
106
|
+
: T extends Passthrough
|
|
107
|
+
? T
|
|
108
|
+
: T extends object
|
|
109
|
+
? { [K in keyof T]: Safe<T[K]> }
|
|
110
|
+
: T
|
|
111
|
+
: never
|
|
@@ -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
|
}
|
|
@@ -4,6 +4,7 @@ import type {
|
|
|
4
4
|
PikkuWiringTypes,
|
|
5
5
|
} from '../types/core.types.js'
|
|
6
6
|
import type { Logger } from './logger.js'
|
|
7
|
+
import type { Safe } from '../secret-value.js'
|
|
7
8
|
|
|
8
9
|
export type AuditDurability = 'best-effort' | 'transactional'
|
|
9
10
|
export type AuditOutcome = 'success' | 'failed' | 'denied'
|
|
@@ -19,7 +20,19 @@ export type ResolvedAuditConfig = {
|
|
|
19
20
|
durability: AuditDurability
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Who an event happened under.
|
|
25
|
+
*
|
|
26
|
+
* A user, not an "actor": in pikku an actor is a synthetic person a scenario
|
|
27
|
+
* drives, flagged `actor` on the user row, and the overwhelming majority of
|
|
28
|
+
* audited events are caused by ordinary customers. Naming this `actor` made the
|
|
29
|
+
* synthetic case unsayable — `actor.actor === true` — and implied every
|
|
30
|
+
* recorded action was a test.
|
|
31
|
+
*
|
|
32
|
+
* `pikkuUserId` is the identity pikku resolves for every wire, so it is the one
|
|
33
|
+
* field a signed-out caller still leaves behind.
|
|
34
|
+
*/
|
|
35
|
+
export type AuditUserIdentity = {
|
|
23
36
|
userId?: string
|
|
24
37
|
orgId?: string
|
|
25
38
|
pikkuUserId?: string
|
|
@@ -37,16 +50,67 @@ export type AuditEvent = {
|
|
|
37
50
|
traceId?: string
|
|
38
51
|
transactionId?: string | null
|
|
39
52
|
queryId?: string | null
|
|
40
|
-
|
|
53
|
+
userIdentity?: AuditUserIdentity
|
|
41
54
|
input?: unknown
|
|
42
55
|
metadata?: Record<string, unknown>
|
|
43
56
|
}
|
|
44
57
|
|
|
45
58
|
export type AuditEventBatch = AuditEvent[]
|
|
46
59
|
|
|
60
|
+
/**
|
|
61
|
+
* A page of the trail, newest first, narrowed by the filters a reader picked.
|
|
62
|
+
*
|
|
63
|
+
* Every field is a conjunction, and an empty array is not a filter — it is
|
|
64
|
+
* "match nothing", which would otherwise read as "match everything" and quietly
|
|
65
|
+
* widen a scoped query.
|
|
66
|
+
*/
|
|
67
|
+
export type AuditQuery = {
|
|
68
|
+
/** Restrict to these users. */
|
|
69
|
+
userIds?: string[]
|
|
70
|
+
/** Restrict to these `AuditEvent['type']` values. */
|
|
71
|
+
types?: string[]
|
|
72
|
+
/** Restrict to one organisation. */
|
|
73
|
+
orgId?: string
|
|
74
|
+
/** Inclusive lower bound on `occurredAt` (ISO 8601). */
|
|
75
|
+
from?: string
|
|
76
|
+
/** Exclusive upper bound on `occurredAt` (ISO 8601). */
|
|
77
|
+
to?: string
|
|
78
|
+
limit?: number
|
|
79
|
+
offset?: number
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The distinct values present in the trail, for populating filter controls.
|
|
84
|
+
*
|
|
85
|
+
* Computed over the whole trail rather than the current page — a filter list
|
|
86
|
+
* that only offered what the current page happens to show could never be used
|
|
87
|
+
* to reach anything else.
|
|
88
|
+
*/
|
|
89
|
+
export type AuditFacets = {
|
|
90
|
+
userIds: string[]
|
|
91
|
+
types: string[]
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export type AuditQueryResult = {
|
|
95
|
+
events: AuditEvent[]
|
|
96
|
+
/** Offset of the next page, or `null` at the end. */
|
|
97
|
+
nextCursor: number | null
|
|
98
|
+
/** Present only when the caller asked for it — it costs two extra scans. */
|
|
99
|
+
facets?: AuditFacets
|
|
100
|
+
}
|
|
101
|
+
|
|
47
102
|
export interface AuditService {
|
|
48
103
|
audit(event: AuditEvent): Promise<void>
|
|
49
104
|
write?(batch: AuditEventBatch): Promise<void>
|
|
105
|
+
/**
|
|
106
|
+
* The read side. Optional because a sink can legitimately be write-only — a
|
|
107
|
+
* queue producer that hands events to another system has nothing to read
|
|
108
|
+
* back. A reader that finds this absent should say the trail is not readable
|
|
109
|
+
* here rather than that it is empty; the two are very different answers.
|
|
110
|
+
*/
|
|
111
|
+
query?(query: AuditQuery): Promise<AuditQueryResult>
|
|
112
|
+
/** Distinct users and types across the whole trail. Paired with {@link query}. */
|
|
113
|
+
facets?(): Promise<AuditFacets>
|
|
50
114
|
}
|
|
51
115
|
|
|
52
116
|
export class NoopAuditService implements AuditService {
|
|
@@ -57,9 +121,18 @@ export class NoopAuditService implements AuditService {
|
|
|
57
121
|
|
|
58
122
|
export type AuditLogWriteInput = Omit<AuditEvent, 'occurredAt'>
|
|
59
123
|
|
|
124
|
+
/**
|
|
125
|
+
* The audit an invocation writes to. `write` is `Safe<>`-guarded like the
|
|
126
|
+
* logger: an audit event carries `input` and `metadata` as `unknown`, so
|
|
127
|
+
* nominality alone cannot stop a `SecretValue` landing in one. A secret
|
|
128
|
+
* anywhere in the event, however deeply nested, collapses to `never`.
|
|
129
|
+
*
|
|
130
|
+
* An unrevealed `SecretValue` would serialize as `[secret]` anyway; the guard
|
|
131
|
+
* is what makes that an explicit choice rather than a near miss.
|
|
132
|
+
*/
|
|
60
133
|
export interface AuditLog {
|
|
61
134
|
readonly config: ResolvedAuditConfig | undefined
|
|
62
|
-
write(event:
|
|
135
|
+
write<E extends AuditLogWriteInput>(event: Safe<E>): Promise<void>
|
|
63
136
|
flush(): Promise<void>
|
|
64
137
|
close(): Promise<void>
|
|
65
138
|
}
|
|
@@ -76,8 +149,7 @@ class DisabledInvocationAudit implements AuditLog {
|
|
|
76
149
|
async write(_event: AuditLogWriteInput): Promise<void> {
|
|
77
150
|
if (!this.warned) {
|
|
78
151
|
this.warned = true
|
|
79
|
-
//
|
|
80
|
-
// a dropped audit write must never be invisible.
|
|
152
|
+
// knowledge: decisions/security/a-dropped-audit-write-is-always-logged.md
|
|
81
153
|
const logger = (this.wire as any).logger ?? this.logger
|
|
82
154
|
logger?.warn?.(
|
|
83
155
|
`audit.write() dropped for '${this.wire.functionId ?? 'unknown function'}' — the function has no audit config (set audit: true on it)`
|
|
@@ -150,7 +222,8 @@ class InvocationAuditLog implements AuditLog {
|
|
|
150
222
|
wireType: this.wire.wireType,
|
|
151
223
|
wireId: this.wire.wireId,
|
|
152
224
|
traceId: this.wire.traceId,
|
|
153
|
-
|
|
225
|
+
userIdentity:
|
|
226
|
+
event.userIdentity ?? resolveAuditUserIdentityFromWire(this.wire),
|
|
154
227
|
...event,
|
|
155
228
|
occurredAt: new Date().toISOString(),
|
|
156
229
|
}
|
|
@@ -185,19 +258,23 @@ export const createInvocationAudit = (
|
|
|
185
258
|
return new InvocationAuditLog(wire.audit, service, wire, logger)
|
|
186
259
|
}
|
|
187
260
|
|
|
188
|
-
export const
|
|
261
|
+
export const resolveAuditUserIdentityFromWire = (
|
|
189
262
|
wire: PikkuWire<any, any, any, CoreUserSession>
|
|
190
|
-
):
|
|
263
|
+
): AuditUserIdentity | undefined => {
|
|
191
264
|
const session = wire.session as CoreUserSession | undefined
|
|
192
|
-
const
|
|
265
|
+
const userIdentity: AuditUserIdentity = {
|
|
193
266
|
userId: session?.userId,
|
|
194
267
|
orgId: session?.orgId,
|
|
195
268
|
pikkuUserId: wire.pikkuUserId,
|
|
196
269
|
}
|
|
197
270
|
|
|
198
|
-
if (
|
|
271
|
+
if (
|
|
272
|
+
!userIdentity.userId &&
|
|
273
|
+
!userIdentity.orgId &&
|
|
274
|
+
!userIdentity.pikkuUserId
|
|
275
|
+
) {
|
|
199
276
|
return undefined
|
|
200
277
|
}
|
|
201
278
|
|
|
202
|
-
return
|
|
279
|
+
return userIdentity
|
|
203
280
|
}
|
|
@@ -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' })
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isSecretValue } from '../secret-value.js'
|
|
1
2
|
import type { CredentialService } from './credential-service.js'
|
|
2
3
|
import { defaultPikkuUserIdResolver } from './pikku-user-id.js'
|
|
3
4
|
import type { PikkuRawWire } from '../types/core.types.js'
|
|
@@ -17,8 +18,15 @@ export class PikkuCredentialWireService {
|
|
|
17
18
|
return this.aliases?.[name] ?? name
|
|
18
19
|
}
|
|
19
20
|
|
|
21
|
+
/**
|
|
22
|
+
* A credential is one of the few places vault material is meant to end up, so
|
|
23
|
+
* a `SecretValue` is unwrapped here rather than rejected — `get` promises the
|
|
24
|
+
* raw material, and storing the wrapper would make that a lie.
|
|
25
|
+
*/
|
|
20
26
|
set(name: string, value: unknown): void {
|
|
21
|
-
this.credentials[this.resolveName(name)] = value
|
|
27
|
+
this.credentials[this.resolveName(name)] = isSecretValue(value)
|
|
28
|
+
? value.reveal()
|
|
29
|
+
: value
|
|
22
30
|
}
|
|
23
31
|
|
|
24
32
|
get<T = unknown>(name: string): T | null | Promise<T | null> {
|
|
@@ -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,3 +1,5 @@
|
|
|
1
|
+
import type { Safe } from '../secret-value.js'
|
|
2
|
+
|
|
1
3
|
export interface EmailTemplateReference {
|
|
2
4
|
name: string
|
|
3
5
|
locale?: string
|
|
@@ -42,5 +44,5 @@ export interface SendEmailResult {
|
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
export interface EmailService {
|
|
45
|
-
send(input:
|
|
47
|
+
send<T extends SendEmailInput>(input: Safe<T>): Promise<SendEmailResult>
|
|
46
48
|
}
|
|
@@ -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
|
}
|