@pikku/core 0.12.143 → 0.12.145
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/analytics.d.ts +14 -0
- package/dist/analytics/analytics.js +14 -0
- package/dist/analytics/analytics.types.d.ts +1 -0
- package/dist/analytics/anonymous-analytics-identity.d.ts +1 -0
- package/dist/analytics/cookie-analytics-identity.d.ts +1 -0
- package/dist/analytics/mint-cookie.d.ts +1 -0
- package/dist/{wirings/channel/channel-middleware-runner.d.ts → channel-middleware-runner.d.ts} +17 -3
- package/dist/{wirings/channel/channel-middleware-runner.js → channel-middleware-runner.js} +24 -8
- package/dist/classification/data-classification.d.ts +13 -0
- package/dist/classification/secret-value.d.ts +7 -0
- package/dist/classification/secret-value.js +7 -0
- package/dist/crypto-utils.d.ts +93 -0
- package/dist/crypto-utils.js +92 -0
- package/dist/dev/hot-reload.d.ts +16 -0
- package/dist/dev/hot-reload.js +16 -1
- package/dist/dev/module-runner.js +7 -3
- package/dist/dev/reload-meta.js +1 -1
- package/dist/errors/error-handler.d.ts +9 -0
- package/dist/errors/error-handler.js +8 -0
- package/dist/errors/errors.d.ts +219 -0
- package/dist/errors/errors.js +227 -0
- package/dist/errors/serialized-error.d.ts +4 -0
- package/dist/function/abort-scope.d.ts +5 -0
- package/dist/function/function-meta.types.d.ts +20 -0
- package/dist/function/function-runner.d.ts +41 -0
- package/dist/function/function-runner.js +57 -11
- package/dist/function/functions.types.d.ts +59 -0
- package/dist/function/functions.types.js +23 -0
- package/dist/function/list.types.d.ts +4 -0
- package/dist/lifecycle.d.ts +12 -1
- package/dist/lifecycle.js +12 -1
- package/dist/middleware/addon-scope-cap.d.ts +4 -0
- package/dist/middleware/addon-scope-cap.js +7 -3
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.js +5 -13
- package/dist/middleware/auth-cookie.js +3 -3
- package/dist/middleware/middleware-factories.d.ts +17 -0
- package/dist/middleware/middleware-factories.js +17 -0
- package/dist/middleware/middleware.types.d.ts +23 -0
- package/dist/middleware/remote-auth.d.ts +15 -0
- package/dist/middleware/remote-auth.js +18 -3
- package/dist/middleware/remote-jobs-secret.js +2 -10
- package/dist/middleware-runner.d.ts +7 -0
- package/dist/middleware-runner.js +23 -7
- package/dist/permissions.d.ts +13 -0
- package/dist/permissions.js +13 -0
- package/dist/pikku-state.d.ts +49 -0
- package/dist/pikku-state.js +49 -0
- package/dist/remote.js +20 -5
- package/dist/schema.d.ts +36 -0
- package/dist/schema.js +36 -0
- package/dist/services/agent-run-state-service.d.ts +8 -0
- package/dist/services/agent-runner-service.d.ts +24 -0
- package/dist/services/agent-storage-service.d.ts +8 -0
- package/dist/services/ai-embedding-service.d.ts +4 -0
- package/dist/services/audit-service.d.ts +48 -0
- package/dist/services/audit-service.js +22 -0
- package/dist/services/content-service.d.ts +34 -0
- package/dist/services/credential-wire-service.d.ts +9 -0
- package/dist/services/credential-wire-service.js +9 -0
- package/dist/services/deployment-service.d.ts +14 -0
- package/dist/services/email-service.d.ts +20 -0
- package/dist/services/email-template.d.ts +24 -0
- package/dist/services/email-template.js +12 -0
- package/dist/services/file-scenario-run-store.d.ts +5 -0
- package/dist/services/file-scenario-run-store.js +4 -0
- package/dist/services/gateway-service.d.ts +5 -0
- package/dist/services/in-memory-agent-run-state-service.d.ts +5 -0
- package/dist/services/in-memory-agent-run-state-service.js +5 -0
- package/dist/services/in-memory-lease-service.d.ts +5 -0
- package/dist/services/in-memory-lease-service.js +5 -0
- package/dist/services/in-memory-session-store.d.ts +4 -0
- package/dist/services/in-memory-session-store.js +4 -0
- package/dist/services/incoming-webhook-queue.d.ts +2 -0
- package/dist/services/incoming-webhook-queue.js +2 -0
- package/dist/services/incoming-webhook-service.d.ts +9 -1
- package/dist/services/incoming-webhook-service.js +1 -1
- package/dist/services/index.d.ts +1 -5
- package/dist/services/index.js +1 -5
- package/dist/services/jwt-service.d.ts +8 -0
- package/dist/services/lease-service.d.ts +5 -0
- package/dist/services/lease-service.js +1 -0
- package/dist/services/local-content-request-handler.d.ts +20 -0
- package/dist/services/local-content-request-handler.js +11 -0
- package/dist/services/local-content.d.ts +45 -0
- package/dist/services/local-content.js +35 -0
- package/dist/services/local-credential-service.d.ts +5 -0
- package/dist/services/local-credential-service.js +5 -0
- package/dist/services/local-email-service.d.ts +7 -0
- package/dist/services/local-email-service.js +7 -0
- package/dist/services/local-secrets.d.ts +8 -0
- package/dist/services/local-secrets.js +8 -0
- package/dist/services/local-variables.d.ts +6 -0
- package/dist/services/local-variables.js +6 -0
- package/dist/services/logger.d.ts +4 -0
- package/dist/services/logger.js +4 -0
- package/dist/services/meta-service.d.ts +38 -0
- package/dist/services/meta-service.js +6 -0
- package/dist/services/queue-webhook-service.d.ts +19 -0
- package/dist/services/queue-webhook-service.js +19 -0
- package/dist/services/remote-jobs.d.ts +8 -13
- package/dist/services/remote-jobs.js +3 -54
- package/dist/services/scenario-cookie-jar.d.ts +4 -0
- package/dist/services/scheduler-service.d.ts +13 -0
- package/dist/services/scheduler-service.js +8 -0
- package/dist/services/schema-service.d.ts +9 -0
- package/dist/services/scope-service.d.ts +10 -0
- package/dist/services/scoped-secret-service.d.ts +5 -0
- package/dist/services/scoped-secret-service.js +5 -0
- package/dist/services/secret-host-binding.d.ts +5 -0
- package/dist/services/secret-host-binding.js +5 -0
- package/dist/services/secret-service.d.ts +19 -1
- package/dist/services/secretless.d.ts +6 -0
- package/dist/services/secretless.js +6 -0
- package/dist/services/session-store.d.ts +5 -0
- package/dist/services/stub-tracker.d.ts +1 -0
- package/dist/services/temporary-file-service.d.ts +9 -0
- package/dist/services/temporary-file-service.js +9 -0
- package/dist/services/trigger-service.d.ts +4 -0
- package/dist/services/trigger-source-store.d.ts +13 -0
- package/dist/services/trigger-source-store.js +7 -0
- package/dist/services/typed-credential-service.d.ts +6 -0
- package/dist/services/typed-credential-service.js +5 -0
- package/dist/services/typed-secret-service.d.ts +12 -0
- package/dist/services/typed-secret-service.js +11 -0
- package/dist/services/typed-variables-service.d.ts +1 -0
- package/dist/services/user-session-service.d.ts +31 -1
- package/dist/services/user-session-service.js +29 -3
- package/dist/services/v8-coverage-service.d.ts +27 -0
- package/dist/services/v8-coverage-service.js +5 -0
- package/dist/services/variables-service.d.ts +8 -0
- package/dist/services/virtual-user-sign-in.d.ts +1 -0
- package/dist/services/virtual-user-statement.d.ts +8 -0
- package/dist/services/virtual-user-statement.js +4 -0
- package/dist/services/webhook-service.d.ts +25 -0
- package/dist/services/webhook-service.js +15 -0
- package/dist/services/workflow-service.d.ts +6 -0
- package/dist/test-utils.js +1 -1
- package/dist/testing/service-tests.d.ts +4 -0
- package/dist/time-utils.d.ts +15 -0
- package/dist/time-utils.js +14 -0
- package/dist/types/core.types.d.ts +80 -0
- package/dist/types/state.types.d.ts +4 -0
- package/dist/utils/hmac.d.ts +3 -0
- package/dist/utils/safe-fetch.d.ts +14 -0
- package/dist/utils/safe-fetch.js +13 -0
- package/dist/utils/stable-stringify.d.ts +11 -0
- package/dist/utils/stable-stringify.js +33 -0
- package/dist/utils.d.ts +28 -0
- package/dist/utils.js +22 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.js +7 -0
- package/dist/wirings/addon/define-screens.d.ts +2 -0
- package/dist/wirings/addon/remote-addon-auth.d.ts +9 -0
- package/dist/wirings/addon/remote-addon-auth.js +5 -0
- package/dist/wirings/addon/wire-addon.d.ts +4 -0
- package/dist/wirings/addon/wire-remote-addon.d.ts +1 -0
- package/dist/wirings/agent/agent-agui.d.ts +14 -5
- package/dist/wirings/agent/agent-agui.js +17 -6
- package/dist/wirings/agent/agent-helpers.d.ts +61 -1
- package/dist/wirings/agent/agent-helpers.js +62 -2
- package/dist/wirings/agent/agent-interrupt.d.ts +5 -0
- package/dist/wirings/agent/agent-output.d.ts +20 -0
- package/dist/wirings/agent/agent-output.js +69 -0
- package/dist/wirings/agent/agent-prepare.d.ts +41 -0
- package/dist/wirings/agent/agent-prepare.js +38 -2
- package/dist/wirings/agent/agent-registry.d.ts +8 -0
- package/dist/wirings/agent/agent-registry.js +10 -4
- package/dist/wirings/agent/agent-runner.d.ts +33 -0
- package/dist/wirings/agent/agent-runner.js +40 -7
- package/dist/wirings/agent/agent-stream.d.ts +30 -0
- package/dist/wirings/agent/agent-stream.js +33 -11
- package/dist/wirings/agent/agent.types.d.ts +43 -0
- package/dist/wirings/agent/voice-input.d.ts +12 -0
- package/dist/wirings/agent/voice-input.js +12 -0
- package/dist/wirings/agent/voice-output.d.ts +14 -0
- package/dist/wirings/agent/voice-output.js +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-judge.js +1 -2
- package/dist/wirings/agent-scorer/agent-scorer-registry.d.ts +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-registry.js +10 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.d.ts +1 -0
- package/dist/wirings/agent-scorer/agent-scorer-snapshots.js +1 -0
- package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +7 -0
- package/dist/wirings/channel/channel-common.js +1 -1
- package/dist/wirings/channel/channel-rpc.types.d.ts +5 -0
- package/dist/wirings/channel/channel-runner.d.ts +22 -0
- package/dist/wirings/channel/channel-runner.js +22 -0
- package/dist/wirings/channel/channel-store.d.ts +8 -0
- package/dist/wirings/channel/channel-store.js +7 -0
- package/dist/wirings/channel/channel.types.d.ts +18 -0
- package/dist/wirings/channel/define-channel-routes.d.ts +5 -0
- package/dist/wirings/channel/define-channel-routes.js +5 -0
- package/dist/wirings/channel/eventhub-service.d.ts +9 -0
- package/dist/wirings/channel/eventhub-store.d.ts +1 -0
- package/dist/wirings/channel/eventhub-store.js +1 -0
- package/dist/wirings/channel/index.d.ts +1 -1
- package/dist/wirings/channel/index.js +1 -1
- package/dist/wirings/channel/local/local-channel-handler.d.ts +1 -0
- package/dist/wirings/channel/local/local-channel-handler.js +1 -0
- package/dist/wirings/channel/local/local-channel-runner.d.ts +13 -0
- package/dist/wirings/channel/local/local-channel-runner.js +13 -0
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +1 -0
- package/dist/wirings/channel/local/local-eventhub-service.js +1 -0
- package/dist/wirings/channel/log-channels.d.ts +1 -0
- package/dist/wirings/channel/log-channels.js +1 -0
- package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +5 -0
- package/dist/wirings/channel/pikku-abstract-channel-handler.js +5 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +32 -0
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +31 -0
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +8 -0
- package/dist/wirings/cli/channel/cli-channel-runner.js +8 -0
- package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +1 -0
- package/dist/wirings/cli/cli-runner.d.ts +43 -0
- package/dist/wirings/cli/cli-runner.js +43 -0
- package/dist/wirings/cli/cli.types.d.ts +4 -0
- package/dist/wirings/cli/command-parser.d.ts +13 -0
- package/dist/wirings/cli/command-parser.js +16 -0
- package/dist/wirings/credential/credential-overrides.d.ts +1 -0
- package/dist/wirings/credential/credential.types.d.ts +7 -0
- package/dist/wirings/credential/validate-credential-definitions.d.ts +7 -0
- package/dist/wirings/credential/validate-credential-definitions.js +7 -0
- package/dist/wirings/flag/cached-flag-source.d.ts +1 -0
- package/dist/wirings/flag/flag.types.d.ts +3 -0
- package/dist/wirings/gateway/gateway-runner.d.ts +23 -0
- package/dist/wirings/gateway/gateway-runner.js +23 -0
- package/dist/wirings/gateway/gateway.types.d.ts +3 -0
- package/dist/wirings/gateway/local-gateway-service.d.ts +10 -0
- package/dist/{services → wirings/gateway}/local-gateway-service.js +6 -2
- package/dist/wirings/http/http-routes.d.ts +21 -0
- package/dist/wirings/http/http-routes.js +11 -0
- package/dist/wirings/http/http-runner.d.ts +71 -0
- package/dist/wirings/http/http-runner.js +73 -5
- package/dist/wirings/http/http.types.d.ts +27 -0
- package/dist/wirings/http/index.d.ts +1 -0
- package/dist/wirings/http/index.js +1 -0
- package/dist/wirings/http/log-http-routes.d.ts +1 -0
- package/dist/wirings/http/log-http-routes.js +1 -0
- package/dist/wirings/http/merge-request-data.d.ts +12 -0
- package/dist/wirings/http/merge-request-data.js +42 -0
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-request.js +3 -32
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
- package/dist/wirings/http/pikku-fetch-http-response.js +1 -0
- package/dist/wirings/http/routers/http-router.d.ts +6 -0
- package/dist/wirings/http/routers/http-router.js +6 -0
- package/dist/wirings/http/web-request.d.ts +17 -0
- package/dist/wirings/http/web-request.js +17 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +7 -0
- package/dist/wirings/mcp/mcp-endpoint-registry.js +7 -0
- package/dist/wirings/mcp/mcp-runner.d.ts +63 -0
- package/dist/wirings/mcp/mcp-runner.js +62 -0
- package/dist/wirings/mcp/mcp.types.d.ts +12 -0
- package/dist/wirings/node/node.types.d.ts +4 -0
- package/dist/wirings/oauth2/oauth2.types.d.ts +2 -0
- package/dist/{services → wirings/queue}/in-memory-queue-service.d.ts +9 -1
- package/dist/{services → wirings/queue}/in-memory-queue-service.js +9 -1
- package/dist/wirings/queue/index.d.ts +1 -0
- package/dist/wirings/queue/index.js +1 -0
- package/dist/wirings/queue/queue-identity.js +2 -14
- package/dist/wirings/queue/queue-runner.d.ts +37 -0
- package/dist/wirings/queue/queue-runner.js +37 -0
- package/dist/wirings/queue/queue.types.d.ts +35 -0
- package/dist/wirings/queue/register-queue-helper.d.ts +12 -0
- package/dist/wirings/queue/register-queue-helper.js +11 -0
- package/dist/wirings/queue/remote-queue-job.d.ts +11 -0
- package/dist/wirings/queue/remote-queue-job.js +41 -0
- package/dist/wirings/queue/validate-worker-config.d.ts +1 -0
- package/dist/wirings/role/role.types.d.ts +3 -0
- package/dist/wirings/rpc/rpc-runner.d.ts +24 -0
- package/dist/wirings/rpc/rpc-runner.js +37 -2
- package/dist/wirings/rpc/rpc-types.d.ts +2 -0
- package/dist/wirings/scheduler/index.d.ts +1 -0
- package/dist/wirings/scheduler/index.js +1 -0
- package/dist/wirings/scheduler/log-schedulers.d.ts +1 -0
- package/dist/wirings/scheduler/log-schedulers.js +1 -0
- package/dist/wirings/scheduler/remote-scheduled-job.d.ts +11 -0
- package/dist/wirings/scheduler/remote-scheduled-job.js +20 -0
- package/dist/wirings/scheduler/scheduler-runner.d.ts +29 -0
- package/dist/wirings/scheduler/scheduler-runner.js +28 -0
- package/dist/wirings/scheduler/scheduler.types.d.ts +3 -0
- package/dist/wirings/scope/scope.types.d.ts +5 -0
- package/dist/wirings/secret/index.d.ts +2 -2
- package/dist/wirings/secret/index.js +1 -1
- package/dist/wirings/secret/secret.types.d.ts +26 -1
- package/dist/wirings/secret/secret.types.js +1 -0
- package/dist/wirings/secret/validate-secret-definitions.d.ts +8 -0
- package/dist/wirings/secret/validate-secret-definitions.js +15 -0
- package/dist/wirings/trigger/in-memory-trigger-service.d.ts +11 -0
- package/dist/{services → wirings/trigger}/in-memory-trigger-service.js +10 -3
- package/dist/wirings/trigger/index.d.ts +1 -1
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +8 -3
- package/dist/wirings/trigger/pikku-trigger-service.js +14 -3
- package/dist/wirings/trigger/trigger-runner.d.ts +27 -2
- package/dist/wirings/trigger/trigger-runner.js +35 -2
- package/dist/wirings/trigger/trigger.types.d.ts +26 -4
- package/dist/wirings/trigger/webhook-source-runner.d.ts +24 -0
- package/dist/wirings/trigger/webhook-source-runner.js +19 -0
- package/dist/wirings/trigger/webhook-source.types.d.ts +12 -2
- package/dist/wirings/trigger/webhook-source.types.js +1 -1
- package/dist/wirings/variable/validate-variable-definitions.d.ts +7 -0
- package/dist/wirings/variable/validate-variable-definitions.js +7 -0
- package/dist/wirings/variable/variable.types.d.ts +7 -0
- package/dist/wirings/virtual-user/conversation/conversation.types.d.ts +5 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.d.ts +6 -0
- package/dist/wirings/virtual-user/conversation/run-conversation.js +1 -1
- package/dist/{services → wirings/virtual-user}/http-virtual-users.d.ts +4 -3
- package/dist/{services → wirings/virtual-user}/http-virtual-users.js +6 -6
- package/dist/wirings/virtual-user/index.d.ts +1 -1
- package/dist/wirings/virtual-user/index.js +1 -1
- package/dist/wirings/virtual-user/run-virtual-user.d.ts +2 -1
- package/dist/wirings/virtual-user/run-virtual-user.js +1 -14
- package/dist/wirings/virtual-user/virtual-user-declaration.types.d.ts +4 -0
- package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +10 -1
- package/dist/wirings/virtual-user/virtual-user-scaffold.js +5 -0
- package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +5 -0
- package/dist/wirings/virtual-user/virtual-user-schedule.js +1 -0
- package/dist/wirings/virtual-user/virtual-user-target.d.ts +1 -0
- package/dist/wirings/webhook/define-outgoing-webhook.d.ts +20 -0
- package/dist/wirings/webhook/define-outgoing-webhook.js +9 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +8 -4
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +7 -0
- package/dist/wirings/workflow/dsl/workflow-runner.js +7 -0
- package/dist/wirings/workflow/feature.d.ts +12 -0
- package/dist/wirings/workflow/feature.js +12 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +5 -0
- package/dist/wirings/workflow/graph/graph-node.js +5 -0
- package/dist/wirings/workflow/graph/template.d.ts +6 -0
- package/dist/wirings/workflow/graph/template.js +5 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +12 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.js +10 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +11 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.js +1 -0
- package/dist/{services → wirings/workflow}/in-memory-workflow-service.d.ts +8 -3
- package/dist/{services → wirings/workflow}/in-memory-workflow-service.js +9 -4
- package/dist/wirings/workflow/pikku-scenario-service.d.ts +1 -1
- package/dist/wirings/workflow/pikku-scenario-service.js +2 -2
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +1 -0
- package/dist/wirings/workflow/pikku-workflow-service.js +1 -0
- package/dist/wirings/workflow/run-timeline.d.ts +21 -0
- package/dist/wirings/workflow/run-timeline.js +15 -7
- package/dist/wirings/workflow/scenario-coverage.d.ts +1 -0
- package/dist/wirings/workflow/scenario-poll.d.ts +1 -0
- package/dist/wirings/workflow/scenario-prose.d.ts +6 -0
- package/dist/wirings/workflow/scenario-prose.js +6 -0
- package/dist/wirings/workflow/scenario-run.types.d.ts +3 -0
- package/dist/wirings/workflow/scenario-step.types.d.ts +1 -0
- package/dist/wirings/workflow/scenario-step.types.js +1 -0
- package/dist/wirings/workflow/scenario-surface.js +1 -13
- package/dist/wirings/workflow/scenario.types.d.ts +6 -0
- package/dist/wirings/workflow/workflow-approval-policy.d.ts +6 -0
- package/dist/wirings/workflow/workflow-approval-policy.js +6 -0
- package/dist/wirings/workflow/workflow-constants.d.ts +7 -1
- package/dist/wirings/workflow/workflow-constants.js +10 -1
- package/dist/wirings/workflow/workflow-errors.d.ts +13 -0
- package/dist/wirings/workflow/workflow-errors.js +13 -0
- package/dist/wirings/workflow/workflow-invocation-id.d.ts +4 -0
- package/dist/wirings/workflow/workflow-invocation-id.js +4 -0
- package/dist/wirings/workflow/workflow-queue-workers.d.ts +3 -0
- package/dist/wirings/workflow/workflow-run-ownership.d.ts +1 -0
- package/dist/wirings/workflow/workflow-run-ownership.js +1 -0
- package/dist/wirings/workflow/workflow-status-stream.d.ts +1 -0
- package/dist/wirings/workflow/workflow-unwind-plan.js +2 -7
- package/dist/wirings/workflow/workflow.types.d.ts +40 -0
- package/package.json +26 -9
- package/CHANGELOG.md +0 -6978
- package/dist/services/in-memory-trigger-service.d.ts +0 -4
- package/dist/services/local-gateway-service.d.ts +0 -6
- package/dist/utils/hash.d.ts +0 -2
- package/dist/utils/hash.js +0 -23
- package/knowledge/decisions/index.md +0 -19
- package/knowledge/decisions/internals/a-credential-name-declared-twice-must-agree-on-schema-and-type.md +0 -29
- package/knowledge/decisions/internals/a-grant-can-name-a-scope-declared-without-its-addon.md +0 -29
- package/knowledge/decisions/internals/a-held-run-is-woken-later-not-retried.md +0 -28
- package/knowledge/decisions/internals/a-latency-budget-is-asserted-by-its-cause.md +0 -32
- package/knowledge/decisions/internals/a-non-streaming-agent-run-registers-with-agentrunstate-too.md +0 -22
- package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +0 -50
- package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +0 -20
- package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +0 -21
- package/knowledge/decisions/internals/a-scheduled-task-writes-its-caller-session-before-it-runs.md +0 -22
- package/knowledge/decisions/internals/a-secret-set-in-memory-shadows-the-variable-of-the-same-name.md +0 -28
- package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +0 -49
- package/knowledge/decisions/internals/a-virtual-user-acts-through-invokeraw-so-a-refusal-is-data.md +0 -32
- package/knowledge/decisions/internals/a-virtual-user-cadence-is-a-row-not-a-timer.md +0 -66
- package/knowledge/decisions/internals/a-virtual-user-converse-signs-in-before-its-first-turn.md +0 -24
- package/knowledge/decisions/internals/a-virtual-user-decides-whether-to-trust-memory-once-per-turn.md +0 -21
- package/knowledge/decisions/internals/a-virtual-user-email-is-computed-with-the-run-id-as-a-sub-address.md +0 -34
- package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-but-it-needs-a-trigger.md +0 -65
- package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +0 -49
- package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +0 -45
- package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +0 -26
- package/knowledge/decisions/internals/addon-pikku-meta-ships-at-the-package-root-or-under-dist.md +0 -32
- package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +0 -33
- package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +0 -28
- package/knowledge/decisions/internals/agent-agui-bridge-obeys-the-client-ordering-contract.md +0 -29
- package/knowledge/decisions/internals/agent-audio-chunks-carry-the-format-the-provider-returned.md +0 -20
- package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +0 -21
- package/knowledge/decisions/internals/agent-credential-suspensions-hide-the-tool-result.md +0 -26
- package/knowledge/decisions/internals/agent-delegate-and-supervise-hide-different-text.md +0 -26
- package/knowledge/decisions/internals/agent-llm-tool-arguments-have-nulls-stripped.md +0 -23
- package/knowledge/decisions/internals/agent-model-config-stays-a-single-resolution-seam.md +0 -25
- package/knowledge/decisions/internals/agent-onerror-hooks-cannot-change-the-failure.md +0 -22
- package/knowledge/decisions/internals/agent-runner-methods-must-keep-their-receiver.md +0 -22
- package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +0 -22
- package/knowledge/decisions/internals/agent-stream-persistence-is-best-effort.md +0 -27
- package/knowledge/decisions/internals/agent-sub-agents-inherit-the-parent-context-block.md +0 -26
- package/knowledge/decisions/internals/agent-tool-execute-failures-are-logged-unconditionally.md +0 -25
- package/knowledge/decisions/internals/agent-voice-input-transcribes-audio-parts-in-place.md +0 -22
- package/knowledge/decisions/internals/agent-working-memory-is-persisted-only-when-valid.md +0 -25
- package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +0 -39
- package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +0 -23
- package/knowledge/decisions/internals/an-agent-is-offered-under-its-registry-key-and-only-within-the-virtual-users-scopes.md +0 -27
- package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +0 -25
- package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +0 -22
- package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +0 -20
- package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +0 -22
- package/knowledge/decisions/internals/an-oauth2-credential-implies-an-optional-app-secret.md +0 -26
- package/knowledge/decisions/internals/an-unref-d-timer-cannot-be-awaited-under-node-test.md +0 -66
- package/knowledge/decisions/internals/analytics-identity-resolvers-run-in-declared-order.md +0 -22
- package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +0 -30
- package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +0 -31
- package/knowledge/decisions/internals/channel-state-accessors-are-unsound-generics-that-every-implementation-asserts.md +0 -33
- package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +0 -29
- package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +0 -28
- package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +0 -27
- package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +0 -28
- package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +0 -34
- package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +0 -29
- package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +0 -84
- package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +0 -41
- package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +0 -44
- package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +0 -39
- package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +0 -42
- package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +0 -39
- package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +0 -43
- package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +0 -38
- package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +0 -44
- package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +0 -27
- package/knowledge/decisions/internals/feature-flag-declarations-refuse-an-empty-anyof-and-conflicting-scopes.md +0 -22
- package/knowledge/decisions/internals/feature-flags-fail-open-and-never-enforce-access.md +0 -28
- package/knowledge/decisions/internals/flag-sync-rewrites-only-the-declared-text.md +0 -24
- package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +0 -32
- package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +0 -43
- package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +0 -28
- package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +0 -31
- package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +0 -26
- package/knowledge/decisions/internals/global-middleware-resolves-from-the-root-namespace-too.md +0 -32
- package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +0 -38
- package/knowledge/decisions/internals/hot-reload-writes-into-the-function-map-captured-at-startup.md +0 -26
- package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +0 -32
- package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +0 -28
- package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +0 -30
- package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +0 -26
- package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +0 -28
- package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +0 -32
- package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +0 -26
- package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +0 -25
- package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +0 -26
- package/knowledge/decisions/internals/index.md +0 -182
- package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +0 -25
- package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +0 -26
- package/knowledge/decisions/internals/mcp-wire-names-are-assigned-over-the-whole-registry.md +0 -39
- package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +0 -24
- package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +0 -53
- package/knowledge/decisions/internals/only-exposed-functions-enter-a-virtual-user-catalogue.md +0 -21
- package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +0 -28
- package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +0 -27
- package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +0 -31
- package/knowledge/decisions/internals/role-names-cannot-contain-the-scope-separator.md +0 -30
- package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +0 -32
- package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +0 -31
- package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +0 -24
- package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +0 -26
- package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +0 -27
- package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +0 -48
- package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +0 -30
- package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +0 -28
- package/knowledge/decisions/internals/side-effects-are-an-allowlist-not-a-boolean.md +0 -34
- package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +0 -24
- package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +0 -26
- package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +0 -43
- package/knowledge/decisions/internals/the-core-scope-validator-refuses-separator-wildcard-and-empty-segments.md +0 -22
- package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +0 -30
- package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +0 -83
- package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +0 -29
- package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +0 -27
- package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +0 -40
- package/knowledge/decisions/internals/the-mcp-handshake-is-challenged-only-when-every-target-is-gated.md +0 -29
- package/knowledge/decisions/internals/the-middleware-resolution-cache-is-deliberately-unbounded.md +0 -40
- package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +0 -40
- package/knowledge/decisions/internals/the-pikku-user-id-resolves-in-a-fixed-order.md +0 -24
- package/knowledge/decisions/internals/the-runner-resolves-wire-services-itself.md +0 -31
- package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +0 -26
- package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +0 -25
- package/knowledge/decisions/internals/the-virtual-user-catalogue-is-the-only-gate-on-what-may-be-called.md +0 -21
- package/knowledge/decisions/internals/the-virtual-user-prompt-says-json-because-of-json-object-mode.md +0 -22
- package/knowledge/decisions/internals/the-virtual-user-runtime-is-exported-from-the-virtual-user-entry-point.md +0 -28
- package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +0 -22
- package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +0 -25
- package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +0 -33
- package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +0 -26
- package/knowledge/decisions/internals/validate-checks-virtual-users-through-a-shared-module.md +0 -43
- package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +0 -115
- package/knowledge/decisions/internals/virtual-user-conversation-drives-the-target-through-a-transport-seam.md +0 -24
- package/knowledge/decisions/internals/virtual-user-conversation-verdicts-are-llm-self-evaluations.md +0 -25
- package/knowledge/decisions/internals/virtual-user-conversations-seed-a-hidden-kickoff-message.md +0 -23
- package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +0 -21
- package/knowledge/decisions/internals/virtual-users-are-declared-in-one-definevirtualusers-call-per-codebase.md +0 -30
- package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +0 -24
- package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +0 -26
- package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +0 -25
- package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +0 -58
- package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +0 -35
- package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +0 -34
- package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +0 -42
- package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +0 -38
- package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +0 -29
- package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +0 -42
- package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +0 -25
- package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +0 -29
- package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +0 -43
- package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +0 -29
- package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +0 -42
- package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +0 -33
- package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +0 -32
- package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +0 -31
- package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +0 -39
- package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +0 -29
- package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +0 -33
- package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +0 -37
- package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +0 -54
- package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +0 -43
- package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +0 -32
- package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +0 -18
- package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +0 -34
- package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +0 -29
- package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +0 -33
- package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +0 -34
- package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +0 -34
- package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +0 -38
- package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +0 -30
- package/knowledge/decisions/security/a-bearer-token-checked-against-a-secret-reads-it-per-request.md +0 -26
- package/knowledge/decisions/security/a-call-without-a-session-raises-missing-session-not-forbidden.md +0 -20
- package/knowledge/decisions/security/a-caller-cookie-wins-over-the-jar-for-the-same-name.md +0 -23
- package/knowledge/decisions/security/a-channel-lifecycle-acts-as-the-socket-upgrade-session.md +0 -16
- package/knowledge/decisions/security/a-channel-requires-a-session-unless-it-says-auth-false.md +0 -26
- package/knowledge/decisions/security/a-credential-read-path-follows-its-declared-type-not-absence.md +0 -32
- package/knowledge/decisions/security/a-credential-type-is-a-literal-the-inspector-checks-at-declaration.md +0 -27
- package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +0 -28
- package/knowledge/decisions/security/a-first-party-cookie-is-written-only-after-its-purposes-consent.md +0 -33
- package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +0 -37
- package/knowledge/decisions/security/a-graph-run-starts-at-an-entry-node-the-graph-declared.md +0 -33
- package/knowledge/decisions/security/a-permission-gets-a-wire-it-cannot-reply-on.md +0 -33
- package/knowledge/decisions/security/a-public-function-says-so-with-auth-false.md +0 -34
- package/knowledge/decisions/security/a-readonly-session-reaches-only-readonly-functions.md +0 -25
- package/knowledge/decisions/security/a-scaffold-flag-says-a-surface-exists-not-who-may-call-it.md +0 -52
- package/knowledge/decisions/security/a-scheduled-virtual-user-run-needs-no-admin-at-run-time.md +0 -27
- package/knowledge/decisions/security/a-scoped-credential-view-is-limited-to-declared-names.md +0 -26
- package/knowledge/decisions/security/a-scoped-secret-view-reads-only-declared-keys-and-never-writes.md +0 -25
- package/knowledge/decisions/security/a-secret-is-sent-only-to-the-hosts-it-declares.md +0 -29
- package/knowledge/decisions/security/a-step-can-name-an-identity-no-virtual-user-holds-through-per-call-headers.md +0 -25
- package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +0 -37
- package/knowledge/decisions/security/a-stopped-run-by-id-skips-the-ownership-check.md +0 -24
- package/knowledge/decisions/security/a-vault-secret-redacts-on-serialization-and-throws-on-coercion.md +0 -29
- package/knowledge/decisions/security/a-virtual-user-catalogue-entry-is-filtered-by-scope-and-approval-is-denied-by-default.md +0 -30
- package/knowledge/decisions/security/a-virtual-user-environment-fails-closed.md +0 -38
- package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +0 -27
- package/knowledge/decisions/security/a-virtual-user-never-runs-against-production.md +0 -23
- package/knowledge/decisions/security/a-virtual-user-reads-its-roles-from-the-apps-own-rpc-before-better-auth.md +0 -27
- package/knowledge/decisions/security/a-virtual-user-run-treats-an-unresolved-environment-as-production.md +0 -41
- package/knowledge/decisions/security/a-virtual-user-scopes-are-expanded-from-its-roles-once-at-run-preparation.md +0 -25
- package/knowledge/decisions/security/a-virtual-user-whose-roles-drift-from-the-declaration-refuses-to-run.md +0 -32
- package/knowledge/decisions/security/a-workflow-run-is-read-and-approved-by-its-owner.md +0 -50
- package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +0 -43
- package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +0 -52
- package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +0 -46
- package/knowledge/decisions/security/addon-screen-scopes-hide-and-do-not-enforce.md +0 -20
- package/knowledge/decisions/security/agent-approval-forwarding-requires-a-symbol-brand.md +0 -27
- package/knowledge/decisions/security/agent-credential-requests-are-symbol-branded.md +0 -37
- package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +0 -31
- package/knowledge/decisions/security/agent-ownership-failures-never-echo-the-resource.md +0 -23
- package/knowledge/decisions/security/agent-resume-re-runs-the-authorization-gate.md +0 -22
- package/knowledge/decisions/security/agent-sessionless-deployments-have-no-thread-ownership.md +0 -39
- package/knowledge/decisions/security/agent-thread-ownership-composes-the-session-principal.md +0 -30
- package/knowledge/decisions/security/agent-tool-filtering-reads-the-live-function-config.md +0 -24
- package/knowledge/decisions/security/an-addon-header-can-only-narrow-the-session.md +0 -26
- package/knowledge/decisions/security/an-addon-instance-reads-only-the-secrets-and-credentials-it-is-named.md +0 -33
- package/knowledge/decisions/security/an-addon-may-reach-only-itself-and-the-addons-it-uses.md +0 -16
- package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +0 -33
- package/knowledge/decisions/security/an-api-key-is-jwt-decoded-into-the-session.md +0 -26
- package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +0 -59
- package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +0 -30
- package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +0 -52
- package/knowledge/decisions/security/an-external-virtual-user-caller-presents-one-signed-statement.md +0 -38
- package/knowledge/decisions/security/an-inbound-webhook-source-dispatches-only-verified-requests.md +0 -31
- package/knowledge/decisions/security/an-mcp-call-with-no-http-request-stays-anonymous.md +0 -18
- package/knowledge/decisions/security/an-mcp-refusal-is-decided-before-dispatch.md +0 -48
- package/knowledge/decisions/security/an-oauth2-credential-is-read-by-its-account-row.md +0 -40
- package/knowledge/decisions/security/an-omitted-user-id-addresses-the-platform-credential.md +0 -32
- package/knowledge/decisions/security/an-upload-is-counted-as-it-arrives-not-buffered-then-measured.md +0 -24
- package/knowledge/decisions/security/analytics-identity-is-stamped-from-the-session-not-the-event.md +0 -24
- package/knowledge/decisions/security/app-access-is-a-scope-tree-synthesised-from-virtual-users.md +0 -26
- package/knowledge/decisions/security/approval-policy-decides-who-answers-a-tool-call.md +0 -27
- package/knowledge/decisions/security/auth-false-on-a-session-function-warns-and-still-requires-one.md +0 -25
- package/knowledge/decisions/security/bearer-token-hashes-are-unpeppered-sha256.md +0 -18
- package/knowledge/decisions/security/consent-is-read-from-a-cookie-and-a-recognised-denial-counts-as-refusal.md +0 -29
- package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +0 -84
- package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +0 -39
- package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +0 -37
- package/knowledge/decisions/security/cors-defaults-to-any-origin-and-refuses-the-wildcard-with-credentials.md +0 -22
- package/knowledge/decisions/security/credential-backends-share-one-conformance-suite-for-per-user-isolation.md +0 -29
- package/knowledge/decisions/security/each-stage-has-one-virtual-user-key-pair.md +0 -27
- package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +0 -41
- package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +0 -30
- package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +0 -40
- package/knowledge/decisions/security/hmac-verification-fails-closed-on-empty-inputs.md +0 -25
- package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +0 -33
- package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +0 -46
- package/knowledge/decisions/security/index.md +0 -135
- package/knowledge/decisions/security/local-content-refuses-private-buckets-under-the-public-segment.md +0 -21
- package/knowledge/decisions/security/mail-is-allowlisted-before-a-virtual-user-run-sees-it.md +0 -38
- package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +0 -27
- package/knowledge/decisions/security/mcp-resources-tools-and-prompts-take-sessionless-functions.md +0 -18
- package/knowledge/decisions/security/origin-locked-routes-match-the-origin-exactly.md +0 -22
- package/knowledge/decisions/security/oss-auth-works-without-pikku-studio-cloud.md +0 -26
- package/knowledge/decisions/security/outbound-webhooks-use-an-allowlist-when-configured.md +0 -24
- package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +0 -40
- package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +0 -31
- package/knowledge/decisions/security/pikku-carries-virtual-user-scopes-as-data-and-the-app-grants-them.md +0 -35
- package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +0 -69
- package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +0 -39
- package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +0 -34
- package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +0 -55
- package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +0 -30
- package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +0 -28
- package/knowledge/decisions/security/scoped-content-access-is-a-root-folder-with-longest-prefix-grants.md +0 -31
- package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +0 -34
- package/knowledge/decisions/security/services-without-secrets-get-a-throwing-secrets-accessor.md +0 -22
- package/knowledge/decisions/security/shared-guards-refuse-to-mutate-or-shadow-a-system-role.md +0 -34
- package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +0 -37
- package/knowledge/decisions/security/signed-uploads-are-verified-by-the-same-check-as-signed-reads.md +0 -26
- package/knowledge/decisions/security/system-role-scopes-must-be-declared-with-define-scope.md +0 -24
- package/knowledge/decisions/security/system-roles-are-additive-and-immutable.md +0 -16
- package/knowledge/decisions/security/the-channel-rpc-does-not-send-the-callers-session.md +0 -21
- package/knowledge/decisions/security/the-remote-jobs-inbox-fails-closed-without-a-secret.md +0 -24
- package/knowledge/decisions/security/the-remote-rpc-gate-fails-closed-and-binds-the-token-to-its-function.md +0 -34
- package/knowledge/decisions/security/the-workflow-status-stream-rechecks-ownership-on-every-poll.md +0 -16
- package/knowledge/decisions/security/two-credentials-on-one-key-must-share-a-read-mode.md +0 -29
- package/knowledge/decisions/security/verified-bearer-claims-are-pass-through-data-that-core-never-fills.md +0 -23
- package/knowledge/decisions/security/virtual-user-catalogue-excludes-the-machinery-that-runs-virtual-users.md +0 -25
- package/knowledge/decisions/security/virtual-user-conversation-missing-approval-decisions-default-to-denied.md +0 -22
- package/knowledge/decisions/security/virtual-user-run-records-are-gated-behind-a-read-scope.md +0 -18
- package/knowledge/decisions/security/virtual-user-sign-in-does-not-exist-in-production.md +0 -25
- package/knowledge/decisions/security/virtual-user-sign-in-has-one-door.md +0 -42
- package/knowledge/decisions/security/virtual-user-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +0 -29
- package/knowledge/decisions/security/virtual-user-sign-in-only-works-for-virtual-user-flagged-users.md +0 -29
- package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +0 -25
- package/knowledge/decisions/security/wire-addon-expose-selects-the-rpc-surface.md +0 -51
- package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +0 -40
- package/knowledge/decisions/security/workflow-helper-functions-are-sessionless-by-declaration.md +0 -18
- package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +0 -32
- package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-virtual-user-and-per-scenario.md +0 -32
- package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +0 -31
- package/knowledge/decisions/security/workflow-virtual-user-steps-always-use-the-real-transport.md +0 -34
- package/knowledge/decisions/security/writing-a-virtual-user-schedule-is-gated-by-its-own-scope.md +0 -18
- package/knowledge/index.md +0 -24
- package/knowledge/questions/a-bearer-jwt-with-no-identity-becomes-a-session.md +0 -24
- package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +0 -35
- package/knowledge/questions/dev-quick-login-as-impersonation.md +0 -25
- package/knowledge/questions/does-a-delayed-rpc-run-as-the-session-it-was-scheduled-with.md +0 -26
- package/knowledge/questions/does-a-user-id-with-a-colon-read-another-users-credentials.md +0 -27
- package/knowledge/questions/does-a-wirecli-command-need-a-session-by-default.md +0 -26
- package/knowledge/questions/does-an-adversarial-in-scope-success-count-as-a-finding.md +0 -26
- package/knowledge/questions/does-approve-step-need-the-run-owners-session-or-the-gates-approvers.md +0 -34
- package/knowledge/questions/does-cors-origin-true-reflect-any-origin-with-credentials.md +0 -20
- package/knowledge/questions/does-skip-user-session-do-anything-on-a-channel.md +0 -24
- package/knowledge/questions/does-the-store-session-match-the-other-two.md +0 -19
- package/knowledge/questions/index.md +0 -41
- package/knowledge/questions/is-the-agent-score-worker-reachable-without-a-session.md +0 -21
- package/knowledge/questions/live-scheduled-tests-may-write.md +0 -19
- package/knowledge/questions/provision-virtual-users-has-no-caller-in-this-repo.md +0 -23
- package/knowledge/questions/remote-secret-refuses-requests-without-a-remote-token-on-every-path.md +0 -32
- package/knowledge/questions/should-a-middleware-set-session-persist-to-the-store.md +0 -25
- package/knowledge/questions/should-a-scoped-secret-view-throw-from-has-secret-for-a-disallowed-key.md +0 -23
- package/knowledge/questions/should-a-wrong-bearer-token-be-anonymous-or-refused.md +0 -35
- package/knowledge/questions/should-an-empty-webhook-signing-secret-send-unsigned.md +0 -23
- package/knowledge/questions/should-http-virtual-user-sessions-reset-between-scenarios-in-one-run.md +0 -27
- package/knowledge/questions/should-the-cookie-jar-scope-cookies-to-the-api-origin.md +0 -26
- package/knowledge/questions/should-voice-input-fetch-audio-urls-without-a-host-allowlist.md +0 -20
- package/knowledge/questions/staging-impersonation-rules.md +0 -27
- package/knowledge/questions/unauthorized-channel-replies-escape-the-declared-out-type.md +0 -44
- package/knowledge/questions/virtual-user-keys-on-cloud-stages-are-pikku-studios-to-build.md +0 -33
- package/knowledge/questions/virtual-user-statement-replay-is-per-process.md +0 -20
- package/knowledge/questions/what-an-impersonated-session-carries.md +0 -22
- package/run-tests.sh +0 -68
- package/scripts/generate-api-report.d.mts +0 -1
- package/scripts/generate-api-report.mjs +0 -96
- package/scripts/generate-api-report.mts +0 -333
- package/src/public-surface.json +0 -637
- package/src/public-surface.json.README +0 -43
- /package/dist/{function/compensation-name.d.ts → compensation-name.d.ts} +0 -0
- /package/dist/{function/compensation-name.js → compensation-name.js} +0 -0
package/dist/time-utils.js
CHANGED
|
@@ -6,18 +6,32 @@ const multipliers = {
|
|
|
6
6
|
week: 60 * 60 * 24 * 7,
|
|
7
7
|
year: Math.round(365.25 * 60 * 60 * 24),
|
|
8
8
|
};
|
|
9
|
+
/** Converts a {@link RelativeTimeInput} to milliseconds, rounded to the whole second. */
|
|
9
10
|
export const getRelativeTimeOffset = ({ value, unit, }) => {
|
|
10
11
|
return Math.round(value * multipliers[unit]) * 1000;
|
|
11
12
|
};
|
|
13
|
+
/** The `Date` that is `relativeTime` away from now. */
|
|
12
14
|
export const getRelativeTimeOffsetFromNow = (relativeTime) => {
|
|
13
15
|
return new Date(Date.now() + getRelativeTimeOffset(relativeTime));
|
|
14
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* Normalises a duration to milliseconds: a number is taken as milliseconds already,
|
|
19
|
+
* a string is parsed by {@link parseDurationString}.
|
|
20
|
+
*
|
|
21
|
+
* @throws Error when the string is not a recognised duration.
|
|
22
|
+
*/
|
|
15
23
|
export const getDurationInMilliseconds = (duration) => {
|
|
16
24
|
if (typeof duration === 'number') {
|
|
17
25
|
return duration;
|
|
18
26
|
}
|
|
19
27
|
return parseDurationString(duration);
|
|
20
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* Parses a duration such as `'500ms'`, `'5s'`, `'10min'`, `'1hour'`, `'2days'`,
|
|
31
|
+
* `'1week'` or `'1y'` into milliseconds. Whole numbers only, no spaces.
|
|
32
|
+
*
|
|
33
|
+
* @throws Error when the string does not match the format.
|
|
34
|
+
*/
|
|
21
35
|
export const parseDurationString = (duration) => {
|
|
22
36
|
const match = duration.match(/^(\d+)(ms|milliseconds?|s|sec|seconds?|m|min|minutes?|h|hour|hours?|d|day|days?|w|week|weeks?|y|year|years?)$/);
|
|
23
37
|
if (!match) {
|
|
@@ -45,6 +45,10 @@ import type { ScopeService } from '../services/scope-service.js';
|
|
|
45
45
|
import type { FeatureFlagSource } from '../services/feature-flag-service.js';
|
|
46
46
|
import type { AuditDurability, AuditLog, AuditService } from '../services/audit-service.js';
|
|
47
47
|
import type { AnalyticsLog, AnalyticsIdentityResolver, AnalyticsService } from '../analytics/analytics.types.js';
|
|
48
|
+
/**
|
|
49
|
+
* Every transport a function can be wired to; read off `wire.wireType` to see
|
|
50
|
+
* how the current invocation arrived.
|
|
51
|
+
*/
|
|
48
52
|
export type PikkuWiringTypes = 'http' | 'scheduler' | 'trigger' | 'channel' | 'rpc' | 'queue' | 'mcp' | 'cli' | 'workflow' | 'agent' | 'gateway';
|
|
49
53
|
/**
|
|
50
54
|
* Runtime pool tuning for the Postgres adapter. The connection string stays
|
|
@@ -74,6 +78,10 @@ export interface PostgresConfig {
|
|
|
74
78
|
*/
|
|
75
79
|
prepare?: boolean;
|
|
76
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* The config every Pikku app's `Config` extends. `createConfig` returns it and
|
|
83
|
+
* it is handed to `createSingletonServices`.
|
|
84
|
+
*/
|
|
77
85
|
export type CoreConfig<Config extends Record<string, unknown> = {}> = {
|
|
78
86
|
logLevel?: LogLevel;
|
|
79
87
|
secrets?: {
|
|
@@ -84,6 +92,11 @@ export type CoreConfig<Config extends Record<string, unknown> = {}> = {
|
|
|
84
92
|
webhook?: WebhookServiceConfig;
|
|
85
93
|
postgres?: PostgresConfig;
|
|
86
94
|
} & Config;
|
|
95
|
+
/**
|
|
96
|
+
* The fields Pikku itself reads from a session. Extend it with your own
|
|
97
|
+
* `UserSession`; the runner only enforces `readonly` and `scopes`, the rest is
|
|
98
|
+
* carried for you.
|
|
99
|
+
*/
|
|
87
100
|
export interface CoreUserSession {
|
|
88
101
|
/** Who the session belongs to, as your own system identifies them. Pikku only carries it. */
|
|
89
102
|
userId?: string;
|
|
@@ -111,6 +124,12 @@ export interface AuthInstance {
|
|
|
111
124
|
api: Record<string, any>;
|
|
112
125
|
$context?: Promise<any>;
|
|
113
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* The services created once at startup and shared by every invocation. Your
|
|
129
|
+
* `SingletonServices` extends it; only `config`, `logger`, `variables` and
|
|
130
|
+
* `secrets` are required, every other service is opt-in and the features that
|
|
131
|
+
* need it fail with `MissingServiceError` or stay inert without it.
|
|
132
|
+
*/
|
|
114
133
|
export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
|
|
115
134
|
schema?: SchemaService;
|
|
116
135
|
jwt?: JWTService;
|
|
@@ -214,6 +233,13 @@ export type GetCredential<TCredentials = Record<string, unknown>> = string exten
|
|
|
214
233
|
<K extends keyof TCredentials & string>(name: K): TCredentials[K] | null | Promise<TCredentials[K] | null>;
|
|
215
234
|
<T = unknown>(name: string): T | null | Promise<T | null>;
|
|
216
235
|
};
|
|
236
|
+
/**
|
|
237
|
+
* The second argument of every Pikku function: what this invocation knows
|
|
238
|
+
* about how it was called. `rpc` and the credential readers are always
|
|
239
|
+
* present; each transport fills in its own key (`http`, `channel`, `queue`,
|
|
240
|
+
* `workflow`, …) and leaves the rest undefined, and `session` is typed as
|
|
241
|
+
* present only for functions that require one.
|
|
242
|
+
*/
|
|
217
243
|
export type PikkuWire<In = unknown, Out = unknown, HasInitialSession extends boolean = false, UserSession extends CoreUserSession = CoreUserSession, TypedRPC extends PikkuRPC = PikkuRPC, IsChannel extends true | null = null, MCPTools extends string | never = never, TypedWorkflow extends PikkuWorkflowWire | never = PikkuWorkflowWire, TriggerOutput = unknown, TypedScenario extends PikkuScenarioWire<any> | never = PikkuScenarioWire<any>, TScenarioVirtualUsers extends ScenarioVirtualUsers = ScenarioVirtualUsers, TypedCredentials = Record<string, unknown>> = {
|
|
218
244
|
/** Always present — lazily initialised on first access for every function invocation */
|
|
219
245
|
rpc: TypedRPC;
|
|
@@ -261,7 +287,20 @@ export type PikkuWire<In = unknown, Out = unknown, HasInitialSession extends boo
|
|
|
261
287
|
trigger: PikkuTrigger<TriggerOutput>;
|
|
262
288
|
gateway: PikkuGateway;
|
|
263
289
|
session: HasInitialSession extends true ? UserSession : UserSession | undefined;
|
|
290
|
+
/**
|
|
291
|
+
* Sign the caller in as `session`: marks the session changed, so `authCookie`
|
|
292
|
+
* re-issues the cookie, and writes the session store under the session's
|
|
293
|
+
* `userId`. Means the same in middleware and in a function body. Await it.
|
|
294
|
+
*/
|
|
264
295
|
setSession: (session: UserSession) => Promise<void> | void;
|
|
296
|
+
/**
|
|
297
|
+
* Establish who the caller is for this invocation only — what auth
|
|
298
|
+
* middleware does with a credential it was handed. Does not mark the session
|
|
299
|
+
* changed and writes nothing, so no cookie is re-issued. The function body
|
|
300
|
+
* sees it as `session`; set it before the body starts.
|
|
301
|
+
*/
|
|
302
|
+
setInitialSession: (session: UserSession) => void;
|
|
303
|
+
/** Sign the caller out: marks the session changed and clears the session store entry. */
|
|
265
304
|
clearSession: () => Promise<void> | void;
|
|
266
305
|
/** Fetch the latest session (may read from backing store) */
|
|
267
306
|
getSession: () => Promise<UserSession> | UserSession | undefined;
|
|
@@ -297,21 +336,51 @@ export type PikkuRawWire = Omit<PikkuWire, 'rpc' | 'getCredential' | 'getCredent
|
|
|
297
336
|
*/
|
|
298
337
|
abortScope?: AbortScope;
|
|
299
338
|
};
|
|
339
|
+
/**
|
|
340
|
+
* The services a function receives. Today the same as the singleton services;
|
|
341
|
+
* kept as its own name so function signatures do not depend on that.
|
|
342
|
+
*/
|
|
300
343
|
export type CoreServices<SingletonServices = CoreSingletonServices> = SingletonServices;
|
|
301
344
|
/** Strips `secrets` from a services type. */
|
|
302
345
|
export type SecretlessServices<Services> = Omit<Services, 'secrets'>;
|
|
303
346
|
/** The constraint every function-, permission- and auth-facing type is bounded by. */
|
|
304
347
|
export type CoreSecretlessSingletonServices<Config extends CoreConfig = CoreConfig> = SecretlessServices<CoreSingletonServices<Config>>;
|
|
348
|
+
/**
|
|
349
|
+
* The per-invocation services: whatever `Services` adds on top of the singleton
|
|
350
|
+
* services, minus the session.
|
|
351
|
+
*/
|
|
305
352
|
export type WireServices<SingletonServices extends CoreSingletonServices = CoreSingletonServices, Services = CoreServices<SingletonServices>> = Omit<Services, keyof SingletonServices | 'session'>;
|
|
353
|
+
/**
|
|
354
|
+
* Your `createSingletonServices` factory: builds the shared services once from
|
|
355
|
+
* the config. `existingServices` carries services a host has already created,
|
|
356
|
+
* which the factory should reuse rather than recreate.
|
|
357
|
+
*/
|
|
306
358
|
export type CreateSingletonServices<Config extends CoreConfig, SingletonServices extends CoreSingletonServices> = (config: Config, existingServices?: Partial<SingletonServices>) => Promise<SingletonServices>;
|
|
359
|
+
/**
|
|
360
|
+
* Your `createWireServices` factory: builds the services scoped to one
|
|
361
|
+
* invocation. A returned service with a `close()` is closed by the runner when
|
|
362
|
+
* the invocation ends.
|
|
363
|
+
*/
|
|
307
364
|
export type CreateWireServices<SingletonServices extends CoreSingletonServices = CoreSingletonServices, Services extends CoreServices<SingletonServices> = CoreServices<SingletonServices>, UserSession extends CoreUserSession = CoreUserSession> = (services: SingletonServices, wire: PikkuRawWire) => Promise<WireServices<Services, SingletonServices>>;
|
|
365
|
+
/**
|
|
366
|
+
* Your `createConfig` factory: builds the app config, typically reading from
|
|
367
|
+
* the `VariablesService`.
|
|
368
|
+
*/
|
|
308
369
|
export type CreateConfig<Config extends CoreConfig, RemainingArgs extends any[] = unknown[]> = (variables?: VariablesService, ...args: RemainingArgs) => Promise<Config>;
|
|
370
|
+
/**
|
|
371
|
+
* Hooks a server runtime calls around starting and stopping, with the
|
|
372
|
+
* singleton services.
|
|
373
|
+
*/
|
|
309
374
|
export type ServerLifecycle<SingletonServices extends CoreSingletonServices = CoreSingletonServices> = {
|
|
310
375
|
beforeStart?: (services: SingletonServices) => void | Promise<void>;
|
|
311
376
|
afterStart?: (services: SingletonServices) => void | Promise<void>;
|
|
312
377
|
beforeStop?: (services: SingletonServices) => void | Promise<void>;
|
|
313
378
|
afterStop?: (services: SingletonServices) => void | Promise<void>;
|
|
314
379
|
};
|
|
380
|
+
/**
|
|
381
|
+
* The metadata fields shared by every wiring's generated meta entry.
|
|
382
|
+
* @internal
|
|
383
|
+
*/
|
|
315
384
|
export type CommonWireMeta = {
|
|
316
385
|
pikkuFuncId: string;
|
|
317
386
|
packageName?: string;
|
|
@@ -333,9 +402,14 @@ export type CommonWireMeta = {
|
|
|
333
402
|
* addon (reader) and the console UI (renderer).
|
|
334
403
|
*/
|
|
335
404
|
export type SecuritySeverity = 'critical' | 'high' | 'moderate' | 'low' | 'info';
|
|
405
|
+
/** How far behind the latest release an outdated dependency is. */
|
|
336
406
|
export type SecurityUpdateLevel = 'major' | 'minor' | 'patch' | 'unknown';
|
|
337
407
|
/** `dev` = only reachable through devDependencies or build tooling, so never shipped. */
|
|
338
408
|
export type SecurityDependencyType = 'prod' | 'dev';
|
|
409
|
+
/**
|
|
410
|
+
* One advisory affecting an installed package, as written to
|
|
411
|
+
* `.pikku/audit.json`.
|
|
412
|
+
*/
|
|
339
413
|
export interface SecurityAuditIssue {
|
|
340
414
|
package: string;
|
|
341
415
|
severity: SecuritySeverity;
|
|
@@ -348,6 +422,7 @@ export interface SecurityAuditIssue {
|
|
|
348
422
|
recommendedVersion: string | null;
|
|
349
423
|
dependencyType?: SecurityDependencyType;
|
|
350
424
|
}
|
|
425
|
+
/** One dependency with a newer release available. */
|
|
351
426
|
export interface SecurityAuditUpdate {
|
|
352
427
|
package: string;
|
|
353
428
|
current: string;
|
|
@@ -355,6 +430,7 @@ export interface SecurityAuditUpdate {
|
|
|
355
430
|
level: SecurityUpdateLevel;
|
|
356
431
|
dependencyType?: SecurityDependencyType;
|
|
357
432
|
}
|
|
433
|
+
/** Counts of the issues by severity and the updates by level. */
|
|
358
434
|
export interface SecurityAuditSummary {
|
|
359
435
|
totalIssues: number;
|
|
360
436
|
critical: number;
|
|
@@ -366,6 +442,10 @@ export interface SecurityAuditSummary {
|
|
|
366
442
|
minor: number;
|
|
367
443
|
patch: number;
|
|
368
444
|
}
|
|
445
|
+
/**
|
|
446
|
+
* The whole of `.pikku/audit.json`, written by `pikku audit` and read by the
|
|
447
|
+
* console.
|
|
448
|
+
*/
|
|
369
449
|
export interface SecurityAuditReport {
|
|
370
450
|
schemaVersion: number;
|
|
371
451
|
tool: string;
|
|
@@ -19,6 +19,10 @@ import type { CreateConfig, CreateSingletonServices, CreateWireServices, CoreCon
|
|
|
19
19
|
import type { FunctionsMeta } from '../function/function-meta.types.js';
|
|
20
20
|
import type { CorePikkuMiddleware, CorePikkuMiddlewareGroup } from '../middleware/middleware.types.js';
|
|
21
21
|
import type { CorePikkuChannelMiddleware } from '../wirings/channel/channel.types.js';
|
|
22
|
+
/**
|
|
23
|
+
* The shape of one package's registry, as read and written by `pikkuState`.
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
22
26
|
export interface PikkuPackageState {
|
|
23
27
|
function: {
|
|
24
28
|
meta: FunctionsMeta;
|
package/dist/utils/hmac.d.ts
CHANGED
|
@@ -9,8 +9,11 @@
|
|
|
9
9
|
* (the lengths of the two values are not secret).
|
|
10
10
|
*/
|
|
11
11
|
export declare function timingSafeStringEqual(a: string, b: string): boolean;
|
|
12
|
+
/** The bytes an HMAC is computed over: a string is UTF-8 encoded, so pass the raw request body, not re-serialised JSON. */
|
|
12
13
|
export type WebhookPayload = string | Uint8Array;
|
|
14
|
+
/** The hash an HMAC helper signs with. `sha1` exists only for providers that still sign with it. */
|
|
13
15
|
export type HmacAlgorithm = 'sha1' | 'sha256' | 'sha512';
|
|
16
|
+
/** How the signing secret string is turned into key bytes: as UTF-8 text, or decoded from hex or base64. */
|
|
14
17
|
export type SecretEncoding = 'utf8' | 'hex' | 'base64';
|
|
15
18
|
/**
|
|
16
19
|
* HMAC-SHA256 of a payload, hex-encoded. Senders wrap this in their own scheme
|
|
@@ -16,6 +16,7 @@ export type HostResolver = (hostname: string) => Promise<string[]>;
|
|
|
16
16
|
* `nodeHostResolver` from `@pikku/core/node-host-resolver` at startup.
|
|
17
17
|
*/
|
|
18
18
|
export declare function setDefaultHostResolver(resolver: HostResolver | undefined): void;
|
|
19
|
+
/** Restrictions {@link safeFetch} and {@link assertFetchableUrl} apply to each URL they visit. */
|
|
19
20
|
export interface SafeFetchOptions {
|
|
20
21
|
/**
|
|
21
22
|
* When set, the host of every hop must appear in this allowlist. When omitted,
|
|
@@ -31,6 +32,19 @@ export interface SafeFetchOptions {
|
|
|
31
32
|
*/
|
|
32
33
|
resolveHost?: HostResolver | null;
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Synchronous SSRF guard for a single URL: only `http:`/`https:` is accepted, and
|
|
37
|
+
* the host must be in `allowedHosts` when given, or else must not be a private,
|
|
38
|
+
* loopback or link-local literal ({@link isPrivateHost}).
|
|
39
|
+
*
|
|
40
|
+
* It does not resolve DNS, so a public name pointing at an internal address
|
|
41
|
+
* passes; {@link safeFetch} adds that check per hop.
|
|
42
|
+
*
|
|
43
|
+
* @param url - The URL to check.
|
|
44
|
+
* @param options - Only `allowedHosts` is read here.
|
|
45
|
+
* @returns The parsed URL.
|
|
46
|
+
* @throws TypeError for an unparseable URL; Error for a refused scheme or host.
|
|
47
|
+
*/
|
|
34
48
|
export declare function assertFetchableUrl(url: string, options?: SafeFetchOptions): URL;
|
|
35
49
|
/**
|
|
36
50
|
* `fetch` with SSRF protection on the initial URL and every redirect hop.
|
package/dist/utils/safe-fetch.js
CHANGED
|
@@ -212,6 +212,19 @@ async function assertResolvedHostAllowed(hostname, options) {
|
|
|
212
212
|
}
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Synchronous SSRF guard for a single URL: only `http:`/`https:` is accepted, and
|
|
217
|
+
* the host must be in `allowedHosts` when given, or else must not be a private,
|
|
218
|
+
* loopback or link-local literal ({@link isPrivateHost}).
|
|
219
|
+
*
|
|
220
|
+
* It does not resolve DNS, so a public name pointing at an internal address
|
|
221
|
+
* passes; {@link safeFetch} adds that check per hop.
|
|
222
|
+
*
|
|
223
|
+
* @param url - The URL to check.
|
|
224
|
+
* @param options - Only `allowedHosts` is read here.
|
|
225
|
+
* @returns The parsed URL.
|
|
226
|
+
* @throws TypeError for an unparseable URL; Error for a refused scheme or host.
|
|
227
|
+
*/
|
|
215
228
|
export function assertFetchableUrl(url, options = {}) {
|
|
216
229
|
const parsed = new URL(url);
|
|
217
230
|
if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `JSON.stringify` with object keys sorted, so property order cannot change
|
|
3
|
+
* the output. Follows `JSON.stringify` for everything else: `toJSON` is
|
|
4
|
+
* honoured, object properties whose value JSON cannot represent (`undefined`,
|
|
5
|
+
* functions, symbols) are omitted, the same values become `null` inside
|
|
6
|
+
* arrays, and such a value at the top level returns `undefined`.
|
|
7
|
+
*
|
|
8
|
+
* Keys are emitted in plain string order, including integer-like keys that a
|
|
9
|
+
* JavaScript object would otherwise move to the front.
|
|
10
|
+
*/
|
|
11
|
+
export declare const stableStringify: (value: unknown) => string | undefined;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `JSON.stringify` with object keys sorted, so property order cannot change
|
|
3
|
+
* the output. Follows `JSON.stringify` for everything else: `toJSON` is
|
|
4
|
+
* honoured, object properties whose value JSON cannot represent (`undefined`,
|
|
5
|
+
* functions, symbols) are omitted, the same values become `null` inside
|
|
6
|
+
* arrays, and such a value at the top level returns `undefined`.
|
|
7
|
+
*
|
|
8
|
+
* Keys are emitted in plain string order, including integer-like keys that a
|
|
9
|
+
* JavaScript object would otherwise move to the front.
|
|
10
|
+
*/
|
|
11
|
+
export const stableStringify = (value) => serialize(value, '');
|
|
12
|
+
const serialize = (value, key) => {
|
|
13
|
+
if (value !== null &&
|
|
14
|
+
typeof value === 'object' &&
|
|
15
|
+
typeof value.toJSON === 'function') {
|
|
16
|
+
value = value.toJSON(key);
|
|
17
|
+
}
|
|
18
|
+
if (value === null || typeof value !== 'object') {
|
|
19
|
+
return JSON.stringify(value);
|
|
20
|
+
}
|
|
21
|
+
if (Array.isArray(value)) {
|
|
22
|
+
return `[${value.map((item, i) => serialize(item, String(i)) ?? 'null').join(',')}]`;
|
|
23
|
+
}
|
|
24
|
+
const record = value;
|
|
25
|
+
const entries = [];
|
|
26
|
+
for (const k of Object.keys(record).sort()) {
|
|
27
|
+
const serialized = serialize(record[k], k);
|
|
28
|
+
if (serialized !== undefined) {
|
|
29
|
+
entries.push(`${JSON.stringify(k)}:${serialized}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return `{${entries.join(',')}}`;
|
|
33
|
+
};
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,8 +1,25 @@
|
|
|
1
1
|
import type { Logger } from './services/logger.js';
|
|
2
2
|
import type { WireServices } from './types/core.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Calls `close()` on every wire service that has one, in parallel, at the end of a
|
|
5
|
+
* wiring. A failing `close` is logged and does not stop the others.
|
|
6
|
+
*/
|
|
3
7
|
export declare const closeWireServices: (logger: Logger, wireServices: WireServices) => Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* A process-unique id (random 8-character prefix plus a counter). Not
|
|
10
|
+
* unpredictable, so never use it as a token or secret.
|
|
11
|
+
*/
|
|
4
12
|
export declare const createWeakUID: () => string;
|
|
13
|
+
/**
|
|
14
|
+
* Whether a response body needs `JSON.stringify`: false for strings and binary
|
|
15
|
+
* (`ArrayBuffer` and typed arrays), which are sent as they are.
|
|
16
|
+
*/
|
|
5
17
|
export declare const isSerializable: (data: any) => boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Looks up the groups for a hierarchical tag and each of its `:`-separated
|
|
20
|
+
* ancestors, most specific first: `'admin:users'` yields the groups for
|
|
21
|
+
* `'admin:users'` then `'admin'`.
|
|
22
|
+
*/
|
|
6
23
|
export declare const getTagGroups: <T>(tagGroups: Record<string, T>, tag: string) => T[];
|
|
7
24
|
/**
|
|
8
25
|
* `JSON.parse` of text or UTF-8 bytes, refusing anything that is not JSON with
|
|
@@ -11,15 +28,26 @@ export declare const getTagGroups: <T>(tagGroups: Record<string, T>, tag: string
|
|
|
11
28
|
* @example snippet: pikkuWebhookReceive
|
|
12
29
|
*/
|
|
13
30
|
export declare const parseJson: <T = any>(input: string | Uint8Array) => T;
|
|
31
|
+
/**
|
|
32
|
+
* Returns a frozen copy of the array with duplicates removed, keeping first-seen
|
|
33
|
+
* order. Used for middleware and permission lists, so the same function is never
|
|
34
|
+
* run twice.
|
|
35
|
+
*/
|
|
14
36
|
export declare const freezeDedupe: <T>(arr?: readonly T[] | T[] | undefined) => readonly T[];
|
|
15
37
|
export { stopSingletonServices, pikkuServerLifecycle } from './lifecycle.js';
|
|
38
|
+
/** `T` with the keys `K` made required. */
|
|
16
39
|
export type MakeRequired<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
|
|
40
|
+
/** A JSON scalar; `undefined` is included because it is dropped on serialisation rather than rejected. */
|
|
17
41
|
export type JSONPrimitive = string | number | boolean | null | undefined;
|
|
42
|
+
/** Any value that round-trips through JSON. */
|
|
18
43
|
export type JSONValue = JSONPrimitive | JSONValue[] | {
|
|
19
44
|
[key: string]: JSONValue;
|
|
20
45
|
};
|
|
46
|
+
/** `T` with the keys `K` made required and every other key unchanged. */
|
|
21
47
|
export type PickRequired<T, K extends keyof T> = T & Required<Pick<T, K>>;
|
|
48
|
+
/** `T` with every key optional except `K`. */
|
|
22
49
|
export type PickOptional<T, K extends keyof T> = Partial<T> & Pick<T, K>;
|
|
50
|
+
/** `T` with every key optional, but at least one of them present. */
|
|
23
51
|
export type RequireAtLeastOne<T> = {
|
|
24
52
|
[K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>;
|
|
25
53
|
}[keyof T];
|
package/dist/utils.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { BadRequestError } from './errors/errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calls `close()` on every wire service that has one, in parallel, at the end of a
|
|
4
|
+
* wiring. A failing `close` is logged and does not stop the others.
|
|
5
|
+
*/
|
|
2
6
|
export const closeWireServices = async (logger, wireServices) => {
|
|
3
7
|
await Promise.all(Object.values(wireServices).map(async (service) => {
|
|
4
8
|
if (service?.close) {
|
|
@@ -13,10 +17,18 @@ export const closeWireServices = async (logger, wireServices) => {
|
|
|
13
17
|
};
|
|
14
18
|
let _uidPrefix;
|
|
15
19
|
let _uidCounter = 0;
|
|
20
|
+
/**
|
|
21
|
+
* A process-unique id (random 8-character prefix plus a counter). Not
|
|
22
|
+
* unpredictable, so never use it as a token or secret.
|
|
23
|
+
*/
|
|
16
24
|
export const createWeakUID = () => {
|
|
17
25
|
_uidPrefix ??= globalThis.crypto.randomUUID().slice(0, 8);
|
|
18
26
|
return `${_uidPrefix}-${++_uidCounter}`;
|
|
19
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* Whether a response body needs `JSON.stringify`: false for strings and binary
|
|
30
|
+
* (`ArrayBuffer` and typed arrays), which are sent as they are.
|
|
31
|
+
*/
|
|
20
32
|
export const isSerializable = (data) => {
|
|
21
33
|
return !(typeof data === 'string' ||
|
|
22
34
|
data instanceof ArrayBuffer ||
|
|
@@ -29,6 +41,11 @@ export const isSerializable = (data) => {
|
|
|
29
41
|
data instanceof Float32Array ||
|
|
30
42
|
data instanceof Float64Array);
|
|
31
43
|
};
|
|
44
|
+
/**
|
|
45
|
+
* Looks up the groups for a hierarchical tag and each of its `:`-separated
|
|
46
|
+
* ancestors, most specific first: `'admin:users'` yields the groups for
|
|
47
|
+
* `'admin:users'` then `'admin'`.
|
|
48
|
+
*/
|
|
32
49
|
export const getTagGroups = (tagGroups, tag) => {
|
|
33
50
|
const results = [];
|
|
34
51
|
const exact = tagGroups[tag];
|
|
@@ -60,6 +77,11 @@ export const parseJson = (input) => {
|
|
|
60
77
|
}
|
|
61
78
|
};
|
|
62
79
|
const EMPTY_ARRAY = Object.freeze([]);
|
|
80
|
+
/**
|
|
81
|
+
* Returns a frozen copy of the array with duplicates removed, keeping first-seen
|
|
82
|
+
* order. Used for middleware and permission lists, so the same function is never
|
|
83
|
+
* run twice.
|
|
84
|
+
*/
|
|
63
85
|
export const freezeDedupe = (arr) => {
|
|
64
86
|
if (!arr || arr.length === 0)
|
|
65
87
|
return EMPTY_ARRAY;
|
package/dist/version.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
/** The id of one version of a function: `name@v2`. */
|
|
1
2
|
export declare function formatVersionedId(baseName: string, version: number): string;
|
|
3
|
+
/**
|
|
4
|
+
* Splits `name@vN` into its base name and version. An id with no `@v` suffix,
|
|
5
|
+
* or whose suffix is not a positive integer, is returned whole with `version:
|
|
6
|
+
* null`.
|
|
7
|
+
*/
|
|
2
8
|
export declare function parseVersionedId(id: string): {
|
|
3
9
|
baseName: string;
|
|
4
10
|
version: number | null;
|
|
5
11
|
};
|
|
12
|
+
/** Whether `id` carries a valid `@vN` version suffix. */
|
|
6
13
|
export declare function isVersionedId(id: string): boolean;
|
package/dist/version.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
const VERSION_SEPARATOR = '@v';
|
|
2
|
+
/** The id of one version of a function: `name@v2`. */
|
|
2
3
|
export function formatVersionedId(baseName, version) {
|
|
3
4
|
return `${baseName}${VERSION_SEPARATOR}${version}`;
|
|
4
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* Splits `name@vN` into its base name and version. An id with no `@v` suffix,
|
|
8
|
+
* or whose suffix is not a positive integer, is returned whole with `version:
|
|
9
|
+
* null`.
|
|
10
|
+
*/
|
|
5
11
|
export function parseVersionedId(id) {
|
|
6
12
|
const idx = id.lastIndexOf(VERSION_SEPARATOR);
|
|
7
13
|
if (idx === -1) {
|
|
@@ -14,6 +20,7 @@ export function parseVersionedId(id) {
|
|
|
14
20
|
}
|
|
15
21
|
return { baseName: id.slice(0, idx), version };
|
|
16
22
|
}
|
|
23
|
+
/** Whether `id` carries a valid `@vN` version suffix. */
|
|
17
24
|
export function isVersionedId(id) {
|
|
18
25
|
return parseVersionedId(id).version !== null;
|
|
19
26
|
}
|
|
@@ -18,7 +18,9 @@ export type AddonAppScreen = AddonScreenBase & {
|
|
|
18
18
|
/** Directory of the built program, relative to the addon package. */
|
|
19
19
|
app: string;
|
|
20
20
|
};
|
|
21
|
+
/** One screen an addon ships: either a component the host renders or a static app it serves in a sandboxed iframe. */
|
|
21
22
|
export type AddonScreen = AddonComponentScreen | AddonAppScreen;
|
|
23
|
+
/** The manifest passed to `defineScreens`: the addon's title, optional icon and its screens. */
|
|
22
24
|
export type ScreensManifest = {
|
|
23
25
|
title: string;
|
|
24
26
|
icon?: string;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { CoreServices, PikkuRawWire } from '../../types/core.types.js';
|
|
2
2
|
import { PikkuError } from '../../errors/error-handler.js';
|
|
3
3
|
import { type SecretValue } from '../../classification/secret-value.js';
|
|
4
|
+
/**
|
|
5
|
+
* Where the bearer token for a remote addon call comes from: a per-user credential, a deployment
|
|
6
|
+
* secret, or a resolver function. `credentialId` needs a wire with credential access.
|
|
7
|
+
*/
|
|
4
8
|
export type RemoteAddonAuthBinding = {
|
|
5
9
|
credentialId: string;
|
|
6
10
|
} | {
|
|
@@ -8,6 +12,11 @@ export type RemoteAddonAuthBinding = {
|
|
|
8
12
|
} | {
|
|
9
13
|
resolve: (services: CoreServices, wire: PikkuRawWire) => string | SecretValue<string> | Promise<string | SecretValue<string>>;
|
|
10
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* Thrown (401) when a remote addon's token cannot be resolved: the binding needs credential
|
|
17
|
+
* access the wire lacks, or it resolved to an empty value. The call is refused rather than sent
|
|
18
|
+
* unauthenticated.
|
|
19
|
+
*/
|
|
11
20
|
export declare class RemoteAddonAuthError extends PikkuError {
|
|
12
21
|
readonly namespace: string;
|
|
13
22
|
constructor(namespace: string, detail: string);
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { PikkuError, addError } from '../../errors/error-handler.js';
|
|
2
2
|
import { isSecretValue, } from '../../classification/secret-value.js';
|
|
3
|
+
/**
|
|
4
|
+
* Thrown (401) when a remote addon's token cannot be resolved: the binding needs credential
|
|
5
|
+
* access the wire lacks, or it resolved to an empty value. The call is refused rather than sent
|
|
6
|
+
* unauthenticated.
|
|
7
|
+
*/
|
|
3
8
|
export class RemoteAddonAuthError extends PikkuError {
|
|
4
9
|
namespace;
|
|
5
10
|
constructor(namespace, detail) {
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { CredentialOverrides } from '../credential/credential-overrides.js';
|
|
2
2
|
import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js';
|
|
3
3
|
import type { AddonInstance } from './addon-runner.js';
|
|
4
|
+
/**
|
|
5
|
+
* Options for `wireAddon`: the instance name, its package, and what the consuming app grants it
|
|
6
|
+
* (auth, scopes, exposed functions, secret/credential/content access and overrides).
|
|
7
|
+
*/
|
|
4
8
|
export type WireAddonConfig = {
|
|
5
9
|
/** How this instance is addressed. One package may be wired more than once, and the name is what tells the instances apart. */
|
|
6
10
|
name: string;
|
|
@@ -7,6 +7,7 @@ export type RemoteAddonAuth = {
|
|
|
7
7
|
} | {
|
|
8
8
|
resolve: (services: CoreServices, wire: PikkuWire) => string | Promise<string>;
|
|
9
9
|
};
|
|
10
|
+
/** Options for `wireRemoteAddon`: the namespace, the contract package, where the addon is deployed and how calls authenticate. */
|
|
10
11
|
export type WireRemoteAddonConfig = {
|
|
11
12
|
/** Consumer-facing namespace, e.g. `registry` → `rpc('registry:getOpenApi')` */
|
|
12
13
|
name: string;
|
|
@@ -49,12 +49,12 @@ type AGUIEvent = {
|
|
|
49
49
|
type: 'RUN_FINISHED';
|
|
50
50
|
threadId: string;
|
|
51
51
|
runId: string;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
usage?: Array<{
|
|
53
|
+
model?: string;
|
|
54
|
+
inputTokens: number;
|
|
55
|
+
outputTokens: number;
|
|
56
56
|
totalTokens: number;
|
|
57
|
-
}
|
|
57
|
+
}>;
|
|
58
58
|
} | {
|
|
59
59
|
type: 'RUN_ERROR';
|
|
60
60
|
message: string;
|
|
@@ -76,4 +76,13 @@ export type AGUIChannelOptions = {
|
|
|
76
76
|
runId?: string;
|
|
77
77
|
getRunId?: () => string | undefined;
|
|
78
78
|
};
|
|
79
|
+
/**
|
|
80
|
+
* Wraps an agent stream channel so the events written to it go out as AG-UI protocol events
|
|
81
|
+
* (`RUN_STARTED`, `TEXT_MESSAGE_CONTENT`, `TOOL_CALL_START`, ...) instead of Pikku's own
|
|
82
|
+
* `AgentStreamEvent`s. `rpc.agent.stream` and `rpc.agent.resume` apply it for you.
|
|
83
|
+
*
|
|
84
|
+
* @param inner - The channel the AG-UI events are sent on.
|
|
85
|
+
* @param options - Thread and run ids to stamp on the events; generated when absent.
|
|
86
|
+
* @returns A channel that accepts `AgentStreamEvent`s.
|
|
87
|
+
*/
|
|
79
88
|
export declare function wrapChannelWithAGUI(inner: AgentStreamChannel, options?: AGUIChannelOptions): AgentStreamChannel;
|
|
@@ -9,6 +9,15 @@ function resultToString(result) {
|
|
|
9
9
|
return String(result);
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Wraps an agent stream channel so the events written to it go out as AG-UI protocol events
|
|
14
|
+
* (`RUN_STARTED`, `TEXT_MESSAGE_CONTENT`, `TOOL_CALL_START`, ...) instead of Pikku's own
|
|
15
|
+
* `AgentStreamEvent`s. `rpc.agent.stream` and `rpc.agent.resume` apply it for you.
|
|
16
|
+
*
|
|
17
|
+
* @param inner - The channel the AG-UI events are sent on.
|
|
18
|
+
* @param options - Thread and run ids to stamp on the events; generated when absent.
|
|
19
|
+
* @returns A channel that accepts `AgentStreamEvent`s.
|
|
20
|
+
*/
|
|
12
21
|
export function wrapChannelWithAGUI(inner, options) {
|
|
13
22
|
const threadId = options?.threadId ?? randomUUID();
|
|
14
23
|
let runId = options?.runId ?? null;
|
|
@@ -86,14 +95,16 @@ export function wrapChannelWithAGUI(inner, options) {
|
|
|
86
95
|
type: 'RUN_FINISHED',
|
|
87
96
|
threadId,
|
|
88
97
|
runId: resolveRunId(),
|
|
89
|
-
...(usageModel ? { model: usageModel } : {}),
|
|
90
98
|
...(sawUsage
|
|
91
99
|
? {
|
|
92
|
-
usage:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
100
|
+
usage: [
|
|
101
|
+
{
|
|
102
|
+
...(usageModel ? { model: usageModel } : {}),
|
|
103
|
+
inputTokens: usageTotals.input,
|
|
104
|
+
outputTokens: usageTotals.output,
|
|
105
|
+
totalTokens: usageTotals.input + usageTotals.output,
|
|
106
|
+
},
|
|
107
|
+
],
|
|
97
108
|
}
|
|
98
109
|
: {}),
|
|
99
110
|
});
|