@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
|
@@ -14,6 +14,13 @@ const getMiddlewarePriority = (fn) => {
|
|
|
14
14
|
const sortByPriority = (middlewares) => {
|
|
15
15
|
return middlewares.sort((a, b) => getMiddlewarePriority(a) - getMiddlewarePriority(b));
|
|
16
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* Runs `middlewares` as an onion around `main`, ordered by priority (stable
|
|
19
|
+
* within a priority), and returns `main`'s result. A middleware that does not
|
|
20
|
+
* call `next` stops the chain: `main` is never run and the result is
|
|
21
|
+
* `undefined`.
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
17
24
|
export const runMiddleware = async (services, wire, middlewares, main) => {
|
|
18
25
|
const sorted = isSortedByPriority(middlewares)
|
|
19
26
|
? middlewares
|
|
@@ -60,10 +67,16 @@ export const addGlobalMiddleware = (middleware, packageName = null) => {
|
|
|
60
67
|
state.push(...middleware);
|
|
61
68
|
return middleware;
|
|
62
69
|
};
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
/**
|
|
71
|
+
* Wire-level middleware by name, from the namespace of the package whose
|
|
72
|
+
* metadata named it — the same namespace its tag and HTTP groups resolve from
|
|
73
|
+
* — and then from the application's, which is never narrower.
|
|
74
|
+
*/
|
|
75
|
+
const getMiddlewareByName = (name, packageName) => {
|
|
76
|
+
const own = pikkuState(packageName, 'misc', 'middleware')[name]?.[0];
|
|
77
|
+
if (own || packageName === null)
|
|
78
|
+
return own;
|
|
79
|
+
return pikkuState(null, 'misc', 'middleware')[name]?.[0];
|
|
67
80
|
};
|
|
68
81
|
/**
|
|
69
82
|
* Per-wire-type cap on the memoized middleware chains. The cache key is the
|
|
@@ -120,7 +133,10 @@ export const MIDDLEWARE_CACHE_MAX_ENTRIES = MIDDLEWARE_CACHE_MAX;
|
|
|
120
133
|
/** Current number of cached chains for a wire type. Test/observability only. */
|
|
121
134
|
export const middlewareCacheSize = (wireType) => middlewareCache[wireType].size;
|
|
122
135
|
export const combineMiddleware = (wireType, uid, { wireInheritedMiddleware, wireMiddleware, funcInheritedMiddleware, funcMiddleware, packageName = null, } = {}) => {
|
|
123
|
-
|
|
136
|
+
// A wire id is only unique within its package: an addon's `getUser` and the
|
|
137
|
+
// application's are different functions with different gates.
|
|
138
|
+
const cacheKey = packageName === null ? uid : `${packageName}\0${uid}`;
|
|
139
|
+
const cached = cacheGet(wireType, cacheKey);
|
|
124
140
|
if (cached) {
|
|
125
141
|
return cached;
|
|
126
142
|
}
|
|
@@ -150,7 +166,7 @@ export const combineMiddleware = (wireType, uid, { wireInheritedMiddleware, wire
|
|
|
150
166
|
}
|
|
151
167
|
}
|
|
152
168
|
else if (meta.type === 'wire') {
|
|
153
|
-
const middleware = getMiddlewareByName(meta.name);
|
|
169
|
+
const middleware = getMiddlewareByName(meta.name, packageName);
|
|
154
170
|
if (middleware) {
|
|
155
171
|
resolved.push(middleware);
|
|
156
172
|
}
|
|
@@ -175,5 +191,5 @@ export const combineMiddleware = (wireType, uid, { wireInheritedMiddleware, wire
|
|
|
175
191
|
resolved.push(...funcMiddleware);
|
|
176
192
|
}
|
|
177
193
|
sortByPriority(resolved);
|
|
178
|
-
return cacheSet(wireType,
|
|
194
|
+
return cacheSet(wireType, cacheKey, freezeDedupe(resolved));
|
|
179
195
|
};
|
package/dist/permissions.d.ts
CHANGED
|
@@ -23,6 +23,19 @@ export declare const runPermissions: ({ funcPermissions, services, wire, data, p
|
|
|
23
23
|
/** What the non-global gate is called in debug logs, e.g. 'function', 'agent'. */
|
|
24
24
|
label?: string;
|
|
25
25
|
}) => Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Decides, from the session alone, whether a function is worth offering to
|
|
28
|
+
* that session: only the `pikkuAuth` checks among the global and the given
|
|
29
|
+
* permissions are run, since they need no input. Resolves `true` when there
|
|
30
|
+
* are none or any one of them passes. Used to filter an agent's tools before
|
|
31
|
+
* the model sees them; it is not the enforcement point, which remains the full
|
|
32
|
+
* permission check when the function is called.
|
|
33
|
+
*
|
|
34
|
+
* @param funcPermissions - The live permission group from the function or
|
|
35
|
+
* agent config, never the generated metadata, which carries no functions.
|
|
36
|
+
* @param packageName - The package whose global permissions apply; `null` for
|
|
37
|
+
* the app.
|
|
38
|
+
*/
|
|
26
39
|
export declare const checkAuthPermissions: (
|
|
27
40
|
/** Must be the live permission group from the func/agent config, never metadata. */
|
|
28
41
|
funcPermissions: CorePermissionGroup | undefined, session: CoreUserSession, services: CoreServices, packageName?: string | null) => Promise<boolean>;
|
package/dist/permissions.js
CHANGED
|
@@ -93,6 +93,19 @@ export const runPermissions = async ({ funcPermissions, services, wire, data, pa
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
};
|
|
96
|
+
/**
|
|
97
|
+
* Decides, from the session alone, whether a function is worth offering to
|
|
98
|
+
* that session: only the `pikkuAuth` checks among the global and the given
|
|
99
|
+
* permissions are run, since they need no input. Resolves `true` when there
|
|
100
|
+
* are none or any one of them passes. Used to filter an agent's tools before
|
|
101
|
+
* the model sees them; it is not the enforcement point, which remains the full
|
|
102
|
+
* permission check when the function is called.
|
|
103
|
+
*
|
|
104
|
+
* @param funcPermissions - The live permission group from the function or
|
|
105
|
+
* agent config, never the generated metadata, which carries no functions.
|
|
106
|
+
* @param packageName - The package whose global permissions apply; `null` for
|
|
107
|
+
* the app.
|
|
108
|
+
*/
|
|
96
109
|
export const checkAuthPermissions = async (
|
|
97
110
|
/** Must be the live permission group from the func/agent config, never metadata. */
|
|
98
111
|
funcPermissions, session, services, packageName = null) => {
|
package/dist/pikku-state.d.ts
CHANGED
|
@@ -1,11 +1,60 @@
|
|
|
1
1
|
import type { PikkuPackageState } from './types/state.types.js';
|
|
2
2
|
import type { CoreSingletonServices, CreateWireServices } from './types/core.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Every package's registry, keyed by package name (`__main__` for the app).
|
|
5
|
+
* The map lives on `globalThis` under a registered symbol, so duplicate copies
|
|
6
|
+
* of `@pikku/core` in one process share it.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
3
9
|
export declare const getAllPackageStates: () => Map<string, PikkuPackageState>;
|
|
10
|
+
/**
|
|
11
|
+
* Reads, or with `value` replaces, one slot of a package's registry: the
|
|
12
|
+
* functions, wirings, metadata, middleware and services that generated code and
|
|
13
|
+
* the `wire*` helpers register at import time.
|
|
14
|
+
*
|
|
15
|
+
* This is framework plumbing, not app state. Generated bootstrap files and
|
|
16
|
+
* runtime adapters call it; application code should go through the `wire*`,
|
|
17
|
+
* `add*` and `define*` helpers instead, because writing a slot directly
|
|
18
|
+
* bypasses the validation they do.
|
|
19
|
+
*
|
|
20
|
+
* @param packageName - The package whose registry to use; `null` means the app.
|
|
21
|
+
* The registry is created on first use.
|
|
22
|
+
* @param type - The area, such as `'function'`, `'http'` or `'misc'`.
|
|
23
|
+
* @param content - The slot within that area.
|
|
24
|
+
* @param value - When given, replaces the slot. `undefined` cannot be stored;
|
|
25
|
+
* it always reads.
|
|
26
|
+
* @returns The slot's current value.
|
|
27
|
+
*/
|
|
4
28
|
export declare const pikkuState: <Type extends keyof PikkuPackageState, Content extends keyof PikkuPackageState[Type]>(packageName: string | null, type: Type, content: Content, value?: PikkuPackageState[Type][Content]) => PikkuPackageState[Type][Content];
|
|
29
|
+
/**
|
|
30
|
+
* Creates an empty registry for `packageName` if it has none yet; an existing
|
|
31
|
+
* one is left untouched.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
5
34
|
export declare const initializePikkuState: (packageName: string) => void;
|
|
35
|
+
/**
|
|
36
|
+
* Discards every package's registry and starts the app's afresh. Registered
|
|
37
|
+
* error classes are carried over, because they come from module side effects
|
|
38
|
+
* that will not run again. Meant for tests.
|
|
39
|
+
*/
|
|
6
40
|
export declare const resetPikkuState: () => void;
|
|
41
|
+
/**
|
|
42
|
+
* The app's singleton services, as registered by the generated bootstrap or a
|
|
43
|
+
* runtime adapter.
|
|
44
|
+
* @throws {Error} When none have been registered yet.
|
|
45
|
+
*/
|
|
7
46
|
export declare const getSingletonServices: () => CoreSingletonServices;
|
|
47
|
+
/** Registers the app's singleton services, replacing any registered before. */
|
|
8
48
|
export declare const setSingletonServices: (services: CoreSingletonServices) => void;
|
|
49
|
+
/**
|
|
50
|
+
* The app's registered `createWireServices` factory, if it has one.
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
9
53
|
export declare const getCreateWireServices: () => CreateWireServices | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Registers the service factories for a package (an addon), replacing any
|
|
56
|
+
* registered before.
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
10
59
|
export declare const addPackageServiceFactories: (packageName: string, factories: NonNullable<PikkuPackageState['package']['factories']>) => void;
|
|
11
60
|
export type { PikkuPackageState } from './types/state.types.js';
|
package/dist/pikku-state.js
CHANGED
|
@@ -5,6 +5,12 @@ const PIKKU_STATE_KEY = Symbol.for('@pikku/core/state');
|
|
|
5
5
|
* access.
|
|
6
6
|
*/
|
|
7
7
|
const stateHost = globalThis;
|
|
8
|
+
/**
|
|
9
|
+
* Every package's registry, keyed by package name (`__main__` for the app).
|
|
10
|
+
* The map lives on `globalThis` under a registered symbol, so duplicate copies
|
|
11
|
+
* of `@pikku/core` in one process share it.
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
8
14
|
export const getAllPackageStates = () => {
|
|
9
15
|
let states = stateHost[PIKKU_STATE_KEY];
|
|
10
16
|
if (!states) {
|
|
@@ -13,6 +19,24 @@ export const getAllPackageStates = () => {
|
|
|
13
19
|
}
|
|
14
20
|
return states;
|
|
15
21
|
};
|
|
22
|
+
/**
|
|
23
|
+
* Reads, or with `value` replaces, one slot of a package's registry: the
|
|
24
|
+
* functions, wirings, metadata, middleware and services that generated code and
|
|
25
|
+
* the `wire*` helpers register at import time.
|
|
26
|
+
*
|
|
27
|
+
* This is framework plumbing, not app state. Generated bootstrap files and
|
|
28
|
+
* runtime adapters call it; application code should go through the `wire*`,
|
|
29
|
+
* `add*` and `define*` helpers instead, because writing a slot directly
|
|
30
|
+
* bypasses the validation they do.
|
|
31
|
+
*
|
|
32
|
+
* @param packageName - The package whose registry to use; `null` means the app.
|
|
33
|
+
* The registry is created on first use.
|
|
34
|
+
* @param type - The area, such as `'function'`, `'http'` or `'misc'`.
|
|
35
|
+
* @param content - The slot within that area.
|
|
36
|
+
* @param value - When given, replaces the slot. `undefined` cannot be stored;
|
|
37
|
+
* it always reads.
|
|
38
|
+
* @returns The slot's current value.
|
|
39
|
+
*/
|
|
16
40
|
export const pikkuState = (packageName, type, content, value) => {
|
|
17
41
|
const resolvedPackageName = packageName ?? '__main__';
|
|
18
42
|
if (!getAllPackageStates().has(resolvedPackageName)) {
|
|
@@ -125,11 +149,21 @@ const createEmptyPackageState = () => ({
|
|
|
125
149
|
declaredSecrets: null,
|
|
126
150
|
},
|
|
127
151
|
});
|
|
152
|
+
/**
|
|
153
|
+
* Creates an empty registry for `packageName` if it has none yet; an existing
|
|
154
|
+
* one is left untouched.
|
|
155
|
+
* @internal
|
|
156
|
+
*/
|
|
128
157
|
export const initializePikkuState = (packageName) => {
|
|
129
158
|
if (!getAllPackageStates().has(packageName)) {
|
|
130
159
|
getAllPackageStates().set(packageName, createEmptyPackageState());
|
|
131
160
|
}
|
|
132
161
|
};
|
|
162
|
+
/**
|
|
163
|
+
* Discards every package's registry and starts the app's afresh. Registered
|
|
164
|
+
* error classes are carried over, because they come from module side effects
|
|
165
|
+
* that will not run again. Meant for tests.
|
|
166
|
+
*/
|
|
133
167
|
export const resetPikkuState = () => {
|
|
134
168
|
// Error definitions come from module-import side effects that never re-run.
|
|
135
169
|
const existingErrors = getAllPackageStates().get('__main__')?.misc.errors;
|
|
@@ -143,18 +177,33 @@ export const resetPikkuState = () => {
|
|
|
143
177
|
if (!getAllPackageStates().has('__main__')) {
|
|
144
178
|
resetPikkuState();
|
|
145
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* The app's singleton services, as registered by the generated bootstrap or a
|
|
182
|
+
* runtime adapter.
|
|
183
|
+
* @throws {Error} When none have been registered yet.
|
|
184
|
+
*/
|
|
146
185
|
export const getSingletonServices = () => {
|
|
147
186
|
const services = pikkuState(null, 'package', 'singletonServices');
|
|
148
187
|
if (!services)
|
|
149
188
|
throw new Error('Singleton services not initialized');
|
|
150
189
|
return services;
|
|
151
190
|
};
|
|
191
|
+
/** Registers the app's singleton services, replacing any registered before. */
|
|
152
192
|
export const setSingletonServices = (services) => {
|
|
153
193
|
pikkuState(null, 'package', 'singletonServices', services);
|
|
154
194
|
};
|
|
195
|
+
/**
|
|
196
|
+
* The app's registered `createWireServices` factory, if it has one.
|
|
197
|
+
* @internal
|
|
198
|
+
*/
|
|
155
199
|
export const getCreateWireServices = () => {
|
|
156
200
|
return pikkuState(null, 'package', 'factories')?.createWireServices;
|
|
157
201
|
};
|
|
202
|
+
/**
|
|
203
|
+
* Registers the service factories for a package (an addon), replacing any
|
|
204
|
+
* registered before.
|
|
205
|
+
* @internal
|
|
206
|
+
*/
|
|
158
207
|
export const addPackageServiceFactories = (packageName, factories) => {
|
|
159
208
|
pikkuState(packageName, 'package', 'factories', factories);
|
|
160
209
|
};
|
package/dist/remote.js
CHANGED
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
import { assertStrongKeyMaterial, encryptWithKeyMaterial, REMOTE_SESSION_INFO, } from './crypto-utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* An unset secret means remote auth is not configured, so the call goes out
|
|
4
|
+
* unauthenticated. A secrets backend that fails is a different thing: sending
|
|
5
|
+
* the call anyway would only earn a 401 from the peer with no hint why.
|
|
6
|
+
*/
|
|
7
|
+
const readRemoteSecret = async (secrets) => {
|
|
8
|
+
if (!secrets) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
if (!(await secrets.hasSecret('PIKKU_REMOTE_SECRET'))) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
return (await secrets.getSecret('PIKKU_REMOTE_SECRET')).reveal();
|
|
16
|
+
}
|
|
17
|
+
catch (cause) {
|
|
18
|
+
throw new Error('Could not read PIKKU_REMOTE_SECRET from the secrets service; refusing to send an unauthenticated remote call', { cause });
|
|
19
|
+
}
|
|
20
|
+
};
|
|
2
21
|
/**
|
|
3
22
|
* Authorization headers carrying a JWT-signed session and traceId for
|
|
4
23
|
* `pikkuRemoteAuthMiddleware` on the receiving end. Used by every deployment
|
|
@@ -9,11 +28,7 @@ export async function buildRemoteHeaders(jwt, secrets, funcName, session, traceI
|
|
|
9
28
|
'content-type': 'application/json',
|
|
10
29
|
...(traceId && { 'x-request-id': traceId }),
|
|
11
30
|
};
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
secret = (await secrets?.getSecret('PIKKU_REMOTE_SECRET'))?.reveal();
|
|
15
|
-
}
|
|
16
|
-
catch { }
|
|
31
|
+
const secret = await readRemoteSecret(secrets);
|
|
17
32
|
if (secret && jwt) {
|
|
18
33
|
assertStrongKeyMaterial('PIKKU_REMOTE_SECRET', secret);
|
|
19
34
|
const sessionEnc = session
|
package/dist/schema.d.ts
CHANGED
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
import type { Logger } from './services/logger.js';
|
|
2
2
|
import type { SchemaService } from './services/schema-service.js';
|
|
3
|
+
/**
|
|
4
|
+
* Registers a JSON Schema by name for a package. Generated schema files call
|
|
5
|
+
* this; a module's `default` export is unwrapped.
|
|
6
|
+
*
|
|
7
|
+
* @param name - The schema name functions' metadata refers to.
|
|
8
|
+
* @param value - The schema, or a module whose `default` is the schema.
|
|
9
|
+
* @param packageName - The addon package; `null` for the app.
|
|
10
|
+
*/
|
|
3
11
|
export declare const addSchema: (name: string, value: any, packageName?: string | null) => void;
|
|
12
|
+
/** The JSON Schema registered under `name` for a package, if any. */
|
|
4
13
|
export declare const getSchema: (name: string, packageName?: string | null) => Record<string, unknown> | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Hands every registered schema, for the app and every addon, to the schema
|
|
16
|
+
* service to compile, then logs an error for each HTTP route whose input
|
|
17
|
+
* schema did not load. A schema that fails to compile is logged, not thrown.
|
|
18
|
+
*
|
|
19
|
+
* @param schemaService - Defaults to the registered singleton services' `schema`.
|
|
20
|
+
* @throws {Error} When no schema service is given or registered.
|
|
21
|
+
*/
|
|
5
22
|
export declare const compileAllSchemas: (logger: Logger, schemaService?: SchemaService) => void;
|
|
6
23
|
/**
|
|
7
24
|
* Fills in absent top-level properties from their schema `default`. Applied
|
|
@@ -11,5 +28,24 @@ export declare const compileAllSchemas: (logger: Logger, schemaService?: SchemaS
|
|
|
11
28
|
* or array default is never shared as one mutable instance across requests.
|
|
12
29
|
*/
|
|
13
30
|
export declare const applyDefaultsFromSchema: (schemaName: string, data: any, packageName?: string | null) => any;
|
|
31
|
+
/**
|
|
32
|
+
* Converts top-level string values to the type their schema property declares,
|
|
33
|
+
* for transports that only carry text (query strings, argv): comma-separated
|
|
34
|
+
* strings to arrays, `date-time` strings to `Date`, and numeric strings to
|
|
35
|
+
* numbers only when the number prints back as the identical text. Mutates
|
|
36
|
+
* `data` in place; anything it cannot convert exactly is left for the
|
|
37
|
+
* validator to reject.
|
|
38
|
+
*/
|
|
14
39
|
export declare const coerceTopLevelDataFromSchema: (schemaName: string, data: any, packageName?: string | null) => void;
|
|
40
|
+
/**
|
|
41
|
+
* Validates `data` against a registered schema, throwing on failure.
|
|
42
|
+
*
|
|
43
|
+
* Without a schema service this does nothing at all, so an app that wires no
|
|
44
|
+
* `schema` service runs functions on unvalidated input. With one, a function
|
|
45
|
+
* that declares no input schema refuses any non-empty data.
|
|
46
|
+
*
|
|
47
|
+
* @throws {UnprocessableContentError} Data was passed where no schema is declared.
|
|
48
|
+
* @throws {MissingSchemaError} The named schema was never registered.
|
|
49
|
+
* Validation failures are thrown by the schema service itself.
|
|
50
|
+
*/
|
|
15
51
|
export declare const validateSchema: (logger: Logger, schemaService: SchemaService | undefined, schemaName: string | undefined | null, data: any, packageName?: string | null) => Promise<void>;
|
package/dist/schema.js
CHANGED
|
@@ -1,13 +1,30 @@
|
|
|
1
1
|
import { MissingSchemaError, UnprocessableContentError, } from './errors/errors.js';
|
|
2
2
|
import { pikkuState, getAllPackageStates } from './pikku-state.js';
|
|
3
3
|
const schemaKey = (name, packageName) => packageName ? `${packageName}:${name}` : name;
|
|
4
|
+
/**
|
|
5
|
+
* Registers a JSON Schema by name for a package. Generated schema files call
|
|
6
|
+
* this; a module's `default` export is unwrapped.
|
|
7
|
+
*
|
|
8
|
+
* @param name - The schema name functions' metadata refers to.
|
|
9
|
+
* @param value - The schema, or a module whose `default` is the schema.
|
|
10
|
+
* @param packageName - The addon package; `null` for the app.
|
|
11
|
+
*/
|
|
4
12
|
export const addSchema = (name, value, packageName = null) => {
|
|
5
13
|
const schema = value?.default ?? value;
|
|
6
14
|
pikkuState(packageName, 'misc', 'schemas').set(name, schema);
|
|
7
15
|
};
|
|
16
|
+
/** The JSON Schema registered under `name` for a package, if any. */
|
|
8
17
|
export const getSchema = (name, packageName = null) => {
|
|
9
18
|
return pikkuState(packageName, 'misc', 'schemas').get(name);
|
|
10
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* Hands every registered schema, for the app and every addon, to the schema
|
|
22
|
+
* service to compile, then logs an error for each HTTP route whose input
|
|
23
|
+
* schema did not load. A schema that fails to compile is logged, not thrown.
|
|
24
|
+
*
|
|
25
|
+
* @param schemaService - Defaults to the registered singleton services' `schema`.
|
|
26
|
+
* @throws {Error} When no schema service is given or registered.
|
|
27
|
+
*/
|
|
11
28
|
export const compileAllSchemas = (logger, schemaService) => {
|
|
12
29
|
if (!schemaService) {
|
|
13
30
|
schemaService = pikkuState(null, 'package', 'singletonServices')?.schema;
|
|
@@ -114,6 +131,14 @@ const coerceNumeric = (value, integer) => {
|
|
|
114
131
|
return value;
|
|
115
132
|
return parsed;
|
|
116
133
|
};
|
|
134
|
+
/**
|
|
135
|
+
* Converts top-level string values to the type their schema property declares,
|
|
136
|
+
* for transports that only carry text (query strings, argv): comma-separated
|
|
137
|
+
* strings to arrays, `date-time` strings to `Date`, and numeric strings to
|
|
138
|
+
* numbers only when the number prints back as the identical text. Mutates
|
|
139
|
+
* `data` in place; anything it cannot convert exactly is left for the
|
|
140
|
+
* validator to reject.
|
|
141
|
+
*/
|
|
117
142
|
export const coerceTopLevelDataFromSchema = (schemaName, data, packageName = null) => {
|
|
118
143
|
const schema = pikkuState(packageName, 'misc', 'schemas').get(schemaName);
|
|
119
144
|
if (!schema?.properties)
|
|
@@ -173,6 +198,17 @@ const stripUndefinedValues = (value) => {
|
|
|
173
198
|
.filter(([, entry]) => entry !== undefined)
|
|
174
199
|
.map(([key, entry]) => [key, stripUndefinedValues(entry)]));
|
|
175
200
|
};
|
|
201
|
+
/**
|
|
202
|
+
* Validates `data` against a registered schema, throwing on failure.
|
|
203
|
+
*
|
|
204
|
+
* Without a schema service this does nothing at all, so an app that wires no
|
|
205
|
+
* `schema` service runs functions on unvalidated input. With one, a function
|
|
206
|
+
* that declares no input schema refuses any non-empty data.
|
|
207
|
+
*
|
|
208
|
+
* @throws {UnprocessableContentError} Data was passed where no schema is declared.
|
|
209
|
+
* @throws {MissingSchemaError} The named schema was never registered.
|
|
210
|
+
* Validation failures are thrown by the schema service itself.
|
|
211
|
+
*/
|
|
176
212
|
export const validateSchema = async (logger, schemaService, schemaName, data, packageName = null) => {
|
|
177
213
|
if (schemaService) {
|
|
178
214
|
if (!schemaName) {
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import type { AgentRunState, PendingApproval } from '../wirings/agent/agent.types.js';
|
|
2
2
|
import type { AgentRunScore } from '../wirings/agent-scorer/agent-scorer.types.js';
|
|
3
|
+
/** A run as it is first recorded; the store assigns the `runId`. */
|
|
3
4
|
export type CreateRunInput = Omit<AgentRunState, 'runId'>;
|
|
5
|
+
/** A scorer's grade as it is saved; the store stamps `createdAt`. */
|
|
4
6
|
export type SaveScoreInput = Omit<AgentRunScore, 'createdAt'>;
|
|
7
|
+
/**
|
|
8
|
+
* Persists agent runs between steps, so a run that stops for a tool approval
|
|
9
|
+
* can be resumed later, possibly by another process. Implementations must make
|
|
10
|
+
* {@link AgentRunStateService.resolveApproval} atomic: it is what stops one
|
|
11
|
+
* approval from executing a tool twice.
|
|
12
|
+
*/
|
|
5
13
|
export interface AgentRunStateService {
|
|
6
14
|
createRun(run: CreateRunInput): Promise<string>;
|
|
7
15
|
updateRun(runId: string, updates: Partial<AgentRunState>): Promise<void>;
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { AgentMessage, AgentStep, AgentToolDef, AgentStreamChannel } from '../wirings/agent/agent.types.js';
|
|
2
2
|
export type AIProviderOptions = Record<string, Record<string, unknown>>;
|
|
3
|
+
/**
|
|
4
|
+
* One model call as `runAgent` and `streamAgent` hand it to an {@link
|
|
5
|
+
* AgentRunnerService}: the resolved model, instructions, conversation so far
|
|
6
|
+
* and the tools the agent may call.
|
|
7
|
+
*/
|
|
3
8
|
export type AgentRunnerParams = {
|
|
4
9
|
model: string;
|
|
5
10
|
temperature?: number;
|
|
@@ -33,6 +38,10 @@ export type AgentRunnerParams = {
|
|
|
33
38
|
*/
|
|
34
39
|
providerOptions?: AIProviderOptions;
|
|
35
40
|
};
|
|
41
|
+
/**
|
|
42
|
+
* The outcome of a whole agent run: the final text (or structured `object` when
|
|
43
|
+
* an output schema was set), every step taken, and summed token usage.
|
|
44
|
+
*/
|
|
36
45
|
export type AgentRunnerResult = {
|
|
37
46
|
text: string;
|
|
38
47
|
object?: unknown;
|
|
@@ -42,6 +51,10 @@ export type AgentRunnerResult = {
|
|
|
42
51
|
outputTokens: number;
|
|
43
52
|
};
|
|
44
53
|
};
|
|
54
|
+
/**
|
|
55
|
+
* What one model step produced: text, the tool calls it made and their results,
|
|
56
|
+
* token usage, and why the model stopped.
|
|
57
|
+
*/
|
|
45
58
|
export type AgentStepResult = {
|
|
46
59
|
text: string;
|
|
47
60
|
object?: unknown;
|
|
@@ -205,6 +218,17 @@ export type AIRerankResult<VALUE extends string | Record<string, unknown>> = {
|
|
|
205
218
|
providerMetadata?: Record<string, unknown>;
|
|
206
219
|
response?: unknown;
|
|
207
220
|
};
|
|
221
|
+
/**
|
|
222
|
+
* The bridge from pikku agents to an LLM SDK (for example `@pikku/ai-vercel`).
|
|
223
|
+
* The agent runner calls `run` or `stream` once per step and executes the
|
|
224
|
+
* returned tool calls itself, so approval, permission and tool-scoping checks
|
|
225
|
+
* stay in pikku rather than in the SDK.
|
|
226
|
+
*
|
|
227
|
+
* `stream` must write deltas to the channel as they arrive and resolve with the
|
|
228
|
+
* same step result `run` would return. The media methods (`transcribe`,
|
|
229
|
+
* `generateSpeech`, `generateImage`, `embed`, `embedMany`, `rerank`) are
|
|
230
|
+
* optional; a runner without one makes the matching agent feature unavailable.
|
|
231
|
+
*/
|
|
208
232
|
export interface AgentRunnerService {
|
|
209
233
|
stream(params: AgentRunnerParams, channel: AgentStreamChannel): Promise<AgentStepResult>;
|
|
210
234
|
run(params: AgentRunnerParams): Promise<AgentStepResult>;
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import type { AgentThread, AgentMessage } from '../wirings/agent/agent.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Agent memory: conversation threads, their messages, and working memory kept
|
|
4
|
+
* per thread or per resource (usually the user).
|
|
5
|
+
*
|
|
6
|
+
* The agent runner reads the last messages of a thread before each run and
|
|
7
|
+
* saves the new ones after it. This service does not check access; callers that
|
|
8
|
+
* expose threads to users should check ownership first (see `canAccessThread`).
|
|
9
|
+
*/
|
|
2
10
|
export interface AgentStorageService {
|
|
3
11
|
createThread(resourceId: string, options?: {
|
|
4
12
|
threadId?: string;
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import type { CoreUserSession, PikkuWire, PikkuWiringTypes } from '../types/core.types.js';
|
|
2
2
|
import type { Logger } from './logger.js';
|
|
3
3
|
import type { Safe } from '../classification/secret-value.js';
|
|
4
|
+
/**
|
|
5
|
+
* `best-effort` buffers events and writes them when the invocation closes,
|
|
6
|
+
* logging (not throwing) on failure; `transactional` writes each event before
|
|
7
|
+
* `write` resolves, so a failed write fails the function.
|
|
8
|
+
*/
|
|
4
9
|
export type AuditDurability = 'best-effort' | 'transactional';
|
|
5
10
|
export type AuditOutcome = 'success' | 'failed' | 'denied';
|
|
6
11
|
export type AuditSource = 'auto' | 'explicit';
|
|
12
|
+
/**
|
|
13
|
+
* A function's `audit` setting: `true` for best-effort auditing, or an object
|
|
14
|
+
* choosing the durability.
|
|
15
|
+
*/
|
|
7
16
|
export type AuditConfig = boolean | {
|
|
8
17
|
durability?: AuditDurability;
|
|
9
18
|
};
|
|
19
|
+
/** An {@link AuditConfig} with its defaults filled in. */
|
|
10
20
|
export type ResolvedAuditConfig = {
|
|
11
21
|
durability: AuditDurability;
|
|
12
22
|
};
|
|
@@ -27,6 +37,11 @@ export type AuditUserIdentity = {
|
|
|
27
37
|
orgId?: string;
|
|
28
38
|
pikkuUserId?: string;
|
|
29
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* One entry in the audit trail. The invocation fields (`functionId`,
|
|
42
|
+
* `wireType`, `traceId`, `userIdentity`) are filled in from the wire when an
|
|
43
|
+
* event is written through an {@link AuditLog}.
|
|
44
|
+
*/
|
|
30
45
|
export type AuditEvent = {
|
|
31
46
|
eventId?: string;
|
|
32
47
|
type: string;
|
|
@@ -43,6 +58,7 @@ export type AuditEvent = {
|
|
|
43
58
|
input?: unknown;
|
|
44
59
|
metadata?: Record<string, unknown>;
|
|
45
60
|
};
|
|
61
|
+
/** Events flushed together at the end of a best-effort invocation. */
|
|
46
62
|
export type AuditEventBatch = AuditEvent[];
|
|
47
63
|
/**
|
|
48
64
|
* A page of the trail, newest first, narrowed by the filters a reader picked.
|
|
@@ -76,6 +92,7 @@ export type AuditFacets = {
|
|
|
76
92
|
userIds: string[];
|
|
77
93
|
types: string[];
|
|
78
94
|
};
|
|
95
|
+
/** One page of audit events returned by {@link AuditService.query}. */
|
|
79
96
|
export type AuditQueryResult = {
|
|
80
97
|
events: AuditEvent[];
|
|
81
98
|
/** Offset of the next page, or `null` at the end. */
|
|
@@ -83,6 +100,15 @@ export type AuditQueryResult = {
|
|
|
83
100
|
/** Present only when the caller asked for it — it costs two extra scans. */
|
|
84
101
|
facets?: AuditFacets;
|
|
85
102
|
};
|
|
103
|
+
/**
|
|
104
|
+
* The durable sink for audit events, provided as the `audit` singleton service.
|
|
105
|
+
* Functions do not call it directly: they write through the per-invocation
|
|
106
|
+
* {@link AuditLog} from {@link createInvocationAudit}, which adds the caller's
|
|
107
|
+
* identity and applies the function's durability.
|
|
108
|
+
*
|
|
109
|
+
* `write` takes a whole batch when the sink supports it; otherwise events go
|
|
110
|
+
* through `audit` one at a time.
|
|
111
|
+
*/
|
|
86
112
|
export interface AuditService {
|
|
87
113
|
audit(event: AuditEvent): Promise<void>;
|
|
88
114
|
write?(batch: AuditEventBatch): Promise<void>;
|
|
@@ -96,6 +122,12 @@ export interface AuditService {
|
|
|
96
122
|
/** Distinct users and types across the whole trail. Paired with {@link query}. */
|
|
97
123
|
facets?(): Promise<AuditFacets>;
|
|
98
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* An audit sink that discards every event. Use it for local development and
|
|
127
|
+
* tests where no trail is kept; it has no read side.
|
|
128
|
+
*
|
|
129
|
+
* @example snippet: shopServices
|
|
130
|
+
*/
|
|
99
131
|
export declare class NoopAuditService implements AuditService {
|
|
100
132
|
audit(_event: AuditEvent): Promise<void>;
|
|
101
133
|
write(_batch: AuditEventBatch): Promise<void>;
|
|
@@ -117,5 +149,21 @@ export interface AuditLog {
|
|
|
117
149
|
close(): Promise<void>;
|
|
118
150
|
}
|
|
119
151
|
export declare const resolveAuditConfig: (config?: AuditConfig) => ResolvedAuditConfig | undefined;
|
|
152
|
+
/**
|
|
153
|
+
* Creates the {@link AuditLog} for one invocation, normally from your
|
|
154
|
+
* wire-services factory.
|
|
155
|
+
*
|
|
156
|
+
* When the function did not opt in with `audit`, the returned log drops every
|
|
157
|
+
* write and logs a warning once, so a missing opt-in is visible rather than
|
|
158
|
+
* silent.
|
|
159
|
+
*
|
|
160
|
+
* @param service - the singleton audit sink
|
|
161
|
+
* @param wire - the invocation's wire, which supplies the audit config and the
|
|
162
|
+
* caller's identity
|
|
163
|
+
* @param logger - used for the dropped-write warning when the wire has no
|
|
164
|
+
* logger
|
|
165
|
+
*
|
|
166
|
+
* @example snippet: shopWireServices
|
|
167
|
+
*/
|
|
120
168
|
export declare const createInvocationAudit: (service: AuditService, wire: PikkuWire<any, any, any, CoreUserSession>, logger?: Logger) => AuditLog;
|
|
121
169
|
export declare const resolveAuditUserIdentityFromWire: (wire: PikkuWire<any, any, any, CoreUserSession>) => AuditUserIdentity | undefined;
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An audit sink that discards every event. Use it for local development and
|
|
3
|
+
* tests where no trail is kept; it has no read side.
|
|
4
|
+
*
|
|
5
|
+
* @example snippet: shopServices
|
|
6
|
+
*/
|
|
1
7
|
export class NoopAuditService {
|
|
2
8
|
async audit(_event) { }
|
|
3
9
|
async write(_batch) { }
|
|
@@ -92,6 +98,22 @@ export const resolveAuditConfig = (config) => {
|
|
|
92
98
|
durability: config.durability ?? 'best-effort',
|
|
93
99
|
};
|
|
94
100
|
};
|
|
101
|
+
/**
|
|
102
|
+
* Creates the {@link AuditLog} for one invocation, normally from your
|
|
103
|
+
* wire-services factory.
|
|
104
|
+
*
|
|
105
|
+
* When the function did not opt in with `audit`, the returned log drops every
|
|
106
|
+
* write and logs a warning once, so a missing opt-in is visible rather than
|
|
107
|
+
* silent.
|
|
108
|
+
*
|
|
109
|
+
* @param service - the singleton audit sink
|
|
110
|
+
* @param wire - the invocation's wire, which supplies the audit config and the
|
|
111
|
+
* caller's identity
|
|
112
|
+
* @param logger - used for the dropped-write warning when the wire has no
|
|
113
|
+
* logger
|
|
114
|
+
*
|
|
115
|
+
* @example snippet: shopWireServices
|
|
116
|
+
*/
|
|
95
117
|
export const createInvocationAudit = (service, wire, logger) => {
|
|
96
118
|
if (!wire.audit) {
|
|
97
119
|
return new DisabledInvocationAudit(wire, logger);
|