aimeat 2.0.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 +63 -1
- package/dist/locales/fi.json +63 -1
- package/dist/public/components/LinkPreview.js +101 -0
- package/dist/public/components/NotificationBell.js +18 -1
- 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/theme.css +57 -7
- package/dist/public/css/views/admin.css +8 -1
- package/dist/public/css/views/app-grant.css +18 -0
- package/dist/public/css/views/inbox.css +47 -1
- package/dist/public/css/views/portfolio.css +46 -0
- package/dist/public/css/views/profile.css +38 -4
- package/dist/public/js/services/apps.js +19 -3
- package/dist/public/js/services/messages-ai-prompts.js +38 -0
- package/dist/public/js/services/messages.js +26 -4
- package/dist/public/js/services/notebook.js +76 -0
- package/dist/public/js/services/unfurl.js +43 -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/LICENSE.md +11 -0
- package/dist/public/lib/samples/bass/A1.mp3 +0 -0
- package/dist/public/lib/samples/bass/B2.mp3 +0 -0
- package/dist/public/lib/samples/bass/D2.mp3 +0 -0
- package/dist/public/lib/samples/bass/E1.mp3 +0 -0
- package/dist/public/lib/samples/bass/E3.mp3 +0 -0
- package/dist/public/lib/samples/bass/G2.mp3 +0 -0
- package/dist/public/lib/samples/epiano/C2.mp3 +0 -0
- package/dist/public/lib/samples/epiano/C3.mp3 +0 -0
- package/dist/public/lib/samples/epiano/C4.mp3 +0 -0
- package/dist/public/lib/samples/epiano/C5.mp3 +0 -0
- package/dist/public/lib/samples/epiano/C6.mp3 +0 -0
- package/dist/public/lib/samples/epiano/G2.mp3 +0 -0
- package/dist/public/lib/samples/epiano/G3.mp3 +0 -0
- package/dist/public/lib/samples/epiano/G4.mp3 +0 -0
- package/dist/public/lib/samples/epiano/G5.mp3 +0 -0
- package/dist/public/lib/samples/guitar-steel/A2.mp3 +0 -0
- package/dist/public/lib/samples/guitar-steel/A4.mp3 +0 -0
- package/dist/public/lib/samples/guitar-steel/B3.mp3 +0 -0
- package/dist/public/lib/samples/guitar-steel/D3.mp3 +0 -0
- package/dist/public/lib/samples/guitar-steel/E2.mp3 +0 -0
- package/dist/public/lib/samples/guitar-steel/E4.mp3 +0 -0
- package/dist/public/lib/samples/guitar-steel/E5.mp3 +0 -0
- package/dist/public/lib/samples/guitar-steel/G3.mp3 +0 -0
- package/dist/public/lib/samples/organ/C2.mp3 +0 -0
- package/dist/public/lib/samples/organ/C3.mp3 +0 -0
- package/dist/public/lib/samples/organ/C4.mp3 +0 -0
- package/dist/public/lib/samples/organ/C5.mp3 +0 -0
- package/dist/public/lib/samples/organ/C6.mp3 +0 -0
- package/dist/public/lib/samples/organ/G2.mp3 +0 -0
- package/dist/public/lib/samples/organ/G3.mp3 +0 -0
- package/dist/public/lib/samples/organ/G4.mp3 +0 -0
- package/dist/public/lib/samples/organ/G5.mp3 +0 -0
- package/dist/public/lib/samples/strings/C2.mp3 +0 -0
- package/dist/public/lib/samples/strings/C3.mp3 +0 -0
- package/dist/public/lib/samples/strings/C4.mp3 +0 -0
- package/dist/public/lib/samples/strings/C5.mp3 +0 -0
- package/dist/public/lib/samples/strings/C6.mp3 +0 -0
- package/dist/public/lib/samples/strings/G2.mp3 +0 -0
- package/dist/public/lib/samples/strings/G3.mp3 +0 -0
- package/dist/public/lib/samples/strings/G4.mp3 +0 -0
- package/dist/public/lib/samples/strings/G5.mp3 +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/lib/samples/trumpet/A3.mp3 +0 -0
- package/dist/public/lib/samples/trumpet/A4.mp3 +0 -0
- package/dist/public/lib/samples/trumpet/A5.mp3 +0 -0
- package/dist/public/lib/samples/trumpet/C4.mp3 +0 -0
- package/dist/public/lib/samples/trumpet/C5.mp3 +0 -0
- package/dist/public/lib/samples/trumpet/E3.mp3 +0 -0
- package/dist/public/lib/samples/trumpet/E4.mp3 +0 -0
- package/dist/public/lib/samples/trumpet/E5.mp3 +0 -0
- package/dist/public/spa.html +2 -0
- package/dist/public/views/app-grant.js +24 -4
- package/dist/public/views/portfolio.js +61 -6
- package/dist/public/views/profile/access-tab/connected-apps.js +81 -5
- package/dist/public/views/profile/apps-tab.js +18 -1
- package/dist/public/views/profile/extensions-tab.maturity.js +4 -1
- package/dist/public/views/profile/inbox-tab/ai-actions.js +86 -0
- package/dist/public/views/profile/inbox-tab/components.js +141 -10
- package/dist/public/views/profile/inbox-tab/helpers.js +26 -0
- package/dist/public/views/profile/inbox-tab/panels.js +18 -3
- package/dist/public/views/profile/inbox-tab/use-thread-ux.js +47 -3
- package/dist/public/views/profile/inbox-tab.js +46 -49
- package/dist/public/views/profile/landing-page.cards.js +7 -0
- package/dist/public/views/profile/landing-page.js +12 -1
- package/dist/public/views/profile/libraries-tab.js +10 -2
- package/dist/public/views/profile/skills-tab.js +1 -1
- package/dist/public/views/profile/wallet-tab.js +64 -0
- package/dist/public/views/public-workspace-viewer.js +1 -1
- package/dist/public/views/start.js +2 -1
- package/dist/scripts/build-sdk-libs.d.ts +16 -0
- package/dist/scripts/build-sdk-libs.d.ts.map +1 -0
- package/dist/scripts/build-sdk-libs.js +112 -0
- package/dist/scripts/build-sdk-libs.js.map +1 -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/auth.d.ts +15 -0
- package/dist/src/cli/connect/auth.d.ts.map +1 -1
- package/dist/src/cli/connect/auth.js +25 -6
- package/dist/src/cli/connect/auth.js.map +1 -1
- package/dist/src/cli/connect/keychain.d.ts +9 -0
- package/dist/src/cli/connect/keychain.d.ts.map +1 -1
- package/dist/src/cli/connect/keychain.js +21 -8
- package/dist/src/cli/connect/keychain.js.map +1 -1
- 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/exchange.d.ts +18 -0
- package/dist/src/cli/connect/mcp/tools/exchange.d.ts.map +1 -0
- package/dist/src/cli/connect/mcp/tools/exchange.js +170 -0
- package/dist/src/cli/connect/mcp/tools/exchange.js.map +1 -0
- package/dist/src/cli/connect/mcp/tools/index.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/index.js +2 -0
- package/dist/src/cli/connect/mcp/tools/index.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/cli/connect/tool-call-defs-exchange.d.ts +3 -0
- package/dist/src/cli/connect/tool-call-defs-exchange.d.ts.map +1 -0
- package/dist/src/cli/connect/tool-call-defs-exchange.js +146 -0
- package/dist/src/cli/connect/tool-call-defs-exchange.js.map +1 -0
- package/dist/src/cli/connect/tool-call.d.ts.map +1 -1
- package/dist/src/cli/connect/tool-call.js +2 -0
- package/dist/src/cli/connect/tool-call.js.map +1 -1
- package/dist/src/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/session-service.d.ts +14 -0
- package/dist/src/commerce/session-service.d.ts.map +1 -1
- package/dist/src/commerce/session-service.js +1 -1
- package/dist/src/commerce/session-service.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 +15 -3
- package/dist/src/data/app-templates/shells.d.ts.map +1 -1
- package/dist/src/data/app-templates/shells.js +97 -12
- 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/appdev-pitfalls.d.ts +2 -0
- package/dist/src/data/appdev-pitfalls.d.ts.map +1 -1
- package/dist/src/data/appdev-pitfalls.js +24 -1
- package/dist/src/data/appdev-pitfalls.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 +2039 -24
- 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/annotations.d.ts.map +1 -1
- package/dist/src/mcp/annotations.js +20 -0
- package/dist/src/mcp/annotations.js.map +1 -1
- package/dist/src/mcp/apps.d.ts.map +1 -1
- package/dist/src/mcp/apps.js +8 -4
- package/dist/src/mcp/apps.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/exchange.d.ts +18 -0
- package/dist/src/mcp/catalog/definitions/exchange.d.ts.map +1 -0
- package/dist/src/mcp/catalog/definitions/exchange.js +182 -0
- package/dist/src/mcp/catalog/definitions/exchange.js.map +1 -0
- 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/definitions.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions.js +2 -0
- package/dist/src/mcp/catalog/definitions.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/catalog/scopes.d.ts.map +1 -1
- package/dist/src/mcp/catalog/scopes.js +22 -0
- package/dist/src/mcp/catalog/scopes.js.map +1 -1
- package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
- package/dist/src/mcp/catalog/surfaces.js +14 -0
- package/dist/src/mcp/catalog/surfaces.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-run.d.ts +5 -0
- package/dist/src/mcp/exchange-run.d.ts.map +1 -0
- package/dist/src/mcp/exchange-run.js +226 -0
- package/dist/src/mcp/exchange-run.js.map +1 -0
- package/dist/src/mcp/exchange.d.ts +5 -0
- package/dist/src/mcp/exchange.d.ts.map +1 -0
- package/dist/src/mcp/exchange.js +352 -0
- package/dist/src/mcp/exchange.js.map +1 -0
- package/dist/src/mcp/extensions.d.ts.map +1 -1
- package/dist/src/mcp/extensions.js +17 -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 +26 -3
- 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 +573 -2
- package/dist/src/models/app-tool-schemas.d.ts.map +1 -1
- package/dist/src/models/app-tool-schemas.js +73 -2
- 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 +359 -4
- 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 +7 -3
- package/dist/src/models/schemas.d.ts.map +1 -1
- package/dist/src/models/schemas.js +13 -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/device-auth.d.ts +4 -0
- package/dist/src/routes/agents/device-auth.d.ts.map +1 -1
- package/dist/src/routes/agents/device-auth.js +19 -4
- package/dist/src/routes/agents/device-auth.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 +12 -0
- package/dist/src/routes/app-grants.d.ts.map +1 -1
- package/dist/src/routes/app-grants.js +90 -27
- 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/fork-manage.d.ts.map +1 -1
- package/dist/src/routes/apps/fork-manage.js +24 -1
- package/dist/src/routes/apps/fork-manage.js.map +1 -1
- package/dist/src/routes/apps/publish.d.ts +4 -0
- package/dist/src/routes/apps/publish.d.ts.map +1 -1
- package/dist/src/routes/apps/publish.js +44 -3
- package/dist/src/routes/apps/publish.js.map +1 -1
- package/dist/src/routes/apps-cost.d.ts +25 -0
- package/dist/src/routes/apps-cost.d.ts.map +1 -0
- package/dist/src/routes/apps-cost.js +107 -0
- package/dist/src/routes/apps-cost.js.map +1 -0
- 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 +32 -0
- package/dist/src/routes/exchange-market.d.ts.map +1 -0
- package/dist/src/routes/exchange-market.js +580 -0
- package/dist/src/routes/exchange-market.js.map +1 -0
- package/dist/src/routes/exchange.d.ts +33 -0
- package/dist/src/routes/exchange.d.ts.map +1 -0
- package/dist/src/routes/exchange.js +398 -0
- package/dist/src/routes/exchange.js.map +1 -0
- 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 +33 -0
- package/dist/src/routes/extensions/entitlement-gate.d.ts.map +1 -0
- package/dist/src/routes/extensions/entitlement-gate.js +156 -0
- package/dist/src/routes/extensions/entitlement-gate.js.map +1 -0
- package/dist/src/routes/extensions/manifest.d.ts +15 -0
- package/dist/src/routes/extensions/manifest.d.ts.map +1 -1
- package/dist/src/routes/extensions/manifest.js +101 -2
- 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 +20 -11
- package/dist/src/routes/extensions/paywall.js.map +1 -1
- package/dist/src/routes/federation-sync/messaging.d.ts.map +1 -1
- package/dist/src/routes/federation-sync/messaging.js +3 -1
- package/dist/src/routes/federation-sync/messaging.js.map +1 -1
- package/dist/src/routes/ghii/recovery.d.ts +2 -0
- package/dist/src/routes/ghii/recovery.d.ts.map +1 -1
- package/dist/src/routes/ghii/recovery.js +7 -0
- package/dist/src/routes/ghii/recovery.js.map +1 -1
- package/dist/src/routes/ghii/register-login.d.ts +4 -0
- package/dist/src/routes/ghii/register-login.d.ts.map +1 -1
- package/dist/src/routes/ghii/register-login.js +45 -22
- package/dist/src/routes/ghii/register-login.js.map +1 -1
- package/dist/src/routes/ghii/web-verify.d.ts +5 -0
- package/dist/src/routes/ghii/web-verify.d.ts.map +1 -1
- package/dist/src/routes/ghii/web-verify.js +24 -3
- package/dist/src/routes/ghii/web-verify.js.map +1 -1
- package/dist/src/routes/libs/sdk-serve.d.ts +11 -0
- package/dist/src/routes/libs/sdk-serve.d.ts.map +1 -0
- package/dist/src/routes/libs/sdk-serve.js +53 -0
- package/dist/src/routes/libs/sdk-serve.js.map +1 -0
- package/dist/src/routes/libs.d.ts +7 -1
- package/dist/src/routes/libs.d.ts.map +1 -1
- package/dist/src/routes/libs.js +65 -146
- package/dist/src/routes/libs.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/messages.d.ts +3 -0
- package/dist/src/routes/messages.d.ts.map +1 -1
- package/dist/src/routes/messages.js +9 -0
- package/dist/src/routes/messages.js.map +1 -1
- package/dist/src/routes/notifications.d.ts +6 -3
- package/dist/src/routes/notifications.d.ts.map +1 -1
- package/dist/src/routes/notifications.js +32 -3
- package/dist/src/routes/notifications.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-access.d.ts.map +1 -1
- package/dist/src/routes/organisms/workspace-access.js +38 -20
- package/dist/src/routes/organisms/workspace-access.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/unfurl.d.ts +27 -0
- package/dist/src/routes/unfurl.d.ts.map +1 -0
- package/dist/src/routes/unfurl.js +180 -0
- package/dist/src/routes/unfurl.js.map +1 -0
- package/dist/src/routes/upload.d.ts +13 -0
- package/dist/src/routes/upload.d.ts.map +1 -1
- package/dist/src/routes/upload.js +115 -28
- package/dist/src/routes/upload.js.map +1 -1
- package/dist/src/routes/webmcp.d.ts +3 -0
- package/dist/src/routes/webmcp.d.ts.map +1 -1
- package/dist/src/routes/webmcp.js +59 -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/routes-loader.d.ts +1 -0
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +8 -0
- package/dist/src/server-bootstrap/routes-loader.js.map +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/agent-face.d.ts +10 -2
- package/dist/src/services/agent-face.d.ts.map +1 -1
- package/dist/src/services/agent-face.js +10 -4
- package/dist/src/services/agent-face.js.map +1 -1
- package/dist/src/services/app-tool-interfaces.d.ts +37 -0
- package/dist/src/services/app-tool-interfaces.d.ts.map +1 -0
- package/dist/src/services/app-tool-interfaces.js +101 -0
- package/dist/src/services/app-tool-interfaces.js.map +1 -0
- package/dist/src/services/build-app-prompt.d.ts +22 -0
- package/dist/src/services/build-app-prompt.d.ts.map +1 -1
- package/dist/src/services/build-app-prompt.js +108 -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/contacts.d.ts +25 -1
- package/dist/src/services/contacts.d.ts.map +1 -1
- package/dist/src/services/contacts.js +30 -0
- package/dist/src/services/contacts.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/entitlement-money.d.ts +55 -0
- package/dist/src/services/entitlement-money.d.ts.map +1 -0
- package/dist/src/services/entitlement-money.js +68 -0
- package/dist/src/services/entitlement-money.js.map +1 -0
- package/dist/src/services/exchange-market.d.ts +280 -0
- package/dist/src/services/exchange-market.d.ts.map +1 -0
- package/dist/src/services/exchange-market.js +276 -0
- package/dist/src/services/exchange-market.js.map +1 -0
- 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 +47 -0
- package/dist/src/services/exchange-proposals.d.ts.map +1 -0
- package/dist/src/services/exchange-proposals.js +73 -0
- package/dist/src/services/exchange-proposals.js.map +1 -0
- package/dist/src/services/exchange-work.d.ts +30 -0
- package/dist/src/services/exchange-work.d.ts.map +1 -0
- package/dist/src/services/exchange-work.js +43 -0
- package/dist/src/services/exchange-work.js.map +1 -0
- 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/message-send.d.ts.map +1 -1
- package/dist/src/services/message-send.js +4 -1
- package/dist/src/services/message-send.js.map +1 -1
- package/dist/src/services/metered-entitlements.d.ts +210 -0
- package/dist/src/services/metered-entitlements.d.ts.map +1 -0
- package/dist/src/services/metered-entitlements.js +268 -0
- package/dist/src/services/metered-entitlements.js.map +1 -0
- package/dist/src/services/notify.d.ts +7 -0
- package/dist/src/services/notify.d.ts.map +1 -1
- package/dist/src/services/notify.js +35 -0
- package/dist/src/services/notify.js.map +1 -1
- package/dist/src/services/owner-memory.d.ts +30 -1
- package/dist/src/services/owner-memory.d.ts.map +1 -1
- package/dist/src/services/owner-memory.js +31 -14
- package/dist/src/services/owner-memory.js.map +1 -1
- package/dist/src/services/owner-provisioning.d.ts +5 -0
- package/dist/src/services/owner-provisioning.d.ts.map +1 -1
- package/dist/src/services/owner-provisioning.js +20 -2
- package/dist/src/services/owner-provisioning.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/apps.d.ts +1 -0
- package/dist/src/storage/providers/postgres-kysely/methods/apps.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/apps.js +2 -0
- package/dist/src/storage/providers/postgres-kysely/methods/apps.js.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/identity.d.ts +1 -0
- package/dist/src/storage/providers/postgres-kysely/methods/identity.d.ts.map +1 -1
- package/dist/src/storage/providers/postgres-kysely/methods/identity.js +4 -0
- package/dist/src/storage/providers/postgres-kysely/methods/identity.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/0011_unique_verified_email.sql +25 -0
- 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 +4 -0
- package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/apps.js +9 -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/identity-nodes.d.ts +1 -0
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.js +4 -0
- package/dist/src/storage/providers/sqlite/methods/identity-nodes.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 +40 -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/app.repository.d.ts +0 -0
- package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/identity.repository.d.ts +6 -0
- package/dist/src/storage/repositories/identity.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/apps.d.ts +1 -0
- package/dist/src/storage/types/apps.d.ts.map +1 -1
- package/dist/src/storage/types/organisms-federation.d.ts +50 -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/src/utils/app-mobile-lint.d.ts +17 -0
- package/dist/src/utils/app-mobile-lint.d.ts.map +1 -0
- package/dist/src/utils/app-mobile-lint.js +40 -0
- package/dist/src/utils/app-mobile-lint.js.map +1 -0
- package/dist/static/app-catalog/_template.html +18 -82
- package/dist/static/app-catalog/js/apps-io.js +51 -165
- package/dist/static/app-catalog/js/cortex.js +3 -1
- package/dist/static/app-catalog/js/cost.js +100 -0
- package/dist/static/app-catalog/js/db.js +23 -93
- package/dist/static/app-catalog/js/detail.js +568 -59
- package/dist/static/app-catalog/js/favorites.js +71 -0
- package/dist/static/app-catalog/js/i18n-data.js +369 -19
- package/dist/static/app-catalog/js/main.js +50 -139
- package/dist/static/app-catalog/js/migrate.js +88 -0
- package/dist/static/app-catalog/js/monetize.js +205 -17
- package/dist/static/app-catalog/js/odps.js +489 -0
- package/dist/static/app-catalog/js/promote.js +70 -0
- package/dist/static/app-catalog/js/render.js +29 -139
- package/dist/static/app-catalog/js/server-io.js +126 -223
- package/dist/static/app-catalog/js/settings.js +11 -204
- package/dist/static/app-catalog/js/workcopy.js +198 -0
- package/dist/static/app-catalog/styles/app-catalog.css +100 -0
- package/dist/static/app-catalog.html +2220 -1029
- package/dist/static/sdk-libs/_core/config.js +52 -0
- package/dist/static/sdk-libs/_core/http.js +52 -0
- package/dist/static/sdk-libs/_core/namespace.js +33 -0
- package/dist/static/sdk-libs/_core/sdk-globals.d.ts +50 -0
- package/dist/static/sdk-libs/_core/session.js +66 -0
- package/dist/static/sdk-libs/agentface/index.js +102 -0
- package/dist/static/sdk-libs/agents/index.js +305 -0
- package/dist/static/sdk-libs/ai/index.js +153 -0
- package/dist/static/sdk-libs/audio/core.js +111 -0
- package/dist/static/sdk-libs/audio/index.js +380 -0
- package/dist/static/sdk-libs/audio/instruments.js +369 -0
- package/dist/static/sdk-libs/auth/cluster.js +97 -0
- package/dist/static/sdk-libs/auth/config.js +46 -0
- package/dist/static/sdk-libs/auth/crypto.js +166 -0
- package/dist/static/sdk-libs/auth/events.js +27 -0
- package/dist/static/sdk-libs/auth/i18n.js +64 -0
- package/dist/static/sdk-libs/auth/index.js +61 -0
- package/dist/static/sdk-libs/auth/locale.js +151 -0
- package/dist/static/sdk-libs/auth/modal.js +554 -0
- package/dist/static/sdk-libs/auth/palette.js +172 -0
- package/dist/static/sdk-libs/auth/pill.js +198 -0
- package/dist/static/sdk-libs/auth/session.js +792 -0
- package/dist/static/sdk-libs/auth/signup.js +232 -0
- package/dist/static/sdk-libs/auth/theme.js +137 -0
- package/dist/static/sdk-libs/capabilities/index.js +179 -0
- package/dist/static/sdk-libs/commerce/index.js +243 -0
- package/dist/static/sdk-libs/data/index.js +250 -0
- package/dist/static/sdk-libs/dist/aimeat-agentface.js +91 -0
- package/dist/static/sdk-libs/dist/aimeat-agents.js +348 -0
- package/dist/static/sdk-libs/dist/aimeat-ai.js +168 -0
- package/dist/static/sdk-libs/dist/aimeat-audio.js +979 -0
- package/dist/static/sdk-libs/dist/aimeat-auth.js +2232 -0
- package/dist/static/sdk-libs/dist/aimeat-capabilities.js +177 -0
- package/dist/static/sdk-libs/dist/aimeat-commerce.js +265 -0
- package/dist/static/sdk-libs/dist/aimeat-data.js +247 -0
- package/dist/static/sdk-libs/dist/aimeat-editor.js +299 -0
- package/dist/static/sdk-libs/dist/aimeat-header.js +270 -0
- package/dist/static/sdk-libs/dist/aimeat-intake.js +94 -0
- package/dist/static/sdk-libs/dist/aimeat-live.js +317 -0
- package/dist/static/sdk-libs/dist/aimeat-markdown.js +633 -0
- package/dist/static/sdk-libs/dist/aimeat-organism.js +394 -0
- package/dist/static/sdk-libs/dist/aimeat-portfolio-standalone.js +90 -0
- package/dist/static/sdk-libs/dist/aimeat-social.js +157 -0
- package/dist/static/sdk-libs/dist/aimeat-speech.js +300 -0
- package/dist/static/sdk-libs/dist/aimeat-storage.js +210 -0
- package/dist/static/sdk-libs/dist/aimeat-tunnel.js +383 -0
- package/dist/static/sdk-libs/dist/aimeat-wallet.js +118 -0
- package/dist/static/sdk-libs/dist/aimeat-webmcp.js +187 -0
- package/dist/static/sdk-libs/dist/aimeat-work.js +213 -0
- package/dist/static/sdk-libs/dist/aimeat-workflows.js +147 -0
- package/dist/static/sdk-libs/editor/index.js +229 -0
- package/dist/static/sdk-libs/header/index.js +249 -0
- package/dist/static/sdk-libs/intake/index.js +75 -0
- package/dist/static/sdk-libs/live/index.js +223 -0
- package/dist/static/sdk-libs/markdown/index.js +570 -0
- package/dist/static/sdk-libs/organism/index.js +381 -0
- package/dist/static/sdk-libs/portfolio-standalone/index.js +78 -0
- package/dist/static/sdk-libs/social/index.js +140 -0
- package/dist/static/sdk-libs/speech/index.js +321 -0
- package/dist/static/sdk-libs/storage/index.js +189 -0
- package/dist/static/sdk-libs/tunnel/index.js +428 -0
- package/dist/static/sdk-libs/wallet/index.js +115 -0
- package/dist/static/sdk-libs/webmcp/index.js +185 -0
- package/dist/static/sdk-libs/work/index.js +191 -0
- package/dist/static/sdk-libs/workflows/index.js +113 -0
- package/package.json +10 -3
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/metered-entitlements.ts
|
|
3
|
+
* @description G1 — the durable METERED ENTITLEMENT primitive (EXCHANGE / TARGET-045). Generalises the
|
|
4
|
+
* single-use `ext-pay-token` into a lasting, budget-capped, contract-bound right: "consumer C may call
|
|
5
|
+
* provider P's capability (ext/action) at price X, under contract K, until budget B is spent." This is
|
|
6
|
+
* the object app-grants deliberately do NOT provide — a grant confers scopes (capability *classes*),
|
|
7
|
+
* never a priced call-right to a specific provider. An entitlement is server-minted by the
|
|
8
|
+
* contract-acceptance flow (a human in an MCP chat, or a closed negotiation agent) and consulted by the
|
|
9
|
+
* metered-call gateway (G2) on every call. Memory-backed (no new table — per
|
|
10
|
+
* docs/coding-guidelines/memory-contracts.md; keeps the node holding only refined data, EXCHANGE's
|
|
11
|
+
* design principle), stored under a system namespace and never client-readable.
|
|
12
|
+
* @structure MeteredEntitlement · entitlementKey · readEntitlementForCall · listEntitlementsByConsumer /
|
|
13
|
+
* ByProvider · createEntitlement · authorizeAndCharge · pauseEntitlement · revokeEntitlement
|
|
14
|
+
* @usage
|
|
15
|
+
* await createEntitlement(storage, { consumerGaii, providerGhii, ext, action, priceMoney, budget, contractRef, ... });
|
|
16
|
+
* const gate = await authorizeAndCharge(storage, consumerGaii, ext, action, priceMicros);
|
|
17
|
+
* if (!gate.ok) return res.status(402)...;
|
|
18
|
+
* @version-history
|
|
19
|
+
* v1.4.0 — 2026-07-25 — Contracts capture `tollMorsels` at signature: raising the pacing burn later
|
|
20
|
+
* governs new contracts, never ones already agreed.
|
|
21
|
+
* v1.3.0 — 2026-07-21 — Contract history: archiveEntitlement + listEntitlementHistoryByConsumer/ByProvider
|
|
22
|
+
* (superseded contracts survive the live-key overwrite for the "past contracts" view — renegotiation).
|
|
23
|
+
* v1.2.0 — 2026-07-21 — Add optional `surface` (AppToolSurface) so a contract can bind an app-tool's pinned
|
|
24
|
+
* interface version (Gap 1 cross-app selling); the (ext, action) coordinate stays the shared key.
|
|
25
|
+
* v1.1.0 — 2026-07-20 — Add `appId` dimension + listEntitlementsByApp for the per-app cost surface (G3)
|
|
26
|
+
* v1.0.0 — 2026-07-20 — Initial G1 entitlement object (EXCHANGE slice-1): create / lookup-by-call /
|
|
27
|
+
* authorize+charge (budget decrement) / pause / revoke. Read-modify-write budget counter — see the
|
|
28
|
+
* concurrency note on authorizeAndCharge (a dedicated atomic counter is deferred to G5).
|
|
29
|
+
*/
|
|
30
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
31
|
+
/** System namespace — server-side only, never surfaced to a client (mirrors `ext-pay-token`). */
|
|
32
|
+
const NS = 'metered-entitlement';
|
|
33
|
+
/** History namespace — superseded (renegotiated) contracts are archived here so the record survives the
|
|
34
|
+
* live-key overwrite; the consumer/provider "past contracts" views read it. Append-only. */
|
|
35
|
+
const NS_HISTORY = 'metered-entitlement-history';
|
|
36
|
+
/** Deterministic, dot-safe key: a call `(consumer, ext, action)` maps to exactly one entitlement, so the
|
|
37
|
+
* gateway does an O(1) `getMemory` lookup (no scan). GAII contains `@`/`#` — hashing sidesteps key-segment
|
|
38
|
+
* rules while staying reproducible. The full identifiers live in the value for verification. */
|
|
39
|
+
export function entitlementKey(consumerGaii, ext, action) {
|
|
40
|
+
const h = createHash('sha256').update(`${consumerGaii}|${ext}|${action}`).digest('hex').slice(0, 32);
|
|
41
|
+
return `entitlement.${h}`;
|
|
42
|
+
}
|
|
43
|
+
/** Look up the live entitlement authorising this exact call, or null. */
|
|
44
|
+
export async function readEntitlementForCall(storage, consumerGaii, ext, action) {
|
|
45
|
+
const rec = await storage.getMemory(NS, entitlementKey(consumerGaii, ext, action));
|
|
46
|
+
return rec ? rec.value : null;
|
|
47
|
+
}
|
|
48
|
+
/** Every entitlement a consumer holds (for the app cost/contract surface, G3). Filtered prefix scan. */
|
|
49
|
+
export async function listEntitlementsByConsumer(storage, consumerGaii) {
|
|
50
|
+
const { items } = await storage.listAllMemory({ prefix: 'entitlement.', limit: 5000 });
|
|
51
|
+
return items.map(r => r.value).filter(v => v && v.consumerGaii === consumerGaii);
|
|
52
|
+
}
|
|
53
|
+
/** Every entitlement a provider sells (for the provider/earnings view). Filtered prefix scan. */
|
|
54
|
+
export async function listEntitlementsByProvider(storage, providerGhii) {
|
|
55
|
+
const { items } = await storage.listAllMemory({ prefix: 'entitlement.', limit: 5000 });
|
|
56
|
+
return items.map(r => r.value).filter(v => v && v.providerGhii === providerGhii);
|
|
57
|
+
}
|
|
58
|
+
/** Every entitlement a consuming app holds (the per-app cost/contract surface, G3). Filtered prefix scan. */
|
|
59
|
+
export async function listEntitlementsByApp(storage, appId) {
|
|
60
|
+
const { items } = await storage.listAllMemory({ prefix: 'entitlement.', limit: 5000 });
|
|
61
|
+
return items.map(r => r.value).filter(v => v && v.appId === appId);
|
|
62
|
+
}
|
|
63
|
+
/** Mint (or overwrite) an entitlement — called by the contract-acceptance flow after both sides agree.
|
|
64
|
+
* One `(consumer, ext, action)` triple has one entitlement; re-minting replaces it (e.g. renegotiated price),
|
|
65
|
+
* carrying spend forward only when explicitly asked. */
|
|
66
|
+
export async function createEntitlement(storage, input) {
|
|
67
|
+
const now = new Date().toISOString();
|
|
68
|
+
const value = {
|
|
69
|
+
entitlementId: input.carrySpend?.entitlementId || randomUUID(),
|
|
70
|
+
consumerGaii: input.consumerGaii,
|
|
71
|
+
appId: input.appId ?? input.carrySpend?.appId ?? null,
|
|
72
|
+
providerGhii: input.providerGhii,
|
|
73
|
+
ext: input.ext,
|
|
74
|
+
action: input.action,
|
|
75
|
+
capabilityLabel: input.capabilityLabel || `${input.ext}/${input.action}`,
|
|
76
|
+
unit: input.unit,
|
|
77
|
+
pricePerCall: input.pricePerCall,
|
|
78
|
+
currency: input.unit === 'money' ? (input.currency ?? 'EUR') : null,
|
|
79
|
+
pricing: input.pricing ?? input.carrySpend?.pricing ?? { model: 'per_call' },
|
|
80
|
+
surface: input.surface ?? input.carrySpend?.surface ?? null,
|
|
81
|
+
budget: {
|
|
82
|
+
capUnits: input.capUnits ?? null,
|
|
83
|
+
spentUnits: input.carrySpend?.budget.spentUnits ?? 0,
|
|
84
|
+
calls: input.carrySpend?.budget.calls ?? 0,
|
|
85
|
+
},
|
|
86
|
+
rakePercent: input.rakePercent ?? null,
|
|
87
|
+
// Captured at signature, like the price: a provider raising their pacing later governs NEW contracts.
|
|
88
|
+
tollMorsels: input.tollMorsels ?? input.carrySpend?.tollMorsels ?? null,
|
|
89
|
+
contractRef: input.contractRef,
|
|
90
|
+
escrowParty: input.escrowParty ?? null,
|
|
91
|
+
state: 'active',
|
|
92
|
+
createdAt: input.carrySpend?.createdAt || now,
|
|
93
|
+
createdBy: input.carrySpend?.createdBy || input.createdBy,
|
|
94
|
+
updatedAt: now,
|
|
95
|
+
};
|
|
96
|
+
await persist(storage, value);
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Authorize a single metered call and record its spend against the budget.
|
|
101
|
+
*
|
|
102
|
+
* Returns `{ ok: true, entitlement }` when the entitlement is `active` and the (money) price fits under the
|
|
103
|
+
* remaining cap; the caller (the G2 gateway) then executes and settles. The budget counter is incremented
|
|
104
|
+
* here so an exhausted entitlement flips to `exhausted` and stops authorising.
|
|
105
|
+
*
|
|
106
|
+
* CONCURRENCY: this is a read-modify-write on a memory record — under heavy simultaneous calls on the SAME
|
|
107
|
+
* entitlement the cap can be marginally overshot. The cap is an *authorization ceiling*, not a fund gate:
|
|
108
|
+
* every actual payment still moves through the atomic debit/credit settle path per call, so no funds are
|
|
109
|
+
* lost — only the ceiling can be exceeded by a few in-flight calls. A dedicated atomic counter (or table)
|
|
110
|
+
* is deferred to G5. The per-call price is read from the entitlement itself (`pricePerCall`, in its `unit`).
|
|
111
|
+
*/
|
|
112
|
+
export async function authorizeAndCharge(storage, consumerGaii, ext, action) {
|
|
113
|
+
const ent = await readEntitlementForCall(storage, consumerGaii, ext, action);
|
|
114
|
+
if (!ent)
|
|
115
|
+
return { ok: false, reason: 'no_entitlement' };
|
|
116
|
+
if (ent.state !== 'active')
|
|
117
|
+
return { ok: false, reason: ent.state }; // paused | exhausted | revoked
|
|
118
|
+
const price = Math.max(0, ent.pricePerCall);
|
|
119
|
+
const nextSpent = ent.budget.spentUnits + price;
|
|
120
|
+
if (ent.budget.capUnits !== null && nextSpent > ent.budget.capUnits) {
|
|
121
|
+
// Freeze it so the surface reflects the exhaustion; this call is denied.
|
|
122
|
+
if (ent.state === 'active') {
|
|
123
|
+
ent.state = 'exhausted';
|
|
124
|
+
ent.updatedAt = new Date().toISOString();
|
|
125
|
+
await persist(storage, ent);
|
|
126
|
+
}
|
|
127
|
+
return { ok: false, reason: 'budget_exhausted' };
|
|
128
|
+
}
|
|
129
|
+
ent.budget.spentUnits = nextSpent;
|
|
130
|
+
ent.budget.calls += 1;
|
|
131
|
+
if (ent.budget.capUnits !== null && nextSpent >= ent.budget.capUnits)
|
|
132
|
+
ent.state = 'exhausted';
|
|
133
|
+
ent.updatedAt = new Date().toISOString();
|
|
134
|
+
await persist(storage, ent);
|
|
135
|
+
return { ok: true, entitlement: ent };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Compute what THIS call costs + the advanced pricing state, per the entitlement's pricing model. Pure —
|
|
139
|
+
* no mutation, no I/O (`nowMs` is passed in so it stays testable). The gate uses the result to check the
|
|
140
|
+
* budget, settle `chargeUnits`, and then {@link commitSpend} the advanced `pricing`. `allowed:false` means
|
|
141
|
+
* the call is refused without charge (a subscription rate-limit window is full).
|
|
142
|
+
*/
|
|
143
|
+
export function computeCharge(ent, nowMs) {
|
|
144
|
+
const p = ent.pricing ?? { model: 'per_call' };
|
|
145
|
+
if (p.model === 'bundle') {
|
|
146
|
+
if (p.callsRemaining > 0) {
|
|
147
|
+
return { allowed: true, chargeUnits: 0, pricing: { ...p, callsRemaining: p.callsRemaining - 1 } };
|
|
148
|
+
}
|
|
149
|
+
// Quota drained → refill: charge one more block and consume a call from it.
|
|
150
|
+
return { allowed: true, chargeUnits: Math.max(0, p.blockPrice), pricing: { ...p, callsRemaining: Math.max(0, p.blockSize - 1) } };
|
|
151
|
+
}
|
|
152
|
+
if (p.model === 'subscription') {
|
|
153
|
+
const nowIso = new Date(nowMs).toISOString();
|
|
154
|
+
let validUntil = p.validUntil, windowStart = p.windowStart, windowCount = p.windowCount, charge = 0;
|
|
155
|
+
if (nowMs >= new Date(validUntil).getTime()) { // period expired → renew (charge the period fee)
|
|
156
|
+
charge = Math.max(0, p.periodPrice);
|
|
157
|
+
validUntil = new Date(nowMs + p.periodSeconds * 1000).toISOString();
|
|
158
|
+
windowStart = nowIso;
|
|
159
|
+
windowCount = 0;
|
|
160
|
+
}
|
|
161
|
+
if (nowMs >= new Date(windowStart).getTime() + p.windowSeconds * 1000) { // rate window rolled over
|
|
162
|
+
windowStart = nowIso;
|
|
163
|
+
windowCount = 0;
|
|
164
|
+
}
|
|
165
|
+
if (windowCount >= p.callsPerWindow) { // rate limit hit — refuse without charge
|
|
166
|
+
return { allowed: false, reason: 'rate_limited', chargeUnits: 0, pricing: { ...p, validUntil, windowStart, windowCount } };
|
|
167
|
+
}
|
|
168
|
+
return { allowed: true, chargeUnits: charge, pricing: { ...p, validUntil, windowStart, windowCount: windowCount + 1 } };
|
|
169
|
+
}
|
|
170
|
+
return { allowed: true, chargeUnits: Math.max(0, ent.pricePerCall), pricing: { model: 'per_call' } };
|
|
171
|
+
}
|
|
172
|
+
/** Peek: would a charge of `chargeUnits` fit under the cap right now? (No mutation — the G2 gate checks this
|
|
173
|
+
* BEFORE moving money, then calls {@link commitSpend} only after settlement succeeds, so a failed debit
|
|
174
|
+
* never leaves a phantom spend.) */
|
|
175
|
+
export function budgetAllows(ent, chargeUnits) {
|
|
176
|
+
if (ent.state !== 'active')
|
|
177
|
+
return false;
|
|
178
|
+
return ent.budget.capUnits === null || ent.budget.spentUnits + Math.max(0, chargeUnits) <= ent.budget.capUnits;
|
|
179
|
+
}
|
|
180
|
+
/** Commit one call AFTER settlement succeeded: add `chargeUnits` to spend, bump calls, advance the pricing
|
|
181
|
+
* state, flip to `exhausted` at the cap. (Read-modify-write — see the concurrency note on {@link authorizeAndCharge}.) */
|
|
182
|
+
export async function commitSpend(storage, ent, chargeUnits, pricing) {
|
|
183
|
+
ent.budget.spentUnits += Math.max(0, chargeUnits);
|
|
184
|
+
ent.budget.calls += 1;
|
|
185
|
+
if (pricing)
|
|
186
|
+
ent.pricing = pricing;
|
|
187
|
+
if (ent.budget.capUnits !== null && ent.budget.spentUnits >= ent.budget.capUnits)
|
|
188
|
+
ent.state = 'exhausted';
|
|
189
|
+
ent.updatedAt = new Date().toISOString();
|
|
190
|
+
await persist(storage, ent);
|
|
191
|
+
return ent;
|
|
192
|
+
}
|
|
193
|
+
/** Roll back one call's spend by `chargeUnits` (the gate calls this when the sandbox script throws AFTER
|
|
194
|
+
* settlement, in lockstep with the money refund). Floors at 0 and un-exhausts if this frees headroom. Does
|
|
195
|
+
* NOT rewind the pricing quota/window (a thrown call still consumed its slot — conservative). No-op if gone. */
|
|
196
|
+
export async function refundSpend(storage, consumerGaii, ext, action, chargeUnits) {
|
|
197
|
+
const e = await readEntitlementForCall(storage, consumerGaii, ext, action);
|
|
198
|
+
if (!e)
|
|
199
|
+
return;
|
|
200
|
+
e.budget.spentUnits = Math.max(0, e.budget.spentUnits - Math.max(0, chargeUnits));
|
|
201
|
+
e.budget.calls = Math.max(0, e.budget.calls - 1);
|
|
202
|
+
if (e.state === 'exhausted' && (e.budget.capUnits === null || e.budget.spentUnits < e.budget.capUnits)) {
|
|
203
|
+
e.state = 'active';
|
|
204
|
+
}
|
|
205
|
+
e.updatedAt = new Date().toISOString();
|
|
206
|
+
await persist(storage, e);
|
|
207
|
+
}
|
|
208
|
+
/** Pause (owner off-switch) — stops authorising without losing the record/spend history. */
|
|
209
|
+
export async function pauseEntitlement(storage, consumerGaii, ext, action) {
|
|
210
|
+
return flip(storage, consumerGaii, ext, action, 'paused');
|
|
211
|
+
}
|
|
212
|
+
/** Revoke — terminal; the entitlement no longer authorises and must be re-minted to resume. */
|
|
213
|
+
export async function revokeEntitlement(storage, consumerGaii, ext, action) {
|
|
214
|
+
return flip(storage, consumerGaii, ext, action, 'revoked');
|
|
215
|
+
}
|
|
216
|
+
async function flip(storage, consumerGaii, ext, action, state) {
|
|
217
|
+
const ent = await readEntitlementForCall(storage, consumerGaii, ext, action);
|
|
218
|
+
if (!ent)
|
|
219
|
+
return false;
|
|
220
|
+
ent.state = state;
|
|
221
|
+
ent.updatedAt = new Date().toISOString();
|
|
222
|
+
await persist(storage, ent);
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
async function persist(storage, value) {
|
|
226
|
+
await storage.setMemory({
|
|
227
|
+
key: entitlementKey(value.consumerGaii, value.ext, value.action),
|
|
228
|
+
ownerGaii: NS,
|
|
229
|
+
value,
|
|
230
|
+
visibility: 'private',
|
|
231
|
+
tags: ['metered-entitlement'],
|
|
232
|
+
ttlHours: null,
|
|
233
|
+
version: 1,
|
|
234
|
+
createdAt: value.createdAt,
|
|
235
|
+
updatedAt: value.updatedAt,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Archive a copy of an entitlement to history (append-only) before the live record is overwritten by a
|
|
240
|
+
* renegotiation (supersede) — so the old terms + final spend/period survive for the "past contracts" view.
|
|
241
|
+
* Does NOT touch the live record. The `from → to` period is `createdAt → archivedAt`.
|
|
242
|
+
*/
|
|
243
|
+
export async function archiveEntitlement(storage, ent, reason, proposalId) {
|
|
244
|
+
const now = new Date().toISOString();
|
|
245
|
+
const archivedId = randomUUID();
|
|
246
|
+
const entry = {
|
|
247
|
+
...ent, archivedId, archivedAt: now, archiveReason: reason, supersededByProposal: proposalId ?? null,
|
|
248
|
+
};
|
|
249
|
+
await storage.setMemory({
|
|
250
|
+
key: `me-hist.${archivedId}`, ownerGaii: NS_HISTORY, value: entry,
|
|
251
|
+
visibility: 'private', tags: ['metered-entitlement-history'], ttlHours: null, version: 1, createdAt: now, updatedAt: now,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/** Past (archived) contracts a consumer held — newest first. */
|
|
255
|
+
export async function listEntitlementHistoryByConsumer(storage, consumerGaii) {
|
|
256
|
+
const { items } = await storage.listAllMemory({ prefix: 'me-hist.', limit: 5000 });
|
|
257
|
+
return items.map(r => r.value)
|
|
258
|
+
.filter(v => v && v.archivedId && v.consumerGaii === consumerGaii)
|
|
259
|
+
.sort((a, b) => (a.archivedAt < b.archivedAt ? 1 : -1));
|
|
260
|
+
}
|
|
261
|
+
/** Past (archived) contracts a provider sold — newest first. */
|
|
262
|
+
export async function listEntitlementHistoryByProvider(storage, providerGhii) {
|
|
263
|
+
const { items } = await storage.listAllMemory({ prefix: 'me-hist.', limit: 5000 });
|
|
264
|
+
return items.map(r => r.value)
|
|
265
|
+
.filter(v => v && v.archivedId && v.providerGhii === providerGhii)
|
|
266
|
+
.sort((a, b) => (a.archivedAt < b.archivedAt ? 1 : -1));
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=metered-entitlements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metered-entitlements.js","sourceRoot":"","sources":["../../../src/services/metered-entitlements.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,13 @@ export type NotifAction = {
|
|
|
41
41
|
/** Same-node path guard for an action endpoint/link ('/...' only — never '//host' or a full URL). */
|
|
42
42
|
export declare function isSafeNotifActionEndpoint(path: unknown): path is string;
|
|
43
43
|
export declare function setNotifyPushService(push: PushService | null): void;
|
|
44
|
+
/**
|
|
45
|
+
* Delete the recipient's bell notifications that deep-link to a given conversation — called when they
|
|
46
|
+
* open/read that thread, so a message they've now seen stops nagging from the header bell. Matches both
|
|
47
|
+
* the delivered-message link (#inbox/<id>) and the "wants to message you" request link (#inbox/req:<id>).
|
|
48
|
+
* Best-effort: never throws into the caller. Returns the number removed (0 if none / on any error).
|
|
49
|
+
*/
|
|
50
|
+
export declare function dismissConversationNotifications(storage: Storage, recipientGhii: string, conversationId: string): Promise<number>;
|
|
44
51
|
export interface NotifyInput {
|
|
45
52
|
/** Machine type, e.g. 'workspace_access_request' | 'workspace_access_approved'. */
|
|
46
53
|
type: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../../src/services/notify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../../src/services/notify.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,sFAAsF;AACtF,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,GACvF;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,GAC/I;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAEnL,qGAAqG;AACrG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEvE;AAID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAEnE;AAED;;;;;GAKG;AACH,wBAAsB,gCAAgC,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBvI;AAED,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCvG"}
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* browser push (best-effort) whose click deep-links to the same target as the bell entry.
|
|
10
10
|
* @structure
|
|
11
11
|
* - notify(storage, recipientGhii, { type, title, body?, link?, actions? })
|
|
12
|
+
* - dismissConversationNotifications(storage, recipientGhii, conversationId) — delete the bell
|
|
13
|
+
* notifications deep-linking to a conversation once its owner has read that thread
|
|
12
14
|
* - setNotifyPushService(push) — wired once at boot so notify() can bridge to web push
|
|
13
15
|
* - notifLinkToUrl(link) — bell link vocabulary ('/v1/profile#inbox/<id>') → openable URL
|
|
14
16
|
* - NotifAction — an inline action a notification carries (reply | api | navigate), rendered as a
|
|
@@ -23,6 +25,9 @@
|
|
|
23
25
|
* v1.1.0 -- 2026-07-02 -- Bridge bell notifications to web push with deep-link URL translation.
|
|
24
26
|
* v1.2.0 -- 2026-07-18 -- Inline notification actions (reply/api/navigate); mirror up to two into
|
|
25
27
|
* the web-push payload so the SW can offer OS-level action buttons.
|
|
28
|
+
* v1.3.0 -- 2026-07-21 -- dismissConversationNotifications(): reading a DM thread deletes its bell
|
|
29
|
+
* notifications (delivered #inbox/<id> + request #inbox/req:<id> links) so a seen message stops
|
|
30
|
+
* lingering in the header bell. Called from POST /v1/messages/conversations/:id/read.
|
|
26
31
|
*/
|
|
27
32
|
import { randomUUID } from 'node:crypto';
|
|
28
33
|
export const NOTIF_PREFIX = 'notif.';
|
|
@@ -38,6 +43,36 @@ let pushService = null;
|
|
|
38
43
|
export function setNotifyPushService(push) {
|
|
39
44
|
pushService = push;
|
|
40
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Delete the recipient's bell notifications that deep-link to a given conversation — called when they
|
|
48
|
+
* open/read that thread, so a message they've now seen stops nagging from the header bell. Matches both
|
|
49
|
+
* the delivered-message link (#inbox/<id>) and the "wants to message you" request link (#inbox/req:<id>).
|
|
50
|
+
* Best-effort: never throws into the caller. Returns the number removed (0 if none / on any error).
|
|
51
|
+
*/
|
|
52
|
+
export async function dismissConversationNotifications(storage, recipientGhii, conversationId) {
|
|
53
|
+
if (!conversationId)
|
|
54
|
+
return 0;
|
|
55
|
+
try {
|
|
56
|
+
const links = new Set([`/v1/profile#inbox/${conversationId}`, `/v1/profile#inbox/req:${conversationId}`]);
|
|
57
|
+
const mine = await storage.listMemory(recipientGhii, { prefix: NOTIF_PREFIX });
|
|
58
|
+
const refs = mine
|
|
59
|
+
.filter(r => { const v = r.value; return !!v && typeof v.link === 'string' && links.has(v.link); })
|
|
60
|
+
.map(r => ({ ownerGaii: recipientGhii, key: r.key }));
|
|
61
|
+
if (!refs.length)
|
|
62
|
+
return 0;
|
|
63
|
+
if (storage.bulkDeleteMemory)
|
|
64
|
+
return await storage.bulkDeleteMemory(refs);
|
|
65
|
+
let removed = 0;
|
|
66
|
+
for (const ref of refs) {
|
|
67
|
+
if (await storage.deleteMemory(ref.ownerGaii, ref.key))
|
|
68
|
+
removed++;
|
|
69
|
+
}
|
|
70
|
+
return removed;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
41
76
|
/**
|
|
42
77
|
* Translate a bell-vocabulary link into a URL that opens correctly from a cold start (push
|
|
43
78
|
* notification click, new window). The bell's '/v1/profile#<tab>[/<rest>]' hash form only works
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/services/notify.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/services/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* @structure
|
|
10
10
|
* - listOwnerScopeMemory(storage, nodeId, ownerName, opts) — aggregated list (deduped, GHII-first)
|
|
11
11
|
* - getOwnerScopeMemory(storage, nodeId, ownerName, key) — one key across owner+agents (GHII-first)
|
|
12
|
+
* - getOwnerScopePublicMemory(storage, nodeId, ownerName, key) — first PUBLIC record for a key across
|
|
13
|
+
* owner+agents (GHII-first); a non-public record never shadows a public one (anonymous serve paths)
|
|
12
14
|
* @usage import { listOwnerScopeMemory, getOwnerScopeMemory } from '../services/owner-memory.js';
|
|
13
15
|
* @version-history
|
|
14
16
|
* v1.0.0 — 2026-06-13 — Extracted from routes/memory.ts owner-scope branch; reused by the workflow
|
|
@@ -16,9 +18,25 @@
|
|
|
16
18
|
* v1.1.0 — 2026-06-14 — Fold the owner's ecosystem apps (GEAIs) into the owner-scope union
|
|
17
19
|
* (ecosystem-apps foundation, chunk 1).
|
|
18
20
|
* v1.2.0 — 2026-07-14 — Add listOwnerScopeMemoryMeta (value-free owner-scope listing) for ?include=meta.
|
|
21
|
+
* v1.4.0 — 2026-07-26 — Collisions are visible: a shadowed same-key copy under another same-owner
|
|
22
|
+
* identity is reported as `alsoUnder` on the survivor instead of vanishing from the result (that
|
|
23
|
+
* silent drop is why an agent's newer write looked like it had never happened). The local
|
|
24
|
+
* GHII-first loop was also a SECOND copy of MemoryRepository.dedupByKey — now delegated, so the
|
|
25
|
+
* ranking rule exists once.
|
|
26
|
+
* v1.3.0 — 2026-07-21 — Add getOwnerScopePublicMemory so anonymous public-serve paths (agent face) can
|
|
27
|
+
* resolve a record an owner's AGENT published under its own GAII — a non-public record never shadows
|
|
28
|
+
* a public one on the same key.
|
|
19
29
|
*/
|
|
20
30
|
import type { Storage, MemoryRecord } from '../storage/interface.js';
|
|
21
31
|
import type { MemoryMetaRow } from '../storage/repositories/memory.repository.js';
|
|
32
|
+
/**
|
|
33
|
+
* A record from an owner-scope listing. `alsoUnder` names every OTHER same-owner identity holding
|
|
34
|
+
* the same key: those copies lost the GHII-first dedup and are absent from the result, so this is
|
|
35
|
+
* the only signal that a collision exists at all.
|
|
36
|
+
*/
|
|
37
|
+
export type OwnerScopeRecord = MemoryRecord & {
|
|
38
|
+
alsoUnder?: string[];
|
|
39
|
+
};
|
|
22
40
|
export interface OwnerScopeListOpts {
|
|
23
41
|
prefix?: string;
|
|
24
42
|
visibility?: string;
|
|
@@ -31,7 +49,7 @@ export interface OwnerScopeListOpts {
|
|
|
31
49
|
* agents in storage order). The owner sees all their own data regardless of visibility — exactly the
|
|
32
50
|
* set `aimeat_memory_list { owner_scope: true }` returns.
|
|
33
51
|
*/
|
|
34
|
-
export declare function listOwnerScopeMemory(storage: Storage, nodeId: string, ownerName: string, opts?: OwnerScopeListOpts): Promise<
|
|
52
|
+
export declare function listOwnerScopeMemory(storage: Storage, nodeId: string, ownerName: string, opts?: OwnerScopeListOpts): Promise<OwnerScopeRecord[]>;
|
|
35
53
|
/**
|
|
36
54
|
* Owner-scope META listing — the same union + key-dedup as {@link listOwnerScopeMemory}, but each
|
|
37
55
|
* identity is read with `listMemoryMeta` so NO value is ever loaded (backs `?include=meta`). Returns
|
|
@@ -41,4 +59,15 @@ export declare function listOwnerScopeMemory(storage: Storage, nodeId: string, o
|
|
|
41
59
|
export declare function listOwnerScopeMemoryMeta(storage: Storage, nodeId: string, ownerName: string, opts?: OwnerScopeListOpts): Promise<MemoryMetaRow[]>;
|
|
42
60
|
/** Read ONE key across the owner's GHII + all the owner's agents (GHII first). null if found nowhere. */
|
|
43
61
|
export declare function getOwnerScopeMemory(storage: Storage, nodeId: string, ownerName: string, key: string): Promise<MemoryRecord | null>;
|
|
62
|
+
/**
|
|
63
|
+
* Read the first PUBLIC record for an exact key across the owner's GHII + all the owner's agents + eco
|
|
64
|
+
* apps, GHII-first. Unlike {@link getOwnerScopeMemory}, a NON-public record on the same key never
|
|
65
|
+
* shadows a public one — so this must NOT short-circuit on the GHII copy (a private GHII record must not
|
|
66
|
+
* hide a public agent record). One query across the whole union, then filter to `visibility === 'public'`
|
|
67
|
+
* and pick the highest-priority (GHII-first) survivor. null if no public copy exists anywhere.
|
|
68
|
+
*
|
|
69
|
+
* Used by anonymous public-serve paths (the Agent Face) where only `visibility:'public'` is servable and
|
|
70
|
+
* an owner's agent may have written the record under its own GAII (memory is keyed by the writer).
|
|
71
|
+
*/
|
|
72
|
+
export declare function getOwnerScopePublicMemory(storage: Storage, nodeId: string, ownerName: string, key: string): Promise<MemoryRecord | null>;
|
|
44
73
|
//# sourceMappingURL=owner-memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-memory.d.ts","sourceRoot":"","sources":["../../../src/services/owner-memory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"owner-memory.d.ts","sourceRoot":"","sources":["../../../src/services/owner-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAGlF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,yBAAyB,EAAE,aAAa,CAAC;CAC5D;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAC7E,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAW7B;AAcD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAC7E,OAAO,CAAC,aAAa,EAAE,CAAC,CAQ1B;AAED,yGAAyG;AACzG,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAC/D,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiB9B;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAC/D,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAW9B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MemoryRepository } from '../storage/repositories-impl/memory-repository.js';
|
|
1
2
|
/**
|
|
2
3
|
* List memory across the owner's GHII + all the owner's agents, deduped by key (GHII first, then
|
|
3
4
|
* agents in storage order). The owner sees all their own data regardless of visibility — exactly the
|
|
@@ -15,21 +16,14 @@ export async function listOwnerScopeMemory(storage, nodeId, ownerName, opts) {
|
|
|
15
16
|
const rows = await storage.listMemoryForOwners(identities, opts);
|
|
16
17
|
return dedupGhiiFirst(rows, identities);
|
|
17
18
|
}
|
|
18
|
-
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
19
|
+
/**
|
|
20
|
+
* GHII-first key dedup. Delegates to {@link MemoryRepository.dedupByKey} — this module used to
|
|
21
|
+
* carry a second, independent copy of the same loop even though the repository's version says it
|
|
22
|
+
* was moved there "so every owner-scope read shares one implementation". Two copies of a ranking
|
|
23
|
+
* rule is exactly where behaviour drifts, so there is now one.
|
|
24
|
+
*/
|
|
21
25
|
function dedupGhiiFirst(rows, identities) {
|
|
22
|
-
|
|
23
|
-
const ranked = [...rows].sort((a, b) => (priority.get(a.ownerGaii) ?? identities.length) - (priority.get(b.ownerGaii) ?? identities.length));
|
|
24
|
-
const seen = new Set();
|
|
25
|
-
const out = [];
|
|
26
|
-
for (const r of ranked) {
|
|
27
|
-
if (!seen.has(r.key)) {
|
|
28
|
-
seen.add(r.key);
|
|
29
|
-
out.push(r);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return out;
|
|
26
|
+
return MemoryRepository.dedupByKey(rows, identities);
|
|
33
27
|
}
|
|
34
28
|
/**
|
|
35
29
|
* Owner-scope META listing — the same union + key-dedup as {@link listOwnerScopeMemory}, but each
|
|
@@ -68,4 +62,27 @@ export async function getOwnerScopeMemory(storage, nodeId, ownerName, key) {
|
|
|
68
62
|
rows.sort((a, b) => (priority.get(a.ownerGaii) ?? others.length) - (priority.get(b.ownerGaii) ?? others.length));
|
|
69
63
|
return rows[0];
|
|
70
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Read the first PUBLIC record for an exact key across the owner's GHII + all the owner's agents + eco
|
|
67
|
+
* apps, GHII-first. Unlike {@link getOwnerScopeMemory}, a NON-public record on the same key never
|
|
68
|
+
* shadows a public one — so this must NOT short-circuit on the GHII copy (a private GHII record must not
|
|
69
|
+
* hide a public agent record). One query across the whole union, then filter to `visibility === 'public'`
|
|
70
|
+
* and pick the highest-priority (GHII-first) survivor. null if no public copy exists anywhere.
|
|
71
|
+
*
|
|
72
|
+
* Used by anonymous public-serve paths (the Agent Face) where only `visibility:'public'` is servable and
|
|
73
|
+
* an owner's agent may have written the record under its own GAII (memory is keyed by the writer).
|
|
74
|
+
*/
|
|
75
|
+
export async function getOwnerScopePublicMemory(storage, nodeId, ownerName, key) {
|
|
76
|
+
const ownerGhii = `${ownerName}@${nodeId}`;
|
|
77
|
+
const agents = await storage.getAgentsByOwner(ownerName);
|
|
78
|
+
const ecoApps = await storage.getEcosystemAppsByOwner(ownerName);
|
|
79
|
+
const identities = [ownerGhii, ...agents.map(a => a.gaii), ...ecoApps.map(e => e.geai)];
|
|
80
|
+
const rows = (await storage.listMemoryForOwners(identities, { prefix: key, visibility: 'public' }))
|
|
81
|
+
.filter(r => r.key === key);
|
|
82
|
+
if (!rows.length)
|
|
83
|
+
return null;
|
|
84
|
+
const priority = new Map(identities.map((id, i) => [id, i]));
|
|
85
|
+
rows.sort((a, b) => (priority.get(a.ownerGaii) ?? identities.length) - (priority.get(b.ownerGaii) ?? identities.length));
|
|
86
|
+
return rows[0];
|
|
87
|
+
}
|
|
71
88
|
//# sourceMappingURL=owner-memory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-memory.js","sourceRoot":"","sources":["../../../src/services/owner-memory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"owner-memory.js","sourceRoot":"","sources":["../../../src/services/owner-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { AimeatConfig } from '../config.js';
|
|
2
2
|
import type { Storage, GHIIRecord, OwnerRecord } from '../storage/interface.js';
|
|
3
|
+
/** Thrown by provisionOwner when the requested verified email is already bound to another account.
|
|
4
|
+
* Callers map it to a 409 EMAIL_TAKEN. */
|
|
5
|
+
export declare class ProvisionEmailTakenError extends Error {
|
|
6
|
+
constructor(message: string);
|
|
7
|
+
}
|
|
3
8
|
export interface ProvisionOwnerOpts {
|
|
4
9
|
/** Bare owner name (already validated + confirmed free by the caller). */
|
|
5
10
|
username: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-provisioning.d.ts","sourceRoot":"","sources":["../../../src/services/owner-provisioning.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"owner-provisioning.d.ts","sourceRoot":"","sources":["../../../src/services/owner-provisioning.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQhF;2CAC2C;AAC3C,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yGAAyG;IACzG,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kGAAkG;IAClG,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAqE3B"}
|
|
@@ -5,9 +5,12 @@
|
|
|
5
5
|
* profile (optionally with a password hash, a verified email, and/or a linked external identity),
|
|
6
6
|
* and records the welcome-bonus transaction. Used by the OIDC signup finalize path and the email
|
|
7
7
|
* invitation accept path so account creation stays identical across entry points.
|
|
8
|
-
* @structure ProvisionOwnerOpts / ProvisionedOwner; provisionOwner(storage, config, opts).
|
|
8
|
+
* @structure ProvisionEmailTakenError; ProvisionOwnerOpts / ProvisionedOwner; provisionOwner(storage, config, opts).
|
|
9
9
|
* @usage const { owner, ghii } = await provisionOwner(storage, config, { username, displayName, passwordHash });
|
|
10
10
|
* @version-history
|
|
11
|
+
* v1.1.0 — 2026-07-19 — Enforce one-verified-email-per-account-per-node: reject a verifiedEmail already
|
|
12
|
+
* bound elsewhere BEFORE creating any rows (ProvisionEmailTakenError), so the DB-unique emailHash can
|
|
13
|
+
* never leave a dangling owner.
|
|
11
14
|
* v1.0.0 — 2026-07-04 — Extracted from oauth-login.createOwnerForProvider + /v1/ghii register, for
|
|
12
15
|
* reuse by the email-invitation accept flow.
|
|
13
16
|
*/
|
|
@@ -17,6 +20,11 @@ import { generateKeyPair } from '../auth/keypair.js';
|
|
|
17
20
|
function emailHashOf(email) {
|
|
18
21
|
return createHash('sha256').update(email.toLowerCase().trim()).digest('hex');
|
|
19
22
|
}
|
|
23
|
+
/** Thrown by provisionOwner when the requested verified email is already bound to another account.
|
|
24
|
+
* Callers map it to a 409 EMAIL_TAKEN. */
|
|
25
|
+
export class ProvisionEmailTakenError extends Error {
|
|
26
|
+
constructor(message) { super(message); this.name = 'ProvisionEmailTakenError'; }
|
|
27
|
+
}
|
|
20
28
|
/**
|
|
21
29
|
* Create a fresh owner + GHII with the welcome bonus. The caller MUST have already validated that
|
|
22
30
|
* `username` is a valid, free owner name. Promotes the account to operator when it is the first real
|
|
@@ -25,6 +33,16 @@ function emailHashOf(email) {
|
|
|
25
33
|
export async function provisionOwner(storage, config, opts) {
|
|
26
34
|
const { username, displayName } = opts;
|
|
27
35
|
const now = new Date().toISOString();
|
|
36
|
+
// One-email-per-account-per-node: refuse to provision a verified email already bound elsewhere BEFORE
|
|
37
|
+
// creating any rows (the GHII's emailHash is DB-unique — creating the owner first would leave a
|
|
38
|
+
// dangling owner when createGHII hit the constraint). Callers surface this as a clean 4xx.
|
|
39
|
+
const verifiedEmail = opts.verifiedEmail ? opts.verifiedEmail.toLowerCase().trim() : null;
|
|
40
|
+
if (verifiedEmail) {
|
|
41
|
+
const taken = await storage.getGHIIByEmailHash(emailHashOf(verifiedEmail));
|
|
42
|
+
if (taken) {
|
|
43
|
+
throw new ProvisionEmailTakenError(`Email already registered to ${taken.ghii}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
28
46
|
const keyPair = await generateKeyPair();
|
|
29
47
|
// First real owner becomes operator (self-heal: also promote if no operator exists anywhere).
|
|
30
48
|
const allOwners = await storage.listOwners();
|
|
@@ -40,7 +58,7 @@ export async function provisionOwner(storage, config, opts) {
|
|
|
40
58
|
roles,
|
|
41
59
|
createdAt: now,
|
|
42
60
|
});
|
|
43
|
-
const verified =
|
|
61
|
+
const verified = verifiedEmail;
|
|
44
62
|
const ghii = `${username}@${config.nodeId}`;
|
|
45
63
|
const ghiiRecord = await storage.createGHII({
|
|
46
64
|
username,
|