@object-ui/i18n 11.4.0 → 13.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/CHANGELOG.md CHANGED
@@ -1,5 +1,56 @@
1
1
  # @object-ui/i18n
2
2
 
3
+ ## 13.1.0
4
+
5
+ ## 13.0.0
6
+
7
+ ### Minor Changes
8
+
9
+ - 9e38270: feat(setup): "Connect an agent" page widget (`mcp:connect-agent`) — framework#2714 Phase 1, #2363
10
+
11
+ The interactive body for the plugin-carried Setup page shipped by
12
+ `@objectstack/mcp`: the environment's MCP URL (from `/discovery`), per-client
13
+ connect cards (claude.ai/Desktop, Claude Code incl. the official plugin,
14
+ Cursor one-click deeplink, VS Code, Codex CLI), the SKILL.md download
15
+ (`GET /api/v1/mcp/skill`), and show-once API-key minting for headless
16
+ callers via the existing `POST /api/v1/keys`. Renders a disabled empty state
17
+ when discovery doesn't advertise `routes.mcp` (deployment opted out).
18
+ Translations for all nine locales.
19
+
20
+ ## 12.1.0
21
+
22
+ ### Minor Changes
23
+
24
+ - e1840bf: Signal the platform's preview stage in the UI.
25
+
26
+ The console top bar (`AppHeader`) now shows a small **Preview** chip next to the
27
+ product wordmark on every surface (home / app / orgs), so users always know the
28
+ whole platform is pre-GA. It's a new `PreviewBadge` component driven by a
29
+ `branding.stage` field in runtime-config (`'preview' | 'beta' | 'ga'`, exposed
30
+ via `getPlatformStage()`), which defaults to `'preview'` so the badge shows out
31
+ of the box. Operators flip the stage to `'ga'` at launch (`OS_PRODUCT_STAGE` /
32
+ `RuntimeConfigPlugin`) and the badge disappears with no code change; `'beta'`
33
+ renders a "Beta" chip instead. Labels are localized under `topbar.stage.*`.
34
+
35
+ ### Patch Changes
36
+
37
+ - 6cbccf3: Localize form validation messages, toast client-side validation failures, and make native date/time picker icons legible in dark mode.
38
+
39
+ Record-form validation messages (required, min/max length, min/max value, pattern, email, URL) were hard-coded English even when the field label was localized — e.g. a Chinese "计划开始日期" field showed "计划开始日期 is required". `buildValidationRules` baked English strings, so the form renderer's `t(...)` fallback never applied. It now emits `required: true` and, for the other rules, a `messageKey` + `undefined` message (a field-authored `*_message` still wins and passes through verbatim); the form renderer fills the blanks via i18n (`validation.*` keys already exist in every locale), so messages track the label's language.
40
+
41
+ When client-side validation blocks a submit, the offending field's inline error can sit below the fold in a long modal/drawer form — the user clicks 创建 and sees nothing happen. The form renderer now also fires a `toast.error` naming the fields (`validation.formInvalid`, added to all 10 locales), mirroring the existing server-error toast so the feedback is visible regardless of scroll position.
42
+
43
+ Separately, native controls now declare `color-scheme` (`light` on `:root`, `dark` on `.dark`), so the webkit calendar-picker-indicator and other built-in glyphs render light-on-dark instead of vanishing against the dark input background.
44
+
45
+ ## 12.0.0
46
+
47
+ ## 11.5.0
48
+
49
+ ### Minor Changes
50
+
51
+ - 544d8eb: Add the app → Studio reverse bridge (ADR-0080): workspace admins see a "Design in Studio" entry in the app top bar that deep-links to the running app's owning package on the Studio design surface (`/studio/:packageId/data`). Hidden for non-admins and for apps with no owning package; package writability stays server-side (read-only packages open as browse-only).
52
+ - 1072701: Import wizard: use registered server-side import mappings (framework #2611). When an object has `mapping` metadata artifacts targeting it, the wizard shows a "Saved mapping" selector; picking one hands rename + transforms + write semantics to the server (the artifact is authoritative), replaces the manual column table with a read-only summary of the mapping, and submits `mappingName` over source-header rows (mutually exclusive with the inline column rename). `ImportRequestOptions` gains `mappingName`; the objectstack adapter gains `listImportMappings(objectName)` (feature-detected — the selector simply doesn't appear when unsupported). New `grid.import.*` strings added across all locales.
53
+
3
54
  ## 11.4.0
4
55
 
5
56
  ### Patch Changes
@@ -80,6 +80,7 @@ declare const ar: {
80
80
  email: string;
81
81
  url: string;
82
82
  pattern: string;
83
+ formInvalid: string;
83
84
  unique: string;
84
85
  type: string;
85
86
  };
@@ -191,6 +192,12 @@ declare const ar: {
191
192
  templateName: string;
192
193
  save: string;
193
194
  deleteTemplate: string;
195
+ savedMapping: string;
196
+ chooseSavedMapping: string;
197
+ manualMapping: string;
198
+ transform: string;
199
+ savedMappingHint: string;
200
+ savedMappingPreviewNote: string;
194
201
  csvColumn: string;
195
202
  mapsTo: string;
196
203
  typeMismatch: string;
@@ -1263,6 +1270,7 @@ declare const ar: {
1263
1270
  };
1264
1271
  topbar: {
1265
1272
  aiAssistant: string;
1273
+ designInStudio: string;
1266
1274
  };
1267
1275
  home: {
1268
1276
  title: string;
@@ -1693,6 +1701,46 @@ declare const ar: {
1693
1701
  };
1694
1702
  };
1695
1703
  };
1704
+ connectAgent: {
1705
+ disabled: {
1706
+ title: string;
1707
+ body: string;
1708
+ };
1709
+ url: {
1710
+ title: string;
1711
+ body: string;
1712
+ downloadSkill: string;
1713
+ skillHint: string;
1714
+ };
1715
+ claude: {
1716
+ body: string;
1717
+ reachability: string;
1718
+ };
1719
+ claudeCode: {
1720
+ body: string;
1721
+ plugin: string;
1722
+ };
1723
+ cursor: {
1724
+ addButton: string;
1725
+ body: string;
1726
+ };
1727
+ vscode: {
1728
+ body: string;
1729
+ };
1730
+ codex: {
1731
+ body: string;
1732
+ };
1733
+ apiKey: {
1734
+ title: string;
1735
+ badge: string;
1736
+ body: string;
1737
+ namePlaceholder: string;
1738
+ mint: string;
1739
+ minting: string;
1740
+ showOnce: string;
1741
+ done: string;
1742
+ };
1743
+ };
1696
1744
  marketplace: {
1697
1745
  title: string;
1698
1746
  subtitle: string;
@@ -1988,6 +2036,12 @@ declare const ar: {
1988
2036
  empty: string;
1989
2037
  kindNew: string;
1990
2038
  kindUpdate: string;
2039
+ detailLoading: string;
2040
+ detailLoadFailed: string;
2041
+ detailNone: string;
2042
+ detailChangedKeys: string;
2043
+ confirmNote: string;
2044
+ publishConfirm: string;
1991
2045
  };
1992
2046
  };
1993
2047
  filterBuilder: {
@@ -80,6 +80,7 @@ const ar = {
80
80
  email: "يرجى إدخال بريد إلكتروني صالح",
81
81
  url: "يرجى إدخال رابط صالح",
82
82
  pattern: "صيغة {{field}} غير صالحة",
83
+ formInvalid: "يرجى التحقق من الحقول المميزة: {{fields}}",
83
84
  unique: "{{field}} يجب أن يكون فريداً",
84
85
  type: "{{field}} يجب أن يكون {{type}} صالحاً",
85
86
  },
@@ -191,6 +192,12 @@ const ar = {
191
192
  templateName: "اسم القالب",
192
193
  save: "حفظ",
193
194
  deleteTemplate: "حذف القالب",
195
+ savedMapping: 'Saved mapping:',
196
+ chooseSavedMapping: 'Choose a saved mapping…',
197
+ manualMapping: '— Map columns manually —',
198
+ transform: 'Transform',
199
+ savedMappingHint: 'Mapping “{{name}}” applies rename + transforms + type coercion on the server. Column mapping is read-only.',
200
+ savedMappingPreviewNote: 'The preview shows your source columns; on import, mapping “{{name}}” applies rename, transforms and type coercion on the server.',
194
201
  csvColumn: "العمود",
195
202
  mapsTo: "يُعيَّن إلى",
196
203
  typeMismatch: "يبدو أنه {{type}}",
@@ -1263,6 +1270,7 @@ const ar = {
1263
1270
  },
1264
1271
  topbar: {
1265
1272
  aiAssistant: "مساعد الذكاء الاصطناعي",
1273
+ designInStudio: "التصميم في Studio",
1266
1274
  },
1267
1275
  home: {
1268
1276
  title: "الرئيسية",
@@ -1693,6 +1701,46 @@ const ar = {
1693
1701
  },
1694
1702
  },
1695
1703
  },
1704
+ connectAgent: {
1705
+ disabled: {
1706
+ title: 'MCP معطّل في هذا النشر',
1707
+ body: 'واجهة MCP متوقفة (OS_MCP_SERVER_ENABLED=false). اطلب من المشغّل إعادة تفعيلها.',
1708
+ },
1709
+ url: {
1710
+ title: 'نقطة نهاية MCP لهذه البيئة',
1711
+ body: 'أي عميل ذكاء اصطناعي يدعم MCP يتصل عبر هذا العنوان. الهوية ذاتية الخدمة: النشر هو خادم تفويض OAuth 2.1 الخاص به — تسجّل الدخول بهويتك، وكل استدعاء يخضع لصلاحياتك وأمان مستوى الصفوف.',
1712
+ downloadSkill: 'تنزيل SKILL.md',
1713
+ skillHint: 'مهارة الوكيل المحمولة: تعلّم أي وكيل داعم للمهارات كيفية العمل مع هذه البيئة.',
1714
+ },
1715
+ claude: {
1716
+ body: 'الإعدادات ← الموصلات ← إضافة موصل مخصص، الصق هذا العنوان وسجّل الدخول عبر المتصفح.',
1717
+ reachability: 'يتصل claude.ai (الويب) من خوادم Anthropic — يجب أن يكون النشر متاحًا عبر HTTPS عام. عملاء سطح المكتب والمحليون يصلون أيضًا إلى نشر الشبكات الداخلية.',
1718
+ },
1719
+ claudeCode: {
1720
+ body: 'أمر واحد — يفتح تسجيل دخول OAuth تلقائيًا عند أول استخدام:',
1721
+ plugin: 'أو ثبّت الإضافة الرسمية (تضيف مهارة ObjectStack وأمر /objectstack:connect الموجَّه):',
1722
+ },
1723
+ cursor: {
1724
+ addButton: 'أضِف إلى Cursor',
1725
+ body: 'استخدم زر النقرة الواحدة، أو أضف ما يلي إلى ‎.cursor/mcp.json:',
1726
+ },
1727
+ vscode: {
1728
+ body: 'أضِف إلى ‎.vscode/mcp.json (أو عبر أمر MCP: Add Server):',
1729
+ },
1730
+ codex: {
1731
+ body: 'أضِف إلى ‎~/.codex/config.toml. إذا كانت نسخة Codex لديك لا تدعم تدفق OAuth، فاستخدم ترويسة مفتاح API (انظر أدناه):',
1732
+ },
1733
+ apiKey: {
1734
+ title: 'مفاتيح API',
1735
+ badge: 'بدون واجهة',
1736
+ body: 'للتكامل المستمر والسكربتات والوكلاء بلا متصفح. المفتاح يتصرف بهويتك — تعامل معه ككلمة مرور. يُعرض مرة واحدة فقط.',
1737
+ namePlaceholder: 'اسم المفتاح (مثل ci-agent)',
1738
+ mint: 'إنشاء مفتاح',
1739
+ minting: 'جارٍ الإنشاء…',
1740
+ showOnce: 'أُنشئ المفتاح «{{name}}» — انسخه الآن، لن يُعرض مجددًا:',
1741
+ done: 'تم — إخفاء',
1742
+ },
1743
+ },
1696
1744
  marketplace: {
1697
1745
  title: "سوق التطبيقات",
1698
1746
  subtitle: "استعرض التطبيقات المعتمدة المنشورة في كتالوج ObjectStack. انقر على تطبيق لرؤية التفاصيل وتثبيته في أحد بيئاتك.",
@@ -1988,6 +2036,12 @@ const ar = {
1988
2036
  empty: 'لا شيء معلّق — نُشرت كل المسودات.',
1989
2037
  kindNew: 'جديد',
1990
2038
  kindUpdate: 'تحديث',
2039
+ detailLoading: 'جارٍ تحميل التفاصيل…',
2040
+ detailLoadFailed: 'تعذر تحميل تفاصيل التغيير:',
2041
+ detailNone: 'لم يتم اكتشاف اختلافات — المسودة مطابقة للنسخة المنشورة.',
2042
+ detailChangedKeys: 'تغييرات أخرى:',
2043
+ confirmNote: 'النشر يُصدر كل المسودات المعلقة ({{count}}) لهذه الحزمة دفعة واحدة.',
2044
+ publishConfirm: 'نشر الكل',
1991
2045
  },
1992
2046
  },
1993
2047
  filterBuilder: {
@@ -80,6 +80,7 @@ declare const de: {
80
80
  email: string;
81
81
  url: string;
82
82
  pattern: string;
83
+ formInvalid: string;
83
84
  unique: string;
84
85
  type: string;
85
86
  };
@@ -191,6 +192,12 @@ declare const de: {
191
192
  templateName: string;
192
193
  save: string;
193
194
  deleteTemplate: string;
195
+ savedMapping: string;
196
+ chooseSavedMapping: string;
197
+ manualMapping: string;
198
+ transform: string;
199
+ savedMappingHint: string;
200
+ savedMappingPreviewNote: string;
194
201
  csvColumn: string;
195
202
  mapsTo: string;
196
203
  typeMismatch: string;
@@ -1263,6 +1270,7 @@ declare const de: {
1263
1270
  };
1264
1271
  topbar: {
1265
1272
  aiAssistant: string;
1273
+ designInStudio: string;
1266
1274
  };
1267
1275
  home: {
1268
1276
  title: string;
@@ -1693,6 +1701,46 @@ declare const de: {
1693
1701
  };
1694
1702
  };
1695
1703
  };
1704
+ connectAgent: {
1705
+ disabled: {
1706
+ title: string;
1707
+ body: string;
1708
+ };
1709
+ url: {
1710
+ title: string;
1711
+ body: string;
1712
+ downloadSkill: string;
1713
+ skillHint: string;
1714
+ };
1715
+ claude: {
1716
+ body: string;
1717
+ reachability: string;
1718
+ };
1719
+ claudeCode: {
1720
+ body: string;
1721
+ plugin: string;
1722
+ };
1723
+ cursor: {
1724
+ addButton: string;
1725
+ body: string;
1726
+ };
1727
+ vscode: {
1728
+ body: string;
1729
+ };
1730
+ codex: {
1731
+ body: string;
1732
+ };
1733
+ apiKey: {
1734
+ title: string;
1735
+ badge: string;
1736
+ body: string;
1737
+ namePlaceholder: string;
1738
+ mint: string;
1739
+ minting: string;
1740
+ showOnce: string;
1741
+ done: string;
1742
+ };
1743
+ };
1696
1744
  marketplace: {
1697
1745
  title: string;
1698
1746
  subtitle: string;
@@ -1988,6 +2036,12 @@ declare const de: {
1988
2036
  empty: string;
1989
2037
  kindNew: string;
1990
2038
  kindUpdate: string;
2039
+ detailLoading: string;
2040
+ detailLoadFailed: string;
2041
+ detailNone: string;
2042
+ detailChangedKeys: string;
2043
+ confirmNote: string;
2044
+ publishConfirm: string;
1991
2045
  };
1992
2046
  };
1993
2047
  filterBuilder: {
@@ -80,6 +80,7 @@ const de = {
80
80
  email: "Bitte geben Sie eine gültige E-Mail-Adresse ein",
81
81
  url: "Bitte geben Sie eine gültige URL ein",
82
82
  pattern: "{{field}} hat ein ungültiges Format",
83
+ formInvalid: "Bitte überprüfen Sie die markierten Felder: {{fields}}",
83
84
  unique: "{{field}} muss eindeutig sein",
84
85
  type: "{{field}} muss ein gültiger {{type}} sein",
85
86
  },
@@ -191,6 +192,12 @@ const de = {
191
192
  templateName: "Vorlagenname",
192
193
  save: "Speichern",
193
194
  deleteTemplate: "Vorlage löschen",
195
+ savedMapping: 'Saved mapping:',
196
+ chooseSavedMapping: 'Choose a saved mapping…',
197
+ manualMapping: '— Map columns manually —',
198
+ transform: 'Transform',
199
+ savedMappingHint: 'Mapping “{{name}}” applies rename + transforms + type coercion on the server. Column mapping is read-only.',
200
+ savedMappingPreviewNote: 'The preview shows your source columns; on import, mapping “{{name}}” applies rename, transforms and type coercion on the server.',
194
201
  csvColumn: "Spalte",
195
202
  mapsTo: "Zugeordnet zu",
196
203
  typeMismatch: "Sieht aus wie {{type}}",
@@ -1263,6 +1270,7 @@ const de = {
1263
1270
  },
1264
1271
  topbar: {
1265
1272
  aiAssistant: "KI-Assistent",
1273
+ designInStudio: "Im Studio gestalten",
1266
1274
  },
1267
1275
  home: {
1268
1276
  title: "Startseite",
@@ -1693,6 +1701,46 @@ const de = {
1693
1701
  },
1694
1702
  },
1695
1703
  },
1704
+ connectAgent: {
1705
+ disabled: {
1706
+ title: 'MCP ist auf dieser Bereitstellung deaktiviert',
1707
+ body: 'Die MCP-Schnittstelle ist ausgeschaltet (OS_MCP_SERVER_ENABLED=false). Bitten Sie Ihren Betreiber, sie wieder zu aktivieren.',
1708
+ },
1709
+ url: {
1710
+ title: 'MCP-Endpunkt dieser Umgebung',
1711
+ body: 'Jeder MCP-fähige KI-Client verbindet sich über diese URL. Die Identität ist Self-Service: Die Bereitstellung ist ihr eigener OAuth-2.1-Autorisierungsserver — Sie melden sich als Sie selbst an, und jeder Aufruf unterliegt Ihren Berechtigungen und der Zeilensicherheit.',
1712
+ downloadSkill: 'SKILL.md herunterladen',
1713
+ skillHint: 'Die portable Agenten-Skill-Datei: erklärt jedem skill-fähigen Agenten die Arbeit mit dieser Umgebung.',
1714
+ },
1715
+ claude: {
1716
+ body: 'Einstellungen → Connectors → Benutzerdefinierten Connector hinzufügen, dann diese URL einfügen und im Browser anmelden.',
1717
+ reachability: 'claude.ai (Web) verbindet sich von Anthropic-Servern — die Bereitstellung muss über öffentliches HTTPS erreichbar sein. Claude Desktop und lokale Clients erreichen auch Intranet-Bereitstellungen.',
1718
+ },
1719
+ claudeCode: {
1720
+ body: 'Ein Befehl — die OAuth-Anmeldung öffnet sich bei der ersten Nutzung automatisch:',
1721
+ plugin: 'Oder das offizielle Plugin installieren (mit ObjectStack-Skill und geführtem /objectstack:connect):',
1722
+ },
1723
+ cursor: {
1724
+ addButton: 'Zu Cursor hinzufügen',
1725
+ body: 'Ein-Klick-Button verwenden oder Folgendes in .cursor/mcp.json eintragen:',
1726
+ },
1727
+ vscode: {
1728
+ body: 'In .vscode/mcp.json eintragen (oder über den Befehl „MCP: Add Server“):',
1729
+ },
1730
+ codex: {
1731
+ body: 'In ~/.codex/config.toml eintragen. Falls Ihre Codex-Version den OAuth-Flow nicht unterstützt, stattdessen einen API-Schlüssel-Header verwenden (siehe unten):',
1732
+ },
1733
+ apiKey: {
1734
+ title: 'API-Schlüssel',
1735
+ badge: 'headless',
1736
+ body: 'Für CI, Skripte und Agenten ohne Browser. Der Schlüssel handelt als Sie — wie ein Passwort behandeln. Er wird nur EINMAL angezeigt.',
1737
+ namePlaceholder: 'Schlüsselname (z. B. ci-agent)',
1738
+ mint: 'Schlüssel erstellen',
1739
+ minting: 'Wird erstellt…',
1740
+ showOnce: 'Schlüssel „{{name}}“ erstellt — jetzt kopieren, er wird nicht erneut angezeigt:',
1741
+ done: 'Fertig — ausblenden',
1742
+ },
1743
+ },
1696
1744
  marketplace: {
1697
1745
  title: "App-Marktplatz",
1698
1746
  subtitle: "Durchsuchen Sie genehmigte Apps, die im ObjectStack-Katalog veröffentlicht wurden. Klicken Sie auf eine App, um Details zu sehen und sie in eine Ihrer Umgebungen zu installieren.",
@@ -1988,6 +2036,12 @@ const de = {
1988
2036
  empty: 'Nichts ausstehend — alle Entwürfe wurden veröffentlicht.',
1989
2037
  kindNew: 'Neu',
1990
2038
  kindUpdate: 'Aktualisierung',
2039
+ detailLoading: 'Details werden geladen…',
2040
+ detailLoadFailed: 'Änderungsdetails konnten nicht geladen werden:',
2041
+ detailNone: 'Keine Unterschiede erkannt — der Entwurf entspricht der veröffentlichten Version.',
2042
+ detailChangedKeys: 'Ebenfalls geändert:',
2043
+ confirmNote: 'Beim Veröffentlichen werden alle {{count}} ausstehenden Entwürfe dieses Pakets atomar freigegeben.',
2044
+ publishConfirm: 'Alle veröffentlichen',
1991
2045
  },
1992
2046
  },
1993
2047
  filterBuilder: {
@@ -83,6 +83,7 @@ declare const en: {
83
83
  readonly email: "Please enter a valid email address";
84
84
  readonly url: "Please enter a valid URL";
85
85
  readonly pattern: "{{field}} format is invalid";
86
+ readonly formInvalid: "Please check the highlighted fields: {{fields}}";
86
87
  readonly unique: "{{field}} must be unique";
87
88
  readonly type: "{{field}} must be a valid {{type}}";
88
89
  };
@@ -204,6 +205,12 @@ declare const en: {
204
205
  readonly templateName: "Template name";
205
206
  readonly save: "Save";
206
207
  readonly deleteTemplate: "Delete template";
208
+ readonly savedMapping: "Saved mapping:";
209
+ readonly chooseSavedMapping: "Choose a saved mapping…";
210
+ readonly manualMapping: "— Map columns manually —";
211
+ readonly transform: "Transform";
212
+ readonly savedMappingHint: "Mapping “{{name}}” applies rename + transforms + type coercion on the server. Column mapping is read-only.";
213
+ readonly savedMappingPreviewNote: "The preview shows your source columns; on import, mapping “{{name}}” applies rename, transforms and type coercion on the server.";
207
214
  readonly csvColumn: "Column";
208
215
  readonly mapsTo: "Maps To";
209
216
  readonly typeMismatch: "Looks like {{type}}";
@@ -1242,6 +1249,15 @@ declare const en: {
1242
1249
  readonly dark: "Dark";
1243
1250
  readonly system: "System";
1244
1251
  };
1252
+ readonly objectData: {
1253
+ readonly badge: "Data";
1254
+ readonly description: "URL-defined data slice — not bound to any saved view.";
1255
+ readonly filteredBy: "Filtered by";
1256
+ readonly removeFilter: "Remove filter {{field}}";
1257
+ readonly saveAsView: "Save as view";
1258
+ readonly noAccessTitle: "Access denied";
1259
+ readonly noAccess: "You do not have permission to view this data.";
1260
+ };
1245
1261
  readonly objectView: {
1246
1262
  readonly objectNotFound: "Object Not Found";
1247
1263
  readonly objectNotFoundDescription: "The object \"{{objectName}}\" does not exist in the current configuration.";
@@ -1646,6 +1662,7 @@ declare const en: {
1646
1662
  };
1647
1663
  readonly topbar: {
1648
1664
  readonly aiAssistant: "AI Assistant";
1665
+ readonly designInStudio: "Design in Studio";
1649
1666
  readonly openAssistant: "Open {{name}} assistant";
1650
1667
  readonly offline: "Offline";
1651
1668
  readonly usersOnline: "Users currently online";
@@ -1657,6 +1674,11 @@ declare const en: {
1657
1674
  readonly disconnected: "Disconnected";
1658
1675
  readonly error: "Connection Error";
1659
1676
  };
1677
+ readonly stage: {
1678
+ readonly preview: "Preview";
1679
+ readonly beta: "Beta";
1680
+ readonly tooltip: "This platform is in preview — features may change.";
1681
+ };
1660
1682
  };
1661
1683
  readonly home: {
1662
1684
  readonly title: "Home";
@@ -1747,6 +1769,7 @@ declare const en: {
1747
1769
  readonly appsAvailable: "{{count}} apps available";
1748
1770
  readonly addApp: "Add App";
1749
1771
  readonly editApp: "Edit App";
1772
+ readonly editNavigation: "Edit Navigation";
1750
1773
  readonly manageAllApps: "Manage All Apps";
1751
1774
  readonly systemConsole: "System Console";
1752
1775
  readonly noAppsConfigured: "No apps configured";
@@ -1850,6 +1873,12 @@ declare const en: {
1850
1873
  readonly empty: "Nothing pending — every draft has been published.";
1851
1874
  readonly kindNew: "New";
1852
1875
  readonly kindUpdate: "Update";
1876
+ readonly detailLoading: "Loading detail…";
1877
+ readonly detailLoadFailed: "Could not load change detail:";
1878
+ readonly detailNone: "No differences detected — the draft matches the published version.";
1879
+ readonly detailChangedKeys: "Also changed:";
1880
+ readonly confirmNote: "Publishing releases all {{count}} pending drafts of this package atomically.";
1881
+ readonly publishConfirm: "Publish all";
1853
1882
  };
1854
1883
  };
1855
1884
  readonly renderer: {
@@ -2029,6 +2058,46 @@ declare const en: {
2029
2058
  };
2030
2059
  };
2031
2060
  };
2061
+ readonly connectAgent: {
2062
+ readonly disabled: {
2063
+ readonly title: "MCP is disabled on this deployment";
2064
+ readonly body: "The MCP surface is off (OS_MCP_SERVER_ENABLED=false), so there is nothing to connect. Ask your operator to re-enable it.";
2065
+ };
2066
+ readonly url: {
2067
+ readonly title: "This environment's MCP endpoint";
2068
+ readonly body: "Any MCP-capable AI client connects with this URL. Identity is self-serve: the deployment is its own OAuth 2.1 authorization server, so interactive clients just open a browser login — you connect as yourself, and every call runs under your own permissions and row-level security.";
2069
+ readonly downloadSkill: "Download SKILL.md";
2070
+ readonly skillHint: "The portable agent skill: teaches any skills-capable agent how to work with this environment.";
2071
+ };
2072
+ readonly claude: {
2073
+ readonly body: "Settings → Connectors → Add custom connector, then paste this URL. Sign in through the browser when prompted.";
2074
+ readonly reachability: "claude.ai (web) connects from Anthropic's servers — the deployment must be reachable over public HTTPS. Claude Desktop and local clients also reach intranet deployments.";
2075
+ };
2076
+ readonly claudeCode: {
2077
+ readonly body: "One command — the OAuth login opens automatically on first use:";
2078
+ readonly plugin: "Or install the official plugin (adds the ObjectStack skill and a guided /objectstack:connect command):";
2079
+ };
2080
+ readonly cursor: {
2081
+ readonly addButton: "Add to Cursor";
2082
+ readonly body: "Use the one-click button, or add this to .cursor/mcp.json:";
2083
+ };
2084
+ readonly vscode: {
2085
+ readonly body: "Add to .vscode/mcp.json (or via the MCP: Add Server command):";
2086
+ };
2087
+ readonly codex: {
2088
+ readonly body: "Add to ~/.codex/config.toml. If your Codex version lacks the OAuth flow, use an API key header instead (see below):";
2089
+ };
2090
+ readonly apiKey: {
2091
+ readonly title: "API keys";
2092
+ readonly badge: "headless";
2093
+ readonly body: "For CI, scripts, and agents without a browser. The key acts as you — treat it like a password. It is shown ONCE.";
2094
+ readonly namePlaceholder: "Key name (e.g. ci-agent)";
2095
+ readonly mint: "Create key";
2096
+ readonly minting: "Creating…";
2097
+ readonly showOnce: "Key \"{{name}}\" created — copy it now, it will not be shown again:";
2098
+ readonly done: "Done — hide it";
2099
+ };
2100
+ };
2032
2101
  readonly marketplace: {
2033
2102
  readonly title: "App Marketplace";
2034
2103
  readonly subtitle: "Browse approved apps published to the ObjectStack catalog. Click an app to view details and install it into one of your environments.";
@@ -2111,6 +2180,15 @@ declare const en: {
2111
2180
  readonly localUnauthorized: "Sign in to this runtime first, then try again.";
2112
2181
  readonly localMarketplaceUnavailable: "This runtime has no OS_CLOUD_URL configured, so the marketplace catalog is unreachable.";
2113
2182
  };
2183
+ readonly suggestedBindings: {
2184
+ readonly promptEveryone: "This app suggests granting \"{{set}}\" to all signed-in users (the Everyone position).";
2185
+ readonly promptGuest: "This app suggests granting \"{{set}}\" to unauthenticated visitors (the Guest position).";
2186
+ readonly confirm: "Grant";
2187
+ readonly confirming: "Granting…";
2188
+ readonly dismiss: "Dismiss";
2189
+ readonly confirmedToast: "\"{{set}}\" is now granted to {{anchor}}.";
2190
+ readonly dismissedToast: "Suggestion for \"{{set}}\" dismissed.";
2191
+ };
2114
2192
  readonly uninstall: {
2115
2193
  readonly confirm: "Uninstall {{manifestId}} v{{version}} from this runtime?\n\nThe cached manifest will be removed. The app will remain loaded in the running kernel until the next restart.";
2116
2194
  readonly successInList: "Removed {{manifestId}}. Restart the runtime to fully unload it from the running kernel.";