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.
- package/{_executeModel-OW3H7ICR.js → _executeModel-T7ANHTUW.js} +134 -91
- package/accountResolver-7RYB4D2P.js +300 -0
- package/action-SXJD5N5R.js +23 -0
- package/{addContentAction-B2DRF7P6.js → addContentAction-ZV774PHH.js} +20 -14
- package/{addDialogAgentAction-2P2FLTLD.js → addDialogAgentAction-A6SMKAGH.js} +26 -22
- package/{agentDeleteCommand-7IDWF6E3.js → agentDeleteCommand-4L5KCKFY.js} +181 -93
- package/{agentEmailCommands-A6XBQZBN.js → agentEmailCommands-2IMMIRO2.js} +132 -112
- package/{agentGrantCommands-M3XFO6EN.js → agentGrantCommands-HOJ3JBBQ.js} +3 -3
- package/agentListCommands-TWFLUYIZ.js +802 -0
- package/{agentMachineCommands-DQPUIMAC.js → agentMachineCommands-KIWXWT6L.js} +58 -62
- package/{agentProviderCommands-YK2BIIXZ.js → agentProviderCommands-HL6MBLCL.js} +149 -2
- package/{agentPullCommand-HF4A42D4.js → agentPullCommand-FA43RBRU.js} +7 -7
- package/agentRecordCommands-727NPCRW.js +154 -0
- package/agentRunCommand-JASIG3FZ.js +183 -0
- package/{agentRunControl-2SKCR4SB.js → agentRunControl-IFM7IGMG.js} +10 -2
- package/{agentRuntimeLocal-AK2QVJHY.js → agentRuntimeLocal-KKSQJMTE.js} +47 -50
- package/{agentSlice-O4RUQUMT.js → agentSlice-SLV57QGU.js} +23 -16
- package/{appDeleteCommands-N3XEVVYC.js → appDeleteCommands-4PL4KYRN.js} +58 -59
- package/{appDeployCommands-AWFIXYVW.js → appDeployCommands-EEEXCEB6.js} +67 -63
- package/{appDeployStatusCommands-CZRON2FO.js → appDeployStatusCommands-35ZX7T66.js} +56 -56
- package/{appGetCommands-XQIUY4TD.js → appGetCommands-WFCHXJWF.js} +56 -56
- package/{appListCommands-NNG4H36Y.js → appListCommands-XY2U6DPF.js} +57 -59
- package/{authCommand-UBJ4EWYZ.js → authCommand-QYN47CQD.js} +371 -68
- package/{authCommands-H6WKKCRW.js → authCommands-77CHYBGF.js} +12 -9
- package/{builtinSkillRegistry-ZMF6YGNO.js → builtinSkillRegistry-TDQ6JB2E.js} +13 -11
- package/{chromeCommands-2N6MEWRU.js → chromeCommands-OBBNJCLS.js} +314 -13
- package/chromeOpsCommands-3Z34RKSE.js +472 -0
- package/{chunk-ALXHV7NK.js → chunk-2GGXHQIW.js} +43 -4
- package/{localRuntimeAuthority-5W6IJRAD.js → chunk-2IXDJNZI.js} +154 -75
- package/{chunk-IVZJWTDI.js → chunk-36OMEXXR.js} +89 -21
- package/{chunk-H6A6X4EK.js → chunk-3MZAGMYY.js} +16 -0
- package/chunk-3PVYUPXK.js +40 -0
- package/chunk-3SZA4U64.js +1192 -0
- package/{chunk-ID7LNBWR.js → chunk-3T4ZG6AC.js} +1920 -644
- package/{chunk-GNMAFAIS.js → chunk-44WXLHFI.js} +1 -1
- package/{chunk-AGGIDPCZ.js → chunk-4JH2UMJR.js} +6 -0
- package/chunk-4LCOCOR5.js +50 -0
- package/chunk-4YRTZIVN.js +871 -0
- package/{chunk-N7J63Q6C.js → chunk-56GBUMO5.js} +10 -1
- package/{chunk-W7XHHYWM.js → chunk-5BHQICF2.js} +5 -1
- package/{chunk-XUWRURDF.js → chunk-5EBLANFT.js} +1 -1
- package/{chunk-3AH7LNUB.js → chunk-5EMSBTQ6.js} +33 -14
- package/{chunk-YRRASA5Q.js → chunk-5MM7NNO6.js} +113 -52
- package/chunk-5MMAK75Q.js +15 -0
- package/{chunk-TXH4IWJL.js → chunk-626KHJNX.js} +20 -11
- package/{chunk-M5PVFLD4.js → chunk-64K7WX26.js} +90 -21
- package/{chunk-AKG5W4LG.js → chunk-6CCFTVBP.js} +76 -221
- package/chunk-6MJNEXUU.js +614 -0
- package/{chunk-62IL3KQV.js → chunk-6MXDOUMH.js} +15 -3
- package/{chunk-QOKAKDPE.js → chunk-6Q7UTJKR.js} +6 -94
- package/chunk-6QDYSCPW.js +223 -0
- package/{chunk-HYZIYH2H.js → chunk-74RAWNQN.js} +56 -63
- package/chunk-7DPNBQSV.js +9 -0
- package/{chunk-IAESIMK7.js → chunk-A4MW3YZL.js} +10 -14
- package/{chunk-OMRJYNCI.js → chunk-AG7MCDLR.js} +26 -31
- package/chunk-AGIM7IMJ.js +147 -0
- package/{chunk-7CHC4W22.js → chunk-AIZE5TDM.js} +3 -3
- package/chunk-AJ3G7X2K.js +7012 -0
- package/{chunk-5GVBDNTO.js → chunk-AU7AXHUL.js} +1 -1
- package/{chunk-4H22P2JV.js → chunk-AUIJZACN.js} +2073 -1275
- package/{chunk-CIF4X6ZM.js → chunk-AWVFQMOV.js} +25 -3
- package/{chunk-YAQJJDC2.js → chunk-BJEZC5RA.js} +214 -51
- package/{chunk-RYZINGPM.js → chunk-BPMPOFWP.js} +347 -235
- package/{chunk-YUNJN43V.js → chunk-BU2YQBV4.js} +215 -28
- package/{chunk-XPRWFQQK.js → chunk-CBHGZRCE.js} +38 -12
- package/{chunk-Y3PMXGLH.js → chunk-CHCS6XPJ.js} +365 -144
- package/chunk-CHOZJMJS.js +78 -0
- package/chunk-CYJWI3NH.js +119 -0
- package/{chunk-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
- package/{chunk-3SV7RM24.js → chunk-D2QN6CTI.js} +117 -72
- package/{chunk-TZZ2WRBL.js → chunk-DFDXM2Y4.js} +20 -16
- package/{chunk-5TEEECZM.js → chunk-E2AKSW7L.js} +10 -7
- package/{chunk-RSEEDUMS.js → chunk-EDX5XSJM.js} +2 -2
- package/{chunk-QDSINZM3.js → chunk-EUGTFFO6.js} +2 -23
- package/{chunk-UNYJU5L6.js → chunk-EYLGAEB4.js} +5 -1
- package/{chunk-CU3QB4HW.js → chunk-EYWJT7A2.js} +12 -12
- package/{chunk-BNGW5ASC.js → chunk-EZVK3N5L.js} +66 -18
- package/{chunk-6FGTMQCL.js → chunk-F32Z66T4.js} +6 -10
- package/{chunk-ZOVKKMF6.js → chunk-FY4SDK2E.js} +1 -1
- package/chunk-G6OOUQWJ.js +417 -0
- package/{chunk-PQWU42UQ.js → chunk-GCKHQECX.js} +6 -6
- package/chunk-GKXCHNTE.js +15 -0
- package/{chunk-P6GMCCAT.js → chunk-GQV5KHJU.js} +78 -12
- package/{chunk-B2XUQXQX.js → chunk-HIQ4GF53.js} +191 -68
- package/{chunk-GMZLP5DV.js → chunk-HNUWUO75.js} +30 -19
- package/{chunk-UASIEDKM.js → chunk-I2XLRXVX.js} +36 -31
- package/{chunk-5UTFL4QJ.js → chunk-I2ZMGXXF.js} +10 -5
- package/chunk-I42VC5KR.js +15 -0
- package/{chunk-3BXNTXYI.js → chunk-I4SN4NUQ.js} +1199 -56
- package/chunk-IA7TRNNR.js +11 -0
- package/{chunk-WIWM4FE3.js → chunk-IJERIUXS.js} +55 -748
- package/{chunk-BIDGLJQ3.js → chunk-IK2TSJQA.js} +45 -8
- package/{chunk-CPUFH46E.js → chunk-ILU2NPWY.js} +10 -10
- package/{chunk-SLLGJZDT.js → chunk-ISQL4V7C.js} +4 -4
- package/chunk-IT3ZZRJE.js +12 -0
- package/{chunk-DY7ANLKG.js → chunk-JKMLSTZK.js} +43 -12
- package/{chunk-6TPOEJMQ.js → chunk-JZX2XLKC.js} +64 -23
- package/{chunk-27ONFIEY.js → chunk-K2AER7RX.js} +19 -12
- package/{chunk-O2OWEFII.js → chunk-KFHQQ3NO.js} +1 -1
- package/{chunk-QXGPFY6J.js → chunk-LGN377P3.js} +27 -17
- package/{chunk-L36OWPP3.js → chunk-LIQJTQRN.js} +118 -139
- package/{chunk-BFU6C242.js → chunk-NMFV26UG.js} +1 -1
- package/{chunk-5J3PYNUP.js → chunk-NYYFIKHI.js} +17 -3
- package/{chunk-6O4IK4V2.js → chunk-OFFL4DCR.js} +1 -1
- package/{chunk-B6SAMB33.js → chunk-OWYYDMGJ.js} +209 -9
- package/{chunk-KQHGZWSV.js → chunk-OXME3PEE.js} +1 -1
- package/{chunk-CTUQJVQM.js → chunk-P5QACQDK.js} +1 -1
- package/{chunk-TB3MIBRC.js → chunk-PIDUNDFS.js} +572 -430
- package/{chunk-4JMDLJAD.js → chunk-PJNFNEJE.js} +114 -37
- package/chunk-PKZKOVA5.js +11507 -0
- package/{chunk-Z4CSIXYP.js → chunk-PLSVXHSA.js} +3 -3
- package/chunk-PWTNI4N7.js +47 -0
- package/chunk-QFEW2ULV.js +42 -0
- package/{chunk-RGNEEJ3Y.js → chunk-QLQ573SU.js} +35 -9
- package/chunk-QQ56R7KS.js +88 -0
- package/chunk-QYPE3TS3.js +43 -0
- package/{chunk-HTVYCXBP.js → chunk-RN2GPWN6.js} +354 -120
- package/{chunk-ATLTFRYJ.js → chunk-ROCUB2H2.js} +280 -98
- package/{chunk-4DPP773Q.js → chunk-RSHPU4PD.js} +59 -11
- package/chunk-RVWMAFIT.js +134 -0
- package/{chunk-ESHYE7WU.js → chunk-S73EPYNC.js} +10 -7
- package/{chunk-UQNS32WZ.js → chunk-SCMHQUMK.js} +1 -1
- package/chunk-SW4S4XYB.js +1794 -0
- package/{chunk-ZUEK6A6C.js → chunk-TTH4HOJD.js} +1973 -754
- package/chunk-TY3TIUJK.js +89 -0
- package/{chunk-X2QRZXZH.js → chunk-TYJ5XFEA.js} +4 -4
- package/{chunk-ALFH24P3.js → chunk-TYYRSFBG.js} +197 -155
- package/{chunk-MST6R3E4.js → chunk-U5GPBQDG.js} +34 -22
- package/chunk-U5ICMAFV.js +14110 -0
- package/{chunk-7KVZ5LDQ.js → chunk-UBUH2TCC.js} +18 -4
- package/chunk-UEILX4EV.js +15 -0
- package/chunk-UHTDNB5Y.js +140 -0
- package/{chunk-YYLHWIW6.js → chunk-UKZX3NHN.js} +1 -1
- package/{chunk-OHOVNO7I.js → chunk-UOKFKFPO.js} +6 -3
- package/{chunk-XISEYOGH.js → chunk-USHQX6VT.js} +5 -5
- package/chunk-UUPR3TD7.js +53 -0
- package/{chunk-3DAVPNFT.js → chunk-V4EE3D54.js} +122 -107
- package/{chunk-HDLLCBRF.js → chunk-VEA7H5FG.js} +2 -2
- package/chunk-VHGD6FHV.js +116 -0
- package/chunk-VIWDGTDA.js +8 -0
- package/{chunk-GOH6RW6F.js → chunk-VJXHL6MH.js} +34 -11
- package/{chunk-4XEYAFLY.js → chunk-VL5KOY2C.js} +623 -94
- package/{chunk-EADNWBAZ.js → chunk-VP3BINY7.js} +13 -0
- package/{chunk-DXHL7G2L.js → chunk-VWW6O2TL.js} +274 -93
- package/{chunk-EOARMOVD.js → chunk-W4S6OTSC.js} +6 -3
- package/chunk-WD4XYDYC.js +567 -0
- package/chunk-WJZOQR2J.js +151 -0
- package/{chunk-AUDNYVRC.js → chunk-XETG4RIX.js} +5 -5
- package/{chunk-MX574M24.js → chunk-XI7DGLUK.js} +4 -4
- package/{chunk-3L2WKC3W.js → chunk-XPWGOTBQ.js} +8 -1
- package/chunk-XRUSXPCQ.js +514 -0
- package/{chunk-I4OPU5TK.js → chunk-XS47QOFV.js} +273 -11
- package/{chunk-S5XGT6GB.js → chunk-XZNCX52W.js} +30 -9
- package/{chunk-5OA5HMTL.js → chunk-YLMMECCH.js} +1 -1
- package/{chunk-CFT5HBGW.js → chunk-YVLQXTUB.js} +448 -12
- package/chunk-YVPQATSC.js +709 -0
- package/chunk-ZEZC7IIM.js +126 -0
- package/{chunk-ALGORS6Y.js → chunk-ZF6526IQ.js} +43 -8
- package/chunk-ZIWPQEFU.js +165 -0
- package/chunk-ZRAU6T47.js +56 -0
- package/{cliExecutor-AWYR3T33.js → cliExecutor-BWBF2MTI.js} +4 -3
- package/{clipboardy-BX4NMYHE.js → clipboardy-GCO3GT3I.js} +3 -8
- package/{commandRegistry-2KBOXZQC.js → commandRegistry-NBLZEMCW.js} +183 -107
- package/contentThunks-6AIWNSGO.js +84 -0
- package/{cooldownCommands-ZLEPIB4A.js → cooldownCommands-JFKTYS2D.js} +2 -2
- package/{createAgentAutomationAction-5UGTB26P.js → createAgentAutomationAction-4BUS65DZ.js} +53 -44
- package/createDialogAction-QAIKSCG4.js +76 -0
- package/{createPageAction-CDLDKPRM.js → createPageAction-DXCZ334C.js} +65 -54
- package/cursorProvider-YGGNMVWX.js +6123 -0
- package/{db-VQSAOWAO.js → db-2QOTXYGH.js} +11 -5
- package/{dbSlice-DQ32LYTJ.js → dbSlice-J37OGIXH.js} +19 -13
- package/{deleteFile-NX6QHCWZ.js → deleteFile-6JWDDRVP.js} +10 -6
- package/dialogCommands-YZLSJB6X.js +113 -0
- package/{dialogSlice-N3YB65G5.js → dialogSlice-PVUSMKFW.js} +53 -39
- package/{docCreateCommands-ZSLGVBZT.js → docCreateCommands-JB2RRMRJ.js} +54 -57
- package/{docDeleteCommands-5N4GVZBG.js → docDeleteCommands-AQENULNM.js} +56 -58
- package/{docReadCommands-YJSAA7AV.js → docReadCommands-DYD25YLQ.js} +53 -56
- package/{docStore-E3CEOV5Q.js → docStore-CSEBEMKP.js} +25 -16
- package/{docUpdateCommands-WEMLSW6W.js → docUpdateCommands-3GVS23QL.js} +54 -57
- package/{fetchMessages-67MEFPZR.js → fetchMessages-IIJWQ3HR.js} +5 -4
- package/{getPricing-NMMFT3YI.js → getPricing-FKK3F5EJ.js} +11 -9
- package/{handleSendMessageAction-DQAD5ERJ.js → handleSendMessageAction-G2TLYGC4.js} +422 -118
- package/index.js +11 -7
- package/{lib-FRRS27KN.js → lib-4YTWAGY7.js} +581 -248
- package/{localDialogRead-EBRS242U.js → localDialogRead-FSOMOPDZ.js} +2 -2
- package/localRuntimeAdapter-B4TAYYA7.js +244 -0
- package/localRuntimeAuthority-JDAD7CB6.js +16 -0
- package/{localRuntimeDb-3LRMNLCM.js → localRuntimeDb-CVC62PM5.js} +1 -1
- package/{machineCommands-HAP75VSG.js → machineCommands-6OBFD3XF.js} +503 -161
- package/{machineInfo-66ZFUMLE.js → machineInfo-UKPTZO5Y.js} +2 -2
- package/machineWsRunDispatch-OO7N3O3Y.js +169 -0
- package/{memberThunks-5ZXPR63F.js → memberThunks-66DH6ABQ.js} +25 -18
- package/{models-ZPU5EDF4.js → models-LAS4B2B5.js} +2 -2
- package/package.json +1 -1
- package/{providerPresetApply-DD6NGWW6.js → providerPresetApply-MY66I6NT.js} +10 -10
- package/{providerRegistry-XDRLMYGJ.js → providerRegistry-QOE2FT57.js} +13 -9
- package/{read-EPTJRAEF.js → read-DC4NUGN6.js} +12 -8
- package/{readDocTool-W4NDXNEX.js → readDocTool-NCJ5NT25.js} +1 -1
- package/{readlineWorkspace-7BC66QSX.js → readlineWorkspace-UIQN7JUR.js} +5017 -915
- package/{removeDialogAgentAction-OSYNZRX7.js → removeDialogAgentAction-E2H3OZU6.js} +29 -28
- package/{runAgentClientLoop-6E6UC3CE.js → runAgentClientLoop-GS3SGG37.js} +154 -97
- package/{runtimeDoctorCommands-ID23PNNZ.js → runtimeDoctorCommands-GIOGC5SC.js} +17 -17
- package/secretCommands-ZXZRLR3R.js +700 -0
- package/setDialogExtraReferencesAction-SITRPMYU.js +37 -0
- package/{setPrimaryDialogAgentAction-WZ7KI3YA.js → setPrimaryDialogAgentAction-U7N45TGC.js} +30 -29
- package/{chunk-SONWNI3L.js → settingThunks-Y7SVJOMZ.js} +223 -928
- package/{skillDiscovery-ZBU76COE.js → skillDiscovery-QC35EQY4.js} +2 -2
- package/{slateUtils-RIZES3PV.js → slateUtils-NGV2NMKM.js} +1 -1
- package/{spaceCommands-UJOVU4XI.js → spaceCommands-ZR5BR3GX.js} +59 -59
- package/{streamAgentChatTurn-3UXPYFNX.js → streamAgentChatTurn-4XYC33KE.js} +309 -165
- package/{switchDialogAgentAction-GMR7WN3P.js → switchDialogAgentAction-OMGBD3N2.js} +26 -22
- package/{tableCommands-G7RV3RU3.js → tableCommands-U3QDY4L6.js} +19 -17
- package/{toolApiClient-CVGWM4PN.js → toolApiClient-7WSJJJBV.js} +6 -5
- package/tools-P77EE7Q4.js +124 -0
- package/tuiSummaryLlmCaller-BM3VSTBU.js +130 -0
- package/{updateCommands-4EHDLF5J.js → updateCommands-NQXAGFM7.js} +3 -3
- package/{updateDialogTitleAction-UPFV7TDT.js → updateDialogTitleAction-CIANVPZC.js} +102 -57
- package/workloadLifecycle-36DXRZKU.js +320 -0
- package/action-GI44T4DR.js +0 -31
- package/agentListCommands-IW3GQVUP.js +0 -427
- package/agentRecordCommands-VCA76W6B.js +0 -134
- package/agentRunCommand-YNLDKVR7.js +0 -161
- package/browser-image-compression-MFDTD7K6.js +0 -1763
- package/chatQueueReduxAdapter-TJRMXMYA.js +0 -186
- package/chromeOpsCommands-IXRLN57H.js +0 -289
- package/chunk-36KZDDO5.js +0 -2415
- package/chunk-ACQD6YI2.js +0 -25363
- package/chunk-CQ3WA2NE.js +0 -299
- package/chunk-CYSYR67N.js +0 -93
- package/chunk-JBTJAPUF.js +0 -35
- package/chunk-K2CSUCHJ.js +0 -620
- package/chunk-LTRXGFMS.js +0 -83
- package/chunk-M76ECQRD.js +0 -13658
- package/chunk-MEYIRKDN.js +0 -8967
- package/chunk-OCZKATRC.js +0 -129
- package/chunk-OTGFTBLI.js +0 -13
- package/chunk-PUOC4YRO.js +0 -394
- package/chunk-PZZTFEKK.js +0 -34
- package/chunk-URMS4XY2.js +0 -10
- package/chunk-UV6VISQJ.js +0 -20
- package/chunk-VJVNU77E.js +0 -83
- package/chunk-XYJSY4KG.js +0 -13807
- package/chunk-Y5GCAMGP.js +0 -9
- package/chunk-YPREESF4.js +0 -225
- package/contentThunks-BDIQRZR6.js +0 -73
- package/createDialogAction-B7VGVEVU.js +0 -66
- package/dialogCommands-G7YBVAMC.js +0 -102
- package/levelLazyShim-GZBKODGI.js +0 -7
- package/machineWsRunDispatch-L32G7C4P.js +0 -149
- package/serverStoreFactory-YMXDF4NI.js +0 -20
- package/setDialogExtraReferencesAction-M32UYNCG.js +0 -30
- package/settingSlice-Q6EKL7EQ.js +0 -204
- package/syncMapping-N6RGXGBW.js +0 -437
- package/tools-MKYDMWA4.js +0 -111
- package/tuiSummaryLlmCaller-3YFNHCTW.js +0 -128
- package/{chunk-SV5IJK6K.js → chunk-NBTY7YJF.js} +3 -3
- package/{chunk-2SYTUTLI.js → chunk-YBNHPX4S.js} +3 -3
- package/{offlineMarxistsAgentCommand-HGXZV4XJ.js → offlineMarxistsAgentCommand-2QTHJCHV.js} +4 -4
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} from "./chunk-ZWQUWF6W.js";
|
|
2
|
+
asNonEmptyStringArray,
|
|
3
|
+
asTrimmedNonEmptyStringArray
|
|
4
|
+
} from "./chunk-I42VC5KR.js";
|
|
6
5
|
import {
|
|
7
|
-
|
|
8
|
-
} from "./chunk-
|
|
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
|
-
|
|
17
|
-
} from "./chunk-
|
|
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
|
-
...
|
|
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
|
|
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
|
-
|
|
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
|
|
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."
|
|
@@ -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.
|
|
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
|
-
|
|
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
|
|
226
|
+
delete runtimeHoldingFile.pendingRawData[fileToRemove.pageKey];
|
|
93
227
|
}
|
|
94
|
-
|
|
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.
|
|
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 =
|
|
223
|
-
|
|
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,
|