aimeat 1.33.2 → 1.35.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 +437 -15
- package/dist/locales/fi.json +437 -15
- package/dist/public/cortex-bundled/aimeat-charts.js +3 -3
- package/dist/public/cortex-bundled/aimeat-charts.yaml +3 -3
- package/dist/public/cortex-bundled/aimeat-i18n.js +123 -0
- package/dist/public/cortex-bundled/aimeat-i18n.yaml +64 -0
- package/dist/public/css/views/landing.css +2 -0
- package/dist/public/css/views/secretary.css +464 -2
- package/dist/public/js/i18n.js +9 -0
- package/dist/public/js/services/apps.js +4 -2
- package/dist/public/js/services/memory.js +9 -3
- package/dist/public/js/services/offers.js +1 -1
- package/dist/public/js/services/organisms.js +49 -17
- package/dist/public/js/services/secretary-helpers.js +266 -17
- package/dist/public/js/services/secretary-policy.js +28 -2
- package/dist/public/js/services/secretary-rules.js +70 -0
- package/dist/public/js/theme.js +20 -0
- package/dist/public/lib/VENDORED-STYLING.md +31 -0
- package/dist/public/lib/aimeat-daisyui-bridge.css +48 -0
- package/dist/public/lib/chartjs@4.js +14 -0
- package/dist/public/lib/daisyui@5.css +7 -0
- package/dist/public/lib/tailwindcss@4.js +8 -0
- package/dist/public/llms-template.txt +9 -6
- package/dist/public/showroom.html +104 -0
- package/dist/public/showroom.js +247 -0
- package/dist/public/spa.html +18 -16
- package/dist/public/views/aimeat-os.js +3 -2
- package/dist/public/views/landing.js +50 -6
- package/dist/public/views/profile/agents/agent-card.js +13 -4
- package/dist/public/views/profile/agents/state-detector.js +6 -0
- package/dist/public/views/profile/agents/tab-integration.js +11 -2
- package/dist/public/views/profile/apps-tab.js +46 -0
- package/dist/public/views/profile/extensions-tab.js +4 -0
- package/dist/public/views/profile/inbox-tab.js +1 -1
- package/dist/public/views/profile/landing-page.js +8 -3
- package/dist/public/views/profile/memory-tab.js +37 -6
- package/dist/public/views/profile/organisms/home.js +32 -0
- package/dist/public/views/profile/organisms/workspace-list.js +36 -5
- package/dist/public/views/profile/organisms/workspace.js +29 -4
- package/dist/public/views/profile/organisms-tab.js +61 -8
- package/dist/public/views/secretary/calendar.js +327 -0
- package/dist/public/views/secretary/cards-reach.js +16 -17
- package/dist/public/views/secretary/cards.js +217 -79
- package/dist/public/views/secretary/dashboard.js +617 -0
- package/dist/public/views/secretary/quality.js +156 -0
- package/dist/public/views/secretary/use-autonomy.js +17 -2
- package/dist/public/views/secretary/use-freshness.js +50 -0
- package/dist/public/views/secretary/use-intake.js +23 -4
- package/dist/public/views/secretary/use-layout.js +122 -0
- package/dist/public/views/secretary/use-quick-actions.js +98 -0
- package/dist/public/views/secretary/use-specialists.js +103 -0
- package/dist/public/views/secretary/use-triggers.js +159 -0
- package/dist/public/views/secretary/use-whats-next.js +340 -0
- package/dist/public/views/secretary/workflow-design.js +112 -0
- package/dist/public/views/secretary.js +836 -44
- package/dist/scripts/check-no-max-tokens.d.ts +2 -0
- package/dist/scripts/check-no-max-tokens.d.ts.map +1 -0
- package/dist/scripts/check-no-max-tokens.js +71 -0
- package/dist/scripts/check-no-max-tokens.js.map +1 -0
- package/dist/src/cli/connect/mcp/tools/organisms.d.ts +2 -0
- package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/organisms.js +9 -1
- package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
- package/dist/src/cli/connect/onboarding-prompt.d.ts +3 -0
- package/dist/src/cli/connect/onboarding-prompt.d.ts.map +1 -1
- package/dist/src/cli/connect/onboarding-prompt.js +10 -3
- package/dist/src/cli/connect/onboarding-prompt.js.map +1 -1
- package/dist/src/data/aimeat-iam-package.d.ts +25 -0
- package/dist/src/data/aimeat-iam-package.d.ts.map +1 -0
- package/dist/src/data/aimeat-iam-package.js +312 -0
- package/dist/src/data/aimeat-iam-package.js.map +1 -0
- package/dist/src/data/aimeat-marketplace-package.d.ts +25 -0
- package/dist/src/data/aimeat-marketplace-package.d.ts.map +1 -0
- package/dist/src/data/aimeat-marketplace-package.js +231 -0
- package/dist/src/data/aimeat-marketplace-package.js.map +1 -0
- package/dist/src/data/app-templates.d.ts +48 -0
- package/dist/src/data/app-templates.d.ts.map +1 -0
- package/dist/src/data/app-templates.js +856 -0
- package/dist/src/data/app-templates.js.map +1 -0
- package/dist/src/data/example-packages.d.ts.map +1 -1
- package/dist/src/data/example-packages.js +3 -1
- package/dist/src/data/example-packages.js.map +1 -1
- package/dist/src/generated/api-types.d.ts +689 -7
- package/dist/src/generated/api-types.d.ts.map +1 -1
- package/dist/src/generated/prisma-postgres/edge.js +10 -3
- package/dist/src/generated/prisma-postgres/index-browser.js +7 -0
- package/dist/src/generated/prisma-postgres/index.d.ts +205 -2
- package/dist/src/generated/prisma-postgres/index.js +10 -3
- package/dist/src/generated/prisma-postgres/package.json +1 -1
- package/dist/src/generated/prisma-postgres/schema.prisma +23 -13
- package/dist/src/generated/prisma-postgres/wasm.js +10 -3
- package/dist/src/mcp/agent-onboarding.d.ts +4 -0
- package/dist/src/mcp/agent-onboarding.d.ts.map +1 -1
- package/dist/src/mcp/agent-onboarding.js +28 -2
- package/dist/src/mcp/agent-onboarding.js.map +1 -1
- package/dist/src/mcp/annotations.d.ts.map +1 -1
- package/dist/src/mcp/annotations.js +1 -0
- package/dist/src/mcp/annotations.js.map +1 -1
- package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions.js +16 -1
- package/dist/src/mcp/catalog/definitions.js.map +1 -1
- package/dist/src/mcp/catalog/surfaces.js +3 -3
- package/dist/src/mcp/catalog/surfaces.js.map +1 -1
- package/dist/src/mcp/index.d.ts +3 -0
- package/dist/src/mcp/index.d.ts.map +1 -1
- package/dist/src/mcp/index.js +11 -0
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/mcp/organisms.d.ts.map +1 -1
- package/dist/src/mcp/organisms.js +48 -8
- package/dist/src/mcp/organisms.js.map +1 -1
- package/dist/src/mcp/workspaces.d.ts.map +1 -1
- package/dist/src/mcp/workspaces.js +6 -4
- package/dist/src/mcp/workspaces.js.map +1 -1
- package/dist/src/models/agent-onboarding-schemas.d.ts +47 -0
- package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -1
- package/dist/src/models/agent-onboarding-schemas.js +117 -0
- package/dist/src/models/agent-onboarding-schemas.js.map +1 -1
- package/dist/src/models/offer-schemas.d.ts +8 -8
- package/dist/src/routes/agent-onboarding.d.ts +5 -0
- package/dist/src/routes/agent-onboarding.d.ts.map +1 -1
- package/dist/src/routes/agent-onboarding.js +21 -2
- package/dist/src/routes/agent-onboarding.js.map +1 -1
- package/dist/src/routes/ai.d.ts +8 -4
- package/dist/src/routes/ai.d.ts.map +1 -1
- package/dist/src/routes/ai.js +38 -14
- package/dist/src/routes/ai.js.map +1 -1
- package/dist/src/routes/app-grants.d.ts +2 -0
- package/dist/src/routes/app-grants.d.ts.map +1 -1
- package/dist/src/routes/app-grants.js +7 -1
- package/dist/src/routes/app-grants.js.map +1 -1
- package/dist/src/routes/app-templates.d.ts +16 -0
- package/dist/src/routes/app-templates.d.ts.map +1 -0
- package/dist/src/routes/app-templates.js +40 -0
- package/dist/src/routes/app-templates.js.map +1 -0
- package/dist/src/routes/apps.d.ts.map +1 -1
- package/dist/src/routes/apps.js +55 -5
- package/dist/src/routes/apps.js.map +1 -1
- package/dist/src/routes/auth.d.ts +3 -0
- package/dist/src/routes/auth.d.ts.map +1 -1
- package/dist/src/routes/auth.js +9 -4
- package/dist/src/routes/auth.js.map +1 -1
- package/dist/src/routes/bootstrap.d.ts.map +1 -1
- package/dist/src/routes/bootstrap.js +1 -0
- package/dist/src/routes/bootstrap.js.map +1 -1
- package/dist/src/routes/generator.d.ts.map +1 -1
- package/dist/src/routes/generator.js +3 -2
- package/dist/src/routes/generator.js.map +1 -1
- package/dist/src/routes/lib-ai.d.ts +0 -1
- package/dist/src/routes/lib-ai.d.ts.map +1 -1
- package/dist/src/routes/lib-ai.js +13 -6
- package/dist/src/routes/lib-ai.js.map +1 -1
- package/dist/src/routes/lib-header.d.ts +2 -0
- package/dist/src/routes/lib-header.d.ts.map +1 -1
- package/dist/src/routes/lib-header.js +7 -16
- package/dist/src/routes/lib-header.js.map +1 -1
- package/dist/src/routes/lib-markdown.d.ts +18 -0
- package/dist/src/routes/lib-markdown.d.ts.map +1 -0
- package/dist/src/routes/lib-markdown.js +236 -0
- package/dist/src/routes/lib-markdown.js.map +1 -0
- package/dist/src/routes/libs.d.ts +22 -0
- package/dist/src/routes/libs.d.ts.map +1 -1
- package/dist/src/routes/libs.js +133 -10
- package/dist/src/routes/libs.js.map +1 -1
- package/dist/src/routes/memory.d.ts.map +1 -1
- package/dist/src/routes/memory.js +21 -2
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/openrouter.d.ts +4 -0
- package/dist/src/routes/openrouter.d.ts.map +1 -1
- package/dist/src/routes/openrouter.js +17 -0
- package/dist/src/routes/openrouter.js.map +1 -1
- package/dist/src/routes/organisms.d.ts.map +1 -1
- package/dist/src/routes/organisms.js +107 -7
- package/dist/src/routes/organisms.js.map +1 -1
- package/dist/src/routes/portal.d.ts +9 -0
- package/dist/src/routes/portal.d.ts.map +1 -1
- package/dist/src/routes/portal.js +1 -1
- package/dist/src/routes/portal.js.map +1 -1
- package/dist/src/routes/public-stats.d.ts +3 -0
- package/dist/src/routes/public-stats.d.ts.map +1 -1
- package/dist/src/routes/public-stats.js +9 -2
- package/dist/src/routes/public-stats.js.map +1 -1
- package/dist/src/routes/secretary.d.ts +34 -0
- package/dist/src/routes/secretary.d.ts.map +1 -0
- package/dist/src/routes/secretary.js +311 -0
- package/dist/src/routes/secretary.js.map +1 -0
- package/dist/src/routes/specialists.d.ts.map +1 -1
- package/dist/src/routes/specialists.js +21 -0
- package/dist/src/routes/specialists.js.map +1 -1
- package/dist/src/routes/subdomains.js +1 -1
- package/dist/src/routes/subdomains.js.map +1 -1
- package/dist/src/routes/workflows.d.ts +9 -3
- package/dist/src/routes/workflows.d.ts.map +1 -1
- package/dist/src/routes/workflows.js +9 -3
- package/dist/src/routes/workflows.js.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +4 -0
- package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
- package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
- package/dist/src/server-bootstrap/service-init.js +7 -0
- package/dist/src/server-bootstrap/service-init.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 +18 -0
- package/dist/src/server-bootstrap/static-files.js.map +1 -1
- package/dist/src/services/archive.d.ts +74 -0
- package/dist/src/services/archive.d.ts.map +1 -0
- package/dist/src/services/archive.js +132 -0
- package/dist/src/services/archive.js.map +1 -0
- package/dist/src/services/cortex-seeder.d.ts +4 -1
- package/dist/src/services/cortex-seeder.d.ts.map +1 -1
- package/dist/src/services/cortex-seeder.js +25 -6
- package/dist/src/services/cortex-seeder.js.map +1 -1
- package/dist/src/services/directory.d.ts.map +1 -1
- package/dist/src/services/directory.js +3 -2
- package/dist/src/services/directory.js.map +1 -1
- package/dist/src/services/generator-prompt-seeds.d.ts.map +1 -1
- package/dist/src/services/generator-prompt-seeds.js +5 -4
- package/dist/src/services/generator-prompt-seeds.js.map +1 -1
- package/dist/src/services/message-send.d.ts.map +1 -1
- package/dist/src/services/message-send.js +14 -0
- package/dist/src/services/message-send.js.map +1 -1
- package/dist/src/services/onboarding-guide.d.ts +53 -0
- package/dist/src/services/onboarding-guide.d.ts.map +1 -0
- package/dist/src/services/onboarding-guide.js +81 -0
- package/dist/src/services/onboarding-guide.js.map +1 -0
- package/dist/src/services/organism-search.d.ts +6 -2
- package/dist/src/services/organism-search.d.ts.map +1 -1
- package/dist/src/services/organism-search.js +2 -2
- package/dist/src/services/organism-search.js.map +1 -1
- package/dist/src/services/owner-memory.d.ts +1 -0
- package/dist/src/services/owner-memory.d.ts.map +1 -1
- package/dist/src/services/owner-memory.js.map +1 -1
- package/dist/src/services/owner-session.d.ts +1 -0
- package/dist/src/services/owner-session.d.ts.map +1 -1
- package/dist/src/services/owner-session.js +10 -2
- package/dist/src/services/owner-session.js.map +1 -1
- package/dist/src/services/package-seeder.d.ts +22 -0
- package/dist/src/services/package-seeder.d.ts.map +1 -0
- package/dist/src/services/package-seeder.js +30 -0
- package/dist/src/services/package-seeder.js.map +1 -0
- package/dist/src/services/presence.d.ts +3 -0
- package/dist/src/services/presence.d.ts.map +1 -1
- package/dist/src/services/presence.js +10 -0
- package/dist/src/services/presence.js.map +1 -1
- package/dist/src/services/prompt-defaults.d.ts.map +1 -1
- package/dist/src/services/prompt-defaults.js +8 -3
- package/dist/src/services/prompt-defaults.js.map +1 -1
- package/dist/src/services/scheduler.d.ts +50 -2
- package/dist/src/services/scheduler.d.ts.map +1 -1
- package/dist/src/services/scheduler.js +454 -26
- package/dist/src/services/scheduler.js.map +1 -1
- package/dist/src/services/secretary-authoring.d.ts +71 -0
- package/dist/src/services/secretary-authoring.d.ts.map +1 -0
- package/dist/src/services/secretary-authoring.js +336 -0
- package/dist/src/services/secretary-authoring.js.map +1 -0
- package/dist/src/services/secretary-clarify.d.ts +57 -0
- package/dist/src/services/secretary-clarify.d.ts.map +1 -0
- package/dist/src/services/secretary-clarify.js +104 -0
- package/dist/src/services/secretary-clarify.js.map +1 -0
- package/dist/src/services/secretary-feed.d.ts +11 -0
- package/dist/src/services/secretary-feed.d.ts.map +1 -0
- package/dist/src/services/secretary-feed.js +28 -0
- package/dist/src/services/secretary-feed.js.map +1 -0
- package/dist/src/services/secretary-tick.d.ts +243 -3
- package/dist/src/services/secretary-tick.d.ts.map +1 -1
- package/dist/src/services/secretary-tick.js +273 -3
- package/dist/src/services/secretary-tick.js.map +1 -1
- package/dist/src/services/secretary-workbrief.d.ts +144 -0
- package/dist/src/services/secretary-workbrief.d.ts.map +1 -0
- package/dist/src/services/secretary-workbrief.js +315 -0
- package/dist/src/services/secretary-workbrief.js.map +1 -0
- package/dist/src/services/secretary-worktier.d.ts +118 -0
- package/dist/src/services/secretary-worktier.d.ts.map +1 -0
- package/dist/src/services/secretary-worktier.js +157 -0
- package/dist/src/services/secretary-worktier.js.map +1 -0
- package/dist/src/services/skill-bundle/generator.d.ts +3 -0
- package/dist/src/services/skill-bundle/generator.d.ts.map +1 -1
- package/dist/src/services/skill-bundle/generator.js +19 -0
- package/dist/src/services/skill-bundle/generator.js.map +1 -1
- package/dist/src/services/specialist-runner.d.ts +36 -0
- package/dist/src/services/specialist-runner.d.ts.map +1 -0
- package/dist/src/services/specialist-runner.js +91 -0
- package/dist/src/services/specialist-runner.js.map +1 -0
- package/dist/src/services/specialist.d.ts +9 -0
- package/dist/src/services/specialist.d.ts.map +1 -1
- package/dist/src/services/specialist.js +42 -0
- package/dist/src/services/specialist.js.map +1 -1
- package/dist/src/services/structure-overview.d.ts +13 -0
- package/dist/src/services/structure-overview.d.ts.map +1 -1
- package/dist/src/services/structure-overview.js +34 -11
- package/dist/src/services/structure-overview.js.map +1 -1
- package/dist/src/services/system-agent-responder.d.ts +36 -0
- package/dist/src/services/system-agent-responder.d.ts.map +1 -0
- package/dist/src/services/system-agent-responder.js +107 -0
- package/dist/src/services/system-agent-responder.js.map +1 -0
- package/dist/src/services/system-agent.d.ts +34 -1
- package/dist/src/services/system-agent.d.ts.map +1 -1
- package/dist/src/services/system-agent.js +73 -0
- package/dist/src/services/system-agent.js.map +1 -1
- package/dist/src/storage/interface.d.ts +33 -0
- package/dist/src/storage/interface.d.ts.map +1 -1
- package/dist/src/storage/interface.js.map +1 -1
- package/dist/src/storage/providers/mongodb/index.d.ts +37 -0
- package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
- package/dist/src/storage/providers/mongodb/index.js +132 -12
- package/dist/src/storage/providers/mongodb/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/index.d.ts +23 -1
- package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/index.js +60 -8
- package/dist/src/storage/providers/sqlite/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/memory.d.ts +29 -1
- package/dist/src/storage/providers/sqlite/repos/memory.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/memory.js +109 -10
- package/dist/src/storage/providers/sqlite/repos/memory.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 +64 -9
- package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
- package/dist/src/storage/repositories/app.repository.d.ts +15 -0
- package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/memory.repository.d.ts +41 -1
- package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/organism.repository.d.ts +2 -1
- package/dist/src/storage/repositories/organism.repository.d.ts.map +1 -1
- package/dist/static/app-catalog.html +469 -122
- package/package.json +2 -1
- package/prisma/schema.postgres.prisma +10 -0
- package/prisma/schema.prisma +12 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file aimeat-i18n.js
|
|
3
|
+
* @description Bundled cortex library: lightweight i18n/localization helper for AIMEAT apps.
|
|
4
|
+
* Wraps translation loading (inline or from the user's own memory — translations are USER
|
|
5
|
+
* data), a flat-key-first `t()` with {var} interpolation, locale switching with persistence,
|
|
6
|
+
* a daisyUI-friendly LanguageSwitcher, and a data-i18n DOM applier. No backend, no hard deps;
|
|
7
|
+
* uses AIMEAT.data when present to load translations from memory.
|
|
8
|
+
* @structure AIMEAT.i18n.{init,t,setLocale,getLocale,locales,available,LanguageSwitcher,apply}
|
|
9
|
+
* @version-history
|
|
10
|
+
* v1.0.0 — 2026-06-26 — Initial: inline + memory-backed translations, switcher, DOM applier.
|
|
11
|
+
*/
|
|
12
|
+
(function (AIMEAT) {
|
|
13
|
+
'use strict';
|
|
14
|
+
|
|
15
|
+
var state = { keyBase: null, localeList: [], locale: 'en', dicts: {}, fallback: 'en' };
|
|
16
|
+
var STORE_KEY = 'aimeat-i18n-locale';
|
|
17
|
+
var styled = false;
|
|
18
|
+
|
|
19
|
+
function injectStyles() {
|
|
20
|
+
if (styled) return; styled = true;
|
|
21
|
+
var css =
|
|
22
|
+
'.aui-i18n-select{font-family:"DM Sans",system-ui,sans-serif;font-size:.875rem;' +
|
|
23
|
+
'padding:.35rem .6rem;border-radius:var(--radius-xs,6px);border:1px solid var(--border,#E5E7EB);' +
|
|
24
|
+
'background:var(--bg-card,#fff);color:var(--text,#1A1A2E);cursor:pointer;}';
|
|
25
|
+
var s = document.createElement('style'); s.setAttribute('data-aimeat', 'i18n'); s.textContent = css;
|
|
26
|
+
document.head.appendChild(s);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getPath(obj, path) {
|
|
30
|
+
var parts = String(path).split('.'); var o = obj;
|
|
31
|
+
for (var i = 0; i < parts.length; i++) { if (o == null) return null; o = o[parts[i]]; }
|
|
32
|
+
return o;
|
|
33
|
+
}
|
|
34
|
+
function interpolate(str, vars) {
|
|
35
|
+
if (!vars) return str;
|
|
36
|
+
return str.replace(/\{(\w+)\}/g, function (m, k) { return (vars[k] != null) ? vars[k] : m; });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Load a single locale's dictionary: inline first, then the user's memory (USER data).
|
|
40
|
+
function loadDict(locale) {
|
|
41
|
+
if (state.dicts[locale]) return Promise.resolve(state.dicts[locale]);
|
|
42
|
+
if (state.keyBase && AIMEAT.data && typeof AIMEAT.data.get === 'function') {
|
|
43
|
+
return Promise.resolve(AIMEAT.data.get(state.keyBase + '.' + locale))
|
|
44
|
+
.then(function (v) { if (v && typeof v === 'object') state.dicts[locale] = v; return state.dicts[locale] || {}; })
|
|
45
|
+
.catch(function () { return {}; });
|
|
46
|
+
}
|
|
47
|
+
return Promise.resolve({});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* init({ keyBase?, locales, default?, fallback?, translations? })
|
|
52
|
+
* - translations: optional inline map { en:{...}, fi:{...} } (used as-is, no memory read)
|
|
53
|
+
* - keyBase: memory key prefix; locale dicts read from `${keyBase}.${locale}` via AIMEAT.data
|
|
54
|
+
*/
|
|
55
|
+
function init(opts) {
|
|
56
|
+
opts = opts || {};
|
|
57
|
+
state.keyBase = opts.keyBase || null;
|
|
58
|
+
state.localeList = opts.locales || (opts.translations ? Object.keys(opts.translations) : ['en']);
|
|
59
|
+
state.fallback = opts.fallback || opts.default || state.localeList[0] || 'en';
|
|
60
|
+
if (opts.translations) state.dicts = Object.assign({}, opts.translations);
|
|
61
|
+
var saved = null;
|
|
62
|
+
try { saved = window.localStorage.getItem(STORE_KEY); } catch (e) { /* private mode */ }
|
|
63
|
+
state.locale = (saved && state.localeList.indexOf(saved) !== -1) ? saved : (opts.default || state.fallback);
|
|
64
|
+
return loadDict(state.locale).then(function () { return state.locale; });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function t(key, vars) {
|
|
68
|
+
var d = state.dicts[state.locale] || {};
|
|
69
|
+
var raw = (d[key] != null) ? d[key] : getPath(d, key);
|
|
70
|
+
if (raw == null) {
|
|
71
|
+
var fb = state.dicts[state.fallback] || {};
|
|
72
|
+
raw = (fb[key] != null) ? fb[key] : getPath(fb, key);
|
|
73
|
+
}
|
|
74
|
+
if (raw == null) raw = key;
|
|
75
|
+
return interpolate(String(raw), vars);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function setLocale(locale) {
|
|
79
|
+
if (state.localeList.indexOf(locale) === -1) return Promise.resolve(state.locale);
|
|
80
|
+
return loadDict(locale).then(function () {
|
|
81
|
+
state.locale = locale;
|
|
82
|
+
try { window.localStorage.setItem(STORE_KEY, locale); } catch (e) { /* ignore */ }
|
|
83
|
+
try { window.dispatchEvent(new CustomEvent('aimeat-i18n-changed', { detail: { locale: locale } })); } catch (e) { /* ignore */ }
|
|
84
|
+
return locale;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function getLocale() { return state.locale; }
|
|
89
|
+
function locales() { return state.localeList.slice(); }
|
|
90
|
+
function available() { return state.localeList.length > 0; }
|
|
91
|
+
|
|
92
|
+
// Translate every [data-i18n] element in root (textContent). Optional [data-i18n-attr].
|
|
93
|
+
function apply(root) {
|
|
94
|
+
var scope = root || document;
|
|
95
|
+
var nodes = scope.querySelectorAll('[data-i18n]');
|
|
96
|
+
for (var i = 0; i < nodes.length; i++) {
|
|
97
|
+
var n = nodes[i]; var key = n.getAttribute('data-i18n');
|
|
98
|
+
var attr = n.getAttribute('data-i18n-attr');
|
|
99
|
+
if (attr) n.setAttribute(attr, t(key)); else n.textContent = t(key);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function LanguageSwitcher(opts) {
|
|
104
|
+
opts = opts || {}; injectStyles();
|
|
105
|
+
var sel = document.createElement('select');
|
|
106
|
+
sel.className = 'aui-i18n-select ' + (opts.className || '');
|
|
107
|
+
state.localeList.forEach(function (loc) {
|
|
108
|
+
var o = document.createElement('option'); o.value = loc; o.textContent = (opts.labels && opts.labels[loc]) || loc.toUpperCase();
|
|
109
|
+
if (loc === state.locale) o.selected = true; sel.appendChild(o);
|
|
110
|
+
});
|
|
111
|
+
sel.addEventListener('change', function () {
|
|
112
|
+
setLocale(sel.value).then(function (loc) { if (typeof opts.onChange === 'function') opts.onChange(loc); });
|
|
113
|
+
});
|
|
114
|
+
if (opts.target) {
|
|
115
|
+
var tgt = (typeof opts.target === 'string') ? document.querySelector(opts.target) : opts.target;
|
|
116
|
+
if (tgt) tgt.appendChild(sel);
|
|
117
|
+
}
|
|
118
|
+
return { el: sel, destroy: function () { if (sel.parentNode) sel.parentNode.removeChild(sel); } };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
AIMEAT.i18n = { init: init, t: t, setLocale: setLocale, getLocale: getLocale, locales: locales, available: available, LanguageSwitcher: LanguageSwitcher, apply: apply };
|
|
122
|
+
AIMEAT['aimeat-i18n'] = AIMEAT.i18n;
|
|
123
|
+
})(window.AIMEAT || (window.AIMEAT = {}));
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
apiVersion: cortex.aimeat.org/v1
|
|
2
|
+
kind: Extension
|
|
3
|
+
metadata:
|
|
4
|
+
name: aimeat-i18n
|
|
5
|
+
namespace: aimeat
|
|
6
|
+
description: "Localization helper — load translations (inline or from the user's own memory), translate with flat-key-first t() + {var} interpolation, switch locale with persistence, and a LanguageSwitcher UI."
|
|
7
|
+
author: AIMEAT
|
|
8
|
+
tags: [i18n, localization, translation, locale, multilanguage, components]
|
|
9
|
+
labels:
|
|
10
|
+
domain: i18n
|
|
11
|
+
visibility: public
|
|
12
|
+
|
|
13
|
+
spec:
|
|
14
|
+
version: "1.0.0"
|
|
15
|
+
license: MIT
|
|
16
|
+
components:
|
|
17
|
+
- type: prompt
|
|
18
|
+
name: i18n-assistant
|
|
19
|
+
content: |
|
|
20
|
+
You are helping build an app that has the aimeat-i18n cortex installed.
|
|
21
|
+
Use AIMEAT.i18n for ALL user-visible text — never hardcode display strings.
|
|
22
|
+
|
|
23
|
+
Setup (once, at boot):
|
|
24
|
+
await AIMEAT.i18n.init({
|
|
25
|
+
locales: ['en', 'fi'],
|
|
26
|
+
default: 'en',
|
|
27
|
+
// EITHER inline translations:
|
|
28
|
+
translations: { en: { 'greeting': 'Hello {name}' }, fi: { 'greeting': 'Hei {name}' } }
|
|
29
|
+
// OR memory-backed (translations are USER data): keyBase: 'myapp.i18n'
|
|
30
|
+
// → reads `myapp.i18n.en`, `myapp.i18n.fi` via AIMEAT.data.get()
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
Translate:
|
|
34
|
+
AIMEAT.i18n.t('greeting', { name: 'Alice' }) // flat key first, then nested dot-path, then fallback locale, then the key itself
|
|
35
|
+
// Flat keys win: a generator producing { "tab.search": "Haku" } resolves before a nested { tab: { search } }.
|
|
36
|
+
|
|
37
|
+
Switch language:
|
|
38
|
+
AIMEAT.i18n.LanguageSwitcher({ target: '#lang', onChange: render }) // renders a <select>; persists choice
|
|
39
|
+
AIMEAT.i18n.setLocale('fi') // emits window 'aimeat-i18n-changed'
|
|
40
|
+
window.addEventListener('aimeat-i18n-changed', render) // re-render on change
|
|
41
|
+
|
|
42
|
+
Static markup:
|
|
43
|
+
<span data-i18n="greeting"></span> then AIMEAT.i18n.apply() // fills textContent of every [data-i18n]
|
|
44
|
+
|
|
45
|
+
Notes:
|
|
46
|
+
- Translations are USER data — load them via AIMEAT.data (keyBase), NOT from an ext: namespace.
|
|
47
|
+
- t() always returns a string (falls back to the key) so the UI never shows blanks.
|
|
48
|
+
Load via: <script src="{{node_url}}/v1/cortex/aimeat-i18n/libs/aimeat-i18n.js"></script>
|
|
49
|
+
variables:
|
|
50
|
+
- "{{node_url}}"
|
|
51
|
+
|
|
52
|
+
- type: lib
|
|
53
|
+
name: aimeat-i18n
|
|
54
|
+
filename: aimeat-i18n.js
|
|
55
|
+
exports: [init, t, setLocale, getLocale, locales, available, LanguageSwitcher, apply]
|
|
56
|
+
api_surface: |
|
|
57
|
+
AIMEAT.i18n.init({ keyBase?, locales, default?, fallback?, translations? }) → Promise<locale> (inline translations OR memory-backed via keyBase)
|
|
58
|
+
AIMEAT.i18n.t(key, vars?) → string (flat key → nested dot-path → fallback locale → key; {var} interpolation)
|
|
59
|
+
AIMEAT.i18n.setLocale(locale) → Promise<locale> (persists choice; emits window 'aimeat-i18n-changed')
|
|
60
|
+
AIMEAT.i18n.getLocale() → string
|
|
61
|
+
AIMEAT.i18n.locales() → string[]
|
|
62
|
+
AIMEAT.i18n.available() → boolean
|
|
63
|
+
AIMEAT.i18n.LanguageSwitcher({ target?, onChange?, labels?, className? }) → { el, destroy() }
|
|
64
|
+
AIMEAT.i18n.apply(root?) → void (translates every [data-i18n] element's textContent, or [data-i18n-attr])
|
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
.ld-hero2-sub { color: var(--text-dim); font-size: 1rem; max-width: 560px; margin: 1rem auto .25rem; }
|
|
32
32
|
.ld-hero2-cta { display: flex; gap: .8rem; justify-content: center; flex-wrap: wrap; margin-top: 1.1rem; }
|
|
33
33
|
.ld-hero2-cta a { text-decoration: none; }
|
|
34
|
+
.ld-hero2-after { color: var(--text-dim); font-size: .9rem; max-width: 560px; margin: .9rem auto 0; }
|
|
35
|
+
.ld-hero2-after a { color: var(--accent); font-weight: 600; }
|
|
34
36
|
.ld-hero { text-align: center; padding: 2.5rem 0 1.25rem; }
|
|
35
37
|
.ld-h1 { font-size: 2.1rem; font-weight: 800; letter-spacing: -0.5px; margin: 0 0 .6rem; }
|
|
36
38
|
.ld-hero-sub { color: var(--text-dim); font-size: 1.05rem; margin: 0; }
|