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
|
@@ -11,33 +11,91 @@
|
|
|
11
11
|
* two of the unprotected ones were a cross-owner authorization list and a payout address with a
|
|
12
12
|
* Stripe secret beside it.
|
|
13
13
|
*
|
|
14
|
+
* WHY THE KEY EXPRESSION IS RESOLVED RATHER THAN MATCHED. Both keys the audit found by hand are
|
|
15
|
+
* invisible to a scan that only reads inline string literals. `finance.accountants` (H-6) sits in
|
|
16
|
+
* a module constant and reaches storage through a two-line helper that takes the key as a
|
|
17
|
+
* parameter; `commerce.psp` (H-23) is inline in five places and behind `PSP_KEY` in a sixth. So
|
|
18
|
+
* this script resolves the key ARGUMENT: a literal, a module constant (local or imported), a
|
|
19
|
+
* key-builder function returning a template with a literal prefix, or a helper that took the key as
|
|
20
|
+
* a parameter, in which case the judgement moves up to the call site where the constant is spelled.
|
|
21
|
+
* What it still cannot resolve it COUNTS and prints, because the honest measure of a scanner is how
|
|
22
|
+
* blind it admits to being.
|
|
23
|
+
*
|
|
24
|
+
* A PREFIX SCAN IS A READ. `listAllMemory({ prefix: 'bensplit.' })` walks EVERY owner's namespace
|
|
25
|
+
* and the server pays out on what it finds, so a prefix carries the same weight here as a key.
|
|
26
|
+
*
|
|
14
27
|
* Ratchet, not a wall: seeded with today's reads, so the gate fails only on a NEW unprotected key.
|
|
28
|
+
* An exemption carries prose saying why the key is not server-trusted configuration. A reason is
|
|
29
|
+
* the entire point of the file: "the server reads this and it is fine" is a claim, and the two the
|
|
30
|
+
* audit found were keys where nobody had ever made it. An empty reason therefore fails the gate,
|
|
31
|
+
* and a reason that begins with UNREVIEWED counts as backlog rather than as a claim.
|
|
15
32
|
* @structure
|
|
16
|
-
* -
|
|
17
|
-
* -
|
|
33
|
+
* - stripComments / collectKeyConstants / collectKeyBuilders / scanForwarders: resolution tables
|
|
34
|
+
* - splitCallArgs + resolveKeyExpression: what key does this read actually ask for
|
|
35
|
+
* - scanSources(): the pure scan (getMemory, the list calls, and the forwarder call sites)
|
|
36
|
+
* - validateReasons(): empty reason fails, UNREVIEWED counts as debt
|
|
37
|
+
* - main(): compare against security/trusted-key-exemptions.json; --strict gates; --seed merges
|
|
18
38
|
* @usage
|
|
19
|
-
* cd aimeat && pnpm check:trusted-keys
|
|
20
|
-
* cd aimeat && pnpm check:trusted-keys
|
|
21
|
-
* cd aimeat && pnpm check:trusted-keys
|
|
39
|
+
* cd aimeat && pnpm check:trusted-keys:report # the backlog, without gating
|
|
40
|
+
* cd aimeat && pnpm check:trusted-keys # the hook/CI gate (--strict)
|
|
41
|
+
* cd aimeat && pnpm check:trusted-keys:seed # merge today's reads into the exemption file
|
|
42
|
+
* ... --root <dir> # scan a fixture tree instead of this one
|
|
22
43
|
* @version-history
|
|
44
|
+
* v2.0.0 — 2026-08-14 — The gate finds the keys the audit found by hand. Each change has its own
|
|
45
|
+
* failing case in test/unit/check-trusted-keys.test.ts: the key argument is RESOLVED through
|
|
46
|
+
* module constants, key builders and key-forwarding helpers (v1 saw inline literals only, so H-6
|
|
47
|
+
* finance.accountants was invisible to it); prefix scans count as reads, which is how the
|
|
48
|
+
* revenue-split and entitlement keys became visible; the scan covers the whole server rather than
|
|
49
|
+
* four directories, since middleware and auth read memory too; and an exemption with an empty
|
|
50
|
+
* reason now fails, which is the difference between a written claim and a filed key name.
|
|
51
|
+
* Comments are stripped first, so a docblock example is no longer a finding, and a scan that
|
|
52
|
+
* matched no files at all is an error rather than a pass. Re-seeded: 36 reads / 12 distinct keys
|
|
53
|
+
* became 231 reads / 62 distinct keys, of which 153 were invisible to v1, and all 124 entries
|
|
54
|
+
* carry the UNREVIEWED marker because nobody has yet judged any of them.
|
|
23
55
|
* v1.0.0 — 2026-08-10 — Initial (August 2026 audit, systemic pattern 3).
|
|
24
56
|
*/
|
|
25
57
|
import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from 'node:fs';
|
|
26
|
-
import { join, relative } from 'node:path';
|
|
58
|
+
import { join, relative, resolve } from 'node:path';
|
|
59
|
+
import { fileURLToPath } from 'node:url';
|
|
27
60
|
import { RESERVED_OWNER_KEY_PREFIXES } from '../src/utils/reserved-keys.js';
|
|
28
|
-
|
|
29
|
-
|
|
61
|
+
/**
|
|
62
|
+
* The tree to scan: the working directory, which `pnpm check:trusted-keys` sets to the package, or
|
|
63
|
+
* `--root <dir>`. The flag exists so the whole gate can be run against a miniature fixture tree, and
|
|
64
|
+
* that is how its failing cases are proven without writing a probe into the real src/ while other
|
|
65
|
+
* work is in flight. A run that finds no files at all is an error rather than a pass.
|
|
66
|
+
*/
|
|
67
|
+
const rootFlag = process.argv.indexOf('--root');
|
|
68
|
+
const ROOT = rootFlag > 0 && process.argv[rootFlag + 1] ? resolve(process.argv[rootFlag + 1]) : process.cwd();
|
|
69
|
+
const SRC = join(ROOT, 'src');
|
|
70
|
+
/**
|
|
71
|
+
* Directories under src/ that are not the server acting on data: the storage providers ARE the
|
|
72
|
+
* memory implementation (every read in them is the mechanism, not a decision), and generated,
|
|
73
|
+
* static and data are outputs and fixtures. Everything else is in scope, including middleware and
|
|
74
|
+
* auth, because "does the server change what it does because of this value" is not a question only
|
|
75
|
+
* four directories can answer.
|
|
76
|
+
*/
|
|
77
|
+
const SKIP_DIRS = ['storage', 'generated', 'static', 'data', 'types', 'schemas'];
|
|
30
78
|
const EXEMPTIONS = join(ROOT, 'security', 'trusted-key-exemptions.json');
|
|
31
79
|
/** Identities no owner-scoped principal can address, so a key under one is already out of reach. */
|
|
32
80
|
const SYSTEM_IDENTITIES = ['__network_policy__', 'SITE_OWNER_GAII', '__genesis__', 'system@', '__system__'];
|
|
33
|
-
|
|
81
|
+
/** Marker that turns an exemption into countable debt instead of a claim someone stands behind. */
|
|
82
|
+
const UNREVIEWED = 'UNREVIEWED';
|
|
83
|
+
/**
|
|
84
|
+
* Shortest thing that can carry a reason. "ok", "user data" and "fine" are not reasons; they are the
|
|
85
|
+
* same silence the file exists to prevent, typed out. The number is arbitrary and its job is only to
|
|
86
|
+
* make the shortest possible dodge cost more than writing the sentence.
|
|
87
|
+
*/
|
|
88
|
+
const MIN_REASON = 25;
|
|
89
|
+
function walk(dir, out = [], depth = 0) {
|
|
34
90
|
if (!existsSync(dir))
|
|
35
91
|
return out;
|
|
36
92
|
for (const entry of readdirSync(dir)) {
|
|
93
|
+
if (depth === 0 && SKIP_DIRS.includes(entry))
|
|
94
|
+
continue;
|
|
37
95
|
const full = join(dir, entry);
|
|
38
96
|
if (statSync(full).isDirectory())
|
|
39
|
-
walk(full, out);
|
|
40
|
-
else if (entry.endsWith('.ts'))
|
|
97
|
+
walk(full, out, depth + 1);
|
|
98
|
+
else if (entry.endsWith('.ts') && !entry.endsWith('.d.ts'))
|
|
41
99
|
out.push(full);
|
|
42
100
|
}
|
|
43
101
|
return out;
|
|
@@ -46,61 +104,446 @@ function walk(dir, out = []) {
|
|
|
46
104
|
function isReserved(key) {
|
|
47
105
|
return RESERVED_OWNER_KEY_PREFIXES.some(p => key.startsWith(p));
|
|
48
106
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
107
|
+
/**
|
|
108
|
+
* Blanks comments while keeping every byte's position, so line numbers stay honest and a docblock
|
|
109
|
+
* showing `storage.getMemory(sellerGhii, appToolsKey(appId))` as an example stops being a finding.
|
|
110
|
+
*/
|
|
111
|
+
export function stripComments(source) {
|
|
112
|
+
const blank = (m) => m.replace(/[^\n]/g, ' ');
|
|
113
|
+
return source
|
|
114
|
+
.replace(/\/\*[\s\S]*?\*\//g, blank)
|
|
115
|
+
.replace(/(^|[^:])\/\/[^\n]*/g, (m, lead) => lead + blank(m.slice(lead.length)));
|
|
116
|
+
}
|
|
117
|
+
/** A key-shaped string: no whitespace, no path separators, short enough to be an address. */
|
|
118
|
+
function isKeyish(value) {
|
|
119
|
+
return value.length > 0 && value.length <= 120 && /^[A-Za-z0-9_.:@#$%|~-]+$/.test(value);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* `const ACCOUNTANTS_KEY = 'finance.accountants'` and its `export` form, which is how the H-6 key
|
|
123
|
+
* was written and why the first version of this gate never saw it.
|
|
124
|
+
*/
|
|
125
|
+
export function collectKeyConstants(source, exportedOnly = false) {
|
|
126
|
+
const out = new Map();
|
|
127
|
+
const re = exportedOnly
|
|
128
|
+
? /(?:^|[;{}\n])\s*export\s+const\s+([A-Za-z_$][\w$]*)\s*(?::\s*string\s*)?=\s*(['"`])([^'"`\n]*?)(?:\$\{|\2)/g
|
|
129
|
+
: /(?:^|[;{}\n])\s*(?:export\s+)?const\s+([A-Za-z_$][\w$]*)\s*(?::\s*string\s*)?=\s*(['"`])([^'"`\n]*?)(?:\$\{|\2)/g;
|
|
130
|
+
let m;
|
|
131
|
+
while ((m = re.exec(source))) {
|
|
132
|
+
const [, name, , value] = m;
|
|
133
|
+
if (isKeyish(value))
|
|
134
|
+
out.set(name, value);
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Key builders: `const holdKey = (id: string) => \`commerce.hold.${id}\`` and the `function` form.
|
|
140
|
+
* Only the literal prefix is taken, which is all a prefix denylist needs anyway.
|
|
141
|
+
*/
|
|
142
|
+
export function collectKeyBuilders(source, exportedOnly = false) {
|
|
143
|
+
const out = new Map();
|
|
144
|
+
const lead = exportedOnly ? 'export\\s+' : '(?:export\\s+)?';
|
|
145
|
+
const arrow = new RegExp(`${lead}const\\s+([A-Za-z_$][\\w$]*)\\s*(?::[^=\\n]*)?=\\s*\\(?[^)=\\n]*\\)?\\s*(?::\\s*string\\s*)?=>\\s*\`([^\`$\\n]*)\\$\\{`, 'g');
|
|
146
|
+
const fn = new RegExp(`${lead}function\\s+([A-Za-z_$][\\w$]*)\\s*\\([^)]*\\)[^{\\n]*\\{\\s*return\\s+\`([^\`$\\n]*)\\$\\{`, 'g');
|
|
147
|
+
for (const re of [arrow, fn]) {
|
|
148
|
+
let m;
|
|
149
|
+
while ((m = re.exec(source))) {
|
|
150
|
+
const [, name, prefix] = m;
|
|
151
|
+
if (isKeyish(prefix))
|
|
152
|
+
out.set(name, prefix);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* The top-level arguments of a call whose `(` sits at `open`. Depth-aware, so `appToolsKey(appId)`
|
|
159
|
+
* arrives as one argument rather than two halves, and quoted commas do not split anything.
|
|
160
|
+
*/
|
|
161
|
+
export function splitCallArgs(source, open, max = 600) {
|
|
162
|
+
const args = [];
|
|
163
|
+
let depth = 0;
|
|
164
|
+
let quote = '';
|
|
165
|
+
let current = '';
|
|
166
|
+
for (let i = open + 1; i < source.length && i < open + max; i++) {
|
|
167
|
+
const ch = source[i];
|
|
168
|
+
if (quote) {
|
|
169
|
+
current += ch;
|
|
170
|
+
if (ch === quote && source[i - 1] !== '\\')
|
|
171
|
+
quote = '';
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (ch === "'" || ch === '"' || ch === '`') {
|
|
175
|
+
quote = ch;
|
|
176
|
+
current += ch;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if ('([{'.includes(ch)) {
|
|
180
|
+
depth++;
|
|
181
|
+
current += ch;
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (')]}'.includes(ch)) {
|
|
185
|
+
if (ch === ')' && depth === 0) {
|
|
186
|
+
args.push(current.trim());
|
|
187
|
+
return args;
|
|
188
|
+
}
|
|
189
|
+
depth--;
|
|
190
|
+
current += ch;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (ch === ',' && depth === 0) {
|
|
194
|
+
args.push(current.trim());
|
|
195
|
+
current = '';
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
current += ch;
|
|
199
|
+
}
|
|
200
|
+
if (current.trim())
|
|
201
|
+
args.push(current.trim());
|
|
202
|
+
return args;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* What key does this argument ask for? A literal answers directly; an identifier is looked up in the
|
|
206
|
+
* file's own constants first and the exported constants of the whole server second; a call is looked
|
|
207
|
+
* up among the key builders. `a ?? b` resolves through its first resolvable side, which is the shape
|
|
208
|
+
* `getMemory(x, holdKey(id)) ?? getMemory(x, holdInKey(id))` produces.
|
|
209
|
+
*/
|
|
210
|
+
export function resolveKeyExpression(expr, t) {
|
|
211
|
+
const trimmed = expr.trim();
|
|
212
|
+
if (!trimmed)
|
|
213
|
+
return null;
|
|
214
|
+
const literal = /^(['"])([^'"]*)\1$/.exec(trimmed);
|
|
215
|
+
if (literal && isKeyish(literal[2]))
|
|
216
|
+
return { key: literal[2], via: 'literal' };
|
|
217
|
+
const template = /^`([^`$]*)(?:\$\{|`)/.exec(trimmed);
|
|
218
|
+
if (template && isKeyish(template[1]))
|
|
219
|
+
return { key: template[1], via: 'literal' };
|
|
220
|
+
const ident = /^([A-Za-z_$][\w$]*)$/.exec(trimmed);
|
|
221
|
+
if (ident) {
|
|
222
|
+
const local = t.consts.get(ident[1]);
|
|
223
|
+
if (local)
|
|
224
|
+
return { key: local, via: 'constant' };
|
|
225
|
+
// null means the name is exported from two files with different values: guessing which one
|
|
226
|
+
// this file imported would be worse than admitting the read is unresolved.
|
|
227
|
+
const shared = t.sharedConsts.get(ident[1]);
|
|
228
|
+
if (shared)
|
|
229
|
+
return { key: shared, via: 'constant' };
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
const call = /^([A-Za-z_$][\w$]*)\s*\(/.exec(trimmed);
|
|
233
|
+
if (call) {
|
|
234
|
+
const local = t.builders.get(call[1]);
|
|
235
|
+
if (local)
|
|
236
|
+
return { key: local, via: 'builder' };
|
|
237
|
+
const shared = t.sharedBuilders.get(call[1]);
|
|
238
|
+
if (shared)
|
|
239
|
+
return { key: shared, via: 'builder' };
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
for (const side of trimmed.split('??')) {
|
|
243
|
+
if (side.trim() === trimmed)
|
|
244
|
+
break;
|
|
245
|
+
const r = resolveKeyExpression(side, t);
|
|
246
|
+
if (r)
|
|
247
|
+
return r;
|
|
248
|
+
}
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
/** Parameter names of a `(a, b: string, c = 1)` list, positionally. Destructuring yields ''. */
|
|
252
|
+
function paramNames(list) {
|
|
253
|
+
return splitCallArgs(`(${list})`, 0, list.length + 2)
|
|
254
|
+
.map(p => /^([A-Za-z_$][\w$]*)/.exec(p.replace(/^\s*(?:readonly|public|private|protected)\s+/, ''))?.[1] ?? '');
|
|
255
|
+
}
|
|
256
|
+
/** The body of a block that opens at `open`, by brace matching. Strings are already comment-free. */
|
|
257
|
+
function blockBody(source, open, max = 4000) {
|
|
258
|
+
let depth = 0;
|
|
259
|
+
for (let i = open; i < source.length && i < open + max; i++) {
|
|
260
|
+
if (source[i] === '{')
|
|
261
|
+
depth++;
|
|
262
|
+
else if (source[i] === '}') {
|
|
263
|
+
depth--;
|
|
264
|
+
if (!depth)
|
|
265
|
+
return source.slice(open, i);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return source.slice(open, Math.min(source.length, open + max));
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Functions whose own parameter is the key they read. Both the `function` and the arrow form; a
|
|
272
|
+
* class method is left out on purpose, because a method reaches its collaborators through `this` and
|
|
273
|
+
* the call site rarely spells the key either.
|
|
274
|
+
*/
|
|
275
|
+
export function scanForwarders(source, exportedOnly = false) {
|
|
276
|
+
const byName = new Map();
|
|
277
|
+
const innerReads = new Set();
|
|
278
|
+
const lead = exportedOnly ? 'export\\s+' : '(?:export\\s+)?';
|
|
279
|
+
const heads = [
|
|
280
|
+
new RegExp(`${lead}(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)\\s*\\(([^)]*)\\)[^{;]*\\{`, 'g'),
|
|
281
|
+
new RegExp(`${lead}const\\s+([A-Za-z_$][\\w$]*)\\s*(?::[^=\\n]*)?=\\s*(?:async\\s*)?\\(([^)]*)\\)[^={]*=>\\s*\\{`, 'g'),
|
|
282
|
+
];
|
|
283
|
+
for (const re of heads) {
|
|
57
284
|
let m;
|
|
58
285
|
while ((m = re.exec(source))) {
|
|
59
|
-
const [,
|
|
60
|
-
|
|
286
|
+
const [, name, params] = m;
|
|
287
|
+
const names = paramNames(params);
|
|
288
|
+
if (!names.length)
|
|
61
289
|
continue;
|
|
62
|
-
|
|
290
|
+
const bodyStart = source.indexOf('{', m.index + m[0].length - 1);
|
|
291
|
+
if (bodyStart < 0)
|
|
63
292
|
continue;
|
|
64
|
-
const
|
|
65
|
-
|
|
293
|
+
const body = blockBody(source, bodyStart);
|
|
294
|
+
const read = /\b(?:getMemory|getPublicMemory)\s*\(/g;
|
|
295
|
+
let r;
|
|
296
|
+
while ((r = read.exec(body))) {
|
|
297
|
+
const args = splitCallArgs(body, r.index + r[0].length - 1);
|
|
298
|
+
if (args.length < 2)
|
|
299
|
+
continue;
|
|
300
|
+
const keyIndex = names.indexOf(args[1].trim());
|
|
301
|
+
if (keyIndex < 0)
|
|
302
|
+
continue;
|
|
303
|
+
if (!byName.has(name))
|
|
304
|
+
byName.set(name, { keyIndex, identityIndex: names.indexOf(args[0].trim()) });
|
|
305
|
+
innerReads.add(bodyStart + r.index);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return { byName, innerReads };
|
|
310
|
+
}
|
|
311
|
+
export function collectKeyForwarders(source, exportedOnly = false) {
|
|
312
|
+
return scanForwarders(source, exportedOnly).byName;
|
|
313
|
+
}
|
|
314
|
+
/** Merges a name into a shared table, marking it null when two files disagree about its value. */
|
|
315
|
+
function share(table, from, same) {
|
|
316
|
+
for (const [name, value] of from) {
|
|
317
|
+
if (!table.has(name)) {
|
|
318
|
+
table.set(name, value);
|
|
319
|
+
continue;
|
|
66
320
|
}
|
|
321
|
+
const seen = table.get(name);
|
|
322
|
+
if (seen === null || seen === undefined || !same(seen, value))
|
|
323
|
+
table.set(name, null);
|
|
67
324
|
}
|
|
68
|
-
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* The scan proper, over sources rather than paths, so its failing cases can be proven against a
|
|
328
|
+
* fixture instead of the real tree.
|
|
329
|
+
*/
|
|
330
|
+
export function scanSources(inputs) {
|
|
331
|
+
const prepared = inputs.map(i => {
|
|
332
|
+
const source = stripComments(i.source);
|
|
333
|
+
const fwd = scanForwarders(source);
|
|
334
|
+
return {
|
|
335
|
+
file: i.file,
|
|
336
|
+
source,
|
|
337
|
+
consts: collectKeyConstants(source),
|
|
338
|
+
builders: collectKeyBuilders(source),
|
|
339
|
+
forwarders: fwd.byName,
|
|
340
|
+
innerReads: fwd.innerReads,
|
|
341
|
+
};
|
|
342
|
+
});
|
|
343
|
+
// Only EXPORTED names cross a file boundary, so only those go in the shared tables. A file-local
|
|
344
|
+
// constant with a popular name (KEY, PREFIX) would otherwise answer for a read in a file that
|
|
345
|
+
// never imported it.
|
|
346
|
+
const sharedConsts = new Map();
|
|
347
|
+
const sharedBuilders = new Map();
|
|
348
|
+
const sharedForwarders = new Map();
|
|
349
|
+
const sameString = (a, b) => a === b;
|
|
350
|
+
for (const p of prepared) {
|
|
351
|
+
share(sharedConsts, collectKeyConstants(p.source, true), sameString);
|
|
352
|
+
share(sharedBuilders, collectKeyBuilders(p.source, true), sameString);
|
|
353
|
+
share(sharedForwarders, collectKeyForwarders(p.source, true), (a, b) => a.keyIndex === b.keyIndex && a.identityIndex === b.identityIndex);
|
|
354
|
+
}
|
|
355
|
+
const findings = [];
|
|
356
|
+
let unresolved = 0;
|
|
357
|
+
let reserved = 0;
|
|
358
|
+
let systemIdentity = 0;
|
|
359
|
+
for (const p of prepared) {
|
|
360
|
+
const t = {
|
|
361
|
+
consts: p.consts, builders: p.builders, forwarders: p.forwarders,
|
|
362
|
+
sharedConsts, sharedBuilders, sharedForwarders,
|
|
363
|
+
};
|
|
364
|
+
const at = (index) => p.source.slice(0, index).split('\n').length;
|
|
365
|
+
/** One judged read: reserved and system-identity reads leave nothing behind but silence. */
|
|
366
|
+
const record = (index, identity, keyExpr) => {
|
|
367
|
+
const resolved = resolveKeyExpression(keyExpr, t);
|
|
368
|
+
if (!resolved) {
|
|
369
|
+
unresolved++;
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
if (isReserved(resolved.key)) {
|
|
373
|
+
reserved++;
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
if (isSystemIdentity(identity, t)) {
|
|
377
|
+
systemIdentity++;
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
findings.push({
|
|
381
|
+
file: p.file, line: at(index), key: resolved.key,
|
|
382
|
+
identity: identity.trim().slice(0, 40), via: resolved.via,
|
|
383
|
+
});
|
|
384
|
+
};
|
|
385
|
+
const direct = /\b(?:getMemory|getPublicMemory)\s*\(/g;
|
|
386
|
+
let m;
|
|
387
|
+
while ((m = direct.exec(p.source))) {
|
|
388
|
+
const args = splitCallArgs(p.source, m.index + m[0].length - 1);
|
|
389
|
+
// A forwarder's own storage call is judged at ITS call sites, where the key is spelled.
|
|
390
|
+
if (p.innerReads.has(m.index))
|
|
391
|
+
continue;
|
|
392
|
+
if (args.length < 2) {
|
|
393
|
+
unresolved++;
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
record(m.index, args[0], args[1]);
|
|
397
|
+
}
|
|
398
|
+
// A prefix scan is a read of every key under that prefix, and `listAllMemory` scans EVERY
|
|
399
|
+
// owner's namespace: `listAllMemory({ prefix: 'bensplit.' })` pays out on what it finds
|
|
400
|
+
// there. Whatever the server then acts on has to be as unwritable as a single key would be.
|
|
401
|
+
const perOwner = /\b(?:listMemory|listMemoryMeta|listMemoryForOwners|listMemoryMetaForOwners)\s*\(/g;
|
|
402
|
+
while ((m = perOwner.exec(p.source))) {
|
|
403
|
+
const args = splitCallArgs(p.source, m.index + m[0].length - 1);
|
|
404
|
+
const prefix = args.length > 1 ? prefixOption(args[1]) : null;
|
|
405
|
+
if (!prefix)
|
|
406
|
+
continue;
|
|
407
|
+
record(m.index, args[0], prefix);
|
|
408
|
+
}
|
|
409
|
+
const allOwners = /\blistAllMemory\s*\(/g;
|
|
410
|
+
while ((m = allOwners.exec(p.source))) {
|
|
411
|
+
const prefix = prefixOption(splitCallArgs(p.source, m.index + m[0].length - 1)[0] ?? '');
|
|
412
|
+
if (prefix)
|
|
413
|
+
record(m.index, '', prefix);
|
|
414
|
+
}
|
|
415
|
+
const byPrefix = /\blistMemoryKeysByPrefix\s*\(/g;
|
|
416
|
+
while ((m = byPrefix.exec(p.source))) {
|
|
417
|
+
const args = splitCallArgs(p.source, m.index + m[0].length - 1);
|
|
418
|
+
if (args.length)
|
|
419
|
+
record(m.index, '', args[0]);
|
|
420
|
+
}
|
|
421
|
+
// Calls to a key-forwarding helper: the frame where the constant is actually named.
|
|
422
|
+
for (const [name, fwd] of [...p.forwarders, ...sharedForwarders]) {
|
|
423
|
+
if (!fwd)
|
|
424
|
+
continue;
|
|
425
|
+
if (p.forwarders.has(name) && p.forwarders.get(name) !== fwd)
|
|
426
|
+
continue;
|
|
427
|
+
const re = new RegExp(`(?<![.\\w$])${name}\\s*\\(`, 'g');
|
|
428
|
+
let c;
|
|
429
|
+
while ((c = re.exec(p.source))) {
|
|
430
|
+
const args = splitCallArgs(p.source, c.index + c[0].length - 1);
|
|
431
|
+
if (args.length <= fwd.keyIndex)
|
|
432
|
+
continue;
|
|
433
|
+
if (isDefinitionSite(p.source, c.index))
|
|
434
|
+
continue;
|
|
435
|
+
record(c.index, fwd.identityIndex >= 0 ? (args[fwd.identityIndex] ?? '') : '', args[fwd.keyIndex]);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return { findings, unresolved, reserved, systemIdentity };
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* An identity no owner-scoped principal can address. The `__name__` convention is read as the rule
|
|
443
|
+
* rather than a fixed list: `__network_policy__`, `__genesis__` and `__federation_book__` all follow
|
|
444
|
+
* it, and the next one should be recognised on the day it is written rather than the day someone
|
|
445
|
+
* remembers to add it here.
|
|
446
|
+
*/
|
|
447
|
+
function isSystemIdentity(expr, t) {
|
|
448
|
+
const raw = expr.trim();
|
|
449
|
+
const synthetic = (s) => /^__[A-Za-z0-9_]+__$/.test(s) || SYSTEM_IDENTITIES.some(k => s.includes(k));
|
|
450
|
+
if (synthetic(raw.replace(/^['"`]|['"`]$/g, '')))
|
|
451
|
+
return true;
|
|
452
|
+
// The identity can be behind a name too: `securityOwner(nodeId)` builds `security-system@<node>`,
|
|
453
|
+
// and reading the resolved value is the only way to see that.
|
|
454
|
+
const resolved = resolveKeyExpression(raw, t);
|
|
455
|
+
return !!resolved && synthetic(resolved.key);
|
|
456
|
+
}
|
|
457
|
+
/** The `{ prefix: 'x.' }` of a list call. Absent means "everything", which no denylist can help. */
|
|
458
|
+
function prefixOption(objectExpr) {
|
|
459
|
+
const m = /\bprefix\s*:\s*([^,}]+)/.exec(objectExpr);
|
|
460
|
+
return m ? m[1].trim() : null;
|
|
461
|
+
}
|
|
462
|
+
/** The `function foo(` of the definition itself is not a call to foo. */
|
|
463
|
+
function isDefinitionSite(source, index) {
|
|
464
|
+
return /(?:function|const|let|var)\s+$/.test(source.slice(Math.max(0, index - 30), index));
|
|
465
|
+
}
|
|
466
|
+
export function collectReads(files) {
|
|
467
|
+
return scanSources(files.map(f => ({
|
|
468
|
+
file: relative(ROOT, f).replace(/\\/g, '/'),
|
|
469
|
+
source: readFileSync(f, 'utf-8'),
|
|
470
|
+
}))).findings;
|
|
69
471
|
}
|
|
70
472
|
const softKey = (f) => `${f.file}:${f.key}`;
|
|
473
|
+
/**
|
|
474
|
+
* An exemption says the server does not act on this key. Empty prose says nothing at all, and that
|
|
475
|
+
* silence is what left `finance.accountants` and `commerce.psp` off the denylist for two months.
|
|
476
|
+
*/
|
|
477
|
+
export function validateReasons(exempt) {
|
|
478
|
+
const reasonless = [];
|
|
479
|
+
const unreviewed = [];
|
|
480
|
+
for (const [key, reason] of Object.entries(exempt)) {
|
|
481
|
+
const text = (reason ?? '').trim();
|
|
482
|
+
if (text.length < MIN_REASON)
|
|
483
|
+
reasonless.push(key);
|
|
484
|
+
else if (text.startsWith(UNREVIEWED))
|
|
485
|
+
unreviewed.push(key);
|
|
486
|
+
}
|
|
487
|
+
return { reasonless, unreviewed };
|
|
488
|
+
}
|
|
489
|
+
function loadExemptions() {
|
|
490
|
+
if (!existsSync(EXEMPTIONS))
|
|
491
|
+
return { note: '', exempt: {} };
|
|
492
|
+
return JSON.parse(readFileSync(EXEMPTIONS, 'utf-8'));
|
|
493
|
+
}
|
|
494
|
+
const SEED_NOTE = `${UNREVIEWED}: seeded from the state on the day the gate learned to resolve this key. `
|
|
495
|
+
+ 'Nobody has yet said whether the server ACTS on this value (a URL it fetches, a credential, a '
|
|
496
|
+
+ 'policy, a budget, an authorization list) or merely hands it back as the user\'s own data. If it '
|
|
497
|
+
+ 'acts on it, reserve the prefix in src/utils/reserved-keys.ts or move it under a system identity.';
|
|
498
|
+
/** Seeding MERGES: a reason someone wrote is never overwritten by a placeholder. */
|
|
499
|
+
function seed(findings) {
|
|
500
|
+
const previous = loadExemptions().exempt;
|
|
501
|
+
const exempt = {};
|
|
502
|
+
for (const f of findings.map(softKey).sort())
|
|
503
|
+
exempt[f] = previous[f] ?? SEED_NOTE;
|
|
504
|
+
const kept = Object.keys(exempt).filter(k => previous[k]).length;
|
|
505
|
+
writeFileSync(EXEMPTIONS, JSON.stringify({
|
|
506
|
+
note: 'Memory keys the server reads that are neither reserved nor under a system identity. A ratchet: '
|
|
507
|
+
+ 'the list may shrink and never grow silently. Every entry carries prose saying why the server does '
|
|
508
|
+
+ 'not act on this value; an empty reason fails the gate, and one that starts with UNREVIEWED counts '
|
|
509
|
+
+ 'as backlog rather than as a claim anyone has made.',
|
|
510
|
+
exempt,
|
|
511
|
+
}, null, 2) + '\n');
|
|
512
|
+
console.log(`Seeded ${findings.length} reads as ${Object.keys(exempt).length} entries in `
|
|
513
|
+
+ `${relative(ROOT, EXEMPTIONS)} (${kept} existing reasons kept word for word)`);
|
|
514
|
+
}
|
|
71
515
|
function main() {
|
|
72
516
|
const strict = process.argv.includes('--strict');
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
writeFileSync(EXEMPTIONS, JSON.stringify({
|
|
85
|
-
note: 'Memory keys the server reads that are neither reserved nor under a system identity. Seeded '
|
|
86
|
-
+ 'from the state on 2026-08-10 so the gate can only ratchet down. Most are ordinary user data '
|
|
87
|
-
+ 'the server hands back untouched; the dangerous ones are those it acts on.',
|
|
88
|
-
exempt,
|
|
89
|
-
}, null, 2) + '\n');
|
|
90
|
-
console.log(`Seeded ${findings.length} exemptions into ${relative(ROOT, EXEMPTIONS)}`);
|
|
517
|
+
const files = walk(SRC);
|
|
518
|
+
if (!files.length) {
|
|
519
|
+
console.error(`✖ scanned no files under ${SRC}. Run this from the aimeat package directory.`);
|
|
520
|
+
process.exit(1);
|
|
521
|
+
}
|
|
522
|
+
const { findings, unresolved, reserved, systemIdentity } = scanSources(files.map(f => ({
|
|
523
|
+
file: relative(ROOT, f).replace(/\\/g, '/'),
|
|
524
|
+
source: readFileSync(f, 'utf-8'),
|
|
525
|
+
})));
|
|
526
|
+
if (process.argv.includes('--seed')) {
|
|
527
|
+
seed(findings);
|
|
91
528
|
return;
|
|
92
529
|
}
|
|
93
|
-
const exempt =
|
|
94
|
-
? JSON.parse(readFileSync(EXEMPTIONS, 'utf-8')).exempt
|
|
95
|
-
: {};
|
|
530
|
+
const { exempt } = loadExemptions();
|
|
96
531
|
const known = new Set(Object.keys(exempt));
|
|
97
532
|
const fresh = findings.filter(f => !known.has(softKey(f)));
|
|
533
|
+
const stale = [...known].filter(k => !findings.some(f => softKey(f) === k));
|
|
534
|
+
const { reasonless, unreviewed } = validateReasons(exempt);
|
|
98
535
|
const distinct = new Set(findings.map(f => f.key));
|
|
536
|
+
const viaConstant = findings.filter(f => f.via !== 'literal').length;
|
|
99
537
|
console.log('');
|
|
100
538
|
console.log(' Server-trusted memory keys — Rule 10 invariant 2');
|
|
101
539
|
console.log(' ' + '─'.repeat(62));
|
|
102
540
|
console.log(` reads outside the guard ${String(findings.length).padStart(4)} (${distinct.size} distinct keys)`);
|
|
103
|
-
console.log(`
|
|
541
|
+
console.log(` found via a constant ${String(viaConstant).padStart(4)} (invisible to a literal-only scan)`);
|
|
542
|
+
console.log(` covered by the denylist ${String(reserved).padStart(4)} ${RESERVED_OWNER_KEY_PREFIXES.join(' ')}`);
|
|
543
|
+
console.log(` under a system identity ${String(systemIdentity).padStart(4)} (out of reach of an owner-scoped token)`);
|
|
544
|
+
console.log(` key not resolvable ${String(unresolved).padStart(4)} (built from runtime values, not judged)`);
|
|
545
|
+
console.log(` exempt, reason written ${String(known.size - unreviewed.length - reasonless.length).padStart(4)}`);
|
|
546
|
+
console.log(` exempt, UNREVIEWED ${String(unreviewed.length).padStart(4)} (backlog, may only shrink)`);
|
|
104
547
|
console.log(` NEW, not exempt ${String(fresh.length).padStart(4)}`);
|
|
105
548
|
console.log('');
|
|
106
549
|
if (fresh.length) {
|
|
@@ -109,14 +552,40 @@ function main() {
|
|
|
109
552
|
console.log(' in security/trusted-key-exemptions.json why it is user data rather than configuration.');
|
|
110
553
|
console.log('');
|
|
111
554
|
for (const f of fresh)
|
|
112
|
-
console.log(` ${f.file}:${f.line} ${f.key}`);
|
|
555
|
+
console.log(` ${f.file}:${f.line} ${f.key} (read via ${f.via})`);
|
|
556
|
+
console.log('');
|
|
557
|
+
}
|
|
558
|
+
if (reasonless.length) {
|
|
559
|
+
console.log(' These exemptions name a key and give no reason. A key name is a filing, not a claim:');
|
|
560
|
+
console.log(` write the sentence saying why the server does not act on it (at least ${MIN_REASON} characters),`);
|
|
561
|
+
console.log(` or prefix it with ${UNREVIEWED} so it counts as backlog rather than as an answer.`);
|
|
562
|
+
console.log('');
|
|
563
|
+
for (const k of reasonless)
|
|
564
|
+
console.log(` ${k}`);
|
|
565
|
+
console.log('');
|
|
566
|
+
}
|
|
567
|
+
if (stale.length) {
|
|
568
|
+
console.log(` ${stale.length} exemption(s) match no read any more — delete them, that is the ratchet turning:`);
|
|
569
|
+
for (const k of stale)
|
|
570
|
+
console.log(` ${k}`);
|
|
113
571
|
console.log('');
|
|
114
572
|
}
|
|
115
|
-
if (strict && fresh.length) {
|
|
116
|
-
|
|
573
|
+
if (strict && (fresh.length || reasonless.length)) {
|
|
574
|
+
const parts = [
|
|
575
|
+
fresh.length ? `${fresh.length} new unguarded server-read key(s)` : '',
|
|
576
|
+
reasonless.length ? `${reasonless.length} exemption(s) without a reason` : '',
|
|
577
|
+
].filter(Boolean);
|
|
578
|
+
console.error(`✖ ${parts.join(', ')}.`);
|
|
117
579
|
process.exit(1);
|
|
118
580
|
}
|
|
119
|
-
console.log(fresh.length
|
|
581
|
+
console.log(fresh.length || reasonless.length
|
|
582
|
+
? ' (report only — pass --strict to gate)'
|
|
583
|
+
: ' ✓ no new unguarded server-read keys, and every exemption carries a reason');
|
|
120
584
|
}
|
|
121
|
-
|
|
585
|
+
// Run only when invoked as the script. The unit test imports scanSources() to prove the failing
|
|
586
|
+
// cases against a fixture, and an import that gated the whole build as a side effect would be a
|
|
587
|
+
// surprise nobody expects from a function call.
|
|
588
|
+
const invokedDirectly = process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url);
|
|
589
|
+
if (invokedDirectly)
|
|
590
|
+
main();
|
|
122
591
|
//# sourceMappingURL=check-trusted-keys.js.map
|