aimeat 2.0.0 → 2.1.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/locales/en.json +35 -1
- package/dist/locales/fi.json +35 -1
- package/dist/public/components/LinkPreview.js +101 -0
- package/dist/public/components/NotificationBell.js +18 -1
- 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 +46 -0
- package/dist/public/css/views/portfolio.css +46 -0
- package/dist/public/css/views/profile.css +29 -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/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/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/apps-tab.js +18 -1
- package/dist/public/views/profile/inbox-tab/ai-actions.js +86 -0
- package/dist/public/views/profile/inbox-tab/components.js +124 -9
- 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 +18 -1
- 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/skills-tab.js +1 -1
- 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/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/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/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/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/data/app-templates/shells.d.ts +7 -3
- package/dist/src/data/app-templates/shells.d.ts.map +1 -1
- package/dist/src/data/app-templates/shells.js +10 -6
- package/dist/src/data/app-templates/shells.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/generated/api-types.d.ts +1565 -9
- package/dist/src/generated/api-types.d.ts.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/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.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/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/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 +351 -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 +11 -0
- package/dist/src/mcp/extensions.js.map +1 -1
- package/dist/src/mcp/index.d.ts.map +1 -1
- package/dist/src/mcp/index.js +6 -2
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/models/app-tool-schemas.d.ts +55 -1
- package/dist/src/models/app-tool-schemas.d.ts.map +1 -1
- package/dist/src/models/app-tool-schemas.js +20 -1
- package/dist/src/models/app-tool-schemas.js.map +1 -1
- package/dist/src/models/offer-schemas.d.ts +2 -2
- package/dist/src/models/schemas.d.ts +1 -0
- package/dist/src/models/schemas.d.ts.map +1 -1
- package/dist/src/models/schemas.js +3 -0
- package/dist/src/models/schemas.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/app-grants.d.ts +6 -0
- package/dist/src/routes/app-grants.d.ts.map +1 -1
- package/dist/src/routes/app-grants.js +35 -2
- package/dist/src/routes/app-grants.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 +2 -0
- package/dist/src/routes/apps/publish.d.ts.map +1 -1
- package/dist/src/routes/apps/publish.js +27 -1
- 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/exchange-market.d.ts +28 -0
- package/dist/src/routes/exchange-market.d.ts.map +1 -0
- package/dist/src/routes/exchange-market.js +454 -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 +395 -0
- package/dist/src/routes/exchange.js.map +1 -0
- 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 +143 -0
- package/dist/src/routes/extensions/entitlement-gate.js.map +1 -0
- package/dist/src/routes/extensions/manifest.d.ts +9 -0
- package/dist/src/routes/extensions/manifest.d.ts.map +1 -1
- package/dist/src/routes/extensions/manifest.js +33 -1
- package/dist/src/routes/extensions/manifest.js.map +1 -1
- package/dist/src/routes/extensions/paywall.d.ts.map +1 -1
- package/dist/src/routes/extensions/paywall.js +9 -0
- 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/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/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/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 +2 -0
- package/dist/src/routes/upload.d.ts.map +1 -1
- package/dist/src/routes/upload.js +7 -0
- 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 +55 -0
- package/dist/src/routes/webmcp.js.map +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/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 +3 -0
- package/dist/src/services/build-app-prompt.d.ts.map +1 -1
- package/dist/src/services/build-app-prompt.js +12 -1
- package/dist/src/services/build-app-prompt.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/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 +247 -0
- package/dist/src/services/exchange-market.d.ts.map +1 -0
- package/dist/src/services/exchange-market.js +254 -0
- package/dist/src/services/exchange-market.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 +71 -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/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 +203 -0
- package/dist/src/services/metered-entitlements.d.ts.map +1 -0
- package/dist/src/services/metered-entitlements.js +264 -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 +16 -0
- package/dist/src/services/owner-memory.d.ts.map +1 -1
- package/dist/src/services/owner-memory.js +23 -0
- 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/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/migrations/0011_unique_verified_email.sql +25 -0
- package/dist/src/storage/providers/sqlite/methods/apps.d.ts +1 -0
- package/dist/src/storage/providers/sqlite/methods/apps.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/methods/apps.js +2 -0
- package/dist/src/storage/providers/sqlite/methods/apps.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/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.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/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 +21 -0
- package/dist/src/storage/types/organisms-federation.d.ts.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 +12 -77
- package/dist/static/app-catalog/js/apps-io.js +51 -165
- 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 +158 -24
- package/dist/static/app-catalog/js/favorites.js +71 -0
- package/dist/static/app-catalog/js/i18n-data.js +90 -16
- package/dist/static/app-catalog/js/main.js +23 -103
- package/dist/static/app-catalog/js/migrate.js +88 -0
- package/dist/static/app-catalog/js/monetize.js +1 -1
- package/dist/static/app-catalog/js/promote.js +70 -0
- package/dist/static/app-catalog/js/render.js +26 -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/styles/app-catalog.css +40 -0
- package/dist/static/app-catalog.html +790 -912
- 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 +267 -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/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 +37 -0
- package/dist/static/sdk-libs/auth/modal.js +545 -0
- package/dist/static/sdk-libs/auth/pill.js +167 -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 +96 -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 +188 -0
- package/dist/static/sdk-libs/dist/aimeat-agentface.js +91 -0
- package/dist/static/sdk-libs/dist/aimeat-agents.js +315 -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 +1831 -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 +205 -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 +265 -0
- package/dist/static/sdk-libs/dist/aimeat-markdown.js +602 -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 +156 -0
- package/dist/static/sdk-libs/markdown/index.js +522 -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 +5 -2
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/app-tool-interfaces.ts
|
|
3
|
+
* @description The PINNED INTERFACE versioning for EXCHANGE app-tool offerings (TARGET-045, Gap 1 —
|
|
4
|
+
* cross-app selling). An app owner sells a named tool (e.g. `getCompanyBrief`) as a metered offering;
|
|
5
|
+
* a consumer contracts it and integrates against its I/O SCHEMA. The problem this solves: the provider
|
|
6
|
+
* must keep improving the app WITHOUT breaking a live consumer integration bound to that interface.
|
|
7
|
+
*
|
|
8
|
+
* The invention ("Pinned Interface, Versioned Provider"): the app product stays fully mutable, but each
|
|
9
|
+
* sellable interface is snapshot into an IMMUTABLE, content-addressed VERSION `{inputSchema, outputSchema,
|
|
10
|
+
* binding}`. Republishing an UNCHANGED interface is idempotent (same schemaHash → same version); changing
|
|
11
|
+
* the I/O schema or the backing binding mints a NEW version (append-only — an existing version record is
|
|
12
|
+
* never mutated). An offering pins one version; a contract (entitlement) pins the same version and the
|
|
13
|
+
* metered call routes to THAT snapshot's binding — so a provider can ship v2 freely while existing
|
|
14
|
+
* contracts keep hitting the frozen v1. Deprecation/migration is an offering-level lifecycle (re-point to
|
|
15
|
+
* the new version for NEW consumers), never a silent break.
|
|
16
|
+
*
|
|
17
|
+
* NOTE: price is intentionally NOT frozen here — it is authoritative at accept time and captured into the
|
|
18
|
+
* entitlement, so a provider may reprice for new consumers while existing contracts keep their agreed price.
|
|
19
|
+
* Only the integration contract (schema + binding) is version-frozen.
|
|
20
|
+
*
|
|
21
|
+
* Storage: PUBLIC memory under the provider's GHII (so consumers can read the frozen schema). Version
|
|
22
|
+
* records `apptool.iface.{hash}.v{n}` are append-only (never mutated); the `.latest` pointer is the only
|
|
23
|
+
* mutable record.
|
|
24
|
+
* @structure AppToolInterface · InterfaceDef · ifaceKeyBase · ensureInterfaceVersion · getInterfaceVersion ·
|
|
25
|
+
* getLatestInterface · listInterfaceVersions
|
|
26
|
+
* @usage
|
|
27
|
+
* const iface = await ensureInterfaceVersion(storage, providerGhii, appId, tool, { inputSchema, outputSchema, binding });
|
|
28
|
+
* const pinned = await getInterfaceVersion(storage, providerGhii, appId, tool, ent.surface.ifaceVersion);
|
|
29
|
+
* @version-history
|
|
30
|
+
* v1.0.0 — 2026-07-21 — Initial pinned-interface versioning (append-only snapshots + latest pointer + freeze).
|
|
31
|
+
*/
|
|
32
|
+
import { createHash } from 'node:crypto';
|
|
33
|
+
const ownerNameOf = (providerGhii) => providerGhii.split('@')[0].split('#').pop() ?? providerGhii;
|
|
34
|
+
/** Stable, prefix-scannable key base for all versions of one (provider, app, tool). Hashed because appId
|
|
35
|
+
* carries dots (`.html`) and tool names carry `.`/`-`, which would make a dotted key ambiguous to scan. */
|
|
36
|
+
export function ifaceKeyBase(providerGhii, appId, tool) {
|
|
37
|
+
const h = createHash('sha256').update(`${providerGhii}|${appId}|${tool}`).digest('hex').slice(0, 24);
|
|
38
|
+
return `apptool.iface.${h}`;
|
|
39
|
+
}
|
|
40
|
+
const versionKey = (base, n) => `${base}.v${n}`;
|
|
41
|
+
const latestKey = (base) => `${base}.latest`;
|
|
42
|
+
/** The content identity of an interface: republishing an identical schema+binding is idempotent. */
|
|
43
|
+
function hashDef(def) {
|
|
44
|
+
const canonical = JSON.stringify({ i: def.inputSchema ?? {}, o: def.outputSchema ?? {}, b: def.binding ?? null });
|
|
45
|
+
return createHash('sha256').update(canonical).digest('hex').slice(0, 32);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Snapshot the current sellable interface into a version, minting a NEW version only when the schema/binding
|
|
49
|
+
* actually changed (else returns the existing latest — idempotent relisting). Existing version records are
|
|
50
|
+
* NEVER overwritten — that immutability IS the freeze. `providerGhii` is the full provider GHII (the PUBLIC
|
|
51
|
+
* owner of the snapshot records).
|
|
52
|
+
*/
|
|
53
|
+
export async function ensureInterfaceVersion(storage, providerGhii, appId, tool, def) {
|
|
54
|
+
const base = ifaceKeyBase(providerGhii, appId, tool);
|
|
55
|
+
const hash = hashDef(def);
|
|
56
|
+
const latest = await getLatestInterface(storage, providerGhii, appId, tool);
|
|
57
|
+
if (latest && latest.schemaHash === hash)
|
|
58
|
+
return latest; // unchanged → reuse the pinned version
|
|
59
|
+
const nextVersion = (latest?.ifaceVersion ?? 0) + 1;
|
|
60
|
+
const now = new Date().toISOString();
|
|
61
|
+
const iface = {
|
|
62
|
+
appId, ownerName: ownerNameOf(providerGhii), tool, ifaceVersion: nextVersion, schemaHash: hash,
|
|
63
|
+
inputSchema: def.inputSchema ?? {}, outputSchema: def.outputSchema ?? {}, binding: def.binding ?? null,
|
|
64
|
+
createdAt: now,
|
|
65
|
+
};
|
|
66
|
+
await storage.setMemory({
|
|
67
|
+
key: versionKey(base, nextVersion), ownerGaii: providerGhii, value: iface,
|
|
68
|
+
visibility: 'public', tags: ['apptool-interface'], ttlHours: null, version: 1, createdAt: now, updatedAt: now,
|
|
69
|
+
});
|
|
70
|
+
await storage.setMemory({
|
|
71
|
+
key: latestKey(base), ownerGaii: providerGhii, value: { version: nextVersion, updatedAt: now },
|
|
72
|
+
visibility: 'public', tags: ['apptool-interface-latest'], ttlHours: null, version: 1, createdAt: now, updatedAt: now,
|
|
73
|
+
});
|
|
74
|
+
return iface;
|
|
75
|
+
}
|
|
76
|
+
/** One frozen interface version, or null. */
|
|
77
|
+
export async function getInterfaceVersion(storage, providerGhii, appId, tool, version) {
|
|
78
|
+
const base = ifaceKeyBase(providerGhii, appId, tool);
|
|
79
|
+
const rec = await storage.getMemory(providerGhii, versionKey(base, version));
|
|
80
|
+
return rec ? rec.value : null;
|
|
81
|
+
}
|
|
82
|
+
/** The current (highest) interface version, or null if the tool was never snapshot. */
|
|
83
|
+
export async function getLatestInterface(storage, providerGhii, appId, tool) {
|
|
84
|
+
const base = ifaceKeyBase(providerGhii, appId, tool);
|
|
85
|
+
const ptr = await storage.getMemory(providerGhii, latestKey(base));
|
|
86
|
+
const version = ptr?.value?.version;
|
|
87
|
+
if (!version)
|
|
88
|
+
return null;
|
|
89
|
+
const rec = await storage.getMemory(providerGhii, versionKey(base, version));
|
|
90
|
+
return rec ? rec.value : null;
|
|
91
|
+
}
|
|
92
|
+
/** Every snapshot version for a tool, oldest first (for the provider console's version history). */
|
|
93
|
+
export async function listInterfaceVersions(storage, providerGhii, appId, tool) {
|
|
94
|
+
const base = ifaceKeyBase(providerGhii, appId, tool);
|
|
95
|
+
const { items } = await storage.listAllMemory({ prefix: `${base}.v`, limit: 500 });
|
|
96
|
+
return items
|
|
97
|
+
.map(r => r.value)
|
|
98
|
+
.filter(v => v && typeof v.ifaceVersion === 'number')
|
|
99
|
+
.sort((a, b) => a.ifaceVersion - b.ifaceVersion);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=app-tool-interfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-tool-interfaces.js","sourceRoot":"","sources":["../../../src/services/app-tool-interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
* @usage import { buildAppPrompt } from '../services/build-app-prompt.js';
|
|
13
13
|
* const { full, body } = buildAppPrompt(config, { lang: 'en', mode: 'new', idea: '...' });
|
|
14
14
|
* @version-history
|
|
15
|
+
* 2026-07-19 — Mobile safety checklist section (overflow-x:clip, minmax(0,1fr)+min-width:0,
|
|
16
|
+
* wrap-wide-content, verify scrollWidth===clientWidth) + viewport meta gains viewport-fit=cover
|
|
17
|
+
* + interactive-widget=resizes-content. Prevention baked into the paved path.
|
|
15
18
|
* 2026-07-19 — Research-first flow (AppDev KB Phase 7): Step 0 + tier decision tree + finish checklist / appdev-flow prompt / handbook module
|
|
16
19
|
* v1.5.0 — 2026-07-19 — MCP-agent section: load node:aimeat-app-builder first + curated
|
|
17
20
|
* pitfall registry pointer (/v1/appdev/pitfalls) (AppDev KB Phase 2)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-app-prompt.d.ts","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"build-app-prompt.d.ts","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAUjD,MAAM,WAAW,qBAAqB;IACpC,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,IAAI,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,4FAA4F;IAC5F,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAKD,8FAA8F;AAC9F,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,qBAA0B,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsQhC"}
|
|
@@ -181,7 +181,18 @@ export function buildAppPrompt(config, opts = {}) {
|
|
|
181
181
|
body += ' apply(localStorage.getItem("aimeat-theme") || (matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"));\n';
|
|
182
182
|
body += ' addEventListener("storage", function(e){ if(e.key==="aimeat-theme" && e.newValue) apply(e.newValue); }); })();\n';
|
|
183
183
|
body += '```\n';
|
|
184
|
-
body += 'Always include
|
|
184
|
+
body += 'Always include the viewport meta: `<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover, interactive-widget=resizes-content">` (the last part makes the on-screen keyboard resize the layout instead of hiding bottom inputs). Mobile-first, single self-contained HTML file with embedded CSS + JS.\n\n';
|
|
185
|
+
// Mobile safety checklist — the recurring "it looks tiny / overflows on a phone" class of bug,
|
|
186
|
+
// as positive DO-rules. The app-shell templates already bake these in; hand-rolled layouts must
|
|
187
|
+
// follow them. (Distilled from the curated mobile pitfalls — auth-pill-overflow, grid-track-blowout.)
|
|
188
|
+
body += '### Mobile safety checklist (do these — they prevent the #1 phone bug)\n';
|
|
189
|
+
body += 'One element wider than the screen makes mobile browsers shrink-to-fit the WHOLE page, so every font renders tiny. Prevent it:\n';
|
|
190
|
+
body += '- **`body { overflow-x: clip; }`** — a belt-and-braces guard against horizontal overflow. Use `clip`, NOT `hidden` (hidden makes body a scroll container and breaks `position: sticky` headers).\n';
|
|
191
|
+
body += '- **The login pill is already mobile-safe** — `mountLoginButton` renders a compact account button + popover on phones automatically on an app origin. Do NOT put other fixed-width widgets in the header row next to it; let header children shrink (`min-width: 0`).\n';
|
|
192
|
+
body += '- **CSS grid: use `grid-template-columns: … minmax(0,1fr)` and `min-width: 0` on grid/flex children.** A plain `1fr` is `minmax(auto,1fr)`, so a wide non-wrapping child (a table, `<pre>`, long code) inflates the track and overflows the page even inside an `overflow-x:auto` wrapper. `minmax(0,…)` + `min-width:0` let it shrink so the wrapper actually scrolls.\n';
|
|
193
|
+
body += '- **Wrap wide content** — put tables / code blocks / diagrams in a `overflow-x:auto` container, and `flex-wrap: wrap` any toolbar/nav row whose item count can grow (tabs, pager dots).\n';
|
|
194
|
+
body += '- **Verify**: at 390px (portrait) AND ~844px (landscape), `document.documentElement.scrollWidth === clientWidth` (zero horizontal overflow) and body text stays ≥14px.\n';
|
|
195
|
+
body += 'For a focused view (chat/editor/wizard) on ≤760px, go full-screen (`position:fixed; inset:0` gated on an is-active class) with a Back affordance, rather than sharing the screen with app chrome.\n\n';
|
|
185
196
|
// Game form language — palette alone reads as a dashboard; the FORM LANGUAGE makes the game.
|
|
186
197
|
// Born from pitfall app/candy-palette-alone-is-not-a-game-look (TOWER TETRIS, 2026-07-19).
|
|
187
198
|
body += '### Game / playful look — form language, not just palette\n';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-app-prompt.js","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build-app-prompt.js","sourceRoot":"","sources":["../../../src/services/build-app-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,13 @@
|
|
|
7
7
|
* list view unions the consent rows with the owner's DM conversation peers and resolves display
|
|
8
8
|
* names at read time (nothing cached on the row). Email lookup is EXACT-match only via the same
|
|
9
9
|
* privacy-preserving hash the invite flow uses.
|
|
10
|
-
* @structure ContactsError; contactKind; listContactsMerged; saveContact; removeContact;
|
|
10
|
+
* @structure ContactsError; contactKind; listContactsMerged; saveContact; removeContact;
|
|
11
|
+
* resolveContactEmail; resolveOwnerByVerifiedEmail (verified email → owner handle, invariant-asserted).
|
|
11
12
|
* @usage const { contacts } = await listContactsMerged(storage, config, ownerGhii, { q });
|
|
12
13
|
* @version-history
|
|
14
|
+
* v1.1.0 — 2026-07-19 — Add resolveOwnerByVerifiedEmail: verified-email → owner handle for
|
|
15
|
+
* email-or-handle connect (device-auth --owner), reading the full match set to assert the
|
|
16
|
+
* one-verified-email-per-account invariant instead of silently picking.
|
|
13
17
|
* v1.0.0 — 2026-07-16 — Initial: merged list, proactive save, gate-safe remove, email resolve.
|
|
14
18
|
*/
|
|
15
19
|
import type { AimeatConfig } from '../config.js';
|
|
@@ -61,4 +65,24 @@ export type ResolveEmailResult = {
|
|
|
61
65
|
/** EXACT-match email → local owner (privacy-preserving hash equality; no enumeration). Not found
|
|
62
66
|
* → can_invite signals whether an email invitation could be sent. Throws ContactsError on a bad email. */
|
|
63
67
|
export declare function resolveContactEmail(storage: Storage, email: string): Promise<ResolveEmailResult>;
|
|
68
|
+
export type ResolveOwnerByEmailResult = {
|
|
69
|
+
ok: true;
|
|
70
|
+
ownerName: string;
|
|
71
|
+
ghii: string;
|
|
72
|
+
} | {
|
|
73
|
+
ok: false;
|
|
74
|
+
code: 'INVALID_EMAIL' | 'NO_ACCOUNT' | 'AMBIGUOUS';
|
|
75
|
+
message: string;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Resolve an account's VERIFIED email → its local owner handle, case-insensitively (same
|
|
79
|
+
* privacy-preserving hash as resolveContactEmail, gated to `emailVerifiedAt`). Used where a user may
|
|
80
|
+
* name their account by email instead of handle (e.g. the connector's device-auth `--owner`). The
|
|
81
|
+
* email only SELECTS the target account; it is never an authentication factor.
|
|
82
|
+
*
|
|
83
|
+
* Enforcement is layered: a partial-unique index on `emailHash` makes >1 verified match impossible at
|
|
84
|
+
* the DB, but we still read the full set and ASSERT it (log + AMBIGUOUS) rather than silently pick one,
|
|
85
|
+
* so any drift is surfaced loudly. Unverified email bindings never resolve.
|
|
86
|
+
*/
|
|
87
|
+
export declare function resolveOwnerByVerifiedEmail(storage: Storage, email: string): Promise<ResolveOwnerByEmailResult>;
|
|
64
88
|
//# sourceMappingURL=contacts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../../src/services/contacts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../../src/services/contacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAS7E,2GAA2G;AAC3G,qBAAa,aAAc,SAAQ,KAAK;IACnB,MAAM,EAAE,MAAM;IAAS,IAAI,EAAE,MAAM;gBAAnC,MAAM,EAAE,MAAM,EAAS,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIxE;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAIhE;AAED;qCACqC;AACrC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAItE;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAeD;;oDAEoD;AACpD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EACnC,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,UAAU,EAAE,CAAC,CA+BvB;AAED;0DAC0D;AAC1D,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAC9E,OAAO,CAAC,oBAAoB,CAAC,CAgB/B;AAED;;yFAEyF;AACzF,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GACrD,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACzE;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1C;2GAC2G;AAC3G,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAMtG;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,eAAe,GAAG,YAAY,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAkBrH"}
|
|
@@ -2,6 +2,7 @@ import { conversationIdFor } from '../utils/messaging.js';
|
|
|
2
2
|
import { emitChange } from './event-bus.js';
|
|
3
3
|
import { inviteEmailHash } from './invitations.js';
|
|
4
4
|
import { getActiveEmailService } from './email.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
5
6
|
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
6
7
|
/** A validation/precondition failure the caller maps to its own error shape (HTTP envelope / MCP text). */
|
|
7
8
|
export class ContactsError extends Error {
|
|
@@ -130,4 +131,33 @@ export async function resolveContactEmail(storage, email) {
|
|
|
130
131
|
return { found: true, ghii: rec.ghii, owner: rec.ghii.split('@')[0], display_name: rec.displayName ?? null };
|
|
131
132
|
return { found: false, can_invite: !!getActiveEmailService()?.enabled };
|
|
132
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Resolve an account's VERIFIED email → its local owner handle, case-insensitively (same
|
|
136
|
+
* privacy-preserving hash as resolveContactEmail, gated to `emailVerifiedAt`). Used where a user may
|
|
137
|
+
* name their account by email instead of handle (e.g. the connector's device-auth `--owner`). The
|
|
138
|
+
* email only SELECTS the target account; it is never an authentication factor.
|
|
139
|
+
*
|
|
140
|
+
* Enforcement is layered: a partial-unique index on `emailHash` makes >1 verified match impossible at
|
|
141
|
+
* the DB, but we still read the full set and ASSERT it (log + AMBIGUOUS) rather than silently pick one,
|
|
142
|
+
* so any drift is surfaced loudly. Unverified email bindings never resolve.
|
|
143
|
+
*/
|
|
144
|
+
export async function resolveOwnerByVerifiedEmail(storage, email) {
|
|
145
|
+
const clean = (email || '').trim().toLowerCase();
|
|
146
|
+
if (!clean || !EMAIL_RE.test(clean)) {
|
|
147
|
+
return { ok: false, code: 'INVALID_EMAIL', message: `"${email}" is not a valid email address.` };
|
|
148
|
+
}
|
|
149
|
+
const verified = (await storage.getGHIIsByEmailHash(inviteEmailHash(clean))).filter(m => !!m.emailVerifiedAt);
|
|
150
|
+
if (verified.length === 0) {
|
|
151
|
+
return { ok: false, code: 'NO_ACCOUNT', message: 'No account on this node has that email as a verified address.' };
|
|
152
|
+
}
|
|
153
|
+
if (verified.length > 1) {
|
|
154
|
+
// Should be impossible under the one-verified-email-per-account-per-node invariant (DB-enforced).
|
|
155
|
+
logger.error('Email→owner resolution is ambiguous: >1 account shares a verified email hash', {
|
|
156
|
+
matches: verified.map(m => m.ghii),
|
|
157
|
+
});
|
|
158
|
+
return { ok: false, code: 'AMBIGUOUS', message: 'That email maps to more than one account — contact the node operator.' };
|
|
159
|
+
}
|
|
160
|
+
const rec = verified[0];
|
|
161
|
+
return { ok: true, ownerName: rec.ownerName ?? rec.ghii.split('@')[0], ghii: rec.ghii };
|
|
162
|
+
}
|
|
133
163
|
//# sourceMappingURL=contacts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/services/contacts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/services/contacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file src/services/entitlement-money.ts
|
|
3
|
+
* @description The MONEY settlement rail for EXCHANGE entitlements (TARGET-045) — the "identical seam"
|
|
4
|
+
* the morsel gateway (entitlement-gate.ts) mirrors, but settling REAL money (EUR/USD) per call via the
|
|
5
|
+
* ACCRUAL model: each metered call records a real currency obligation (buyer → seller, minus the
|
|
6
|
+
* platform rake) through a registered money PaymentHandler, off the morsel ledger. No per-call PSP
|
|
7
|
+
* charge and no custodial escrow — amounts accrue and settle in a batch (the `io.aimeat.invoice`
|
|
8
|
+
* receivable rail in prod, or `com.stripe.spt` when activated; the OSS `test.money` double in E2E),
|
|
9
|
+
* which matches AIMEAT's non-custodial + aggregation design (see money.ts). The entitlement's budget
|
|
10
|
+
* (in currency micro-units) is the buyer's committed spend cap.
|
|
11
|
+
* @structure resolveAccrualHandler · settleEntitlementMoney · refundEntitlementMoney
|
|
12
|
+
* @usage
|
|
13
|
+
* const s = await settleEntitlementMoney(storage, config, { consumerGhii, providerGhii, priceMicros, currency, feePct, reference });
|
|
14
|
+
* if (!s.ok) // deny; else keep s.trackingCode for a later refund
|
|
15
|
+
* @version-history
|
|
16
|
+
* v1.0.0 — 2026-07-20 — Initial money accrual rail for the entitlement gateway (EXCHANGE money unit).
|
|
17
|
+
*/
|
|
18
|
+
import type { AimeatConfig } from '../config.js';
|
|
19
|
+
import type { Storage } from '../storage/interface.js';
|
|
20
|
+
import type { PaymentHandler } from '../commerce/types.js';
|
|
21
|
+
/** Pick the money handler to accrue against for a currency: prefer the invoice receivable rail, then the
|
|
22
|
+
* OSS test double, then any other non-morsel handler. Null when no money handler is registered. */
|
|
23
|
+
export declare function resolveAccrualHandler(currency: string): PaymentHandler | null;
|
|
24
|
+
/**
|
|
25
|
+
* Settle ONE metered call in real money: collect the price from the consumer, pay the provider its net
|
|
26
|
+
* (price − rake), and account the operator's rake — all through the resolved money handler (accrual).
|
|
27
|
+
* Returns the tracking code so a post-payment script throw can refund. Never throws — a handler failure
|
|
28
|
+
* comes back as `{ ok:false }` so the gateway denies the call cleanly (no partial settlement).
|
|
29
|
+
*/
|
|
30
|
+
export declare function settleEntitlementMoney(storage: Storage, config: AimeatConfig, args: {
|
|
31
|
+
consumerGhii: string;
|
|
32
|
+
providerGhii: string;
|
|
33
|
+
priceMicros: number;
|
|
34
|
+
currency: string;
|
|
35
|
+
feePct: number;
|
|
36
|
+
reference: string;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
ok: true;
|
|
39
|
+
handler: string;
|
|
40
|
+
trackingCode: string;
|
|
41
|
+
fee: number;
|
|
42
|
+
net: number;
|
|
43
|
+
} | {
|
|
44
|
+
ok: false;
|
|
45
|
+
reason: string;
|
|
46
|
+
}>;
|
|
47
|
+
/** Best-effort reverse of a money accrual (post-payment script throw), mirroring the handler's refund leg. */
|
|
48
|
+
export declare function refundEntitlementMoney(storage: Storage, config: AimeatConfig, args: {
|
|
49
|
+
consumerGhii: string;
|
|
50
|
+
providerGhii: string;
|
|
51
|
+
priceMicros: number;
|
|
52
|
+
currency: string;
|
|
53
|
+
trackingCode: string;
|
|
54
|
+
}): Promise<void>;
|
|
55
|
+
//# sourceMappingURL=entitlement-money.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlement-money.d.ts","sourceRoot":"","sources":["../../../src/services/entitlement-money.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAS3E;oGACoG;AACpG,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAM7E;AAID;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC7H,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BxH;AAED,8GAA8G;AAC9G,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAChH,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { listPaymentHandlers, MORSEL_HANDLER_ID } from '../commerce/payment-handlers.js';
|
|
2
|
+
import { TEST_MONEY_HANDLER_ID } from '../commerce/test-money-handler.js';
|
|
3
|
+
import { percentFee } from '../commerce/money.js';
|
|
4
|
+
import { recordMoneyPlatformFee } from '../commerce/session-service.js';
|
|
5
|
+
/** The invoice/receivable rail that accrues real money without a live per-call PSP charge (prod EE). */
|
|
6
|
+
const ACCRUAL_HANDLER_ID = 'io.aimeat.invoice';
|
|
7
|
+
/** Pick the money handler to accrue against for a currency: prefer the invoice receivable rail, then the
|
|
8
|
+
* OSS test double, then any other non-morsel handler. Null when no money handler is registered. */
|
|
9
|
+
export function resolveAccrualHandler(currency) {
|
|
10
|
+
const money = listPaymentHandlers().filter(h => h.id !== MORSEL_HANDLER_ID && h.currencies.includes(currency));
|
|
11
|
+
return money.find(h => h.id === ACCRUAL_HANDLER_ID)
|
|
12
|
+
?? money.find(h => h.id === TEST_MONEY_HANDLER_ID)
|
|
13
|
+
?? money[0]
|
|
14
|
+
?? null;
|
|
15
|
+
}
|
|
16
|
+
const ownerOf = (ghii) => ghii.split('@')[0].split('#').pop() ?? ghii;
|
|
17
|
+
/**
|
|
18
|
+
* Settle ONE metered call in real money: collect the price from the consumer, pay the provider its net
|
|
19
|
+
* (price − rake), and account the operator's rake — all through the resolved money handler (accrual).
|
|
20
|
+
* Returns the tracking code so a post-payment script throw can refund. Never throws — a handler failure
|
|
21
|
+
* comes back as `{ ok:false }` so the gateway denies the call cleanly (no partial settlement).
|
|
22
|
+
*/
|
|
23
|
+
export async function settleEntitlementMoney(storage, config, args) {
|
|
24
|
+
const handler = resolveAccrualHandler(args.currency);
|
|
25
|
+
if (!handler)
|
|
26
|
+
return { ok: false, reason: 'no_money_handler' };
|
|
27
|
+
const price = Math.max(0, Math.floor(args.priceMicros));
|
|
28
|
+
const fee = percentFee(price, args.feePct);
|
|
29
|
+
const net = price - fee;
|
|
30
|
+
const ctx = { config, storage };
|
|
31
|
+
const seller = { ghii: args.providerGhii, owner: ownerOf(args.providerGhii) };
|
|
32
|
+
try {
|
|
33
|
+
const collected = await handler.collect(ctx, {
|
|
34
|
+
buyerGhii: args.consumerGhii, amount: price, currency: args.currency, reference: args.reference, fee, seller,
|
|
35
|
+
});
|
|
36
|
+
if (net > 0) {
|
|
37
|
+
await handler.payout(ctx, {
|
|
38
|
+
toGhii: args.providerGhii, amount: net, currency: args.currency,
|
|
39
|
+
buyerGhii: args.consumerGhii, trackingCode: collected.trackingCode, reference: args.reference,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (fee > 0) {
|
|
43
|
+
await recordMoneyPlatformFee(storage, config, {
|
|
44
|
+
fee, currency: args.currency, sellerGhii: args.providerGhii, buyerGhii: args.consumerGhii,
|
|
45
|
+
trackingCode: collected.trackingCode, handler: handler.id,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return { ok: true, handler: handler.id, trackingCode: collected.trackingCode, fee, net };
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return { ok: false, reason: 'settlement_failed' };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Best-effort reverse of a money accrual (post-payment script throw), mirroring the handler's refund leg. */
|
|
55
|
+
export async function refundEntitlementMoney(storage, config, args) {
|
|
56
|
+
const handler = resolveAccrualHandler(args.currency);
|
|
57
|
+
if (!handler)
|
|
58
|
+
return;
|
|
59
|
+
const ctx = { config, storage };
|
|
60
|
+
try {
|
|
61
|
+
await handler.refund(ctx, {
|
|
62
|
+
buyerGhii: args.consumerGhii, amount: Math.max(0, Math.floor(args.priceMicros)), trackingCode: args.trackingCode,
|
|
63
|
+
seller: { ghii: args.providerGhii, owner: ownerOf(args.providerGhii) },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch { /* refund is best-effort; the handler contract says it must not throw, but guard anyway */ }
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=entitlement-money.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlement-money.js","sourceRoot":"","sources":["../../../src/services/entitlement-money.ts"],"names":[],"mappings":"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"}
|