@pikku/core 0.12.143 → 0.12.145
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/analytics.d.ts +14 -0
- package/dist/analytics/analytics.js +14 -0
- package/dist/analytics/analytics.types.d.ts +1 -0
- package/dist/analytics/anonymous-analytics-identity.d.ts +1 -0
- package/dist/analytics/cookie-analytics-identity.d.ts +1 -0
- package/dist/analytics/mint-cookie.d.ts +1 -0
- package/dist/{wirings/channel/channel-middleware-runner.d.ts → channel-middleware-runner.d.ts} +17 -3
- package/dist/{wirings/channel/channel-middleware-runner.js → channel-middleware-runner.js} +24 -8
- package/dist/classification/data-classification.d.ts +13 -0
- package/dist/classification/secret-value.d.ts +7 -0
- package/dist/classification/secret-value.js +7 -0
- package/dist/crypto-utils.d.ts +93 -0
- package/dist/crypto-utils.js +92 -0
- package/dist/dev/hot-reload.d.ts +16 -0
- package/dist/dev/hot-reload.js +16 -1
- package/dist/dev/module-runner.js +7 -3
- package/dist/dev/reload-meta.js +1 -1
- package/dist/errors/error-handler.d.ts +9 -0
- package/dist/errors/error-handler.js +8 -0
- package/dist/errors/errors.d.ts +219 -0
- package/dist/errors/errors.js +227 -0
- package/dist/errors/serialized-error.d.ts +4 -0
- package/dist/function/abort-scope.d.ts +5 -0
- package/dist/function/function-meta.types.d.ts +20 -0
- package/dist/function/function-runner.d.ts +41 -0
- package/dist/function/function-runner.js +57 -11
- package/dist/function/functions.types.d.ts +59 -0
- package/dist/function/functions.types.js +23 -0
- package/dist/function/list.types.d.ts +4 -0
- package/dist/lifecycle.d.ts +12 -1
- package/dist/lifecycle.js +12 -1
- package/dist/middleware/addon-scope-cap.d.ts +4 -0
- package/dist/middleware/addon-scope-cap.js +7 -3
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.js +5 -13
- package/dist/middleware/auth-cookie.js +3 -3
- package/dist/middleware/middleware-factories.d.ts +17 -0
- package/dist/middleware/middleware-factories.js +17 -0
- package/dist/middleware/middleware.types.d.ts +23 -0
- package/dist/middleware/remote-auth.d.ts +15 -0
- package/dist/middleware/remote-auth.js +18 -3
- package/dist/middleware/remote-jobs-secret.js +2 -10
- package/dist/middleware-runner.d.ts +7 -0
- package/dist/middleware-runner.js +23 -7
- package/dist/permissions.d.ts +13 -0
- package/dist/permissions.js +13 -0
- package/dist/pikku-state.d.ts +49 -0
- package/dist/pikku-state.js +49 -0
- package/dist/remote.js +20 -5
- package/dist/schema.d.ts +36 -0
- package/dist/schema.js +36 -0
- package/dist/services/agent-run-state-service.d.ts +8 -0
- package/dist/services/agent-runner-service.d.ts +24 -0
- package/dist/services/agent-storage-service.d.ts +8 -0
- package/dist/services/ai-embedding-service.d.ts +4 -0
- package/dist/services/audit-service.d.ts +48 -0
- package/dist/services/audit-service.js +22 -0
- package/dist/services/content-service.d.ts +34 -0
- package/dist/services/credential-wire-service.d.ts +9 -0
- package/dist/services/credential-wire-service.js +9 -0
- package/dist/services/deployment-service.d.ts +14 -0
- package/dist/services/email-service.d.ts +20 -0
- package/dist/services/email-template.d.ts +24 -0
- package/dist/services/email-template.js +12 -0
- package/dist/services/file-scenario-run-store.d.ts +5 -0
- package/dist/services/file-scenario-run-store.js +4 -0
- package/dist/services/gateway-service.d.ts +5 -0
- package/dist/services/in-memory-agent-run-state-service.d.ts +5 -0
- package/dist/services/in-memory-agent-run-state-service.js +5 -0
- package/dist/services/in-memory-lease-service.d.ts +5 -0
- package/dist/services/in-memory-lease-service.js +5 -0
- package/dist/services/in-memory-session-store.d.ts +4 -0
- package/dist/services/in-memory-session-store.js +4 -0
- package/dist/services/incoming-webhook-queue.d.ts +2 -0
- package/dist/services/incoming-webhook-queue.js +2 -0
- package/dist/services/incoming-webhook-service.d.ts +9 -1
- package/dist/services/incoming-webhook-service.js +1 -1
- package/dist/services/index.d.ts +1 -5
- package/dist/services/index.js +1 -5
- package/dist/services/jwt-service.d.ts +8 -0
- package/dist/services/lease-service.d.ts +5 -0
- package/dist/services/lease-service.js +1 -0
- package/dist/services/local-content-request-handler.d.ts +20 -0
- package/dist/services/local-content-request-handler.js +11 -0
- package/dist/services/local-content.d.ts +45 -0
- package/dist/services/local-content.js +35 -0
- package/dist/services/local-credential-service.d.ts +5 -0
- package/dist/services/local-credential-service.js +5 -0
- package/dist/services/local-email-service.d.ts +7 -0
- package/dist/services/local-email-service.js +7 -0
- package/dist/services/local-secrets.d.ts +8 -0
- package/dist/services/local-secrets.js +8 -0
- package/dist/services/local-variables.d.ts +6 -0
- package/dist/services/local-variables.js +6 -0
- package/dist/services/logger.d.ts +4 -0
- package/dist/services/logger.js +4 -0
- package/dist/services/meta-service.d.ts +38 -0
- package/dist/services/meta-service.js +6 -0
- package/dist/services/queue-webhook-service.d.ts +19 -0
- package/dist/services/queue-webhook-service.js +19 -0
- package/dist/services/remote-jobs.d.ts +8 -13
- package/dist/services/remote-jobs.js +3 -54
- package/dist/services/scenario-cookie-jar.d.ts +4 -0
- package/dist/services/scheduler-service.d.ts +13 -0
- package/dist/services/scheduler-service.js +8 -0
- package/dist/services/schema-service.d.ts +9 -0
- package/dist/services/scope-service.d.ts +10 -0
- package/dist/services/scoped-secret-service.d.ts +5 -0
- package/dist/services/scoped-secret-service.js +5 -0
- package/dist/services/secret-host-binding.d.ts +5 -0
- package/dist/services/secret-host-binding.js +5 -0
- package/dist/services/secret-service.d.ts +19 -1
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +6 -0
- package/dist/services/session-store.d.ts +5 -0
- package/dist/services/stub-tracker.d.ts +1 -0
- package/dist/services/temporary-file-service.d.ts +9 -0
- package/dist/services/temporary-file-service.js +9 -0
- package/dist/services/trigger-service.d.ts +4 -0
- package/dist/services/trigger-source-store.d.ts +13 -0
- package/dist/services/trigger-source-store.js +7 -0
- package/dist/services/typed-credential-service.d.ts +6 -0
- package/dist/services/typed-credential-service.js +5 -0
- package/dist/services/typed-secret-service.d.ts +12 -0
- package/dist/services/typed-secret-service.js +11 -0
- package/dist/services/typed-variables-service.d.ts +1 -0
- package/dist/services/user-session-service.d.ts +31 -1
- package/dist/services/user-session-service.js +29 -3
- package/dist/services/v8-coverage-service.d.ts +27 -0
- package/dist/services/v8-coverage-service.js +5 -0
- package/dist/services/variables-service.d.ts +8 -0
- package/dist/services/virtual-user-sign-in.d.ts +1 -0
- package/dist/services/virtual-user-statement.d.ts +8 -0
- package/dist/services/virtual-user-statement.js +4 -0
- package/dist/services/webhook-service.d.ts +25 -0
- package/dist/services/webhook-service.js +15 -0
- package/dist/services/workflow-service.d.ts +6 -0
- package/dist/test-utils.js +1 -1
- package/dist/testing/service-tests.d.ts +4 -0
- package/dist/time-utils.d.ts +15 -0
- package/dist/time-utils.js +14 -0
- package/dist/types/core.types.d.ts +80 -0
- package/dist/types/state.types.d.ts +4 -0
- package/dist/utils/hmac.d.ts +3 -0
- package/dist/utils/safe-fetch.d.ts +14 -0
- package/dist/utils/safe-fetch.js +13 -0
- package/dist/utils/stable-stringify.d.ts +11 -0
- package/dist/utils/stable-stringify.js +33 -0
- package/dist/utils.d.ts +28 -0
- package/dist/utils.js +22 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.js +7 -0
- package/dist/wirings/addon/define-screens.d.ts +2 -0
- package/dist/wirings/addon/remote-addon-auth.d.ts +9 -0
- package/dist/wirings/addon/remote-addon-auth.js +5 -0
- package/dist/wirings/addon/wire-addon.d.ts +4 -0
- package/dist/wirings/addon/wire-remote-addon.d.ts +1 -0
- package/dist/wirings/agent/agent-agui.d.ts +14 -5
- package/dist/wirings/agent/agent-agui.js +17 -6
- package/dist/wirings/agent/agent-helpers.d.ts +61 -1
- package/dist/wirings/agent/agent-helpers.js +62 -2
- package/dist/wirings/agent/agent-interrupt.d.ts +5 -0
- package/dist/wirings/agent/agent-output.d.ts +20 -0
- package/dist/wirings/agent/agent-output.js +69 -0
- package/dist/wirings/agent/agent-prepare.d.ts +41 -0
- package/dist/wirings/agent/agent-prepare.js +38 -2
- package/dist/wirings/agent/agent-registry.d.ts +8 -0
- package/dist/wirings/agent/agent-registry.js +10 -4
- package/dist/wirings/agent/agent-runner.d.ts +33 -0
- package/dist/wirings/agent/agent-runner.js +40 -7
- package/dist/wirings/agent/agent-stream.d.ts +30 -0
- package/dist/wirings/agent/agent-stream.js +33 -11
- package/dist/wirings/agent/agent.types.d.ts +43 -0
- package/dist/wirings/agent/voice-input.d.ts +12 -0
- package/dist/wirings/agent/voice-input.js +12 -0
- package/dist/wirings/agent/voice-output.d.ts +14 -0
- package/dist/wirings/agent/voice-output.js +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-judge.js +1 -2
- package/dist/wirings/agent-scorer/agent-scorer-registry.d.ts +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-registry.js +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.d.ts +1 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.js +1 -0
- package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +7 -0
- package/dist/wirings/channel/channel-common.js +1 -1
- package/dist/wirings/channel/channel-rpc.types.d.ts +5 -0
- package/dist/wirings/channel/channel-runner.d.ts +22 -0
- package/dist/wirings/channel/channel-runner.js +22 -0
- package/dist/wirings/channel/channel-store.d.ts +8 -0
- package/dist/wirings/channel/channel-store.js +7 -0
- package/dist/wirings/channel/channel.types.d.ts +18 -0
- package/dist/wirings/channel/define-channel-routes.d.ts +5 -0
- package/dist/wirings/channel/define-channel-routes.js +5 -0
- package/dist/wirings/channel/eventhub-service.d.ts +9 -0
- package/dist/wirings/channel/eventhub-store.d.ts +1 -0
- package/dist/wirings/channel/eventhub-store.js +1 -0
- package/dist/wirings/channel/index.d.ts +1 -1
- package/dist/wirings/channel/index.js +1 -1
- package/dist/wirings/channel/local/local-channel-handler.d.ts +1 -0
- package/dist/wirings/channel/local/local-channel-handler.js +1 -0
- package/dist/wirings/channel/local/local-channel-runner.d.ts +13 -0
- package/dist/wirings/channel/local/local-channel-runner.js +13 -0
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +1 -0
- package/dist/wirings/channel/local/local-eventhub-service.js +1 -0
- package/dist/wirings/channel/log-channels.d.ts +1 -0
- package/dist/wirings/channel/log-channels.js +1 -0
- package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +5 -0
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +5 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +32 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +31 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +8 -0
- package/dist/wirings/cli/channel/cli-channel-runner.js +8 -0
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +1 -0
- package/dist/wirings/cli/cli-runner.d.ts +43 -0
- package/dist/wirings/cli/cli-runner.js +43 -0
- package/dist/wirings/cli/cli.types.d.ts +4 -0
- package/dist/wirings/cli/command-parser.d.ts +13 -0
- package/dist/wirings/cli/command-parser.js +16 -0
- package/dist/wirings/credential/credential-overrides.d.ts +1 -0
- package/dist/wirings/credential/credential.types.d.ts +7 -0
- package/dist/wirings/credential/validate-credential-definitions.d.ts +7 -0
- package/dist/wirings/credential/validate-credential-definitions.js +7 -0
- package/dist/wirings/flag/cached-flag-source.d.ts +1 -0
- package/dist/wirings/flag/flag.types.d.ts +3 -0
- package/dist/wirings/gateway/gateway-runner.d.ts +23 -0
- package/dist/wirings/gateway/gateway-runner.js +23 -0
- package/dist/wirings/gateway/gateway.types.d.ts +3 -0
- package/dist/wirings/gateway/local-gateway-service.d.ts +10 -0
- package/dist/{services → wirings/gateway}/local-gateway-service.js +6 -2
- package/dist/wirings/http/http-routes.d.ts +21 -0
- package/dist/wirings/http/http-routes.js +11 -0
- package/dist/wirings/http/http-runner.d.ts +71 -0
- package/dist/wirings/http/http-runner.js +73 -5
- package/dist/wirings/http/http.types.d.ts +27 -0
- package/dist/wirings/http/index.d.ts +1 -0
- package/dist/wirings/http/index.js +1 -0
- package/dist/wirings/http/log-http-routes.d.ts +1 -0
- package/dist/wirings/http/log-http-routes.js +1 -0
- package/dist/wirings/http/merge-request-data.d.ts +12 -0
- package/dist/wirings/http/merge-request-data.js +42 -0
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.js +3 -32
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-response.js +1 -0
- package/dist/wirings/http/routers/http-router.d.ts +6 -0
- package/dist/wirings/http/routers/http-router.js +6 -0
- package/dist/wirings/http/web-request.d.ts +17 -0
- package/dist/wirings/http/web-request.js +17 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +7 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.js +7 -0
- package/dist/wirings/mcp/mcp-runner.d.ts +63 -0
- package/dist/wirings/mcp/mcp-runner.js +62 -0
- package/dist/wirings/mcp/mcp.types.d.ts +12 -0
- package/dist/wirings/node/node.types.d.ts +4 -0
- package/dist/wirings/oauth2/oauth2.types.d.ts +2 -0
- package/dist/{services → wirings/queue}/in-memory-queue-service.d.ts +9 -1
- package/dist/{services → wirings/queue}/in-memory-queue-service.js +9 -1
- package/dist/wirings/queue/index.d.ts +1 -0
- package/dist/wirings/queue/index.js +1 -0
- package/dist/wirings/queue/queue-identity.js +2 -14
- package/dist/wirings/queue/queue-runner.d.ts +37 -0
- package/dist/wirings/queue/queue-runner.js +37 -0
- package/dist/wirings/queue/queue.types.d.ts +35 -0
- package/dist/wirings/queue/register-queue-helper.d.ts +12 -0
- package/dist/wirings/queue/register-queue-helper.js +11 -0
- package/dist/wirings/queue/remote-queue-job.d.ts +11 -0
- package/dist/wirings/queue/remote-queue-job.js +41 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +1 -0
- package/dist/wirings/role/role.types.d.ts +3 -0
- package/dist/wirings/rpc/rpc-runner.d.ts +24 -0
- package/dist/wirings/rpc/rpc-runner.js +37 -2
- package/dist/wirings/rpc/rpc-types.d.ts +2 -0
- package/dist/wirings/scheduler/index.d.ts +1 -0
- package/dist/wirings/scheduler/index.js +1 -0
- package/dist/wirings/scheduler/log-schedulers.d.ts +1 -0
- package/dist/wirings/scheduler/log-schedulers.js +1 -0
- package/dist/wirings/scheduler/remote-scheduled-job.d.ts +11 -0
- package/dist/wirings/scheduler/remote-scheduled-job.js +20 -0
- package/dist/wirings/scheduler/scheduler-runner.d.ts +29 -0
- package/dist/wirings/scheduler/scheduler-runner.js +28 -0
- package/dist/wirings/scheduler/scheduler.types.d.ts +3 -0
- package/dist/wirings/scope/scope.types.d.ts +5 -0
- package/dist/wirings/secret/index.d.ts +2 -2
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +26 -1
- package/dist/wirings/secret/secret.types.js +1 -0
- package/dist/wirings/secret/validate-secret-definitions.d.ts +8 -0
- package/dist/wirings/secret/validate-secret-definitions.js +15 -0
- package/dist/wirings/trigger/in-memory-trigger-service.d.ts +11 -0
- package/dist/{services → wirings/trigger}/in-memory-trigger-service.js +10 -3
- package/dist/wirings/trigger/index.d.ts +1 -1
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +8 -3
- package/dist/wirings/trigger/pikku-trigger-service.js +14 -3
- package/dist/wirings/trigger/trigger-runner.d.ts +27 -2
- package/dist/wirings/trigger/trigger-runner.js +35 -2
- package/dist/wirings/trigger/trigger.types.d.ts +26 -4
- package/dist/wirings/trigger/webhook-source-runner.d.ts +24 -0
- package/dist/wirings/trigger/webhook-source-runner.js +19 -0
- package/dist/wirings/trigger/webhook-source.types.d.ts +12 -2
- package/dist/wirings/trigger/webhook-source.types.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +7 -0
- package/dist/wirings/variable/validate-variable-definitions.js +7 -0
- package/dist/wirings/variable/variable.types.d.ts +7 -0
- package/dist/wirings/virtual-user/conversation/conversation.types.d.ts +5 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.d.ts +6 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.js +1 -1
- package/dist/{services → wirings/virtual-user}/http-virtual-users.d.ts +4 -3
- package/dist/{services → wirings/virtual-user}/http-virtual-users.js +6 -6
- package/dist/wirings/virtual-user/index.d.ts +1 -1
- package/dist/wirings/virtual-user/index.js +1 -1
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +2 -1
- package/dist/wirings/virtual-user/run-virtual-user.js +1 -14
- package/dist/wirings/virtual-user/virtual-user-declaration.types.d.ts +4 -0
- package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +10 -1
- package/dist/wirings/virtual-user/virtual-user-scaffold.js +5 -0
- package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +5 -0
- package/dist/wirings/virtual-user/virtual-user-schedule.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +1 -0
- package/dist/wirings/webhook/define-outgoing-webhook.d.ts +20 -0
- package/dist/wirings/webhook/define-outgoing-webhook.js +9 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +8 -4
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +7 -0
- package/dist/wirings/workflow/dsl/workflow-runner.js +7 -0
- package/dist/wirings/workflow/feature.d.ts +12 -0
- package/dist/wirings/workflow/feature.js +12 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +5 -0
- package/dist/wirings/workflow/graph/graph-node.js +5 -0
- package/dist/wirings/workflow/graph/template.d.ts +6 -0
- package/dist/wirings/workflow/graph/template.js +5 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +12 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.js +10 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +11 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.js +1 -0
- package/dist/{services → wirings/workflow}/in-memory-workflow-service.d.ts +8 -3
- package/dist/{services → wirings/workflow}/in-memory-workflow-service.js +9 -4
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +1 -1
- package/dist/wirings/workflow/pikku-scenario-service.js +2 -2
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +1 -0
- package/dist/wirings/workflow/pikku-workflow-service.js +1 -0
- package/dist/wirings/workflow/run-timeline.d.ts +21 -0
- package/dist/wirings/workflow/run-timeline.js +15 -7
- package/dist/wirings/workflow/scenario-coverage.d.ts +1 -0
- package/dist/wirings/workflow/scenario-poll.d.ts +1 -0
- package/dist/wirings/workflow/scenario-prose.d.ts +6 -0
- package/dist/wirings/workflow/scenario-prose.js +6 -0
- package/dist/wirings/workflow/scenario-run.types.d.ts +3 -0
- package/dist/wirings/workflow/scenario-step.types.d.ts +1 -0
- package/dist/wirings/workflow/scenario-step.types.js +1 -0
- package/dist/wirings/workflow/scenario-surface.js +1 -13
- package/dist/wirings/workflow/scenario.types.d.ts +6 -0
- package/dist/wirings/workflow/workflow-approval-policy.d.ts +6 -0
- package/dist/wirings/workflow/workflow-approval-policy.js +6 -0
- package/dist/wirings/workflow/workflow-constants.d.ts +7 -1
- package/dist/wirings/workflow/workflow-constants.js +10 -1
- package/dist/wirings/workflow/workflow-errors.d.ts +13 -0
- package/dist/wirings/workflow/workflow-errors.js +13 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +4 -0
- package/dist/wirings/workflow/workflow-invocation-id.js +4 -0
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +3 -0
- package/dist/wirings/workflow/workflow-run-ownership.d.ts +1 -0
- package/dist/wirings/workflow/workflow-run-ownership.js +1 -0
- package/dist/wirings/workflow/workflow-status-stream.d.ts +1 -0
- package/dist/wirings/workflow/workflow-unwind-plan.js +2 -7
- package/dist/wirings/workflow/workflow.types.d.ts +40 -0
- package/package.json +26 -9
- package/CHANGELOG.md +0 -6978
- package/dist/services/in-memory-trigger-service.d.ts +0 -4
- package/dist/services/local-gateway-service.d.ts +0 -6
- package/dist/utils/hash.d.ts +0 -2
- package/dist/utils/hash.js +0 -23
- package/knowledge/decisions/index.md +0 -19
- package/knowledge/decisions/internals/a-credential-name-declared-twice-must-agree-on-schema-and-type.md +0 -29
- package/knowledge/decisions/internals/a-grant-can-name-a-scope-declared-without-its-addon.md +0 -29
- package/knowledge/decisions/internals/a-held-run-is-woken-later-not-retried.md +0 -28
- package/knowledge/decisions/internals/a-latency-budget-is-asserted-by-its-cause.md +0 -32
- package/knowledge/decisions/internals/a-non-streaming-agent-run-registers-with-agentrunstate-too.md +0 -22
- package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +0 -50
- package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +0 -20
- package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +0 -21
- package/knowledge/decisions/internals/a-scheduled-task-writes-its-caller-session-before-it-runs.md +0 -22
- package/knowledge/decisions/internals/a-secret-set-in-memory-shadows-the-variable-of-the-same-name.md +0 -28
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +0 -49
- package/knowledge/decisions/internals/a-virtual-user-acts-through-invokeraw-so-a-refusal-is-data.md +0 -32
- package/knowledge/decisions/internals/a-virtual-user-cadence-is-a-row-not-a-timer.md +0 -66
- package/knowledge/decisions/internals/a-virtual-user-converse-signs-in-before-its-first-turn.md +0 -24
- package/knowledge/decisions/internals/a-virtual-user-decides-whether-to-trust-memory-once-per-turn.md +0 -21
- package/knowledge/decisions/internals/a-virtual-user-email-is-computed-with-the-run-id-as-a-sub-address.md +0 -34
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-but-it-needs-a-trigger.md +0 -65
- package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +0 -49
- package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +0 -45
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +0 -26
- package/knowledge/decisions/internals/addon-pikku-meta-ships-at-the-package-root-or-under-dist.md +0 -32
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +0 -33
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +0 -28
- package/knowledge/decisions/internals/agent-agui-bridge-obeys-the-client-ordering-contract.md +0 -29
- package/knowledge/decisions/internals/agent-audio-chunks-carry-the-format-the-provider-returned.md +0 -20
- package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +0 -21
- package/knowledge/decisions/internals/agent-credential-suspensions-hide-the-tool-result.md +0 -26
- package/knowledge/decisions/internals/agent-delegate-and-supervise-hide-different-text.md +0 -26
- package/knowledge/decisions/internals/agent-llm-tool-arguments-have-nulls-stripped.md +0 -23
- package/knowledge/decisions/internals/agent-model-config-stays-a-single-resolution-seam.md +0 -25
- package/knowledge/decisions/internals/agent-onerror-hooks-cannot-change-the-failure.md +0 -22
- package/knowledge/decisions/internals/agent-runner-methods-must-keep-their-receiver.md +0 -22
- package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +0 -22
- package/knowledge/decisions/internals/agent-stream-persistence-is-best-effort.md +0 -27
- package/knowledge/decisions/internals/agent-sub-agents-inherit-the-parent-context-block.md +0 -26
- package/knowledge/decisions/internals/agent-tool-execute-failures-are-logged-unconditionally.md +0 -25
- package/knowledge/decisions/internals/agent-voice-input-transcribes-audio-parts-in-place.md +0 -22
- package/knowledge/decisions/internals/agent-working-memory-is-persisted-only-when-valid.md +0 -25
- package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +0 -39
- package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +0 -23
- package/knowledge/decisions/internals/an-agent-is-offered-under-its-registry-key-and-only-within-the-virtual-users-scopes.md +0 -27
- package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +0 -25
- package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +0 -22
- package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +0 -20
- package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +0 -22
- package/knowledge/decisions/internals/an-oauth2-credential-implies-an-optional-app-secret.md +0 -26
- package/knowledge/decisions/internals/an-unref-d-timer-cannot-be-awaited-under-node-test.md +0 -66
- package/knowledge/decisions/internals/analytics-identity-resolvers-run-in-declared-order.md +0 -22
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +0 -30
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +0 -31
- package/knowledge/decisions/internals/channel-state-accessors-are-unsound-generics-that-every-implementation-asserts.md +0 -33
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +0 -29
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +0 -28
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +0 -27
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +0 -28
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +0 -34
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +0 -29
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +0 -84
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +0 -41
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +0 -44
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +0 -39
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +0 -42
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +0 -39
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +0 -43
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +0 -38
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +0 -44
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +0 -27
- package/knowledge/decisions/internals/feature-flag-declarations-refuse-an-empty-anyof-and-conflicting-scopes.md +0 -22
- package/knowledge/decisions/internals/feature-flags-fail-open-and-never-enforce-access.md +0 -28
- package/knowledge/decisions/internals/flag-sync-rewrites-only-the-declared-text.md +0 -24
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +0 -32
- package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +0 -43
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +0 -28
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +0 -31
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +0 -26
- package/knowledge/decisions/internals/global-middleware-resolves-from-the-root-namespace-too.md +0 -32
- package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +0 -38
- package/knowledge/decisions/internals/hot-reload-writes-into-the-function-map-captured-at-startup.md +0 -26
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +0 -32
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +0 -28
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +0 -30
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +0 -26
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +0 -28
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +0 -32
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +0 -26
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +0 -25
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +0 -26
- package/knowledge/decisions/internals/index.md +0 -182
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +0 -25
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +0 -26
- package/knowledge/decisions/internals/mcp-wire-names-are-assigned-over-the-whole-registry.md +0 -39
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +0 -24
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +0 -53
- package/knowledge/decisions/internals/only-exposed-functions-enter-a-virtual-user-catalogue.md +0 -21
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +0 -28
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +0 -27
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +0 -31
- package/knowledge/decisions/internals/role-names-cannot-contain-the-scope-separator.md +0 -30
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +0 -32
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +0 -31
- package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +0 -24
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +0 -26
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +0 -27
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +0 -48
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +0 -30
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +0 -28
- package/knowledge/decisions/internals/side-effects-are-an-allowlist-not-a-boolean.md +0 -34
- package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +0 -24
- package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +0 -26
- package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +0 -43
- package/knowledge/decisions/internals/the-core-scope-validator-refuses-separator-wildcard-and-empty-segments.md +0 -22
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +0 -30
- package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +0 -83
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +0 -29
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +0 -27
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +0 -40
- package/knowledge/decisions/internals/the-mcp-handshake-is-challenged-only-when-every-target-is-gated.md +0 -29
- package/knowledge/decisions/internals/the-middleware-resolution-cache-is-deliberately-unbounded.md +0 -40
- package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +0 -40
- package/knowledge/decisions/internals/the-pikku-user-id-resolves-in-a-fixed-order.md +0 -24
- package/knowledge/decisions/internals/the-runner-resolves-wire-services-itself.md +0 -31
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +0 -26
- package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +0 -25
- package/knowledge/decisions/internals/the-virtual-user-catalogue-is-the-only-gate-on-what-may-be-called.md +0 -21
- package/knowledge/decisions/internals/the-virtual-user-prompt-says-json-because-of-json-object-mode.md +0 -22
- package/knowledge/decisions/internals/the-virtual-user-runtime-is-exported-from-the-virtual-user-entry-point.md +0 -28
- package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +0 -22
- package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +0 -25
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +0 -33
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +0 -26
- package/knowledge/decisions/internals/validate-checks-virtual-users-through-a-shared-module.md +0 -43
- package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +0 -115
- package/knowledge/decisions/internals/virtual-user-conversation-drives-the-target-through-a-transport-seam.md +0 -24
- package/knowledge/decisions/internals/virtual-user-conversation-verdicts-are-llm-self-evaluations.md +0 -25
- package/knowledge/decisions/internals/virtual-user-conversations-seed-a-hidden-kickoff-message.md +0 -23
- package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +0 -21
- package/knowledge/decisions/internals/virtual-users-are-declared-in-one-definevirtualusers-call-per-codebase.md +0 -30
- package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +0 -24
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +0 -26
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +0 -25
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +0 -58
- package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +0 -35
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +0 -34
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +0 -42
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +0 -38
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +0 -29
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +0 -42
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +0 -25
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +0 -29
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +0 -43
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +0 -29
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +0 -42
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +0 -33
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +0 -32
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +0 -31
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +0 -39
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +0 -29
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +0 -33
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +0 -37
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +0 -54
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +0 -43
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +0 -32
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +0 -18
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +0 -34
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +0 -29
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +0 -33
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +0 -34
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +0 -34
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +0 -38
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +0 -30
- package/knowledge/decisions/security/a-bearer-token-checked-against-a-secret-reads-it-per-request.md +0 -26
- package/knowledge/decisions/security/a-call-without-a-session-raises-missing-session-not-forbidden.md +0 -20
- package/knowledge/decisions/security/a-caller-cookie-wins-over-the-jar-for-the-same-name.md +0 -23
- package/knowledge/decisions/security/a-channel-lifecycle-acts-as-the-socket-upgrade-session.md +0 -16
- package/knowledge/decisions/security/a-channel-requires-a-session-unless-it-says-auth-false.md +0 -26
- package/knowledge/decisions/security/a-credential-read-path-follows-its-declared-type-not-absence.md +0 -32
- package/knowledge/decisions/security/a-credential-type-is-a-literal-the-inspector-checks-at-declaration.md +0 -27
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +0 -28
- package/knowledge/decisions/security/a-first-party-cookie-is-written-only-after-its-purposes-consent.md +0 -33
- package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +0 -37
- package/knowledge/decisions/security/a-graph-run-starts-at-an-entry-node-the-graph-declared.md +0 -33
- package/knowledge/decisions/security/a-permission-gets-a-wire-it-cannot-reply-on.md +0 -33
- package/knowledge/decisions/security/a-public-function-says-so-with-auth-false.md +0 -34
- package/knowledge/decisions/security/a-readonly-session-reaches-only-readonly-functions.md +0 -25
- package/knowledge/decisions/security/a-scaffold-flag-says-a-surface-exists-not-who-may-call-it.md +0 -52
- package/knowledge/decisions/security/a-scheduled-virtual-user-run-needs-no-admin-at-run-time.md +0 -27
- package/knowledge/decisions/security/a-scoped-credential-view-is-limited-to-declared-names.md +0 -26
- package/knowledge/decisions/security/a-scoped-secret-view-reads-only-declared-keys-and-never-writes.md +0 -25
- package/knowledge/decisions/security/a-secret-is-sent-only-to-the-hosts-it-declares.md +0 -29
- package/knowledge/decisions/security/a-step-can-name-an-identity-no-virtual-user-holds-through-per-call-headers.md +0 -25
- package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +0 -37
- package/knowledge/decisions/security/a-stopped-run-by-id-skips-the-ownership-check.md +0 -24
- package/knowledge/decisions/security/a-vault-secret-redacts-on-serialization-and-throws-on-coercion.md +0 -29
- package/knowledge/decisions/security/a-virtual-user-catalogue-entry-is-filtered-by-scope-and-approval-is-denied-by-default.md +0 -30
- package/knowledge/decisions/security/a-virtual-user-environment-fails-closed.md +0 -38
- package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +0 -27
- package/knowledge/decisions/security/a-virtual-user-never-runs-against-production.md +0 -23
- package/knowledge/decisions/security/a-virtual-user-reads-its-roles-from-the-apps-own-rpc-before-better-auth.md +0 -27
- package/knowledge/decisions/security/a-virtual-user-run-treats-an-unresolved-environment-as-production.md +0 -41
- package/knowledge/decisions/security/a-virtual-user-scopes-are-expanded-from-its-roles-once-at-run-preparation.md +0 -25
- package/knowledge/decisions/security/a-virtual-user-whose-roles-drift-from-the-declaration-refuses-to-run.md +0 -32
- package/knowledge/decisions/security/a-workflow-run-is-read-and-approved-by-its-owner.md +0 -50
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +0 -43
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +0 -52
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +0 -46
- package/knowledge/decisions/security/addon-screen-scopes-hide-and-do-not-enforce.md +0 -20
- package/knowledge/decisions/security/agent-approval-forwarding-requires-a-symbol-brand.md +0 -27
- package/knowledge/decisions/security/agent-credential-requests-are-symbol-branded.md +0 -37
- package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +0 -31
- package/knowledge/decisions/security/agent-ownership-failures-never-echo-the-resource.md +0 -23
- package/knowledge/decisions/security/agent-resume-re-runs-the-authorization-gate.md +0 -22
- package/knowledge/decisions/security/agent-sessionless-deployments-have-no-thread-ownership.md +0 -39
- package/knowledge/decisions/security/agent-thread-ownership-composes-the-session-principal.md +0 -30
- package/knowledge/decisions/security/agent-tool-filtering-reads-the-live-function-config.md +0 -24
- package/knowledge/decisions/security/an-addon-header-can-only-narrow-the-session.md +0 -26
- package/knowledge/decisions/security/an-addon-instance-reads-only-the-secrets-and-credentials-it-is-named.md +0 -33
- package/knowledge/decisions/security/an-addon-may-reach-only-itself-and-the-addons-it-uses.md +0 -16
- package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +0 -33
- package/knowledge/decisions/security/an-api-key-is-jwt-decoded-into-the-session.md +0 -26
- package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +0 -59
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +0 -30
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +0 -52
- package/knowledge/decisions/security/an-external-virtual-user-caller-presents-one-signed-statement.md +0 -38
- package/knowledge/decisions/security/an-inbound-webhook-source-dispatches-only-verified-requests.md +0 -31
- package/knowledge/decisions/security/an-mcp-call-with-no-http-request-stays-anonymous.md +0 -18
- package/knowledge/decisions/security/an-mcp-refusal-is-decided-before-dispatch.md +0 -48
- package/knowledge/decisions/security/an-oauth2-credential-is-read-by-its-account-row.md +0 -40
- package/knowledge/decisions/security/an-omitted-user-id-addresses-the-platform-credential.md +0 -32
- package/knowledge/decisions/security/an-upload-is-counted-as-it-arrives-not-buffered-then-measured.md +0 -24
- package/knowledge/decisions/security/analytics-identity-is-stamped-from-the-session-not-the-event.md +0 -24
- package/knowledge/decisions/security/app-access-is-a-scope-tree-synthesised-from-virtual-users.md +0 -26
- package/knowledge/decisions/security/approval-policy-decides-who-answers-a-tool-call.md +0 -27
- package/knowledge/decisions/security/auth-false-on-a-session-function-warns-and-still-requires-one.md +0 -25
- package/knowledge/decisions/security/bearer-token-hashes-are-unpeppered-sha256.md +0 -18
- package/knowledge/decisions/security/consent-is-read-from-a-cookie-and-a-recognised-denial-counts-as-refusal.md +0 -29
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +0 -84
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +0 -39
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +0 -37
- package/knowledge/decisions/security/cors-defaults-to-any-origin-and-refuses-the-wildcard-with-credentials.md +0 -22
- package/knowledge/decisions/security/credential-backends-share-one-conformance-suite-for-per-user-isolation.md +0 -29
- package/knowledge/decisions/security/each-stage-has-one-virtual-user-key-pair.md +0 -27
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +0 -41
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +0 -30
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +0 -40
- package/knowledge/decisions/security/hmac-verification-fails-closed-on-empty-inputs.md +0 -25
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +0 -33
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +0 -46
- package/knowledge/decisions/security/index.md +0 -135
- package/knowledge/decisions/security/local-content-refuses-private-buckets-under-the-public-segment.md +0 -21
- package/knowledge/decisions/security/mail-is-allowlisted-before-a-virtual-user-run-sees-it.md +0 -38
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +0 -27
- package/knowledge/decisions/security/mcp-resources-tools-and-prompts-take-sessionless-functions.md +0 -18
- package/knowledge/decisions/security/origin-locked-routes-match-the-origin-exactly.md +0 -22
- package/knowledge/decisions/security/oss-auth-works-without-pikku-studio-cloud.md +0 -26
- package/knowledge/decisions/security/outbound-webhooks-use-an-allowlist-when-configured.md +0 -24
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +0 -40
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +0 -31
- package/knowledge/decisions/security/pikku-carries-virtual-user-scopes-as-data-and-the-app-grants-them.md +0 -35
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +0 -69
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +0 -39
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +0 -34
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +0 -55
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +0 -30
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +0 -28
- package/knowledge/decisions/security/scoped-content-access-is-a-root-folder-with-longest-prefix-grants.md +0 -31
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +0 -34
- package/knowledge/decisions/security/services-without-secrets-get-a-throwing-secrets-accessor.md +0 -22
- package/knowledge/decisions/security/shared-guards-refuse-to-mutate-or-shadow-a-system-role.md +0 -34
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +0 -37
- package/knowledge/decisions/security/signed-uploads-are-verified-by-the-same-check-as-signed-reads.md +0 -26
- package/knowledge/decisions/security/system-role-scopes-must-be-declared-with-define-scope.md +0 -24
- package/knowledge/decisions/security/system-roles-are-additive-and-immutable.md +0 -16
- package/knowledge/decisions/security/the-channel-rpc-does-not-send-the-callers-session.md +0 -21
- package/knowledge/decisions/security/the-remote-jobs-inbox-fails-closed-without-a-secret.md +0 -24
- package/knowledge/decisions/security/the-remote-rpc-gate-fails-closed-and-binds-the-token-to-its-function.md +0 -34
- package/knowledge/decisions/security/the-workflow-status-stream-rechecks-ownership-on-every-poll.md +0 -16
- package/knowledge/decisions/security/two-credentials-on-one-key-must-share-a-read-mode.md +0 -29
- package/knowledge/decisions/security/verified-bearer-claims-are-pass-through-data-that-core-never-fills.md +0 -23
- package/knowledge/decisions/security/virtual-user-catalogue-excludes-the-machinery-that-runs-virtual-users.md +0 -25
- package/knowledge/decisions/security/virtual-user-conversation-missing-approval-decisions-default-to-denied.md +0 -22
- package/knowledge/decisions/security/virtual-user-run-records-are-gated-behind-a-read-scope.md +0 -18
- package/knowledge/decisions/security/virtual-user-sign-in-does-not-exist-in-production.md +0 -25
- package/knowledge/decisions/security/virtual-user-sign-in-has-one-door.md +0 -42
- package/knowledge/decisions/security/virtual-user-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +0 -29
- package/knowledge/decisions/security/virtual-user-sign-in-only-works-for-virtual-user-flagged-users.md +0 -29
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +0 -25
- package/knowledge/decisions/security/wire-addon-expose-selects-the-rpc-surface.md +0 -51
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +0 -40
- package/knowledge/decisions/security/workflow-helper-functions-are-sessionless-by-declaration.md +0 -18
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +0 -32
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-virtual-user-and-per-scenario.md +0 -32
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +0 -31
- package/knowledge/decisions/security/workflow-virtual-user-steps-always-use-the-real-transport.md +0 -34
- package/knowledge/decisions/security/writing-a-virtual-user-schedule-is-gated-by-its-own-scope.md +0 -18
- package/knowledge/index.md +0 -24
- package/knowledge/questions/a-bearer-jwt-with-no-identity-becomes-a-session.md +0 -24
- package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +0 -35
- package/knowledge/questions/dev-quick-login-as-impersonation.md +0 -25
- package/knowledge/questions/does-a-delayed-rpc-run-as-the-session-it-was-scheduled-with.md +0 -26
- package/knowledge/questions/does-a-user-id-with-a-colon-read-another-users-credentials.md +0 -27
- package/knowledge/questions/does-a-wirecli-command-need-a-session-by-default.md +0 -26
- package/knowledge/questions/does-an-adversarial-in-scope-success-count-as-a-finding.md +0 -26
- package/knowledge/questions/does-approve-step-need-the-run-owners-session-or-the-gates-approvers.md +0 -34
- package/knowledge/questions/does-cors-origin-true-reflect-any-origin-with-credentials.md +0 -20
- package/knowledge/questions/does-skip-user-session-do-anything-on-a-channel.md +0 -24
- package/knowledge/questions/does-the-store-session-match-the-other-two.md +0 -19
- package/knowledge/questions/index.md +0 -41
- package/knowledge/questions/is-the-agent-score-worker-reachable-without-a-session.md +0 -21
- package/knowledge/questions/live-scheduled-tests-may-write.md +0 -19
- package/knowledge/questions/provision-virtual-users-has-no-caller-in-this-repo.md +0 -23
- package/knowledge/questions/remote-secret-refuses-requests-without-a-remote-token-on-every-path.md +0 -32
- package/knowledge/questions/should-a-middleware-set-session-persist-to-the-store.md +0 -25
- package/knowledge/questions/should-a-scoped-secret-view-throw-from-has-secret-for-a-disallowed-key.md +0 -23
- package/knowledge/questions/should-a-wrong-bearer-token-be-anonymous-or-refused.md +0 -35
- package/knowledge/questions/should-an-empty-webhook-signing-secret-send-unsigned.md +0 -23
- package/knowledge/questions/should-http-virtual-user-sessions-reset-between-scenarios-in-one-run.md +0 -27
- package/knowledge/questions/should-the-cookie-jar-scope-cookies-to-the-api-origin.md +0 -26
- package/knowledge/questions/should-voice-input-fetch-audio-urls-without-a-host-allowlist.md +0 -20
- package/knowledge/questions/staging-impersonation-rules.md +0 -27
- package/knowledge/questions/unauthorized-channel-replies-escape-the-declared-out-type.md +0 -44
- package/knowledge/questions/virtual-user-keys-on-cloud-stages-are-pikku-studios-to-build.md +0 -33
- package/knowledge/questions/virtual-user-statement-replay-is-per-process.md +0 -20
- package/knowledge/questions/what-an-impersonated-session-carries.md +0 -22
- package/run-tests.sh +0 -68
- package/scripts/generate-api-report.d.mts +0 -1
- package/scripts/generate-api-report.mjs +0 -96
- package/scripts/generate-api-report.mts +0 -333
- package/src/public-surface.json +0 -637
- package/src/public-surface.json.README +0 -43
- /package/dist/{function/compensation-name.d.ts → compensation-name.d.ts} +0 -0
- /package/dist/{function/compensation-name.js → compensation-name.js} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { PikkuHTTPResponse } from './http.types.js';
|
|
2
2
|
import type { SerializeOptions as CookieSerializeOptions } from 'cookie';
|
|
3
|
+
/** A {@link PikkuHTTPResponse} that collects status, headers, cookies and body in memory, or as a stream for SSE, and converts them to a web `Response` with `toResponse()`. */
|
|
3
4
|
export declare class PikkuFetchHTTPResponse implements PikkuHTTPResponse {
|
|
4
5
|
#private;
|
|
5
6
|
setMode(mode: 'stream'): void;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { stringifySetCookie } from 'cookie';
|
|
2
|
+
/** A {@link PikkuHTTPResponse} that collects status, headers, cookies and body in memory, or as a stream for SSE, and converts them to a web `Response` with `toResponse()`. */
|
|
2
3
|
export class PikkuFetchHTTPResponse {
|
|
3
4
|
#statusCode = 200;
|
|
4
5
|
#headers = new Headers();
|
|
@@ -7,4 +7,10 @@ export type MatchResult = {
|
|
|
7
7
|
export interface Router {
|
|
8
8
|
match(method: HTTPMethod, path: string): MatchResult;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* The router that matches a method and path against the wired HTTP routes and
|
|
12
|
+
* channels. It compiles the routes on first match, so a route wired after that
|
|
13
|
+
* is not seen until `reset()` is called; tests and hot reload call `reset()`
|
|
14
|
+
* after rewiring.
|
|
15
|
+
*/
|
|
10
16
|
export declare const httpRouter: PathToRegexRouter;
|
|
@@ -1,2 +1,8 @@
|
|
|
1
1
|
import { PathToRegexRouter } from './path-to-regex.js';
|
|
2
|
+
/**
|
|
3
|
+
* The router that matches a method and path against the wired HTTP routes and
|
|
4
|
+
* channels. It compiles the routes on first match, so a route wired after that
|
|
5
|
+
* is not seen until `reset()` is called; tests and hot reload call `reset()`
|
|
6
|
+
* after rewiring.
|
|
7
|
+
*/
|
|
2
8
|
export const httpRouter = new PathToRegexRouter();
|
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
import type { PikkuHTTPRequest } from './http.types.js';
|
|
2
2
|
import type { PikkuHTTPResponse } from './http.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Converts a {@link PikkuHTTPRequest} into a web `Request`, for handing it to a library that speaks the fetch API.
|
|
5
|
+
*
|
|
6
|
+
* Without `baseUrl` the origin is built from `x-forwarded-proto` and
|
|
7
|
+
* `x-forwarded-host` (then `host`), which any client can set. Pass `baseUrl`
|
|
8
|
+
* unless the host sits behind a proxy that overwrites those headers.
|
|
9
|
+
*
|
|
10
|
+
* @param req - The request to convert. Its body is streamed, not buffered.
|
|
11
|
+
* @param baseUrl - The origin to resolve the path against.
|
|
12
|
+
*/
|
|
3
13
|
export declare function toWebRequest(req: PikkuHTTPRequest, baseUrl?: string): Request;
|
|
14
|
+
/**
|
|
15
|
+
* Copies a web `Response`'s status, headers, cookies and body onto a {@link PikkuHTTPResponse}.
|
|
16
|
+
*
|
|
17
|
+
* This is what happens when a pikku function returns a `Response`. `Content-Length`
|
|
18
|
+
* and `Transfer-Encoding` are dropped, multiple `Set-Cookie` headers are kept, and an SSE
|
|
19
|
+
* body is streamed through when the target supports it.
|
|
20
|
+
*/
|
|
4
21
|
export declare function applyWebResponse(res: PikkuHTTPResponse, webResponse: Response): Promise<void>;
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a {@link PikkuHTTPRequest} into a web `Request`, for handing it to a library that speaks the fetch API.
|
|
4
|
+
*
|
|
5
|
+
* Without `baseUrl` the origin is built from `x-forwarded-proto` and
|
|
6
|
+
* `x-forwarded-host` (then `host`), which any client can set. Pass `baseUrl`
|
|
7
|
+
* unless the host sits behind a proxy that overwrites those headers.
|
|
8
|
+
*
|
|
9
|
+
* @param req - The request to convert. Its body is streamed, not buffered.
|
|
10
|
+
* @param baseUrl - The origin to resolve the path against.
|
|
11
|
+
*/
|
|
2
12
|
export function toWebRequest(req, baseUrl) {
|
|
3
13
|
const proto = req.header('x-forwarded-proto') ?? 'http';
|
|
4
14
|
const host = req.header('x-forwarded-host') ?? req.header('host') ?? 'localhost';
|
|
@@ -100,6 +110,13 @@ async function readBody(webResponse) {
|
|
|
100
110
|
const bytes = new Uint8Array(await webResponse.arrayBuffer());
|
|
101
111
|
return bytes.byteLength === 0 ? null : bytes;
|
|
102
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Copies a web `Response`'s status, headers, cookies and body onto a {@link PikkuHTTPResponse}.
|
|
115
|
+
*
|
|
116
|
+
* This is what happens when a pikku function returns a `Response`. `Content-Length`
|
|
117
|
+
* and `Transfer-Encoding` are dropped, multiple `Set-Cookie` headers are kept, and an SSE
|
|
118
|
+
* body is streamed through when the target supports it.
|
|
119
|
+
*/
|
|
103
120
|
export async function applyWebResponse(res, webResponse) {
|
|
104
121
|
res.status(webResponse.status);
|
|
105
122
|
const setCookieValues = collectSetCookieHeaders(webResponse);
|
|
@@ -21,6 +21,13 @@ export interface MCPPromptEndpoint {
|
|
|
21
21
|
inputSchema?: any;
|
|
22
22
|
enabled: boolean;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Holds an MCP server's tools, resources and prompts as listed to clients, loaded from the
|
|
26
|
+
* generated MCP JSON, and tracks which of them are currently enabled.
|
|
27
|
+
*
|
|
28
|
+
* Used by MCP server adapters to answer `list` requests. Only `getTools()` filters by the
|
|
29
|
+
* enabled flag, and disabling an entry does not by itself refuse a call to it.
|
|
30
|
+
*/
|
|
24
31
|
export declare class MCPEndpointRegistry {
|
|
25
32
|
private tools;
|
|
26
33
|
private resources;
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Holds an MCP server's tools, resources and prompts as listed to clients, loaded from the
|
|
3
|
+
* generated MCP JSON, and tracks which of them are currently enabled.
|
|
4
|
+
*
|
|
5
|
+
* Used by MCP server adapters to answer `list` requests. Only `getTools()` filters by the
|
|
6
|
+
* enabled flag, and disabling an entry does not by itself refuse a call to it.
|
|
7
|
+
*/
|
|
1
8
|
export class MCPEndpointRegistry {
|
|
2
9
|
tools = new Map();
|
|
3
10
|
resources = new Map();
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { PikkuHTTP } from '../http/http.types.js';
|
|
2
2
|
import type { CoreMCPResource, CoreMCPPrompt, JsonRpcRequest, JsonRpcResponse, JsonRpcErrorResponse, PikkuMCP } from './mcp.types.js';
|
|
3
3
|
import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
4
|
+
/**
|
|
5
|
+
* A JSON-RPC error raised by `runMCPTool`, `runMCPResource` and `runMCPPrompt`; `error` is the
|
|
6
|
+
* response body to send back to the MCP client.
|
|
7
|
+
*/
|
|
4
8
|
export declare class MCPError extends Error {
|
|
5
9
|
readonly error: JsonRpcErrorResponse;
|
|
6
10
|
constructor(error: JsonRpcErrorResponse);
|
|
@@ -24,13 +28,71 @@ export type RunMCPEndpointParams<Tools extends string = any> = {
|
|
|
24
28
|
/** Defaults to enabled outside production. */
|
|
25
29
|
exposeErrors?: boolean;
|
|
26
30
|
};
|
|
31
|
+
/**
|
|
32
|
+
* Registers the function behind an MCP resource, addressed by `uri` (which may contain `{param}` placeholders).
|
|
33
|
+
*
|
|
34
|
+
* Skipped with a warning when the inspector recorded no metadata for the URI, which usually
|
|
35
|
+
* means the wiring shares a file the inspector could not resolve.
|
|
36
|
+
*
|
|
37
|
+
* @param mcpResource - The resource's URI, description and function.
|
|
38
|
+
* @throws Error when a resource with the same URI is already wired.
|
|
39
|
+
* @example snippet: mcpResource
|
|
40
|
+
*/
|
|
27
41
|
export declare const wireMCPResource: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>> = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>>(mcpResource: CoreMCPResource<PikkuFunctionConfig>) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Registers the function behind an MCP prompt, addressed by `name`.
|
|
44
|
+
*
|
|
45
|
+
* Skipped with a warning when the inspector recorded no metadata for the prompt.
|
|
46
|
+
*
|
|
47
|
+
* @param mcpPrompt - The prompt's name, description and function.
|
|
48
|
+
* @throws Error when a prompt with the same name is already wired.
|
|
49
|
+
* @example snippet: mcpPrompt
|
|
50
|
+
*/
|
|
28
51
|
export declare const wireMCPPrompt: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>> = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>>(mcpPrompt: CoreMCPPrompt<PikkuFunctionConfig>) => void;
|
|
52
|
+
/**
|
|
53
|
+
* Runs a `resources/read` request through the function runner, matching `uri` exactly first and
|
|
54
|
+
* then against each templated resource URI, whose captured parameters are merged into the input.
|
|
55
|
+
*
|
|
56
|
+
* The resource's own middleware and permissions apply (keyed by the template, not the concrete
|
|
57
|
+
* URI). Auth middleware only sees a session when `params.http` carries the originating request.
|
|
58
|
+
*
|
|
59
|
+
* @param request - The JSON-RPC request; `params` becomes the function input.
|
|
60
|
+
* @param params - The MCP wire, HTTP request (if any) and error-exposure flag.
|
|
61
|
+
* @param uri - The concrete URI the client asked for.
|
|
62
|
+
* @returns The JSON-RPC response holding the function's result.
|
|
63
|
+
* @throws MCPError with the error's registered `mcpCode`, or `-32603` (internal error) otherwise.
|
|
64
|
+
* Stack details are attached only when `exposeErrors` is set and not in production.
|
|
65
|
+
*/
|
|
29
66
|
export declare function runMCPResource(request: JsonRpcRequest, params: RunMCPEndpointParams, uri: string): Promise<JsonRpcResponse>;
|
|
67
|
+
/**
|
|
68
|
+
* Runs a `tools/call` request for the tool registered as `name` through the function runner.
|
|
69
|
+
*
|
|
70
|
+
* A result is wrapped as a single JSON text part unless the function declares `MCPToolResponse`
|
|
71
|
+
* as its output. Errors and auth behave as in `runMCPResource`.
|
|
72
|
+
*
|
|
73
|
+
* @param request - The JSON-RPC request; `params` becomes the function input.
|
|
74
|
+
* @param params - The MCP wire, HTTP request (if any) and error-exposure flag.
|
|
75
|
+
* @param name - The registered tool name (resolve a wire name with `mcpResolveWireName` first).
|
|
76
|
+
* @returns The JSON-RPC response holding the tool result.
|
|
77
|
+
* @throws MCPError as `runMCPResource` does; an unknown tool is a not-found error.
|
|
78
|
+
*/
|
|
30
79
|
export declare function runMCPTool(request: JsonRpcRequest, params: RunMCPEndpointParams, name: string): Promise<JsonRpcResponse>;
|
|
80
|
+
/**
|
|
81
|
+
* Runs a `prompts/get` request for the prompt registered as `name` through the function runner.
|
|
82
|
+
* Errors and auth behave as in `runMCPResource`.
|
|
83
|
+
*
|
|
84
|
+
* @param request - The JSON-RPC request; `params` becomes the prompt arguments.
|
|
85
|
+
* @param params - The MCP wire, HTTP request (if any) and error-exposure flag.
|
|
86
|
+
* @param name - The prompt name.
|
|
87
|
+
* @returns The JSON-RPC response holding the prompt messages.
|
|
88
|
+
* @throws MCPError as `runMCPResource` does; an unknown prompt is a not-found error.
|
|
89
|
+
*/
|
|
31
90
|
export declare function runMCPPrompt(request: JsonRpcRequest, params: RunMCPEndpointParams, name: string): Promise<JsonRpcResponse>;
|
|
91
|
+
/** The inspector-generated metadata for every MCP resource, keyed by URI (template). */
|
|
32
92
|
export declare const getMCPResourcesMeta: () => import("./mcp.types.js").MCPResourceMeta;
|
|
93
|
+
/** The inspector-generated metadata for every MCP tool, keyed by name. */
|
|
33
94
|
export declare const getMCPToolsMeta: () => import("./mcp.types.js").MCPToolMeta;
|
|
95
|
+
/** The inspector-generated metadata for every MCP prompt, keyed by name. */
|
|
34
96
|
export declare const getMCPPromptsMeta: () => import("./mcp.types.js").MCPPromptMeta;
|
|
35
97
|
/**
|
|
36
98
|
* Whether a call to this MCP target would need a session to run.
|
|
@@ -54,6 +116,7 @@ export declare const mcpTargetRequiresSession: (type: 'tool' | 'resource' | 'pro
|
|
|
54
116
|
* See `the-mcp-handshake-is-challenged-only-when-every-target-is-gated.md`.
|
|
55
117
|
*/
|
|
56
118
|
export declare const mcpEveryTargetRequiresSession: () => boolean;
|
|
119
|
+
/** The three kinds of MCP target a server exposes. */
|
|
57
120
|
export type McpTargetType = 'tool' | 'resource' | 'prompt';
|
|
58
121
|
/** How a registered target's name is spelled on the wire. */
|
|
59
122
|
export declare const mcpWireName: (type: McpTargetType, name: string) => string;
|
|
@@ -5,6 +5,10 @@ import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
|
|
|
5
5
|
import { resolveNamespace } from '../rpc/rpc-runner.js';
|
|
6
6
|
import { BadRequestError, NotFoundError } from '../../errors/errors.js';
|
|
7
7
|
import { PikkuSessionService, createMiddlewareSessionWireProps, } from '../../services/user-session-service.js';
|
|
8
|
+
/**
|
|
9
|
+
* A JSON-RPC error raised by `runMCPTool`, `runMCPResource` and `runMCPPrompt`; `error` is the
|
|
10
|
+
* response body to send back to the MCP client.
|
|
11
|
+
*/
|
|
8
12
|
export class MCPError extends Error {
|
|
9
13
|
error;
|
|
10
14
|
constructor(error) {
|
|
@@ -14,6 +18,16 @@ export class MCPError extends Error {
|
|
|
14
18
|
this.stack = new Error().stack;
|
|
15
19
|
}
|
|
16
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Registers the function behind an MCP resource, addressed by `uri` (which may contain `{param}` placeholders).
|
|
23
|
+
*
|
|
24
|
+
* Skipped with a warning when the inspector recorded no metadata for the URI, which usually
|
|
25
|
+
* means the wiring shares a file the inspector could not resolve.
|
|
26
|
+
*
|
|
27
|
+
* @param mcpResource - The resource's URI, description and function.
|
|
28
|
+
* @throws Error when a resource with the same URI is already wired.
|
|
29
|
+
* @example snippet: mcpResource
|
|
30
|
+
*/
|
|
17
31
|
export const wireMCPResource = (mcpResource) => {
|
|
18
32
|
const resourcesMeta = pikkuState(null, 'mcp', 'resourcesMeta');
|
|
19
33
|
const mcpResourceMeta = resourcesMeta[mcpResource.uri];
|
|
@@ -28,6 +42,15 @@ export const wireMCPResource = (mcpResource) => {
|
|
|
28
42
|
}
|
|
29
43
|
resources.set(mcpResource.uri, mcpResource);
|
|
30
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Registers the function behind an MCP prompt, addressed by `name`.
|
|
47
|
+
*
|
|
48
|
+
* Skipped with a warning when the inspector recorded no metadata for the prompt.
|
|
49
|
+
*
|
|
50
|
+
* @param mcpPrompt - The prompt's name, description and function.
|
|
51
|
+
* @throws Error when a prompt with the same name is already wired.
|
|
52
|
+
* @example snippet: mcpPrompt
|
|
53
|
+
*/
|
|
31
54
|
export const wireMCPPrompt = (mcpPrompt) => {
|
|
32
55
|
const promptsMeta = pikkuState(null, 'mcp', 'promptsMeta');
|
|
33
56
|
const mcpPromptMeta = promptsMeta[mcpPrompt.name];
|
|
@@ -42,6 +65,20 @@ export const wireMCPPrompt = (mcpPrompt) => {
|
|
|
42
65
|
}
|
|
43
66
|
prompts.set(mcpPrompt.name, mcpPrompt);
|
|
44
67
|
};
|
|
68
|
+
/**
|
|
69
|
+
* Runs a `resources/read` request through the function runner, matching `uri` exactly first and
|
|
70
|
+
* then against each templated resource URI, whose captured parameters are merged into the input.
|
|
71
|
+
*
|
|
72
|
+
* The resource's own middleware and permissions apply (keyed by the template, not the concrete
|
|
73
|
+
* URI). Auth middleware only sees a session when `params.http` carries the originating request.
|
|
74
|
+
*
|
|
75
|
+
* @param request - The JSON-RPC request; `params` becomes the function input.
|
|
76
|
+
* @param params - The MCP wire, HTTP request (if any) and error-exposure flag.
|
|
77
|
+
* @param uri - The concrete URI the client asked for.
|
|
78
|
+
* @returns The JSON-RPC response holding the function's result.
|
|
79
|
+
* @throws MCPError with the error's registered `mcpCode`, or `-32603` (internal error) otherwise.
|
|
80
|
+
* Stack details are attached only when `exposeErrors` is set and not in production.
|
|
81
|
+
*/
|
|
45
82
|
export async function runMCPResource(request, params, uri) {
|
|
46
83
|
let endpoint;
|
|
47
84
|
let pikkuFuncId;
|
|
@@ -79,10 +116,32 @@ export async function runMCPResource(request, params, uri) {
|
|
|
79
116
|
params: { ...request.params, ...extractedParams },
|
|
80
117
|
}, 'resource', uri, endpoint, pikkuFuncId, { ...params, mcp: { ...params.mcp, uri } }, metaKey);
|
|
81
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Runs a `tools/call` request for the tool registered as `name` through the function runner.
|
|
121
|
+
*
|
|
122
|
+
* A result is wrapped as a single JSON text part unless the function declares `MCPToolResponse`
|
|
123
|
+
* as its output. Errors and auth behave as in `runMCPResource`.
|
|
124
|
+
*
|
|
125
|
+
* @param request - The JSON-RPC request; `params` becomes the function input.
|
|
126
|
+
* @param params - The MCP wire, HTTP request (if any) and error-exposure flag.
|
|
127
|
+
* @param name - The registered tool name (resolve a wire name with `mcpResolveWireName` first).
|
|
128
|
+
* @returns The JSON-RPC response holding the tool result.
|
|
129
|
+
* @throws MCPError as `runMCPResource` does; an unknown tool is a not-found error.
|
|
130
|
+
*/
|
|
82
131
|
export async function runMCPTool(request, params, name) {
|
|
83
132
|
const meta = pikkuState(null, 'mcp', 'toolsMeta')[name];
|
|
84
133
|
return await runMCPPikkuFunc(request, 'tool', name, undefined, meta?.pikkuFuncId, params);
|
|
85
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Runs a `prompts/get` request for the prompt registered as `name` through the function runner.
|
|
137
|
+
* Errors and auth behave as in `runMCPResource`.
|
|
138
|
+
*
|
|
139
|
+
* @param request - The JSON-RPC request; `params` becomes the prompt arguments.
|
|
140
|
+
* @param params - The MCP wire, HTTP request (if any) and error-exposure flag.
|
|
141
|
+
* @param name - The prompt name.
|
|
142
|
+
* @returns The JSON-RPC response holding the prompt messages.
|
|
143
|
+
* @throws MCPError as `runMCPResource` does; an unknown prompt is a not-found error.
|
|
144
|
+
*/
|
|
86
145
|
export async function runMCPPrompt(request, params, name) {
|
|
87
146
|
const endpoint = pikkuState(null, 'mcp', 'prompts').get(name);
|
|
88
147
|
const meta = pikkuState(null, 'mcp', 'promptsMeta')[name];
|
|
@@ -178,12 +237,15 @@ metaKey = name) {
|
|
|
178
237
|
}
|
|
179
238
|
}
|
|
180
239
|
}
|
|
240
|
+
/** The inspector-generated metadata for every MCP resource, keyed by URI (template). */
|
|
181
241
|
export const getMCPResourcesMeta = () => {
|
|
182
242
|
return pikkuState(null, 'mcp', 'resourcesMeta');
|
|
183
243
|
};
|
|
244
|
+
/** The inspector-generated metadata for every MCP tool, keyed by name. */
|
|
184
245
|
export const getMCPToolsMeta = () => {
|
|
185
246
|
return pikkuState(null, 'mcp', 'toolsMeta');
|
|
186
247
|
};
|
|
248
|
+
/** The inspector-generated metadata for every MCP prompt, keyed by name. */
|
|
187
249
|
export const getMCPPromptsMeta = () => {
|
|
188
250
|
return pikkuState(null, 'mcp', 'promptsMeta');
|
|
189
251
|
};
|
|
@@ -9,6 +9,10 @@ export type AssertMCPResourceURIParams<In, URI extends string> = ExtractMCPURIPa
|
|
|
9
9
|
'not in input type',
|
|
10
10
|
keyof In
|
|
11
11
|
];
|
|
12
|
+
/**
|
|
13
|
+
* The `mcp` wire handed to a function run over MCP: the resource URI being read, and controls to
|
|
14
|
+
* notify the client of resource updates or toggle which tools, resources and prompts it lists.
|
|
15
|
+
*/
|
|
12
16
|
export type PikkuMCP<Tools extends string = any> = {
|
|
13
17
|
uri?: string;
|
|
14
18
|
sendResourceUpdated: (uri: string) => void;
|
|
@@ -16,6 +20,7 @@ export type PikkuMCP<Tools extends string = any> = {
|
|
|
16
20
|
enablePrompts: (prompts: Record<string, boolean>) => Promise<boolean>;
|
|
17
21
|
enableTools: (tools: Record<Tools, boolean>) => Promise<boolean>;
|
|
18
22
|
};
|
|
23
|
+
/** Inspector-generated metadata for MCP resources, keyed by URI. */
|
|
19
24
|
export type MCPResourceMeta = Record<string, Omit<CoreMCPResource, 'func' | 'middleware'> & {
|
|
20
25
|
pikkuFuncId: string;
|
|
21
26
|
inputSchema: string | null;
|
|
@@ -28,6 +33,7 @@ export type MCPResourceMeta = Record<string, Omit<CoreMCPResource, 'func' | 'mid
|
|
|
28
33
|
*/
|
|
29
34
|
surface?: string;
|
|
30
35
|
}>;
|
|
36
|
+
/** Inspector-generated metadata for MCP tools, keyed by name. */
|
|
31
37
|
export type MCPToolMeta = Record<string, Omit<CoreMCPTool, 'func' | 'middleware'> & {
|
|
32
38
|
pikkuFuncId: string;
|
|
33
39
|
inputSchema: string | null;
|
|
@@ -40,6 +46,7 @@ export type MCPToolMeta = Record<string, Omit<CoreMCPTool, 'func' | 'middleware'
|
|
|
40
46
|
*/
|
|
41
47
|
surface?: string;
|
|
42
48
|
}>;
|
|
49
|
+
/** Inspector-generated metadata for MCP prompts, keyed by name, including their argument list. */
|
|
43
50
|
export type MCPPromptMeta = Record<string, Omit<CoreMCPPrompt, 'func' | 'middleware'> & {
|
|
44
51
|
pikkuFuncId: string;
|
|
45
52
|
inputSchema: string | null;
|
|
@@ -57,6 +64,7 @@ export type MCPPromptMeta = Record<string, Omit<CoreMCPPrompt, 'func' | 'middlew
|
|
|
57
64
|
*/
|
|
58
65
|
surface?: string;
|
|
59
66
|
}>;
|
|
67
|
+
/** The configuration `wireMCPResource` takes. */
|
|
60
68
|
export type CoreMCPResource<PikkuFunctionConfig = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>, PikkuPermission = CorePikkuPermission<any, any>, PikkuMiddleware = CorePikkuMiddleware<any>> = {
|
|
61
69
|
/** How the client addresses this resource. `{name}` marks a parameter, and every parameter must be a key of the function's input schema. */
|
|
62
70
|
uri: string;
|
|
@@ -101,6 +109,7 @@ export type CoreMCPTool<PikkuFunctionConfig = CorePikkuFunctionConfig<CorePikkuF
|
|
|
101
109
|
/** Wraps every call: tracing, rate limiting, whatever the transport does not do. */
|
|
102
110
|
middleware?: PikkuMiddleware[];
|
|
103
111
|
};
|
|
112
|
+
/** The configuration `wireMCPPrompt` takes. */
|
|
104
113
|
export type CoreMCPPrompt<PikkuFunctionConfig = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, MCPPromptResponse>>, PikkuPermission = CorePikkuPermission<any, any>, PikkuMiddleware = CorePikkuMiddleware<any>> = {
|
|
105
114
|
/** How the client asks for this prompt. */
|
|
106
115
|
name: string;
|
|
@@ -140,11 +149,13 @@ export type MCPPromptMessage = {
|
|
|
140
149
|
data?: string;
|
|
141
150
|
};
|
|
142
151
|
};
|
|
152
|
+
/** What an MCP prompt function returns: the messages that start the conversation. */
|
|
143
153
|
export type MCPPromptResponse = MCPPromptMessage[];
|
|
144
154
|
export type MCPResourceMessage = {
|
|
145
155
|
uri: string;
|
|
146
156
|
text: string;
|
|
147
157
|
};
|
|
158
|
+
/** What an MCP resource function returns: one or more text contents, each with its URI. */
|
|
148
159
|
export type MCPResourceResponse = MCPResourceMessage[];
|
|
149
160
|
export type MCPToolMessage = {
|
|
150
161
|
type: 'text';
|
|
@@ -153,5 +164,6 @@ export type MCPToolMessage = {
|
|
|
153
164
|
type: 'image';
|
|
154
165
|
data: string;
|
|
155
166
|
};
|
|
167
|
+
/** What an MCP tool function may return to control its content parts directly; any other output is sent as JSON text. */
|
|
156
168
|
export type MCPToolResponse = MCPToolMessage[];
|
|
157
169
|
export {};
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
/** The role a function plays as a node in a workflow graph: something that starts a flow, a step within one, or a terminal step. */
|
|
1
2
|
export type NodeType = 'trigger' | 'action' | 'end';
|
|
3
|
+
/** How a function is presented as a node in a workflow graph editor: its label, palette category and role, and whether it exposes an error output. */
|
|
2
4
|
export type CoreNodeConfig = {
|
|
3
5
|
displayName: string;
|
|
4
6
|
category: string;
|
|
5
7
|
type: NodeType;
|
|
6
8
|
errorOutput?: boolean;
|
|
7
9
|
};
|
|
10
|
+
/** Generated metadata for one function exposed as a graph node. */
|
|
8
11
|
export type NodeMeta = {
|
|
9
12
|
name: string;
|
|
10
13
|
displayName: string;
|
|
@@ -17,4 +20,5 @@ export type NodeMeta = {
|
|
|
17
20
|
outputSchemaName: string | null;
|
|
18
21
|
tags?: string[];
|
|
19
22
|
};
|
|
23
|
+
/** Generated metadata for every function exposed as a graph node, keyed by name. */
|
|
20
24
|
export type NodesMeta = Record<string, NodeMeta>;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
/** An OAuth2 client registration. `clientSecret` is omitted for public clients using PKCE. */
|
|
1
2
|
export type OAuth2AppCredential = {
|
|
2
3
|
clientId: string;
|
|
3
4
|
clientSecret?: string;
|
|
4
5
|
};
|
|
6
|
+
/** An OAuth2 token set as stored for a credential. `expiresAt` is a Unix timestamp; treat the token as secret. */
|
|
5
7
|
export type OAuth2Token = {
|
|
6
8
|
accessToken: string;
|
|
7
9
|
refreshToken?: string;
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import type { QueueService, JobOptions, QueueInspection } from '
|
|
1
|
+
import type { QueueService, JobOptions, QueueInspection } from './queue.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* A {@link QueueService} that runs jobs in-process, for development and tests.
|
|
4
|
+
*
|
|
5
|
+
* Jobs run after a short delay, payloads are JSON round-tripped as a real
|
|
6
|
+
* backend would, and failed jobs are retried up to `attempts` with the given
|
|
7
|
+
* backoff. Nothing is persisted, `getJob` always returns `null`, and jobs still
|
|
8
|
+
* pending when the process exits are lost.
|
|
9
|
+
*/
|
|
2
10
|
export declare class InMemoryQueueService implements QueueService {
|
|
3
11
|
readonly supportsResults = false;
|
|
4
12
|
private jobCounter;
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import { runQueueJob } from '
|
|
1
|
+
import { runQueueJob } from './queue-runner.js';
|
|
2
2
|
const FINISHED_JOBS_KEPT = 100;
|
|
3
3
|
// knowledge: decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md
|
|
4
|
+
/**
|
|
5
|
+
* A {@link QueueService} that runs jobs in-process, for development and tests.
|
|
6
|
+
*
|
|
7
|
+
* Jobs run after a short delay, payloads are JSON round-tripped as a real
|
|
8
|
+
* backend would, and failed jobs are retried up to `attempts` with the given
|
|
9
|
+
* backoff. Nothing is persisted, `getJob` always returns `null`, and jobs still
|
|
10
|
+
* pending when the process exits are lost.
|
|
11
|
+
*/
|
|
4
12
|
export class InMemoryQueueService {
|
|
5
13
|
supportsResults = false;
|
|
6
14
|
jobCounter = 0;
|
|
@@ -5,3 +5,4 @@ export { SignedQueueService } from './signed-queue-service.js';
|
|
|
5
5
|
export type { QueueConfigMapping } from './validate-worker-config.js';
|
|
6
6
|
export { registerQueueWorkers } from './register-queue-helper.js';
|
|
7
7
|
export type { QueueRegistrationCallback } from './register-queue-helper.js';
|
|
8
|
+
export { pikkuRemoteQueueJobFunc } from './remote-queue-job.js';
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { wireQueueWorker, runQueueJob, QueueJobDiscardedError, QueueJobFailedError, } from './queue-runner.js';
|
|
2
2
|
export { SignedQueueService } from './signed-queue-service.js';
|
|
3
3
|
export { registerQueueWorkers } from './register-queue-helper.js';
|
|
4
|
+
export { pikkuRemoteQueueJobFunc } from './remote-queue-job.js';
|
|
@@ -1,27 +1,15 @@
|
|
|
1
1
|
import { decodeBase64UrlText, encodeBase64UrlText, signWithKeyMaterial, verifyWithKeyMaterial, } from '../../crypto-utils.js';
|
|
2
|
+
import { stableStringify } from '../../utils/stable-stringify.js';
|
|
2
3
|
export const QUEUE_IDENTITY_SECRET_NAME = 'PIKKU_QUEUE_IDENTITY_SECRET';
|
|
3
4
|
/** Namespaces the queue signing key away from every other use of the same material. */
|
|
4
5
|
export const QUEUE_IDENTITY_INFO = 'pikku:queue-identity';
|
|
5
6
|
export const QUEUE_IDENTITY_CLAIM_VERSION = 'pq1';
|
|
6
|
-
const stableStringify = (value) => {
|
|
7
|
-
if (value === null || typeof value !== 'object') {
|
|
8
|
-
return JSON.stringify(value) ?? 'null';
|
|
9
|
-
}
|
|
10
|
-
if (Array.isArray(value)) {
|
|
11
|
-
return `[${value.map(stableStringify).join(',')}]`;
|
|
12
|
-
}
|
|
13
|
-
const record = value;
|
|
14
|
-
const keys = Object.keys(record).sort();
|
|
15
|
-
return `{${keys
|
|
16
|
-
.map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)
|
|
17
|
-
.join(',')}}`;
|
|
18
|
-
};
|
|
19
7
|
/**
|
|
20
8
|
* Round-trips through JSON first so the producer hashes exactly what the
|
|
21
9
|
* transport will deliver, then sorts keys so property order cannot change the
|
|
22
10
|
* digest.
|
|
23
11
|
*/
|
|
24
|
-
const canonicalizePayload = (data) => stableStringify(JSON.parse(JSON.stringify(data ?? null)));
|
|
12
|
+
const canonicalizePayload = (data) => stableStringify(JSON.parse(JSON.stringify(data ?? null))) ?? 'null';
|
|
25
13
|
const signingPayload = (encodedClaim, data) => `${QUEUE_IDENTITY_CLAIM_VERSION}.${encodedClaim}.${canonicalizePayload(data)}`;
|
|
26
14
|
export const getQueueIdentitySecret = async (secrets) => {
|
|
27
15
|
try {
|
|
@@ -1,15 +1,52 @@
|
|
|
1
1
|
import type { CoreQueueWorker, QueueJob } from './queue.types.js';
|
|
2
2
|
import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
3
3
|
import { PikkuError } from '../../errors/error-handler.js';
|
|
4
|
+
/** Thrown by `queue.fail()` inside a worker. Queue adapters treat it as a failed attempt, so the backend's retry policy applies. */
|
|
4
5
|
export declare class QueueJobFailedError extends PikkuError {
|
|
5
6
|
constructor(jobId: string, reason?: string);
|
|
6
7
|
}
|
|
8
|
+
/** Thrown by `queue.discard()` inside a worker. Queue adapters treat it as the end of the job: it is not retried and is not reported as a failure. */
|
|
7
9
|
export declare class QueueJobDiscardedError extends PikkuError {
|
|
8
10
|
constructor(jobId: string, reason?: string);
|
|
9
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Registers the function that processes jobs on a queue.
|
|
14
|
+
*
|
|
15
|
+
* The worker's function is sessionless: a job has no request to authenticate.
|
|
16
|
+
* The only identity it sees is `queue.pikkuUserId` on its wire, which is set
|
|
17
|
+
* only when the producer's identity claim verifies against the
|
|
18
|
+
* `PIKKU_QUEUE_IDENTITY_SECRET` secret, and is dropped otherwise.
|
|
19
|
+
*
|
|
20
|
+
* Registration needs the metadata `pikku` generates for the queue. When none is
|
|
21
|
+
* found the wiring is skipped with a warning rather than throwing. A queue
|
|
22
|
+
* adapter (BullMQ, pg-boss, SQS, …) picks up registered workers through
|
|
23
|
+
* {@link registerQueueWorkers}.
|
|
24
|
+
*
|
|
25
|
+
* @param queueWorker - The queue name, the function to run per job, and optional worker config and middleware.
|
|
26
|
+
*
|
|
27
|
+
* @example snippet: wireQueue
|
|
28
|
+
*/
|
|
10
29
|
export declare const wireQueueWorker: <InputData = any, OutputData = any, PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<InputData, OutputData>> = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<InputData, OutputData>>>(queueWorker: CoreQueueWorker<PikkuFunctionConfig>) => void;
|
|
30
|
+
/** Every registered queue worker, keyed by queue name. */
|
|
11
31
|
export declare function getQueueWorkers(): Map<string, CoreQueueWorker>;
|
|
32
|
+
/** Unregisters the worker for `name`. Throws when no worker is registered under it. */
|
|
12
33
|
export declare function removeQueueWorker(name: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Runs one job through the worker registered for its queue. Queue adapters call this for every job they receive.
|
|
36
|
+
*
|
|
37
|
+
* The job's `pikkuUserId` claim is verified before the function runs; an
|
|
38
|
+
* unsigned or invalid claim is logged and the job runs without one. The function
|
|
39
|
+
* runs with `auth: false`, the worker's middleware, and a `queue` wire carrying
|
|
40
|
+
* `updateProgress`, `fail` and `discard`.
|
|
41
|
+
*
|
|
42
|
+
* @param params.job - The job as the adapter received it.
|
|
43
|
+
* @param params.updateProgress - Reports progress to the backend; defaults to logging it.
|
|
44
|
+
* @param params.traceId - Defaults to `q-<jobId>`.
|
|
45
|
+
* @returns What the worker's function returned.
|
|
46
|
+
* @throws {PikkuMissingMetaError} When no metadata was generated for the queue.
|
|
47
|
+
* @throws {QueueJobFailedError | QueueJobDiscardedError} When the worker called `fail` or `discard`.
|
|
48
|
+
* @throws Whatever the worker threw, after logging it, so the adapter can apply its retry policy.
|
|
49
|
+
*/
|
|
13
50
|
export declare function runQueueJob({ job, updateProgress, traceId, }: {
|
|
14
51
|
job: QueueJob;
|
|
15
52
|
updateProgress?: (progress: number | string | object) => Promise<void>;
|
|
@@ -8,18 +8,37 @@ class QueueWorkerNotFoundError extends PikkuError {
|
|
|
8
8
|
super(`Queue processor not found: ${name}`);
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
+
/** Thrown by `queue.fail()` inside a worker. Queue adapters treat it as a failed attempt, so the backend's retry policy applies. */
|
|
11
12
|
export class QueueJobFailedError extends PikkuError {
|
|
12
13
|
constructor(jobId, reason) {
|
|
13
14
|
super(`Queue job ${jobId} failed${reason ? `: ${reason}` : ''}`);
|
|
14
15
|
this.name = 'QueueJobFailedError';
|
|
15
16
|
}
|
|
16
17
|
}
|
|
18
|
+
/** Thrown by `queue.discard()` inside a worker. Queue adapters treat it as the end of the job: it is not retried and is not reported as a failure. */
|
|
17
19
|
export class QueueJobDiscardedError extends PikkuError {
|
|
18
20
|
constructor(jobId, reason) {
|
|
19
21
|
super(`Queue job ${jobId} discarded${reason ? `: ${reason}` : ''}`);
|
|
20
22
|
this.name = 'QueueJobDiscardedError';
|
|
21
23
|
}
|
|
22
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Registers the function that processes jobs on a queue.
|
|
27
|
+
*
|
|
28
|
+
* The worker's function is sessionless: a job has no request to authenticate.
|
|
29
|
+
* The only identity it sees is `queue.pikkuUserId` on its wire, which is set
|
|
30
|
+
* only when the producer's identity claim verifies against the
|
|
31
|
+
* `PIKKU_QUEUE_IDENTITY_SECRET` secret, and is dropped otherwise.
|
|
32
|
+
*
|
|
33
|
+
* Registration needs the metadata `pikku` generates for the queue. When none is
|
|
34
|
+
* found the wiring is skipped with a warning rather than throwing. A queue
|
|
35
|
+
* adapter (BullMQ, pg-boss, SQS, …) picks up registered workers through
|
|
36
|
+
* {@link registerQueueWorkers}.
|
|
37
|
+
*
|
|
38
|
+
* @param queueWorker - The queue name, the function to run per job, and optional worker config and middleware.
|
|
39
|
+
*
|
|
40
|
+
* @example snippet: wireQueue
|
|
41
|
+
*/
|
|
23
42
|
export const wireQueueWorker = (queueWorker) => {
|
|
24
43
|
const meta = pikkuState(null, 'queue', 'meta');
|
|
25
44
|
const processorMeta = meta[queueWorker.name];
|
|
@@ -37,9 +56,11 @@ export const wireQueueWorker = (queueWorker) => {
|
|
|
37
56
|
const registrations = pikkuState(null, 'queue', 'registrations');
|
|
38
57
|
registrations.set(queueWorker.name, queueWorker);
|
|
39
58
|
};
|
|
59
|
+
/** Every registered queue worker, keyed by queue name. */
|
|
40
60
|
export function getQueueWorkers() {
|
|
41
61
|
return pikkuState(null, 'queue', 'registrations');
|
|
42
62
|
}
|
|
63
|
+
/** Unregisters the worker for `name`. Throws when no worker is registered under it. */
|
|
43
64
|
export async function removeQueueWorker(name) {
|
|
44
65
|
const registrations = pikkuState(null, 'queue', 'registrations');
|
|
45
66
|
const registration = registrations.get(name);
|
|
@@ -48,6 +69,22 @@ export async function removeQueueWorker(name) {
|
|
|
48
69
|
}
|
|
49
70
|
registrations.delete(name);
|
|
50
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Runs one job through the worker registered for its queue. Queue adapters call this for every job they receive.
|
|
74
|
+
*
|
|
75
|
+
* The job's `pikkuUserId` claim is verified before the function runs; an
|
|
76
|
+
* unsigned or invalid claim is logged and the job runs without one. The function
|
|
77
|
+
* runs with `auth: false`, the worker's middleware, and a `queue` wire carrying
|
|
78
|
+
* `updateProgress`, `fail` and `discard`.
|
|
79
|
+
*
|
|
80
|
+
* @param params.job - The job as the adapter received it.
|
|
81
|
+
* @param params.updateProgress - Reports progress to the backend; defaults to logging it.
|
|
82
|
+
* @param params.traceId - Defaults to `q-<jobId>`.
|
|
83
|
+
* @returns What the worker's function returned.
|
|
84
|
+
* @throws {PikkuMissingMetaError} When no metadata was generated for the queue.
|
|
85
|
+
* @throws {QueueJobFailedError | QueueJobDiscardedError} When the worker called `fail` or `discard`.
|
|
86
|
+
* @throws Whatever the worker threw, after logging it, so the adapter can apply its retry policy.
|
|
87
|
+
*/
|
|
51
88
|
export async function runQueueJob({ job, updateProgress, traceId, }) {
|
|
52
89
|
const singletonServices = getSingletonServices();
|
|
53
90
|
const createWireServices = getCreateWireServices();
|