@pikku/core 0.12.143 → 0.12.144
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/analytics.d.ts +14 -0
- package/dist/analytics/analytics.js +14 -0
- package/dist/analytics/analytics.types.d.ts +1 -0
- package/dist/analytics/anonymous-analytics-identity.d.ts +1 -0
- package/dist/analytics/cookie-analytics-identity.d.ts +1 -0
- package/dist/analytics/mint-cookie.d.ts +1 -0
- package/dist/{wirings/channel/channel-middleware-runner.d.ts → channel-middleware-runner.d.ts} +17 -3
- package/dist/{wirings/channel/channel-middleware-runner.js → channel-middleware-runner.js} +24 -8
- package/dist/classification/data-classification.d.ts +13 -0
- package/dist/classification/secret-value.d.ts +7 -0
- package/dist/classification/secret-value.js +7 -0
- package/dist/crypto-utils.d.ts +93 -0
- package/dist/crypto-utils.js +92 -0
- package/dist/dev/hot-reload.d.ts +16 -0
- package/dist/dev/hot-reload.js +16 -1
- package/dist/dev/module-runner.js +7 -3
- package/dist/dev/reload-meta.js +1 -1
- package/dist/errors/error-handler.d.ts +9 -0
- package/dist/errors/error-handler.js +8 -0
- package/dist/errors/errors.d.ts +219 -0
- package/dist/errors/errors.js +227 -0
- package/dist/errors/serialized-error.d.ts +4 -0
- package/dist/function/abort-scope.d.ts +5 -0
- package/dist/function/function-meta.types.d.ts +20 -0
- package/dist/function/function-runner.d.ts +41 -0
- package/dist/function/function-runner.js +57 -11
- package/dist/function/functions.types.d.ts +59 -0
- package/dist/function/functions.types.js +23 -0
- package/dist/function/list.types.d.ts +4 -0
- package/dist/lifecycle.d.ts +12 -1
- package/dist/lifecycle.js +12 -1
- package/dist/middleware/addon-scope-cap.d.ts +4 -0
- package/dist/middleware/addon-scope-cap.js +7 -3
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.js +5 -13
- package/dist/middleware/auth-cookie.js +3 -3
- package/dist/middleware/middleware-factories.d.ts +17 -0
- package/dist/middleware/middleware-factories.js +17 -0
- package/dist/middleware/middleware.types.d.ts +23 -0
- package/dist/middleware/remote-auth.d.ts +15 -0
- package/dist/middleware/remote-auth.js +18 -3
- package/dist/middleware/remote-jobs-secret.js +2 -10
- package/dist/middleware-runner.d.ts +7 -0
- package/dist/middleware-runner.js +23 -7
- package/dist/permissions.d.ts +13 -0
- package/dist/permissions.js +13 -0
- package/dist/pikku-state.d.ts +49 -0
- package/dist/pikku-state.js +49 -0
- package/dist/remote.js +20 -5
- package/dist/schema.d.ts +36 -0
- package/dist/schema.js +36 -0
- package/dist/services/agent-run-state-service.d.ts +8 -0
- package/dist/services/agent-runner-service.d.ts +24 -0
- package/dist/services/agent-storage-service.d.ts +8 -0
- package/dist/services/ai-embedding-service.d.ts +4 -0
- package/dist/services/audit-service.d.ts +48 -0
- package/dist/services/audit-service.js +22 -0
- package/dist/services/content-service.d.ts +34 -0
- package/dist/services/credential-wire-service.d.ts +9 -0
- package/dist/services/credential-wire-service.js +9 -0
- package/dist/services/deployment-service.d.ts +14 -0
- package/dist/services/email-service.d.ts +20 -0
- package/dist/services/email-template.d.ts +24 -0
- package/dist/services/email-template.js +12 -0
- package/dist/services/file-scenario-run-store.d.ts +5 -0
- package/dist/services/file-scenario-run-store.js +4 -0
- package/dist/services/gateway-service.d.ts +5 -0
- package/dist/services/in-memory-agent-run-state-service.d.ts +5 -0
- package/dist/services/in-memory-agent-run-state-service.js +5 -0
- package/dist/services/in-memory-lease-service.d.ts +5 -0
- package/dist/services/in-memory-lease-service.js +5 -0
- package/dist/services/in-memory-session-store.d.ts +4 -0
- package/dist/services/in-memory-session-store.js +4 -0
- package/dist/services/incoming-webhook-queue.d.ts +2 -0
- package/dist/services/incoming-webhook-queue.js +2 -0
- package/dist/services/incoming-webhook-service.d.ts +9 -1
- package/dist/services/incoming-webhook-service.js +1 -1
- package/dist/services/index.d.ts +1 -5
- package/dist/services/index.js +1 -5
- package/dist/services/jwt-service.d.ts +8 -0
- package/dist/services/lease-service.d.ts +5 -0
- package/dist/services/lease-service.js +1 -0
- package/dist/services/local-content-request-handler.d.ts +20 -0
- package/dist/services/local-content-request-handler.js +11 -0
- package/dist/services/local-content.d.ts +45 -0
- package/dist/services/local-content.js +35 -0
- package/dist/services/local-credential-service.d.ts +5 -0
- package/dist/services/local-credential-service.js +5 -0
- package/dist/services/local-email-service.d.ts +7 -0
- package/dist/services/local-email-service.js +7 -0
- package/dist/services/local-secrets.d.ts +8 -0
- package/dist/services/local-secrets.js +8 -0
- package/dist/services/local-variables.d.ts +6 -0
- package/dist/services/local-variables.js +6 -0
- package/dist/services/logger.d.ts +4 -0
- package/dist/services/logger.js +4 -0
- package/dist/services/meta-service.d.ts +38 -0
- package/dist/services/meta-service.js +6 -0
- package/dist/services/queue-webhook-service.d.ts +19 -0
- package/dist/services/queue-webhook-service.js +19 -0
- package/dist/services/remote-jobs.d.ts +8 -13
- package/dist/services/remote-jobs.js +3 -54
- package/dist/services/scenario-cookie-jar.d.ts +4 -0
- package/dist/services/scheduler-service.d.ts +13 -0
- package/dist/services/scheduler-service.js +8 -0
- package/dist/services/schema-service.d.ts +9 -0
- package/dist/services/scope-service.d.ts +10 -0
- package/dist/services/scoped-secret-service.d.ts +5 -0
- package/dist/services/scoped-secret-service.js +5 -0
- package/dist/services/secret-host-binding.d.ts +5 -0
- package/dist/services/secret-host-binding.js +5 -0
- package/dist/services/secret-service.d.ts +19 -1
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +6 -0
- package/dist/services/session-store.d.ts +5 -0
- package/dist/services/stub-tracker.d.ts +1 -0
- package/dist/services/temporary-file-service.d.ts +9 -0
- package/dist/services/temporary-file-service.js +9 -0
- package/dist/services/trigger-service.d.ts +4 -0
- package/dist/services/trigger-source-store.d.ts +13 -0
- package/dist/services/trigger-source-store.js +7 -0
- package/dist/services/typed-credential-service.d.ts +6 -0
- package/dist/services/typed-credential-service.js +5 -0
- package/dist/services/typed-secret-service.d.ts +12 -0
- package/dist/services/typed-secret-service.js +11 -0
- package/dist/services/typed-variables-service.d.ts +1 -0
- package/dist/services/user-session-service.d.ts +31 -1
- package/dist/services/user-session-service.js +29 -3
- package/dist/services/v8-coverage-service.d.ts +27 -0
- package/dist/services/v8-coverage-service.js +5 -0
- package/dist/services/variables-service.d.ts +8 -0
- package/dist/services/virtual-user-sign-in.d.ts +1 -0
- package/dist/services/virtual-user-statement.d.ts +8 -0
- package/dist/services/virtual-user-statement.js +4 -0
- package/dist/services/webhook-service.d.ts +25 -0
- package/dist/services/webhook-service.js +15 -0
- package/dist/services/workflow-service.d.ts +6 -0
- package/dist/test-utils.js +1 -1
- package/dist/testing/service-tests.d.ts +4 -0
- package/dist/time-utils.d.ts +15 -0
- package/dist/time-utils.js +14 -0
- package/dist/types/core.types.d.ts +80 -0
- package/dist/types/state.types.d.ts +4 -0
- package/dist/utils/hmac.d.ts +3 -0
- package/dist/utils/safe-fetch.d.ts +14 -0
- package/dist/utils/safe-fetch.js +13 -0
- package/dist/utils/stable-stringify.d.ts +11 -0
- package/dist/utils/stable-stringify.js +33 -0
- package/dist/utils.d.ts +28 -0
- package/dist/utils.js +22 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.js +7 -0
- package/dist/wirings/addon/define-screens.d.ts +2 -0
- package/dist/wirings/addon/remote-addon-auth.d.ts +9 -0
- package/dist/wirings/addon/remote-addon-auth.js +5 -0
- package/dist/wirings/addon/wire-addon.d.ts +4 -0
- package/dist/wirings/addon/wire-remote-addon.d.ts +1 -0
- package/dist/wirings/agent/agent-agui.d.ts +14 -5
- package/dist/wirings/agent/agent-agui.js +17 -6
- package/dist/wirings/agent/agent-helpers.d.ts +61 -1
- package/dist/wirings/agent/agent-helpers.js +62 -2
- package/dist/wirings/agent/agent-interrupt.d.ts +5 -0
- package/dist/wirings/agent/agent-output.d.ts +20 -0
- package/dist/wirings/agent/agent-output.js +69 -0
- package/dist/wirings/agent/agent-prepare.d.ts +41 -0
- package/dist/wirings/agent/agent-prepare.js +38 -2
- package/dist/wirings/agent/agent-registry.d.ts +8 -0
- package/dist/wirings/agent/agent-registry.js +10 -4
- package/dist/wirings/agent/agent-runner.d.ts +33 -0
- package/dist/wirings/agent/agent-runner.js +40 -7
- package/dist/wirings/agent/agent-stream.d.ts +30 -0
- package/dist/wirings/agent/agent-stream.js +33 -11
- package/dist/wirings/agent/agent.types.d.ts +43 -0
- package/dist/wirings/agent/voice-input.d.ts +12 -0
- package/dist/wirings/agent/voice-input.js +12 -0
- package/dist/wirings/agent/voice-output.d.ts +14 -0
- package/dist/wirings/agent/voice-output.js +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-judge.js +1 -2
- package/dist/wirings/agent-scorer/agent-scorer-registry.d.ts +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-registry.js +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.d.ts +1 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.js +1 -0
- package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +7 -0
- package/dist/wirings/channel/channel-common.js +1 -1
- package/dist/wirings/channel/channel-rpc.types.d.ts +5 -0
- package/dist/wirings/channel/channel-runner.d.ts +22 -0
- package/dist/wirings/channel/channel-runner.js +22 -0
- package/dist/wirings/channel/channel-store.d.ts +8 -0
- package/dist/wirings/channel/channel-store.js +7 -0
- package/dist/wirings/channel/channel.types.d.ts +18 -0
- package/dist/wirings/channel/define-channel-routes.d.ts +5 -0
- package/dist/wirings/channel/define-channel-routes.js +5 -0
- package/dist/wirings/channel/eventhub-service.d.ts +9 -0
- package/dist/wirings/channel/eventhub-store.d.ts +1 -0
- package/dist/wirings/channel/eventhub-store.js +1 -0
- package/dist/wirings/channel/index.d.ts +1 -1
- package/dist/wirings/channel/index.js +1 -1
- package/dist/wirings/channel/local/local-channel-handler.d.ts +1 -0
- package/dist/wirings/channel/local/local-channel-handler.js +1 -0
- package/dist/wirings/channel/local/local-channel-runner.d.ts +13 -0
- package/dist/wirings/channel/local/local-channel-runner.js +13 -0
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +1 -0
- package/dist/wirings/channel/local/local-eventhub-service.js +1 -0
- package/dist/wirings/channel/log-channels.d.ts +1 -0
- package/dist/wirings/channel/log-channels.js +1 -0
- package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +5 -0
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +5 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +32 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +31 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +8 -0
- package/dist/wirings/cli/channel/cli-channel-runner.js +8 -0
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +1 -0
- package/dist/wirings/cli/cli-runner.d.ts +43 -0
- package/dist/wirings/cli/cli-runner.js +43 -0
- package/dist/wirings/cli/command-parser.d.ts +13 -0
- package/dist/wirings/cli/command-parser.js +12 -0
- package/dist/wirings/credential/credential-overrides.d.ts +1 -0
- package/dist/wirings/credential/credential.types.d.ts +7 -0
- package/dist/wirings/credential/validate-credential-definitions.d.ts +7 -0
- package/dist/wirings/credential/validate-credential-definitions.js +7 -0
- package/dist/wirings/flag/cached-flag-source.d.ts +1 -0
- package/dist/wirings/flag/flag.types.d.ts +3 -0
- package/dist/wirings/gateway/gateway-runner.d.ts +23 -0
- package/dist/wirings/gateway/gateway-runner.js +23 -0
- package/dist/wirings/gateway/gateway.types.d.ts +3 -0
- package/dist/wirings/gateway/local-gateway-service.d.ts +10 -0
- package/dist/{services → wirings/gateway}/local-gateway-service.js +6 -2
- package/dist/wirings/http/http-routes.d.ts +21 -0
- package/dist/wirings/http/http-routes.js +11 -0
- package/dist/wirings/http/http-runner.d.ts +71 -0
- package/dist/wirings/http/http-runner.js +73 -5
- package/dist/wirings/http/http.types.d.ts +27 -0
- package/dist/wirings/http/index.d.ts +1 -0
- package/dist/wirings/http/index.js +1 -0
- package/dist/wirings/http/log-http-routes.d.ts +1 -0
- package/dist/wirings/http/log-http-routes.js +1 -0
- package/dist/wirings/http/merge-request-data.d.ts +12 -0
- package/dist/wirings/http/merge-request-data.js +42 -0
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.js +3 -32
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-response.js +1 -0
- package/dist/wirings/http/routers/http-router.d.ts +6 -0
- package/dist/wirings/http/routers/http-router.js +6 -0
- package/dist/wirings/http/web-request.d.ts +17 -0
- package/dist/wirings/http/web-request.js +17 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +7 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.js +7 -0
- package/dist/wirings/mcp/mcp-runner.d.ts +63 -0
- package/dist/wirings/mcp/mcp-runner.js +62 -0
- package/dist/wirings/mcp/mcp.types.d.ts +12 -0
- package/dist/wirings/node/node.types.d.ts +4 -0
- package/dist/wirings/oauth2/oauth2.types.d.ts +2 -0
- package/dist/{services → wirings/queue}/in-memory-queue-service.d.ts +9 -1
- package/dist/{services → wirings/queue}/in-memory-queue-service.js +9 -1
- package/dist/wirings/queue/index.d.ts +1 -0
- package/dist/wirings/queue/index.js +1 -0
- package/dist/wirings/queue/queue-identity.js +2 -14
- package/dist/wirings/queue/queue-runner.d.ts +37 -0
- package/dist/wirings/queue/queue-runner.js +37 -0
- package/dist/wirings/queue/queue.types.d.ts +35 -0
- package/dist/wirings/queue/register-queue-helper.d.ts +12 -0
- package/dist/wirings/queue/register-queue-helper.js +11 -0
- package/dist/wirings/queue/remote-queue-job.d.ts +11 -0
- package/dist/wirings/queue/remote-queue-job.js +41 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +1 -0
- package/dist/wirings/role/role.types.d.ts +3 -0
- package/dist/wirings/rpc/rpc-runner.d.ts +24 -0
- package/dist/wirings/rpc/rpc-runner.js +37 -2
- package/dist/wirings/rpc/rpc-types.d.ts +2 -0
- package/dist/wirings/scheduler/index.d.ts +1 -0
- package/dist/wirings/scheduler/index.js +1 -0
- package/dist/wirings/scheduler/log-schedulers.d.ts +1 -0
- package/dist/wirings/scheduler/log-schedulers.js +1 -0
- package/dist/wirings/scheduler/remote-scheduled-job.d.ts +11 -0
- package/dist/wirings/scheduler/remote-scheduled-job.js +20 -0
- package/dist/wirings/scheduler/scheduler-runner.d.ts +29 -0
- package/dist/wirings/scheduler/scheduler-runner.js +28 -0
- package/dist/wirings/scheduler/scheduler.types.d.ts +3 -0
- package/dist/wirings/scope/scope.types.d.ts +5 -0
- package/dist/wirings/secret/index.d.ts +2 -2
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +26 -1
- package/dist/wirings/secret/secret.types.js +1 -0
- package/dist/wirings/secret/validate-secret-definitions.d.ts +8 -0
- package/dist/wirings/secret/validate-secret-definitions.js +15 -0
- package/dist/wirings/trigger/in-memory-trigger-service.d.ts +11 -0
- package/dist/{services → wirings/trigger}/in-memory-trigger-service.js +10 -3
- package/dist/wirings/trigger/index.d.ts +1 -1
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +8 -3
- package/dist/wirings/trigger/pikku-trigger-service.js +14 -3
- package/dist/wirings/trigger/trigger-runner.d.ts +27 -2
- package/dist/wirings/trigger/trigger-runner.js +35 -2
- package/dist/wirings/trigger/trigger.types.d.ts +26 -4
- package/dist/wirings/trigger/webhook-source-runner.d.ts +24 -0
- package/dist/wirings/trigger/webhook-source-runner.js +19 -0
- package/dist/wirings/trigger/webhook-source.types.d.ts +12 -2
- package/dist/wirings/trigger/webhook-source.types.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +7 -0
- package/dist/wirings/variable/validate-variable-definitions.js +7 -0
- package/dist/wirings/variable/variable.types.d.ts +7 -0
- package/dist/wirings/virtual-user/conversation/conversation.types.d.ts +5 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.d.ts +6 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.js +1 -1
- package/dist/{services → wirings/virtual-user}/http-virtual-users.d.ts +4 -3
- package/dist/{services → wirings/virtual-user}/http-virtual-users.js +6 -6
- package/dist/wirings/virtual-user/index.d.ts +1 -1
- package/dist/wirings/virtual-user/index.js +1 -1
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +2 -1
- package/dist/wirings/virtual-user/run-virtual-user.js +1 -14
- package/dist/wirings/virtual-user/virtual-user-declaration.types.d.ts +4 -0
- package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +10 -1
- package/dist/wirings/virtual-user/virtual-user-scaffold.js +5 -0
- package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +5 -0
- package/dist/wirings/virtual-user/virtual-user-schedule.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +1 -0
- package/dist/wirings/webhook/define-outgoing-webhook.d.ts +20 -0
- package/dist/wirings/webhook/define-outgoing-webhook.js +9 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +8 -4
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +7 -0
- package/dist/wirings/workflow/dsl/workflow-runner.js +7 -0
- package/dist/wirings/workflow/feature.d.ts +12 -0
- package/dist/wirings/workflow/feature.js +12 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +5 -0
- package/dist/wirings/workflow/graph/graph-node.js +5 -0
- package/dist/wirings/workflow/graph/template.d.ts +6 -0
- package/dist/wirings/workflow/graph/template.js +5 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +12 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.js +10 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +11 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.js +1 -0
- package/dist/{services → wirings/workflow}/in-memory-workflow-service.d.ts +8 -3
- package/dist/{services → wirings/workflow}/in-memory-workflow-service.js +9 -4
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +1 -1
- package/dist/wirings/workflow/pikku-scenario-service.js +2 -2
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +1 -0
- package/dist/wirings/workflow/pikku-workflow-service.js +1 -0
- package/dist/wirings/workflow/run-timeline.d.ts +21 -0
- package/dist/wirings/workflow/run-timeline.js +15 -7
- package/dist/wirings/workflow/scenario-coverage.d.ts +1 -0
- package/dist/wirings/workflow/scenario-poll.d.ts +1 -0
- package/dist/wirings/workflow/scenario-prose.d.ts +6 -0
- package/dist/wirings/workflow/scenario-prose.js +6 -0
- package/dist/wirings/workflow/scenario-run.types.d.ts +3 -0
- package/dist/wirings/workflow/scenario-step.types.d.ts +1 -0
- package/dist/wirings/workflow/scenario-step.types.js +1 -0
- package/dist/wirings/workflow/scenario-surface.js +1 -13
- package/dist/wirings/workflow/scenario.types.d.ts +6 -0
- package/dist/wirings/workflow/workflow-approval-policy.d.ts +6 -0
- package/dist/wirings/workflow/workflow-approval-policy.js +6 -0
- package/dist/wirings/workflow/workflow-constants.d.ts +7 -1
- package/dist/wirings/workflow/workflow-constants.js +10 -1
- package/dist/wirings/workflow/workflow-errors.d.ts +13 -0
- package/dist/wirings/workflow/workflow-errors.js +13 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +4 -0
- package/dist/wirings/workflow/workflow-invocation-id.js +4 -0
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +3 -0
- package/dist/wirings/workflow/workflow-run-ownership.d.ts +1 -0
- package/dist/wirings/workflow/workflow-run-ownership.js +1 -0
- package/dist/wirings/workflow/workflow-status-stream.d.ts +1 -0
- package/dist/wirings/workflow/workflow-unwind-plan.js +2 -7
- package/dist/wirings/workflow/workflow.types.d.ts +40 -0
- package/package.json +26 -9
- package/CHANGELOG.md +0 -6978
- package/dist/services/in-memory-trigger-service.d.ts +0 -4
- package/dist/services/local-gateway-service.d.ts +0 -6
- package/dist/utils/hash.d.ts +0 -2
- package/dist/utils/hash.js +0 -23
- package/knowledge/decisions/index.md +0 -19
- package/knowledge/decisions/internals/a-credential-name-declared-twice-must-agree-on-schema-and-type.md +0 -29
- package/knowledge/decisions/internals/a-grant-can-name-a-scope-declared-without-its-addon.md +0 -29
- package/knowledge/decisions/internals/a-held-run-is-woken-later-not-retried.md +0 -28
- package/knowledge/decisions/internals/a-latency-budget-is-asserted-by-its-cause.md +0 -32
- package/knowledge/decisions/internals/a-non-streaming-agent-run-registers-with-agentrunstate-too.md +0 -22
- package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +0 -50
- package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +0 -20
- package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +0 -21
- package/knowledge/decisions/internals/a-scheduled-task-writes-its-caller-session-before-it-runs.md +0 -22
- package/knowledge/decisions/internals/a-secret-set-in-memory-shadows-the-variable-of-the-same-name.md +0 -28
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +0 -49
- package/knowledge/decisions/internals/a-virtual-user-acts-through-invokeraw-so-a-refusal-is-data.md +0 -32
- package/knowledge/decisions/internals/a-virtual-user-cadence-is-a-row-not-a-timer.md +0 -66
- package/knowledge/decisions/internals/a-virtual-user-converse-signs-in-before-its-first-turn.md +0 -24
- package/knowledge/decisions/internals/a-virtual-user-decides-whether-to-trust-memory-once-per-turn.md +0 -21
- package/knowledge/decisions/internals/a-virtual-user-email-is-computed-with-the-run-id-as-a-sub-address.md +0 -34
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-but-it-needs-a-trigger.md +0 -65
- package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +0 -49
- package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +0 -45
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +0 -26
- package/knowledge/decisions/internals/addon-pikku-meta-ships-at-the-package-root-or-under-dist.md +0 -32
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +0 -33
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +0 -28
- package/knowledge/decisions/internals/agent-agui-bridge-obeys-the-client-ordering-contract.md +0 -29
- package/knowledge/decisions/internals/agent-audio-chunks-carry-the-format-the-provider-returned.md +0 -20
- package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +0 -21
- package/knowledge/decisions/internals/agent-credential-suspensions-hide-the-tool-result.md +0 -26
- package/knowledge/decisions/internals/agent-delegate-and-supervise-hide-different-text.md +0 -26
- package/knowledge/decisions/internals/agent-llm-tool-arguments-have-nulls-stripped.md +0 -23
- package/knowledge/decisions/internals/agent-model-config-stays-a-single-resolution-seam.md +0 -25
- package/knowledge/decisions/internals/agent-onerror-hooks-cannot-change-the-failure.md +0 -22
- package/knowledge/decisions/internals/agent-runner-methods-must-keep-their-receiver.md +0 -22
- package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +0 -22
- package/knowledge/decisions/internals/agent-stream-persistence-is-best-effort.md +0 -27
- package/knowledge/decisions/internals/agent-sub-agents-inherit-the-parent-context-block.md +0 -26
- package/knowledge/decisions/internals/agent-tool-execute-failures-are-logged-unconditionally.md +0 -25
- package/knowledge/decisions/internals/agent-voice-input-transcribes-audio-parts-in-place.md +0 -22
- package/knowledge/decisions/internals/agent-working-memory-is-persisted-only-when-valid.md +0 -25
- package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +0 -39
- package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +0 -23
- package/knowledge/decisions/internals/an-agent-is-offered-under-its-registry-key-and-only-within-the-virtual-users-scopes.md +0 -27
- package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +0 -25
- package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +0 -22
- package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +0 -20
- package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +0 -22
- package/knowledge/decisions/internals/an-oauth2-credential-implies-an-optional-app-secret.md +0 -26
- package/knowledge/decisions/internals/an-unref-d-timer-cannot-be-awaited-under-node-test.md +0 -66
- package/knowledge/decisions/internals/analytics-identity-resolvers-run-in-declared-order.md +0 -22
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +0 -30
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +0 -31
- package/knowledge/decisions/internals/channel-state-accessors-are-unsound-generics-that-every-implementation-asserts.md +0 -33
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +0 -29
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +0 -28
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +0 -27
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +0 -28
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +0 -34
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +0 -29
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +0 -84
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +0 -41
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +0 -44
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +0 -39
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +0 -42
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +0 -39
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +0 -43
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +0 -38
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +0 -44
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +0 -27
- package/knowledge/decisions/internals/feature-flag-declarations-refuse-an-empty-anyof-and-conflicting-scopes.md +0 -22
- package/knowledge/decisions/internals/feature-flags-fail-open-and-never-enforce-access.md +0 -28
- package/knowledge/decisions/internals/flag-sync-rewrites-only-the-declared-text.md +0 -24
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +0 -32
- package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +0 -43
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +0 -28
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +0 -31
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +0 -26
- package/knowledge/decisions/internals/global-middleware-resolves-from-the-root-namespace-too.md +0 -32
- package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +0 -38
- package/knowledge/decisions/internals/hot-reload-writes-into-the-function-map-captured-at-startup.md +0 -26
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +0 -32
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +0 -28
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +0 -30
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +0 -26
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +0 -28
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +0 -32
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +0 -26
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +0 -25
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +0 -26
- package/knowledge/decisions/internals/index.md +0 -182
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +0 -25
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +0 -26
- package/knowledge/decisions/internals/mcp-wire-names-are-assigned-over-the-whole-registry.md +0 -39
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +0 -24
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +0 -53
- package/knowledge/decisions/internals/only-exposed-functions-enter-a-virtual-user-catalogue.md +0 -21
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +0 -28
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +0 -27
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +0 -31
- package/knowledge/decisions/internals/role-names-cannot-contain-the-scope-separator.md +0 -30
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +0 -32
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +0 -31
- package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +0 -24
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +0 -26
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +0 -27
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +0 -48
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +0 -30
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +0 -28
- package/knowledge/decisions/internals/side-effects-are-an-allowlist-not-a-boolean.md +0 -34
- package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +0 -24
- package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +0 -26
- package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +0 -43
- package/knowledge/decisions/internals/the-core-scope-validator-refuses-separator-wildcard-and-empty-segments.md +0 -22
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +0 -30
- package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +0 -83
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +0 -29
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +0 -27
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +0 -40
- package/knowledge/decisions/internals/the-mcp-handshake-is-challenged-only-when-every-target-is-gated.md +0 -29
- package/knowledge/decisions/internals/the-middleware-resolution-cache-is-deliberately-unbounded.md +0 -40
- package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +0 -40
- package/knowledge/decisions/internals/the-pikku-user-id-resolves-in-a-fixed-order.md +0 -24
- package/knowledge/decisions/internals/the-runner-resolves-wire-services-itself.md +0 -31
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +0 -26
- package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +0 -25
- package/knowledge/decisions/internals/the-virtual-user-catalogue-is-the-only-gate-on-what-may-be-called.md +0 -21
- package/knowledge/decisions/internals/the-virtual-user-prompt-says-json-because-of-json-object-mode.md +0 -22
- package/knowledge/decisions/internals/the-virtual-user-runtime-is-exported-from-the-virtual-user-entry-point.md +0 -28
- package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +0 -22
- package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +0 -25
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +0 -33
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +0 -26
- package/knowledge/decisions/internals/validate-checks-virtual-users-through-a-shared-module.md +0 -43
- package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +0 -115
- package/knowledge/decisions/internals/virtual-user-conversation-drives-the-target-through-a-transport-seam.md +0 -24
- package/knowledge/decisions/internals/virtual-user-conversation-verdicts-are-llm-self-evaluations.md +0 -25
- package/knowledge/decisions/internals/virtual-user-conversations-seed-a-hidden-kickoff-message.md +0 -23
- package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +0 -21
- package/knowledge/decisions/internals/virtual-users-are-declared-in-one-definevirtualusers-call-per-codebase.md +0 -30
- package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +0 -24
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +0 -26
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +0 -25
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +0 -58
- package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +0 -35
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +0 -34
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +0 -42
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +0 -38
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +0 -29
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +0 -42
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +0 -25
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +0 -29
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +0 -43
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +0 -29
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +0 -42
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +0 -33
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +0 -32
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +0 -31
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +0 -39
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +0 -29
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +0 -33
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +0 -37
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +0 -54
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +0 -43
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +0 -32
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +0 -18
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +0 -34
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +0 -29
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +0 -33
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +0 -34
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +0 -34
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +0 -38
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +0 -30
- package/knowledge/decisions/security/a-bearer-token-checked-against-a-secret-reads-it-per-request.md +0 -26
- package/knowledge/decisions/security/a-call-without-a-session-raises-missing-session-not-forbidden.md +0 -20
- package/knowledge/decisions/security/a-caller-cookie-wins-over-the-jar-for-the-same-name.md +0 -23
- package/knowledge/decisions/security/a-channel-lifecycle-acts-as-the-socket-upgrade-session.md +0 -16
- package/knowledge/decisions/security/a-channel-requires-a-session-unless-it-says-auth-false.md +0 -26
- package/knowledge/decisions/security/a-credential-read-path-follows-its-declared-type-not-absence.md +0 -32
- package/knowledge/decisions/security/a-credential-type-is-a-literal-the-inspector-checks-at-declaration.md +0 -27
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +0 -28
- package/knowledge/decisions/security/a-first-party-cookie-is-written-only-after-its-purposes-consent.md +0 -33
- package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +0 -37
- package/knowledge/decisions/security/a-graph-run-starts-at-an-entry-node-the-graph-declared.md +0 -33
- package/knowledge/decisions/security/a-permission-gets-a-wire-it-cannot-reply-on.md +0 -33
- package/knowledge/decisions/security/a-public-function-says-so-with-auth-false.md +0 -34
- package/knowledge/decisions/security/a-readonly-session-reaches-only-readonly-functions.md +0 -25
- package/knowledge/decisions/security/a-scaffold-flag-says-a-surface-exists-not-who-may-call-it.md +0 -52
- package/knowledge/decisions/security/a-scheduled-virtual-user-run-needs-no-admin-at-run-time.md +0 -27
- package/knowledge/decisions/security/a-scoped-credential-view-is-limited-to-declared-names.md +0 -26
- package/knowledge/decisions/security/a-scoped-secret-view-reads-only-declared-keys-and-never-writes.md +0 -25
- package/knowledge/decisions/security/a-secret-is-sent-only-to-the-hosts-it-declares.md +0 -29
- package/knowledge/decisions/security/a-step-can-name-an-identity-no-virtual-user-holds-through-per-call-headers.md +0 -25
- package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +0 -37
- package/knowledge/decisions/security/a-stopped-run-by-id-skips-the-ownership-check.md +0 -24
- package/knowledge/decisions/security/a-vault-secret-redacts-on-serialization-and-throws-on-coercion.md +0 -29
- package/knowledge/decisions/security/a-virtual-user-catalogue-entry-is-filtered-by-scope-and-approval-is-denied-by-default.md +0 -30
- package/knowledge/decisions/security/a-virtual-user-environment-fails-closed.md +0 -38
- package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +0 -27
- package/knowledge/decisions/security/a-virtual-user-never-runs-against-production.md +0 -23
- package/knowledge/decisions/security/a-virtual-user-reads-its-roles-from-the-apps-own-rpc-before-better-auth.md +0 -27
- package/knowledge/decisions/security/a-virtual-user-run-treats-an-unresolved-environment-as-production.md +0 -41
- package/knowledge/decisions/security/a-virtual-user-scopes-are-expanded-from-its-roles-once-at-run-preparation.md +0 -25
- package/knowledge/decisions/security/a-virtual-user-whose-roles-drift-from-the-declaration-refuses-to-run.md +0 -32
- package/knowledge/decisions/security/a-workflow-run-is-read-and-approved-by-its-owner.md +0 -50
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +0 -43
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +0 -52
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +0 -46
- package/knowledge/decisions/security/addon-screen-scopes-hide-and-do-not-enforce.md +0 -20
- package/knowledge/decisions/security/agent-approval-forwarding-requires-a-symbol-brand.md +0 -27
- package/knowledge/decisions/security/agent-credential-requests-are-symbol-branded.md +0 -37
- package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +0 -31
- package/knowledge/decisions/security/agent-ownership-failures-never-echo-the-resource.md +0 -23
- package/knowledge/decisions/security/agent-resume-re-runs-the-authorization-gate.md +0 -22
- package/knowledge/decisions/security/agent-sessionless-deployments-have-no-thread-ownership.md +0 -39
- package/knowledge/decisions/security/agent-thread-ownership-composes-the-session-principal.md +0 -30
- package/knowledge/decisions/security/agent-tool-filtering-reads-the-live-function-config.md +0 -24
- package/knowledge/decisions/security/an-addon-header-can-only-narrow-the-session.md +0 -26
- package/knowledge/decisions/security/an-addon-instance-reads-only-the-secrets-and-credentials-it-is-named.md +0 -33
- package/knowledge/decisions/security/an-addon-may-reach-only-itself-and-the-addons-it-uses.md +0 -16
- package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +0 -33
- package/knowledge/decisions/security/an-api-key-is-jwt-decoded-into-the-session.md +0 -26
- package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +0 -59
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +0 -30
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +0 -52
- package/knowledge/decisions/security/an-external-virtual-user-caller-presents-one-signed-statement.md +0 -38
- package/knowledge/decisions/security/an-inbound-webhook-source-dispatches-only-verified-requests.md +0 -31
- package/knowledge/decisions/security/an-mcp-call-with-no-http-request-stays-anonymous.md +0 -18
- package/knowledge/decisions/security/an-mcp-refusal-is-decided-before-dispatch.md +0 -48
- package/knowledge/decisions/security/an-oauth2-credential-is-read-by-its-account-row.md +0 -40
- package/knowledge/decisions/security/an-omitted-user-id-addresses-the-platform-credential.md +0 -32
- package/knowledge/decisions/security/an-upload-is-counted-as-it-arrives-not-buffered-then-measured.md +0 -24
- package/knowledge/decisions/security/analytics-identity-is-stamped-from-the-session-not-the-event.md +0 -24
- package/knowledge/decisions/security/app-access-is-a-scope-tree-synthesised-from-virtual-users.md +0 -26
- package/knowledge/decisions/security/approval-policy-decides-who-answers-a-tool-call.md +0 -27
- package/knowledge/decisions/security/auth-false-on-a-session-function-warns-and-still-requires-one.md +0 -25
- package/knowledge/decisions/security/bearer-token-hashes-are-unpeppered-sha256.md +0 -18
- package/knowledge/decisions/security/consent-is-read-from-a-cookie-and-a-recognised-denial-counts-as-refusal.md +0 -29
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +0 -84
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +0 -39
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +0 -37
- package/knowledge/decisions/security/cors-defaults-to-any-origin-and-refuses-the-wildcard-with-credentials.md +0 -22
- package/knowledge/decisions/security/credential-backends-share-one-conformance-suite-for-per-user-isolation.md +0 -29
- package/knowledge/decisions/security/each-stage-has-one-virtual-user-key-pair.md +0 -27
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +0 -41
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +0 -30
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +0 -40
- package/knowledge/decisions/security/hmac-verification-fails-closed-on-empty-inputs.md +0 -25
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +0 -33
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +0 -46
- package/knowledge/decisions/security/index.md +0 -135
- package/knowledge/decisions/security/local-content-refuses-private-buckets-under-the-public-segment.md +0 -21
- package/knowledge/decisions/security/mail-is-allowlisted-before-a-virtual-user-run-sees-it.md +0 -38
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +0 -27
- package/knowledge/decisions/security/mcp-resources-tools-and-prompts-take-sessionless-functions.md +0 -18
- package/knowledge/decisions/security/origin-locked-routes-match-the-origin-exactly.md +0 -22
- package/knowledge/decisions/security/oss-auth-works-without-pikku-studio-cloud.md +0 -26
- package/knowledge/decisions/security/outbound-webhooks-use-an-allowlist-when-configured.md +0 -24
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +0 -40
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +0 -31
- package/knowledge/decisions/security/pikku-carries-virtual-user-scopes-as-data-and-the-app-grants-them.md +0 -35
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +0 -69
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +0 -39
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +0 -34
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +0 -55
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +0 -30
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +0 -28
- package/knowledge/decisions/security/scoped-content-access-is-a-root-folder-with-longest-prefix-grants.md +0 -31
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +0 -34
- package/knowledge/decisions/security/services-without-secrets-get-a-throwing-secrets-accessor.md +0 -22
- package/knowledge/decisions/security/shared-guards-refuse-to-mutate-or-shadow-a-system-role.md +0 -34
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +0 -37
- package/knowledge/decisions/security/signed-uploads-are-verified-by-the-same-check-as-signed-reads.md +0 -26
- package/knowledge/decisions/security/system-role-scopes-must-be-declared-with-define-scope.md +0 -24
- package/knowledge/decisions/security/system-roles-are-additive-and-immutable.md +0 -16
- package/knowledge/decisions/security/the-channel-rpc-does-not-send-the-callers-session.md +0 -21
- package/knowledge/decisions/security/the-remote-jobs-inbox-fails-closed-without-a-secret.md +0 -24
- package/knowledge/decisions/security/the-remote-rpc-gate-fails-closed-and-binds-the-token-to-its-function.md +0 -34
- package/knowledge/decisions/security/the-workflow-status-stream-rechecks-ownership-on-every-poll.md +0 -16
- package/knowledge/decisions/security/two-credentials-on-one-key-must-share-a-read-mode.md +0 -29
- package/knowledge/decisions/security/verified-bearer-claims-are-pass-through-data-that-core-never-fills.md +0 -23
- package/knowledge/decisions/security/virtual-user-catalogue-excludes-the-machinery-that-runs-virtual-users.md +0 -25
- package/knowledge/decisions/security/virtual-user-conversation-missing-approval-decisions-default-to-denied.md +0 -22
- package/knowledge/decisions/security/virtual-user-run-records-are-gated-behind-a-read-scope.md +0 -18
- package/knowledge/decisions/security/virtual-user-sign-in-does-not-exist-in-production.md +0 -25
- package/knowledge/decisions/security/virtual-user-sign-in-has-one-door.md +0 -42
- package/knowledge/decisions/security/virtual-user-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +0 -29
- package/knowledge/decisions/security/virtual-user-sign-in-only-works-for-virtual-user-flagged-users.md +0 -29
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +0 -25
- package/knowledge/decisions/security/wire-addon-expose-selects-the-rpc-surface.md +0 -51
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +0 -40
- package/knowledge/decisions/security/workflow-helper-functions-are-sessionless-by-declaration.md +0 -18
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +0 -32
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-virtual-user-and-per-scenario.md +0 -32
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +0 -31
- package/knowledge/decisions/security/workflow-virtual-user-steps-always-use-the-real-transport.md +0 -34
- package/knowledge/decisions/security/writing-a-virtual-user-schedule-is-gated-by-its-own-scope.md +0 -18
- package/knowledge/index.md +0 -24
- package/knowledge/questions/a-bearer-jwt-with-no-identity-becomes-a-session.md +0 -24
- package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +0 -35
- package/knowledge/questions/dev-quick-login-as-impersonation.md +0 -25
- package/knowledge/questions/does-a-delayed-rpc-run-as-the-session-it-was-scheduled-with.md +0 -26
- package/knowledge/questions/does-a-user-id-with-a-colon-read-another-users-credentials.md +0 -27
- package/knowledge/questions/does-a-wirecli-command-need-a-session-by-default.md +0 -26
- package/knowledge/questions/does-an-adversarial-in-scope-success-count-as-a-finding.md +0 -26
- package/knowledge/questions/does-approve-step-need-the-run-owners-session-or-the-gates-approvers.md +0 -34
- package/knowledge/questions/does-cors-origin-true-reflect-any-origin-with-credentials.md +0 -20
- package/knowledge/questions/does-skip-user-session-do-anything-on-a-channel.md +0 -24
- package/knowledge/questions/does-the-store-session-match-the-other-two.md +0 -19
- package/knowledge/questions/index.md +0 -41
- package/knowledge/questions/is-the-agent-score-worker-reachable-without-a-session.md +0 -21
- package/knowledge/questions/live-scheduled-tests-may-write.md +0 -19
- package/knowledge/questions/provision-virtual-users-has-no-caller-in-this-repo.md +0 -23
- package/knowledge/questions/remote-secret-refuses-requests-without-a-remote-token-on-every-path.md +0 -32
- package/knowledge/questions/should-a-middleware-set-session-persist-to-the-store.md +0 -25
- package/knowledge/questions/should-a-scoped-secret-view-throw-from-has-secret-for-a-disallowed-key.md +0 -23
- package/knowledge/questions/should-a-wrong-bearer-token-be-anonymous-or-refused.md +0 -35
- package/knowledge/questions/should-an-empty-webhook-signing-secret-send-unsigned.md +0 -23
- package/knowledge/questions/should-http-virtual-user-sessions-reset-between-scenarios-in-one-run.md +0 -27
- package/knowledge/questions/should-the-cookie-jar-scope-cookies-to-the-api-origin.md +0 -26
- package/knowledge/questions/should-voice-input-fetch-audio-urls-without-a-host-allowlist.md +0 -20
- package/knowledge/questions/staging-impersonation-rules.md +0 -27
- package/knowledge/questions/unauthorized-channel-replies-escape-the-declared-out-type.md +0 -44
- package/knowledge/questions/virtual-user-keys-on-cloud-stages-are-pikku-studios-to-build.md +0 -33
- package/knowledge/questions/virtual-user-statement-replay-is-per-process.md +0 -20
- package/knowledge/questions/what-an-impersonated-session-carries.md +0 -22
- package/run-tests.sh +0 -68
- package/scripts/generate-api-report.d.mts +0 -1
- package/scripts/generate-api-report.mjs +0 -96
- package/scripts/generate-api-report.mts +0 -333
- package/src/public-surface.json +0 -637
- package/src/public-surface.json.README +0 -43
- /package/dist/{function/compensation-name.d.ts → compensation-name.d.ts} +0 -0
- /package/dist/{function/compensation-name.js → compensation-name.js} +0 -0
package/knowledge/questions/does-approve-step-need-the-run-owners-session-or-the-gates-approvers.md
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Does approveStep need the run owner's session, as its doc says, or only what the gate's approvers policy allows?
|
|
4
|
-
description: The WorkflowService doc says the session must belong to the run's owner, but the implementation judges the session against the gate's published policy, whose default is any
|
|
5
|
-
tags: workflow, approvals, sessions, comment-vs-code
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Does approveStep need the run owner's session, as its doc says, or only what the gate's approvers policy allows?
|
|
9
|
-
|
|
10
|
-
**The comment.** The doc on `approveStep` in `packages/core/src/services/workflow-service.ts` says: "The session
|
|
11
|
-
must belong to the run's owner — see `assertWorkflowRunOwner`" (line 52). The method takes the session as
|
|
12
|
-
optional (`session?: CoreUserSession`, lines 54-58).
|
|
13
|
-
|
|
14
|
-
**The code.** `PikkuWorkflowService.approveStep` in `packages/core/src/wirings/workflow/pikku-workflow-service.ts`
|
|
15
|
-
(lines 1804-1817) does not call `assertWorkflowRunOwner`. It passes `approvalDeciderFrom(session)` to
|
|
16
|
-
`recordApprovalDecision`. That helper reduces the session to `{ userId, scopes }`, or `undefined` when there is
|
|
17
|
-
no session (`packages/core/src/wirings/workflow/workflow-approval-policy.ts:21-24`).
|
|
18
|
-
|
|
19
|
-
`recordApprovalDecision` (`packages/core/src/wirings/workflow/workflow-approval.ts:98-104`) judges the decider only
|
|
20
|
-
when the gate has already published a policy (`workflow-approval.ts:125-141`). The policy check is
|
|
21
|
-
`approvalPolicyRefusal`, which defaults `approvers` to `'any'` (`workflow-approval-policy.ts:46`, `:65-66`).
|
|
22
|
-
Only `'owner'` compares the decider with the run's owner (`:47-54`), and it lets everyone through when the run
|
|
23
|
-
has no recorded owner (`:48-50`). `'not-initiator'` refuses the owner (`:56-63`). A decision recorded before the
|
|
24
|
-
gate publishes its policy is not judged at that point (`workflow-approval.ts:125`).
|
|
25
|
-
|
|
26
|
-
The decision note
|
|
27
|
-
[a workflow run is read by its owner, and answered by whoever its gate declares](../decisions/security/a-workflow-run-is-read-and-approved-by-its-owner.md)
|
|
28
|
-
records the design as the gate's `approvers`. The comment at `workflow-service.ts:52` still describes the earlier
|
|
29
|
-
rule that note says it replaced. The reference at `packages/core/src/wirings/workflow/workflow-run-ownership.ts:19`
|
|
30
|
-
already points to `approvers`.
|
|
31
|
-
|
|
32
|
-
**Question:** should the comment at `workflow-service.ts:52` be rewritten to describe the gate's policy, or is any
|
|
33
|
-
caller meant to be held to the owner's session regardless of the policy? As the code stands, a gate with the
|
|
34
|
-
default policy accepts an answer from no session at all.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Does cors origin: true reflect any origin when credentials are on?
|
|
4
|
-
description: The credentials guard only refuses the wildcard origin, so origin: true with credentials reflects whichever origin asks
|
|
5
|
-
tags: core, middleware, cors
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Does cors origin: true reflect any origin when credentials are on?
|
|
9
|
-
|
|
10
|
-
In `packages/core/src/middleware/cors.ts:55-56`, `origin: true` sets the allowed
|
|
11
|
-
origin to the request's `Origin` header, or to `*` when none is sent.
|
|
12
|
-
|
|
13
|
-
The guard at `:36-40` throws only when the origin is the string `'*'` and
|
|
14
|
-
`credentials` is true. `origin: true` is not that string, so the combination is
|
|
15
|
-
accepted with no throw. The file does not check that the reflected origin is in a
|
|
16
|
-
list.
|
|
17
|
-
|
|
18
|
-
**Question:** is `origin: true` with `credentials: true` meant to reflect any caller
|
|
19
|
-
origin, or should it be refused like the wildcard? The guard and its message cover
|
|
20
|
-
only the wildcard. The `origin: true` option has no note in this folder.
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Does skipUserSession do anything on a channel?
|
|
4
|
-
description: The local channel runner accepts and forwards skipUserSession, but the channel open path never reads it, unlike the HTTP runner which refuses it on a session-requiring route
|
|
5
|
-
tags: core, channel, http, sessions
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Does skipUserSession do anything on a channel?
|
|
9
|
-
|
|
10
|
-
`runLocalChannel` in `packages/core/src/wirings/channel/local/local-channel-runner.ts`
|
|
11
|
-
takes `skipUserSession = false` (`:66`) and passes it to `openChannel` (`:104`).
|
|
12
|
-
|
|
13
|
-
`openChannel` in `packages/core/src/wirings/channel/channel-runner.ts:121-130` has
|
|
14
|
-
`RunChannelOptions` in its parameter type, which includes `skipUserSession`
|
|
15
|
-
(`channel.types.ts:31`). The function destructures only `route`,
|
|
16
|
-
`coerceDataFromSchema` and `request`. A search of `packages/core/src` finds no
|
|
17
|
-
read of the option in the channel code.
|
|
18
|
-
|
|
19
|
-
The HTTP runner handles the same option differently. `packages/core/src/wirings/http/http-runner.ts:211-213`
|
|
20
|
-
throws when `skipUserSession` is set on a route that requires a session.
|
|
21
|
-
|
|
22
|
-
**Question:** on a channel that requires a session, is `skipUserSession: true`
|
|
23
|
-
meant to be refused like the HTTP case, or is it intentionally ignored? The code
|
|
24
|
-
accepts it and does nothing with it.
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Should betterAuthStoreSession warn about unhonoured impersonation?
|
|
4
|
-
description: The cookie and stateless middlewares warn once when the impersonation header is ignored; the store middleware does not, and nothing says whether that is an omission
|
|
5
|
-
tags: better-auth, impersonation, logging
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Should betterAuthStoreSession warn about unhonoured impersonation?
|
|
9
|
-
|
|
10
|
-
`betterAuthSession` and `betterAuthStatelessSession` both call
|
|
11
|
-
`warnImpersonationUnconfigured` when a request names a target and no
|
|
12
|
-
`impersonation` option is set. `betterAuthStoreSession` does not.
|
|
13
|
-
|
|
14
|
-
Without the warning, a store-backed app that forgets the option runs every
|
|
15
|
-
scenario virtual user as the signed-in caller and fails only on assertions. The code gives
|
|
16
|
-
no reason for the difference.
|
|
17
|
-
|
|
18
|
-
Open: is the store middleware's silence an omission, or was it left out because
|
|
19
|
-
it is used only for header-token traffic where impersonation is never wanted?
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: overview
|
|
3
|
-
title: Questions
|
|
4
|
-
description: Things asked of core and not yet answered
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Questions
|
|
8
|
-
|
|
9
|
-
Something asked and not yet answered. A question earns a note when the code
|
|
10
|
-
currently makes a choice that nobody has defended — the choice stays, the doubt
|
|
11
|
-
gets recorded.
|
|
12
|
-
|
|
13
|
-
<!-- pikku:knowledge-index -->
|
|
14
|
-
- [Does a bearer JWT with no identity claim count as a session?](a-bearer-jwt-with-no-identity-becomes-a-session.md) — The cookie middleware refuses an identity-less JWT, but authBearer sets whatever decode returns, so the two paths disagree
|
|
15
|
-
- [A channel's middleware list accepts bare factories that nothing ever resolves](channel-middleware-accepts-bare-factories-that-nothing-resolves.md) — CoreChannel.channelMiddleware admits CorePikkuChannelMiddlewareFactory, but no runner calls one, so a bare factory would stall the chain
|
|
16
|
-
- [Can dev quick login become impersonation?](dev-quick-login-as-impersonation.md) — Dev quick login signs in a fixed admin account; making it an impersonation step needs an existing admin session it does not have, so it would need a new bypass
|
|
17
|
-
- [Does a delayed RPC run as the session it was scheduled with?](does-a-delayed-rpc-run-as-the-session-it-was-scheduled-with.md) — The in-memory scheduler stores the session it is given and returns it from getTask, but the delayed run invokes the RPC with no session
|
|
18
|
-
- [Can a user id containing a colon read another user's credentials?](does-a-user-id-with-a-colon-read-another-users-credentials.md) — LocalCredentialService joins user id and name with a colon and matches users by prefix, so an id containing a colon may collide with another user's keys
|
|
19
|
-
- [Does a wireCLI command need a session when it sets no auth?](does-a-wirecli-command-need-a-session-by-default.md) — The channel default is documented as requiring a session, but a CLI command has no default of its own; its session need comes from whether the function is sessionless
|
|
20
|
-
- [Does an adversarial user's in-scope success count as a finding?](does-an-adversarial-in-scope-success-count-as-a-finding.md) — The disposition doc says a 2xx is a finding for an inverted oracle, but the engine only flags successes outside the virtual user's scopes, and in-scope 2xx depends on the app's classifier
|
|
21
|
-
- [Does approveStep need the run owner's session, as its doc says, or only what the gate's approvers policy allows?](does-approve-step-need-the-run-owners-session-or-the-gates-approvers.md) — The WorkflowService doc says the session must belong to the run's owner, but the implementation judges the session against the gate's published policy, whose default is any
|
|
22
|
-
- [Does cors origin: true reflect any origin when credentials are on?](does-cors-origin-true-reflect-any-origin-with-credentials.md) — The credentials guard only refuses the wildcard origin, so origin: true with credentials reflects whichever origin asks
|
|
23
|
-
- [Does skipUserSession do anything on a channel?](does-skip-user-session-do-anything-on-a-channel.md) — The local channel runner accepts and forwards skipUserSession, but the channel open path never reads it, unlike the HTTP runner which refuses it on a session-requiring route
|
|
24
|
-
- [Should betterAuthStoreSession warn about unhonoured impersonation?](does-the-store-session-match-the-other-two.md) — The cookie and stateless middlewares warn once when the impersonation header is ignored; the store middleware does not, and nothing says whether that is an omission
|
|
25
|
-
- [Is the agent score worker reachable without a session?](is-the-agent-score-worker-reachable-without-a-session.md) — The score worker is registered as sessionless with the helper function type, and this file wires no route or expose for it
|
|
26
|
-
- [May a scheduled test on live change data?](live-scheduled-tests-may-write.md) — Scheduled runs against a live app may only read, or may write with an explicit per-schedule approval; the choice is not made
|
|
27
|
-
- [Who calls provisionVirtualUsers?](provision-virtual-users-has-no-caller-in-this-repo.md) — provisionVirtualUsers is additive and can ban orphans, but no caller exists in this repo outside tests and skill docs, and the route its doc comment names no longer exists
|
|
28
|
-
- [Does a non-remote request need a remote token once the secret is set?](remote-secret-refuses-requests-without-a-remote-token-on-every-path.md) — With PIKKU_REMOTE_SECRET set, pikkuRemoteAuthMiddleware refuses any request lacking a Bearer header, not only /remote/rpc paths; the no-secret branch is path-scoped
|
|
29
|
-
- [Should a session set by middleware be persisted and re-issued like a function's?](should-a-middleware-set-session-persist-to-the-store.md) — Middleware setSession calls setInitial, which marks no change and writes no store entry, while a function's setSession does both; the reason is not recorded
|
|
30
|
-
- [Should a scoped secret view throw from hasSecret for a disallowed key?](should-a-scoped-secret-view-throw-from-has-secret-for-a-disallowed-key.md) — The SecretService contract says hasSecret answers for any key and must not throw, but the scoped view throws for keys outside its set
|
|
31
|
-
- [Should a Bearer token that does not verify be anonymous or refused?](should-a-wrong-bearer-token-be-anonymous-or-refused.md) — authBearer refuses a malformed scheme with InvalidSessionError but lets a well-formed wrong token through as anonymous, and no comment says why
|
|
32
|
-
- [Should an outgoing webhook go out unsigned when its configured signing secret resolves empty?](should-an-empty-webhook-signing-secret-send-unsigned.md) — When config.webhook.secret names a secret that resolves to nothing, the delivery is logged as unsigned and enqueued without a signature
|
|
33
|
-
- [Should HTTP virtual user sessions reset between scenarios in one CLI run?](should-http-virtual-user-sessions-reset-between-scenarios-in-one-run.md) — The CLI builds HTTP virtual users once and reuses them for every scenario, and only the browser side is reset between scenarios
|
|
34
|
-
- [Should the scenario cookie jar scope cookies to the API origin?](should-the-cookie-jar-scope-cookies-to-the-api-origin.md) — createCookieJar sends every held cookie to whatever URL it is given, keeps only name and value from Set-Cookie, and stamps the API origin on all calls
|
|
35
|
-
- [Should voiceInput fetch audio URLs when no host allowlist is configured?](should-voice-input-fetch-audio-urls-without-a-host-allowlist.md) — With no allowedAudioHosts, the audio URL is fetched through safeFetch with no allowlist, so any public host is reachable
|
|
36
|
-
- [What rules govern impersonation on staging and live?](staging-impersonation-rules.md) — Staged impersonation by a signed-in admin is wanted; the switch, read-only default, expiry and logging rules are proposed but not agreed
|
|
37
|
-
- [An unauthorized channel reply is sent outside the channel's declared Out type](unauthorized-channel-replies-escape-the-declared-out-type.md) — processMessageHandlers sends a bare string on auth failure, which no generated client type admits — nobody has decided what the typed shape should be
|
|
38
|
-
- [Pikku Studio Cloud has to create, hold and deliver the stage virtual user keys](virtual-user-keys-on-cloud-stages-are-pikku-studios-to-build.md) — This repo defines the variables and verifies statements; generating a pair per stage and signing for stage callers is Pikku Studio Cloud work that has not been done or checked
|
|
39
|
-
- [A virtual user statement can be replayed once per instance](virtual-user-statement-replay-is-per-process.md) — The one-time id store is an in-memory map, so on several instances or Worker isolates each accepts a statement once
|
|
40
|
-
- [What should an impersonated session carry?](what-an-impersonated-session-carries.md) — An impersonated session without a mapSession is just { userId }, dropping the orgId and virtualUser fields a normal session has; nobody has said whether that is intended
|
|
41
|
-
<!-- /pikku:knowledge-index -->
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Is the agent score worker reachable without a session?
|
|
4
|
-
description: The score worker is registered as sessionless with the helper function type, and this file wires no route or expose for it
|
|
5
|
-
tags: core, agent, scorer, security
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Is the agent score worker reachable without a session?
|
|
9
|
-
|
|
10
|
-
`packages/core/src/wirings/agent-scorer/agent-scorer-worker.ts:44-56` registers the
|
|
11
|
-
worker `pikkuAgentScoreWorker` with `sessionless: true` and `functionType: 'helper'`.
|
|
12
|
-
The file adds no HTTP or RPC wiring and no `expose` for it.
|
|
13
|
-
|
|
14
|
-
Core's meta type lists `'helper'` as one of the function types (`packages/core/src/function/function-meta.types.ts:147`).
|
|
15
|
-
The scenario coverage code skips non-user functions (`packages/core/src/wirings/workflow/scenario-coverage.ts:195`).
|
|
16
|
-
I did not trace whether a helper is routed over RPC or HTTP, or what gates a
|
|
17
|
-
sessionless function on those routes.
|
|
18
|
-
|
|
19
|
-
**Question:** should the score worker be reachable from outside the process without
|
|
20
|
-
a session, and is `helper` what keeps it off the public surface? That is not
|
|
21
|
-
settled by this file.
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: May a scheduled test on live change data?
|
|
4
|
-
description: Scheduled runs against a live app may only read, or may write with an explicit per-schedule approval; the choice is not made
|
|
5
|
-
tags: workflow, services
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# May a scheduled test on live change data?
|
|
9
|
-
|
|
10
|
-
A scheduled test runs in a live app as a test account that has the same access as
|
|
11
|
-
a real role, so it can change real data. Options proposed, none chosen:
|
|
12
|
-
- read-only by default, with writes allowed only by an explicit approval recorded
|
|
13
|
-
on each schedule;
|
|
14
|
-
- writes allowed on schedules the admin marks as writing, with a warning shown
|
|
15
|
-
before saving;
|
|
16
|
-
- no writes on live at all, with the same tests run only on staging.
|
|
17
|
-
|
|
18
|
-
The answer also decides what the failure notice must say when a write test stops
|
|
19
|
-
partway.
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Who calls provisionVirtualUsers?
|
|
4
|
-
description: provisionVirtualUsers is additive and can ban orphans, but no caller exists in this repo outside tests and skill docs, and the route its doc comment names no longer exists
|
|
5
|
-
tags: better-auth, virtual-users, provisioning
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Who calls provisionVirtualUsers?
|
|
9
|
-
|
|
10
|
-
`provisionVirtualUsers` (`packages/services/better-auth/src/provision-virtual-users.ts`)
|
|
11
|
-
creates virtual user accounts, grants their roles, and handles orphans. Orphans
|
|
12
|
-
are reported by default, or banned when `orphans: 'ban'` is set and the ban
|
|
13
|
-
plugin exists. It never deletes or revokes.
|
|
14
|
-
|
|
15
|
-
A search of this repo finds callers only in tests and skill documentation. Its
|
|
16
|
-
doc comment says it is meant to be called by an operator sign-in route on a
|
|
17
|
-
handshake that names an unknown address, but that operator sign-in was removed
|
|
18
|
-
when virtual user callers moved to signed statements, so the comment names a
|
|
19
|
-
caller that does not exist.
|
|
20
|
-
|
|
21
|
-
Open: which deployment path runs it now, and when? Until that is known, the
|
|
22
|
-
orphan policy and the refusal rules (a real, non-virtual-user account at a
|
|
23
|
-
virtual user's email throws) are untested in production.
|
package/knowledge/questions/remote-secret-refuses-requests-without-a-remote-token-on-every-path.md
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Does a non-remote request need a remote token once the secret is set?
|
|
4
|
-
description: With PIKKU_REMOTE_SECRET set, pikkuRemoteAuthMiddleware refuses any request lacking a Bearer header, not only /remote/rpc paths; the no-secret branch is path-scoped
|
|
5
|
-
tags: core, auth, remote, middleware
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Does a non-remote request need a remote token once the secret is set?
|
|
9
|
-
|
|
10
|
-
`pikkuRemoteAuthMiddleware` (`packages/core/src/middleware/remote-auth.ts`) has
|
|
11
|
-
two branches. With no secret, only a path under `/remote/rpc/` is refused, and
|
|
12
|
-
the test "requires authorization for a case-varied remote path when no secret is
|
|
13
|
-
set" pins that. With the secret set, the code reaches
|
|
14
|
-
`if (!authHeader) throw new UnauthorizedError()` for every path, because that
|
|
15
|
-
check is not gated by `isRemoteRpcPath`.
|
|
16
|
-
|
|
17
|
-
So once the secret is configured, a request to any route the middleware sees and
|
|
18
|
-
that carries no Bearer header is refused. The tests in `remote-auth.test.ts`
|
|
19
|
-
only use `/remote/rpc` paths with the secret set, so they do not show whether
|
|
20
|
-
this is meant.
|
|
21
|
-
|
|
22
|
-
Mounting, checked: in this repo nothing in a template or example mounts
|
|
23
|
-
`pikkuRemoteAuthMiddleware`. The Pikku Studio Cloud app, which lives outside this
|
|
24
|
-
repo, mounts it as wire middleware on one route only, `POST /remote/rpc/:rpcName`,
|
|
25
|
-
not globally. So for that app the question above does not arise, because the
|
|
26
|
-
middleware never sees its ordinary routes. The question stands for any app that mounts the middleware globally, which
|
|
27
|
-
this repo does not show.
|
|
28
|
-
|
|
29
|
-
What is asked: should a deployment that sets `PIKKU_REMOTE_SECRET` refuse its
|
|
30
|
-
ordinary public routes as well, or should the secret branch be path-scoped the
|
|
31
|
-
way the no-secret branch is? The code does not say which the app expects, and
|
|
32
|
-
how the app mounts the middleware is outside this package.
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Should a session set by middleware be persisted and re-issued like a function's?
|
|
4
|
-
description: Middleware setSession calls setInitial, which marks no change and writes no store entry, while a function's setSession does both; the reason is not recorded
|
|
5
|
-
tags: core, auth, session
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Should a session set by middleware be persisted and re-issued like a function's?
|
|
9
|
-
|
|
10
|
-
Two wire helpers in `packages/core/src/services/user-session-service.ts` set the
|
|
11
|
-
session differently. `createMiddlewareSessionWireProps` and the HTTP runner's
|
|
12
|
-
middleware wire (`packages/core/src/wirings/http/http-runner.ts`) bind
|
|
13
|
-
`setSession` to `setInitial`. That sets the session without marking
|
|
14
|
-
`sessionChanged` and without calling the session store. `createFunctionSessionWireProps`
|
|
15
|
-
binds `setSession` to `set`, which marks the change and writes the store.
|
|
16
|
-
|
|
17
|
-
The effect is that a session established by `authBearer`, `authAPIKey` or
|
|
18
|
-
`authCookie` is never written to the store and never triggers a cookie
|
|
19
|
-
re-issue in `authCookie`, which checks `hasSessionChanged`. A function that calls
|
|
20
|
-
`setSession` does both. The naming suggests the middleware path is meant to
|
|
21
|
-
describe the request's starting session, but no comment, test or note says so.
|
|
22
|
-
|
|
23
|
-
What is asked: is it intended that a middleware-authenticated session stays
|
|
24
|
-
request-scoped, or should middleware-set sessions reach the store like function-set
|
|
25
|
-
ones?
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Should a scoped secret view throw from hasSecret for a disallowed key?
|
|
4
|
-
description: The SecretService contract says hasSecret answers for any key and must not throw, but the scoped view throws for keys outside its set
|
|
5
|
-
tags: core, secrets, scoping
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Should a scoped secret view throw from hasSecret for a disallowed key?
|
|
9
|
-
|
|
10
|
-
The `SecretService` interface in `packages/core/src/services/secret-service.ts:13-14`
|
|
11
|
-
says `hasSecret` "answers for any key, including a disallowed one — it must not
|
|
12
|
-
throw."
|
|
13
|
-
|
|
14
|
-
`ScopedSecretService.hasSecret` in `packages/core/src/services/scoped-secret-service.ts:21-24`
|
|
15
|
-
calls `assertAllowed` first, and that throws `Access denied to secret key` for a key
|
|
16
|
-
outside the view's set (`:10-14`).
|
|
17
|
-
|
|
18
|
-
The note `a-scoped-secret-view-reads-only-declared-keys-and-never-writes.md` records
|
|
19
|
-
that the view's `hasSecret` throws, and treats that as intended.
|
|
20
|
-
|
|
21
|
-
**Question:** which governs? The view's throw follows its read rule. The contract
|
|
22
|
-
says an existence check must not throw for any key. The two cannot both hold for a
|
|
23
|
-
disallowed key.
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Should a Bearer token that does not verify be anonymous or refused?
|
|
4
|
-
description: authBearer refuses a malformed scheme with InvalidSessionError but lets a well-formed wrong token through as anonymous, and no comment says why
|
|
5
|
-
tags: core, auth, middleware
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Should a Bearer token that does not verify be anonymous or refused?
|
|
9
|
-
|
|
10
|
-
In `authBearer` (`packages/core/src/middleware/auth-bearer.ts`) the code splits
|
|
11
|
-
the header into scheme and token. A scheme other than `Bearer`, or an empty
|
|
12
|
-
token, throws `InvalidSessionError`. A `Bearer` token that then fails the static
|
|
13
|
-
constant-time compare, or decodes to nothing, does not throw. It calls `next()`
|
|
14
|
-
with no session, and the function gate decides what happens next.
|
|
15
|
-
|
|
16
|
-
Tests back both halves: "should throw InvalidSessionError when scheme is not
|
|
17
|
-
Bearer" and "should not set session when static token does not match". Neither
|
|
18
|
-
says why a malformed header is refused while a wrong credential is anonymous.
|
|
19
|
-
|
|
20
|
-
The JWT branch is different. When no static token is configured and a `jwtService`
|
|
21
|
-
is wired, `authBearer` calls `jwtService.decode(bearerToken)` with no try/catch
|
|
22
|
-
(`auth-bearer.ts`, around line 72). Core ships only the `JWTService` interface
|
|
23
|
-
(`packages/core/src/services/jwt-service.ts`). The implementation in this repo is
|
|
24
|
-
`JoseJWTService` (`packages/services/jose/src/jose-jwt-service.ts`). Its `decode`
|
|
25
|
-
calls `jose.jwtVerify` with HS256 only, so a bad signature or an expired token
|
|
26
|
-
throws, and so does an unknown key id (`Missing secret for id`). A token with no
|
|
27
|
-
key id is verified against the current secret. Because `authBearer` does not
|
|
28
|
-
catch that throw, with this implementation a bad JWT is a request error, not an
|
|
29
|
-
anonymous request. Other `JWTService` implementations are not in this repo, so
|
|
30
|
-
they are not covered by this.
|
|
31
|
-
|
|
32
|
-
What is asked: is an unverifiable Bearer token meant to be treated as no session,
|
|
33
|
-
so that a public function still answers it, or should it be refused at the
|
|
34
|
-
middleware the way a malformed header is? The two cases differ only in the
|
|
35
|
-
credential being well-formed, and the code makes no stated choice about it.
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Should an outgoing webhook go out unsigned when its configured signing secret resolves empty?
|
|
4
|
-
description: When config.webhook.secret names a secret that resolves to nothing, the delivery is logged as unsigned and enqueued without a signature
|
|
5
|
-
tags: core, webhooks, signing
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Should an outgoing webhook go out unsigned when its configured signing secret resolves empty?
|
|
9
|
-
|
|
10
|
-
`prepareDelivery` in `packages/core/src/services/queue-webhook-service.ts:52-66`
|
|
11
|
-
reads the signing secret from `config.webhook.secret` when the caller passed none
|
|
12
|
-
(`:53-55`). If that secret resolves to nothing, the code logs an error that says
|
|
13
|
-
the outgoing webhooks "will be sent UNSIGNED" (`:56-60`) and carries on. The
|
|
14
|
-
signature header is added only when a secret is present (`:62-66`), so the job
|
|
15
|
-
is enqueued without one.
|
|
16
|
-
|
|
17
|
-
The existing note `webhook-bodies-are-signed-before-they-are-enqueued.md` covers
|
|
18
|
-
signing at enqueue time and the key staying out of the queue payload. It does not
|
|
19
|
-
cover this fallback.
|
|
20
|
-
|
|
21
|
-
**Question:** should a configured but empty signing secret send the delivery
|
|
22
|
-
unsigned with a log line, or refuse to enqueue it? The code takes the first
|
|
23
|
-
option. Nothing in the file records a reason, and the only signal is the log.
|
package/knowledge/questions/should-http-virtual-user-sessions-reset-between-scenarios-in-one-run.md
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Should HTTP virtual user sessions reset between scenarios in one CLI run?
|
|
4
|
-
description: The CLI builds HTTP virtual users once and reuses them for every scenario, and only the browser side is reset between scenarios
|
|
5
|
-
tags: core, cli, scenario, virtual-users
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Should HTTP virtual user sessions reset between scenarios in one CLI run?
|
|
9
|
-
|
|
10
|
-
In `packages/cli/src/functions/commands/scenario.ts`, `createHttpVirtualUsers`
|
|
11
|
-
runs once (around line 314), and that same `virtualUsers` object is passed to
|
|
12
|
-
every `workflowService.startWorkflow` call for each scenario (around line 745).
|
|
13
|
-
Each `HttpVirtualUser` holds its own cookie jar and its `signedIn` flag for the
|
|
14
|
-
life of the process.
|
|
15
|
-
|
|
16
|
-
Before each scenario the command calls `browserLifecycle.reset()` (around line
|
|
17
|
-
723), which discards the browser's per-scenario state. Nothing resets the HTTP
|
|
18
|
-
jars: `scenario.ts` never calls `clear` or `signOut`, and
|
|
19
|
-
`PikkuScenarioService.detachRunContext` (`packages/core/src/wirings/workflow/pikku-scenario-service.ts`)
|
|
20
|
-
drops the run's map entry but not the jars inside the shared object.
|
|
21
|
-
|
|
22
|
-
So an HTTP virtual user that signed in during one scenario is still signed in for
|
|
23
|
-
the next, unless a 401 forces a re-login. The browser side is reset to keep one
|
|
24
|
-
scenario from leaving the next signed in as somebody else, as
|
|
25
|
-
[Scenario sessions are isolated per virtual user and reset between scenarios](../decisions/security/workflow-scenario-sessions-are-isolated-per-virtual-user-and-per-scenario.md)
|
|
26
|
-
records. What is asked: is the HTTP side meant to carry sessions across scenarios
|
|
27
|
-
as a speed measure, or should it be reset the same way?
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Should the scenario cookie jar scope cookies to the API origin?
|
|
4
|
-
description: createCookieJar sends every held cookie to whatever URL it is given, keeps only name and value from Set-Cookie, and stamps the API origin on all calls
|
|
5
|
-
tags: core, scenario, cookies
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Should the scenario cookie jar scope cookies to the API origin?
|
|
9
|
-
|
|
10
|
-
`createCookieJar` in `packages/core/src/services/scenario-cookie-jar.ts`
|
|
11
|
-
takes one `apiUrl` and reads its origin once. Its `fetch` ignores the host of
|
|
12
|
-
`input`. It sets the `Origin` header to that origin on every call, and it adds
|
|
13
|
-
every held cookie to every call whatever URL the call goes to.
|
|
14
|
-
|
|
15
|
-
From `Set-Cookie` it keeps only the `name=value` pair. `Path`, `Domain`,
|
|
16
|
-
`Secure`, `Max-Age` and `Expires` are discarded. A cookie is removed only when its
|
|
17
|
-
value is empty, so `session=x; Max-Age=0` would be stored as a live cookie.
|
|
18
|
-
|
|
19
|
-
The tests in `scenario-cookie-jar.test.ts` send every request to one local
|
|
20
|
-
server, so none of this is exercised. The `Origin` stamp is tested on purpose
|
|
21
|
-
("stamps the origin Better Auth checks on state-changing calls").
|
|
22
|
-
|
|
23
|
-
What is asked: is the jar meant only to talk to its own API, in which case the
|
|
24
|
-
cross-host behaviour does not matter, or should it honour cookie scope? The code
|
|
25
|
-
does not say, and the browser-side equivalent in `packages/playwright/src/provider.ts`
|
|
26
|
-
plants cookies on `appUrl` instead.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Should voiceInput fetch audio URLs when no host allowlist is configured?
|
|
4
|
-
description: With no allowedAudioHosts, the audio URL is fetched through safeFetch with no allowlist, so any public host is reachable
|
|
5
|
-
tags: core, agent, voice, ssrf
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Should voiceInput fetch audio URLs when no host allowlist is configured?
|
|
9
|
-
|
|
10
|
-
`fetchAsUint8Array` in `packages/core/src/wirings/agent/voice-input.ts:57-61` calls
|
|
11
|
-
`safeFetch` with `{ allowedHosts: allowedAudioHosts }`. That value is optional.
|
|
12
|
-
The caller passes `config.allowedAudioHosts` for a URL audio part (`:136-138`).
|
|
13
|
-
|
|
14
|
-
In `packages/core/src/utils/safe-fetch.ts:269-273`, with no allowlist the only
|
|
15
|
-
host check is the private-host refusal. So a URL that is not on a list, but is
|
|
16
|
-
public, is fetched when no list is configured.
|
|
17
|
-
|
|
18
|
-
**Question:** should `voiceInput` require `allowedAudioHosts` before it fetches a
|
|
19
|
-
URL, or is the private-host block meant to be enough? The code takes the second
|
|
20
|
-
option. No note or comment in the file says which is intended.
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: What rules govern impersonation on staging and live?
|
|
4
|
-
description: Staged impersonation by a signed-in admin is wanted; the switch, read-only default, expiry and logging rules are proposed but not agreed
|
|
5
|
-
tags: auth, services
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# What rules govern impersonation on staging and live?
|
|
9
|
-
|
|
10
|
-
Wanted: a signed-in admin on a deployed environment can impersonate a virtual user,
|
|
11
|
-
using the header on the normal cookie session. The code already applies
|
|
12
|
-
impersonation on that path (`auth-session.ts`, the human branch).
|
|
13
|
-
|
|
14
|
-
Not yet agreed:
|
|
15
|
-
|
|
16
|
-
- **Per-environment switch.** On for staging; off for production. The request
|
|
17
|
-
is that it is off unless turned on for that environment.
|
|
18
|
-
- **Read-only by default.** Writes made while impersonating change real data.
|
|
19
|
-
- **Expiry.** An impersonation ends after a short time.
|
|
20
|
-
- **Logging.** Each impersonated request records the real admin and the target.
|
|
21
|
-
Today the impersonation line is `info` and does not record the admin against
|
|
22
|
-
each request.
|
|
23
|
-
- **Banner.** The panel shows "viewing as X".
|
|
24
|
-
|
|
25
|
-
Also unverified: the default impersonation gate reads the owner's scopes
|
|
26
|
-
(`userHoldsScopes(result.user.id, …)`), not the scopes of the key or session that
|
|
27
|
-
made the request.
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: An unauthorized channel reply is sent outside the channel's declared Out type
|
|
4
|
-
description: processMessageHandlers sends a bare string on auth failure, which no generated client type admits — nobody has decided what the typed shape should be
|
|
5
|
-
tags: core, channel
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# An unauthorized channel reply is sent outside the channel's declared Out type
|
|
9
|
-
|
|
10
|
-
When a message arrives on a channel route that requires a session and none is
|
|
11
|
-
attached, `processMessageHandlers` in
|
|
12
|
-
`packages/core/src/wirings/channel/channel-handler.ts` logs the failure and then
|
|
13
|
-
sends the client a bare string:
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
channelHandler.getChannel().send(`Unauthorized for ${routeMessage}`)
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
That compiles only because `processMessageHandlers` takes
|
|
20
|
-
`PikkuChannelHandler`, whose generics default to `<unknown, unknown>`, so `send`
|
|
21
|
-
accepts anything at this call site. The channel the application actually
|
|
22
|
-
declared has a concrete `Out`, and the generated client is typed from it. A
|
|
23
|
-
client can therefore receive a value its own types say is impossible, and no
|
|
24
|
-
`@pikku/client-websocket` consumer has a branch for it.
|
|
25
|
-
|
|
26
|
-
The alternatives were never worked through:
|
|
27
|
-
|
|
28
|
-
- **Widen every channel's `Out`** to `Out | ChannelError`, so the error is part
|
|
29
|
-
of the contract. Honest, but it forces a discriminated union on every consumer
|
|
30
|
-
including channels that can never fail auth.
|
|
31
|
-
- **Send on a reserved envelope** the way `channel-rpc` does, and let the client
|
|
32
|
-
library surface it out-of-band rather than as a message. Keeps `Out` clean,
|
|
33
|
-
but adds a second framing that every runtime adapter has to honour.
|
|
34
|
-
- **Send nothing** and let the close code carry it. Simplest, and loses the
|
|
35
|
-
route name that makes the failure debuggable.
|
|
36
|
-
|
|
37
|
-
Until one is chosen the string stays, because dropping it silently is worse: a
|
|
38
|
-
client that is quietly ignored has no way to tell "unauthorized" from "the
|
|
39
|
-
server is slow".
|
|
40
|
-
|
|
41
|
-
**What would settle it:** deciding whether channel-level errors belong in `Out`
|
|
42
|
-
at all, which is the same question `channel-rpc` already answered for RPC frames
|
|
43
|
-
by giving them their own envelope. If the answer is "same as RPC", this becomes
|
|
44
|
-
a decision note and the string becomes an envelope.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: Pikku Studio Cloud has to create, hold and deliver the stage virtual user keys
|
|
4
|
-
description: This repo defines the variables and verifies statements; generating a pair per stage and signing for stage callers is Pikku Studio Cloud work that has not been done or checked
|
|
5
|
-
tags: services
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Pikku Studio Cloud has to create, hold and deliver the stage virtual user keys
|
|
9
|
-
|
|
10
|
-
The Pikku Studio Cloud repository is not on the machine this was built on, so none of the
|
|
11
|
-
following is built or confirmed. Pikku Studio Cloud must:
|
|
12
|
-
|
|
13
|
-
1. Generate one Ed25519 key pair per stage at creation and keep the private key in its
|
|
14
|
-
backend, never on the stage.
|
|
15
|
-
2. Set the stage variable `VIRTUAL_USER_VERIFY_KEY` to the public key (SPKI DER,
|
|
16
|
-
base64), and accept that name, which starts with neither `PIKKU_` nor `PIKKUSTUDIO_`.
|
|
17
|
-
3. Set `VIRTUAL_USER_API_URL` on every stage that runs virtual users, to the public
|
|
18
|
-
URL including any HTTP prefix.
|
|
19
|
-
4. Sign statements with the stage's private key for callers acting on a stage, or hand
|
|
20
|
-
the key to the CLI as `VIRTUAL_USER_SIGNING_KEY` through the channel it already uses
|
|
21
|
-
for stage credentials.
|
|
22
|
-
5. Stop sending the operator token field in `runVirtualUser` requests; the field no longer
|
|
23
|
-
exists.
|
|
24
|
-
6. For the stage switcher, sign a statement for the chosen virtual user and pass it to
|
|
25
|
-
`/sign-in/switch-virtual-user` as `statement`.
|
|
26
|
-
|
|
27
|
-
Unverified: that Pikku Studio Cloud accepts an arbitrary unreserved variable per stage, that a
|
|
28
|
-
Worker can fetch its own public hostname (the run needs this on Workers), and that the
|
|
29
|
-
`audience` plugin option copes with a proxy that rewrites the origin. A run without a
|
|
30
|
-
sign-in path reads roles from the `getMyScopes` RPC and falls back to
|
|
31
|
-
`/auth/get-session`.
|
|
32
|
-
|
|
33
|
-
**What would settle it:** Pikku Studio Cloud landing the six items, and one stage run end to end.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: A virtual user statement can be replayed once per instance
|
|
4
|
-
description: The one-time id store is an in-memory map, so on several instances or Worker isolates each accepts a statement once
|
|
5
|
-
tags: services
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# A virtual user statement can be replayed once per instance
|
|
9
|
-
|
|
10
|
-
`JoseVirtualUserStatementVerifier` remembers accepted `jti` values in a per-process
|
|
11
|
-
map. On a single node that makes a statement single-use. On several instances, or
|
|
12
|
-
Cloudflare Workers where isolates share nothing, a captured statement can be accepted
|
|
13
|
-
once per instance within its few-minute life.
|
|
14
|
-
|
|
15
|
-
The lifetime ceiling (300 seconds) and the signed audience bound the damage; neither
|
|
16
|
-
removes it.
|
|
17
|
-
|
|
18
|
-
**What would settle it:** a shared store — the Better Auth `verification` table is
|
|
19
|
-
already there — behind the verifier, or a decision that the bound is acceptable for
|
|
20
|
-
stages. Not built.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: question
|
|
3
|
-
title: What should an impersonated session carry?
|
|
4
|
-
description: An impersonated session without a mapSession is just { userId }, dropping the orgId and virtualUser fields a normal session has; nobody has said whether that is intended
|
|
5
|
-
tags: better-auth, impersonation, sessions
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# What should an impersonated session carry?
|
|
9
|
-
|
|
10
|
-
When impersonation resolves and the app has no `mapSession`,
|
|
11
|
-
`resolveImpersonatedSession` returns `{ userId: target }`
|
|
12
|
-
(`packages/services/better-auth/src/auth-session-impersonation.ts`). A normal
|
|
13
|
-
session from the same middleware carries more: the `orgId` `defaultSession` reads
|
|
14
|
-
from the active organization, the `virtualUser` flag `stampVirtualUserFlag` adds,
|
|
15
|
-
and whatever `mapSession` adds.
|
|
16
|
-
|
|
17
|
-
So an impersonated request can behave differently from the same user signing in
|
|
18
|
-
directly. The code makes the choice; no comment or note defends it.
|
|
19
|
-
|
|
20
|
-
Open: should the impersonated session copy the target's `orgId` and `virtualUser`
|
|
21
|
-
stamp, or is a bare id intended? Answering it decides whether org-scoped reads
|
|
22
|
-
work under impersonation.
|