@pikku/core 0.12.142 → 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 +11 -1
- package/dist/services/incoming-webhook-service.js +5 -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 +16 -0
- package/dist/services/scheduler-service.js +12 -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/wirings/queue/in-memory-queue-service.d.ts +23 -0
- package/dist/wirings/queue/in-memory-queue-service.js +129 -0
- package/dist/wirings/queue/index.d.ts +2 -1
- 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 +56 -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/signed-queue-service.d.ts +4 -1
- package/dist/wirings/queue/signed-queue-service.js +3 -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 +2 -1
- 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 +15 -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 -6961
- package/dist/services/in-memory-queue-service.d.ts +0 -8
- package/dist/services/in-memory-queue-service.js +0 -54
- 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-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 -46
- 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 -181
- 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 -34
- 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
|
@@ -29,7 +29,15 @@ export const signedContentPath = (urlOrPath) => {
|
|
|
29
29
|
return pathname;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
|
+
/**
|
|
33
|
+
* The leading URL segment that marks public content. A private bucket cannot
|
|
34
|
+
* use this name.
|
|
35
|
+
*/
|
|
32
36
|
export const PUBLIC_URL_SEGMENT = '_public';
|
|
37
|
+
/**
|
|
38
|
+
* Every {@link ContentVisibility}, also the names of the two directories under
|
|
39
|
+
* the content root.
|
|
40
|
+
*/
|
|
33
41
|
export const CONTENT_VISIBILITIES = [
|
|
34
42
|
'private',
|
|
35
43
|
'public',
|
|
@@ -101,11 +109,20 @@ export const resolveContentRequestTarget = async (basePath, key, mode) => {
|
|
|
101
109
|
};
|
|
102
110
|
/** How long a presigned upload URL stays valid. Short, like an S3 PUT URL. */
|
|
103
111
|
const UPLOAD_URL_TTL_MS = 15 * 60 * 1000;
|
|
112
|
+
/**
|
|
113
|
+
* Thrown by {@link streamUploadToFile} when an upload passes its byte limit.
|
|
114
|
+
*/
|
|
104
115
|
export class UploadTooLargeError extends Error {
|
|
105
116
|
constructor() {
|
|
106
117
|
super('content_too_large');
|
|
107
118
|
}
|
|
108
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Parses a size such as `512kb` or `10mb` (binary units; no unit means bytes)
|
|
122
|
+
* into bytes.
|
|
123
|
+
*
|
|
124
|
+
* @throws Error when the string is not a size
|
|
125
|
+
*/
|
|
109
126
|
export const parseContentSizeLimit = (sizeLimit) => {
|
|
110
127
|
const match = /^(\d+(?:\.\d+)?)(b|kb|mb|gb)?$/i.exec(sizeLimit.trim());
|
|
111
128
|
if (!match) {
|
|
@@ -121,6 +138,14 @@ export const parseContentSizeLimit = (sizeLimit) => {
|
|
|
121
138
|
: 1;
|
|
122
139
|
return Number(match[1]) * multiplier;
|
|
123
140
|
};
|
|
141
|
+
/**
|
|
142
|
+
* Streams an upload to `targetPath`, writing to a temporary file that is
|
|
143
|
+
* renamed into place only once the whole body arrived, so a failed or oversized
|
|
144
|
+
* upload never leaves a partial file behind.
|
|
145
|
+
*
|
|
146
|
+
* @returns the number of bytes written
|
|
147
|
+
* @throws UploadTooLargeError when the body passes `maxBytes`
|
|
148
|
+
*/
|
|
124
149
|
export const streamUploadToFile = async (source, targetPath, maxBytes) => {
|
|
125
150
|
await mkdir(resolve(targetPath, '..'), { recursive: true });
|
|
126
151
|
const partial = `${targetPath}.${process.pid}.${Date.now()}.${randomUUID()}.part`;
|
|
@@ -145,6 +170,16 @@ export const streamUploadToFile = async (source, targetPath, maxBytes) => {
|
|
|
145
170
|
throw error;
|
|
146
171
|
}
|
|
147
172
|
};
|
|
173
|
+
/**
|
|
174
|
+
* A {@link ContentService} that stores files on local disk, for development and
|
|
175
|
+
* single-server deployments. Private and public files live in separate
|
|
176
|
+
* directories; URLs for private files are signed with the given `JWTService`
|
|
177
|
+
* and checked by {@link createLocalContentRequestHandler}, and upload URLs
|
|
178
|
+
* expire after 15 minutes. Keys that would escape the content root are
|
|
179
|
+
* rejected.
|
|
180
|
+
*
|
|
181
|
+
* @throws Error from the constructor when no `JWTService` is given
|
|
182
|
+
*/
|
|
148
183
|
export class LocalContent {
|
|
149
184
|
config;
|
|
150
185
|
logger;
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { CredentialService } from './credential-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* A `CredentialService` held in process memory, for development and tests.
|
|
4
|
+
* Values are stored unencrypted and lost on restart; do not use it in
|
|
5
|
+
* production.
|
|
6
|
+
*/
|
|
2
7
|
export declare class LocalCredentialService implements CredentialService {
|
|
3
8
|
private store;
|
|
4
9
|
private makeKey;
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { EmailService, SendEmailInput, SendEmailResult } from './email-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* An {@link EmailService} for development that sends nothing. It logs the
|
|
4
|
+
* recipients and subject to the console, with the body and attachments reduced
|
|
5
|
+
* to their lengths.
|
|
6
|
+
*
|
|
7
|
+
* @example snippet: shopServices
|
|
8
|
+
*/
|
|
2
9
|
export declare class LocalEmailService implements EmailService {
|
|
3
10
|
send(input: SendEmailInput): Promise<SendEmailResult>;
|
|
4
11
|
}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An {@link EmailService} for development that sends nothing. It logs the
|
|
3
|
+
* recipients and subject to the console, with the body and attachments reduced
|
|
4
|
+
* to their lengths.
|
|
5
|
+
*
|
|
6
|
+
* @example snippet: shopServices
|
|
7
|
+
*/
|
|
1
8
|
export class LocalEmailService {
|
|
2
9
|
async send(input) {
|
|
3
10
|
const payload = {
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { type SecretValue } from '../classification/secret-value.js';
|
|
2
2
|
import type { SecretService, SecretValues } from './secret-service.js';
|
|
3
3
|
import type { VariablesService } from './variables-service.js';
|
|
4
|
+
/**
|
|
5
|
+
* A {@link SecretService} for development that reads secrets from a
|
|
6
|
+
* `VariablesService` (by default `process.env`), with values set at runtime
|
|
7
|
+
* kept in memory. Values that parse as JSON are returned parsed. Use a
|
|
8
|
+
* vault-backed implementation in production.
|
|
9
|
+
*
|
|
10
|
+
* @example snippet: shopServices
|
|
11
|
+
*/
|
|
4
12
|
export declare class LocalSecretService implements SecretService {
|
|
5
13
|
private variables;
|
|
6
14
|
private localSecrets;
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { createSecretValue, isSecretValue, } from '../classification/secret-value.js';
|
|
2
2
|
import { LocalVariablesService } from './local-variables.js';
|
|
3
|
+
/**
|
|
4
|
+
* A {@link SecretService} for development that reads secrets from a
|
|
5
|
+
* `VariablesService` (by default `process.env`), with values set at runtime
|
|
6
|
+
* kept in memory. Values that parse as JSON are returned parsed. Use a
|
|
7
|
+
* vault-backed implementation in production.
|
|
8
|
+
*
|
|
9
|
+
* @example snippet: shopServices
|
|
10
|
+
*/
|
|
3
11
|
export class LocalSecretService {
|
|
4
12
|
variables;
|
|
5
13
|
localSecrets = new Map();
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import type { VariablesService } from './variables-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* A {@link VariablesService} backed by a plain object, `process.env` by
|
|
4
|
+
* default. Values that parse as JSON are returned parsed.
|
|
5
|
+
*
|
|
6
|
+
* @example snippet: shopServices
|
|
7
|
+
*/
|
|
2
8
|
export declare class LocalVariablesService implements VariablesService {
|
|
3
9
|
private variables;
|
|
4
10
|
/**
|
package/dist/services/logger.js
CHANGED
|
@@ -24,13 +24,22 @@ import type { AgentsMeta } from '../wirings/agent/agent.types.js';
|
|
|
24
24
|
import type { GatewaysMeta } from '../wirings/gateway/gateway.types.js';
|
|
25
25
|
export type { FunctionMeta, FunctionsMeta, MiddlewareMetadata as MiddlewareMeta, PermissionMetadata as PermissionMeta, };
|
|
26
26
|
export type { AgentsMeta };
|
|
27
|
+
/** Generated metadata for one agent. */
|
|
27
28
|
export type AgentMeta = AgentsMeta[string];
|
|
29
|
+
/**
|
|
30
|
+
* Generated metadata for the MCP tools, resources and prompts the app exposes.
|
|
31
|
+
*/
|
|
28
32
|
export interface MCPMeta {
|
|
29
33
|
resources: MCPResourceMeta;
|
|
30
34
|
tools: MCPToolMeta;
|
|
31
35
|
prompts: MCPPromptMeta;
|
|
32
36
|
}
|
|
37
|
+
/** Generated map from each RPC name to the function it invokes. */
|
|
33
38
|
export type RPCMetaRecord = Record<string, string>;
|
|
39
|
+
/**
|
|
40
|
+
* Generated description of one service: its package, interface and expanded
|
|
41
|
+
* properties.
|
|
42
|
+
*/
|
|
34
43
|
export interface ServiceMeta {
|
|
35
44
|
name: string;
|
|
36
45
|
summary: string;
|
|
@@ -41,7 +50,9 @@ export interface ServiceMeta {
|
|
|
41
50
|
interface: string;
|
|
42
51
|
expandedProperties: Record<string, string>;
|
|
43
52
|
}
|
|
53
|
+
/** Generated {@link ServiceMeta}, keyed by service name. */
|
|
44
54
|
export type ServicesMetaRecord = Record<string, ServiceMeta>;
|
|
55
|
+
/** Where a middleware is defined and which services it uses. */
|
|
45
56
|
export interface MiddlewareDefinitionMeta {
|
|
46
57
|
services: {
|
|
47
58
|
optimized: boolean;
|
|
@@ -55,12 +66,16 @@ export interface MiddlewareDefinitionMeta {
|
|
|
55
66
|
description?: string;
|
|
56
67
|
package?: string;
|
|
57
68
|
}
|
|
69
|
+
/** One place a middleware definition is used. */
|
|
58
70
|
export interface MiddlewareInstanceMeta {
|
|
59
71
|
definitionId: string;
|
|
60
72
|
sourceFile: string;
|
|
61
73
|
position: number;
|
|
62
74
|
isFactoryCall: boolean;
|
|
63
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Middleware or permissions applied together to an HTTP route pattern or a tag.
|
|
78
|
+
*/
|
|
64
79
|
export interface GroupMeta {
|
|
65
80
|
exportName: string | null;
|
|
66
81
|
sourceFile: string;
|
|
@@ -73,12 +88,14 @@ export interface GroupMeta {
|
|
|
73
88
|
instanceIds: string[];
|
|
74
89
|
isFactory: boolean;
|
|
75
90
|
}
|
|
91
|
+
/** Generated metadata for every middleware definition, use and group. */
|
|
76
92
|
export interface MiddlewareGroupsMeta {
|
|
77
93
|
definitions: Record<string, MiddlewareDefinitionMeta>;
|
|
78
94
|
instances: Record<string, MiddlewareInstanceMeta>;
|
|
79
95
|
httpGroups: Record<string, GroupMeta>;
|
|
80
96
|
tagGroups: Record<string, GroupMeta>;
|
|
81
97
|
}
|
|
98
|
+
/** Where a permission is defined and which services it uses. */
|
|
82
99
|
export interface PermissionDefinitionMeta {
|
|
83
100
|
services: {
|
|
84
101
|
optimized: boolean;
|
|
@@ -91,15 +108,24 @@ export interface PermissionDefinitionMeta {
|
|
|
91
108
|
name?: string;
|
|
92
109
|
description?: string;
|
|
93
110
|
}
|
|
111
|
+
/** Generated metadata for every permission definition. */
|
|
94
112
|
export interface PermissionsGroupsMeta {
|
|
95
113
|
definitions: Record<string, PermissionDefinitionMeta>;
|
|
96
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Content hashes of one email template in one locale, used to tell when a
|
|
117
|
+
* template changed.
|
|
118
|
+
*/
|
|
97
119
|
export interface EmailTemplateLocaleMeta {
|
|
98
120
|
contentHash: string;
|
|
99
121
|
htmlHash: string;
|
|
100
122
|
subjectHash: string;
|
|
101
123
|
textHash: string;
|
|
102
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Generated metadata for one email template: the variables it reads, which
|
|
127
|
+
* parts it has, and its locales.
|
|
128
|
+
*/
|
|
103
129
|
export interface EmailTemplateMeta {
|
|
104
130
|
variables: string[];
|
|
105
131
|
hasHtml: boolean;
|
|
@@ -107,11 +133,17 @@ export interface EmailTemplateMeta {
|
|
|
107
133
|
hasText: boolean;
|
|
108
134
|
locales: Record<string, EmailTemplateLocaleMeta>;
|
|
109
135
|
}
|
|
136
|
+
/** Generated metadata for every email template. */
|
|
110
137
|
export interface EmailsMeta {
|
|
111
138
|
src: string;
|
|
112
139
|
themeHash: string;
|
|
113
140
|
templates: Record<string, EmailTemplateMeta>;
|
|
114
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* The raw sources of one email template in one locale, as read from disk for
|
|
144
|
+
* previewing. `missing` names the required parts (`theme`, `locale`, `html`,
|
|
145
|
+
* `subject`, `text`) that were not found.
|
|
146
|
+
*/
|
|
115
147
|
export interface EmailTemplateAssets {
|
|
116
148
|
theme: Record<string, unknown>;
|
|
117
149
|
strings: Record<string, unknown>;
|
|
@@ -194,6 +226,12 @@ export interface MetaService {
|
|
|
194
226
|
getSchemas(schemaNames: string[]): Promise<Record<string, JSONSchema7 | null>>;
|
|
195
227
|
clearCache(): void;
|
|
196
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* A {@link MetaService} that reads the generated metadata from a `.pikku`
|
|
231
|
+
* directory on local disk and caches each file after its first read. Missing
|
|
232
|
+
* files are returned as empty metadata rather than errors. Used by the console
|
|
233
|
+
* and dev tooling.
|
|
234
|
+
*/
|
|
197
235
|
export declare class LocalMetaService implements MetaService {
|
|
198
236
|
readonly basePath: string;
|
|
199
237
|
private httpMetaCache;
|
|
@@ -2,6 +2,12 @@ import { readFile, readdir } from 'node:fs/promises';
|
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { createRequire } from 'node:module';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
+
/**
|
|
6
|
+
* A {@link MetaService} that reads the generated metadata from a `.pikku`
|
|
7
|
+
* directory on local disk and caches each file after its first read. Missing
|
|
8
|
+
* files are returned as empty metadata rather than errors. Used by the console
|
|
9
|
+
* and dev tooling.
|
|
10
|
+
*/
|
|
5
11
|
export class LocalMetaService {
|
|
6
12
|
basePath;
|
|
7
13
|
httpMetaCache = null;
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import type { JobOptions, QueueService } from '../wirings/queue/queue.types.js';
|
|
2
2
|
import type { Logger } from './logger.js';
|
|
3
3
|
import { type SendWebhookInput, type SendWebhookResult, type WebhookJobData, WebhookService } from './webhook-service.js';
|
|
4
|
+
/**
|
|
5
|
+
* A {@link WebhookService} that delivers through the `pikku-outgoing-webhooks`
|
|
6
|
+
* queue, so a slow or failing receiver is retried by the queue rather than
|
|
7
|
+
* holding up the caller.
|
|
8
|
+
*
|
|
9
|
+
* The body is signed before it is enqueued, with `input.secret` or else the
|
|
10
|
+
* secret named by `config.webhook.secret`; if that secret resolves to nothing
|
|
11
|
+
* the webhook is sent unsigned and an error is logged. Retries default to
|
|
12
|
+
* `config.webhook.retries`, then {@link DEFAULT_WEBHOOK_RETRIES}.
|
|
13
|
+
*/
|
|
4
14
|
export declare class QueueWebhookService extends WebhookService {
|
|
5
15
|
protected queueService: QueueService;
|
|
6
16
|
constructor(queueService: QueueService);
|
|
@@ -15,6 +25,15 @@ export declare class QueueWebhookService extends WebhookService {
|
|
|
15
25
|
}>;
|
|
16
26
|
private resolveJobOptions;
|
|
17
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* The queue worker that delivers one outgoing webhook. It POSTs through
|
|
30
|
+
* `safeFetch`, so private and internal hosts are refused unless listed in
|
|
31
|
+
* `config.webhook.allowedHosts`, and times out after 30 seconds. Each attempt
|
|
32
|
+
* is recorded when the service keeps delivery history.
|
|
33
|
+
*
|
|
34
|
+
* @throws Error when the receiver does not answer with a 2xx status, so the
|
|
35
|
+
* queue retries the job
|
|
36
|
+
*/
|
|
18
37
|
export declare function pikkuWebhookWorkerFunc(services: {
|
|
19
38
|
logger: Logger;
|
|
20
39
|
webhookService?: WebhookService;
|
|
@@ -4,6 +4,16 @@ import { safeFetch } from '../utils/safe-fetch.js';
|
|
|
4
4
|
import { DEFAULT_WEBHOOK_RETRIES, DEFAULT_WEBHOOK_SIGNATURE_HEADER, PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME, WebhookService, } from './webhook-service.js';
|
|
5
5
|
const MAX_CAPTURED_RESPONSE_BODY = 2_000;
|
|
6
6
|
// knowledge: decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md
|
|
7
|
+
/**
|
|
8
|
+
* A {@link WebhookService} that delivers through the `pikku-outgoing-webhooks`
|
|
9
|
+
* queue, so a slow or failing receiver is retried by the queue rather than
|
|
10
|
+
* holding up the caller.
|
|
11
|
+
*
|
|
12
|
+
* The body is signed before it is enqueued, with `input.secret` or else the
|
|
13
|
+
* secret named by `config.webhook.secret`; if that secret resolves to nothing
|
|
14
|
+
* the webhook is sent unsigned and an error is logged. Retries default to
|
|
15
|
+
* `config.webhook.retries`, then {@link DEFAULT_WEBHOOK_RETRIES}.
|
|
16
|
+
*/
|
|
7
17
|
export class QueueWebhookService extends WebhookService {
|
|
8
18
|
queueService;
|
|
9
19
|
// knowledge: decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md
|
|
@@ -63,6 +73,15 @@ export class QueueWebhookService extends WebhookService {
|
|
|
63
73
|
}
|
|
64
74
|
}
|
|
65
75
|
// knowledge: decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md
|
|
76
|
+
/**
|
|
77
|
+
* The queue worker that delivers one outgoing webhook. It POSTs through
|
|
78
|
+
* `safeFetch`, so private and internal hosts are refused unless listed in
|
|
79
|
+
* `config.webhook.allowedHosts`, and times out after 30 seconds. Each attempt
|
|
80
|
+
* is recorded when the service keeps delivery history.
|
|
81
|
+
*
|
|
82
|
+
* @throws Error when the receiver does not answer with a 2xx status, so the
|
|
83
|
+
* queue retries the job
|
|
84
|
+
*/
|
|
66
85
|
export async function pikkuWebhookWorkerFunc(services, { url, body, headers, deliveryId }) {
|
|
67
86
|
let statusCode;
|
|
68
87
|
let responseBody;
|
|
@@ -1,27 +1,22 @@
|
|
|
1
|
-
import type { Logger } from './logger.js';
|
|
2
1
|
/** The variable holding the shared secret every remote job must present. */
|
|
3
2
|
export declare const REMOTE_JOBS_SECRET_VARIABLE = "PIKKU_DISPATCH_SECRET";
|
|
3
|
+
/** The header a remote job request carries the dispatch secret in. */
|
|
4
4
|
export declare const REMOTE_JOBS_SECRET_HEADER = "x-pikku-dispatch";
|
|
5
|
+
/** The HTTP path a deployment receives remote queue jobs on. */
|
|
5
6
|
export declare const REMOTE_QUEUE_JOB_PATH = "/__pikku/queue-job";
|
|
7
|
+
/** The HTTP path a deployment receives remote scheduled tasks on. */
|
|
6
8
|
export declare const REMOTE_SCHEDULER_JOB_PATH = "/__pikku/scheduler-job";
|
|
9
|
+
/** A queue job delivered over HTTP to {@link REMOTE_QUEUE_JOB_PATH}. */
|
|
7
10
|
export interface RemoteQueueJobData {
|
|
8
11
|
queueName: string;
|
|
9
12
|
data?: unknown;
|
|
10
13
|
jobId?: string;
|
|
11
14
|
traceId?: string;
|
|
12
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* A scheduled task run delivered over HTTP to {@link
|
|
18
|
+
* REMOTE_SCHEDULER_JOB_PATH}.
|
|
19
|
+
*/
|
|
13
20
|
export interface RemoteScheduledJobData {
|
|
14
21
|
taskName: string;
|
|
15
22
|
}
|
|
16
|
-
/**
|
|
17
|
-
* A dispatched job is delivered, not owned: the sender retries, so a permanent
|
|
18
|
-
* failure has to read differently from a transient one. An unknown worker or a
|
|
19
|
-
* discarded job answers 4xx so the sender stops; anything else propagates and
|
|
20
|
-
* is delivered again.
|
|
21
|
-
*/
|
|
22
|
-
export declare function pikkuRemoteQueueJobFunc({ logger }: {
|
|
23
|
-
logger: Logger;
|
|
24
|
-
}, { queueName, data, jobId, traceId }: RemoteQueueJobData): Promise<void>;
|
|
25
|
-
export declare function pikkuRemoteScheduledJobFunc({ logger }: {
|
|
26
|
-
logger: Logger;
|
|
27
|
-
}, { taskName }: RemoteScheduledJobData): Promise<void>;
|
|
@@ -1,59 +1,8 @@
|
|
|
1
|
-
import { BadRequestError, PikkuMissingMetaError } from '../errors/errors.js';
|
|
2
|
-
import { QueueJobDiscardedError, runQueueJob } from '../wirings/queue/queue-runner.js';
|
|
3
|
-
import { ScheduledTaskNotFoundError, runScheduledTask, } from '../wirings/scheduler/scheduler-runner.js';
|
|
4
1
|
/** The variable holding the shared secret every remote job must present. */
|
|
5
2
|
export const REMOTE_JOBS_SECRET_VARIABLE = 'PIKKU_DISPATCH_SECRET';
|
|
3
|
+
/** The header a remote job request carries the dispatch secret in. */
|
|
6
4
|
export const REMOTE_JOBS_SECRET_HEADER = 'x-pikku-dispatch';
|
|
5
|
+
/** The HTTP path a deployment receives remote queue jobs on. */
|
|
7
6
|
export const REMOTE_QUEUE_JOB_PATH = '/__pikku/queue-job';
|
|
7
|
+
/** The HTTP path a deployment receives remote scheduled tasks on. */
|
|
8
8
|
export const REMOTE_SCHEDULER_JOB_PATH = '/__pikku/scheduler-job';
|
|
9
|
-
/**
|
|
10
|
-
* A dispatched job is delivered, not owned: the sender retries, so a permanent
|
|
11
|
-
* failure has to read differently from a transient one. An unknown worker or a
|
|
12
|
-
* discarded job answers 4xx so the sender stops; anything else propagates and
|
|
13
|
-
* is delivered again.
|
|
14
|
-
*/
|
|
15
|
-
export async function pikkuRemoteQueueJobFunc({ logger }, { queueName, data, jobId, traceId }) {
|
|
16
|
-
const job = {
|
|
17
|
-
queueName,
|
|
18
|
-
data,
|
|
19
|
-
id: jobId ?? traceId ?? `remote-${Date.now()}`,
|
|
20
|
-
status: async () => 'active',
|
|
21
|
-
metadata: () => ({
|
|
22
|
-
processedAt: new Date(),
|
|
23
|
-
attemptsMade: 0,
|
|
24
|
-
maxAttempts: undefined,
|
|
25
|
-
result: undefined,
|
|
26
|
-
progress: 0,
|
|
27
|
-
createdAt: new Date(),
|
|
28
|
-
completedAt: undefined,
|
|
29
|
-
failedAt: undefined,
|
|
30
|
-
error: undefined,
|
|
31
|
-
}),
|
|
32
|
-
waitForCompletion: async () => {
|
|
33
|
-
throw new Error('remote jobs do not support waitForCompletion');
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
try {
|
|
37
|
-
await runQueueJob({ job, traceId });
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
if (error instanceof PikkuMissingMetaError ||
|
|
41
|
-
error instanceof QueueJobDiscardedError) {
|
|
42
|
-
throw new BadRequestError(error.message);
|
|
43
|
-
}
|
|
44
|
-
logger.error(`remote-jobs: queue '${queueName}' failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
45
|
-
throw error;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
export async function pikkuRemoteScheduledJobFunc({ logger }, { taskName }) {
|
|
49
|
-
try {
|
|
50
|
-
await runScheduledTask({ name: taskName, traceId: `cron-${taskName}` });
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
if (error instanceof ScheduledTaskNotFoundError) {
|
|
54
|
-
throw new BadRequestError(error.message);
|
|
55
|
-
}
|
|
56
|
-
logger.error(`remote-jobs: task '${taskName}' failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
57
|
-
throw error;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
import type { CoreUserSession } from '../types/core.types.js';
|
|
2
|
+
import type { ScheduledTaskRuns } from '../wirings/scheduler/scheduler.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* A task scheduled with {@link SchedulerService.scheduleRPC}: which RPC it runs
|
|
5
|
+
* and when.
|
|
6
|
+
*/
|
|
2
7
|
export interface ScheduledTaskSummary {
|
|
3
8
|
taskId: string;
|
|
4
9
|
rpcName: string;
|
|
5
10
|
scheduledFor: Date;
|
|
6
11
|
}
|
|
12
|
+
/** A scheduled task with the data and session it will run with. */
|
|
7
13
|
export interface ScheduledTaskInfo extends ScheduledTaskSummary {
|
|
8
14
|
data?: any;
|
|
9
15
|
session?: CoreUserSession;
|
|
10
16
|
status?: 'scheduled' | 'active' | 'completed' | 'failed';
|
|
11
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Runs RPCs later, provided as the `schedulerService` singleton service
|
|
20
|
+
* (implementations ship in the queue and database packages). A task runs the
|
|
21
|
+
* named RPC with the given data, under the session it was scheduled with.
|
|
22
|
+
*
|
|
23
|
+
* This is for one-off delayed work; recurring cron tasks are declared with
|
|
24
|
+
* `wireScheduler`.
|
|
25
|
+
*/
|
|
12
26
|
export declare abstract class SchedulerService {
|
|
13
27
|
abstract init(): Promise<void>;
|
|
14
28
|
/** `delay` is milliseconds as a number, or a duration string such as `"5h"` / `"30m"`. */
|
|
@@ -17,6 +31,8 @@ export declare abstract class SchedulerService {
|
|
|
17
31
|
abstract getTask(taskId: string): Promise<ScheduledTaskInfo | null>;
|
|
18
32
|
abstract getAllTasks(): Promise<ScheduledTaskSummary[]>;
|
|
19
33
|
abstract close(): Promise<void>;
|
|
34
|
+
/** Per wired cron task. Empty when this scheduler keeps no run history. */
|
|
35
|
+
getTaskRuns(): Promise<Record<string, ScheduledTaskRuns>>;
|
|
20
36
|
start(): Promise<void>;
|
|
21
37
|
stop(): Promise<void>;
|
|
22
38
|
}
|
|
@@ -1,4 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs RPCs later, provided as the `schedulerService` singleton service
|
|
3
|
+
* (implementations ship in the queue and database packages). A task runs the
|
|
4
|
+
* named RPC with the given data, under the session it was scheduled with.
|
|
5
|
+
*
|
|
6
|
+
* This is for one-off delayed work; recurring cron tasks are declared with
|
|
7
|
+
* `wireScheduler`.
|
|
8
|
+
*/
|
|
1
9
|
export class SchedulerService {
|
|
10
|
+
/** Per wired cron task. Empty when this scheduler keeps no run history. */
|
|
11
|
+
async getTaskRuns() {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
2
14
|
async start() { }
|
|
3
15
|
async stop() { }
|
|
4
16
|
}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates function input against the JSON schemas generated from your types,
|
|
3
|
+
* provided as the `schema` singleton service (for example `@pikku/schema-ajv`
|
|
4
|
+
* or `@pikku/schema-cfworker`).
|
|
5
|
+
*
|
|
6
|
+
* `validateSchema` must throw when the data does not match; the implementations
|
|
7
|
+
* throw `UnprocessableContentError` (422). When no schema service is
|
|
8
|
+
* configured, input is not validated.
|
|
9
|
+
*/
|
|
1
10
|
export interface SchemaService {
|
|
2
11
|
compileSchema: (name: string, value: any) => Promise<void> | void;
|
|
3
12
|
validateSchema: (schema: string, data: any) => Promise<void> | void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { FlatScope } from '../wirings/scope/scope.types.js';
|
|
2
2
|
import type { SystemRole } from '../wirings/role/role.types.js';
|
|
3
|
+
/** A named set of scopes that can be granted to a user. */
|
|
3
4
|
export interface Role {
|
|
4
5
|
name: string;
|
|
5
6
|
description?: string;
|
|
@@ -17,6 +18,15 @@ export interface Role {
|
|
|
17
18
|
*/
|
|
18
19
|
declared?: boolean;
|
|
19
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Stores the scopes and roles declared in code and who holds them, and resolves
|
|
23
|
+
* a user's effective scopes. Sessions call {@link ScopeService.resolveScopes}
|
|
24
|
+
* so `scopes` checks on functions see role grants as well as direct ones.
|
|
25
|
+
*
|
|
26
|
+
* Syncing from code is additive: a scope or system role removed from code is
|
|
27
|
+
* marked `declared: false` rather than deleted, so a deploy never revokes
|
|
28
|
+
* grants on its own; `pikku scopes prune` and `pikku roles prune` remove them.
|
|
29
|
+
*/
|
|
20
30
|
export interface ScopeService {
|
|
21
31
|
syncScopes(scopes: FlatScope[]): Promise<void>;
|
|
22
32
|
/** The union of role-derived scopes and scopes granted directly. */
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { SecretValue } from '../classification/secret-value.js';
|
|
2
2
|
import type { SecretService, SecretValues } from './secret-service.js';
|
|
3
|
+
/**
|
|
4
|
+
* A read-only view of a {@link SecretService} limited to an allow-list of keys,
|
|
5
|
+
* for handing to code that should see only the secrets it declared. Reading a
|
|
6
|
+
* key outside the list throws, and every write method throws.
|
|
7
|
+
*/
|
|
3
8
|
export declare class ScopedSecretService implements SecretService {
|
|
4
9
|
private secrets;
|
|
5
10
|
private allowedKeys;
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A read-only view of a {@link SecretService} limited to an allow-list of keys,
|
|
3
|
+
* for handing to code that should see only the secrets it declared. Reading a
|
|
4
|
+
* key outside the list throws, and every write method throws.
|
|
5
|
+
*/
|
|
1
6
|
export class ScopedSecretService {
|
|
2
7
|
secrets;
|
|
3
8
|
allowedKeys;
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { SecretDefinitionsMeta } from '../wirings/secret/secret.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Thrown when a secret would be sent to a host its `defineSecret` declaration
|
|
4
|
+
* does not list in `allowedHosts`, or, when the project requires
|
|
5
|
+
* `allowedHosts`, when it lists none.
|
|
6
|
+
*/
|
|
2
7
|
export declare class SecretHostNotAllowedError extends Error {
|
|
3
8
|
readonly secretId: string;
|
|
4
9
|
readonly host: string;
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown when a secret would be sent to a host its `defineSecret` declaration
|
|
3
|
+
* does not list in `allowedHosts`, or, when the project requires
|
|
4
|
+
* `allowedHosts`, when it lists none.
|
|
5
|
+
*/
|
|
1
6
|
export class SecretHostNotAllowedError extends Error {
|
|
2
7
|
secretId;
|
|
3
8
|
host;
|
|
@@ -3,6 +3,19 @@ import type { SecretValue } from '../classification/secret-value.js';
|
|
|
3
3
|
export type SecretValues<T> = {
|
|
4
4
|
[K in keyof T]: SecretValue<T[K]>;
|
|
5
5
|
};
|
|
6
|
+
/**
|
|
7
|
+
* Reads and writes secrets, provided as the `secrets` singleton service (for
|
|
8
|
+
* example a cloud secret manager, or {@link LocalSecretService} in
|
|
9
|
+
* development).
|
|
10
|
+
*
|
|
11
|
+
* Values come back wrapped in a `SecretValue`, which logs and serializes as
|
|
12
|
+
* `[secret]` until `.reveal()` is called, and the logger, audit log and email
|
|
13
|
+
* service refuse a `SecretValue` at compile time. Function bodies and
|
|
14
|
+
* permissions cannot reach this service at all; read secrets in your service
|
|
15
|
+
* factories and pass the values to the services that need them.
|
|
16
|
+
*
|
|
17
|
+
* @example snippet: shopServices
|
|
18
|
+
*/
|
|
6
19
|
export interface SecretService {
|
|
7
20
|
/**
|
|
8
21
|
* Throws if the secret is not found, unless `defineSecret` declared it
|
|
@@ -10,7 +23,12 @@ export interface SecretService {
|
|
|
10
23
|
* `.reveal()`.
|
|
11
24
|
*/
|
|
12
25
|
getSecret<T = string>(key: string): Promise<SecretValue<T>>;
|
|
13
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* Resolves `false` for a key that is absent or not allowed, rather than
|
|
28
|
+
* throwing. A backend failure (the store is unreachable, access is denied)
|
|
29
|
+
* must throw instead, so callers relying on the check fail closed rather
|
|
30
|
+
* than treating an outage as "no such secret".
|
|
31
|
+
*/
|
|
14
32
|
hasSecret(key: string): Promise<boolean>;
|
|
15
33
|
setSecret(key: string, value: unknown): Promise<void>;
|
|
16
34
|
/**
|