aimeat 3.2.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 +41 -1
- package/dist/locales/es.json +41 -1
- package/dist/locales/fi.json +43 -3
- package/dist/public/changelog.json +12 -0
- package/dist/public/css/views/chat.css +388 -0
- package/dist/public/js/services/chat.js +190 -0
- 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 +8 -1
- 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 -315
- 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-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-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-sse-parity.js +14 -0
- package/dist/scripts/check-sse-parity.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 +7 -0
- package/dist/src/auth/middleware.d.ts.map +1 -1
- package/dist/src/auth/middleware.js +15 -21
- package/dist/src/auth/middleware.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/agent-tasks.d.ts +4 -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 +11 -1
- package/dist/src/cli/connect/mcp/tools/agent-tasks.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/onboarding-prompt.js +1 -1
- package/dist/src/cli/connect/skill-bundle.js +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/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 +1652 -36
- 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 +3 -0
- package/dist/src/index-start.js.map +1 -1
- package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
- package/dist/src/mcp/agent-tasks.js +5 -0
- package/dist/src/mcp/agent-tasks.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 +18 -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/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 +40 -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 +74 -0
- package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js.map +1 -1
- package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js +1 -0
- 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 +19 -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 +18 -4
- package/dist/src/mcp/catalog/surfaces.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 +34 -0
- package/dist/src/mcp/index.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/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/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/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/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.map +1 -1
- package/dist/src/routes/apps/read.js +38 -1
- 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/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 +8 -0
- package/dist/src/routes/disputes.d.ts.map +1 -1
- package/dist/src/routes/disputes.js +52 -1
- 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/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 +3 -0
- package/dist/src/routes/instances/install.d.ts.map +1 -1
- package/dist/src/routes/instances/install.js +17 -24
- package/dist/src/routes/instances/install.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/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/gates.d.ts.map +1 -1
- package/dist/src/routes/organisms/gates.js +9 -2
- package/dist/src/routes/organisms/gates.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/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 +20 -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/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 +26 -0
- package/dist/src/services/ai-completion.d.ts.map +1 -1
- package/dist/src/services/ai-completion.js +41 -13
- 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 +5 -2
- package/dist/src/services/ai-transcription.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-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/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/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/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/markdown-negotiation.js +1 -1
- package/dist/src/services/markdown-negotiation.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/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 +34 -1
- package/dist/src/services/scope-vocabulary-migration.d.ts.map +1 -1
- package/dist/src/services/scope-vocabulary-migration.js +60 -0
- 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/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/providers/postgres-kysely/db-types.d.ts +1 -0
- package/dist/src/storage/providers/postgres-kysely/db-types.d.ts.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/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 +2 -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/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/schema.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.js +134 -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/types/commerce.d.ts +6 -0
- package/dist/src/storage/types/commerce.d.ts.map +1 -1
- 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/static/sdk-libs/datapackage/index.js +336 -0
- package/dist/static/sdk-libs/dist/aimeat-datapackage.js +305 -0
- package/package.json +10 -2
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/datapackage/ext-capability.ts
|
|
3
|
+
* @description `ctx.datapackage` — the data-package contract as a HOST capability, because a
|
|
4
|
+
* sandboxed extension cannot load a shared library and the deterministic producers live there.
|
|
5
|
+
*
|
|
6
|
+
* WHY A HOST CAPABILITY AND NOT A LIBRARY. Extension actions run in QuickJS with no module
|
|
7
|
+
* loader: the guest sees `ctx` and nothing else, and `ctx.fetch` answers with `text`, so even
|
|
8
|
+
* pulling the library over HTTP and eval'ing it is not a road. That was the open question in the
|
|
9
|
+
* spec, and this is the decided answer — the library's WORK (schema inference, validation, the
|
|
10
|
+
* content hash, canonical CSV, the storage writes, the catalogue entry) happens on the host, and
|
|
11
|
+
* the guest calls it. The browser binding and the MCP tools reach the SAME functions in
|
|
12
|
+
* ./store.js, so a package built by an extension, an app and an agent is byte-identical.
|
|
13
|
+
*
|
|
14
|
+
* PUBLISH THROWS WHEN THE GATE REFUSES. It does not return `{ ok: false }`, and that is not an
|
|
15
|
+
* ergonomic preference: the scheduler and the workflow engine both record a normal return as a
|
|
16
|
+
* successful run, so a producer whose data failed validation would show green having published
|
|
17
|
+
* nothing. A throw is the only shape that reaches the owner on every road. `validate()` is the
|
|
18
|
+
* separate, non-throwing call for a producer that wants to look before it leaps.
|
|
19
|
+
*
|
|
20
|
+
* THE SIZE CEILING IS THE BRIDGE, not the file limit. Rows cross as one JSON string through
|
|
21
|
+
* `vm.getString`, inside a sandbox whose memory ceiling is tens of megabytes, so the payload is
|
|
22
|
+
* capped at the same 8 MB as `ctx.files` — one number for "what may cross in one call", refused
|
|
23
|
+
* with a message naming the alternative rather than left to exhaust the VM.
|
|
24
|
+
* @structure makeExtensionDataPackage — the ctx.datapackage factory
|
|
25
|
+
* @usage
|
|
26
|
+
* const datapackage = makeExtensionDataPackage({ storage, config, ownerGhii, producedBy });
|
|
27
|
+
* const ctx = buildExtensionCtx({ …, datapackage });
|
|
28
|
+
* @version-history
|
|
29
|
+
* v1.0.0 -- 2026-08-15 -- Initial (TARGET-063 vaihe 1, A4).
|
|
30
|
+
*/
|
|
31
|
+
import type { AimeatConfig } from '../../config.js';
|
|
32
|
+
import type { Storage } from '../../storage/interface.js';
|
|
33
|
+
import type { PublishInput, TableSchema } from './contract.js';
|
|
34
|
+
import { type ValidationIssue } from './table.js';
|
|
35
|
+
import { type ProducedBy } from './store.js';
|
|
36
|
+
/** What may cross the sandbox bridge in one call, as serialised JSON. Same number as ctx.files. */
|
|
37
|
+
export declare const MAX_DATAPACKAGE_PAYLOAD_BYTES: number;
|
|
38
|
+
export interface ExtensionDataPackage {
|
|
39
|
+
publish(input: PublishInput): Promise<{
|
|
40
|
+
packageId: string;
|
|
41
|
+
contentHash: string;
|
|
42
|
+
descriptorUrl: string;
|
|
43
|
+
unchanged: boolean;
|
|
44
|
+
resources: Array<{
|
|
45
|
+
name: string;
|
|
46
|
+
url: string;
|
|
47
|
+
rowCount: number;
|
|
48
|
+
bytes: number;
|
|
49
|
+
}>;
|
|
50
|
+
}>;
|
|
51
|
+
validate(resources: Array<{
|
|
52
|
+
name: string;
|
|
53
|
+
rows: Array<Record<string, unknown>>;
|
|
54
|
+
schema: 'infer' | TableSchema;
|
|
55
|
+
}>): Promise<{
|
|
56
|
+
ok: boolean;
|
|
57
|
+
issues: ValidationIssue[];
|
|
58
|
+
schemas: Record<string, TableSchema>;
|
|
59
|
+
}>;
|
|
60
|
+
inferSchema(rows: Array<Record<string, unknown>>): Promise<TableSchema>;
|
|
61
|
+
open(ref: string): Promise<unknown | null>;
|
|
62
|
+
rows(ref: string, resource: string, opts?: {
|
|
63
|
+
offset?: number;
|
|
64
|
+
limit?: number;
|
|
65
|
+
select?: string[];
|
|
66
|
+
}): Promise<{
|
|
67
|
+
rows: Array<Record<string, unknown>>;
|
|
68
|
+
total: number;
|
|
69
|
+
schema: TableSchema;
|
|
70
|
+
} | null>;
|
|
71
|
+
fail(name: string, message: string): Promise<void>;
|
|
72
|
+
}
|
|
73
|
+
export declare function makeExtensionDataPackage(deps: {
|
|
74
|
+
config: AimeatConfig;
|
|
75
|
+
storage: Storage;
|
|
76
|
+
/**
|
|
77
|
+
* WHOSE package this is. Always the owner's GHII, on every road — never the agent GAII and never
|
|
78
|
+
* `scheduler@node`. A package produced from the app, on a clock, by a workflow step or by an
|
|
79
|
+
* agent must land at ONE permanent address, or the producer is not interchangeable.
|
|
80
|
+
*/
|
|
81
|
+
ownerGhii: string;
|
|
82
|
+
/** Who actually produced it, for the provenance block. The exact principal, not the owner. */
|
|
83
|
+
producedBy: ProducedBy;
|
|
84
|
+
}): ExtensionDataPackage;
|
|
85
|
+
//# sourceMappingURL=ext-capability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ext-capability.d.ts","sourceRoot":"","sources":["../../../../src/services/datapackage/ext-capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAwD,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnG,mGAAmG;AACnG,eAAO,MAAM,6BAA6B,QAAkB,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACjC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAClF,SAAS,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACpF,CAAC,CAAC;IACH,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAAC,MAAM,EAAE,OAAO,GAAG,WAAW,CAAA;KAAE,CAAC,GAC5G,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,eAAe,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9F,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC7F,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACjG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAaD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,8FAA8F;IAC9F,UAAU,EAAE,UAAU,CAAC;CAC1B,GAAG,oBAAoB,CA+DvB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { inferSchema, validateRows } from './table.js';
|
|
2
|
+
import { openPackage, publishPackage, readRows, recordFailure } from './store.js';
|
|
3
|
+
/** What may cross the sandbox bridge in one call, as serialised JSON. Same number as ctx.files. */
|
|
4
|
+
export const MAX_DATAPACKAGE_PAYLOAD_BYTES = 8 * 1024 * 1024;
|
|
5
|
+
/** Refuse an oversized payload at the boundary, naming what to do instead. */
|
|
6
|
+
function guardSize(what, value) {
|
|
7
|
+
const bytes = Buffer.byteLength(JSON.stringify(value ?? null), 'utf8');
|
|
8
|
+
if (bytes > MAX_DATAPACKAGE_PAYLOAD_BYTES) {
|
|
9
|
+
throw new Error(`${what} is ${Math.round(bytes / 1024)} kB, over the ${MAX_DATAPACKAGE_PAYLOAD_BYTES / 1024 / 1024} MB sandbox `
|
|
10
|
+
+ 'bridge limit. Publish the table in periods (one package version per window) rather than one '
|
|
11
|
+
+ 'unbounded version, or produce it from a road with no sandbox between it and the data.');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function makeExtensionDataPackage(deps) {
|
|
15
|
+
const { config, storage, ownerGhii, producedBy } = deps;
|
|
16
|
+
const store = { storage, config };
|
|
17
|
+
return {
|
|
18
|
+
async publish(input) {
|
|
19
|
+
guardSize('the package payload', input);
|
|
20
|
+
const out = await publishPackage(store, ownerGhii, input, producedBy);
|
|
21
|
+
if (!out.ok) {
|
|
22
|
+
// THROW, do not return a verdict. See the file header: an unattended road records a
|
|
23
|
+
// normal return as success, so a returned refusal is a green run that published
|
|
24
|
+
// nothing. The first coordinates travel in the message because a producer reading a
|
|
25
|
+
// log needs the row and the column, not a count.
|
|
26
|
+
const head = out.issues.slice(0, 5)
|
|
27
|
+
.map(i => `${i.resource} row ${i.row}, ${i.field}: ${i.message}`)
|
|
28
|
+
.join('; ');
|
|
29
|
+
throw new Error(`${out.code}: ${out.message}${head ? ` — ${head}` : ''}`);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
packageId: out.descriptor.aimeat.packageId,
|
|
33
|
+
contentHash: out.contentHash,
|
|
34
|
+
descriptorUrl: out.descriptorUrl,
|
|
35
|
+
unchanged: out.unchanged,
|
|
36
|
+
resources: out.resources,
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
async validate(resources) {
|
|
40
|
+
guardSize('the resources to validate', resources);
|
|
41
|
+
const issues = [];
|
|
42
|
+
const schemas = {};
|
|
43
|
+
for (const r of Array.isArray(resources) ? resources : []) {
|
|
44
|
+
const schema = r.schema === 'infer' ? inferSchema(r.rows ?? []) : r.schema;
|
|
45
|
+
schemas[r.name] = schema;
|
|
46
|
+
issues.push(...validateRows(r.name, r.rows ?? [], schema));
|
|
47
|
+
}
|
|
48
|
+
return { ok: issues.length === 0, issues, schemas };
|
|
49
|
+
},
|
|
50
|
+
async inferSchema(rows) {
|
|
51
|
+
guardSize('the rows to infer from', rows);
|
|
52
|
+
// A PROPOSAL. It is returned so the producer can look at it, adjust it and declare it;
|
|
53
|
+
// publishing with `schema: 'infer'` records `schemaSource: 'inferred'` in the descriptor
|
|
54
|
+
// so a consumer can see that nobody confirmed the types.
|
|
55
|
+
return inferSchema(Array.isArray(rows) ? rows : []);
|
|
56
|
+
},
|
|
57
|
+
async open(ref) {
|
|
58
|
+
const opened = await openPackage(store, String(ref || ''), config.nodeId);
|
|
59
|
+
return opened ? { ...opened.descriptor, descriptorUrl: opened.descriptorUrl } : null;
|
|
60
|
+
},
|
|
61
|
+
async rows(ref, resource, opts) {
|
|
62
|
+
return readRows(store, String(ref || ''), config.nodeId, String(resource || ''), opts ?? {});
|
|
63
|
+
},
|
|
64
|
+
async fail(name, message) {
|
|
65
|
+
// The producer saying so itself, for the case it can detect and the road cannot: an
|
|
66
|
+
// upstream that answered with an empty body, a source that returned yesterday's file.
|
|
67
|
+
// The run should ALSO throw; this is what leaves the reason on the package.
|
|
68
|
+
await recordFailure(store, ownerGhii, String(name || ''), String(message || 'the run failed'));
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=ext-capability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ext-capability.js","sourceRoot":"","sources":["../../../../src/services/datapackage/ext-capability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/datapackage/odata.ts
|
|
3
|
+
* @description The OData v4 projection of a data package: CSDL metadata from the Table Schema, and
|
|
4
|
+
* the readable subset of the query language applied to rows. Pure — no HTTP, no storage.
|
|
5
|
+
*
|
|
6
|
+
* WHY OData AT ALL, when the CSV already sits at a permanent address. Excel, Power BI and Tableau
|
|
7
|
+
* have a native "OData feed" connector: a person pastes one URL and the workbook REFRESHES ITSELF
|
|
8
|
+
* afterwards. A CSV link is a download, and a download is a copy that starts going stale the moment
|
|
9
|
+
* it lands. This is the difference between a dataset somebody uses once and one they keep.
|
|
10
|
+
*
|
|
11
|
+
* AN UNSUPPORTED QUERY OPTION IS AN ERROR, NEVER AN IGNORED ONE. This is the rule the whole file
|
|
12
|
+
* is shaped around. If a client sends `$filter=weird(x)` and the server ignores it, the client
|
|
13
|
+
* receives MORE ROWS THAN IT ASKED FOR and treats them as the answer — a silent wrong result that
|
|
14
|
+
* looks exactly like a right one. So anything this implementation does not understand answers 501
|
|
15
|
+
* naming what it does understand. A visibly missing feature is cheap; a filter that quietly did
|
|
16
|
+
* nothing is a wrong number in somebody's report.
|
|
17
|
+
*
|
|
18
|
+
* ONE SCHEMA, MANY PROJECTIONS. The Table Schema in the descriptor is the only place columns and
|
|
19
|
+
* types are declared. The CSDL here, the CSV header, the ODPS product sheet and an agent's view of
|
|
20
|
+
* the package are all derived from it, so none of them can drift from the data.
|
|
21
|
+
* @structure toCsdl · parseQuery · applyQuery · ODATA_SUPPORTED
|
|
22
|
+
* @usage
|
|
23
|
+
* const xml = toCsdl(descriptor, 'https://…/v1/odata/alice/pkg');
|
|
24
|
+
* const q = parseQuery(searchParams, resource.schema);
|
|
25
|
+
* if (!q.ok) return 501;
|
|
26
|
+
* const page = applyQuery(rows, q.value);
|
|
27
|
+
* @version-history
|
|
28
|
+
* v1.0.0 -- 2026-08-15 -- Initial (TARGET-063 vaihe 1, the OData surface).
|
|
29
|
+
*/
|
|
30
|
+
import type { Descriptor, TableSchema } from './contract.js';
|
|
31
|
+
/** Every system query option this implementation honours. Anything else is refused by name. */
|
|
32
|
+
export declare const ODATA_SUPPORTED: readonly ["$select", "$top", "$skip", "$filter", "$orderby", "$count", "$format"];
|
|
33
|
+
/** The synthetic key. A CSV row has no identity of its own, and OData requires an entity key — so
|
|
34
|
+
* one is supplied rather than a natural column being promoted to a role it cannot fill. It is the
|
|
35
|
+
* row's ordinal WITHIN THIS IMMUTABLE VERSION, which is stable precisely because the version is. */
|
|
36
|
+
export declare const ROW_KEY = "RowId";
|
|
37
|
+
/** A CSDL identifier: letters, digits and underscore, not starting with a digit. A column called
|
|
38
|
+
* `first name` or `2026` is legal in a CSV and illegal here, so it is mapped rather than rejected —
|
|
39
|
+
* and the mapping is recorded in the descriptor's own field name, which does not change. */
|
|
40
|
+
export declare function edmName(raw: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* The CSDL v4 document (`$metadata`) for one package version.
|
|
43
|
+
*
|
|
44
|
+
* `Nullable="true"` on every property except the key, deliberately: a Table Schema's `primaryKey` is
|
|
45
|
+
* the only statement anybody made about required-ness, and claiming a column is non-nullable because
|
|
46
|
+
* it happened to be full in this version would be a promise the next version breaks.
|
|
47
|
+
*/
|
|
48
|
+
export declare function toCsdl(descriptor: Descriptor, namespace: string): string;
|
|
49
|
+
export interface FilterNode {
|
|
50
|
+
field: string;
|
|
51
|
+
op: 'eq' | 'ne' | 'gt' | 'ge' | 'lt' | 'le' | 'contains' | 'startswith' | 'endswith';
|
|
52
|
+
value: string | number | boolean | null;
|
|
53
|
+
}
|
|
54
|
+
export interface ParsedQuery {
|
|
55
|
+
select?: string[];
|
|
56
|
+
top?: number;
|
|
57
|
+
skip: number;
|
|
58
|
+
/** ANDed together. `or` is not supported, and saying so is the point — see the file header. */
|
|
59
|
+
filters: FilterNode[];
|
|
60
|
+
orderby: Array<{
|
|
61
|
+
field: string;
|
|
62
|
+
desc: boolean;
|
|
63
|
+
}>;
|
|
64
|
+
count: boolean;
|
|
65
|
+
}
|
|
66
|
+
export type ParseResult = {
|
|
67
|
+
ok: true;
|
|
68
|
+
value: ParsedQuery;
|
|
69
|
+
} | {
|
|
70
|
+
ok: false;
|
|
71
|
+
code: 'NOT_IMPLEMENTED' | 'BAD_REQUEST';
|
|
72
|
+
message: string;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Read the system query options, refusing everything not understood.
|
|
76
|
+
*
|
|
77
|
+
* The `edmName` mapping runs in both directions here: a client saw `first_name` in the metadata and
|
|
78
|
+
* sends `$filter=first_name eq 'x'`, while the row still holds `first name`. Resolving through the
|
|
79
|
+
* schema means the client only ever has to know the names the metadata gave it.
|
|
80
|
+
*/
|
|
81
|
+
export declare function parseQuery(params: URLSearchParams, schema: TableSchema): ParseResult;
|
|
82
|
+
export interface QueryPage {
|
|
83
|
+
rows: Array<Record<string, unknown>>;
|
|
84
|
+
/** Rows matching the filter, BEFORE $top/$skip — what `$count=true` reports. */
|
|
85
|
+
matched: number;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Apply the parsed query. `RowId` is assigned before filtering, so a row keeps the same key whatever
|
|
89
|
+
* a client asks for — a key that shifted with the query would make the entity identity meaningless.
|
|
90
|
+
*/
|
|
91
|
+
export declare function applyQuery(rows: Array<Record<string, unknown>>, q: ParsedQuery, schema: TableSchema): QueryPage;
|
|
92
|
+
//# sourceMappingURL=odata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odata.d.ts","sourceRoot":"","sources":["../../../../src/services/datapackage/odata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,UAAU,EAAiC,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5F,+FAA+F;AAC/F,eAAO,MAAM,eAAe,mFAAoF,CAAC;AAajH;;qGAEqG;AACrG,eAAO,MAAM,OAAO,UAAU,CAAC;AAQ/B;;6FAE6F;AAC7F,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG3C;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAqBxE;AAeD,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;IACrF,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,WAAW;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACjD,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GACjB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAChC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAiB9E;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,GAAG,WAAW,CAsFpF;AAmDD,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrC,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,CAqB/G"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/** Every system query option this implementation honours. Anything else is refused by name. */
|
|
2
|
+
export const ODATA_SUPPORTED = ['$select', '$top', '$skip', '$filter', '$orderby', '$count', '$format'];
|
|
3
|
+
/** Frictionless type → EDM primitive. The one mapping; nothing else decides an OData type. */
|
|
4
|
+
const EDM = {
|
|
5
|
+
string: 'Edm.String',
|
|
6
|
+
integer: 'Edm.Int64',
|
|
7
|
+
number: 'Edm.Double',
|
|
8
|
+
boolean: 'Edm.Boolean',
|
|
9
|
+
date: 'Edm.Date',
|
|
10
|
+
datetime: 'Edm.DateTimeOffset',
|
|
11
|
+
any: 'Edm.String',
|
|
12
|
+
};
|
|
13
|
+
/** The synthetic key. A CSV row has no identity of its own, and OData requires an entity key — so
|
|
14
|
+
* one is supplied rather than a natural column being promoted to a role it cannot fill. It is the
|
|
15
|
+
* row's ordinal WITHIN THIS IMMUTABLE VERSION, which is stable precisely because the version is. */
|
|
16
|
+
export const ROW_KEY = 'RowId';
|
|
17
|
+
/** XML text, escaped. A field name comes from the producer's data, so it is not trusted markup. */
|
|
18
|
+
function xml(s) {
|
|
19
|
+
return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
|
|
20
|
+
.replace(/"/g, '"').replace(/'/g, ''');
|
|
21
|
+
}
|
|
22
|
+
/** A CSDL identifier: letters, digits and underscore, not starting with a digit. A column called
|
|
23
|
+
* `first name` or `2026` is legal in a CSV and illegal here, so it is mapped rather than rejected —
|
|
24
|
+
* and the mapping is recorded in the descriptor's own field name, which does not change. */
|
|
25
|
+
export function edmName(raw) {
|
|
26
|
+
const cleaned = String(raw).replace(/[^A-Za-z0-9_]/g, '_');
|
|
27
|
+
return /^[0-9]/.test(cleaned) ? `_${cleaned}` : (cleaned || '_');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The CSDL v4 document (`$metadata`) for one package version.
|
|
31
|
+
*
|
|
32
|
+
* `Nullable="true"` on every property except the key, deliberately: a Table Schema's `primaryKey` is
|
|
33
|
+
* the only statement anybody made about required-ness, and claiming a column is non-nullable because
|
|
34
|
+
* it happened to be full in this version would be a promise the next version breaks.
|
|
35
|
+
*/
|
|
36
|
+
export function toCsdl(descriptor, namespace) {
|
|
37
|
+
// A CSDL namespace is a DOTTED identifier ("AIMEAT.shortages"), so each segment is sanitised and
|
|
38
|
+
// the dots survive. Running edmName over the whole string turned the separator into an
|
|
39
|
+
// underscore, and the EntitySet then named a type in a namespace nobody had declared.
|
|
40
|
+
const ns = String(namespace).split('.').map(edmName).join('.');
|
|
41
|
+
const types = descriptor.resources.map(r => entityType(r, ns)).join('\n');
|
|
42
|
+
const sets = descriptor.resources
|
|
43
|
+
.map(r => ` <EntitySet Name="${xml(edmName(r.name))}" EntityType="${xml(ns)}.${xml(edmName(r.name))}"/>`)
|
|
44
|
+
.join('\n');
|
|
45
|
+
return `<?xml version="1.0" encoding="utf-8"?>
|
|
46
|
+
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
|
47
|
+
<edmx:DataServices>
|
|
48
|
+
<Schema Namespace="${xml(ns)}" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
|
49
|
+
${types}
|
|
50
|
+
<EntityContainer Name="Container">
|
|
51
|
+
${sets}
|
|
52
|
+
</EntityContainer>
|
|
53
|
+
</Schema>
|
|
54
|
+
</edmx:DataServices>
|
|
55
|
+
</edmx:Edmx>
|
|
56
|
+
`;
|
|
57
|
+
}
|
|
58
|
+
function entityType(resource, _ns) {
|
|
59
|
+
const props = resource.schema.fields
|
|
60
|
+
.map(f => ` <Property Name="${xml(edmName(f.name))}" Type="${EDM[f.type] ?? 'Edm.String'}" Nullable="true"/>`)
|
|
61
|
+
.join('\n');
|
|
62
|
+
return ` <EntityType Name="${xml(edmName(resource.name))}">
|
|
63
|
+
<Key><PropertyRef Name="${ROW_KEY}"/></Key>
|
|
64
|
+
<Property Name="${ROW_KEY}" Type="Edm.Int64" Nullable="false"/>
|
|
65
|
+
${props}
|
|
66
|
+
</EntityType>`;
|
|
67
|
+
}
|
|
68
|
+
const COMPARISON = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s+(eq|ne|gt|ge|lt|le)\s+(.+?)\s*$/;
|
|
69
|
+
const FUNCTION = /^\s*(contains|startswith|endswith)\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*,\s*(.+?)\s*\)\s*$/;
|
|
70
|
+
/** An OData literal: a quoted string (with '' for an embedded quote), a number, true/false, null. */
|
|
71
|
+
function literal(raw) {
|
|
72
|
+
const s = raw.trim();
|
|
73
|
+
if (/^'.*'$/s.test(s))
|
|
74
|
+
return s.slice(1, -1).replace(/''/g, "'");
|
|
75
|
+
if (/^-?\d+$/.test(s))
|
|
76
|
+
return parseInt(s, 10);
|
|
77
|
+
if (/^-?\d*\.\d+([eE][+-]?\d+)?$/.test(s))
|
|
78
|
+
return parseFloat(s);
|
|
79
|
+
if (s === 'true')
|
|
80
|
+
return true;
|
|
81
|
+
if (s === 'false')
|
|
82
|
+
return false;
|
|
83
|
+
if (s === 'null')
|
|
84
|
+
return null;
|
|
85
|
+
return undefined; // not a literal this implementation reads
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Read the system query options, refusing everything not understood.
|
|
89
|
+
*
|
|
90
|
+
* The `edmName` mapping runs in both directions here: a client saw `first_name` in the metadata and
|
|
91
|
+
* sends `$filter=first_name eq 'x'`, while the row still holds `first name`. Resolving through the
|
|
92
|
+
* schema means the client only ever has to know the names the metadata gave it.
|
|
93
|
+
*/
|
|
94
|
+
export function parseQuery(params, schema) {
|
|
95
|
+
// Every field, addressable by the name the metadata published.
|
|
96
|
+
const byEdm = new Map(schema.fields.map(f => [edmName(f.name), f.name]));
|
|
97
|
+
byEdm.set(ROW_KEY, ROW_KEY);
|
|
98
|
+
for (const key of params.keys()) {
|
|
99
|
+
if (!key.startsWith('$'))
|
|
100
|
+
continue; // a custom parameter is the caller's business
|
|
101
|
+
if (!ODATA_SUPPORTED.includes(key)) {
|
|
102
|
+
return {
|
|
103
|
+
ok: false, code: 'NOT_IMPLEMENTED',
|
|
104
|
+
message: `${key} is not implemented on this feed. Supported: ${ODATA_SUPPORTED.join(', ')}. `
|
|
105
|
+
+ 'It is refused rather than ignored, because an ignored query option returns more rows '
|
|
106
|
+
+ 'than you asked for and looks like an answer.',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const out = { skip: 0, filters: [], orderby: [], count: false };
|
|
111
|
+
const select = params.get('$select');
|
|
112
|
+
if (select) {
|
|
113
|
+
const names = [];
|
|
114
|
+
for (const raw of select.split(',').map(s => s.trim()).filter(Boolean)) {
|
|
115
|
+
const real = byEdm.get(raw);
|
|
116
|
+
if (!real)
|
|
117
|
+
return { ok: false, code: 'BAD_REQUEST', message: `$select names no such property: ${raw}` };
|
|
118
|
+
names.push(real);
|
|
119
|
+
}
|
|
120
|
+
out.select = names;
|
|
121
|
+
}
|
|
122
|
+
for (const [name, target] of [['$top', 'top'], ['$skip', 'skip']]) {
|
|
123
|
+
const raw = params.get(name);
|
|
124
|
+
if (raw === null)
|
|
125
|
+
continue;
|
|
126
|
+
const n = Number(raw);
|
|
127
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
128
|
+
return { ok: false, code: 'BAD_REQUEST', message: `${name} must be a non-negative integer, got "${raw}"` };
|
|
129
|
+
}
|
|
130
|
+
if (target === 'top')
|
|
131
|
+
out.top = n;
|
|
132
|
+
else
|
|
133
|
+
out.skip = n;
|
|
134
|
+
}
|
|
135
|
+
const count = params.get('$count');
|
|
136
|
+
if (count !== null) {
|
|
137
|
+
if (count !== 'true' && count !== 'false') {
|
|
138
|
+
return { ok: false, code: 'BAD_REQUEST', message: `$count must be true or false, got "${count}"` };
|
|
139
|
+
}
|
|
140
|
+
out.count = count === 'true';
|
|
141
|
+
}
|
|
142
|
+
const orderby = params.get('$orderby');
|
|
143
|
+
if (orderby) {
|
|
144
|
+
for (const clause of orderby.split(',').map(s => s.trim()).filter(Boolean)) {
|
|
145
|
+
const [field, dir] = clause.split(/\s+/);
|
|
146
|
+
const real = byEdm.get(field);
|
|
147
|
+
if (!real)
|
|
148
|
+
return { ok: false, code: 'BAD_REQUEST', message: `$orderby names no such property: ${field}` };
|
|
149
|
+
if (dir && dir !== 'asc' && dir !== 'desc') {
|
|
150
|
+
return { ok: false, code: 'BAD_REQUEST', message: `$orderby direction must be asc or desc, got "${dir}"` };
|
|
151
|
+
}
|
|
152
|
+
out.orderby.push({ field: real, desc: dir === 'desc' });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const filter = params.get('$filter');
|
|
156
|
+
if (filter) {
|
|
157
|
+
// `or` and `not` get their OWN refusal, ahead of everything else, because the split below is
|
|
158
|
+
// on `and`: an `or` left in would be silently torn into two ANDed clauses and match FEWER
|
|
159
|
+
// rows than asked for, with no symptom at all. Tested with string literals blanked first, so
|
|
160
|
+
// `name eq 'or'` is data rather than an operator.
|
|
161
|
+
const bare = filter.replace(/'(?:[^']|'')*'/g, "''");
|
|
162
|
+
if (/\bor\b/i.test(bare) || /\bnot\b/i.test(bare)) {
|
|
163
|
+
return {
|
|
164
|
+
ok: false, code: 'NOT_IMPLEMENTED',
|
|
165
|
+
message: '$filter supports `field op value` clauses joined by `and`, plus contains(), '
|
|
166
|
+
+ 'startswith() and endswith(). `or` and `not` are not implemented. Refused rather '
|
|
167
|
+
+ 'than partly applied: a filter this server half-understood would return the wrong '
|
|
168
|
+
+ 'rows and look like an answer.',
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// Anything else fails per CLAUSE, which is where the message can name the offending text.
|
|
172
|
+
for (const clause of filter.split(/\s+and\s+/i)) {
|
|
173
|
+
const node = parseClause(clause, byEdm);
|
|
174
|
+
if ('message' in node)
|
|
175
|
+
return { ok: false, code: node.code, message: node.message };
|
|
176
|
+
out.filters.push(node);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return { ok: true, value: out };
|
|
180
|
+
}
|
|
181
|
+
function parseClause(clause, byEdm) {
|
|
182
|
+
const fn = FUNCTION.exec(clause);
|
|
183
|
+
if (fn) {
|
|
184
|
+
const real = byEdm.get(fn[2]);
|
|
185
|
+
if (!real)
|
|
186
|
+
return { code: 'BAD_REQUEST', message: `$filter names no such property: ${fn[2]}` };
|
|
187
|
+
const v = literal(fn[3]);
|
|
188
|
+
if (v === undefined)
|
|
189
|
+
return { code: 'BAD_REQUEST', message: `$filter value not understood: ${fn[3]}` };
|
|
190
|
+
return { field: real, op: fn[1], value: v };
|
|
191
|
+
}
|
|
192
|
+
const cmp = COMPARISON.exec(clause);
|
|
193
|
+
if (cmp) {
|
|
194
|
+
const real = byEdm.get(cmp[1]);
|
|
195
|
+
if (!real)
|
|
196
|
+
return { code: 'BAD_REQUEST', message: `$filter names no such property: ${cmp[1]}` };
|
|
197
|
+
const v = literal(cmp[3]);
|
|
198
|
+
if (v === undefined)
|
|
199
|
+
return { code: 'BAD_REQUEST', message: `$filter value not understood: ${cmp[3]}` };
|
|
200
|
+
return { field: real, op: cmp[2], value: v };
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
code: 'NOT_IMPLEMENTED',
|
|
204
|
+
message: `$filter clause not understood: "${clause.trim()}". This feed reads `
|
|
205
|
+
+ '`field eq|ne|gt|ge|lt|le value` and contains/startswith/endswith(field, \'value\'), joined by `and`.',
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/** Comparable form: a date string sorts and compares correctly as a string because it is ISO 8601. */
|
|
209
|
+
function cmpValue(a, b) {
|
|
210
|
+
if (a === null || a === undefined)
|
|
211
|
+
return b === null || b === undefined ? 0 : -1;
|
|
212
|
+
if (b === null || b === undefined)
|
|
213
|
+
return 1;
|
|
214
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
215
|
+
return a - b;
|
|
216
|
+
return String(a) < String(b) ? -1 : String(a) > String(b) ? 1 : 0;
|
|
217
|
+
}
|
|
218
|
+
function matches(row, f) {
|
|
219
|
+
const v = row[f.field];
|
|
220
|
+
switch (f.op) {
|
|
221
|
+
case 'eq': return cmpValue(v, f.value) === 0;
|
|
222
|
+
case 'ne': return cmpValue(v, f.value) !== 0;
|
|
223
|
+
case 'gt': return cmpValue(v, f.value) > 0;
|
|
224
|
+
case 'ge': return cmpValue(v, f.value) >= 0;
|
|
225
|
+
case 'lt': return cmpValue(v, f.value) < 0;
|
|
226
|
+
case 'le': return cmpValue(v, f.value) <= 0;
|
|
227
|
+
case 'contains': return String(v ?? '').includes(String(f.value));
|
|
228
|
+
case 'startswith': return String(v ?? '').startsWith(String(f.value));
|
|
229
|
+
case 'endswith': return String(v ?? '').endsWith(String(f.value));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Apply the parsed query. `RowId` is assigned before filtering, so a row keeps the same key whatever
|
|
234
|
+
* a client asks for — a key that shifted with the query would make the entity identity meaningless.
|
|
235
|
+
*/
|
|
236
|
+
export function applyQuery(rows, q, schema) {
|
|
237
|
+
let out = rows.map((r, i) => ({ [ROW_KEY]: i, ...r }));
|
|
238
|
+
for (const f of q.filters)
|
|
239
|
+
out = out.filter(r => matches(r, f));
|
|
240
|
+
const matched = out.length;
|
|
241
|
+
for (const o of [...q.orderby].reverse()) {
|
|
242
|
+
out = [...out].sort((a, b) => (o.desc ? -1 : 1) * cmpValue(a[o.field], b[o.field]));
|
|
243
|
+
}
|
|
244
|
+
out = out.slice(q.skip, q.top === undefined ? undefined : q.skip + q.top);
|
|
245
|
+
if (q.select) {
|
|
246
|
+
const keep = new Set([ROW_KEY, ...q.select]);
|
|
247
|
+
out = out.map(r => Object.fromEntries(Object.entries(r).filter(([k]) => keep.has(k))));
|
|
248
|
+
}
|
|
249
|
+
// Property names go back out as the metadata published them, which is what the client asked with.
|
|
250
|
+
const rename = new Map(schema.fields.map(f => [f.name, edmName(f.name)]));
|
|
251
|
+
return {
|
|
252
|
+
rows: out.map(r => Object.fromEntries(Object.entries(r).map(([k, v]) => [rename.get(k) ?? k, v]))),
|
|
253
|
+
matched,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=odata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odata.js","sourceRoot":"","sources":["../../../../src/services/datapackage/odata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Descriptor } from './contract.js';
|
|
2
|
+
/** Where the generated sheet sits, beside the descriptor it was projected from. */
|
|
3
|
+
export declare const odpsYamlKey: (name: string, contentHash: string) => string;
|
|
4
|
+
export interface OdpsProjectionInput {
|
|
5
|
+
descriptor: Descriptor;
|
|
6
|
+
ownerGhii: string;
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
/** The permanent, session-free URL of each resource's CSV, keyed by resource name. */
|
|
9
|
+
resourceUrls: Record<string, string>;
|
|
10
|
+
descriptorUrl: string;
|
|
11
|
+
/** ISO 639-1 language the `details` block is keyed by. v4.1 requires the map. */
|
|
12
|
+
lang?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Project one published version into an ODPS v4.1 document.
|
|
16
|
+
*
|
|
17
|
+
* Everything traces to the descriptor. `status` is 'production' because a published version at a
|
|
18
|
+
* permanent immutable address is exactly that — a draft is a thing that has not been published, and
|
|
19
|
+
* this function only ever sees published ones.
|
|
20
|
+
*/
|
|
21
|
+
export declare function descriptorToOdps(input: OdpsProjectionInput): Record<string, unknown>;
|
|
22
|
+
/** The generated sheet as YAML — the format ODPS leads with. */
|
|
23
|
+
export declare function odpsToYamlDocument(doc: Record<string, unknown>): string;
|
|
24
|
+
//# sourceMappingURL=odps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odps.d.ts","sourceRoot":"","sources":["../../../../src/services/datapackage/odps.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEtE,mFAAmF;AACnF,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,aAAa,MAAM,KAAG,MACJ,CAAC;AA0B7D,MAAM,WAAW,mBAAmB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoHpF;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEvE"}
|