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,533 @@
|
|
|
1
|
+
import { writeStorageFile } from '../storage-file-write.js';
|
|
2
|
+
import { emitResourceUpdated, emitResourceListChanged } from '../../mcp/index.js';
|
|
3
|
+
import { provenanceForWrite } from '../ai-provenance.js';
|
|
4
|
+
import { stableStringify } from '../../utils/stable-json.js';
|
|
5
|
+
import { logger } from '../../utils/logger.js';
|
|
6
|
+
import { bare, bytesHash, contentHashOf, descriptorKey, latestKey, packageId, packageKeyRoot, publicUrl, resourceKey, resourcePath, validateName, RESOURCE_NAME_RE, } from './contract.js';
|
|
7
|
+
import { inferSchema, toCsv, fromCsv, validateRows } from './table.js';
|
|
8
|
+
import { descriptorToOdps, odpsToYamlDocument, odpsYamlKey } from './odps.js';
|
|
9
|
+
/**
|
|
10
|
+
* Build, check and store one version.
|
|
11
|
+
*
|
|
12
|
+
* `unchanged: true` means the content hash matched what is already published: the same address
|
|
13
|
+
* already holds these exact bytes, so nothing was rewritten. That is not a failure and not a new
|
|
14
|
+
* version — it is a deterministic producer proving it is deterministic, and the caller should say
|
|
15
|
+
* so rather than announcing an update that did not happen.
|
|
16
|
+
*/
|
|
17
|
+
export async function publishPackage(deps, ownerGhii, input, producedBy) {
|
|
18
|
+
const { storage, config } = deps;
|
|
19
|
+
const ownerName = ownerGhii.split('@')[0];
|
|
20
|
+
const nameError = validateName(input.name);
|
|
21
|
+
if (nameError)
|
|
22
|
+
return { ok: false, code: 'INVALID_INPUT', message: nameError, issues: [] };
|
|
23
|
+
if (!input.changes || !input.changes.trim()) {
|
|
24
|
+
return {
|
|
25
|
+
ok: false, code: 'INVALID_INPUT', issues: [],
|
|
26
|
+
message: 'changes is required: every version says what moved against the previous one and why. '
|
|
27
|
+
+ 'A version nobody explained is a version a consumer cannot decide about.',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (!Array.isArray(input.resources) || input.resources.length === 0) {
|
|
31
|
+
return { ok: false, code: 'INVALID_INPUT', message: 'a package needs at least one resource', issues: [] };
|
|
32
|
+
}
|
|
33
|
+
// ── 1. Schema, then the gate. Nothing is serialised until every resource passes. ──
|
|
34
|
+
const issues = [];
|
|
35
|
+
const prepared = [];
|
|
36
|
+
for (const res of input.resources) {
|
|
37
|
+
if (!RESOURCE_NAME_RE.test(res.name)) {
|
|
38
|
+
return { ok: false, code: 'INVALID_INPUT', issues: [],
|
|
39
|
+
message: `resource name "${res.name}" must be lowercase letters, digits and dashes, 2-64 characters` };
|
|
40
|
+
}
|
|
41
|
+
if (!Array.isArray(res.rows)) {
|
|
42
|
+
return { ok: false, code: 'INVALID_INPUT', message: `resource "${res.name}" has no rows array`, issues: [] };
|
|
43
|
+
}
|
|
44
|
+
const inferred = res.schema === 'infer';
|
|
45
|
+
const schema = inferred ? inferSchema(res.rows) : res.schema;
|
|
46
|
+
if (!schema?.fields?.length) {
|
|
47
|
+
return { ok: false, code: 'INVALID_INPUT', issues: [],
|
|
48
|
+
message: `resource "${res.name}" has no fields — an empty schema describes nothing` };
|
|
49
|
+
}
|
|
50
|
+
issues.push(...validateRows(res.name, res.rows, schema));
|
|
51
|
+
prepared.push({ name: res.name, schema, inferred, rows: res.rows, title: res.title, description: res.description });
|
|
52
|
+
}
|
|
53
|
+
if (issues.length > 0) {
|
|
54
|
+
return {
|
|
55
|
+
ok: false, code: 'QUALITY_GATE', issues,
|
|
56
|
+
message: `${issues.length} row/column problem(s): the data does not validate against its own Table Schema, `
|
|
57
|
+
+ 'so no version was written and the package still stands on its previous one.',
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// ── 2. Serialise. Canonical CSV, hashed per resource. ──
|
|
61
|
+
const bodies = prepared.map(p => {
|
|
62
|
+
const data = toCsv(p.rows, p.schema);
|
|
63
|
+
return { ...p, data, hash: bytesHash(data) };
|
|
64
|
+
});
|
|
65
|
+
const schemaSource = bodies.every(b => b.inferred) ? 'inferred' : bodies.some(b => b.inferred) ? 'mixed' : 'declared';
|
|
66
|
+
const resources = bodies.map(b => ({
|
|
67
|
+
name: b.name,
|
|
68
|
+
path: resourcePath(b.name),
|
|
69
|
+
profile: 'tabular-data-resource',
|
|
70
|
+
format: 'csv',
|
|
71
|
+
mediatype: 'text/csv',
|
|
72
|
+
encoding: 'utf-8',
|
|
73
|
+
schema: b.schema,
|
|
74
|
+
rowCount: b.rows.length,
|
|
75
|
+
bytes: b.data.length,
|
|
76
|
+
hash: b.hash,
|
|
77
|
+
...(b.title ? { title: b.title } : {}),
|
|
78
|
+
...(b.description ? { description: b.description } : {}),
|
|
79
|
+
}));
|
|
80
|
+
// What this version replaces, read from the pointer BEFORE it moves. The caller may state a
|
|
81
|
+
// lineage of its own — a package rebuilt from somebody else's, say — and an explicit claim wins;
|
|
82
|
+
// otherwise it is simply the version that stood here a moment ago. Deriving it is the point: a
|
|
83
|
+
// history that only exists when a producer remembers to fill a field is not a history.
|
|
84
|
+
//
|
|
85
|
+
// It is deliberately NOT in the content hash (see contentHashOf): "what I replaced" is where a
|
|
86
|
+
// version sits, not what it contains, and hashing it would give the same rows two addresses
|
|
87
|
+
// depending on whether anything came before.
|
|
88
|
+
const previous = await readLatestPointer(deps, ownerGhii, input.name);
|
|
89
|
+
const supersedes = input.provenance?.supersedes
|
|
90
|
+
?? (previous?.contentHash ? `${previous.packageId}@${previous.contentHash}` : undefined);
|
|
91
|
+
const now = new Date().toISOString();
|
|
92
|
+
const withoutHash = {
|
|
93
|
+
name: input.name,
|
|
94
|
+
profile: 'tabular-data-package',
|
|
95
|
+
resources,
|
|
96
|
+
...(input.title ? { title: input.title } : {}),
|
|
97
|
+
...(input.description ? { description: input.description } : {}),
|
|
98
|
+
...(input.provenance?.license ? { licenses: [{ name: input.provenance.license }] } : {}),
|
|
99
|
+
created: now,
|
|
100
|
+
aimeat: {
|
|
101
|
+
packageId: packageId(ownerName, input.name),
|
|
102
|
+
changes: input.changes.trim(),
|
|
103
|
+
producer: {
|
|
104
|
+
kind: producedBy.kind,
|
|
105
|
+
...(producedBy.ref ? { ref: producedBy.ref } : {}),
|
|
106
|
+
...(producedBy.schedule ? { schedule: producedBy.schedule } : {}),
|
|
107
|
+
},
|
|
108
|
+
producedBy: { gaii: producedBy.gaii, ...(producedBy.run ? { run: producedBy.run } : {}), at: now },
|
|
109
|
+
schemaSource,
|
|
110
|
+
...(input.parameters ? { parameters: input.parameters } : {}),
|
|
111
|
+
...(input.provenance ?? {}),
|
|
112
|
+
...(supersedes ? { supersedes } : {}),
|
|
113
|
+
...(input.retentionPolicy ? { retentionPolicy: input.retentionPolicy } : {}),
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
const contentHash = contentHashOf(withoutHash);
|
|
117
|
+
const descriptor = { ...withoutHash, aimeat: { ...withoutHash.aimeat, contentHash } };
|
|
118
|
+
// TARGET-058: an agent publishing a package is model-touched output, and that gets DECLARED
|
|
119
|
+
// rather than inferred from the shape of the caller. `provenanceForWrite` decides from the
|
|
120
|
+
// PRINCIPAL whether a record is minted at all — an owner publishing through their own token is
|
|
121
|
+
// never stamped — so this is one call rather than a branch here. It lands AFTER the hash on
|
|
122
|
+
// purpose: a provenance id is a fresh UUID, and putting it inside the identity would make two
|
|
123
|
+
// identical runs produce two versions.
|
|
124
|
+
const aiProvenanceId = await provenanceForWrite(storage, {
|
|
125
|
+
principal: producedBy.gaii,
|
|
126
|
+
content: stableStringify(descriptor),
|
|
127
|
+
declaredId: input.declaredProvenanceId,
|
|
128
|
+
declared: input.declaredProvenance,
|
|
129
|
+
pipeline: `datapackage.publish.${producedBy.kind}`,
|
|
130
|
+
// A published package is world-readable at a permanent address and is read by people as well
|
|
131
|
+
// as programs, which is exactly the surface the disclosure rules are written for.
|
|
132
|
+
surface: { visibility: 'public', humanAudience: true },
|
|
133
|
+
labelPolicy: config.aiLabelPublic,
|
|
134
|
+
nodeId: config.nodeId,
|
|
135
|
+
baseUrl: config.baseUrl,
|
|
136
|
+
enabled: config.aiProvenance,
|
|
137
|
+
});
|
|
138
|
+
if (aiProvenanceId)
|
|
139
|
+
descriptor.aimeat.aiProvenanceId = aiProvenanceId;
|
|
140
|
+
// ── 3. Already published? The address carries the hash, so the same bytes are already there. ──
|
|
141
|
+
const dKey = descriptorKey(input.name, contentHash);
|
|
142
|
+
const existing = await storage.getStorageFile(ownerGhii, dKey);
|
|
143
|
+
const descriptorUrl = publicUrl(config.baseUrl, ownerGhii, dKey);
|
|
144
|
+
const resourceUrls = bodies.map(b => ({
|
|
145
|
+
name: b.name,
|
|
146
|
+
url: publicUrl(config.baseUrl, ownerGhii, resourceKey(input.name, contentHash, b.name)),
|
|
147
|
+
rowCount: b.rows.length,
|
|
148
|
+
bytes: b.data.length,
|
|
149
|
+
}));
|
|
150
|
+
if (existing) {
|
|
151
|
+
await writeLatest(deps, ownerGhii, input.name, contentHash, descriptorUrl, now);
|
|
152
|
+
// Nothing new was written, so nothing is pruned: retention trims what a NEW version pushed
|
|
153
|
+
// out, and a re-publish of existing content pushed nothing out.
|
|
154
|
+
return { ok: true, descriptor, contentHash, descriptorUrl, unchanged: true, resources: resourceUrls, pruned: [] };
|
|
155
|
+
}
|
|
156
|
+
// ── 4. Write. Bytes first, descriptor last: a descriptor is a promise about resources, and a
|
|
157
|
+
// reader that finds one must find what it points at. ──
|
|
158
|
+
for (const b of bodies) {
|
|
159
|
+
const written = await writeStorageFile({ storage, config, emitResourceUpdated, emitResourceListChanged }, ownerGhii, {
|
|
160
|
+
key: resourceKey(input.name, contentHash, b.name),
|
|
161
|
+
data: b.data,
|
|
162
|
+
mimeType: 'text/csv; charset=utf-8',
|
|
163
|
+
visibility: 'public',
|
|
164
|
+
});
|
|
165
|
+
if (!written.ok) {
|
|
166
|
+
return { ok: false, code: 'INVALID_INPUT', issues: [],
|
|
167
|
+
message: `storing resource "${b.name}" failed: ${written.message}` };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const descriptorBytes = Buffer.from(JSON.stringify(descriptor, null, 2) + '\n', 'utf8');
|
|
171
|
+
const wroteDescriptor = await writeStorageFile({ storage, config, emitResourceUpdated, emitResourceListChanged }, ownerGhii, {
|
|
172
|
+
key: dKey,
|
|
173
|
+
data: descriptorBytes,
|
|
174
|
+
mimeType: 'application/json; charset=utf-8',
|
|
175
|
+
visibility: 'public',
|
|
176
|
+
});
|
|
177
|
+
if (!wroteDescriptor.ok) {
|
|
178
|
+
return { ok: false, code: 'INVALID_INPUT', message: `storing the descriptor failed: ${wroteDescriptor.message}`, issues: [] };
|
|
179
|
+
}
|
|
180
|
+
// The product sheet, projected from the descriptor and stored beside it. Generated rather than
|
|
181
|
+
// authored: every field traces to something the descriptor already holds, so it cannot drift from
|
|
182
|
+
// the package and needs no mapping layer to maintain. It rides with the version, so a buyer
|
|
183
|
+
// reading a pinned version reads the sheet that describes THAT one.
|
|
184
|
+
const odpsDoc = descriptorToOdps({
|
|
185
|
+
descriptor, ownerGhii, baseUrl: config.baseUrl, descriptorUrl,
|
|
186
|
+
resourceUrls: Object.fromEntries(resourceUrls.map(r => [r.name, r.url])),
|
|
187
|
+
});
|
|
188
|
+
await writeStorageFile({ storage, config, emitResourceUpdated, emitResourceListChanged }, ownerGhii, {
|
|
189
|
+
key: odpsYamlKey(input.name, contentHash),
|
|
190
|
+
data: Buffer.from(odpsToYamlDocument(odpsDoc), 'utf8'),
|
|
191
|
+
mimeType: 'text/yaml; charset=utf-8',
|
|
192
|
+
visibility: 'public',
|
|
193
|
+
});
|
|
194
|
+
await writeLatest(deps, ownerGhii, input.name, contentHash, descriptorUrl, now);
|
|
195
|
+
// Retention, if the owner asked for any. AFTER the new version is live and the pointer moves,
|
|
196
|
+
// never before: pruning first would leave a window where the newest version is gone and the new
|
|
197
|
+
// one is not yet published.
|
|
198
|
+
const pruned = input.retentionPolicy
|
|
199
|
+
? await pruneOldVersions(deps, ownerGhii, input.name, input.retentionPolicy, contentHash)
|
|
200
|
+
: [];
|
|
201
|
+
await upsertCatalogueEntry(deps, ownerGhii, descriptor, descriptorUrl).catch(err => {
|
|
202
|
+
// The bytes ARE the package; the catalogue is where a person finds it. A catalogue failure
|
|
203
|
+
// must not un-publish a version that is already at its permanent address, and it must not be
|
|
204
|
+
// swallowed either — an operator seeing this knows a package is live and unlisted.
|
|
205
|
+
logger.warn('datapackage: catalogue entry failed, the package is published and unlisted', {
|
|
206
|
+
package: descriptor.aimeat.packageId, error: String(err),
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
return { ok: true, descriptor, contentHash, descriptorUrl, unchanged: false, resources: resourceUrls, pruned };
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Apply the owner's retention policy: keep the newest N versions, or everything published within the
|
|
213
|
+
* last N months, and remove the rest.
|
|
214
|
+
*
|
|
215
|
+
* FOUR RULES, because this deletes published data at a permanent address:
|
|
216
|
+
*
|
|
217
|
+
* 1. IT ONLY RUNS WHEN THE OWNER ASKED. No policy means keep everything, for ever. A default that
|
|
218
|
+
* quietly deleted somebody's history would be the worst possible default here.
|
|
219
|
+
* 2. THE CURRENT VERSION IS NEVER PRUNED, whatever the arithmetic says. `keep: 0` removes every old
|
|
220
|
+
* version and leaves the one the pointer names, because a package with no readable version is not
|
|
221
|
+
* a retention policy, it is a deletion.
|
|
222
|
+
* 3. A PRUNED VERSION IS GONE, and a consumer pinned to it gets a 404 rather than different bytes.
|
|
223
|
+
* That is the honest failure: the owner chose a retention window, and the descriptor carries the
|
|
224
|
+
* policy so a consumer can see how long a pin is good for before they rely on one.
|
|
225
|
+
* 4. WHAT WAS REMOVED IS RETURNED AND LOGGED. A deletion nobody can see is how a history disappears
|
|
226
|
+
* without anyone noticing which run did it.
|
|
227
|
+
*/
|
|
228
|
+
async function pruneOldVersions(deps, ownerGhii, name, policy, currentHash) {
|
|
229
|
+
const keep = Number(policy.keep);
|
|
230
|
+
if (!Number.isFinite(keep) || keep < 0)
|
|
231
|
+
return [];
|
|
232
|
+
// Every stored file of this package, grouped into versions by the hash segment of its key.
|
|
233
|
+
const root = `${packageKeyRoot(name)}/`;
|
|
234
|
+
const files = (await deps.storage.listStorageFiles(ownerGhii))
|
|
235
|
+
.filter(f => f.key.startsWith(root) && !f.key.endsWith('/latest.json'));
|
|
236
|
+
const versions = new Map();
|
|
237
|
+
for (const f of files) {
|
|
238
|
+
const hash = f.key.slice(root.length).split('/')[0];
|
|
239
|
+
if (!/^[a-f0-9]{64}$/.test(hash))
|
|
240
|
+
continue;
|
|
241
|
+
const at = Date.parse(f.createdAt);
|
|
242
|
+
const entry = versions.get(hash) ?? { keys: [], at: 0 };
|
|
243
|
+
entry.keys.push(f.key);
|
|
244
|
+
entry.at = Math.max(entry.at, Number.isFinite(at) ? at : 0);
|
|
245
|
+
versions.set(hash, entry);
|
|
246
|
+
}
|
|
247
|
+
const current = bare(currentHash);
|
|
248
|
+
const ordered = [...versions.entries()]
|
|
249
|
+
.filter(([hash]) => hash !== current) // rule 2
|
|
250
|
+
.sort((a, b) => b[1].at - a[1].at); // newest first
|
|
251
|
+
let doomed;
|
|
252
|
+
if (policy.unit === 'months') {
|
|
253
|
+
const cutoff = Date.now() - keep * 30 * 24 * 3600_000;
|
|
254
|
+
doomed = ordered.filter(([, v]) => v.at < cutoff);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
// `keep` counts versions INCLUDING the current one, which is what an owner means by "keep the
|
|
258
|
+
// last 30" — so the others list is trimmed to keep-1.
|
|
259
|
+
doomed = ordered.slice(Math.max(0, keep - 1));
|
|
260
|
+
}
|
|
261
|
+
const removed = [];
|
|
262
|
+
for (const [hash, v] of doomed) {
|
|
263
|
+
for (const key of v.keys)
|
|
264
|
+
await deps.storage.deleteStorageFile(ownerGhii, key);
|
|
265
|
+
removed.push(`sha256:${hash}`);
|
|
266
|
+
}
|
|
267
|
+
if (removed.length) {
|
|
268
|
+
logger.info('datapackage: retention removed old versions', {
|
|
269
|
+
package: `${ownerGhii}/${name}`, policy: `${policy.keep} ${policy.unit}`,
|
|
270
|
+
removed: removed.length, versions: removed,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return removed;
|
|
274
|
+
}
|
|
275
|
+
/** The pointer as it stands now, or null when this package has never published a version. A pointer
|
|
276
|
+
* that carries only a recorded failure counts as "nothing published yet", because there is no
|
|
277
|
+
* version at it to supersede. */
|
|
278
|
+
async function readLatestPointer(deps, ownerGhii, name) {
|
|
279
|
+
const file = await deps.storage.getStorageFile(ownerGhii, latestKey(name));
|
|
280
|
+
if (!file)
|
|
281
|
+
return null;
|
|
282
|
+
try {
|
|
283
|
+
const pointer = JSON.parse(file.data.toString('utf8'));
|
|
284
|
+
return pointer.contentHash ? pointer : null;
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
// A pointer we cannot read is a broken pointer, and it must not silently become "no previous
|
|
288
|
+
// version" — that would publish a version claiming to supersede nothing and quietly break
|
|
289
|
+
// the chain. Refusing the publish is louder and correct.
|
|
290
|
+
throw new Error(`latest.json for "${name}" is not readable JSON, so the version chain cannot be `
|
|
291
|
+
+ 'continued honestly', { cause: err });
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/** The mutable pointer for a consumer following the newest version. Clears any recorded failure:
|
|
295
|
+
* a successful publish IS the answer to "the last attempt broke". */
|
|
296
|
+
async function writeLatest(deps, ownerGhii, name, contentHash, descriptorUrl, at) {
|
|
297
|
+
const pointer = {
|
|
298
|
+
packageId: packageId(ownerGhii.split('@')[0], name),
|
|
299
|
+
name, contentHash, descriptorUrl, updatedAt: at,
|
|
300
|
+
};
|
|
301
|
+
await writeStorageFile({ storage: deps.storage, config: deps.config, emitResourceUpdated, emitResourceListChanged }, ownerGhii, {
|
|
302
|
+
key: latestKey(name),
|
|
303
|
+
data: Buffer.from(JSON.stringify(pointer, null, 2) + '\n', 'utf8'),
|
|
304
|
+
mimeType: 'application/json; charset=utf-8',
|
|
305
|
+
visibility: 'public',
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* A run failed. The package stays on the version it had; the pointer says the newest attempt did not
|
|
310
|
+
* land, when, and why. This is the whole of "epäonnistuminen näkyy, eikä sitä peitetä": no empty
|
|
311
|
+
* version is written, and a consumer polling `latest.json` learns the difference between a package
|
|
312
|
+
* that has not changed and one whose producer is broken.
|
|
313
|
+
*/
|
|
314
|
+
export async function recordFailure(deps, ownerGhii, name, message) {
|
|
315
|
+
const key = latestKey(name);
|
|
316
|
+
const existing = await deps.storage.getStorageFile(ownerGhii, key);
|
|
317
|
+
let pointer;
|
|
318
|
+
if (existing) {
|
|
319
|
+
pointer = JSON.parse(existing.data.toString('utf8'));
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
pointer = {
|
|
323
|
+
packageId: packageId(ownerGhii.split('@')[0], name),
|
|
324
|
+
name, contentHash: '', descriptorUrl: '', updatedAt: new Date().toISOString(),
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
pointer.lastError = { at: new Date().toISOString(), message: message.slice(0, 1000) };
|
|
328
|
+
await writeStorageFile({ storage: deps.storage, config: deps.config, emitResourceUpdated, emitResourceListChanged }, ownerGhii, {
|
|
329
|
+
key,
|
|
330
|
+
data: Buffer.from(JSON.stringify(pointer, null, 2) + '\n', 'utf8'),
|
|
331
|
+
mimeType: 'application/json; charset=utf-8',
|
|
332
|
+
visibility: 'public',
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Read a package back. `ref` is `pkg:{owner}/{name}` for the newest version, or
|
|
337
|
+
* `pkg:{owner}/{name}@sha256:…` to pin one. A pinned reference always answers with the same bytes,
|
|
338
|
+
* which is what makes pinning worth anything.
|
|
339
|
+
*/
|
|
340
|
+
export async function openPackage(deps, ref, nodeId) {
|
|
341
|
+
const parsed = parseRef(ref, nodeId);
|
|
342
|
+
if (!parsed)
|
|
343
|
+
return null;
|
|
344
|
+
const { ownerGhii, name, contentHash } = parsed;
|
|
345
|
+
let hash = contentHash;
|
|
346
|
+
let latest;
|
|
347
|
+
if (!hash) {
|
|
348
|
+
const pointerFile = await deps.storage.getStorageFile(ownerGhii, latestKey(name));
|
|
349
|
+
if (!pointerFile)
|
|
350
|
+
return null;
|
|
351
|
+
latest = JSON.parse(pointerFile.data.toString('utf8'));
|
|
352
|
+
if (!latest.contentHash)
|
|
353
|
+
return null; // only a failure has ever been recorded
|
|
354
|
+
hash = latest.contentHash;
|
|
355
|
+
}
|
|
356
|
+
const file = await deps.storage.getStorageFile(ownerGhii, descriptorKey(name, hash));
|
|
357
|
+
if (!file)
|
|
358
|
+
return null;
|
|
359
|
+
return {
|
|
360
|
+
descriptor: JSON.parse(file.data.toString('utf8')),
|
|
361
|
+
descriptorUrl: publicUrl(deps.config.baseUrl, ownerGhii, descriptorKey(name, hash)),
|
|
362
|
+
...(latest ? { latest } : {}),
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
/** Rows of one resource, paginated. The caller names the window; nothing here decides to send a
|
|
366
|
+
* whole table into somebody's context because it happened to fit. */
|
|
367
|
+
export async function readRows(deps, ref, nodeId, resource, opts = {}) {
|
|
368
|
+
const parsed = parseRef(ref, nodeId);
|
|
369
|
+
const opened = await openPackage(deps, ref, nodeId);
|
|
370
|
+
if (!parsed || !opened)
|
|
371
|
+
return null;
|
|
372
|
+
const res = opened.descriptor.resources.find(r => r.name === resource);
|
|
373
|
+
if (!res)
|
|
374
|
+
return null;
|
|
375
|
+
const hash = opened.descriptor.aimeat.contentHash;
|
|
376
|
+
const file = await deps.storage.getStorageFile(parsed.ownerGhii, resourceKey(parsed.name, hash, resource));
|
|
377
|
+
if (!file)
|
|
378
|
+
return null;
|
|
379
|
+
const all = fromCsv(file.data, res.schema);
|
|
380
|
+
const offset = Math.max(0, opts.offset ?? 0);
|
|
381
|
+
const limit = Math.min(Math.max(1, opts.limit ?? 500), 5000);
|
|
382
|
+
let rows = all.slice(offset, offset + limit);
|
|
383
|
+
let schema = res.schema;
|
|
384
|
+
if (opts.select?.length) {
|
|
385
|
+
const keep = new Set(opts.select);
|
|
386
|
+
rows = rows.map(r => Object.fromEntries(Object.entries(r).filter(([k]) => keep.has(k))));
|
|
387
|
+
schema = { ...res.schema, fields: res.schema.fields.filter(f => keep.has(f.name)) };
|
|
388
|
+
}
|
|
389
|
+
return { rows, total: all.length, schema };
|
|
390
|
+
}
|
|
391
|
+
/** Every package one owner has, newest version each, with any recorded failure. */
|
|
392
|
+
export async function listPackages(deps, ownerGhii) {
|
|
393
|
+
const files = await deps.storage.listStorageFiles(ownerGhii);
|
|
394
|
+
const names = files
|
|
395
|
+
.filter(f => f.key.startsWith('datapkg/') && f.key.endsWith('/latest.json'))
|
|
396
|
+
.map(f => f.key.slice('datapkg/'.length, -'/latest.json'.length));
|
|
397
|
+
const out = [];
|
|
398
|
+
for (const name of names) {
|
|
399
|
+
const file = await deps.storage.getStorageFile(ownerGhii, latestKey(name));
|
|
400
|
+
if (file)
|
|
401
|
+
out.push(JSON.parse(file.data.toString('utf8')));
|
|
402
|
+
}
|
|
403
|
+
return out.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Every version of one package, newest first.
|
|
407
|
+
*
|
|
408
|
+
* The versions are DISCOVERED FROM THE KEYS rather than from an index, because the keys are the
|
|
409
|
+
* index: a version is a directory named by its content hash, so nothing can be published without
|
|
410
|
+
* appearing here and nothing can be listed here without existing. An index would be a second thing
|
|
411
|
+
* to keep in step with the first.
|
|
412
|
+
*
|
|
413
|
+
* Each descriptor is read, which is one small GET per version. That is what makes `changes` and
|
|
414
|
+
* `rowCount` available, and it is bounded by the owner's retention policy rather than by time.
|
|
415
|
+
*/
|
|
416
|
+
export async function listVersions(deps, ownerGhii, name) {
|
|
417
|
+
const root = `${packageKeyRoot(name)}/`;
|
|
418
|
+
const currentHash = (await readLatestPointer(deps, ownerGhii, name))?.contentHash ?? '';
|
|
419
|
+
const files = (await deps.storage.listStorageFiles(ownerGhii))
|
|
420
|
+
.filter(f => f.key.startsWith(root) && f.key.endsWith('/datapackage.json'));
|
|
421
|
+
const out = [];
|
|
422
|
+
for (const f of files) {
|
|
423
|
+
const hash = f.key.slice(root.length).split('/')[0];
|
|
424
|
+
if (!/^[a-f0-9]{64}$/.test(hash))
|
|
425
|
+
continue;
|
|
426
|
+
const body = await deps.storage.getStorageFile(ownerGhii, f.key);
|
|
427
|
+
if (!body)
|
|
428
|
+
continue;
|
|
429
|
+
let descriptor;
|
|
430
|
+
try {
|
|
431
|
+
descriptor = JSON.parse(body.data.toString('utf8'));
|
|
432
|
+
}
|
|
433
|
+
catch (err) {
|
|
434
|
+
// A descriptor that will not parse is not skipped quietly: a history with a hole in it
|
|
435
|
+
// reads as a history, and a consumer counting versions would be counting wrong. The
|
|
436
|
+
// caller gets the failure and can say which version is unreadable.
|
|
437
|
+
throw new Error(`datapackage "${name}": the descriptor at ${f.key} is not readable JSON, so the `
|
|
438
|
+
+ 'version history cannot be listed honestly', { cause: err });
|
|
439
|
+
}
|
|
440
|
+
const resource = descriptor.resources?.[0];
|
|
441
|
+
out.push({
|
|
442
|
+
contentHash: descriptor.aimeat.contentHash,
|
|
443
|
+
at: f.createdAt,
|
|
444
|
+
current: bare(descriptor.aimeat.contentHash) === bare(currentHash),
|
|
445
|
+
changes: descriptor.aimeat.changes,
|
|
446
|
+
rowCount: resource?.rowCount ?? 0,
|
|
447
|
+
bytes: resource?.bytes ?? 0,
|
|
448
|
+
descriptorUrl: publicUrl(deps.config.baseUrl, ownerGhii, f.key),
|
|
449
|
+
...(descriptor.aimeat.supersedes ? { supersedes: descriptor.aimeat.supersedes } : {}),
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
return out.sort((a, b) => b.at.localeCompare(a.at));
|
|
453
|
+
}
|
|
454
|
+
/** `pkg:{owner}/{name}` or `pkg:{owner}/{name}@sha256:…`, or the bare `{name}` of your own. */
|
|
455
|
+
export function parseRef(ref, nodeId) {
|
|
456
|
+
const m = /^pkg:([^/@]+)\/([^@]+)(?:@(sha256:[a-f0-9]{64}))?$/.exec(String(ref || '').trim());
|
|
457
|
+
if (!m)
|
|
458
|
+
return null;
|
|
459
|
+
const owner = m[1];
|
|
460
|
+
return {
|
|
461
|
+
ownerGhii: owner.includes('@') ? owner : `${owner}@${nodeId}`,
|
|
462
|
+
name: m[2],
|
|
463
|
+
...(m[3] ? { contentHash: m[3] } : {}),
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* The catalogue side: a knowledge package so the data package appears where people and agents look
|
|
468
|
+
* for knowledge. `content_type: 'dataset'` because the union is closed and `dataset` is already the
|
|
469
|
+
* right word for this; inventing `data-package` would be a type change for no gain.
|
|
470
|
+
*
|
|
471
|
+
* Deterministic id from the packageId, so re-publishing a version updates the entry instead of
|
|
472
|
+
* accumulating one manifest per run — which at a daily cadence is 365 manifests a year for one
|
|
473
|
+
* package, and the memory-key budget is 1000.
|
|
474
|
+
*/
|
|
475
|
+
async function upsertCatalogueEntry(deps, ownerGhii, descriptor, descriptorUrl) {
|
|
476
|
+
const id = bare(bytesHash(Buffer.from(descriptor.aimeat.packageId, 'utf8'))).slice(0, 32);
|
|
477
|
+
const key = `packages/${id}/manifest`;
|
|
478
|
+
const now = new Date().toISOString();
|
|
479
|
+
const existing = await deps.storage.getMemory(ownerGhii, key);
|
|
480
|
+
const manifest = {
|
|
481
|
+
type: 'knowledge-package',
|
|
482
|
+
name: descriptor.title ?? descriptor.name,
|
|
483
|
+
version: bare(descriptor.aimeat.contentHash).slice(0, 12),
|
|
484
|
+
author: ownerGhii,
|
|
485
|
+
created: existing?.value?.created ?? now,
|
|
486
|
+
updated: now,
|
|
487
|
+
content_type: 'dataset',
|
|
488
|
+
tags: ['data-package', 'frictionless', descriptor.name],
|
|
489
|
+
language: 'en',
|
|
490
|
+
maturity: 'stable',
|
|
491
|
+
synthesis: { level: 'original', description: descriptor.aimeat.changes },
|
|
492
|
+
references: (descriptor.aimeat.sources ?? []).map(s => ({ url: s.url ?? '', title: s.title ?? '' })),
|
|
493
|
+
entries: descriptor.resources.map(r => ({
|
|
494
|
+
key: `packages/${id}/${r.name}`,
|
|
495
|
+
title: r.title ?? r.name,
|
|
496
|
+
visibility: 'public',
|
|
497
|
+
})),
|
|
498
|
+
links: [],
|
|
499
|
+
sharing: { catalog_listed: true, allow_clone: false, morsel_price: 0 },
|
|
500
|
+
// The pointer back to the canonical bytes. The catalogue never holds them: a knowledge
|
|
501
|
+
// package is a collection of memory entries, and memory does not carry files.
|
|
502
|
+
x_aimeat_datapackage: {
|
|
503
|
+
packageId: descriptor.aimeat.packageId,
|
|
504
|
+
contentHash: descriptor.aimeat.contentHash,
|
|
505
|
+
descriptorUrl,
|
|
506
|
+
resources: descriptor.resources.map(r => ({ name: r.name, rowCount: r.rowCount, fields: r.schema.fields.length })),
|
|
507
|
+
},
|
|
508
|
+
};
|
|
509
|
+
await deps.storage.setMemory({
|
|
510
|
+
key, ownerGaii: ownerGhii, value: manifest,
|
|
511
|
+
visibility: 'public', tags: ['knowledge-package', 'dataset', 'data-package'], ttlHours: null,
|
|
512
|
+
version: existing ? existing.version + 1 : 1,
|
|
513
|
+
createdAt: existing?.createdAt ?? now, updatedAt: now,
|
|
514
|
+
});
|
|
515
|
+
// One entry per resource, holding its schema — so an agent that found the package through the
|
|
516
|
+
// catalogue learns the columns without fetching a single byte of data.
|
|
517
|
+
for (const r of descriptor.resources) {
|
|
518
|
+
const entryKey = `packages/${id}/${r.name}`;
|
|
519
|
+
const prev = await deps.storage.getMemory(ownerGhii, entryKey);
|
|
520
|
+
await deps.storage.setMemory({
|
|
521
|
+
key: entryKey, ownerGaii: ownerGhii,
|
|
522
|
+
value: {
|
|
523
|
+
resource: r.name, rowCount: r.rowCount, bytes: r.bytes, hash: r.hash,
|
|
524
|
+
schema: r.schema,
|
|
525
|
+
csvUrl: publicUrl(deps.config.baseUrl, ownerGhii, `${packageKeyRoot(descriptor.name)}/${bare(descriptor.aimeat.contentHash)}/${r.path}`),
|
|
526
|
+
},
|
|
527
|
+
visibility: 'public', tags: ['knowledge-entry', 'dataset'], ttlHours: null,
|
|
528
|
+
version: prev ? prev.version + 1 : 1,
|
|
529
|
+
createdAt: prev?.createdAt ?? now, updatedAt: now,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../src/services/datapackage/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/datapackage/table.ts
|
|
3
|
+
* @description The tabular half of the contract, and all of it pure: infer a Table Schema from rows,
|
|
4
|
+
* validate rows against one, and turn rows into canonical CSV and back.
|
|
5
|
+
*
|
|
6
|
+
* INFERENCE IS A PROPOSAL, NOT A DECISION. `inferSchema` reads the values and says what it thinks
|
|
7
|
+
* they are; the descriptor records `schemaSource: 'inferred'` so a consumer can see that nobody
|
|
8
|
+
* confirmed it. The alternative — infer silently — produces packages where every column is a
|
|
9
|
+
* string, and then an agent reading the Table Schema learns nothing it could not have guessed.
|
|
10
|
+
*
|
|
11
|
+
* THE QUALITY GATE IS ROW AND COLUMN ACCURATE. "This package is invalid" sends a publisher looking
|
|
12
|
+
* through a file; "row 412, column `dispensed_at`, expected date, got `n/a`" sends them to the
|
|
13
|
+
* line. That difference is the whole value of validating at all, so `validate` returns coordinates
|
|
14
|
+
* and never a boolean.
|
|
15
|
+
*
|
|
16
|
+
* CANONICAL CSV, because the bytes are hashed and the hash is the version. Two runs producing the
|
|
17
|
+
* same table must produce the same bytes: UTF-8 with no BOM, LF line endings, a header row, comma
|
|
18
|
+
* delimiter, RFC 4180 quoting applied only where it is needed, an empty field for null/undefined,
|
|
19
|
+
* integers and numbers without locale separators, booleans as `true`/`false`, dates as ISO 8601.
|
|
20
|
+
* Field ORDER follows the schema, not the first row's key order, so an object whose keys arrived
|
|
21
|
+
* in a different order cannot change the file.
|
|
22
|
+
* @structure inferSchema · validateRows · toCsv · fromCsv · ValidationIssue
|
|
23
|
+
* @usage
|
|
24
|
+
* const schema = inferSchema(rows);
|
|
25
|
+
* const issues = validateRows(rows, schema);
|
|
26
|
+
* const bytes = toCsv(rows, schema);
|
|
27
|
+
* @version-history
|
|
28
|
+
* v1.0.0 -- 2026-08-15 -- Initial (TARGET-063 vaihe 1, A4/B1).
|
|
29
|
+
*/
|
|
30
|
+
import type { TableSchema } from './contract.js';
|
|
31
|
+
/** One thing wrong, at the coordinate where it is wrong. */
|
|
32
|
+
export interface ValidationIssue {
|
|
33
|
+
resource: string;
|
|
34
|
+
/** 1-based, counting the header as row 0 — so it matches what a spreadsheet shows. */
|
|
35
|
+
row: number;
|
|
36
|
+
field: string;
|
|
37
|
+
code: 'type' | 'required' | 'unknown-field' | 'missing-field' | 'duplicate-key';
|
|
38
|
+
message: string;
|
|
39
|
+
/** What was actually there, trimmed for a message. */
|
|
40
|
+
got?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Propose a Table Schema from rows.
|
|
44
|
+
*
|
|
45
|
+
* Field ORDER is first-seen across the rows, not sorted: a producer laid the columns out in an order
|
|
46
|
+
* that means something, and re-alphabetising them makes the CSV unfamiliar for no gain. A field that
|
|
47
|
+
* was present but never had a value gets type `string` and says so in its description — the honest
|
|
48
|
+
* answer is "nothing to go on", and it is the one case a publisher genuinely has to look at.
|
|
49
|
+
*/
|
|
50
|
+
export declare function inferSchema(rows: Array<Record<string, unknown>>): TableSchema;
|
|
51
|
+
/**
|
|
52
|
+
* Check rows against a schema and return every coordinate that is wrong. Never throws and never
|
|
53
|
+
* stops at the first problem: a publisher fixing one column wants the whole list, not one round trip
|
|
54
|
+
* per cell. Capped so a wholly-wrong table cannot produce a million-entry response.
|
|
55
|
+
*/
|
|
56
|
+
export declare function validateRows(resource: string, rows: Array<Record<string, unknown>>, schema: TableSchema, cap?: number): ValidationIssue[];
|
|
57
|
+
/**
|
|
58
|
+
* Canonical CSV for one resource. Column order and count come from the SCHEMA — a row carrying an
|
|
59
|
+
* extra key contributes nothing and a row missing one contributes an empty field, so a ragged input
|
|
60
|
+
* still produces a rectangular file. Validation is what reports the raggedness; this function's job
|
|
61
|
+
* is to be deterministic.
|
|
62
|
+
*/
|
|
63
|
+
export declare function toCsv(rows: Array<Record<string, unknown>>, schema: TableSchema): Buffer;
|
|
64
|
+
/** Parse canonical CSV back into rows, typed by the schema. The inverse of toCsv for every table
|
|
65
|
+
* toCsv produced; a foreign CSV with different quoting still parses, it just may not round-trip. */
|
|
66
|
+
export declare function fromCsv(data: Buffer, schema: TableSchema): Array<Record<string, unknown>>;
|
|
67
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../../src/services/datapackage/table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAA0B,WAAW,EAAE,MAAM,eAAe,CAAC;AAEzE,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,eAAe,GAAG,eAAe,GAAG,eAAe,CAAC;IAChF,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAkDD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,WAAW,CA4B7E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CACxB,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAM,GACvF,eAAe,EAAE,CAyCnB;AAuBD;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAQvF;AAQD;qGACqG;AACrG,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoBzF"}
|
|
Binary file
|