@arbidocs/blocks 0.4.153 → 0.4.155

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 (248) hide show
  1. package/dist/{ConnectedNativeDocxComparison-OFPIXNJB.js → ConnectedNativeDocxComparison-OLWRQSRS.js} +11 -11
  2. package/dist/{ConnectedNativeDocxComparison-OFPIXNJB.js.map → ConnectedNativeDocxComparison-OLWRQSRS.js.map} +1 -1
  3. package/dist/{ConnectedNativeDocxComparison-Y5BNLNH6.cjs → ConnectedNativeDocxComparison-YORMOPPN.cjs} +12 -12
  4. package/dist/{ConnectedNativeDocxComparison-Y5BNLNH6.cjs.map → ConnectedNativeDocxComparison-YORMOPPN.cjs.map} +1 -1
  5. package/dist/{ConnectedNativeDocxEditor-LRYU5HPA.js → ConnectedNativeDocxEditor-34EBIIFS.js} +10 -10
  6. package/dist/{ConnectedNativeDocxEditor-LRYU5HPA.js.map → ConnectedNativeDocxEditor-34EBIIFS.js.map} +1 -1
  7. package/dist/{ConnectedNativeDocxEditor-HTEW5JAH.cjs → ConnectedNativeDocxEditor-EHTWGGX3.cjs} +12 -12
  8. package/dist/{ConnectedNativeDocxEditor-HTEW5JAH.cjs.map → ConnectedNativeDocxEditor-EHTWGGX3.cjs.map} +1 -1
  9. package/dist/{ConnectedStreamedWordArtifact-QW74LKHN.cjs → ConnectedStreamedWordArtifact-5DK6QGYN.cjs} +12 -12
  10. package/dist/ConnectedStreamedWordArtifact-5DK6QGYN.cjs.map +1 -0
  11. package/dist/{ConnectedStreamedWordArtifact-QAUVUCSX.js → ConnectedStreamedWordArtifact-GLIDLSAS.js} +11 -11
  12. package/dist/{ConnectedStreamedWordArtifact-QAUVUCSX.js.map → ConnectedStreamedWordArtifact-GLIDLSAS.js.map} +1 -1
  13. package/dist/WorkspaceTableView-5OWX53R5.js +376 -0
  14. package/dist/WorkspaceTableView-5OWX53R5.js.map +1 -0
  15. package/dist/WorkspaceTableView-ZFMAYHUD.cjs +378 -0
  16. package/dist/WorkspaceTableView-ZFMAYHUD.cjs.map +1 -0
  17. package/dist/agents/index.cjs +282 -282
  18. package/dist/agents/index.js +7 -7
  19. package/dist/{chunk-RQ2Y7USX.cjs → chunk-2VHYOTWW.cjs} +3 -3
  20. package/dist/chunk-2VHYOTWW.cjs.map +1 -0
  21. package/dist/{chunk-DTROMMDX.cjs → chunk-3VULDTNL.cjs} +4 -4
  22. package/dist/{chunk-DTROMMDX.cjs.map → chunk-3VULDTNL.cjs.map} +1 -1
  23. package/dist/{chunk-UTTTJSQU.cjs → chunk-4RPBUMHB.cjs} +4 -4
  24. package/dist/{chunk-UTTTJSQU.cjs.map → chunk-4RPBUMHB.cjs.map} +1 -1
  25. package/dist/chunk-53RCZPMR.cjs +496 -0
  26. package/dist/chunk-53RCZPMR.cjs.map +1 -0
  27. package/dist/chunk-5TDGVOR5.js +142 -0
  28. package/dist/chunk-5TDGVOR5.js.map +1 -0
  29. package/dist/chunk-6HMCF4AJ.js +1720 -0
  30. package/dist/chunk-6HMCF4AJ.js.map +1 -0
  31. package/dist/{chunk-CU2O32Z4.cjs → chunk-6QAAIDQQ.cjs} +62 -99
  32. package/dist/chunk-6QAAIDQQ.cjs.map +1 -0
  33. package/dist/chunk-7HHYMDPE.js +431 -0
  34. package/dist/chunk-7HHYMDPE.js.map +1 -0
  35. package/dist/{chunk-SMN32BQ3.cjs → chunk-7NL6WJER.cjs} +3 -160
  36. package/dist/chunk-7NL6WJER.cjs.map +1 -0
  37. package/dist/{chunk-IXWJGOM2.js → chunk-BQ77KSXU.js} +3 -3
  38. package/dist/{chunk-IXWJGOM2.js.map → chunk-BQ77KSXU.js.map} +1 -1
  39. package/dist/chunk-BTF4AZMG.js +148 -0
  40. package/dist/chunk-BTF4AZMG.js.map +1 -0
  41. package/dist/{chunk-HALD6ZB5.cjs → chunk-C3SMTA3C.cjs} +4 -4
  42. package/dist/{chunk-HALD6ZB5.cjs.map → chunk-C3SMTA3C.cjs.map} +1 -1
  43. package/dist/{chunk-GAYMJWTC.cjs → chunk-CB4TIDEX.cjs} +6 -6
  44. package/dist/{chunk-GAYMJWTC.cjs.map → chunk-CB4TIDEX.cjs.map} +1 -1
  45. package/dist/{chunk-KPZZ5FHE.cjs → chunk-CNHUJRQ4.cjs} +10 -6
  46. package/dist/chunk-CNHUJRQ4.cjs.map +1 -0
  47. package/dist/{chunk-Q4BY2CQQ.cjs → chunk-CQCNU5KT.cjs} +28 -28
  48. package/dist/{chunk-Q4BY2CQQ.cjs.map → chunk-CQCNU5KT.cjs.map} +1 -1
  49. package/dist/{chunk-GRGS5M6O.cjs → chunk-CROGFB46.cjs} +160 -3
  50. package/dist/chunk-CROGFB46.cjs.map +1 -0
  51. package/dist/{chunk-QN47Q4N7.js → chunk-CU6LDQ57.js} +3 -3
  52. package/dist/{chunk-QN47Q4N7.js.map → chunk-CU6LDQ57.js.map} +1 -1
  53. package/dist/{chunk-EF4ZLKRM.js → chunk-DEPF5LQI.js} +3 -3
  54. package/dist/{chunk-EF4ZLKRM.js.map → chunk-DEPF5LQI.js.map} +1 -1
  55. package/dist/{chunk-JAANWQGB.js → chunk-ETZ5A3GU.js} +3 -3
  56. package/dist/{chunk-JAANWQGB.js.map → chunk-ETZ5A3GU.js.map} +1 -1
  57. package/dist/{chunk-TBEVGWY3.js → chunk-F57LNUSZ.js} +10 -6
  58. package/dist/chunk-F57LNUSZ.js.map +1 -0
  59. package/dist/{chunk-GFNELPDP.cjs → chunk-FM3IRQJW.cjs} +10 -5
  60. package/dist/chunk-FM3IRQJW.cjs.map +1 -0
  61. package/dist/chunk-FPHTSNOE.js +465 -0
  62. package/dist/chunk-FPHTSNOE.js.map +1 -0
  63. package/dist/{chunk-OVR3XMYL.js → chunk-FYZXDZM7.js} +3 -3
  64. package/dist/{chunk-OVR3XMYL.js.map → chunk-FYZXDZM7.js.map} +1 -1
  65. package/dist/{chunk-2FLWPM3B.cjs → chunk-GC2FSPSQ.cjs} +7 -7
  66. package/dist/{chunk-2FLWPM3B.cjs.map → chunk-GC2FSPSQ.cjs.map} +1 -1
  67. package/dist/{chunk-DB2OXRQC.js → chunk-GO3BN76C.js} +7 -7
  68. package/dist/{chunk-DB2OXRQC.js.map → chunk-GO3BN76C.js.map} +1 -1
  69. package/dist/{chunk-XZIYRKLW.cjs → chunk-H32DV7XS.cjs} +5 -139
  70. package/dist/chunk-H32DV7XS.cjs.map +1 -0
  71. package/dist/{chunk-4236BRZK.js → chunk-HP2C4MD3.js} +29 -3
  72. package/dist/chunk-HP2C4MD3.js.map +1 -0
  73. package/dist/{chunk-ZP6Q3KXU.cjs → chunk-HUATKA3M.cjs} +4 -4
  74. package/dist/{chunk-ZP6Q3KXU.cjs.map → chunk-HUATKA3M.cjs.map} +1 -1
  75. package/dist/chunk-ISHFVKVU.js +304 -0
  76. package/dist/chunk-ISHFVKVU.js.map +1 -0
  77. package/dist/chunk-JUUOJP7I.cjs +164 -0
  78. package/dist/chunk-JUUOJP7I.cjs.map +1 -0
  79. package/dist/{chunk-4KMLM3GY.cjs → chunk-KBO75NLM.cjs} +7 -7
  80. package/dist/{chunk-4KMLM3GY.cjs.map → chunk-KBO75NLM.cjs.map} +1 -1
  81. package/dist/{chunk-Z4NQ3TED.js → chunk-KCSIX7CY.js} +3 -3
  82. package/dist/{chunk-Z4NQ3TED.js.map → chunk-KCSIX7CY.js.map} +1 -1
  83. package/dist/{chunk-DN2KI4BU.js → chunk-KDLX5AA7.js} +3 -3
  84. package/dist/{chunk-DN2KI4BU.js.map → chunk-KDLX5AA7.js.map} +1 -1
  85. package/dist/{chunk-WFA2GVZJ.js → chunk-MF5KQ4PS.js} +3 -3
  86. package/dist/{chunk-WFA2GVZJ.js.map → chunk-MF5KQ4PS.js.map} +1 -1
  87. package/dist/{chunk-YXNNNP57.js → chunk-MNG7N6M2.js} +4 -4
  88. package/dist/{chunk-YXNNNP57.js.map → chunk-MNG7N6M2.js.map} +1 -1
  89. package/dist/chunk-MSFQDELO.cjs +482 -0
  90. package/dist/chunk-MSFQDELO.cjs.map +1 -0
  91. package/dist/{chunk-T74Q3MCZ.cjs → chunk-MUDEL7UL.cjs} +25 -884
  92. package/dist/chunk-MUDEL7UL.cjs.map +1 -0
  93. package/dist/{chunk-KSHKTOY2.js → chunk-NUSBINUM.js} +3 -3
  94. package/dist/chunk-NUSBINUM.js.map +1 -0
  95. package/dist/{chunk-EYKISBDO.cjs → chunk-OALEDG67.cjs} +5 -5
  96. package/dist/{chunk-EYKISBDO.cjs.map → chunk-OALEDG67.cjs.map} +1 -1
  97. package/dist/{chunk-COCGRJLA.cjs → chunk-OFV3PRF2.cjs} +7 -7
  98. package/dist/{chunk-COCGRJLA.cjs.map → chunk-OFV3PRF2.cjs.map} +1 -1
  99. package/dist/chunk-OOU4QLRK.cjs +319 -0
  100. package/dist/chunk-OOU4QLRK.cjs.map +1 -0
  101. package/dist/chunk-OU3RGQFX.cjs +136 -0
  102. package/dist/chunk-OU3RGQFX.cjs.map +1 -0
  103. package/dist/{chunk-3PCBYOIZ.js → chunk-P6RIBIVN.js} +38 -7
  104. package/dist/chunk-P6RIBIVN.js.map +1 -0
  105. package/dist/{chunk-LXTOOUEN.cjs → chunk-Q7CQYYZW.cjs} +5 -5
  106. package/dist/{chunk-LXTOOUEN.cjs.map → chunk-Q7CQYYZW.cjs.map} +1 -1
  107. package/dist/{chunk-CROTH2BS.js → chunk-QKR5LWDO.js} +9 -40
  108. package/dist/{chunk-CROTH2BS.js.map → chunk-QKR5LWDO.js.map} +1 -1
  109. package/dist/chunk-REH7PX3N.cjs +145 -0
  110. package/dist/chunk-REH7PX3N.cjs.map +1 -0
  111. package/dist/chunk-RQKWYKZY.js +127 -0
  112. package/dist/chunk-RQKWYKZY.js.map +1 -0
  113. package/dist/{chunk-U6JQ4KMX.cjs → chunk-SN2GZ4ZM.cjs} +29 -2
  114. package/dist/chunk-SN2GZ4ZM.cjs.map +1 -0
  115. package/dist/{chunk-R6VCPDPF.js → chunk-SZSJGZSO.js} +156 -6
  116. package/dist/chunk-SZSJGZSO.js.map +1 -0
  117. package/dist/{chunk-US3S4DCB.js → chunk-TF7HN5EU.js} +10 -5
  118. package/dist/chunk-TF7HN5EU.js.map +1 -0
  119. package/dist/{chunk-YKQ2DPIP.js → chunk-VF5EUAIV.js} +3 -3
  120. package/dist/{chunk-YKQ2DPIP.js.map → chunk-VF5EUAIV.js.map} +1 -1
  121. package/dist/{chunk-KMZWKSKO.cjs → chunk-VZPFYZZU.cjs} +4 -4
  122. package/dist/{chunk-KMZWKSKO.cjs.map → chunk-VZPFYZZU.cjs.map} +1 -1
  123. package/dist/{chunk-HUJF2XM2.js → chunk-W7CWGURO.js} +28 -873
  124. package/dist/chunk-W7CWGURO.js.map +1 -0
  125. package/dist/{chunk-ZLEYLCE4.js → chunk-WK6FVIF7.js} +6 -156
  126. package/dist/chunk-WK6FVIF7.js.map +1 -0
  127. package/dist/chunk-WV4TD2HZ.cjs +1785 -0
  128. package/dist/chunk-WV4TD2HZ.cjs.map +1 -0
  129. package/dist/{chunk-COA3S3CZ.js → chunk-XI37A7HH.js} +4 -4
  130. package/dist/{chunk-COA3S3CZ.js.map → chunk-XI37A7HH.js.map} +1 -1
  131. package/dist/{chunk-LGBAZD37.js → chunk-XRL4R2TT.js} +7 -139
  132. package/dist/chunk-XRL4R2TT.js.map +1 -0
  133. package/dist/{chunk-4JNKXOFZ.cjs → chunk-YBJ4QGNH.cjs} +11 -11
  134. package/dist/{chunk-4JNKXOFZ.cjs.map → chunk-YBJ4QGNH.cjs.map} +1 -1
  135. package/dist/{chunk-GFOEWPAP.cjs → chunk-YF3QUHKN.cjs} +49 -12
  136. package/dist/chunk-YF3QUHKN.cjs.map +1 -0
  137. package/dist/{chunk-H4D7WKDY.js → chunk-YNMO3DSR.js} +3 -3
  138. package/dist/{chunk-H4D7WKDY.js.map → chunk-YNMO3DSR.js.map} +1 -1
  139. package/dist/citations/index.cjs +10 -10
  140. package/dist/citations/index.js +2 -2
  141. package/dist/collaboration/index.cjs +77 -77
  142. package/dist/collaboration/index.js +2 -2
  143. package/dist/connect/docx.cjs +14 -14
  144. package/dist/connect/docx.js +10 -10
  145. package/dist/connect/index.cjs +2820 -1043
  146. package/dist/connect/index.cjs.map +1 -1
  147. package/dist/connect/index.d.ts +4 -0
  148. package/dist/connect/index.js +2216 -504
  149. package/dist/connect/index.js.map +1 -1
  150. package/dist/connect/viewer.cjs +68 -72
  151. package/dist/connect/viewer.cjs.map +1 -1
  152. package/dist/connect/viewer.js +11 -15
  153. package/dist/connect/viewer.js.map +1 -1
  154. package/dist/connection/ConnectionProvider.d.ts +7 -0
  155. package/dist/connection/files/DocumentSyncGlyph.d.ts +28 -0
  156. package/dist/connection/files/explorer/ConnectedFilesExplorer.d.ts +56 -0
  157. package/dist/connection/files/explorer/FileTiles.d.ts +87 -0
  158. package/dist/connection/files/index.d.ts +5 -0
  159. package/dist/connection/files/store.d.ts +27 -0
  160. package/dist/connection/files/support.d.ts +38 -0
  161. package/dist/connection/projects/ConnectedProjectsPanel.d.ts +34 -0
  162. package/dist/connection/projects/index.d.ts +1 -0
  163. package/dist/connection/workspace-dashboard/ConnectedWorkspaceDashboard.d.ts +37 -0
  164. package/dist/connection/workspace-dashboard/dashboard-rows.d.ts +42 -0
  165. package/dist/connection/workspace-dashboard/index.d.ts +1 -0
  166. package/dist/connection/workspace-list/ConnectedWorkspaceList.d.ts +37 -0
  167. package/dist/connection/workspace-list/WorkspaceCardsView.d.ts +15 -0
  168. package/dist/connection/workspace-list/WorkspaceFilterMenu.d.ts +4 -0
  169. package/dist/connection/workspace-list/WorkspaceTableView.d.ts +13 -0
  170. package/dist/connection/workspace-list/index.d.ts +5 -0
  171. package/dist/connection/workspace-list/projectBilling.d.ts +21 -0
  172. package/dist/connection/workspace-list/useConnectedWorkspaceList.d.ts +251 -0
  173. package/dist/connection/workspace-list/workspaceTable.d.ts +58 -0
  174. package/dist/connection/workspace-settings/ConnectedWorkspaceMembers.d.ts +26 -0
  175. package/dist/connection/workspace-settings/ConnectedWorkspaceSettings.d.ts +7 -9
  176. package/dist/connection/workspace-settings/index.d.ts +2 -1
  177. package/dist/connection/workspace-settings/useConnectedWorkspaceSettings.d.ts +0 -1
  178. package/dist/facts/index.cjs +3 -3
  179. package/dist/facts/index.js +2 -2
  180. package/dist/files/DocStatusIcon.d.ts +5 -4
  181. package/dist/files/FailedStageIcon.d.ts +26 -0
  182. package/dist/files/folders/FolderProviderIcon.d.ts +29 -0
  183. package/dist/files/folders/folderPaths.d.ts +86 -0
  184. package/dist/files/folders/index.d.ts +2 -0
  185. package/dist/files/index.cjs +328 -240
  186. package/dist/files/index.d.ts +5 -0
  187. package/dist/files/index.js +4 -4
  188. package/dist/files/permissions.d.ts +28 -0
  189. package/dist/files/recently-deleted.d.ts +7 -0
  190. package/dist/files/visibility.d.ts +31 -0
  191. package/dist/home/index.cjs +119 -459
  192. package/dist/home/index.cjs.map +1 -1
  193. package/dist/home/index.js +13 -419
  194. package/dist/home/index.js.map +1 -1
  195. package/dist/index.cjs +480 -480
  196. package/dist/index.js +16 -16
  197. package/dist/provider/BlocksProvider.d.ts +9 -1
  198. package/dist/retrieval/index.cjs +4 -4
  199. package/dist/retrieval/index.js +2 -2
  200. package/dist/settings/index.cjs +169 -165
  201. package/dist/settings/index.d.ts +1 -0
  202. package/dist/settings/index.js +2 -2
  203. package/dist/settings/tri-state-filters.d.ts +13 -0
  204. package/dist/shell/index.cjs +44 -44
  205. package/dist/shell/index.js +3 -3
  206. package/dist/site/index.cjs +5 -5
  207. package/dist/site/index.js +1 -1
  208. package/dist/studio/index.cjs +14 -14
  209. package/dist/studio/index.js +6 -6
  210. package/dist/workflow-canvas/index.cjs +27 -27
  211. package/dist/workflow-canvas/index.js +9 -9
  212. package/dist/workspaces/index.cjs +110 -369
  213. package/dist/workspaces/index.cjs.map +1 -1
  214. package/dist/workspaces/index.d.ts +2 -0
  215. package/dist/workspaces/index.js +12 -350
  216. package/dist/workspaces/index.js.map +1 -1
  217. package/dist/workspaces/workspace-groups.d.ts +90 -0
  218. package/dist/workspaces/workspace-roles.d.ts +11 -0
  219. package/node_modules/@arbidocs/coedit/package.json +1 -1
  220. package/package.json +6 -5
  221. package/dist/ConnectedStreamedWordArtifact-QW74LKHN.cjs.map +0 -1
  222. package/dist/chunk-3PCBYOIZ.js.map +0 -1
  223. package/dist/chunk-4236BRZK.js.map +0 -1
  224. package/dist/chunk-CU2O32Z4.cjs.map +0 -1
  225. package/dist/chunk-EV7W64B6.js +0 -134
  226. package/dist/chunk-EV7W64B6.js.map +0 -1
  227. package/dist/chunk-GFNELPDP.cjs.map +0 -1
  228. package/dist/chunk-GFOEWPAP.cjs.map +0 -1
  229. package/dist/chunk-GRGS5M6O.cjs.map +0 -1
  230. package/dist/chunk-HUJF2XM2.js.map +0 -1
  231. package/dist/chunk-JGOST4IL.js +0 -648
  232. package/dist/chunk-JGOST4IL.js.map +0 -1
  233. package/dist/chunk-KPZZ5FHE.cjs.map +0 -1
  234. package/dist/chunk-KSHKTOY2.js.map +0 -1
  235. package/dist/chunk-LGBAZD37.js.map +0 -1
  236. package/dist/chunk-R6VCPDPF.js.map +0 -1
  237. package/dist/chunk-RQ2Y7USX.cjs.map +0 -1
  238. package/dist/chunk-RXK3XP62.cjs +0 -144
  239. package/dist/chunk-RXK3XP62.cjs.map +0 -1
  240. package/dist/chunk-SMN32BQ3.cjs.map +0 -1
  241. package/dist/chunk-T74Q3MCZ.cjs.map +0 -1
  242. package/dist/chunk-TBEVGWY3.js.map +0 -1
  243. package/dist/chunk-U6JQ4KMX.cjs.map +0 -1
  244. package/dist/chunk-US3S4DCB.js.map +0 -1
  245. package/dist/chunk-XZIYRKLW.cjs.map +0 -1
  246. package/dist/chunk-YAEXSCUW.cjs +0 -677
  247. package/dist/chunk-YAEXSCUW.cjs.map +0 -1
  248. package/dist/chunk-ZLEYLCE4.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkQ4BY2CQQ_cjs = require('./chunk-Q4BY2CQQ.cjs');
4
+ var chunkCQCNU5KT_cjs = require('./chunk-CQCNU5KT.cjs');
5
5
  var chunk757OYF6G_cjs = require('./chunk-757OYF6G.cjs');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
@@ -9,10 +9,10 @@ function ConnectedNativeDocxComparison({
9
9
  fontBaseUrl,
10
10
  ...props
11
11
  }) {
12
- const adapter = chunkQ4BY2CQQ_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
12
+ const adapter = chunkCQCNU5KT_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
13
13
  return /* @__PURE__ */ jsxRuntime.jsx(chunk757OYF6G_cjs.NativeDocxComparison, { ...props, adapter, onCompared: adapter.onVersionSaved });
14
14
  }
15
15
 
16
16
  exports.ConnectedNativeDocxComparison = ConnectedNativeDocxComparison;
17
- //# sourceMappingURL=chunk-ZP6Q3KXU.cjs.map
18
- //# sourceMappingURL=chunk-ZP6Q3KXU.cjs.map
17
+ //# sourceMappingURL=chunk-HUATKA3M.cjs.map
18
+ //# sourceMappingURL=chunk-HUATKA3M.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/docx/ConnectedNativeDocxComparison.tsx"],"names":["useConnectedNativeDocxAdapter","NativeDocxComparison"],"mappings":";;;;;;AAOO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyF;AACvF,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,sCAAQC,sCAAA,EAAA,EAAsB,GAAG,OAAO,OAAA,EAAkB,UAAA,EAAY,QAAQ,cAAA,EAAgB,CAAA;AAChG","file":"chunk-ZP6Q3KXU.cjs","sourcesContent":["import {\n NativeDocxComparison,\n type NativeDocxComparisonProps,\n} from '../../docx/NativeDocxComparison'\nimport { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\n\n/** The Word redline of two documents or versions, on the signed-in session. */\nexport function ConnectedNativeDocxComparison({\n fontBaseUrl,\n ...props\n}: Omit<NativeDocxComparisonProps, 'adapter' | 'onCompared'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <NativeDocxComparison {...props} adapter={adapter} onCompared={adapter.onVersionSaved} />\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/docx/ConnectedNativeDocxComparison.tsx"],"names":["useConnectedNativeDocxAdapter","NativeDocxComparison"],"mappings":";;;;;;AAOO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyF;AACvF,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,sCAAQC,sCAAA,EAAA,EAAsB,GAAG,OAAO,OAAA,EAAkB,UAAA,EAAY,QAAQ,cAAA,EAAgB,CAAA;AAChG","file":"chunk-HUATKA3M.cjs","sourcesContent":["import {\n NativeDocxComparison,\n type NativeDocxComparisonProps,\n} from '../../docx/NativeDocxComparison'\nimport { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\n\n/** The Word redline of two documents or versions, on the signed-in session. */\nexport function ConnectedNativeDocxComparison({\n fontBaseUrl,\n ...props\n}: Omit<NativeDocxComparisonProps, 'adapter' | 'onCompared'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <NativeDocxComparison {...props} adapter={adapter} onCompared={adapter.onVersionSaved} />\n}\n"]}
@@ -0,0 +1,304 @@
1
+ "use client";
2
+ import { Callout } from './chunk-UJE32SST.js';
3
+ import { SectionHeader, EmptyStrip } from './chunk-BQ77KSXU.js';
4
+ import { ActionLink } from './chunk-VF5EUAIV.js';
5
+ import { cn, Button } from '@arbidocs/react/ui';
6
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
+ import { Plus } from 'lucide-react';
8
+
9
+ function HomeFrame({
10
+ testId = "home-page",
11
+ children
12
+ }) {
13
+ return /* @__PURE__ */ jsx("div", { "data-slot": "home-frame", "data-testid": testId, className: "flex h-full flex-col", children });
14
+ }
15
+ function HomeMain({ children }) {
16
+ return /* @__PURE__ */ jsx(
17
+ "main",
18
+ {
19
+ "data-slot": "home-main",
20
+ className: "min-h-0 min-w-sidebar flex-1 overflow-hidden bg-background",
21
+ children
22
+ }
23
+ );
24
+ }
25
+ function HomeCenteredScroll({ children }) {
26
+ return /* @__PURE__ */ jsx("div", { "data-slot": "home-scroll", className: "h-full overflow-y-auto", children: /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-6xl", children }) });
27
+ }
28
+ function HomeCenteredColumn({
29
+ className,
30
+ children
31
+ }) {
32
+ return /* @__PURE__ */ jsx(
33
+ "div",
34
+ {
35
+ "data-slot": "home-column",
36
+ className: cn("mx-auto h-full max-w-6xl px-4 pb-4 sm:px-8", className),
37
+ children
38
+ }
39
+ );
40
+ }
41
+ function HomeLoadError({
42
+ title,
43
+ body,
44
+ testId
45
+ }) {
46
+ return /* @__PURE__ */ jsx(
47
+ "div",
48
+ {
49
+ "data-slot": "home-load-error",
50
+ className: "flex h-full flex-col items-center justify-center p-8",
51
+ children: /* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(Callout, { variant: "danger", title, body, testId }) })
52
+ }
53
+ );
54
+ }
55
+ function CreateTile({
56
+ label,
57
+ ariaLabel,
58
+ onSelect,
59
+ help,
60
+ disabledReason,
61
+ className,
62
+ testId
63
+ }) {
64
+ const disabled = !!disabledReason;
65
+ const select = disabled ? void 0 : onSelect;
66
+ return /* @__PURE__ */ jsxs(
67
+ "div",
68
+ {
69
+ className: cn(
70
+ "flex min-h-40 w-full flex-col items-center justify-center gap-1 rounded-lg p-4 text-muted-foreground border border-border bg-card shadow-xs transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
71
+ disabled ? "cursor-not-allowed opacity-60" : "cursor-pointer hover:border-ring/50 hover:bg-accent/40 hover:text-foreground",
72
+ className
73
+ ),
74
+ onClick: select,
75
+ onKeyDown: (event) => {
76
+ if (event.key === "Enter" || event.key === " ") {
77
+ event.preventDefault();
78
+ select?.();
79
+ }
80
+ },
81
+ role: "button",
82
+ tabIndex: 0,
83
+ "aria-disabled": disabled || void 0,
84
+ title: disabledReason,
85
+ "aria-label": ariaLabel ?? label,
86
+ "data-slot": "create-tile",
87
+ "data-testid": testId,
88
+ children: [
89
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex flex-col items-center gap-2 text-sm font-medium", children: [
90
+ /* @__PURE__ */ jsx(Plus, { className: "size-6", "aria-hidden": "true" }),
91
+ label
92
+ ] }),
93
+ (disabledReason ?? help) && /* @__PURE__ */ jsx("p", { className: "max-w-64 px-4 text-center text-xs leading-snug text-muted-foreground", children: disabledReason ?? help })
94
+ ]
95
+ }
96
+ );
97
+ }
98
+ var DASHBOARD_QUIET_ACTION_CLASS = "h-8 gap-1.5 px-2 text-sm bg-transparent text-muted-foreground hover:bg-muted hover:text-foreground pointer-coarse:h-11";
99
+ function DashboardRoot({
100
+ testId,
101
+ className,
102
+ children
103
+ }) {
104
+ return /* @__PURE__ */ jsx(
105
+ "div",
106
+ {
107
+ "data-slot": "dashboard",
108
+ "data-testid": testId,
109
+ className: cn("flex flex-col gap-6", className),
110
+ children
111
+ }
112
+ );
113
+ }
114
+ function DashboardBand({
115
+ kind,
116
+ children
117
+ }) {
118
+ return /* @__PURE__ */ jsx(
119
+ "div",
120
+ {
121
+ "data-slot": "dashboard-band",
122
+ "data-kind": kind,
123
+ className: kind === "start" ? "mt-2" : "mt-4 flex flex-col gap-3",
124
+ children
125
+ }
126
+ );
127
+ }
128
+ function DashboardColumns({ children }) {
129
+ return /* @__PURE__ */ jsx("div", { "data-slot": "dashboard-columns", className: "grid gap-8 @2xl:grid-cols-2", children });
130
+ }
131
+ function FactMark() {
132
+ return /* @__PURE__ */ jsx(
133
+ "span",
134
+ {
135
+ "data-slot": "fact-mark",
136
+ className: "mx-1 size-1.5 shrink-0 rounded-full bg-muted-foreground/40",
137
+ "aria-hidden": true
138
+ }
139
+ );
140
+ }
141
+ function DashboardAction({ emphasis, icon, label, onClick, testId }) {
142
+ return /* @__PURE__ */ jsxs(
143
+ Button,
144
+ {
145
+ variant: emphasis === "primary" ? "default" : "ghost",
146
+ size: "sm",
147
+ className: emphasis === "primary" ? "h-8 gap-1.5 px-3 text-sm pointer-coarse:h-11" : DASHBOARD_QUIET_ACTION_CLASS,
148
+ onClick,
149
+ "data-testid": testId,
150
+ children: [
151
+ icon,
152
+ label
153
+ ]
154
+ }
155
+ );
156
+ }
157
+ function FactsStrip({
158
+ icon,
159
+ title,
160
+ count,
161
+ onOpen,
162
+ action,
163
+ groups,
164
+ empty,
165
+ className,
166
+ testId
167
+ }) {
168
+ const filled = groups.filter((g) => g.rows.length > 0);
169
+ return /* @__PURE__ */ jsxs(
170
+ "section",
171
+ {
172
+ className: cn("flex min-w-0 flex-col gap-1", className),
173
+ "data-slot": "facts-strip",
174
+ "data-testid": testId,
175
+ children: [
176
+ /* @__PURE__ */ jsx(
177
+ SectionHeader,
178
+ {
179
+ icon,
180
+ title,
181
+ count,
182
+ onOpen,
183
+ openTestId: testId && `${testId}-open`,
184
+ action
185
+ }
186
+ ),
187
+ filled.length === 0 ? empty && /* @__PURE__ */ jsx(
188
+ EmptyStrip,
189
+ {
190
+ icon: empty.icon,
191
+ label: empty.label,
192
+ description: empty.description,
193
+ onSelect: empty.onSelect,
194
+ testId: empty.testId
195
+ }
196
+ ) : filled.map((group) => /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
197
+ /* @__PURE__ */ jsx("p", { className: "px-3 pb-1 pt-1 text-right text-xs text-muted-foreground", children: group.caption }),
198
+ /* @__PURE__ */ jsx("ul", { children: group.rows.map((row) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
199
+ "button",
200
+ {
201
+ type: "button",
202
+ onClick: row.onSelect,
203
+ title: row.title,
204
+ className: "flex w-full min-w-0 items-center gap-3 rounded-md px-3 py-2 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&:hover]:bg-muted pointer-coarse:min-h-11",
205
+ "data-testid": group.rowTestId ?? (testId && `${testId}-row`),
206
+ children: [
207
+ row.leading,
208
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-sm text-foreground", children: row.title }),
209
+ row.time && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: row.time })
210
+ ]
211
+ }
212
+ ) }, row.id)) })
213
+ ] }, group.caption))
214
+ ]
215
+ }
216
+ );
217
+ }
218
+ function RecentList({
219
+ icon,
220
+ title,
221
+ count,
222
+ onOpen,
223
+ openHref,
224
+ action,
225
+ rows,
226
+ caption,
227
+ empty,
228
+ className,
229
+ testId
230
+ }) {
231
+ return /* @__PURE__ */ jsxs(
232
+ "section",
233
+ {
234
+ className: cn("flex min-w-0 flex-col gap-1", className),
235
+ "data-slot": "recent-list",
236
+ "data-testid": testId,
237
+ children: [
238
+ /* @__PURE__ */ jsx(
239
+ SectionHeader,
240
+ {
241
+ icon,
242
+ title,
243
+ count,
244
+ onOpen,
245
+ openHref,
246
+ openTestId: testId && `${testId}-open`,
247
+ action
248
+ }
249
+ ),
250
+ rows.length === 0 ? empty?.onSelect ? /* @__PURE__ */ jsx(
251
+ EmptyStrip,
252
+ {
253
+ icon: empty.icon,
254
+ label: empty.label,
255
+ description: empty.description,
256
+ onSelect: empty.onSelect,
257
+ testId: testId && `${testId}-empty-action`
258
+ }
259
+ ) : /* @__PURE__ */ jsx("p", { className: "px-1 py-3 text-sm text-muted-foreground", children: empty?.description ?? empty?.label }) : /* @__PURE__ */ jsxs(Fragment, { children: [
260
+ caption && /* @__PURE__ */ jsx("p", { className: "sr-only", "data-testid": testId && `${testId}-caption`, children: caption }),
261
+ /* @__PURE__ */ jsx("ul", { children: rows.map((row) => /* @__PURE__ */ jsxs(
262
+ "li",
263
+ {
264
+ className: "relative flex items-center rounded-md transition-colors [&:hover]:bg-muted has-[:focus-visible]:bg-muted",
265
+ "data-slot": "recent-row",
266
+ children: [
267
+ /* @__PURE__ */ jsxs(
268
+ ActionLink,
269
+ {
270
+ href: row.href,
271
+ onSelect: row.onSelect,
272
+ title: row.title,
273
+ className: cn(
274
+ "flex min-w-0 flex-1 items-start gap-3 rounded-md px-3 py-2 text-left focus-visible:outline-none",
275
+ row.onSelect && "cursor-pointer",
276
+ "pointer-coarse:min-h-11"
277
+ ),
278
+ "data-testid": testId && `${testId}-row`,
279
+ children: [
280
+ row.leading,
281
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
282
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-2", children: [
283
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-sm font-medium text-foreground", children: row.title }),
284
+ !row.trailing && row.time && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: row.time })
285
+ ] }),
286
+ row.subtitle && /* @__PURE__ */ jsx("p", { className: "mt-0.5 truncate text-xs text-muted-foreground", children: row.subtitle })
287
+ ] })
288
+ ]
289
+ }
290
+ ),
291
+ row.trailing ? /* @__PURE__ */ jsx("div", { className: "shrink-0 pr-3", children: row.trailing }) : null
292
+ ]
293
+ },
294
+ row.id
295
+ )) })
296
+ ] })
297
+ ]
298
+ }
299
+ );
300
+ }
301
+
302
+ export { CreateTile, DASHBOARD_QUIET_ACTION_CLASS, DashboardAction, DashboardBand, DashboardColumns, DashboardRoot, FactMark, FactsStrip, HomeCenteredColumn, HomeCenteredScroll, HomeFrame, HomeLoadError, HomeMain, RecentList };
303
+ //# sourceMappingURL=chunk-ISHFVKVU.js.map
304
+ //# sourceMappingURL=chunk-ISHFVKVU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/home/HomeLayout.tsx","../src/home/CreateTile.tsx","../src/home/DashboardParts.tsx","../src/home/FactsStrip.tsx","../src/home/RecentList.tsx"],"names":["cn","jsx","jsxs"],"mappings":"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","file":"chunk-ISHFVKVU.js","sourcesContent":["import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { Callout } from '../components/Callout'\n\n/** Column of the home page: greeting header, then the content. */\nexport function HomeFrame({\n testId = 'home-page',\n children,\n}: {\n testId?: string\n children: ReactNode\n}) {\n return (\n <div data-slot=\"home-frame\" data-testid={testId} className=\"flex h-full flex-col\">\n {children}\n </div>\n )\n}\n\n/** Content area under the header; the pages inside own their scrolling. */\nexport function HomeMain({ children }: { children: ReactNode }) {\n return (\n <main\n data-slot=\"home-main\"\n className=\"min-h-0 min-w-sidebar flex-1 overflow-hidden bg-background\"\n >\n {children}\n </main>\n )\n}\n\n/**\n * Scroll container that spans the full width (so its scrollbar rides the window edge) with the\n * content centred in a bounded column.\n */\nexport function HomeCenteredScroll({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"home-scroll\" className=\"h-full overflow-y-auto\">\n <div className=\"mx-auto max-w-6xl\">{children}</div>\n </div>\n )\n}\n\n/** Bounded, centred column for a full-height child (the workspaces table). */\nexport function HomeCenteredColumn({\n className,\n children,\n}: {\n className?: string\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"home-column\"\n className={cn('mx-auto h-full max-w-6xl px-4 pb-4 sm:px-8', className)}\n >\n {children}\n </div>\n )\n}\n\n/** Centred error notice for a page that could not load. */\nexport function HomeLoadError({\n title,\n body,\n testId,\n}: {\n title: string\n body: string\n testId?: string\n}) {\n return (\n <div\n data-slot=\"home-load-error\"\n className=\"flex h-full flex-col items-center justify-center p-8\"\n >\n <div className=\"w-full max-w-md\">\n <Callout variant=\"danger\" title={title} body={body} testId={testId} />\n </div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Plus } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface CreateTileProps {\n /** Visible label, e.g. \"New workspace\". */\n label: string\n /** Accessible name; defaults to `label`. */\n ariaLabel?: string\n onSelect?: () => void\n /** One line explaining what is being created (first-run empty state). */\n help?: ReactNode\n /** When set, the tile is disabled and shows this explanation instead of `help`. */\n disabledReason?: string\n className?: string\n testId?: string\n}\n\n/**\n * The \"create\" tile. Sits in the grid beside the workspace tiles at the same\n * height, in the same tonal family: no dashed outline, no shadow.\n */\nexport function CreateTile({\n label,\n ariaLabel,\n onSelect,\n help,\n disabledReason,\n className,\n testId,\n}: CreateTileProps) {\n const disabled = !!disabledReason\n const select = disabled ? undefined : onSelect\n return (\n <div\n className={cn(\n 'flex min-h-40 w-full flex-col items-center justify-center gap-1 rounded-lg p-4 text-muted-foreground border border-border bg-card shadow-xs transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n disabled\n ? 'cursor-not-allowed opacity-60'\n : 'cursor-pointer hover:border-ring/50 hover:bg-accent/40 hover:text-foreground',\n className\n )}\n onClick={select}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n select?.()\n }\n }}\n role=\"button\"\n tabIndex={0}\n aria-disabled={disabled || undefined}\n title={disabledReason}\n aria-label={ariaLabel ?? label}\n data-slot=\"create-tile\"\n data-testid={testId}\n >\n <span className=\"inline-flex flex-col items-center gap-2 text-sm font-medium\">\n <Plus className=\"size-6\" aria-hidden=\"true\" />\n {label}\n </span>\n {(disabledReason ?? help) && (\n <p className=\"max-w-64 px-4 text-center text-xs leading-snug text-muted-foreground\">\n {disabledReason ?? help}\n </p>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\n/** A section's quiet header action: ghost, small, still 44px on touch. */\nexport const DASHBOARD_QUIET_ACTION_CLASS =\n 'h-8 gap-1.5 px-2 text-sm bg-transparent text-muted-foreground hover:bg-muted hover:text-foreground pointer-coarse:h-11'\n\n/** Column of the workspace dashboard's bands. A container, so children can use `@2xl:` queries. */\nexport function DashboardRoot({\n testId,\n className,\n children,\n}: {\n testId?: string\n className?: string\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"dashboard\"\n data-testid={testId}\n className={cn('flex flex-col gap-6', className)}\n >\n {children}\n </div>\n )\n}\n\n/** A dashboard band: `start` is the tiles under the identity bar, `recent` the lists with an eyebrow. */\nexport function DashboardBand({\n kind,\n children,\n}: {\n kind: 'start' | 'recent'\n children: ReactNode\n}) {\n return (\n <div\n data-slot=\"dashboard-band\"\n data-kind={kind}\n className={kind === 'start' ? 'mt-2' : 'mt-4 flex flex-col gap-3'}\n >\n {children}\n </div>\n )\n}\n\n/** Two equal columns from the `@2xl` container width, one below it. */\nexport function DashboardColumns({ children }: { children: ReactNode }) {\n return (\n <div data-slot=\"dashboard-columns\" className=\"grid gap-8 @2xl:grid-cols-2\">\n {children}\n </div>\n )\n}\n\n/** A fact row's mark: a quiet dot. */\nexport function FactMark() {\n return (\n <span\n data-slot=\"fact-mark\"\n className=\"mx-1 size-1.5 shrink-0 rounded-full bg-muted-foreground/40\"\n aria-hidden\n />\n )\n}\n\nexport interface DashboardActionProps {\n /** `primary` is the page's one filled action; `quiet` the ghost header actions. */\n emphasis: 'primary' | 'quiet'\n icon: ReactNode\n label: string\n onClick: () => void\n testId?: string\n}\n\n/** Header action of a dashboard section (\"New chat\", \"New fact\"). */\nexport function DashboardAction({ emphasis, icon, label, onClick, testId }: DashboardActionProps) {\n return (\n <Button\n variant={emphasis === 'primary' ? 'default' : 'ghost'}\n size=\"sm\"\n className={\n emphasis === 'primary'\n ? 'h-8 gap-1.5 px-3 text-sm pointer-coarse:h-11'\n : DASHBOARD_QUIET_ACTION_CLASS\n }\n onClick={onClick}\n data-testid={testId}\n >\n {icon}\n {label}\n </Button>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { EmptyStrip, SectionHeader } from './sections'\n\nexport interface FactsStripRow {\n id: string\n leading?: ReactNode\n title: string\n /** Right-aligned stamp: a date or a time. */\n time?: string\n onSelect?: () => void\n}\n\nexport interface FactsStripGroup {\n /** Captions the group (\"Upcoming\", \"Created\"); an empty group is not rendered. */\n caption: string\n rows: FactsStripRow[]\n /** Test id of every row in this group. Defaults to `${testId}-row`. */\n rowTestId?: string\n}\n\nexport interface FactsStripEmpty {\n icon: LucideIcon\n label: ReactNode\n description?: ReactNode\n onSelect?: () => void\n testId?: string\n}\n\nexport interface FactsStripProps {\n icon?: LucideIcon\n title: string\n count?: number\n onOpen?: () => void\n action?: ReactNode\n groups: FactsStripGroup[]\n empty?: FactsStripEmpty\n className?: string\n /** Root test id; the title button gets `${testId}-open`. */\n testId?: string\n}\n\n/**\n * A glanceable band of captioned groups (facts: upcoming, recently created).\n * Not a third list page: callers hand it a few rows per group.\n */\nexport function FactsStrip({\n icon,\n title,\n count,\n onOpen,\n action,\n groups,\n empty,\n className,\n testId,\n}: FactsStripProps) {\n const filled = groups.filter((g) => g.rows.length > 0)\n return (\n <section\n className={cn('flex min-w-0 flex-col gap-1', className)}\n data-slot=\"facts-strip\"\n data-testid={testId}\n >\n <SectionHeader\n icon={icon}\n title={title}\n count={count}\n onOpen={onOpen}\n openTestId={testId && `${testId}-open`}\n action={action}\n />\n {filled.length === 0\n ? empty && (\n <EmptyStrip\n icon={empty.icon}\n label={empty.label}\n description={empty.description}\n onSelect={empty.onSelect}\n testId={empty.testId}\n />\n )\n : filled.map((group) => (\n <div key={group.caption} className=\"min-w-0\">\n <p className=\"px-3 pb-1 pt-1 text-right text-xs text-muted-foreground\">\n {group.caption}\n </p>\n <ul>\n {group.rows.map((row) => (\n <li key={row.id}>\n <button\n type=\"button\"\n onClick={row.onSelect}\n title={row.title}\n className=\"flex w-full min-w-0 items-center gap-3 rounded-md px-3 py-2 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&:hover]:bg-muted pointer-coarse:min-h-11\"\n data-testid={group.rowTestId ?? (testId && `${testId}-row`)}\n >\n {row.leading}\n <span className=\"min-w-0 flex-1 truncate text-sm text-foreground\">\n {row.title}\n </span>\n {row.time && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {row.time}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </section>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ActionLink } from '../components/ActionLink'\nimport { EmptyStrip, SectionHeader } from './sections'\n\n/** One listed item. Source-agnostic: a chat, a file. */\nexport interface RecentRow {\n id: string\n /** Bare entity mark (an icon carries its own identity; no tinted box). */\n leading?: ReactNode\n title: string\n subtitle?: string\n /** Pinned right on the title line, like a message time. Hidden when `trailing` is set. */\n time?: string\n onSelect?: () => void\n /** Real link target; `onSelect` still fires on a plain click (see `ActionLink`). */\n href?: string\n /** A control rendered beside the row, outside its button. */\n trailing?: ReactNode\n}\n\nexport interface RecentListEmpty {\n icon?: LucideIcon\n label: ReactNode\n description?: ReactNode\n /** Makes the empty strip an invitation button. */\n onSelect?: () => void\n}\n\nexport interface RecentListProps {\n icon?: LucideIcon\n title: string\n count?: number\n /** Opens the full list; makes the header title a button. */\n onOpen?: () => void\n /** Real link target of the header title (with `onOpen`, plain clicks call `onOpen`). */\n openHref?: string\n /** The section's one quiet header action. */\n action?: ReactNode\n rows: RecentRow[]\n /** Names the right-hand column (\"Added\", \"Messaged\"). */\n caption?: string\n /** What an empty section says. A plain muted line unless `onSelect` is set. */\n empty?: RecentListEmpty\n className?: string\n /** Root test id; derived ids: `-open`, `-caption`, `-row`, `-empty-action`. */\n testId?: string\n}\n\n/**\n * A titled list of recent items (files, chats): plain rows under a quiet\n * header. An empty list is one tonal strip that invites the first item.\n */\nexport function RecentList({\n icon,\n title,\n count,\n onOpen,\n openHref,\n action,\n rows,\n caption,\n empty,\n className,\n testId,\n}: RecentListProps) {\n return (\n <section\n className={cn('flex min-w-0 flex-col gap-1', className)}\n data-slot=\"recent-list\"\n data-testid={testId}\n >\n <SectionHeader\n icon={icon}\n title={title}\n count={count}\n onOpen={onOpen}\n openHref={openHref}\n openTestId={testId && `${testId}-open`}\n action={action}\n />\n {rows.length === 0 ? (\n empty?.onSelect ? (\n <EmptyStrip\n icon={empty.icon}\n label={empty.label}\n description={empty.description}\n onSelect={empty.onSelect}\n testId={testId && `${testId}-empty-action`}\n />\n ) : (\n <p className=\"px-1 py-3 text-sm text-muted-foreground\">\n {empty?.description ?? empty?.label}\n </p>\n )\n ) : (\n <>\n {caption && (\n <p className=\"sr-only\" data-testid={testId && `${testId}-caption`}>\n {caption}\n </p>\n )}\n <ul>\n {rows.map((row) => (\n <li\n key={row.id}\n className=\"relative flex items-center rounded-md transition-colors [&:hover]:bg-muted has-[:focus-visible]:bg-muted\"\n data-slot=\"recent-row\"\n >\n <ActionLink\n href={row.href}\n onSelect={row.onSelect}\n title={row.title}\n className={cn(\n 'flex min-w-0 flex-1 items-start gap-3 rounded-md px-3 py-2 text-left focus-visible:outline-none',\n row.onSelect && 'cursor-pointer',\n 'pointer-coarse:min-h-11'\n )}\n data-testid={testId && `${testId}-row`}\n >\n {row.leading}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">\n {row.title}\n </span>\n {!row.trailing && row.time && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {row.time}\n </span>\n )}\n </div>\n {row.subtitle && (\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {row.subtitle}\n </p>\n )}\n </div>\n </ActionLink>\n {row.trailing ? <div className=\"shrink-0 pr-3\">{row.trailing}</div> : null}\n </li>\n ))}\n </ul>\n </>\n )}\n </section>\n )\n}\n"]}
@@ -0,0 +1,164 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ // src/workspaces/workspace-type.ts
5
+ function getHumanUserCount(users) {
6
+ if (!users) return 0;
7
+ return users.filter((u) => !u.agent_ext_id).length;
8
+ }
9
+ function getWorkspaceTypeInfo(isPublic, userCount) {
10
+ if (isPublic) {
11
+ return { type: "Common", variant: "gray" };
12
+ }
13
+ if (userCount > 1) {
14
+ return { type: "Group", variant: "secondary" };
15
+ }
16
+ return { type: "Individual", variant: "primary" };
17
+ }
18
+ function getVariantBgClass(variant) {
19
+ switch (variant) {
20
+ case "primary":
21
+ return "bg-primary";
22
+ case "secondary":
23
+ return "bg-secondary";
24
+ case "gray":
25
+ return "bg-gray-600";
26
+ }
27
+ }
28
+ function getVariantBorderClass(variant) {
29
+ switch (variant) {
30
+ case "primary":
31
+ return "border-primary";
32
+ case "secondary":
33
+ return "border-secondary";
34
+ case "gray":
35
+ return "border-gray-600";
36
+ }
37
+ }
38
+
39
+ // src/workspaces/workspace-groups.ts
40
+ var NO_PROJECT_GROUP_KEY = "__none__";
41
+ var isListedWorkspace = (workspace) => workspace.workspace_type !== "skills";
42
+ var byPinThenName = (pinned) => (a, b) => {
43
+ const aPinned = pinned.has(a.external_id);
44
+ const bPinned = pinned.has(b.external_id);
45
+ if (aPinned !== bPinned) return aPinned ? -1 : 1;
46
+ return a.name.localeCompare(b.name);
47
+ };
48
+ function groupWorkspacesByProject(workspaces, {
49
+ selfId,
50
+ pinned = /* @__PURE__ */ new Set(),
51
+ projects = [],
52
+ workspacesLabel = "Workspaces"
53
+ }) {
54
+ const byProject = /* @__PURE__ */ new Map();
55
+ for (const workspace of workspaces) {
56
+ const key = workspace.project_ext_id ?? null;
57
+ const list = byProject.get(key);
58
+ if (list) list.push(workspace);
59
+ else byProject.set(key, [workspace]);
60
+ }
61
+ const projectById = new Map(projects.map((p) => [p.external_id, p]));
62
+ const groups = [];
63
+ for (const [projectExtId, list] of byProject) {
64
+ const first = list[0];
65
+ const isOwned = !!projectExtId && first.project_owner_ext_id === selfId;
66
+ const isCommon = !projectExtId && !list.some((w) => w.is_member);
67
+ const name = projectExtId ? projectById.get(projectExtId)?.name || first.project_name || null : null;
68
+ groups.push({
69
+ key: projectExtId ?? NO_PROJECT_GROUP_KEY,
70
+ projectExtId,
71
+ title: projectExtId ? name || (isOwned ? "Personal" : "Unnamed project") : isCommon ? "Common" : workspacesLabel,
72
+ isOwned,
73
+ isCommon,
74
+ workspaces: [...list].sort(byPinThenName(pinned))
75
+ });
76
+ }
77
+ groups.sort((a, b) => {
78
+ if (!a.projectExtId !== !b.projectExtId) return a.projectExtId ? -1 : 1;
79
+ if (a.isOwned !== b.isOwned) return a.isOwned ? -1 : 1;
80
+ return a.title.localeCompare(b.title);
81
+ });
82
+ const empty = projects.filter((p) => p.created_by === selfId && !byProject.has(p.external_id)).map((p) => ({
83
+ key: p.external_id,
84
+ projectExtId: p.external_id,
85
+ title: p.name || "Personal",
86
+ isOwned: true,
87
+ isCommon: false,
88
+ workspaces: []
89
+ }));
90
+ const ownedCount = groups.filter((g) => g.isOwned).length;
91
+ groups.splice(ownedCount, 0, ...empty);
92
+ return groups;
93
+ }
94
+ function byRecentUpdate(a, b) {
95
+ const time = (w) => {
96
+ const t = Date.parse(w.updated_at ?? "");
97
+ return Number.isNaN(t) ? 0 : t;
98
+ };
99
+ return time(b) - time(a);
100
+ }
101
+ var workspaceDocumentCount = (w) => (w.shared_document_count ?? 0) + (w.private_document_count ?? 0);
102
+ var workspaceConversationCount = (w) => (w.shared_conversation_count ?? 0) + (w.private_conversation_count ?? 0);
103
+ var isAgentAccount = (user) => user.external_id.startsWith("agt-");
104
+ function workspaceGroupStats(workspaces) {
105
+ let documents = 0;
106
+ let conversations = 0;
107
+ let updatedAt = "";
108
+ const members = /* @__PURE__ */ new Set();
109
+ for (const workspace of workspaces) {
110
+ documents += workspaceDocumentCount(workspace);
111
+ conversations += workspaceConversationCount(workspace);
112
+ const at = workspace.updated_at || workspace.created_at || "";
113
+ if (at > updatedAt) updatedAt = at;
114
+ for (const member of workspace.users ?? []) {
115
+ if (isAgentAccount(member.user)) continue;
116
+ members.add(member.user.external_id || member.user.email);
117
+ }
118
+ }
119
+ return {
120
+ workspaces: workspaces.length,
121
+ documents,
122
+ conversations,
123
+ members: members.size,
124
+ updatedAt
125
+ };
126
+ }
127
+ var WORKSPACE_CATEGORY_FILTERS = [
128
+ { id: "owned", label: "Owned by me" },
129
+ { id: "pinned", label: "Pinned" },
130
+ { id: "individual", label: "Individual" },
131
+ { id: "group", label: "Group" },
132
+ { id: "common", label: "Common" }
133
+ ];
134
+ var projectFilterId = (projectExtId) => `project:${projectExtId}`;
135
+ function workspaceFilterAttributes(workspace, { selfId, pinned }) {
136
+ const { type } = getWorkspaceTypeInfo(workspace.is_public, getHumanUserCount(workspace.users));
137
+ const attributes = {
138
+ individual: type === "Individual",
139
+ group: type === "Group",
140
+ common: type === "Common",
141
+ pinned: pinned.has(workspace.external_id),
142
+ owned: workspace.created_by_ext_id === selfId
143
+ };
144
+ if (workspace.project_ext_id) attributes[projectFilterId(workspace.project_ext_id)] = true;
145
+ return attributes;
146
+ }
147
+
148
+ exports.NO_PROJECT_GROUP_KEY = NO_PROJECT_GROUP_KEY;
149
+ exports.WORKSPACE_CATEGORY_FILTERS = WORKSPACE_CATEGORY_FILTERS;
150
+ exports.byRecentUpdate = byRecentUpdate;
151
+ exports.getHumanUserCount = getHumanUserCount;
152
+ exports.getVariantBgClass = getVariantBgClass;
153
+ exports.getVariantBorderClass = getVariantBorderClass;
154
+ exports.getWorkspaceTypeInfo = getWorkspaceTypeInfo;
155
+ exports.groupWorkspacesByProject = groupWorkspacesByProject;
156
+ exports.isAgentAccount = isAgentAccount;
157
+ exports.isListedWorkspace = isListedWorkspace;
158
+ exports.projectFilterId = projectFilterId;
159
+ exports.workspaceConversationCount = workspaceConversationCount;
160
+ exports.workspaceDocumentCount = workspaceDocumentCount;
161
+ exports.workspaceFilterAttributes = workspaceFilterAttributes;
162
+ exports.workspaceGroupStats = workspaceGroupStats;
163
+ //# sourceMappingURL=chunk-JUUOJP7I.cjs.map
164
+ //# sourceMappingURL=chunk-JUUOJP7I.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/workspaces/workspace-type.ts","../src/workspaces/workspace-groups.ts"],"names":[],"mappings":"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","file":"chunk-JUUOJP7I.cjs","sourcesContent":["/**\n * Workspace Type Utilities\n *\n * Helper functions for determining workspace type information.\n */\n\nexport type WorkspaceVariant = 'primary' | 'secondary' | 'gray'\n\n/**\n * Count non-agent users in a workspace.\n * Workspace users with agent_ext_id are agents and should not count\n * for determining workspace type (individual vs group).\n */\nexport function getHumanUserCount(users?: { agent_ext_id?: string | null }[]): number {\n if (!users) return 0\n return users.filter((u) => !u.agent_ext_id).length\n}\n\n/**\n * Helper to determine workspace type and variant\n */\nexport function getWorkspaceTypeInfo(\n isPublic: boolean,\n userCount: number\n): { type: string; variant: WorkspaceVariant } {\n if (isPublic) {\n return { type: 'Common', variant: 'gray' }\n }\n if (userCount > 1) {\n return { type: 'Group', variant: 'secondary' }\n }\n return { type: 'Individual', variant: 'primary' }\n}\n\n/**\n * Returns the Tailwind background color class for a workspace type variant\n */\nexport function getVariantBgClass(variant: WorkspaceVariant): string {\n switch (variant) {\n case 'primary':\n return 'bg-primary'\n case 'secondary':\n return 'bg-secondary'\n case 'gray':\n return 'bg-gray-600'\n }\n}\n\n/**\n * Returns the Tailwind border color class for a workspace type variant\n */\nexport function getVariantBorderClass(variant: WorkspaceVariant): string {\n switch (variant) {\n case 'primary':\n return 'border-primary'\n case 'secondary':\n return 'border-secondary'\n case 'gray':\n return 'border-gray-600'\n }\n}\n","/**\n * The user's workspaces grouped by project, as the workspace list shows them (cards and table\n * alike): one group per project, the user's own projects first (an owned project with no\n * workspace yet still gets its group, to invite the first one), other people's projects by name,\n * and the workspaces with no visible project last. Plus the tri-state filter over the list\n * (projects and workspace categories) and the totals a group's heading shows.\n *\n * Pure: a host maps nothing; these read the API's workspace and project records as they come.\n */\nimport type { components } from '@arbidocs/client'\nimport { getHumanUserCount, getWorkspaceTypeInfo } from './workspace-type'\n\nexport type GroupedWorkspace = components['schemas']['WorkspaceResponse']\ntype Project = Pick<\n components['schemas']['ProjectResponse'],\n 'external_id' | 'name' | 'subscription' | 'created_by'\n>\n\n/** Group key of the workspaces that have no visible project. */\nexport const NO_PROJECT_GROUP_KEY = '__none__'\n\nexport interface WorkspaceProjectGroup {\n /** Stable key (the project's id, or `NO_PROJECT_GROUP_KEY`): collapse state and row ids. */\n key: string\n projectExtId: string | null\n /** The project's name with the fallbacks applied (\"Personal\", \"Common\", \"Workspaces\"…). */\n title: string\n /** The user owns the project. */\n isOwned: boolean\n /**\n * The no-project group of public workspaces the user is not a member of (\"Common\"): shared\n * with everyone, so it starts collapsed.\n */\n isCommon: boolean\n /** Pinned first, then by name. */\n workspaces: GroupedWorkspace[]\n}\n\nexport interface GroupWorkspacesOptions {\n /** The signed-in user (`usr-…`): whose projects and workspaces are \"own\". */\n selfId: string | undefined\n /** Pinned workspace ids: first within their group. */\n pinned?: ReadonlySet<string>\n /** The user's projects: fresher names, and a group for each owned project with no workspace. */\n projects?: readonly Project[]\n /** The plural word for workspaces (the own no-project group's title). */\n workspacesLabel?: string\n}\n\n/** The skills marketplace is a system workspace: reached through the skills UI, never listed. */\nexport const isListedWorkspace = (workspace: Pick<GroupedWorkspace, 'workspace_type'>): boolean =>\n workspace.workspace_type !== 'skills'\n\nconst byPinThenName =\n (pinned: ReadonlySet<string>) => (a: GroupedWorkspace, b: GroupedWorkspace) => {\n const aPinned = pinned.has(a.external_id)\n const bPinned = pinned.has(b.external_id)\n if (aPinned !== bPinned) return aPinned ? -1 : 1\n return a.name.localeCompare(b.name)\n }\n\n/**\n * Group `workspaces` (already filtered) by project. The order: own projects (by name, then the\n * own projects with no workspace), other people's projects by name, the no-project group last.\n */\nexport function groupWorkspacesByProject(\n workspaces: readonly GroupedWorkspace[],\n {\n selfId,\n pinned = new Set(),\n projects = [],\n workspacesLabel = 'Workspaces',\n }: GroupWorkspacesOptions\n): WorkspaceProjectGroup[] {\n const byProject = new Map<string | null, GroupedWorkspace[]>()\n for (const workspace of workspaces) {\n const key = workspace.project_ext_id ?? null\n const list = byProject.get(key)\n if (list) list.push(workspace)\n else byProject.set(key, [workspace])\n }\n\n const projectById = new Map(projects.map((p) => [p.external_id, p]))\n const groups: WorkspaceProjectGroup[] = []\n for (const [projectExtId, list] of byProject) {\n const first = list[0]\n const isOwned = !!projectExtId && first.project_owner_ext_id === selfId\n const isCommon = !projectExtId && !list.some((w) => w.is_member)\n const name = projectExtId\n ? projectById.get(projectExtId)?.name || first.project_name || null\n : null\n groups.push({\n key: projectExtId ?? NO_PROJECT_GROUP_KEY,\n projectExtId,\n title: projectExtId\n ? name || (isOwned ? 'Personal' : 'Unnamed project')\n : isCommon\n ? 'Common'\n : workspacesLabel,\n isOwned,\n isCommon,\n workspaces: [...list].sort(byPinThenName(pinned)),\n })\n }\n\n groups.sort((a, b) => {\n if (!a.projectExtId !== !b.projectExtId) return a.projectExtId ? -1 : 1\n if (a.isOwned !== b.isOwned) return a.isOwned ? -1 : 1\n return a.title.localeCompare(b.title)\n })\n\n // An own project with no workspace yet keeps its group (after the own projects with some).\n const empty = projects\n .filter((p) => p.created_by === selfId && !byProject.has(p.external_id))\n .map<WorkspaceProjectGroup>((p) => ({\n key: p.external_id,\n projectExtId: p.external_id,\n title: p.name || 'Personal',\n isOwned: true,\n isCommon: false,\n workspaces: [],\n }))\n const ownedCount = groups.filter((g) => g.isOwned).length\n groups.splice(ownedCount, 0, ...empty)\n return groups\n}\n\n/** Most recently updated first (the cards' order within a group). */\nexport function byRecentUpdate(a: GroupedWorkspace, b: GroupedWorkspace): number {\n const time = (w: GroupedWorkspace) => {\n const t = Date.parse(w.updated_at ?? '')\n return Number.isNaN(t) ? 0 : t\n }\n return time(b) - time(a)\n}\n\n/** What a group's heading reports about its workspaces: sums, and distinct people (no agents). */\nexport interface WorkspaceGroupStats {\n workspaces: number\n documents: number\n conversations: number\n members: number\n /** The most recent activity (ISO), `''` when none. */\n updatedAt: string\n}\n\nexport const workspaceDocumentCount = (w: GroupedWorkspace): number =>\n (w.shared_document_count ?? 0) + (w.private_document_count ?? 0)\n\nexport const workspaceConversationCount = (w: GroupedWorkspace): number =>\n (w.shared_conversation_count ?? 0) + (w.private_conversation_count ?? 0)\n\n/** An agent account (`agt-…`): kept out of member counts and faces. */\nexport const isAgentAccount = (user: { external_id: string }): boolean =>\n user.external_id.startsWith('agt-')\n\nexport function workspaceGroupStats(workspaces: readonly GroupedWorkspace[]): WorkspaceGroupStats {\n let documents = 0\n let conversations = 0\n let updatedAt = ''\n const members = new Set<string>()\n for (const workspace of workspaces) {\n documents += workspaceDocumentCount(workspace)\n conversations += workspaceConversationCount(workspace)\n const at = workspace.updated_at || workspace.created_at || ''\n if (at > updatedAt) updatedAt = at\n for (const member of workspace.users ?? []) {\n if (isAgentAccount(member.user)) continue\n members.add(member.user.external_id || member.user.email)\n }\n }\n return {\n workspaces: workspaces.length,\n documents,\n conversations,\n members: members.size,\n updatedAt,\n }\n}\n\n// ── Filtering ────────────────────────────────────────────────────────────────\n\n/** The category filters, in menu order. */\nexport const WORKSPACE_CATEGORY_FILTERS = [\n { id: 'owned', label: 'Owned by me' },\n { id: 'pinned', label: 'Pinned' },\n { id: 'individual', label: 'Individual' },\n { id: 'group', label: 'Group' },\n { id: 'common', label: 'Common' },\n] as const\n\n/** A project filter's id. */\nexport const projectFilterId = (projectExtId: string): string => `project:${projectExtId}`\n\n/** Which filters a workspace matches: its category, pinned, owned, and its project. */\nexport function workspaceFilterAttributes(\n workspace: GroupedWorkspace,\n { selfId, pinned }: { selfId: string | undefined; pinned: ReadonlySet<string> }\n): Record<string, boolean> {\n const { type } = getWorkspaceTypeInfo(workspace.is_public, getHumanUserCount(workspace.users))\n const attributes: Record<string, boolean> = {\n individual: type === 'Individual',\n group: type === 'Group',\n common: type === 'Common',\n pinned: pinned.has(workspace.external_id),\n owned: workspace.created_by_ext_id === selfId,\n }\n if (workspace.project_ext_id) attributes[projectFilterId(workspace.project_ext_id)] = true\n return attributes\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkGFNELPDP_cjs = require('./chunk-GFNELPDP.cjs');
4
+ var chunkFM3IRQJW_cjs = require('./chunk-FM3IRQJW.cjs');
5
5
  var chunk5A2QQAF5_cjs = require('./chunk-5A2QQAF5.cjs');
6
6
  var chunkJKB7WT7L_cjs = require('./chunk-JKB7WT7L.cjs');
7
7
  var react$1 = require('react');
@@ -9,7 +9,7 @@ var react = require('@arbidocs/react');
9
9
  var jsxRuntime = require('react/jsx-runtime');
10
10
 
11
11
  function useConnectedAiTask() {
12
- const { assistantConfig } = chunkGFNELPDP_cjs.useConnection();
12
+ const { assistantConfig } = chunkFM3IRQJW_cjs.useConnection();
13
13
  const task = react.useAiTask();
14
14
  const kitRun = task.run;
15
15
  const run = react$1.useCallback(
@@ -19,15 +19,15 @@ function useConnectedAiTask() {
19
19
  return { ...task, run };
20
20
  }
21
21
  function useWorkspaceDocs() {
22
- const { workspaceId, fallbackWorkspaceId } = chunkGFNELPDP_cjs.useConnection();
22
+ const { workspaceId, fallbackWorkspaceId } = chunkFM3IRQJW_cjs.useConnection();
23
23
  return react.useWorkspaceDocs(workspaceId ?? fallbackWorkspaceId);
24
24
  }
25
25
  function useSemanticSearch() {
26
- const { assistantConfig } = chunkGFNELPDP_cjs.useConnection();
26
+ const { assistantConfig } = chunkFM3IRQJW_cjs.useConnection();
27
27
  return react.useSemanticSearch([], { model: assistantConfig });
28
28
  }
29
29
  function useConnectedChat(options) {
30
- const { workspaceId, fallbackWorkspaceId, assistantConfig, user, status, ensureWorkspaceOpen } = chunkGFNELPDP_cjs.useConnection();
30
+ const { workspaceId, fallbackWorkspaceId, assistantConfig, user, status, ensureWorkspaceOpen } = chunkFM3IRQJW_cjs.useConnection();
31
31
  const wsId = workspaceId ?? fallbackWorkspaceId;
32
32
  const { data: members = [] } = react.useWorkspaceUsers(wsId, {
33
33
  enabled: status === "authenticated" && !!wsId,
@@ -84,5 +84,5 @@ exports.useConnectedAiTask = useConnectedAiTask;
84
84
  exports.useConnectedChat = useConnectedChat;
85
85
  exports.useSemanticSearch = useSemanticSearch;
86
86
  exports.useWorkspaceDocs = useWorkspaceDocs;
87
- //# sourceMappingURL=chunk-4KMLM3GY.cjs.map
88
- //# sourceMappingURL=chunk-4KMLM3GY.cjs.map
87
+ //# sourceMappingURL=chunk-KBO75NLM.cjs.map
88
+ //# sourceMappingURL=chunk-KBO75NLM.cjs.map