aimeat 3.1.0 → 3.3.0
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/.env.example +58 -1
- package/dist/build-stamp.json +4 -4
- package/dist/locales/en.json +9225 -9103
- package/dist/locales/es.json +9217 -9095
- package/dist/locales/fi.json +9225 -9103
- package/dist/public/changelog.json +12 -0
- package/dist/public/css/views/admin.css +11 -0
- package/dist/public/css/views/chat.css +388 -0
- package/dist/public/css/views/profile.css +41 -0
- package/dist/public/js/services/admin.js +346 -331
- package/dist/public/js/services/chat.js +190 -0
- package/dist/public/js/services/organism-roles.js +51 -0
- package/dist/public/js/services/organisms.js +5 -25
- package/dist/public/js/services/speech-reader.js +26 -0
- package/dist/public/lib/VENDORED.md +1 -0
- package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-browser-eh.worker.js +14 -0
- package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-browser.js +23 -0
- package/dist/public/lib/duckdb-wasm@1.32.0/duckdb-eh.wasm +0 -0
- package/dist/public/lib/duckdb-wasm@1.32.0/extensions/v1.4.3/wasm_eh/parquet.duckdb_extension.wasm +0 -0
- package/dist/public/lib/vendored-assets.json +19 -0
- package/dist/public/llms-full-template.txt +2706 -0
- package/dist/public/llms-index-template.txt +60 -0
- package/dist/public/robots.node.txt +64 -23
- package/dist/public/spa.html +9 -1
- package/dist/public/views/admin/organism-ownership-tab.js +124 -0
- package/dist/public/views/admin/owners-tab.js +15 -4
- package/dist/public/views/admin/usage-tab.calls.js +120 -0
- package/dist/public/views/admin/usage-tab.js +18 -4
- package/dist/public/views/admin.js +2 -0
- package/dist/public/views/chat/parts.js +257 -0
- package/dist/public/views/chat.js +327 -0
- package/dist/public/views/landing.js +24 -1
- package/dist/public/views/profile/agents/scope-model.js +320 -296
- package/dist/public/views/profile/landing-page.cards.js +1 -0
- package/dist/public/views/profile/organisms/home.js +3 -1
- package/dist/public/views/profile/organisms/members.js +29 -4
- package/dist/public/views/profile/usage-tab.js +204 -0
- package/dist/public/views/profile.js +2 -0
- package/dist/scripts/audit-mcp-schemas.js +41 -0
- package/dist/scripts/audit-mcp-schemas.js.map +1 -1
- package/dist/scripts/build-sdk-libs.d.ts.map +1 -1
- package/dist/scripts/build-sdk-libs.js +1 -0
- package/dist/scripts/build-sdk-libs.js.map +1 -1
- package/dist/scripts/check-ai-disclosure.js +11 -0
- package/dist/scripts/check-ai-disclosure.js.map +1 -1
- package/dist/scripts/check-commit-msg.d.ts +8 -0
- package/dist/scripts/check-commit-msg.d.ts.map +1 -0
- package/dist/scripts/check-commit-msg.js +118 -0
- package/dist/scripts/check-commit-msg.js.map +1 -0
- package/dist/scripts/check-denial-coverage.d.ts +29 -0
- package/dist/scripts/check-denial-coverage.d.ts.map +1 -0
- package/dist/scripts/check-denial-coverage.js +237 -0
- package/dist/scripts/check-denial-coverage.js.map +1 -0
- package/dist/scripts/check-ext-entrypoints.js +14 -2
- package/dist/scripts/check-ext-entrypoints.js.map +1 -1
- package/dist/scripts/check-liaison-surface.js +27 -2
- package/dist/scripts/check-liaison-surface.js.map +1 -1
- package/dist/scripts/check-locales.js +38 -0
- package/dist/scripts/check-locales.js.map +1 -1
- package/dist/scripts/check-outbound-fetch.d.ts.map +1 -1
- package/dist/scripts/check-outbound-fetch.js +16 -2
- package/dist/scripts/check-outbound-fetch.js.map +1 -1
- package/dist/scripts/check-route-scopes.d.ts.map +1 -1
- package/dist/scripts/check-route-scopes.js +33 -4
- package/dist/scripts/check-route-scopes.js.map +1 -1
- package/dist/scripts/check-shared-implementation.js +28 -11
- package/dist/scripts/check-shared-implementation.js.map +1 -1
- package/dist/scripts/check-sse-parity.js +14 -0
- package/dist/scripts/check-sse-parity.js.map +1 -1
- package/dist/scripts/check-trusted-keys.d.ts +90 -1
- package/dist/scripts/check-trusted-keys.d.ts.map +1 -1
- package/dist/scripts/check-trusted-keys.js +521 -52
- package/dist/scripts/check-trusted-keys.js.map +1 -1
- package/dist/scripts/indexnow.js +9 -7
- package/dist/scripts/indexnow.js.map +1 -1
- package/dist/src/auth/middleware.d.ts +69 -6
- package/dist/src/auth/middleware.d.ts.map +1 -1
- package/dist/src/auth/middleware.js +130 -28
- package/dist/src/auth/middleware.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts +5 -0
- package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/agent-tasks.js +20 -2
- package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/agent-telemetry.d.ts +7 -1
- package/dist/src/cli/connect/mcp/tools/agent-telemetry.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/agent-telemetry.js +24 -0
- package/dist/src/cli/connect/mcp/tools/agent-telemetry.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/apps.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/apps.js +88 -0
- package/dist/src/cli/connect/mcp/tools/apps.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.d.ts +7 -0
- package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.js +83 -4
- package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/organisms.d.ts +2 -0
- package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/organisms.js +16 -0
- package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
- package/dist/src/cli/connect/onboarding-prompt.js +1 -1
- package/dist/src/cli/connect/skill-bundle.js +1 -1
- package/dist/src/cli/connect/tool-call-defs-agent.d.ts +1 -0
- package/dist/src/cli/connect/tool-call-defs-agent.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-agent.js +6 -0
- package/dist/src/cli/connect/tool-call-defs-agent.js.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-app-draft-edit.d.ts +21 -0
- package/dist/src/cli/connect/tool-call-defs-app-draft-edit.d.ts.map +1 -0
- package/dist/src/cli/connect/tool-call-defs-app-draft-edit.js +137 -0
- package/dist/src/cli/connect/tool-call-defs-app-draft-edit.js.map +1 -0
- package/dist/src/cli/connect/tool-call-defs-core.d.ts +1 -0
- package/dist/src/cli/connect/tool-call-defs-core.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-core.js +30 -0
- package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
- package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call.js +2 -0
- package/dist/src/cli/connect/tool-call.js.map +1 -1
- package/dist/src/config-types-ai.d.ts +76 -0
- package/dist/src/config-types-ai.d.ts.map +1 -0
- package/dist/src/config-types-ai.js +15 -0
- package/dist/src/config-types-ai.js.map +1 -0
- package/dist/src/config-types.d.ts +11 -2
- package/dist/src/config-types.d.ts.map +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +25 -4
- package/dist/src/config.js.map +1 -1
- package/dist/src/data/appdev-pitfalls.d.ts +1 -0
- package/dist/src/data/appdev-pitfalls.d.ts.map +1 -1
- package/dist/src/data/appdev-pitfalls.js +11 -0
- package/dist/src/data/appdev-pitfalls.js.map +1 -1
- package/dist/src/data/builtin-skills.d.ts.map +1 -1
- package/dist/src/data/builtin-skills.js +3 -2
- package/dist/src/data/builtin-skills.js.map +1 -1
- package/dist/src/data/digital-signage-package.js +1 -1
- package/dist/src/data/library-packs/sdk.d.ts.map +1 -1
- package/dist/src/data/library-packs/sdk.js +76 -0
- package/dist/src/data/library-packs/sdk.js.map +1 -1
- package/dist/src/data/library-packs/vendored.d.ts.map +1 -1
- package/dist/src/data/library-packs/vendored.js +81 -0
- package/dist/src/data/library-packs/vendored.js.map +1 -1
- package/dist/src/data/library-packs.d.ts +2 -2
- package/dist/src/data/library-packs.js +2 -2
- package/dist/src/data/public-pages.d.ts +13 -0
- package/dist/src/data/public-pages.d.ts.map +1 -1
- package/dist/src/data/public-pages.js +153 -113
- package/dist/src/data/public-pages.js.map +1 -1
- package/dist/src/generated/api-types.d.ts +2251 -102
- package/dist/src/generated/api-types.d.ts.map +1 -1
- package/dist/src/index-start.d.ts.map +1 -1
- package/dist/src/index-start.js +21 -1
- package/dist/src/index-start.js.map +1 -1
- package/dist/src/mcp/agent-tasks.d.ts +16 -0
- package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
- package/dist/src/mcp/agent-tasks.js +84 -54
- package/dist/src/mcp/agent-tasks.js.map +1 -1
- package/dist/src/mcp/agent-telemetry.d.ts +6 -1
- package/dist/src/mcp/agent-telemetry.d.ts.map +1 -1
- package/dist/src/mcp/agent-telemetry.js +37 -1
- package/dist/src/mcp/agent-telemetry.js.map +1 -1
- package/dist/src/mcp/ai-image.d.ts +22 -0
- package/dist/src/mcp/ai-image.d.ts.map +1 -0
- package/dist/src/mcp/ai-image.js +60 -0
- package/dist/src/mcp/ai-image.js.map +1 -0
- package/dist/src/mcp/annotations.d.ts +5 -0
- package/dist/src/mcp/annotations.d.ts.map +1 -1
- package/dist/src/mcp/annotations.js +23 -0
- package/dist/src/mcp/annotations.js.map +1 -1
- package/dist/src/mcp/apps-draft-edit.d.ts +28 -0
- package/dist/src/mcp/apps-draft-edit.d.ts.map +1 -0
- package/dist/src/mcp/apps-draft-edit.js +164 -0
- package/dist/src/mcp/apps-draft-edit.js.map +1 -0
- package/dist/src/mcp/apps-screenshot.d.ts +26 -0
- package/dist/src/mcp/apps-screenshot.d.ts.map +1 -0
- package/dist/src/mcp/apps-screenshot.js +39 -0
- package/dist/src/mcp/apps-screenshot.js.map +1 -0
- package/dist/src/mcp/catalog/definitions/agent-messaging.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions/agent-messaging.js +18 -0
- package/dist/src/mcp/catalog/definitions/agent-messaging.js.map +1 -1
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts +1 -0
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.js +59 -0
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.js.map +1 -1
- package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.d.ts +3 -0
- package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js +96 -2
- package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js.map +1 -1
- package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts +2 -0
- package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js +7 -3
- package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js.map +1 -1
- package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
- package/dist/src/mcp/catalog/scopes.js +34 -1
- package/dist/src/mcp/catalog/scopes.js.map +1 -1
- package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
- package/dist/src/mcp/catalog/surfaces.js +26 -7
- package/dist/src/mcp/catalog/surfaces.js.map +1 -1
- package/dist/src/mcp/core-admin.d.ts +7 -3
- package/dist/src/mcp/core-admin.d.ts.map +1 -1
- package/dist/src/mcp/core-admin.js +60 -3
- package/dist/src/mcp/core-admin.js.map +1 -1
- package/dist/src/mcp/core-datapackage.d.ts +32 -0
- package/dist/src/mcp/core-datapackage.d.ts.map +1 -0
- package/dist/src/mcp/core-datapackage.js +188 -0
- package/dist/src/mcp/core-datapackage.js.map +1 -0
- package/dist/src/mcp/core-storage.d.ts +7 -3
- package/dist/src/mcp/core-storage.d.ts.map +1 -1
- package/dist/src/mcp/core-storage.js +27 -4
- package/dist/src/mcp/core-storage.js.map +1 -1
- package/dist/src/mcp/core.d.ts.map +1 -1
- package/dist/src/mcp/core.js +3 -0
- package/dist/src/mcp/core.js.map +1 -1
- package/dist/src/mcp/extensions.d.ts.map +1 -1
- package/dist/src/mcp/extensions.js +11 -1
- package/dist/src/mcp/extensions.js.map +1 -1
- package/dist/src/mcp/index.d.ts +9 -0
- package/dist/src/mcp/index.d.ts.map +1 -1
- package/dist/src/mcp/index.js +43 -2
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/mcp/organisms-email-invites.d.ts.map +1 -1
- package/dist/src/mcp/organisms-email-invites.js +2 -1
- package/dist/src/mcp/organisms-email-invites.js.map +1 -1
- package/dist/src/mcp/organisms-name-invites.d.ts.map +1 -1
- package/dist/src/mcp/organisms-name-invites.js +40 -1
- package/dist/src/mcp/organisms-name-invites.js.map +1 -1
- package/dist/src/mcp/organisms.d.ts.map +1 -1
- package/dist/src/mcp/organisms.js +6 -1
- package/dist/src/mcp/organisms.js.map +1 -1
- package/dist/src/mcp/tool-usage-wrap.d.ts +9 -0
- package/dist/src/mcp/tool-usage-wrap.d.ts.map +1 -0
- package/dist/src/mcp/tool-usage-wrap.js +87 -0
- package/dist/src/mcp/tool-usage-wrap.js.map +1 -0
- package/dist/src/mcp/workspaces.d.ts.map +1 -1
- package/dist/src/mcp/workspaces.js +9 -0
- package/dist/src/mcp/workspaces.js.map +1 -1
- package/dist/src/middleware/idempotency.d.ts +6 -0
- package/dist/src/middleware/idempotency.d.ts.map +1 -1
- package/dist/src/middleware/idempotency.js +23 -2
- package/dist/src/middleware/idempotency.js.map +1 -1
- package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
- package/dist/src/models/agent-task-schemas.js +12 -1
- package/dist/src/models/agent-task-schemas.js.map +1 -1
- package/dist/src/models/webhook-schemas.d.ts +2 -2
- package/dist/src/models/workflow-schemas.d.ts +178 -1
- package/dist/src/models/workflow-schemas.d.ts.map +1 -1
- package/dist/src/models/workflow-schemas.js +75 -0
- package/dist/src/models/workflow-schemas.js.map +1 -1
- package/dist/src/routes/admin-extensions.d.ts +4 -0
- package/dist/src/routes/admin-extensions.d.ts.map +1 -1
- package/dist/src/routes/admin-extensions.js +135 -142
- package/dist/src/routes/admin-extensions.js.map +1 -1
- package/dist/src/routes/admin-monitoring.d.ts +2 -0
- package/dist/src/routes/admin-monitoring.d.ts.map +1 -1
- package/dist/src/routes/admin-monitoring.js +32 -0
- package/dist/src/routes/admin-monitoring.js.map +1 -1
- package/dist/src/routes/admin-organisms.d.ts +28 -0
- package/dist/src/routes/admin-organisms.d.ts.map +1 -0
- package/dist/src/routes/admin-organisms.js +99 -0
- package/dist/src/routes/admin-organisms.js.map +1 -0
- package/dist/src/routes/admin-usage.d.ts +33 -0
- package/dist/src/routes/admin-usage.d.ts.map +1 -0
- package/dist/src/routes/admin-usage.js +198 -0
- package/dist/src/routes/admin-usage.js.map +1 -0
- package/dist/src/routes/agent-conventions.d.ts.map +1 -1
- package/dist/src/routes/agent-conventions.js +4 -2
- package/dist/src/routes/agent-conventions.js.map +1 -1
- package/dist/src/routes/agent-docs.d.ts +4 -4
- package/dist/src/routes/agent-docs.js +145 -145
- package/dist/src/routes/agent-docs.js.map +1 -1
- package/dist/src/routes/agent-messages.d.ts +6 -0
- package/dist/src/routes/agent-messages.d.ts.map +1 -1
- package/dist/src/routes/agent-messages.js +23 -1
- package/dist/src/routes/agent-messages.js.map +1 -1
- package/dist/src/routes/agent-tasks/completion.d.ts +5 -0
- package/dist/src/routes/agent-tasks/completion.d.ts.map +1 -1
- package/dist/src/routes/agent-tasks/completion.js +35 -54
- package/dist/src/routes/agent-tasks/completion.js.map +1 -1
- package/dist/src/routes/agent-tasks/create-read.d.ts.map +1 -1
- package/dist/src/routes/agent-tasks/create-read.js +8 -1
- package/dist/src/routes/agent-tasks/create-read.js.map +1 -1
- package/dist/src/routes/agent-tasks/lifecycle.d.ts +4 -1
- package/dist/src/routes/agent-tasks/lifecycle.d.ts.map +1 -1
- package/dist/src/routes/agent-tasks/lifecycle.js +80 -2
- package/dist/src/routes/agent-tasks/lifecycle.js.map +1 -1
- package/dist/src/routes/agents/device-auth.d.ts.map +1 -1
- package/dist/src/routes/agents/device-auth.js +27 -4
- package/dist/src/routes/agents/device-auth.js.map +1 -1
- package/dist/src/routes/ai.d.ts +5 -0
- package/dist/src/routes/ai.d.ts.map +1 -1
- package/dist/src/routes/ai.js +51 -1
- package/dist/src/routes/ai.js.map +1 -1
- package/dist/src/routes/app-grants.d.ts.map +1 -1
- package/dist/src/routes/app-grants.js +5 -0
- package/dist/src/routes/app-grants.js.map +1 -1
- package/dist/src/routes/apps/drafts.d.ts +6 -0
- package/dist/src/routes/apps/drafts.d.ts.map +1 -1
- package/dist/src/routes/apps/drafts.js +133 -1
- package/dist/src/routes/apps/drafts.js.map +1 -1
- package/dist/src/routes/apps/read.d.ts +4 -0
- package/dist/src/routes/apps/read.d.ts.map +1 -1
- package/dist/src/routes/apps/read.js +47 -2
- package/dist/src/routes/apps/read.js.map +1 -1
- package/dist/src/routes/auth-otk.d.ts +28 -0
- package/dist/src/routes/auth-otk.d.ts.map +1 -0
- package/dist/src/routes/auth-otk.js +190 -0
- package/dist/src/routes/auth-otk.js.map +1 -0
- package/dist/src/routes/auth.d.ts +17 -0
- package/dist/src/routes/auth.d.ts.map +1 -1
- package/dist/src/routes/auth.js +44 -153
- package/dist/src/routes/auth.js.map +1 -1
- package/dist/src/routes/bootstrap.d.ts +6 -0
- package/dist/src/routes/bootstrap.d.ts.map +1 -1
- package/dist/src/routes/bootstrap.js +47 -20
- package/dist/src/routes/bootstrap.js.map +1 -1
- package/dist/src/routes/capabilities.d.ts +17 -0
- package/dist/src/routes/capabilities.d.ts.map +1 -1
- package/dist/src/routes/capabilities.js +187 -4
- package/dist/src/routes/capabilities.js.map +1 -1
- package/dist/src/routes/chat.d.ts +23 -0
- package/dist/src/routes/chat.d.ts.map +1 -0
- package/dist/src/routes/chat.js +165 -0
- package/dist/src/routes/chat.js.map +1 -0
- package/dist/src/routes/commerce.js +4 -4
- package/dist/src/routes/commerce.js.map +1 -1
- package/dist/src/routes/datapackages.d.ts +35 -0
- package/dist/src/routes/datapackages.d.ts.map +1 -0
- package/dist/src/routes/datapackages.js +217 -0
- package/dist/src/routes/datapackages.js.map +1 -0
- package/dist/src/routes/disputes.d.ts +27 -0
- package/dist/src/routes/disputes.d.ts.map +1 -1
- package/dist/src/routes/disputes.js +74 -79
- package/dist/src/routes/disputes.js.map +1 -1
- package/dist/src/routes/ecosystem-apps-advisories.d.ts +16 -0
- package/dist/src/routes/ecosystem-apps-advisories.d.ts.map +1 -0
- package/dist/src/routes/ecosystem-apps-advisories.js +104 -0
- package/dist/src/routes/ecosystem-apps-advisories.js.map +1 -0
- package/dist/src/routes/ecosystem-apps.d.ts +6 -0
- package/dist/src/routes/ecosystem-apps.d.ts.map +1 -1
- package/dist/src/routes/ecosystem-apps.js +31 -99
- package/dist/src/routes/ecosystem-apps.js.map +1 -1
- package/dist/src/routes/extensions/actions.d.ts.map +1 -1
- package/dist/src/routes/extensions/actions.js +29 -1
- package/dist/src/routes/extensions/actions.js.map +1 -1
- package/dist/src/routes/federation-sync/messaging.d.ts +6 -0
- package/dist/src/routes/federation-sync/messaging.d.ts.map +1 -1
- package/dist/src/routes/federation-sync/messaging.js +22 -1
- package/dist/src/routes/federation-sync/messaging.js.map +1 -1
- package/dist/src/routes/federation-sync/routing.d.ts.map +1 -1
- package/dist/src/routes/federation-sync/routing.js +12 -3
- package/dist/src/routes/federation-sync/routing.js.map +1 -1
- package/dist/src/routes/glossary.js +1 -1
- package/dist/src/routes/glossary.js.map +1 -1
- package/dist/src/routes/home/track.d.ts +5 -1
- package/dist/src/routes/home/track.d.ts.map +1 -1
- package/dist/src/routes/home/track.js +20 -6
- package/dist/src/routes/home/track.js.map +1 -1
- package/dist/src/routes/instances/install.d.ts +7 -0
- package/dist/src/routes/instances/install.d.ts.map +1 -1
- package/dist/src/routes/instances/install.js +31 -24
- package/dist/src/routes/instances/install.js.map +1 -1
- package/dist/src/routes/library-packs.d.ts +7 -0
- package/dist/src/routes/library-packs.d.ts.map +1 -1
- package/dist/src/routes/library-packs.js +32 -8
- package/dist/src/routes/library-packs.js.map +1 -1
- package/dist/src/routes/libs.js +1 -1
- package/dist/src/routes/libs.js.map +1 -1
- package/dist/src/routes/markdown-mirrors.js +1 -1
- package/dist/src/routes/markdown-mirrors.js.map +1 -1
- package/dist/src/routes/messages.d.ts +6 -0
- package/dist/src/routes/messages.d.ts.map +1 -1
- package/dist/src/routes/messages.js +15 -3
- package/dist/src/routes/messages.js.map +1 -1
- package/dist/src/routes/odata.d.ts +36 -0
- package/dist/src/routes/odata.d.ts.map +1 -0
- package/dist/src/routes/odata.js +143 -0
- package/dist/src/routes/odata.js.map +1 -0
- package/dist/src/routes/openrouter.d.ts +4 -0
- package/dist/src/routes/openrouter.d.ts.map +1 -1
- package/dist/src/routes/openrouter.js +10 -1
- package/dist/src/routes/openrouter.js.map +1 -1
- package/dist/src/routes/organisms/crud.d.ts +4 -0
- package/dist/src/routes/organisms/crud.d.ts.map +1 -1
- package/dist/src/routes/organisms/crud.js +25 -7
- package/dist/src/routes/organisms/crud.js.map +1 -1
- package/dist/src/routes/organisms/gates.d.ts.map +1 -1
- package/dist/src/routes/organisms/gates.js +19 -2
- package/dist/src/routes/organisms/gates.js.map +1 -1
- package/dist/src/routes/organisms/membership.d.ts +4 -0
- package/dist/src/routes/organisms/membership.d.ts.map +1 -1
- package/dist/src/routes/organisms/membership.js +88 -36
- package/dist/src/routes/organisms/membership.js.map +1 -1
- package/dist/src/routes/organisms/shared.d.ts.map +1 -1
- package/dist/src/routes/organisms/shared.js +2 -1
- package/dist/src/routes/organisms/shared.js.map +1 -1
- package/dist/src/routes/organisms/workspace-access.d.ts +5 -0
- package/dist/src/routes/organisms/workspace-access.d.ts.map +1 -1
- package/dist/src/routes/organisms/workspace-access.js +41 -2
- package/dist/src/routes/organisms/workspace-access.js.map +1 -1
- package/dist/src/routes/organisms/workspace-ops.d.ts +2 -0
- package/dist/src/routes/organisms/workspace-ops.d.ts.map +1 -1
- package/dist/src/routes/organisms/workspace-ops.js +10 -6
- package/dist/src/routes/organisms/workspace-ops.js.map +1 -1
- package/dist/src/routes/organisms/workspace-read.d.ts +3 -0
- package/dist/src/routes/organisms/workspace-read.d.ts.map +1 -1
- package/dist/src/routes/organisms/workspace-read.js +13 -7
- package/dist/src/routes/organisms/workspace-read.js.map +1 -1
- package/dist/src/routes/portal.d.ts +1 -0
- package/dist/src/routes/portal.d.ts.map +1 -1
- package/dist/src/routes/portal.js +13 -0
- package/dist/src/routes/portal.js.map +1 -1
- package/dist/src/routes/schedules.d.ts +4 -0
- package/dist/src/routes/schedules.d.ts.map +1 -1
- package/dist/src/routes/schedules.js +9 -1
- package/dist/src/routes/schedules.js.map +1 -1
- package/dist/src/routes/storage-files.d.ts +23 -0
- package/dist/src/routes/storage-files.d.ts.map +1 -1
- package/dist/src/routes/storage-files.js +103 -82
- package/dist/src/routes/storage-files.js.map +1 -1
- package/dist/src/routes/subdomains.d.ts +9 -1
- package/dist/src/routes/subdomains.d.ts.map +1 -1
- package/dist/src/routes/subdomains.js +55 -1
- package/dist/src/routes/subdomains.js.map +1 -1
- package/dist/src/routes/usage-reports.d.ts +31 -0
- package/dist/src/routes/usage-reports.d.ts.map +1 -0
- package/dist/src/routes/usage-reports.js +107 -0
- package/dist/src/routes/usage-reports.js.map +1 -0
- package/dist/src/routes/validate.d.ts.map +1 -1
- package/dist/src/routes/validate.js +1 -0
- package/dist/src/routes/validate.js.map +1 -1
- package/dist/src/routes/workflows.d.ts.map +1 -1
- package/dist/src/routes/workflows.js +9 -1
- package/dist/src/routes/workflows.js.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.d.ts +2 -0
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +32 -2
- package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
- package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
- package/dist/src/server-bootstrap/service-init.js +12 -7
- package/dist/src/server-bootstrap/service-init.js.map +1 -1
- package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
- package/dist/src/server-bootstrap/static-files.js +44 -10
- package/dist/src/server-bootstrap/static-files.js.map +1 -1
- package/dist/src/services/agent-task-fanout.d.ts +61 -0
- package/dist/src/services/agent-task-fanout.d.ts.map +1 -1
- package/dist/src/services/agent-task-fanout.js +114 -2
- package/dist/src/services/agent-task-fanout.js.map +1 -1
- package/dist/src/services/agent-task-write.d.ts.map +1 -1
- package/dist/src/services/agent-task-write.js +6 -0
- package/dist/src/services/agent-task-write.js.map +1 -1
- package/dist/src/services/ai-allowance.d.ts +82 -0
- package/dist/src/services/ai-allowance.d.ts.map +1 -0
- package/dist/src/services/ai-allowance.js +117 -0
- package/dist/src/services/ai-allowance.js.map +1 -0
- package/dist/src/services/ai-completion.d.ts +39 -0
- package/dist/src/services/ai-completion.d.ts.map +1 -1
- package/dist/src/services/ai-completion.js +77 -10
- package/dist/src/services/ai-completion.js.map +1 -1
- package/dist/src/services/ai-image.d.ts +70 -0
- package/dist/src/services/ai-image.d.ts.map +1 -0
- package/dist/src/services/ai-image.js +104 -0
- package/dist/src/services/ai-image.js.map +1 -0
- package/dist/src/services/ai-model-defaults.d.ts +45 -0
- package/dist/src/services/ai-model-defaults.d.ts.map +1 -0
- package/dist/src/services/ai-model-defaults.js +42 -0
- package/dist/src/services/ai-model-defaults.js.map +1 -0
- package/dist/src/services/ai-tool-setup.d.ts +5 -1
- package/dist/src/services/ai-tool-setup.d.ts.map +1 -1
- package/dist/src/services/ai-tool-setup.js +36 -0
- package/dist/src/services/ai-tool-setup.js.map +1 -1
- package/dist/src/services/ai-transcription.d.ts +5 -0
- package/dist/src/services/ai-transcription.d.ts.map +1 -1
- package/dist/src/services/ai-transcription.js +10 -2
- package/dist/src/services/ai-transcription.js.map +1 -1
- package/dist/src/services/ai-usage-admin.d.ts +19 -8
- package/dist/src/services/ai-usage-admin.d.ts.map +1 -1
- package/dist/src/services/ai-usage-admin.js +30 -35
- package/dist/src/services/ai-usage-admin.js.map +1 -1
- package/dist/src/services/app-agent-surfaces.js +4 -4
- package/dist/src/services/app-agent-surfaces.js.map +1 -1
- package/dist/src/services/app-artifact-lint.d.ts +4 -0
- package/dist/src/services/app-artifact-lint.d.ts.map +1 -1
- package/dist/src/services/app-artifact-lint.js +49 -0
- package/dist/src/services/app-artifact-lint.js.map +1 -1
- package/dist/src/services/app-draft-edit.d.ts +144 -0
- package/dist/src/services/app-draft-edit.d.ts.map +1 -0
- package/dist/src/services/app-draft-edit.js +203 -0
- package/dist/src/services/app-draft-edit.js.map +1 -0
- package/dist/src/services/app-spec-gate.d.ts +4 -0
- package/dist/src/services/app-spec-gate.d.ts.map +1 -1
- package/dist/src/services/app-spec-gate.js +16 -1
- package/dist/src/services/app-spec-gate.js.map +1 -1
- package/dist/src/services/attachment-duplication.d.ts +4 -0
- package/dist/src/services/attachment-duplication.d.ts.map +1 -1
- package/dist/src/services/attachment-duplication.js +15 -0
- package/dist/src/services/attachment-duplication.js.map +1 -1
- package/dist/src/services/auth-md.js +2 -2
- package/dist/src/services/auth-md.js.map +1 -1
- package/dist/src/services/board-write.d.ts +11 -3
- package/dist/src/services/board-write.d.ts.map +1 -1
- package/dist/src/services/board-write.js +24 -3
- package/dist/src/services/board-write.js.map +1 -1
- package/dist/src/services/capability-record.d.ts.map +1 -1
- package/dist/src/services/capability-record.js +22 -9
- package/dist/src/services/capability-record.js.map +1 -1
- package/dist/src/services/chat-agent.d.ts +36 -0
- package/dist/src/services/chat-agent.d.ts.map +1 -0
- package/dist/src/services/chat-agent.js +123 -0
- package/dist/src/services/chat-agent.js.map +1 -0
- package/dist/src/services/chat-session.d.ts +58 -0
- package/dist/src/services/chat-session.d.ts.map +1 -0
- package/dist/src/services/chat-session.js +151 -0
- package/dist/src/services/chat-session.js.map +1 -0
- package/dist/src/services/chat-threads.d.ts +61 -0
- package/dist/src/services/chat-threads.d.ts.map +1 -0
- package/dist/src/services/chat-threads.js +137 -0
- package/dist/src/services/chat-threads.js.map +1 -0
- package/dist/src/services/config-schema.d.ts.map +1 -1
- package/dist/src/services/config-schema.js +2 -1
- package/dist/src/services/config-schema.js.map +1 -1
- package/dist/src/services/core-jobs.d.ts +2 -0
- package/dist/src/services/core-jobs.d.ts.map +1 -1
- package/dist/src/services/core-jobs.js +11 -0
- package/dist/src/services/core-jobs.js.map +1 -1
- package/dist/src/services/datapackage/contract.d.ts +198 -0
- package/dist/src/services/datapackage/contract.d.ts.map +1 -0
- package/dist/src/services/datapackage/contract.js +140 -0
- package/dist/src/services/datapackage/contract.js.map +1 -0
- package/dist/src/services/datapackage/ext-capability.d.ts +85 -0
- package/dist/src/services/datapackage/ext-capability.d.ts.map +1 -0
- package/dist/src/services/datapackage/ext-capability.js +72 -0
- package/dist/src/services/datapackage/ext-capability.js.map +1 -0
- package/dist/src/services/datapackage/odata.d.ts +92 -0
- package/dist/src/services/datapackage/odata.d.ts.map +1 -0
- package/dist/src/services/datapackage/odata.js +256 -0
- package/dist/src/services/datapackage/odata.js.map +1 -0
- package/dist/src/services/datapackage/odps.d.ts +24 -0
- package/dist/src/services/datapackage/odps.d.ts.map +1 -0
- package/dist/src/services/datapackage/odps.js +183 -0
- package/dist/src/services/datapackage/odps.js.map +1 -0
- package/dist/src/services/datapackage/store.d.ts +143 -0
- package/dist/src/services/datapackage/store.d.ts.map +1 -0
- package/dist/src/services/datapackage/store.js +533 -0
- package/dist/src/services/datapackage/store.js.map +1 -0
- package/dist/src/services/datapackage/table.d.ts +67 -0
- package/dist/src/services/datapackage/table.d.ts.map +1 -0
- package/dist/src/services/datapackage/table.js +0 -0
- package/dist/src/services/datapackage/table.js.map +1 -0
- package/dist/src/services/extension-ctx.d.ts +1 -0
- package/dist/src/services/extension-ctx.d.ts.map +1 -1
- package/dist/src/services/extension-ctx.js +31 -6
- package/dist/src/services/extension-ctx.js.map +1 -1
- package/dist/src/services/extension-files.d.ts +20 -0
- package/dist/src/services/extension-files.d.ts.map +1 -1
- package/dist/src/services/extension-files.js +9 -2
- package/dist/src/services/extension-files.js.map +1 -1
- package/dist/src/services/extension-lifecycle.d.ts +3 -0
- package/dist/src/services/extension-lifecycle.d.ts.map +1 -1
- package/dist/src/services/extension-lifecycle.js +2 -26
- package/dist/src/services/extension-lifecycle.js.map +1 -1
- package/dist/src/services/extension-runtime.d.ts +28 -2
- package/dist/src/services/extension-runtime.d.ts.map +1 -1
- package/dist/src/services/extension-runtime.js +22 -0
- package/dist/src/services/extension-runtime.js.map +1 -1
- package/dist/src/services/extension-schedules.d.ts +90 -0
- package/dist/src/services/extension-schedules.d.ts.map +1 -0
- package/dist/src/services/extension-schedules.js +123 -0
- package/dist/src/services/extension-schedules.js.map +1 -0
- package/dist/src/services/extension-system-run.d.ts +91 -0
- package/dist/src/services/extension-system-run.d.ts.map +1 -0
- package/dist/src/services/extension-system-run.js +100 -0
- package/dist/src/services/extension-system-run.js.map +1 -0
- package/dist/src/services/extension-upsert.d.ts +2 -0
- package/dist/src/services/extension-upsert.d.ts.map +1 -1
- package/dist/src/services/extension-upsert.js +6 -24
- package/dist/src/services/extension-upsert.js.map +1 -1
- package/dist/src/services/goose-acp.d.ts +84 -0
- package/dist/src/services/goose-acp.d.ts.map +1 -0
- package/dist/src/services/goose-acp.js +304 -0
- package/dist/src/services/goose-acp.js.map +1 -0
- package/dist/src/services/invitations.d.ts +0 -20
- package/dist/src/services/invitations.d.ts.map +1 -1
- package/dist/src/services/invitations.js +30 -0
- package/dist/src/services/invitations.js.map +1 -1
- package/dist/src/services/job-seeding.d.ts +1 -0
- package/dist/src/services/job-seeding.d.ts.map +1 -1
- package/dist/src/services/job-seeding.js +6 -0
- package/dist/src/services/job-seeding.js.map +1 -1
- package/dist/src/services/ledger-admin.d.ts +18 -4
- package/dist/src/services/ledger-admin.d.ts.map +1 -1
- package/dist/src/services/ledger-admin.js +47 -33
- package/dist/src/services/ledger-admin.js.map +1 -1
- package/dist/src/services/markdown-negotiation.js +1 -1
- package/dist/src/services/markdown-negotiation.js.map +1 -1
- package/dist/src/services/message-broadcast.d.ts.map +1 -1
- package/dist/src/services/message-broadcast.js +29 -1
- package/dist/src/services/message-broadcast.js.map +1 -1
- package/dist/src/services/metered-access.d.ts +9 -2
- package/dist/src/services/metered-access.d.ts.map +1 -1
- package/dist/src/services/metered-access.js +92 -12
- package/dist/src/services/metered-access.js.map +1 -1
- package/dist/src/services/openrouter.d.ts +20 -1
- package/dist/src/services/openrouter.d.ts.map +1 -1
- package/dist/src/services/openrouter.js +66 -0
- package/dist/src/services/openrouter.js.map +1 -1
- package/dist/src/services/organism-import.d.ts.map +1 -1
- package/dist/src/services/organism-import.js +4 -1
- package/dist/src/services/organism-import.js.map +1 -1
- package/dist/src/services/organism-lifecycle.d.ts.map +1 -1
- package/dist/src/services/organism-lifecycle.js +5 -1
- package/dist/src/services/organism-lifecycle.js.map +1 -1
- package/dist/src/services/organism-ownership.d.ts +56 -0
- package/dist/src/services/organism-ownership.d.ts.map +1 -0
- package/dist/src/services/organism-ownership.js +174 -0
- package/dist/src/services/organism-ownership.js.map +1 -0
- package/dist/src/services/organism-privacy.d.ts.map +1 -1
- package/dist/src/services/organism-privacy.js +2 -1
- package/dist/src/services/organism-privacy.js.map +1 -1
- package/dist/src/services/prompt-defaults/tiers-core.js +4 -4
- package/dist/src/services/scheduler-extension-job.d.ts +29 -6
- package/dist/src/services/scheduler-extension-job.d.ts.map +1 -1
- package/dist/src/services/scheduler-extension-job.js +29 -75
- package/dist/src/services/scheduler-extension-job.js.map +1 -1
- package/dist/src/services/scope-vocabulary-migration.d.ts +54 -1
- package/dist/src/services/scope-vocabulary-migration.d.ts.map +1 -1
- package/dist/src/services/scope-vocabulary-migration.js +101 -6
- package/dist/src/services/scope-vocabulary-migration.js.map +1 -1
- package/dist/src/services/screenshot-capture.d.ts +40 -1
- package/dist/src/services/screenshot-capture.d.ts.map +1 -1
- package/dist/src/services/screenshot-capture.js +142 -60
- package/dist/src/services/screenshot-capture.js.map +1 -1
- package/dist/src/services/skill-bundle/generator.js +1 -1
- package/dist/src/services/skill-bundle/generic-adapter.js +1 -1
- package/dist/src/services/skill-bundle/hermes-adapter.js +1 -1
- package/dist/src/services/storage-file-write.d.ts +36 -1
- package/dist/src/services/storage-file-write.d.ts.map +1 -1
- package/dist/src/services/storage-file-write.js +49 -3
- package/dist/src/services/storage-file-write.js.map +1 -1
- package/dist/src/services/task-outcome.d.ts +53 -0
- package/dist/src/services/task-outcome.d.ts.map +1 -0
- package/dist/src/services/task-outcome.js +28 -0
- package/dist/src/services/task-outcome.js.map +1 -0
- package/dist/src/services/usage/archive-job.d.ts +25 -0
- package/dist/src/services/usage/archive-job.d.ts.map +1 -0
- package/dist/src/services/usage/archive-job.js +36 -0
- package/dist/src/services/usage/archive-job.js.map +1 -0
- package/dist/src/services/usage/record-app-open.d.ts +8 -0
- package/dist/src/services/usage/record-app-open.d.ts.map +1 -0
- package/dist/src/services/usage/record-app-open.js +52 -0
- package/dist/src/services/usage/record-app-open.js.map +1 -0
- package/dist/src/services/usage/rollup-cuts.d.ts +44 -0
- package/dist/src/services/usage/rollup-cuts.d.ts.map +1 -0
- package/dist/src/services/usage/rollup-cuts.js +81 -0
- package/dist/src/services/usage/rollup-cuts.js.map +1 -0
- package/dist/src/services/usage/rollup-engine.d.ts +71 -0
- package/dist/src/services/usage/rollup-engine.d.ts.map +1 -0
- package/dist/src/services/usage/rollup-engine.js +237 -0
- package/dist/src/services/usage/rollup-engine.js.map +1 -0
- package/dist/src/services/usage/usage-buffer.d.ts +25 -0
- package/dist/src/services/usage/usage-buffer.d.ts.map +1 -0
- package/dist/src/services/usage/usage-buffer.js +146 -0
- package/dist/src/services/usage/usage-buffer.js.map +1 -0
- package/dist/src/services/usage/usage-read.d.ts +115 -0
- package/dist/src/services/usage/usage-read.d.ts.map +1 -0
- package/dist/src/services/usage/usage-read.js +246 -0
- package/dist/src/services/usage/usage-read.js.map +1 -0
- package/dist/src/services/usage-metering.d.ts +5 -0
- package/dist/src/services/usage-metering.d.ts.map +1 -1
- package/dist/src/services/usage-metering.js +7 -0
- package/dist/src/services/usage-metering.js.map +1 -1
- package/dist/src/services/workflow/engine-human.d.ts +15 -0
- package/dist/src/services/workflow/engine-human.d.ts.map +1 -1
- package/dist/src/services/workflow/engine-human.js +10 -1
- package/dist/src/services/workflow/engine-human.js.map +1 -1
- package/dist/src/services/workflow/engine-steps.d.ts +48 -3
- package/dist/src/services/workflow/engine-steps.d.ts.map +1 -1
- package/dist/src/services/workflow/engine-steps.js +361 -0
- package/dist/src/services/workflow/engine-steps.js.map +1 -1
- package/dist/src/services/workflow/engine.d.ts +1 -0
- package/dist/src/services/workflow/engine.d.ts.map +1 -1
- package/dist/src/services/workflow/engine.js +2 -1
- package/dist/src/services/workflow/engine.js.map +1 -1
- package/dist/src/services/workflow/store.d.ts.map +1 -1
- package/dist/src/services/workflow/store.js +60 -4
- package/dist/src/services/workflow/store.js.map +1 -1
- package/dist/src/services/write-guards.d.ts +27 -1
- package/dist/src/services/write-guards.d.ts.map +1 -1
- package/dist/src/services/write-guards.js +39 -9
- package/dist/src/services/write-guards.js.map +1 -1
- package/dist/src/storage/interface.d.ts +4 -1
- package/dist/src/storage/interface.d.ts.map +1 -1
- package/dist/src/storage/interface.js +1 -0
- package/dist/src/storage/interface.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/db-types.d.ts +119 -0
- package/dist/src/storage/providers/postgres-kysely/db-types.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/index.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/index.js +2 -1
- package/dist/src/storage/providers/postgres-kysely/index.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/agent-tasks.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/agent-tasks.js +3 -0
- package/dist/src/storage/providers/postgres-kysely/methods/agent-tasks.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/agent-usage.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/agent-usage.js +4 -0
- package/dist/src/storage/providers/postgres-kysely/methods/agent-usage.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts +1 -0
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js +3 -0
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/files.d.ts +2 -0
- package/dist/src/storage/providers/postgres-kysely/methods/files.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/files.js +34 -2
- package/dist/src/storage/providers/postgres-kysely/methods/files.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/organisms.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/organisms.js +11 -2
- package/dist/src/storage/providers/postgres-kysely/methods/organisms.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/usage.d.ts +32 -0
- package/dist/src/storage/providers/postgres-kysely/methods/usage.d.ts.map +1 -0
- package/dist/src/storage/providers/postgres-kysely/methods/usage.js +336 -0
- package/dist/src/storage/providers/postgres-kysely/methods/usage.js.map +1 -0
- package/dist/src/storage/providers/postgres-kysely/migrations/0036_usage_telemetry.sql +181 -0
- package/dist/src/storage/providers/postgres-kysely/migrations/0037_task_created_by.sql +18 -0
- package/dist/src/storage/providers/postgres-kysely/migrations/0038_organism_owners.sql +31 -0
- package/dist/src/storage/providers/postgres-kysely/migrations/0039_storage_file_utf8_verified.sql +19 -0
- package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/index.js +3 -1
- package/dist/src/storage/providers/sqlite/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/apps.d.ts +1 -0
- package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/apps.js +33 -28
- package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/governance.d.ts +2 -0
- package/dist/src/storage/providers/sqlite/methods/governance.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/governance.js +25 -4
- package/dist/src/storage/providers/sqlite/methods/governance.js.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts +1 -12
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.js +28 -135
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.js.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/storage-files.d.ts +38 -0
- package/dist/src/storage/providers/sqlite/methods/storage-files.d.ts.map +1 -0
- package/dist/src/storage/providers/sqlite/methods/storage-files.js +109 -0
- package/dist/src/storage/providers/sqlite/methods/storage-files.js.map +1 -0
- package/dist/src/storage/providers/sqlite/methods/usage.d.ts +43 -0
- package/dist/src/storage/providers/sqlite/methods/usage.d.ts.map +1 -0
- package/dist/src/storage/providers/sqlite/methods/usage.js +37 -0
- package/dist/src/storage/providers/sqlite/methods/usage.js.map +1 -0
- package/dist/src/storage/providers/sqlite/repos/agent-task.d.ts +1 -0
- package/dist/src/storage/providers/sqlite/repos/agent-task.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/agent-task.js +4 -2
- package/dist/src/storage/providers/sqlite/repos/agent-task.js.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/agent-usage.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/agent-usage.js +4 -2
- package/dist/src/storage/providers/sqlite/repos/agent-usage.js.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/community.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/community.js +20 -0
- package/dist/src/storage/providers/sqlite/repos/community.js.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/usage.d.ts +35 -0
- package/dist/src/storage/providers/sqlite/repos/usage.d.ts.map +1 -0
- package/dist/src/storage/providers/sqlite/repos/usage.js +352 -0
- package/dist/src/storage/providers/sqlite/repos/usage.js.map +1 -0
- package/dist/src/storage/providers/sqlite/schema-tables-1.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema-tables-1.js +2 -0
- package/dist/src/storage/providers/sqlite/schema-tables-1.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema-tables-3.d.ts +1 -0
- package/dist/src/storage/providers/sqlite/schema-tables-3.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema-tables-3.js +1 -0
- package/dist/src/storage/providers/sqlite/schema-tables-3.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema-tables-4.d.ts +2 -0
- package/dist/src/storage/providers/sqlite/schema-tables-4.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema-tables-4.js +131 -0
- package/dist/src/storage/providers/sqlite/schema-tables-4.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.d.ts +2 -0
- package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.js +155 -130
- package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
- package/dist/src/storage/repositories/app-grant.repository.d.ts +11 -0
- package/dist/src/storage/repositories/app-grant.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/file.repository.d.ts +13 -0
- package/dist/src/storage/repositories/file.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/usage.repository.d.ts +80 -0
- package/dist/src/storage/repositories/usage.repository.d.ts.map +1 -0
- package/dist/src/storage/repositories/usage.repository.js +23 -0
- package/dist/src/storage/repositories/usage.repository.js.map +1 -0
- package/dist/src/storage/types/agents-messaging.d.ts +24 -0
- package/dist/src/storage/types/agents-messaging.d.ts.map +1 -1
- package/dist/src/storage/types/agents-messaging.js +1 -0
- package/dist/src/storage/types/agents-messaging.js.map +1 -1
- package/dist/src/storage/types/commerce.d.ts +6 -0
- package/dist/src/storage/types/commerce.d.ts.map +1 -1
- package/dist/src/storage/types/organisms-federation.d.ts +21 -0
- package/dist/src/storage/types/organisms-federation.d.ts.map +1 -1
- package/dist/src/storage/types/usage.d.ts +186 -0
- package/dist/src/storage/types/usage.d.ts.map +1 -0
- package/dist/src/storage/types/usage.js +24 -0
- package/dist/src/storage/types/usage.js.map +1 -0
- package/dist/src/utils/agent-footer.d.ts.map +1 -1
- package/dist/src/utils/agent-footer.js +1 -0
- package/dist/src/utils/agent-footer.js.map +1 -1
- package/dist/src/utils/app-content-type.d.ts +57 -3
- package/dist/src/utils/app-content-type.d.ts.map +1 -1
- package/dist/src/utils/app-content-type.js +81 -12
- package/dist/src/utils/app-content-type.js.map +1 -1
- package/dist/src/utils/env-config/sections-features.d.ts.map +1 -1
- package/dist/src/utils/env-config/sections-features.js +9 -3
- package/dist/src/utils/env-config/sections-features.js.map +1 -1
- package/dist/src/utils/file-download-headers.d.ts +5 -3
- package/dist/src/utils/file-download-headers.d.ts.map +1 -1
- package/dist/src/utils/file-download-headers.js +18 -5
- package/dist/src/utils/file-download-headers.js.map +1 -1
- package/dist/src/utils/http-range.d.ts +151 -0
- package/dist/src/utils/http-range.d.ts.map +1 -0
- package/dist/src/utils/http-range.js +190 -0
- package/dist/src/utils/http-range.js.map +1 -0
- package/dist/src/utils/page-head.d.ts +5 -0
- package/dist/src/utils/page-head.d.ts.map +1 -1
- package/dist/src/utils/page-head.js +10 -1
- package/dist/src/utils/page-head.js.map +1 -1
- package/dist/src/utils/reserved-keys.d.ts +4 -1
- package/dist/src/utils/reserved-keys.d.ts.map +1 -1
- package/dist/src/utils/reserved-keys.js +4 -1
- package/dist/src/utils/reserved-keys.js.map +1 -1
- package/dist/src/utils/scope-coverage.d.ts +21 -0
- package/dist/src/utils/scope-coverage.d.ts.map +1 -1
- package/dist/src/utils/scope-coverage.js +22 -1
- package/dist/src/utils/scope-coverage.js.map +1 -1
- package/dist/static/sdk-libs/datapackage/index.js +336 -0
- package/dist/static/sdk-libs/dist/aimeat-datapackage.js +305 -0
- package/package.json +13 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { logger } from '../../utils/logger.js';
|
|
2
|
+
/** How long raw stays queryable in the hot tables. */
|
|
3
|
+
const HOT_DAYS = Number(process.env.AIMEAT_USAGE_HOT_DAYS) || 90;
|
|
4
|
+
/** Hour-grain rollups are a live-dashboard resolution; the day grain carries the history. */
|
|
5
|
+
const HOUR_ROLLUP_DAYS = Number(process.env.AIMEAT_USAGE_HOUR_ROLLUP_DAYS) || 30;
|
|
6
|
+
const BATCH = Number(process.env.AIMEAT_USAGE_ARCHIVE_BATCH) || 2_000;
|
|
7
|
+
/** Sweeps per run. Bounded so one run cannot occupy the database for an unbounded time. */
|
|
8
|
+
const MAX_SWEEPS = 50;
|
|
9
|
+
function daysAgo(days) {
|
|
10
|
+
return new Date(Date.now() - days * 86_400_000).toISOString();
|
|
11
|
+
}
|
|
12
|
+
export async function runUsageArchiveJob(storage) {
|
|
13
|
+
const before = daysAgo(HOT_DAYS);
|
|
14
|
+
const pruneHourBefore = daysAgo(HOUR_ROLLUP_DAYS).slice(0, 13);
|
|
15
|
+
const total = { usageCalls: 0, usageEvents: 0, hourRollupsPruned: 0 };
|
|
16
|
+
for (let sweep = 0; sweep < MAX_SWEEPS; sweep++) {
|
|
17
|
+
const moved = await storage.archiveUsageRows({ before, pruneHourBefore, batch: BATCH });
|
|
18
|
+
total.usageCalls += moved.usageCalls;
|
|
19
|
+
total.usageEvents += moved.usageEvents;
|
|
20
|
+
total.hourRollupsPruned += moved.hourRollupsPruned;
|
|
21
|
+
// Nothing left to move. The hour prune is a single statement that runs on every sweep and is
|
|
22
|
+
// idempotent, so it is not part of the stop condition.
|
|
23
|
+
if (moved.usageCalls === 0 && moved.usageEvents === 0)
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
if (total.usageCalls > 0 || total.usageEvents > 0 || total.hourRollupsPruned > 0) {
|
|
27
|
+
logger.info('usage-archive: swept', {
|
|
28
|
+
hotDays: HOT_DAYS,
|
|
29
|
+
calls: total.usageCalls,
|
|
30
|
+
events: total.usageEvents,
|
|
31
|
+
hourRollupsPruned: total.hourRollupsPruned,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return total;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=archive-job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-job.js","sourceRoot":"","sources":["../../../../src/services/usage/archive-job.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,sDAAsD;AACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;AACjE,6FAA6F;AAC7F,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,IAAI,EAAE,CAAC;AACjF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,KAAK,CAAC;AACtE,2FAA2F;AAC3F,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAgB;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAuB,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IAE1F,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;QACrC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;QACvC,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,iBAAiB,CAAC;QACnD,6FAA6F;QAC7F,uDAAuD;QACvD,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC;YAAE,MAAM;IAC/D,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;QACjF,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAClC,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,KAAK,CAAC,UAAU;YACvB,MAAM,EAAE,KAAK,CAAC,WAAW;YACzB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;SAC3C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function recordAppOpen(args: {
|
|
2
|
+
/** The app author's identity as stored on the app record. */
|
|
3
|
+
appOwnerGaii: string;
|
|
4
|
+
filename: string;
|
|
5
|
+
/** The signed-in visitor, when there is one. */
|
|
6
|
+
viewer?: string | null;
|
|
7
|
+
}): void;
|
|
8
|
+
//# sourceMappingURL=record-app-open.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-app-open.d.ts","sourceRoot":"","sources":["../../../../src/services/usage/record-app-open.ts"],"names":[],"mappings":"AAqCA,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,GAAG,IAAI,CAeP"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/usage/record-app-open.ts
|
|
3
|
+
* @description Records that an app was opened, from the two places an app is actually served.
|
|
4
|
+
* Design: docs/internal/telemetria/02-design.md
|
|
5
|
+
*
|
|
6
|
+
* WHAT THIS REPLACES. `AppDownload.count` is one lifetime integer per app: it can say an app has
|
|
7
|
+
* been opened 4 000 times and can never say whether that was last week or last year, by two
|
|
8
|
+
* people or by two hundred. It stays (the catalogue shows it); this adds the dimensions that make
|
|
9
|
+
* "is this app alive" answerable.
|
|
10
|
+
*
|
|
11
|
+
* WHOSE CALL IT IS. `ownerGhii` is the VIEWER, because the question the owner cuts answer is
|
|
12
|
+
* "which apps does this person use". The app's author goes in `counterpartyGhii`, which is the
|
|
13
|
+
* same slot an exchange seller occupies, so an author reads their app's traffic through the same
|
|
14
|
+
* cut a capability provider reads theirs. An anonymous open carries no owner at all rather than
|
|
15
|
+
* being attributed to the author, which would make every public app look like its author's own use.
|
|
16
|
+
* @structure
|
|
17
|
+
* - recordAppOpen({ appOwnerGaii, filename, viewer })
|
|
18
|
+
* @usage
|
|
19
|
+
* recordAppOpen({ appOwnerGaii: app.ownerGaii, filename: app.filename, viewer: req.auth?.sub });
|
|
20
|
+
* @version-history
|
|
21
|
+
* v1.0.0 — 2026-08-14 — Initial: app opens become a measured, time-dimensioned surface.
|
|
22
|
+
*/
|
|
23
|
+
import { recordUsageCall } from './usage-buffer.js';
|
|
24
|
+
import { ownerGhiiOf } from '../../utils/gaii.js';
|
|
25
|
+
/** `undefined`, `''` and the literal 'anon' all mean nobody signed in. */
|
|
26
|
+
function isAnonymous(viewer) {
|
|
27
|
+
return !viewer || viewer === 'anon';
|
|
28
|
+
}
|
|
29
|
+
function actorKindOf(principal) {
|
|
30
|
+
if (principal.startsWith('eco:'))
|
|
31
|
+
return 'eco';
|
|
32
|
+
if (principal.includes('#'))
|
|
33
|
+
return 'agent';
|
|
34
|
+
return 'owner';
|
|
35
|
+
}
|
|
36
|
+
export function recordAppOpen(args) {
|
|
37
|
+
const anon = isAnonymous(args.viewer);
|
|
38
|
+
const viewer = anon ? '' : args.viewer;
|
|
39
|
+
recordUsageCall({
|
|
40
|
+
ownerGhii: anon ? '' : ownerGhiiOf(viewer),
|
|
41
|
+
actorGaii: viewer,
|
|
42
|
+
actorKind: anon ? 'anon' : actorKindOf(viewer),
|
|
43
|
+
surface: 'app',
|
|
44
|
+
// The app id everywhere else in the node: `owner/filename`. Same string in the coordinate and
|
|
45
|
+
// in appId, so a report can group by either without knowing which surface produced the row.
|
|
46
|
+
coordinate: `${ownerGhiiOf(args.appOwnerGaii).split('@')[0]}/${args.filename}`,
|
|
47
|
+
appId: `${ownerGhiiOf(args.appOwnerGaii).split('@')[0]}/${args.filename}`,
|
|
48
|
+
counterpartyGhii: ownerGhiiOf(args.appOwnerGaii),
|
|
49
|
+
outcome: 'ok',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=record-app-open.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-app-open.js","sourceRoot":"","sources":["../../../../src/services/usage/record-app-open.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,0EAA0E;AAC1E,SAAS,WAAW,CAAC,MAAsB;IACzC,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC;AACtC,CAAC;AAED,SAAS,WAAW,CAAC,SAAiB;IACpC,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAM7B;IACC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAgB,CAAC;IACjD,eAAe,CAAC;QACd,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;QAC1C,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;QAC9C,OAAO,EAAE,KAAK;QACd,8FAA8F;QAC9F,4FAA4F;QAC5F,UAAU,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;QAC9E,KAAK,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;QACzE,gBAAgB,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;QAChD,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/usage/rollup-cuts.ts
|
|
3
|
+
* @description THE EXTENSION POINT. A "cut" is one named dimension set the fold materialises, and
|
|
4
|
+
* adding a report to this system means adding an entry here plus a backfill. No migration, no
|
|
5
|
+
* repository method, no provider pair, no new route.
|
|
6
|
+
* Design: docs/internal/telemetria/02-design.md
|
|
7
|
+
*
|
|
8
|
+
* WHY DECLARED CUTS RATHER THAN EVERY COMBINATION. Nine dimensions crossed with each other is a
|
|
9
|
+
* row count nobody can reason about and an index nobody can use. Declaring the twenty slices the
|
|
10
|
+
* product actually asks for keeps the table bounded by real cardinality: the largest,
|
|
11
|
+
* call.owner.tool, is (active owners x tools they actually called) per day.
|
|
12
|
+
*
|
|
13
|
+
* WHY GRAINS ARE PER-CUT. Hour grain is for a live dashboard and multiplies a cut's rows by 24.
|
|
14
|
+
* Only the two cuts that back a live view carry it; the rest are day-only, and the archive job
|
|
15
|
+
* prunes hour rows at 30 days while day rows are kept indefinitely.
|
|
16
|
+
*
|
|
17
|
+
* ADDING A CUT: append it, then run POST /v1/admin/usage/rollup/rebuild so history exists for it.
|
|
18
|
+
* Without the rebuild the new cut is correct from today forward and empty before that, which
|
|
19
|
+
* looks exactly like "this feature was never used" on a chart.
|
|
20
|
+
* @structure
|
|
21
|
+
* - UsageDim / UsageCut / CUTS
|
|
22
|
+
* - cutsForStream(stream) · findCut(name)
|
|
23
|
+
* @usage
|
|
24
|
+
* import { CUTS, cutsForStream } from './rollup-cuts.js';
|
|
25
|
+
* @version-history
|
|
26
|
+
* v1.0.0 — 2026-08-14 — Initial: twenty cuts over the llm and call streams.
|
|
27
|
+
*/
|
|
28
|
+
/** The dimension columns a cut may key on. Every one exists on UsageRollup and defaults to ''. */
|
|
29
|
+
export type UsageDim = 'ownerGhii' | 'actorGaii' | 'appId' | 'model' | 'provider' | 'surface' | 'outcome' | 'coordinate' | 'counterpartyGhii';
|
|
30
|
+
export interface UsageCut {
|
|
31
|
+
/** Stable name, stored in the row. Renaming one orphans its history — add a new one instead. */
|
|
32
|
+
name: string;
|
|
33
|
+
/** Which raw stream feeds it. */
|
|
34
|
+
stream: 'llm' | 'call';
|
|
35
|
+
/** The dimensions this cut is keyed by. Everything else is rolled over and stored as ''. */
|
|
36
|
+
dims: UsageDim[];
|
|
37
|
+
grains: Array<'hour' | 'day'>;
|
|
38
|
+
/** What question this answers, so the list stays readable as it grows. */
|
|
39
|
+
answers: string;
|
|
40
|
+
}
|
|
41
|
+
export declare const CUTS: UsageCut[];
|
|
42
|
+
export declare function cutsForStream(stream: 'llm' | 'call'): UsageCut[];
|
|
43
|
+
export declare function findCut(name: string): UsageCut | undefined;
|
|
44
|
+
//# sourceMappingURL=rollup-cuts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollup-cuts.d.ts","sourceRoot":"","sources":["../../../../src/services/usage/rollup-cuts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,kGAAkG;AAClG,MAAM,MAAM,QAAQ,GAChB,WAAW,GACX,WAAW,GACX,OAAO,GACP,OAAO,GACP,UAAU,GACV,SAAS,GACT,SAAS,GACT,YAAY,GACZ,kBAAkB,CAAC;AAEvB,MAAM,WAAW,QAAQ;IACvB,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,4FAA4F;IAC5F,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAC9B,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,eAAO,MAAM,IAAI,EAAE,QAAQ,EAyC1B,CAAC;AAOF,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,EAAE,CAEhE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE1D"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/usage/rollup-cuts.ts
|
|
3
|
+
* @description THE EXTENSION POINT. A "cut" is one named dimension set the fold materialises, and
|
|
4
|
+
* adding a report to this system means adding an entry here plus a backfill. No migration, no
|
|
5
|
+
* repository method, no provider pair, no new route.
|
|
6
|
+
* Design: docs/internal/telemetria/02-design.md
|
|
7
|
+
*
|
|
8
|
+
* WHY DECLARED CUTS RATHER THAN EVERY COMBINATION. Nine dimensions crossed with each other is a
|
|
9
|
+
* row count nobody can reason about and an index nobody can use. Declaring the twenty slices the
|
|
10
|
+
* product actually asks for keeps the table bounded by real cardinality: the largest,
|
|
11
|
+
* call.owner.tool, is (active owners x tools they actually called) per day.
|
|
12
|
+
*
|
|
13
|
+
* WHY GRAINS ARE PER-CUT. Hour grain is for a live dashboard and multiplies a cut's rows by 24.
|
|
14
|
+
* Only the two cuts that back a live view carry it; the rest are day-only, and the archive job
|
|
15
|
+
* prunes hour rows at 30 days while day rows are kept indefinitely.
|
|
16
|
+
*
|
|
17
|
+
* ADDING A CUT: append it, then run POST /v1/admin/usage/rollup/rebuild so history exists for it.
|
|
18
|
+
* Without the rebuild the new cut is correct from today forward and empty before that, which
|
|
19
|
+
* looks exactly like "this feature was never used" on a chart.
|
|
20
|
+
* @structure
|
|
21
|
+
* - UsageDim / UsageCut / CUTS
|
|
22
|
+
* - cutsForStream(stream) · findCut(name)
|
|
23
|
+
* @usage
|
|
24
|
+
* import { CUTS, cutsForStream } from './rollup-cuts.js';
|
|
25
|
+
* @version-history
|
|
26
|
+
* v1.0.0 — 2026-08-14 — Initial: twenty cuts over the llm and call streams.
|
|
27
|
+
*/
|
|
28
|
+
const DAY = ['day'];
|
|
29
|
+
const LIVE = ['hour', 'day'];
|
|
30
|
+
export const CUTS = [
|
|
31
|
+
// ── LLM spend ──────────────────────────────────────────────────────────────────────────────
|
|
32
|
+
{ name: 'llm.node', stream: 'llm', dims: [], grains: LIVE,
|
|
33
|
+
answers: 'node-wide LLM spend over time' },
|
|
34
|
+
{ name: 'llm.owner', stream: 'llm', dims: ['ownerGhii'], grains: LIVE,
|
|
35
|
+
answers: 'per-user spend; the operator top-spenders list' },
|
|
36
|
+
{ name: 'llm.model', stream: 'llm', dims: ['model', 'provider'], grains: DAY,
|
|
37
|
+
answers: 'which models are used most, node-wide, and where they ran' },
|
|
38
|
+
{ name: 'llm.owner.model', stream: 'llm', dims: ['ownerGhii', 'model', 'provider'], grains: DAY,
|
|
39
|
+
answers: 'which models THIS person uses most' },
|
|
40
|
+
{ name: 'llm.actor', stream: 'llm', dims: ['ownerGhii', 'actorGaii'], grains: DAY,
|
|
41
|
+
answers: 'per-agent spend' },
|
|
42
|
+
{ name: 'llm.app', stream: 'llm', dims: ['appId'], grains: DAY,
|
|
43
|
+
answers: 'which app burns the most tokens, node-wide' },
|
|
44
|
+
{ name: 'llm.owner.app', stream: 'llm', dims: ['ownerGhii', 'appId'], grains: DAY,
|
|
45
|
+
answers: 'this person spend per app' },
|
|
46
|
+
{ name: 'llm.app.model', stream: 'llm', dims: ['appId', 'model', 'provider'], grains: DAY,
|
|
47
|
+
answers: 'which model an app actually calls — impossible before appId reached the ledger' },
|
|
48
|
+
// ── Calls ──────────────────────────────────────────────────────────────────────────────────
|
|
49
|
+
{ name: 'call.node', stream: 'call', dims: [], grains: LIVE,
|
|
50
|
+
answers: 'total call volume and error rate' },
|
|
51
|
+
{ name: 'call.owner', stream: 'call', dims: ['ownerGhii'], grains: LIVE,
|
|
52
|
+
answers: 'per-user activity' },
|
|
53
|
+
{ name: 'call.surface', stream: 'call', dims: ['surface', 'outcome'], grains: DAY,
|
|
54
|
+
answers: 'is MCP or the web carrying the work' },
|
|
55
|
+
{ name: 'call.owner.surface', stream: 'call', dims: ['ownerGhii', 'surface', 'outcome'], grains: DAY,
|
|
56
|
+
answers: 'how this person actually works' },
|
|
57
|
+
{ name: 'call.tool', stream: 'call', dims: ['surface', 'coordinate', 'outcome'], grains: DAY,
|
|
58
|
+
answers: 'which tool is used, which fails, which nobody has ever called' },
|
|
59
|
+
{ name: 'call.owner.tool', stream: 'call', dims: ['ownerGhii', 'surface', 'coordinate'], grains: DAY,
|
|
60
|
+
answers: 'the operator drill into one person tool use' },
|
|
61
|
+
{ name: 'call.app', stream: 'call', dims: ['appId', 'outcome'], grains: DAY,
|
|
62
|
+
answers: 'which app is alive' },
|
|
63
|
+
{ name: 'call.owner.app', stream: 'call', dims: ['ownerGhii', 'appId'], grains: DAY,
|
|
64
|
+
answers: 'who uses which app' },
|
|
65
|
+
{ name: 'call.actor', stream: 'call', dims: ['ownerGhii', 'actorGaii'], grains: DAY,
|
|
66
|
+
answers: 'per-agent and per-app-grant activity' },
|
|
67
|
+
{ name: 'call.provider.coordinate', stream: 'call',
|
|
68
|
+
dims: ['counterpartyGhii', 'coordinate', 'outcome'], grains: DAY,
|
|
69
|
+
answers: 'what a seller sold and what they refused; also an app author own traffic' },
|
|
70
|
+
];
|
|
71
|
+
const BY_STREAM = new Map([
|
|
72
|
+
['llm', CUTS.filter(c => c.stream === 'llm')],
|
|
73
|
+
['call', CUTS.filter(c => c.stream === 'call')],
|
|
74
|
+
]);
|
|
75
|
+
export function cutsForStream(stream) {
|
|
76
|
+
return BY_STREAM.get(stream) ?? [];
|
|
77
|
+
}
|
|
78
|
+
export function findCut(name) {
|
|
79
|
+
return CUTS.find(c => c.name === name);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=rollup-cuts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollup-cuts.js","sourceRoot":"","sources":["../../../../src/services/usage/rollup-cuts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/usage/rollup-engine.ts
|
|
3
|
+
* @description The fold: raw usage rows in, precomputed UsageRollup deltas out, incrementally and
|
|
4
|
+
* exactly once. Design: docs/internal/telemetria/02-design.md
|
|
5
|
+
*
|
|
6
|
+
* EXACTLY-ONCE IS ONE PROPERTY IN ONE PLACE. The deltas and the watermark that accounts for them
|
|
7
|
+
* commit together (storage.advanceUsageRollup). A crash before that commit replays the same rows;
|
|
8
|
+
* a crash after it continues past them. Neither double-counts. Everything else here — batching,
|
|
9
|
+
* pass caps, the fact projection — is bookkeeping around that one guarantee, and none of it is
|
|
10
|
+
* allowed to advance the cursor on its own.
|
|
11
|
+
*
|
|
12
|
+
* WHY A FACT IN THE MIDDLE. Each raw row becomes ONE fact carrying every dimension and every
|
|
13
|
+
* metric, and each cut then picks the dimensions it keys on. Without that step, twenty cuts means
|
|
14
|
+
* twenty places that each decide what "an error" is, and the day someone adds a metric, nineteen
|
|
15
|
+
* of them are still right and one is not.
|
|
16
|
+
* @structure
|
|
17
|
+
* - runUsageRollup(storage) -- fold both streams; returns what it processed
|
|
18
|
+
* - foldStream(storage, stream) -- one stream, bounded passes
|
|
19
|
+
* - factOfCall / factOfEvent -- raw row to fact
|
|
20
|
+
* - accumulate(facts) -- facts to deltas, per declared cut and grain
|
|
21
|
+
* @usage
|
|
22
|
+
* import { runUsageRollup } from './services/usage/rollup-engine.js';
|
|
23
|
+
* @version-history
|
|
24
|
+
* v1.0.0 — 2026-08-14 — Initial: incremental, transactional fold over the llm and call streams.
|
|
25
|
+
*/
|
|
26
|
+
import type { Storage, UsageCallRecord, UsageRollupDelta } from '../../storage/interface.js';
|
|
27
|
+
/**
|
|
28
|
+
* The deltas a read would be missing because the fold has not run yet: everything after the
|
|
29
|
+
* watermark, projected through the same cuts, plus the call rows still sitting in the write buffer.
|
|
30
|
+
*
|
|
31
|
+
* WHY A READ NEEDS THIS AT ALL. Without it the serving layer is up to one fold interval stale, and
|
|
32
|
+
* an operator who just watched a spend happen would open the dashboard and see nothing. "It will
|
|
33
|
+
* appear in five minutes" is not something a person accepts from a number they are accountable for.
|
|
34
|
+
*
|
|
35
|
+
* WHY IT IS NOT A SCAN. The tail is bounded by the fold interval, not by history: it reads from the
|
|
36
|
+
* watermark forward with a hard limit, on the same (ts, id) index the fold uses. A node that has
|
|
37
|
+
* been running for a year reads exactly as many rows here as one that started this morning.
|
|
38
|
+
*
|
|
39
|
+
* It reuses `accumulate`, so a top-up can never disagree with the fold about what a row means.
|
|
40
|
+
*/
|
|
41
|
+
export declare function pendingRollupDeltas(storage: Storage, stream: 'llm' | 'call', bufferedCalls?: UsageCallRecord[]): Promise<UsageRollupDelta[]>;
|
|
42
|
+
export interface FoldResult {
|
|
43
|
+
stream: 'llm' | 'call';
|
|
44
|
+
rows: number;
|
|
45
|
+
deltas: number;
|
|
46
|
+
passes: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Fold both streams. Called on a schedule; safe to call concurrently with itself only in the sense
|
|
50
|
+
* that the transaction protects correctness — a second overlapping run wastes work rather than
|
|
51
|
+
* corrupting anything, because it reads the cursor the first one has already advanced.
|
|
52
|
+
*/
|
|
53
|
+
export declare function runUsageRollup(storage: Storage): Promise<FoldResult[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Rebuild a bucket range from raw. Deletes the range first BECAUSE THE FOLD ADDS: re-folding onto
|
|
56
|
+
* existing rows would double every number in the window rather than correcting it. Then rewinds the
|
|
57
|
+
* cursors and lets the ordinary fold refill.
|
|
58
|
+
*
|
|
59
|
+
* Only reaches as far back as the hot window: raw older than that is in the archive, which this
|
|
60
|
+
* does not read. A rebuild across the archive boundary therefore produces a correct recent range
|
|
61
|
+
* and leaves the older buckets deleted, so the caller is given the boundary rather than discovering
|
|
62
|
+
* it as a hole in a chart.
|
|
63
|
+
*/
|
|
64
|
+
export declare function rebuildUsageRollup(storage: Storage, args: {
|
|
65
|
+
from: string;
|
|
66
|
+
grain?: 'hour' | 'day';
|
|
67
|
+
}): Promise<{
|
|
68
|
+
cleared: number;
|
|
69
|
+
folded: FoldResult[];
|
|
70
|
+
}>;
|
|
71
|
+
//# sourceMappingURL=rollup-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollup-engine.d.ts","sourceRoot":"","sources":["../../../../src/services/usage/rollup-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EACV,OAAO,EAAE,eAAe,EAAmB,gBAAgB,EAC5D,MAAM,4BAA4B,CAAC;AAgKpC;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,KAAK,GAAG,MAAM,EACtB,aAAa,GAAE,eAAe,EAAO,GACpC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAc7B;AAED,MAAM,WAAW,UAAU;IAAG,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAsCpG;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAwB5E;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CAAE,GAC7C,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC,CASpD"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { logger } from '../../utils/logger.js';
|
|
2
|
+
import { cutsForStream } from './rollup-cuts.js';
|
|
3
|
+
/** Raw rows per pass. Small enough that one transaction stays short, large enough to catch up. */
|
|
4
|
+
const BATCH = Number(process.env.AIMEAT_USAGE_ROLLUP_BATCH) || 5_000;
|
|
5
|
+
/** Passes per run, so one run is bounded even after a long outage. The next run continues. */
|
|
6
|
+
const MAX_PASSES = Number(process.env.AIMEAT_USAGE_ROLLUP_PASSES) || 20;
|
|
7
|
+
/**
|
|
8
|
+
* The separator inside an in-memory grouping key. A dimension value can contain a space, a slash or
|
|
9
|
+
* a colon (`apptool:alice/app.html`, an owner GHII, a model id), so a printable separator would let
|
|
10
|
+
* two DIFFERENT dimension tuples collide into one bucket and silently merge two rows' numbers. A
|
|
11
|
+
* control character cannot appear in any of them. Written as an escape rather than a literal, so it
|
|
12
|
+
* stays visible in an editor and the file stays text to grep.
|
|
13
|
+
*/
|
|
14
|
+
const DIM_SEPARATOR = '\u0000';
|
|
15
|
+
function factOfCall(r) {
|
|
16
|
+
return {
|
|
17
|
+
ts: r.ts,
|
|
18
|
+
ownerGhii: r.ownerGhii,
|
|
19
|
+
actorGaii: r.actorGaii,
|
|
20
|
+
appId: r.appId,
|
|
21
|
+
model: '', provider: '',
|
|
22
|
+
surface: r.surface,
|
|
23
|
+
outcome: r.outcome,
|
|
24
|
+
coordinate: r.coordinate,
|
|
25
|
+
counterpartyGhii: r.counterpartyGhii,
|
|
26
|
+
calls: 1,
|
|
27
|
+
// A refusal is the system working and an error is it failing. Counted apart on purpose: a
|
|
28
|
+
// refusal is a demand signal, an error is a defect, and one number covering both is useless
|
|
29
|
+
// for either.
|
|
30
|
+
errors: r.outcome === 'error' ? 1 : 0,
|
|
31
|
+
refusals: r.outcome === 'refused' ? 1 : 0,
|
|
32
|
+
tokensIn: 0, tokensOut: 0, costUsd: 0, unpricedCalls: 0,
|
|
33
|
+
chargedUnits: r.chargedUnits,
|
|
34
|
+
durationMs: r.durationMs,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function factOfEvent(e) {
|
|
38
|
+
return {
|
|
39
|
+
ts: e.ts,
|
|
40
|
+
ownerGhii: e.ownerGhii,
|
|
41
|
+
actorGaii: e.agentGaii,
|
|
42
|
+
appId: e.appId ?? '',
|
|
43
|
+
model: e.model,
|
|
44
|
+
provider: e.provider,
|
|
45
|
+
surface: e.surface ?? '',
|
|
46
|
+
outcome: 'ok',
|
|
47
|
+
coordinate: '',
|
|
48
|
+
// On a capability call the consumer is the other party; on an ordinary call there is none.
|
|
49
|
+
counterpartyGhii: e.consumerGhii ?? '',
|
|
50
|
+
calls: 1,
|
|
51
|
+
errors: 0, refusals: 0,
|
|
52
|
+
tokensIn: e.promptTokens,
|
|
53
|
+
tokensOut: e.completionTokens,
|
|
54
|
+
// null cost is NOT zero. It is a price we did not have, kept visible in its own counter rather
|
|
55
|
+
// than silently averaged into a total that would then understate what the node actually spent.
|
|
56
|
+
costUsd: e.costUsd ?? 0,
|
|
57
|
+
unpricedCalls: e.costUsd === null ? 1 : 0,
|
|
58
|
+
chargedUnits: 0,
|
|
59
|
+
durationMs: 0,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** '2026-08-14' or '2026-08-14T13'. Both sort chronologically as plain text. */
|
|
63
|
+
function bucketOf(ts, grain) {
|
|
64
|
+
return grain === 'day' ? ts.slice(0, 10) : ts.slice(0, 13);
|
|
65
|
+
}
|
|
66
|
+
/** The dimension values this cut keys on; everything outside the cut is '' (rolled over). */
|
|
67
|
+
function dimsFor(cut, fact) {
|
|
68
|
+
const out = {
|
|
69
|
+
ownerGhii: '', actorGaii: '', appId: '', model: '', provider: '',
|
|
70
|
+
surface: '', outcome: '', coordinate: '', counterpartyGhii: '',
|
|
71
|
+
};
|
|
72
|
+
for (const d of cut.dims)
|
|
73
|
+
out[d] = fact[d];
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Turn facts into one delta per (cut, grain, bucket, dimension tuple). All in memory: a batch is
|
|
78
|
+
* bounded, and doing it here means the database sees one upsert per distinct key rather than one
|
|
79
|
+
* per raw row.
|
|
80
|
+
*/
|
|
81
|
+
function accumulate(facts, stream) {
|
|
82
|
+
const buckets = new Map();
|
|
83
|
+
for (const fact of facts) {
|
|
84
|
+
for (const cut of cutsForStream(stream)) {
|
|
85
|
+
const dims = dimsFor(cut, fact);
|
|
86
|
+
for (const grain of cut.grains) {
|
|
87
|
+
const bucket = bucketOf(fact.ts, grain);
|
|
88
|
+
const key = [cut.name, grain, bucket, dims.ownerGhii, dims.actorGaii, dims.appId,
|
|
89
|
+
dims.model, dims.provider, dims.surface, dims.outcome, dims.coordinate,
|
|
90
|
+
dims.counterpartyGhii].join(DIM_SEPARATOR);
|
|
91
|
+
let entry = buckets.get(key);
|
|
92
|
+
if (!entry) {
|
|
93
|
+
entry = {
|
|
94
|
+
delta: {
|
|
95
|
+
cut: cut.name, grain, bucket, ...dims,
|
|
96
|
+
calls: 0, errors: 0, refusals: 0, tokensIn: 0, tokensOut: 0, costUsd: 0,
|
|
97
|
+
unpricedCalls: 0, chargedUnits: 0, durationMsSum: 0, durationMsMax: 0, actorsSeen: 0,
|
|
98
|
+
},
|
|
99
|
+
actors: new Set(),
|
|
100
|
+
};
|
|
101
|
+
buckets.set(key, entry);
|
|
102
|
+
}
|
|
103
|
+
const d = entry.delta;
|
|
104
|
+
d.calls += fact.calls;
|
|
105
|
+
d.errors += fact.errors;
|
|
106
|
+
d.refusals += fact.refusals;
|
|
107
|
+
d.tokensIn += fact.tokensIn;
|
|
108
|
+
d.tokensOut += fact.tokensOut;
|
|
109
|
+
d.costUsd += fact.costUsd;
|
|
110
|
+
d.unpricedCalls += fact.unpricedCalls;
|
|
111
|
+
d.chargedUnits += fact.chargedUnits;
|
|
112
|
+
d.durationMsSum += fact.durationMs;
|
|
113
|
+
if (fact.durationMs > d.durationMsMax)
|
|
114
|
+
d.durationMsMax = fact.durationMs;
|
|
115
|
+
if (fact.actorGaii)
|
|
116
|
+
entry.actors.add(fact.actorGaii);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Distinct within THIS batch only. Across batches the storage layer adds, so the stored number
|
|
121
|
+
// undercounts an actor active in two batches. That is why it is called actorsSeen rather than
|
|
122
|
+
// actors, is served with the caveat attached, and is never used for billing.
|
|
123
|
+
return [...buckets.values()].map(b => ({ ...b.delta, actorsSeen: b.actors.size }));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The deltas a read would be missing because the fold has not run yet: everything after the
|
|
127
|
+
* watermark, projected through the same cuts, plus the call rows still sitting in the write buffer.
|
|
128
|
+
*
|
|
129
|
+
* WHY A READ NEEDS THIS AT ALL. Without it the serving layer is up to one fold interval stale, and
|
|
130
|
+
* an operator who just watched a spend happen would open the dashboard and see nothing. "It will
|
|
131
|
+
* appear in five minutes" is not something a person accepts from a number they are accountable for.
|
|
132
|
+
*
|
|
133
|
+
* WHY IT IS NOT A SCAN. The tail is bounded by the fold interval, not by history: it reads from the
|
|
134
|
+
* watermark forward with a hard limit, on the same (ts, id) index the fold uses. A node that has
|
|
135
|
+
* been running for a year reads exactly as many rows here as one that started this morning.
|
|
136
|
+
*
|
|
137
|
+
* It reuses `accumulate`, so a top-up can never disagree with the fold about what a row means.
|
|
138
|
+
*/
|
|
139
|
+
export async function pendingRollupDeltas(storage, stream, bufferedCalls = []) {
|
|
140
|
+
const cursor = await storage.getUsageCursor(stream);
|
|
141
|
+
const lastTs = cursor?.lastTs ?? '';
|
|
142
|
+
const lastId = cursor?.lastId ?? '';
|
|
143
|
+
const raw = stream === 'call'
|
|
144
|
+
? await storage.listUsageCallsForFold({ lastTs, lastId, limit: BATCH })
|
|
145
|
+
: await storage.listUsageEventsForFold({ lastTs, lastId, limit: BATCH });
|
|
146
|
+
const facts = stream === 'call'
|
|
147
|
+
? [...raw, ...bufferedCalls].map(factOfCall)
|
|
148
|
+
: raw.map(factOfEvent);
|
|
149
|
+
if (facts.length === 0)
|
|
150
|
+
return [];
|
|
151
|
+
return accumulate(facts, stream);
|
|
152
|
+
}
|
|
153
|
+
/** Fold one stream forward from its watermark, in bounded passes. */
|
|
154
|
+
async function foldStream(storage, stream) {
|
|
155
|
+
const cursor = await storage.getUsageCursor(stream);
|
|
156
|
+
let lastTs = cursor?.lastTs ?? '';
|
|
157
|
+
let lastId = cursor?.lastId ?? '';
|
|
158
|
+
let rows = 0, deltas = 0, passes = 0;
|
|
159
|
+
for (; passes < MAX_PASSES; passes++) {
|
|
160
|
+
const raw = stream === 'call'
|
|
161
|
+
? await storage.listUsageCallsForFold({ lastTs, lastId, limit: BATCH })
|
|
162
|
+
: await storage.listUsageEventsForFold({ lastTs, lastId, limit: BATCH });
|
|
163
|
+
if (raw.length === 0)
|
|
164
|
+
break;
|
|
165
|
+
const facts = stream === 'call'
|
|
166
|
+
? raw.map(factOfCall)
|
|
167
|
+
: raw.map(factOfEvent);
|
|
168
|
+
const batchDeltas = accumulate(facts, stream);
|
|
169
|
+
// The last row IN THE ORDER THE QUERY RETURNED, which is (ts, id) ascending. Taking a maximum
|
|
170
|
+
// by ts alone would skip the tail of a tied timestamp on the next pass.
|
|
171
|
+
const last = raw[raw.length - 1];
|
|
172
|
+
await storage.advanceUsageRollup({ stream, deltas: batchDeltas, lastTs: last.ts, lastId: last.id });
|
|
173
|
+
lastTs = last.ts;
|
|
174
|
+
lastId = last.id;
|
|
175
|
+
rows += raw.length;
|
|
176
|
+
deltas += batchDeltas.length;
|
|
177
|
+
// A short batch means the stream is caught up. Stopping here rather than issuing one more empty
|
|
178
|
+
// query is the difference between a quiet node doing one read per run and doing two.
|
|
179
|
+
if (raw.length < BATCH) {
|
|
180
|
+
passes++;
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { stream, rows, deltas, passes };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Fold both streams. Called on a schedule; safe to call concurrently with itself only in the sense
|
|
188
|
+
* that the transaction protects correctness — a second overlapping run wastes work rather than
|
|
189
|
+
* corrupting anything, because it reads the cursor the first one has already advanced.
|
|
190
|
+
*/
|
|
191
|
+
export async function runUsageRollup(storage) {
|
|
192
|
+
const results = [];
|
|
193
|
+
for (const stream of ['llm', 'call']) {
|
|
194
|
+
try {
|
|
195
|
+
const r = await foldStream(storage, stream);
|
|
196
|
+
results.push(r);
|
|
197
|
+
if (r.rows > 0) {
|
|
198
|
+
logger.info('usage-rollup: folded', {
|
|
199
|
+
stream, rows: r.rows, deltas: r.deltas, passes: r.passes,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
if (r.passes >= MAX_PASSES) {
|
|
203
|
+
// Not an error: the cap did its job. Worth saying, because it means the serving layer is
|
|
204
|
+
// further behind than the run interval suggests and someone reading a chart should know.
|
|
205
|
+
logger.warn('usage-rollup: hit the pass cap, still catching up', { stream, rows: r.rows });
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
// One stream failing must not stop the other, and neither may advance a cursor it did not
|
|
210
|
+
// account for — which advanceUsageRollup guarantees, so there is nothing to undo here.
|
|
211
|
+
logger.warn('usage-rollup: stream failed, cursor unchanged', { stream, error: String(err) });
|
|
212
|
+
results.push({ stream, rows: 0, deltas: 0, passes: 0 });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return results;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Rebuild a bucket range from raw. Deletes the range first BECAUSE THE FOLD ADDS: re-folding onto
|
|
219
|
+
* existing rows would double every number in the window rather than correcting it. Then rewinds the
|
|
220
|
+
* cursors and lets the ordinary fold refill.
|
|
221
|
+
*
|
|
222
|
+
* Only reaches as far back as the hot window: raw older than that is in the archive, which this
|
|
223
|
+
* does not read. A rebuild across the archive boundary therefore produces a correct recent range
|
|
224
|
+
* and leaves the older buckets deleted, so the caller is given the boundary rather than discovering
|
|
225
|
+
* it as a hole in a chart.
|
|
226
|
+
*/
|
|
227
|
+
export async function rebuildUsageRollup(storage, args) {
|
|
228
|
+
const cleared = await storage.clearUsageRollupRange({ from: args.from, grain: args.grain });
|
|
229
|
+
// Rewind to the START of the day being rebuilt, not to the bucket string: the cursor compares
|
|
230
|
+
// against an ISO timestamp, and '2026-08-14' sorts before every '2026-08-14T..' on that day.
|
|
231
|
+
const rewindTo = `${args.from.slice(0, 10)}T00:00:00.000Z`;
|
|
232
|
+
await storage.setUsageCursor('llm', rewindTo, '');
|
|
233
|
+
await storage.setUsageCursor('call', rewindTo, '');
|
|
234
|
+
const folded = await runUsageRollup(storage);
|
|
235
|
+
return { cleared, folded };
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=rollup-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollup-engine.js","sourceRoot":"","sources":["../../../../src/services/usage/rollup-engine.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAgC,MAAM,kBAAkB,CAAC;AAE/E,kGAAkG;AAClG,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,KAAK,CAAC;AACrE,8FAA8F;AAC9F,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,aAAa,GAAG,QAAQ,CAAC;AAyB/B,SAAS,UAAU,CAAC,CAAkB;IACpC,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;QACvB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;QACpC,KAAK,EAAE,CAAC;QACR,0FAA0F;QAC1F,4FAA4F;QAC5F,cAAc;QACd,MAAM,EAAE,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,QAAQ,EAAE,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC;QACvD,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,UAAU,EAAE,CAAC,CAAC,UAAU;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,CAAkB;IACrC,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;QACpB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;QACxB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,EAAE;QACd,2FAA2F;QAC3F,gBAAgB,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE;QACtC,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;QACtB,QAAQ,EAAE,CAAC,CAAC,YAAY;QACxB,SAAS,EAAE,CAAC,CAAC,gBAAgB;QAC7B,+FAA+F;QAC/F,+FAA+F;QAC/F,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC;QACvB,aAAa,EAAE,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;KACd,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,QAAQ,CAAC,EAAU,EAAE,KAAqB;IACjD,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,6FAA6F;AAC7F,SAAS,OAAO,CAAC,GAAa,EAAE,IAAU;IACxC,MAAM,GAAG,GAA6B;QACpC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;QAChE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE;KAC/D,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC;AACb,CAAC;AAKD;;;;GAIG;AACH,SAAS,UAAU,CAAC,KAAa,EAAE,MAAsB;IACvD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACxC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK;oBAC9E,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU;oBACtE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAE7C,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,KAAK,GAAG;wBACN,KAAK,EAAE;4BACL,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;4BACrC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;4BACvE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;yBACrF;wBACD,MAAM,EAAE,IAAI,GAAG,EAAU;qBAC1B,CAAC;oBACF,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC1B,CAAC;gBAED,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;gBACtB,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;gBACtB,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;gBACxB,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;gBAC5B,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;gBAC5B,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;gBAC9B,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;gBAC1B,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC;gBACtC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC;gBACpC,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC;gBACnC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,aAAa;oBAAE,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC;gBACzE,IAAI,IAAI,CAAC,SAAS;oBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,+FAA+F;IAC/F,8FAA8F;IAC9F,6EAA6E;IAC7E,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACrF,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAgB,EAChB,MAAsB,EACtB,gBAAmC,EAAE;IAErC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;IAEpC,MAAM,GAAG,GAAG,MAAM,KAAK,MAAM;QAC3B,CAAC,CAAC,MAAM,OAAO,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACvE,CAAC,CAAC,MAAM,OAAO,CAAC,sBAAsB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3E,MAAM,KAAK,GAAG,MAAM,KAAK,MAAM;QAC7B,CAAC,CAAC,CAAC,GAAI,GAAyB,EAAE,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;QACnE,CAAC,CAAE,GAAyB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAID,qEAAqE;AACrE,KAAK,UAAU,UAAU,CAAC,OAAgB,EAAE,MAAsB;IAChE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;IAClC,IAAI,IAAI,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IAErC,OAAO,MAAM,GAAG,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,KAAK,MAAM;YAC3B,CAAC,CAAC,MAAM,OAAO,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YACvE,CAAC,CAAC,MAAM,OAAO,CAAC,sBAAsB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAE5B,MAAM,KAAK,GAAG,MAAM,KAAK,MAAM;YAC7B,CAAC,CAAE,GAAyB,CAAC,GAAG,CAAC,UAAU,CAAC;YAC5C,CAAC,CAAE,GAAyB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE9C,8FAA8F;QAC9F,wEAAwE;QACxE,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAA+B,CAAC;QAC/D,MAAM,OAAO,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAEpG,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QACjB,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC;QACnB,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC;QAE7B,gGAAgG;QAChG,qFAAqF;QACrF,IAAI,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YAAC,MAAM,EAAE,CAAC;YAAC,MAAM;QAAC,CAAC;IAC9C,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB;IACnD,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,CAAU,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;oBAClC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM;iBACzD,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;gBAC3B,yFAAyF;gBACzF,yFAAyF;gBACzF,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,0FAA0F;YAC1F,uFAAuF;YACvF,MAAM,CAAC,IAAI,CAAC,+CAA+C,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7F,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAgB,EAChB,IAA8C;IAE9C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5F,8FAA8F;IAC9F,6FAA6F;IAC7F,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC;IAC3D,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Storage, UsageCallRecord, UsageCallInput, UsageCallFilter } from '../../storage/interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Buffer one call. Never throws and never blocks: a door records what happened and gets on with
|
|
4
|
+
* answering the request.
|
|
5
|
+
*/
|
|
6
|
+
export declare function recordUsageCall(input: UsageCallInput): void;
|
|
7
|
+
/**
|
|
8
|
+
* The unflushed tail, filtered the same way `listUsageCalls` filters storage. Reader and writer
|
|
9
|
+
* share a process, so there is no reason to make an operator wait out a flush interval to see a
|
|
10
|
+
* call that has already happened: an empty view they cannot explain is what makes a UI look broken.
|
|
11
|
+
*/
|
|
12
|
+
export declare function pendingUsageCalls(filter: UsageCallFilter): UsageCallRecord[];
|
|
13
|
+
/**
|
|
14
|
+
* Write the buffer out. Snapshot-and-clear up front so calls arriving mid-flush accumulate for the
|
|
15
|
+
* next window. At-most-once by choice: a failed write drops that window rather than risking a
|
|
16
|
+
* double count, which matches what this stream is for.
|
|
17
|
+
*/
|
|
18
|
+
export declare function flushUsageBuffer(): Promise<void>;
|
|
19
|
+
/** Wire storage and start the flush interval. Idempotent. */
|
|
20
|
+
export declare function initUsageBuffer(storage: Storage): void;
|
|
21
|
+
/** Stop the interval and perform one final flush. Called from graceful shutdown. */
|
|
22
|
+
export declare function shutdownUsageBuffer(): Promise<void>;
|
|
23
|
+
/** Test seam: drop everything in flight. Not used by the running node. */
|
|
24
|
+
export declare function resetUsageBuffer(): void;
|
|
25
|
+
//# sourceMappingURL=usage-buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-buffer.d.ts","sourceRoot":"","sources":["../../../../src/services/usage/usage-buffer.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAmB5G;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAiC3D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,EAAE,CAS5E;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsBtD;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAMtD;AAED,oFAAoF;AACpF,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMzD;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
|