nolo-cli 0.107.0-alpha.4 → 0.107.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 (209) hide show
  1. package/README.md +1 -1
  2. package/{_executeModel-UDCSOTD2.js → _executeModel-C4EH5TZG.js} +77 -69
  3. package/action-GVA5ARSJ.js +20 -0
  4. package/{addContentAction-MB2HHMDZ.js → addContentAction-M2WOWZCL.js} +13 -12
  5. package/{addDialogAgentAction-MCEABSBA.js → addDialogAgentAction-QMAQ5Z6N.js} +19 -20
  6. package/{agentDeleteCommand-OWYHN6D6.js → agentDeleteCommand-D3RICSHX.js} +118 -43
  7. package/{agentEmailCommands-AU5I4M4W.js → agentEmailCommands-YC2A4USQ.js} +99 -89
  8. package/agentListCommands-UDJELMYP.js +741 -0
  9. package/{agentMachineCommands-YMNME2L6.js → agentMachineCommands-XH4IBGTO.js} +48 -44
  10. package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-CMVTBY5X.js} +97 -2
  11. package/{agentPullCommand-O5MPVJ5E.js → agentPullCommand-B4T2DJ5H.js} +1 -1
  12. package/agentRecordCommands-3EOC2QMN.js +138 -0
  13. package/agentRunCommand-BTHYOVVS.js +167 -0
  14. package/{agentRunControl-AVJR4JW4.js → agentRunControl-3HWA2LLQ.js} +2 -2
  15. package/{agentRuntimeLocal-KCMC2TBD.js → agentRuntimeLocal-N4YGKL7M.js} +44 -40
  16. package/{agentSlice-R7PR6KYM.js → agentSlice-NIN4T6CF.js} +15 -14
  17. package/{appDeleteCommands-JEPA3EWE.js → appDeleteCommands-7DAF33AM.js} +46 -42
  18. package/{appDeployCommands-UTB76XFM.js → appDeployCommands-ZPZSMFGZ.js} +46 -42
  19. package/{appDeployStatusCommands-LGHF2SBD.js → appDeployStatusCommands-FWBDSSS5.js} +46 -42
  20. package/{appGetCommands-PX2BFHOB.js → appGetCommands-SZZOHGEP.js} +46 -42
  21. package/{appListCommands-BSMPTWKC.js → appListCommands-FPMUBDPM.js} +46 -42
  22. package/{authCommand-YW42YZA4.js → authCommand-VL3G26NQ.js} +119 -25
  23. package/{authCommands-RGOGCPP6.js → authCommands-5RTUDYZW.js} +7 -5
  24. package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-ZK4K67Y5.js} +11 -9
  25. package/{chromeCommands-FZYAU75D.js → chromeCommands-AU5ZJXBG.js} +289 -37
  26. package/{chromeOpsCommands-62P2Q2YB.js → chromeOpsCommands-ZYTCMNHG.js} +156 -22
  27. package/{chunk-JDPFV2JV.js → chunk-2NNRWRM5.js} +20 -11
  28. package/{chunk-JEDZAO7L.js → chunk-2SYTUTLI.js} +257 -37
  29. package/{chunk-HVURBGF3.js → chunk-2U3NHADM.js} +6 -6
  30. package/{chunk-UVA7OYO3.js → chunk-2ZHBFX5R.js} +29 -9
  31. package/{chunk-QTGQ2LTL.js → chunk-3DQY5IFB.js} +6 -10
  32. package/chunk-4LCOCOR5.js +50 -0
  33. package/{chunk-JPGCXHNM.js → chunk-4LKMZ3RR.js} +1 -1
  34. package/{chunk-2GRGFCF6.js → chunk-4VJAC32I.js} +2 -1
  35. package/{chunk-6D6VBVEW.js → chunk-4W24JM32.js} +80 -14
  36. package/{chunk-MC4XLIJ7.js → chunk-523DITKR.js} +1 -1
  37. package/{chunk-E4MARS3Q.js → chunk-5GVBDNTO.js} +1 -1
  38. package/chunk-5MMAK75Q.js +15 -0
  39. package/{chunk-7S4YWN7P.js → chunk-5UUIGN6I.js} +4 -4
  40. package/{chunk-42V6BK2E.js → chunk-62IL3KQV.js} +4 -34
  41. package/{chunk-IBOOZVVD.js → chunk-6IJDSYUA.js} +849 -279
  42. package/{chunk-4MK3I7Y4.js → chunk-6MAW4XOF.js} +5 -5
  43. package/chunk-76HO2DP6.js +15 -0
  44. package/chunk-7AY2H3GA.js +13692 -0
  45. package/{chunk-4CR5I7BD.js → chunk-7HYOPBUW.js} +47 -67
  46. package/{chunk-VLTIYV3X.js → chunk-7I25CBT5.js} +34 -8
  47. package/chunk-AGIM7IMJ.js +147 -0
  48. package/{chunk-5UTFL4QJ.js → chunk-AOTBKDRK.js} +7 -0
  49. package/{chunk-6OZ36FXI.js → chunk-BIPGGSJS.js} +22 -4
  50. package/{chunk-EYAQT56M.js → chunk-BNQMNUKZ.js} +9 -6
  51. package/{chunk-62CATUYY.js → chunk-CBUMFIFE.js} +834 -962
  52. package/{chunk-OIVSQH2O.js → chunk-CDEEFJXN.js} +308 -11
  53. package/chunk-CHOZJMJS.js +78 -0
  54. package/{chunk-ETI2NYVF.js → chunk-CIP3AAMT.js} +4 -4
  55. package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
  56. package/{chunk-IBOZNTG2.js → chunk-DGEUP3DK.js} +23 -28
  57. package/{chunk-Q554LLSI.js → chunk-DMXLXZKL.js} +1 -1
  58. package/{chunk-3VNWWVKB.js → chunk-E3YWHWCR.js} +50 -18
  59. package/{chunk-HKNXJGEC.js → chunk-ECFHBYUW.js} +85 -50
  60. package/{chunk-ACTMNVHM.js → chunk-EHSYSKXV.js} +1 -1
  61. package/{chunk-WV42OMV7.js → chunk-ELUDRSRD.js} +8 -8
  62. package/{chunk-ABQYVJBJ.js → chunk-EV235ILT.js} +5 -5
  63. package/{chunk-TRV2MIDW.js → chunk-EXAJ6DCR.js} +1 -0
  64. package/{chunk-BFDFRLLQ.js → chunk-EZ4VZHAG.js} +5 -5
  65. package/{chunk-GO3Z72MT.js → chunk-FHLMQIU7.js} +65 -95
  66. package/{chunk-2F7RJC6L.js → chunk-FOXQ7BAB.js} +1 -1
  67. package/{chunk-SH43IESU.js → chunk-GGC55Q32.js} +199 -29
  68. package/chunk-GMZLP5DV.js +82 -0
  69. package/{chunk-FDTR4QJ6.js → chunk-H6A6X4EK.js} +32 -1
  70. package/{chunk-DVINR3PL.js → chunk-HDLLCBRF.js} +1 -1
  71. package/{chunk-QOKAKDPE.js → chunk-HIM3FCLF.js} +0 -1
  72. package/{chunk-ONXOABJR.js → chunk-HNGRBWYF.js} +3 -0
  73. package/{chunk-BNGW5ASC.js → chunk-I2RGRVQ7.js} +22 -2
  74. package/{chunk-O6OSWFZQ.js → chunk-IHPDK6UD.js} +6 -0
  75. package/{chunk-QDSINZM3.js → chunk-IXH3HKY2.js} +1 -22
  76. package/{chunk-GQBOR3G6.js → chunk-JBKHQOYK.js} +8 -4
  77. package/{chunk-XD2MJFUG.js → chunk-JEFXP73H.js} +1 -1
  78. package/{chunk-PBA4UJBK.js → chunk-JIXGJTBU.js} +4 -4
  79. package/{chunk-AEOE4Z6Q.js → chunk-K6L5PNXK.js} +39 -15
  80. package/{chunk-Z77CRGTW.js → chunk-KA5O5KQL.js} +1 -1
  81. package/{chunk-GPCZ7UXG.js → chunk-KD6D6BLA.js} +1 -1
  82. package/{chunk-UZGQNTVW.js → chunk-KHKTDMYG.js} +8 -6
  83. package/{chunk-MRIHM22T.js → chunk-LBFL6RZG.js} +58 -9
  84. package/{chunk-C3M4465B.js → chunk-LKIVH2I2.js} +403 -658
  85. package/{chunk-LS2ZANRJ.js → chunk-LOCNXNOU.js} +1 -1
  86. package/{chunk-DHDMC6FO.js → chunk-LUBFABMJ.js} +15 -14
  87. package/{chunk-NA35QHCF.js → chunk-LVBFKW65.js} +1 -1
  88. package/chunk-LWLNLZC5.js +265 -0
  89. package/{chunk-EEGDMATE.js → chunk-M3NMHYRB.js} +86 -81
  90. package/chunk-N4NGJDT6.js +929 -0
  91. package/{chunk-GL3EHUR4.js → chunk-N7NLLRQQ.js} +68 -46
  92. package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
  93. package/{chunk-FZGV4FGK.js → chunk-NUHHBEJC.js} +378 -187
  94. package/chunk-NWENLDMM.js +42 -0
  95. package/chunk-O7SVKKLY.js +875 -0
  96. package/chunk-OCZKATRC.js +129 -0
  97. package/{chunk-6Z7MY3V7.js → chunk-OEJLGVBL.js} +5 -5
  98. package/{chunk-VMFTFOWF.js → chunk-OKGVNZTL.js} +35 -8
  99. package/{chunk-GEPUP7OO.js → chunk-OR2UWD6X.js} +3 -3
  100. package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
  101. package/{chunk-J4MOO56S.js → chunk-PNXHPLRU.js} +10 -2
  102. package/{chunk-3BMYXEUW.js → chunk-R5AJODNI.js} +1 -1
  103. package/{chunk-P5EVSOPA.js → chunk-R6EBQEQE.js} +22 -29
  104. package/{chunk-NOF3HDSN.js → chunk-RLSF5CSE.js} +11 -9
  105. package/chunk-RQ6CTX2E.js +164 -0
  106. package/{chunk-3UZPUAES.js → chunk-RSB4PWX4.js} +1 -1
  107. package/{chunk-KQ4ONNQD.js → chunk-RXA3HAVW.js} +190 -8
  108. package/{chunk-IIVGDG4I.js → chunk-SJKULPGX.js} +13 -7
  109. package/chunk-SQHMSDDU.js +8004 -0
  110. package/{chunk-Q67DOFOO.js → chunk-SZC4REES.js} +212 -105
  111. package/{chunk-JRQFUXY7.js → chunk-TBAXFWOS.js} +99 -22
  112. package/{chunk-PQFHGD77.js → chunk-TBM2RS3U.js} +161 -14
  113. package/{chunk-XT35TTFG.js → chunk-TCYU7L6V.js} +18 -20
  114. package/{chunk-BYMV6QZG.js → chunk-TNIX77YM.js} +4 -0
  115. package/chunk-TY3TIUJK.js +89 -0
  116. package/{chunk-I3TQJXQ7.js → chunk-U3C3IA32.js} +9 -2
  117. package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
  118. package/chunk-UM7TA3K4.js +1008 -0
  119. package/{chunk-6YTOJY35.js → chunk-VBG7GWWR.js} +253 -8
  120. package/chunk-VIWDGTDA.js +8 -0
  121. package/chunk-VJVNU77E.js +83 -0
  122. package/{chunk-W7HLWAQ7.js → chunk-VPLUU4IX.js} +118 -90
  123. package/{chunk-UKWGR5SS.js → chunk-VY6VFGKR.js} +194 -1144
  124. package/chunk-VZLO4XJD.js +17 -0
  125. package/{chunk-AHAHBQMU.js → chunk-WDLSZMTA.js} +2 -2
  126. package/{chunk-53HEEOTT.js → chunk-WF5X57VW.js} +83 -16
  127. package/{chunk-VRTTFDBM.js → chunk-WPHY3VPF.js} +35 -22
  128. package/{chunk-ASIFZ2WY.js → chunk-YKZLFY5J.js} +66 -54
  129. package/chunk-YV25TM3R.js +780 -0
  130. package/{chunk-MS7TSPZR.js → chunk-YXKNBVYW.js} +19 -17
  131. package/chunk-ZRAU6T47.js +56 -0
  132. package/commandRegistry-UU6IOTHI.js +833 -0
  133. package/{contentThunks-IV2T3EJC.js → contentThunks-ARD56LKI.js} +39 -36
  134. package/{cooldownCommands-REAWYVTY.js → cooldownCommands-ZLEPIB4A.js} +2 -2
  135. package/{createAgentAutomationAction-JCOIEYY4.js → createAgentAutomationAction-HWJLU6DD.js} +40 -37
  136. package/createDialogAction-CHYA6PZE.js +70 -0
  137. package/{createPageAction-D2VOOLP3.js → createPageAction-TSCYNFX7.js} +47 -43
  138. package/{chunk-FG3HKPQP.js → cursorProvider-YGGNMVWX.js} +2751 -10185
  139. package/{dbSlice-A6C6H32X.js → dbSlice-TG4MZ5EB.js} +12 -11
  140. package/{deleteFile-YG6QMJLU.js → deleteFile-KESP65GC.js} +7 -6
  141. package/{dialogCommands-H7FPUYUQ.js → dialogCommands-IJYQAQMB.js} +49 -46
  142. package/{dialogSlice-6JZOOTDS.js → dialogSlice-H476I77R.js} +57 -37
  143. package/{dist-VODFSGNG.js → dist-NJC2W7I4.js} +61 -54
  144. package/{docCreateCommands-WRG2JLGM.js → docCreateCommands-AZSK4NAG.js} +48 -44
  145. package/{docDeleteCommands-SHWJIBJS.js → docDeleteCommands-DDJMSMFZ.js} +49 -45
  146. package/{docReadCommands-WJN3WT6O.js → docReadCommands-5F5Q6EBZ.js} +47 -43
  147. package/{docStore-HUPQ2FSS.js → docStore-HW2RDZDM.js} +17 -13
  148. package/{docUpdateCommands-IE32IL6O.js → docUpdateCommands-XPNPVZOC.js} +48 -44
  149. package/{fetchMessages-EIU7UFFK.js → fetchMessages-3PXAHKCR.js} +5 -5
  150. package/{getPricing-LUSEABA6.js → getPricing-DOBBZLOK.js} +4 -4
  151. package/{handleSendMessageAction-DFPMQ7YM.js → handleSendMessageAction-IOXE7ILC.js} +109 -42
  152. package/index.js +87 -884
  153. package/{lib-FRRS27KN.js → lib-PU2G2MSO.js} +523 -191
  154. package/{localDialogRead-BTFJ4V2I.js → localDialogRead-UYCKO7YZ.js} +2 -2
  155. package/{localRuntimeAuthority-6IR6BBXE.js → localRuntimeAuthority-TU6OBC76.js} +9 -6
  156. package/{localRuntimeDb-SYQGUF4U.js → localRuntimeDb-VKWVOPPI.js} +1 -1
  157. package/{machineCommands-M2T2I5NF.js → machineCommands-Q7TDGM6P.js} +96 -86
  158. package/machineWsRunDispatch-T5VFOQ3R.js +154 -0
  159. package/{memberThunks-P2ECUJ56.js → memberThunks-5S5D3N4U.js} +20 -18
  160. package/{models-T3SG6MJ5.js → models-PQU25T6Q.js} +2 -2
  161. package/oauthTokenStore-ITEB663N.js +23 -0
  162. package/package.json +1 -1
  163. package/processSpawn-SOAV3FEV.js +11 -0
  164. package/profileConfig-ZGOFORWV.js +43 -0
  165. package/{providerPresetApply-FG6NZ57W.js → providerPresetApply-HAQWVAQX.js} +7 -7
  166. package/{providerRegistry-757OWH3O.js → providerRegistry-5FGWB3X5.js} +11 -7
  167. package/{read-COE3ZYR6.js → read-LSYFLSIM.js} +8 -7
  168. package/{readDocTool-5USN4A6V.js → readDocTool-XWRXV3DR.js} +5 -3
  169. package/{readlineWorkspace-XQRDGWRZ.js → readlineWorkspace-25U6P3DG.js} +2595 -2031
  170. package/{removeDialogAgentAction-J6X5QMTA.js → removeDialogAgentAction-4TEFC3VL.js} +22 -26
  171. package/{runAgentClientLoop-5ZA62FBA.js → runAgentClientLoop-CZOYWHDN.js} +78 -71
  172. package/{runtimeDoctorCommands-X6WDBEQX.js → runtimeDoctorCommands-PIVSBZRZ.js} +4 -4
  173. package/runtimeModeArgs-2Y7BALTO.js +31 -0
  174. package/{setDialogExtraReferencesAction-WX5VTY6O.js → setDialogExtraReferencesAction-LSEN44OY.js} +16 -14
  175. package/{setPrimaryDialogAgentAction-FN22THHT.js → setPrimaryDialogAgentAction-SR366X5A.js} +23 -27
  176. package/{chunk-GP5LKBUZ.js → settingThunks-CTVPPGIN.js} +226 -940
  177. package/{skillDiscovery-CYUCJMAG.js → skillDiscovery-ZBU76COE.js} +3 -3
  178. package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
  179. package/{spaceCommands-5GLCWZPO.js → spaceCommands-3UK63WPE.js} +51 -47
  180. package/{streamAgentChatTurn-6UZJMYRB.js → streamAgentChatTurn-LV6ZWUD4.js} +214 -114
  181. package/{switchDialogAgentAction-LVTEV3FR.js → switchDialogAgentAction-M6NAFOOU.js} +19 -20
  182. package/{tableCommands-O6NWHFKV.js → tableCommands-6U4BMLRR.js} +10 -10
  183. package/{toolApiClient-QVJ6HDNN.js → toolApiClient-AD7CXTA4.js} +4 -3
  184. package/tools-UJOV6CQZ.js +117 -0
  185. package/{tuiSummaryLlmCaller-OHHFTHMG.js → tuiSummaryLlmCaller-DEH7ZEM6.js} +25 -23
  186. package/{updateCommands-2M74UL7P.js → updateCommands-4EHDLF5J.js} +3 -3
  187. package/{updateDialogTitleAction-QTKNIURB.js → updateDialogTitleAction-JYXKIBNJ.js} +84 -45
  188. package/action-P4TNFGAD.js +0 -31
  189. package/agentListCommands-B2V4YAC4.js +0 -410
  190. package/agentRecordCommands-G4KK4R7H.js +0 -128
  191. package/agentRunCommand-UTZJA23G.js +0 -156
  192. package/browser-image-compression-MFDTD7K6.js +0 -1763
  193. package/chatQueueReduxAdapter-2P6NFX64.js +0 -186
  194. package/chunk-CQ3WA2NE.js +0 -299
  195. package/chunk-M76ECQRD.js +0 -13658
  196. package/chunk-MEYIRKDN.js +0 -8967
  197. package/chunk-PUOC4YRO.js +0 -394
  198. package/chunk-Q5FJJ6XI.js +0 -103
  199. package/chunk-S7Z2HMCN.js +0 -25
  200. package/chunk-T75QD6AB.js +0 -20923
  201. package/chunk-Y5GCAMGP.js +0 -9
  202. package/chunk-YPREESF4.js +0 -225
  203. package/createDialogAction-NGG7YVNU.js +0 -65
  204. package/machineWsRunDispatch-ISBKOOD7.js +0 -144
  205. package/settingSlice-P4ZW7K5X.js +0 -204
  206. package/syncMapping-N6RGXGBW.js +0 -437
  207. package/tools-KMGFWO43.js +0 -110
  208. package/{chunk-X7HHHIOZ.js → chunk-Y6ROFCZO.js} +0 -0
  209. package/{db-WK5MDZVN.js → db-VQSAOWAO.js} +1 -1
@@ -0,0 +1,875 @@
1
+ import {
2
+ isRecord
3
+ } from "./chunk-KUG52IAP.js";
4
+ import {
5
+ createSelector,
6
+ noloDeleteRequest,
7
+ noloPatchRequest,
8
+ noloUploadRequest,
9
+ noloWriteRequest,
10
+ syncWithServers
11
+ } from "./chunk-VY6VFGKR.js";
12
+ import {
13
+ getAllServers,
14
+ getIsDesktopApp
15
+ } from "./chunk-HIM3FCLF.js";
16
+ import {
17
+ selectIdentityToken,
18
+ selectIdentityUser,
19
+ selectIdentityUserId
20
+ } from "./chunk-SEJ5OS6F.js";
21
+ import {
22
+ asOptionalPositiveFiniteNumber
23
+ } from "./chunk-U6VC4MU4.js";
24
+ import {
25
+ asTrimmedString
26
+ } from "./chunk-3EUW3WEO.js";
27
+ import {
28
+ SERVERS,
29
+ normalizeKnownServerOrigin
30
+ } from "./chunk-LCBAMY2M.js";
31
+ import {
32
+ isLocalServerUrl
33
+ } from "./chunk-4SN6J65J.js";
34
+ import {
35
+ normalizeServerOrigin
36
+ } from "./chunk-CF7PE763.js";
37
+ import {
38
+ asOptionalTrimmedString
39
+ } from "./chunk-G3SUCT4W.js";
40
+
41
+ // packages/app/stateViews/runtime.ts
42
+ var selectCurrentToken = (state) => {
43
+ const token = selectIdentityToken(state);
44
+ return typeof token === "string" ? token : void 0;
45
+ };
46
+ var selectCurrentUserId = (state) => {
47
+ const userId = selectIdentityUserId(state);
48
+ return typeof userId === "string" ? userId : void 0;
49
+ };
50
+ var EMPTY_SYNC_SERVERS = [];
51
+ var selectRuntimeRemoteServer = (state) => {
52
+ const configuredServer = normalizeKnownServerOrigin(state.settings?.currentServer) ?? void 0;
53
+ if (!getIsDesktopApp()) return configuredServer || SERVERS.MAIN;
54
+ return isLocalServerUrl(configuredServer) ? SERVERS.MAIN : configuredServer || SERVERS.MAIN;
55
+ };
56
+ var selectConfiguredSyncServers = (state) => state.settings?.syncServers;
57
+ var selectRuntimeRemoteSyncServers = createSelector(
58
+ [selectConfiguredSyncServers],
59
+ (syncServers) => {
60
+ if (!Array.isArray(syncServers) || syncServers.length === 0) {
61
+ return EMPTY_SYNC_SERVERS;
62
+ }
63
+ const normalized = syncServers.map(normalizeKnownServerOrigin).filter((server) => !!server);
64
+ if (!getIsDesktopApp()) return normalized;
65
+ return normalized.filter((server) => !isLocalServerUrl(server));
66
+ }
67
+ );
68
+ var selectLocalRuntimeOrigin = () => {
69
+ if (typeof window !== "undefined" && typeof window.location?.origin === "string" && /^https?:\/\//.test(window.location.origin)) {
70
+ return window.location.origin.replace(/\/+$/, "");
71
+ }
72
+ return void 0;
73
+ };
74
+ var selectRuntimeSnapshot = createSelector(
75
+ [
76
+ selectCurrentToken,
77
+ selectCurrentUserId,
78
+ selectRuntimeRemoteServer,
79
+ selectRuntimeRemoteSyncServers,
80
+ selectLocalRuntimeOrigin
81
+ ],
82
+ (currentToken, currentUserId, currentServer, syncServers, localRuntimeOrigin) => ({
83
+ currentToken,
84
+ currentUserId,
85
+ currentServer,
86
+ syncServers,
87
+ localRuntimeOrigin
88
+ })
89
+ );
90
+ var selectRuntimeCurrentServer = createSelector(
91
+ [selectRuntimeSnapshot],
92
+ (runtime) => runtime.currentServer
93
+ );
94
+ var selectRuntimeRemoteServers = createSelector(
95
+ [selectRuntimeSnapshot],
96
+ (runtime) => getAllServers(runtime.currentServer, runtime.syncServers)
97
+ );
98
+
99
+ // packages/database/runtimeServerContext.ts
100
+ var getRuntimeServerContext = (state, preferredServerOrigin) => {
101
+ const {
102
+ currentToken,
103
+ currentUserId,
104
+ currentServer,
105
+ syncServers = []
106
+ } = selectRuntimeSnapshot(state);
107
+ return {
108
+ currentToken,
109
+ currentUserId,
110
+ currentServer,
111
+ syncServers,
112
+ userAuthorityRegistry: resolveRuntimeUserAuthorityRegistry(state),
113
+ remoteServers: getAllServers(
114
+ currentServer,
115
+ syncServers,
116
+ preferredServerOrigin
117
+ )
118
+ };
119
+ };
120
+ var resolveRuntimeUserAuthorityRegistry = (state) => {
121
+ const settingsRegistry = state.settings?.userAuthorityRegistry;
122
+ if (settingsRegistry && typeof settingsRegistry === "object") {
123
+ return settingsRegistry;
124
+ }
125
+ const userRegistry = selectIdentityUser(state)?.authorityRegistry;
126
+ if (userRegistry && typeof userRegistry === "object") {
127
+ return userRegistry;
128
+ }
129
+ return void 0;
130
+ };
131
+
132
+ // packages/database/authority/ownerKey.ts
133
+ var USER_OWNED_SECOND_SEGMENT_PREFIXES = /* @__PURE__ */ new Set([
134
+ "agent",
135
+ "dialog",
136
+ "page",
137
+ "doc",
138
+ "notification",
139
+ "email",
140
+ "meta",
141
+ "row",
142
+ "view",
143
+ "file",
144
+ "job"
145
+ ]);
146
+ var PUBLIC_OWNER_SENTINELS = /* @__PURE__ */ new Set(["pub", "id", "stats", "index"]);
147
+ var cleanSegment = (value) => {
148
+ const trimmed = asTrimmedString(value);
149
+ return trimmed.length > 0 ? trimmed : null;
150
+ };
151
+ var normalizeCandidateOwners = (candidateOwnerUserIds) => {
152
+ const out = [];
153
+ for (const candidate of candidateOwnerUserIds ?? []) {
154
+ const normalized = cleanSegment(candidate ?? void 0);
155
+ if (!normalized || PUBLIC_OWNER_SENTINELS.has(normalized)) continue;
156
+ if (!out.includes(normalized)) out.push(normalized);
157
+ }
158
+ return out.sort((left, right) => right.length - left.length);
159
+ };
160
+ var resolveCandidateOwnerFromKeyRemainder = (remainder, candidateOwnerUserIds) => {
161
+ const normalizedRemainder = cleanSegment(remainder);
162
+ if (!normalizedRemainder) return null;
163
+ for (const candidate of normalizeCandidateOwners(candidateOwnerUserIds)) {
164
+ if (normalizedRemainder === candidate || normalizedRemainder.startsWith(`${candidate}-`)) {
165
+ return candidate;
166
+ }
167
+ }
168
+ return null;
169
+ };
170
+ var parseOwnerUserIdFromDbKey = (dbKey, options = {}) => {
171
+ const normalized = cleanSegment(dbKey);
172
+ if (!normalized) return null;
173
+ const parts = normalized.split("-");
174
+ const [prefix] = parts;
175
+ if (!prefix) return null;
176
+ if (!USER_OWNED_SECOND_SEGMENT_PREFIXES.has(prefix)) {
177
+ if (prefix === "grant" && parts[1] === "agent" && parts.length >= 5) {
178
+ const ownerAndRest2 = normalized.slice(prefix.length + 1 + parts[1].length + 1);
179
+ const [owner2] = ownerAndRest2.split("-");
180
+ return cleanSegment(owner2);
181
+ }
182
+ return null;
183
+ }
184
+ if (parts[0] === "dialog" && parts[2] === "msg") {
185
+ return null;
186
+ }
187
+ const ownerAndRest = normalized.slice(prefix.length + 1);
188
+ const candidateOwner = resolveCandidateOwnerFromKeyRemainder(
189
+ ownerAndRest,
190
+ options.candidateOwnerUserIds
191
+ );
192
+ if (candidateOwner) return candidateOwner;
193
+ const [owner] = ownerAndRest.split("-");
194
+ const ownerUserId = cleanSegment(owner);
195
+ if (!ownerUserId) return null;
196
+ if (PUBLIC_OWNER_SENTINELS.has(ownerUserId)) return null;
197
+ return ownerUserId;
198
+ };
199
+
200
+ // packages/database/authority/userAuthorityRegistry.ts
201
+ var normalizeAuthorityServerOrigin = (value) => {
202
+ const normalized = normalizeServerOrigin(value);
203
+ return /^https?:\/\//i.test(normalized) ? normalized : null;
204
+ };
205
+ var normalizeUserId = (value) => asOptionalTrimmedString(value) ?? null;
206
+ var readEntryAuthorityServer = (entry) => {
207
+ if (typeof entry === "string") {
208
+ return normalizeAuthorityServerOrigin(entry);
209
+ }
210
+ if (!isRecord(entry)) {
211
+ return null;
212
+ }
213
+ return normalizeAuthorityServerOrigin(entry.authorityServer) ?? normalizeAuthorityServerOrigin(entry.homeServer) ?? normalizeAuthorityServerOrigin(entry.primaryServer);
214
+ };
215
+ var resolveUserAuthorityServer = ({
216
+ ownerUserId,
217
+ registry
218
+ }) => {
219
+ const normalizedOwner = normalizeUserId(ownerUserId);
220
+ if (!normalizedOwner || !registry || typeof registry !== "object") {
221
+ return null;
222
+ }
223
+ return readEntryAuthorityServer(registry[normalizedOwner]);
224
+ };
225
+
226
+ // packages/database/authority/recordAuthority.ts
227
+ var normalizeUserId2 = (value) => asOptionalTrimmedString(value) ?? null;
228
+ var getRegistryOwnerCandidates = (registry) => isRecord(registry) ? Object.keys(registry) : [];
229
+ var resolveRecordAuthority = ({
230
+ dbKey,
231
+ record,
232
+ currentUserId,
233
+ currentServer,
234
+ userAuthorityRegistry
235
+ }) => {
236
+ const ownerUserId = parseOwnerUserIdFromDbKey(dbKey, {
237
+ candidateOwnerUserIds: [
238
+ normalizeUserId2(record?.userId),
239
+ normalizeUserId2(currentUserId),
240
+ ...getRegistryOwnerCandidates(userAuthorityRegistry)
241
+ ]
242
+ }) ?? normalizeUserId2(record?.userId);
243
+ const serverOrigin = normalizeAuthorityServerOrigin(record?.serverOrigin);
244
+ const explicitAuthority = normalizeAuthorityServerOrigin(record?.authorityServer);
245
+ const registryAuthority = resolveUserAuthorityServer({
246
+ ownerUserId,
247
+ registry: userAuthorityRegistry
248
+ });
249
+ const currentUserAuthority = ownerUserId && ownerUserId === normalizeUserId2(currentUserId) ? normalizeAuthorityServerOrigin(currentServer) : null;
250
+ return {
251
+ ownerUserId,
252
+ authorityServer: explicitAuthority ?? registryAuthority ?? currentUserAuthority ?? serverOrigin,
253
+ serverOrigin
254
+ };
255
+ };
256
+
257
+ // packages/database/actions/readResolution.ts
258
+ var toComparableTimestamp = (data) => {
259
+ if (!data || typeof data !== "object") return 0;
260
+ const updatedAtMs = asOptionalPositiveFiniteNumber(
261
+ new Date(data.updatedAt).getTime()
262
+ );
263
+ if (updatedAtMs !== void 0) return updatedAtMs;
264
+ const createdAtMs = asOptionalPositiveFiniteNumber(
265
+ new Date(data.createdAt).getTime()
266
+ );
267
+ if (createdAtMs !== void 0) return createdAtMs;
268
+ return asOptionalPositiveFiniteNumber(Number(data?.meta?.createdAt)) ?? 0;
269
+ };
270
+ var partitionReadServers = ({
271
+ allServers,
272
+ preferredServerOrigin
273
+ }) => {
274
+ const preferredServer = typeof preferredServerOrigin === "string" && preferredServerOrigin.trim().length > 0 ? normalizeServerOrigin(preferredServerOrigin) : null;
275
+ const fallbackServers = preferredServer ? allServers.filter(
276
+ (server) => normalizeServerOrigin(server) !== preferredServer
277
+ ) : allServers;
278
+ return {
279
+ preferredServer,
280
+ fallbackServers,
281
+ orderedServersForLocalHit: preferredServer ? [preferredServer, ...fallbackServers] : fallbackServers
282
+ };
283
+ };
284
+ var compareRemoteRecordsByComparableTime = (left, right) => toComparableTimestamp(left) - toComparableTimestamp(right);
285
+ var pickBestSettledRemoteRecord = ({
286
+ settledResults,
287
+ isBetterCandidate
288
+ }) => {
289
+ const validResults = settledResults.map((result, index) => ({
290
+ data: result.status === "fulfilled" ? result.value : null,
291
+ index
292
+ })).filter((item) => item.data !== null && typeof item.data === "object");
293
+ if (validResults.length === 0) return null;
294
+ const latest = validResults.reduce(
295
+ (best, current) => isBetterCandidate(current.data, best.data) ? current : best
296
+ );
297
+ return { index: latest.index, data: latest.data };
298
+ };
299
+ var shouldReplaceLocalWithRemoteRecord = ({
300
+ localData,
301
+ remoteData,
302
+ isRemoteNewer
303
+ }) => {
304
+ if (!remoteData || typeof remoteData !== "object") return false;
305
+ if (!localData || typeof localData !== "object") return true;
306
+ return isRemoteNewer(remoteData, localData);
307
+ };
308
+ var shouldReplicateLocalRecord = ({
309
+ localData,
310
+ remoteData,
311
+ remoteTargetCount
312
+ }) => !!localData && !remoteData && remoteTargetCount > 0;
313
+ var compactUniqueServers = (servers) => {
314
+ const out = [];
315
+ for (const server of servers) {
316
+ if (typeof server !== "string" || server.trim().length === 0) continue;
317
+ const normalized = normalizeServerOrigin(server);
318
+ if (!out.includes(normalized)) out.push(normalized);
319
+ }
320
+ return out;
321
+ };
322
+ var planAuthorityReadServers = ({
323
+ allServers,
324
+ authorityServer,
325
+ serverOrigin
326
+ }) => compactUniqueServers([authorityServer, serverOrigin, ...allServers]);
327
+
328
+ // packages/core/fnv1a32.ts
329
+ var fnv1a32 = (str) => {
330
+ let hash = 2166136261;
331
+ for (let i = 0; i < str.length; i++) {
332
+ hash ^= str.charCodeAt(i);
333
+ hash = hash * 16777619 >>> 0;
334
+ }
335
+ return hash >>> 0;
336
+ };
337
+ var fnv1a32Hex = (str) => fnv1a32(str).toString(16).padStart(8, "0");
338
+
339
+ // packages/database/fileRing.ts
340
+ var chooseServersByKey = (allServers, key, replicaCount) => {
341
+ if (!allServers.length || replicaCount <= 0) return [];
342
+ const uniqueServers = Array.from(new Set(allServers)).filter((s) => !!s);
343
+ if (uniqueServers.length === 0) return [];
344
+ const scored = uniqueServers.map((server) => ({
345
+ server,
346
+ score: fnv1a32(`${server}::${key}`)
347
+ }));
348
+ scored.sort((a, b) => a.score - b.score);
349
+ const limit = Math.min(replicaCount, scored.length);
350
+ return scored.slice(0, limit).map((item) => item.server);
351
+ };
352
+
353
+ // packages/database/tenantPlacement.ts
354
+ var TENANT_REPLICA_COUNT = 2;
355
+ var planServersForTenant = (allServers, currentServer, tenantId) => {
356
+ const uniqueServers = Array.from(new Set(allServers)).filter(Boolean);
357
+ if (!uniqueServers.length) return [];
358
+ const key = asOptionalTrimmedString(tenantId) ?? "default-tenant";
359
+ const fromRing = chooseServersByKey(
360
+ uniqueServers,
361
+ key,
362
+ TENANT_REPLICA_COUNT
363
+ );
364
+ const set = new Set(fromRing);
365
+ if (currentServer && uniqueServers.includes(currentServer)) {
366
+ set.add(currentServer);
367
+ }
368
+ return Array.from(set);
369
+ };
370
+
371
+ // packages/database/authority/deviceLocal.ts
372
+ var DEVICE_LOCAL_OWNER_ID = "local";
373
+ var DEVICE_LOCAL_DB_KEY_PREFIXES = [
374
+ "dialog-local-",
375
+ "agent-local-"
376
+ ];
377
+ var clean = (value) => asOptionalTrimmedString(value) ?? null;
378
+ var isDeviceLocalOwnerId = (userId) => clean(userId) === DEVICE_LOCAL_OWNER_ID;
379
+ var resolveEffectiveSpaceActorId = (accountUserId) => {
380
+ const cleaned = clean(accountUserId);
381
+ if (!cleaned || isDeviceLocalOwnerId(cleaned)) {
382
+ return DEVICE_LOCAL_OWNER_ID;
383
+ }
384
+ return cleaned;
385
+ };
386
+ var isDeviceLocalSpaceMembership = (membership) => isDeviceLocalOwnerId(membership?.userId);
387
+ var isDeviceLocalSpaceBody = (space) => isDeviceLocalOwnerId(space?.userId) || isDeviceLocalOwnerId(space?.ownerId);
388
+ var isDeviceLocalDbKey = (dbKey) => {
389
+ const key = clean(dbKey);
390
+ if (!key) return false;
391
+ for (const prefix of DEVICE_LOCAL_DB_KEY_PREFIXES) {
392
+ if (key.startsWith(prefix)) return true;
393
+ }
394
+ return parseOwnerUserIdFromDbKey(key, {
395
+ candidateOwnerUserIds: [DEVICE_LOCAL_OWNER_ID]
396
+ }) === DEVICE_LOCAL_OWNER_ID;
397
+ };
398
+ var resolveRecordOwnerUserId = (record) => {
399
+ if (!record) return null;
400
+ const explicit = clean(record.userId);
401
+ if (explicit) return explicit;
402
+ if (isDeviceLocalDbKey(record.dbKey) || isDeviceLocalDbKey(record.id)) {
403
+ return DEVICE_LOCAL_OWNER_ID;
404
+ }
405
+ const fromKey = parseOwnerUserIdFromDbKey(clean(record.dbKey) ?? "", {
406
+ candidateOwnerUserIds: [DEVICE_LOCAL_OWNER_ID]
407
+ }) ?? parseOwnerUserIdFromDbKey(clean(record.id) ?? "", {
408
+ candidateOwnerUserIds: [DEVICE_LOCAL_OWNER_ID]
409
+ });
410
+ return fromKey;
411
+ };
412
+
413
+ // packages/database/actions/writeAck.ts
414
+ var ACK_ENTRY_RETENTION_MS = 1e4;
415
+ var ACK_ENTRY_MAX = 256;
416
+ var replicationTargetKey = (server) => normalizeKnownServerOrigin(server) ?? normalizeServerOrigin(server);
417
+ var ackEntries = /* @__PURE__ */ new Map();
418
+ var sweepAckEntries = () => {
419
+ const wallClock = Date.now();
420
+ for (const [key, entry] of ackEntries) {
421
+ if (entry.settledAt !== null && wallClock - entry.settledAt > ACK_ENTRY_RETENTION_MS) {
422
+ ackEntries.delete(key);
423
+ }
424
+ }
425
+ while (ackEntries.size > ACK_ENTRY_MAX) {
426
+ const oldest = ackEntries.keys().next().value;
427
+ if (oldest === void 0) break;
428
+ ackEntries.delete(oldest);
429
+ }
430
+ };
431
+ var isReplicationAckHandle = (value) => {
432
+ if (!value || typeof value !== "object") return false;
433
+ const handle = value;
434
+ return typeof handle.primary?.then === "function" && handle.targets instanceof Map;
435
+ };
436
+ var asAckStatus = (ack) => ack.then(
437
+ (ok) => ok ? "acked" : "failed",
438
+ () => "failed"
439
+ );
440
+ var beginWriteAck = (dbKey) => {
441
+ let resolveOutcome = () => {
442
+ };
443
+ const promise = new Promise((resolve) => {
444
+ resolveOutcome = resolve;
445
+ });
446
+ const entry = {
447
+ promise,
448
+ settledAt: null,
449
+ servers: [],
450
+ primaryTargetKey: null,
451
+ planRegistered: false,
452
+ targetAcks: /* @__PURE__ */ new Map(),
453
+ settle: (status) => {
454
+ entry.settledAt = Date.now();
455
+ resolveOutcome(status);
456
+ }
457
+ };
458
+ ackEntries.set(dbKey, entry);
459
+ sweepAckEntries();
460
+ return {
461
+ settleWithReplication: (replication) => {
462
+ if (isReplicationAckHandle(replication)) {
463
+ entry.planRegistered = true;
464
+ entry.servers = [...replication.servers];
465
+ entry.primaryTargetKey = replicationTargetKey(replication.servers[0]);
466
+ for (const [key, ack] of replication.targets) {
467
+ entry.targetAcks.set(key, asAckStatus(ack));
468
+ }
469
+ void asAckStatus(replication.primary).then(
470
+ (status) => entry.settle(status)
471
+ );
472
+ return;
473
+ }
474
+ if (replication && typeof replication.then === "function") {
475
+ void asAckStatus(replication).then(
476
+ (status) => entry.settle(status)
477
+ );
478
+ return;
479
+ }
480
+ entry.settle("not-replicated");
481
+ },
482
+ markNotReplicated: () => entry.settle("not-replicated"),
483
+ markAborted: () => entry.settle("aborted")
484
+ };
485
+ };
486
+
487
+ // packages/database/actions/replication.ts
488
+ var isReadonlyPublicRecordKey = (dbKey) => dbKey.startsWith("agent-pub-");
489
+ var normalizeCurrentUserId = (state) => {
490
+ const userId = selectIdentityUserId(state);
491
+ return asOptionalTrimmedString(userId) ?? null;
492
+ };
493
+ var resolveReplicationServers = (currentServer, syncServers, preferredServerOrigin) => getAllServers(currentServer, syncServers, preferredServerOrigin);
494
+ var resolveAuthorityReplicationServers = ({
495
+ currentServer,
496
+ syncServers,
497
+ preferredServerOrigin,
498
+ dbKey,
499
+ record,
500
+ state
501
+ }) => {
502
+ const allServers = resolveReplicationServers(
503
+ currentServer,
504
+ syncServers,
505
+ preferredServerOrigin
506
+ );
507
+ const authority = resolveRecordAuthority({
508
+ dbKey,
509
+ record,
510
+ currentUserId: selectIdentityUserId(state),
511
+ currentServer,
512
+ userAuthorityRegistry: state?.settings?.userAuthorityRegistry ?? selectIdentityUser(state)?.authorityRegistry
513
+ });
514
+ if (isDeviceLocalOwnerId(authority.ownerUserId) || isDeviceLocalOwnerId(record?.userId) || isDeviceLocalDbKey(dbKey)) {
515
+ return [];
516
+ }
517
+ return planAuthorityReadServers({
518
+ allServers,
519
+ authorityServer: preferredServerOrigin ?? authority.authorityServer,
520
+ serverOrigin: authority.serverOrigin
521
+ });
522
+ };
523
+ var scheduleWriteReplication = (servers, request, state) => {
524
+ if (servers.length === 0) return null;
525
+ const [primaryServer, ...backupServers] = servers;
526
+ const targets = /* @__PURE__ */ new Map();
527
+ const settleTarget = /* @__PURE__ */ new Map();
528
+ for (const server of servers) {
529
+ const key = replicationTargetKey(server);
530
+ if (!key || targets.has(key)) continue;
531
+ targets.set(
532
+ key,
533
+ new Promise((resolve) => {
534
+ settleTarget.set(key, resolve);
535
+ })
536
+ );
537
+ }
538
+ const settleTargetFor = (server, ok) => {
539
+ const key = replicationTargetKey(server);
540
+ const resolve = settleTarget.get(key);
541
+ if (!resolve) return;
542
+ settleTarget.delete(key);
543
+ resolve(ok);
544
+ };
545
+ const primaryAck = Promise.resolve().then(async () => {
546
+ let primarySucceeded = false;
547
+ try {
548
+ primarySucceeded = await noloWriteRequest(primaryServer, request, state);
549
+ } finally {
550
+ settleTargetFor(primaryServer, primarySucceeded);
551
+ }
552
+ if (!primarySucceeded) {
553
+ console.warn(`Primary write sync failed for ${request.customKey} on ${primaryServer}`);
554
+ }
555
+ if (backupServers.length === 0) {
556
+ return primarySucceeded;
557
+ }
558
+ try {
559
+ syncWithServers(
560
+ backupServers,
561
+ (server, requestConfig, requestState, signal) => noloWriteRequest(server, requestConfig, requestState, signal, {
562
+ failureLogLevel: "info"
563
+ }).then(
564
+ (ok) => {
565
+ settleTargetFor(server, ok);
566
+ return ok;
567
+ },
568
+ (error) => {
569
+ settleTargetFor(server, false);
570
+ throw error;
571
+ }
572
+ ),
573
+ `Backup write sync failed for ${request.customKey} on`,
574
+ request,
575
+ state
576
+ );
577
+ } catch (error) {
578
+ for (const server of backupServers) settleTargetFor(server, false);
579
+ throw error;
580
+ }
581
+ return primarySucceeded;
582
+ });
583
+ return { servers: [...servers], primary: primaryAck, targets };
584
+ };
585
+ var resolveTenantReplicationServers = ({
586
+ currentServer,
587
+ syncServers,
588
+ tenantId
589
+ }) => {
590
+ const allServers = resolveReplicationServers(currentServer, syncServers);
591
+ if (allServers.length === 0) {
592
+ return [];
593
+ }
594
+ return planServersForTenant(allServers, currentServer, tenantId);
595
+ };
596
+ var resolveUploadReplicationServers = ({
597
+ currentServer,
598
+ syncServers,
599
+ tenantId,
600
+ uploadConfig,
601
+ state
602
+ }) => {
603
+ const allServers = resolveReplicationServers(currentServer, syncServers);
604
+ const authority = resolveRecordAuthority({
605
+ dbKey: uploadConfig.customKey,
606
+ record: uploadConfig.metadata,
607
+ currentUserId: selectIdentityUserId(state),
608
+ currentServer,
609
+ userAuthorityRegistry: state?.settings?.userAuthorityRegistry ?? selectIdentityUser(state)?.authorityRegistry
610
+ });
611
+ if (authority.ownerUserId || authority.authorityServer) {
612
+ return planAuthorityReadServers({
613
+ allServers,
614
+ authorityServer: authority.authorityServer,
615
+ serverOrigin: authority.serverOrigin
616
+ });
617
+ }
618
+ return resolveTenantReplicationServers({
619
+ currentServer,
620
+ syncServers,
621
+ tenantId
622
+ });
623
+ };
624
+ var scheduleExistingRecordReplication = ({
625
+ currentServer,
626
+ syncServers,
627
+ preferredServerOrigin,
628
+ dbKey,
629
+ localData,
630
+ state
631
+ }) => {
632
+ if (isReadonlyPublicRecordKey(dbKey)) {
633
+ return [];
634
+ }
635
+ const currentUserId = normalizeCurrentUserId(state);
636
+ const authority = resolveRecordAuthority({
637
+ dbKey,
638
+ record: localData,
639
+ currentUserId,
640
+ currentServer,
641
+ userAuthorityRegistry: state?.settings?.userAuthorityRegistry ?? selectIdentityUser(state)?.authorityRegistry
642
+ });
643
+ if (authority.ownerUserId && currentUserId && authority.ownerUserId !== currentUserId) {
644
+ return [];
645
+ }
646
+ const servers = resolveAuthorityReplicationServers({
647
+ currentServer,
648
+ syncServers,
649
+ preferredServerOrigin,
650
+ dbKey,
651
+ record: localData,
652
+ state
653
+ });
654
+ if (servers.length === 0) {
655
+ return [];
656
+ }
657
+ scheduleWriteReplication(
658
+ servers,
659
+ {
660
+ data: localData,
661
+ customKey: dbKey,
662
+ userId: typeof localData?.userId === "string" ? localData.userId : selectIdentityUserId(state)
663
+ },
664
+ state
665
+ );
666
+ return servers;
667
+ };
668
+ var schedulePatchReplication = ({
669
+ servers,
670
+ dbKey,
671
+ changes,
672
+ state,
673
+ preferredServerOrigin
674
+ }) => {
675
+ if (servers.length === 0) return;
676
+ Promise.resolve().then(async () => {
677
+ const primaryServer = typeof preferredServerOrigin === "string" && preferredServerOrigin.trim().length > 0 ? normalizeServerOrigin(preferredServerOrigin) : servers[0];
678
+ const backupServers = servers.filter(
679
+ (server) => normalizeServerOrigin(server) !== primaryServer
680
+ );
681
+ const primarySucceeded = await noloPatchRequest(primaryServer, dbKey, changes, state, void 0, {
682
+ failureLogLevel: "warn"
683
+ });
684
+ if (!primarySucceeded) {
685
+ console.warn(`Primary patch sync failed for ${dbKey} on ${primaryServer}`);
686
+ }
687
+ if (backupServers.length > 0) {
688
+ syncWithServers(
689
+ backupServers,
690
+ (server, targetDbKey, nextChanges, requestState, signal) => noloPatchRequest(server, targetDbKey, nextChanges, requestState, signal, {
691
+ failureLogLevel: "info"
692
+ }),
693
+ `Backup patch sync failed for ${dbKey} on`,
694
+ dbKey,
695
+ changes,
696
+ state
697
+ );
698
+ }
699
+ });
700
+ };
701
+ var scheduleConfiguredPatchReplication = ({
702
+ currentServer,
703
+ syncServers,
704
+ preferredServerOrigin,
705
+ dbKey,
706
+ changes,
707
+ state
708
+ }) => {
709
+ const servers = resolveAuthorityReplicationServers({
710
+ currentServer,
711
+ syncServers,
712
+ preferredServerOrigin,
713
+ dbKey,
714
+ record: changes,
715
+ state
716
+ });
717
+ if (servers.length === 0) {
718
+ return [];
719
+ }
720
+ schedulePatchReplication({
721
+ servers,
722
+ dbKey,
723
+ changes,
724
+ state,
725
+ preferredServerOrigin
726
+ });
727
+ return servers;
728
+ };
729
+ var scheduleUploadReplication = ({
730
+ currentServer,
731
+ syncServers,
732
+ tenantId,
733
+ uploadConfig,
734
+ state,
735
+ excludeServers = []
736
+ }) => {
737
+ const servers = resolveUploadReplicationServers({
738
+ currentServer,
739
+ syncServers,
740
+ tenantId,
741
+ uploadConfig,
742
+ state
743
+ });
744
+ const excluded = new Set(
745
+ excludeServers.filter((server) => typeof server === "string").map((server) => normalizeServerOrigin(server))
746
+ );
747
+ const remainingServers = servers.filter(
748
+ (server) => !excluded.has(normalizeServerOrigin(server))
749
+ );
750
+ if (remainingServers.length === 0) {
751
+ return [];
752
+ }
753
+ Promise.resolve().then(() => {
754
+ syncWithServers(
755
+ remainingServers,
756
+ noloUploadRequest,
757
+ `Upload sync failed for ${uploadConfig.customKey} on`,
758
+ uploadConfig,
759
+ state
760
+ );
761
+ });
762
+ return remainingServers;
763
+ };
764
+ var uploadToCurrentServer = async ({
765
+ currentServer,
766
+ uploadConfig,
767
+ state
768
+ }) => {
769
+ if (!currentServer) {
770
+ return false;
771
+ }
772
+ return noloUploadRequest(currentServer, uploadConfig, state);
773
+ };
774
+ var deleteFromReplicationServers = async ({
775
+ servers,
776
+ dbKey,
777
+ deleteOptions = { type: "single" },
778
+ state,
779
+ preferredServerOrigin
780
+ }) => {
781
+ if (!servers.length) {
782
+ return { succeeded: [], failed: [] };
783
+ }
784
+ const preferredServer = typeof preferredServerOrigin === "string" && preferredServerOrigin.trim().length > 0 ? normalizeServerOrigin(preferredServerOrigin) : null;
785
+ const remainingServers = preferredServer ? servers.filter((server) => normalizeServerOrigin(server) !== preferredServer) : servers;
786
+ const succeeded = [];
787
+ const failed = [];
788
+ if (preferredServer) {
789
+ const ok = await noloDeleteRequest(preferredServer, dbKey, deleteOptions, state);
790
+ if (ok) {
791
+ succeeded.push(preferredServer);
792
+ } else {
793
+ failed.push(preferredServer);
794
+ }
795
+ }
796
+ if (remainingServers.length > 0) {
797
+ const results = await Promise.all(
798
+ remainingServers.map(async (server) => ({
799
+ server,
800
+ ok: await noloDeleteRequest(server, dbKey, deleteOptions, state)
801
+ }))
802
+ );
803
+ results.forEach(({ server, ok }) => {
804
+ if (ok) succeeded.push(server);
805
+ else failed.push(server);
806
+ });
807
+ }
808
+ return { succeeded, failed };
809
+ };
810
+ var scheduleDeleteReplication = ({
811
+ currentServer,
812
+ syncServers,
813
+ preferredServerOrigin,
814
+ dbKey,
815
+ deleteOptions,
816
+ state,
817
+ onResult,
818
+ onError
819
+ }) => {
820
+ const servers = resolveAuthorityReplicationServers({
821
+ currentServer,
822
+ syncServers,
823
+ preferredServerOrigin,
824
+ dbKey,
825
+ state
826
+ });
827
+ if (servers.length === 0) {
828
+ return [];
829
+ }
830
+ void Promise.resolve().then(
831
+ () => deleteFromReplicationServers({
832
+ servers,
833
+ dbKey,
834
+ deleteOptions,
835
+ state,
836
+ preferredServerOrigin
837
+ })
838
+ ).then((result) => {
839
+ onResult?.(result);
840
+ }).catch((error) => {
841
+ onError?.(error);
842
+ });
843
+ return servers;
844
+ };
845
+
846
+ export {
847
+ selectRuntimeSnapshot,
848
+ selectRuntimeCurrentServer,
849
+ getRuntimeServerContext,
850
+ fnv1a32Hex,
851
+ parseOwnerUserIdFromDbKey,
852
+ DEVICE_LOCAL_OWNER_ID,
853
+ isDeviceLocalOwnerId,
854
+ resolveEffectiveSpaceActorId,
855
+ isDeviceLocalSpaceMembership,
856
+ isDeviceLocalSpaceBody,
857
+ resolveRecordOwnerUserId,
858
+ resolveRecordAuthority,
859
+ beginWriteAck,
860
+ partitionReadServers,
861
+ compareRemoteRecordsByComparableTime,
862
+ pickBestSettledRemoteRecord,
863
+ shouldReplaceLocalWithRemoteRecord,
864
+ shouldReplicateLocalRecord,
865
+ planAuthorityReadServers,
866
+ resolveReplicationServers,
867
+ resolveAuthorityReplicationServers,
868
+ scheduleWriteReplication,
869
+ resolveUploadReplicationServers,
870
+ scheduleExistingRecordReplication,
871
+ scheduleConfiguredPatchReplication,
872
+ scheduleUploadReplication,
873
+ uploadToCurrentServer,
874
+ scheduleDeleteReplication
875
+ };