@manta-eu/react 0.11.0 → 0.13.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 (592) hide show
  1. package/README.md +59 -0
  2. package/dist/components/AppErrorBoundary.d.ts.map +1 -1
  3. package/dist/components/AppErrorBoundary.js +14 -11
  4. package/dist/components/AppErrorBoundary.js.map +1 -1
  5. package/dist/components/app-gate/AppGate.d.ts +8 -0
  6. package/dist/components/app-gate/AppGate.d.ts.map +1 -0
  7. package/dist/components/app-gate/AppGate.js +68 -0
  8. package/dist/components/app-gate/AppGate.js.map +1 -0
  9. package/dist/components/app-gate/AwaitingDatastoreStatus.d.ts +7 -0
  10. package/dist/components/app-gate/AwaitingDatastoreStatus.d.ts.map +1 -0
  11. package/dist/components/app-gate/AwaitingDatastoreStatus.js +19 -0
  12. package/dist/components/app-gate/AwaitingDatastoreStatus.js.map +1 -0
  13. package/dist/components/app-gate/EnterDatastoreRoute.d.ts +2 -0
  14. package/dist/components/app-gate/EnterDatastoreRoute.d.ts.map +1 -0
  15. package/dist/components/app-gate/EnterDatastoreRoute.js +25 -0
  16. package/dist/components/app-gate/EnterDatastoreRoute.js.map +1 -0
  17. package/dist/components/app-gate/ErrorRoute.d.ts +2 -0
  18. package/dist/components/app-gate/ErrorRoute.d.ts.map +1 -0
  19. package/dist/components/app-gate/ErrorRoute.js +27 -0
  20. package/dist/components/app-gate/ErrorRoute.js.map +1 -0
  21. package/dist/components/app-gate/FailureAlert.d.ts +5 -0
  22. package/dist/components/app-gate/FailureAlert.d.ts.map +1 -0
  23. package/dist/components/app-gate/FailureAlert.js +9 -0
  24. package/dist/components/app-gate/FailureAlert.js.map +1 -0
  25. package/dist/components/app-gate/NoDatastoreAccess.d.ts +8 -0
  26. package/dist/components/app-gate/NoDatastoreAccess.d.ts.map +1 -0
  27. package/dist/components/app-gate/NoDatastoreAccess.js +9 -0
  28. package/dist/components/app-gate/NoDatastoreAccess.js.map +1 -0
  29. package/dist/components/app-gate/NotFoundRoute.d.ts +2 -0
  30. package/dist/components/app-gate/NotFoundRoute.d.ts.map +1 -0
  31. package/dist/components/app-gate/NotFoundRoute.js +9 -0
  32. package/dist/components/app-gate/NotFoundRoute.js.map +1 -0
  33. package/dist/components/app-gate/PendingInvitations.d.ts +5 -0
  34. package/dist/components/app-gate/PendingInvitations.d.ts.map +1 -0
  35. package/dist/components/app-gate/PendingInvitations.js +58 -0
  36. package/dist/components/app-gate/PendingInvitations.js.map +1 -0
  37. package/dist/components/app-gate/ServiceError.d.ts +8 -0
  38. package/dist/components/app-gate/ServiceError.d.ts.map +1 -0
  39. package/dist/components/app-gate/ServiceError.js +10 -0
  40. package/dist/components/app-gate/ServiceError.js.map +1 -0
  41. package/dist/components/app-gate/index.d.ts +3 -0
  42. package/dist/components/app-gate/index.d.ts.map +1 -0
  43. package/dist/components/app-gate/index.js +3 -0
  44. package/dist/components/app-gate/index.js.map +1 -0
  45. package/dist/components/app-gate/sdk-route-elements.d.ts +23 -0
  46. package/dist/components/app-gate/sdk-route-elements.d.ts.map +1 -0
  47. package/dist/components/app-gate/sdk-route-elements.js +35 -0
  48. package/dist/components/app-gate/sdk-route-elements.js.map +1 -0
  49. package/dist/components/app-shell/AppShell.d.ts +7 -0
  50. package/dist/components/app-shell/AppShell.d.ts.map +1 -0
  51. package/dist/components/app-shell/AppShell.js +10 -0
  52. package/dist/components/app-shell/AppShell.js.map +1 -0
  53. package/dist/components/app-shell/AppShellRoutes.d.ts +9 -0
  54. package/dist/components/app-shell/AppShellRoutes.d.ts.map +1 -0
  55. package/dist/components/app-shell/AppShellRoutes.js +20 -0
  56. package/dist/components/app-shell/AppShellRoutes.js.map +1 -0
  57. package/dist/components/app-shell/GroupDatastores.d.ts +8 -0
  58. package/dist/components/app-shell/GroupDatastores.d.ts.map +1 -0
  59. package/dist/components/app-shell/GroupDatastores.js +15 -0
  60. package/dist/components/app-shell/GroupDatastores.js.map +1 -0
  61. package/dist/components/app-shell/GroupRoute.d.ts +2 -0
  62. package/dist/components/app-shell/GroupRoute.d.ts.map +1 -0
  63. package/dist/components/app-shell/GroupRoute.js +22 -0
  64. package/dist/components/app-shell/GroupRoute.js.map +1 -0
  65. package/dist/components/app-shell/index.d.ts +3 -0
  66. package/dist/components/app-shell/index.d.ts.map +1 -0
  67. package/dist/components/app-shell/index.js +3 -0
  68. package/dist/components/app-shell/index.js.map +1 -0
  69. package/dist/components/authenticated-chat/index.d.ts +1 -2
  70. package/dist/components/authenticated-chat/index.d.ts.map +1 -1
  71. package/dist/components/authenticated-chat/index.js +1 -12
  72. package/dist/components/authenticated-chat/index.js.map +1 -1
  73. package/dist/components/chat-view/Chat.d.ts +2 -1
  74. package/dist/components/chat-view/Chat.d.ts.map +1 -1
  75. package/dist/components/chat-view/Chat.js +3 -2
  76. package/dist/components/chat-view/Chat.js.map +1 -1
  77. package/dist/components/chat-view/MessageItem.d.ts.map +1 -1
  78. package/dist/components/chat-view/MessageItem.js +4 -2
  79. package/dist/components/chat-view/MessageItem.js.map +1 -1
  80. package/dist/components/chat-view/tool-part-rendering.d.ts +1 -0
  81. package/dist/components/chat-view/tool-part-rendering.d.ts.map +1 -1
  82. package/dist/components/chat-view/tool-part-rendering.js +8 -1
  83. package/dist/components/chat-view/tool-part-rendering.js.map +1 -1
  84. package/dist/components/chip/index.d.ts +1 -0
  85. package/dist/components/chip/index.d.ts.map +1 -1
  86. package/dist/components/chip/index.js +2 -1
  87. package/dist/components/chip/index.js.map +1 -1
  88. package/dist/components/embedded-chat/index.d.ts +1 -1
  89. package/dist/components/embedded-chat/index.d.ts.map +1 -1
  90. package/dist/components/embedded-chat/index.js +1 -1
  91. package/dist/components/embedded-chat/index.js.map +1 -1
  92. package/dist/components/input/input-date-time.d.ts +6 -0
  93. package/dist/components/input/input-date-time.d.ts.map +1 -1
  94. package/dist/components/input/input-date-time.js +2 -1
  95. package/dist/components/input/input-date-time.js.map +1 -1
  96. package/dist/components/input/input-date.d.ts +22 -0
  97. package/dist/components/input/input-date.d.ts.map +1 -1
  98. package/dist/components/input/input-date.js +28 -14
  99. package/dist/components/input/input-date.js.map +1 -1
  100. package/dist/components/input/input-time.d.ts +9 -0
  101. package/dist/components/input/input-time.d.ts.map +1 -1
  102. package/dist/components/input/input-time.js +29 -18
  103. package/dist/components/input/input-time.js.map +1 -1
  104. package/dist/components/layouts/RouteLayout.d.ts +0 -9
  105. package/dist/components/layouts/RouteLayout.d.ts.map +1 -1
  106. package/dist/components/layouts/RouteLayout.js +7 -4
  107. package/dist/components/layouts/RouteLayout.js.map +1 -1
  108. package/dist/components/layouts/Sidebar.d.ts +1 -8
  109. package/dist/components/layouts/Sidebar.d.ts.map +1 -1
  110. package/dist/components/layouts/Sidebar.js +7 -14
  111. package/dist/components/layouts/Sidebar.js.map +1 -1
  112. package/dist/components/plan-limits/PlanLimitsDialog.d.ts +20 -0
  113. package/dist/components/plan-limits/PlanLimitsDialog.d.ts.map +1 -0
  114. package/dist/components/plan-limits/PlanLimitsDialog.js +109 -0
  115. package/dist/components/plan-limits/PlanLimitsDialog.js.map +1 -0
  116. package/dist/components/plan-limits/index.d.ts +4 -0
  117. package/dist/components/plan-limits/index.d.ts.map +1 -0
  118. package/dist/components/plan-limits/index.js +2 -0
  119. package/dist/components/plan-limits/index.js.map +1 -0
  120. package/dist/components/plan-limits/plan-limits-client.d.ts +15 -0
  121. package/dist/components/plan-limits/plan-limits-client.d.ts.map +1 -0
  122. package/dist/components/plan-limits/plan-limits-client.js +44 -0
  123. package/dist/components/plan-limits/plan-limits-client.js.map +1 -0
  124. package/dist/components/plan-limits/plan-limits-model.d.ts +66 -0
  125. package/dist/components/plan-limits/plan-limits-model.d.ts.map +1 -0
  126. package/dist/components/plan-limits/plan-limits-model.js +123 -0
  127. package/dist/components/plan-limits/plan-limits-model.js.map +1 -0
  128. package/dist/components/plan-limits/plan-limits-save.d.ts +31 -0
  129. package/dist/components/plan-limits/plan-limits-save.d.ts.map +1 -0
  130. package/dist/components/plan-limits/plan-limits-save.js +43 -0
  131. package/dist/components/plan-limits/plan-limits-save.js.map +1 -0
  132. package/dist/components/planning/PlanLimitsAction.d.ts +6 -0
  133. package/dist/components/planning/PlanLimitsAction.d.ts.map +1 -0
  134. package/dist/components/planning/PlanLimitsAction.js +19 -0
  135. package/dist/components/planning/PlanLimitsAction.js.map +1 -0
  136. package/dist/components/slider/index.d.ts.map +1 -1
  137. package/dist/components/slider/index.js +2 -1
  138. package/dist/components/slider/index.js.map +1 -1
  139. package/dist/datastore-picker/datastore-picker-rows.d.ts +7 -0
  140. package/dist/datastore-picker/datastore-picker-rows.d.ts.map +1 -1
  141. package/dist/datastore-picker/datastore-picker-rows.js +26 -22
  142. package/dist/datastore-picker/datastore-picker-rows.js.map +1 -1
  143. package/dist/globals.css +85 -2
  144. package/dist/hooks/use-action-plans-list.d.ts +3 -0
  145. package/dist/hooks/use-action-plans-list.d.ts.map +1 -1
  146. package/dist/hooks/use-action-plans-list.js +8 -9
  147. package/dist/hooks/use-action-plans-list.js.map +1 -1
  148. package/dist/hooks/use-activity-feed.d.ts +10 -1
  149. package/dist/hooks/use-activity-feed.d.ts.map +1 -1
  150. package/dist/hooks/use-activity-feed.js +9 -11
  151. package/dist/hooks/use-activity-feed.js.map +1 -1
  152. package/dist/hooks/use-entity.d.ts +4 -3
  153. package/dist/hooks/use-entity.d.ts.map +1 -1
  154. package/dist/hooks/use-entity.js +4 -4
  155. package/dist/hooks/use-entity.js.map +1 -1
  156. package/dist/hooks/use-manual-actions.d.ts +1 -1
  157. package/dist/hooks/use-manual-actions.d.ts.map +1 -1
  158. package/dist/hooks/use-manual-actions.js +5 -5
  159. package/dist/hooks/use-manual-actions.js.map +1 -1
  160. package/dist/hooks/use-unsaved-changes-warning.d.ts +2 -0
  161. package/dist/hooks/use-unsaved-changes-warning.d.ts.map +1 -0
  162. package/dist/hooks/use-unsaved-changes-warning.js +13 -0
  163. package/dist/hooks/use-unsaved-changes-warning.js.map +1 -0
  164. package/dist/hooks/useAuth.d.ts.map +1 -1
  165. package/dist/hooks/useAuth.js +4 -3
  166. package/dist/hooks/useAuth.js.map +1 -1
  167. package/dist/hooks/useChatPanelSync.d.ts.map +1 -1
  168. package/dist/hooks/useChatPanelSync.js +2 -3
  169. package/dist/hooks/useChatPanelSync.js.map +1 -1
  170. package/dist/hooks/useDatastoreSelection.d.ts.map +1 -1
  171. package/dist/hooks/useDatastoreSelection.js +11 -4
  172. package/dist/hooks/useDatastoreSelection.js.map +1 -1
  173. package/dist/hooks/useExecuteAction.d.ts +1 -0
  174. package/dist/hooks/useExecuteAction.d.ts.map +1 -1
  175. package/dist/hooks/useExecuteAction.js.map +1 -1
  176. package/dist/hooks/useLoginRedirect.d.ts +6 -0
  177. package/dist/hooks/useLoginRedirect.d.ts.map +1 -0
  178. package/dist/hooks/useLoginRedirect.js +51 -0
  179. package/dist/hooks/useLoginRedirect.js.map +1 -0
  180. package/dist/hooks/usePlanLimits.d.ts +18 -0
  181. package/dist/hooks/usePlanLimits.d.ts.map +1 -0
  182. package/dist/hooks/usePlanLimits.js +56 -0
  183. package/dist/hooks/usePlanLimits.js.map +1 -0
  184. package/dist/ldo-ui.d.ts +1 -1
  185. package/dist/ldo-ui.d.ts.map +1 -1
  186. package/dist/ldo-ui.js.map +1 -1
  187. package/dist/lib/app-tools.d.ts +18 -0
  188. package/dist/lib/app-tools.d.ts.map +1 -0
  189. package/dist/lib/app-tools.js +42 -0
  190. package/dist/lib/app-tools.js.map +1 -0
  191. package/dist/lib/chat-types.d.ts +3 -0
  192. package/dist/lib/chat-types.d.ts.map +1 -1
  193. package/dist/lib/chat-types.js.map +1 -1
  194. package/dist/lib/datastore-route-table.d.ts +3 -0
  195. package/dist/lib/datastore-route-table.d.ts.map +1 -1
  196. package/dist/lib/datastore-route-table.js +6 -0
  197. package/dist/lib/datastore-route-table.js.map +1 -1
  198. package/dist/lib/graphql-error.d.ts +2 -0
  199. package/dist/lib/graphql-error.d.ts.map +1 -0
  200. package/dist/lib/graphql-error.js +7 -0
  201. package/dist/lib/graphql-error.js.map +1 -0
  202. package/dist/lib/update-notice.d.ts +2 -1
  203. package/dist/lib/update-notice.d.ts.map +1 -1
  204. package/dist/lib/update-notice.js +8 -2
  205. package/dist/lib/update-notice.js.map +1 -1
  206. package/dist/providers/ActiveChatProvider.d.ts +2 -0
  207. package/dist/providers/ActiveChatProvider.d.ts.map +1 -1
  208. package/dist/providers/ActiveChatProvider.js +6 -3
  209. package/dist/providers/ActiveChatProvider.js.map +1 -1
  210. package/dist/providers/ActiveDatastoreProvider.d.ts +12 -0
  211. package/dist/providers/ActiveDatastoreProvider.d.ts.map +1 -1
  212. package/dist/providers/ActiveDatastoreProvider.js +114 -11
  213. package/dist/providers/ActiveDatastoreProvider.js.map +1 -1
  214. package/dist/providers/AuthContext.d.ts +1 -0
  215. package/dist/providers/AuthContext.d.ts.map +1 -1
  216. package/dist/providers/AuthContext.js.map +1 -1
  217. package/dist/providers/KnowledgeGraphStateContext.d.ts +2 -2
  218. package/dist/providers/KnowledgeGraphStateContext.d.ts.map +1 -1
  219. package/dist/providers/KnowledgeGraphStateProvider.d.ts.map +1 -1
  220. package/dist/providers/KnowledgeGraphStateProvider.js +8 -49
  221. package/dist/providers/KnowledgeGraphStateProvider.js.map +1 -1
  222. package/dist/providers/MantaClientProvider.d.ts.map +1 -1
  223. package/dist/providers/MantaClientProvider.js +3 -3
  224. package/dist/providers/MantaClientProvider.js.map +1 -1
  225. package/dist/providers/index.d.ts +3 -1
  226. package/dist/providers/index.d.ts.map +1 -1
  227. package/dist/providers/index.js +2 -2
  228. package/dist/providers/index.js.map +1 -1
  229. package/dist/routes/activity/detail/ActivityDetailRoute.d.ts.map +1 -1
  230. package/dist/routes/activity/detail/ActivityDetailRoute.js +1 -3
  231. package/dist/routes/activity/detail/ActivityDetailRoute.js.map +1 -1
  232. package/dist/routes/activity/index.d.ts.map +1 -1
  233. package/dist/routes/activity/index.js +1 -3
  234. package/dist/routes/activity/index.js.map +1 -1
  235. package/dist/routes/chat/index.d.ts +2 -21
  236. package/dist/routes/chat/index.d.ts.map +1 -1
  237. package/dist/routes/chat/index.js +4 -2
  238. package/dist/routes/chat/index.js.map +1 -1
  239. package/dist/routes/data-collection/index.d.ts.map +1 -1
  240. package/dist/routes/data-collection/index.js +1 -3
  241. package/dist/routes/data-collection/index.js.map +1 -1
  242. package/dist/routes/data-explorer/components/DataExplorerLayout.d.ts.map +1 -1
  243. package/dist/routes/data-explorer/components/DataExplorerLayout.js +1 -3
  244. package/dist/routes/data-explorer/components/DataExplorerLayout.js.map +1 -1
  245. package/dist/routes/data-explorer/components/class-detail/UsedByRules.js +2 -2
  246. package/dist/routes/data-explorer/components/class-detail/UsedByRules.js.map +1 -1
  247. package/dist/routes/datastores/index.d.ts.map +1 -1
  248. package/dist/routes/datastores/index.js +2 -2
  249. package/dist/routes/datastores/index.js.map +1 -1
  250. package/dist/routes/explain/index.d.ts.map +1 -1
  251. package/dist/routes/explain/index.js +1 -3
  252. package/dist/routes/explain/index.js.map +1 -1
  253. package/dist/routes/integrations/components/connect-forms/DashConnectForm.d.ts.map +1 -1
  254. package/dist/routes/integrations/components/connect-forms/DashConnectForm.js +0 -1
  255. package/dist/routes/integrations/components/connect-forms/DashConnectForm.js.map +1 -1
  256. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.d.ts.map +1 -1
  257. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.js +0 -1
  258. package/dist/routes/integrations/components/connect-forms/GoogleAdsConnectForm.js.map +1 -1
  259. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.d.ts.map +1 -1
  260. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.js +0 -1
  261. package/dist/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.js.map +1 -1
  262. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.d.ts.map +1 -1
  263. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js +0 -1
  264. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js.map +1 -1
  265. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.d.ts +0 -1
  266. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.d.ts.map +1 -1
  267. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.js +3 -2
  268. package/dist/routes/integrations/components/connect-forms/InferalCredentialConnectForm.js.map +1 -1
  269. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.d.ts.map +1 -1
  270. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.js +0 -1
  271. package/dist/routes/integrations/components/connect-forms/KlaviyoConnectForm.js.map +1 -1
  272. package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.d.ts.map +1 -1
  273. package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.js +0 -1
  274. package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.js.map +1 -1
  275. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts +0 -1
  276. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.d.ts.map +1 -1
  277. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js +4 -3
  278. package/dist/routes/integrations/components/connect-forms/OAuthSetupConnectForm.js.map +1 -1
  279. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.d.ts.map +1 -1
  280. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.js +0 -1
  281. package/dist/routes/integrations/components/connect-forms/TriplewhaleConnectForm.js.map +1 -1
  282. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.d.ts.map +1 -1
  283. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.js +0 -1
  284. package/dist/routes/integrations/components/connect-forms/WoocommerceConnectForm.js.map +1 -1
  285. package/dist/routes/integrations/types.d.ts +2 -1
  286. package/dist/routes/integrations/types.d.ts.map +1 -1
  287. package/dist/routes/integrations/types.js +16 -0
  288. package/dist/routes/integrations/types.js.map +1 -1
  289. package/dist/routes/memories/components/DateValueInput.d.ts +16 -0
  290. package/dist/routes/memories/components/DateValueInput.d.ts.map +1 -0
  291. package/dist/routes/memories/components/DateValueInput.js +35 -0
  292. package/dist/routes/memories/components/DateValueInput.js.map +1 -0
  293. package/dist/routes/memories/components/EntityValuePicker.d.ts +11 -0
  294. package/dist/routes/memories/components/EntityValuePicker.d.ts.map +1 -0
  295. package/dist/routes/memories/components/EntityValuePicker.js +61 -0
  296. package/dist/routes/memories/components/EntityValuePicker.js.map +1 -0
  297. package/dist/routes/memories/components/FieldLabel.d.ts +12 -0
  298. package/dist/routes/memories/components/FieldLabel.d.ts.map +1 -0
  299. package/dist/routes/memories/components/FieldLabel.js +12 -0
  300. package/dist/routes/memories/components/FieldLabel.js.map +1 -0
  301. package/dist/routes/memories/components/ImportanceSlider.d.ts +2 -0
  302. package/dist/routes/memories/components/ImportanceSlider.d.ts.map +1 -1
  303. package/dist/routes/memories/components/ImportanceSlider.js +4 -1
  304. package/dist/routes/memories/components/ImportanceSlider.js.map +1 -1
  305. package/dist/routes/memories/components/MemoriesFilters.d.ts +2 -2
  306. package/dist/routes/memories/components/MemoriesFilters.d.ts.map +1 -1
  307. package/dist/routes/memories/components/MemoriesFilters.js.map +1 -1
  308. package/dist/routes/memories/components/MemoriesPanel.d.ts.map +1 -1
  309. package/dist/routes/memories/components/MemoriesPanel.js +4 -0
  310. package/dist/routes/memories/components/MemoriesPanel.js.map +1 -1
  311. package/dist/routes/memories/components/MemoriesTabPanel.d.ts +2 -2
  312. package/dist/routes/memories/components/MemoriesTabPanel.d.ts.map +1 -1
  313. package/dist/routes/memories/components/MemoryActions.d.ts +2 -0
  314. package/dist/routes/memories/components/MemoryActions.d.ts.map +1 -1
  315. package/dist/routes/memories/components/MemoryActions.js +3 -3
  316. package/dist/routes/memories/components/MemoryActions.js.map +1 -1
  317. package/dist/routes/memories/components/MemoryFields.d.ts +15 -3
  318. package/dist/routes/memories/components/MemoryFields.d.ts.map +1 -1
  319. package/dist/routes/memories/components/MemoryFields.js +34 -5
  320. package/dist/routes/memories/components/MemoryFields.js.map +1 -1
  321. package/dist/routes/memories/components/MemoryFormDialog.d.ts +6 -3
  322. package/dist/routes/memories/components/MemoryFormDialog.d.ts.map +1 -1
  323. package/dist/routes/memories/components/MemoryFormDialog.js +105 -59
  324. package/dist/routes/memories/components/MemoryFormDialog.js.map +1 -1
  325. package/dist/routes/memories/components/MemoryPropertyFields.d.ts +10 -0
  326. package/dist/routes/memories/components/MemoryPropertyFields.d.ts.map +1 -0
  327. package/dist/routes/memories/components/MemoryPropertyFields.js +67 -0
  328. package/dist/routes/memories/components/MemoryPropertyFields.js.map +1 -0
  329. package/dist/routes/memories/components/RuleDraftDialog.d.ts +7 -0
  330. package/dist/routes/memories/components/RuleDraftDialog.d.ts.map +1 -0
  331. package/dist/routes/memories/components/RuleDraftDialog.js +20 -0
  332. package/dist/routes/memories/components/RuleDraftDialog.js.map +1 -0
  333. package/dist/routes/memories/components/SchemasTab.d.ts +17 -2
  334. package/dist/routes/memories/components/SchemasTab.d.ts.map +1 -1
  335. package/dist/routes/memories/components/SchemasTab.js +146 -28
  336. package/dist/routes/memories/components/SchemasTab.js.map +1 -1
  337. package/dist/routes/memories/components/badges.d.ts +7 -0
  338. package/dist/routes/memories/components/badges.d.ts.map +1 -1
  339. package/dist/routes/memories/components/badges.js +11 -3
  340. package/dist/routes/memories/components/badges.js.map +1 -1
  341. package/dist/routes/memories/hooks/useMemoryColumns.d.ts +4 -2
  342. package/dist/routes/memories/hooks/useMemoryColumns.d.ts.map +1 -1
  343. package/dist/routes/memories/hooks/useMemoryColumns.js +31 -15
  344. package/dist/routes/memories/hooks/useMemoryColumns.js.map +1 -1
  345. package/dist/routes/memories/index.d.ts +2 -1
  346. package/dist/routes/memories/index.d.ts.map +1 -1
  347. package/dist/routes/memories/index.js +72 -30
  348. package/dist/routes/memories/index.js.map +1 -1
  349. package/dist/routes/memories/memory-mutation-input.d.ts.map +1 -1
  350. package/dist/routes/memories/memory-mutation-input.js +5 -2
  351. package/dist/routes/memories/memory-mutation-input.js.map +1 -1
  352. package/dist/routes/memories/memory-property-values.d.ts +13 -0
  353. package/dist/routes/memories/memory-property-values.d.ts.map +1 -0
  354. package/dist/routes/memories/memory-property-values.js +40 -0
  355. package/dist/routes/memories/memory-property-values.js.map +1 -0
  356. package/dist/routes/memories/schemas/AllowedValuesField.d.ts +14 -0
  357. package/dist/routes/memories/schemas/AllowedValuesField.d.ts.map +1 -0
  358. package/dist/routes/memories/schemas/AllowedValuesField.js +64 -0
  359. package/dist/routes/memories/schemas/AllowedValuesField.js.map +1 -0
  360. package/dist/routes/memories/schemas/MemorySchemaPage.d.ts +127 -0
  361. package/dist/routes/memories/schemas/MemorySchemaPage.d.ts.map +1 -0
  362. package/dist/routes/memories/schemas/MemorySchemaPage.js +285 -0
  363. package/dist/routes/memories/schemas/MemorySchemaPage.js.map +1 -0
  364. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.d.ts +20 -0
  365. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.d.ts.map +1 -0
  366. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.js +54 -0
  367. package/dist/routes/memories/schemas/SchemaChangeReviewDialog.js.map +1 -0
  368. package/dist/routes/memories/schemas/SchemaConfirmDialog.d.ts +15 -0
  369. package/dist/routes/memories/schemas/SchemaConfirmDialog.d.ts.map +1 -0
  370. package/dist/routes/memories/schemas/SchemaConfirmDialog.js +8 -0
  371. package/dist/routes/memories/schemas/SchemaConfirmDialog.js.map +1 -0
  372. package/dist/routes/memories/schemas/SchemaDetailPage.d.ts +15 -0
  373. package/dist/routes/memories/schemas/SchemaDetailPage.d.ts.map +1 -0
  374. package/dist/routes/memories/schemas/SchemaDetailPage.js +74 -0
  375. package/dist/routes/memories/schemas/SchemaDetailPage.js.map +1 -0
  376. package/dist/routes/memories/schemas/SchemaEditorForm.d.ts +10 -0
  377. package/dist/routes/memories/schemas/SchemaEditorForm.d.ts.map +1 -0
  378. package/dist/routes/memories/schemas/SchemaEditorForm.js +242 -0
  379. package/dist/routes/memories/schemas/SchemaEditorForm.js.map +1 -0
  380. package/dist/routes/memories/schemas/SchemaTemplatesDialog.d.ts +13 -0
  381. package/dist/routes/memories/schemas/SchemaTemplatesDialog.d.ts.map +1 -0
  382. package/dist/routes/memories/schemas/SchemaTemplatesDialog.js +13 -0
  383. package/dist/routes/memories/schemas/SchemaTemplatesDialog.js.map +1 -0
  384. package/dist/routes/memories/schemas/ValueTypeSelect.d.ts +12 -0
  385. package/dist/routes/memories/schemas/ValueTypeSelect.d.ts.map +1 -0
  386. package/dist/routes/memories/schemas/ValueTypeSelect.js +10 -0
  387. package/dist/routes/memories/schemas/ValueTypeSelect.js.map +1 -0
  388. package/dist/routes/memories/schemas/schema-form.d.ts +72 -0
  389. package/dist/routes/memories/schemas/schema-form.d.ts.map +1 -0
  390. package/dist/routes/memories/schemas/schema-form.js +279 -0
  391. package/dist/routes/memories/schemas/schema-form.js.map +1 -0
  392. package/dist/routes/memories/schemas/schema-impact.d.ts +13 -0
  393. package/dist/routes/memories/schemas/schema-impact.d.ts.map +1 -0
  394. package/dist/routes/memories/schemas/schema-impact.js +40 -0
  395. package/dist/routes/memories/schemas/schema-impact.js.map +1 -0
  396. package/dist/routes/memories/schemas/schema-route.d.ts +18 -0
  397. package/dist/routes/memories/schemas/schema-route.d.ts.map +1 -0
  398. package/dist/routes/memories/schemas/schema-route.js +21 -0
  399. package/dist/routes/memories/schemas/schema-route.js.map +1 -0
  400. package/dist/routes/memories/schemas/schema-rule-context.d.ts +17 -0
  401. package/dist/routes/memories/schemas/schema-rule-context.d.ts.map +1 -0
  402. package/dist/routes/memories/schemas/schema-rule-context.js +83 -0
  403. package/dist/routes/memories/schemas/schema-rule-context.js.map +1 -0
  404. package/dist/routes/memories/schemas/schema-table.d.ts +11 -0
  405. package/dist/routes/memories/schemas/schema-table.d.ts.map +1 -0
  406. package/dist/routes/memories/schemas/schema-table.js +34 -0
  407. package/dist/routes/memories/schemas/schema-table.js.map +1 -0
  408. package/dist/routes/memories/schemas/useMemorySchemaMutations.d.ts +32 -0
  409. package/dist/routes/memories/schemas/useMemorySchemaMutations.d.ts.map +1 -0
  410. package/dist/routes/memories/schemas/useMemorySchemaMutations.js +31 -0
  411. package/dist/routes/memories/schemas/useMemorySchemaMutations.js.map +1 -0
  412. package/dist/routes/memories/schemas/useSchemaChangeReview.d.ts +51 -0
  413. package/dist/routes/memories/schemas/useSchemaChangeReview.d.ts.map +1 -0
  414. package/dist/routes/memories/schemas/useSchemaChangeReview.js +175 -0
  415. package/dist/routes/memories/schemas/useSchemaChangeReview.js.map +1 -0
  416. package/dist/routes/memories/schemas/useSchemaLifecycle.d.ts +46 -0
  417. package/dist/routes/memories/schemas/useSchemaLifecycle.d.ts.map +1 -0
  418. package/dist/routes/memories/schemas/useSchemaLifecycle.js +93 -0
  419. package/dist/routes/memories/schemas/useSchemaLifecycle.js.map +1 -0
  420. package/dist/routes/memories/schemas/useSchemasTab.d.ts +18 -0
  421. package/dist/routes/memories/schemas/useSchemasTab.d.ts.map +1 -0
  422. package/dist/routes/memories/schemas/useSchemasTab.js +92 -0
  423. package/dist/routes/memories/schemas/useSchemasTab.js.map +1 -0
  424. package/dist/routes/plans/index.d.ts.map +1 -1
  425. package/dist/routes/plans/index.js +2 -2
  426. package/dist/routes/plans/index.js.map +1 -1
  427. package/dist/routes/rules/components/CreateRuleChatModal.d.ts +7 -1
  428. package/dist/routes/rules/components/CreateRuleChatModal.d.ts.map +1 -1
  429. package/dist/routes/rules/components/CreateRuleChatModal.js +9 -4
  430. package/dist/routes/rules/components/CreateRuleChatModal.js.map +1 -1
  431. package/dist/routes/rules/components/RuleValueControls.d.ts.map +1 -1
  432. package/dist/routes/rules/components/RuleValueControls.js +3 -24
  433. package/dist/routes/rules/components/RuleValueControls.js.map +1 -1
  434. package/dist/routes/rules/components/rule-value-input.d.ts +11 -0
  435. package/dist/routes/rules/components/rule-value-input.d.ts.map +1 -0
  436. package/dist/routes/rules/components/rule-value-input.js +24 -0
  437. package/dist/routes/rules/components/rule-value-input.js.map +1 -0
  438. package/dist/routes/rules/components/rules.utils.d.ts +5 -0
  439. package/dist/routes/rules/components/rules.utils.d.ts.map +1 -1
  440. package/dist/routes/rules/components/rules.utils.js +18 -3
  441. package/dist/routes/rules/components/rules.utils.js.map +1 -1
  442. package/dist/routes/rules/pages.d.ts +1 -1
  443. package/dist/routes/rules/pages.d.ts.map +1 -1
  444. package/dist/routes/rules/pages.js +1 -1
  445. package/dist/routes/rules/pages.js.map +1 -1
  446. package/dist/shared/graph-derived-queries.d.ts.map +1 -1
  447. package/dist/shared/graph-derived-queries.js +4 -1
  448. package/dist/shared/graph-derived-queries.js.map +1 -1
  449. package/dist/worker/index.d.ts +22 -0
  450. package/dist/worker/index.d.ts.map +1 -0
  451. package/dist/worker/index.js +110 -0
  452. package/dist/worker/index.js.map +1 -0
  453. package/dist/worker/policy.d.ts +21 -0
  454. package/dist/worker/policy.d.ts.map +1 -0
  455. package/dist/worker/policy.js +42 -0
  456. package/dist/worker/policy.js.map +1 -0
  457. package/dist/worker/proxy.d.ts +14 -0
  458. package/dist/worker/proxy.d.ts.map +1 -0
  459. package/dist/worker/proxy.js +58 -0
  460. package/dist/worker/proxy.js.map +1 -0
  461. package/dist/worker/session.d.ts +24 -0
  462. package/dist/worker/session.d.ts.map +1 -0
  463. package/dist/worker/session.js +72 -0
  464. package/dist/worker/session.js.map +1 -0
  465. package/package.json +52 -7
  466. package/src/app-subpaths.json +9 -1
  467. package/src/components/AppErrorBoundary.tsx +14 -11
  468. package/src/components/app-gate/AppGate.tsx +122 -0
  469. package/src/components/app-gate/AwaitingDatastoreStatus.tsx +35 -0
  470. package/src/components/app-gate/EnterDatastoreRoute.tsx +30 -0
  471. package/src/components/app-gate/ErrorRoute.tsx +43 -0
  472. package/src/components/app-gate/FailureAlert.tsx +15 -0
  473. package/src/components/app-gate/NoDatastoreAccess.tsx +26 -0
  474. package/src/components/app-gate/NotFoundRoute.tsx +20 -0
  475. package/src/components/app-gate/PendingInvitations.tsx +134 -0
  476. package/src/components/app-gate/ServiceError.tsx +27 -0
  477. package/src/components/app-gate/index.ts +2 -0
  478. package/src/components/app-gate/sdk-route-elements.tsx +46 -0
  479. package/src/components/app-shell/AppShell.tsx +22 -0
  480. package/src/components/app-shell/AppShellRoutes.tsx +34 -0
  481. package/src/components/app-shell/GroupDatastores.tsx +28 -0
  482. package/src/components/app-shell/GroupRoute.tsx +34 -0
  483. package/src/components/app-shell/index.ts +2 -0
  484. package/src/components/authenticated-chat/index.tsx +1 -34
  485. package/src/components/chat-view/Chat.tsx +9 -3
  486. package/src/components/chat-view/MessageItem.tsx +10 -2
  487. package/src/components/chat-view/tool-part-rendering.ts +10 -1
  488. package/src/components/chip/index.tsx +8 -1
  489. package/src/components/embedded-chat/index.tsx +2 -1
  490. package/src/components/input/input-date-time.tsx +10 -3
  491. package/src/components/input/input-date.tsx +93 -21
  492. package/src/components/input/input-time.tsx +59 -26
  493. package/src/components/layouts/RouteLayout.tsx +11 -50
  494. package/src/components/layouts/Sidebar.tsx +21 -23
  495. package/src/components/plan-limits/PlanLimitsDialog.tsx +331 -0
  496. package/src/components/plan-limits/index.tsx +3 -0
  497. package/src/components/plan-limits/plan-limits-client.ts +71 -0
  498. package/src/components/plan-limits/plan-limits-model.ts +180 -0
  499. package/src/components/plan-limits/plan-limits-save.ts +68 -0
  500. package/src/components/planning/PlanLimitsAction.tsx +44 -0
  501. package/src/components/slider/index.tsx +2 -1
  502. package/src/datastore-picker/datastore-picker-rows.ts +36 -20
  503. package/src/hooks/use-action-plans-list.ts +20 -12
  504. package/src/hooks/use-activity-feed.ts +30 -14
  505. package/src/hooks/use-entity.ts +11 -6
  506. package/src/hooks/use-manual-actions.ts +11 -6
  507. package/src/hooks/use-unsaved-changes-warning.ts +12 -0
  508. package/src/hooks/useAuth.ts +5 -3
  509. package/src/hooks/useChatPanelSync.ts +2 -3
  510. package/src/hooks/useDatastoreSelection.ts +10 -4
  511. package/src/hooks/useExecuteAction.ts +2 -0
  512. package/src/hooks/useLoginRedirect.ts +66 -0
  513. package/src/hooks/usePlanLimits.ts +97 -0
  514. package/src/ldo-ui.ts +1 -0
  515. package/src/lib/app-tools.ts +63 -0
  516. package/src/lib/chat-types.ts +5 -0
  517. package/src/lib/datastore-route-table.ts +9 -0
  518. package/src/lib/graphql-error.ts +7 -0
  519. package/src/lib/update-notice.ts +12 -2
  520. package/src/providers/ActiveChatProvider.tsx +8 -3
  521. package/src/providers/ActiveDatastoreProvider.tsx +179 -9
  522. package/src/providers/AuthContext.ts +1 -0
  523. package/src/providers/KnowledgeGraphStateContext.ts +2 -2
  524. package/src/providers/KnowledgeGraphStateProvider.tsx +13 -65
  525. package/src/providers/MantaClientProvider.tsx +8 -3
  526. package/src/providers/index.tsx +7 -4
  527. package/src/routes/activity/detail/ActivityDetailRoute.tsx +1 -10
  528. package/src/routes/activity/index.tsx +1 -10
  529. package/src/routes/chat/index.tsx +11 -47
  530. package/src/routes/data-collection/index.tsx +1 -11
  531. package/src/routes/data-explorer/components/DataExplorerLayout.tsx +1 -11
  532. package/src/routes/data-explorer/components/class-detail/UsedByRules.tsx +2 -2
  533. package/src/routes/datastores/index.tsx +3 -9
  534. package/src/routes/explain/index.tsx +1 -11
  535. package/src/routes/integrations/components/connect-forms/DashConnectForm.tsx +0 -1
  536. package/src/routes/integrations/components/connect-forms/GoogleAdsConnectForm.tsx +0 -1
  537. package/src/routes/integrations/components/connect-forms/GoogleAnalyticsConnectForm.tsx +0 -1
  538. package/src/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.tsx +0 -1
  539. package/src/routes/integrations/components/connect-forms/InferalCredentialConnectForm.tsx +5 -3
  540. package/src/routes/integrations/components/connect-forms/KlaviyoConnectForm.tsx +0 -1
  541. package/src/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.tsx +0 -1
  542. package/src/routes/integrations/components/connect-forms/OAuthSetupConnectForm.tsx +7 -7
  543. package/src/routes/integrations/components/connect-forms/TriplewhaleConnectForm.tsx +0 -1
  544. package/src/routes/integrations/components/connect-forms/WoocommerceConnectForm.tsx +0 -1
  545. package/src/routes/integrations/types.ts +22 -6
  546. package/src/routes/memories/components/DateValueInput.tsx +72 -0
  547. package/src/routes/memories/components/EntityValuePicker.tsx +132 -0
  548. package/src/routes/memories/components/FieldLabel.tsx +49 -0
  549. package/src/routes/memories/components/ImportanceSlider.tsx +5 -1
  550. package/src/routes/memories/components/MemoriesFilters.tsx +2 -2
  551. package/src/routes/memories/components/MemoriesPanel.tsx +7 -3
  552. package/src/routes/memories/components/MemoriesTabPanel.tsx +2 -2
  553. package/src/routes/memories/components/MemoryActions.tsx +26 -2
  554. package/src/routes/memories/components/MemoryFields.tsx +75 -12
  555. package/src/routes/memories/components/MemoryFormDialog.tsx +305 -199
  556. package/src/routes/memories/components/MemoryPropertyFields.tsx +288 -0
  557. package/src/routes/memories/components/RuleDraftDialog.tsx +35 -0
  558. package/src/routes/memories/components/SchemasTab.tsx +481 -118
  559. package/src/routes/memories/components/badges.tsx +16 -4
  560. package/src/routes/memories/hooks/useMemoryColumns.tsx +69 -35
  561. package/src/routes/memories/index.tsx +125 -51
  562. package/src/routes/memories/memory-mutation-input.ts +5 -2
  563. package/src/routes/memories/memory-property-values.ts +83 -0
  564. package/src/routes/memories/schemas/AllowedValuesField.tsx +188 -0
  565. package/src/routes/memories/schemas/MemorySchemaPage.tsx +476 -0
  566. package/src/routes/memories/schemas/SchemaChangeReviewDialog.tsx +290 -0
  567. package/src/routes/memories/schemas/SchemaConfirmDialog.tsx +62 -0
  568. package/src/routes/memories/schemas/SchemaDetailPage.tsx +373 -0
  569. package/src/routes/memories/schemas/SchemaEditorForm.tsx +990 -0
  570. package/src/routes/memories/schemas/SchemaTemplatesDialog.tsx +81 -0
  571. package/src/routes/memories/schemas/ValueTypeSelect.tsx +37 -0
  572. package/src/routes/memories/schemas/schema-form.ts +360 -0
  573. package/src/routes/memories/schemas/schema-impact.ts +66 -0
  574. package/src/routes/memories/schemas/schema-route.ts +30 -0
  575. package/src/routes/memories/schemas/schema-rule-context.ts +103 -0
  576. package/src/routes/memories/schemas/schema-table.ts +54 -0
  577. package/src/routes/memories/schemas/useMemorySchemaMutations.ts +49 -0
  578. package/src/routes/memories/schemas/useSchemaChangeReview.ts +238 -0
  579. package/src/routes/memories/schemas/useSchemaLifecycle.tsx +151 -0
  580. package/src/routes/memories/schemas/useSchemasTab.ts +119 -0
  581. package/src/routes/plans/index.tsx +3 -14
  582. package/src/routes/rules/components/CreateRuleChatModal.tsx +46 -22
  583. package/src/routes/rules/components/RuleValueControls.tsx +3 -35
  584. package/src/routes/rules/components/rule-value-input.ts +34 -0
  585. package/src/routes/rules/components/rules.utils.ts +25 -3
  586. package/src/routes/rules/pages.ts +5 -1
  587. package/src/shared/graph-derived-queries.ts +6 -0
  588. package/src/themes/manta-dark.css +4 -0
  589. package/src/worker/index.ts +175 -0
  590. package/src/worker/policy.ts +62 -0
  591. package/src/worker/proxy.ts +101 -0
  592. package/src/worker/session.ts +111 -0
@@ -0,0 +1,990 @@
1
+ import { GQLMemorySchemaValueType } from "@manta-eu/client";
2
+ import { isPresent } from "@manta-eu/lib/present";
3
+ import { ArrowDown, ArrowUp, Check, Ellipsis, GripVertical, Pencil, Plus, Trash2 } from "lucide-react";
4
+ import { useEffect, useRef, useState, type ReactNode } from "react";
5
+ import { DateValueInput } from "../components/DateValueInput";
6
+ import { FieldLabel } from "../components/FieldLabel";
7
+ import { importanceLabel, importanceSteps } from "../components/ImportanceSlider";
8
+ import { AllowedValuesField, escapeClearsTypedValue } from "./AllowedValuesField";
9
+ import {
10
+ emptyPropertyForm,
11
+ hasErrorsUnder,
12
+ kindLabels,
13
+ loadPatternCheck,
14
+ memorySchemaPropertyLimit,
15
+ moveItem,
16
+ propertyErrorPrefix,
17
+ propertyFormErrors,
18
+ propertySettings,
19
+ propertyTags,
20
+ withValueType,
21
+ scopeLabels,
22
+ volatilityLabels,
23
+ type SchemaForm,
24
+ type SchemaFormErrors,
25
+ type SchemaPropertyForm,
26
+ valueTypeLabels,
27
+ } from "./schema-form";
28
+ import { ValueTypeSelect } from "./ValueTypeSelect";
29
+ import { Banner } from "#components/banner/index";
30
+ import { Button } from "#components/button/index";
31
+ import { Dropdown, DropdownContent, DropdownItem, DropdownTrigger } from "#components/dropdown/index";
32
+ import { Input, Textarea } from "#components/input/index";
33
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "#components/select/index";
34
+ import {
35
+ Sheet,
36
+ SheetBody,
37
+ SheetContent,
38
+ SheetDescription,
39
+ SheetFooter,
40
+ SheetHeader,
41
+ SheetTitle,
42
+ } from "#components/sheet/index";
43
+ import { Switch } from "#components/switch/index";
44
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "#components/tooltip/index";
45
+ import { cn } from "#lib/utils";
46
+
47
+ const unsetValue = "unset";
48
+
49
+ type ChoiceSelectProps<T extends string> = {
50
+ id: string;
51
+ label: string;
52
+ hint?: string;
53
+ value: T | null;
54
+ choices: readonly { value: T; label: string }[];
55
+ onChange: (value: T | null) => void;
56
+ error?: string;
57
+ disabled?: boolean;
58
+ };
59
+
60
+ function ChoiceSelect<T extends string>(props: ChoiceSelectProps<T>) {
61
+ const { id, label, hint, value, choices, onChange, error, disabled } = props;
62
+ return (
63
+ <div className="flex flex-col gap-1.5">
64
+ {hint ? (
65
+ <FieldLabel label={label} hint={hint} htmlFor={id} />
66
+ ) : (
67
+ <label htmlFor={id} className="typography-small">
68
+ {label}
69
+ </label>
70
+ )}
71
+ <Select
72
+ value={value ?? unsetValue}
73
+ disabled={disabled}
74
+ onValueChange={(next) =>
75
+ onChange(next === unsetValue ? null : (choices.find((c) => c.value === next)?.value ?? null))
76
+ }
77
+ >
78
+ <SelectTrigger label={label} id={id} hiddenLabel error={error}>
79
+ <SelectValue />
80
+ </SelectTrigger>
81
+ <SelectContent>
82
+ <SelectItem value={unsetValue}>Not set</SelectItem>
83
+ {choices.map((choice) => (
84
+ <SelectItem key={choice.value} value={choice.value}>
85
+ {choice.label}
86
+ </SelectItem>
87
+ ))}
88
+ </SelectContent>
89
+ </Select>
90
+ {error && <p className="typography-small text-error-foreground">{error}</p>}
91
+ </div>
92
+ );
93
+ }
94
+
95
+ function choicesOf<T extends string>(labels: Record<T, string>) {
96
+ return (Object.entries(labels) as [T, string][]).map(([value, label]) => ({ value, label }));
97
+ }
98
+
99
+ const kindChoices = choicesOf(kindLabels);
100
+ const volatilityChoices = choicesOf(volatilityLabels);
101
+ const scopeChoices = choicesOf(scopeLabels);
102
+
103
+ const importanceChoices = importanceSteps.map((step) => ({ value: String(step), label: importanceLabel(step) }));
104
+
105
+ type ActionTooltipProps = { label: string; children: ReactNode };
106
+
107
+ function ActionTooltip(props: ActionTooltipProps) {
108
+ const { label, children } = props;
109
+ return (
110
+ <TooltipProvider delayDuration={300}>
111
+ <Tooltip>
112
+ <TooltipTrigger asChild>{children}</TooltipTrigger>
113
+ <TooltipContent side="top" className="max-w-xs text-left typography-small">
114
+ {label}
115
+ </TooltipContent>
116
+ </Tooltip>
117
+ </TooltipProvider>
118
+ );
119
+ }
120
+
121
+ const propertyHints = {
122
+ label: "The name people and the agent see for this property.",
123
+ type: "What kind of value this property holds. It decides which constraints you can set. A linked record points to something already in your data, such as a campaign or an ad account, so rules can follow the link.",
124
+ key: "Names the property in the knowledge graph. It cannot change once saved.",
125
+ description: "Explains what to record here, for the people and the agent filling it in.",
126
+ required: "A memory of this schema cannot be saved without a value here.",
127
+ multiValued: "One memory can hold several values, such as several channels.",
128
+ keyProperty:
129
+ "A new memory replaces an old one when both have the same value here. Use it for what the memory is about, like a target's metric.",
130
+ computed: "A Datalog rule fills this in. Nobody writes it by hand, and chat extraction never sets it.",
131
+ options:
132
+ "Leave empty to accept any text. Add values to accept only those. Click a value to set how it is shown and what it means.",
133
+ minValue: "The smallest value accepted, inclusive.",
134
+ maxValue: "The largest value accepted, inclusive.",
135
+ unit: "Shown next to the value, such as EUR. It does not convert anything.",
136
+ maxLength: "The most characters a value can have.",
137
+ pattern: "A regular expression every value must match, such as ^[A-Z]{3}$.",
138
+ entityClass:
139
+ "The class IRI of the records that can be linked, such as a campaign class. Leave it empty to allow any record.",
140
+ defaultValue: "Used when a memory gives no value for this property.",
141
+ };
142
+
143
+ const shownPropertyFields = [
144
+ "label",
145
+ "key",
146
+ "description",
147
+ "valueType",
148
+ "entityClass",
149
+ "required",
150
+ "keyProperty",
151
+ "minValue",
152
+ "maxValue",
153
+ "maxLength",
154
+ "pattern",
155
+ "defaultValue",
156
+ "unit",
157
+ "options",
158
+ ];
159
+
160
+ function otherPropertyErrors(errors: SchemaFormErrors, prefix: string): string[] {
161
+ return [...errors.entries()]
162
+ .filter(([field]) => field.startsWith(`${prefix}.`))
163
+ .filter(([field]) => {
164
+ const rest = field.slice(prefix.length + 1);
165
+ return !shownPropertyFields.some((shown) => rest === shown || rest.startsWith("options."));
166
+ })
167
+ .map(([, message]) => message);
168
+ }
169
+
170
+ const dateTypes: readonly GQLMemorySchemaValueType[] = [
171
+ GQLMemorySchemaValueType.Date,
172
+ GQLMemorySchemaValueType.DateTime,
173
+ ];
174
+
175
+ type ValueFieldProps = {
176
+ id: string;
177
+ label: string;
178
+ hint: string;
179
+ valueType: GQLMemorySchemaValueType;
180
+ value: string;
181
+ placeholder?: string;
182
+ error?: string;
183
+ disabled?: boolean;
184
+ onChange: (value: string) => void;
185
+ };
186
+
187
+ function BoundOrDefaultField(props: ValueFieldProps) {
188
+ const { id, label, hint, valueType, value, placeholder, error, disabled, onChange } = props;
189
+ if (dateTypes.includes(valueType)) {
190
+ return (
191
+ <div className={cn("flex flex-col gap-1.5", valueType === GQLMemorySchemaValueType.DateTime && "sm:col-span-2")}>
192
+ <FieldLabel label={label} hint={hint} htmlFor={id} />
193
+ <DateValueInput
194
+ id={id}
195
+ label={label}
196
+ withTime={valueType === GQLMemorySchemaValueType.DateTime}
197
+ placeholder="Not set"
198
+ value={value}
199
+ error={error}
200
+ disabled={disabled}
201
+ onChange={onChange}
202
+ />
203
+ </div>
204
+ );
205
+ }
206
+ const isNumber = valueType === GQLMemorySchemaValueType.Integer || valueType === GQLMemorySchemaValueType.Decimal;
207
+ return (
208
+ <Input
209
+ id={id}
210
+ label={label}
211
+ description={hint}
212
+ descriptionInLabelTooltip
213
+ type={isNumber ? "number" : "text"}
214
+ step={valueType === GQLMemorySchemaValueType.Decimal ? "any" : undefined}
215
+ placeholder={placeholder}
216
+ value={value}
217
+ disabled={disabled}
218
+ error={error}
219
+ onChange={(e) => onChange(e.target.value)}
220
+ />
221
+ );
222
+ }
223
+
224
+ function defaultValueChoices(property: SchemaPropertyForm): { value: string; label: string }[] | null {
225
+ const choices =
226
+ property.valueType === GQLMemorySchemaValueType.Boolean
227
+ ? [
228
+ { value: "true", label: "Yes" },
229
+ { value: "false", label: "No" },
230
+ ]
231
+ : propertySettings(property.valueType).options && isPresent(property.options)
232
+ ? property.options
233
+ .map((option) => ({ value: option.value.trim(), label: option.label.trim() || option.value.trim() }))
234
+ .filter(
235
+ (choice, index, all) =>
236
+ isPresent(choice.value) && all.findIndex((c) => c.value === choice.value) === index,
237
+ )
238
+ : null;
239
+ if (choices === null) return null;
240
+ const current = property.defaultValue.trim();
241
+ return isPresent(current) && !choices.some((choice) => choice.value === current)
242
+ ? [...choices, { value: current, label: `${current} (not allowed)` }]
243
+ : choices;
244
+ }
245
+
246
+ type RuleChipProps = {
247
+ label: string;
248
+ hint: string;
249
+ pressed: boolean;
250
+ unavailable?: string | null;
251
+ disabled?: boolean;
252
+ onToggle: () => void;
253
+ };
254
+
255
+ function RuleChip(props: RuleChipProps) {
256
+ const { label, hint, pressed, unavailable, disabled, onToggle } = props;
257
+ const blocked = isPresent(unavailable) || disabled === true;
258
+ return (
259
+ <ActionTooltip label={isPresent(unavailable) ? `${hint} ${unavailable}` : hint}>
260
+ <button
261
+ type="button"
262
+ aria-pressed={pressed}
263
+ aria-disabled={blocked ? true : undefined}
264
+ onClick={() => {
265
+ if (!blocked) onToggle();
266
+ }}
267
+ className={cn(
268
+ "inline-flex h-8 items-center gap-1.5 rounded-full px-3.5 typography-small transition-colors",
269
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-active-border/50",
270
+ pressed
271
+ ? "bg-primary text-primary-foreground"
272
+ : "border border-input-border text-default-foreground hover:bg-faint",
273
+ blocked && !pressed && "cursor-not-allowed border-dashed text-muted-foreground hover:bg-transparent",
274
+ blocked && pressed && "cursor-not-allowed opacity-60",
275
+ )}
276
+ >
277
+ {pressed && <Check className="size-3.5" aria-hidden />}
278
+ {label}
279
+ </button>
280
+ </ActionTooltip>
281
+ );
282
+ }
283
+
284
+ type PropertyFieldsProps = {
285
+ property: SchemaPropertyForm;
286
+ prefix: string;
287
+ errors: SchemaFormErrors;
288
+ disabled?: boolean;
289
+ onChange: (property: SchemaPropertyForm) => void;
290
+ };
291
+
292
+ function PropertyFields(props: PropertyFieldsProps) {
293
+ const { property, prefix, errors, disabled, onChange } = props;
294
+ const settings = propertySettings(property.valueType);
295
+ function set(patch: Partial<SchemaPropertyForm>) {
296
+ onChange({ ...property, ...patch });
297
+ }
298
+ function fieldId(name: string) {
299
+ return `schema-property-${property.id}-${name}`;
300
+ }
301
+ const extraErrors = otherPropertyErrors(errors, prefix);
302
+ const defaultChoices = defaultValueChoices(property);
303
+ const ruleErrors = [errors.get(`${prefix}.required`), errors.get(`${prefix}.keyProperty`)].filter(isPresent);
304
+ const keyUnavailable = !settings.keyProperty
305
+ ? "Long text cannot identify a memory."
306
+ : property.multiValued
307
+ ? "A list of values cannot identify a memory."
308
+ : property.computed
309
+ ? "A computed property cannot identify a memory."
310
+ : null;
311
+
312
+ return (
313
+ <div className="flex flex-col gap-5">
314
+ <div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
315
+ <Input
316
+ id={fieldId("label")}
317
+ label="Label"
318
+ description={propertyHints.label}
319
+ descriptionInLabelTooltip
320
+ placeholder="e.g. Channel"
321
+ value={property.label}
322
+ disabled={disabled}
323
+ error={errors.get(`${prefix}.label`)}
324
+ onChange={(e) => set({ label: e.target.value })}
325
+ />
326
+ <div className="flex flex-col gap-1.5">
327
+ <FieldLabel label="Type" hint={propertyHints.type} htmlFor={fieldId("type")} />
328
+ <ValueTypeSelect
329
+ id={fieldId("type")}
330
+ label="Type"
331
+ value={property.valueType}
332
+ disabled={disabled}
333
+ error={errors.get(`${prefix}.valueType`)}
334
+ onChange={(valueType) => onChange(withValueType(property, valueType))}
335
+ />
336
+ </div>
337
+ {settings.unit && (
338
+ <Input
339
+ id={fieldId("unit")}
340
+ label="Unit"
341
+ description={propertyHints.unit}
342
+ descriptionInLabelTooltip
343
+ placeholder="e.g. EUR"
344
+ value={property.unit}
345
+ disabled={disabled}
346
+ error={errors.get(`${prefix}.unit`)}
347
+ onChange={(e) => set({ unit: e.target.value })}
348
+ />
349
+ )}
350
+ {settings.entityClass && (
351
+ <Input
352
+ id={fieldId("entity-class")}
353
+ label="Record type"
354
+ description={propertyHints.entityClass}
355
+ descriptionInLabelTooltip
356
+ placeholder="Any record"
357
+ containerClassName="sm:col-span-2"
358
+ value={property.entityClass}
359
+ disabled={disabled}
360
+ error={errors.get(`${prefix}.entityClass`)}
361
+ onChange={(e) => set({ entityClass: e.target.value })}
362
+ />
363
+ )}
364
+ </div>
365
+
366
+ {property.path === null && (
367
+ <Input
368
+ id={fieldId("key")}
369
+ label="Key"
370
+ placeholder="Generated from the label"
371
+ description={propertyHints.key}
372
+ descriptionInLabelTooltip
373
+ value={property.key}
374
+ disabled={disabled}
375
+ error={errors.get(`${prefix}.key`)}
376
+ onChange={(e) => set({ key: e.target.value })}
377
+ />
378
+ )}
379
+
380
+ <Textarea
381
+ id={fieldId("description")}
382
+ label="Description"
383
+ description={propertyHints.description}
384
+ descriptionInLabelTooltip
385
+ placeholder="What this property records (optional)"
386
+ value={property.description}
387
+ minRows={2}
388
+ maxRows={5}
389
+ disabled={disabled}
390
+ error={errors.get(`${prefix}.description`)}
391
+ onChange={(e) => set({ description: e.target.value })}
392
+ />
393
+
394
+ <div className="flex flex-col gap-2">
395
+ <span id={fieldId("rules")} className="typography-small">
396
+ Rules
397
+ </span>
398
+ <div role="group" aria-labelledby={fieldId("rules")} className="flex flex-wrap gap-2">
399
+ <RuleChip
400
+ label="Required"
401
+ hint={propertyHints.required}
402
+ pressed={property.required && !property.computed}
403
+ unavailable={property.computed ? "A computed property is never required." : null}
404
+ disabled={disabled}
405
+ onToggle={() => set({ required: !property.required })}
406
+ />
407
+ <RuleChip
408
+ label="List of values"
409
+ hint={propertyHints.multiValued}
410
+ pressed={property.multiValued}
411
+ disabled={disabled}
412
+ onToggle={() => set({ multiValued: !property.multiValued })}
413
+ />
414
+ <RuleChip
415
+ label="Identifies the memory"
416
+ hint={propertyHints.keyProperty}
417
+ pressed={property.keyProperty && keyUnavailable === null}
418
+ unavailable={keyUnavailable}
419
+ disabled={disabled}
420
+ onToggle={() => set({ keyProperty: !property.keyProperty })}
421
+ />
422
+ <RuleChip
423
+ label="Computed by a rule"
424
+ hint={propertyHints.computed}
425
+ pressed={property.computed}
426
+ disabled={disabled}
427
+ onToggle={() => set({ computed: !property.computed })}
428
+ />
429
+ </div>
430
+ {ruleErrors.map((message) => (
431
+ <p key={message} className="typography-small text-error-foreground">
432
+ {message}
433
+ </p>
434
+ ))}
435
+ </div>
436
+
437
+ {settings.options && (
438
+ <AllowedValuesField
439
+ id={fieldId("options")}
440
+ hint={propertyHints.options}
441
+ options={property.options}
442
+ prefix={prefix}
443
+ errors={errors}
444
+ disabled={disabled}
445
+ onChange={(options) => set({ options })}
446
+ />
447
+ )}
448
+
449
+ {(settings.bounds || settings.maxLength || settings.pattern) && (
450
+ <div className="grid grid-cols-1 gap-3 sm:grid-cols-2">
451
+ {settings.bounds && (
452
+ <>
453
+ <BoundOrDefaultField
454
+ id={fieldId("min")}
455
+ label="Minimum"
456
+ hint={propertyHints.minValue}
457
+ valueType={property.valueType}
458
+ placeholder="No minimum"
459
+ value={property.minValue}
460
+ disabled={disabled}
461
+ error={errors.get(`${prefix}.minValue`)}
462
+ onChange={(minValue) => set({ minValue })}
463
+ />
464
+ <BoundOrDefaultField
465
+ id={fieldId("max")}
466
+ label="Maximum"
467
+ hint={propertyHints.maxValue}
468
+ valueType={property.valueType}
469
+ placeholder="No maximum"
470
+ value={property.maxValue}
471
+ disabled={disabled}
472
+ error={errors.get(`${prefix}.maxValue`)}
473
+ onChange={(maxValue) => set({ maxValue })}
474
+ />
475
+ </>
476
+ )}
477
+ {settings.maxLength && (
478
+ <Input
479
+ id={fieldId("max-length")}
480
+ label="Maximum length"
481
+ description={propertyHints.maxLength}
482
+ descriptionInLabelTooltip
483
+ inputMode="numeric"
484
+ placeholder="No limit"
485
+ value={property.maxLength}
486
+ disabled={disabled}
487
+ error={errors.get(`${prefix}.maxLength`)}
488
+ onChange={(e) => set({ maxLength: e.target.value })}
489
+ />
490
+ )}
491
+ {settings.pattern && (
492
+ <Input
493
+ id={fieldId("pattern")}
494
+ label="Pattern"
495
+ description={propertyHints.pattern}
496
+ descriptionInLabelTooltip
497
+ placeholder="Any"
498
+ value={property.pattern}
499
+ disabled={disabled}
500
+ error={errors.get(`${prefix}.pattern`)}
501
+ onChange={(e) => set({ pattern: e.target.value })}
502
+ />
503
+ )}
504
+ </div>
505
+ )}
506
+
507
+ {!property.computed && defaultChoices !== null && (
508
+ <ChoiceSelect
509
+ id={fieldId("default")}
510
+ label="Default value"
511
+ hint={propertyHints.defaultValue}
512
+ value={isPresent(property.defaultValue.trim()) ? property.defaultValue.trim() : null}
513
+ choices={defaultChoices}
514
+ disabled={disabled}
515
+ error={errors.get(`${prefix}.defaultValue`)}
516
+ onChange={(defaultValue) => set({ defaultValue: defaultValue ?? "" })}
517
+ />
518
+ )}
519
+
520
+ {!property.computed && defaultChoices === null && (
521
+ <BoundOrDefaultField
522
+ id={fieldId("default")}
523
+ label="Default value"
524
+ hint={propertyHints.defaultValue}
525
+ valueType={property.valueType}
526
+ placeholder="None"
527
+ value={property.defaultValue}
528
+ disabled={disabled}
529
+ error={errors.get(`${prefix}.defaultValue`)}
530
+ onChange={(defaultValue) => set({ defaultValue })}
531
+ />
532
+ )}
533
+
534
+ {extraErrors.map((message) => (
535
+ <p key={message} className="typography-small text-error-foreground">
536
+ {message}
537
+ </p>
538
+ ))}
539
+ </div>
540
+ );
541
+ }
542
+
543
+ // A drag only ever moves a property row, so text dragged into an input still lands there.
544
+ type PropertyDrag = {
545
+ active: boolean;
546
+ isDragging: boolean;
547
+ isDropTarget: boolean;
548
+ onStart: () => void;
549
+ onOver: () => void;
550
+ onDrop: () => void;
551
+ onEnd: () => void;
552
+ };
553
+
554
+ type PropertyRowProps = {
555
+ property: SchemaPropertyForm;
556
+ index: number;
557
+ count: number;
558
+ hasErrors: boolean;
559
+ disabled?: boolean;
560
+ onEdit: () => void;
561
+ onRemove: () => void;
562
+ onMove: (to: number) => void;
563
+ drag: PropertyDrag;
564
+ };
565
+
566
+ function PropertyRow(props: PropertyRowProps) {
567
+ const { property, index, count, hasErrors, disabled, onEdit, onRemove, onMove, drag } = props;
568
+ const rowRef = useRef<HTMLDivElement>(null);
569
+ const name = property.label || `Property ${index + 1}`;
570
+
571
+ return (
572
+ <div
573
+ ref={rowRef}
574
+ role="group"
575
+ aria-label={name}
576
+ className={cn(
577
+ "relative flex items-center gap-3 border-b border-muted-border px-3 py-2.5 transition-colors last:border-0",
578
+ !disabled && "hover:bg-faint",
579
+ hasErrors && "bg-error/40",
580
+ drag.isDragging && "opacity-50",
581
+ drag.isDropTarget && "ring-2 ring-inset ring-active-border/50",
582
+ )}
583
+ onDragOver={(event) => {
584
+ if (!drag.active) return;
585
+ event.preventDefault();
586
+ drag.onOver();
587
+ }}
588
+ onDrop={(event) => {
589
+ if (!drag.active) return;
590
+ event.preventDefault();
591
+ drag.onDrop();
592
+ }}
593
+ >
594
+ <span
595
+ draggable={!disabled}
596
+ title="Drag to reorder"
597
+ className={cn("relative z-10 text-muted-foreground", disabled ? "cursor-not-allowed" : "cursor-grab")}
598
+ onDragStart={(event) => {
599
+ event.dataTransfer.effectAllowed = "move";
600
+ event.dataTransfer.setData("text/plain", property.id);
601
+ if (rowRef.current) event.dataTransfer.setDragImage(rowRef.current, 16, 16);
602
+ drag.onStart();
603
+ }}
604
+ onDragEnd={drag.onEnd}
605
+ >
606
+ <GripVertical className="size-4" aria-hidden />
607
+ </span>
608
+ <button
609
+ type="button"
610
+ aria-label={`Edit property ${name}`}
611
+ className={cn(
612
+ "flex min-w-0 flex-1 flex-col items-start gap-0.5 text-left focus-visible:outline-none",
613
+ "after:absolute after:inset-0 after:content-[''] focus-visible:after:ring-2 focus-visible:after:ring-inset focus-visible:after:ring-active-border/50",
614
+ !disabled && "cursor-pointer",
615
+ )}
616
+ disabled={disabled}
617
+ onClick={onEdit}
618
+ >
619
+ <span
620
+ className={cn(
621
+ "max-w-full truncate typography-small-medium",
622
+ property.label ? "text-default-foreground" : "text-muted-foreground",
623
+ )}
624
+ >
625
+ {name}
626
+ </span>
627
+ {hasErrors ? (
628
+ <span className="typography-tiny text-error-foreground">Needs attention</span>
629
+ ) : (
630
+ property.description && (
631
+ <span className="max-w-full truncate typography-tiny text-muted-foreground">{property.description}</span>
632
+ )
633
+ )}
634
+ </button>
635
+ <span className="hidden shrink-0 typography-small text-muted-foreground sm:inline">
636
+ {valueTypeLabels[property.valueType]}
637
+ </span>
638
+ <div className="hidden shrink-0 flex-wrap justify-end gap-1 md:flex">
639
+ {propertyTags(property).map((tag) => (
640
+ <span key={tag} className="rounded-full bg-muted px-2 py-0.5 typography-tiny text-default-foreground">
641
+ {tag}
642
+ </span>
643
+ ))}
644
+ </div>
645
+ <Dropdown>
646
+ <ActionTooltip label="More actions">
647
+ <DropdownTrigger asChild>
648
+ <Button
649
+ type="button"
650
+ variant="tertiary"
651
+ size="sm"
652
+ iconOnly
653
+ icon={Ellipsis}
654
+ aria-label={`More actions for ${name}`}
655
+ disabled={disabled}
656
+ className="relative z-10"
657
+ />
658
+ </DropdownTrigger>
659
+ </ActionTooltip>
660
+ <DropdownContent align="end">
661
+ <DropdownItem icon={<Pencil className="size-4" />} onSelect={onEdit}>
662
+ Edit
663
+ </DropdownItem>
664
+ <DropdownItem icon={<ArrowUp className="size-4" />} disabled={index === 0} onSelect={() => onMove(index - 1)}>
665
+ Move up
666
+ </DropdownItem>
667
+ <DropdownItem
668
+ icon={<ArrowDown className="size-4" />}
669
+ disabled={index === count - 1}
670
+ onSelect={() => onMove(index + 1)}
671
+ >
672
+ Move down
673
+ </DropdownItem>
674
+ <DropdownItem icon={<Trash2 className="size-4" />} className="text-error-foreground" onSelect={onRemove}>
675
+ Remove
676
+ </DropdownItem>
677
+ </DropdownContent>
678
+ </Dropdown>
679
+ </div>
680
+ );
681
+ }
682
+
683
+ type PropertyDraft = { index: number | null; property: SchemaPropertyForm; original: SchemaPropertyForm };
684
+
685
+ type PropertySheetProps = {
686
+ draft: PropertyDraft | null;
687
+ siblings: readonly SchemaPropertyForm[];
688
+ errors: SchemaFormErrors;
689
+ disabled?: boolean;
690
+ onChange: (property: SchemaPropertyForm) => void;
691
+ onDone: () => void;
692
+ onCancel: () => void;
693
+ };
694
+
695
+ function PropertySheet(props: PropertySheetProps) {
696
+ const { draft, siblings, errors, disabled, onChange, onDone, onCancel } = props;
697
+ const isNew = draft?.index === null;
698
+ const [confirmingDiscard, setConfirmingDiscard] = useState(false);
699
+ const [triedDone, setTriedDone] = useState(false);
700
+ const prefix = propertyErrorPrefix(draft?.index ?? -1);
701
+ const draftErrors = draft ? propertyFormErrors(draft.property, prefix, siblings) : new Map<string, string>();
702
+ const shownErrors = triedDone ? draftErrors : errors;
703
+ const isDirty = draft !== null && JSON.stringify(draft.property) !== JSON.stringify(draft.original);
704
+
705
+ function close(next: () => void) {
706
+ setConfirmingDiscard(false);
707
+ setTriedDone(false);
708
+ next();
709
+ }
710
+ function requestDone() {
711
+ if (draftErrors.size > 0) setTriedDone(true);
712
+ else close(onDone);
713
+ }
714
+ function requestCancel() {
715
+ if (isDirty && !disabled) setConfirmingDiscard(true);
716
+ else close(onCancel);
717
+ }
718
+
719
+ return (
720
+ <Sheet open={draft !== null} onOpenChange={(open) => !open && requestCancel()}>
721
+ <SheetContent
722
+ side="right"
723
+ className="w-full sm:w-[560px]"
724
+ onEscapeKeyDown={(event) => {
725
+ if (escapeClearsTypedValue(event)) event.preventDefault();
726
+ }}
727
+ onOpenAutoFocus={(event) => {
728
+ if (!draft) return;
729
+ event.preventDefault();
730
+ document.getElementById(`schema-property-${draft.property.id}-label`)?.focus();
731
+ }}
732
+ >
733
+ <SheetHeader>
734
+ <SheetTitle text={isNew ? "Add property" : "Edit property"} />
735
+ <SheetDescription>
736
+ {isNew ? "Describe one field memories of this schema record." : "Changes apply when you save the schema."}
737
+ </SheetDescription>
738
+ </SheetHeader>
739
+ <SheetBody className="-mx-6 px-6">
740
+ {triedDone && draftErrors.size > 0 && (
741
+ <Banner label="Fix the highlighted fields to keep this property." className="mb-4" />
742
+ )}
743
+ {draft && (
744
+ <PropertyFields
745
+ property={draft.property}
746
+ prefix={prefix}
747
+ errors={shownErrors}
748
+ disabled={disabled}
749
+ onChange={onChange}
750
+ />
751
+ )}
752
+ </SheetBody>
753
+ <SheetFooter>
754
+ {confirmingDiscard ? (
755
+ <>
756
+ <p className="mr-auto typography-small text-muted-foreground">Discard unsaved changes?</p>
757
+ <Button type="button" variant="tertiary" onClick={() => setConfirmingDiscard(false)}>
758
+ Keep editing
759
+ </Button>
760
+ <Button type="button" variant="destructive" onClick={() => close(onCancel)}>
761
+ Discard
762
+ </Button>
763
+ </>
764
+ ) : (
765
+ <>
766
+ <Button type="button" variant="tertiary" onClick={requestCancel}>
767
+ Cancel
768
+ </Button>
769
+ <Button type="button" onClick={requestDone} disabled={disabled}>
770
+ {isNew ? "Add property" : "Done"}
771
+ </Button>
772
+ </>
773
+ )}
774
+ </SheetFooter>
775
+ </SheetContent>
776
+ </Sheet>
777
+ );
778
+ }
779
+
780
+ export type SchemaEditorFormProps = {
781
+ form: SchemaForm;
782
+ errors: SchemaFormErrors;
783
+ isNew: boolean;
784
+ disabled?: boolean;
785
+ onChange: (form: SchemaForm) => void;
786
+ };
787
+
788
+ export function SchemaEditorForm(props: SchemaEditorFormProps) {
789
+ const { form, errors, isNew, disabled, onChange } = props;
790
+ function set(patch: Partial<SchemaForm>) {
791
+ onChange({ ...form, ...patch });
792
+ }
793
+ function setProperties(properties: SchemaPropertyForm[]) {
794
+ set({ properties });
795
+ }
796
+ const [draft, setDraft] = useState<PropertyDraft | null>(null);
797
+ const [dragged, setDragged] = useState<number | null>(null);
798
+ useEffect(() => {
799
+ loadPatternCheck().catch((error: unknown) => console.warn("The pattern check could not load", error));
800
+ }, []);
801
+ const [dragOver, setDragOver] = useState<number | null>(null);
802
+ function endDrag() {
803
+ setDragged(null);
804
+ setDragOver(null);
805
+ }
806
+ function commitDraft() {
807
+ if (!draft) return;
808
+ setProperties(
809
+ draft.index === null
810
+ ? [...form.properties, draft.property]
811
+ : form.properties.map((p, i) => (i === draft.index ? draft.property : p)),
812
+ );
813
+ setDraft(null);
814
+ }
815
+
816
+ return (
817
+ <div className="flex flex-col gap-6">
818
+ <section className="flex flex-col gap-3 rounded-xl border border-muted-border bg-card p-5">
819
+ <h3 className="typography-small-medium text-default-foreground">Schema</h3>
820
+ <Input
821
+ id="schema-label"
822
+ label="Name"
823
+ placeholder="e.g. Campaign brief"
824
+ value={form.label}
825
+ disabled={disabled}
826
+ error={errors.get("label")}
827
+ onChange={(e) => set({ label: e.target.value })}
828
+ />
829
+ {isNew && (
830
+ <Input
831
+ id="schema-key"
832
+ label="Key"
833
+ placeholder="Generated from the name"
834
+ helperText="Names the schema in the knowledge graph. It cannot change once saved."
835
+ value={form.key}
836
+ disabled={disabled}
837
+ error={errors.get("key")}
838
+ onChange={(e) => set({ key: e.target.value })}
839
+ />
840
+ )}
841
+ <Textarea
842
+ id="schema-description"
843
+ label="Description"
844
+ placeholder="What kind of memory this is"
845
+ value={form.description}
846
+ minRows={2}
847
+ maxRows={6}
848
+ disabled={disabled}
849
+ error={errors.get("description")}
850
+ onChange={(e) => set({ description: e.target.value })}
851
+ />
852
+ </section>
853
+
854
+ <section className="flex flex-col gap-3 rounded-xl border border-muted-border bg-card p-5">
855
+ <div className="flex flex-col gap-0.5">
856
+ <h3 className="typography-small-medium text-default-foreground">Defaults for new memories</h3>
857
+ <p className="typography-small text-muted-foreground">
858
+ Applied to new memories of this schema that leave them unset; each memory can change them.
859
+ </p>
860
+ </div>
861
+ <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4">
862
+ <ChoiceSelect
863
+ id="schema-default-kind"
864
+ label="Kind"
865
+ value={form.defaultMemoryKind}
866
+ choices={kindChoices}
867
+ disabled={disabled}
868
+ error={errors.get("defaultMemoryKind")}
869
+ onChange={(defaultMemoryKind) => set({ defaultMemoryKind })}
870
+ />
871
+ <ChoiceSelect
872
+ id="schema-default-importance"
873
+ label="Importance"
874
+ value={form.defaultImportance != null ? String(form.defaultImportance) : null}
875
+ choices={importanceChoices}
876
+ disabled={disabled}
877
+ error={errors.get("defaultImportance")}
878
+ onChange={(value) => set({ defaultImportance: value != null ? Number(value) : null })}
879
+ />
880
+ <ChoiceSelect
881
+ id="schema-default-volatility"
882
+ label="Volatility"
883
+ value={form.defaultVolatility}
884
+ choices={volatilityChoices}
885
+ disabled={disabled}
886
+ error={errors.get("defaultVolatility")}
887
+ onChange={(defaultVolatility) => set({ defaultVolatility })}
888
+ />
889
+ <ChoiceSelect
890
+ id="schema-default-scope"
891
+ label="Scope"
892
+ value={form.defaultScope}
893
+ choices={scopeChoices}
894
+ disabled={disabled}
895
+ error={errors.get("defaultScope")}
896
+ onChange={(defaultScope) => set({ defaultScope })}
897
+ />
898
+ </div>
899
+ </section>
900
+
901
+ <section className="flex flex-col gap-3 rounded-xl border border-muted-border bg-card p-5">
902
+ <Switch
903
+ id="schema-extraction"
904
+ label="Chat extraction can record memories of this type"
905
+ description="When off, only people and the agent's explicit tool calls give a memory this schema."
906
+ checked={form.extractionEnabled}
907
+ disabled={disabled}
908
+ containerClassName="w-full"
909
+ onCheckedChange={(extractionEnabled) => set({ extractionEnabled })}
910
+ />
911
+ {form.extractionEnabled && (
912
+ <Textarea
913
+ id="schema-extraction-guidance"
914
+ label="When to use it"
915
+ placeholder="e.g. When the user states a cost-per-acquisition target for a channel"
916
+ value={form.extractionGuidance}
917
+ minRows={2}
918
+ maxRows={6}
919
+ disabled={disabled}
920
+ error={errors.get("extractionGuidance")}
921
+ onChange={(e) => set({ extractionGuidance: e.target.value })}
922
+ />
923
+ )}
924
+ </section>
925
+
926
+ <section className="flex flex-col gap-3">
927
+ <div className="flex items-center justify-between gap-2">
928
+ <h3 className="typography-small-medium text-default-foreground">Properties</h3>
929
+ <span className="typography-tiny text-muted-foreground">
930
+ {form.properties.length} of {memorySchemaPropertyLimit}
931
+ </span>
932
+ </div>
933
+ {errors.get("properties") && (
934
+ <p className="typography-small text-error-foreground">{errors.get("properties")}</p>
935
+ )}
936
+ {isPresent(form.properties) && (
937
+ <div className="overflow-hidden rounded-xl border border-muted-border bg-card">
938
+ {form.properties.map((property, index) => (
939
+ <PropertyRow
940
+ key={property.id}
941
+ property={property}
942
+ index={index}
943
+ count={form.properties.length}
944
+ hasErrors={hasErrorsUnder(errors, propertyErrorPrefix(index))}
945
+ disabled={disabled}
946
+ onEdit={() => setDraft({ index, property, original: property })}
947
+ onRemove={() => setProperties(form.properties.filter((_, i) => i !== index))}
948
+ onMove={(to) => setProperties(moveItem(form.properties, index, to))}
949
+ drag={{
950
+ active: dragged !== null,
951
+ isDragging: dragged === index,
952
+ isDropTarget: dragged !== null && dragOver === index && dragOver !== dragged,
953
+ onStart: () => setDragged(index),
954
+ onOver: () => setDragOver(index),
955
+ onDrop: () => {
956
+ if (dragged !== null && dragged !== index) setProperties(moveItem(form.properties, dragged, index));
957
+ endDrag();
958
+ },
959
+ onEnd: endDrag,
960
+ }}
961
+ />
962
+ ))}
963
+ </div>
964
+ )}
965
+ <Button
966
+ type="button"
967
+ variant="secondary"
968
+ icon={Plus}
969
+ className="w-fit"
970
+ disabled={disabled || form.properties.length >= memorySchemaPropertyLimit}
971
+ onClick={() => {
972
+ const property = emptyPropertyForm();
973
+ setDraft({ index: null, property, original: property });
974
+ }}
975
+ >
976
+ Add property
977
+ </Button>
978
+ <PropertySheet
979
+ draft={draft}
980
+ siblings={form.properties}
981
+ errors={errors}
982
+ disabled={disabled}
983
+ onChange={(property) => setDraft((current) => (current ? { ...current, property } : current))}
984
+ onDone={commitDraft}
985
+ onCancel={() => setDraft(null)}
986
+ />
987
+ </section>
988
+ </div>
989
+ );
990
+ }