@pikku/core 0.12.142 → 0.12.144
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/analytics.d.ts +14 -0
- package/dist/analytics/analytics.js +14 -0
- package/dist/analytics/analytics.types.d.ts +1 -0
- package/dist/analytics/anonymous-analytics-identity.d.ts +1 -0
- package/dist/analytics/cookie-analytics-identity.d.ts +1 -0
- package/dist/analytics/mint-cookie.d.ts +1 -0
- package/dist/{wirings/channel/channel-middleware-runner.d.ts → channel-middleware-runner.d.ts} +17 -3
- package/dist/{wirings/channel/channel-middleware-runner.js → channel-middleware-runner.js} +24 -8
- package/dist/classification/data-classification.d.ts +13 -0
- package/dist/classification/secret-value.d.ts +7 -0
- package/dist/classification/secret-value.js +7 -0
- package/dist/crypto-utils.d.ts +93 -0
- package/dist/crypto-utils.js +92 -0
- package/dist/dev/hot-reload.d.ts +16 -0
- package/dist/dev/hot-reload.js +16 -1
- package/dist/dev/module-runner.js +7 -3
- package/dist/dev/reload-meta.js +1 -1
- package/dist/errors/error-handler.d.ts +9 -0
- package/dist/errors/error-handler.js +8 -0
- package/dist/errors/errors.d.ts +219 -0
- package/dist/errors/errors.js +227 -0
- package/dist/errors/serialized-error.d.ts +4 -0
- package/dist/function/abort-scope.d.ts +5 -0
- package/dist/function/function-meta.types.d.ts +20 -0
- package/dist/function/function-runner.d.ts +41 -0
- package/dist/function/function-runner.js +57 -11
- package/dist/function/functions.types.d.ts +59 -0
- package/dist/function/functions.types.js +23 -0
- package/dist/function/list.types.d.ts +4 -0
- package/dist/lifecycle.d.ts +12 -1
- package/dist/lifecycle.js +12 -1
- package/dist/middleware/addon-scope-cap.d.ts +4 -0
- package/dist/middleware/addon-scope-cap.js +7 -3
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.js +5 -13
- package/dist/middleware/auth-cookie.js +3 -3
- package/dist/middleware/middleware-factories.d.ts +17 -0
- package/dist/middleware/middleware-factories.js +17 -0
- package/dist/middleware/middleware.types.d.ts +23 -0
- package/dist/middleware/remote-auth.d.ts +15 -0
- package/dist/middleware/remote-auth.js +18 -3
- package/dist/middleware/remote-jobs-secret.js +2 -10
- package/dist/middleware-runner.d.ts +7 -0
- package/dist/middleware-runner.js +23 -7
- package/dist/permissions.d.ts +13 -0
- package/dist/permissions.js +13 -0
- package/dist/pikku-state.d.ts +49 -0
- package/dist/pikku-state.js +49 -0
- package/dist/remote.js +20 -5
- package/dist/schema.d.ts +36 -0
- package/dist/schema.js +36 -0
- package/dist/services/agent-run-state-service.d.ts +8 -0
- package/dist/services/agent-runner-service.d.ts +24 -0
- package/dist/services/agent-storage-service.d.ts +8 -0
- package/dist/services/ai-embedding-service.d.ts +4 -0
- package/dist/services/audit-service.d.ts +48 -0
- package/dist/services/audit-service.js +22 -0
- package/dist/services/content-service.d.ts +34 -0
- package/dist/services/credential-wire-service.d.ts +9 -0
- package/dist/services/credential-wire-service.js +9 -0
- package/dist/services/deployment-service.d.ts +14 -0
- package/dist/services/email-service.d.ts +20 -0
- package/dist/services/email-template.d.ts +24 -0
- package/dist/services/email-template.js +12 -0
- package/dist/services/file-scenario-run-store.d.ts +5 -0
- package/dist/services/file-scenario-run-store.js +4 -0
- package/dist/services/gateway-service.d.ts +5 -0
- package/dist/services/in-memory-agent-run-state-service.d.ts +5 -0
- package/dist/services/in-memory-agent-run-state-service.js +5 -0
- package/dist/services/in-memory-lease-service.d.ts +5 -0
- package/dist/services/in-memory-lease-service.js +5 -0
- package/dist/services/in-memory-session-store.d.ts +4 -0
- package/dist/services/in-memory-session-store.js +4 -0
- package/dist/services/incoming-webhook-queue.d.ts +2 -0
- package/dist/services/incoming-webhook-queue.js +2 -0
- package/dist/services/incoming-webhook-service.d.ts +11 -1
- package/dist/services/incoming-webhook-service.js +5 -1
- package/dist/services/index.d.ts +1 -5
- package/dist/services/index.js +1 -5
- package/dist/services/jwt-service.d.ts +8 -0
- package/dist/services/lease-service.d.ts +5 -0
- package/dist/services/lease-service.js +1 -0
- package/dist/services/local-content-request-handler.d.ts +20 -0
- package/dist/services/local-content-request-handler.js +11 -0
- package/dist/services/local-content.d.ts +45 -0
- package/dist/services/local-content.js +35 -0
- package/dist/services/local-credential-service.d.ts +5 -0
- package/dist/services/local-credential-service.js +5 -0
- package/dist/services/local-email-service.d.ts +7 -0
- package/dist/services/local-email-service.js +7 -0
- package/dist/services/local-secrets.d.ts +8 -0
- package/dist/services/local-secrets.js +8 -0
- package/dist/services/local-variables.d.ts +6 -0
- package/dist/services/local-variables.js +6 -0
- package/dist/services/logger.d.ts +4 -0
- package/dist/services/logger.js +4 -0
- package/dist/services/meta-service.d.ts +38 -0
- package/dist/services/meta-service.js +6 -0
- package/dist/services/queue-webhook-service.d.ts +19 -0
- package/dist/services/queue-webhook-service.js +19 -0
- package/dist/services/remote-jobs.d.ts +8 -13
- package/dist/services/remote-jobs.js +3 -54
- package/dist/services/scenario-cookie-jar.d.ts +4 -0
- package/dist/services/scheduler-service.d.ts +16 -0
- package/dist/services/scheduler-service.js +12 -0
- package/dist/services/schema-service.d.ts +9 -0
- package/dist/services/scope-service.d.ts +10 -0
- package/dist/services/scoped-secret-service.d.ts +5 -0
- package/dist/services/scoped-secret-service.js +5 -0
- package/dist/services/secret-host-binding.d.ts +5 -0
- package/dist/services/secret-host-binding.js +5 -0
- package/dist/services/secret-service.d.ts +19 -1
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +6 -0
- package/dist/services/session-store.d.ts +5 -0
- package/dist/services/stub-tracker.d.ts +1 -0
- package/dist/services/temporary-file-service.d.ts +9 -0
- package/dist/services/temporary-file-service.js +9 -0
- package/dist/services/trigger-service.d.ts +4 -0
- package/dist/services/trigger-source-store.d.ts +13 -0
- package/dist/services/trigger-source-store.js +7 -0
- package/dist/services/typed-credential-service.d.ts +6 -0
- package/dist/services/typed-credential-service.js +5 -0
- package/dist/services/typed-secret-service.d.ts +12 -0
- package/dist/services/typed-secret-service.js +11 -0
- package/dist/services/typed-variables-service.d.ts +1 -0
- package/dist/services/user-session-service.d.ts +31 -1
- package/dist/services/user-session-service.js +29 -3
- package/dist/services/v8-coverage-service.d.ts +27 -0
- package/dist/services/v8-coverage-service.js +5 -0
- package/dist/services/variables-service.d.ts +8 -0
- package/dist/services/virtual-user-sign-in.d.ts +1 -0
- package/dist/services/virtual-user-statement.d.ts +8 -0
- package/dist/services/virtual-user-statement.js +4 -0
- package/dist/services/webhook-service.d.ts +25 -0
- package/dist/services/webhook-service.js +15 -0
- package/dist/services/workflow-service.d.ts +6 -0
- package/dist/test-utils.js +1 -1
- package/dist/testing/service-tests.d.ts +4 -0
- package/dist/time-utils.d.ts +15 -0
- package/dist/time-utils.js +14 -0
- package/dist/types/core.types.d.ts +80 -0
- package/dist/types/state.types.d.ts +4 -0
- package/dist/utils/hmac.d.ts +3 -0
- package/dist/utils/safe-fetch.d.ts +14 -0
- package/dist/utils/safe-fetch.js +13 -0
- package/dist/utils/stable-stringify.d.ts +11 -0
- package/dist/utils/stable-stringify.js +33 -0
- package/dist/utils.d.ts +28 -0
- package/dist/utils.js +22 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.js +7 -0
- package/dist/wirings/addon/define-screens.d.ts +2 -0
- package/dist/wirings/addon/remote-addon-auth.d.ts +9 -0
- package/dist/wirings/addon/remote-addon-auth.js +5 -0
- package/dist/wirings/addon/wire-addon.d.ts +4 -0
- package/dist/wirings/addon/wire-remote-addon.d.ts +1 -0
- package/dist/wirings/agent/agent-agui.d.ts +14 -5
- package/dist/wirings/agent/agent-agui.js +17 -6
- package/dist/wirings/agent/agent-helpers.d.ts +61 -1
- package/dist/wirings/agent/agent-helpers.js +62 -2
- package/dist/wirings/agent/agent-interrupt.d.ts +5 -0
- package/dist/wirings/agent/agent-output.d.ts +20 -0
- package/dist/wirings/agent/agent-output.js +69 -0
- package/dist/wirings/agent/agent-prepare.d.ts +41 -0
- package/dist/wirings/agent/agent-prepare.js +38 -2
- package/dist/wirings/agent/agent-registry.d.ts +8 -0
- package/dist/wirings/agent/agent-registry.js +10 -4
- package/dist/wirings/agent/agent-runner.d.ts +33 -0
- package/dist/wirings/agent/agent-runner.js +40 -7
- package/dist/wirings/agent/agent-stream.d.ts +30 -0
- package/dist/wirings/agent/agent-stream.js +33 -11
- package/dist/wirings/agent/agent.types.d.ts +43 -0
- package/dist/wirings/agent/voice-input.d.ts +12 -0
- package/dist/wirings/agent/voice-input.js +12 -0
- package/dist/wirings/agent/voice-output.d.ts +14 -0
- package/dist/wirings/agent/voice-output.js +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-judge.js +1 -2
- package/dist/wirings/agent-scorer/agent-scorer-registry.d.ts +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-registry.js +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.d.ts +1 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.js +1 -0
- package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +7 -0
- package/dist/wirings/channel/channel-common.js +1 -1
- package/dist/wirings/channel/channel-rpc.types.d.ts +5 -0
- package/dist/wirings/channel/channel-runner.d.ts +22 -0
- package/dist/wirings/channel/channel-runner.js +22 -0
- package/dist/wirings/channel/channel-store.d.ts +8 -0
- package/dist/wirings/channel/channel-store.js +7 -0
- package/dist/wirings/channel/channel.types.d.ts +18 -0
- package/dist/wirings/channel/define-channel-routes.d.ts +5 -0
- package/dist/wirings/channel/define-channel-routes.js +5 -0
- package/dist/wirings/channel/eventhub-service.d.ts +9 -0
- package/dist/wirings/channel/eventhub-store.d.ts +1 -0
- package/dist/wirings/channel/eventhub-store.js +1 -0
- package/dist/wirings/channel/index.d.ts +1 -1
- package/dist/wirings/channel/index.js +1 -1
- package/dist/wirings/channel/local/local-channel-handler.d.ts +1 -0
- package/dist/wirings/channel/local/local-channel-handler.js +1 -0
- package/dist/wirings/channel/local/local-channel-runner.d.ts +13 -0
- package/dist/wirings/channel/local/local-channel-runner.js +13 -0
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +1 -0
- package/dist/wirings/channel/local/local-eventhub-service.js +1 -0
- package/dist/wirings/channel/log-channels.d.ts +1 -0
- package/dist/wirings/channel/log-channels.js +1 -0
- package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +5 -0
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +5 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +32 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +31 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +8 -0
- package/dist/wirings/cli/channel/cli-channel-runner.js +8 -0
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +1 -0
- package/dist/wirings/cli/cli-runner.d.ts +43 -0
- package/dist/wirings/cli/cli-runner.js +43 -0
- package/dist/wirings/cli/command-parser.d.ts +13 -0
- package/dist/wirings/cli/command-parser.js +12 -0
- package/dist/wirings/credential/credential-overrides.d.ts +1 -0
- package/dist/wirings/credential/credential.types.d.ts +7 -0
- package/dist/wirings/credential/validate-credential-definitions.d.ts +7 -0
- package/dist/wirings/credential/validate-credential-definitions.js +7 -0
- package/dist/wirings/flag/cached-flag-source.d.ts +1 -0
- package/dist/wirings/flag/flag.types.d.ts +3 -0
- package/dist/wirings/gateway/gateway-runner.d.ts +23 -0
- package/dist/wirings/gateway/gateway-runner.js +23 -0
- package/dist/wirings/gateway/gateway.types.d.ts +3 -0
- package/dist/wirings/gateway/local-gateway-service.d.ts +10 -0
- package/dist/{services → wirings/gateway}/local-gateway-service.js +6 -2
- package/dist/wirings/http/http-routes.d.ts +21 -0
- package/dist/wirings/http/http-routes.js +11 -0
- package/dist/wirings/http/http-runner.d.ts +71 -0
- package/dist/wirings/http/http-runner.js +73 -5
- package/dist/wirings/http/http.types.d.ts +27 -0
- package/dist/wirings/http/index.d.ts +1 -0
- package/dist/wirings/http/index.js +1 -0
- package/dist/wirings/http/log-http-routes.d.ts +1 -0
- package/dist/wirings/http/log-http-routes.js +1 -0
- package/dist/wirings/http/merge-request-data.d.ts +12 -0
- package/dist/wirings/http/merge-request-data.js +42 -0
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.js +3 -32
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-response.js +1 -0
- package/dist/wirings/http/routers/http-router.d.ts +6 -0
- package/dist/wirings/http/routers/http-router.js +6 -0
- package/dist/wirings/http/web-request.d.ts +17 -0
- package/dist/wirings/http/web-request.js +17 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +7 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.js +7 -0
- package/dist/wirings/mcp/mcp-runner.d.ts +63 -0
- package/dist/wirings/mcp/mcp-runner.js +62 -0
- package/dist/wirings/mcp/mcp.types.d.ts +12 -0
- package/dist/wirings/node/node.types.d.ts +4 -0
- package/dist/wirings/oauth2/oauth2.types.d.ts +2 -0
- package/dist/wirings/queue/in-memory-queue-service.d.ts +23 -0
- package/dist/wirings/queue/in-memory-queue-service.js +129 -0
- package/dist/wirings/queue/index.d.ts +2 -1
- package/dist/wirings/queue/index.js +1 -0
- package/dist/wirings/queue/queue-identity.js +2 -14
- package/dist/wirings/queue/queue-runner.d.ts +37 -0
- package/dist/wirings/queue/queue-runner.js +37 -0
- package/dist/wirings/queue/queue.types.d.ts +56 -0
- package/dist/wirings/queue/register-queue-helper.d.ts +12 -0
- package/dist/wirings/queue/register-queue-helper.js +11 -0
- package/dist/wirings/queue/remote-queue-job.d.ts +11 -0
- package/dist/wirings/queue/remote-queue-job.js +41 -0
- package/dist/wirings/queue/signed-queue-service.d.ts +4 -1
- package/dist/wirings/queue/signed-queue-service.js +3 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +1 -0
- package/dist/wirings/role/role.types.d.ts +3 -0
- package/dist/wirings/rpc/rpc-runner.d.ts +24 -0
- package/dist/wirings/rpc/rpc-runner.js +37 -2
- package/dist/wirings/rpc/rpc-types.d.ts +2 -0
- package/dist/wirings/scheduler/index.d.ts +2 -1
- package/dist/wirings/scheduler/index.js +1 -0
- package/dist/wirings/scheduler/log-schedulers.d.ts +1 -0
- package/dist/wirings/scheduler/log-schedulers.js +1 -0
- package/dist/wirings/scheduler/remote-scheduled-job.d.ts +11 -0
- package/dist/wirings/scheduler/remote-scheduled-job.js +20 -0
- package/dist/wirings/scheduler/scheduler-runner.d.ts +29 -0
- package/dist/wirings/scheduler/scheduler-runner.js +28 -0
- package/dist/wirings/scheduler/scheduler.types.d.ts +15 -0
- package/dist/wirings/scope/scope.types.d.ts +5 -0
- package/dist/wirings/secret/index.d.ts +2 -2
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +26 -1
- package/dist/wirings/secret/secret.types.js +1 -0
- package/dist/wirings/secret/validate-secret-definitions.d.ts +8 -0
- package/dist/wirings/secret/validate-secret-definitions.js +15 -0
- package/dist/wirings/trigger/in-memory-trigger-service.d.ts +11 -0
- package/dist/{services → wirings/trigger}/in-memory-trigger-service.js +10 -3
- package/dist/wirings/trigger/index.d.ts +1 -1
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +8 -3
- package/dist/wirings/trigger/pikku-trigger-service.js +14 -3
- package/dist/wirings/trigger/trigger-runner.d.ts +27 -2
- package/dist/wirings/trigger/trigger-runner.js +35 -2
- package/dist/wirings/trigger/trigger.types.d.ts +26 -4
- package/dist/wirings/trigger/webhook-source-runner.d.ts +24 -0
- package/dist/wirings/trigger/webhook-source-runner.js +19 -0
- package/dist/wirings/trigger/webhook-source.types.d.ts +12 -2
- package/dist/wirings/trigger/webhook-source.types.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +7 -0
- package/dist/wirings/variable/validate-variable-definitions.js +7 -0
- package/dist/wirings/variable/variable.types.d.ts +7 -0
- package/dist/wirings/virtual-user/conversation/conversation.types.d.ts +5 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.d.ts +6 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.js +1 -1
- package/dist/{services → wirings/virtual-user}/http-virtual-users.d.ts +4 -3
- package/dist/{services → wirings/virtual-user}/http-virtual-users.js +6 -6
- package/dist/wirings/virtual-user/index.d.ts +1 -1
- package/dist/wirings/virtual-user/index.js +1 -1
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +2 -1
- package/dist/wirings/virtual-user/run-virtual-user.js +1 -14
- package/dist/wirings/virtual-user/virtual-user-declaration.types.d.ts +4 -0
- package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +10 -1
- package/dist/wirings/virtual-user/virtual-user-scaffold.js +5 -0
- package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +5 -0
- package/dist/wirings/virtual-user/virtual-user-schedule.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +1 -0
- package/dist/wirings/webhook/define-outgoing-webhook.d.ts +20 -0
- package/dist/wirings/webhook/define-outgoing-webhook.js +9 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +8 -4
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +7 -0
- package/dist/wirings/workflow/dsl/workflow-runner.js +7 -0
- package/dist/wirings/workflow/feature.d.ts +12 -0
- package/dist/wirings/workflow/feature.js +12 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +5 -0
- package/dist/wirings/workflow/graph/graph-node.js +5 -0
- package/dist/wirings/workflow/graph/template.d.ts +6 -0
- package/dist/wirings/workflow/graph/template.js +5 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +12 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.js +10 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +11 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.js +1 -0
- package/dist/{services → wirings/workflow}/in-memory-workflow-service.d.ts +8 -3
- package/dist/{services → wirings/workflow}/in-memory-workflow-service.js +9 -4
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +1 -1
- package/dist/wirings/workflow/pikku-scenario-service.js +2 -2
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +1 -0
- package/dist/wirings/workflow/pikku-workflow-service.js +1 -0
- package/dist/wirings/workflow/run-timeline.d.ts +21 -0
- package/dist/wirings/workflow/run-timeline.js +15 -7
- package/dist/wirings/workflow/scenario-coverage.d.ts +1 -0
- package/dist/wirings/workflow/scenario-poll.d.ts +1 -0
- package/dist/wirings/workflow/scenario-prose.d.ts +6 -0
- package/dist/wirings/workflow/scenario-prose.js +6 -0
- package/dist/wirings/workflow/scenario-run.types.d.ts +3 -0
- package/dist/wirings/workflow/scenario-step.types.d.ts +1 -0
- package/dist/wirings/workflow/scenario-step.types.js +1 -0
- package/dist/wirings/workflow/scenario-surface.js +1 -13
- package/dist/wirings/workflow/scenario.types.d.ts +6 -0
- package/dist/wirings/workflow/workflow-approval-policy.d.ts +6 -0
- package/dist/wirings/workflow/workflow-approval-policy.js +6 -0
- package/dist/wirings/workflow/workflow-constants.d.ts +7 -1
- package/dist/wirings/workflow/workflow-constants.js +10 -1
- package/dist/wirings/workflow/workflow-errors.d.ts +13 -0
- package/dist/wirings/workflow/workflow-errors.js +13 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +4 -0
- package/dist/wirings/workflow/workflow-invocation-id.js +4 -0
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +3 -0
- package/dist/wirings/workflow/workflow-run-ownership.d.ts +1 -0
- package/dist/wirings/workflow/workflow-run-ownership.js +1 -0
- package/dist/wirings/workflow/workflow-status-stream.d.ts +1 -0
- package/dist/wirings/workflow/workflow-unwind-plan.js +2 -7
- package/dist/wirings/workflow/workflow.types.d.ts +40 -0
- package/package.json +26 -9
- package/CHANGELOG.md +0 -6961
- package/dist/services/in-memory-queue-service.d.ts +0 -8
- package/dist/services/in-memory-queue-service.js +0 -54
- package/dist/services/in-memory-trigger-service.d.ts +0 -4
- package/dist/services/local-gateway-service.d.ts +0 -6
- package/dist/utils/hash.d.ts +0 -2
- package/dist/utils/hash.js +0 -23
- package/knowledge/decisions/index.md +0 -19
- package/knowledge/decisions/internals/a-credential-name-declared-twice-must-agree-on-schema-and-type.md +0 -29
- package/knowledge/decisions/internals/a-grant-can-name-a-scope-declared-without-its-addon.md +0 -29
- package/knowledge/decisions/internals/a-held-run-is-woken-later-not-retried.md +0 -28
- package/knowledge/decisions/internals/a-non-streaming-agent-run-registers-with-agentrunstate-too.md +0 -22
- package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +0 -50
- package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +0 -20
- package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +0 -21
- package/knowledge/decisions/internals/a-scheduled-task-writes-its-caller-session-before-it-runs.md +0 -22
- package/knowledge/decisions/internals/a-secret-set-in-memory-shadows-the-variable-of-the-same-name.md +0 -28
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +0 -49
- package/knowledge/decisions/internals/a-virtual-user-acts-through-invokeraw-so-a-refusal-is-data.md +0 -32
- package/knowledge/decisions/internals/a-virtual-user-cadence-is-a-row-not-a-timer.md +0 -66
- package/knowledge/decisions/internals/a-virtual-user-converse-signs-in-before-its-first-turn.md +0 -24
- package/knowledge/decisions/internals/a-virtual-user-decides-whether-to-trust-memory-once-per-turn.md +0 -21
- package/knowledge/decisions/internals/a-virtual-user-email-is-computed-with-the-run-id-as-a-sub-address.md +0 -34
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-but-it-needs-a-trigger.md +0 -65
- package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +0 -46
- package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +0 -45
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +0 -26
- package/knowledge/decisions/internals/addon-pikku-meta-ships-at-the-package-root-or-under-dist.md +0 -32
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +0 -33
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +0 -28
- package/knowledge/decisions/internals/agent-agui-bridge-obeys-the-client-ordering-contract.md +0 -29
- package/knowledge/decisions/internals/agent-audio-chunks-carry-the-format-the-provider-returned.md +0 -20
- package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +0 -21
- package/knowledge/decisions/internals/agent-credential-suspensions-hide-the-tool-result.md +0 -26
- package/knowledge/decisions/internals/agent-delegate-and-supervise-hide-different-text.md +0 -26
- package/knowledge/decisions/internals/agent-llm-tool-arguments-have-nulls-stripped.md +0 -23
- package/knowledge/decisions/internals/agent-model-config-stays-a-single-resolution-seam.md +0 -25
- package/knowledge/decisions/internals/agent-onerror-hooks-cannot-change-the-failure.md +0 -22
- package/knowledge/decisions/internals/agent-runner-methods-must-keep-their-receiver.md +0 -22
- package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +0 -22
- package/knowledge/decisions/internals/agent-stream-persistence-is-best-effort.md +0 -27
- package/knowledge/decisions/internals/agent-sub-agents-inherit-the-parent-context-block.md +0 -26
- package/knowledge/decisions/internals/agent-tool-execute-failures-are-logged-unconditionally.md +0 -25
- package/knowledge/decisions/internals/agent-voice-input-transcribes-audio-parts-in-place.md +0 -22
- package/knowledge/decisions/internals/agent-working-memory-is-persisted-only-when-valid.md +0 -25
- package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +0 -39
- package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +0 -23
- package/knowledge/decisions/internals/an-agent-is-offered-under-its-registry-key-and-only-within-the-virtual-users-scopes.md +0 -27
- package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +0 -25
- package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +0 -22
- package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +0 -20
- package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +0 -22
- package/knowledge/decisions/internals/an-oauth2-credential-implies-an-optional-app-secret.md +0 -26
- package/knowledge/decisions/internals/an-unref-d-timer-cannot-be-awaited-under-node-test.md +0 -66
- package/knowledge/decisions/internals/analytics-identity-resolvers-run-in-declared-order.md +0 -22
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +0 -30
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +0 -31
- package/knowledge/decisions/internals/channel-state-accessors-are-unsound-generics-that-every-implementation-asserts.md +0 -33
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +0 -29
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +0 -28
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +0 -27
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +0 -28
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +0 -34
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +0 -29
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +0 -84
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +0 -41
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +0 -44
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +0 -39
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +0 -42
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +0 -39
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +0 -43
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +0 -38
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +0 -44
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +0 -27
- package/knowledge/decisions/internals/feature-flag-declarations-refuse-an-empty-anyof-and-conflicting-scopes.md +0 -22
- package/knowledge/decisions/internals/feature-flags-fail-open-and-never-enforce-access.md +0 -28
- package/knowledge/decisions/internals/flag-sync-rewrites-only-the-declared-text.md +0 -24
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +0 -32
- package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +0 -43
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +0 -28
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +0 -31
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +0 -26
- package/knowledge/decisions/internals/global-middleware-resolves-from-the-root-namespace-too.md +0 -32
- package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +0 -38
- package/knowledge/decisions/internals/hot-reload-writes-into-the-function-map-captured-at-startup.md +0 -26
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +0 -32
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +0 -28
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +0 -30
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +0 -26
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +0 -28
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +0 -32
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +0 -26
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +0 -25
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +0 -26
- package/knowledge/decisions/internals/index.md +0 -181
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +0 -25
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +0 -26
- package/knowledge/decisions/internals/mcp-wire-names-are-assigned-over-the-whole-registry.md +0 -39
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +0 -24
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +0 -53
- package/knowledge/decisions/internals/only-exposed-functions-enter-a-virtual-user-catalogue.md +0 -21
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +0 -28
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +0 -27
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +0 -31
- package/knowledge/decisions/internals/role-names-cannot-contain-the-scope-separator.md +0 -30
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +0 -32
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +0 -31
- package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +0 -24
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +0 -26
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +0 -27
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +0 -48
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +0 -30
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +0 -28
- package/knowledge/decisions/internals/side-effects-are-an-allowlist-not-a-boolean.md +0 -34
- package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +0 -24
- package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +0 -26
- package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +0 -43
- package/knowledge/decisions/internals/the-core-scope-validator-refuses-separator-wildcard-and-empty-segments.md +0 -22
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +0 -30
- package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +0 -83
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +0 -29
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +0 -27
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +0 -40
- package/knowledge/decisions/internals/the-mcp-handshake-is-challenged-only-when-every-target-is-gated.md +0 -29
- package/knowledge/decisions/internals/the-middleware-resolution-cache-is-deliberately-unbounded.md +0 -40
- package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +0 -40
- package/knowledge/decisions/internals/the-pikku-user-id-resolves-in-a-fixed-order.md +0 -24
- package/knowledge/decisions/internals/the-runner-resolves-wire-services-itself.md +0 -31
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +0 -26
- package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +0 -25
- package/knowledge/decisions/internals/the-virtual-user-catalogue-is-the-only-gate-on-what-may-be-called.md +0 -21
- package/knowledge/decisions/internals/the-virtual-user-prompt-says-json-because-of-json-object-mode.md +0 -22
- package/knowledge/decisions/internals/the-virtual-user-runtime-is-exported-from-the-virtual-user-entry-point.md +0 -28
- package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +0 -22
- package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +0 -25
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +0 -33
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +0 -26
- package/knowledge/decisions/internals/validate-checks-virtual-users-through-a-shared-module.md +0 -43
- package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +0 -115
- package/knowledge/decisions/internals/virtual-user-conversation-drives-the-target-through-a-transport-seam.md +0 -24
- package/knowledge/decisions/internals/virtual-user-conversation-verdicts-are-llm-self-evaluations.md +0 -25
- package/knowledge/decisions/internals/virtual-user-conversations-seed-a-hidden-kickoff-message.md +0 -23
- package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +0 -21
- package/knowledge/decisions/internals/virtual-users-are-declared-in-one-definevirtualusers-call-per-codebase.md +0 -30
- package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +0 -24
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +0 -26
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +0 -25
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +0 -58
- package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +0 -35
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +0 -34
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +0 -42
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +0 -38
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +0 -29
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +0 -42
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +0 -25
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +0 -29
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +0 -43
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +0 -29
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +0 -42
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +0 -33
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +0 -32
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +0 -31
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +0 -39
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +0 -29
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +0 -33
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +0 -37
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +0 -54
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +0 -43
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +0 -32
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +0 -18
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +0 -34
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +0 -29
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +0 -33
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +0 -34
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +0 -34
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +0 -38
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +0 -30
- package/knowledge/decisions/security/a-bearer-token-checked-against-a-secret-reads-it-per-request.md +0 -26
- package/knowledge/decisions/security/a-call-without-a-session-raises-missing-session-not-forbidden.md +0 -20
- package/knowledge/decisions/security/a-caller-cookie-wins-over-the-jar-for-the-same-name.md +0 -23
- package/knowledge/decisions/security/a-channel-lifecycle-acts-as-the-socket-upgrade-session.md +0 -16
- package/knowledge/decisions/security/a-channel-requires-a-session-unless-it-says-auth-false.md +0 -26
- package/knowledge/decisions/security/a-credential-read-path-follows-its-declared-type-not-absence.md +0 -32
- package/knowledge/decisions/security/a-credential-type-is-a-literal-the-inspector-checks-at-declaration.md +0 -27
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +0 -28
- package/knowledge/decisions/security/a-first-party-cookie-is-written-only-after-its-purposes-consent.md +0 -33
- package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +0 -37
- package/knowledge/decisions/security/a-graph-run-starts-at-an-entry-node-the-graph-declared.md +0 -33
- package/knowledge/decisions/security/a-permission-gets-a-wire-it-cannot-reply-on.md +0 -33
- package/knowledge/decisions/security/a-public-function-says-so-with-auth-false.md +0 -34
- package/knowledge/decisions/security/a-readonly-session-reaches-only-readonly-functions.md +0 -25
- package/knowledge/decisions/security/a-scaffold-flag-says-a-surface-exists-not-who-may-call-it.md +0 -52
- package/knowledge/decisions/security/a-scheduled-virtual-user-run-needs-no-admin-at-run-time.md +0 -27
- package/knowledge/decisions/security/a-scoped-credential-view-is-limited-to-declared-names.md +0 -26
- package/knowledge/decisions/security/a-scoped-secret-view-reads-only-declared-keys-and-never-writes.md +0 -25
- package/knowledge/decisions/security/a-secret-is-sent-only-to-the-hosts-it-declares.md +0 -29
- package/knowledge/decisions/security/a-step-can-name-an-identity-no-virtual-user-holds-through-per-call-headers.md +0 -25
- package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +0 -37
- package/knowledge/decisions/security/a-stopped-run-by-id-skips-the-ownership-check.md +0 -24
- package/knowledge/decisions/security/a-vault-secret-redacts-on-serialization-and-throws-on-coercion.md +0 -29
- package/knowledge/decisions/security/a-virtual-user-catalogue-entry-is-filtered-by-scope-and-approval-is-denied-by-default.md +0 -30
- package/knowledge/decisions/security/a-virtual-user-environment-fails-closed.md +0 -38
- package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +0 -27
- package/knowledge/decisions/security/a-virtual-user-never-runs-against-production.md +0 -23
- package/knowledge/decisions/security/a-virtual-user-reads-its-roles-from-the-apps-own-rpc-before-better-auth.md +0 -27
- package/knowledge/decisions/security/a-virtual-user-run-treats-an-unresolved-environment-as-production.md +0 -41
- package/knowledge/decisions/security/a-virtual-user-scopes-are-expanded-from-its-roles-once-at-run-preparation.md +0 -25
- package/knowledge/decisions/security/a-virtual-user-whose-roles-drift-from-the-declaration-refuses-to-run.md +0 -32
- package/knowledge/decisions/security/a-workflow-run-is-read-and-approved-by-its-owner.md +0 -50
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +0 -43
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +0 -52
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +0 -46
- package/knowledge/decisions/security/addon-screen-scopes-hide-and-do-not-enforce.md +0 -20
- package/knowledge/decisions/security/agent-approval-forwarding-requires-a-symbol-brand.md +0 -27
- package/knowledge/decisions/security/agent-credential-requests-are-symbol-branded.md +0 -37
- package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +0 -31
- package/knowledge/decisions/security/agent-ownership-failures-never-echo-the-resource.md +0 -23
- package/knowledge/decisions/security/agent-resume-re-runs-the-authorization-gate.md +0 -22
- package/knowledge/decisions/security/agent-sessionless-deployments-have-no-thread-ownership.md +0 -39
- package/knowledge/decisions/security/agent-thread-ownership-composes-the-session-principal.md +0 -30
- package/knowledge/decisions/security/agent-tool-filtering-reads-the-live-function-config.md +0 -24
- package/knowledge/decisions/security/an-addon-header-can-only-narrow-the-session.md +0 -26
- package/knowledge/decisions/security/an-addon-instance-reads-only-the-secrets-and-credentials-it-is-named.md +0 -33
- package/knowledge/decisions/security/an-addon-may-reach-only-itself-and-the-addons-it-uses.md +0 -16
- package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +0 -33
- package/knowledge/decisions/security/an-api-key-is-jwt-decoded-into-the-session.md +0 -26
- package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +0 -59
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +0 -30
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +0 -52
- package/knowledge/decisions/security/an-external-virtual-user-caller-presents-one-signed-statement.md +0 -38
- package/knowledge/decisions/security/an-inbound-webhook-source-dispatches-only-verified-requests.md +0 -31
- package/knowledge/decisions/security/an-mcp-call-with-no-http-request-stays-anonymous.md +0 -18
- package/knowledge/decisions/security/an-mcp-refusal-is-decided-before-dispatch.md +0 -48
- package/knowledge/decisions/security/an-oauth2-credential-is-read-by-its-account-row.md +0 -40
- package/knowledge/decisions/security/an-omitted-user-id-addresses-the-platform-credential.md +0 -32
- package/knowledge/decisions/security/an-upload-is-counted-as-it-arrives-not-buffered-then-measured.md +0 -24
- package/knowledge/decisions/security/analytics-identity-is-stamped-from-the-session-not-the-event.md +0 -24
- package/knowledge/decisions/security/app-access-is-a-scope-tree-synthesised-from-virtual-users.md +0 -26
- package/knowledge/decisions/security/approval-policy-decides-who-answers-a-tool-call.md +0 -27
- package/knowledge/decisions/security/auth-false-on-a-session-function-warns-and-still-requires-one.md +0 -25
- package/knowledge/decisions/security/bearer-token-hashes-are-unpeppered-sha256.md +0 -18
- package/knowledge/decisions/security/consent-is-read-from-a-cookie-and-a-recognised-denial-counts-as-refusal.md +0 -29
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +0 -84
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +0 -39
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +0 -37
- package/knowledge/decisions/security/cors-defaults-to-any-origin-and-refuses-the-wildcard-with-credentials.md +0 -22
- package/knowledge/decisions/security/credential-backends-share-one-conformance-suite-for-per-user-isolation.md +0 -29
- package/knowledge/decisions/security/each-stage-has-one-virtual-user-key-pair.md +0 -27
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +0 -41
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +0 -30
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +0 -40
- package/knowledge/decisions/security/hmac-verification-fails-closed-on-empty-inputs.md +0 -25
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +0 -33
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +0 -46
- package/knowledge/decisions/security/index.md +0 -135
- package/knowledge/decisions/security/local-content-refuses-private-buckets-under-the-public-segment.md +0 -21
- package/knowledge/decisions/security/mail-is-allowlisted-before-a-virtual-user-run-sees-it.md +0 -38
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +0 -27
- package/knowledge/decisions/security/mcp-resources-tools-and-prompts-take-sessionless-functions.md +0 -18
- package/knowledge/decisions/security/origin-locked-routes-match-the-origin-exactly.md +0 -22
- package/knowledge/decisions/security/oss-auth-works-without-pikku-studio-cloud.md +0 -26
- package/knowledge/decisions/security/outbound-webhooks-use-an-allowlist-when-configured.md +0 -24
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +0 -40
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +0 -31
- package/knowledge/decisions/security/pikku-carries-virtual-user-scopes-as-data-and-the-app-grants-them.md +0 -35
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +0 -69
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +0 -39
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +0 -34
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +0 -55
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +0 -30
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +0 -28
- package/knowledge/decisions/security/scoped-content-access-is-a-root-folder-with-longest-prefix-grants.md +0 -31
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +0 -34
- package/knowledge/decisions/security/services-without-secrets-get-a-throwing-secrets-accessor.md +0 -22
- package/knowledge/decisions/security/shared-guards-refuse-to-mutate-or-shadow-a-system-role.md +0 -34
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +0 -37
- package/knowledge/decisions/security/signed-uploads-are-verified-by-the-same-check-as-signed-reads.md +0 -26
- package/knowledge/decisions/security/system-role-scopes-must-be-declared-with-define-scope.md +0 -24
- package/knowledge/decisions/security/system-roles-are-additive-and-immutable.md +0 -16
- package/knowledge/decisions/security/the-channel-rpc-does-not-send-the-callers-session.md +0 -21
- package/knowledge/decisions/security/the-remote-jobs-inbox-fails-closed-without-a-secret.md +0 -24
- package/knowledge/decisions/security/the-remote-rpc-gate-fails-closed-and-binds-the-token-to-its-function.md +0 -34
- package/knowledge/decisions/security/the-workflow-status-stream-rechecks-ownership-on-every-poll.md +0 -16
- package/knowledge/decisions/security/two-credentials-on-one-key-must-share-a-read-mode.md +0 -29
- package/knowledge/decisions/security/verified-bearer-claims-are-pass-through-data-that-core-never-fills.md +0 -23
- package/knowledge/decisions/security/virtual-user-catalogue-excludes-the-machinery-that-runs-virtual-users.md +0 -25
- package/knowledge/decisions/security/virtual-user-conversation-missing-approval-decisions-default-to-denied.md +0 -22
- package/knowledge/decisions/security/virtual-user-run-records-are-gated-behind-a-read-scope.md +0 -18
- package/knowledge/decisions/security/virtual-user-sign-in-does-not-exist-in-production.md +0 -25
- package/knowledge/decisions/security/virtual-user-sign-in-has-one-door.md +0 -42
- package/knowledge/decisions/security/virtual-user-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +0 -29
- package/knowledge/decisions/security/virtual-user-sign-in-only-works-for-virtual-user-flagged-users.md +0 -29
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +0 -25
- package/knowledge/decisions/security/wire-addon-expose-selects-the-rpc-surface.md +0 -51
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +0 -40
- package/knowledge/decisions/security/workflow-helper-functions-are-sessionless-by-declaration.md +0 -18
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +0 -32
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-virtual-user-and-per-scenario.md +0 -32
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +0 -31
- package/knowledge/decisions/security/workflow-virtual-user-steps-always-use-the-real-transport.md +0 -34
- package/knowledge/decisions/security/writing-a-virtual-user-schedule-is-gated-by-its-own-scope.md +0 -18
- package/knowledge/index.md +0 -24
- package/knowledge/questions/a-bearer-jwt-with-no-identity-becomes-a-session.md +0 -24
- package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +0 -35
- package/knowledge/questions/dev-quick-login-as-impersonation.md +0 -25
- package/knowledge/questions/does-a-delayed-rpc-run-as-the-session-it-was-scheduled-with.md +0 -26
- package/knowledge/questions/does-a-user-id-with-a-colon-read-another-users-credentials.md +0 -27
- package/knowledge/questions/does-a-wirecli-command-need-a-session-by-default.md +0 -26
- package/knowledge/questions/does-an-adversarial-in-scope-success-count-as-a-finding.md +0 -26
- package/knowledge/questions/does-approve-step-need-the-run-owners-session-or-the-gates-approvers.md +0 -34
- package/knowledge/questions/does-cors-origin-true-reflect-any-origin-with-credentials.md +0 -20
- package/knowledge/questions/does-skip-user-session-do-anything-on-a-channel.md +0 -24
- package/knowledge/questions/does-the-store-session-match-the-other-two.md +0 -19
- package/knowledge/questions/index.md +0 -41
- package/knowledge/questions/is-the-agent-score-worker-reachable-without-a-session.md +0 -21
- package/knowledge/questions/live-scheduled-tests-may-write.md +0 -19
- package/knowledge/questions/provision-virtual-users-has-no-caller-in-this-repo.md +0 -23
- package/knowledge/questions/remote-secret-refuses-requests-without-a-remote-token-on-every-path.md +0 -32
- package/knowledge/questions/should-a-middleware-set-session-persist-to-the-store.md +0 -25
- package/knowledge/questions/should-a-scoped-secret-view-throw-from-has-secret-for-a-disallowed-key.md +0 -23
- package/knowledge/questions/should-a-wrong-bearer-token-be-anonymous-or-refused.md +0 -35
- package/knowledge/questions/should-an-empty-webhook-signing-secret-send-unsigned.md +0 -23
- package/knowledge/questions/should-http-virtual-user-sessions-reset-between-scenarios-in-one-run.md +0 -27
- package/knowledge/questions/should-the-cookie-jar-scope-cookies-to-the-api-origin.md +0 -26
- package/knowledge/questions/should-voice-input-fetch-audio-urls-without-a-host-allowlist.md +0 -20
- package/knowledge/questions/staging-impersonation-rules.md +0 -27
- package/knowledge/questions/unauthorized-channel-replies-escape-the-declared-out-type.md +0 -44
- package/knowledge/questions/virtual-user-keys-on-cloud-stages-are-pikku-studios-to-build.md +0 -34
- package/knowledge/questions/virtual-user-statement-replay-is-per-process.md +0 -20
- package/knowledge/questions/what-an-impersonated-session-carries.md +0 -22
- package/run-tests.sh +0 -68
- package/scripts/generate-api-report.d.mts +0 -1
- package/scripts/generate-api-report.mjs +0 -96
- package/scripts/generate-api-report.mts +0 -333
- package/src/public-surface.json +0 -637
- package/src/public-surface.json.README +0 -43
- /package/dist/{function/compensation-name.d.ts → compensation-name.d.ts} +0 -0
- /package/dist/{function/compensation-name.js → compensation-name.js} +0 -0
package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-but-it-needs-a-trigger.md
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: A virtual user run is not a workflow, but it needs a trigger
|
|
4
|
-
description: runVirtualUser writes its record and dispatches the run onto a queue at one attempt — an exploratory run has nothing to replay, but a deployment that puts each function in its own unit has nothing to fire it either
|
|
5
|
-
tags: virtual-user, storage, deploy
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# A virtual user run is not a workflow, but it needs a trigger
|
|
9
|
-
|
|
10
|
-
`runVirtualUser` — the RPC `scaffold.virtualUser` generates — does three things
|
|
11
|
-
in order: writes a `VirtualUserRunStore` record, dispatches
|
|
12
|
-
`executeVirtualUserRun`, and returns the `runId`. The request never waits for
|
|
13
|
-
the run; a run takes minutes and survives neither a rollout nor a proxy timeout.
|
|
14
|
-
|
|
15
|
-
**A workflow** is still the wrong shape, for the reason it always was. Its value
|
|
16
|
-
is that a run can be resumed at the step it died on, and that the same input
|
|
17
|
-
reaches the same step. A virtual user is the opposite by construction — it is an
|
|
18
|
-
LLM deciding what to try next, so no two attempts take the same steps, and there
|
|
19
|
-
is no step to resume _to_. Recording a run as a workflow puts entries in the
|
|
20
|
-
workflow store that can never be replayed, and gives every operator reading that
|
|
21
|
-
store a row that lies about what it is. The seed makes a run _reproducible_ —
|
|
22
|
-
run it again and it explores the same way — which is a different property from
|
|
23
|
-
resumable, and one the record already carries.
|
|
24
|
-
|
|
25
|
-
**A queue was rejected once, on durability, and that was the wrong question.**
|
|
26
|
-
The original reasoning weighed a broker dependency against a retry nobody wants,
|
|
27
|
-
and concluded the in-process dispatch was enough. It is enough in one process.
|
|
28
|
-
It is not a dispatch at all under a deployment that puts each function in its own
|
|
29
|
-
unit: there is no in-process promise to leave running, and `executeVirtualUserRun`
|
|
30
|
-
— sessionless, unexposed, wired to nothing — is not a function any unit can be
|
|
31
|
-
reached at. The RPC resolves to nothing, the rejection is swallowed by the
|
|
32
|
-
`catch` that exists to stop it taking the process down, and the run parks at
|
|
33
|
-
`running` with zero steps and no error anywhere. That is what a cloud stage did.
|
|
34
|
-
|
|
35
|
-
So the queue is not bought for durability. It is bought because **a trigger is
|
|
36
|
-
what makes a function deployable**: `wireQueueWorker` puts `executeVirtualUserRun`
|
|
37
|
-
in the manifest, which gives it a unit and gives the platform somewhere to
|
|
38
|
-
deliver to. The job is dispatched at `attempts: 1`, because a redelivery is a
|
|
39
|
-
second different outing writing into a record that already has an outcome — the
|
|
40
|
-
retry the queue offers is precisely the part that stays unused.
|
|
41
|
-
|
|
42
|
-
A project with no queue service keeps the in-process dispatch. That is not a
|
|
43
|
-
fallback that hides a failure: a project without a broker runs in one process,
|
|
44
|
-
where an unawaited promise is a real dispatch and the only correct one.
|
|
45
|
-
|
|
46
|
-
The record remains the run's only trace, and that is what `VirtualUserRunStore`
|
|
47
|
-
exists for. It is also why `fail()` is a method rather than an absence: a run
|
|
48
|
-
that crashed and a run that found nothing are different answers, and a record
|
|
49
|
-
left at `running` is neither.
|
|
50
|
-
|
|
51
|
-
The cost is smaller than it was but has not gone: **a restart mid-run strands a
|
|
52
|
-
record at `running` with nothing left to finish it**, since nothing retries. A
|
|
53
|
-
run older than its budget window and still `running` is dead, not working — a
|
|
54
|
-
read-side rule. A stranded run is started again, with its seed if the caller
|
|
55
|
-
wants the same exploration.
|
|
56
|
-
|
|
57
|
-
Where that rule is actually applied is
|
|
58
|
-
[the schedule tick](a-virtual-user-cadence-is-a-row-not-a-timer.md), which has
|
|
59
|
-
to: a record stuck at `running` would otherwise block its virtual user's cadence
|
|
60
|
-
forever.
|
|
61
|
-
|
|
62
|
-
**What this rules out:** dispatching the run through `startWorkflow`; awaiting
|
|
63
|
-
the engine inside the request; retrying a run that failed; storing the operator
|
|
64
|
-
token on the record rather than on the dispatch; and inferring `status` from
|
|
65
|
-
`finishedAt` being unset, which cannot separate a crash from a run still going.
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: A wall-clock threshold is a load test in disguise
|
|
4
|
-
description: The KEK derivation test asserted a fixed 50ms budget for work that took 10ms, which went red about one run in five once the suite was large enough to compete for the machine
|
|
5
|
-
tags: core, testing, crypto
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# A wall-clock threshold is a load test in disguise
|
|
9
|
-
|
|
10
|
-
`crypto-utils.test.ts` guards a real property: unwrapping N secrets must not
|
|
11
|
-
cost N KEK derivations. Deriving a KEK is a deliberately slow KDF, so doing it
|
|
12
|
-
per secret turns a 10ms operation into a 4-second one.
|
|
13
|
-
|
|
14
|
-
It guarded it with `assert.ok(elapsed < 50)`. Measured on this machine:
|
|
15
|
-
|
|
16
|
-
| | |
|
|
17
|
-
| ----------------------------- | ------------------------------- |
|
|
18
|
-
| one `deriveKEK` | ~86ms |
|
|
19
|
-
| 50 `envelopeDecrypt` | 10.8ms |
|
|
20
|
-
| the old 50ms threshold | 4.6x headroom |
|
|
21
|
-
| the failure it guards against | ~4281ms — a **396x** separation |
|
|
22
|
-
|
|
23
|
-
So the assertion had 4.6x of margin to detect a 396x regression. Everything
|
|
24
|
-
between those two numbers was noise, and once core's suite reached ~2000 tests
|
|
25
|
-
competing for the same cores, a 10ms window drifting past 50ms became routine:
|
|
26
|
-
roughly one run in five went red, always on a machine where nothing was wrong.
|
|
27
|
-
|
|
28
|
-
**Calibrate against a measurement taken in the same run.** The test already
|
|
29
|
-
derives a KEK, so timing that call is free, and the assertion becomes
|
|
30
|
-
`elapsed < oneDerivation` — unwrapping all fifty must cost less than deriving
|
|
31
|
-
once. Under load both sides slow down together, so the ratio holds.
|
|
32
|
-
|
|
33
|
-
**What this rules out:** raising the constant. 100ms or 200ms buys a smaller
|
|
34
|
-
flake rate and the same class of bug, and it drifts again the next time the
|
|
35
|
-
suite grows or CI moves to a noisier runner. Any assertion of the form
|
|
36
|
-
"operation X takes less than N milliseconds" has this problem; express it as a
|
|
37
|
-
ratio against something measured alongside it.
|
|
38
|
-
|
|
39
|
-
Worth knowing: `envelopeDecrypt(kek: CryptoKey, …)` takes the derived key as a
|
|
40
|
-
parameter, so it _cannot_ derive one — the property is already enforced by the
|
|
41
|
-
signature, and [[the-api-report-pins-members-not-just-names]] would catch a
|
|
42
|
-
change to it. The test is defence in depth, which is a reason to make it cheap
|
|
43
|
-
and quiet rather than to delete it.
|
|
44
|
-
|
|
45
|
-
Related: [[an-unref-d-timer-cannot-be-awaited-under-node-test]], the other
|
|
46
|
-
source of nondeterminism found in the same pass.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: A workflow's wire is built from the run record, not from the RPC service
|
|
4
|
-
description: The RPC service exposes no wire, so every rpcService.wire read was undefined; the run record is the only thing that carries the caller across a step boundary
|
|
5
|
-
tags: core, workflow
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# A workflow's wire is built from the run record, not from the RPC service
|
|
9
|
-
|
|
10
|
-
`PikkuWorkflowService` builds a fresh wire each time it runs a workflow body or
|
|
11
|
-
starts a child. For a while it filled parts of that wire from the RPC service it
|
|
12
|
-
had been handed:
|
|
13
|
-
|
|
14
|
-
```ts
|
|
15
|
-
session: rpcService?.wire?.session,
|
|
16
|
-
rpc: rpcService?.wire?.rpc,
|
|
17
|
-
pikkuUserId: rpcService.wire?.pikkuUserId,
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
`PikkuRPC` has no `wire`. Neither does the object `getContextRPCService`
|
|
21
|
-
actually returns — `ContextAwareRPCService` holds its wire _privately_ and
|
|
22
|
-
exposes `invoke`, `remote`, `exposed`, `startWorkflow`, `agent` and
|
|
23
|
-
`rpcWithWire`, and nothing else. Every one of those reads was `undefined`, and
|
|
24
|
-
the `rpcService: any` parameter type is what kept the compiler quiet about it.
|
|
25
|
-
|
|
26
|
-
The consequence was silent and one-directional: a child workflow started from a
|
|
27
|
-
step never inherited the `pikkuUserId` its parent was running as, so a queued
|
|
28
|
-
child ran as nobody. Nothing failed — the field was simply absent, and the run
|
|
29
|
-
proceeded.
|
|
30
|
-
|
|
31
|
-
**The run record is the carrier.** `WorkflowRun.wire` is durable, is written
|
|
32
|
-
when the run is created, and survives the process boundary a queued step
|
|
33
|
-
crosses, which is exactly what a live service reference cannot do. Both the
|
|
34
|
-
run-body wire and the child-run wire now read `run.wire?.pikkuUserId`.
|
|
35
|
-
|
|
36
|
-
`session` and `rpc` are not copied at all. `runPikkuFunc` attaches `rpc` lazily
|
|
37
|
-
for the duration of an invocation and restores the previous descriptor
|
|
38
|
-
afterwards, and it resolves the session from the session store using
|
|
39
|
-
`pikkuUserId` — so both were being overwritten moments later anyway. The wire
|
|
40
|
-
these paths construct is a `PikkuRawWire` for that reason: it genuinely has no
|
|
41
|
-
`rpc` yet, and saying so is what let the dead reads be found.
|
|
42
|
-
|
|
43
|
-
**What this rules out:** reaching for the RPC service to answer "who is this
|
|
44
|
-
running as". It cannot answer, and the shape of the question hides that.
|
|
45
|
-
Anything a step needs to know about its caller has to be on the run.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Addon package roots resolve by walking node module search paths
|
|
4
|
-
description: LocalMetaService finds an addon's directory by scanning resolve.paths, not by require.resolve, because addon packages expose no main entry
|
|
5
|
-
tags: services
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Addon package roots resolve by walking node module search paths
|
|
9
|
-
|
|
10
|
-
`LocalMetaService.resolvePackageRoot` (`packages/core/src/services/meta-service.ts`)
|
|
11
|
-
builds a `createRequire` anchored one level above `.pikku` — the app root — then
|
|
12
|
-
walks `require.resolve.paths(packageName)` and takes the first candidate
|
|
13
|
-
directory that contains a `package.json`. The result is memoised in
|
|
14
|
-
`packageRootCache`.
|
|
15
|
-
|
|
16
|
-
The obvious call, `require.resolve(packageName)`, throws for these packages:
|
|
17
|
-
Pikku addon packages ship a `.pikku` directory and subpath exports but no main
|
|
18
|
-
`exports` entry, so there is nothing for Node to resolve to. Walking the search
|
|
19
|
-
paths asks the same question Node would ask — where would this package be
|
|
20
|
-
found from the app root — without requiring the package to be importable.
|
|
21
|
-
|
|
22
|
-
**What this rules out:** replacing the loop with `require.resolve(pkg)`,
|
|
23
|
-
`import.meta.resolve`, or `createRequire(import.meta.url)`. The first two fail on
|
|
24
|
-
every addon; the third anchors resolution at `@pikku/core`'s own location rather
|
|
25
|
-
than the app's, so an addon installed only in the app's `node_modules` becomes
|
|
26
|
-
invisible.
|
package/knowledge/decisions/internals/addon-pikku-meta-ships-at-the-package-root-or-under-dist.md
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: An addon's .pikku meta ships at the package root or under dist, and readers probe both
|
|
4
|
-
description: The layout depends on the addon's build and files field, so a consumer resolving the directory by path must try `<pkg>/.pikku` and `<pkg>/dist/.pikku` before concluding an addon declares nothing
|
|
5
|
-
tags: services
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# An addon's .pikku meta ships at the package root or under dist, and readers probe both
|
|
9
|
-
|
|
10
|
-
An addon generates `.pikku/` at its project root, and whether that directory
|
|
11
|
-
reaches the published tarball at the root or inside `dist/` depends on the
|
|
12
|
-
addon's own `tsconfig` and `files` — both layouts are in the wild and both are
|
|
13
|
-
supported. The published `exports` map hides the difference for anyone
|
|
14
|
-
resolving by specifier: `"./.pikku/*"` points at wherever it landed, so
|
|
15
|
-
`require.resolve('<pkg>/.pikku/scopes/pikku-scopes-meta.gen.json')` works for
|
|
16
|
-
either shape, and that is the resolution every consumer should prefer.
|
|
17
|
-
|
|
18
|
-
Code that builds the path itself must probe both. `addonPikkuDir`
|
|
19
|
-
(`packages/addon/pikku-console/src/lib/derive-instance-overrides.ts`) tries
|
|
20
|
-
`<pkg>/.pikku` then `<pkg>/dist/.pikku` and returns `null` when neither exists.
|
|
21
|
-
The reason to say so out loud is the failure mode: a reader that assumes the
|
|
22
|
-
root finds nothing under a `dist`-shipping addon and cannot distinguish that
|
|
23
|
-
from an addon that declares no secrets, variables or scopes at all. Both answers
|
|
24
|
-
are "empty", and the wrong one is indistinguishable from a correct one until
|
|
25
|
-
something downstream reports an addon as ready when its secrets were never
|
|
26
|
-
checked.
|
|
27
|
-
|
|
28
|
-
**What this rules out:** hardcoding either path in a consumer, and treating a
|
|
29
|
-
missing directory as evidence an addon declares nothing without having tried
|
|
30
|
-
both. It also rules out normalising the layout by making the CLI move the
|
|
31
|
-
directory at publish time — the export map already makes the layout private to
|
|
32
|
-
the package, and the addons shipping each shape are already published.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Addon singleton services are cached per namespace, not per package
|
|
4
|
-
description: Each wireAddon instance gets its own services built from its own overrides, at the cost of one service graph per wired instance
|
|
5
|
-
tags: rpc
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Addon singleton services are cached per namespace, not per package
|
|
9
|
-
|
|
10
|
-
`getOrCreatePackageSingletonServices` in
|
|
11
|
-
`packages/core/src/wirings/rpc/addon-runner.ts` keys its `pikkuState` cache on
|
|
12
|
-
`addonInstance?.namespace ?? packageName`. The namespace is the consumer-facing
|
|
13
|
-
name given to `wireAddon`/`wireRemoteAddon`, and it is what selects the
|
|
14
|
-
instance's `secretOverrides`, `variableOverrides` and `credentialOverrides`.
|
|
15
|
-
|
|
16
|
-
One package may be wired twice — the same payments addon against a live and a
|
|
17
|
-
sandbox account, say — with different secret and variable names. Caching by
|
|
18
|
-
package name would build the service graph once, from whichever instance called
|
|
19
|
-
first, and silently hand the other instance the wrong credentials. Because the
|
|
20
|
-
overrides have to be visible to the addon's _own_ `createSingletonServices`, they
|
|
21
|
-
are applied by wrapping the parent `secrets` and `variables` services
|
|
22
|
-
(`aliasSecretService`, `aliasVariablesService`) so that every logical name the
|
|
23
|
-
addon reads is remapped to the real project name before resolution. A call with
|
|
24
|
-
no instance attached still falls back to per-package caching.
|
|
25
|
-
|
|
26
|
-
`addonInstanceForNamespace` rebuilds this descriptor for bare intra-addon calls
|
|
27
|
-
from the namespace currently executing on the wire, and returns `undefined`
|
|
28
|
-
unless that namespace maps to the package being resolved — so a bare call cannot
|
|
29
|
-
pick up another instance's overrides.
|
|
30
|
-
|
|
31
|
-
**What this rules out:** simplifying the cache key to `packageName`, resolving
|
|
32
|
-
overrides at the call site instead of aliasing the resolver services, and
|
|
33
|
-
assuming two `wireAddon` entries for one package share a service instance.
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Bare workflow names from inside an addon are prefixed with the consumer's namespace
|
|
4
|
-
description: The addon's workflowService is proxied so an addon never has to hardcode the name its consumer chose
|
|
5
|
-
tags: rpc
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Bare workflow names from inside an addon are prefixed with the consumer's namespace
|
|
9
|
-
|
|
10
|
-
`wrapWorkflowServiceForPackage` in
|
|
11
|
-
`packages/core/src/wirings/rpc/addon-runner.ts` proxies an addon package's
|
|
12
|
-
`workflowService`, intercepting `startWorkflow` and `runToCompletion`. A bare
|
|
13
|
-
name — one with no `:` — is rewritten to `${namespace}:${name}`, using the
|
|
14
|
-
instance namespace when known and otherwise the package's sole namespace via
|
|
15
|
-
`findAddonNamespaceForPackage`.
|
|
16
|
-
|
|
17
|
-
Workflows declared by an addon are registered under the addon's package scope,
|
|
18
|
-
but the namespace they answer to is chosen by the _consumer_ in `wireAddon`.
|
|
19
|
-
Without the proxy, `runToCompletion('myWorkflow')` written inside the addon
|
|
20
|
-
resolves against root meta, misses, and throws `WorkflowNotFoundError` — leaving
|
|
21
|
-
the addon author no option but to hardcode the consumer-defined namespace, which
|
|
22
|
-
couples a reusable package to one particular caller. Explicit `'ns:name'` calls
|
|
23
|
-
and bare names that already resolve in root are untouched; only bare names that
|
|
24
|
-
would otherwise miss get prefixed.
|
|
25
|
-
|
|
26
|
-
**What this rules out:** dropping the proxy and requiring addons to namespace
|
|
27
|
-
their own workflow calls, and widening the rewrite to names that already contain
|
|
28
|
-
a `:` or already exist at root — either turns a working call into a lookup miss.
|
package/knowledge/decisions/internals/agent-agui-bridge-obeys-the-client-ordering-contract.md
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: The AG-UI bridge obeys the client's event-ordering contract exactly
|
|
4
|
-
description: RUN_STARTED opens lazily, RUN_FINISHED fires once on done, and step names are globally sequential — a violation makes the client drop the whole stream
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# The AG-UI bridge obeys the client's event-ordering contract exactly
|
|
9
|
-
|
|
10
|
-
`wrapChannelWithAGUI` in `packages/core/src/wirings/agent/agent-agui.ts`
|
|
11
|
-
translates pikku stream events into AG-UI events under three rules that
|
|
12
|
-
`@ag-ui/client`'s `verifyEvents` enforces on the browser side:
|
|
13
|
-
|
|
14
|
-
`RUN_STARTED` is emitted lazily, from the first translated event, because the
|
|
15
|
-
client rejects anything that arrives before it — and because the real
|
|
16
|
-
`AgentRunStateService` run id only exists after the channel has been wrapped, which
|
|
17
|
-
is why `AGUIChannelOptions.getRunId` and `StreamAgentOptions.onRunCreated`
|
|
18
|
-
exist as late-bound sources. `RUN_FINISHED` is terminal for the client, so it is
|
|
19
|
-
sent exactly once, on `done`, carrying usage accumulated across all steps; per-step
|
|
20
|
-
`usage` events must not finish the run, or a multi-step tool run would emit later
|
|
21
|
-
steps after the terminal event and the client would drop the whole stream.
|
|
22
|
-
Step names must be unique among active steps, and sub-agents reuse step numbers
|
|
23
|
-
on the shared channel, so each `step-start` closes the previous step and takes a
|
|
24
|
-
sequential name. `agent-agui.test.ts` re-implements those ordering rules so
|
|
25
|
-
the bridge is checked against the same contract the browser applies.
|
|
26
|
-
|
|
27
|
-
**What this rules out:** emitting `RUN_STARTED` eagerly at wrap time; finishing
|
|
28
|
-
the run on the `usage` event so token counts arrive earlier; and naming AG-UI
|
|
29
|
-
steps after `event.stepNumber`.
|
package/knowledge/decisions/internals/agent-audio-chunks-carry-the-format-the-provider-returned.md
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Audio chunks are labelled with the format the provider actually returned
|
|
4
|
-
description: The configured format is only a request, so the response's own format wins with the request and pcm16 as fallbacks
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Audio chunks are labelled with the format the provider actually returned
|
|
9
|
-
|
|
10
|
-
`synthesizeAudio` in `packages/core/src/wirings/agent/voice-output.ts` labels
|
|
11
|
-
each `audio-delta` event with `result.audio.format` first, falling back to the
|
|
12
|
-
requested `config.format` and finally to `pcm16`.
|
|
13
|
-
|
|
14
|
-
Speech providers treat the output format as a preference: an unsupported or
|
|
15
|
-
omitted value silently yields whatever the provider defaults to. Stamping the
|
|
16
|
-
requested format on the chunk would tell the client to decode bytes it did not
|
|
17
|
-
receive, producing noise rather than an error.
|
|
18
|
-
|
|
19
|
-
**What this rules out:** labelling chunks from `config.format` because "we asked
|
|
20
|
-
for it", and dropping the fallback chain to a single source.
|
package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Loading agent context waits for a tool result that may still be landing
|
|
4
|
-
description: An interrupted run's tool can still be writing to the thread, and in voice the next turn arrives within seconds — soon enough to load context missing what it is about to be asked about
|
|
5
|
-
tags: core, agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Loading agent context waits for a tool result that may still be landing
|
|
9
|
-
|
|
10
|
-
Before a turn loads its thread, it settles any tool whose run was interrupted
|
|
11
|
-
but whose result is still being written to that thread.
|
|
12
|
-
|
|
13
|
-
The window is small and, on a typed interface, usually irrelevant — a person
|
|
14
|
-
takes seconds to write the next message. In voice it is not: the next turn lands
|
|
15
|
-
within a second or two of the last one. Without the wait, the model loads a
|
|
16
|
-
thread that is missing the very result the user is about to ask about, and
|
|
17
|
-
answers as though the tool never ran.
|
|
18
|
-
|
|
19
|
-
**What this rules out:** treating the settle as belt-and-braces and dropping it
|
|
20
|
-
to save a round trip. The failure it prevents is a confidently wrong answer, not
|
|
21
|
-
an error, and it only appears on the fastest transport.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: A credential-required tool result never reaches the client or the transcript
|
|
4
|
-
description: The run suspends with credential-request events instead, leaving the tool call unresulted so it can be resumed after connecting
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# A credential-required tool result never reaches the client or the transcript
|
|
9
|
-
|
|
10
|
-
When a tool returns the `__credentialRequired` marker,
|
|
11
|
-
`streamAgent` in `packages/core/src/wirings/agent/agent-stream.ts`
|
|
12
|
-
filters that `tool-result` out of the channel before it can be streamed or
|
|
13
|
-
persisted, and `handleCredentialRequests` suspends the run and emits
|
|
14
|
-
`credential-request` events carrying the `runId` instead. Those events — not the
|
|
15
|
-
tool result — are what tells a client to show Connect/Ignore, mirroring how
|
|
16
|
-
approval suspensions work.
|
|
17
|
-
|
|
18
|
-
Leaving the tool call unresulted in the persisted history is what makes the
|
|
19
|
-
resume possible: once the credential is connected, `/resume` re-executes the call
|
|
20
|
-
against a history that does not already contain a bogus answer. `runStreamStepLoop`
|
|
21
|
-
still appends the step messages before returning the credential outcome, so the
|
|
22
|
-
assistant's tool call itself survives into the resume.
|
|
23
|
-
|
|
24
|
-
**What this rules out:** streaming the marker result as a normal tool result and
|
|
25
|
-
filtering it client-side; persisting it as the tool's answer; and skipping
|
|
26
|
-
`appendStepMessages` on the credential path because the run is about to suspend.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Delegate mode hides the parent's later text, supervise mode hides the sub-agent's
|
|
4
|
-
description: Exactly one voice reaches the client per agent-mode; approvals and tool events always flow through either way
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Delegate mode hides the parent's later text, supervise mode hides the sub-agent's
|
|
9
|
-
|
|
10
|
-
An agent with sub-agents runs in one of two modes. In `'delegate'` (the default,
|
|
11
|
-
handled in `streamAgent` in `agent-stream.ts`) the parent's `text-delta` and
|
|
12
|
-
`reasoning-delta` events are suppressed _after_ the first sub-agent call —
|
|
13
|
-
`delegateState.delegated` is the latch — so a parent that answers directly still
|
|
14
|
-
streams normally, while a parent that hands off does not narrate over its
|
|
15
|
-
sub-agent. In `'supervise'` (handled where the sub-agent channel is built in
|
|
16
|
-
`buildToolDefs` in `agent-prepare.ts`) the inverse holds: the sub-agent's text
|
|
17
|
-
and reasoning are dropped and only the supervisor speaks.
|
|
18
|
-
|
|
19
|
-
Suppression is confined to text and reasoning. Approval requests, tool calls,
|
|
20
|
-
tool results, usage and errors flow through in both modes, because a suppressed
|
|
21
|
-
approval would deadlock the run.
|
|
22
|
-
|
|
23
|
-
**What this rules out:** filtering sub-agent events at the transport instead of
|
|
24
|
-
at the scoped channel; suppressing parent text unconditionally in delegate mode
|
|
25
|
-
(direct answers would vanish); and adding new event types to either filter
|
|
26
|
-
without checking they are not part of the approval handshake.
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Nulls are stripped from approved tool arguments before execution
|
|
4
|
-
description: LLMs emit null for optional fields where the schema layer expects undefined, so a resumed tool call is cleaned recursively first
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Nulls are stripped from approved tool arguments before execution
|
|
9
|
-
|
|
10
|
-
`resumeAgentSync` in
|
|
11
|
-
`packages/core/src/wirings/agent/agent-runner.ts` runs `stripNulls` over
|
|
12
|
-
the persisted arguments of an approved tool call before invoking the tool.
|
|
13
|
-
|
|
14
|
-
Models routinely fill every property in a JSON schema, using `null` to mean "not
|
|
15
|
-
provided". Pikku's validation layer models an absent optional field as
|
|
16
|
-
`undefined`, and a `null` fails the check outright. The value is stored as the
|
|
17
|
-
model produced it — the approval prompt should show what the model actually asked
|
|
18
|
-
for — so the cleanup happens at execution time, recursively, including inside
|
|
19
|
-
arrays and nested objects.
|
|
20
|
-
|
|
21
|
-
**What this rules out:** normalizing the arguments at approval-capture time
|
|
22
|
-
(the approval UI would no longer reflect the model's real request), and a
|
|
23
|
-
shallow single-level null strip.
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Model resolution stays a single seam even though it is currently a passthrough
|
|
4
|
-
description: resolveModelConfig looks removable but is the one merge point for per-request model overrides
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Model resolution stays a single seam even though it is currently a passthrough
|
|
9
|
-
|
|
10
|
-
`resolveModelConfig` in
|
|
11
|
-
`packages/core/src/wirings/agent/agent-model-config.ts` returns the
|
|
12
|
-
agent's `model`, `temperature` and `maxSteps` unchanged, and ignores its
|
|
13
|
-
`_agentName` argument. It reads as dead indirection and is not.
|
|
14
|
-
|
|
15
|
-
Models are declared per agent in the provider-qualified `provider/model` form
|
|
16
|
-
(`openai/gpt-5-mini`); there is no config-level alias map to consult, which is
|
|
17
|
-
why the current body is a copy. The function exists so that every caller —
|
|
18
|
-
`prepareAgentRun`, both resume paths, and the per-request `input.model` /
|
|
19
|
-
`input.temperature` overrides applied in `agent-prepare.ts` — assembles the
|
|
20
|
-
effective config the same way, through one place that can grow an alias map,
|
|
21
|
-
per-tenant defaults or provider fallbacks without touching them.
|
|
22
|
-
|
|
23
|
-
**What this rules out:** inlining `agent.model` / `agent.temperature` at the four
|
|
24
|
-
call sites and deleting the function, and dropping the unused `_agentName`
|
|
25
|
-
parameter from the signature.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: An agentMiddleware onError hook cannot change how a run fails
|
|
4
|
-
description: Hook throws are swallowed so observability code can never convert, mask, or replace the original error
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# An agentMiddleware onError hook cannot change how a run fails
|
|
9
|
-
|
|
10
|
-
Every `onError` invocation on the agent failure paths — in `streamAgent` and
|
|
11
|
-
`continueAfterToolResult` (`agent-stream.ts`) and in `runAgent` and
|
|
12
|
-
`continueAfterToolResultSync` (`agent-runner.ts`) — is wrapped in its own
|
|
13
|
-
`try/catch` that discards whatever the hook throws. The run is then marked
|
|
14
|
-
`failed` with the original error message, and the original error propagates.
|
|
15
|
-
|
|
16
|
-
`onError` is an observability hook: logging, metrics, alerting. A logger that is
|
|
17
|
-
itself broken must not turn a diagnosable agent failure into a confusing one, and
|
|
18
|
-
must not stop the remaining hooks from running or the run state from being
|
|
19
|
-
updated.
|
|
20
|
-
|
|
21
|
-
**What this rules out:** awaiting the hooks without a guard, and using `onError`
|
|
22
|
-
as an error-transformation hook whose throw replaces the original failure.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: AI runner methods must be called on the runner, never as detached references
|
|
4
|
-
description: Implementations use this internally, so grabbing transcribe or generateSpeech as a bare function loses the receiver and throws at runtime
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# AI runner methods must be called on the runner, never as detached references
|
|
9
|
-
|
|
10
|
-
The voice middlewares in `voice-input.ts` and `voice-output.ts` invoke
|
|
11
|
-
`agentRunner.transcribe(...)` and `agentRunner.generateSpeech?.(...)` as
|
|
12
|
-
method calls on the service object, and only ever test them for presence.
|
|
13
|
-
|
|
14
|
-
`AgentRunnerService` is an interface implemented by classes — the reference
|
|
15
|
-
implementation's `transcribe` calls `this.getModel(...)`. Extracting the method
|
|
16
|
-
into a local (`const { transcribe } = services.agentRunner`) type-checks
|
|
17
|
-
cleanly and then fails at runtime with `this` undefined. The regression is
|
|
18
|
-
pinned by a runner in `voice-input.test.ts` whose `transcribe` deliberately reads
|
|
19
|
-
instance state through `this`.
|
|
20
|
-
|
|
21
|
-
**What this rules out:** destructuring runner methods for brevity, and passing
|
|
22
|
-
`runner.transcribe` as a callback without binding it.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Agent speech travels as a CUSTOM AG-UI event rather than being dropped
|
|
4
|
-
description: AG-UI has no speech event, and dropping it makes a voice agent reached over HTTP silently inaudible while the provider still bills for the audio
|
|
5
|
-
tags: core, agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Agent speech travels as a CUSTOM AG-UI event
|
|
9
|
-
|
|
10
|
-
The AG-UI protocol has no event type for synthesized speech, so the bridge
|
|
11
|
-
forwards it as `CUSTOM`, the same way it forwards the other pikku-specific
|
|
12
|
-
events.
|
|
13
|
-
|
|
14
|
-
The alternative was tried: the mapper dropped the event, on the reasoning that a
|
|
15
|
-
protocol without a speech event has no way to carry one. The result is a voice
|
|
16
|
-
agent reached over HTTP that is completely silent — `voiceOutput` synthesizes
|
|
17
|
-
every sentence, the provider bills for every one of them, and none of it gets
|
|
18
|
-
past the mapper. Nothing errors, so there is nothing to find.
|
|
19
|
-
|
|
20
|
-
**What this rules out:** filtering unknown event types at the AG-UI boundary as
|
|
21
|
-
a tidiness measure. `CUSTOM` exists precisely so a protocol gap degrades to
|
|
22
|
-
"the client ignores it" rather than "the server threw the work away".
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Persisting an agent stream from send is best-effort and must never reject
|
|
4
|
-
description: The persisting channel flushes fire-and-forget because send is synchronous; a storage failure degrades the transcript instead of killing the process
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Persisting an agent stream from send is best-effort and must never reject
|
|
9
|
-
|
|
10
|
-
`createPersistingChannel` in
|
|
11
|
-
`packages/core/src/wirings/agent/agent-stream.ts` accumulates step text,
|
|
12
|
-
tool calls and tool results, and writes them via `flushDetached` on the `usage`
|
|
13
|
-
and `done` events. `AgentStreamChannel.send` is synchronous, so it cannot await the
|
|
14
|
-
write. An unawaited rejection has nothing to propagate to and surfaces as an
|
|
15
|
-
`unhandledRejection`, which takes the whole server process down — a model
|
|
16
|
-
reusing a `toolCallId`, which is a primary key in AI storage, is enough to
|
|
17
|
-
trigger it. `flushDetached` therefore catches and logs, and the run carries on.
|
|
18
|
-
|
|
19
|
-
The awaited `flush()` on the suspend paths (`handleApprovals`,
|
|
20
|
-
`handleCredentialRequests`) is the seam that still surfaces persistence failures
|
|
21
|
-
to a caller. The regression test lives in `agent-stream.test.ts`; because the
|
|
22
|
-
floating promise settles on a later macrotask, the assertion has to wait a real
|
|
23
|
-
timer before checking that no `unhandledRejection` fired.
|
|
24
|
-
|
|
25
|
-
**What this rules out:** letting `flushStep()` be called bare from `send`,
|
|
26
|
-
rethrowing from the catch to "not hide" storage errors, and asserting on
|
|
27
|
-
unhandled rejections synchronously after the last event.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: A delegated sub-agent inherits the parent run's context block
|
|
4
|
-
description: The sub-agent tool schema carries only message and session, so the parent's identifier block is forwarded rather than re-typed by the model
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# A delegated sub-agent inherits the parent run's context block
|
|
9
|
-
|
|
10
|
-
`buildSubAgentRunInput` in
|
|
11
|
-
`packages/core/src/wirings/agent/agent-prepare.ts` forwards the parent
|
|
12
|
-
run's `AgentInput.context` — the "Current context" identifier block with
|
|
13
|
-
organization, project and stage ids — into every delegated sub-agent run, on
|
|
14
|
-
both the streaming and non-streaming paths. `buildToolDefs` threads it down as
|
|
15
|
-
`parentContext` for the same reason.
|
|
16
|
-
|
|
17
|
-
A sub-agent is exposed to the parent model as a tool whose input schema is only
|
|
18
|
-
`{ message, session }`. Without inheritance the sub-agent never sees the
|
|
19
|
-
authoritative ids and has to rely on the parent model re-typing them into
|
|
20
|
-
`message`. Weaker models mangle that, and the result is schema and permission
|
|
21
|
-
rejections followed by retry loops rather than a clean failure.
|
|
22
|
-
|
|
23
|
-
**What this rules out:** constructing the sub-agent run input inline from
|
|
24
|
-
`{ message, threadId, resourceId }`, widening the sub-agent tool schema so the
|
|
25
|
-
model supplies the ids itself, and dropping `parentContext` from `buildToolDefs`
|
|
26
|
-
because "nothing reads it here".
|
package/knowledge/decisions/internals/agent-tool-execute-failures-are-logged-unconditionally.md
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: A tool's execute() failure is logged before the AI SDK swallows it
|
|
4
|
-
description: Every agent tool is wrapped in a logging try/catch, because a thrown tool error otherwise becomes a conversational reply and is invisible server-side
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# A tool's execute() failure is logged before the AI SDK swallows it
|
|
9
|
-
|
|
10
|
-
`buildToolDefs` in `packages/core/src/wirings/agent/agent-prepare.ts`
|
|
11
|
-
wraps every tool it builds — RPC tools, sub-agent delegations and workflow tools
|
|
12
|
-
alike — in a `try/catch` that logs through `singletonServices.logger` and
|
|
13
|
-
rethrows.
|
|
14
|
-
|
|
15
|
-
A tool's `execute()` can throw for ordinary reasons: bad model-supplied input, an
|
|
16
|
-
RPC failure, a database error. The AI SDK catches that at the tool-call boundary
|
|
17
|
-
and turns it into a conversational "tool error" reply to the model. The exception
|
|
18
|
-
never reaches pikku's own logger, so without this wrapper a consistently failing
|
|
19
|
-
tool is undiagnosable from the server side — the only symptom is an agent that
|
|
20
|
-
keeps apologising. The wrapper is applied unconditionally, not only when an
|
|
21
|
-
`agentMiddleware` `afterToolCall` hook happens to be registered.
|
|
22
|
-
|
|
23
|
-
**What this rules out:** folding the logging into the optional middleware
|
|
24
|
-
wrapper below it, and relying on the AI SDK's own error reporting for tool
|
|
25
|
-
failures.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: decision
|
|
3
|
-
title: Voice input transcribes audio parts sequentially and in place
|
|
4
|
-
description: Each audio part is replaced by its text where it sat, one at a time, bounding concurrent downloads and preserving content order
|
|
5
|
-
tags: agent
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Voice input transcribes audio parts sequentially and in place
|
|
9
|
-
|
|
10
|
-
The `voiceInput` middleware in
|
|
11
|
-
`packages/core/src/wirings/agent/voice-input.ts` walks the last user
|
|
12
|
-
message's content parts in order and swaps each audio part for a text part at the
|
|
13
|
-
same index, awaiting one transcription before starting the next.
|
|
14
|
-
|
|
15
|
-
Order matters because the surrounding text parts are the user's own framing of
|
|
16
|
-
the audio; hoisting transcripts to the end would reorder the prompt. Sequencing
|
|
17
|
-
matters because a message can carry many attachments: a `Promise.all` would fan
|
|
18
|
-
out an unbounded number of concurrent multi-megabyte downloads and provider
|
|
19
|
-
transcription calls from a single request.
|
|
20
|
-
|
|
21
|
-
**What this rules out:** parallelizing the loop with `Promise.all`, and
|
|
22
|
-
collecting transcripts into a separate block appended to the message.
|