@kortix/ui 0.14.8 → 0.14.9

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 (528) hide show
  1. package/README.md +2 -2
  2. package/dist/_vendor/kortix-shared.js +63 -3
  3. package/dist/_vendor/shared/app-config.d.ts +175 -0
  4. package/dist/_vendor/shared/channel-message.d.ts +34 -5
  5. package/dist/_vendor/shared/index.d.ts +1 -0
  6. package/dist/_vendor/shared/space-slug.d.ts +37 -0
  7. package/dist/access/access/access-detail-shell.js +1 -1
  8. package/dist/access/access/principal-picker.d.ts +11 -0
  9. package/dist/access/access/principal-picker.js +3 -2
  10. package/dist/apps/app-preview-pool.d.ts +7 -2
  11. package/dist/apps/app-preview-pool.js +11 -5
  12. package/dist/apps/app-shared.d.ts +22 -15
  13. package/dist/apps/app-shared.js +37 -19
  14. package/dist/apps/index.d.ts +2 -2
  15. package/dist/apps/index.js +2 -2
  16. package/dist/artifacts/artifact-frame.d.ts +16 -0
  17. package/dist/artifacts/artifact-frame.js +51 -0
  18. package/dist/artifacts/artifact-session.d.ts +18 -0
  19. package/dist/artifacts/artifact-session.js +101 -0
  20. package/dist/artifacts/frame-policy.d.ts +30 -0
  21. package/dist/artifacts/frame-policy.js +61 -0
  22. package/dist/artifacts/index.d.ts +3 -0
  23. package/dist/artifacts/index.js +5 -0
  24. package/dist/browser/sandbox-browser-chrome.d.ts +4 -1
  25. package/dist/browser/sandbox-browser-chrome.js +2 -2
  26. package/dist/customize/agents/agent-grant-pages.d.ts +5 -1
  27. package/dist/customize/agents/agent-grant-pages.js +30 -4
  28. package/dist/customize/agents/agent-page.js +3 -1
  29. package/dist/customize/agents/agent-policy-sets.d.ts +43 -0
  30. package/dist/customize/agents/agent-policy-sets.js +72 -0
  31. package/dist/customize/agents/agent-triggers-section.js +2 -1
  32. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.d.ts +6 -1
  33. package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.js +10 -4
  34. package/dist/customize/connectors/agent-access.d.ts +35 -0
  35. package/dist/customize/connectors/agent-access.js +77 -0
  36. package/dist/customize/connectors/catalog/browse-sections.d.ts +2 -29
  37. package/dist/customize/connectors/catalog/browse-sections.js +7 -74
  38. package/dist/customize/connectors/catalog/catalog-entry.d.ts +18 -37
  39. package/dist/customize/connectors/catalog/catalog-entry.js +28 -40
  40. package/dist/customize/connectors/catalog/connector-browse.d.ts +3 -32
  41. package/dist/customize/connectors/catalog/connector-browse.js +19 -50
  42. package/dist/customize/connectors/catalog/use-catalog.d.ts +20 -59
  43. package/dist/customize/connectors/catalog/use-catalog.js +48 -175
  44. package/dist/customize/connectors/connector-identity.d.ts +9 -11
  45. package/dist/customize/connectors/connector-identity.js +13 -42
  46. package/dist/customize/connectors/connector-moves-banner.d.ts +2 -1
  47. package/dist/customize/connectors/connector-moves-banner.js +4 -6
  48. package/dist/customize/connectors/connector-routes.d.ts +21 -9
  49. package/dist/customize/connectors/connector-routes.js +29 -20
  50. package/dist/customize/connectors/connectors-page.js +53 -82
  51. package/dist/customize/connectors/detail/app-page.js +226 -98
  52. package/dist/customize/connectors/detail/computer-app-page.d.ts +16 -0
  53. package/dist/customize/connectors/detail/computer-app-page.js +39 -0
  54. package/dist/customize/connectors/detail/connector-accounts.js +3 -1
  55. package/dist/customize/connectors/detail/connector-advanced-tools.d.ts +4 -1
  56. package/dist/customize/connectors/detail/connector-advanced-tools.js +2 -2
  57. package/dist/customize/connectors/detail/connector-agents.d.ts +14 -0
  58. package/dist/customize/connectors/detail/connector-agents.js +69 -0
  59. package/dist/customize/connectors/detail/connector-detail-tabs.js +2 -1
  60. package/dist/customize/connectors/detail/connector-move-row.d.ts +8 -5
  61. package/dist/customize/connectors/detail/connector-move-row.js +23 -14
  62. package/dist/customize/connectors/detail/connector-page.d.ts +4 -1
  63. package/dist/customize/connectors/detail/connector-page.js +14 -10
  64. package/dist/customize/connectors/detail/connector-policy-sets.d.ts +28 -0
  65. package/dist/customize/connectors/detail/connector-policy-sets.js +203 -0
  66. package/dist/customize/connectors/detail/connector-settings.d.ts +4 -1
  67. package/dist/customize/connectors/detail/connector-settings.js +7 -3
  68. package/dist/customize/connectors/detail/connector-status.d.ts +19 -6
  69. package/dist/customize/connectors/detail/connector-status.js +34 -10
  70. package/dist/customize/connectors/detail/connector-tabs.d.ts +4 -1
  71. package/dist/customize/connectors/detail/connector-tabs.js +8 -2
  72. package/dist/customize/connectors/detail/connector-tools.d.ts +3 -3
  73. package/dist/customize/connectors/detail/connector-tools.js +105 -48
  74. package/dist/customize/connectors/detail/email-inboxes.d.ts +43 -0
  75. package/dist/customize/connectors/detail/email-inboxes.js +184 -0
  76. package/dist/customize/connectors/detail/provider-info.d.ts +1 -1
  77. package/dist/customize/connectors/detail/provider-info.js +2 -2
  78. package/dist/customize/connectors/detail/status-badge.d.ts +1 -1
  79. package/dist/customize/connectors/detail/status-badge.js +4 -5
  80. package/dist/customize/connectors/detail/use-connector-detail.d.ts +6 -0
  81. package/dist/customize/connectors/detail/use-connector-detail.js +14 -4
  82. package/dist/customize/connectors/install/install-dialog.d.ts +23 -0
  83. package/dist/customize/connectors/install/install-dialog.js +40 -0
  84. package/dist/customize/connectors/install/install.d.ts +13 -2
  85. package/dist/customize/connectors/install/install.js +9 -4
  86. package/dist/customize/connectors/install/use-install.d.ts +19 -2
  87. package/dist/customize/connectors/install/use-install.js +65 -37
  88. package/dist/customize/connectors/install/way-kind.d.ts +5 -0
  89. package/dist/customize/connectors/install/way-kind.js +16 -0
  90. package/dist/customize/connectors/provider-label.d.ts +2 -1
  91. package/dist/customize/connectors/provider-label.js +13 -3
  92. package/dist/customize/connectors/tools/pattern-rule-draft.d.ts +4 -0
  93. package/dist/customize/connectors/tools/pattern-rule-draft.js +12 -3
  94. package/dist/customize/connectors/tools/policy-sets.d.ts +27 -0
  95. package/dist/customize/connectors/tools/policy-sets.js +41 -0
  96. package/dist/customize/connectors/tools/tool-groups.d.ts +32 -9
  97. package/dist/customize/connectors/tools/tool-groups.js +78 -16
  98. package/dist/customize/connectors/tools/tool-policy-control.d.ts +11 -10
  99. package/dist/customize/connectors/tools/tool-policy-control.js +15 -16
  100. package/dist/customize/connectors/tools/tool-policy-labels.d.ts +6 -5
  101. package/dist/customize/connectors/tools/tool-policy-labels.js +17 -16
  102. package/dist/customize/connectors/tools/tool-policy.d.ts +50 -4
  103. package/dist/customize/connectors/tools/tool-policy.js +74 -8
  104. package/dist/customize/connectors/use-agent-access.d.ts +85 -0
  105. package/dist/customize/connectors/use-agent-access.js +72 -0
  106. package/dist/customize/migrate-to-v2/index.d.ts +1 -2
  107. package/dist/customize/migrate-to-v2/index.js +1 -2
  108. package/dist/customize/migrate-to-v2/migration-prompt.d.ts +12 -25
  109. package/dist/customize/migrate-to-v2/migration-prompt.js +34 -236
  110. package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +1 -1
  111. package/dist/customize/migrate-to-v2/upgrade-defs.js +7 -6
  112. package/dist/customize/migrate-to-v2/upgrade-view.js +7 -7
  113. package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +3 -3
  114. package/dist/customize/providers/provider-accordion.js +17 -2
  115. package/dist/customize/sections/component/channel-access-panel.d.ts +16 -0
  116. package/dist/customize/sections/component/channel-access-panel.js +146 -0
  117. package/dist/customize/sections/component/channel-connect-hero.d.ts +3 -2
  118. package/dist/customize/sections/component/channel-connect-hero.js +3 -2
  119. package/dist/customize/sections/component/channel-hero-frame.d.ts +31 -0
  120. package/dist/customize/sections/component/channel-hero-frame.js +40 -0
  121. package/dist/customize/sections/component/channel-mocks.d.ts +6 -0
  122. package/dist/customize/sections/component/channel-mocks.js +46 -0
  123. package/dist/customize/sections/component/channel-row.d.ts +13 -3
  124. package/dist/customize/sections/component/channel-row.js +10 -4
  125. package/dist/customize/sections/component/email-connect-form.d.ts +27 -0
  126. package/dist/customize/sections/component/email-connect-form.js +183 -0
  127. package/dist/customize/sections/component/slack-connect-card.d.ts +7 -0
  128. package/dist/customize/sections/component/slack-connect-card.js +2 -3
  129. package/dist/customize/sections/component/teams-connect-card.d.ts +7 -0
  130. package/dist/customize/sections/component/teams-connect-card.js +2 -3
  131. package/dist/customize/sections/component/telegram-channel-row.js +16 -25
  132. package/dist/customize/sections/connectors-view.d.ts +1 -15
  133. package/dist/customize/sections/connectors-view.js +81 -314
  134. package/dist/customize/sections/view/agent-editor-catalog.js +5 -0
  135. package/dist/customize/sections/view/channels-view.d.ts +5 -1
  136. package/dist/customize/sections/view/channels-view.js +61 -75
  137. package/dist/customize/sections/view/gateway/gateway-overview.js +10 -2
  138. package/dist/customize/settings/tabs/experimental-tab.js +35 -16
  139. package/dist/customize/shared/catalog/catalog-empty-state.d.ts +1 -12
  140. package/dist/customize/shared/catalog/catalog-empty-state.js +3 -3
  141. package/dist/customize/shared/channels-switch-dialog.d.ts +18 -0
  142. package/dist/customize/shared/channels-switch-dialog.js +30 -0
  143. package/dist/customize/shared/feature-gate-screen.js +27 -9
  144. package/dist/customize/shared/use-customize-prefetch.d.ts +2 -3
  145. package/dist/customize/shared/use-customize-prefetch.js +9 -27
  146. package/dist/customize/triggers/schedule/post-to-field.d.ts +18 -0
  147. package/dist/customize/triggers/schedule/post-to-field.js +49 -0
  148. package/dist/customize/triggers/schedule/schedule-copy.d.ts +10 -6
  149. package/dist/customize/triggers/schedule/schedule-copy.js +42 -11
  150. package/dist/customize/triggers/schedule/schedule-detail-sheet.js +2 -1
  151. package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +22 -0
  152. package/dist/customize/triggers/schedule/trigger-composer-logic.js +25 -0
  153. package/dist/customize/triggers/schedule/trigger-composer.d.ts +5 -0
  154. package/dist/customize/triggers/schedule/trigger-composer.js +23 -14
  155. package/dist/customize/triggers/schedule/trigger-edit-logic.js +3 -0
  156. package/dist/customize/triggers/schedule/trigger-filter.js +1 -1
  157. package/dist/customize/triggers/schedule/trigger-runs-logic.d.ts +2 -2
  158. package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
  159. package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
  160. package/dist/customize/triggers/schedule-view.js +5 -2
  161. package/dist/files/index.d.ts +1 -0
  162. package/dist/files/index.js +1 -0
  163. package/dist/files/project/change-request-recovery.d.ts +1 -26
  164. package/dist/files/project/change-request-recovery.js +1 -59
  165. package/dist/files/project/components/change-request-detail-dialog.js +13 -3
  166. package/dist/files/project/components/drive-explorer.js +15 -15
  167. package/dist/files/project/components/drive-toolbar.d.ts +16 -2
  168. package/dist/files/project/components/drive-toolbar.js +14 -5
  169. package/dist/files/project/hooks/use-change-request-recovery.js +3 -19
  170. package/dist/files/project/hooks/use-change-requests.d.ts +1 -0
  171. package/dist/files/project/hooks/use-change-requests.js +11 -2
  172. package/dist/files/renderers/image-frame.d.ts +46 -0
  173. package/dist/files/renderers/image-frame.js +59 -0
  174. package/dist/files/renderers/image-renderer.d.ts +11 -1
  175. package/dist/files/renderers/image-renderer.js +13 -3
  176. package/dist/files/renderers/pdf/pdf-clipboard.d.ts +2 -0
  177. package/dist/files/renderers/pdf/pdf-clipboard.js +21 -0
  178. package/dist/files/renderers/pdf/pdf-viewer.js +4 -2
  179. package/dist/files/renderers/show-content-renderer.d.ts +9 -1
  180. package/dist/files/renderers/show-content-renderer.js +56 -14
  181. package/dist/files/runtime/file-source.js +2 -0
  182. package/dist/files/runtime/hooks/use-binary-blob.d.ts +10 -1
  183. package/dist/files/runtime/hooks/use-binary-blob.js +10 -4
  184. package/dist/files/runtime/hooks/use-shared-image.d.ts +41 -0
  185. package/dist/files/runtime/hooks/use-shared-image.js +177 -0
  186. package/dist/files/viewer/file-content-renderer.d.ts +22 -1
  187. package/dist/files/viewer/file-content-renderer.js +50 -7
  188. package/dist/files/viewer/file-header.d.ts +7 -3
  189. package/dist/files/viewer/file-header.js +20 -11
  190. package/dist/files/viewer/file-preview-modal.d.ts +1 -1
  191. package/dist/files/viewer/file-preview-modal.js +10 -22
  192. package/dist/files/viewer/file-source.d.ts +13 -0
  193. package/dist/files/viewer/use-file-content-state.d.ts +2 -0
  194. package/dist/files/viewer/use-file-content-state.js +28 -10
  195. package/dist/files/viewer/viewer-actions.d.ts +3 -1
  196. package/dist/files/viewer/viewer-actions.js +2 -2
  197. package/dist/hooks/use-media-query.d.ts +1 -0
  198. package/dist/hooks/use-mobile.d.ts +5 -0
  199. package/dist/hooks/use-mobile.js +8 -0
  200. package/dist/i18n/en.d.ts +873 -85
  201. package/dist/i18n/en.js +888 -100
  202. package/dist/i18n/ui-catalog/localize-ui-catalog.js +4 -0
  203. package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +15 -3
  204. package/dist/index.d.ts +2 -2
  205. package/dist/index.js +2 -2
  206. package/dist/internal/account-hub/account-settings-sidebar.js +1 -1
  207. package/dist/internal/account-hub/hub-sheet.d.ts +9 -1
  208. package/dist/internal/account-hub/hub-sheet.js +21 -5
  209. package/dist/internal/account-hub/sections.d.ts +1 -1
  210. package/dist/internal/account-hub/sections.js +2 -1
  211. package/dist/internal/auth/auth-card-shell.js +3 -3
  212. package/dist/internal/components/agent-mark.js +5 -2
  213. package/dist/internal/connector-logo/connector-logo-source.d.ts +63 -0
  214. package/dist/internal/connector-logo/connector-logo-source.js +48 -0
  215. package/dist/internal/connector-logo/connector-logo.d.ts +39 -0
  216. package/dist/internal/connector-logo/connector-logo.js +56 -0
  217. package/dist/internal/connector-logo/connector-mark-files.d.ts +11 -0
  218. package/dist/internal/connector-logo/connector-mark-files.js +35 -0
  219. package/dist/internal/files/file-read-retry.d.ts +13 -0
  220. package/dist/internal/files/file-read-retry.js +23 -3
  221. package/dist/internal/files/session-drive-files.d.ts +5 -1
  222. package/dist/internal/files/session-drive-files.js +7 -2
  223. package/dist/internal/hooks/channels/use-channels-installations.d.ts +32 -5
  224. package/dist/internal/hooks/channels/use-channels-installations.js +55 -7
  225. package/dist/internal/hooks/channels/use-email-inboxes.d.ts +19 -0
  226. package/dist/internal/hooks/channels/use-email-inboxes.js +48 -0
  227. package/dist/internal/hooks/connectors/use-add-account.js +1 -1
  228. package/dist/internal/hooks/index.d.ts +1 -1
  229. package/dist/internal/hooks/index.js +1 -1
  230. package/dist/internal/hooks/projects/use-new-project-session.d.ts +9 -0
  231. package/dist/internal/hooks/projects/use-new-project-session.js +28 -12
  232. package/dist/internal/hooks/use-auto-scroll.d.ts +8 -1
  233. package/dist/internal/hooks/use-auto-scroll.js +4 -4
  234. package/dist/internal/icons/telegram.d.ts +5 -0
  235. package/dist/internal/icons/telegram.js +6 -1
  236. package/dist/internal/layout/nav-hover-card.d.ts +35 -0
  237. package/dist/internal/layout/nav-hover-card.js +84 -0
  238. package/dist/internal/layout/project-nav-row.d.ts +3 -1
  239. package/dist/internal/layout/project-nav-row.js +3 -2
  240. package/dist/internal/layout/project-page-header.d.ts +4 -2
  241. package/dist/internal/layout/project-page-header.js +4 -3
  242. package/dist/internal/layout/project-settings-nav.js +59 -2
  243. package/dist/internal/lib/browser-error-noise.d.ts +1 -1
  244. package/dist/internal/lib/browser-error-noise.js +1 -1
  245. package/dist/internal/lib/browser-noise/rules/injected-scripts.d.ts +7 -0
  246. package/dist/internal/lib/browser-noise/rules/injected-scripts.js +15 -0
  247. package/dist/internal/lib/manifest-version.d.ts +1 -1
  248. package/dist/internal/lib/manifest-version.js +2 -2
  249. package/dist/internal/lib/memory-href.d.ts +16 -0
  250. package/dist/internal/lib/memory-href.js +46 -0
  251. package/dist/internal/lib/use-project-feature-flags.js +9 -9
  252. package/dist/internal/lib/utils/heic-convert.d.ts +1 -1
  253. package/dist/internal/lib/utils/heic-convert.js +3 -4
  254. package/dist/internal/lib/web-notifications.d.ts +20 -0
  255. package/dist/internal/lib/web-notifications.js +48 -4
  256. package/dist/internal/notifications/notification-bell.d.ts +4 -1
  257. package/dist/internal/notifications/notification-bell.js +2 -2
  258. package/dist/internal/selection/selection-bar.d.ts +2 -1
  259. package/dist/internal/selection/selection-bar.js +1 -1
  260. package/dist/internal/stores/file-preview-store.d.ts +29 -2
  261. package/dist/internal/stores/file-preview-store.js +19 -1
  262. package/dist/internal/stores/kortix-computer-store.js +3 -0
  263. package/dist/internal/stores/sidebar-nav-store.d.ts +1 -1
  264. package/dist/internal/stores/sidebar-nav-store.js +3 -1
  265. package/dist/lib/routes.d.ts +13 -1
  266. package/dist/lib/routes.js +13 -0
  267. package/dist/markdown/index.d.ts +2 -1
  268. package/dist/markdown/index.js +2 -1
  269. package/dist/markdown/setup-links/approval-decision.d.ts +1 -0
  270. package/dist/markdown/setup-links/approval-decision.js +6 -2
  271. package/dist/markdown/setup-links/connector-handshake.d.ts +3 -1
  272. package/dist/markdown/setup-links/connector-handshake.js +12 -10
  273. package/dist/markdown/setup-links/secret-intake-form.d.ts +0 -10
  274. package/dist/markdown/setup-links/secret-intake-form.js +1 -1
  275. package/dist/markdown/setup-links/show-connect-hero.d.ts +28 -0
  276. package/dist/markdown/setup-links/show-connect-hero.js +91 -0
  277. package/dist/markdown/unified-markdown.js +5 -5
  278. package/dist/primitives/badge.d.ts +1 -1
  279. package/dist/primitives/badge.js +2 -0
  280. package/dist/primitives/disclosure.js +14 -2
  281. package/dist/primitives/empty-art.d.ts +12 -0
  282. package/dist/primitives/empty-art.js +11 -0
  283. package/dist/primitives/mermaid-renderer.d.ts +2 -0
  284. package/dist/primitives/mermaid-renderer.js +21 -15
  285. package/dist/primitives/resizable.js +6 -1
  286. package/dist/primitives/resize-seam.d.ts +11 -0
  287. package/dist/primitives/resize-seam.js +12 -0
  288. package/dist/primitives/sidebar-panel.js +4 -7
  289. package/dist/primitives/tabs.d.ts +14 -1
  290. package/dist/primitives/tabs.js +1 -1
  291. package/dist/providers/ui-provider.d.ts +9 -0
  292. package/dist/session/composer/ComposerAboveCard.d.ts +1 -1
  293. package/dist/session/composer/ComposerAboveCard.js +2 -2
  294. package/dist/session/composer/ComposerCard.d.ts +1 -1
  295. package/dist/session/composer/ComposerCard.js +3 -3
  296. package/dist/session/composer/agent-selector.d.ts +13 -1
  297. package/dist/session/composer/agent-selector.js +25 -5
  298. package/dist/session/composer/composer-agent-access.d.ts +15 -0
  299. package/dist/session/composer/composer-agent-access.js +27 -0
  300. package/dist/session/composer/composer-chat-input.d.ts +8 -2
  301. package/dist/session/composer/composer-chat-input.js +8 -6
  302. package/dist/session/composer/composer-logic.d.ts +16 -0
  303. package/dist/session/composer/composer-logic.js +12 -0
  304. package/dist/session/composer/composer-underbar.d.ts +3 -1
  305. package/dist/session/composer/composer-underbar.js +4 -3
  306. package/dist/session/composer/composer.d.ts +15 -1
  307. package/dist/session/composer/composer.js +19 -1
  308. package/dist/session/composer/draft/composer-draft.d.ts +6 -2
  309. package/dist/session/composer/draft/composer-draft.js +5 -1
  310. package/dist/session/composer/reasoning-effort-selector.js +1 -1
  311. package/dist/session/models/chatgpt-connection-button.d.ts +11 -0
  312. package/dist/session/models/chatgpt-connection-button.js +54 -0
  313. package/dist/session/models/model-selector.js +5 -2
  314. package/dist/session/models/use-model-connection-gate.d.ts +5 -5
  315. package/dist/session/models/use-model-connection-gate.js +5 -5
  316. package/dist/session/outcomes/jump-to-outcome.d.ts +10 -0
  317. package/dist/session/outcomes/jump-to-outcome.js +11 -0
  318. package/dist/session/outcomes/session-outcomes-bridge.d.ts +14 -0
  319. package/dist/session/outcomes/session-outcomes-bridge.js +12 -0
  320. package/dist/session/outcomes/session-outcomes-provider.d.ts +3 -1
  321. package/dist/session/outcomes/session-outcomes-provider.js +33 -3
  322. package/dist/session/panel/easy/app-preview.d.ts +10 -0
  323. package/dist/session/panel/easy/app-preview.js +31 -12
  324. package/dist/session/panel/easy/change-requests-card.d.ts +7 -0
  325. package/dist/session/panel/easy/change-requests-card.js +17 -0
  326. package/dist/session/panel/easy/easy-panel-logic.js +7 -1
  327. package/dist/session/panel/easy/easy-panel.js +5 -2
  328. package/dist/session/panel/easy/file-preview.js +1 -1
  329. package/dist/session/panel/easy/outputs-card.d.ts +2 -1
  330. package/dist/session/panel/easy/outputs-card.js +3 -2
  331. package/dist/session/panel/mobile-tool-drawer.js +7 -1
  332. package/dist/session/panel/session-audit-panel.js +9 -2
  333. package/dist/session/panel/session-detail-panel.js +9 -3
  334. package/dist/session/panel/session-files-explorer.d.ts +9 -0
  335. package/dist/session/panel/session-files-explorer.js +12 -3
  336. package/dist/session/panel/session-panel-provider.d.ts +15 -1
  337. package/dist/session/panel/session-panel-provider.js +32 -7
  338. package/dist/session/panel/shared/derive-panels.d.ts +8 -1
  339. package/dist/session/panel/shared/derive-panels.js +12 -2
  340. package/dist/session/panel/shared/output-priority.js +2 -0
  341. package/dist/session/participants/session-participants.d.ts +5 -1
  342. package/dist/session/participants/session-participants.js +9 -2
  343. package/dist/session/prompts/approval-request.d.ts +5 -0
  344. package/dist/session/prompts/approval-request.js +7 -1
  345. package/dist/session/prompts/session-approval-review.d.ts +9 -0
  346. package/dist/session/prompts/session-approval-review.js +18 -0
  347. package/dist/session/status/session-error-banner.js +2 -49
  348. package/dist/session/status/session-starting-loader.d.ts +14 -2
  349. package/dist/session/status/session-starting-loader.js +16 -4
  350. package/dist/session/thread/after-first-prompt.d.ts +7 -0
  351. package/dist/session/thread/after-first-prompt.js +8 -0
  352. package/dist/session/thread/detect-command.d.ts +12 -0
  353. package/dist/session/thread/detect-command.js +20 -0
  354. package/dist/session/thread/session-chat.d.ts +3 -1
  355. package/dist/session/thread/session-chat.js +377 -252
  356. package/dist/session/thread/session-thread.d.ts +3 -1
  357. package/dist/session/thread/session-thread.js +9 -2
  358. package/dist/session/thread/thread-boot-rows.d.ts +36 -0
  359. package/dist/session/thread/thread-boot-rows.js +89 -0
  360. package/dist/session/thread/transcript-rows.d.ts +31 -0
  361. package/dist/session/thread/transcript-rows.js +3 -0
  362. package/dist/session/thread/transcript.d.ts +0 -9
  363. package/dist/session/thread/transcript.js +104 -19
  364. package/dist/session/tool/shared/infrastructure-contexts.d.ts +28 -0
  365. package/dist/session/tool/shared/infrastructure-contexts.js +31 -3
  366. package/dist/session/tool/tool-part-renderer.d.ts +5 -4
  367. package/dist/session/tool/tool-part-renderer.js +8 -3
  368. package/dist/session/tool/tools/bash-tool.js +7 -6
  369. package/dist/session/tool/tools/channel-send-card.d.ts +1 -2
  370. package/dist/session/tool/tools/channel-send.d.ts +2 -1
  371. package/dist/session/tool/tools/codemode-tool.js +1 -1
  372. package/dist/session/tool/tools/connector-tools.js +1 -1
  373. package/dist/session/tool/tools/image-gen-tool.d.ts +1 -1
  374. package/dist/session/tool/tools/image-gen-tool.js +240 -53
  375. package/dist/session/tool/tools/show-tool.js +19 -8
  376. package/dist/session/turn/channel-brand.d.ts +8 -3
  377. package/dist/session/turn/channel-brand.js +20 -4
  378. package/dist/session/turn/message-author.d.ts +8 -0
  379. package/dist/session/turn/message-author.js +24 -0
  380. package/dist/session/turn/message-row.d.ts +52 -0
  381. package/dist/session/turn/message-row.js +44 -0
  382. package/dist/session/turn/plan-anchor.d.ts +1 -1
  383. package/dist/session/turn/plan-anchor.js +1 -1
  384. package/dist/session/turn/user-message.d.ts +7 -1
  385. package/dist/session/turn/user-message.js +21 -7
  386. package/dist/styles.css +1 -1
  387. package/dist/workspace/home/access-requests-bell.d.ts +9 -2
  388. package/dist/workspace/home/access-requests-bell.js +20 -6
  389. package/dist/workspace/home/first-chat.d.ts +8 -21
  390. package/dist/workspace/home/first-chat.js +22 -72
  391. package/dist/workspace/index.d.ts +6 -0
  392. package/dist/workspace/index.js +6 -0
  393. package/dist/workspace/layout/project-home.d.ts +14 -2
  394. package/dist/workspace/layout/project-home.js +60 -21
  395. package/dist/workspace/layout/use-project-home-send.d.ts +9 -1
  396. package/dist/workspace/layout/use-project-home-send.js +82 -3
  397. package/dist/workspace/memory/body-doc.d.ts +17 -0
  398. package/dist/workspace/memory/body-doc.js +208 -0
  399. package/dist/workspace/memory/body-extensions.d.ts +38 -0
  400. package/dist/workspace/memory/body-extensions.js +103 -0
  401. package/dist/workspace/memory/company-memory-page.d.ts +8 -0
  402. package/dist/workspace/memory/company-memory-page.js +16 -0
  403. package/dist/workspace/memory/memory-all.d.ts +20 -0
  404. package/dist/workspace/memory/memory-all.js +27 -0
  405. package/dist/workspace/memory/memory-body.d.ts +19 -0
  406. package/dist/workspace/memory/memory-body.js +139 -0
  407. package/dist/workspace/memory/memory-empty.d.ts +13 -0
  408. package/dist/workspace/memory/memory-empty.js +28 -0
  409. package/dist/workspace/memory/memory-history.d.ts +27 -0
  410. package/dist/workspace/memory/memory-history.js +108 -0
  411. package/dist/workspace/memory/memory-labels.d.ts +16 -0
  412. package/dist/workspace/memory/memory-labels.js +47 -0
  413. package/dist/workspace/memory/memory-page-list.d.ts +34 -0
  414. package/dist/workspace/memory/memory-page-list.js +156 -0
  415. package/dist/workspace/memory/memory-reader.d.ts +58 -0
  416. package/dist/workspace/memory/memory-reader.js +123 -0
  417. package/dist/workspace/memory/memory-view.d.ts +21 -0
  418. package/dist/workspace/memory/memory-view.js +124 -0
  419. package/dist/workspace/memory/remember-popover.d.ts +19 -0
  420. package/dist/workspace/memory/remember-popover.js +61 -0
  421. package/dist/workspace/memory/remember-this.d.ts +12 -0
  422. package/dist/workspace/memory/remember-this.js +89 -0
  423. package/dist/workspace/memory/source-mark.d.ts +18 -0
  424. package/dist/workspace/memory/source-mark.js +79 -0
  425. package/dist/workspace/memory/used-memory-chip.d.ts +14 -0
  426. package/dist/workspace/memory/used-memory-chip.js +61 -0
  427. package/dist/workspace/new/advanced-fields.d.ts +2 -1
  428. package/dist/workspace/new/advanced-fields.js +2 -2
  429. package/dist/workspace/new/source-param.d.ts +1 -1
  430. package/dist/workspace/new/source-param.js +3 -1
  431. package/dist/workspace/new/use-create-workspace.d.ts +8 -10
  432. package/dist/workspace/new/use-create-workspace.js +3 -3
  433. package/dist/workspace/projects/onboarding/app-logo.d.ts +7 -2
  434. package/dist/workspace/projects/onboarding/app-logo.js +6 -13
  435. package/dist/workspace/projects/policies-panel.js +5 -3
  436. package/dist/workspace/review/review-actions.d.ts +4 -2
  437. package/dist/workspace/review/review-actions.js +8 -2
  438. package/dist/workspace/review/review-center.js +11 -7
  439. package/dist/workspace/review/review-detail.d.ts +10 -0
  440. package/dist/workspace/review/review-detail.js +101 -13
  441. package/dist/workspace/saved-session-skeleton.d.ts +2 -2
  442. package/dist/workspace/saved-session-skeleton.js +3 -3
  443. package/dist/workspace/session-workspace.js +15 -13
  444. package/dist/workspace/sessions/project-sessions-view.js +3 -2
  445. package/dist/workspace/sessions/sessions-toolbar.d.ts +3 -1
  446. package/dist/workspace/sessions/sessions-toolbar.js +2 -2
  447. package/dist/workspace/sidebar/footer/project-apps-nav.d.ts +5 -0
  448. package/dist/workspace/sidebar/footer/project-apps-nav.js +41 -2
  449. package/dist/workspace/sidebar/footer/project-artifacts-nav.d.ts +6 -0
  450. package/dist/workspace/sidebar/footer/project-artifacts-nav.js +22 -0
  451. package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +13 -13
  452. package/dist/workspace/sidebar/footer/project-memory-nav.d.ts +7 -0
  453. package/dist/workspace/sidebar/footer/project-memory-nav.js +19 -0
  454. package/dist/workspace/sidebar/nav-row-meta.js +14 -2
  455. package/dist/workspace/sidebar/project-nav-items.js +3 -0
  456. package/dist/workspace/sidebar/project-session-list.js +68 -56
  457. package/dist/workspace/sidebar/project-sidebar.js +9 -2
  458. package/dist/workspace/sidebar/project-spaces-nav.d.ts +8 -0
  459. package/dist/workspace/sidebar/project-spaces-nav.js +69 -0
  460. package/dist/workspace/sidebar/session-group-order.d.ts +9 -0
  461. package/dist/workspace/sidebar/session-group-order.js +25 -0
  462. package/dist/workspace/sidebar/session-group-sections.d.ts +62 -0
  463. package/dist/workspace/sidebar/session-group-sections.js +267 -0
  464. package/dist/workspace/sidebar/session-list-chrome.d.ts +28 -0
  465. package/dist/workspace/sidebar/session-list-chrome.js +50 -0
  466. package/dist/workspace/spaces/channel-glyph.d.ts +5 -0
  467. package/dist/workspace/spaces/channel-glyph.js +6 -0
  468. package/dist/workspace/spaces/channel-setup.d.ts +16 -0
  469. package/dist/workspace/spaces/channel-setup.js +105 -0
  470. package/dist/workspace/spaces/channels-onboarding.d.ts +13 -0
  471. package/dist/workspace/spaces/channels-onboarding.js +37 -0
  472. package/dist/workspace/spaces/create-channel-dialog.d.ts +16 -0
  473. package/dist/workspace/spaces/create-channel-dialog.js +158 -0
  474. package/dist/workspace/spaces/private-channels-not-in.d.ts +9 -0
  475. package/dist/workspace/spaces/private-channels-not-in.js +69 -0
  476. package/dist/workspace/spaces/space-agents.d.ts +10 -0
  477. package/dist/workspace/spaces/space-agents.js +10 -0
  478. package/dist/workspace/spaces/space-details-dialog.d.ts +20 -0
  479. package/dist/workspace/spaces/space-details-dialog.js +176 -0
  480. package/dist/workspace/spaces/space-link-label.d.ts +49 -0
  481. package/dist/workspace/spaces/space-link-label.js +73 -0
  482. package/dist/workspace/spaces/space-links.d.ts +19 -0
  483. package/dist/workspace/spaces/space-links.js +230 -0
  484. package/dist/workspace/spaces/space-members.d.ts +46 -0
  485. package/dist/workspace/spaces/space-members.js +182 -0
  486. package/dist/workspace/spaces/space-roster.d.ts +15 -0
  487. package/dist/workspace/spaces/space-roster.js +44 -0
  488. package/dist/workspace/spaces/space-threads-tab.d.ts +56 -0
  489. package/dist/workspace/spaces/space-threads-tab.js +156 -0
  490. package/dist/workspace/spaces/space-timeline-view.d.ts +254 -0
  491. package/dist/workspace/spaces/space-timeline-view.js +235 -0
  492. package/dist/workspace/spaces/space-timeline.d.ts +106 -0
  493. package/dist/workspace/spaces/space-timeline.js +183 -0
  494. package/dist/workspace/spaces/space-triggers.d.ts +13 -0
  495. package/dist/workspace/spaces/space-triggers.js +78 -0
  496. package/dist/workspace/spaces/space-view.d.ts +37 -0
  497. package/dist/workspace/spaces/space-view.js +436 -0
  498. package/package.json +27 -36
  499. package/skills/kortix-ui/SKILL.md +3 -3
  500. package/skills/kortix-ui/references/custom-dashboard.md +3 -3
  501. package/skills/kortix-ui/references/modules.md +28 -4
  502. package/skills/kortix-ui/references/theming.md +1 -1
  503. package/dist/customize/connectors/catalog/merge-search.d.ts +0 -10
  504. package/dist/customize/connectors/catalog/merge-search.js +0 -26
  505. package/dist/customize/connectors/detail/find-easy-connect-app.d.ts +0 -29
  506. package/dist/customize/connectors/detail/find-easy-connect-app.js +0 -22
  507. package/dist/customize/migrate-to-v2/use-migrate-to-v2.d.ts +0 -9
  508. package/dist/customize/migrate-to-v2/use-migrate-to-v2.js +0 -24
  509. package/dist/customize/sections/connector-connection-header.d.ts +0 -36
  510. package/dist/customize/sections/connector-connection-header.js +0 -33
  511. package/dist/customize/sections/connector-connection-modal.d.ts +0 -34
  512. package/dist/customize/sections/connector-connection-modal.js +0 -72
  513. package/dist/customize/sections/discover-catalogue-card.d.ts +0 -19
  514. package/dist/customize/sections/discover-catalogue-card.js +0 -26
  515. package/dist/customize/sections/discover-catalogue-detail.d.ts +0 -15
  516. package/dist/customize/sections/discover-catalogue-detail.js +0 -24
  517. package/dist/customize/sections/discover-catalogue.d.ts +0 -17
  518. package/dist/customize/sections/discover-catalogue.js +0 -132
  519. package/dist/customize/sections/llm-provider/provider-access-menu.d.ts +0 -10
  520. package/dist/customize/sections/llm-provider/provider-access-menu.js +0 -23
  521. package/dist/files/project/components/drive-empty-art.d.ts +0 -2
  522. package/dist/files/project/components/drive-empty-art.js +0 -5
  523. package/dist/internal/hooks/use-media-query.d.ts +0 -2
  524. package/dist/internal/share/public-share-link-button.d.ts +0 -14
  525. package/dist/internal/share/public-share-link-button.js +0 -17
  526. package/dist/markdown/setup-links/app-credentials-form.d.ts +0 -12
  527. package/dist/markdown/setup-links/app-credentials-form.js +0 -115
  528. /package/dist/{internal/hooks → hooks}/use-media-query.js +0 -0
@@ -1,16 +1,29 @@
1
1
  import type { AdminConnector } from '@kortix/sdk';
2
2
  import { type ConnectorSetupStatus } from '../../sections/connector-connection-form.js';
3
- /** The four states a connector shows as a dot + word, on both detail pages. */
4
- export type ConnectorStatusTone = 'working' | 'pending' | 'error' | 'setup';
3
+ /**
4
+ * The three states a connector shows, everywhere it shows one (the list card,
5
+ * the connector header, the app page): Connected, Needs account, Error. A
6
+ * sign-in still to finish and a missing credential are both "Needs account":
7
+ * adding or signing in an account is the fix in either case.
8
+ */
9
+ export type ConnectorStatusTone = 'connected' | 'account' | 'error';
5
10
  export declare const STATUS_DOT: Record<ConnectorStatusTone, string>;
6
11
  /** The `connectorPages` key of each state's word. */
7
12
  export declare const STATUS_WORD: {
8
- readonly working: "statusWorking";
9
- readonly pending: "statusPending";
13
+ readonly connected: "statusConnected";
14
+ readonly account: "statusNeedsAccount";
10
15
  readonly error: "statusError";
11
- readonly setup: "statusNeedsSetup";
12
16
  };
13
- export declare function connectorStatusTone(connector: Pick<AdminConnector, 'authorizationStrategy' | 'authSecret' | 'secretSet' | 'status'> & Partial<Pick<AdminConnector, 'provider' | 'lastError'>>): ConnectorStatusTone;
17
+ /** The server's derived state (`state` on the connector). `disabled` reads as an error. */
18
+ export type ConnectorDerivedState = 'needs_account' | 'connected' | 'error';
19
+ export declare function connectorDerivedState(connector: object): ConnectorDerivedState | null;
20
+ /**
21
+ * The server's `state` when it sends one. An older API: the same rule from the
22
+ * fields, where zero accounts (once loaded) is Needs account.
23
+ */
24
+ export declare function connectorStatusTone(connector: Pick<AdminConnector, 'authorizationStrategy' | 'authSecret' | 'secretSet' | 'status'> & Partial<Pick<AdminConnector, 'provider' | 'lastError'>>,
25
+ /** The accounts the caller can see, once loaded. */
26
+ accountCount?: number): ConnectorStatusTone;
14
27
  /**
15
28
  * Agents can use the connector now: it is signed in, it runs on per-person
16
29
  * accounts, or it needs no sign-in and has an account to run as.
@@ -1,23 +1,47 @@
1
1
  import { connectorSetupStatus, } from '../../sections/connector-connection-form.js';
2
2
  import { providerLabel } from '../provider-label.js';
3
3
  export const STATUS_DOT = {
4
- working: 'bg-kortix-green',
5
- pending: 'bg-kortix-blue',
4
+ connected: 'bg-kortix-green',
5
+ account: 'bg-kortix-orange',
6
6
  error: 'bg-kortix-red',
7
- setup: 'bg-kortix-orange',
8
7
  };
9
8
  /** The `connectorPages` key of each state's word. */
10
9
  export const STATUS_WORD = {
11
- working: 'statusWorking',
12
- pending: 'statusPending',
10
+ connected: 'statusConnected',
11
+ account: 'statusNeedsAccount',
13
12
  error: 'statusError',
14
- setup: 'statusNeedsSetup',
15
13
  };
16
- export function connectorStatusTone(connector) {
14
+ export function connectorDerivedState(connector) {
15
+ const state = connector.state;
16
+ if (state === 'disabled')
17
+ return 'error';
18
+ return state === 'needs_account' || state === 'connected' || state === 'error' ? state : null;
19
+ }
20
+ /**
21
+ * The server's `state` when it sends one. An older API: the same rule from the
22
+ * fields, where zero accounts (once loaded) is Needs account.
23
+ */
24
+ export function connectorStatusTone(connector,
25
+ /** The accounts the caller can see, once loaded. */
26
+ accountCount) {
27
+ const state = connectorDerivedState(connector);
28
+ if (state === 'error')
29
+ return 'error';
30
+ if (state === 'needs_account')
31
+ return 'account';
32
+ // A channel or computer has no accounts to count. Anything else with zero
33
+ // loaded accounts has nothing to run as, whatever else it reports.
34
+ const counted = connector.provider !== 'channel' && connector.provider !== 'computer';
35
+ if (counted && accountCount === 0)
36
+ return 'account';
37
+ if (state === 'connected')
38
+ return 'connected';
17
39
  const status = connectorSetupStatus(connector);
18
- if (status === 'pending')
19
- return 'pending';
20
- return status === 'error' ? 'error' : status === 'needs_setup' ? 'setup' : 'working';
40
+ if (status === 'error')
41
+ return 'error';
42
+ if (status === 'pending' || status === 'needs_setup')
43
+ return 'account';
44
+ return 'connected';
21
45
  }
22
46
  /**
23
47
  * Agents can use the connector now: it is signed in, it runs on per-person
@@ -1,5 +1,5 @@
1
1
  import type { AdminConnector } from '@kortix/sdk';
2
- export type ConnectorTab = 'accounts' | 'tools' | 'triggers' | 'settings';
2
+ export type ConnectorTab = 'accounts' | 'tools' | 'agents' | 'triggers' | 'settings';
3
3
  /**
4
4
  * Tab order never changes. A tab that does not apply is absent; the ones that
5
5
  * remain keep their positions, so the surface does not reshape per connector.
@@ -17,6 +17,9 @@ export declare const CONNECTOR_TAB_LABEL_KEY: Record<ConnectorTab, string>;
17
17
  * - Tools and Settings mutate project state, so they are writer-only. Accounts
18
18
  * stays for readers: it is how they see whether the connector works, and how
19
19
  * they connect their own account.
20
+ * - Agents lists which agents can use the connector and their rule set. It
21
+ * shows for readers too (read-only), except on a channel or the computer:
22
+ * those reach every agent and have no kortix.yaml entry to grant.
20
23
  * - Triggers lists the app event triggers on this connector. It shows only when
21
24
  * the connector's app has events (`hasEvents`), and for readers too: it is a
22
25
  * list, and its New button is gated on its own permission.
@@ -2,11 +2,12 @@
2
2
  * Tab order never changes. A tab that does not apply is absent; the ones that
3
3
  * remain keep their positions, so the surface does not reshape per connector.
4
4
  */
5
- export const CONNECTOR_TABS = ['accounts', 'tools', 'triggers', 'settings'];
5
+ export const CONNECTOR_TABS = ['accounts', 'tools', 'agents', 'triggers', 'settings'];
6
6
  /** `hardcodedUi.i18nComplete` key of each tab's label. */
7
7
  export const CONNECTOR_TAB_LABEL_KEY = {
8
8
  accounts: 'text8a7c8b67fe8b',
9
- tools: 'textea93d6a262ec',
9
+ tools: 'text9d2b6f0c41ae',
10
+ agents: 'text279b44d2ab4b',
10
11
  triggers: 'texte62f2148a64d',
11
12
  settings: 'text74a883a037bc',
12
13
  };
@@ -20,6 +21,9 @@ export const CONNECTOR_TAB_LABEL_KEY = {
20
21
  * - Tools and Settings mutate project state, so they are writer-only. Accounts
21
22
  * stays for readers: it is how they see whether the connector works, and how
22
23
  * they connect their own account.
24
+ * - Agents lists which agents can use the connector and their rule set. It
25
+ * shows for readers too (read-only), except on a channel or the computer:
26
+ * those reach every agent and have no kortix.yaml entry to grant.
23
27
  * - Triggers lists the app event triggers on this connector. It shows only when
24
28
  * the connector's app has events (`hasEvents`), and for readers too: it is a
25
29
  * list, and its New button is gated on its own permission.
@@ -31,6 +35,8 @@ export function connectorTabs(connector, caps) {
31
35
  present.add('accounts');
32
36
  if (caps.canWrite)
33
37
  present.add('tools');
38
+ if (connector.provider !== 'channel' && connector.provider !== 'computer')
39
+ present.add('agents');
34
40
  if (caps.hasEvents)
35
41
  present.add('triggers');
36
42
  if (caps.canWrite && connector.provider !== 'computer')
@@ -14,9 +14,9 @@ interface ConnectorToolsProps {
14
14
  * Three things make this readable to someone who is not going to study a
15
15
  * policy engine:
16
16
  *
17
- * 1. **Two groups, not three.** `groupToolsByRisk` folds `destructive` into
18
- * writes. The only question a reader is equipped to answer before granting
19
- * access is "can this look at my data, or change it".
17
+ * 1. **Read, write, unclassified.** `groupToolsByRisk` folds `destructive`
18
+ * into writes, and a tool nobody classified gets its own group instead of
19
+ * passing for a write.
20
20
  * 2. **Default is a state, not a value.** A tool the platform allows by
21
21
  * default renders with NO segment lit and a `Hint` naming the default.
22
22
  * Lighting Allow would claim a choice nobody made.
@@ -1,12 +1,13 @@
1
1
  'use client';
2
2
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
3
  import { ConnectorAdvancedTools } from './connector-advanced-tools.js';
4
+ import { ConnectorPolicySetBar } from './connector-policy-sets.js';
4
5
  import { useLocalizedUiCatalog } from '../../../i18n/ui-catalog/use-localized-ui-catalog.js';
5
6
  import { useTranslations } from '../../../i18n/index.js';
6
7
  import { getConnectorPolicies, setConnectorPolicies, setConnectorSensitive, } from '@kortix/sdk';
7
8
  import { CaretDownIcon, CaretRightIcon, LockIcon, MagnifyingGlassIcon, WrenchIcon, } from '@phosphor-icons/react';
8
9
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
9
- import { useMemo, useState } from 'react';
10
+ import { useCallback, useMemo, useState } from 'react';
10
11
  import { Button } from '../../../primitives/button.js';
11
12
  import { ConfirmDialog } from '../../../primitives/confirm-dialog.js';
12
13
  import { CountBadge } from '../../../primitives/count-badge.js';
@@ -15,19 +16,24 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigge
15
16
  import { InfoBanner } from '../../../primitives/info-banner.js';
16
17
  import { InputGroupSearch, InputGroupSearchClear, InputGroupSearchIcon, InputGroupSearchInput, } from '../../../primitives/input-group.js';
17
18
  import { Skeleton } from '../../../primitives/skeleton.js';
19
+ import { cn } from '../../../internal/lib/utils.js';
18
20
  import { errorToast, successToast } from '../../../primitives/toast.js';
19
21
  import { EmptyState } from '../../../primitives/empty-state.js';
20
22
  import { ErrorState } from '../../../primitives/error-state.js';
23
+ import Hint from '../../../primitives/hint.js';
24
+ import { Switch } from '../../../primitives/switch.js';
21
25
  import { filterActions, groupToolsByRisk, toolRowText, } from '../tools/tool-groups.js';
22
- import { applyBulkPolicy, isLockedByProject, isPatternRule, orderPolicyRules, previewEffective, toolChoice, } from '../tools/tool-policy.js';
26
+ import { applyBulkPolicy, connectorDefaultAction, inheritedAction, isAdvancedRule, isLockedByProject, orderPolicyRules, previewEffective, summarizeToolDecisions, toolChoice, } from '../tools/tool-policy.js';
27
+ import { connectorPoliciesKey, supportsPolicySets } from '../tools/policy-sets.js';
23
28
  import { ToolPolicyControl } from '../tools/tool-policy-control.js';
24
29
  import { POLICY_CHOICE_LABEL, POLICY_SEGMENTS, } from '../tools/tool-policy-labels.js';
25
30
  import { CatalogNoMatch } from '../../shared/catalog/catalog-empty-state.js';
31
+ import { UiLink as Link } from '../../../providers/ui-provider.js';
32
+ import { rulesHref } from '../connector-routes.js';
26
33
  /** Below this many tools the search field is clutter; above it the list is
27
34
  * unusable without one. */
28
35
  const SEARCH_THRESHOLD = 6;
29
36
  const POLICY_QUERY_STALE_MS = 5_000;
30
- const LOCKED_REASON = 'A project rule already decides this tool. Change it under Global rules on the Connectors page.';
31
37
  /**
32
38
  * Tools — what this connector is allowed to do, as a per-tool decision instead
33
39
  * of a dropdown and a save button.
@@ -35,9 +41,9 @@ const LOCKED_REASON = 'A project rule already decides this tool. Change it under
35
41
  * Three things make this readable to someone who is not going to study a
36
42
  * policy engine:
37
43
  *
38
- * 1. **Two groups, not three.** `groupToolsByRisk` folds `destructive` into
39
- * writes. The only question a reader is equipped to answer before granting
40
- * access is "can this look at my data, or change it".
44
+ * 1. **Read, write, unclassified.** `groupToolsByRisk` folds `destructive`
45
+ * into writes, and a tool nobody classified gets its own group instead of
46
+ * passing for a write.
41
47
  * 2. **Default is a state, not a value.** A tool the platform allows by
42
48
  * default renders with NO segment lit and a `Hint` naming the default.
43
49
  * Lighting Allow would claim a choice nobody made.
@@ -56,21 +62,37 @@ const LOCKED_REASON = 'A project rule already decides this tool. Change it under
56
62
  */
57
63
  export function ConnectorTools({ projectId, connector, displayName, canWrite, onChanged, }) {
58
64
  const t = useTranslations('connectorPages');
65
+ const tSets = useTranslations('connectorPolicySets');
59
66
  const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
60
67
  const policySegments = useLocalizedUiCatalog(POLICY_SEGMENTS);
61
68
  const queryClient = useQueryClient();
62
69
  const slug = connector.slug;
63
- const queryKey = useMemo(() => ['connector-policies', projectId, slug], [projectId, slug]);
70
+ // Null edits the base rules; a name edits that policy set's rules. The
71
+ // query key carries it, so each list caches on its own.
72
+ const [policySet, setPolicySet] = useState(null);
73
+ const onPolicySet = useCallback((next) => setPolicySet(next), []);
74
+ const scope = policySet ? 'set' : 'base';
75
+ const showSets = supportsPolicySets(connector.provider);
76
+ const queryKey = useMemo(() => connectorPoliciesKey(projectId, slug, policySet), [projectId, slug, policySet]);
64
77
  // Reading policies is admin-gated on the server (`resolveAdmin`,
65
78
  // connectors/router.ts:1193), so a reader would get a 403 and a permanent
66
79
  // skeleton. `connectorTabs` already hides this tab from them; the guard
67
80
  // below keeps that true if it ever stops doing so.
68
81
  const policiesQuery = useQuery({
69
82
  queryKey,
70
- queryFn: () => getConnectorPolicies(projectId, slug),
83
+ queryFn: () => getConnectorPolicies(projectId, slug, { policySet: policySet ?? undefined }),
71
84
  staleTime: POLICY_QUERY_STALE_MS,
72
85
  enabled: canWrite,
73
86
  });
87
+ // In a set, Inherit names what the base rules decide. Same key and fetch as
88
+ // the base view and the rule-set strip: one cached request.
89
+ const baseQuery = useQuery({
90
+ queryKey: connectorPoliciesKey(projectId, slug, null),
91
+ queryFn: () => getConnectorPolicies(projectId, slug, { policySet: undefined }),
92
+ staleTime: POLICY_QUERY_STALE_MS,
93
+ enabled: canWrite && scope === 'set',
94
+ });
95
+ const baseEffective = useMemo(() => baseQuery.data?.effective ?? [], [baseQuery.data]);
74
96
  const policies = useMemo(() => policiesQuery.data?.policies ?? [], [policiesQuery.data]);
75
97
  const effective = useMemo(() => policiesQuery.data?.effective ?? [], [policiesQuery.data]);
76
98
  const toolPaths = useMemo(() => new Set(connector.actions.map((action) => action.path)), [connector.actions]);
@@ -79,14 +101,30 @@ export function ConnectorTools({ projectId, connector, displayName, canWrite, on
79
101
  // connector no longer reports — belongs to the Advanced editor, where it
80
102
  // stays visible and editable instead of being silently dropped on the next
81
103
  // save.
82
- const toolRules = useMemo(() => policies.filter((rule) => !isPatternRule(rule.match) && toolPaths.has(rule.match)), [policies, toolPaths]);
83
- const advancedRules = useMemo(() => policies.filter((rule) => isPatternRule(rule.match) || !toolPaths.has(rule.match)), [policies, toolPaths]);
104
+ const toolRules = useMemo(() => policies.filter((rule) => !isAdvancedRule(rule) && toolPaths.has(rule.match)), [policies, toolPaths]);
105
+ const advancedRules = useMemo(() => policies.filter((rule) => isAdvancedRule(rule) || !toolPaths.has(rule.match)), [policies, toolPaths]);
106
+ const sensitive = connector.sensitive === true;
107
+ const defaultMode = policiesQuery.data?.default_mode;
108
+ const fallback = useCallback((action) => connectorDefaultAction(sensitive, defaultMode, action.risk), [sensitive, defaultMode]);
109
+ const summary = useMemo(() => summarizeToolDecisions(connector.actions, policies, effective, scope, fallback), [connector.actions, policies, effective, scope, fallback]);
110
+ // The first word of a name is the app: `LINEAR_ARCHIVE_ISSUE` reads
111
+ // "Archive issue" on the Linear page.
112
+ const appNames = useMemo(() => [slug, connector.name, displayName, slug.split('-')[0] ?? ''], [slug, connector.name, displayName]);
84
113
  const [query, setQuery] = useState('');
85
- const matches = useMemo(() => filterActions(connector.actions, query), [connector.actions, query]);
86
- const groups = useMemo(() => groupToolsByRisk(matches, tI18nComplete), [matches, tI18nComplete]);
114
+ const [onlyChanged, setOnlyChanged] = useState(false);
115
+ const matches = useMemo(() => {
116
+ const found = filterActions(connector.actions, query);
117
+ if (!onlyChanged)
118
+ return found;
119
+ return found.filter((action) => toolChoice(action.path, policies, effective, scope) !== 'default' &&
120
+ !isLockedByProject(action.path, effective));
121
+ }, [connector.actions, query, onlyChanged, policies, effective, scope]);
122
+ const groups = useMemo(() => groupToolsByRisk(matches, tI18nComplete, appNames), [matches, tI18nComplete, appNames]);
87
123
  const projectLockedCount = useMemo(() => effective.filter((entry) => entry.source === 'project').length, [effective]);
88
124
  const writePolicies = useMutation({
89
- mutationFn: (write) => setConnectorPolicies(projectId, slug, orderPolicyRules(write.rules)),
125
+ mutationFn: (write) => setConnectorPolicies(projectId, slug, orderPolicyRules(write.rules), {
126
+ policySet: policySet ?? undefined,
127
+ }),
90
128
  onMutate: async (write) => {
91
129
  await queryClient.cancelQueries({ queryKey });
92
130
  const previous = queryClient.getQueryData(queryKey);
@@ -95,7 +133,7 @@ export function ConnectorTools({ projectId, connector, displayName, canWrite, on
95
133
  ...old,
96
134
  policies: orderPolicyRules(write.rules),
97
135
  effective: write.paths && write.choice
98
- ? previewEffective(old.effective ?? [], write.paths, write.choice)
136
+ ? previewEffective(old.effective ?? [], write.paths, write.choice, scope)
99
137
  : old.effective,
100
138
  }
101
139
  : old);
@@ -145,33 +183,76 @@ export function ConnectorTools({ projectId, connector, displayName, canWrite, on
145
183
  return (_jsxs("p", { className: "text-muted-foreground text-sm text-pretty", children: [tI18nComplete.raw('textdb7d057a2f68'), " ", displayName, ' ', tI18nComplete.raw('text24984f203fd7')] }));
146
184
  }
147
185
  const hasTools = connector.actions.length > 0;
148
- return (_jsxs("div", { className: "space-y-5", children: [hasTools ? (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("p", { className: "text-muted-foreground min-w-0 text-sm text-pretty", children: describeDefault(connector.sensitive === true, policiesQuery.data?.default_mode) }), connector.actions.length > SEARCH_THRESHOLD ? (_jsxs(InputGroupSearch, { className: "w-full sm:max-w-64", children: [_jsx(InputGroupSearchIcon, { children: _jsx(MagnifyingGlassIcon, {}) }), _jsx(InputGroupSearchInput, { placeholder: tI18nComplete.raw('textfbd165231fa1'), value: query, onChange: (event) => setQuery(event.target.value), variant: "popover", size: "sm" }), _jsx(InputGroupSearchClear, { onClick: () => setQuery('') })] })) : null] })) : null, projectLockedCount > 0 ? (_jsx(InfoBanner, { tone: "warning", icon: LockIcon, title: tI18nComplete('textd3d900c89bd0', {
186
+ const choiceLabel = (choice) => choice === 'default' && scope === 'set' ? tSets('inherit') : POLICY_CHOICE_LABEL[choice];
187
+ const decisionWord = (action) => action === 'block'
188
+ ? t('toolsDecisionBlocked')
189
+ : action === 'require_approval'
190
+ ? t('toolsDecisionAsks')
191
+ : t('toolsDecisionRuns');
192
+ const inheritLabel = (path, choice, action) => {
193
+ const resolved = decisionWord(inheritedAction(path, choice, effective, baseEffective, scope, fallback(action)));
194
+ return scope === 'set'
195
+ ? t('toolsInheritAs', { action: resolved })
196
+ : t('toolsDefaultAs', { action: resolved });
197
+ };
198
+ // What decides a tool left on Default/Inherit, named the way the page names
199
+ // it: the base rules, the sensitive flag, or the project's default mode.
200
+ const decidedBy = (path) => {
201
+ const entry = (scope === 'set' ? baseEffective : effective).find((e) => e.path === path);
202
+ if (scope === 'set' && entry?.source !== 'risk_default' && entry?.source !== 'allow_all') {
203
+ return t('toolsFromBase');
204
+ }
205
+ if (entry?.source === 'connector')
206
+ return t('toolsFromBase');
207
+ if (sensitive)
208
+ return t('toolsFromSensitive');
209
+ return t('toolsFromDefault');
210
+ };
211
+ const summaryParts = [
212
+ t('toolsSummaryTotal', { count: summary.total }),
213
+ summary.block > 0 ? t('toolsSummaryBlocked', { count: summary.block }) : null,
214
+ summary.ask > 0 ? t('toolsSummaryAsk', { count: summary.ask }) : null,
215
+ summary.run > 0 ? t('toolsSummaryRun', { count: summary.run }) : null,
216
+ ].filter(Boolean);
217
+ return (_jsxs("div", { className: "space-y-5", children: [showSets ? (_jsx(ConnectorPolicySetBar, { projectId: projectId, slug: slug, canWrite: canWrite, value: policySet, onChange: onPolicySet })) : null, hasTools && policiesQuery.data ? (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("p", { className: "text-muted-foreground min-w-0 text-sm tabular-nums", children: summaryParts.join(' · ') }), _jsxs("div", { className: "flex w-full flex-wrap items-center gap-3 sm:w-auto", children: [connector.actions.length > SEARCH_THRESHOLD ? (_jsxs(InputGroupSearch, { className: "w-full sm:w-56", children: [_jsx(InputGroupSearchIcon, { children: _jsx(MagnifyingGlassIcon, {}) }), _jsx(InputGroupSearchInput, { placeholder: tI18nComplete.raw('textfbd165231fa1'), value: query, onChange: (event) => setQuery(event.target.value), size: "sm" }), _jsx(InputGroupSearchClear, { onClick: () => setQuery('') })] })) : null, _jsx(Switch, { label: t('toolsOnlyChanged'), checked: onlyChanged, onCheckedChange: setOnlyChanged, className: "px-0 py-0" })] })] })) : null, projectLockedCount > 0 ? (_jsxs(InfoBanner, { tone: "warning", icon: LockIcon, title: tI18nComplete('textd3d900c89bd0', {
149
218
  value0: projectLockedCount,
150
219
  value1: projectLockedCount === 1
151
220
  ? tI18nComplete.raw('text86ca67d2851a')
152
221
  : tI18nComplete.raw('textd50ab26e1621'),
153
- }), children: tI18nComplete.raw('textf7d6d7f585c5') })) : null, policiesQuery.isPending ? (_jsx("div", { className: "space-y-2", children: [0, 1, 2].map((row) => (_jsx(Skeleton, { className: "h-14 rounded-md" }, row))) })) : policiesQuery.isError ? (_jsx(ErrorState, { size: "sm", title: tI18nComplete.raw('textff6065190563'), description: policiesQuery.error instanceof Error
222
+ }), children: [t('toolsProjectLockedBody'), ' ', _jsx(Link, { href: rulesHref(projectId), className: "text-foreground underline underline-offset-4", children: t('toolsOpenRules') })] })) : null, policiesQuery.isPending ? (_jsx("div", { className: "space-y-2", children: [0, 1, 2].map((row) => (_jsx(Skeleton, { className: "h-14 rounded-md" }, row))) })) : policiesQuery.isError ? (_jsx(ErrorState, { size: "sm", title: tI18nComplete.raw('textff6065190563'), description: policiesQuery.error instanceof Error
154
223
  ? policiesQuery.error.message
155
224
  : tI18nComplete.raw('texta47c08d35337'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => void policiesQuery.refetch(), children: tI18nComplete.raw('text942087cc2d41') }) })) : !hasTools ? (
156
225
  // The connector exists but has reported no tools — a failed or pending
157
226
  // sync. That is a different statement from "nothing matched your
158
227
  // search", and it must not render as a blank panel.
159
- _jsx(EmptyState, { icon: WrenchIcon, size: "sm", title: tI18nComplete.raw('text99dd86336467'), description: t('toolsEmptyBody', { name: displayName }) })) : groups.length === 0 ? (
228
+ _jsx(EmptyState, { icon: WrenchIcon, size: "sm", title: tI18nComplete.raw('text99dd86336467'), description: t('toolsEmptyBody', { name: displayName }) })) : groups.length === 0 && onlyChanged && !query.trim() ? (_jsx("p", { className: "text-muted-foreground py-6 text-center text-sm text-pretty", children: scope === 'set' ? t('toolsNoneChangedSet') : t('toolsNoneChangedBase') })) : groups.length === 0 ? (
160
229
  // The same line the four catalogs render, from the same component.
161
230
  // What was searched is unambiguous here — the box above says "Search
162
231
  // 19 tools" — so a second wording for one outcome bought nothing.
163
- _jsx(CatalogNoMatch, { query: query })) : (_jsx("div", { className: "space-y-2", children: groups.map((group) => (_jsxs(Disclosure, { variant: "outline", className: "overflow-hidden", defaultOpen: true, children: [_jsxs("div", { className: "flex items-center gap-2 pr-2", children: [_jsx(DisclosureTrigger, { variant: "outline", children: _jsxs(Button, { variant: "popover", className: "flex min-w-0 flex-1 items-center justify-start rounded-none", children: [_jsx(CaretRightIcon, { className: "text-muted-foreground size-3.5 shrink-0 transition-transform duration-(--duration-normal) ease-out group-data-[state=open]:rotate-90 motion-reduce:transition-none" }), _jsx("span", { className: "truncate text-sm font-medium", children: group.label }), _jsx(CountBadge, { count: group.actions.length })] }) }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { size: "sm", variant: "ghost", className: "shrink-0", disabled: frozen || busy || bulkPathsFor(group).length === 0, children: [tI18nComplete.raw('textd9d0b4384a58'), _jsx(CaretDownIcon, { className: "size-3.5 shrink-0" })] }) }), _jsx(DropdownMenuContent, { align: "end", className: "min-w-32", children: policySegments.map((segment) => (_jsx(DropdownMenuItem, { onSelect: () => setBulk({ group, choice: segment.choice }), children: segment.label }, segment.choice))) })] })] }), _jsx(DisclosureContent, { variant: "outline", contentClassName: "border-border border-t", children: _jsx("ul", { className: "divide-border/60 divide-y px-4", children: group.actions.map((action) => {
232
+ _jsx(CatalogNoMatch, { query: query })) : (_jsx("div", { className: "space-y-2", children: groups.map((group) => (_jsxs(Disclosure, { variant: "outline", className: "overflow-hidden", defaultOpen: true, children: [_jsxs("div", { className: "flex items-center gap-2 pr-2", children: [_jsx(DisclosureTrigger, { variant: "outline", children: _jsxs(Button, { variant: "popover", className: "flex min-w-0 flex-1 items-center justify-start rounded-none", children: [_jsx(CaretRightIcon, { className: "text-muted-foreground size-3.5 shrink-0 transition-transform duration-(--duration-normal) ease-out group-data-[state=open]:rotate-90 motion-reduce:transition-none" }), _jsx("span", { className: "truncate text-sm font-medium", children: group.label }), _jsx(CountBadge, { count: group.actions.length })] }) }), _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { size: "sm", variant: "ghost", className: "shrink-0", disabled: frozen || busy || bulkPathsFor(group).length === 0, children: [tI18nComplete.raw('textd9d0b4384a58'), _jsx(CaretDownIcon, { className: "size-3.5 shrink-0" })] }) }), _jsx(DropdownMenuContent, { align: "end", className: "min-w-32", children: policySegments.map((segment) => (_jsx(DropdownMenuItem, { onSelect: () => setBulk({ group, choice: segment.choice }), children: segment.choice === 'default' ? choiceLabel('default') : segment.label }, segment.choice))) })] })] }), _jsx(DisclosureContent, { variant: "outline", contentClassName: "border-border border-t", children: _jsx("ul", { className: "divide-border/60 divide-y px-4", children: group.actions.map((action) => {
164
233
  const locked = isLockedByProject(action.path, effective);
165
- const row = toolRowText(action);
166
- return (_jsxs("li", { className: "flex flex-wrap items-start gap-x-4 gap-y-2 py-3", children: [_jsxs("div", { className: "min-w-0 flex-1 basis-48 space-y-0.5", children: [_jsx("p", { className: "text-foreground text-sm font-medium wrap-break-word", children: row.title }), row.description ? (_jsx("p", { className: "text-muted-foreground line-clamp-2 text-xs text-pretty", children: row.description })) : null] }), _jsx(ToolPolicyControl, { label: tI18nComplete('textb34f1e3c1569', {
234
+ const row = toolRowText(action, appNames);
235
+ const choice = toolChoice(action.path, policies, effective, scope);
236
+ const changed = choice !== 'default' && !locked;
237
+ return (_jsxs("li", { className: "flex flex-wrap items-center gap-x-4 gap-y-2 py-2.5", children: [_jsxs("div", { className: "flex min-w-0 flex-1 basis-56 items-start gap-2", children: [_jsx("span", { className: "flex h-5 shrink-0 items-center", children: _jsx("span", { className: cn('size-1.5 rounded-full', changed && 'bg-foreground'), children: changed ? _jsx("span", { className: "sr-only", children: t('toolsChanged') }) : null }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("p", { className: "text-foreground min-w-0 text-sm font-medium wrap-break-word", children: row.title }), row.path ? (_jsx("code", { className: "text-muted-foreground max-w-full truncate font-mono text-xs", children: row.path })) : null] }), choice === 'default' && !locked ? (_jsx("p", { className: "text-muted-foreground text-xs", children: decidedBy(action.path) })) : null, row.description ? (_jsx(Hint, { label: row.description, side: "bottom", children: _jsx("p", { className: "text-muted-foreground truncate text-xs", children: row.description }) })) : null] })] }), _jsx(ToolPolicyControl, { label: tI18nComplete('textb34f1e3c1569', {
167
238
  value0: row.path ?? row.title,
168
- }), value: toolChoice(action.path, policies, effective), onChange: (next) => setToolPolicy(action.path, next), disabled: frozen || busy, lockedReason: locked ? LOCKED_REASON : undefined, defaultHint: describeToolDefault(connector.sensitive === true, policiesQuery.data?.default_mode, action.risk) })] }, action.path));
169
- }) }) })] }, group.key))) })), _jsx(ConnectorAdvancedTools, { connector: connector, advancedRules: advancedRules, toolRules: toolRules, loaded: !!policiesQuery.data, frozen: frozen, busy: busy, saving: writePolicies.isPending, sensitivePending: sensitiveMutation.isPending, onSave: (rules) => writePolicies.mutate({ rules }), onSensitive: (next) => sensitiveMutation.mutate(next) }), _jsx(ConfirmDialog, { open: bulk !== null, onOpenChange: (open) => {
239
+ }), value: choice, onChange: (next) => setToolPolicy(action.path, next), disabled: frozen || busy, lockedReason: locked ? t('toolsLockedByProject') : undefined, defaultLabel: inheritLabel(action.path, choice, action) })] }, action.path));
240
+ }) }) })] }, group.key))) })), _jsx(ConnectorAdvancedTools, { connector: connector, showSensitive: scope === 'base', advancedRules: advancedRules, toolRules: toolRules, loaded: !!policiesQuery.data, frozen: frozen, busy: busy, saving: writePolicies.isPending, sensitivePending: sensitiveMutation.isPending, onSave: (rules) => writePolicies.mutate({ rules }), onSensitive: (next) => sensitiveMutation.mutate(next) }, policySet ?? 'base'), _jsx(ConfirmDialog, { open: bulk !== null, onOpenChange: (open) => {
170
241
  if (!open)
171
242
  setBulk(null);
172
- }, title: bulk ? bulkConfirmTitle(bulkPaths.length, bulk.choice) : '', description: bulk ? bulkConfirmDescription(bulk.group.label, bulk.choice) : '', confirmLabel: bulk
243
+ }, title: bulk
244
+ ? bulk.choice === 'default' && scope === 'set'
245
+ ? tSets('bulkInheritTitle', { count: bulkPaths.length })
246
+ : bulkConfirmTitle(bulkPaths.length, bulk.choice)
247
+ : '', description: bulk
248
+ ? bulk.choice === 'default' && scope === 'set'
249
+ ? tSets('bulkInheritBody', { group: bulk.group.label })
250
+ : bulkConfirmDescription(bulk.group.label, bulk.choice)
251
+ : '', confirmLabel: bulk
173
252
  ? bulk.choice === 'default'
174
- ? tI18nComplete.raw('text1707565fd3f0')
253
+ ? scope === 'set'
254
+ ? tSets('inherit')
255
+ : tI18nComplete.raw('text1707565fd3f0')
175
256
  : tI18nComplete('text41ffc5e14073', { value0: POLICY_CHOICE_LABEL[bulk.choice] })
176
257
  : 'Confirm', isPending: writePolicies.isPending, onConfirm: () => {
177
258
  if (!bulk)
@@ -198,27 +279,3 @@ function bulkConfirmDescription(groupLabel, choice) {
198
279
  ? `Deletes the per-tool rule for every tool listed under ${groupLabel} right now, so each one follows the connector default again. ${tail}`
199
280
  : `Every tool listed under ${groupLabel} right now is set to ${POLICY_CHOICE_LABEL[choice]}. ${tail}`;
200
281
  }
201
- /**
202
- * What happens to a tool nobody has decided on — read off the server's own
203
- * answer, never guessed. `sensitive` beats `default_mode` at the gate
204
- * (`resolveEffectiveAction`, connectors/policy.ts:362), so it is stated first.
205
- */
206
- function describeDefault(sensitive, defaultMode) {
207
- if (sensitive) {
208
- return 'Every tool asks for approval before it runs, including reads. Set a tool below to change that.';
209
- }
210
- if (defaultMode === 'allow_all') {
211
- return 'Every tool runs without asking unless you decide otherwise below.';
212
- }
213
- return 'Reads run without asking; writes and deletes ask first. Decide any tool below.';
214
- }
215
- /** The same answer for one row, so an unlit control still says what it does. */
216
- function describeToolDefault(sensitive, defaultMode, risk) {
217
- if (sensitive)
218
- return 'Following the connector default — asks before it runs.';
219
- if (defaultMode === 'allow_all')
220
- return 'Following the connector default — runs without asking.';
221
- return risk === 'read'
222
- ? 'Following the connector default — runs without asking.'
223
- : 'Following the connector default — asks before it runs.';
224
- }
@@ -0,0 +1,43 @@
1
+ import { type EmailInbox } from '../../../internal/hooks/channels/use-email-inboxes.js';
2
+ import type { EmailSenderPolicy } from '../../../internal/hooks/channels/use-channels-installations.js';
3
+ /** The one connector profile every inbox is an account on. */
4
+ export declare const EMAIL_CONNECTOR_SLUG = "kortix_email";
5
+ /** "Kortix managed" or "Your Resend account": where an inbox lives. */
6
+ export declare function EmailInboxHome({ inbox }: {
7
+ inbox: Pick<EmailInbox, 'managed'>;
8
+ }): import("react").JSX.Element;
9
+ /** The sender policy in the editor's shape, whatever casing the wire used. */
10
+ export declare function inboxSenderPolicy(inbox: Pick<EmailInbox, 'sender_policy'> | null | undefined): EmailSenderPolicy;
11
+ /**
12
+ * "Add inbox": the account's name and who can use it (`AddAccountFields`, the
13
+ * same fields every connector's Add account asks), then the inbox itself
14
+ * (`EmailConnectForm`). Picked people get the account shared with them after
15
+ * it exists, exactly like `useAddAccount`.
16
+ */
17
+ export declare function AddEmailInboxDialog({ projectId, open, onOpenChange, existing, onAdded, }: {
18
+ projectId: string;
19
+ open: boolean;
20
+ onOpenChange: (open: boolean) => void;
21
+ /** The profile's accounts, for a free name and the "already used" check. */
22
+ existing: ReadonlyArray<{
23
+ label: string;
24
+ owner_type: string;
25
+ }>;
26
+ onAdded: (inbox: EmailInbox) => void;
27
+ }): import("react").JSX.Element;
28
+ /** "Who can email" for one inbox: anyone, or only the listed senders. */
29
+ export declare function EmailSenderPolicyDialog({ projectId, inbox, open, onOpenChange, }: {
30
+ projectId: string;
31
+ inbox: EmailInbox | null;
32
+ open: boolean;
33
+ onOpenChange: (open: boolean) => void;
34
+ }): import("react").JSX.Element;
35
+ /**
36
+ * The Email hero (Channels tab, the Email page): the pitch until a first inbox
37
+ * exists, then how many inboxes there are, their addresses, and Manage (the
38
+ * connector page with the account list) or Add another inbox. Like ComputerHero.
39
+ */
40
+ export declare function EmailHero({ projectId, canWrite }: {
41
+ projectId: string;
42
+ canWrite: boolean;
43
+ }): import("react").JSX.Element;