@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
|
@@ -2,6 +2,22 @@ import { getErrorResponse, PikkuError } from '../../errors/error-handler.js';
|
|
|
2
2
|
import { getSingletonServices, getCreateWireServices, pikkuState, } from '../../pikku-state.js';
|
|
3
3
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
|
|
4
4
|
import { PikkuSessionService, createMiddlewareSessionWireProps, } from '../../services/user-session-service.js';
|
|
5
|
+
/**
|
|
6
|
+
* Registers a sessionless function to run on a cron schedule.
|
|
7
|
+
*
|
|
8
|
+
* The task only runs once a scheduler service (or a platform cron trigger
|
|
9
|
+
* calling {@link runScheduledTask}) drives it; wiring alone schedules nothing.
|
|
10
|
+
* The function receives no input, and can call `scheduledTask.skip()` on its
|
|
11
|
+
* wire to end the run early.
|
|
12
|
+
*
|
|
13
|
+
* Registration needs the metadata `pikku` generates for the task. When none is
|
|
14
|
+
* found the wiring is skipped with a warning rather than throwing.
|
|
15
|
+
*
|
|
16
|
+
* @param scheduledTask - The task's unique name, cron `schedule`, function, and optional middleware.
|
|
17
|
+
* @throws {Error} When a task with the same name is already wired.
|
|
18
|
+
*
|
|
19
|
+
* @example snippet: wireScheduler
|
|
20
|
+
*/
|
|
5
21
|
export const wireScheduler = (scheduledTask) => {
|
|
6
22
|
const meta = pikkuState(null, 'scheduler', 'meta');
|
|
7
23
|
const taskMeta = meta[scheduledTask.name];
|
|
@@ -22,6 +38,7 @@ export const wireScheduler = (scheduledTask) => {
|
|
|
22
38
|
}
|
|
23
39
|
tasks.set(scheduledTask.name, scheduledTask);
|
|
24
40
|
};
|
|
41
|
+
/** Thrown by {@link runScheduledTask} when no task, or no generated metadata, exists for the requested name. */
|
|
25
42
|
export class ScheduledTaskNotFoundError extends PikkuError {
|
|
26
43
|
constructor(title) {
|
|
27
44
|
super(`Scheduled task not found: ${title}`);
|
|
@@ -33,6 +50,16 @@ class ScheduledTaskSkippedError extends PikkuError {
|
|
|
33
50
|
this.name = 'ScheduledTaskSkippedError';
|
|
34
51
|
}
|
|
35
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Runs one wired scheduled task now. Scheduler services and platform cron handlers call this on each tick.
|
|
55
|
+
*
|
|
56
|
+
* When `session` is given it is placed on the wire, so the function and its
|
|
57
|
+
* middleware see that user; otherwise the task runs without one.
|
|
58
|
+
*
|
|
59
|
+
* @param params - See {@link RunScheduledTasksParams}. `traceId` defaults to `cron-<name>-<timestamp>`.
|
|
60
|
+
* @throws {ScheduledTaskNotFoundError} When the task or its metadata is missing.
|
|
61
|
+
* @throws The error the function threw, including the one `scheduledTask.skip()` raises, so the caller can tell a skip from a failure.
|
|
62
|
+
*/
|
|
36
63
|
export async function runScheduledTask({ name, session, traceId, }) {
|
|
37
64
|
const singletonServices = getSingletonServices();
|
|
38
65
|
const createWireServices = getCreateWireServices();
|
|
@@ -85,6 +112,7 @@ export async function runScheduledTask({ name, session, traceId, }) {
|
|
|
85
112
|
throw e;
|
|
86
113
|
}
|
|
87
114
|
}
|
|
115
|
+
/** Every wired scheduled task, keyed by name. Scheduler services read this to know what to schedule. */
|
|
88
116
|
export const getScheduledTasks = () => {
|
|
89
117
|
return pikkuState(null, 'scheduler', 'tasks');
|
|
90
118
|
};
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { CoreUserSession, CommonWireMeta } from '../../types/core.types.js';
|
|
2
2
|
import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js';
|
|
3
3
|
import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
4
|
+
/** Generated metadata for every wired scheduled task, keyed by name. */
|
|
4
5
|
export type ScheduledTasksMeta<UserSession extends CoreUserSession = any> = Record<string, CommonWireMeta & {
|
|
5
6
|
name: string;
|
|
6
7
|
schedule: string;
|
|
7
8
|
session?: UserSession;
|
|
8
9
|
}>;
|
|
10
|
+
/** The configuration {@link wireScheduler} takes. An app's generated `wireScheduler` narrows the function and middleware types to its own. */
|
|
9
11
|
export type CoreScheduledTask<PikkuFunctionConfig = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<void, void>>, PikkuMiddleware = CorePikkuMiddleware<any>> = {
|
|
10
12
|
/** Unique across the project. It is how the task is addressed in logs, in `pikku meta`, and by a scheduler service asked to run it now. */
|
|
11
13
|
name: string;
|
|
@@ -18,6 +20,7 @@ export type CoreScheduledTask<PikkuFunctionConfig = CorePikkuFunctionConfig<Core
|
|
|
18
20
|
/** Wraps every execution. There is no request to read from, so this is for tracing, locking and teardown rather than auth. */
|
|
19
21
|
middleware?: PikkuMiddleware[];
|
|
20
22
|
};
|
|
23
|
+
/** The `scheduledTask` part of a scheduled function's wire: which task is running, when, and a `skip` to end the run without treating it as a failure. */
|
|
21
24
|
export interface PikkuScheduledTask {
|
|
22
25
|
name: string;
|
|
23
26
|
schedule: string;
|
|
@@ -25,3 +28,15 @@ export interface PikkuScheduledTask {
|
|
|
25
28
|
/** Never returns — throws to abort the run. */
|
|
26
29
|
skip: (reason?: string) => void;
|
|
27
30
|
}
|
|
31
|
+
export interface ScheduledTaskRun {
|
|
32
|
+
startedAt: Date;
|
|
33
|
+
status: 'completed' | 'failed' | 'skipped';
|
|
34
|
+
durationMs: number;
|
|
35
|
+
error: string | null;
|
|
36
|
+
}
|
|
37
|
+
export interface ScheduledTaskRuns {
|
|
38
|
+
nextRun: Date | null;
|
|
39
|
+
lastRun: ScheduledTaskRun | null;
|
|
40
|
+
/** Newest first. */
|
|
41
|
+
history: ScheduledTaskRun[];
|
|
42
|
+
}
|
|
@@ -16,6 +16,7 @@ export type CoreScopeNode = {
|
|
|
16
16
|
* enforces that at runtime, only the build.
|
|
17
17
|
*/
|
|
18
18
|
export type CoreScopes = Record<string, CoreScopeNode>;
|
|
19
|
+
/** A node of a scope tree as recorded in generated meta. */
|
|
19
20
|
export type ScopeNodeMeta = {
|
|
20
21
|
displayName?: string;
|
|
21
22
|
description?: string;
|
|
@@ -34,6 +35,7 @@ export type ScopeOrigin = {
|
|
|
34
35
|
package: string;
|
|
35
36
|
displayName?: string;
|
|
36
37
|
};
|
|
38
|
+
/** A root scope tree as recorded in generated meta, with where it came from. */
|
|
37
39
|
export type ScopeDefinitionMeta = {
|
|
38
40
|
name: string;
|
|
39
41
|
displayName?: string;
|
|
@@ -42,8 +44,11 @@ export type ScopeDefinitionMeta = {
|
|
|
42
44
|
sourceFile?: string;
|
|
43
45
|
origin?: ScopeOrigin;
|
|
44
46
|
};
|
|
47
|
+
/** Scope trees as the inspector found them. */
|
|
45
48
|
export type ScopeDefinitions = ScopeDefinitionMeta[];
|
|
49
|
+
/** Scope trees collected by the CLI, keyed by root segment. */
|
|
46
50
|
export type ScopeDefinitionsMeta = Record<string, ScopeDefinitionMeta>;
|
|
51
|
+
/** One grantable scope from a flattened scope tree; every node, not just the leaves, appears. */
|
|
47
52
|
export type FlatScope = {
|
|
48
53
|
/** Colon-delimited id, e.g. `admin:invoices:create`. */
|
|
49
54
|
id: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { defineSecret } from './secret.types.js';
|
|
2
|
-
export type { CoreSecret, OAuth2CredentialConfig, SecretDefinitionMeta, SecretDefinitionsMeta, SecretDefinitions, } from './secret.types.js';
|
|
1
|
+
export { defineSecret, SECRET_GENERATE_MIN_SIZE } from './secret.types.js';
|
|
2
|
+
export type { CoreSecret, OAuth2CredentialConfig, SecretGenerate, SecretDefinitionMeta, SecretDefinitionsMeta, SecretDefinitions, } from './secret.types.js';
|
|
3
3
|
export { validateAndBuildSecretDefinitionsMeta } from './validate-secret-definitions.js';
|
|
4
4
|
export { deriveOAuth2AppSecrets } from './derive-oauth2-app-secrets.js';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { defineSecret } from './secret.types.js';
|
|
1
|
+
export { defineSecret, SECRET_GENERATE_MIN_SIZE } from './secret.types.js';
|
|
2
2
|
export { validateAndBuildSecretDefinitionsMeta } from './validate-secret-definitions.js';
|
|
3
3
|
export { deriveOAuth2AppSecrets } from './derive-oauth2-app-secrets.js';
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
export declare const SECRET_GENERATE_MIN_SIZE = 16;
|
|
2
|
+
/** A deployment creates the value: `size` random bytes, hex encoded. */
|
|
3
|
+
export type SecretGenerate = {
|
|
4
|
+
size: number;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* The declaration {@link defineSecret} takes. It describes a secret, never its
|
|
8
|
+
* value: the value lives in the `SecretService` under `secretId`.
|
|
9
|
+
*/
|
|
1
10
|
export type CoreSecret<T = unknown> = {
|
|
2
11
|
/** The key code reads it by: `secrets.getSecret('NAME')`. SCREAMING_SNAKE_CASE. */
|
|
3
12
|
name: string;
|
|
@@ -16,8 +25,16 @@ export type CoreSecret<T = unknown> = {
|
|
|
16
25
|
optional?: boolean;
|
|
17
26
|
/** Where a user goes to obtain this value, surfaced beside a missing one. */
|
|
18
27
|
docsUrl?: string;
|
|
19
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Rotation cadence as a duration string, e.g. `'1d'`, `'30day'`, `'1w'`.
|
|
30
|
+
* With `generate` it is required, and `'never'` opts out of rotation.
|
|
31
|
+
*/
|
|
20
32
|
rotationPeriod?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Makes the deployment create and replace the value. Nobody supplies it, and
|
|
35
|
+
* `setSecret` from a person is rejected. Requires `rotationPeriod`.
|
|
36
|
+
*/
|
|
37
|
+
generate?: SecretGenerate;
|
|
21
38
|
/**
|
|
22
39
|
* Hosts this secret may be sent to, e.g. `['api.notion.com']` or
|
|
23
40
|
* `'*.notion.com'`. Omitted means unrestricted unless
|
|
@@ -25,6 +42,10 @@ export type CoreSecret<T = unknown> = {
|
|
|
25
42
|
*/
|
|
26
43
|
allowedHosts?: string[];
|
|
27
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* The OAuth 2 provider endpoints and scopes for a secret or credential that is
|
|
47
|
+
* obtained by an authorization-code flow rather than pasted in.
|
|
48
|
+
*/
|
|
28
49
|
export type OAuth2CredentialConfig = {
|
|
29
50
|
/** Where access/refresh tokens are stored */
|
|
30
51
|
tokenSecretId: string;
|
|
@@ -41,6 +62,7 @@ export type OAuth2CredentialConfig = {
|
|
|
41
62
|
/** Appended to the authorization URL's query string. */
|
|
42
63
|
additionalParams?: Record<string, string>;
|
|
43
64
|
};
|
|
65
|
+
/** A secret declaration as recorded in generated meta, with the schema replaced by its name. */
|
|
44
66
|
export type SecretDefinitionMeta = {
|
|
45
67
|
name: string;
|
|
46
68
|
displayName: string;
|
|
@@ -51,6 +73,7 @@ export type SecretDefinitionMeta = {
|
|
|
51
73
|
docsUrl?: string;
|
|
52
74
|
oauth2?: OAuth2CredentialConfig;
|
|
53
75
|
rotationPeriod?: string;
|
|
76
|
+
generate?: SecretGenerate;
|
|
54
77
|
/**
|
|
55
78
|
* Hosts this secret may be sent to, e.g. `['api.notion.com']` or
|
|
56
79
|
* `'*.notion.com'`. Omitted means unrestricted unless
|
|
@@ -59,7 +82,9 @@ export type SecretDefinitionMeta = {
|
|
|
59
82
|
allowedHosts?: string[];
|
|
60
83
|
sourceFile?: string;
|
|
61
84
|
};
|
|
85
|
+
/** Secret declarations collected by the CLI, keyed by name. */
|
|
62
86
|
export type SecretDefinitionsMeta = Record<string, SecretDefinitionMeta>;
|
|
87
|
+
/** Secret declarations as the inspector found them, before de-duplication. */
|
|
63
88
|
export type SecretDefinitions = SecretDefinitionMeta[];
|
|
64
89
|
/**
|
|
65
90
|
* Declares a secret this project needs, with the shape of its value. The CLI
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import type { SecretDefinitions, SecretDefinitionsMeta } from './secret.types.js';
|
|
2
2
|
import type { SchemaRefLike } from '../../types/core.types.js';
|
|
3
3
|
export type { SchemaRefLike };
|
|
4
|
+
/**
|
|
5
|
+
* Merges the secret declarations the inspector found into meta keyed by name.
|
|
6
|
+
* Declarations that share a `secretId` must agree on schema and OAuth 2 config.
|
|
7
|
+
*
|
|
8
|
+
* @throws Error when two declarations of one `secretId` disagree, or when a
|
|
9
|
+
* generated secret has no `rotationPeriod`.
|
|
10
|
+
* @internal Called by the CLI when generating meta.
|
|
11
|
+
*/
|
|
4
12
|
export declare function validateAndBuildSecretDefinitionsMeta(definitions: SecretDefinitions, schemaLookup: Map<string, SchemaRefLike>): SecretDefinitionsMeta;
|
|
@@ -1,7 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merges the secret declarations the inspector found into meta keyed by name.
|
|
3
|
+
* Declarations that share a `secretId` must agree on schema and OAuth 2 config.
|
|
4
|
+
*
|
|
5
|
+
* @throws Error when two declarations of one `secretId` disagree, or when a
|
|
6
|
+
* generated secret has no `rotationPeriod`.
|
|
7
|
+
* @internal Called by the CLI when generating meta.
|
|
8
|
+
*/
|
|
1
9
|
export function validateAndBuildSecretDefinitionsMeta(definitions, schemaLookup) {
|
|
2
10
|
const meta = {};
|
|
3
11
|
const secretIdToDefinition = new Map();
|
|
4
12
|
for (const def of definitions) {
|
|
13
|
+
if (def.generate && !def.rotationPeriod) {
|
|
14
|
+
throw new Error(`Secret '${def.secretId}' is generated but has no 'rotationPeriod'.\n` +
|
|
15
|
+
` Declared in: ${def.sourceFile}\n` +
|
|
16
|
+
`Add a rotationPeriod such as '30day', or 'never' to generate it once.`);
|
|
17
|
+
}
|
|
5
18
|
const existingDef = secretIdToDefinition.get(def.secretId);
|
|
6
19
|
if (existingDef) {
|
|
7
20
|
if (def.schema && existingDef.schema) {
|
|
@@ -35,6 +48,7 @@ export function validateAndBuildSecretDefinitionsMeta(definitions, schemaLookup)
|
|
|
35
48
|
optional: def.optional,
|
|
36
49
|
oauth2: def.oauth2,
|
|
37
50
|
rotationPeriod: def.rotationPeriod,
|
|
51
|
+
generate: def.generate,
|
|
38
52
|
allowedHosts: def.allowedHosts,
|
|
39
53
|
docsUrl: def.docsUrl,
|
|
40
54
|
sourceFile: def.sourceFile,
|
|
@@ -53,6 +67,7 @@ export function validateAndBuildSecretDefinitionsMeta(definitions, schemaLookup)
|
|
|
53
67
|
optional: def.optional,
|
|
54
68
|
oauth2: def.oauth2,
|
|
55
69
|
rotationPeriod: def.rotationPeriod,
|
|
70
|
+
generate: def.generate,
|
|
56
71
|
allowedHosts: def.allowedHosts,
|
|
57
72
|
docsUrl: def.docsUrl,
|
|
58
73
|
sourceFile: def.sourceFile,
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PikkuTriggerService } from './pikku-trigger-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* Runs every wired trigger source in this process. `start` sets up each source
|
|
4
|
+
* that has at least one `wireTrigger` listening and logs, rather than throws, a
|
|
5
|
+
* source that fails to start; `stop` tears them all down.
|
|
6
|
+
*
|
|
7
|
+
* Single-process only: a second instance would start every source again.
|
|
8
|
+
*/
|
|
9
|
+
export declare class InMemoryTriggerService extends PikkuTriggerService {
|
|
10
|
+
start(): Promise<void>;
|
|
11
|
+
}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import { PikkuTriggerService } from '
|
|
2
|
-
import { getSingletonServices } from '
|
|
1
|
+
import { PikkuTriggerService } from './pikku-trigger-service.js';
|
|
2
|
+
import { getSingletonServices } from '../../pikku-state.js';
|
|
3
3
|
// knowledge: decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md
|
|
4
|
+
/**
|
|
5
|
+
* Runs every wired trigger source in this process. `start` sets up each source
|
|
6
|
+
* that has at least one `wireTrigger` listening and logs, rather than throws, a
|
|
7
|
+
* source that fails to start; `stop` tears them all down.
|
|
8
|
+
*
|
|
9
|
+
* Single-process only: a second instance would start every source again.
|
|
10
|
+
*/
|
|
4
11
|
export class InMemoryTriggerService extends PikkuTriggerService {
|
|
5
12
|
async start() {
|
|
6
13
|
const singletonServices = getSingletonServices();
|
|
@@ -16,7 +23,7 @@ export class InMemoryTriggerService extends PikkuTriggerService {
|
|
|
16
23
|
continue;
|
|
17
24
|
}
|
|
18
25
|
try {
|
|
19
|
-
const triggerInstance = await this.setupTriggerInstance(name, source.input, (data) => this.onTriggerFire(name, targets, data));
|
|
26
|
+
const triggerInstance = await this.setupTriggerInstance(name, source.input, (data, options) => this.onTriggerFire(name, targets, data, options));
|
|
20
27
|
this.activeTriggers.set(name, triggerInstance);
|
|
21
28
|
singletonServices.logger.info(`Started trigger: ${name}`);
|
|
22
29
|
}
|
|
@@ -4,4 +4,4 @@ export type { OrphanedWebhookRegistration, WebhookRegistration, WebhookRegistrat
|
|
|
4
4
|
export { PIKKU_INCOMING_WEBHOOK_QUEUE_NAME, webhookSecretCredentialName, } from './webhook-source.types.js';
|
|
5
5
|
export type { CoreTriggerWebhookSource, TriggerEvent, WebhookCheckResult, WebhookLifecycleInput, WebhookReceiveResult, WebhookRequest, WebhookSetupResult, WebhookSourceJob, WebhookSourceMeta, WebhookSourceMethod, WebhookSourcesMeta, WebhookSourceState, WebhookTeardownInput, WebhookTeardownResult, WebhookVerify, } from './webhook-source.types.js';
|
|
6
6
|
export { PikkuTriggerService } from './pikku-trigger-service.js';
|
|
7
|
-
export type { TriggerMeta, TriggerSourceMeta, CorePikkuTriggerFunction, CorePikkuTriggerFunctionConfig, CoreTrigger, } from './trigger.types.js';
|
|
7
|
+
export type { TriggerMeta, TriggerSourceMeta, CorePikkuTriggerFunction, CorePikkuTriggerFunctionConfig, CoreTrigger, PikkuTrigger, TriggerInvokeOptions, } from './trigger.types.js';
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
import type { TriggerInstance } from './trigger.types.js';
|
|
1
|
+
import type { TriggerInstance, TriggerInvokeOptions } from './trigger.types.js';
|
|
2
2
|
import type { TriggerService } from '../../services/trigger-service.js';
|
|
3
3
|
export type TriggerTarget = {
|
|
4
4
|
targetType: 'rpc' | 'workflow';
|
|
5
5
|
targetName: string;
|
|
6
6
|
startNode?: string;
|
|
7
7
|
};
|
|
8
|
+
/**
|
|
9
|
+
* Base class for a {@link TriggerService}: pairs registered trigger sources with
|
|
10
|
+
* the triggers listening to them and owns teardown. Subclasses decide where and
|
|
11
|
+
* when sources start by implementing `start`.
|
|
12
|
+
*/
|
|
8
13
|
export declare abstract class PikkuTriggerService implements TriggerService {
|
|
9
14
|
protected activeTriggers: Map<string, TriggerInstance>;
|
|
10
15
|
abstract start(): Promise<void>;
|
|
@@ -13,6 +18,6 @@ export declare abstract class PikkuTriggerService implements TriggerService {
|
|
|
13
18
|
protected getTriggerSources(): Map<string, {
|
|
14
19
|
input?: unknown;
|
|
15
20
|
}>;
|
|
16
|
-
protected setupTriggerInstance(name: string, input: unknown, onTrigger: (data: unknown) => Promise<void>): Promise<TriggerInstance>;
|
|
17
|
-
protected onTriggerFire(triggerName: string, targets: TriggerTarget[], data: unknown): Promise<void>;
|
|
21
|
+
protected setupTriggerInstance(name: string, input: unknown, onTrigger: (data: unknown, options?: TriggerInvokeOptions) => Promise<void>): Promise<TriggerInstance>;
|
|
22
|
+
protected onTriggerFire(triggerName: string, targets: TriggerTarget[], data: unknown, options?: TriggerInvokeOptions): Promise<void>;
|
|
18
23
|
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { rpcService } from '../rpc/rpc-runner.js';
|
|
2
2
|
import { setupTrigger } from './trigger-runner.js';
|
|
3
3
|
import { getSingletonServices, getCreateWireServices, pikkuState, } from '../../pikku-state.js';
|
|
4
|
+
/**
|
|
5
|
+
* Base class for a {@link TriggerService}: pairs registered trigger sources with
|
|
6
|
+
* the triggers listening to them and owns teardown. Subclasses decide where and
|
|
7
|
+
* when sources start by implementing `start`.
|
|
8
|
+
*/
|
|
4
9
|
export class PikkuTriggerService {
|
|
5
10
|
activeTriggers = new Map();
|
|
6
11
|
async stop() {
|
|
@@ -43,12 +48,18 @@ export class PikkuTriggerService {
|
|
|
43
48
|
onTrigger,
|
|
44
49
|
});
|
|
45
50
|
}
|
|
46
|
-
async onTriggerFire(triggerName, targets, data) {
|
|
51
|
+
async onTriggerFire(triggerName, targets, data, options) {
|
|
47
52
|
const singletonServices = getSingletonServices();
|
|
48
53
|
const createWireServices = getCreateWireServices();
|
|
49
|
-
|
|
54
|
+
// The user rides on the wire, where the function runner resolves the
|
|
55
|
+
// target's session and credentials from it and a started workflow records
|
|
56
|
+
// it on the run.
|
|
57
|
+
const wire = options?.pikkuUserId
|
|
58
|
+
? { pikkuUserId: options.pikkuUserId }
|
|
59
|
+
: {};
|
|
60
|
+
const wireServices = await createWireServices?.(singletonServices, wire);
|
|
50
61
|
const services = { ...singletonServices, ...wireServices };
|
|
51
|
-
const rpc = rpcService.getContextRPCService(services,
|
|
62
|
+
const rpc = rpcService.getContextRPCService(services, wire, false);
|
|
52
63
|
for (const target of targets) {
|
|
53
64
|
try {
|
|
54
65
|
if (target.targetType === 'workflow') {
|
|
@@ -1,10 +1,35 @@
|
|
|
1
|
-
import type { CoreTrigger, CoreTriggerSource, TriggerInstance } from './trigger.types.js';
|
|
1
|
+
import type { CoreTrigger, CoreTriggerSource, TriggerInstance, TriggerInvokeOptions } from './trigger.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Registers a trigger: the function that runs each time a trigger source of the
|
|
4
|
+
* same `name` fires. The source is wired separately with
|
|
5
|
+
* {@link wireTriggerSource} (or {@link wireTriggerWebhookSource}).
|
|
6
|
+
*
|
|
7
|
+
* Skipped with a warning when `pikku all` generated no metadata for it, which
|
|
8
|
+
* usually means the wiring shares a file with the function it wires.
|
|
9
|
+
*
|
|
10
|
+
* @param trigger - The trigger's name and the function it runs.
|
|
11
|
+
*
|
|
12
|
+
* @example snippet: wireTrigger
|
|
13
|
+
*/
|
|
2
14
|
export declare const wireTrigger: (trigger: CoreTrigger) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Registers a trigger source: a long-lived function that subscribes to something
|
|
17
|
+
* outside the app and calls `wire.trigger.invoke(data)` whenever it fires, and
|
|
18
|
+
* returns its teardown. Its `name` must match a {@link wireTrigger}.
|
|
19
|
+
*
|
|
20
|
+
* The source and the triggers it fires run with no user session, so whatever
|
|
21
|
+
* the source pushes reaches them as untrusted input.
|
|
22
|
+
*
|
|
23
|
+
* @param source - The source's name, the function that sets it up, and its input.
|
|
24
|
+
* @throws Error when a source with the same name is already registered.
|
|
25
|
+
*
|
|
26
|
+
* @example snippet: wireTriggerSource
|
|
27
|
+
*/
|
|
3
28
|
export declare const wireTriggerSource: <TInput = unknown, TOutput = unknown>(source: CoreTriggerSource<TInput, TOutput>) => void;
|
|
4
29
|
export type SetupTriggerParams<TInput = unknown, TOutput = unknown> = {
|
|
5
30
|
name: string;
|
|
6
31
|
input?: TInput;
|
|
7
|
-
onTrigger: (data: TOutput) => void | Promise<void>;
|
|
32
|
+
onTrigger: (data: TOutput, options?: TriggerInvokeOptions) => void | Promise<void>;
|
|
8
33
|
};
|
|
9
34
|
export declare function setupTrigger<TInput = unknown, TOutput = unknown>({ name, input, onTrigger, }: SetupTriggerParams<TInput, TOutput>): Promise<TriggerInstance>;
|
|
10
35
|
export declare const getRegisteredTriggers: () => Map<string, CoreTrigger<any>>;
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { pikkuState, getSingletonServices, getCreateWireServices, } from '../../pikku-state.js';
|
|
2
2
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
|
|
3
3
|
import { PikkuMissingMetaError } from '../../errors/errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Registers a trigger: the function that runs each time a trigger source of the
|
|
6
|
+
* same `name` fires. The source is wired separately with
|
|
7
|
+
* {@link wireTriggerSource} (or {@link wireTriggerWebhookSource}).
|
|
8
|
+
*
|
|
9
|
+
* Skipped with a warning when `pikku all` generated no metadata for it, which
|
|
10
|
+
* usually means the wiring shares a file with the function it wires.
|
|
11
|
+
*
|
|
12
|
+
* @param trigger - The trigger's name and the function it runs.
|
|
13
|
+
*
|
|
14
|
+
* @example snippet: wireTrigger
|
|
15
|
+
*/
|
|
4
16
|
export const wireTrigger = (trigger) => {
|
|
5
17
|
const meta = pikkuState(null, 'trigger', 'meta');
|
|
6
18
|
const triggerMeta = meta[trigger.name];
|
|
@@ -13,6 +25,19 @@ export const wireTrigger = (trigger) => {
|
|
|
13
25
|
triggers.set(trigger.name, trigger);
|
|
14
26
|
};
|
|
15
27
|
// knowledge: decisions/internals/trigger-declaration-is-split-from-trigger-source.md
|
|
28
|
+
/**
|
|
29
|
+
* Registers a trigger source: a long-lived function that subscribes to something
|
|
30
|
+
* outside the app and calls `wire.trigger.invoke(data)` whenever it fires, and
|
|
31
|
+
* returns its teardown. Its `name` must match a {@link wireTrigger}.
|
|
32
|
+
*
|
|
33
|
+
* The source and the triggers it fires run with no user session, so whatever
|
|
34
|
+
* the source pushes reaches them as untrusted input.
|
|
35
|
+
*
|
|
36
|
+
* @param source - The source's name, the function that sets it up, and its input.
|
|
37
|
+
* @throws Error when a source with the same name is already registered.
|
|
38
|
+
*
|
|
39
|
+
* @example snippet: wireTriggerSource
|
|
40
|
+
*/
|
|
16
41
|
export const wireTriggerSource = (source) => {
|
|
17
42
|
const sourceMeta = pikkuState(null, 'trigger', 'sourceMeta');
|
|
18
43
|
const triggerSourceMeta = sourceMeta[source.name];
|
|
@@ -41,11 +66,19 @@ export async function setupTrigger({ name, input, onTrigger, }) {
|
|
|
41
66
|
}
|
|
42
67
|
const wire = {
|
|
43
68
|
trigger: {
|
|
44
|
-
invoke: (data) => {
|
|
69
|
+
invoke: (data, options) => {
|
|
70
|
+
const pikkuUserId = options?.pikkuUserId;
|
|
71
|
+
if (pikkuUserId !== undefined &&
|
|
72
|
+
(typeof pikkuUserId !== 'string' || pikkuUserId === '')) {
|
|
73
|
+
// Running it as nobody would hide the source's bug, and as anyone
|
|
74
|
+
// else is not possible: the event is dropped.
|
|
75
|
+
singletonServices.logger.error(`Trigger '${name}' fired with an invalid pikkuUserId; dropping the event`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
45
78
|
singletonServices.logger.info(`Trigger fired: ${name}`);
|
|
46
79
|
// `invoke` is typed void for trigger sources, so a rejection from the
|
|
47
80
|
// trigger function is logged here rather than left unhandled.
|
|
48
|
-
Promise.resolve(onTrigger(data)).catch((e) => singletonServices.logger.error(`Trigger '${name}' handler failed: ${e?.message ?? e}`));
|
|
81
|
+
Promise.resolve(onTrigger(data, pikkuUserId ? { pikkuUserId } : undefined)).catch((e) => singletonServices.logger.error(`Trigger '${name}' handler failed: ${e?.message ?? e}`));
|
|
49
82
|
},
|
|
50
83
|
},
|
|
51
84
|
};
|
|
@@ -1,22 +1,43 @@
|
|
|
1
1
|
import type { CommonWireMeta, CoreSingletonServices } from '../../types/core.types.js';
|
|
2
2
|
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
3
3
|
import type { CoreNodeConfig } from '../node/node.types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Facts about a trigger event that its source asserts, kept apart from the
|
|
6
|
+
* event data so that nothing in a payload the source received can set them.
|
|
7
|
+
*/
|
|
8
|
+
export interface TriggerInvokeOptions {
|
|
9
|
+
/**
|
|
10
|
+
* The user the event belongs to. The target runs as this user — its
|
|
11
|
+
* credentials and stored session resolve for them — exactly as a queue job
|
|
12
|
+
* or workflow run carrying a `pikkuUserId` does. Pass only a user the source
|
|
13
|
+
* has established itself, such as the one whose credential it polled with;
|
|
14
|
+
* never one read out of the event.
|
|
15
|
+
*/
|
|
16
|
+
pikkuUserId?: string;
|
|
17
|
+
}
|
|
4
18
|
export interface PikkuTrigger<TOutput = unknown> {
|
|
5
|
-
invoke: (data: TOutput) => void;
|
|
19
|
+
invoke: (data: TOutput, options?: TriggerInvokeOptions) => void;
|
|
6
20
|
}
|
|
21
|
+
/** Generated metadata for every wired trigger, keyed by name. */
|
|
7
22
|
export type TriggerMeta = Record<string, CommonWireMeta & {
|
|
8
23
|
name: string;
|
|
9
24
|
}>;
|
|
25
|
+
/** Generated metadata for every wired trigger source, keyed by name. */
|
|
10
26
|
export type TriggerSourceMeta = Record<string, {
|
|
11
27
|
name: string;
|
|
12
28
|
pikkuFuncId: string;
|
|
13
29
|
packageName?: string;
|
|
14
30
|
}>;
|
|
31
|
+
/**
|
|
32
|
+
* A trigger source's body: subscribes using `input`, calls `wire.trigger.invoke`
|
|
33
|
+
* each time the event happens, and resolves to the function that unsubscribes.
|
|
34
|
+
*/
|
|
15
35
|
export type CorePikkuTriggerFunction<TInput = unknown, TOutput = unknown, Services extends CoreSingletonServices = CoreSingletonServices> = (services: Services, input: TInput, wire: {
|
|
16
|
-
trigger:
|
|
17
|
-
invoke: (data: TOutput) => void;
|
|
18
|
-
};
|
|
36
|
+
trigger: PikkuTrigger<TOutput>;
|
|
19
37
|
}) => Promise<() => void | Promise<void>>;
|
|
38
|
+
/**
|
|
39
|
+
* A trigger source function with its schemas and descriptive metadata, as `pikkuTriggerFunc` returns it.
|
|
40
|
+
*/
|
|
20
41
|
export type CorePikkuTriggerFunctionConfig<TInput = unknown, TOutput = unknown, Services extends CoreSingletonServices = CoreSingletonServices, InputSchema extends StandardSchemaV1 | undefined = undefined, OutputSchema extends StandardSchemaV1 | undefined = undefined> = {
|
|
21
42
|
title?: string;
|
|
22
43
|
description?: string;
|
|
@@ -27,6 +48,7 @@ export type CorePikkuTriggerFunctionConfig<TInput = unknown, TOutput = unknown,
|
|
|
27
48
|
node?: CoreNodeConfig;
|
|
28
49
|
};
|
|
29
50
|
export declare const pikkuTriggerFunc: <TInput = unknown, TOutput = unknown, Services extends CoreSingletonServices = CoreSingletonServices, InputSchema extends StandardSchemaV1 | undefined = undefined, OutputSchema extends StandardSchemaV1 | undefined = undefined>(triggerOrConfig: CorePikkuTriggerFunction<TInput, TOutput, Services> | CorePikkuTriggerFunctionConfig<TInput, TOutput, Services, InputSchema, OutputSchema>) => CorePikkuTriggerFunctionConfig<TInput, TOutput, Services, InputSchema, OutputSchema>;
|
|
51
|
+
/** What `wireTrigger` takes: the name a trigger source fires and the function run each time. */
|
|
30
52
|
export interface CoreTrigger<PikkuFunctionConfig = any> {
|
|
31
53
|
/** What a `wireTriggerSource` points at to fire this trigger. It is the contract between the two, so both must spell it the same. */
|
|
32
54
|
name: string;
|
|
@@ -3,6 +3,25 @@ import type { CoreSingletonServices } from '../../types/core.types.js';
|
|
|
3
3
|
import type { PikkuHTTP } from '../http/http.types.js';
|
|
4
4
|
import type { DeclaredTriggerSource } from '../../services/trigger-source-store.js';
|
|
5
5
|
import type { CoreTriggerWebhookSource, WebhookCheckResult, WebhookSetupResult, WebhookSourceJob, WebhookSourceState, WebhookTeardownResult } from './webhook-source.types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Registers a webhook trigger source: Pikku mounts its route (by default
|
|
8
|
+
* `POST /webhooks/<name>`), runs `receive` to turn each request into events,
|
|
9
|
+
* validates each event against `events`, and queues it on
|
|
10
|
+
* `pikku-incoming-webhooks` for the trigger named `<name>:<event>`. The sender
|
|
11
|
+
* is answered at once; a failing trigger is retried by the queue.
|
|
12
|
+
*
|
|
13
|
+
* With `verify`, a request with a body is refused with 401 unless it is signed
|
|
14
|
+
* with the secret in the source's credential; an unsigned body-less request
|
|
15
|
+
* (a HEAD probe, a validation handshake) may be answered but its events are
|
|
16
|
+
* refused. Without `verify`, `receive` is responsible for authenticating.
|
|
17
|
+
*
|
|
18
|
+
* Skipped with a warning when no metadata was generated for it.
|
|
19
|
+
*
|
|
20
|
+
* @param source - The source's name, events, verification and lifecycle steps.
|
|
21
|
+
* @throws Error when a webhook source with the same name is already registered.
|
|
22
|
+
*
|
|
23
|
+
* @example snippet: wireTriggerWebhookSource
|
|
24
|
+
*/
|
|
6
25
|
export declare const wireTriggerWebhookSource: <Events extends Record<string, StandardSchemaV1>>(source: CoreTriggerWebhookSource<Events>) => void;
|
|
7
26
|
/** The declared events some trigger is wired to: what `setup` registers with the provider. */
|
|
8
27
|
export declare const subscribedWebhookEvents: (source: string) => string[];
|
|
@@ -19,6 +38,7 @@ export declare const receiveWebhookSourceRequest: (sourceName: string, wire: {
|
|
|
19
38
|
} | void>;
|
|
20
39
|
/** The `pikku-incoming-webhooks` worker: runs the trigger an event was queued for. Throws so the queue retries. */
|
|
21
40
|
export declare const dispatchWebhookSourceJob: (job: WebhookSourceJob) => Promise<void>;
|
|
41
|
+
/** What one lifecycle pass (`check`, `setup` or `teardown`) did for one webhook source. */
|
|
22
42
|
export type WebhookSourceOutcome = {
|
|
23
43
|
source: string;
|
|
24
44
|
url: string;
|
|
@@ -77,7 +97,11 @@ export type WebhookRegistration = {
|
|
|
77
97
|
/** The signing secrets `setup` stored, so a wiped credential store can be refilled without registering again. */
|
|
78
98
|
credentials?: Record<string, unknown>;
|
|
79
99
|
};
|
|
100
|
+
/** Every source's {@link WebhookRegistration}, keyed by source name. */
|
|
80
101
|
export type WebhookRegistrations = Record<string, WebhookRegistration>;
|
|
102
|
+
/**
|
|
103
|
+
* A registration kept for a source that is no longer declared, which nothing will tear down automatically.
|
|
104
|
+
*/
|
|
81
105
|
export type OrphanedWebhookRegistration = {
|
|
82
106
|
source: string;
|
|
83
107
|
url: string;
|
|
@@ -5,6 +5,25 @@ import { PikkuMissingMetaError, UnauthorizedError, } from '../../errors/errors.j
|
|
|
5
5
|
import { timingSafeStringEqual, verifyHmacSignature, verifyPublicKeySignature, } from '../../utils/hmac.js';
|
|
6
6
|
import { webhookSecretCredentialName } from './webhook-source.types.js';
|
|
7
7
|
const LIFECYCLE = ['receive', 'check', 'setup', 'teardown'];
|
|
8
|
+
/**
|
|
9
|
+
* Registers a webhook trigger source: Pikku mounts its route (by default
|
|
10
|
+
* `POST /webhooks/<name>`), runs `receive` to turn each request into events,
|
|
11
|
+
* validates each event against `events`, and queues it on
|
|
12
|
+
* `pikku-incoming-webhooks` for the trigger named `<name>:<event>`. The sender
|
|
13
|
+
* is answered at once; a failing trigger is retried by the queue.
|
|
14
|
+
*
|
|
15
|
+
* With `verify`, a request with a body is refused with 401 unless it is signed
|
|
16
|
+
* with the secret in the source's credential; an unsigned body-less request
|
|
17
|
+
* (a HEAD probe, a validation handshake) may be answered but its events are
|
|
18
|
+
* refused. Without `verify`, `receive` is responsible for authenticating.
|
|
19
|
+
*
|
|
20
|
+
* Skipped with a warning when no metadata was generated for it.
|
|
21
|
+
*
|
|
22
|
+
* @param source - The source's name, events, verification and lifecycle steps.
|
|
23
|
+
* @throws Error when a webhook source with the same name is already registered.
|
|
24
|
+
*
|
|
25
|
+
* @example snippet: wireTriggerWebhookSource
|
|
26
|
+
*/
|
|
8
27
|
export const wireTriggerWebhookSource = (source) => {
|
|
9
28
|
const meta = pikkuState(null, 'trigger', 'webhookSourceMeta')[source.name];
|
|
10
29
|
if (!meta) {
|