@pikku/core 0.12.143 → 0.12.144
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/dist/analytics/analytics.d.ts +14 -0
- package/dist/analytics/analytics.js +14 -0
- package/dist/analytics/analytics.types.d.ts +1 -0
- package/dist/analytics/anonymous-analytics-identity.d.ts +1 -0
- package/dist/analytics/cookie-analytics-identity.d.ts +1 -0
- package/dist/analytics/mint-cookie.d.ts +1 -0
- package/dist/{wirings/channel/channel-middleware-runner.d.ts → channel-middleware-runner.d.ts} +17 -3
- package/dist/{wirings/channel/channel-middleware-runner.js → channel-middleware-runner.js} +24 -8
- package/dist/classification/data-classification.d.ts +13 -0
- package/dist/classification/secret-value.d.ts +7 -0
- package/dist/classification/secret-value.js +7 -0
- package/dist/crypto-utils.d.ts +93 -0
- package/dist/crypto-utils.js +92 -0
- package/dist/dev/hot-reload.d.ts +16 -0
- package/dist/dev/hot-reload.js +16 -1
- package/dist/dev/module-runner.js +7 -3
- package/dist/dev/reload-meta.js +1 -1
- package/dist/errors/error-handler.d.ts +9 -0
- package/dist/errors/error-handler.js +8 -0
- package/dist/errors/errors.d.ts +219 -0
- package/dist/errors/errors.js +227 -0
- package/dist/errors/serialized-error.d.ts +4 -0
- package/dist/function/abort-scope.d.ts +5 -0
- package/dist/function/function-meta.types.d.ts +20 -0
- package/dist/function/function-runner.d.ts +41 -0
- package/dist/function/function-runner.js +57 -11
- package/dist/function/functions.types.d.ts +59 -0
- package/dist/function/functions.types.js +23 -0
- package/dist/function/list.types.d.ts +4 -0
- package/dist/lifecycle.d.ts +12 -1
- package/dist/lifecycle.js +12 -1
- package/dist/middleware/addon-scope-cap.d.ts +4 -0
- package/dist/middleware/addon-scope-cap.js +7 -3
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.js +5 -13
- package/dist/middleware/auth-cookie.js +3 -3
- package/dist/middleware/middleware-factories.d.ts +17 -0
- package/dist/middleware/middleware-factories.js +17 -0
- package/dist/middleware/middleware.types.d.ts +23 -0
- package/dist/middleware/remote-auth.d.ts +15 -0
- package/dist/middleware/remote-auth.js +18 -3
- package/dist/middleware/remote-jobs-secret.js +2 -10
- package/dist/middleware-runner.d.ts +7 -0
- package/dist/middleware-runner.js +23 -7
- package/dist/permissions.d.ts +13 -0
- package/dist/permissions.js +13 -0
- package/dist/pikku-state.d.ts +49 -0
- package/dist/pikku-state.js +49 -0
- package/dist/remote.js +20 -5
- package/dist/schema.d.ts +36 -0
- package/dist/schema.js +36 -0
- package/dist/services/agent-run-state-service.d.ts +8 -0
- package/dist/services/agent-runner-service.d.ts +24 -0
- package/dist/services/agent-storage-service.d.ts +8 -0
- package/dist/services/ai-embedding-service.d.ts +4 -0
- package/dist/services/audit-service.d.ts +48 -0
- package/dist/services/audit-service.js +22 -0
- package/dist/services/content-service.d.ts +34 -0
- package/dist/services/credential-wire-service.d.ts +9 -0
- package/dist/services/credential-wire-service.js +9 -0
- package/dist/services/deployment-service.d.ts +14 -0
- package/dist/services/email-service.d.ts +20 -0
- package/dist/services/email-template.d.ts +24 -0
- package/dist/services/email-template.js +12 -0
- package/dist/services/file-scenario-run-store.d.ts +5 -0
- package/dist/services/file-scenario-run-store.js +4 -0
- package/dist/services/gateway-service.d.ts +5 -0
- package/dist/services/in-memory-agent-run-state-service.d.ts +5 -0
- package/dist/services/in-memory-agent-run-state-service.js +5 -0
- package/dist/services/in-memory-lease-service.d.ts +5 -0
- package/dist/services/in-memory-lease-service.js +5 -0
- package/dist/services/in-memory-session-store.d.ts +4 -0
- package/dist/services/in-memory-session-store.js +4 -0
- package/dist/services/incoming-webhook-queue.d.ts +2 -0
- package/dist/services/incoming-webhook-queue.js +2 -0
- package/dist/services/incoming-webhook-service.d.ts +9 -1
- package/dist/services/incoming-webhook-service.js +1 -1
- package/dist/services/index.d.ts +1 -5
- package/dist/services/index.js +1 -5
- package/dist/services/jwt-service.d.ts +8 -0
- package/dist/services/lease-service.d.ts +5 -0
- package/dist/services/lease-service.js +1 -0
- package/dist/services/local-content-request-handler.d.ts +20 -0
- package/dist/services/local-content-request-handler.js +11 -0
- package/dist/services/local-content.d.ts +45 -0
- package/dist/services/local-content.js +35 -0
- package/dist/services/local-credential-service.d.ts +5 -0
- package/dist/services/local-credential-service.js +5 -0
- package/dist/services/local-email-service.d.ts +7 -0
- package/dist/services/local-email-service.js +7 -0
- package/dist/services/local-secrets.d.ts +8 -0
- package/dist/services/local-secrets.js +8 -0
- package/dist/services/local-variables.d.ts +6 -0
- package/dist/services/local-variables.js +6 -0
- package/dist/services/logger.d.ts +4 -0
- package/dist/services/logger.js +4 -0
- package/dist/services/meta-service.d.ts +38 -0
- package/dist/services/meta-service.js +6 -0
- package/dist/services/queue-webhook-service.d.ts +19 -0
- package/dist/services/queue-webhook-service.js +19 -0
- package/dist/services/remote-jobs.d.ts +8 -13
- package/dist/services/remote-jobs.js +3 -54
- package/dist/services/scenario-cookie-jar.d.ts +4 -0
- package/dist/services/scheduler-service.d.ts +13 -0
- package/dist/services/scheduler-service.js +8 -0
- package/dist/services/schema-service.d.ts +9 -0
- package/dist/services/scope-service.d.ts +10 -0
- package/dist/services/scoped-secret-service.d.ts +5 -0
- package/dist/services/scoped-secret-service.js +5 -0
- package/dist/services/secret-host-binding.d.ts +5 -0
- package/dist/services/secret-host-binding.js +5 -0
- package/dist/services/secret-service.d.ts +19 -1
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +6 -0
- package/dist/services/session-store.d.ts +5 -0
- package/dist/services/stub-tracker.d.ts +1 -0
- package/dist/services/temporary-file-service.d.ts +9 -0
- package/dist/services/temporary-file-service.js +9 -0
- package/dist/services/trigger-service.d.ts +4 -0
- package/dist/services/trigger-source-store.d.ts +13 -0
- package/dist/services/trigger-source-store.js +7 -0
- package/dist/services/typed-credential-service.d.ts +6 -0
- package/dist/services/typed-credential-service.js +5 -0
- package/dist/services/typed-secret-service.d.ts +12 -0
- package/dist/services/typed-secret-service.js +11 -0
- package/dist/services/typed-variables-service.d.ts +1 -0
- package/dist/services/user-session-service.d.ts +31 -1
- package/dist/services/user-session-service.js +29 -3
- package/dist/services/v8-coverage-service.d.ts +27 -0
- package/dist/services/v8-coverage-service.js +5 -0
- package/dist/services/variables-service.d.ts +8 -0
- package/dist/services/virtual-user-sign-in.d.ts +1 -0
- package/dist/services/virtual-user-statement.d.ts +8 -0
- package/dist/services/virtual-user-statement.js +4 -0
- package/dist/services/webhook-service.d.ts +25 -0
- package/dist/services/webhook-service.js +15 -0
- package/dist/services/workflow-service.d.ts +6 -0
- package/dist/test-utils.js +1 -1
- package/dist/testing/service-tests.d.ts +4 -0
- package/dist/time-utils.d.ts +15 -0
- package/dist/time-utils.js +14 -0
- package/dist/types/core.types.d.ts +80 -0
- package/dist/types/state.types.d.ts +4 -0
- package/dist/utils/hmac.d.ts +3 -0
- package/dist/utils/safe-fetch.d.ts +14 -0
- package/dist/utils/safe-fetch.js +13 -0
- package/dist/utils/stable-stringify.d.ts +11 -0
- package/dist/utils/stable-stringify.js +33 -0
- package/dist/utils.d.ts +28 -0
- package/dist/utils.js +22 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.js +7 -0
- package/dist/wirings/addon/define-screens.d.ts +2 -0
- package/dist/wirings/addon/remote-addon-auth.d.ts +9 -0
- package/dist/wirings/addon/remote-addon-auth.js +5 -0
- package/dist/wirings/addon/wire-addon.d.ts +4 -0
- package/dist/wirings/addon/wire-remote-addon.d.ts +1 -0
- package/dist/wirings/agent/agent-agui.d.ts +14 -5
- package/dist/wirings/agent/agent-agui.js +17 -6
- package/dist/wirings/agent/agent-helpers.d.ts +61 -1
- package/dist/wirings/agent/agent-helpers.js +62 -2
- package/dist/wirings/agent/agent-interrupt.d.ts +5 -0
- package/dist/wirings/agent/agent-output.d.ts +20 -0
- package/dist/wirings/agent/agent-output.js +69 -0
- package/dist/wirings/agent/agent-prepare.d.ts +41 -0
- package/dist/wirings/agent/agent-prepare.js +38 -2
- package/dist/wirings/agent/agent-registry.d.ts +8 -0
- package/dist/wirings/agent/agent-registry.js +10 -4
- package/dist/wirings/agent/agent-runner.d.ts +33 -0
- package/dist/wirings/agent/agent-runner.js +40 -7
- package/dist/wirings/agent/agent-stream.d.ts +30 -0
- package/dist/wirings/agent/agent-stream.js +33 -11
- package/dist/wirings/agent/agent.types.d.ts +43 -0
- package/dist/wirings/agent/voice-input.d.ts +12 -0
- package/dist/wirings/agent/voice-input.js +12 -0
- package/dist/wirings/agent/voice-output.d.ts +14 -0
- package/dist/wirings/agent/voice-output.js +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-judge.js +1 -2
- package/dist/wirings/agent-scorer/agent-scorer-registry.d.ts +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-registry.js +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.d.ts +1 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.js +1 -0
- package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +7 -0
- package/dist/wirings/channel/channel-common.js +1 -1
- package/dist/wirings/channel/channel-rpc.types.d.ts +5 -0
- package/dist/wirings/channel/channel-runner.d.ts +22 -0
- package/dist/wirings/channel/channel-runner.js +22 -0
- package/dist/wirings/channel/channel-store.d.ts +8 -0
- package/dist/wirings/channel/channel-store.js +7 -0
- package/dist/wirings/channel/channel.types.d.ts +18 -0
- package/dist/wirings/channel/define-channel-routes.d.ts +5 -0
- package/dist/wirings/channel/define-channel-routes.js +5 -0
- package/dist/wirings/channel/eventhub-service.d.ts +9 -0
- package/dist/wirings/channel/eventhub-store.d.ts +1 -0
- package/dist/wirings/channel/eventhub-store.js +1 -0
- package/dist/wirings/channel/index.d.ts +1 -1
- package/dist/wirings/channel/index.js +1 -1
- package/dist/wirings/channel/local/local-channel-handler.d.ts +1 -0
- package/dist/wirings/channel/local/local-channel-handler.js +1 -0
- package/dist/wirings/channel/local/local-channel-runner.d.ts +13 -0
- package/dist/wirings/channel/local/local-channel-runner.js +13 -0
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +1 -0
- package/dist/wirings/channel/local/local-eventhub-service.js +1 -0
- package/dist/wirings/channel/log-channels.d.ts +1 -0
- package/dist/wirings/channel/log-channels.js +1 -0
- package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +5 -0
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +5 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +32 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +31 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +8 -0
- package/dist/wirings/cli/channel/cli-channel-runner.js +8 -0
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +1 -0
- package/dist/wirings/cli/cli-runner.d.ts +43 -0
- package/dist/wirings/cli/cli-runner.js +43 -0
- package/dist/wirings/cli/command-parser.d.ts +13 -0
- package/dist/wirings/cli/command-parser.js +12 -0
- package/dist/wirings/credential/credential-overrides.d.ts +1 -0
- package/dist/wirings/credential/credential.types.d.ts +7 -0
- package/dist/wirings/credential/validate-credential-definitions.d.ts +7 -0
- package/dist/wirings/credential/validate-credential-definitions.js +7 -0
- package/dist/wirings/flag/cached-flag-source.d.ts +1 -0
- package/dist/wirings/flag/flag.types.d.ts +3 -0
- package/dist/wirings/gateway/gateway-runner.d.ts +23 -0
- package/dist/wirings/gateway/gateway-runner.js +23 -0
- package/dist/wirings/gateway/gateway.types.d.ts +3 -0
- package/dist/wirings/gateway/local-gateway-service.d.ts +10 -0
- package/dist/{services → wirings/gateway}/local-gateway-service.js +6 -2
- package/dist/wirings/http/http-routes.d.ts +21 -0
- package/dist/wirings/http/http-routes.js +11 -0
- package/dist/wirings/http/http-runner.d.ts +71 -0
- package/dist/wirings/http/http-runner.js +73 -5
- package/dist/wirings/http/http.types.d.ts +27 -0
- package/dist/wirings/http/index.d.ts +1 -0
- package/dist/wirings/http/index.js +1 -0
- package/dist/wirings/http/log-http-routes.d.ts +1 -0
- package/dist/wirings/http/log-http-routes.js +1 -0
- package/dist/wirings/http/merge-request-data.d.ts +12 -0
- package/dist/wirings/http/merge-request-data.js +42 -0
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.js +3 -32
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-response.js +1 -0
- package/dist/wirings/http/routers/http-router.d.ts +6 -0
- package/dist/wirings/http/routers/http-router.js +6 -0
- package/dist/wirings/http/web-request.d.ts +17 -0
- package/dist/wirings/http/web-request.js +17 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +7 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.js +7 -0
- package/dist/wirings/mcp/mcp-runner.d.ts +63 -0
- package/dist/wirings/mcp/mcp-runner.js +62 -0
- package/dist/wirings/mcp/mcp.types.d.ts +12 -0
- package/dist/wirings/node/node.types.d.ts +4 -0
- package/dist/wirings/oauth2/oauth2.types.d.ts +2 -0
- package/dist/{services → wirings/queue}/in-memory-queue-service.d.ts +9 -1
- package/dist/{services → wirings/queue}/in-memory-queue-service.js +9 -1
- package/dist/wirings/queue/index.d.ts +1 -0
- package/dist/wirings/queue/index.js +1 -0
- package/dist/wirings/queue/queue-identity.js +2 -14
- package/dist/wirings/queue/queue-runner.d.ts +37 -0
- package/dist/wirings/queue/queue-runner.js +37 -0
- package/dist/wirings/queue/queue.types.d.ts +35 -0
- package/dist/wirings/queue/register-queue-helper.d.ts +12 -0
- package/dist/wirings/queue/register-queue-helper.js +11 -0
- package/dist/wirings/queue/remote-queue-job.d.ts +11 -0
- package/dist/wirings/queue/remote-queue-job.js +41 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +1 -0
- package/dist/wirings/role/role.types.d.ts +3 -0
- package/dist/wirings/rpc/rpc-runner.d.ts +24 -0
- package/dist/wirings/rpc/rpc-runner.js +37 -2
- package/dist/wirings/rpc/rpc-types.d.ts +2 -0
- package/dist/wirings/scheduler/index.d.ts +1 -0
- package/dist/wirings/scheduler/index.js +1 -0
- package/dist/wirings/scheduler/log-schedulers.d.ts +1 -0
- package/dist/wirings/scheduler/log-schedulers.js +1 -0
- package/dist/wirings/scheduler/remote-scheduled-job.d.ts +11 -0
- package/dist/wirings/scheduler/remote-scheduled-job.js +20 -0
- package/dist/wirings/scheduler/scheduler-runner.d.ts +29 -0
- package/dist/wirings/scheduler/scheduler-runner.js +28 -0
- package/dist/wirings/scheduler/scheduler.types.d.ts +3 -0
- package/dist/wirings/scope/scope.types.d.ts +5 -0
- package/dist/wirings/secret/index.d.ts +2 -2
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +26 -1
- package/dist/wirings/secret/secret.types.js +1 -0
- package/dist/wirings/secret/validate-secret-definitions.d.ts +8 -0
- package/dist/wirings/secret/validate-secret-definitions.js +15 -0
- package/dist/wirings/trigger/in-memory-trigger-service.d.ts +11 -0
- package/dist/{services → wirings/trigger}/in-memory-trigger-service.js +10 -3
- package/dist/wirings/trigger/index.d.ts +1 -1
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +8 -3
- package/dist/wirings/trigger/pikku-trigger-service.js +14 -3
- package/dist/wirings/trigger/trigger-runner.d.ts +27 -2
- package/dist/wirings/trigger/trigger-runner.js +35 -2
- package/dist/wirings/trigger/trigger.types.d.ts +26 -4
- package/dist/wirings/trigger/webhook-source-runner.d.ts +24 -0
- package/dist/wirings/trigger/webhook-source-runner.js +19 -0
- package/dist/wirings/trigger/webhook-source.types.d.ts +12 -2
- package/dist/wirings/trigger/webhook-source.types.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +7 -0
- package/dist/wirings/variable/validate-variable-definitions.js +7 -0
- package/dist/wirings/variable/variable.types.d.ts +7 -0
- package/dist/wirings/virtual-user/conversation/conversation.types.d.ts +5 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.d.ts +6 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.js +1 -1
- package/dist/{services → wirings/virtual-user}/http-virtual-users.d.ts +4 -3
- package/dist/{services → wirings/virtual-user}/http-virtual-users.js +6 -6
- package/dist/wirings/virtual-user/index.d.ts +1 -1
- package/dist/wirings/virtual-user/index.js +1 -1
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +2 -1
- package/dist/wirings/virtual-user/run-virtual-user.js +1 -14
- package/dist/wirings/virtual-user/virtual-user-declaration.types.d.ts +4 -0
- package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +10 -1
- package/dist/wirings/virtual-user/virtual-user-scaffold.js +5 -0
- package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +5 -0
- package/dist/wirings/virtual-user/virtual-user-schedule.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +1 -0
- package/dist/wirings/webhook/define-outgoing-webhook.d.ts +20 -0
- package/dist/wirings/webhook/define-outgoing-webhook.js +9 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +8 -4
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +7 -0
- package/dist/wirings/workflow/dsl/workflow-runner.js +7 -0
- package/dist/wirings/workflow/feature.d.ts +12 -0
- package/dist/wirings/workflow/feature.js +12 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +5 -0
- package/dist/wirings/workflow/graph/graph-node.js +5 -0
- package/dist/wirings/workflow/graph/template.d.ts +6 -0
- package/dist/wirings/workflow/graph/template.js +5 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +12 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.js +10 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +11 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.js +1 -0
- package/dist/{services → wirings/workflow}/in-memory-workflow-service.d.ts +8 -3
- package/dist/{services → wirings/workflow}/in-memory-workflow-service.js +9 -4
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +1 -1
- package/dist/wirings/workflow/pikku-scenario-service.js +2 -2
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +1 -0
- package/dist/wirings/workflow/pikku-workflow-service.js +1 -0
- package/dist/wirings/workflow/run-timeline.d.ts +21 -0
- package/dist/wirings/workflow/run-timeline.js +15 -7
- package/dist/wirings/workflow/scenario-coverage.d.ts +1 -0
- package/dist/wirings/workflow/scenario-poll.d.ts +1 -0
- package/dist/wirings/workflow/scenario-prose.d.ts +6 -0
- package/dist/wirings/workflow/scenario-prose.js +6 -0
- package/dist/wirings/workflow/scenario-run.types.d.ts +3 -0
- package/dist/wirings/workflow/scenario-step.types.d.ts +1 -0
- package/dist/wirings/workflow/scenario-step.types.js +1 -0
- package/dist/wirings/workflow/scenario-surface.js +1 -13
- package/dist/wirings/workflow/scenario.types.d.ts +6 -0
- package/dist/wirings/workflow/workflow-approval-policy.d.ts +6 -0
- package/dist/wirings/workflow/workflow-approval-policy.js +6 -0
- package/dist/wirings/workflow/workflow-constants.d.ts +7 -1
- package/dist/wirings/workflow/workflow-constants.js +10 -1
- package/dist/wirings/workflow/workflow-errors.d.ts +13 -0
- package/dist/wirings/workflow/workflow-errors.js +13 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +4 -0
- package/dist/wirings/workflow/workflow-invocation-id.js +4 -0
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +3 -0
- package/dist/wirings/workflow/workflow-run-ownership.d.ts +1 -0
- package/dist/wirings/workflow/workflow-run-ownership.js +1 -0
- package/dist/wirings/workflow/workflow-status-stream.d.ts +1 -0
- package/dist/wirings/workflow/workflow-unwind-plan.js +2 -7
- package/dist/wirings/workflow/workflow.types.d.ts +40 -0
- package/package.json +26 -9
- package/CHANGELOG.md +0 -6978
- package/dist/services/in-memory-trigger-service.d.ts +0 -4
- package/dist/services/local-gateway-service.d.ts +0 -6
- package/dist/utils/hash.d.ts +0 -2
- package/dist/utils/hash.js +0 -23
- package/knowledge/decisions/index.md +0 -19
- package/knowledge/decisions/internals/a-credential-name-declared-twice-must-agree-on-schema-and-type.md +0 -29
- package/knowledge/decisions/internals/a-grant-can-name-a-scope-declared-without-its-addon.md +0 -29
- package/knowledge/decisions/internals/a-held-run-is-woken-later-not-retried.md +0 -28
- package/knowledge/decisions/internals/a-latency-budget-is-asserted-by-its-cause.md +0 -32
- package/knowledge/decisions/internals/a-non-streaming-agent-run-registers-with-agentrunstate-too.md +0 -22
- package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +0 -50
- package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +0 -20
- package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +0 -21
- package/knowledge/decisions/internals/a-scheduled-task-writes-its-caller-session-before-it-runs.md +0 -22
- package/knowledge/decisions/internals/a-secret-set-in-memory-shadows-the-variable-of-the-same-name.md +0 -28
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +0 -49
- package/knowledge/decisions/internals/a-virtual-user-acts-through-invokeraw-so-a-refusal-is-data.md +0 -32
- package/knowledge/decisions/internals/a-virtual-user-cadence-is-a-row-not-a-timer.md +0 -66
- package/knowledge/decisions/internals/a-virtual-user-converse-signs-in-before-its-first-turn.md +0 -24
- package/knowledge/decisions/internals/a-virtual-user-decides-whether-to-trust-memory-once-per-turn.md +0 -21
- package/knowledge/decisions/internals/a-virtual-user-email-is-computed-with-the-run-id-as-a-sub-address.md +0 -34
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-but-it-needs-a-trigger.md +0 -65
- package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +0 -49
- package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +0 -45
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +0 -26
- package/knowledge/decisions/internals/addon-pikku-meta-ships-at-the-package-root-or-under-dist.md +0 -32
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +0 -33
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +0 -28
- package/knowledge/decisions/internals/agent-agui-bridge-obeys-the-client-ordering-contract.md +0 -29
- package/knowledge/decisions/internals/agent-audio-chunks-carry-the-format-the-provider-returned.md +0 -20
- package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +0 -21
- package/knowledge/decisions/internals/agent-credential-suspensions-hide-the-tool-result.md +0 -26
- package/knowledge/decisions/internals/agent-delegate-and-supervise-hide-different-text.md +0 -26
- package/knowledge/decisions/internals/agent-llm-tool-arguments-have-nulls-stripped.md +0 -23
- package/knowledge/decisions/internals/agent-model-config-stays-a-single-resolution-seam.md +0 -25
- package/knowledge/decisions/internals/agent-onerror-hooks-cannot-change-the-failure.md +0 -22
- package/knowledge/decisions/internals/agent-runner-methods-must-keep-their-receiver.md +0 -22
- package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +0 -22
- package/knowledge/decisions/internals/agent-stream-persistence-is-best-effort.md +0 -27
- package/knowledge/decisions/internals/agent-sub-agents-inherit-the-parent-context-block.md +0 -26
- package/knowledge/decisions/internals/agent-tool-execute-failures-are-logged-unconditionally.md +0 -25
- package/knowledge/decisions/internals/agent-voice-input-transcribes-audio-parts-in-place.md +0 -22
- package/knowledge/decisions/internals/agent-working-memory-is-persisted-only-when-valid.md +0 -25
- package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +0 -39
- package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +0 -23
- package/knowledge/decisions/internals/an-agent-is-offered-under-its-registry-key-and-only-within-the-virtual-users-scopes.md +0 -27
- package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +0 -25
- package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +0 -22
- package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +0 -20
- package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +0 -22
- package/knowledge/decisions/internals/an-oauth2-credential-implies-an-optional-app-secret.md +0 -26
- package/knowledge/decisions/internals/an-unref-d-timer-cannot-be-awaited-under-node-test.md +0 -66
- package/knowledge/decisions/internals/analytics-identity-resolvers-run-in-declared-order.md +0 -22
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +0 -30
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +0 -31
- package/knowledge/decisions/internals/channel-state-accessors-are-unsound-generics-that-every-implementation-asserts.md +0 -33
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +0 -29
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +0 -28
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +0 -27
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +0 -28
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +0 -34
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +0 -29
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +0 -84
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +0 -41
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +0 -44
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +0 -39
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +0 -42
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +0 -39
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +0 -43
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +0 -38
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +0 -44
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +0 -27
- package/knowledge/decisions/internals/feature-flag-declarations-refuse-an-empty-anyof-and-conflicting-scopes.md +0 -22
- package/knowledge/decisions/internals/feature-flags-fail-open-and-never-enforce-access.md +0 -28
- package/knowledge/decisions/internals/flag-sync-rewrites-only-the-declared-text.md +0 -24
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +0 -32
- package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +0 -43
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +0 -28
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +0 -31
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +0 -26
- package/knowledge/decisions/internals/global-middleware-resolves-from-the-root-namespace-too.md +0 -32
- package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +0 -38
- package/knowledge/decisions/internals/hot-reload-writes-into-the-function-map-captured-at-startup.md +0 -26
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +0 -32
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +0 -28
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +0 -30
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +0 -26
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +0 -28
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +0 -32
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +0 -26
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +0 -25
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +0 -26
- package/knowledge/decisions/internals/index.md +0 -182
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +0 -25
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +0 -26
- package/knowledge/decisions/internals/mcp-wire-names-are-assigned-over-the-whole-registry.md +0 -39
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +0 -24
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +0 -53
- package/knowledge/decisions/internals/only-exposed-functions-enter-a-virtual-user-catalogue.md +0 -21
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +0 -28
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +0 -27
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +0 -31
- package/knowledge/decisions/internals/role-names-cannot-contain-the-scope-separator.md +0 -30
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +0 -32
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +0 -31
- package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +0 -24
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +0 -26
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +0 -27
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +0 -48
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +0 -30
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +0 -28
- package/knowledge/decisions/internals/side-effects-are-an-allowlist-not-a-boolean.md +0 -34
- package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +0 -24
- package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +0 -26
- package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +0 -43
- package/knowledge/decisions/internals/the-core-scope-validator-refuses-separator-wildcard-and-empty-segments.md +0 -22
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +0 -30
- package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +0 -83
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +0 -29
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +0 -27
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +0 -40
- package/knowledge/decisions/internals/the-mcp-handshake-is-challenged-only-when-every-target-is-gated.md +0 -29
- package/knowledge/decisions/internals/the-middleware-resolution-cache-is-deliberately-unbounded.md +0 -40
- package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +0 -40
- package/knowledge/decisions/internals/the-pikku-user-id-resolves-in-a-fixed-order.md +0 -24
- package/knowledge/decisions/internals/the-runner-resolves-wire-services-itself.md +0 -31
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +0 -26
- package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +0 -25
- package/knowledge/decisions/internals/the-virtual-user-catalogue-is-the-only-gate-on-what-may-be-called.md +0 -21
- package/knowledge/decisions/internals/the-virtual-user-prompt-says-json-because-of-json-object-mode.md +0 -22
- package/knowledge/decisions/internals/the-virtual-user-runtime-is-exported-from-the-virtual-user-entry-point.md +0 -28
- package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +0 -22
- package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +0 -25
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +0 -33
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +0 -26
- package/knowledge/decisions/internals/validate-checks-virtual-users-through-a-shared-module.md +0 -43
- package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +0 -115
- package/knowledge/decisions/internals/virtual-user-conversation-drives-the-target-through-a-transport-seam.md +0 -24
- package/knowledge/decisions/internals/virtual-user-conversation-verdicts-are-llm-self-evaluations.md +0 -25
- package/knowledge/decisions/internals/virtual-user-conversations-seed-a-hidden-kickoff-message.md +0 -23
- package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +0 -21
- package/knowledge/decisions/internals/virtual-users-are-declared-in-one-definevirtualusers-call-per-codebase.md +0 -30
- package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +0 -24
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +0 -26
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +0 -25
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +0 -58
- package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +0 -35
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +0 -34
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +0 -42
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +0 -38
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +0 -29
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +0 -42
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +0 -25
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +0 -29
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +0 -43
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +0 -29
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +0 -42
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +0 -33
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +0 -32
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +0 -31
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +0 -39
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +0 -29
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +0 -33
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +0 -37
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +0 -54
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +0 -43
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +0 -32
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +0 -18
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +0 -34
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +0 -29
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +0 -33
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +0 -34
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +0 -34
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +0 -38
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +0 -30
- package/knowledge/decisions/security/a-bearer-token-checked-against-a-secret-reads-it-per-request.md +0 -26
- package/knowledge/decisions/security/a-call-without-a-session-raises-missing-session-not-forbidden.md +0 -20
- package/knowledge/decisions/security/a-caller-cookie-wins-over-the-jar-for-the-same-name.md +0 -23
- package/knowledge/decisions/security/a-channel-lifecycle-acts-as-the-socket-upgrade-session.md +0 -16
- package/knowledge/decisions/security/a-channel-requires-a-session-unless-it-says-auth-false.md +0 -26
- package/knowledge/decisions/security/a-credential-read-path-follows-its-declared-type-not-absence.md +0 -32
- package/knowledge/decisions/security/a-credential-type-is-a-literal-the-inspector-checks-at-declaration.md +0 -27
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +0 -28
- package/knowledge/decisions/security/a-first-party-cookie-is-written-only-after-its-purposes-consent.md +0 -33
- package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +0 -37
- package/knowledge/decisions/security/a-graph-run-starts-at-an-entry-node-the-graph-declared.md +0 -33
- package/knowledge/decisions/security/a-permission-gets-a-wire-it-cannot-reply-on.md +0 -33
- package/knowledge/decisions/security/a-public-function-says-so-with-auth-false.md +0 -34
- package/knowledge/decisions/security/a-readonly-session-reaches-only-readonly-functions.md +0 -25
- package/knowledge/decisions/security/a-scaffold-flag-says-a-surface-exists-not-who-may-call-it.md +0 -52
- package/knowledge/decisions/security/a-scheduled-virtual-user-run-needs-no-admin-at-run-time.md +0 -27
- package/knowledge/decisions/security/a-scoped-credential-view-is-limited-to-declared-names.md +0 -26
- package/knowledge/decisions/security/a-scoped-secret-view-reads-only-declared-keys-and-never-writes.md +0 -25
- package/knowledge/decisions/security/a-secret-is-sent-only-to-the-hosts-it-declares.md +0 -29
- package/knowledge/decisions/security/a-step-can-name-an-identity-no-virtual-user-holds-through-per-call-headers.md +0 -25
- package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +0 -37
- package/knowledge/decisions/security/a-stopped-run-by-id-skips-the-ownership-check.md +0 -24
- package/knowledge/decisions/security/a-vault-secret-redacts-on-serialization-and-throws-on-coercion.md +0 -29
- package/knowledge/decisions/security/a-virtual-user-catalogue-entry-is-filtered-by-scope-and-approval-is-denied-by-default.md +0 -30
- package/knowledge/decisions/security/a-virtual-user-environment-fails-closed.md +0 -38
- package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +0 -27
- package/knowledge/decisions/security/a-virtual-user-never-runs-against-production.md +0 -23
- package/knowledge/decisions/security/a-virtual-user-reads-its-roles-from-the-apps-own-rpc-before-better-auth.md +0 -27
- package/knowledge/decisions/security/a-virtual-user-run-treats-an-unresolved-environment-as-production.md +0 -41
- package/knowledge/decisions/security/a-virtual-user-scopes-are-expanded-from-its-roles-once-at-run-preparation.md +0 -25
- package/knowledge/decisions/security/a-virtual-user-whose-roles-drift-from-the-declaration-refuses-to-run.md +0 -32
- package/knowledge/decisions/security/a-workflow-run-is-read-and-approved-by-its-owner.md +0 -50
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +0 -43
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +0 -52
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +0 -46
- package/knowledge/decisions/security/addon-screen-scopes-hide-and-do-not-enforce.md +0 -20
- package/knowledge/decisions/security/agent-approval-forwarding-requires-a-symbol-brand.md +0 -27
- package/knowledge/decisions/security/agent-credential-requests-are-symbol-branded.md +0 -37
- package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +0 -31
- package/knowledge/decisions/security/agent-ownership-failures-never-echo-the-resource.md +0 -23
- package/knowledge/decisions/security/agent-resume-re-runs-the-authorization-gate.md +0 -22
- package/knowledge/decisions/security/agent-sessionless-deployments-have-no-thread-ownership.md +0 -39
- package/knowledge/decisions/security/agent-thread-ownership-composes-the-session-principal.md +0 -30
- package/knowledge/decisions/security/agent-tool-filtering-reads-the-live-function-config.md +0 -24
- package/knowledge/decisions/security/an-addon-header-can-only-narrow-the-session.md +0 -26
- package/knowledge/decisions/security/an-addon-instance-reads-only-the-secrets-and-credentials-it-is-named.md +0 -33
- package/knowledge/decisions/security/an-addon-may-reach-only-itself-and-the-addons-it-uses.md +0 -16
- package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +0 -33
- package/knowledge/decisions/security/an-api-key-is-jwt-decoded-into-the-session.md +0 -26
- package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +0 -59
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +0 -30
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +0 -52
- package/knowledge/decisions/security/an-external-virtual-user-caller-presents-one-signed-statement.md +0 -38
- package/knowledge/decisions/security/an-inbound-webhook-source-dispatches-only-verified-requests.md +0 -31
- package/knowledge/decisions/security/an-mcp-call-with-no-http-request-stays-anonymous.md +0 -18
- package/knowledge/decisions/security/an-mcp-refusal-is-decided-before-dispatch.md +0 -48
- package/knowledge/decisions/security/an-oauth2-credential-is-read-by-its-account-row.md +0 -40
- package/knowledge/decisions/security/an-omitted-user-id-addresses-the-platform-credential.md +0 -32
- package/knowledge/decisions/security/an-upload-is-counted-as-it-arrives-not-buffered-then-measured.md +0 -24
- package/knowledge/decisions/security/analytics-identity-is-stamped-from-the-session-not-the-event.md +0 -24
- package/knowledge/decisions/security/app-access-is-a-scope-tree-synthesised-from-virtual-users.md +0 -26
- package/knowledge/decisions/security/approval-policy-decides-who-answers-a-tool-call.md +0 -27
- package/knowledge/decisions/security/auth-false-on-a-session-function-warns-and-still-requires-one.md +0 -25
- package/knowledge/decisions/security/bearer-token-hashes-are-unpeppered-sha256.md +0 -18
- package/knowledge/decisions/security/consent-is-read-from-a-cookie-and-a-recognised-denial-counts-as-refusal.md +0 -29
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +0 -84
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +0 -39
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +0 -37
- package/knowledge/decisions/security/cors-defaults-to-any-origin-and-refuses-the-wildcard-with-credentials.md +0 -22
- package/knowledge/decisions/security/credential-backends-share-one-conformance-suite-for-per-user-isolation.md +0 -29
- package/knowledge/decisions/security/each-stage-has-one-virtual-user-key-pair.md +0 -27
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +0 -41
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +0 -30
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +0 -40
- package/knowledge/decisions/security/hmac-verification-fails-closed-on-empty-inputs.md +0 -25
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +0 -33
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +0 -46
- package/knowledge/decisions/security/index.md +0 -135
- package/knowledge/decisions/security/local-content-refuses-private-buckets-under-the-public-segment.md +0 -21
- package/knowledge/decisions/security/mail-is-allowlisted-before-a-virtual-user-run-sees-it.md +0 -38
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +0 -27
- package/knowledge/decisions/security/mcp-resources-tools-and-prompts-take-sessionless-functions.md +0 -18
- package/knowledge/decisions/security/origin-locked-routes-match-the-origin-exactly.md +0 -22
- package/knowledge/decisions/security/oss-auth-works-without-pikku-studio-cloud.md +0 -26
- package/knowledge/decisions/security/outbound-webhooks-use-an-allowlist-when-configured.md +0 -24
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +0 -40
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +0 -31
- package/knowledge/decisions/security/pikku-carries-virtual-user-scopes-as-data-and-the-app-grants-them.md +0 -35
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +0 -69
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +0 -39
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +0 -34
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +0 -55
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +0 -30
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +0 -28
- package/knowledge/decisions/security/scoped-content-access-is-a-root-folder-with-longest-prefix-grants.md +0 -31
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +0 -34
- package/knowledge/decisions/security/services-without-secrets-get-a-throwing-secrets-accessor.md +0 -22
- package/knowledge/decisions/security/shared-guards-refuse-to-mutate-or-shadow-a-system-role.md +0 -34
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +0 -37
- package/knowledge/decisions/security/signed-uploads-are-verified-by-the-same-check-as-signed-reads.md +0 -26
- package/knowledge/decisions/security/system-role-scopes-must-be-declared-with-define-scope.md +0 -24
- package/knowledge/decisions/security/system-roles-are-additive-and-immutable.md +0 -16
- package/knowledge/decisions/security/the-channel-rpc-does-not-send-the-callers-session.md +0 -21
- package/knowledge/decisions/security/the-remote-jobs-inbox-fails-closed-without-a-secret.md +0 -24
- package/knowledge/decisions/security/the-remote-rpc-gate-fails-closed-and-binds-the-token-to-its-function.md +0 -34
- package/knowledge/decisions/security/the-workflow-status-stream-rechecks-ownership-on-every-poll.md +0 -16
- package/knowledge/decisions/security/two-credentials-on-one-key-must-share-a-read-mode.md +0 -29
- package/knowledge/decisions/security/verified-bearer-claims-are-pass-through-data-that-core-never-fills.md +0 -23
- package/knowledge/decisions/security/virtual-user-catalogue-excludes-the-machinery-that-runs-virtual-users.md +0 -25
- package/knowledge/decisions/security/virtual-user-conversation-missing-approval-decisions-default-to-denied.md +0 -22
- package/knowledge/decisions/security/virtual-user-run-records-are-gated-behind-a-read-scope.md +0 -18
- package/knowledge/decisions/security/virtual-user-sign-in-does-not-exist-in-production.md +0 -25
- package/knowledge/decisions/security/virtual-user-sign-in-has-one-door.md +0 -42
- package/knowledge/decisions/security/virtual-user-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +0 -29
- package/knowledge/decisions/security/virtual-user-sign-in-only-works-for-virtual-user-flagged-users.md +0 -29
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +0 -25
- package/knowledge/decisions/security/wire-addon-expose-selects-the-rpc-surface.md +0 -51
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +0 -40
- package/knowledge/decisions/security/workflow-helper-functions-are-sessionless-by-declaration.md +0 -18
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +0 -32
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-virtual-user-and-per-scenario.md +0 -32
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +0 -31
- package/knowledge/decisions/security/workflow-virtual-user-steps-always-use-the-real-transport.md +0 -34
- package/knowledge/decisions/security/writing-a-virtual-user-schedule-is-gated-by-its-own-scope.md +0 -18
- package/knowledge/index.md +0 -24
- package/knowledge/questions/a-bearer-jwt-with-no-identity-becomes-a-session.md +0 -24
- package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +0 -35
- package/knowledge/questions/dev-quick-login-as-impersonation.md +0 -25
- package/knowledge/questions/does-a-delayed-rpc-run-as-the-session-it-was-scheduled-with.md +0 -26
- package/knowledge/questions/does-a-user-id-with-a-colon-read-another-users-credentials.md +0 -27
- package/knowledge/questions/does-a-wirecli-command-need-a-session-by-default.md +0 -26
- package/knowledge/questions/does-an-adversarial-in-scope-success-count-as-a-finding.md +0 -26
- package/knowledge/questions/does-approve-step-need-the-run-owners-session-or-the-gates-approvers.md +0 -34
- package/knowledge/questions/does-cors-origin-true-reflect-any-origin-with-credentials.md +0 -20
- package/knowledge/questions/does-skip-user-session-do-anything-on-a-channel.md +0 -24
- package/knowledge/questions/does-the-store-session-match-the-other-two.md +0 -19
- package/knowledge/questions/index.md +0 -41
- package/knowledge/questions/is-the-agent-score-worker-reachable-without-a-session.md +0 -21
- package/knowledge/questions/live-scheduled-tests-may-write.md +0 -19
- package/knowledge/questions/provision-virtual-users-has-no-caller-in-this-repo.md +0 -23
- package/knowledge/questions/remote-secret-refuses-requests-without-a-remote-token-on-every-path.md +0 -32
- package/knowledge/questions/should-a-middleware-set-session-persist-to-the-store.md +0 -25
- package/knowledge/questions/should-a-scoped-secret-view-throw-from-has-secret-for-a-disallowed-key.md +0 -23
- package/knowledge/questions/should-a-wrong-bearer-token-be-anonymous-or-refused.md +0 -35
- package/knowledge/questions/should-an-empty-webhook-signing-secret-send-unsigned.md +0 -23
- package/knowledge/questions/should-http-virtual-user-sessions-reset-between-scenarios-in-one-run.md +0 -27
- package/knowledge/questions/should-the-cookie-jar-scope-cookies-to-the-api-origin.md +0 -26
- package/knowledge/questions/should-voice-input-fetch-audio-urls-without-a-host-allowlist.md +0 -20
- package/knowledge/questions/staging-impersonation-rules.md +0 -27
- package/knowledge/questions/unauthorized-channel-replies-escape-the-declared-out-type.md +0 -44
- package/knowledge/questions/virtual-user-keys-on-cloud-stages-are-pikku-studios-to-build.md +0 -33
- package/knowledge/questions/virtual-user-statement-replay-is-per-process.md +0 -20
- package/knowledge/questions/what-an-impersonated-session-carries.md +0 -22
- package/run-tests.sh +0 -68
- package/scripts/generate-api-report.d.mts +0 -1
- package/scripts/generate-api-report.mjs +0 -96
- package/scripts/generate-api-report.mts +0 -333
- package/src/public-surface.json +0 -637
- package/src/public-surface.json.README +0 -43
- /package/dist/{function/compensation-name.d.ts → compensation-name.d.ts} +0 -0
- /package/dist/{function/compensation-name.js → compensation-name.js} +0 -0
|
@@ -1,4 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether stored content is served only through signed URLs (`private`) or at a
|
|
3
|
+
* plain URL anyone can fetch (`public`).
|
|
4
|
+
*/
|
|
1
5
|
export type ContentVisibility = 'private' | 'public';
|
|
6
|
+
/**
|
|
7
|
+
* Arguments for signing a URL to one stored object, valid inside the given time
|
|
8
|
+
* window.
|
|
9
|
+
*/
|
|
2
10
|
export interface SignContentKeyArgs<TBucket extends string = string> {
|
|
3
11
|
bucket: TBucket;
|
|
4
12
|
contentKey: string;
|
|
@@ -6,11 +14,18 @@ export interface SignContentKeyArgs<TBucket extends string = string> {
|
|
|
6
14
|
dateLessThan: Date;
|
|
7
15
|
dateGreaterThan?: Date;
|
|
8
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Arguments for signing an arbitrary URL, valid inside the given time window.
|
|
19
|
+
*/
|
|
9
20
|
export interface SignURLArgs {
|
|
10
21
|
url: string;
|
|
11
22
|
dateLessThan: Date;
|
|
12
23
|
dateGreaterThan?: Date;
|
|
13
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Arguments for a pre-signed upload. `size` and `contentType` are checked
|
|
27
|
+
* against the bucket's policy by the implementation.
|
|
28
|
+
*/
|
|
14
29
|
export interface GetUploadURLArgs<TBucket extends string = string> {
|
|
15
30
|
bucket: TBucket;
|
|
16
31
|
fileKey: string;
|
|
@@ -18,26 +33,45 @@ export interface GetUploadURLArgs<TBucket extends string = string> {
|
|
|
18
33
|
size?: number;
|
|
19
34
|
visibility?: ContentVisibility;
|
|
20
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Where and how the client should upload, and the key the file will be stored
|
|
38
|
+
* under.
|
|
39
|
+
*/
|
|
21
40
|
export interface UploadURLResult {
|
|
22
41
|
uploadUrl: string;
|
|
23
42
|
assetKey: string;
|
|
24
43
|
uploadHeaders?: Record<string, string>;
|
|
25
44
|
uploadMethod?: 'PUT' | 'POST';
|
|
26
45
|
}
|
|
46
|
+
/** Identifies one stored object. */
|
|
27
47
|
export interface BucketKeyArgs<TBucket extends string = string> {
|
|
28
48
|
bucket: TBucket;
|
|
29
49
|
key: string;
|
|
30
50
|
visibility?: ContentVisibility;
|
|
31
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Identifies an object to download and how long a signed URL for it should stay
|
|
54
|
+
* valid.
|
|
55
|
+
*/
|
|
32
56
|
export interface GetDownloadURLArgs<TBucket extends string = string> extends BucketKeyArgs<TBucket> {
|
|
33
57
|
expiresInSeconds?: number;
|
|
34
58
|
}
|
|
59
|
+
/** An object to write from a stream. */
|
|
35
60
|
export interface WriteFileArgs<TBucket extends string = string> extends BucketKeyArgs<TBucket> {
|
|
36
61
|
stream: ReadableStream | NodeJS.ReadableStream;
|
|
37
62
|
}
|
|
63
|
+
/** An object to write from a file already on local disk. */
|
|
38
64
|
export interface CopyFileArgs<TBucket extends string = string> extends BucketKeyArgs<TBucket> {
|
|
39
65
|
fromAbsolutePath: string;
|
|
40
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* File storage behind the `content` service: uploads, downloads and signed URLs
|
|
69
|
+
* over named buckets (S3, R2, or local disk in development).
|
|
70
|
+
*
|
|
71
|
+
* Private content is reachable only through signed, expiring URLs, so a
|
|
72
|
+
* function that hands one out decides who may read the file. Upload URLs carry
|
|
73
|
+
* the bucket's policy; callers do not need to re-check size or MIME type.
|
|
74
|
+
*/
|
|
41
75
|
export interface ContentService<TBucket extends string = string> {
|
|
42
76
|
signContentKey(args: SignContentKeyArgs<TBucket>): Promise<string>;
|
|
43
77
|
signURL(args: SignURLArgs): Promise<string>;
|
|
@@ -15,6 +15,15 @@ export type CredentialResolutionConfig = {
|
|
|
15
15
|
/** Keyed by the resolved (post-alias) credential name. */
|
|
16
16
|
resolutions: Record<string, CredentialResolution>;
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Holds the credentials one invocation can see, behind `wire.getCredential`.
|
|
20
|
+
* Per-user values are loaded lazily from the `CredentialService` for the
|
|
21
|
+
* resolved pikku user; credentials the wiring marks `singleton` are always read
|
|
22
|
+
* from the deployment and never from the user's own store, so a user cannot
|
|
23
|
+
* override a deployment-owned token.
|
|
24
|
+
*
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
18
27
|
export declare class PikkuCredentialWireService {
|
|
19
28
|
private credentialService?;
|
|
20
29
|
private wire?;
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { isSecretValue } from '../classification/secret-value.js';
|
|
2
2
|
import { defaultPikkuUserIdResolver } from './pikku-user-id.js';
|
|
3
|
+
/**
|
|
4
|
+
* Holds the credentials one invocation can see, behind `wire.getCredential`.
|
|
5
|
+
* Per-user values are loaded lazily from the `CredentialService` for the
|
|
6
|
+
* resolved pikku user; credentials the wiring marks `singleton` are always read
|
|
7
|
+
* from the deployment and never from the user's own store, so a user cannot
|
|
8
|
+
* override a deployment-owned token.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
3
12
|
export class PikkuCredentialWireService {
|
|
4
13
|
credentialService;
|
|
5
14
|
wire;
|
|
@@ -1,16 +1,30 @@
|
|
|
1
|
+
/** Heartbeat timing for a {@link DeploymentService}, in milliseconds. */
|
|
1
2
|
export interface DeploymentServiceConfig {
|
|
2
3
|
heartbeatInterval?: number;
|
|
3
4
|
heartbeatTtl?: number;
|
|
4
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* This deployment's identity, the endpoint other deployments reach it on, and
|
|
8
|
+
* the functions it serves (all registered functions when omitted).
|
|
9
|
+
*/
|
|
5
10
|
export interface DeploymentConfig {
|
|
6
11
|
deploymentId: string;
|
|
7
12
|
endpoint: string;
|
|
8
13
|
functions?: string[];
|
|
9
14
|
}
|
|
15
|
+
/** Another live deployment, as found in the registry. */
|
|
10
16
|
export interface DeploymentInfo {
|
|
11
17
|
deploymentId: string;
|
|
12
18
|
endpoint: string;
|
|
13
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Service discovery for split deployments: each deployment registers the
|
|
22
|
+
* functions it serves and keeps a heartbeat, and `invoke` calls a function
|
|
23
|
+
* hosted by another deployment. An RPC whose target is not registered locally
|
|
24
|
+
* falls back to `invoke`, carrying the caller's session and trace id.
|
|
25
|
+
* Implementations ship in the database and runtime packages (Kysely, Redis,
|
|
26
|
+
* MongoDB, Cloudflare, Lambda, Azure).
|
|
27
|
+
*/
|
|
14
28
|
export interface DeploymentService {
|
|
15
29
|
init(): Promise<void>;
|
|
16
30
|
start(config: DeploymentConfig): Promise<void>;
|
|
@@ -4,6 +4,10 @@ export interface EmailTemplateReference {
|
|
|
4
4
|
locale?: string;
|
|
5
5
|
data?: Record<string, unknown>;
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* A file attached to an email, or embedded inline and referenced from the HTML
|
|
9
|
+
* by `contentId`.
|
|
10
|
+
*/
|
|
7
11
|
export interface EmailAttachment {
|
|
8
12
|
filename: string;
|
|
9
13
|
/**
|
|
@@ -26,25 +30,41 @@ export interface BaseSendEmailInput {
|
|
|
26
30
|
subject?: string;
|
|
27
31
|
attachments?: EmailAttachment[];
|
|
28
32
|
}
|
|
33
|
+
/** A plain-text email. */
|
|
29
34
|
export interface SendTextEmailInput extends BaseSendEmailInput {
|
|
30
35
|
text: string;
|
|
31
36
|
html?: never;
|
|
32
37
|
template?: never;
|
|
33
38
|
}
|
|
39
|
+
/** An HTML email, with an optional plain-text alternative. */
|
|
34
40
|
export interface SendHTMLEmailInput extends BaseSendEmailInput {
|
|
35
41
|
html: string;
|
|
36
42
|
text?: string;
|
|
37
43
|
template?: never;
|
|
38
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* An email rendered from a named template compiled by `pikku emails`; the
|
|
47
|
+
* subject comes from the template unless set here.
|
|
48
|
+
*/
|
|
39
49
|
export interface SendTemplateEmailInput extends BaseSendEmailInput {
|
|
40
50
|
template: EmailTemplateReference;
|
|
41
51
|
html?: never;
|
|
42
52
|
text?: never;
|
|
43
53
|
}
|
|
54
|
+
/** Exactly one of a text body, an HTML body or a template. */
|
|
44
55
|
export type SendEmailInput = SendTextEmailInput | SendHTMLEmailInput | SendTemplateEmailInput;
|
|
56
|
+
/** The provider's id for the sent message, when it returns one. */
|
|
45
57
|
export interface SendEmailResult {
|
|
46
58
|
messageId?: string;
|
|
47
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Sends email through a provider (Resend, SES, SMTP, or {@link
|
|
62
|
+
* LocalEmailService} in development), provided as the `emailService` singleton
|
|
63
|
+
* service.
|
|
64
|
+
*
|
|
65
|
+
* The input is `Safe<>`-guarded: a `SecretValue` anywhere in it fails to
|
|
66
|
+
* compile, so a vault secret cannot be mailed by accident.
|
|
67
|
+
*/
|
|
48
68
|
export interface EmailService {
|
|
49
69
|
send<T extends SendEmailInput>(input: Safe<T>): Promise<SendEmailResult>;
|
|
50
70
|
}
|
|
@@ -14,6 +14,10 @@ export interface EmailTemplateHashes {
|
|
|
14
14
|
subjectHash: string;
|
|
15
15
|
textHash: string;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* One compiled template: its HTML, subject and text sources, the variables it
|
|
19
|
+
* reads, and per-locale content hashes.
|
|
20
|
+
*/
|
|
17
21
|
export interface EmailTemplateAssets {
|
|
18
22
|
html: string;
|
|
19
23
|
subject: string;
|
|
@@ -21,17 +25,25 @@ export interface EmailTemplateAssets {
|
|
|
21
25
|
variables: ReadonlyArray<string>;
|
|
22
26
|
hashes: Record<string, EmailTemplateHashes>;
|
|
23
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Everything `pikku emails` generates for rendering: the theme, locale strings,
|
|
30
|
+
* partials and templates.
|
|
31
|
+
*/
|
|
24
32
|
export interface EmailAssets {
|
|
25
33
|
theme: Record<string, unknown>;
|
|
26
34
|
locales: Record<string, Record<string, unknown>>;
|
|
27
35
|
partials: Record<string, string>;
|
|
28
36
|
templates: Record<string, EmailTemplateAssets>;
|
|
29
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Which template to render, in which locale (default `en`), with which data.
|
|
40
|
+
*/
|
|
30
41
|
export interface RenderEmailRequest {
|
|
31
42
|
name: string;
|
|
32
43
|
locale?: string;
|
|
33
44
|
data?: Record<string, unknown>;
|
|
34
45
|
}
|
|
46
|
+
/** A rendered email ready to send. */
|
|
35
47
|
export interface RenderedEmailResult {
|
|
36
48
|
locale: string;
|
|
37
49
|
subject: string;
|
|
@@ -40,4 +52,16 @@ export interface RenderedEmailResult {
|
|
|
40
52
|
variables: ReadonlyArray<string>;
|
|
41
53
|
hash: string;
|
|
42
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Renders a template from the generated email assets. Normally called through
|
|
57
|
+
* the typed wrapper in `pikku-emails.gen.ts`.
|
|
58
|
+
*
|
|
59
|
+
* `{{ value }}` is HTML-escaped in the HTML body; `{{{ value }}}` is written
|
|
60
|
+
* raw. Theme and locale strings (`theme.*`, `t.*`) are trusted and may contain
|
|
61
|
+
* placeholders of their own; caller data is substituted in a single pass and
|
|
62
|
+
* never re-read as a template, so it cannot inject markup or further
|
|
63
|
+
* placeholders.
|
|
64
|
+
*
|
|
65
|
+
* @throws Error when the template or the locale is unknown
|
|
66
|
+
*/
|
|
43
67
|
export declare const renderEmail: ({ theme, locales, partials, templates }: EmailAssets, { name, locale: requestedLocale, data }: RenderEmailRequest) => RenderedEmailResult;
|
|
@@ -100,6 +100,18 @@ const renderTemplate = (source, partials, context, escape, slot) => {
|
|
|
100
100
|
const composed = expandTrusted(expandPartials(source, partials), context, escape);
|
|
101
101
|
return substitute(composed, context, escape, slot);
|
|
102
102
|
};
|
|
103
|
+
/**
|
|
104
|
+
* Renders a template from the generated email assets. Normally called through
|
|
105
|
+
* the typed wrapper in `pikku-emails.gen.ts`.
|
|
106
|
+
*
|
|
107
|
+
* `{{ value }}` is HTML-escaped in the HTML body; `{{{ value }}}` is written
|
|
108
|
+
* raw. Theme and locale strings (`theme.*`, `t.*`) are trusted and may contain
|
|
109
|
+
* placeholders of their own; caller data is substituted in a single pass and
|
|
110
|
+
* never re-read as a template, so it cannot inject markup or further
|
|
111
|
+
* placeholders.
|
|
112
|
+
*
|
|
113
|
+
* @throws Error when the template or the locale is unknown
|
|
114
|
+
*/
|
|
103
115
|
export const renderEmail = ({ theme, locales, partials, templates }, { name, locale: requestedLocale, data }) => {
|
|
104
116
|
const locale = requestedLocale ?? 'en';
|
|
105
117
|
const template = templates[name];
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { ScenarioArtifact, ScenarioResult, ScenarioRunRecord, ScenarioRunStore, ScenarioRunSummary } from '../wirings/workflow/scenario-run.types.js';
|
|
2
2
|
/** Counts and duration, derived rather than stored so they cannot disagree. */
|
|
3
3
|
export declare const scenarioRunSummary: (record: ScenarioRunRecord) => ScenarioRunSummary;
|
|
4
|
+
/**
|
|
5
|
+
* The MIME type a scenario artifact is served with, from its file extension.
|
|
6
|
+
* Unknown extensions are served as `application/octet-stream`.
|
|
7
|
+
*/
|
|
4
8
|
export declare const scenarioArtifactContentType: (path: string) => string;
|
|
9
|
+
/** Options for {@link FileScenarioRunStore}. */
|
|
5
10
|
export interface FileScenarioRunStoreOptions {
|
|
6
11
|
/** The directory runs live under — one folder per run, named by its id. */
|
|
7
12
|
dir: string;
|
|
@@ -43,6 +43,10 @@ const CONTENT_TYPES = {
|
|
|
43
43
|
mp4: 'video/mp4',
|
|
44
44
|
webm: 'video/webm',
|
|
45
45
|
};
|
|
46
|
+
/**
|
|
47
|
+
* The MIME type a scenario artifact is served with, from its file extension.
|
|
48
|
+
* Unknown extensions are served as `application/octet-stream`.
|
|
49
|
+
*/
|
|
46
50
|
export const scenarioArtifactContentType = (path) => CONTENT_TYPES[path.split('.').pop()?.toLowerCase() ?? ''] ??
|
|
47
51
|
'application/octet-stream';
|
|
48
52
|
/**
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Starts and stops the listener gateways (long-lived connections such as a
|
|
3
|
+
* chat-platform socket) registered with `wireGateway`. {@link
|
|
4
|
+
* LocalGatewayService} runs them in the current process.
|
|
5
|
+
*/
|
|
1
6
|
export interface GatewayService {
|
|
2
7
|
start(): Promise<void>;
|
|
3
8
|
stop(): Promise<void>;
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import type { AgentRunStateService, CreateRunInput, SaveScoreInput } from './agent-run-state-service.js';
|
|
2
2
|
import type { AgentRunState, PendingApproval } from '../wirings/agent/agent.types.js';
|
|
3
3
|
import type { AgentRunScore } from '../wirings/agent-scorer/agent-scorer.types.js';
|
|
4
|
+
/**
|
|
5
|
+
* An {@link AgentRunStateService} held in process memory, for development and
|
|
6
|
+
* tests. Runs are lost on restart and not shared between processes, so a run
|
|
7
|
+
* paused for approval cannot be resumed elsewhere.
|
|
8
|
+
*/
|
|
4
9
|
export declare class InMemoryAgentRunStateService implements AgentRunStateService {
|
|
5
10
|
private runs;
|
|
6
11
|
private scores;
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An {@link AgentRunStateService} held in process memory, for development and
|
|
3
|
+
* tests. Runs are lost on restart and not shared between processes, so a run
|
|
4
|
+
* paused for approval cannot be resumed elsewhere.
|
|
5
|
+
*/
|
|
1
6
|
export class InMemoryAgentRunStateService {
|
|
2
7
|
runs = new Map();
|
|
3
8
|
scores = new Map();
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { Lease, LeaseService } from './lease-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* A {@link LeaseService} held in process memory, for development and tests.
|
|
4
|
+
* Leases exclude holders in this process only. The clock can be injected for
|
|
5
|
+
* tests.
|
|
6
|
+
*/
|
|
2
7
|
export declare class InMemoryLeaseService implements LeaseService {
|
|
3
8
|
private now;
|
|
4
9
|
private leases;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { CoreUserSession } from '../types/core.types.js';
|
|
2
2
|
import type { SessionStore } from './session-store.js';
|
|
3
|
+
/**
|
|
4
|
+
* A {@link SessionStore} held in process memory, for development and tests.
|
|
5
|
+
* Sessions are lost on restart and not shared between processes.
|
|
6
|
+
*/
|
|
3
7
|
export declare class InMemorySessionStore<UserSession extends CoreUserSession = CoreUserSession> implements SessionStore<UserSession> {
|
|
4
8
|
private sessions;
|
|
5
9
|
get(pikkuUserId: string): Promise<UserSession | undefined>;
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import type { QueueService } from '../wirings/queue/queue.types.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { TriggerEvent, WebhookRequest, WebhookSourceJob } from '../wirings/trigger/webhook-source.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* One dispatch of a received webhook event to a trigger, and the error if it
|
|
5
|
+
* failed.
|
|
6
|
+
*/
|
|
3
7
|
export type IncomingWebhookAttempt = {
|
|
4
8
|
trigger: string;
|
|
5
9
|
error?: string;
|
|
6
10
|
};
|
|
11
|
+
/**
|
|
12
|
+
* A received webhook event as a store-backed {@link IncomingWebhookService}
|
|
13
|
+
* records it.
|
|
14
|
+
*/
|
|
7
15
|
export type IncomingWebhookReceiptRecord = {
|
|
8
16
|
receiptId: string;
|
|
9
17
|
source: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DEFAULT_WEBHOOK_RETRIES } from './webhook-service.js';
|
|
2
|
-
import { PIKKU_INCOMING_WEBHOOK_QUEUE_NAME
|
|
2
|
+
import { PIKKU_INCOMING_WEBHOOK_QUEUE_NAME } from './incoming-webhook-queue.js';
|
|
3
3
|
/**
|
|
4
4
|
* Queues each event a webhook source received for the
|
|
5
5
|
* `pikku-incoming-webhooks` worker, so the provider is answered once the event
|
package/dist/services/index.d.ts
CHANGED
|
@@ -11,17 +11,13 @@ export { LocalEmailService } from './local-email-service.js';
|
|
|
11
11
|
export { LocalCredentialService } from './local-credential-service.js';
|
|
12
12
|
export { LocalVariablesService } from './local-variables.js';
|
|
13
13
|
export { ConsoleLogger, JsonConsoleLogger } from './logger-console.js';
|
|
14
|
-
export { InMemoryWorkflowService } from './in-memory-workflow-service.js';
|
|
15
14
|
export { QueueWebhookService, pikkuWebhookWorkerFunc, } from './queue-webhook-service.js';
|
|
16
15
|
export { IncomingWebhookService, type IncomingWebhookAttempt, type IncomingWebhookReceiptRecord, } from './incoming-webhook-service.js';
|
|
17
|
-
export { REMOTE_JOBS_SECRET_HEADER, REMOTE_JOBS_SECRET_VARIABLE, REMOTE_QUEUE_JOB_PATH, REMOTE_SCHEDULER_JOB_PATH,
|
|
18
|
-
export { InMemoryQueueService } from './in-memory-queue-service.js';
|
|
19
|
-
export { InMemoryTriggerService } from './in-memory-trigger-service.js';
|
|
16
|
+
export { REMOTE_JOBS_SECRET_HEADER, REMOTE_JOBS_SECRET_VARIABLE, REMOTE_QUEUE_JOB_PATH, REMOTE_SCHEDULER_JOB_PATH, type RemoteQueueJobData, type RemoteScheduledJobData, } from './remote-jobs.js';
|
|
20
17
|
export { InMemoryTriggerSourceStore, type DeclaredTriggerSource, type TriggerSourceKind, type TriggerSourceResult, type TriggerSourceRow, type TriggerSourceStore, } from './trigger-source-store.js';
|
|
21
18
|
export { LeaseLostError, LeaseTakenError, holdLease, type Lease, type LeaseService, } from './lease-service.js';
|
|
22
19
|
export { InMemoryLeaseService } from './in-memory-lease-service.js';
|
|
23
20
|
export { InMemoryAgentRunStateService } from './in-memory-agent-run-state-service.js';
|
|
24
|
-
export { LocalGatewayService } from './local-gateway-service.js';
|
|
25
21
|
export type { ContentService, ContentVisibility, GetDownloadURLArgs, SignContentKeyArgs, SignURLArgs, GetUploadURLArgs, UploadURLResult, BucketKeyArgs, WriteFileArgs, CopyFileArgs, } from './content-service.js';
|
|
26
22
|
export type { ScenarioVirtualUser, ResolvedVirtualUser, ScenarioVirtualUsers, } from './virtual-users-service.js';
|
|
27
23
|
export type { JWTService } from './jwt-service.js';
|
package/dist/services/index.js
CHANGED
|
@@ -11,17 +11,13 @@ export { LocalEmailService } from './local-email-service.js';
|
|
|
11
11
|
export { LocalCredentialService } from './local-credential-service.js';
|
|
12
12
|
export { LocalVariablesService } from './local-variables.js';
|
|
13
13
|
export { ConsoleLogger, JsonConsoleLogger } from './logger-console.js';
|
|
14
|
-
export { InMemoryWorkflowService } from './in-memory-workflow-service.js';
|
|
15
14
|
export { QueueWebhookService, pikkuWebhookWorkerFunc, } from './queue-webhook-service.js';
|
|
16
15
|
export { IncomingWebhookService, } from './incoming-webhook-service.js';
|
|
17
|
-
export { REMOTE_JOBS_SECRET_HEADER, REMOTE_JOBS_SECRET_VARIABLE, REMOTE_QUEUE_JOB_PATH, REMOTE_SCHEDULER_JOB_PATH,
|
|
18
|
-
export { InMemoryQueueService } from './in-memory-queue-service.js';
|
|
19
|
-
export { InMemoryTriggerService } from './in-memory-trigger-service.js';
|
|
16
|
+
export { REMOTE_JOBS_SECRET_HEADER, REMOTE_JOBS_SECRET_VARIABLE, REMOTE_QUEUE_JOB_PATH, REMOTE_SCHEDULER_JOB_PATH, } from './remote-jobs.js';
|
|
20
17
|
export { InMemoryTriggerSourceStore, } from './trigger-source-store.js';
|
|
21
18
|
export { LeaseLostError, LeaseTakenError, holdLease, } from './lease-service.js';
|
|
22
19
|
export { InMemoryLeaseService } from './in-memory-lease-service.js';
|
|
23
20
|
export { InMemoryAgentRunStateService } from './in-memory-agent-run-state-service.js';
|
|
24
|
-
export { LocalGatewayService } from './local-gateway-service.js';
|
|
25
21
|
export { renderEmail, } from './email-template.js';
|
|
26
22
|
export { DEFAULT_WEBHOOK_RETRIES, PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME, WebhookService, } from './webhook-service.js';
|
|
27
23
|
export { VIRTUAL_USER_IN_PROCESS_ENDPOINT, VIRTUAL_USER_STATEMENT_ALGORITHM, VIRTUAL_USER_STATEMENT_MAX_TTL_SECONDS, VIRTUAL_USER_STATEMENT_TTL_SECONDS, VIRTUAL_USER_SIGNING_KEY_VARIABLE, VIRTUAL_USER_VERIFY_KEY_VARIABLE, VirtualUserStatementError, } from './virtual-user-statement.js';
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import type { RelativeTimeInput } from '../time-utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Signs and verifies JSON Web Tokens, provided as the `jwt` singleton service
|
|
4
|
+
* (for example `@pikku/jose`). The cookie and bearer auth middleware use it to
|
|
5
|
+
* turn a token into a session.
|
|
6
|
+
*
|
|
7
|
+
* `decode` must reject a token whose signature does not verify or that has
|
|
8
|
+
* expired; it is the only check between a forged token and a session.
|
|
9
|
+
*/
|
|
2
10
|
export interface JWTService {
|
|
3
11
|
encode: <T extends any>(expiresIn: RelativeTimeInput, payload: T) => Promise<string>;
|
|
4
12
|
/** `invalidHashError` replaces the implementation's own error when the hash does not verify. */
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A held lease. `token` increases each time the key changes hands, so a stale
|
|
3
|
+
* holder can be told apart from the current one.
|
|
4
|
+
*/
|
|
1
5
|
export type Lease = {
|
|
2
6
|
key: string;
|
|
3
7
|
holder: string;
|
|
@@ -16,6 +20,7 @@ export interface LeaseService {
|
|
|
16
20
|
release(lease: Lease): Promise<void>;
|
|
17
21
|
get(key: string): Promise<Lease | null>;
|
|
18
22
|
}
|
|
23
|
+
/** Thrown by `holdLease` when another holder already has the key. */
|
|
19
24
|
export declare class LeaseTakenError extends Error {
|
|
20
25
|
readonly key: string;
|
|
21
26
|
constructor(key: string);
|
|
@@ -16,6 +16,11 @@ import { type LocalContentConfig } from './local-content.js';
|
|
|
16
16
|
* signal to carry on with its normal routing.
|
|
17
17
|
*/
|
|
18
18
|
export type LocalContentRequestHandler = (request: Request) => Promise<Response | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Options for {@link createLocalContentRequestHandler}. `content` must match
|
|
21
|
+
* the config the {@link LocalContent} service was built with, and `getJWT` must
|
|
22
|
+
* return the same `JWTService` it signs with.
|
|
23
|
+
*/
|
|
19
24
|
export type LocalContentRequestHandlerOptions = {
|
|
20
25
|
content: LocalContentConfig;
|
|
21
26
|
logger: Logger;
|
|
@@ -26,6 +31,10 @@ export type LocalContentRequestHandlerOptions = {
|
|
|
26
31
|
*/
|
|
27
32
|
getJWT: () => JWTService | undefined;
|
|
28
33
|
};
|
|
34
|
+
/**
|
|
35
|
+
* The verdict of {@link verifySignedContentRequest}: either valid, or the
|
|
36
|
+
* status and body to refuse the request with.
|
|
37
|
+
*/
|
|
29
38
|
export type SignedContentVerification = {
|
|
30
39
|
ok: true;
|
|
31
40
|
} | {
|
|
@@ -47,4 +56,15 @@ export type SignedContentVerification = {
|
|
|
47
56
|
* invalid, never as trusted.
|
|
48
57
|
*/
|
|
49
58
|
export declare const verifySignedContentRequest: (requestUrl: URL, jwt: JWTService | undefined, onMissingJWT?: () => void) => Promise<SignedContentVerification>;
|
|
59
|
+
/**
|
|
60
|
+
* Creates the request handler that serves {@link LocalContent}: signed `PUT`
|
|
61
|
+
* uploads under `uploadUrlPrefix`, and `GET`/`HEAD` reads under
|
|
62
|
+
* `assetUrlPrefix`.
|
|
63
|
+
*
|
|
64
|
+
* Uploads always require a valid signature; reads require one unless the file
|
|
65
|
+
* is public. Paths that escape the content root are refused with 400, and
|
|
66
|
+
* uploads over `sizeLimit` (default `1mb`) with 413. When no `JWTService` is
|
|
67
|
+
* available, every signed request is refused and the misconfiguration is logged
|
|
68
|
+
* once.
|
|
69
|
+
*/
|
|
50
70
|
export declare const createLocalContentRequestHandler: ({ content, logger, getJWT, }: LocalContentRequestHandlerOptions) => LocalContentRequestHandler;
|
|
@@ -64,6 +64,17 @@ export const verifySignedContentRequest = async (requestUrl, jwt, onMissingJWT)
|
|
|
64
64
|
}
|
|
65
65
|
return { ok: true };
|
|
66
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* Creates the request handler that serves {@link LocalContent}: signed `PUT`
|
|
69
|
+
* uploads under `uploadUrlPrefix`, and `GET`/`HEAD` reads under
|
|
70
|
+
* `assetUrlPrefix`.
|
|
71
|
+
*
|
|
72
|
+
* Uploads always require a valid signature; reads require one unless the file
|
|
73
|
+
* is public. Paths that escape the content root are refused with 400, and
|
|
74
|
+
* uploads over `sizeLimit` (default `1mb`) with 413. When no `JWTService` is
|
|
75
|
+
* available, every signed request is refused and the misconfiguration is logged
|
|
76
|
+
* once.
|
|
77
|
+
*/
|
|
67
78
|
export const createLocalContentRequestHandler = ({ content, logger, getJWT, }) => {
|
|
68
79
|
// Logged at most once. An unverifiable request is attacker-triggerable, so
|
|
69
80
|
// this reports a startup misconfiguration rather than per-request news.
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { BucketKeyArgs, ContentService, ContentVisibility, GetDownloadURLArgs, CopyFileArgs, GetUploadURLArgs, JWTService, Logger, SignContentKeyArgs, SignURLArgs, UploadURLResult, WriteFileArgs } from '@pikku/core/services';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for {@link LocalContent}: the directory files are stored in,
|
|
4
|
+
* the URL prefixes uploads and reads are served under, the origin to prefix
|
|
5
|
+
* URLs with, and the largest accepted upload (for example `10mb`).
|
|
6
|
+
*/
|
|
2
7
|
export interface LocalContentConfig {
|
|
3
8
|
localFileUploadPath: string;
|
|
4
9
|
uploadUrlPrefix: string;
|
|
@@ -17,8 +22,20 @@ export interface LocalContentConfig {
|
|
|
17
22
|
* rather than throwing, which keeps both sides in agreement.
|
|
18
23
|
*/
|
|
19
24
|
export declare const signedContentPath: (urlOrPath: string) => string;
|
|
25
|
+
/**
|
|
26
|
+
* The leading URL segment that marks public content. A private bucket cannot
|
|
27
|
+
* use this name.
|
|
28
|
+
*/
|
|
20
29
|
export declare const PUBLIC_URL_SEGMENT = "_public";
|
|
30
|
+
/**
|
|
31
|
+
* Every {@link ContentVisibility}, also the names of the two directories under
|
|
32
|
+
* the content root.
|
|
33
|
+
*/
|
|
21
34
|
export declare const CONTENT_VISIBILITIES: readonly ContentVisibility[];
|
|
35
|
+
/**
|
|
36
|
+
* A content URL path split into the visibility it names and the
|
|
37
|
+
* `<bucket>/<key>` remainder.
|
|
38
|
+
*/
|
|
22
39
|
export type ContentUrlPath = {
|
|
23
40
|
visibility: ContentVisibility;
|
|
24
41
|
rest: string;
|
|
@@ -37,6 +54,7 @@ export declare const parseContentUrlPath: (key: string) => ContentUrlPath;
|
|
|
37
54
|
* inside it, so neither side can climb out or reach the other.
|
|
38
55
|
*/
|
|
39
56
|
export declare const resolveVisibilityPath: (basePath: string, visibility: ContentVisibility, bucket: string, key: string) => string | null;
|
|
57
|
+
/** The file a content request resolves to, and whether it is public. */
|
|
40
58
|
export type ContentRequestTarget = {
|
|
41
59
|
path: string;
|
|
42
60
|
visibility: ContentVisibility;
|
|
@@ -50,11 +68,38 @@ export type ContentRequestTarget = {
|
|
|
50
68
|
* check only when the result is public.
|
|
51
69
|
*/
|
|
52
70
|
export declare const resolveContentRequestTarget: (basePath: string, key: string, mode: 'read' | 'write') => Promise<ContentRequestTarget | null>;
|
|
71
|
+
/**
|
|
72
|
+
* Thrown by {@link streamUploadToFile} when an upload passes its byte limit.
|
|
73
|
+
*/
|
|
53
74
|
export declare class UploadTooLargeError extends Error {
|
|
54
75
|
constructor();
|
|
55
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Parses a size such as `512kb` or `10mb` (binary units; no unit means bytes)
|
|
79
|
+
* into bytes.
|
|
80
|
+
*
|
|
81
|
+
* @throws Error when the string is not a size
|
|
82
|
+
*/
|
|
56
83
|
export declare const parseContentSizeLimit: (sizeLimit: string) => number;
|
|
84
|
+
/**
|
|
85
|
+
* Streams an upload to `targetPath`, writing to a temporary file that is
|
|
86
|
+
* renamed into place only once the whole body arrived, so a failed or oversized
|
|
87
|
+
* upload never leaves a partial file behind.
|
|
88
|
+
*
|
|
89
|
+
* @returns the number of bytes written
|
|
90
|
+
* @throws UploadTooLargeError when the body passes `maxBytes`
|
|
91
|
+
*/
|
|
57
92
|
export declare const streamUploadToFile: (source: AsyncIterable<Uint8Array>, targetPath: string, maxBytes: number) => Promise<number>;
|
|
93
|
+
/**
|
|
94
|
+
* A {@link ContentService} that stores files on local disk, for development and
|
|
95
|
+
* single-server deployments. Private and public files live in separate
|
|
96
|
+
* directories; URLs for private files are signed with the given `JWTService`
|
|
97
|
+
* and checked by {@link createLocalContentRequestHandler}, and upload URLs
|
|
98
|
+
* expire after 15 minutes. Keys that would escape the content root are
|
|
99
|
+
* rejected.
|
|
100
|
+
*
|
|
101
|
+
* @throws Error from the constructor when no `JWTService` is given
|
|
102
|
+
*/
|
|
58
103
|
export declare class LocalContent implements ContentService {
|
|
59
104
|
private config;
|
|
60
105
|
private logger;
|