@jini-ai/ui 0.3.13 → 0.4.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.
Files changed (334) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/README.md +120 -26
  3. package/dist/browser/index.js +1 -1
  4. package/dist/browser/useDismissOnOutsideOrEscape.d.ts +10 -1
  5. package/dist/browser/useDismissOnOutsideOrEscape.js +7 -4
  6. package/dist/browser/useGlobalKeydown.d.ts +14 -2
  7. package/dist/browser/useGlobalKeydown.js +8 -17
  8. package/dist/features/a2ui/catalog-from-registry.d.ts +6 -3
  9. package/dist/features/a2ui/catalog-from-registry.js +1 -1
  10. package/dist/features/a2ui/index.d.ts +1 -1
  11. package/dist/features/a2ui/protocol.d.ts +1 -1
  12. package/dist/features/a2ui/renderer.js +23 -10
  13. package/dist/features/a2ui/use-a2ui-surface.d.ts +11 -6
  14. package/dist/features/a2ui/use-a2ui-surface.js +40 -10
  15. package/dist/features/admin-widgets/components/ComingSoonNotice.d.ts +11 -0
  16. package/dist/features/admin-widgets/components/ComingSoonNotice.js +7 -0
  17. package/dist/features/admin-widgets/components/ComingSoonPanel.d.ts +10 -0
  18. package/dist/features/admin-widgets/components/ComingSoonPanel.js +10 -0
  19. package/dist/features/admin-widgets/components/ImagePreviewModal.d.ts +16 -0
  20. package/dist/features/admin-widgets/components/ImagePreviewModal.hooks.d.ts +13 -0
  21. package/dist/features/admin-widgets/components/ImagePreviewModal.hooks.js +46 -0
  22. package/dist/features/admin-widgets/components/ImagePreviewModal.js +13 -0
  23. package/dist/features/admin-widgets/components/InfoTip.d.ts +18 -0
  24. package/dist/features/admin-widgets/components/InfoTip.hooks.d.ts +16 -0
  25. package/dist/features/admin-widgets/components/InfoTip.hooks.js +45 -0
  26. package/dist/features/admin-widgets/components/InfoTip.js +12 -0
  27. package/dist/features/admin-widgets/components/SeeMore/SeeMore.d.ts +41 -0
  28. package/dist/features/admin-widgets/components/SeeMore/SeeMore.hooks.d.ts +14 -0
  29. package/dist/features/admin-widgets/components/SeeMore/SeeMore.hooks.js +57 -0
  30. package/dist/features/admin-widgets/components/SeeMore/SeeMore.js +24 -0
  31. package/dist/features/admin-widgets/components/Select/Select.d.ts +39 -0
  32. package/dist/features/admin-widgets/components/Select/Select.hooks.d.ts +105 -0
  33. package/dist/features/admin-widgets/components/Select/Select.hooks.js +359 -0
  34. package/dist/features/admin-widgets/components/Select/Select.js +46 -0
  35. package/dist/features/admin-widgets/index.d.ts +20 -0
  36. package/dist/features/admin-widgets/index.js +11 -0
  37. package/dist/features/admin-widgets/styles/admin-widgets.css +2 -0
  38. package/dist/features/appearance/constants.d.ts +2 -2
  39. package/dist/features/appearance/constants.js +2 -1
  40. package/dist/features/appearance/react/components/AppearanceTab.js +5 -5
  41. package/dist/features/appearance/rules.d.ts +10 -4
  42. package/dist/features/appearance/rules.js +5 -5
  43. package/dist/features/appearance/types.d.ts +1 -1
  44. package/dist/features/appearance/types.js +1 -1
  45. package/dist/features/asset-grid/react/components/AssetGrid.js +1 -1
  46. package/dist/features/asset-grid/react/components/DeleteConfirmDialog.js +1 -1
  47. package/dist/features/asset-grid/react/hooks/useAssetGridKeyboardShortcuts.js +23 -21
  48. package/dist/features/asset-grid/react/hooks/useAssetGridLiveUpdates.d.ts +1 -1
  49. package/dist/features/asset-grid/react/hooks/useAssetGridLiveUpdates.js +1 -1
  50. package/dist/features/asset-tree-browser/ports.d.ts +3 -1
  51. package/dist/features/asset-tree-browser/react/hooks/useAssetTreeCopyLocalPath.js +1 -1
  52. package/dist/features/browser-chrome/react/components/BrowserViewportControls.js +1 -1
  53. package/dist/features/browser-chrome/types.js +1 -1
  54. package/dist/features/command-palette/ports.js +1 -1
  55. package/dist/features/connectors/ConnectorsBrowser.js +2 -2
  56. package/dist/features/connectors/components/ConnectorCard.js +3 -3
  57. package/dist/features/connectors/components/ConnectorDetailDrawer.js +1 -1
  58. package/dist/features/connectors/components/ConnectorGrid.js +2 -2
  59. package/dist/features/connectors/components/ConnectorSearchBar.js +2 -2
  60. package/dist/features/connectors/components/ProviderTabBar.js +2 -2
  61. package/dist/features/connectors/constants.d.ts +1 -1
  62. package/dist/features/connectors/constants.js +1 -1
  63. package/dist/features/connectors/hooks/useConnectorAuthorization.js +1 -1
  64. package/dist/features/connectors/rules.d.ts +2 -2
  65. package/dist/features/connectors/rules.js +1 -1
  66. package/dist/features/connectors/types.d.ts +2 -2
  67. package/dist/features/connectors/types.js +1 -1
  68. package/dist/features/execution/react/components/ByokProviderForm.js +3 -3
  69. package/dist/features/execution/react/components/ExecutionTab.js +2 -2
  70. package/dist/features/execution/react/components/LocalCliAgentCard.js +3 -3
  71. package/dist/features/execution/react/components/LocalCliAgentList.js +2 -2
  72. package/dist/features/execution/react/components/ProviderChipGroup.js +2 -2
  73. package/dist/features/execution/react/components/SearchableModelSelect.js +1 -1
  74. package/dist/features/execution/rules.js +1 -1
  75. package/dist/features/file-dropzone/react/components/FileDropzone.js +5 -3
  76. package/dist/features/file-dropzone/react/hooks/useFileDropzone.d.ts +1 -1
  77. package/dist/features/file-dropzone/react/hooks/useFileDropzone.js +1 -1
  78. package/dist/features/file-dropzone/types.d.ts +1 -1
  79. package/dist/features/file-dropzone/types.js +1 -1
  80. package/dist/features/folder-path-drop/react/hooks/useFolderPathDropCapture.js +6 -4
  81. package/dist/features/html-editor/canvas-content-wrapper.js +1 -1
  82. package/dist/features/html-editor/canvas-embed-placeholders.js +7 -7
  83. package/dist/features/html-editor/canvas-style.d.ts +4 -0
  84. package/dist/features/html-editor/canvas-style.js +6 -21
  85. package/dist/features/html-viewer/constants.d.ts +1 -1
  86. package/dist/features/html-viewer/constants.js +1 -1
  87. package/dist/features/html-viewer/react/components/PresentMenu.js +1 -1
  88. package/dist/features/html-viewer/react/components/ZoomMenu.js +1 -1
  89. package/dist/features/html-viewer/types.d.ts +1 -1
  90. package/dist/features/html-viewer/types.js +1 -1
  91. package/dist/features/i18n/dictionaries/index.d.ts +2 -3
  92. package/dist/features/i18n/dictionaries/settings-dialog.en.d.ts +1 -1
  93. package/dist/features/i18n/dictionary-translator.d.ts +16 -0
  94. package/dist/features/i18n/dictionary-translator.js +14 -0
  95. package/dist/features/i18n/index.d.ts +3 -0
  96. package/dist/features/i18n/index.js +2 -0
  97. package/dist/features/i18n/locale.d.ts +1 -1
  98. package/dist/features/i18n/template-i18n.d.ts +26 -0
  99. package/dist/features/i18n/template-i18n.js +36 -0
  100. package/dist/features/iframe-pool/react/components/IframeKeepAliveProvider.d.ts +1 -1
  101. package/dist/features/iframe-pool/react/components/IframeKeepAliveProvider.js +1 -1
  102. package/dist/features/instructions/react/components/InstructionsTab.js +1 -1
  103. package/dist/features/integrations/react/components/ClientPicker.js +4 -4
  104. package/dist/features/integrations/react/components/CodexInstallToggleButton.js +1 -1
  105. package/dist/features/integrations/react/components/IntegrationsTab.js +2 -2
  106. package/dist/features/integrations/react/components/SnippetBlock.js +1 -1
  107. package/dist/features/integrations/types.d.ts +1 -1
  108. package/dist/features/integrations/types.js +1 -1
  109. package/dist/features/interactive-ui/index.js +13 -13
  110. package/dist/features/interactive-ui/interactive-ui.css +1 -1
  111. package/dist/features/interactive-ui/providers/recharts/bar-chart.js +1 -1
  112. package/dist/features/interactive-ui/providers/recharts/line-chart.js +1 -1
  113. package/dist/features/interactive-ui/providers/recharts/pie-chart.js +2 -2
  114. package/dist/features/interactive-ui/providers/shadcn/lib/utils.d.ts +1 -1
  115. package/dist/features/interactive-ui/providers/shadcn/lib/utils.js +1 -1
  116. package/dist/features/interactive-ui/registry.d.ts +15 -4
  117. package/dist/features/interactive-ui/registry.js +5 -5
  118. package/dist/features/language/react/components/LanguageTab.js +2 -2
  119. package/dist/features/list-detail-panel/types.d.ts +1 -1
  120. package/dist/features/list-detail-panel/types.js +1 -1
  121. package/dist/features/mcp-ui/confirmation-store.js +2 -1
  122. package/dist/features/mcp-ui/surfaces/bridge.d.ts +2 -1
  123. package/dist/features/mcp-ui/surfaces/bridge.js +17 -7
  124. package/dist/features/mcp-ui/surfaces/confirmation.d.ts +20 -0
  125. package/dist/features/mcp-ui/surfaces/confirmation.js +38 -6
  126. package/dist/features/mcp-ui/surfaces/document.d.ts +7 -1
  127. package/dist/features/mcp-ui/surfaces/document.js +19 -1
  128. package/dist/features/mcp-ui/surfaces/text-input.js +4 -4
  129. package/dist/features/mcp-ui/surfaces/tokens.d.ts +17 -20
  130. package/dist/features/mcp-ui/surfaces/tokens.js +33 -35
  131. package/dist/features/media-providers/index.d.ts +1 -1
  132. package/dist/features/media-providers/index.js +1 -1
  133. package/dist/features/media-providers/react/components/MediaProvidersTab.js +4 -4
  134. package/dist/features/media-providers/rules.js +1 -1
  135. package/dist/features/memory/async-commit-guard.d.ts +1 -1
  136. package/dist/features/memory/constants.d.ts +1 -1
  137. package/dist/features/memory/constants.js +1 -1
  138. package/dist/features/memory/dependencies.d.ts +11 -23
  139. package/dist/features/memory/dependencies.js +116 -106
  140. package/dist/features/memory/index.d.ts +1 -1
  141. package/dist/features/memory/index.js +1 -1
  142. package/dist/features/memory/react/components/MemoryAdvancedModal.js +2 -2
  143. package/dist/features/memory/react/components/MemoryEntryCard.js +1 -1
  144. package/dist/features/memory/react/components/MemoryExtractionCard.js +1 -1
  145. package/dist/features/memory/react/components/MemoryHooksPanel.js +1 -1
  146. package/dist/features/memory/react/components/MemoryList.js +5 -5
  147. package/dist/features/memory/react/components/MemoryManualEditor.js +5 -5
  148. package/dist/features/memory/react/components/MemorySettingsPanel.js +1 -1
  149. package/dist/features/memory/react/hooks/useMemoryEntries.hooks.js +1 -1
  150. package/dist/features/memory/react/hooks/useMemoryNavigation.hooks.js +1 -1
  151. package/dist/features/memory/react/styles.js +1 -1
  152. package/dist/features/memory/rules.js +1 -1
  153. package/dist/features/memory/types.d.ts +1 -1
  154. package/dist/features/mention-autocomplete/react/hooks/useMentionAutocomplete.js +1 -1
  155. package/dist/features/notifications/react/components/NotificationsTab.js +7 -7
  156. package/dist/features/notifications/types.d.ts +1 -1
  157. package/dist/features/observability/boot-timing.js +2 -2
  158. package/dist/features/observability/stuck-run.js +1 -1
  159. package/dist/features/observability/white-screen.js +4 -4
  160. package/dist/features/panel-kit/fetch-query/adapter.react.d.ts +35 -0
  161. package/dist/features/panel-kit/fetch-query/adapter.react.js +122 -0
  162. package/dist/features/panel-kit/fetch-query/cache.d.ts +123 -0
  163. package/dist/features/panel-kit/fetch-query/cache.js +231 -0
  164. package/dist/features/panel-kit/fetch-query/environment.browser.d.ts +4 -0
  165. package/dist/features/panel-kit/fetch-query/environment.browser.js +25 -0
  166. package/dist/features/panel-kit/fetch-query/index.d.ts +4 -0
  167. package/dist/features/panel-kit/fetch-query/index.js +2 -0
  168. package/dist/features/panel-kit/fetch-query/types.d.ts +91 -0
  169. package/dist/features/panel-kit/fetch-query/types.js +2 -0
  170. package/dist/features/panel-kit/helpers/format-timestamp.d.ts +18 -0
  171. package/dist/features/panel-kit/helpers/format-timestamp.js +20 -0
  172. package/dist/features/panel-kit/helpers/permissions.d.ts +11 -0
  173. package/dist/features/panel-kit/helpers/permissions.js +10 -0
  174. package/dist/features/panel-kit/helpers/resolve-active-tab-id.d.ts +13 -0
  175. package/dist/features/panel-kit/helpers/resolve-active-tab-id.js +13 -0
  176. package/dist/features/panel-kit/helpers/retry-unreachable.d.ts +20 -0
  177. package/dist/features/panel-kit/helpers/retry-unreachable.js +39 -0
  178. package/dist/features/panel-kit/hooks/use-async-action.hooks.d.ts +13 -0
  179. package/dist/features/panel-kit/hooks/use-async-action.hooks.js +27 -0
  180. package/dist/features/panel-kit/hooks/use-dirty-guard.hooks.d.ts +18 -0
  181. package/dist/features/panel-kit/hooks/use-dirty-guard.hooks.js +33 -0
  182. package/dist/features/panel-kit/hooks/use-focus-trap.hooks.d.ts +8 -0
  183. package/dist/features/panel-kit/hooks/use-focus-trap.hooks.js +66 -0
  184. package/dist/features/panel-kit/hooks/use-serial-writes.hooks.d.ts +26 -0
  185. package/dist/features/panel-kit/hooks/use-serial-writes.hooks.js +41 -0
  186. package/dist/features/panel-kit/hooks/use-settlement-generation.hooks.d.ts +9 -0
  187. package/dist/features/panel-kit/hooks/use-settlement-generation.hooks.js +25 -0
  188. package/dist/features/panel-kit/index.d.ts +19 -0
  189. package/dist/features/panel-kit/index.js +13 -0
  190. package/dist/features/privacy/react/components/PrivacyTab.js +2 -2
  191. package/dist/features/privacy/types.d.ts +1 -1
  192. package/dist/features/privacy/types.js +1 -1
  193. package/dist/features/progress-card/reference-adapters.d.ts +1 -1
  194. package/dist/features/progress-card/rules.d.ts +1 -1
  195. package/dist/features/progress-card/rules.js +1 -1
  196. package/dist/features/progress-card/types.d.ts +1 -1
  197. package/dist/features/progress-card/types.js +1 -1
  198. package/dist/features/resource-dashboard/dependencies.d.ts +1 -1
  199. package/dist/features/resource-dashboard/ports.d.ts +1 -1
  200. package/dist/features/resource-dashboard/react/hooks/useResourceBoard.d.ts +1 -1
  201. package/dist/features/resource-dashboard/react/hooks/useResourceBoard.js +1 -1
  202. package/dist/features/resource-dashboard/rules.d.ts +1 -1
  203. package/dist/features/resource-dashboard/rules.js +2 -2
  204. package/dist/features/resource-dashboard/types.d.ts +4 -4
  205. package/dist/features/resource-dashboard/types.js +1 -1
  206. package/dist/features/schedule-picker/react/hooks/useRecurringSchedulePicker.js +1 -1
  207. package/dist/features/settings/dialog/styles/settings-dialog.css +62 -60
  208. package/dist/features/sketch-editor/constants.d.ts +1 -1
  209. package/dist/features/sketch-editor/constants.js +1 -1
  210. package/dist/features/sketch-editor/dom.d.ts +1 -1
  211. package/dist/features/sketch-editor/dom.js +1 -1
  212. package/dist/features/sketch-editor/react/hooks/useSketchDomEnhancements.d.ts +1 -1
  213. package/dist/features/sketch-editor/react/hooks/useSketchDomEnhancements.js +11 -9
  214. package/dist/features/sketch-editor/types.d.ts +1 -1
  215. package/dist/features/sketch-editor/types.js +1 -1
  216. package/dist/features/skills/react/components/SkillDraftForm.js +1 -1
  217. package/dist/features/skills/react/components/SkillRow.js +1 -1
  218. package/dist/features/skills/react/components/SkillsTab.js +2 -2
  219. package/dist/features/source-config-list/agent-handles.js +2 -2
  220. package/dist/features/source-config-list/react/hooks/useSourceConfigAddForm.d.ts +1 -1
  221. package/dist/features/source-config-list/react/hooks/useSourceConfigAddForm.js +1 -1
  222. package/dist/features/source-config-list/rules.d.ts +1 -1
  223. package/dist/features/source-config-list/rules.js +3 -3
  224. package/dist/features/source-config-list/types.d.ts +1 -1
  225. package/dist/features/source-config-list/types.js +1 -1
  226. package/dist/features/tab-launcher-menu/react/hooks/useTabLauncherMenu.js +1 -1
  227. package/dist/features/tab-strip/index.d.ts +4 -0
  228. package/dist/features/tab-strip/index.js +2 -0
  229. package/dist/features/tab-strip/react/components/TabBar.d.ts +23 -0
  230. package/dist/features/tab-strip/react/components/TabBar.hooks.d.ts +25 -0
  231. package/dist/features/tab-strip/react/components/TabBar.hooks.js +57 -0
  232. package/dist/features/tab-strip/react/components/TabBar.js +18 -0
  233. package/dist/features/tab-strip/react/components/TabStrip.js +2 -1
  234. package/dist/features/tab-strip/react/components/TabStripFrame.d.ts +3 -0
  235. package/dist/features/tab-strip/react/components/TabStripFrame.js +7 -0
  236. package/dist/features/tabbed-dialog/react/hooks/useTabbedDialog.js +1 -1
  237. package/dist/features/tabbed-dialog/styles/tabbed-dialog.css +8 -141
  238. package/dist/features/tabbed-dialog/types.d.ts +1 -1
  239. package/dist/features/tabbed-dialog/types.js +1 -1
  240. package/dist/features/version-manager/ports.d.ts +1 -1
  241. package/dist/features/version-manager/react/components/VersionPromptPopover.js +5 -3
  242. package/dist/features/version-manager/react/components/VersionRestoreControl.js +1 -1
  243. package/dist/features/version-manager/types.d.ts +1 -1
  244. package/dist/features/version-manager/types.js +1 -1
  245. package/dist/features/viewer-shell/dependencies.js +1 -1
  246. package/dist/features/viewer-shell/ports.d.ts +1 -1
  247. package/dist/features/viewer-shell/react/components/ViewportSwitcher.js +1 -1
  248. package/dist/features/viewer-shell/react/hooks/useMarkdownScrollSync.d.ts +1 -1
  249. package/dist/features/viewer-shell/react/hooks/useMarkdownScrollSync.js +1 -1
  250. package/dist/features/viewer-shell/types.d.ts +1 -1
  251. package/dist/features/viewer-shell/types.js +1 -1
  252. package/dist/index.d.ts +420 -0
  253. package/dist/index.js +421 -1
  254. package/dist/react/components/ComponentKitPreview.js +1 -1
  255. package/dist/react/components/EditorIcon.d.ts +1 -1
  256. package/dist/react/components/EditorIcon.js +22 -22
  257. package/dist/react/components/ExportDiagnosticsButton.d.ts +8 -1
  258. package/dist/react/components/ExportDiagnosticsButton.js +6 -6
  259. package/dist/react/components/PaletteTweaks.js +5 -5
  260. package/dist/react/hooks/useBrandFonts.d.ts +19 -4
  261. package/dist/react/hooks/useBrandFonts.js +11 -7
  262. package/dist/react/hooks/useDebouncedValue.d.ts +12 -1
  263. package/dist/react/hooks/useDebouncedValue.js +9 -4
  264. package/dist/react/hooks/useStableHandler.d.ts +3 -1
  265. package/dist/react/hooks/useStableHandler.js +1 -1
  266. package/dist/renderers/annotation-canvas/drawing.d.ts +4 -4
  267. package/dist/renderers/annotation-canvas/drawing.js +28 -15
  268. package/dist/renderers/annotation-canvas/react/components/AnnotationCanvas.js +2 -2
  269. package/dist/renderers/annotation-canvas/react/hooks/useAnnotationCanvas.js +4 -3
  270. package/dist/renderers/annotation-canvas/rules.d.ts +1 -1
  271. package/dist/renderers/annotation-canvas/theme.d.ts +13 -0
  272. package/dist/renderers/annotation-canvas/theme.js +16 -0
  273. package/dist/renderers/annotation-canvas/types.d.ts +1 -1
  274. package/dist/renderers/index.d.ts +1 -1
  275. package/dist/renderers/new-tab-preview.d.ts +3 -0
  276. package/dist/renderers/new-tab-preview.js +3 -1
  277. package/dist/renderers/preview-modal-shell/react/hooks/usePreviewModalShell.d.ts +1 -1
  278. package/dist/renderers/preview-modal-shell/react/hooks/usePreviewModalShell.js +1 -1
  279. package/dist/renderers/preview-modal-shell/rules.d.ts +1 -1
  280. package/dist/renderers/preview-modal-shell/types.d.ts +3 -3
  281. package/dist/renderers/preview-modal-shell/types.js +2 -2
  282. package/dist/renderers/react/components/ArtifactView.d.ts +1 -1
  283. package/dist/renderers/react/components/ArtifactView.js +1 -1
  284. package/dist/renderers/registry.d.ts +12 -6
  285. package/dist/renderers/registry.js +7 -9
  286. package/dist/renderers/renderers/html.js +2 -2
  287. package/dist/renderers/renderers/index.js +1 -1
  288. package/dist/renderers/renderers/markdown.js +2 -2
  289. package/dist/renderers/renderers/react-component.js +1 -1
  290. package/dist/renderers/renderers/svg.js +1 -1
  291. package/dist/renderers/shiki.js +1 -1
  292. package/dist/renderers/srcdoc/build.d.ts +1 -1
  293. package/dist/renderers/srcdoc/build.js +1 -1
  294. package/dist/renderers/url-load-decision.d.ts +1 -1
  295. package/dist/renderers/url-load-decision.js +1 -1
  296. package/dist/styles/admin.css +273 -0
  297. package/dist/styles/variables.css +117 -0
  298. package/dist/theme/apply.d.ts +9 -0
  299. package/dist/theme/apply.js +77 -0
  300. package/dist/theme/color-scheme.d.ts +8 -0
  301. package/dist/theme/color-scheme.js +9 -0
  302. package/dist/theme/default.d.ts +4 -0
  303. package/dist/theme/default.js +11 -0
  304. package/dist/theme/index.d.ts +6 -0
  305. package/dist/theme/index.js +5 -0
  306. package/dist/theme/stylesheet.d.ts +8 -0
  307. package/dist/theme/stylesheet.js +14 -0
  308. package/dist/theme/types.d.ts +39 -0
  309. package/dist/theme/types.js +2 -0
  310. package/dist/theme/validation.d.ts +15 -0
  311. package/dist/theme/validation.js +55 -0
  312. package/dist/utils/appearance.js +1 -1
  313. package/dist/utils/browser-request.d.ts +12 -0
  314. package/dist/utils/browser-request.js +10 -0
  315. package/dist/utils/color-math.d.ts +20 -6
  316. package/dist/utils/color-math.js +12 -12
  317. package/dist/utils/copy-to-clipboard.d.ts +19 -8
  318. package/dist/utils/copy-to-clipboard.js +15 -11
  319. package/dist/utils/dom-subscriptions.js +1 -1
  320. package/dist/utils/endpoint-policy.d.ts +9 -3
  321. package/dist/utils/endpoint-policy.js +5 -5
  322. package/dist/utils/markdown-scroll-sync.js +3 -3
  323. package/dist/utils/notifications.d.ts +1 -1
  324. package/dist/utils/notifications.js +1 -1
  325. package/dist/utils/polygon-selection.d.ts +1 -1
  326. package/dist/utils/polygon-selection.js +1 -1
  327. package/dist/utils/scroll-tabs-with-wheel.d.ts +4 -1
  328. package/dist/utils/scroll-tabs-with-wheel.js +1 -1
  329. package/dist/utils/smooth-scroll-to-top.js +1 -1
  330. package/dist/utils/sse.d.ts +3 -1
  331. package/dist/utils/sse.js +1 -1
  332. package/package.json +105 -16
  333. package/dist/features/lexical-rich-text-editor/react/test-support/lexical-harness.d.ts +0 -11
  334. package/dist/features/lexical-rich-text-editor/react/test-support/lexical-harness.js +0 -35
@@ -48,10 +48,10 @@ export function renderTextInput(props) {
48
48
  ? `<textarea class="mcpui-textarea"${common}${optionalAttribute('rows', props.rows)}>${props.value === undefined ? '' : escapeHtml(String(props.value))}</textarea>`
49
49
  : `<input class="mcpui-input" type="${type}"${common}` +
50
50
  optionalAttribute('value', props.value) +
51
- // A stored secret (e.g. a cloud provider's access key) must never be offered to a browser's
52
- // password manager as a saveable website login — it belongs to this `ui://` surface, not a
53
- // credential the browser should remember.
54
- (props.secret === true ? optionalAttribute('autocomplete', 'off') : '') +
51
+ // A stored secret (e.g. a cloud provider's access key or a database password) must never be
52
+ // autofilled with a saved website login. `new-password`, not `off`: Chrome ignores `off` on
53
+ // password inputs by design and fills the saved login anyway.
54
+ (type === 'password' ? optionalAttribute('autocomplete', 'new-password') : '') +
55
55
  (isNumber
56
56
  ? optionalAttribute('min', props.min) + optionalAttribute('max', props.max) + optionalAttribute('step', props.step)
57
57
  : '') +
@@ -17,10 +17,8 @@
17
17
  * alone moves the accent, its hover state, its focus ring, and its tinted background together,
18
18
  * because all four resolve through it.
19
19
  *
20
- * `@jini-ai/ui` has no package-wide custom-property design system to reuse (checked: its only two
21
- * stylesheets, `react/chat/styles/reference.css` and the Remix icon font, declare no custom
22
- * properties at all), so these are namespaced `--jini-mcpui-*` to stay out of the way of one if it
23
- * ever lands.
20
+ * The sandbox cannot inherit the host's CSS. These names are a document adapter of
21
+ * defaultAdminTheme; hosts forward their active values through the existing overrides port.
24
22
  *
25
23
  * ## Dark mode
26
24
  *
@@ -43,26 +41,26 @@
43
41
  * render in whatever the engine falls back to after a delay.
44
42
  */
45
43
  export declare const SURFACE_TOKENS: {
46
- readonly '--jini-mcpui-bg': "#faf9f7";
47
- readonly '--jini-mcpui-panel': "#fdfcfa";
48
- readonly '--jini-mcpui-border': "#e1e5eb";
49
- readonly '--jini-mcpui-border-strong': "#c9d0da";
50
- readonly '--jini-mcpui-text': "#1a1916";
51
- readonly '--jini-mcpui-text-strong': "#0d0c0a";
52
- readonly '--jini-mcpui-text-muted': "#74716b";
53
- readonly '--jini-mcpui-text-soft': "#989590";
54
- readonly '--jini-mcpui-text-faint': "#b3b0a8";
55
- readonly '--jini-mcpui-accent': "#c96442";
56
- readonly '--jini-mcpui-accent-strong': "#b45a3b";
57
- readonly '--jini-mcpui-danger': "#a8443a";
44
+ readonly '--jini-mcpui-bg': string;
45
+ readonly '--jini-mcpui-panel': string;
46
+ readonly '--jini-mcpui-border': string;
47
+ readonly '--jini-mcpui-border-strong': string;
48
+ readonly '--jini-mcpui-text': string;
49
+ readonly '--jini-mcpui-text-strong': string;
50
+ readonly '--jini-mcpui-text-muted': string;
51
+ readonly '--jini-mcpui-text-soft': string;
52
+ readonly '--jini-mcpui-text-faint': string;
53
+ readonly '--jini-mcpui-accent': string;
54
+ readonly '--jini-mcpui-accent-strong': string;
55
+ readonly '--jini-mcpui-danger': string;
58
56
  readonly '--jini-mcpui-radius-xs': "4px";
59
57
  readonly '--jini-mcpui-radius-sm': "6px";
60
58
  readonly '--jini-mcpui-radius-md': "8px";
61
59
  readonly '--jini-mcpui-radius-lg': "10px";
62
60
  readonly '--jini-mcpui-radius-xl': "12px";
63
61
  readonly '--jini-mcpui-radius-pill': "999px";
64
- readonly '--jini-mcpui-font': "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif";
65
- readonly '--jini-mcpui-font-mono': "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace";
62
+ readonly '--jini-mcpui-font': string;
63
+ readonly '--jini-mcpui-font-mono': string;
66
64
  };
67
65
  /** The token names a caller may override. */
68
66
  export type SurfaceTokenName = keyof typeof SURFACE_TOKENS;
@@ -79,8 +77,7 @@ export declare const SURFACE_TOKENS_DARK: Record<SurfaceTokenName, string>;
79
77
  * Whether every generated surface is pinned to the light palette regardless of the embedding
80
78
  * browser/OS's `prefers-color-scheme`.
81
79
  *
82
- * True today because the host product — currently this package's only consumer — has no real
83
- * light/dark toggle yet (`apps/admin`'s Appearance section is a disabled "SOON" placeholder), so a
80
+ * True by default because without an explicit app-level theme signal, a
84
81
  * surface that honors the OS preference doesn't track any actual app theme — it tracks whatever the
85
82
  * operator's OS happens to be set to, which produces a dark card floating in an always-light admin
86
83
  * UI. Flip this to `false` once the host product has a real app-level theme signal to forward in;
@@ -1,3 +1,4 @@
1
+ import { defaultAdminTheme } from '../../../theme/default.js';
1
2
  /**
2
3
  * @module features/mcp-ui/surfaces/tokens
3
4
  *
@@ -17,10 +18,8 @@
17
18
  * alone moves the accent, its hover state, its focus ring, and its tinted background together,
18
19
  * because all four resolve through it.
19
20
  *
20
- * `@jini-ai/ui` has no package-wide custom-property design system to reuse (checked: its only two
21
- * stylesheets, `react/chat/styles/reference.css` and the Remix icon font, declare no custom
22
- * properties at all), so these are namespaced `--jini-mcpui-*` to stay out of the way of one if it
23
- * ever lands.
21
+ * The sandbox cannot inherit the host's CSS. These names are a document adapter of
22
+ * defaultAdminTheme; hosts forward their active values through the existing overrides port.
24
23
  *
25
24
  * ## Dark mode
26
25
  *
@@ -43,28 +42,28 @@
43
42
  * render in whatever the engine falls back to after a delay.
44
43
  */
45
44
  export const SURFACE_TOKENS = {
46
- '--jini-mcpui-bg': '#faf9f7',
47
- '--jini-mcpui-panel': '#fdfcfa',
48
- '--jini-mcpui-border': '#e1e5eb',
49
- '--jini-mcpui-border-strong': '#c9d0da',
50
- '--jini-mcpui-text': '#1a1916',
51
- '--jini-mcpui-text-strong': '#0d0c0a',
52
- '--jini-mcpui-text-muted': '#74716b',
53
- '--jini-mcpui-text-soft': '#989590',
54
- '--jini-mcpui-text-faint': '#b3b0a8',
55
- '--jini-mcpui-accent': '#c96442',
56
- '--jini-mcpui-accent-strong': '#b45a3b',
45
+ '--jini-mcpui-bg': defaultAdminTheme.light.bg,
46
+ '--jini-mcpui-panel': defaultAdminTheme.light.surface,
47
+ '--jini-mcpui-border': defaultAdminTheme.light.border,
48
+ '--jini-mcpui-border-strong': defaultAdminTheme.light.border,
49
+ '--jini-mcpui-text': defaultAdminTheme.light.text,
50
+ '--jini-mcpui-text-strong': defaultAdminTheme.light.text,
51
+ '--jini-mcpui-text-muted': defaultAdminTheme.light.muted,
52
+ '--jini-mcpui-text-soft': defaultAdminTheme.light.muted,
53
+ '--jini-mcpui-text-faint': defaultAdminTheme.light.muted,
54
+ '--jini-mcpui-accent': defaultAdminTheme.light.primary,
55
+ '--jini-mcpui-accent-strong': defaultAdminTheme.light.primary,
57
56
  // Desaturated and earthy, in the same family as the accent rather than a saturated pure red — a
58
57
  // destructive action should read as serious, not as an alarm the eye learns to discount.
59
- '--jini-mcpui-danger': '#a8443a',
58
+ '--jini-mcpui-danger': defaultAdminTheme.light.danger,
60
59
  '--jini-mcpui-radius-xs': '4px',
61
60
  '--jini-mcpui-radius-sm': '6px',
62
61
  '--jini-mcpui-radius-md': '8px',
63
62
  '--jini-mcpui-radius-lg': '10px',
64
63
  '--jini-mcpui-radius-xl': '12px',
65
64
  '--jini-mcpui-radius-pill': '999px',
66
- '--jini-mcpui-font': "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif",
67
- '--jini-mcpui-font-mono': "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
65
+ '--jini-mcpui-font': defaultAdminTheme.fonts.body,
66
+ '--jini-mcpui-font-mono': defaultAdminTheme.fonts.mono,
68
67
  };
69
68
  /**
70
69
  * The dark-scheme value for every token in {@link SURFACE_TOKENS}, keyed the same way and typed as
@@ -75,18 +74,18 @@ export const SURFACE_TOKENS = {
75
74
  * against exactly that omission.
76
75
  */
77
76
  export const SURFACE_TOKENS_DARK = {
78
- '--jini-mcpui-bg': '#1a1917',
79
- '--jini-mcpui-panel': '#222120',
80
- '--jini-mcpui-border': '#333128',
81
- '--jini-mcpui-border-strong': '#46433c',
82
- '--jini-mcpui-text': '#e8e4dc',
83
- '--jini-mcpui-text-strong': '#f2ede4',
84
- '--jini-mcpui-text-muted': '#9a9690',
85
- '--jini-mcpui-text-soft': '#6e6b65',
86
- '--jini-mcpui-text-faint': '#4e4b46',
87
- '--jini-mcpui-accent': '#d97a56',
88
- '--jini-mcpui-accent-strong': '#e8896a',
89
- '--jini-mcpui-danger': '#e0685f',
77
+ '--jini-mcpui-bg': defaultAdminTheme.dark.bg,
78
+ '--jini-mcpui-panel': defaultAdminTheme.dark.surface,
79
+ '--jini-mcpui-border': defaultAdminTheme.dark.border,
80
+ '--jini-mcpui-border-strong': defaultAdminTheme.dark.border,
81
+ '--jini-mcpui-text': defaultAdminTheme.dark.text,
82
+ '--jini-mcpui-text-strong': defaultAdminTheme.dark.text,
83
+ '--jini-mcpui-text-muted': defaultAdminTheme.dark.muted,
84
+ '--jini-mcpui-text-soft': defaultAdminTheme.dark.muted,
85
+ '--jini-mcpui-text-faint': defaultAdminTheme.dark.muted,
86
+ '--jini-mcpui-accent': defaultAdminTheme.dark.primary,
87
+ '--jini-mcpui-accent-strong': defaultAdminTheme.dark.primary,
88
+ '--jini-mcpui-danger': defaultAdminTheme.dark.danger,
90
89
  '--jini-mcpui-radius-xs': SURFACE_TOKENS['--jini-mcpui-radius-xs'],
91
90
  '--jini-mcpui-radius-sm': SURFACE_TOKENS['--jini-mcpui-radius-sm'],
92
91
  '--jini-mcpui-radius-md': SURFACE_TOKENS['--jini-mcpui-radius-md'],
@@ -102,10 +101,10 @@ export const SURFACE_TOKENS_DARK = {
102
101
  * which is the exact failure this indirection removes.
103
102
  */
104
103
  const DERIVED_TOKENS = {
105
- '--jini-mcpui-accent-hover': 'color-mix(in srgb, var(--jini-mcpui-accent) 88%, #000)',
104
+ '--jini-mcpui-accent-hover': 'color-mix(in srgb, var(--jini-mcpui-accent) 88%, var(--jini-mcpui-text))',
106
105
  '--jini-mcpui-accent-tint': 'color-mix(in srgb, var(--jini-mcpui-accent) 10%, transparent)',
107
106
  '--jini-mcpui-accent-ring': 'color-mix(in srgb, var(--jini-mcpui-accent) 35%, transparent)',
108
- '--jini-mcpui-danger-hover': 'color-mix(in srgb, var(--jini-mcpui-danger) 88%, #000)',
107
+ '--jini-mcpui-danger-hover': 'color-mix(in srgb, var(--jini-mcpui-danger) 88%, var(--jini-mcpui-text))',
109
108
  '--jini-mcpui-danger-tint': 'color-mix(in srgb, var(--jini-mcpui-danger) 10%, transparent)',
110
109
  '--jini-mcpui-danger-ring': 'color-mix(in srgb, var(--jini-mcpui-danger) 35%, transparent)',
111
110
  '--jini-mcpui-surface-shadow': '0 1px 2px color-mix(in srgb, var(--jini-mcpui-text) 8%, transparent)',
@@ -119,13 +118,12 @@ const DERIVED_TOKENS = {
119
118
  * itself is light. A drop shadow should stay dark ink at low opacity in both schemes, so this is a
120
119
  * fixed value the dark media block below applies as a second, later declaration of the same property.
121
120
  */
122
- const DARK_SURFACE_SHADOW = '0 1px 2px rgba(0, 0, 0, 0.32)';
121
+ const DARK_SURFACE_SHADOW = '0 1px 2px color-mix(in srgb, var(--jini-mcpui-bg) 32%, transparent)';
123
122
  /**
124
123
  * Whether every generated surface is pinned to the light palette regardless of the embedding
125
124
  * browser/OS's `prefers-color-scheme`.
126
125
  *
127
- * True today because the host product — currently this package's only consumer — has no real
128
- * light/dark toggle yet (`apps/admin`'s Appearance section is a disabled "SOON" placeholder), so a
126
+ * True by default because without an explicit app-level theme signal, a
129
127
  * surface that honors the OS preference doesn't track any actual app theme — it tracks whatever the
130
128
  * operator's OS happens to be set to, which produces a dark card floating in an always-light admin
131
129
  * UI. Flip this to `false` once the host product has a real app-level theme signal to forward in;
@@ -1,7 +1,7 @@
1
1
  export { DEFAULT_MEDIA_PROVIDER_CATALOG } from './constants.js';
2
2
  export { createFakeMediaProvidersPort, type FakeMediaProvidersPortOptions } from './dependencies.js';
3
3
  export type { MediaProvidersPort } from './ports.js';
4
- export { hasAnyConfiguredProvider, hasRecoverableFields, isEntryEmpty, isEntryPresent, isMarkerOnlyEntry, maskedKeyLabel, mergeDaemonProviders, resolveProviderBaseUrl, shouldSyncLocalProvidersToDaemon, sortProvidersByConfigured, } from './rules.js';
4
+ export { hasAnyConfiguredProvider, hasRecoverableFields, isEntryEmpty, isEntryPresent, isMarkerOnlyEntry, maskedKeyLabel, mergeDaemonProviders, resolveProviderBaseUrl, shouldSyncLocalProvidersToDaemon, sortProvidersByConfigured, isProviderBaseUrlInvalid, invalidBaseUrlProviderIds, } from './rules.js';
5
5
  export type { MediaProviderCredentials, MediaProviderMap, MediaProviderOption, MediaProvidersLoadState, MediaProvidersSaveState, } from './types.js';
6
6
  export { useMediaProvidersTab } from './react/hooks/useMediaProvidersTab.js';
7
7
  export type { MediaProviderEditPatch, UseMediaProvidersTabOptions, UseMediaProvidersTabResult, } from './react/hooks/useMediaProvidersTab.js';
@@ -1,6 +1,6 @@
1
1
  export { DEFAULT_MEDIA_PROVIDER_CATALOG } from './constants.js';
2
2
  export { createFakeMediaProvidersPort } from './dependencies.js';
3
- export { hasAnyConfiguredProvider, hasRecoverableFields, isEntryEmpty, isEntryPresent, isMarkerOnlyEntry, maskedKeyLabel, mergeDaemonProviders, resolveProviderBaseUrl, shouldSyncLocalProvidersToDaemon, sortProvidersByConfigured, } from './rules.js';
3
+ export { hasAnyConfiguredProvider, hasRecoverableFields, isEntryEmpty, isEntryPresent, isMarkerOnlyEntry, maskedKeyLabel, mergeDaemonProviders, resolveProviderBaseUrl, shouldSyncLocalProvidersToDaemon, sortProvidersByConfigured, isProviderBaseUrlInvalid, invalidBaseUrlProviderIds, } from './rules.js';
4
4
  export { useMediaProvidersTab } from './react/hooks/useMediaProvidersTab.js';
5
5
  export { MediaProvidersTab } from './react/components/MediaProvidersTab.js';
6
6
  //# sourceMappingURL=index.js.map
@@ -57,7 +57,7 @@ export function MediaProvidersTab({ port, catalog = DEFAULT_MEDIA_PROVIDER_CATAL
57
57
  };
58
58
  const orderedCatalog = sortProvidersByConfigured(catalog, providers, pinnedProviderIds);
59
59
  const providerHandles = agentHandle
60
- ? buildAgentListHandles(agentHandle, orderedCatalog.map((option) => option.id))
60
+ ? buildAgentListHandles({ prefix: agentHandle, ids: orderedCatalog.map((option) => option.id) })
61
61
  : undefined;
62
62
  // Membership check against the ALREADY-ORDERED result, not `pinnedProviderIds` directly: a
63
63
  // pinned id absent from `catalog` never appears in `orderedCatalog` either (see
@@ -68,7 +68,7 @@ export function MediaProvidersTab({ port, catalog = DEFAULT_MEDIA_PROVIDER_CATAL
68
68
  // Save writes every provider at once, so ONE unacceptable endpoint blocks the
69
69
  // whole button rather than being silently persisted alongside the good ones.
70
70
  const blockedByInvalidBaseUrl = invalidBaseUrlProviderIds(providers).length > 0;
71
- return (_jsxs("section", { className: "jini-settings-section jini-settings-media-providers", children: [_jsxs("div", { className: "jini-section-head", children: [_jsxs("div", { children: [_jsx("h4", { children: title }), _jsx("p", { className: "jini-hint", children: description })] }), _jsxs("button", { type: "button", className: "jini-button jini-button-ghost", onClick: reload, disabled: load.status === 'loading', ...agentHandleProps(agentHandle, { action: 'reload', role: 'button', label: reloadLabel }), children: [_jsx(Icon, { name: "refresh", size: 13 }), _jsx("span", { children: load.status === 'loading' ? reloadingLabel : reloadLabel })] })] }), load.status === 'unreachable' ? (_jsx("p", { className: "jini-hint jini-hint-error", role: "alert", children: unreachableLabel })) : null, !hasAnyConfigured ? _jsx("p", { className: "jini-hint", children: emptyStateLabel }) : null, _jsx("div", { className: "jini-media-provider-list", children: orderedCatalog.map((option, index) => {
71
+ return (_jsxs("section", { className: "jini-settings-section jini-settings-media-providers", children: [_jsxs("div", { className: "jini-section-head", children: [_jsxs("div", { children: [_jsx("h4", { children: title }), _jsx("p", { className: "jini-hint", children: description })] }), _jsxs("button", { type: "button", className: "jini-button jini-button-ghost", onClick: reload, disabled: load.status === 'loading', ...agentHandleProps({}, { base: agentHandle, ...({ action: 'reload', role: 'button', label: reloadLabel }) }), children: [_jsx(Icon, { name: "refresh", size: 13 }), _jsx("span", { children: load.status === 'loading' ? reloadingLabel : reloadLabel })] })] }), load.status === 'unreachable' ? (_jsx("p", { className: "jini-hint jini-hint-error", role: "alert", children: unreachableLabel })) : null, !hasAnyConfigured ? _jsx("p", { className: "jini-hint", children: emptyStateLabel }) : null, _jsx("div", { className: "jini-media-provider-list", children: orderedCatalog.map((option, index) => {
72
72
  const entry = providers[option.id] ?? {};
73
73
  const clearable = isEntryPresent(entry);
74
74
  const saved = isMarkerOnlyEntry(entry);
@@ -96,7 +96,7 @@ export function MediaProvidersTab({ port, catalog = DEFAULT_MEDIA_PROVIDER_CATAL
96
96
  credential-shaped fields, which is how a saved password gets autofilled into
97
97
  an API-key box. Same defect, same fix, same reasoning as
98
98
  `ByokProviderForm`'s own API-key input; see its comment. */
99
- autoComplete: "new-password", spellCheck: false, placeholder: saved ? maskedLabel : apiKeyPlaceholder, "aria-label": `${option.label} ${apiKeyLabel}`, value: entry.apiKey ?? '', onChange: (event) => updateProvider(option.id, { apiKey: event.target.value }), ...agentHandleProps(providerHandle, { action: 'api-key', role: 'field', label: `${option.label} ${apiKeyLabel}` }) }), _jsx("button", { type: "button", className: "jini-input-affix-btn", "aria-pressed": keyVisible, "aria-label": `${option.label} ${keyVisible ? hideKeyLabel : showKeyLabel}`, onClick: () => toggleKeyVisible(option.id), ...agentHandleProps(providerHandle, { action: 'reveal-key', role: 'button', label: `${option.label} ${showKeyLabel}` }), children: _jsx(Icon, { name: keyVisible ? 'eye-off' : 'eye', size: 14 }) })] }), _jsxs("label", { className: "jini-media-provider-field", children: [_jsx("span", { className: "jini-field-label jini-sr-only", children: baseUrlLabel }), _jsx("input", { className: "jini-input", type: "url", inputMode: "url", spellCheck: false, placeholder: option.defaultBaseUrl || baseUrlPlaceholder, "aria-label": `${option.label} ${baseUrlLabel}`, value: rawBaseUrl, "aria-invalid": baseUrlInvalid || undefined, onChange: (event) => updateProvider(option.id, { baseUrl: event.target.value }), ...agentHandleProps(providerHandle, { action: 'base-url', role: 'field', label: `${option.label} ${baseUrlLabel}` }) })] }), option.models && option.models.length > 0 ? (_jsxs("label", { className: "jini-media-provider-field", children: [_jsx("span", { className: "jini-field-label jini-sr-only", children: modelLabel }), _jsx("input", { className: "jini-input", list: modelListId, spellCheck: false, placeholder: modelPlaceholder, "aria-label": `${option.label} ${modelLabel}`, value: entry.model ?? '', onChange: (event) => updateProvider(option.id, { model: event.target.value }), ...agentHandleProps(providerHandle, { action: 'model', role: 'field', label: `${option.label} ${modelLabel}` }) }), _jsx("datalist", { id: modelListId, children: option.models.map((model) => (_jsx("option", { value: model }, model))) })] })) : null, _jsx("button", { type: "button", className: "jini-button jini-button-ghost", disabled: !clearable, "aria-label": `${option.label} ${clearLabel}`, onClick: () => clearProvider(option.id), ...agentHandleProps(providerHandle, { action: 'clear', role: 'button', label: `${option.label} ${clearLabel}` }), children: clearLabel })] }), baseUrlInvalid ? (_jsx("span", { className: "jini-field-hint jini-hint-error", role: "alert", children: baseUrlInvalidLabel })) : !rawBaseUrl.trim() && effectiveBaseUrl ? (_jsx("span", { className: "jini-field-hint", children: t(baseUrlDefaultHintTemplate, { url: effectiveBaseUrl }) })) : null] })] }, option.id));
100
- }) }), _jsxs("div", { className: "jini-media-provider-save-row", children: [_jsx("button", { type: "button", className: "jini-button", onClick: saveChanges, disabled: save.status === 'saving' || !hasPendingChanges || blockedByInvalidBaseUrl, ...agentHandleProps(agentHandle, { action: 'save', role: 'button', label: saveChangesLabel }), children: save.status === 'saving' ? savingLabel : saveChangesLabel }), save.status === 'saved' ? (_jsx("span", { className: "jini-hint", role: "status", children: savedNoticeLabel })) : null, save.status === 'save-error' ? (_jsx("span", { className: "jini-hint jini-hint-error", role: "alert", children: saveErrorLabel })) : null] })] }));
99
+ autoComplete: "new-password", spellCheck: false, placeholder: saved ? maskedLabel : apiKeyPlaceholder, "aria-label": `${option.label} ${apiKeyLabel}`, value: entry.apiKey ?? '', onChange: (event) => updateProvider(option.id, { apiKey: event.target.value }), ...agentHandleProps({}, { base: providerHandle, ...({ action: 'api-key', role: 'field', label: `${option.label} ${apiKeyLabel}` }) }) }), _jsx("button", { type: "button", className: "jini-input-affix-btn", "aria-pressed": keyVisible, "aria-label": `${option.label} ${keyVisible ? hideKeyLabel : showKeyLabel}`, onClick: () => toggleKeyVisible(option.id), ...agentHandleProps({}, { base: providerHandle, ...({ action: 'reveal-key', role: 'button', label: `${option.label} ${showKeyLabel}` }) }), children: _jsx(Icon, { name: keyVisible ? 'eye-off' : 'eye', size: 14 }) })] }), _jsxs("label", { className: "jini-media-provider-field", children: [_jsx("span", { className: "jini-field-label jini-sr-only", children: baseUrlLabel }), _jsx("input", { className: "jini-input", type: "url", inputMode: "url", spellCheck: false, placeholder: option.defaultBaseUrl || baseUrlPlaceholder, "aria-label": `${option.label} ${baseUrlLabel}`, value: rawBaseUrl, "aria-invalid": baseUrlInvalid || undefined, onChange: (event) => updateProvider(option.id, { baseUrl: event.target.value }), ...agentHandleProps({}, { base: providerHandle, ...({ action: 'base-url', role: 'field', label: `${option.label} ${baseUrlLabel}` }) }) })] }), option.models && option.models.length > 0 ? (_jsxs("label", { className: "jini-media-provider-field", children: [_jsx("span", { className: "jini-field-label jini-sr-only", children: modelLabel }), _jsx("input", { className: "jini-input", list: modelListId, spellCheck: false, placeholder: modelPlaceholder, "aria-label": `${option.label} ${modelLabel}`, value: entry.model ?? '', onChange: (event) => updateProvider(option.id, { model: event.target.value }), ...agentHandleProps({}, { base: providerHandle, ...({ action: 'model', role: 'field', label: `${option.label} ${modelLabel}` }) }) }), _jsx("datalist", { id: modelListId, children: option.models.map((model) => (_jsx("option", { value: model }, model))) })] })) : null, _jsx("button", { type: "button", className: "jini-button jini-button-ghost", disabled: !clearable, "aria-label": `${option.label} ${clearLabel}`, onClick: () => clearProvider(option.id), ...agentHandleProps({}, { base: providerHandle, ...({ action: 'clear', role: 'button', label: `${option.label} ${clearLabel}` }) }), children: clearLabel })] }), baseUrlInvalid ? (_jsx("span", { className: "jini-field-hint jini-hint-error", role: "alert", children: baseUrlInvalidLabel })) : !rawBaseUrl.trim() && effectiveBaseUrl ? (_jsx("span", { className: "jini-field-hint", children: t(baseUrlDefaultHintTemplate, { url: effectiveBaseUrl }) })) : null] })] }, option.id));
100
+ }) }), _jsxs("div", { className: "jini-media-provider-save-row", children: [_jsx("button", { type: "button", className: "jini-button", onClick: saveChanges, disabled: save.status === 'saving' || !hasPendingChanges || blockedByInvalidBaseUrl, ...agentHandleProps({}, { base: agentHandle, ...({ action: 'save', role: 'button', label: saveChangesLabel }) }), children: save.status === 'saving' ? savingLabel : saveChangesLabel }), save.status === 'saved' ? (_jsx("span", { className: "jini-hint", role: "status", children: savedNoticeLabel })) : null, save.status === 'save-error' ? (_jsx("span", { className: "jini-hint jini-hint-error", role: "alert", children: saveErrorLabel })) : null] })] }));
101
101
  }
102
102
  //# sourceMappingURL=MediaProvidersTab.js.map
@@ -155,7 +155,7 @@ export function isProviderBaseUrlInvalid(entry) {
155
155
  const typed = entry?.baseUrl?.trim();
156
156
  if (!typed)
157
157
  return false;
158
- return !isAllowedEndpointUrl(typed);
158
+ return !isAllowedEndpointUrl({ raw: typed });
159
159
  }
160
160
  /** Every provider id in the map whose typed base URL is unacceptable — the save gate's input. */
161
161
  export function invalidBaseUrlProviderIds(providers) {
@@ -18,7 +18,7 @@
18
18
  * useMemoryConfig's hydrate() — invalidate() was only called at toggle
19
19
  * start, not in the write's onSettled callback — before being caught in
20
20
  * review and fixed. Ported with that fix already applied — see
21
- * `packages/ui/source-map.md`.)
21
+ * `packages/ui/archived provenance ledger`.)
22
22
  */
23
23
  export interface AsyncCommitGuard {
24
24
  begin: () => number;
@@ -27,7 +27,7 @@ export declare function connectorAppLabel(connectorId: string): string | undefin
27
27
  /**
28
28
  * Placeholder `provider` label for a memory-connector catalogue row this
29
29
  * client has only an id for (no full connector detail has loaded yet).
30
- * The pinned source hardcoded `'composio'` here — that's a specific
30
+ * The pinned source hardcoded `'connector-provider'` here — that's a specific
31
31
  * third-party OAuth-integration vendor OD's real deployment happens to use,
32
32
  * not a generic concept, so this package uses a neutral placeholder instead;
33
33
  * a host resolving real connector details overwrites it via
@@ -65,7 +65,7 @@ export function connectorAppLabel(connectorId) {
65
65
  /**
66
66
  * Placeholder `provider` label for a memory-connector catalogue row this
67
67
  * client has only an id for (no full connector detail has loaded yet).
68
- * The pinned source hardcoded `'composio'` here — that's a specific
68
+ * The pinned source hardcoded `'connector-provider'` here — that's a specific
69
69
  * third-party OAuth-integration vendor OD's real deployment happens to use,
70
70
  * not a generic concept, so this package uses a neutral placeholder instead;
71
71
  * a host resolving real connector details overwrites it via
@@ -1,29 +1,17 @@
1
1
  import type { Connector } from '../connectors/types.js';
2
2
  import type { MemoryConfigPort, MemoryConnectorsPort, MemoryEntriesPort, MemoryExtractionsPort } from './ports.js';
3
3
  import type { ConnectorMemorySuggestionResponse, MemoryListResponse } from './types.js';
4
- export declare const memoryConfigPort: MemoryConfigPort;
5
- /**
6
- * `entries` drives the saved-memory list; `rootDir`/`index`/`enabled` are
7
- * consumed directly (no fallback) by `useMemoryEntries.reload()` and
8
- * `useMemoryConfig.hydrate()`.
9
- *
10
- * BUG FIX (ported from the pinned source with this fix applied — see
11
- * `packages/ui/source-map.md`): the pinned source validated only `entries`
12
- * here, even though `hydrate()`/`reload()` read `enabled`/`rootDir`/`index`
13
- * off this same response with no fallback. A malformed `200` like
14
- * `{ entries: [] }` passed validation and then silently hydrated those other
15
- * fields to `undefined`. Fixed the same way `fetchMemoryEntry()` below
16
- * already handles a missing required field: validate every field this
17
- * shared read path's callers actually trust unconditionally, and throw
18
- * instead of returning a response that looks like a legitimate empty state.
19
- * The four per-hook flags are deliberately NOT added to this list — they
20
- * keep their own established legacy-default semantics in `hydrate()`
21
- * (`list.xEnabled !== false`), so their absence is intentionally not a
22
- * transport failure.
23
- */
24
- export declare function fetchMemoryList(): Promise<MemoryListResponse>;
25
- export declare const memoryEntriesPort: MemoryEntriesPort;
26
- export declare const memoryExtractionsPort: MemoryExtractionsPort;
4
+ /** Build the real REST ports with one native fetch binding; defaults remain browser-owned. */
5
+ export declare function createMemoryHttpPorts(_required: Record<string, never>, { fetch }?: {
6
+ fetch?: typeof globalThis.fetch;
7
+ }): {
8
+ config: MemoryConfigPort;
9
+ entries: MemoryEntriesPort;
10
+ extractions: MemoryExtractionsPort;
11
+ };
12
+ export declare const memoryConfigPort: MemoryConfigPort, memoryEntriesPort: MemoryEntriesPort, memoryExtractionsPort: MemoryExtractionsPort;
13
+ /** Standalone default read shares the entries port's validated REST implementation. */
14
+ export declare const fetchMemoryList: () => Promise<MemoryListResponse>;
27
15
  export interface FakeMemoryConnectorsPortOptions {
28
16
  connectors?: Connector[];
29
17
  suggestionResponse?: ConnectorMemorySuggestionResponse | null;