aimeat 2.1.0 → 2.2.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 +9 -4
- package/dist/locales/en.json +28 -0
- package/dist/locales/fi.json +28 -0
- package/dist/public/cortex-bundled/aimeat-charts.js +158 -10
- package/dist/public/cortex-bundled/aimeat-charts.yaml +1 -1
- package/dist/public/cortex-bundled/aimeat-dag.js +515 -173
- package/dist/public/cortex-bundled/aimeat-dag.yaml +1 -1
- package/dist/public/cortex-bundled/aimeat-i18n.js +6 -1
- package/dist/public/cortex-bundled/aimeat-i18n.yaml +1 -1
- package/dist/public/cortex-bundled/aimeat-surface.js +577 -0
- package/dist/public/cortex-bundled/aimeat-surface.yaml +107 -0
- package/dist/public/cortex-bundled/aimeat-viewport.js +405 -0
- package/dist/public/cortex-bundled/aimeat-viewport.yaml +100 -0
- package/dist/public/css/views/inbox.css +1 -1
- package/dist/public/css/views/profile.css +9 -0
- package/dist/public/lib/VENDORED.md +6 -3
- package/dist/public/lib/aimeat-daisyui-bridge.css +39 -2
- package/dist/public/lib/aimeat-theme.css +538 -0
- package/dist/public/lib/fonts/LICENSE.md +11 -4
- package/dist/public/lib/fonts/fraunces-var-latin-ext.woff2 +0 -0
- package/dist/public/lib/fonts/fraunces-var-latin.woff2 +0 -0
- package/dist/public/lib/fonts/inter-var-latin-ext.woff2 +0 -0
- package/dist/public/lib/fonts/inter-var-latin.woff2 +0 -0
- package/dist/public/lib/fonts/jetbrains-mono-var-latin-ext.woff2 +0 -0
- package/dist/public/lib/fonts/jetbrains-mono-var-latin.woff2 +0 -0
- package/dist/public/lib/fonts/space-grotesk-var-latin-ext.woff2 +0 -0
- package/dist/public/lib/fonts/space-grotesk-var-latin.woff2 +0 -0
- package/dist/public/lib/samples/theme-check.html +92 -0
- package/dist/public/lib/samples/themes-boot.js +20 -0
- package/dist/public/lib/samples/themes.html +154 -0
- package/dist/public/lib/samples/themes.js +60 -0
- package/dist/public/views/profile/access-tab/connected-apps.js +81 -5
- package/dist/public/views/profile/extensions-tab.maturity.js +4 -1
- package/dist/public/views/profile/inbox-tab/components.js +17 -1
- package/dist/public/views/profile/inbox-tab/use-thread-ux.js +29 -2
- package/dist/public/views/profile/libraries-tab.js +10 -2
- package/dist/public/views/profile/wallet-tab.js +64 -0
- package/dist/scripts/check-openapi.d.ts +2 -0
- package/dist/scripts/check-openapi.d.ts.map +1 -0
- package/dist/scripts/check-openapi.js +139 -0
- package/dist/scripts/check-openapi.js.map +1 -0
- package/dist/scripts/embed-viewport.d.ts +23 -0
- package/dist/scripts/embed-viewport.d.ts.map +1 -0
- package/dist/scripts/embed-viewport.js +116 -0
- package/dist/scripts/embed-viewport.js.map +1 -0
- package/dist/src/auth/sse-domain-scopes.d.ts +50 -0
- package/dist/src/auth/sse-domain-scopes.d.ts.map +1 -0
- package/dist/src/auth/sse-domain-scopes.js +111 -0
- package/dist/src/auth/sse-domain-scopes.js.map +1 -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 +4 -1
- package/dist/src/cli/connect/mcp/tools/agent-tasks.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/core.js +14 -3
- package/dist/src/cli/connect/mcp/tools/core.js.map +1 -1
- package/dist/src/cli/connect/mcp/tools/workspaces.d.ts +3 -0
- package/dist/src/cli/connect/mcp/tools/workspaces.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/workspaces.js +4 -2
- package/dist/src/cli/connect/mcp/tools/workspaces.js.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-core.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call-defs-core.js +13 -1
- package/dist/src/cli/connect/tool-call-defs-core.js.map +1 -1
- package/dist/src/commerce/__tests__/x402-registry.test.d.ts +2 -0
- package/dist/src/commerce/__tests__/x402-registry.test.d.ts.map +1 -0
- package/dist/src/commerce/__tests__/x402-registry.test.js +105 -0
- package/dist/src/commerce/__tests__/x402-registry.test.js.map +1 -0
- package/dist/src/commerce/evm-address.d.ts +21 -0
- package/dist/src/commerce/evm-address.d.ts.map +1 -0
- package/dist/src/commerce/evm-address.js +94 -0
- package/dist/src/commerce/evm-address.js.map +1 -0
- package/dist/src/commerce/money.d.ts +18 -5
- package/dist/src/commerce/money.d.ts.map +1 -1
- package/dist/src/commerce/money.js +27 -6
- package/dist/src/commerce/money.js.map +1 -1
- package/dist/src/commerce/x402-facilitator.d.ts +64 -13
- package/dist/src/commerce/x402-facilitator.d.ts.map +1 -1
- package/dist/src/commerce/x402-facilitator.js +71 -19
- package/dist/src/commerce/x402-facilitator.js.map +1 -1
- package/dist/src/commerce/x402-handler.d.ts +13 -7
- package/dist/src/commerce/x402-handler.d.ts.map +1 -1
- package/dist/src/commerce/x402-handler.js +23 -10
- package/dist/src/commerce/x402-handler.js.map +1 -1
- package/dist/src/commerce/x402.d.ts +11 -6
- package/dist/src/commerce/x402.d.ts.map +1 -1
- package/dist/src/commerce/x402.js +10 -7
- package/dist/src/commerce/x402.js.map +1 -1
- package/dist/src/config-types.d.ts +12 -0
- package/dist/src/config-types.d.ts.map +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +8 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/data/app-templates/shells.d.ts +11 -3
- package/dist/src/data/app-templates/shells.d.ts.map +1 -1
- package/dist/src/data/app-templates/shells.js +87 -6
- package/dist/src/data/app-templates/shells.js.map +1 -1
- package/dist/src/data/app-templates.js +2 -2
- package/dist/src/data/app-templates.js.map +1 -1
- package/dist/src/data/library-packs/cortex.d.ts.map +1 -1
- package/dist/src/data/library-packs/cortex.js +108 -5
- package/dist/src/data/library-packs/cortex.js.map +1 -1
- package/dist/src/data/library-packs/sdk.d.ts.map +1 -1
- package/dist/src/data/library-packs/sdk.js +32 -8
- 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 +83 -6
- package/dist/src/data/library-packs/vendored.js.map +1 -1
- package/dist/src/generated/api-types.d.ts +478 -19
- package/dist/src/generated/api-types.d.ts.map +1 -1
- package/dist/src/mcp/agent-tasks.d.ts +4 -0
- package/dist/src/mcp/agent-tasks.d.ts.map +1 -1
- package/dist/src/mcp/agent-tasks.js +20 -2
- package/dist/src/mcp/agent-tasks.js.map +1 -1
- package/dist/src/mcp/capabilities.d.ts +7 -1
- package/dist/src/mcp/capabilities.d.ts.map +1 -1
- package/dist/src/mcp/capabilities.js +5 -2
- package/dist/src/mcp/capabilities.js.map +1 -1
- package/dist/src/mcp/catalog/definitions/commerce.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions/commerce.js +4 -2
- package/dist/src/mcp/catalog/definitions/commerce.js.map +1 -1
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.js +4 -3
- package/dist/src/mcp/catalog/definitions/discovery-work-boards.js.map +1 -1
- package/dist/src/mcp/catalog/definitions/organisms-workspaces-apps.js +1 -1
- 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 +3 -2
- package/dist/src/mcp/catalog/definitions/schedules-tasks-memory.js.map +1 -1
- package/dist/src/mcp/catalog/output-schemas.d.ts +6 -1
- package/dist/src/mcp/catalog/output-schemas.d.ts.map +1 -1
- package/dist/src/mcp/catalog/output-schemas.js +6 -1
- package/dist/src/mcp/catalog/output-schemas.js.map +1 -1
- package/dist/src/mcp/commerce.d.ts.map +1 -1
- package/dist/src/mcp/commerce.js +15 -3
- package/dist/src/mcp/commerce.js.map +1 -1
- package/dist/src/mcp/core-storage.d.ts +23 -0
- package/dist/src/mcp/core-storage.d.ts.map +1 -0
- package/dist/src/mcp/core-storage.js +157 -0
- package/dist/src/mcp/core-storage.js.map +1 -0
- package/dist/src/mcp/core.d.ts +16 -0
- package/dist/src/mcp/core.d.ts.map +1 -1
- package/dist/src/mcp/core.js +75 -119
- package/dist/src/mcp/core.js.map +1 -1
- package/dist/src/mcp/dm-messages.d.ts +4 -0
- package/dist/src/mcp/dm-messages.d.ts.map +1 -1
- package/dist/src/mcp/dm-messages.js +43 -2
- package/dist/src/mcp/dm-messages.js.map +1 -1
- package/dist/src/mcp/exchange.d.ts.map +1 -1
- package/dist/src/mcp/exchange.js +3 -2
- package/dist/src/mcp/exchange.js.map +1 -1
- package/dist/src/mcp/extensions.d.ts.map +1 -1
- package/dist/src/mcp/extensions.js +6 -2
- package/dist/src/mcp/extensions.js.map +1 -1
- package/dist/src/mcp/index.d.ts +5 -0
- package/dist/src/mcp/index.d.ts.map +1 -1
- package/dist/src/mcp/index.js +23 -4
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/mcp/memory-namespace-hints.d.ts +33 -0
- package/dist/src/mcp/memory-namespace-hints.d.ts.map +1 -0
- package/dist/src/mcp/memory-namespace-hints.js +60 -0
- package/dist/src/mcp/memory-namespace-hints.js.map +1 -0
- package/dist/src/mcp/workspaces.d.ts +5 -0
- package/dist/src/mcp/workspaces.d.ts.map +1 -1
- package/dist/src/mcp/workspaces.js +5 -3
- package/dist/src/mcp/workspaces.js.map +1 -1
- package/dist/src/models/agent-task-schemas.d.ts +25 -3
- package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
- package/dist/src/models/agent-task-schemas.js +16 -0
- package/dist/src/models/agent-task-schemas.js.map +1 -1
- package/dist/src/models/app-tool-schemas.d.ts +518 -1
- package/dist/src/models/app-tool-schemas.d.ts.map +1 -1
- package/dist/src/models/app-tool-schemas.js +53 -1
- package/dist/src/models/app-tool-schemas.js.map +1 -1
- package/dist/src/models/odps-schemas.d.ts +305 -0
- package/dist/src/models/odps-schemas.d.ts.map +1 -0
- package/dist/src/models/odps-schemas.js +182 -0
- package/dist/src/models/odps-schemas.js.map +1 -0
- package/dist/src/models/offer-schemas.d.ts +357 -2
- package/dist/src/models/offer-schemas.d.ts.map +1 -1
- package/dist/src/models/offer-schemas.js +37 -0
- package/dist/src/models/offer-schemas.js.map +1 -1
- package/dist/src/models/schemas.d.ts +6 -3
- package/dist/src/models/schemas.d.ts.map +1 -1
- package/dist/src/models/schemas.js +10 -1
- package/dist/src/models/schemas.js.map +1 -1
- package/dist/src/models/webhook-schemas.d.ts +8 -8
- package/dist/src/routes/agent-tasks/create-read.d.ts +4 -0
- package/dist/src/routes/agent-tasks/create-read.d.ts.map +1 -1
- package/dist/src/routes/agent-tasks/create-read.js +20 -1
- package/dist/src/routes/agent-tasks/create-read.js.map +1 -1
- package/dist/src/routes/agent-tasks/lifecycle.d.ts.map +1 -1
- package/dist/src/routes/agent-tasks/lifecycle.js +10 -0
- package/dist/src/routes/agent-tasks/lifecycle.js.map +1 -1
- package/dist/src/routes/agents/offers.d.ts +2 -0
- package/dist/src/routes/agents/offers.d.ts.map +1 -1
- package/dist/src/routes/agents/offers.js +0 -0
- package/dist/src/routes/agents/offers.js.map +1 -1
- package/dist/src/routes/app-grants.d.ts +6 -0
- package/dist/src/routes/app-grants.d.ts.map +1 -1
- package/dist/src/routes/app-grants.js +55 -25
- package/dist/src/routes/app-grants.js.map +1 -1
- package/dist/src/routes/apps/drafts.d.ts +3 -0
- package/dist/src/routes/apps/drafts.d.ts.map +1 -1
- package/dist/src/routes/apps/drafts.js +63 -1
- package/dist/src/routes/apps/drafts.js.map +1 -1
- package/dist/src/routes/apps/publish.d.ts +2 -0
- package/dist/src/routes/apps/publish.d.ts.map +1 -1
- package/dist/src/routes/apps/publish.js +17 -2
- package/dist/src/routes/apps/publish.js.map +1 -1
- package/dist/src/routes/commerce.d.ts.map +1 -1
- package/dist/src/routes/commerce.js +122 -2
- package/dist/src/routes/commerce.js.map +1 -1
- package/dist/src/routes/exchange-market.d.ts +6 -2
- package/dist/src/routes/exchange-market.d.ts.map +1 -1
- package/dist/src/routes/exchange-market.js +154 -28
- package/dist/src/routes/exchange-market.js.map +1 -1
- package/dist/src/routes/exchange.d.ts.map +1 -1
- package/dist/src/routes/exchange.js +5 -2
- package/dist/src/routes/exchange.js.map +1 -1
- package/dist/src/routes/extensions/actions.d.ts.map +1 -1
- package/dist/src/routes/extensions/actions.js +18 -0
- package/dist/src/routes/extensions/actions.js.map +1 -1
- package/dist/src/routes/extensions/crud.d.ts.map +1 -1
- package/dist/src/routes/extensions/crud.js +36 -3
- package/dist/src/routes/extensions/crud.js.map +1 -1
- package/dist/src/routes/extensions/entitlement-gate.d.ts.map +1 -1
- package/dist/src/routes/extensions/entitlement-gate.js +13 -0
- package/dist/src/routes/extensions/entitlement-gate.js.map +1 -1
- package/dist/src/routes/extensions/manifest.d.ts +6 -0
- package/dist/src/routes/extensions/manifest.d.ts.map +1 -1
- package/dist/src/routes/extensions/manifest.js +68 -1
- package/dist/src/routes/extensions/manifest.js.map +1 -1
- package/dist/src/routes/extensions/pacing.d.ts +31 -0
- package/dist/src/routes/extensions/pacing.d.ts.map +1 -0
- package/dist/src/routes/extensions/pacing.js +73 -0
- package/dist/src/routes/extensions/pacing.js.map +1 -0
- package/dist/src/routes/extensions/paywall.d.ts.map +1 -1
- package/dist/src/routes/extensions/paywall.js +17 -17
- package/dist/src/routes/extensions/paywall.js.map +1 -1
- package/dist/src/routes/memory/crud.d.ts.map +1 -1
- package/dist/src/routes/memory/crud.js +10 -0
- package/dist/src/routes/memory/crud.js.map +1 -1
- package/dist/src/routes/organisms/crud.d.ts +3 -0
- package/dist/src/routes/organisms/crud.d.ts.map +1 -1
- package/dist/src/routes/organisms/crud.js +5 -2
- package/dist/src/routes/organisms/crud.js.map +1 -1
- package/dist/src/routes/organisms/workspace-read.d.ts.map +1 -1
- package/dist/src/routes/organisms/workspace-read.js +7 -2
- package/dist/src/routes/organisms/workspace-read.js.map +1 -1
- package/dist/src/routes/public-stats.d.ts +7 -0
- package/dist/src/routes/public-stats.d.ts.map +1 -1
- package/dist/src/routes/public-stats.js +28 -7
- package/dist/src/routes/public-stats.js.map +1 -1
- package/dist/src/routes/sse.d.ts +7 -0
- package/dist/src/routes/sse.d.ts.map +1 -1
- package/dist/src/routes/sse.js +36 -6
- package/dist/src/routes/sse.js.map +1 -1
- package/dist/src/routes/storage-files.d.ts +11 -0
- package/dist/src/routes/storage-files.d.ts.map +1 -1
- package/dist/src/routes/storage-files.js +58 -51
- package/dist/src/routes/storage-files.js.map +1 -1
- package/dist/src/routes/subdomains.d.ts +4 -0
- package/dist/src/routes/subdomains.d.ts.map +1 -1
- package/dist/src/routes/subdomains.js +42 -5
- package/dist/src/routes/subdomains.js.map +1 -1
- package/dist/src/routes/upload.d.ts +11 -0
- package/dist/src/routes/upload.d.ts.map +1 -1
- package/dist/src/routes/upload.js +108 -28
- package/dist/src/routes/upload.js.map +1 -1
- package/dist/src/routes/webmcp.d.ts.map +1 -1
- package/dist/src/routes/webmcp.js +4 -0
- package/dist/src/routes/webmcp.js.map +1 -1
- package/dist/src/schemas/knowledge-package.d.ts +1 -1
- package/dist/src/server-bootstrap/static-files.d.ts +4 -0
- package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
- package/dist/src/server-bootstrap/static-files.js +11 -0
- package/dist/src/server-bootstrap/static-files.js.map +1 -1
- package/dist/src/services/build-app-prompt.d.ts +19 -0
- package/dist/src/services/build-app-prompt.d.ts.map +1 -1
- package/dist/src/services/build-app-prompt.js +97 -11
- package/dist/src/services/build-app-prompt.js.map +1 -1
- package/dist/src/services/call-timing.d.ts +51 -0
- package/dist/src/services/call-timing.d.ts.map +1 -0
- package/dist/src/services/call-timing.js +91 -0
- package/dist/src/services/call-timing.js.map +1 -0
- package/dist/src/services/capability-invoke.d.ts +2 -0
- package/dist/src/services/capability-invoke.d.ts.map +1 -1
- package/dist/src/services/capability-invoke.js +10 -0
- package/dist/src/services/capability-invoke.js.map +1 -1
- package/dist/src/services/config-schema.d.ts.map +1 -1
- package/dist/src/services/config-schema.js +6 -0
- package/dist/src/services/config-schema.js.map +1 -1
- package/dist/src/services/draft-token.d.ts +22 -2
- package/dist/src/services/draft-token.d.ts.map +1 -1
- package/dist/src/services/draft-token.js +52 -3
- package/dist/src/services/draft-token.js.map +1 -1
- package/dist/src/services/exchange-market.d.ts +41 -8
- package/dist/src/services/exchange-market.d.ts.map +1 -1
- package/dist/src/services/exchange-market.js +24 -2
- package/dist/src/services/exchange-market.js.map +1 -1
- package/dist/src/services/exchange-odps.d.ts +58 -0
- package/dist/src/services/exchange-odps.d.ts.map +1 -0
- package/dist/src/services/exchange-odps.js +400 -0
- package/dist/src/services/exchange-odps.js.map +1 -0
- package/dist/src/services/exchange-projection.d.ts +61 -0
- package/dist/src/services/exchange-projection.d.ts.map +1 -0
- package/dist/src/services/exchange-projection.js +504 -0
- package/dist/src/services/exchange-projection.js.map +1 -0
- package/dist/src/services/exchange-proposals.d.ts.map +1 -1
- package/dist/src/services/exchange-proposals.js +2 -0
- package/dist/src/services/exchange-proposals.js.map +1 -1
- package/dist/src/services/extension-files.d.ts +64 -0
- package/dist/src/services/extension-files.d.ts.map +1 -0
- package/dist/src/services/extension-files.js +88 -0
- package/dist/src/services/extension-files.js.map +1 -0
- package/dist/src/services/extension-runtime.d.ts +33 -0
- package/dist/src/services/extension-runtime.d.ts.map +1 -1
- package/dist/src/services/extension-runtime.js +52 -0
- package/dist/src/services/extension-runtime.js.map +1 -1
- package/dist/src/services/file-refs.d.ts +105 -0
- package/dist/src/services/file-refs.d.ts.map +1 -0
- package/dist/src/services/file-refs.js +106 -0
- package/dist/src/services/file-refs.js.map +1 -0
- package/dist/src/services/metered-entitlements.d.ts +7 -0
- package/dist/src/services/metered-entitlements.d.ts.map +1 -1
- package/dist/src/services/metered-entitlements.js +4 -0
- package/dist/src/services/metered-entitlements.js.map +1 -1
- package/dist/src/services/owner-memory.d.ts +14 -1
- package/dist/src/services/owner-memory.d.ts.map +1 -1
- package/dist/src/services/owner-memory.js +8 -14
- package/dist/src/services/owner-memory.js.map +1 -1
- package/dist/src/services/task-files.d.ts +51 -0
- package/dist/src/services/task-files.d.ts.map +1 -0
- package/dist/src/services/task-files.js +58 -0
- package/dist/src/services/task-files.js.map +1 -0
- package/dist/src/services/upload-token.d.ts +29 -0
- package/dist/src/services/upload-token.d.ts.map +1 -1
- package/dist/src/services/upload-token.js +37 -0
- package/dist/src/services/upload-token.js.map +1 -1
- package/dist/src/services/upload-zip.d.ts +2 -0
- package/dist/src/services/upload-zip.d.ts.map +1 -1
- package/dist/src/services/upload-zip.js +5 -1
- package/dist/src/services/upload-zip.js.map +1 -1
- package/dist/src/services/workspace-meta.d.ts +15 -0
- package/dist/src/services/workspace-meta.d.ts.map +1 -1
- package/dist/src/services/workspace-meta.js +17 -0
- package/dist/src/services/workspace-meta.js.map +1 -1
- package/dist/src/services/workspace-provision.d.ts +3 -0
- package/dist/src/services/workspace-provision.d.ts.map +1 -1
- package/dist/src/services/workspace-provision.js +5 -3
- package/dist/src/services/workspace-provision.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts +1 -0
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js +10 -0
- package/dist/src/storage/providers/postgres-kysely/methods/app-grants.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts +2 -0
- package/dist/src/storage/providers/postgres-kysely/methods/memory.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/memory.js +12 -1
- package/dist/src/storage/providers/postgres-kysely/methods/memory.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/organisms.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/organisms.js +5 -1
- package/dist/src/storage/providers/postgres-kysely/methods/organisms.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/migrations/0012_unique_live_app_grant.sql +29 -0
- package/dist/src/storage/providers/sqlite/methods/apps.d.ts +3 -0
- package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/apps.js +7 -0
- package/dist/src/storage/providers/sqlite/methods/apps.js.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/governance.d.ts +1 -0
- package/dist/src/storage/providers/sqlite/methods/governance.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/governance.js +4 -1
- package/dist/src/storage/providers/sqlite/methods/governance.js.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/owner.d.ts +5 -0
- package/dist/src/storage/providers/sqlite/methods/owner.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/owner.js +8 -0
- package/dist/src/storage/providers/sqlite/methods/owner.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.d.ts +3 -0
- package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.js +20 -0
- package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
- package/dist/src/storage/repositories/app-grant.repository.d.ts +9 -1
- package/dist/src/storage/repositories/app-grant.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/memory.repository.d.ts +14 -0
- package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories-impl/memory-repository.d.ts +8 -1
- package/dist/src/storage/repositories-impl/memory-repository.d.ts.map +1 -1
- package/dist/src/storage/repositories-impl/memory-repository.js +15 -4
- package/dist/src/storage/repositories-impl/memory-repository.js.map +1 -1
- package/dist/src/storage/types/agents-messaging.d.ts +19 -0
- package/dist/src/storage/types/agents-messaging.d.ts.map +1 -1
- package/dist/src/storage/types/agents-messaging.js.map +1 -1
- package/dist/src/storage/types/organisms-federation.d.ts +29 -0
- package/dist/src/storage/types/organisms-federation.d.ts.map +1 -1
- package/dist/src/utils/app-badge.d.ts.map +1 -1
- package/dist/src/utils/app-badge.js +7 -3
- package/dist/src/utils/app-badge.js.map +1 -1
- package/dist/static/app-catalog/_template.html +6 -5
- package/dist/static/app-catalog/js/cortex.js +3 -1
- package/dist/static/app-catalog/js/detail.js +411 -36
- package/dist/static/app-catalog/js/i18n-data.js +279 -3
- package/dist/static/app-catalog/js/main.js +28 -37
- package/dist/static/app-catalog/js/monetize.js +204 -16
- package/dist/static/app-catalog/js/odps.js +489 -0
- package/dist/static/app-catalog/js/render.js +3 -0
- package/dist/static/app-catalog/js/workcopy.js +198 -0
- package/dist/static/app-catalog/styles/app-catalog.css +60 -0
- package/dist/static/app-catalog.html +1450 -137
- package/dist/static/sdk-libs/agents/index.js +45 -7
- package/dist/static/sdk-libs/auth/cluster.js +97 -0
- package/dist/static/sdk-libs/auth/index.js +25 -1
- package/dist/static/sdk-libs/auth/locale.js +151 -0
- package/dist/static/sdk-libs/auth/modal.js +11 -2
- package/dist/static/sdk-libs/auth/palette.js +172 -0
- package/dist/static/sdk-libs/auth/pill.js +37 -6
- package/dist/static/sdk-libs/auth/theme.js +61 -20
- package/dist/static/sdk-libs/data/index.js +70 -8
- package/dist/static/sdk-libs/dist/aimeat-agents.js +41 -8
- package/dist/static/sdk-libs/dist/aimeat-auth.js +422 -21
- package/dist/static/sdk-libs/dist/aimeat-data.js +50 -8
- package/dist/static/sdk-libs/dist/aimeat-live.js +54 -2
- package/dist/static/sdk-libs/dist/aimeat-markdown.js +32 -1
- package/dist/static/sdk-libs/live/index.js +71 -4
- package/dist/static/sdk-libs/markdown/index.js +49 -1
- package/package.json +6 -2
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file odps.js
|
|
3
|
+
* @description The ODPS surface of the App Detail view: the app-level EXCHANGE status + ODPS defaults,
|
|
4
|
+
* and the per-tool ODPS descriptor block inside the Monetize editor. A listed tool is projected into an
|
|
5
|
+
* Open Data Product Specification v4.1 document (GET /v1/exchange/offerings/{id}/odps.yaml) — the
|
|
6
|
+
* interoperable descriptor outside catalogues and negotiating agents read. Most of that document the
|
|
7
|
+
* node derives (price, plans, access, licence rights, observed use); what it CANNOT derive is authored
|
|
8
|
+
* here and stored in the app's own tool manifest (`apps.{appId}.tools`), so the app owns its ODPS data.
|
|
9
|
+
*
|
|
10
|
+
* App level = what is the same for every capability the app sells (legal data holder, logo, brand,
|
|
11
|
+
* governance profile, jurisdiction, the provenance of the app's material). Tool level = what belongs to
|
|
12
|
+
* one capability (value proposition, categories, use cases, sample, SLA + quality commitments). A tool
|
|
13
|
+
* inherits the app defaults and overrides them field by field.
|
|
14
|
+
*
|
|
15
|
+
* AI drafts the DESCRIPTIVE fields only. Provenance, legal basis, consent status, retention, the legal
|
|
16
|
+
* entity and SLA objectives are promises with legal weight (EU AI Act Art. 10 makes provenance the
|
|
17
|
+
* buyer's compliance duty) — the model is told to leave them alone and the owner states them.
|
|
18
|
+
* @structure odpsStatusInner (app-level status + defaults form) · odpsBlockedReason · odpsToolFieldsHtml ·
|
|
19
|
+
* readOdpsToolFields · readOdpsAppDefaults · odpsSuggestForTool · odpsToggleDefaults · odpsToggleTool
|
|
20
|
+
* @usage import { odpsStatusInner, odpsToolFieldsHtml, readOdpsToolFields } from './odps.js'
|
|
21
|
+
* @version-history
|
|
22
|
+
* v1.0.0 — 2026-07-25 — Initial ODPS authoring surface (app-level defaults + per-tool block + AI draft).
|
|
23
|
+
*/
|
|
24
|
+
import { escapeHtml } from './util.js';
|
|
25
|
+
import { dtlBtn, showNotice } from './ui.js';
|
|
26
|
+
import { loadConfig } from './config.js';
|
|
27
|
+
import { t } from './i18n.js';
|
|
28
|
+
import { getCortexOwnerToken } from './cortex.js';
|
|
29
|
+
|
|
30
|
+
/** Mirrors ODPS_PRODUCT_TYPES / ODPS_SLA_* / ODPS_QUALITY_* in src/models/odps-schemas.ts. */
|
|
31
|
+
var PRODUCT_TYPES = ['', 'raw data', 'derived data', 'dataset', 'reports', 'analytic view', 'algorithm',
|
|
32
|
+
'decision support', 'automated decision-making', 'data-enhanced product', 'data-driven service',
|
|
33
|
+
'data-enabled performance', 'bi-directional'];
|
|
34
|
+
var GOVERNANCE = ['', 'structured', 'enforced', 'automated', 'audit_ready'];
|
|
35
|
+
var PRIORITIES = ['', 'critical', 'high', 'medium', 'low'];
|
|
36
|
+
var SLA_DIMENSIONS = ['latency', 'uptime', 'responseTime', 'errorRate', 'endOfSupport', 'endOfLife',
|
|
37
|
+
'updateFrequency', 'timeToDetect', 'timeToNotify', 'timeToRepair', 'emailResponseTime'];
|
|
38
|
+
var SLA_UNITS = ['percent', 'milliseconds', 'seconds', 'minutes', 'days', 'weeks', 'months', 'years', 'never', 'date'];
|
|
39
|
+
var QUALITY_DIMENSIONS = ['accuracy', 'completeness', 'conformity', 'consistency', 'coverage', 'timeliness', 'validity', 'uniqueness'];
|
|
40
|
+
var QUALITY_UNITS = ['percentage', 'number'];
|
|
41
|
+
|
|
42
|
+
var odDefaultsOpen = false; // app-level ODPS defaults form expanded?
|
|
43
|
+
var odToolOpen = false; // per-tool ODPS block expanded inside the editor?
|
|
44
|
+
var odBusy = false; // an AI draft is in flight
|
|
45
|
+
|
|
46
|
+
function apiBase() {
|
|
47
|
+
var cfg = loadConfig();
|
|
48
|
+
return (cfg.aimeatUrl || '').replace(/\/+$/, '');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function val(id) {
|
|
52
|
+
var el = document.getElementById(id);
|
|
53
|
+
return el ? (el.value || '').trim() : '';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function setVal(id, v) {
|
|
57
|
+
var el = document.getElementById(id);
|
|
58
|
+
if (el && v !== undefined && v !== null) el.value = String(v);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Comma-separated input ⇄ array of trimmed non-empty strings. */
|
|
62
|
+
function listOf(id) {
|
|
63
|
+
return val(id).split(',').map(function (x) { return x.trim(); }).filter(Boolean);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function input(id, label, value, placeholder, type) {
|
|
67
|
+
return '<label class="dtl-stat-label" for="' + id + '">' + escapeHtml(label) + '</label>' +
|
|
68
|
+
'<input id="' + id + '" class="modal-input od-input" ' + (type ? 'type="' + type + '" ' : '') +
|
|
69
|
+
'value="' + escapeHtml(value || '') + '" placeholder="' + escapeHtml(placeholder || '') + '" />';
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function textarea(id, label, value, placeholder, rows) {
|
|
73
|
+
return '<label class="dtl-stat-label" for="' + id + '">' + escapeHtml(label) + '</label>' +
|
|
74
|
+
'<textarea id="' + id + '" class="modal-input od-input" rows="' + (rows || 2) + '" placeholder="' +
|
|
75
|
+
escapeHtml(placeholder || '') + '">' + escapeHtml(value || '') + '</textarea>';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function select(id, label, options, selected) {
|
|
79
|
+
var html = '<label class="dtl-stat-label" for="' + id + '">' + escapeHtml(label) + '</label>' +
|
|
80
|
+
'<select id="' + id + '" class="modal-input od-input">';
|
|
81
|
+
for (var i = 0; i < options.length; i++) {
|
|
82
|
+
var o = options[i];
|
|
83
|
+
html += '<option value="' + escapeHtml(o) + '"' + (selected === o ? ' selected' : '') + '>' +
|
|
84
|
+
escapeHtml(o || '—') + '</option>';
|
|
85
|
+
}
|
|
86
|
+
return html + '</select>';
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ── Commitment lines: "uptime 99.5 percent — Monthly availability" ─────────────
|
|
90
|
+
/** Render SLA/quality dimensions as one editable line each (compact, and an AI can write it). */
|
|
91
|
+
function dimsToText(dims) {
|
|
92
|
+
return (dims || []).map(function (d) {
|
|
93
|
+
return d.dimension + ' ' + d.objective + ' ' + d.unit + (d.description ? ' — ' + d.description : '');
|
|
94
|
+
}).join('\n');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Parse those lines back. Unknown dimensions/units are dropped rather than saved as garbage. */
|
|
98
|
+
function textToDims(text, dimensions, units) {
|
|
99
|
+
var out = [];
|
|
100
|
+
var lines = (text || '').split('\n');
|
|
101
|
+
for (var i = 0; i < lines.length; i++) {
|
|
102
|
+
var line = lines[i].trim();
|
|
103
|
+
if (!line) continue;
|
|
104
|
+
var parts = line.split('—');
|
|
105
|
+
var head = parts[0].trim().split(/\s+/);
|
|
106
|
+
var desc = parts.length > 1 ? parts.slice(1).join('—').trim() : '';
|
|
107
|
+
if (head.length < 3) continue;
|
|
108
|
+
var dim = head[0], objective = parseFloat(String(head[1]).replace(',', '.')), unit = head[2];
|
|
109
|
+
if (dimensions.indexOf(dim) === -1 || units.indexOf(unit) === -1 || !Number.isFinite(objective)) continue;
|
|
110
|
+
var entry = { dimension: dim, objective: objective, unit: unit };
|
|
111
|
+
if (desc) entry.description = desc;
|
|
112
|
+
out.push(entry);
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ── App-level: EXCHANGE status + ODPS defaults ────────────────────────────────
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Why a tool flagged for EXCHANGE does not reach the market. The node's reconcile skips it silently
|
|
121
|
+
* (SCHEMA_REQUIRED / TOOL_UNBOUND / NOT_PRICED); before this, the catalogue never said so and the owner
|
|
122
|
+
* was left ticking a box that did nothing.
|
|
123
|
+
*/
|
|
124
|
+
export function odpsBlockedReason(tool) {
|
|
125
|
+
if (!tool || !tool.exchange) return '';
|
|
126
|
+
var hasIn = tool.inputSchema && Object.keys(tool.inputSchema).length;
|
|
127
|
+
var hasOut = tool.outputSchema && Object.keys(tool.outputSchema).length;
|
|
128
|
+
if (!hasIn || !hasOut) return t('odps.blockedSchema');
|
|
129
|
+
if (!tool.action_id) return t('odps.blockedBinding');
|
|
130
|
+
var priced = (tool.price && tool.price.morsels > 0) || (tool.priceMoney && tool.priceMoney.amount > 0);
|
|
131
|
+
if (!priced) return t('odps.blockedPrice');
|
|
132
|
+
return '';
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** The app-level EXCHANGE line: how many of this app's tools are actually on the market, and what blocks the rest. */
|
|
136
|
+
function statusLine(doc) {
|
|
137
|
+
var tools = (doc && doc.tools) || [];
|
|
138
|
+
var flagged = tools.filter(function (x) { return x.exchange; });
|
|
139
|
+
var blocked = flagged.filter(function (x) { return !!odpsBlockedReason(x); });
|
|
140
|
+
var live = flagged.length - blocked.length;
|
|
141
|
+
if (!tools.length) {
|
|
142
|
+
return '<div class="od-status od-status-none">' + escapeHtml(t('odps.noTools')) + '</div>';
|
|
143
|
+
}
|
|
144
|
+
var cls = live > 0 ? 'od-status-on' : 'od-status-none';
|
|
145
|
+
var label = live > 0
|
|
146
|
+
? t('odps.statusOn').replace('{live}', String(live)).replace('{total}', String(tools.length))
|
|
147
|
+
: t('odps.statusOff').replace('{total}', String(tools.length));
|
|
148
|
+
var html = '<div class="od-status ' + cls + '">' + escapeHtml(label) + '</div>';
|
|
149
|
+
if (blocked.length) {
|
|
150
|
+
html += '<div class="dtl-sync none od-note">' +
|
|
151
|
+
escapeHtml(t('odps.statusBlocked').replace('{n}', String(blocked.length))) + '</div>';
|
|
152
|
+
}
|
|
153
|
+
return html;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** The app-level ODPS defaults form (company + brand + governance + provenance), collapsed by default. */
|
|
157
|
+
function defaultsForm(doc) {
|
|
158
|
+
var o = (doc && doc.odps) || {};
|
|
159
|
+
var h = (o.dataHolder) || {};
|
|
160
|
+
var lic = (o.license) || {};
|
|
161
|
+
var p = (doc && doc.provenance) || {};
|
|
162
|
+
return '<div class="od-form">' +
|
|
163
|
+
'<div class="dtl-sync none od-note">' + escapeHtml(t('odps.defaultsHint')) + '</div>' +
|
|
164
|
+
'<div class="od-grid">' +
|
|
165
|
+
'<div class="od-col">' + input('od-legalname', t('odps.legalName'), h.legalName, 'Overscale Solutions Oy') + '</div>' +
|
|
166
|
+
'<div class="od-col">' + input('od-businessid', t('odps.businessId'), h.businessID, '3312345-6') + '</div>' +
|
|
167
|
+
'</div>' +
|
|
168
|
+
'<div class="od-grid">' +
|
|
169
|
+
'<div class="od-col">' + input('od-holderemail', t('odps.holderEmail'), h.email, 'sales@example.org', 'email') + '</div>' +
|
|
170
|
+
'<div class="od-col">' + input('od-holderurl', t('odps.holderUrl'), h.URL, 'https://example.org', 'url') + '</div>' +
|
|
171
|
+
'<div class="od-col od-col-narrow">' + input('od-country', t('odps.country'), h.addressCountry, 'FI') + '</div>' +
|
|
172
|
+
'</div>' +
|
|
173
|
+
'<div class="od-grid">' +
|
|
174
|
+
'<div class="od-col">' + input('od-logo', t('odps.logoUrl'), o.logoURL, 'https://example.org/logo.png', 'url') + '</div>' +
|
|
175
|
+
'<div class="od-col">' + input('od-slogan', t('odps.brandSlogan'), o.brandSlogan, '') + '</div>' +
|
|
176
|
+
'</div>' +
|
|
177
|
+
'<div class="od-grid">' +
|
|
178
|
+
'<div class="od-col">' + select('od-governance', t('odps.governance'), GOVERNANCE, o.governanceProfile || '') + '</div>' +
|
|
179
|
+
'<div class="od-col">' + select('od-priority', t('odps.priority'), PRIORITIES, o.portfolioPriority || '') + '</div>' +
|
|
180
|
+
'<div class="od-col od-col-narrow">' + input('od-language', t('odps.language'), o.language || 'en', 'en') + '</div>' +
|
|
181
|
+
'</div>' +
|
|
182
|
+
'<div class="od-grid">' +
|
|
183
|
+
'<div class="od-col">' + input('od-geo', t('odps.geoArea'), (lic.geographicalArea || []).join(', '), 'EU, EEA') + '</div>' +
|
|
184
|
+
'<div class="od-col">' + input('od-laws', t('odps.applicableLaws'), lic.applicableLaws, 'Finnish law') + '</div>' +
|
|
185
|
+
'</div>' +
|
|
186
|
+
'<div class="od-attest">' +
|
|
187
|
+
'<div class="dtl-stat-label od-attest-head">' + escapeHtml(t('odps.attestation')) + '</div>' +
|
|
188
|
+
'<div class="dtl-sync none od-note">' + escapeHtml(t('odps.attestationHint')) + '</div>' +
|
|
189
|
+
'<div class="od-grid">' +
|
|
190
|
+
'<div class="od-col">' + input('od-source', t('odps.source'), p.source, 'PRH open company register (YTJ v3)') + '</div>' +
|
|
191
|
+
'<div class="od-col">' + input('od-legalbasis', t('odps.legalBasis'), p.legalBasis, 'Public register') + '</div>' +
|
|
192
|
+
'</div>' +
|
|
193
|
+
'<div class="od-grid">' +
|
|
194
|
+
'<div class="od-col">' + input('od-consent', t('odps.consentStatus'), p.consentStatus, 'not applicable') + '</div>' +
|
|
195
|
+
'<div class="od-col">' + input('od-retention', t('odps.retention'), p.retention, '30 days') + '</div>' +
|
|
196
|
+
'</div>' +
|
|
197
|
+
'</div>' +
|
|
198
|
+
'<div class="dtl-btn-row od-actions">' +
|
|
199
|
+
dtlBtn(t('odps.saveDefaults'), 'window._launcher.odpsSaveDefaults()', { variant: 'primary' }) +
|
|
200
|
+
dtlBtn(t('odps.close'), 'window._launcher.odpsToggleDefaults()') +
|
|
201
|
+
'</div>' +
|
|
202
|
+
'<div class="dtl-ai-status" id="od-status"></div>' +
|
|
203
|
+
'</div>';
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Section body: the app-level EXCHANGE status plus the (collapsible) ODPS defaults. */
|
|
207
|
+
export function odpsStatusInner(doc, state) {
|
|
208
|
+
if (state === 'off') return '';
|
|
209
|
+
var html = '<h3>' + escapeHtml(t('odps.title')) + '</h3>' +
|
|
210
|
+
'<p class="dtl-desc">' + escapeHtml(t('odps.hint')) + '</p>';
|
|
211
|
+
if (state === 'loading') return html + '<span class="od-muted">…</span>';
|
|
212
|
+
html += statusLine(doc);
|
|
213
|
+
html += '<div class="dtl-btn-row od-actions">' +
|
|
214
|
+
dtlBtn(odDefaultsOpen ? t('odps.close') : t('odps.editDefaults'), 'window._launcher.odpsToggleDefaults()') +
|
|
215
|
+
'</div>';
|
|
216
|
+
if (odDefaultsOpen) html += defaultsForm(doc);
|
|
217
|
+
return html;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Read the app-level defaults form into { odps, provenance } (empty objects become undefined). */
|
|
221
|
+
export function readOdpsAppDefaults() {
|
|
222
|
+
var holder = {};
|
|
223
|
+
if (val('od-legalname')) holder.legalName = val('od-legalname');
|
|
224
|
+
if (val('od-businessid')) holder.businessID = val('od-businessid');
|
|
225
|
+
if (val('od-holderemail')) holder.email = val('od-holderemail');
|
|
226
|
+
if (val('od-holderurl')) holder.URL = val('od-holderurl');
|
|
227
|
+
if (val('od-country')) holder.addressCountry = val('od-country');
|
|
228
|
+
var license = {};
|
|
229
|
+
if (listOf('od-geo').length) license.geographicalArea = listOf('od-geo');
|
|
230
|
+
if (val('od-laws')) license.applicableLaws = val('od-laws');
|
|
231
|
+
var odps = {};
|
|
232
|
+
if (holder.legalName) odps.dataHolder = holder; // legalName is ODPS-required inside dataHolder
|
|
233
|
+
if (Object.keys(license).length) odps.license = license;
|
|
234
|
+
if (val('od-logo')) odps.logoURL = val('od-logo');
|
|
235
|
+
if (val('od-slogan')) odps.brandSlogan = val('od-slogan');
|
|
236
|
+
if (val('od-governance')) odps.governanceProfile = val('od-governance');
|
|
237
|
+
if (val('od-priority')) odps.portfolioPriority = val('od-priority');
|
|
238
|
+
if (/^[a-z]{2}$/.test(val('od-language'))) odps.language = val('od-language');
|
|
239
|
+
var prov = {};
|
|
240
|
+
if (val('od-source')) prov.source = val('od-source');
|
|
241
|
+
if (val('od-legalbasis')) prov.legalBasis = val('od-legalbasis');
|
|
242
|
+
if (val('od-consent')) prov.consentStatus = val('od-consent');
|
|
243
|
+
if (val('od-retention')) prov.retention = val('od-retention');
|
|
244
|
+
return {
|
|
245
|
+
odps: Object.keys(odps).length ? odps : undefined,
|
|
246
|
+
provenance: Object.keys(prov).length ? prov : undefined,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// ── Tool level: the ODPS descriptor of one capability ─────────────────────────
|
|
251
|
+
|
|
252
|
+
/** The per-tool ODPS block rendered inside the Monetize tool editor. */
|
|
253
|
+
export function odpsToolFieldsHtml(tool, offeringId, ctx) {
|
|
254
|
+
ctx = ctx || {};
|
|
255
|
+
var o = (tool && tool.odps) || {};
|
|
256
|
+
var p = (tool && tool.provenance) || {};
|
|
257
|
+
var inherited = ctx.appProvenance || {}; // what the app-level attestation would supply
|
|
258
|
+
var timing = ctx.timing || null; // observed delivery time, if this capability has served calls
|
|
259
|
+
var head = '<div class="od-tool-head">' +
|
|
260
|
+
dtlBtn((odToolOpen ? '▾ ' : '▸ ') + t('odps.toolTitle'), 'window._launcher.odpsToggleTool()') +
|
|
261
|
+
(offeringId
|
|
262
|
+
? '<a class="od-link" href="' + apiBase() + '/v1/exchange/offerings/' + encodeURIComponent(offeringId) +
|
|
263
|
+
'/odps.yaml" target="_blank" rel="noopener">' + escapeHtml(t('odps.viewYaml')) + '</a>'
|
|
264
|
+
: '') +
|
|
265
|
+
'</div>';
|
|
266
|
+
if (!odToolOpen) return head;
|
|
267
|
+
return head + '<div class="od-form">' +
|
|
268
|
+
'<div class="dtl-sync none od-note">' + escapeHtml(t('odps.toolHint')) + '</div>' +
|
|
269
|
+
'<div class="dtl-btn-row od-actions">' +
|
|
270
|
+
dtlBtn(t('odps.suggest'), 'window._launcher.odpsSuggest()', { variant: 'primary', disabled: odBusy }) +
|
|
271
|
+
'</div>' +
|
|
272
|
+
'<div class="dtl-ai-status" id="od-tool-status"></div>' +
|
|
273
|
+
select('odt-type', t('odps.productType'), PRODUCT_TYPES, o.productType || '') +
|
|
274
|
+
textarea('odt-value', t('odps.valueProposition'), o.valueProposition, t('odps.valuePlaceholder'), 2) +
|
|
275
|
+
'<div class="od-grid">' +
|
|
276
|
+
'<div class="od-col">' + input('odt-categories', t('odps.categories'), (o.categories || []).join(', '), 'company data, finland') + '</div>' +
|
|
277
|
+
'<div class="od-col">' + input('odt-standards', t('odps.standards'), (o.standards || []).join(', '), 'ISO 8000') + '</div>' +
|
|
278
|
+
'</div>' +
|
|
279
|
+
textarea('odt-usecases', t('odps.useCases'), (o.useCases || []).map(function (u) {
|
|
280
|
+
return u.title + (u.description ? ' | ' + u.description : '') + (u.url ? ' | ' + u.url : '');
|
|
281
|
+
}).join('\n'), t('odps.useCasesPlaceholder'), 2) +
|
|
282
|
+
input('odt-sample', t('odps.contentSample'), o.contentSample, 'https://example.org/sample.json', 'url') +
|
|
283
|
+
// A sample a buyer can open beats a sentence claiming one exists. Run the capability once, store the
|
|
284
|
+
// answer as a public file, put its URL here. Nothing is invented: it IS the output.
|
|
285
|
+
(ctx.actionId
|
|
286
|
+
? '<div class="dtl-btn-row od-actions">'
|
|
287
|
+
+ dtlBtn(t('odps.genSample'), 'window._launcher.odpsGenerateSample()', { disabled: odBusy })
|
|
288
|
+
+ '</div>'
|
|
289
|
+
+ '<div class="dtl-sync none od-note">' + escapeHtml(t('odps.genSampleHint')) + '</div>'
|
|
290
|
+
+ '<textarea id="odt-sample-input" class="modal-input od-input" rows="2" placeholder="'
|
|
291
|
+
+ escapeHtml(t('odps.genSampleInput')) + '">' + escapeHtml(ctx.sampleInput || '') + '</textarea>'
|
|
292
|
+
+ '<div class="dtl-ai-status" id="od-sample-status"></div>'
|
|
293
|
+
: '') +
|
|
294
|
+
textarea('odt-sla', t('odps.sla'), dimsToText(o.sla), t('odps.slaPlaceholder'), 2) +
|
|
295
|
+
// Measured, then committed — in that order. The node reports what this capability actually does;
|
|
296
|
+
// the number that becomes a promise is still chosen by a person.
|
|
297
|
+
(timing && timing.count > 0
|
|
298
|
+
? '<div class="od-measured">'
|
|
299
|
+
+ escapeHtml(t('odps.measured')
|
|
300
|
+
.replace('{n}', String(timing.count))
|
|
301
|
+
.replace('{p50}', String(timing.p50Ms))
|
|
302
|
+
.replace('{p95}', String(timing.p95Ms)))
|
|
303
|
+
+ ' ' + dtlBtn(t('odps.useMeasured'), 'window._launcher.odpsUseMeasured(' + Math.ceil(timing.p95Ms * 1.3) + ')')
|
|
304
|
+
+ '</div>'
|
|
305
|
+
: '<div class="dtl-sync none od-note">' + escapeHtml(t('odps.noMeasurement')) + '</div>') +
|
|
306
|
+
textarea('odt-quality', t('odps.quality'), dimsToText(o.dataQuality), t('odps.qualityPlaceholder'), 2) +
|
|
307
|
+
'<div class="od-attest">' +
|
|
308
|
+
'<div class="dtl-stat-label od-attest-head">' + escapeHtml(t('odps.toolAttestation')) + '</div>' +
|
|
309
|
+
'<div class="dtl-sync none od-note">' + escapeHtml(t('odps.toolAttestationHint')) + '</div>' +
|
|
310
|
+
input('odt-source', t('odps.source'), p.source,
|
|
311
|
+
inherited.source ? (t('odps.inheritedIs') + ' ' + inherited.source) : t('odps.inheritedNone')) +
|
|
312
|
+
textarea('odt-transformations', t('odps.transformations'), p.transformations, t('odps.transformationsPlaceholder'), 2) +
|
|
313
|
+
'<div class="dtl-btn-row od-actions">'
|
|
314
|
+
+ dtlBtn(t('odps.openAppDefaults'), 'window._launcher.odpsToggleDefaults()')
|
|
315
|
+
+ '</div>' +
|
|
316
|
+
'</div>' +
|
|
317
|
+
'</div>';
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/** Read the tool ODPS block, MERGED over the tool being edited so unsurfaced fields survive a save. */
|
|
321
|
+
export function readOdpsToolFields(base) {
|
|
322
|
+
if (!odToolOpen) {
|
|
323
|
+
// Block never opened in this edit → keep whatever the tool already had, untouched.
|
|
324
|
+
return { odps: base && base.odps, provenance: base && base.provenance };
|
|
325
|
+
}
|
|
326
|
+
var odps = Object.assign({}, (base && base.odps) || {});
|
|
327
|
+
var prov = Object.assign({}, (base && base.provenance) || {});
|
|
328
|
+
var set = function (obj, key, v) { if (v) obj[key] = v; else delete obj[key]; };
|
|
329
|
+
set(odps, 'productType', val('odt-type'));
|
|
330
|
+
set(odps, 'valueProposition', val('odt-value'));
|
|
331
|
+
var cats = listOf('odt-categories'); if (cats.length) odps.categories = cats; else delete odps.categories;
|
|
332
|
+
var stds = listOf('odt-standards'); if (stds.length) odps.standards = stds; else delete odps.standards;
|
|
333
|
+
var uc = val('odt-usecases').split('\n').map(function (line) {
|
|
334
|
+
var parts = line.split('|').map(function (x) { return x.trim(); });
|
|
335
|
+
if (!parts[0]) return null;
|
|
336
|
+
var entry = { title: parts[0] };
|
|
337
|
+
if (parts[1]) entry.description = parts[1];
|
|
338
|
+
if (parts[2]) entry.url = parts[2];
|
|
339
|
+
return entry;
|
|
340
|
+
}).filter(Boolean);
|
|
341
|
+
if (uc.length) odps.useCases = uc; else delete odps.useCases;
|
|
342
|
+
set(odps, 'contentSample', val('odt-sample'));
|
|
343
|
+
var sla = textToDims(val('odt-sla'), SLA_DIMENSIONS, SLA_UNITS);
|
|
344
|
+
if (sla.length) odps.sla = sla; else delete odps.sla;
|
|
345
|
+
var dq = textToDims(val('odt-quality'), QUALITY_DIMENSIONS, QUALITY_UNITS);
|
|
346
|
+
if (dq.length) odps.dataQuality = dq; else delete odps.dataQuality;
|
|
347
|
+
set(prov, 'source', val('odt-source'));
|
|
348
|
+
set(prov, 'transformations', val('odt-transformations'));
|
|
349
|
+
return {
|
|
350
|
+
odps: Object.keys(odps).length ? odps : undefined,
|
|
351
|
+
provenance: Object.keys(prov).length ? prov : undefined,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/** Fill the service-commitment box from what was measured, with headroom the provider can live with. */
|
|
356
|
+
export function odpsUseMeasured(ms) {
|
|
357
|
+
var el = document.getElementById('odt-sla');
|
|
358
|
+
if (!el) return;
|
|
359
|
+
var line = 'responseTime ' + ms + ' milliseconds — ' + t('odps.measuredNote');
|
|
360
|
+
el.value = el.value.trim() ? (el.value.trim() + '\n' + line) : line;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Produce the sample by CALLING the capability once and storing what comes back as a public file.
|
|
365
|
+
* The owner calls their own capability free of charge, so this costs nothing and, more importantly,
|
|
366
|
+
* the resulting URL is a real answer rather than a claim about one.
|
|
367
|
+
*/
|
|
368
|
+
export function odpsGenerateSample(ctx, rerender) {
|
|
369
|
+
var statusEl = document.getElementById('od-sample-status');
|
|
370
|
+
var token = getCortexOwnerToken();
|
|
371
|
+
if (!token) { if (statusEl) statusEl.textContent = t('odps.needLogin'); return; }
|
|
372
|
+
var base = apiBase();
|
|
373
|
+
var raw = (document.getElementById('odt-sample-input') || {}).value || '{}';
|
|
374
|
+
var input;
|
|
375
|
+
try { input = JSON.parse(raw); }
|
|
376
|
+
catch (e) { if (statusEl) { statusEl.className = 'dtl-ai-status od-err'; statusEl.textContent = t('odps.genSampleBadJson'); } return; }
|
|
377
|
+
var m = /^ext:([^:]+):(.+)$/.exec(ctx.actionId || '');
|
|
378
|
+
if (!m) { if (statusEl) statusEl.textContent = t('odps.genSampleNoBinding'); return; }
|
|
379
|
+
odBusy = true;
|
|
380
|
+
if (statusEl) { statusEl.className = 'dtl-ai-status'; statusEl.textContent = t('odps.genSampleRunning'); }
|
|
381
|
+
fetch(base + '/v1/ext/' + encodeURIComponent(m[1]) + '/' + encodeURIComponent(m[2]), {
|
|
382
|
+
method: 'POST', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' },
|
|
383
|
+
body: JSON.stringify(input),
|
|
384
|
+
})
|
|
385
|
+
.then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); })
|
|
386
|
+
.then(function (res) {
|
|
387
|
+
if (!res.ok || !res.j || res.j.ok === false) {
|
|
388
|
+
var msg = (res.j && res.j.error && res.j.error.message) || t('odps.genSampleFailed');
|
|
389
|
+
throw new Error(msg);
|
|
390
|
+
}
|
|
391
|
+
var payload = JSON.stringify(res.j.data !== undefined ? res.j.data : res.j, null, 2);
|
|
392
|
+
var key = 'odps.sample.' + (ctx.appId || 'app') + '.' + (ctx.toolName || 'tool') + '.json';
|
|
393
|
+
return fetch(base + '/v1/storage', {
|
|
394
|
+
method: 'POST', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' },
|
|
395
|
+
body: JSON.stringify({
|
|
396
|
+
key: key, visibility: 'public', mime_type: 'application/json',
|
|
397
|
+
data: btoa(unescape(encodeURIComponent(payload))),
|
|
398
|
+
}),
|
|
399
|
+
}).then(function (r) { return r.json(); }).then(function (up) {
|
|
400
|
+
if (!up || up.ok === false) throw new Error((up && up.error && up.error.message) || t('odps.genSampleFailed'));
|
|
401
|
+
var url = base + '/v1/pub/' + encodeURIComponent(ctx.ownerGhii || '') + '/' + key;
|
|
402
|
+
var field = document.getElementById('odt-sample');
|
|
403
|
+
if (field) field.value = url;
|
|
404
|
+
var st = document.getElementById('od-sample-status');
|
|
405
|
+
if (st) { st.className = 'dtl-ai-status od-ok'; st.textContent = '✔ ' + t('odps.genSampleDone'); }
|
|
406
|
+
odBusy = false;
|
|
407
|
+
});
|
|
408
|
+
})
|
|
409
|
+
.catch(function (e) {
|
|
410
|
+
odBusy = false;
|
|
411
|
+
var st = document.getElementById('od-sample-status');
|
|
412
|
+
if (st) { st.className = 'dtl-ai-status od-err'; st.textContent = '✘ ' + (e.message || t('odps.genSampleFailed')); }
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export function odpsToggleDefaults(rerender) { odDefaultsOpen = !odDefaultsOpen; if (rerender) rerender(); }
|
|
417
|
+
export function odpsToggleTool(rerender) { odToolOpen = !odToolOpen; if (rerender) rerender(); }
|
|
418
|
+
export function odpsDefaultsOpen() { return odDefaultsOpen; }
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Draft the DESCRIPTIVE fields with the owner's own AI key. The prompt hands the model everything the node
|
|
422
|
+
* already knows about the capability (app, tool, I/O schema, price) and forbids the attestation fields:
|
|
423
|
+
* provenance, legal basis, consent, retention, SLA objectives and the legal entity are promises the owner
|
|
424
|
+
* makes, not text a model may invent.
|
|
425
|
+
*/
|
|
426
|
+
export function odpsSuggestForTool(ctx, rerender) {
|
|
427
|
+
var statusEl = document.getElementById('od-tool-status');
|
|
428
|
+
var token = getCortexOwnerToken();
|
|
429
|
+
if (!token) { if (statusEl) statusEl.textContent = t('odps.needLogin'); return; }
|
|
430
|
+
var base = apiBase();
|
|
431
|
+
if (!base) { if (statusEl) statusEl.textContent = t('odps.aiUnavailable'); return; }
|
|
432
|
+
odBusy = true;
|
|
433
|
+
if (statusEl) { statusEl.className = 'dtl-ai-status'; statusEl.textContent = t('odps.suggesting'); }
|
|
434
|
+
var system = 'You write the descriptive half of an Open Data Product Specification (ODPS v4.1) entry for '
|
|
435
|
+
+ 'a capability sold on a marketplace. Return ONLY a JSON object with these keys: '
|
|
436
|
+
+ '"productType" (one of: raw data, derived data, dataset, reports, analytic view, algorithm, decision support, '
|
|
437
|
+
+ 'automated decision-making, data-enhanced product, data-driven service, data-enabled performance, bi-directional), '
|
|
438
|
+
+ '"valueProposition" (one sentence, max 400 characters, what a buyer gets), '
|
|
439
|
+
+ '"categories" (2-4 short strings), "standards" (0-3 recognised standards that genuinely apply, else []), '
|
|
440
|
+
+ '"useCases" (1-3 objects with "title" and "description"). '
|
|
441
|
+
+ 'Base every word on the material given. Do NOT state where the data comes from, its legal basis, consent, '
|
|
442
|
+
+ 'retention, service levels, uptime, accuracy or the selling company — those are the owner\'s own attestations '
|
|
443
|
+
+ 'and inventing them would be a false claim. No markdown, no commentary, JSON only.';
|
|
444
|
+
var prompt = 'App: ' + (ctx.appName || ctx.appId) + '\n'
|
|
445
|
+
+ (ctx.appDescription ? 'App description: ' + ctx.appDescription + '\n' : '')
|
|
446
|
+
+ 'Capability (tool) name: ' + (ctx.toolName || '') + '\n'
|
|
447
|
+
+ (ctx.toolDescription ? 'Capability description: ' + ctx.toolDescription + '\n' : '')
|
|
448
|
+
+ (ctx.inputSchema ? 'Input schema: ' + JSON.stringify(ctx.inputSchema).slice(0, 1500) + '\n' : '')
|
|
449
|
+
+ (ctx.outputSchema ? 'Output schema: ' + JSON.stringify(ctx.outputSchema).slice(0, 1500) + '\n' : '')
|
|
450
|
+
+ (ctx.price ? 'Price: ' + ctx.price + '\n' : '')
|
|
451
|
+
+ 'Write the ODPS descriptive fields for this capability.';
|
|
452
|
+
fetch(base + '/v1/ai/complete', {
|
|
453
|
+
method: 'POST',
|
|
454
|
+
headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' },
|
|
455
|
+
body: JSON.stringify({ prompt: prompt, systemPrompt: system, app_id: 'app-catalog' }),
|
|
456
|
+
})
|
|
457
|
+
.then(function (r) { return r.json(); })
|
|
458
|
+
.then(function (json) {
|
|
459
|
+
odBusy = false;
|
|
460
|
+
var st = document.getElementById('od-tool-status');
|
|
461
|
+
if (!json || !json.ok) {
|
|
462
|
+
var msg = (json && json.error && json.error.message) || t('odps.suggestFailed');
|
|
463
|
+
if (st) { st.className = 'dtl-ai-status od-err'; st.textContent = '✘ ' + msg; }
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
var raw = (json.data && json.data.content) || '';
|
|
467
|
+
var m = raw.match(/\{[\s\S]*\}/);
|
|
468
|
+
var parsed = null;
|
|
469
|
+
try { parsed = m ? JSON.parse(m[0]) : null; } catch (e) { parsed = null; }
|
|
470
|
+
if (!parsed) { if (st) { st.className = 'dtl-ai-status od-err'; st.textContent = '✘ ' + t('odps.suggestUnparseable'); } return; }
|
|
471
|
+
if (PRODUCT_TYPES.indexOf(parsed.productType) !== -1) setVal('odt-type', parsed.productType);
|
|
472
|
+
if (parsed.valueProposition) setVal('odt-value', String(parsed.valueProposition).slice(0, 512));
|
|
473
|
+
if (Array.isArray(parsed.categories)) setVal('odt-categories', parsed.categories.join(', '));
|
|
474
|
+
if (Array.isArray(parsed.standards)) setVal('odt-standards', parsed.standards.join(', '));
|
|
475
|
+
if (Array.isArray(parsed.useCases)) {
|
|
476
|
+
setVal('odt-usecases', parsed.useCases.map(function (u) {
|
|
477
|
+
return (u.title || '') + (u.description ? ' | ' + u.description : '');
|
|
478
|
+
}).filter(Boolean).join('\n'));
|
|
479
|
+
}
|
|
480
|
+
if (st) { st.className = 'dtl-ai-status od-ok'; st.textContent = '✔ ' + t('odps.suggestDone'); }
|
|
481
|
+
showNotice(t('odps.suggestDone'), 'success');
|
|
482
|
+
if (rerender) { /* fields are filled in place — no re-render, it would wipe them */ }
|
|
483
|
+
})
|
|
484
|
+
.catch(function (e) {
|
|
485
|
+
odBusy = false;
|
|
486
|
+
var st = document.getElementById('od-tool-status');
|
|
487
|
+
if (st) { st.className = 'dtl-ai-status od-err'; st.textContent = '✘ ' + (e.message || t('odps.suggestFailed')); }
|
|
488
|
+
});
|
|
489
|
+
}
|
|
@@ -272,6 +272,9 @@ function buildLibraryEntries(localApps, serverApps) {
|
|
|
272
272
|
serverStateByFilename[fn] = {
|
|
273
273
|
parked: !!sa.parked, forkable: !!sa.forkable, forks: sa.forks || 0,
|
|
274
274
|
owner: sa.owner || '', versionNumber: sa.version_number || null, protection: prot,
|
|
275
|
+
// A saved (unpublished) working copy from ANY earlier session — the detail view's
|
|
276
|
+
// lifecycle band reads this to say "working copy saved" instead of "same as published".
|
|
277
|
+
hasDraft: !!sa.has_draft,
|
|
275
278
|
// `protected` is the ACCESS-CODE flag (distinct from copy-`protection`); the detail view's
|
|
276
279
|
// access-code editor reads it to show whether the app currently requires a code.
|
|
277
280
|
accessCode: !!sa.protected
|