nolo-cli 0.149.0-alpha.1 → 0.151.0-alpha.3

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 (258) hide show
  1. package/{_executeModel-OW3H7ICR.js → _executeModel-T7ANHTUW.js} +134 -91
  2. package/accountResolver-7RYB4D2P.js +300 -0
  3. package/action-SXJD5N5R.js +23 -0
  4. package/{addContentAction-B2DRF7P6.js → addContentAction-ZV774PHH.js} +20 -14
  5. package/{addDialogAgentAction-2P2FLTLD.js → addDialogAgentAction-A6SMKAGH.js} +26 -22
  6. package/{agentDeleteCommand-7IDWF6E3.js → agentDeleteCommand-4L5KCKFY.js} +181 -93
  7. package/{agentEmailCommands-A6XBQZBN.js → agentEmailCommands-2IMMIRO2.js} +132 -112
  8. package/{agentGrantCommands-M3XFO6EN.js → agentGrantCommands-HOJ3JBBQ.js} +3 -3
  9. package/agentListCommands-TWFLUYIZ.js +802 -0
  10. package/{agentMachineCommands-DQPUIMAC.js → agentMachineCommands-KIWXWT6L.js} +58 -62
  11. package/{agentProviderCommands-YK2BIIXZ.js → agentProviderCommands-HL6MBLCL.js} +149 -2
  12. package/{agentPullCommand-HF4A42D4.js → agentPullCommand-FA43RBRU.js} +7 -7
  13. package/agentRecordCommands-727NPCRW.js +154 -0
  14. package/agentRunCommand-JASIG3FZ.js +183 -0
  15. package/{agentRunControl-2SKCR4SB.js → agentRunControl-IFM7IGMG.js} +10 -2
  16. package/{agentRuntimeLocal-AK2QVJHY.js → agentRuntimeLocal-KKSQJMTE.js} +47 -50
  17. package/{agentSlice-O4RUQUMT.js → agentSlice-SLV57QGU.js} +23 -16
  18. package/{appDeleteCommands-N3XEVVYC.js → appDeleteCommands-4PL4KYRN.js} +58 -59
  19. package/{appDeployCommands-AWFIXYVW.js → appDeployCommands-EEEXCEB6.js} +67 -63
  20. package/{appDeployStatusCommands-CZRON2FO.js → appDeployStatusCommands-35ZX7T66.js} +56 -56
  21. package/{appGetCommands-XQIUY4TD.js → appGetCommands-WFCHXJWF.js} +56 -56
  22. package/{appListCommands-NNG4H36Y.js → appListCommands-XY2U6DPF.js} +57 -59
  23. package/{authCommand-UBJ4EWYZ.js → authCommand-QYN47CQD.js} +371 -68
  24. package/{authCommands-H6WKKCRW.js → authCommands-77CHYBGF.js} +12 -9
  25. package/{builtinSkillRegistry-ZMF6YGNO.js → builtinSkillRegistry-TDQ6JB2E.js} +13 -11
  26. package/{chromeCommands-2N6MEWRU.js → chromeCommands-OBBNJCLS.js} +314 -13
  27. package/chromeOpsCommands-3Z34RKSE.js +472 -0
  28. package/{chunk-ALXHV7NK.js → chunk-2GGXHQIW.js} +43 -4
  29. package/{localRuntimeAuthority-5W6IJRAD.js → chunk-2IXDJNZI.js} +154 -75
  30. package/{chunk-IVZJWTDI.js → chunk-36OMEXXR.js} +89 -21
  31. package/{chunk-H6A6X4EK.js → chunk-3MZAGMYY.js} +16 -0
  32. package/chunk-3PVYUPXK.js +40 -0
  33. package/chunk-3SZA4U64.js +1192 -0
  34. package/{chunk-ID7LNBWR.js → chunk-3T4ZG6AC.js} +1920 -644
  35. package/{chunk-GNMAFAIS.js → chunk-44WXLHFI.js} +1 -1
  36. package/{chunk-AGGIDPCZ.js → chunk-4JH2UMJR.js} +6 -0
  37. package/chunk-4LCOCOR5.js +50 -0
  38. package/chunk-4YRTZIVN.js +871 -0
  39. package/{chunk-N7J63Q6C.js → chunk-56GBUMO5.js} +10 -1
  40. package/{chunk-W7XHHYWM.js → chunk-5BHQICF2.js} +5 -1
  41. package/{chunk-XUWRURDF.js → chunk-5EBLANFT.js} +1 -1
  42. package/{chunk-3AH7LNUB.js → chunk-5EMSBTQ6.js} +33 -14
  43. package/{chunk-YRRASA5Q.js → chunk-5MM7NNO6.js} +113 -52
  44. package/chunk-5MMAK75Q.js +15 -0
  45. package/{chunk-TXH4IWJL.js → chunk-626KHJNX.js} +20 -11
  46. package/{chunk-M5PVFLD4.js → chunk-64K7WX26.js} +90 -21
  47. package/{chunk-AKG5W4LG.js → chunk-6CCFTVBP.js} +76 -221
  48. package/chunk-6MJNEXUU.js +614 -0
  49. package/{chunk-62IL3KQV.js → chunk-6MXDOUMH.js} +15 -3
  50. package/{chunk-QOKAKDPE.js → chunk-6Q7UTJKR.js} +6 -94
  51. package/chunk-6QDYSCPW.js +223 -0
  52. package/{chunk-HYZIYH2H.js → chunk-74RAWNQN.js} +56 -63
  53. package/chunk-7DPNBQSV.js +9 -0
  54. package/{chunk-IAESIMK7.js → chunk-A4MW3YZL.js} +10 -14
  55. package/{chunk-OMRJYNCI.js → chunk-AG7MCDLR.js} +26 -31
  56. package/chunk-AGIM7IMJ.js +147 -0
  57. package/{chunk-7CHC4W22.js → chunk-AIZE5TDM.js} +3 -3
  58. package/chunk-AJ3G7X2K.js +7012 -0
  59. package/{chunk-5GVBDNTO.js → chunk-AU7AXHUL.js} +1 -1
  60. package/{chunk-4H22P2JV.js → chunk-AUIJZACN.js} +2073 -1275
  61. package/{chunk-CIF4X6ZM.js → chunk-AWVFQMOV.js} +25 -3
  62. package/{chunk-YAQJJDC2.js → chunk-BJEZC5RA.js} +214 -51
  63. package/{chunk-RYZINGPM.js → chunk-BPMPOFWP.js} +347 -235
  64. package/{chunk-YUNJN43V.js → chunk-BU2YQBV4.js} +215 -28
  65. package/{chunk-XPRWFQQK.js → chunk-CBHGZRCE.js} +38 -12
  66. package/{chunk-Y3PMXGLH.js → chunk-CHCS6XPJ.js} +365 -144
  67. package/chunk-CHOZJMJS.js +78 -0
  68. package/chunk-CYJWI3NH.js +119 -0
  69. package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
  70. package/{chunk-3SV7RM24.js → chunk-D2QN6CTI.js} +117 -72
  71. package/{chunk-TZZ2WRBL.js → chunk-DFDXM2Y4.js} +20 -16
  72. package/{chunk-5TEEECZM.js → chunk-E2AKSW7L.js} +10 -7
  73. package/{chunk-RSEEDUMS.js → chunk-EDX5XSJM.js} +2 -2
  74. package/{chunk-QDSINZM3.js → chunk-EUGTFFO6.js} +2 -23
  75. package/{chunk-UNYJU5L6.js → chunk-EYLGAEB4.js} +5 -1
  76. package/{chunk-CU3QB4HW.js → chunk-EYWJT7A2.js} +12 -12
  77. package/{chunk-BNGW5ASC.js → chunk-EZVK3N5L.js} +66 -18
  78. package/{chunk-6FGTMQCL.js → chunk-F32Z66T4.js} +6 -10
  79. package/{chunk-ZOVKKMF6.js → chunk-FY4SDK2E.js} +1 -1
  80. package/chunk-G6OOUQWJ.js +417 -0
  81. package/{chunk-PQWU42UQ.js → chunk-GCKHQECX.js} +6 -6
  82. package/chunk-GKXCHNTE.js +15 -0
  83. package/{chunk-P6GMCCAT.js → chunk-GQV5KHJU.js} +78 -12
  84. package/{chunk-B2XUQXQX.js → chunk-HIQ4GF53.js} +191 -68
  85. package/{chunk-GMZLP5DV.js → chunk-HNUWUO75.js} +30 -19
  86. package/{chunk-UASIEDKM.js → chunk-I2XLRXVX.js} +36 -31
  87. package/{chunk-5UTFL4QJ.js → chunk-I2ZMGXXF.js} +10 -5
  88. package/chunk-I42VC5KR.js +15 -0
  89. package/{chunk-3BXNTXYI.js → chunk-I4SN4NUQ.js} +1199 -56
  90. package/chunk-IA7TRNNR.js +11 -0
  91. package/{chunk-WIWM4FE3.js → chunk-IJERIUXS.js} +55 -748
  92. package/{chunk-BIDGLJQ3.js → chunk-IK2TSJQA.js} +45 -8
  93. package/{chunk-CPUFH46E.js → chunk-ILU2NPWY.js} +10 -10
  94. package/{chunk-SLLGJZDT.js → chunk-ISQL4V7C.js} +4 -4
  95. package/chunk-IT3ZZRJE.js +12 -0
  96. package/{chunk-DY7ANLKG.js → chunk-JKMLSTZK.js} +43 -12
  97. package/{chunk-6TPOEJMQ.js → chunk-JZX2XLKC.js} +64 -23
  98. package/{chunk-27ONFIEY.js → chunk-K2AER7RX.js} +19 -12
  99. package/{chunk-O2OWEFII.js → chunk-KFHQQ3NO.js} +1 -1
  100. package/{chunk-QXGPFY6J.js → chunk-LGN377P3.js} +27 -17
  101. package/{chunk-L36OWPP3.js → chunk-LIQJTQRN.js} +118 -139
  102. package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
  103. package/{chunk-5J3PYNUP.js → chunk-NYYFIKHI.js} +17 -3
  104. package/{chunk-6O4IK4V2.js → chunk-OFFL4DCR.js} +1 -1
  105. package/{chunk-B6SAMB33.js → chunk-OWYYDMGJ.js} +209 -9
  106. package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
  107. package/{chunk-CTUQJVQM.js → chunk-P5QACQDK.js} +1 -1
  108. package/{chunk-TB3MIBRC.js → chunk-PIDUNDFS.js} +572 -430
  109. package/{chunk-4JMDLJAD.js → chunk-PJNFNEJE.js} +114 -37
  110. package/chunk-PKZKOVA5.js +11507 -0
  111. package/{chunk-Z4CSIXYP.js → chunk-PLSVXHSA.js} +3 -3
  112. package/chunk-PWTNI4N7.js +47 -0
  113. package/chunk-QFEW2ULV.js +42 -0
  114. package/{chunk-RGNEEJ3Y.js → chunk-QLQ573SU.js} +35 -9
  115. package/chunk-QQ56R7KS.js +88 -0
  116. package/chunk-QYPE3TS3.js +43 -0
  117. package/{chunk-HTVYCXBP.js → chunk-RN2GPWN6.js} +354 -120
  118. package/{chunk-ATLTFRYJ.js → chunk-ROCUB2H2.js} +280 -98
  119. package/{chunk-4DPP773Q.js → chunk-RSHPU4PD.js} +59 -11
  120. package/chunk-RVWMAFIT.js +134 -0
  121. package/{chunk-ESHYE7WU.js → chunk-S73EPYNC.js} +10 -7
  122. package/{chunk-UQNS32WZ.js → chunk-SCMHQUMK.js} +1 -1
  123. package/chunk-SW4S4XYB.js +1794 -0
  124. package/{chunk-ZUEK6A6C.js → chunk-TTH4HOJD.js} +1973 -754
  125. package/chunk-TY3TIUJK.js +89 -0
  126. package/{chunk-X2QRZXZH.js → chunk-TYJ5XFEA.js} +4 -4
  127. package/{chunk-ALFH24P3.js → chunk-TYYRSFBG.js} +197 -155
  128. package/{chunk-MST6R3E4.js → chunk-U5GPBQDG.js} +34 -22
  129. package/chunk-U5ICMAFV.js +14110 -0
  130. package/{chunk-7KVZ5LDQ.js → chunk-UBUH2TCC.js} +18 -4
  131. package/chunk-UEILX4EV.js +15 -0
  132. package/chunk-UHTDNB5Y.js +140 -0
  133. package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
  134. package/{chunk-OHOVNO7I.js → chunk-UOKFKFPO.js} +6 -3
  135. package/{chunk-XISEYOGH.js → chunk-USHQX6VT.js} +5 -5
  136. package/chunk-UUPR3TD7.js +53 -0
  137. package/{chunk-3DAVPNFT.js → chunk-V4EE3D54.js} +122 -107
  138. package/{chunk-HDLLCBRF.js → chunk-VEA7H5FG.js} +2 -2
  139. package/chunk-VHGD6FHV.js +116 -0
  140. package/chunk-VIWDGTDA.js +8 -0
  141. package/{chunk-GOH6RW6F.js → chunk-VJXHL6MH.js} +34 -11
  142. package/{chunk-4XEYAFLY.js → chunk-VL5KOY2C.js} +623 -94
  143. package/{chunk-EADNWBAZ.js → chunk-VP3BINY7.js} +13 -0
  144. package/{chunk-DXHL7G2L.js → chunk-VWW6O2TL.js} +274 -93
  145. package/{chunk-EOARMOVD.js → chunk-W4S6OTSC.js} +6 -3
  146. package/chunk-WD4XYDYC.js +567 -0
  147. package/chunk-WJZOQR2J.js +151 -0
  148. package/{chunk-AUDNYVRC.js → chunk-XETG4RIX.js} +5 -5
  149. package/{chunk-MX574M24.js → chunk-XI7DGLUK.js} +4 -4
  150. package/{chunk-3L2WKC3W.js → chunk-XPWGOTBQ.js} +8 -1
  151. package/chunk-XRUSXPCQ.js +514 -0
  152. package/{chunk-I4OPU5TK.js → chunk-XS47QOFV.js} +273 -11
  153. package/{chunk-S5XGT6GB.js → chunk-XZNCX52W.js} +30 -9
  154. package/{chunk-5OA5HMTL.js → chunk-YLMMECCH.js} +1 -1
  155. package/{chunk-CFT5HBGW.js → chunk-YVLQXTUB.js} +448 -12
  156. package/chunk-YVPQATSC.js +709 -0
  157. package/chunk-ZEZC7IIM.js +126 -0
  158. package/{chunk-ALGORS6Y.js → chunk-ZF6526IQ.js} +43 -8
  159. package/chunk-ZIWPQEFU.js +165 -0
  160. package/chunk-ZRAU6T47.js +56 -0
  161. package/{cliExecutor-AWYR3T33.js → cliExecutor-BWBF2MTI.js} +4 -3
  162. package/{clipboardy-BX4NMYHE.js → clipboardy-GCO3GT3I.js} +3 -8
  163. package/{commandRegistry-2KBOXZQC.js → commandRegistry-NBLZEMCW.js} +183 -107
  164. package/contentThunks-6AIWNSGO.js +84 -0
  165. package/{cooldownCommands-ZLEPIB4A.js → cooldownCommands-JFKTYS2D.js} +2 -2
  166. package/{createAgentAutomationAction-5UGTB26P.js → createAgentAutomationAction-4BUS65DZ.js} +53 -44
  167. package/createDialogAction-QAIKSCG4.js +76 -0
  168. package/{createPageAction-CDLDKPRM.js → createPageAction-DXCZ334C.js} +65 -54
  169. package/cursorProvider-YGGNMVWX.js +6123 -0
  170. package/{db-VQSAOWAO.js → db-2QOTXYGH.js} +11 -5
  171. package/{dbSlice-DQ32LYTJ.js → dbSlice-J37OGIXH.js} +19 -13
  172. package/{deleteFile-NX6QHCWZ.js → deleteFile-6JWDDRVP.js} +10 -6
  173. package/dialogCommands-YZLSJB6X.js +113 -0
  174. package/{dialogSlice-N3YB65G5.js → dialogSlice-PVUSMKFW.js} +53 -39
  175. package/{docCreateCommands-ZSLGVBZT.js → docCreateCommands-JB2RRMRJ.js} +54 -57
  176. package/{docDeleteCommands-5N4GVZBG.js → docDeleteCommands-AQENULNM.js} +56 -58
  177. package/{docReadCommands-YJSAA7AV.js → docReadCommands-DYD25YLQ.js} +53 -56
  178. package/{docStore-E3CEOV5Q.js → docStore-CSEBEMKP.js} +25 -16
  179. package/{docUpdateCommands-WEMLSW6W.js → docUpdateCommands-3GVS23QL.js} +54 -57
  180. package/{fetchMessages-67MEFPZR.js → fetchMessages-IIJWQ3HR.js} +5 -4
  181. package/{getPricing-NMMFT3YI.js → getPricing-FKK3F5EJ.js} +11 -9
  182. package/{handleSendMessageAction-DQAD5ERJ.js → handleSendMessageAction-G2TLYGC4.js} +422 -118
  183. package/index.js +11 -7
  184. package/{lib-FRRS27KN.js → lib-4YTWAGY7.js} +581 -248
  185. package/{localDialogRead-EBRS242U.js → localDialogRead-FSOMOPDZ.js} +2 -2
  186. package/localRuntimeAdapter-B4TAYYA7.js +244 -0
  187. package/localRuntimeAuthority-JDAD7CB6.js +16 -0
  188. package/{localRuntimeDb-3LRMNLCM.js → localRuntimeDb-CVC62PM5.js} +1 -1
  189. package/{machineCommands-HAP75VSG.js → machineCommands-6OBFD3XF.js} +503 -161
  190. package/{machineInfo-66ZFUMLE.js → machineInfo-UKPTZO5Y.js} +2 -2
  191. package/machineWsRunDispatch-OO7N3O3Y.js +169 -0
  192. package/{memberThunks-5ZXPR63F.js → memberThunks-66DH6ABQ.js} +25 -18
  193. package/{models-ZPU5EDF4.js → models-LAS4B2B5.js} +2 -2
  194. package/package.json +1 -1
  195. package/{providerPresetApply-DD6NGWW6.js → providerPresetApply-MY66I6NT.js} +10 -10
  196. package/{providerRegistry-XDRLMYGJ.js → providerRegistry-QOE2FT57.js} +13 -9
  197. package/{read-EPTJRAEF.js → read-DC4NUGN6.js} +12 -8
  198. package/{readDocTool-W4NDXNEX.js → readDocTool-NCJ5NT25.js} +1 -1
  199. package/{readlineWorkspace-7BC66QSX.js → readlineWorkspace-UIQN7JUR.js} +5017 -915
  200. package/{removeDialogAgentAction-OSYNZRX7.js → removeDialogAgentAction-E2H3OZU6.js} +29 -28
  201. package/{runAgentClientLoop-6E6UC3CE.js → runAgentClientLoop-GS3SGG37.js} +154 -97
  202. package/{runtimeDoctorCommands-ID23PNNZ.js → runtimeDoctorCommands-GIOGC5SC.js} +17 -17
  203. package/secretCommands-ZXZRLR3R.js +700 -0
  204. package/setDialogExtraReferencesAction-SITRPMYU.js +37 -0
  205. package/{setPrimaryDialogAgentAction-WZ7KI3YA.js → setPrimaryDialogAgentAction-U7N45TGC.js} +30 -29
  206. package/{chunk-SONWNI3L.js → settingThunks-Y7SVJOMZ.js} +223 -928
  207. package/{skillDiscovery-ZBU76COE.js → skillDiscovery-QC35EQY4.js} +2 -2
  208. package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
  209. package/{spaceCommands-UJOVU4XI.js → spaceCommands-ZR5BR3GX.js} +59 -59
  210. package/{streamAgentChatTurn-3UXPYFNX.js → streamAgentChatTurn-4XYC33KE.js} +309 -165
  211. package/{switchDialogAgentAction-GMR7WN3P.js → switchDialogAgentAction-OMGBD3N2.js} +26 -22
  212. package/{tableCommands-G7RV3RU3.js → tableCommands-U3QDY4L6.js} +19 -17
  213. package/{toolApiClient-CVGWM4PN.js → toolApiClient-7WSJJJBV.js} +6 -5
  214. package/tools-P77EE7Q4.js +124 -0
  215. package/tuiSummaryLlmCaller-BM3VSTBU.js +130 -0
  216. package/{updateCommands-4EHDLF5J.js → updateCommands-NQXAGFM7.js} +3 -3
  217. package/{updateDialogTitleAction-UPFV7TDT.js → updateDialogTitleAction-CIANVPZC.js} +102 -57
  218. package/workloadLifecycle-36DXRZKU.js +320 -0
  219. package/action-GI44T4DR.js +0 -31
  220. package/agentListCommands-IW3GQVUP.js +0 -427
  221. package/agentRecordCommands-VCA76W6B.js +0 -134
  222. package/agentRunCommand-YNLDKVR7.js +0 -161
  223. package/browser-image-compression-MFDTD7K6.js +0 -1763
  224. package/chatQueueReduxAdapter-TJRMXMYA.js +0 -186
  225. package/chromeOpsCommands-IXRLN57H.js +0 -289
  226. package/chunk-36KZDDO5.js +0 -2415
  227. package/chunk-ACQD6YI2.js +0 -25363
  228. package/chunk-CQ3WA2NE.js +0 -299
  229. package/chunk-CYSYR67N.js +0 -93
  230. package/chunk-JBTJAPUF.js +0 -35
  231. package/chunk-K2CSUCHJ.js +0 -620
  232. package/chunk-LTRXGFMS.js +0 -83
  233. package/chunk-M76ECQRD.js +0 -13658
  234. package/chunk-MEYIRKDN.js +0 -8967
  235. package/chunk-OCZKATRC.js +0 -129
  236. package/chunk-OTGFTBLI.js +0 -13
  237. package/chunk-PUOC4YRO.js +0 -394
  238. package/chunk-PZZTFEKK.js +0 -34
  239. package/chunk-URMS4XY2.js +0 -10
  240. package/chunk-UV6VISQJ.js +0 -20
  241. package/chunk-VJVNU77E.js +0 -83
  242. package/chunk-XYJSY4KG.js +0 -13807
  243. package/chunk-Y5GCAMGP.js +0 -9
  244. package/chunk-YPREESF4.js +0 -225
  245. package/contentThunks-BDIQRZR6.js +0 -73
  246. package/createDialogAction-B7VGVEVU.js +0 -66
  247. package/dialogCommands-G7YBVAMC.js +0 -102
  248. package/levelLazyShim-GZBKODGI.js +0 -7
  249. package/machineWsRunDispatch-L32G7C4P.js +0 -149
  250. package/serverStoreFactory-YMXDF4NI.js +0 -20
  251. package/setDialogExtraReferencesAction-M32UYNCG.js +0 -30
  252. package/settingSlice-Q6EKL7EQ.js +0 -204
  253. package/syncMapping-N6RGXGBW.js +0 -437
  254. package/tools-MKYDMWA4.js +0 -111
  255. package/tuiSummaryLlmCaller-3YFNHCTW.js +0 -128
  256. package/{chunk-SV5IJK6K.js → chunk-NBTY7YJF.js} +3 -3
  257. package/{chunk-2SYTUTLI.js → chunk-YBNHPX4S.js} +3 -3
  258. package/{offlineMarxistsAgentCommand-HGXZV4XJ.js → offlineMarxistsAgentCommand-2QTHJCHV.js} +4 -4
@@ -1,11 +1,10 @@
1
1
  import {
2
- getCredentialsDir,
3
- getLegacyCredentialPath,
4
- migrateLegacyCredentialFile
5
- } from "./chunk-ZWQUWF6W.js";
2
+ asNonEmptyStringArray,
3
+ asTrimmedNonEmptyStringArray
4
+ } from "./chunk-I42VC5KR.js";
6
5
  import {
7
- asNonEmptyStringArray
8
- } from "./chunk-3AH7LNUB.js";
6
+ asOptionalPositiveFiniteNumber
7
+ } from "./chunk-U6VC4MU4.js";
9
8
  import {
10
9
  isRecord
11
10
  } from "./chunk-KUG52IAP.js";
@@ -13,136 +12,8 @@ import {
13
12
  asTrimmedString
14
13
  } from "./chunk-3EUW3WEO.js";
15
14
  import {
16
- asOptionalPositiveFiniteNumber
17
- } from "./chunk-U6VC4MU4.js";
18
-
19
- // packages/agent-runtime/fileCredentialBroker.ts
20
- import {
21
- chmodSync,
22
- existsSync,
23
- mkdirSync,
24
- readFileSync,
25
- unlinkSync,
26
- writeFileSync
27
- } from "node:fs";
28
- import { homedir } from "node:os";
29
- import { join } from "node:path";
30
-
31
- // packages/agent-runtime/credentialBroker.ts
32
- function assertCredentialRef(ref) {
33
- const trimmed = asTrimmedString(ref);
34
- if (!trimmed) {
35
- throw new Error("invalid_ref");
36
- }
37
- if (trimmed.includes("..") || trimmed.includes("/") || trimmed.includes("\\")) {
38
- throw new Error("invalid_ref");
39
- }
40
- return trimmed;
41
- }
42
-
43
- // packages/agent-runtime/fileCredentialBroker.ts
44
- function getApiKeyCredentialsDir(homeDir) {
45
- return join(getCredentialsDir(homeDir), "keys");
46
- }
47
- function credentialRefToFileName(ref) {
48
- const safe = assertCredentialRef(ref).replace(/[^a-zA-Z0-9._-]+/g, "_");
49
- if (!safe || safe === "." || safe === "..") {
50
- throw new Error(`Credential ref is not filesystem-safe: ${ref}`);
51
- }
52
- return `${safe}.json`;
53
- }
54
- function getApiKeyCredentialPath(ref, homeDir) {
55
- return join(getApiKeyCredentialsDir(homeDir), credentialRefToFileName(ref));
56
- }
57
- function ensurePrivateDir(dir) {
58
- mkdirSync(dir, { recursive: true, mode: 448 });
59
- try {
60
- chmodSync(dir, 448);
61
- } catch {
62
- }
63
- }
64
- function writePrivateFile(path, body) {
65
- writeFileSync(path, body, { encoding: "utf8", mode: 384 });
66
- try {
67
- chmodSync(path, 384);
68
- } catch {
69
- }
70
- }
71
- function migrateApiKeyCredentialIfNeeded(ref, homeDir, migration) {
72
- if (homeDir !== void 0 || !migration?.enableLegacyMigration) return;
73
- const legacyHomeDir = migration.legacyHomeDir ?? homedir();
74
- const relativePath = join("keys", credentialRefToFileName(ref));
75
- migrateLegacyCredentialFile({
76
- canonicalPath: getApiKeyCredentialPath(ref),
77
- legacyPath: getLegacyCredentialPath(relativePath, legacyHomeDir),
78
- mode: migration.mode ?? (migration.legacyHomeDir ? "test" : "production"),
79
- isValid: (raw) => {
80
- try {
81
- const parsed = JSON.parse(raw);
82
- return typeof parsed?.secret === "string" && Boolean(parsed.secret);
83
- } catch {
84
- return false;
85
- }
86
- }
87
- });
88
- }
89
- function readApiKeyCredential(ref, homeDir, migration) {
90
- migrateApiKeyCredentialIfNeeded(ref, homeDir, migration);
91
- const path = getApiKeyCredentialPath(ref, homeDir);
92
- if (!existsSync(path)) return null;
93
- try {
94
- const raw = readFileSync(path, "utf8");
95
- const parsed = JSON.parse(raw);
96
- if (typeof parsed?.secret !== "string" || !parsed.secret) return null;
97
- return parsed.secret;
98
- } catch {
99
- return null;
100
- }
101
- }
102
- function writeApiKeyCredential(ref, secret, homeDir, now = Date.now()) {
103
- const trimmedSecret = secret.trim();
104
- if (!trimmedSecret) {
105
- throw new Error("Cannot store an empty credential secret.");
106
- }
107
- assertCredentialRef(ref);
108
- const dir = getApiKeyCredentialsDir(homeDir);
109
- ensurePrivateDir(dir);
110
- const path = getApiKeyCredentialPath(ref, homeDir);
111
- const payload = {
112
- secret: trimmedSecret,
113
- updatedAt: now
114
- };
115
- writePrivateFile(path, `${JSON.stringify(payload, null, 2)}
116
- `);
117
- }
118
- function removeApiKeyCredential(ref, homeDir) {
119
- assertCredentialRef(ref);
120
- const path = getApiKeyCredentialPath(ref, homeDir);
121
- if (!existsSync(path)) return;
122
- unlinkSync(path);
123
- }
124
- function hasApiKeyCredential(ref, homeDir, migration) {
125
- return readApiKeyCredential(ref, homeDir, migration) !== null;
126
- }
127
- function createFileCredentialBroker(options = {}) {
128
- const homeDir = options.homeDir;
129
- const migration = options.migration;
130
- const now = options.now ?? Date.now;
131
- return {
132
- get(ref) {
133
- return readApiKeyCredential(ref, homeDir, migration);
134
- },
135
- put(ref, secret) {
136
- writeApiKeyCredential(ref, secret, homeDir, now());
137
- },
138
- delete(ref) {
139
- removeApiKeyCredential(ref, homeDir);
140
- },
141
- has(ref) {
142
- return hasApiKeyCredential(ref, homeDir, migration);
143
- }
144
- };
145
- }
15
+ asOptionalTrimmedString
16
+ } from "./chunk-G3SUCT4W.js";
146
17
 
147
18
  // packages/agent-runtime/migrateAgentSecrets.ts
148
19
  function buildAgentApiKeyCredentialRef(agentKey) {
@@ -255,13 +126,51 @@ function applyAgentSecretMigrationUpdates(record, updates) {
255
126
  function unique(values) {
256
127
  return [...new Set(values)];
257
128
  }
129
+ function mergeRecords(base, override) {
130
+ if (!base && !override) return void 0;
131
+ return {
132
+ ...base ?? {},
133
+ ...override ?? {}
134
+ };
135
+ }
136
+ function normalizeWorkspacePolicy(value) {
137
+ if (!isRecord(value)) return void 0;
138
+ const mode = value.mode === "none" || value.mode === "current" || value.mode === "lease" ? value.mode : void 0;
139
+ const readableRoots = unique(asNonEmptyStringArray(value.readableRoots));
140
+ const writableRoots = unique(asNonEmptyStringArray(value.writableRoots));
141
+ const cwd = asOptionalTrimmedString(value.cwd);
142
+ const normalized = {
143
+ ...mode ? { mode } : {},
144
+ ...readableRoots.length ? { readableRoots } : {},
145
+ ...writableRoots.length ? { writableRoots } : {},
146
+ ...cwd ? { cwd } : {}
147
+ };
148
+ return Object.keys(normalized).length > 0 ? normalized : void 0;
149
+ }
150
+ function mergeWorkspacePolicy(base, override) {
151
+ const readableRoots = unique([
152
+ ...base?.readableRoots ?? [],
153
+ ...override?.readableRoots ?? []
154
+ ]);
155
+ const writableRoots = unique([
156
+ ...base?.writableRoots ?? [],
157
+ ...override?.writableRoots ?? []
158
+ ]);
159
+ return {
160
+ ...base ?? {},
161
+ ...override ?? {},
162
+ ...readableRoots.length ? { readableRoots } : {},
163
+ ...writableRoots.length ? { writableRoots } : {}
164
+ };
165
+ }
258
166
  function normalizeAgentRuntimeToolPolicy(value) {
259
167
  if (!isRecord(value)) return void 0;
168
+ const workspace = normalizeWorkspacePolicy(value.workspace);
260
169
  return {
261
170
  version: 1,
262
171
  ...asNonEmptyStringArray(value.agentTools).length ? { agentTools: unique(asNonEmptyStringArray(value.agentTools)) } : {},
263
172
  ...asNonEmptyStringArray(value.runtimeTools).length ? { runtimeTools: unique(asNonEmptyStringArray(value.runtimeTools)) } : {},
264
- ...isRecord(value.workspace) ? { workspace: { ...value.workspace } } : {},
173
+ ...workspace ? { workspace } : {},
265
174
  ...isRecord(value.shell) ? { shell: { ...value.shell } } : {},
266
175
  ...isRecord(value.isolation) ? { isolation: { ...value.isolation } } : {},
267
176
  ...isRecord(value.git) ? { git: { ...value.git } } : {},
@@ -269,6 +178,21 @@ function normalizeAgentRuntimeToolPolicy(value) {
269
178
  ...isRecord(value.audit) ? { audit: { ...value.audit } } : {}
270
179
  };
271
180
  }
181
+ function normalizeRuntimeToolPolicyOverride(value) {
182
+ if (!isRecord(value)) return void 0;
183
+ const runtimeTools = unique(
184
+ asTrimmedNonEmptyStringArray(value.runtimeTools).filter(
185
+ (tool) => tool === "execShell"
186
+ )
187
+ );
188
+ const workspace = isRecord(value.workspace) && value.workspace.mode === "lease" ? { mode: "lease" } : void 0;
189
+ if (!runtimeTools.length && !workspace) return void 0;
190
+ return {
191
+ version: 1,
192
+ ...runtimeTools.length ? { runtimeTools } : {},
193
+ ...workspace ? { workspace } : {}
194
+ };
195
+ }
272
196
  function runtimeBindingRecord(runtimeBinding) {
273
197
  return isRecord(runtimeBinding) ? runtimeBinding : void 0;
274
198
  }
@@ -278,6 +202,26 @@ function runtimeToolNamesFromPolicy(policy) {
278
202
  function readPositiveNumber(value) {
279
203
  return asOptionalPositiveFiniteNumber(Number(value));
280
204
  }
205
+ function mergeAgentRuntimeToolPolicies(base, override) {
206
+ if (!base && !override) return void 0;
207
+ return {
208
+ version: 1,
209
+ agentTools: unique([
210
+ ...base?.agentTools ?? [],
211
+ ...override?.agentTools ?? []
212
+ ]),
213
+ runtimeTools: unique([
214
+ ...base?.runtimeTools ?? [],
215
+ ...override?.runtimeTools ?? []
216
+ ]),
217
+ workspace: mergeWorkspacePolicy(base?.workspace, override?.workspace),
218
+ shell: mergeRecords(base?.shell, override?.shell),
219
+ isolation: mergeRecords(base?.isolation, override?.isolation),
220
+ git: mergeRecords(base?.git, override?.git),
221
+ budget: mergeRecords(base?.budget, override?.budget),
222
+ audit: mergeRecords(base?.audit, override?.audit)
223
+ };
224
+ }
281
225
  function resolveRequestedRuntimeToolNames(args) {
282
226
  const runtimeBinding = runtimeBindingRecord(args.agentConfig.runtimeBinding);
283
227
  const bindingPolicy = normalizeAgentRuntimeToolPolicy(
@@ -310,14 +254,49 @@ function resolveLocalWorkspaceExecutorOptionsFromPolicy(policy) {
310
254
  ...maxOutputBytes ? { commandOutputLimit: Math.floor(maxOutputBytes) } : {}
311
255
  };
312
256
  }
257
+ function policyRequestsHostedWorkspace(policy) {
258
+ if (!policy) return false;
259
+ const workspaceMode = policy.workspace?.mode;
260
+ return policy.shell?.enabled === true || policy.runtimeTools?.some((tool) => tool === "execShell") || workspaceMode === "lease";
261
+ }
262
+ function applyWebRuntimeSafetyBaseline(policy) {
263
+ if (!policyRequestsHostedWorkspace(policy)) return policy;
264
+ return mergeAgentRuntimeToolPolicies(
265
+ policy,
266
+ {
267
+ version: 1,
268
+ shell: {
269
+ commandPolicy: "approval",
270
+ networkPolicy: "default-deny"
271
+ },
272
+ isolation: {
273
+ mode: "os-sandbox"
274
+ },
275
+ audit: {
276
+ logToolCalls: true,
277
+ logShellCommands: true,
278
+ writeToDialog: true
279
+ }
280
+ }
281
+ );
282
+ }
283
+ function resolveEffectiveRuntimeToolPolicy(args) {
284
+ const agentPolicy = resolveCurrentRunRuntimeToolPolicy(args.agentConfig);
285
+ const requestedPolicy = normalizeRuntimeToolPolicyOverride(
286
+ args.runtimeToolPolicyOverride
287
+ );
288
+ const effectivePolicy = mergeAgentRuntimeToolPolicies(agentPolicy, requestedPolicy);
289
+ return args.host === "web" ? applyWebRuntimeSafetyBaseline(effectivePolicy) : effectivePolicy;
290
+ }
313
291
 
314
292
  export {
315
- createFileCredentialBroker,
316
293
  migrateAgentSecrets,
317
294
  applyAgentSecretMigrationUpdates,
318
295
  normalizeAgentRuntimeToolPolicy,
296
+ normalizeRuntimeToolPolicyOverride,
319
297
  resolveRequestedRuntimeToolNames,
320
298
  resolveCurrentRunRuntimeToolPolicy,
321
299
  resolveLocalRuntimeEnvFromPolicy,
322
- resolveLocalWorkspaceExecutorOptionsFromPolicy
300
+ resolveLocalWorkspaceExecutorOptionsFromPolicy,
301
+ resolveEffectiveRuntimeToolPolicy
323
302
  };
@@ -37,7 +37,7 @@ function resolveCliAuthorityBrokerPort(options = {}) {
37
37
  ...options,
38
38
  env: options.env ?? {}
39
39
  });
40
- return 47e3 + hashString(noloHome) % 2e3;
40
+ return 24e3 + hashString(noloHome) % 2e3;
41
41
  }
42
42
  function resolveCliAuthorityStoreDriver(options = {}) {
43
43
  return readCliAuthorityDriver(options.env ?? {}).driver;
@@ -48,7 +48,8 @@ function canonicalizeChromeConnectorToolNames(toolNames) {
48
48
  }
49
49
  var CONNECTOR_TARGET_PROPERTY = {
50
50
  type: "string",
51
- description: "Reserved and ignored for now; future multi-provider targeting."
51
+ enum: ["chrome", "firefox"],
52
+ description: `Which browser's connector serves this call: "chrome" or "firefox". Omit for the default endpoint.`
52
53
  };
53
54
  var CHROME_CONNECTOR_READ_TOOL_NAMES = [
54
55
  "browser_list_tabs",
@@ -112,7 +113,7 @@ var chromeCloseTabFunctionSchema = baseSchema(
112
113
  );
113
114
  var chromeReadPageFunctionSchema = baseSchema(
114
115
  "browser_read_page",
115
- "Read a compact view of a browser tab: visible text (hard cap 6000 chars) plus short-lived elementRefs (hard cap 35) and a pageRevision. Reuse those refs for browser_click_element and browser_type instead of guessing selectors; use region to focus a big page. Does not read cookies or profile databases.",
116
+ "Read a compact view of a browser tab: visible text (hard cap 6000 chars) plus short-lived elementRefs (hard cap 35) and a pageRevision. Reuse those refs for browser_click_element and browser_type instead of guessing selectors; use region to focus a big page. When the element list exceeds one page, continue by passing the returned nextOffset as offset. Does not read cookies or profile databases.",
116
117
  {
117
118
  tabId,
118
119
  region: {
@@ -127,6 +128,15 @@ var chromeReadPageFunctionSchema = baseSchema(
127
128
  type: "string",
128
129
  enum: ["compact", "full"],
129
130
  description: "compact (default) returns budgeted text; full raises the budget and adds capped HTML."
131
+ },
132
+ offset: {
133
+ type: "integer",
134
+ minimum: 0,
135
+ description: "Optional element offset for paging. When an element list exceeds one page, continue by passing the returned nextOffset as offset."
136
+ },
137
+ viewportOnly: {
138
+ type: "boolean",
139
+ description: "Optional. When true, only elements intersecting the current viewport are listed."
130
140
  }
131
141
  },
132
142
  ["tabId"]
@@ -173,9 +183,13 @@ var chromePressFunctionSchema = baseSchema(
173
183
  );
174
184
  var chromeScrollFunctionSchema = baseSchema(
175
185
  "browser_scroll",
176
- "Scroll a browser tab by pixel deltas.",
186
+ "Scroll the browser page or a CSS-selected container by pixel deltas; with selector and no deltas, observe the container's scroll position without moving it. Selector matching must resolve to exactly one valid element; invalid, missing, or ambiguous selectors fail without falling back to page scrolling. Results include targetBefore and targetAfter measurements for scrollTop, scrollLeft, scrollHeight, scrollWidth, clientHeight, and clientWidth.",
177
187
  {
178
188
  tabId,
189
+ selector: {
190
+ type: "string",
191
+ description: "Optional CSS selector for exactly one scroll container. When provided, only that container is scrolled; invalid, not-found, or ambiguous selectors fail without falling back. May be used without deltas to observe scroll position."
192
+ },
179
193
  deltaX: {
180
194
  type: "number",
181
195
  description: "Horizontal scroll delta in pixels."
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  dialogMessageKey
3
- } from "./chunk-3AH7LNUB.js";
3
+ } from "./chunk-5EMSBTQ6.js";
4
4
  import {
5
5
  asOptionalFiniteNumber
6
6
  } from "./chunk-WWC7I6TA.js";
@@ -10,6 +10,114 @@ var GLOBAL_DIALOG_RUNTIME_KEY = "__global__";
10
10
 
11
11
  // packages/chat/dialog/dialogRuntimeStore.ts
12
12
  var import_react = __toESM(require_react());
13
+
14
+ // packages/app/utils/localStorageState.ts
15
+ function readStorageJSON(key) {
16
+ if (typeof window === "undefined") return null;
17
+ try {
18
+ const raw = window.localStorage.getItem(key);
19
+ if (!raw) return null;
20
+ return JSON.parse(raw);
21
+ } catch {
22
+ return null;
23
+ }
24
+ }
25
+ function writeStorageJSON(key, value) {
26
+ if (typeof window === "undefined") return;
27
+ try {
28
+ window.localStorage.setItem(key, JSON.stringify(value));
29
+ } catch {
30
+ }
31
+ }
32
+
33
+ // packages/chat/dialog/mediaJobPendingPersistence.ts
34
+ var MEDIA_JOB_PENDING_STORAGE_KEY = "nolo:chat:media-job-pending:v1";
35
+ var MEDIA_JOB_PENDING_KEEP_PER_DIALOG = 10;
36
+ var currentActorId = null;
37
+ function setMediaJobPendingActor(actorId) {
38
+ currentActorId = actorId && actorId.length > 0 ? actorId : null;
39
+ }
40
+ function getMediaJobPendingActor() {
41
+ return currentActorId;
42
+ }
43
+ var actorKey = () => `@${currentActorId ?? "anon"}`;
44
+ var bucketKeyOf = (dialogKey) => dialogKey ?? GLOBAL_DIALOG_RUNTIME_KEY;
45
+ var isEntry = (value) => {
46
+ if (!value || typeof value !== "object") return false;
47
+ const entry = value;
48
+ return typeof entry.id === "string" && entry.id.length > 0 && typeof entry.name === "string";
49
+ };
50
+ var readAllActors = () => {
51
+ const raw = readStorageJSON(MEDIA_JOB_PENDING_STORAGE_KEY);
52
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) return {};
53
+ return raw;
54
+ };
55
+ var writeActorMap = (map) => {
56
+ const all = readAllActors();
57
+ all[actorKey()] = map;
58
+ writeStorageJSON(MEDIA_JOB_PENDING_STORAGE_KEY, all);
59
+ };
60
+ function readMediaJobPendingMap() {
61
+ const scoped = readAllActors()[actorKey()];
62
+ if (!scoped || typeof scoped !== "object" || Array.isArray(scoped)) return {};
63
+ const map = {};
64
+ for (const [dialogKey, entries] of Object.entries(scoped)) {
65
+ if (!Array.isArray(entries)) continue;
66
+ const valid = entries.filter(isEntry).map((entry) => ({
67
+ id: entry.id,
68
+ name: entry.name,
69
+ fileKey: typeof entry.fileKey === "string" ? entry.fileKey : void 0,
70
+ mimeType: typeof entry.mimeType === "string" ? entry.mimeType : void 0,
71
+ size: typeof entry.size === "number" ? entry.size : void 0,
72
+ durationSec: typeof entry.durationSec === "number" ? entry.durationSec : void 0,
73
+ savedAt: typeof entry.savedAt === "number" && Number.isFinite(entry.savedAt) ? entry.savedAt : 0
74
+ }));
75
+ if (valid.length) map[dialogKey] = valid;
76
+ }
77
+ return map;
78
+ }
79
+ function upsertMediaJobPendingEntry(entry) {
80
+ const map = readMediaJobPendingMap();
81
+ const dialogKey = bucketKeyOf(entry.dialogKey);
82
+ const kept = (map[dialogKey] ?? []).filter((item) => item.id !== entry.id);
83
+ kept.push({ ...entry, savedAt: Date.now() });
84
+ map[dialogKey] = kept.slice(-MEDIA_JOB_PENDING_KEEP_PER_DIALOG);
85
+ writeActorMap(map);
86
+ }
87
+ function removeMediaJobPendingEntryById(id) {
88
+ const map = readMediaJobPendingMap();
89
+ let changed = false;
90
+ for (const [dialogKey, entries] of Object.entries(map)) {
91
+ const kept = entries.filter((entry) => entry.id !== id);
92
+ if (kept.length !== entries.length) {
93
+ changed = true;
94
+ if (kept.length) map[dialogKey] = kept;
95
+ else delete map[dialogKey];
96
+ }
97
+ }
98
+ if (changed) writeActorMap(map);
99
+ }
100
+ function clearMediaJobPendingEntries(payload) {
101
+ if (payload?.all) {
102
+ writeStorageJSON(MEDIA_JOB_PENDING_STORAGE_KEY, {});
103
+ return;
104
+ }
105
+ const dialogKey = bucketKeyOf(payload?.dialogKey);
106
+ const map = readMediaJobPendingMap();
107
+ if (!(dialogKey in map)) return;
108
+ delete map[dialogKey];
109
+ writeActorMap(map);
110
+ }
111
+ function pruneMediaJobPendingEntries(dialogKey, keep = MEDIA_JOB_PENDING_KEEP_PER_DIALOG) {
112
+ const key = bucketKeyOf(dialogKey);
113
+ const map = readMediaJobPendingMap();
114
+ const entries = map[key];
115
+ if (!entries || entries.length <= keep) return;
116
+ map[key] = entries.slice(-keep);
117
+ writeActorMap(map);
118
+ }
119
+
120
+ // packages/chat/dialog/dialogRuntimeStore.ts
13
121
  var createEmptyTokenStats = () => ({
14
122
  inputTokens: 0,
15
123
  outputTokens: 0,
@@ -17,6 +125,7 @@ var createEmptyTokenStats = () => ({
17
125
  });
18
126
  var createEmptyDialogRuntimeState = () => ({
19
127
  tokens: createEmptyTokenStats(),
128
+ lastProviderInput: null,
20
129
  pendingFiles: [],
21
130
  activeControllers: {},
22
131
  pendingRawData: {},
@@ -79,21 +188,49 @@ function addPendingFile(payload) {
79
188
  const targetRuntimeKey = payload.targetDialogKey ?? payload.runtimeDialogKey ?? (payload.type === "dialog" ? activeDialogKey : payload.dialogKey);
80
189
  const runtime = ensureDialogRuntimeState(targetRuntimeKey);
81
190
  if (!runtime.pendingFiles.some((f) => f.id === payload.id)) {
82
- runtime.pendingFiles.push(payload);
191
+ runtime.pendingFiles = [...runtime.pendingFiles, payload];
192
+ if (payload.type === "media_job") {
193
+ upsertMediaJobPendingEntry({
194
+ id: payload.id,
195
+ name: payload.name,
196
+ fileKey: payload.fileKey,
197
+ mimeType: payload.mimeType,
198
+ size: payload.size,
199
+ durationSec: payload.durationSec,
200
+ // 与写入侧 bucket 推导严格同源:`dialogKey || GLOBAL_DIALOG_RUNTIME_KEY`
201
+ // (useMessageInputFiles 的 effectiveDialogKey 同规则)。不依赖
202
+ // activeDialogKey 隐式回退,保证恢复时读到的就是当初写入的 bucket。
203
+ dialogKey: payload.dialogKey ?? GLOBAL_DIALOG_RUNTIME_KEY
204
+ });
205
+ }
83
206
  notify();
84
207
  }
85
208
  return action("dialogRuntime/addPendingFile", payload);
86
209
  }
87
210
  function removePendingFile(fileId) {
88
211
  const runtime = ensureDialogRuntimeState();
89
- const fileToRemove = runtime.pendingFiles.find((f) => f.id === fileId);
212
+ let fileToRemove = runtime.pendingFiles.find((f) => f.id === fileId);
213
+ let runtimeHoldingFile = runtime;
214
+ if (!fileToRemove) {
215
+ for (const candidate of Object.values(runtimeByKey)) {
216
+ const found = candidate.pendingFiles.find((f) => f.id === fileId);
217
+ if (found) {
218
+ fileToRemove = found;
219
+ runtimeHoldingFile = candidate;
220
+ break;
221
+ }
222
+ }
223
+ }
90
224
  if (fileToRemove) {
91
225
  if (fileToRemove.pageKey) {
92
- delete runtime.pendingRawData[fileToRemove.pageKey];
226
+ delete runtimeHoldingFile.pendingRawData[fileToRemove.pageKey];
93
227
  }
94
- runtime.pendingFiles = runtime.pendingFiles.filter(
228
+ runtimeHoldingFile.pendingFiles = runtimeHoldingFile.pendingFiles.filter(
95
229
  (file) => file.id !== fileId
96
230
  );
231
+ if (fileToRemove.type === "media_job") {
232
+ removeMediaJobPendingEntryById(fileToRemove.id);
233
+ }
97
234
  notify();
98
235
  }
99
236
  return action("dialogRuntime/removePendingFile", fileId);
@@ -104,10 +241,14 @@ function clearPendingAttachments(payload) {
104
241
  runtime2.pendingFiles = [];
105
242
  runtime2.pendingRawData = {};
106
243
  });
244
+ clearMediaJobPendingEntries({ all: true });
107
245
  notify();
108
246
  return action("dialogRuntime/clearPendingAttachments", payload);
109
247
  }
110
248
  const runtime = ensureDialogRuntimeState(payload?.dialogKey);
249
+ runtime.pendingFiles.forEach((file) => {
250
+ if (file.type === "media_job") removeMediaJobPendingEntryById(file.id);
251
+ });
111
252
  runtime.pendingFiles = [];
112
253
  runtime.pendingRawData = {};
113
254
  notify();
@@ -146,10 +287,62 @@ function clearDialogTurnPhase(payload = {}) {
146
287
  return setDialogTurnPhase({ phase: null, dialogKey: payload.dialogKey, turnId: payload.turnId });
147
288
  }
148
289
  function clearDialogRuntimeState(payload) {
290
+ const runtime = runtimeByKey[payload.dialogKey];
291
+ runtime?.pendingFiles.forEach((file) => {
292
+ if (file.type === "media_job") removeMediaJobPendingEntryById(file.id);
293
+ });
149
294
  delete runtimeByKey[payload.dialogKey];
150
295
  notify();
151
296
  return action("dialogRuntime/clearDialogRuntimeState", payload);
152
297
  }
298
+ function restoreMediaJobPendingFiles(dialogKey) {
299
+ const runtimeKey = resolveDialogRuntimeKey(dialogKey);
300
+ const entries = (readMediaJobPendingMap()[runtimeKey] ?? []).slice(-MEDIA_JOB_PENDING_KEEP_PER_DIALOG);
301
+ if (!entries.length) return 0;
302
+ const runtime = ensureDialogRuntimeState(runtimeKey);
303
+ const existingIds = new Set(runtime.pendingFiles.map((file) => file.id));
304
+ let restored = 0;
305
+ for (const entry of entries) {
306
+ if (existingIds.has(entry.id)) continue;
307
+ addPendingFile({
308
+ id: entry.id,
309
+ name: entry.name,
310
+ type: "media_job",
311
+ fileKey: entry.fileKey,
312
+ mimeType: entry.mimeType,
313
+ size: entry.size,
314
+ durationSec: entry.durationSec,
315
+ trackingId: entry.id,
316
+ dialogKey: runtimeKey
317
+ });
318
+ restored += 1;
319
+ }
320
+ pruneMediaJobPendingEntries(runtimeKey);
321
+ return restored;
322
+ }
323
+ var MEDIA_NOTE_PAGE_KEY_PREFIX = "media-note:";
324
+ var isMediaNotePageReference = (pageKey) => typeof pageKey === "string" && pageKey.startsWith(MEDIA_NOTE_PAGE_KEY_PREFIX);
325
+ var getMediaJobRuntimeActor = () => getMediaJobPendingActor();
326
+ function setMediaJobRuntimeActor(actorId) {
327
+ const next = actorId && actorId.length ? actorId : null;
328
+ if (getMediaJobPendingActor() === next) return;
329
+ setMediaJobPendingActor(next);
330
+ for (const key of Object.keys(runtimeByKey)) {
331
+ const runtime = runtimeByKey[key];
332
+ const kept = runtime.pendingFiles.filter(
333
+ (f) => f.type !== "media_job" && !isMediaNotePageReference(f.pageKey)
334
+ );
335
+ if (kept.length !== runtime.pendingFiles.length) {
336
+ runtime.pendingFiles = kept;
337
+ }
338
+ for (const pageKey of Object.keys(runtime.pendingRawData)) {
339
+ if (isMediaNotePageReference(pageKey)) {
340
+ delete runtime.pendingRawData[pageKey];
341
+ }
342
+ }
343
+ }
344
+ notify();
345
+ }
153
346
  function addActiveController(payload) {
154
347
  const runtime = ensureDialogRuntimeState(payload.dialogKey);
155
348
  runtime.activeControllers[payload.messageId] = payload.controller;
@@ -204,6 +397,9 @@ function clearPendingUserInputQueue(payload) {
204
397
  }
205
398
  function tokenUsageLiveUpdate(payload) {
206
399
  const runtime = ensureDialogRuntimeState(payload.dialogKey);
400
+ if (payload.input_tokens > 0) {
401
+ runtime.lastProviderInput = { inputTokens: payload.input_tokens, observedAt: Date.now() };
402
+ }
207
403
  runtime.tokens.inputTokens += payload.input_tokens;
208
404
  runtime.tokens.outputTokens += payload.output_tokens;
209
405
  runtime.tokens.totalCost += payload.cost ?? 0;
@@ -212,15 +408,18 @@ function tokenUsageLiveUpdate(payload) {
212
408
  }
213
409
  function addPageReferenceToRuntime(payload) {
214
410
  const runtime = ensureDialogRuntimeState(payload.dialogKey);
215
- runtime.pendingFiles.push(payload.reference);
411
+ runtime.pendingFiles = [...runtime.pendingFiles, payload.reference];
216
412
  if (payload.rawData?.pageKey) {
217
413
  runtime.pendingRawData[payload.rawData.pageKey] = payload.rawData;
218
414
  }
219
415
  notify();
220
416
  }
221
417
  function applyUpdateTokensFulfilled(payload) {
222
- const runtime = runtimeByKey[payload.dialogKey];
223
- if (!runtime) return;
418
+ const runtime = ensureDialogRuntimeState(payload.dialogKey);
419
+ const observedAt = payload.observedAt ?? Date.now();
420
+ if (payload.authoritative !== false && typeof payload.input_tokens === "number" && payload.input_tokens > 0 && (!runtime.lastProviderInput || observedAt > runtime.lastProviderInput.observedAt)) {
421
+ runtime.lastProviderInput = { inputTokens: payload.input_tokens, observedAt };
422
+ }
224
423
  runtime.tokens.inputTokens = Math.max(
225
424
  0,
226
425
  runtime.tokens.inputTokens - (payload.input_tokens ?? 0)
@@ -366,6 +565,9 @@ export {
366
565
  setDialogTurnPhase,
367
566
  clearDialogTurnPhase,
368
567
  clearDialogRuntimeState,
568
+ restoreMediaJobPendingFiles,
569
+ getMediaJobRuntimeActor,
570
+ setMediaJobRuntimeActor,
369
571
  addActiveController,
370
572
  removeActiveController,
371
573
  clearActiveControllers,
@@ -379,8 +581,6 @@ export {
379
581
  deleteDialogRuntime,
380
582
  abortActiveControllers,
381
583
  getDialogRuntimeTokens,
382
- getPendingUserInputQueue,
383
- getLoopStopReason,
384
584
  getRecoveredForegroundTurn,
385
585
  selectDialogRuntimeByKey,
386
586
  selectPendingFiles,
@@ -2,7 +2,7 @@ import {
2
2
  getRecordTimestamp,
3
3
  isTombstoneRecord,
4
4
  shouldReplaceWithNextRecord
5
- } from "./chunk-GBRG75BQ.js";
5
+ } from "./chunk-D2MDMY2M.js";
6
6
 
7
7
  // packages/database/userDataMerge.ts
8
8
  var getUserDataItemTimestamp = (dataItem) => getRecordTimestamp(dataItem);