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
|
@@ -32,11 +32,19 @@ const KIND_GROUPS = [
|
|
|
32
32
|
];
|
|
33
33
|
const TIER_FILTERS = ['all', 'any', 'frontier', 'needs-doc'];
|
|
34
34
|
|
|
35
|
+
// The tier is an INSTRUCTION to the reader ("this API has no training-data priors, so an
|
|
36
|
+
// AI must fetch its doc"), not a statement that documentation is missing. The raw key
|
|
37
|
+
// `needs-doc` read as "docs missing" to everyone including the registry's own author, so
|
|
38
|
+
// the badge shows the instruction and keeps the key only as a CSS/filter value.
|
|
39
|
+
function tierLabel(tier) {
|
|
40
|
+
return t('profile.extensions.tierLabel.' + tier) || tier;
|
|
41
|
+
}
|
|
42
|
+
|
|
35
43
|
function tierBadge(p) {
|
|
36
44
|
if (!p.modelTier) return null;
|
|
37
45
|
const measured = p.proofs && p.proofs.length;
|
|
38
46
|
return html`<span class="ext-tier ext-tier-${p.modelTier}${measured ? ' ext-tier-measured' : ''}"
|
|
39
|
-
title=${t('profile.extensions.tier.' + p.modelTier)}>${p.modelTier}</span>`;
|
|
47
|
+
title=${t('profile.extensions.tier.' + p.modelTier)}>${tierLabel(p.modelTier)}</span>`;
|
|
40
48
|
}
|
|
41
49
|
|
|
42
50
|
function statusBadge(p) {
|
|
@@ -157,7 +165,7 @@ export default function LibrariesTab() {
|
|
|
157
165
|
<div class="lib-tier-filters">
|
|
158
166
|
${TIER_FILTERS.map(tf => html`
|
|
159
167
|
<button class=${'btn-ghost lib-tier-btn' + (tier === tf ? ' lib-tier-active' : '')}
|
|
160
|
-
onClick=${() => setTier(tf)}>${tf === 'all' ? t('librariesTab.tierAll') : tf}</button>`)}
|
|
168
|
+
onClick=${() => setTier(tf)}>${tf === 'all' ? t('librariesTab.tierAll') : tierLabel(tf)}</button>`)}
|
|
161
169
|
</div>
|
|
162
170
|
<label class="lib-measured-toggle">
|
|
163
171
|
<input type="checkbox" checked=${measuredOnly} onChange=${e => setMeasuredOnly(e.target.checked)} />
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
* @description Profile tab for morsel wallet: balance overview, lifetime stats,
|
|
4
4
|
* morsel request form, and transaction history with expandable details.
|
|
5
5
|
* @version-history
|
|
6
|
+
* v1.5.1 — 2026-07-25 — The x402 chip reports every currency → token pair the node can settle
|
|
7
|
+
* (USD → USDC, EUR → EURC) instead of a single hardcoded token (TARGET-042).
|
|
8
|
+
* v1.5.0 — 2026-07-25 — Payout rails: an x402 USDC payout-address section beside the Stripe one, so a
|
|
9
|
+
* seller can set the address a stablecoin sale settles to and tell the two rails apart (Stripe moves
|
|
10
|
+
* fiat through a provider; x402 settles USDC on-chain to an address the seller controls).
|
|
6
11
|
* v1.0.0 — 2026-03-16 — Initial wallet tab
|
|
7
12
|
* v1.1.0 — 2026-03-17 — Replace inline styles with CSS classes
|
|
8
13
|
* v1.2.0 — 2026-05-22 — Show info message for federated users instead of infinite spinner
|
|
@@ -83,6 +88,64 @@ function PspSection() {
|
|
|
83
88
|
</div>`;
|
|
84
89
|
}
|
|
85
90
|
|
|
91
|
+
/* "Stablecoin payouts (x402)" — the seller's on-chain payout address.
|
|
92
|
+
* A different rail from Stripe, and the difference matters at sale time: Stripe settles EUR/USD to a
|
|
93
|
+
* connected account through a provider that holds the funds; x402 settles a stablecoin on-chain
|
|
94
|
+
* straight to this address, non-custodially, with the node holding no key. The token follows the
|
|
95
|
+
* price (USD → USDC, EUR → EURC) and ONE address receives them all, so the chip reports the pairs
|
|
96
|
+
* the node can actually settle rather than naming a single token. A money sale over x402 without an
|
|
97
|
+
* address fails with SELLER_NO_X402_ADDRESS, which is exactly what this section prevents. */
|
|
98
|
+
function X402Section() {
|
|
99
|
+
const [state, setState] = useState(null);
|
|
100
|
+
const [addr, setAddr] = useState('');
|
|
101
|
+
const [busy, setBusy] = useState(false);
|
|
102
|
+
const [msg, setMsg] = useState('');
|
|
103
|
+
const load = useCallback(() => {
|
|
104
|
+
apiGet('/v1/commerce/payout').then(r => setState(r.data ?? null)).catch(() => setState(false));
|
|
105
|
+
}, []);
|
|
106
|
+
useEffect(() => { load(); }, [load]);
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
const handler = () => load();
|
|
109
|
+
window.addEventListener('aimeat-live-update', handler);
|
|
110
|
+
return () => window.removeEventListener('aimeat-live-update', handler);
|
|
111
|
+
}, [load]);
|
|
112
|
+
if (state === null || state === false) return null;
|
|
113
|
+
const x = state.x402 || {};
|
|
114
|
+
if (!x.enabled) return null; // the operator has not enabled the rail on this node
|
|
115
|
+
const valid = /^0x[a-fA-F0-9]{40}$/.test(addr.trim());
|
|
116
|
+
async function save() {
|
|
117
|
+
setBusy(true); setMsg('');
|
|
118
|
+
try { await apiPut('/v1/commerce/payout/x402', { address: addr.trim() }); setAddr(''); setMsg(t('profile.wallet.x402Saved')); load(); }
|
|
119
|
+
catch (e) { setMsg(e.message || 'Save failed'); }
|
|
120
|
+
finally { setBusy(false); }
|
|
121
|
+
}
|
|
122
|
+
async function remove() {
|
|
123
|
+
setBusy(true); setMsg('');
|
|
124
|
+
try { await apiDelete('/v1/commerce/payout/x402'); setMsg(t('profile.wallet.x402Removed')); load(); }
|
|
125
|
+
catch (e) { setMsg(e.message || 'Remove failed'); }
|
|
126
|
+
finally { setBusy(false); }
|
|
127
|
+
}
|
|
128
|
+
return html`
|
|
129
|
+
<div class="section-title mt-2">${t('profile.wallet.x402Title')}</div>
|
|
130
|
+
<div class="section-desc">${t('profile.wallet.x402Desc')}</div>
|
|
131
|
+
<div class="card wallet-psp">
|
|
132
|
+
<div class="wallet-rail-row">
|
|
133
|
+
${x.configured
|
|
134
|
+
? html`<span class="pf-psp-chip pf-psp-chip--ok">${t('profile.wallet.x402Configured')} <code>${x.address}</code></span>`
|
|
135
|
+
: html`<span class="pf-psp-chip pf-psp-chip--warn">${t('profile.wallet.x402Missing')}</span>`}
|
|
136
|
+
<span class="pf-psp-chip">${(x.assets || []).map(a => `${a.currency} → ${a.symbol}`).join(' · ')} · ${x.network}${x.testnet ? ` · ${t('profile.wallet.x402Testnet')}` : ''}</span>
|
|
137
|
+
</div>
|
|
138
|
+
<div class="wallet-psp-row">
|
|
139
|
+
<input class="input-field input-sm wallet-psp-input" type="text" spellcheck="false" placeholder="0x…"
|
|
140
|
+
value=${addr} onInput=${(e) => setAddr(e.target.value)} />
|
|
141
|
+
<button class="btn-primary btn-sm" disabled=${busy || !valid} onClick=${save}>${t('profile.wallet.x402Save')}</button>
|
|
142
|
+
${x.configured && html`<button class="btn-ghost btn-sm" disabled=${busy} onClick=${remove}>${t('profile.wallet.x402Remove')}</button>`}
|
|
143
|
+
</div>
|
|
144
|
+
${addr.trim() && !valid && html`<span class="text-meta">${t('profile.wallet.x402Invalid')}</span>`}
|
|
145
|
+
${msg && html`<span class="text-meta">${msg}</span>`}
|
|
146
|
+
</div>`;
|
|
147
|
+
}
|
|
148
|
+
|
|
86
149
|
/* "Money purchases & sales" — real-money (EUR/USD) checkout activity, separate from morsels.
|
|
87
150
|
* Purchases come from the buyer's checkout sessions, sales from received orders; both filtered to
|
|
88
151
|
* money currencies (minor units → major). Renders nothing when there is no money activity. */
|
|
@@ -247,6 +310,7 @@ export default function WalletTab({ session, showToast, onStats }) {
|
|
|
247
310
|
|
|
248
311
|
<!-- Selling & payment provider (individual seller's own Stripe key; EE nodes only) -->
|
|
249
312
|
<${PspSection} />
|
|
313
|
+
<${X402Section} />
|
|
250
314
|
|
|
251
315
|
<!-- Real-money (EUR/USD) purchases & sales, separate from the morsel ledger -->
|
|
252
316
|
<${MoneyActivity} initial=${moneyInitial} />
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-openapi.d.ts","sourceRoot":"","sources":["../../scripts/check-openapi.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file check-openapi.ts
|
|
3
|
+
* @description Pre-commit / CI guard for `openapi.yaml`. Rule 3 makes the spec the canonical API
|
|
4
|
+
* contract, but nothing verified it was still machine-readable — and it had quietly stopped being
|
|
5
|
+
* so in two different ways, both found live on main:
|
|
6
|
+
*
|
|
7
|
+
* 1. A DANGLING $ref (`#/components/schemas/SuccessEnvelope`; the schema is `AimeatEnvelope`)
|
|
8
|
+
* broke `pnpm generate:types` outright. Rule 3's OWN tool could not run.
|
|
9
|
+
* 2. A PORTABILITY trap: `description: Whole document portion public? }` inside a flow mapping.
|
|
10
|
+
* The repo's `yaml` package and openapi-typescript both accept it, so nothing here complained
|
|
11
|
+
* — but PyYAML rejects it, and PyYAML is what most Python OpenAPI tooling is built on
|
|
12
|
+
* (openapi-spec-validator, prance, datamodel-code-generator). A consumer would have seen a
|
|
13
|
+
* syntax error instead of our API, and we would never have known.
|
|
14
|
+
*
|
|
15
|
+
* So this checks three things, cheapest first, and each one exists because it already failed.
|
|
16
|
+
* @structure
|
|
17
|
+
* - parse with the `yaml` package (genuine syntax errors)
|
|
18
|
+
* - resolve every internal `$ref` (the break that stopped codegen)
|
|
19
|
+
* - flag unquoted flow-mapping scalars containing `?` (accepted here, rejected by YAML 1.1 parsers)
|
|
20
|
+
* @usage pnpm check:openapi (exits non-zero on a parse error, a dangling $ref, or a portability trap)
|
|
21
|
+
* @version-history
|
|
22
|
+
* v1.0.0 — 2026-07-26 — Initial guard, after both failure modes were found live on main.
|
|
23
|
+
*/
|
|
24
|
+
import { readFileSync } from 'node:fs';
|
|
25
|
+
import { fileURLToPath } from 'node:url';
|
|
26
|
+
import { dirname, join } from 'node:path';
|
|
27
|
+
import { parse as parseYaml, parseDocument, visit, isCollection } from 'yaml';
|
|
28
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
29
|
+
const SPEC = join(here, '..', '..', 'openapi.yaml');
|
|
30
|
+
const raw = readFileSync(SPEC, 'utf8');
|
|
31
|
+
// ── 1. Does it parse at all? ────────────────────────────────────────────────
|
|
32
|
+
let doc;
|
|
33
|
+
try {
|
|
34
|
+
doc = parseYaml(raw, { strict: true });
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.error('✗ openapi.yaml does not parse');
|
|
38
|
+
console.error(` ${err.message}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
// ── 2. Does every internal $ref resolve? ────────────────────────────────────
|
|
42
|
+
/** Resolve a `#/a/b/c` JSON pointer against the document. undefined when it dangles. */
|
|
43
|
+
function resolvePointer(root, ref) {
|
|
44
|
+
const parts = ref.slice(2).split('/').map(p => p.replace(/~1/g, '/').replace(/~0/g, '~'));
|
|
45
|
+
let node = root;
|
|
46
|
+
for (const part of parts) {
|
|
47
|
+
if (node === null || typeof node !== 'object')
|
|
48
|
+
return undefined;
|
|
49
|
+
node = node[part];
|
|
50
|
+
if (node === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return node;
|
|
54
|
+
}
|
|
55
|
+
const dangling = [];
|
|
56
|
+
let refCount = 0;
|
|
57
|
+
function walk(node, path) {
|
|
58
|
+
if (Array.isArray(node)) {
|
|
59
|
+
node.forEach((v, i) => walk(v, `${path}/${i}`));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (node === null || typeof node !== 'object')
|
|
63
|
+
return;
|
|
64
|
+
for (const [key, value] of Object.entries(node)) {
|
|
65
|
+
if (key === '$ref' && typeof value === 'string') {
|
|
66
|
+
// Only internal pointers are ours to guarantee; an external file/URL ref is the
|
|
67
|
+
// codegen tool's business.
|
|
68
|
+
if (value.startsWith('#/')) {
|
|
69
|
+
refCount++;
|
|
70
|
+
if (resolvePointer(doc, value) === undefined)
|
|
71
|
+
dangling.push({ path, ref: value });
|
|
72
|
+
}
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
walk(value, `${path}/${key.replace(/~/g, '~0').replace(/\//g, '~1')}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
walk(doc, '#');
|
|
79
|
+
// ── 3. Portability: plain scalars inside { } that YAML 1.1 parsers reject ───
|
|
80
|
+
// `?` is an indicator character. Inside a flow collection a PLAIN (unquoted) scalar containing one
|
|
81
|
+
// is accepted by the `yaml` package but rejected by PyYAML, so the spec parses here and fails for a
|
|
82
|
+
// Python consumer. Quoting the value fixes it and costs nothing.
|
|
83
|
+
//
|
|
84
|
+
// This walks the AST rather than the text: a line-based scan cannot tell a real flow mapping from a
|
|
85
|
+
// `{ … }` that is merely prose inside a block description, and this file is full of the latter (12
|
|
86
|
+
// false positives on the first attempt). Node type PLAIN + an ancestor collection with flow=true is
|
|
87
|
+
// the exact condition, and nothing else.
|
|
88
|
+
const portability = [];
|
|
89
|
+
const lineStarts = [0];
|
|
90
|
+
for (let i = 0; i < raw.length; i++)
|
|
91
|
+
if (raw[i] === '\n')
|
|
92
|
+
lineStarts.push(i + 1);
|
|
93
|
+
const lineOf = (offset) => {
|
|
94
|
+
let lo = 0, hi = lineStarts.length - 1;
|
|
95
|
+
while (lo < hi) {
|
|
96
|
+
const mid = (lo + hi + 1) >> 1;
|
|
97
|
+
if (lineStarts[mid] <= offset)
|
|
98
|
+
lo = mid;
|
|
99
|
+
else
|
|
100
|
+
hi = mid - 1;
|
|
101
|
+
}
|
|
102
|
+
return lo + 1;
|
|
103
|
+
};
|
|
104
|
+
const cst = parseDocument(raw);
|
|
105
|
+
visit(cst, {
|
|
106
|
+
Scalar(_key, node, path) {
|
|
107
|
+
if (node.type !== 'PLAIN')
|
|
108
|
+
return;
|
|
109
|
+
const value = typeof node.value === 'string' ? node.value : '';
|
|
110
|
+
if (!value.includes('?'))
|
|
111
|
+
return;
|
|
112
|
+
const inFlow = path.some(p => isCollection(p) && p.flow === true);
|
|
113
|
+
if (!inFlow)
|
|
114
|
+
return;
|
|
115
|
+
const line = node.range ? lineOf(node.range[0]) : 0;
|
|
116
|
+
portability.push({ line, text: raw.split(/\r?\n/)[line - 1]?.trim() ?? value });
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
// ── Report ──────────────────────────────────────────────────────────────────
|
|
120
|
+
let failed = false;
|
|
121
|
+
if (dangling.length) {
|
|
122
|
+
failed = true;
|
|
123
|
+
console.error(`✗ ${dangling.length} dangling $ref(s) — \`pnpm generate:types\` cannot run:`);
|
|
124
|
+
for (const d of dangling)
|
|
125
|
+
console.error(` ${d.ref}\n at ${d.path}`);
|
|
126
|
+
}
|
|
127
|
+
if (portability.length) {
|
|
128
|
+
failed = true;
|
|
129
|
+
console.error(`✗ ${portability.length} unquoted flow scalar(s) containing "?" — this file parses here but`);
|
|
130
|
+
console.error(' fails in PyYAML-based OpenAPI tooling. Quote the value:');
|
|
131
|
+
for (const p of portability)
|
|
132
|
+
console.error(` openapi.yaml:${p.line} ${p.text.slice(0, 110)}`);
|
|
133
|
+
}
|
|
134
|
+
if (failed)
|
|
135
|
+
process.exit(1);
|
|
136
|
+
const spec = doc;
|
|
137
|
+
console.log(`✓ openapi.yaml parses, all ${refCount} internal $refs resolve, no flow-scalar portability traps `
|
|
138
|
+
+ `— ${Object.keys(spec.paths ?? {}).length} paths, ${Object.keys(spec.components?.schemas ?? {}).length} schemas.`);
|
|
139
|
+
//# sourceMappingURL=check-openapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-openapi.js","sourceRoot":"","sources":["../../scripts/check-openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file embed-viewport.ts
|
|
3
|
+
* @description Keeps the copy of aimeat-viewport.js that is embedded inside other cortex packs
|
|
4
|
+
* byte-identical to the source. Cortex packs are served live and each declares a single script
|
|
5
|
+
* tag with no `requires`, so a pack that needs the shared camera cannot simply depend on it —
|
|
6
|
+
* splitting a pack into two files would break every app carrying the old single tag. The camera
|
|
7
|
+
* is therefore copied INTO the consuming pack between generated markers, and this script is the
|
|
8
|
+
* only thing allowed to write that region. `--check` (pre-commit + CI) fails on drift, so the
|
|
9
|
+
* duplicate can never quietly diverge from the source.
|
|
10
|
+
* @structure
|
|
11
|
+
* - SOURCE / TARGETS → the camera file and every pack that embeds it
|
|
12
|
+
* - detectEol/toEol → preserve each target's existing line endings (Windows checkouts)
|
|
13
|
+
* - main() → write mode (default) or --check mode (exit 1 on drift)
|
|
14
|
+
* @usage
|
|
15
|
+
* pnpm sync:viewport # rewrite the embedded region in every target
|
|
16
|
+
* pnpm check:viewport # verify, non-zero exit on drift
|
|
17
|
+
* @version-history
|
|
18
|
+
* v1.0.0 — 2026-07-25 — Initial (TARGET-051 Slice 1): aimeat-dag embeds aimeat-viewport.
|
|
19
|
+
* v1.1.0 — 2026-07-25 — Also assert every pack's VERSION constant matches its manifest;
|
|
20
|
+
* they crossed once already (constant 1.0.1 while the manifest said 1.0.2).
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=embed-viewport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embed-viewport.d.ts","sourceRoot":"","sources":["../../scripts/embed-viewport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file embed-viewport.ts
|
|
3
|
+
* @description Keeps the copy of aimeat-viewport.js that is embedded inside other cortex packs
|
|
4
|
+
* byte-identical to the source. Cortex packs are served live and each declares a single script
|
|
5
|
+
* tag with no `requires`, so a pack that needs the shared camera cannot simply depend on it —
|
|
6
|
+
* splitting a pack into two files would break every app carrying the old single tag. The camera
|
|
7
|
+
* is therefore copied INTO the consuming pack between generated markers, and this script is the
|
|
8
|
+
* only thing allowed to write that region. `--check` (pre-commit + CI) fails on drift, so the
|
|
9
|
+
* duplicate can never quietly diverge from the source.
|
|
10
|
+
* @structure
|
|
11
|
+
* - SOURCE / TARGETS → the camera file and every pack that embeds it
|
|
12
|
+
* - detectEol/toEol → preserve each target's existing line endings (Windows checkouts)
|
|
13
|
+
* - main() → write mode (default) or --check mode (exit 1 on drift)
|
|
14
|
+
* @usage
|
|
15
|
+
* pnpm sync:viewport # rewrite the embedded region in every target
|
|
16
|
+
* pnpm check:viewport # verify, non-zero exit on drift
|
|
17
|
+
* @version-history
|
|
18
|
+
* v1.0.0 — 2026-07-25 — Initial (TARGET-051 Slice 1): aimeat-dag embeds aimeat-viewport.
|
|
19
|
+
* v1.1.0 — 2026-07-25 — Also assert every pack's VERSION constant matches its manifest;
|
|
20
|
+
* they crossed once already (constant 1.0.1 while the manifest said 1.0.2).
|
|
21
|
+
*/
|
|
22
|
+
import { readFileSync, writeFileSync, readdirSync, existsSync } from 'node:fs';
|
|
23
|
+
import { join, dirname, relative } from 'node:path';
|
|
24
|
+
import { fileURLToPath } from 'node:url';
|
|
25
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
const REPO = join(__dirname, '..');
|
|
27
|
+
const BUNDLED = join(REPO, 'public', 'cortex-bundled');
|
|
28
|
+
const SOURCE = join(BUNDLED, 'aimeat-viewport.js');
|
|
29
|
+
const TARGETS = [join(BUNDLED, 'aimeat-dag.js')];
|
|
30
|
+
const BEGIN = '/* BEGIN embedded aimeat-viewport — GENERATED, DO NOT EDIT (pnpm sync:viewport) */';
|
|
31
|
+
const END = '/* END embedded aimeat-viewport */';
|
|
32
|
+
/** Windows checkouts may hold CRLF; keep whatever the target already uses. */
|
|
33
|
+
function detectEol(text) {
|
|
34
|
+
return text.includes('\r\n') ? '\r\n' : '\n';
|
|
35
|
+
}
|
|
36
|
+
function toEol(text, eol) {
|
|
37
|
+
const lf = text.replace(/\r\n/g, '\n');
|
|
38
|
+
return eol === '\n' ? lf : lf.replace(/\n/g, '\r\n');
|
|
39
|
+
}
|
|
40
|
+
function main() {
|
|
41
|
+
const check = process.argv.includes('--check');
|
|
42
|
+
const source = readFileSync(SOURCE, 'utf-8');
|
|
43
|
+
let drifted = 0;
|
|
44
|
+
for (const target of TARGETS) {
|
|
45
|
+
const rel = relative(REPO, target).replace(/\\/g, '/');
|
|
46
|
+
const current = readFileSync(target, 'utf-8');
|
|
47
|
+
const eol = detectEol(current);
|
|
48
|
+
const begin = current.indexOf(BEGIN);
|
|
49
|
+
const end = current.indexOf(END);
|
|
50
|
+
if (begin === -1 || end === -1 || end < begin) {
|
|
51
|
+
console.error(`✗ ${rel}: embed markers missing or out of order.`);
|
|
52
|
+
console.error(` Expected a region delimited by:\n ${BEGIN}\n ${END}`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
const head = current.slice(0, begin + BEGIN.length);
|
|
56
|
+
const tail = current.slice(end);
|
|
57
|
+
const body = toEol(source, eol);
|
|
58
|
+
const next = head + eol + body + (body.endsWith(eol) ? '' : eol) + tail;
|
|
59
|
+
if (next === current) {
|
|
60
|
+
if (!check)
|
|
61
|
+
console.log(`✓ ${rel}: already in sync`);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
drifted++;
|
|
65
|
+
if (check) {
|
|
66
|
+
console.error(`✗ ${rel}: embedded aimeat-viewport has drifted from public/cortex-bundled/aimeat-viewport.js`);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
writeFileSync(target, next, 'utf-8');
|
|
70
|
+
console.log(`✓ ${rel}: embedded region updated`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
drifted += checkVersions(check);
|
|
74
|
+
if (check) {
|
|
75
|
+
if (drifted > 0) {
|
|
76
|
+
console.error(`\n${drifted} problem(s). Run: pnpm sync:viewport (embed) and align the versions by hand.`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
console.log('✓ embedded aimeat-viewport is in sync; pack VERSION constants match their manifests');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* A cortex pack that exposes a VERSION constant must report the version its manifest declares.
|
|
84
|
+
* These drift trivially — the manifest gets bumped to make the seeder republish, the constant is
|
|
85
|
+
* forgotten, and from then on the lib lies to anyone reading it from the console. Checking it is
|
|
86
|
+
* three lines; noticing it in production is not.
|
|
87
|
+
*/
|
|
88
|
+
function checkVersions(check) {
|
|
89
|
+
let bad = 0;
|
|
90
|
+
for (const file of readdirSync(BUNDLED)) {
|
|
91
|
+
if (!file.endsWith('.js'))
|
|
92
|
+
continue;
|
|
93
|
+
const js = readFileSync(join(BUNDLED, file), 'utf-8');
|
|
94
|
+
const yamlPath = join(BUNDLED, file.replace(/\.js$/, '.yaml'));
|
|
95
|
+
if (!existsSync(yamlPath))
|
|
96
|
+
continue;
|
|
97
|
+
// Only the pack's OWN constant, not one embedded from another pack.
|
|
98
|
+
const own = js.split(BEGIN)[0] + (js.includes(END) ? js.split(END).slice(1).join(END) : '');
|
|
99
|
+
const m = own.match(/VERSION:\s*'([\d.]+)'/);
|
|
100
|
+
if (!m)
|
|
101
|
+
continue;
|
|
102
|
+
const y = readFileSync(yamlPath, 'utf-8').match(/^\s*version:\s*"([\d.]+)"/m);
|
|
103
|
+
if (!y)
|
|
104
|
+
continue;
|
|
105
|
+
if (m[1] !== y[1]) {
|
|
106
|
+
bad++;
|
|
107
|
+
console.error(`✗ ${file}: VERSION constant is ${m[1]} but ${file.replace(/\.js$/, '.yaml')} declares ${y[1]}`);
|
|
108
|
+
}
|
|
109
|
+
else if (!check) {
|
|
110
|
+
console.log(`✓ ${file}: VERSION ${m[1]} matches its manifest`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return bad;
|
|
114
|
+
}
|
|
115
|
+
main();
|
|
116
|
+
//# sourceMappingURL=embed-viewport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embed-viewport.js","sourceRoot":"","sources":["../../scripts/embed-viewport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file sse-domain-scopes.ts
|
|
3
|
+
* @description Authorization for the SSE live-update stream: which change DOMAINS a given
|
|
4
|
+
* principal may be told about. The stream carries no payload (only domain names), but a
|
|
5
|
+
* domain name plus its timing is still metadata: an app granted `memory:read` must not
|
|
6
|
+
* learn that the owner's messages, wallet or agent tasks just changed. H-2 app-origin
|
|
7
|
+
* isolation fences an app's DATA access; this fences its CHANGE-NOTIFICATION access the
|
|
8
|
+
* same way, using the very same scope vocabulary the owner approved at sign-in.
|
|
9
|
+
*
|
|
10
|
+
* Owner sessions (a human on the apex portal) see everything — the whole keyspace is
|
|
11
|
+
* theirs. Every other principal (app grant, agent, ecosystem app, anonymous) is RESTRICTED:
|
|
12
|
+
* a domain is forwarded only when the principal holds the scope that domain maps to, and a
|
|
13
|
+
* domain absent from the map is DENIED. Deny-by-default is deliberate: a new domain added
|
|
14
|
+
* elsewhere in the node must not silently start leaking to sandboxed apps. Adding the
|
|
15
|
+
* mapping is a one-line, reviewable decision.
|
|
16
|
+
* @structure DOMAIN_SCOPE (domain → required scope) · isOwnerPrincipal · allowedDomains ·
|
|
17
|
+
* filterDomains
|
|
18
|
+
* @usage
|
|
19
|
+
* const restricted = !isOwnerPrincipal(req.auth!);
|
|
20
|
+
* const allow = allowedDomains(req.auth!.scopes); // Set<string> | null (null = all)
|
|
21
|
+
* const visible = filterDomains(['memory', 'wallet'], allow);
|
|
22
|
+
* @version-history
|
|
23
|
+
* v1.0.0 — 2026-07-25 — Initial: scope-gated SSE domains (an app-grant stream no longer
|
|
24
|
+
* sees every domain in the owner's keyspace).
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Change domain → the scope a RESTRICTED principal must hold to be told about it.
|
|
28
|
+
* Keys are the domain strings passed to `emitChange(domain, …)`. Anything not listed here
|
|
29
|
+
* is invisible to restricted principals (operator/infra domains: config, features, admin-*,
|
|
30
|
+
* federation, disputes, appeals, verification, totp, ghii, owners, consent, flags, feedback,
|
|
31
|
+
* instances, extensions, cortex, skills, portfolio, ecosystem-apps, presence, realtime).
|
|
32
|
+
*/
|
|
33
|
+
export declare const DOMAIN_SCOPE: Readonly<Record<string, string>>;
|
|
34
|
+
/**
|
|
35
|
+
* True for a human owner session on the apex portal — the principal whose keyspace this is.
|
|
36
|
+
* An app grant carries roles ['app'] (never 'owner'), so it is restricted even though it acts
|
|
37
|
+
* on the owner's behalf; agents and ecosystem apps are restricted for the same reason.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isOwnerPrincipal(auth: {
|
|
40
|
+
roles?: string[];
|
|
41
|
+
}): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* The domains a restricted principal holding `scopes` may be told about, or `null` when no
|
|
44
|
+
* filtering applies (owner sessions). A wildcard scope ('*') also disables filtering — the
|
|
45
|
+
* node's own dev/default-scope escape hatch, unchanged in meaning here.
|
|
46
|
+
*/
|
|
47
|
+
export declare function allowedDomains(scopes: string[] | undefined): Set<string> | null;
|
|
48
|
+
/** Keep only the domains this principal may see. `allow === null` passes everything through. */
|
|
49
|
+
export declare function filterDomains(domains: string[], allow: Set<string> | null): string[];
|
|
50
|
+
//# sourceMappingURL=sse-domain-scopes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-domain-scopes.d.ts","sourceRoot":"","sources":["../../../src/auth/sse-domain-scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqDxD,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,OAAO,CAIpE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAQ/E;AAED,gGAAgG;AAChG,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,EAAE,CAGpF"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file sse-domain-scopes.ts
|
|
3
|
+
* @description Authorization for the SSE live-update stream: which change DOMAINS a given
|
|
4
|
+
* principal may be told about. The stream carries no payload (only domain names), but a
|
|
5
|
+
* domain name plus its timing is still metadata: an app granted `memory:read` must not
|
|
6
|
+
* learn that the owner's messages, wallet or agent tasks just changed. H-2 app-origin
|
|
7
|
+
* isolation fences an app's DATA access; this fences its CHANGE-NOTIFICATION access the
|
|
8
|
+
* same way, using the very same scope vocabulary the owner approved at sign-in.
|
|
9
|
+
*
|
|
10
|
+
* Owner sessions (a human on the apex portal) see everything — the whole keyspace is
|
|
11
|
+
* theirs. Every other principal (app grant, agent, ecosystem app, anonymous) is RESTRICTED:
|
|
12
|
+
* a domain is forwarded only when the principal holds the scope that domain maps to, and a
|
|
13
|
+
* domain absent from the map is DENIED. Deny-by-default is deliberate: a new domain added
|
|
14
|
+
* elsewhere in the node must not silently start leaking to sandboxed apps. Adding the
|
|
15
|
+
* mapping is a one-line, reviewable decision.
|
|
16
|
+
* @structure DOMAIN_SCOPE (domain → required scope) · isOwnerPrincipal · allowedDomains ·
|
|
17
|
+
* filterDomains
|
|
18
|
+
* @usage
|
|
19
|
+
* const restricted = !isOwnerPrincipal(req.auth!);
|
|
20
|
+
* const allow = allowedDomains(req.auth!.scopes); // Set<string> | null (null = all)
|
|
21
|
+
* const visible = filterDomains(['memory', 'wallet'], allow);
|
|
22
|
+
* @version-history
|
|
23
|
+
* v1.0.0 — 2026-07-25 — Initial: scope-gated SSE domains (an app-grant stream no longer
|
|
24
|
+
* sees every domain in the owner's keyspace).
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Change domain → the scope a RESTRICTED principal must hold to be told about it.
|
|
28
|
+
* Keys are the domain strings passed to `emitChange(domain, …)`. Anything not listed here
|
|
29
|
+
* is invisible to restricted principals (operator/infra domains: config, features, admin-*,
|
|
30
|
+
* federation, disputes, appeals, verification, totp, ghii, owners, consent, flags, feedback,
|
|
31
|
+
* instances, extensions, cortex, skills, portfolio, ecosystem-apps, presence, realtime).
|
|
32
|
+
*/
|
|
33
|
+
export const DOMAIN_SCOPE = Object.freeze({
|
|
34
|
+
// Owner data the app already reads
|
|
35
|
+
memory: 'memory:read',
|
|
36
|
+
personal: 'memory:read',
|
|
37
|
+
files: 'storage:read',
|
|
38
|
+
// Structured spaces
|
|
39
|
+
organisms: 'organism:read',
|
|
40
|
+
schemas: 'organism:read',
|
|
41
|
+
templates: 'organism:read',
|
|
42
|
+
csm: 'organism:read',
|
|
43
|
+
msm: 'organism:read',
|
|
44
|
+
// Public discovery surfaces
|
|
45
|
+
catalogue: 'catalogue:read',
|
|
46
|
+
apps: 'catalogue:read',
|
|
47
|
+
'app-store': 'catalogue:read',
|
|
48
|
+
site: 'catalogue:read',
|
|
49
|
+
// Social
|
|
50
|
+
boards: 'social:read',
|
|
51
|
+
groups: 'social:read',
|
|
52
|
+
matches: 'social:read',
|
|
53
|
+
// Conversations
|
|
54
|
+
messages: 'messages:read',
|
|
55
|
+
'agent-messages': 'messages:read',
|
|
56
|
+
chat: 'messages:read',
|
|
57
|
+
// Economy
|
|
58
|
+
wallet: 'wallet:read',
|
|
59
|
+
// Knowledge
|
|
60
|
+
knowledge: 'knowledge:read',
|
|
61
|
+
packages: 'knowledge:read',
|
|
62
|
+
// The owner's fleet
|
|
63
|
+
'agent-tasks': 'task:read',
|
|
64
|
+
agents: 'task:read',
|
|
65
|
+
work: 'task:read',
|
|
66
|
+
actions: 'task:read',
|
|
67
|
+
'agent-usage': 'task:read',
|
|
68
|
+
'agent-capabilities': 'task:read',
|
|
69
|
+
'agent-directives': 'task:read',
|
|
70
|
+
'agent-onboarding': 'task:read',
|
|
71
|
+
// Automation
|
|
72
|
+
workflows: 'workflow:read',
|
|
73
|
+
scheduler: 'workflow:read',
|
|
74
|
+
// Nudges
|
|
75
|
+
notifications: 'notifications:send',
|
|
76
|
+
push: 'notifications:send',
|
|
77
|
+
});
|
|
78
|
+
/**
|
|
79
|
+
* True for a human owner session on the apex portal — the principal whose keyspace this is.
|
|
80
|
+
* An app grant carries roles ['app'] (never 'owner'), so it is restricted even though it acts
|
|
81
|
+
* on the owner's behalf; agents and ecosystem apps are restricted for the same reason.
|
|
82
|
+
*/
|
|
83
|
+
export function isOwnerPrincipal(auth) {
|
|
84
|
+
const roles = auth.roles ?? [];
|
|
85
|
+
if (roles.includes('app') || roles.includes('agent') || roles.includes('ecosystem'))
|
|
86
|
+
return false;
|
|
87
|
+
return roles.includes('owner');
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The domains a restricted principal holding `scopes` may be told about, or `null` when no
|
|
91
|
+
* filtering applies (owner sessions). A wildcard scope ('*') also disables filtering — the
|
|
92
|
+
* node's own dev/default-scope escape hatch, unchanged in meaning here.
|
|
93
|
+
*/
|
|
94
|
+
export function allowedDomains(scopes) {
|
|
95
|
+
const held = new Set(scopes ?? []);
|
|
96
|
+
if (held.has('*'))
|
|
97
|
+
return null;
|
|
98
|
+
const out = new Set();
|
|
99
|
+
for (const [domain, needed] of Object.entries(DOMAIN_SCOPE)) {
|
|
100
|
+
if (held.has(needed))
|
|
101
|
+
out.add(domain);
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
/** Keep only the domains this principal may see. `allow === null` passes everything through. */
|
|
106
|
+
export function filterDomains(domains, allow) {
|
|
107
|
+
if (!allow)
|
|
108
|
+
return domains;
|
|
109
|
+
return domains.filter(d => allow.has(d));
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=sse-domain-scopes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-domain-scopes.js","sourceRoot":"","sources":["../../../src/auth/sse-domain-scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAqC,MAAM,CAAC,MAAM,CAAC;IAC1E,mCAAmC;IACnC,MAAM,EAAE,aAAa;IACrB,QAAQ,EAAE,aAAa;IACvB,KAAK,EAAE,cAAc;IAErB,oBAAoB;IACpB,SAAS,EAAE,eAAe;IAC1B,OAAO,EAAE,eAAe;IACxB,SAAS,EAAE,eAAe;IAC1B,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,eAAe;IAEpB,4BAA4B;IAC5B,SAAS,EAAE,gBAAgB;IAC3B,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,gBAAgB;IAC7B,IAAI,EAAE,gBAAgB;IAEtB,SAAS;IACT,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,aAAa;IAEtB,gBAAgB;IAChB,QAAQ,EAAE,eAAe;IACzB,gBAAgB,EAAE,eAAe;IACjC,IAAI,EAAE,eAAe;IAErB,UAAU;IACV,MAAM,EAAE,aAAa;IAErB,YAAY;IACZ,SAAS,EAAE,gBAAgB;IAC3B,QAAQ,EAAE,gBAAgB;IAE1B,oBAAoB;IACpB,aAAa,EAAE,WAAW;IAC1B,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,WAAW;IACpB,aAAa,EAAE,WAAW;IAC1B,oBAAoB,EAAE,WAAW;IACjC,kBAAkB,EAAE,WAAW;IAC/B,kBAAkB,EAAE,WAAW;IAE/B,aAAa;IACb,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,eAAe;IAE1B,SAAS;IACT,aAAa,EAAE,oBAAoB;IACnC,IAAI,EAAE,oBAAoB;CAC3B,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA0B;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAClG,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAA4B;IACzD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5D,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,aAAa,CAAC,OAAiB,EAAE,KAAyB;IACxE,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-tasks.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/connect/mcp/tools/agent-tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"agent-tasks.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/connect/mcp/tools/agent-tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAuJrF"}
|
|
@@ -28,7 +28,8 @@ export function registerAgentTasksTools(mcp, registry) {
|
|
|
28
28
|
title: z.string().describe('Short human-readable title for the task. Shows up in the owner\'s dashboard. Example: "Research 2026 agent orchestration trends".'),
|
|
29
29
|
description: z.string().describe('The actual prompt / instruction for the target agent. This is what its liaison / runtime will read and act on.'),
|
|
30
30
|
status: z.enum(['draft', 'queued']).optional().describe('Default "queued" (visible to the target agent immediately). Use "draft" if you want the owner to review before it goes live.'),
|
|
31
|
-
|
|
31
|
+
files: z.array(z.string()).max(20).optional().describe('Files the target agent needs, by REFERENCE: "<owner@node>/<storage key>" each (a bare key means a file the calling agent owns). The caller must be able to read each file itself; the target agent gets a presigned download_url from aimeat_task_get.'),
|
|
32
|
+
}, annotationsFor('aimeat_task_create'), async ({ agent_name, target_agent, title, description, status, files }) => {
|
|
32
33
|
const { client } = pickAgent(registry, agent_name);
|
|
33
34
|
const body = {
|
|
34
35
|
title,
|
|
@@ -39,6 +40,8 @@ export function registerAgentTasksTools(mcp, registry) {
|
|
|
39
40
|
verification: { user_expects: '', technical_checks: [] },
|
|
40
41
|
todos: [],
|
|
41
42
|
};
|
|
43
|
+
if (files?.length)
|
|
44
|
+
body.resources = { files: files.map(ref => ({ ref })) };
|
|
42
45
|
const resp = await client.post(`/v1/agents/${encodeURIComponent(target_agent)}/tasks`, body);
|
|
43
46
|
return { content: [{ type: 'text', text: JSON.stringify(resp.data ?? resp, null, 2) }] };
|
|
44
47
|
});
|