nolo-cli 0.98.0-alpha.4 → 0.98.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 (205) hide show
  1. package/README.md +1 -1
  2. package/{_executeModel-HYZ4NXRJ.js → _executeModel-GJK4ZVU6.js} +74 -67
  3. package/action-PNPQLJHG.js +20 -0
  4. package/{addContentAction-O7R66HEX.js → addContentAction-RBOUD7SJ.js} +12 -11
  5. package/{addDialogAgentAction-74OA7KYP.js → addDialogAgentAction-IODCR6TB.js} +18 -19
  6. package/{agentDeleteCommand-2YAHAZFJ.js → agentDeleteCommand-GHRF6CH5.js} +47 -42
  7. package/{agentEmailCommands-SLEQANTK.js → agentEmailCommands-O5BTHYZK.js} +97 -87
  8. package/agentListCommands-3REEM63V.js +742 -0
  9. package/{agentMachineCommands-KBI77S35.js → agentMachineCommands-2GW3CV7Q.js} +48 -43
  10. package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-IRNZXVGE.js} +1 -1
  11. package/{agentPullCommand-O5MPVJ5E.js → agentPullCommand-B4T2DJ5H.js} +1 -1
  12. package/agentRecordCommands-WYQODWZE.js +138 -0
  13. package/agentRunCommand-KAN65WPY.js +167 -0
  14. package/{agentRunControl-AVJR4JW4.js → agentRunControl-3HWA2LLQ.js} +2 -2
  15. package/{agentRuntimeLocal-VXZSDIGT.js → agentRuntimeLocal-IOFBNVIL.js} +48 -39
  16. package/{agentSlice-ZOYISPZD.js → agentSlice-I45M32KO.js} +14 -13
  17. package/{appDeleteCommands-32MHLR4L.js → appDeleteCommands-SFS6IZEM.js} +46 -41
  18. package/{appDeployCommands-WCQOUSOB.js → appDeployCommands-YZQESVRQ.js} +46 -41
  19. package/{appDeployStatusCommands-6QKB7DYN.js → appDeployStatusCommands-FKUUDCKP.js} +46 -41
  20. package/{appGetCommands-SFAPP5PB.js → appGetCommands-QUE7OQZC.js} +46 -41
  21. package/{appListCommands-EKUBDRUO.js → appListCommands-QEETFKMH.js} +46 -41
  22. package/{authCommand-F4EFRRX6.js → authCommand-NHDLY3IB.js} +118 -24
  23. package/{authCommands-RGOGCPP6.js → authCommands-UDBJVSZU.js} +7 -5
  24. package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-MAR5LPAC.js} +10 -8
  25. package/{chromeCommands-FZYAU75D.js → chromeCommands-K27J4OVZ.js} +124 -28
  26. package/{chromeOpsCommands-62P2Q2YB.js → chromeOpsCommands-IXRLN57H.js} +4 -3
  27. package/{chunk-6OZ36FXI.js → chunk-27ONFIEY.js} +22 -4
  28. package/{chunk-JEDZAO7L.js → chunk-2SYTUTLI.js} +257 -37
  29. package/{chunk-53HEEOTT.js → chunk-2WJ57RJA.js} +83 -16
  30. package/{chunk-OIVSQH2O.js → chunk-3BXNTXYI.js} +299 -5
  31. package/{chunk-ABQYVJBJ.js → chunk-46Y5D2BZ.js} +5 -5
  32. package/{chunk-EYAQT56M.js → chunk-4DPP773Q.js} +2 -2
  33. package/{chunk-H62HCIUP.js → chunk-4FFUDT6D.js} +24 -21
  34. package/chunk-4LCOCOR5.js +50 -0
  35. package/{chunk-2GRGFCF6.js → chunk-4VJAC32I.js} +2 -1
  36. package/{chunk-IIVGDG4I.js → chunk-4YSOUKUR.js} +13 -7
  37. package/{chunk-MC4XLIJ7.js → chunk-523DITKR.js} +1 -1
  38. package/{chunk-G4EBXCWF.js → chunk-5AUJB66Z.js} +550 -515
  39. package/{chunk-E4MARS3Q.js → chunk-5GVBDNTO.js} +1 -1
  40. package/chunk-5J3PYNUP.js +255 -0
  41. package/chunk-5MMAK75Q.js +15 -0
  42. package/{chunk-JPGCXHNM.js → chunk-5OA5HMTL.js} +1 -1
  43. package/{chunk-42V6BK2E.js → chunk-62IL3KQV.js} +4 -34
  44. package/{chunk-3BMYXEUW.js → chunk-6O4IK4V2.js} +1 -1
  45. package/{chunk-34BLIAHQ.js → chunk-6XDD7N7P.js} +47 -67
  46. package/{chunk-GQBOR3G6.js → chunk-7KVZ5LDQ.js} +2 -2
  47. package/{chunk-DNCEALKX.js → chunk-7MMSLEPA.js} +22 -29
  48. package/chunk-A4SQRTZ6.js +15 -0
  49. package/{chunk-7S4YWN7P.js → chunk-ADBZWMFB.js} +4 -4
  50. package/chunk-AGIM7IMJ.js +147 -0
  51. package/{chunk-5UTFL4QJ.js → chunk-AOTBKDRK.js} +7 -0
  52. package/{chunk-Q554LLSI.js → chunk-AUDNYVRC.js} +1 -1
  53. package/{chunk-T37GTQYU.js → chunk-B2DEZY6J.js} +20 -11
  54. package/chunk-BMQ2MJUK.js +153 -0
  55. package/{chunk-6YTOJY35.js → chunk-BZ7NPA6G.js} +35 -2
  56. package/chunk-C4DVDM72.js +13536 -0
  57. package/chunk-CHOZJMJS.js +78 -0
  58. package/{chunk-ACTMNVHM.js → chunk-CYSYR67N.js} +1 -1
  59. package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
  60. package/chunk-DZ7R5V3Y.js +164 -0
  61. package/{chunk-3VNWWVKB.js → chunk-E3YWHWCR.js} +50 -18
  62. package/{chunk-V4MJDUSR.js → chunk-E73ON47R.js} +2 -2
  63. package/{chunk-XDJFSBVV.js → chunk-EIFYNGU4.js} +24 -5
  64. package/{chunk-KQ4ONNQD.js → chunk-EKPKW6RM.js} +155 -8
  65. package/{chunk-TRV2MIDW.js → chunk-EXAJ6DCR.js} +1 -0
  66. package/{chunk-HJUYAD4A.js → chunk-FJ5BGMNM.js} +5 -5
  67. package/{chunk-2F7RJC6L.js → chunk-FOXQ7BAB.js} +1 -1
  68. package/{chunk-6IG4XSS6.js → chunk-FY7DCYW7.js} +88 -17
  69. package/{chunk-J4MOO56S.js → chunk-GARACBQB.js} +10 -2
  70. package/{chunk-6VFARHZW.js → chunk-GDFA73QZ.js} +934 -1091
  71. package/chunk-GMZLP5DV.js +82 -0
  72. package/{chunk-FDTR4QJ6.js → chunk-H6A6X4EK.js} +32 -1
  73. package/{chunk-DVINR3PL.js → chunk-HDLLCBRF.js} +1 -1
  74. package/{chunk-QOKAKDPE.js → chunk-HIM3FCLF.js} +0 -1
  75. package/{chunk-ONXOABJR.js → chunk-HNGRBWYF.js} +3 -0
  76. package/{chunk-VLTIYV3X.js → chunk-HP57OUJO.js} +4 -4
  77. package/{chunk-YRPASJCG.js → chunk-I76SDF7A.js} +10 -10
  78. package/{chunk-2D66PZ54.js → chunk-I7BCBNWZ.js} +24 -77
  79. package/{chunk-GPCZ7UXG.js → chunk-K6U4NKFJ.js} +1 -1
  80. package/{chunk-4OEFYTWL.js → chunk-LDCAFLXD.js} +64 -48
  81. package/{chunk-OEVAY4J6.js → chunk-LNVJHIGA.js} +18 -20
  82. package/{chunk-LS2ZANRJ.js → chunk-LOCNXNOU.js} +1 -1
  83. package/{chunk-5H7KJX7J.js → chunk-LQ4PDQCI.js} +5 -5
  84. package/{chunk-PDIBG2WC.js → chunk-M33GWZIZ.js} +67 -45
  85. package/{chunk-PUOC4YRO.js → chunk-M7VLQGQP.js} +11 -0
  86. package/chunk-NHDMQZJM.js +7881 -0
  87. package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
  88. package/{chunk-L5UXH3B2.js → chunk-NNCYNBYV.js} +22 -6
  89. package/{chunk-FZGV4FGK.js → chunk-NUHHBEJC.js} +378 -187
  90. package/chunk-NWENLDMM.js +42 -0
  91. package/{chunk-AEOE4Z6Q.js → chunk-NZWAO6LH.js} +13 -15
  92. package/chunk-OCZKATRC.js +129 -0
  93. package/{chunk-PKUGW3X6.js → chunk-OU36O6OR.js} +23 -28
  94. package/chunk-OW4APERY.js +870 -0
  95. package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
  96. package/{chunk-ITM7D3UQ.js → chunk-P5L7VVMT.js} +11 -9
  97. package/{chunk-TOP2VXOR.js → chunk-PCF3QU5Q.js} +5 -5
  98. package/{chunk-WV42OMV7.js → chunk-PTDYOADJ.js} +8 -8
  99. package/{chunk-6D6VBVEW.js → chunk-SNMQMOD2.js} +80 -14
  100. package/{chunk-BYMV6QZG.js → chunk-TNIX77YM.js} +4 -0
  101. package/{chunk-Z77CRGTW.js → chunk-TVCAR26G.js} +1 -1
  102. package/chunk-TY3TIUJK.js +89 -0
  103. package/{chunk-I3TQJXQ7.js → chunk-U3C3IA32.js} +9 -2
  104. package/{chunk-RG6JBBX5.js → chunk-U7XXEI5R.js} +166 -13
  105. package/{chunk-UZGQNTVW.js → chunk-UA324D4O.js} +8 -6
  106. package/chunk-UJXNKP5V.js +760 -0
  107. package/{chunk-UKZDAFYT.js → chunk-UM4PH574.js} +6 -10
  108. package/{chunk-GEPUP7OO.js → chunk-UVKDJUTL.js} +3 -3
  109. package/{chunk-ZCYXJSTU.js → chunk-V5OWQOJZ.js} +19 -88
  110. package/{chunk-NA35QHCF.js → chunk-V7Y6KRAH.js} +1 -1
  111. package/{chunk-3DII57IT.js → chunk-VCAQFMVN.js} +1 -1
  112. package/{chunk-JRQFUXY7.js → chunk-VEYL5MO5.js} +99 -22
  113. package/chunk-VIWDGTDA.js +8 -0
  114. package/chunk-VJVNU77E.js +83 -0
  115. package/{chunk-UKWGR5SS.js → chunk-VY6VFGKR.js} +194 -1144
  116. package/{chunk-5ZYCLPXL.js → chunk-W3RFFFFF.js} +873 -227
  117. package/{chunk-BP4XNZRM.js → chunk-W72ISAKC.js} +4 -4
  118. package/{chunk-DHDMC6FO.js → chunk-WCGC6S77.js} +14 -9
  119. package/{chunk-QDSINZM3.js → chunk-WJ3B6FX6.js} +1 -14
  120. package/{chunk-V7BKTIF6.js → chunk-WXHAOL7Y.js} +19 -17
  121. package/{chunk-37NKTC3Q.js → chunk-X2B2C4XD.js} +1 -1
  122. package/{chunk-HVURBGF3.js → chunk-XFUBXRVI.js} +6 -6
  123. package/{chunk-O6OSWFZQ.js → chunk-XUWRURDF.js} +6 -0
  124. package/{chunk-Q67DOFOO.js → chunk-Y3PMXGLH.js} +2 -0
  125. package/{chunk-ETI2NYVF.js → chunk-YPOPJAKN.js} +4 -4
  126. package/{chunk-SH43IESU.js → chunk-YUNJN43V.js} +44 -9
  127. package/chunk-YV25TM3R.js +780 -0
  128. package/chunk-ZRAU6T47.js +56 -0
  129. package/commandRegistry-RZNZ37BN.js +833 -0
  130. package/{contentThunks-G55OKUFE.js → contentThunks-DF7ZNCAG.js} +36 -34
  131. package/{cooldownCommands-REAWYVTY.js → cooldownCommands-ZLEPIB4A.js} +2 -2
  132. package/{createAgentAutomationAction-D2J2O5GS.js → createAgentAutomationAction-KPMOZ53Y.js} +38 -36
  133. package/createDialogAction-I2UDVAXN.js +69 -0
  134. package/{createPageAction-FHZBN7DJ.js → createPageAction-IF5JXNKV.js} +45 -42
  135. package/{chunk-AJ3A3445.js → cursorProvider-YGGNMVWX.js} +2496 -9897
  136. package/{dbSlice-XVWBAGYN.js → dbSlice-Q25STFGJ.js} +11 -10
  137. package/{deleteFile-YG6QMJLU.js → deleteFile-AJ2EZMHT.js} +7 -6
  138. package/{dialogCommands-5J56DFWN.js → dialogCommands-LWHIIUQD.js} +49 -45
  139. package/{dialogSlice-D4V3HURH.js → dialogSlice-74DFPFRV.js} +40 -33
  140. package/{dist-VODFSGNG.js → dist-NJC2W7I4.js} +61 -54
  141. package/{docCreateCommands-KYI2DC2U.js → docCreateCommands-LVXQ6TNZ.js} +48 -43
  142. package/{docDeleteCommands-67REUSRY.js → docDeleteCommands-7TVIGCLP.js} +49 -44
  143. package/{docReadCommands-HOSVSBDJ.js → docReadCommands-KYAXFLQ5.js} +47 -42
  144. package/{docStore-5LROPEEP.js → docStore-2JDRAYXJ.js} +16 -12
  145. package/{docUpdateCommands-EMGCSMXY.js → docUpdateCommands-TVC5KWPK.js} +48 -43
  146. package/{fetchMessages-EIU7UFFK.js → fetchMessages-I5ICDDHM.js} +5 -5
  147. package/{getPricing-LUSEABA6.js → getPricing-NMMFT3YI.js} +4 -4
  148. package/{handleSendMessageAction-QBPDYSLZ.js → handleSendMessageAction-54GY3XOH.js} +110 -86
  149. package/index.js +87 -884
  150. package/{localDialogRead-BTFJ4V2I.js → localDialogRead-ZHZ3KXDM.js} +2 -2
  151. package/{localRuntimeAuthority-6IR6BBXE.js → localRuntimeAuthority-TU6OBC76.js} +9 -6
  152. package/{localRuntimeDb-SYQGUF4U.js → localRuntimeDb-VKWVOPPI.js} +1 -1
  153. package/{machineCommands-4ISPVTPN.js → machineCommands-54RNLVJE.js} +91 -81
  154. package/machineWsRunDispatch-WE3VTD57.js +154 -0
  155. package/{memberThunks-QGFLFVCI.js → memberThunks-R75S3RWP.js} +20 -18
  156. package/{models-T3SG6MJ5.js → models-ZPU5EDF4.js} +2 -2
  157. package/oauthTokenStore-ITEB663N.js +23 -0
  158. package/package.json +1 -1
  159. package/pdf-U6KSUEZZ.js +26435 -0
  160. package/processSpawn-SOAV3FEV.js +11 -0
  161. package/profileConfig-ZGOFORWV.js +43 -0
  162. package/{providerPresetApply-FG6NZ57W.js → providerPresetApply-TEBH7FDX.js} +7 -7
  163. package/{providerRegistry-757OWH3O.js → providerRegistry-CBJLNCET.js} +11 -7
  164. package/{read-COE3ZYR6.js → read-SRQMNO26.js} +7 -6
  165. package/{readDocTool-5USN4A6V.js → readDocTool-RC3JUNJ2.js} +5 -3
  166. package/{readlineWorkspace-JFADM567.js → readlineWorkspace-UK5M5CJI.js} +2704 -2060
  167. package/{removeDialogAgentAction-IX3MN2ZO.js → removeDialogAgentAction-46XQV5Q7.js} +21 -25
  168. package/{runAgentClientLoop-JFFIFP7N.js → runAgentClientLoop-MTI5OU2W.js} +75 -69
  169. package/{runtimeDoctorCommands-X6WDBEQX.js → runtimeDoctorCommands-PIVSBZRZ.js} +4 -4
  170. package/runtimeModeArgs-2Y7BALTO.js +31 -0
  171. package/{setDialogExtraReferencesAction-X4HCPNZL.js → setDialogExtraReferencesAction-J4V5ADQF.js} +15 -13
  172. package/{setPrimaryDialogAgentAction-4GMIQLOD.js → setPrimaryDialogAgentAction-UHHV2QZW.js} +22 -26
  173. package/{chunk-AFUORTY4.js → settingThunks-PPZZZOWN.js} +226 -940
  174. package/{skillDiscovery-CYUCJMAG.js → skillDiscovery-ZBU76COE.js} +3 -3
  175. package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
  176. package/{spaceCommands-NKJVJCQQ.js → spaceCommands-446WWA73.js} +51 -46
  177. package/{streamAgentChatTurn-HFVTDCFD.js → streamAgentChatTurn-IANOWAKR.js} +199 -104
  178. package/{switchDialogAgentAction-N52LRPA3.js → switchDialogAgentAction-A2TMVGAE.js} +18 -19
  179. package/{tableCommands-O6NWHFKV.js → tableCommands-6U4BMLRR.js} +10 -10
  180. package/{toolApiClient-QVJ6HDNN.js → toolApiClient-EJT6TMFG.js} +3 -3
  181. package/tools-WZZYTUNF.js +116 -0
  182. package/{tuiSummaryLlmCaller-WFRWERGK.js → tuiSummaryLlmCaller-Q65IBDGO.js} +24 -21
  183. package/{updateCommands-2M74UL7P.js → updateCommands-4EHDLF5J.js} +3 -3
  184. package/{updateDialogTitleAction-PER2C6MR.js → updateDialogTitleAction-Z2JTYLXD.js} +82 -44
  185. package/action-YVYQEAAV.js +0 -31
  186. package/agentListCommands-KMS675GZ.js +0 -406
  187. package/agentRecordCommands-IPPPUHG4.js +0 -128
  188. package/agentRunCommand-24XO4RDT.js +0 -155
  189. package/browser-image-compression-MFDTD7K6.js +0 -1763
  190. package/chatQueueReduxAdapter-PMAMSHG7.js +0 -186
  191. package/chunk-M76ECQRD.js +0 -13658
  192. package/chunk-MEYIRKDN.js +0 -8967
  193. package/chunk-OCSGDPAT.js +0 -18885
  194. package/chunk-Q5FJJ6XI.js +0 -103
  195. package/chunk-S7Z2HMCN.js +0 -25
  196. package/chunk-Y5GCAMGP.js +0 -9
  197. package/chunk-YPREESF4.js +0 -225
  198. package/createDialogAction-E2EVICIE.js +0 -65
  199. package/machineWsRunDispatch-L4MKXQAO.js +0 -144
  200. package/settingSlice-ZQZVUPKK.js +0 -204
  201. package/syncMapping-N6RGXGBW.js +0 -437
  202. package/tools-BBBCUOUZ.js +0 -110
  203. package/{chunk-VMFTFOWF.js → chunk-3AH7LNUB.js} +7 -7
  204. package/{chunk-X7HHHIOZ.js → chunk-Y6ROFCZO.js} +0 -0
  205. package/{db-WK5MDZVN.js → db-VQSAOWAO.js} +1 -1
@@ -1,18 +1,15 @@
1
1
  import {
2
2
  estimateTokenCount
3
3
  } from "./chunk-PSCNXBYA.js";
4
- import {
5
- compactWhitespace
6
- } from "./chunk-DWLEOOGR.js";
7
4
  import {
8
5
  addContentAction
9
- } from "./chunk-V4MJDUSR.js";
6
+ } from "./chunk-E73ON47R.js";
10
7
  import {
11
8
  upload
12
- } from "./chunk-H62HCIUP.js";
9
+ } from "./chunk-4FFUDT6D.js";
13
10
  import {
14
11
  getRuntimeServerContext
15
- } from "./chunk-UKWGR5SS.js";
12
+ } from "./chunk-UJXNKP5V.js";
16
13
  import {
17
14
  API_ENDPOINTS
18
15
  } from "./chunk-LCBAMY2M.js";
@@ -42,8 +39,7 @@ var serializeMessageContent = (content, imagePlaceholder = "[\u56FE\u7247]") =>
42
39
  return null;
43
40
  };
44
41
 
45
- // packages/app/utils/imageUtils.ts
46
- var BYTES_PER_MB = 1024 * 1024;
42
+ // packages/core/file/dataUrl.ts
47
43
  var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
48
44
  var parseDataUrl = (dataUrl) => {
49
45
  const trimmed = dataUrl.trim();
@@ -615,7 +611,7 @@ function planCompression(input) {
615
611
  }
616
612
 
617
613
  // packages/ai/context/compactionShared.ts
618
- var COMPACTION_SUMMARY_SCHEMA_VERSION = 1;
614
+ var COMPACTION_SUMMARY_SCHEMA_VERSION = 2;
619
615
  var COMPACTION_SUMMARY_SYSTEM_PROMPT = `\u4F60\u662F\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u538B\u7F29\u5668\u3002\u6839\u636E\u3010\u73B0\u6709\u8BB0\u5FC6\u3011\u548C\u3010\u65B0\u589E\u5BF9\u8BDD\u3011\uFF0C\u8F93\u51FA\u53EF\u66FF\u4EE3\u539F\u59CB\u6D88\u606F\u7684\u4E8B\u5B9E\u6027\u8981\u70B9\uFF0C\u4F9B\u540E\u7EED\u5BF9\u8BDD\u76F4\u63A5\u4F7F\u7528\u3002
620
616
 
621
617
  \u4E25\u683C\u53EA\u8F93\u51FA\u4E0B\u9762\u4E09\u90E8\u5206\uFF0C\u6807\u9898\u5FC5\u987B\u5B8C\u5168\u4E00\u81F4\uFF1A
@@ -628,10 +624,16 @@ var COMPACTION_SUMMARY_SYSTEM_PROMPT = `\u4F60\u662F\u5BF9\u8BDD\u4E0A\u4E0B\u65
628
624
 
629
625
  \u8981\u6C42\uFF1A
630
626
  1) \u4F7F\u7528\u5BF9\u8BDD\u4E3B\u8BED\u8A00\uFF1B\u6DF7\u5408\u8BED\u8A00\u65F6\u4F18\u5148\u7528\u6237\u4E3B\u8981\u8BED\u8A00\uFF1B\u4E13\u6709\u540D\u8BCD\u3001\u6587\u4EF6\u8DEF\u5F84\u3001\u6807\u8BC6\u7B26\u3001\u547D\u4EE4\u4FDD\u7559\u539F\u6587\uFF0C\u4E0D\u8981\u7FFB\u8BD1\u6216\u8F6C\u8FF0\u3002
631
- 2) \u5173\u952E\u4E8B\u5B9E\u6863\u6848\u53EA\u4FDD\u7559\u4E4B\u540E\u7EE7\u7EED\u5BF9\u8BDD\u4ECD\u6709\u4EF7\u503C\u7684\u4FE1\u606F\uFF1A\u7528\u6237\u76EE\u6807/\u504F\u597D\u3001\u7EA6\u675F\u3001\u6280\u672F\u6808\u3001\u786E\u5B9A\u7684\u6587\u4EF6\u8DEF\u5F84\u3001\u6838\u5FC3\u51B3\u7B56\u3001\u672A\u5B8C\u6210\u5F85\u529E\u3002\u4FDD\u7559\u786E\u5207\u503C\uFF08\u7AEF\u53E3\u53F7\u3001\u7248\u672C\u53F7\u3001\u8DEF\u5F84\u3001\u53D8\u91CF\u540D\u3001\u9519\u8BEF\u4FE1\u606F\u539F\u6587\uFF09\uFF0C\u4E0D\u8981\u6982\u62EC\u6210"\u67D0\u4E2A\u7AEF\u53E3"\u6216"\u67D0\u4E2A\u6587\u4EF6"\u6216"\u67D0\u62A5\u9519"\u3002
627
+ 2) \u5173\u952E\u4E8B\u5B9E\u6863\u6848\u7684**\u524D\u4E24\u9879\u56FA\u5B9A\u662F**\uFF1A
628
+ - \u300C\u539F\u59CB\u76EE\u6807\u300D\uFF1A\u7528\u6237\u6700\u521D\u4E3A\u4EC0\u4E48\u5F00\u8FD9\u6BB5\u5BF9\u8BDD\uFF08\u5C3D\u91CF\u4FDD\u7559\u4ED6\u7684\u539F\u8BDD\u4E0E\u7528\u8BCD\uFF0C\u4E0D\u8981\u6539\u5199\u6210\u4EFB\u52A1\u6E05\u5355\uFF09\u3002
629
+ \u589E\u91CF\u66F4\u65B0\u65F6\u6CBF\u7528\u3010\u73B0\u6709\u8BB0\u5FC6\u3011\u91CC\u5DF2\u6709\u7684\u300C\u539F\u59CB\u76EE\u6807\u300D\uFF0C\u4E0D\u8981\u88AB\u65B0\u589E\u5BF9\u8BDD\u6539\u5199\u2014\u2014\u5B83\u662F\u7A33\u5B9A\u5B57\u6BB5\uFF1B
630
+ \u4EC5\u5F53\u65B0\u5BF9\u8BDD\u660E\u786E\u8868\u660E\u539F\u6587\u6709\u4E8B\u5B9E\u6027\u9519\u8BEF\u65F6\u624D\u4FEE\u6B63\uFF0C\u5E76\u5728\u300C\u76EE\u6807\u6F14\u5316\u300D\u91CC\u6CE8\u660E\u3002
631
+ - \u300C\u76EE\u6807\u6F14\u5316\u300D\uFF1A\u82E5\u4E2D\u9014\u8F6C\u5411\uFF0C\u5199\u6E05\u8F6C\u5411\u4E86\u4EC0\u4E48\u3001\u56E0\u4E3A\u4EC0\u4E48\uFF1B\u6CA1\u6709\u8F6C\u5411\u5C31\u5199\u300C\u65E0\u8F6C\u5411\u300D\u6216\u7701\u7565\u8FD9\u4E00\u9879\uFF0C\u4E0D\u8981\u786C\u51D1\u3002
632
+ \u88AB\u540E\u7EED\u5DE5\u4F5C\u53D6\u4EE3\u7684\u662F"\u65B9\u6848"\uFF0C\u4E0D\u662F"\u7528\u6237\u7684\u521D\u59CB\u610F\u56FE"\u2014\u2014\u521D\u59CB\u610F\u56FE\u4E0D\u5F97\u7701\u7565\u3002
633
+ \u5176\u540E\u624D\u662F\uFF1A\u7528\u6237\u504F\u597D\u3001\u7EA6\u675F\u3001\u6280\u672F\u6808\u3001\u786E\u5B9A\u7684\u6587\u4EF6\u8DEF\u5F84\u3001\u6838\u5FC3\u51B3\u7B56\u3001\u672A\u5B8C\u6210\u5F85\u529E\u3002\u4FDD\u7559\u786E\u5207\u503C\uFF08\u7AEF\u53E3\u53F7\u3001\u7248\u672C\u53F7\u3001\u8DEF\u5F84\u3001\u53D8\u91CF\u540D\u3001\u9519\u8BEF\u4FE1\u606F\u539F\u6587\uFF09\uFF0C\u4E0D\u8981\u6982\u62EC\u6210"\u67D0\u4E2A\u7AEF\u53E3"\u6216"\u67D0\u4E2A\u6587\u4EF6"\u6216"\u67D0\u62A5\u9519"\u3002
632
634
  3) \u5BF9\u8BDD\u8FDB\u5C55\u4E0E\u5F85\u529E\u4EE5\u7B2C\u4E00\u4EBA\u79F0\u7EED\u4F5C\u7B14\u8BB0\u7684\u53E3\u543B\u5199\uFF08"\u6211\u505A\u4E86\u2026""\u7528\u6237\u8981\u6C42\u2026""\u4E0B\u4E00\u6B65\u6211\u9700\u8981\u2026"\uFF09\uFF0C\u4E0D\u8981\u5199\u6210\u7B2C\u4E09\u65B9\u89C2\u5BDF\u62A5\u544A\u3002\u5148\u6781\u7B80\u6982\u62EC\u65E7\u4E0A\u4E0B\u6587\uFF0C\u518D\u66F4\u8BE6\u7EC6\u8BB0\u5F55\u6700\u8FD1\u8FDB\u5C55\u3001\u7ED3\u8BBA\u3001\u5206\u6B67\u4E0E\u4E0B\u4E00\u6B65\u3002\u5BF9\u4E8E\u58F0\u79F0\u5DF2\u5B8C\u6210\u4F46\u5C1A\u672A\u9A8C\u8BC1\u7684\u5DE5\u4F5C\uFF08\u5982\u5DE5\u5177\u8C03\u7528\u8FD4\u56DE\u6210\u529F\u4F46\u7ED3\u679C\u672A\u4EBA\u5DE5\u786E\u8BA4\uFF09\uFF0C\u660E\u786E\u6807\u6CE8"\uFF08\u5F85\u9A8C\u8BC1\uFF09"\u2014\u2014\u4E0D\u8981\u9ED8\u8BA4\u4FE1\u4EFB\u5DE5\u5177\u8FD4\u56DE\u503C\u3002
633
635
  4) \u6587\u4EF6\u64CD\u4F5C\u6E05\u5355\uFF1A\u5217\u51FA\u672C\u6B21\u538B\u7F29\u8303\u56F4\u5185\u8BFB\u53D6\u3001\u5199\u5165\u3001\u7F16\u8F91\u8FC7\u7684\u6587\u4EF6\u8DEF\u5F84\u53CA\u64CD\u4F5C\u7C7B\u578B\uFF08\u5982: - \u8BFB\u53D6: path/to/file\uFF1B\u82E5\u672A\u6D89\u53CA\u6587\u4EF6\u64CD\u4F5C\u5199"\u65E0"\uFF09\u3002
634
- 5) \u5FFD\u7565\u5BD2\u6684\u3001\u91CD\u590D\u5C1D\u8BD5\u3001\u5DF2\u653E\u5F03\u65B9\u6848\u548C\u65E0\u4EF7\u503C\u5E9F\u8BDD\u3002
636
+ 5) \u5FFD\u7565\u5BD2\u6684\u3001\u91CD\u590D\u5C1D\u8BD5\u548C\u65E0\u4EF7\u503C\u5E9F\u8BDD\uFF1B**\u5DF2\u653E\u5F03\u7684\u65B9\u6848/\u5C1D\u8BD5**\u53EF\u4EE5\u7701\u7565\uFF0C\u4F46\u7528\u6237\u5F53\u521D\u7684\u610F\u56FE\u4E0E\u7406\u7531\u4E0D\u53EF\u7701\u7565\uFF08\u89C1\u7B2C 2 \u6761\uFF09\u3002
635
637
  6) \u4E0D\u8981\u7F16\u9020\u672A\u51FA\u73B0\u7684\u4FE1\u606F\uFF1B\u4E0D\u8981\u5F00\u573A\u767D\u3001\u7ED3\u675F\u8BED\u3001markdown \u4EE3\u7801\u5757\u6216\u989D\u5916\u7AE0\u8282\uFF1B\u4E0D\u8981\u8C03\u7528\u4EFB\u4F55\u5DE5\u5177\u3002`;
636
638
  function formatMessageContentFallback(msg) {
637
639
  const content = serializeMessageContent(msg.content);
@@ -767,14 +769,6 @@ function formatCompactionMetricsLog(metrics) {
767
769
  return `[Compaction] reason=${metrics.reason} compressed=${metrics.compressedCount}->${metrics.retainedCount} msgs, tokens=${totalBefore}->${totalAfter} (ratio=${ratio})${llmInfo}`;
768
770
  }
769
771
 
770
- // packages/core/clipCompactText.ts
771
- function clipCompactText(value, max, ellipsis = "...") {
772
- const compact = compactWhitespace(value);
773
- if (compact.length <= max) return compact;
774
- if (max <= ellipsis.length) return compact.slice(0, max);
775
- return `${compact.slice(0, max - ellipsis.length)}${ellipsis}`;
776
- }
777
-
778
772
  // packages/ai/token/providerCallTiming.ts
779
773
  var defaultNow = () => {
780
774
  const perf = globalThis.performance;
@@ -846,7 +840,14 @@ var isMeaningfulResponsesOutput = (event) => {
846
840
  };
847
841
 
848
842
  export {
849
- clipCompactText,
843
+ normalizeTimingMs,
844
+ createProviderCallTimingTracker,
845
+ observeMeaningfulProviderResponseAt,
846
+ observeMeaningfulProviderResponse,
847
+ finalizeProviderCallTiming,
848
+ withProviderCallTimingFields,
849
+ isMeaningfulChatCompletionOutput,
850
+ isMeaningfulResponsesOutput,
850
851
  planContextUsage,
851
852
  buildDatabaseFileContentUrl,
852
853
  serializeMessageContent,
@@ -860,13 +861,5 @@ export {
860
861
  formatFileOperationsFromMessages,
861
862
  formatMessagesForSummaryWithTruncation,
862
863
  buildCompactionMetricsFromPlan,
863
- formatCompactionMetricsLog,
864
- normalizeTimingMs,
865
- createProviderCallTimingTracker,
866
- observeMeaningfulProviderResponseAt,
867
- observeMeaningfulProviderResponse,
868
- finalizeProviderCallTiming,
869
- withProviderCallTimingFields,
870
- isMeaningfulChatCompletionOutput,
871
- isMeaningfulResponsesOutput
864
+ formatCompactionMetricsLog
872
865
  };
@@ -0,0 +1,15 @@
1
+ import {
2
+ BUILTIN_NOLO_AGENT_KEY
3
+ } from "./chunk-BNGW5ASC.js";
4
+
5
+ // packages/core/init.ts
6
+ var nolotusId = "0e95801d90";
7
+ var ADMIN_IDS = /* @__PURE__ */ new Set([nolotusId]);
8
+ var isSystemAdmin = (userId) => userId != null && ADMIN_IDS.has(userId);
9
+ var noloAgentId = BUILTIN_NOLO_AGENT_KEY;
10
+
11
+ export {
12
+ nolotusId,
13
+ isSystemAdmin,
14
+ noloAgentId
15
+ };
@@ -1,12 +1,12 @@
1
- import {
2
- dialogMessageRange
3
- } from "./chunk-VMFTFOWF.js";
4
1
  import {
5
2
  isTombstoneRecord
6
- } from "./chunk-GBRG75BQ.js";
3
+ } from "./chunk-D2MDMY2M.js";
7
4
  import {
8
5
  isRecord
9
6
  } from "./chunk-KUG52IAP.js";
7
+ import {
8
+ dialogMessageRange
9
+ } from "./chunk-3AH7LNUB.js";
10
10
 
11
11
  // packages/chat/messages/fetchMessages.ts
12
12
  function isUnboundedMessageLimit(limit) {
@@ -0,0 +1,147 @@
1
+ // packages/create/editor/utils/slateUtils.ts
2
+ var slateNodeToString = (node) => {
3
+ if (typeof node?.text === "string") return node.text;
4
+ const children = Array.isArray(node?.children) ? node.children : [];
5
+ return children.map(slateNodeToString).join("");
6
+ };
7
+ var createEmptyParagraph = () => ({
8
+ type: "paragraph",
9
+ children: [{ text: "" }]
10
+ });
11
+ var ensureEditorContent = (slateData) => Array.isArray(slateData) && slateData.length > 0 ? slateData : [createEmptyParagraph()];
12
+ var deepEqual = (a, b) => {
13
+ if (a === b) return true;
14
+ if (a == null || b == null) return false;
15
+ if (typeof a !== "object" || typeof b !== "object") return false;
16
+ const isArrayA = Array.isArray(a);
17
+ const isArrayB = Array.isArray(b);
18
+ if (isArrayA || isArrayB) {
19
+ if (!isArrayA || !isArrayB) return false;
20
+ if (a.length !== b.length) return false;
21
+ for (let i = 0; i < a.length; i++) {
22
+ if (!deepEqual(a[i], b[i])) return false;
23
+ }
24
+ return true;
25
+ }
26
+ const keysA = Object.keys(a);
27
+ const keysB = Object.keys(b);
28
+ if (keysA.length !== keysB.length) return false;
29
+ for (const key of keysA) {
30
+ if (!Object.prototype.hasOwnProperty.call(b, key)) return false;
31
+ if (!deepEqual(a[key], b[key])) return false;
32
+ }
33
+ return true;
34
+ };
35
+ var compareSlateContent = (newContent, oldContent) => {
36
+ if (newContent === oldContent) return false;
37
+ if (!newContent || !oldContent) return true;
38
+ if (newContent.length !== oldContent.length) return true;
39
+ return !deepEqual(newContent, oldContent);
40
+ };
41
+ var extractTitleFromSlate = (slateData) => {
42
+ if (!Array.isArray(slateData) || slateData.length === 0) return "\u65B0\u9875\u9762";
43
+ const titleNode = slateData.find((node) => node.type === "heading-one");
44
+ if (titleNode) {
45
+ const text = slateNodeToString(titleNode).trim();
46
+ if (text) {
47
+ return text;
48
+ }
49
+ }
50
+ for (const node of slateData) {
51
+ const text = slateNodeToString(node).trim();
52
+ if (text) {
53
+ return text.length > 30 ? `${text.substring(0, 30)}...` : text;
54
+ }
55
+ }
56
+ return "\u65B0\u9875\u9762";
57
+ };
58
+ var splitSlateTitleAndBody = (slateData, explicitTitle) => {
59
+ const content = ensureEditorContent(slateData);
60
+ const firstNode = content[0];
61
+ const hasExplicitTitle = explicitTitle !== void 0 && explicitTitle !== null;
62
+ const normalizedExplicitTitle = hasExplicitTitle ? explicitTitle.trim() : null;
63
+ const firstNonEmptyText = content.map((node) => slateNodeToString(node).trim()).find(Boolean);
64
+ if (firstNode?.type === "heading-one") {
65
+ const firstText = slateNodeToString(firstNode).trim();
66
+ const shouldTreatAsTitle = !!firstText && (normalizedExplicitTitle == null || normalizedExplicitTitle === firstText);
67
+ if (shouldTreatAsTitle) {
68
+ const body = content.slice(1);
69
+ return {
70
+ title: firstText,
71
+ body: ensureEditorContent(body)
72
+ };
73
+ }
74
+ }
75
+ return {
76
+ title: normalizedExplicitTitle ?? (firstNonEmptyText || ""),
77
+ body: content
78
+ };
79
+ };
80
+ var extractMentionsFromSlate = (slateData) => {
81
+ const tools = /* @__PURE__ */ new Set();
82
+ const traverse = (nodes) => {
83
+ for (const node of nodes) {
84
+ if (node.type === "mention" && node.resourceId) {
85
+ if (node.resourceType === "tool") {
86
+ tools.add(node.resourceId);
87
+ }
88
+ }
89
+ if (node.children && Array.isArray(node.children)) {
90
+ traverse(node.children);
91
+ }
92
+ }
93
+ };
94
+ if (Array.isArray(slateData)) {
95
+ traverse(slateData);
96
+ }
97
+ return Array.from(tools);
98
+ };
99
+ var extractCategorizedMentions = (slateData) => {
100
+ const result = {
101
+ tools: [],
102
+ pages: [],
103
+ agents: [],
104
+ spaces: []
105
+ };
106
+ const traverse = (nodes) => {
107
+ for (const node of nodes) {
108
+ if (node.type === "mention" && node.resourceId && node.resourceType) {
109
+ switch (node.resourceType) {
110
+ case "tool":
111
+ result.tools.push(node.resourceId);
112
+ break;
113
+ case "page":
114
+ result.pages.push(node.resourceId);
115
+ break;
116
+ case "agent":
117
+ result.agents.push(node.resourceId);
118
+ break;
119
+ case "space":
120
+ result.spaces.push(node.resourceId);
121
+ break;
122
+ }
123
+ }
124
+ if (node.children && Array.isArray(node.children)) {
125
+ traverse(node.children);
126
+ }
127
+ }
128
+ };
129
+ if (Array.isArray(slateData)) {
130
+ traverse(slateData);
131
+ }
132
+ result.tools = [...new Set(result.tools)];
133
+ result.pages = [...new Set(result.pages)];
134
+ result.agents = [...new Set(result.agents)];
135
+ result.spaces = [...new Set(result.spaces)];
136
+ return result;
137
+ };
138
+
139
+ export {
140
+ createEmptyParagraph,
141
+ ensureEditorContent,
142
+ compareSlateContent,
143
+ extractTitleFromSlate,
144
+ splitSlateTitleAndBody,
145
+ extractMentionsFromSlate,
146
+ extractCategorizedMentions
147
+ };
@@ -11,6 +11,12 @@ import {
11
11
  isLoopbackHostname
12
12
  } from "./chunk-4SN6J65J.js";
13
13
 
14
+ // packages/core/positiveFiniteNumberOrFallback.ts
15
+ function parsePositiveFiniteNumberOrFallback(value, fallback) {
16
+ const parsed = Number(value);
17
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
18
+ }
19
+
14
20
  // packages/core/fetchWithTransientRetry.ts
15
21
  var TRANSIENT_FETCH_MAX_ATTEMPTS = 3;
16
22
  var TRANSIENT_FETCH_RETRY_BASE_DELAY_MS = 250;
@@ -120,6 +126,7 @@ async function fetchWithTransientRetry(fetchImpl, input, init, options = {}) {
120
126
  }
121
127
 
122
128
  export {
129
+ parsePositiveFiniteNumberOrFallback,
123
130
  isTransientFetchError,
124
131
  fetchWithTransientRetry
125
132
  };
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-KHCLMKZZ.js";
5
5
  import {
6
6
  asTrimmedNonEmptyStringArray
7
- } from "./chunk-VMFTFOWF.js";
7
+ } from "./chunk-3AH7LNUB.js";
8
8
  import {
9
9
  asOptionalTrimmedString
10
10
  } from "./chunk-G3SUCT4W.js";
@@ -1,16 +1,16 @@
1
1
  import {
2
- require_date_fns
3
- } from "./chunk-M76ECQRD.js";
2
+ formatISO
3
+ } from "./chunk-ZRAU6T47.js";
4
4
  import {
5
5
  require_react
6
6
  } from "./chunk-YDH3FDFQ.js";
7
- import {
8
- toErrorMessage
9
- } from "./chunk-HNMXYYJR.js";
10
7
  import {
11
8
  patch,
12
9
  readAndWait
13
- } from "./chunk-H62HCIUP.js";
10
+ } from "./chunk-4FFUDT6D.js";
11
+ import {
12
+ toErrorMessage
13
+ } from "./chunk-HNMXYYJR.js";
14
14
  import {
15
15
  asOptionalTrimmedString
16
16
  } from "./chunk-G3SUCT4W.js";
@@ -20,7 +20,6 @@ import {
20
20
 
21
21
  // packages/render/page/docStore.ts
22
22
  var import_react = __toESM(require_react(), 1);
23
- var import_date_fns = __toESM(require_date_fns(), 1);
24
23
  var createInitialState = () => ({
25
24
  content: null,
26
25
  slateData: null,
@@ -52,6 +51,7 @@ var createInitialState = () => ({
52
51
  var listeners = /* @__PURE__ */ new Set();
53
52
  var version = 0;
54
53
  var state = createInitialState();
54
+ var latestInitRequestKey = null;
55
55
  var notify = () => {
56
56
  for (const listener of listeners) {
57
57
  try {
@@ -102,6 +102,9 @@ function getDocField(selector) {
102
102
  function getDocPageKey() {
103
103
  return state.pageKey;
104
104
  }
105
+ function isDocStateForPage(state2, pageKey) {
106
+ return Boolean(pageKey) && state2.pageKey === pageKey;
107
+ }
105
108
  function getDocIsInitialized() {
106
109
  return state.isInitialized;
107
110
  }
@@ -143,6 +146,7 @@ function updateDocTags(tags) {
143
146
  setState((prev) => ({ ...prev, tags }));
144
147
  }
145
148
  function resetDocState() {
149
+ latestInitRequestKey = null;
146
150
  setState(createInitialState());
147
151
  }
148
152
  function previewDocState(payload) {
@@ -190,6 +194,7 @@ function applyExternalDocUpdate(payload) {
190
194
  }
191
195
  async function initDocState(args, { dispatch }) {
192
196
  const { pageKey, isReadOnly } = args;
197
+ latestInitRequestKey = pageKey;
193
198
  setState((prev) => ({
194
199
  ...createInitialState(),
195
200
  isLoading: true,
@@ -198,6 +203,7 @@ async function initDocState(args, { dispatch }) {
198
203
  }));
199
204
  try {
200
205
  const readAction = await dispatch(readAndWait(pageKey));
206
+ if (latestInitRequestKey !== pageKey) return;
201
207
  if (readAndWait.fulfilled.match(readAction) && readAction.payload) {
202
208
  const data = readAction.payload;
203
209
  if (data.type !== "page" /* DOC */) {
@@ -247,6 +253,7 @@ async function initDocState(args, { dispatch }) {
247
253
  }));
248
254
  }
249
255
  } catch (e) {
256
+ if (latestInitRequestKey !== pageKey) return;
250
257
  setState((prev) => ({
251
258
  ...prev,
252
259
  isLoading: false,
@@ -300,7 +307,7 @@ async function saveDocState(arg, { dispatch, getState }) {
300
307
  { slateToRenderMarkdown },
301
308
  { buildSkillSummaryMarker }
302
309
  ] = await Promise.all([
303
- import("./slateUtils-RIZES3PV.js"),
310
+ import("./slateUtils-NGV2NMKM.js"),
304
311
  import("./slateToRenderMarkdown-Y5IYN73U.js"),
305
312
  import("./skillSummaryMarker-42HKSXYY.js")
306
313
  ]);
@@ -309,7 +316,7 @@ async function saveDocState(arg, { dispatch, getState }) {
309
316
  const skillSummary = buildSkillSummaryMarker(meta);
310
317
  const content = slateToRenderMarkdown(slateData);
311
318
  const now = /* @__PURE__ */ new Date();
312
- const updatedAt = (0, import_date_fns.formatISO)(now);
319
+ const updatedAt = formatISO(now);
313
320
  await dispatch(
314
321
  patch({
315
322
  dbKey: pageKey,
@@ -326,7 +333,7 @@ async function saveDocState(arg, { dispatch, getState }) {
326
333
  ).unwrap();
327
334
  if (dbSpaceId) {
328
335
  try {
329
- const { updateContentTitle } = await import("./contentThunks-G55OKUFE.js");
336
+ const { updateContentTitle } = await import("./contentThunks-DF7ZNCAG.js");
330
337
  await dispatch(
331
338
  updateContentTitle({
332
339
  spaceId: dbSpaceId,
@@ -365,7 +372,7 @@ async function saveDocState(arg, { dispatch, getState }) {
365
372
  }
366
373
  }
367
374
  async function createDocState(args, thunkApi) {
368
- const { createPageAction } = await import("./createPageAction-FHZBN7DJ.js");
375
+ const { createPageAction } = await import("./createPageAction-IF5JXNKV.js");
369
376
  return createPageAction(args, thunkApi);
370
377
  }
371
378
  function subscribe(listener) {
@@ -387,6 +394,7 @@ function useDocField(selector) {
387
394
  }
388
395
  function resetDocStoreForTests() {
389
396
  state = createInitialState();
397
+ latestInitRequestKey = null;
390
398
  bump();
391
399
  }
392
400
 
@@ -394,6 +402,7 @@ export {
394
402
  getDocState,
395
403
  getDocField,
396
404
  getDocPageKey,
405
+ isDocStateForPage,
397
406
  getDocIsInitialized,
398
407
  getDocIsReadOnly,
399
408
  getDocHasPendingChanges,
@@ -0,0 +1,153 @@
1
+ import {
2
+ isRecord
3
+ } from "./chunk-KUG52IAP.js";
4
+
5
+ // packages/core/chat/validationUrl.ts
6
+ function safeUrl(raw) {
7
+ if (typeof raw !== "string") return void 0;
8
+ const trimmed = raw.trim();
9
+ if (!/^https?:\/\//i.test(trimmed)) return void 0;
10
+ try {
11
+ const parsed = new URL(trimmed);
12
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
13
+ return void 0;
14
+ }
15
+ return parsed.href;
16
+ } catch {
17
+ return void 0;
18
+ }
19
+ }
20
+ function scanValidationDetails(details) {
21
+ if (!Array.isArray(details)) return {};
22
+ let url;
23
+ let text;
24
+ let learnMoreUrl;
25
+ for (const detail of details) {
26
+ if (url && learnMoreUrl) break;
27
+ if (!isRecord(detail)) continue;
28
+ const metadata = isRecord(detail.metadata) ? detail.metadata : void 0;
29
+ if (metadata) {
30
+ url = url ?? safeUrl(metadata.validation_url);
31
+ text = text ?? (typeof metadata.validation_url_link_text === "string" ? metadata.validation_url_link_text : void 0);
32
+ learnMoreUrl = learnMoreUrl ?? safeUrl(metadata.validation_learn_more_url);
33
+ }
34
+ const links = Array.isArray(detail.links) ? detail.links : [];
35
+ for (const link of links) {
36
+ if (!isRecord(link)) continue;
37
+ const linkUrl = safeUrl(link.url);
38
+ if (!linkUrl) continue;
39
+ const desc = typeof link.description === "string" ? link.description : "";
40
+ if (!url && /verify|continue/i.test(desc)) {
41
+ url = linkUrl;
42
+ text = text ?? desc;
43
+ } else if (!learnMoreUrl && /learn more/i.test(desc)) {
44
+ learnMoreUrl = linkUrl;
45
+ }
46
+ }
47
+ }
48
+ return { url, text, learnMoreUrl };
49
+ }
50
+ function unescapeJsonString(text) {
51
+ return text.replace(
52
+ /\\(["\\/nrtbf]|u[0-9a-fA-F]{4})/g,
53
+ (_match, esc) => {
54
+ switch (esc[0]) {
55
+ case "n":
56
+ return "\n";
57
+ case "r":
58
+ return "\r";
59
+ case "t":
60
+ return " ";
61
+ case "b":
62
+ return "\b";
63
+ case "f":
64
+ return "\f";
65
+ case "u":
66
+ return String.fromCharCode(parseInt(esc.slice(1), 16));
67
+ default:
68
+ return esc;
69
+ }
70
+ }
71
+ );
72
+ }
73
+ function sliceBalancedJsonObject(text) {
74
+ const start = text.indexOf("{");
75
+ if (start < 0) return void 0;
76
+ let depth = 0;
77
+ let inString = false;
78
+ let escaped = false;
79
+ for (let i = start; i < text.length; i += 1) {
80
+ const ch = text[i];
81
+ if (inString) {
82
+ if (escaped) escaped = false;
83
+ else if (ch === "\\") escaped = true;
84
+ else if (ch === '"') inString = false;
85
+ continue;
86
+ }
87
+ if (ch === '"') inString = true;
88
+ else if (ch === "{") depth += 1;
89
+ else if (ch === "}") {
90
+ depth -= 1;
91
+ if (depth === 0) return text.slice(start, i + 1);
92
+ }
93
+ }
94
+ return void 0;
95
+ }
96
+ function parseBalancedJson(text) {
97
+ const slice = sliceBalancedJsonObject(text);
98
+ if (!slice) return void 0;
99
+ try {
100
+ return JSON.parse(slice);
101
+ } catch {
102
+ return void 0;
103
+ }
104
+ }
105
+ function findValidationInParsed(parsed, depth = 0) {
106
+ if (depth > 3 || !isRecord(parsed)) return {};
107
+ const err = isRecord(parsed.error) ? parsed.error : parsed;
108
+ const fromDetails = scanValidationDetails(isRecord(err) ? err.details : void 0);
109
+ if (fromDetails.url) return fromDetails;
110
+ const nested = isRecord(err) ? err.message : void 0;
111
+ if (typeof nested === "string" && nested.trim().startsWith("{")) {
112
+ try {
113
+ const reparsed = findValidationInParsed(JSON.parse(nested), depth + 1);
114
+ if (reparsed.url) return reparsed;
115
+ } catch {
116
+ }
117
+ }
118
+ return {};
119
+ }
120
+ function stripTerminalControlChars(raw) {
121
+ return raw.replace(/[\u0000-\u001f\u007f]/g, "");
122
+ }
123
+ function regexValidationFallback(text) {
124
+ const urlMatch = text.match(
125
+ /validation_url[^h]{0,10}(https?:\/\/[^\s"\\]+)/i
126
+ );
127
+ if (!urlMatch) return {};
128
+ const textMatch = text.match(
129
+ /validation_url_link_text[^A-Za-z]{0,10}([^"\\\n]{1,60})/i
130
+ );
131
+ return {
132
+ // safeUrl first (normalizes C0 into %XX); fall back to stripping controls
133
+ // so a truncated-but-real link is still emitted rather than dropped.
134
+ url: safeUrl(urlMatch[1]) ?? stripTerminalControlChars(urlMatch[1]),
135
+ text: textMatch?.[1] ? stripTerminalControlChars(textMatch[1].trim()) || void 0 : void 0
136
+ };
137
+ }
138
+ function extractGoogleValidationLink(errorText) {
139
+ for (const candidate of [
140
+ parseBalancedJson(errorText),
141
+ parseBalancedJson(unescapeJsonString(errorText))
142
+ ]) {
143
+ if (candidate === void 0) continue;
144
+ const found = findValidationInParsed(candidate);
145
+ if (found.url) return found;
146
+ }
147
+ return regexValidationFallback(errorText);
148
+ }
149
+
150
+ export {
151
+ scanValidationDetails,
152
+ extractGoogleValidationLink
153
+ };
@@ -21,6 +21,8 @@ var createEmptyDialogRuntimeState = () => ({
21
21
  activeControllers: {},
22
22
  pendingRawData: {},
23
23
  loopStopReason: null,
24
+ turnPhase: null,
25
+ turnPhaseTurnId: null,
24
26
  pendingUserInputQueue: []
25
27
  });
26
28
  var activeDialogKey = null;
@@ -67,6 +69,8 @@ function resetDialogRuntimeSessionState(dialogKey) {
67
69
  const runtime = ensureDialogRuntimeState(dialogKey);
68
70
  runtime.tokens = createEmptyTokenStats();
69
71
  runtime.loopStopReason = null;
72
+ runtime.turnPhase = null;
73
+ runtime.turnPhaseTurnId = null;
70
74
  runtime.pendingUserInputQueue = [];
71
75
  notify();
72
76
  }
@@ -114,6 +118,26 @@ function setLoopStopReason(payload) {
114
118
  notify();
115
119
  return action("dialogRuntime/setLoopStopReason", payload);
116
120
  }
121
+ function claimDialogTurnPhase(payload) {
122
+ const runtime = ensureDialogRuntimeState(payload.dialogKey);
123
+ runtime.turnPhaseTurnId = payload.turnId;
124
+ runtime.turnPhase = null;
125
+ notify();
126
+ return action("dialogRuntime/claimDialogTurnPhase", payload);
127
+ }
128
+ function setDialogTurnPhase(payload) {
129
+ const runtime = ensureDialogRuntimeState(payload.dialogKey);
130
+ if (typeof payload.turnId === "string" && runtime.turnPhaseTurnId !== null && runtime.turnPhaseTurnId !== payload.turnId) {
131
+ return action("dialogRuntime/setDialogTurnPhase:rejected", payload);
132
+ }
133
+ runtime.turnPhase = payload.phase;
134
+ runtime.turnPhaseTurnId = payload.phase === null ? null : payload.turnId ?? null;
135
+ notify();
136
+ return action("dialogRuntime/setDialogTurnPhase", payload);
137
+ }
138
+ function clearDialogTurnPhase(payload = {}) {
139
+ return setDialogTurnPhase({ phase: null, dialogKey: payload.dialogKey, turnId: payload.turnId });
140
+ }
117
141
  function clearDialogRuntimeState(payload) {
118
142
  delete runtimeByKey[payload.dialogKey];
119
143
  notify();
@@ -258,6 +282,9 @@ function getPendingUserInputQueue(dialogKey) {
258
282
  function getLoopStopReason(dialogKey) {
259
283
  return getDialogRuntimeState(dialogKey).loopStopReason;
260
284
  }
285
+ function getDialogTurnPhase(dialogKey) {
286
+ return getDialogRuntimeState(dialogKey).turnPhase;
287
+ }
261
288
  var selectDialogRuntimeByKey = (_state, dialogKey) => getDialogRuntimeState(dialogKey);
262
289
  var selectPendingFiles = (_state, dialogKey) => getPendingFiles(dialogKey);
263
290
  var selectActiveControllers = (_state, dialogKey) => getActiveControllers(dialogKey);
@@ -293,6 +320,10 @@ function useLoopStopReason(dialogKey) {
293
320
  (0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
294
321
  return getLoopStopReason(dialogKey);
295
322
  }
323
+ function useDialogTurnPhase(dialogKey) {
324
+ (0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
325
+ return getDialogTurnPhase(dialogKey);
326
+ }
296
327
  function useDialogRuntimeTokens(dialogKey) {
297
328
  (0, import_react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
298
329
  return getDialogRuntimeTokens(dialogKey);
@@ -316,6 +347,9 @@ export {
316
347
  removePendingFile,
317
348
  clearPendingAttachments,
318
349
  setLoopStopReason,
350
+ claimDialogTurnPhase,
351
+ setDialogTurnPhase,
352
+ clearDialogTurnPhase,
319
353
  clearDialogRuntimeState,
320
354
  addActiveController,
321
355
  removeActiveController,
@@ -330,8 +364,6 @@ export {
330
364
  deleteDialogRuntime,
331
365
  abortActiveControllers,
332
366
  getDialogRuntimeTokens,
333
- getPendingUserInputQueue,
334
- getLoopStopReason,
335
367
  selectDialogRuntimeByKey,
336
368
  selectPendingFiles,
337
369
  selectActiveControllers,
@@ -346,6 +378,7 @@ export {
346
378
  useActiveControllers,
347
379
  usePendingUserInputQueue,
348
380
  useLoopStopReason,
381
+ useDialogTurnPhase,
349
382
  useDialogRuntimeTokens,
350
383
  useCurrentDialogKey,
351
384
  useDialogConfigError