nolo-cli 0.148.0-alpha.1 → 0.151.0-alpha.2
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-NFJAMAGJ.js → _executeModel-XHAFJ2MM.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-DPUUS56Z.js} +181 -93
- package/{agentEmailCommands-4KW33JII.js → agentEmailCommands-V4P5EFLP.js} +132 -112
- package/{agentGrantCommands-M3XFO6EN.js → agentGrantCommands-HOJ3JBBQ.js} +3 -3
- package/agentListCommands-TWFLUYIZ.js +802 -0
- package/{agentMachineCommands-CMQR4RQ4.js → agentMachineCommands-MELPAZZI.js} +58 -62
- package/{agentProviderCommands-YK2BIIXZ.js → agentProviderCommands-HL6MBLCL.js} +149 -2
- package/{agentPullCommand-HF4A42D4.js → agentPullCommand-FA43RBRU.js} +7 -7
- package/agentRecordCommands-FSWSSQIO.js +154 -0
- package/agentRunCommand-GDBJVOAT.js +183 -0
- package/{agentRunControl-2SKCR4SB.js → agentRunControl-IFM7IGMG.js} +10 -2
- package/{agentRuntimeLocal-AK2QVJHY.js → agentRuntimeLocal-KKSQJMTE.js} +47 -50
- package/{agentSlice-OZ33K224.js → agentSlice-YO2ZLJMD.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-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-556RW72X.js +14110 -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-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-7MOXKPHC.js +119 -0
- package/{chunk-523WHFSL.js → chunk-7XKL25PW.js} +1973 -754
- package/{chunk-IAESIMK7.js → chunk-A4MW3YZL.js} +10 -14
- package/chunk-AGIM7IMJ.js +147 -0
- package/{chunk-7CHC4W22.js → chunk-AIZE5TDM.js} +3 -3
- package/{chunk-P4BX6FFU.js → chunk-AOCM7HPT.js} +214 -51
- 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-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-GBRG75BQ.js → chunk-D2MDMY2M.js} +1 -0
- package/{chunk-3SV7RM24.js → chunk-D2QN6CTI.js} +117 -72
- package/{chunk-5TEEECZM.js → chunk-E2AKSW7L.js} +10 -7
- package/{chunk-RSEEDUMS.js → chunk-EDX5XSJM.js} +2 -2
- package/{chunk-BKWMNZ2X.js → chunk-ES633ZS5.js} +280 -98
- 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-FJMRBOPO.js +11507 -0
- 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-T7F46O36.js → chunk-GQN2WLAI.js} +20 -11
- package/{chunk-P6GMCCAT.js → chunk-GQV5KHJU.js} +78 -12
- package/{chunk-B2XUQXQX.js → chunk-HIQ4GF53.js} +191 -68
- package/{chunk-YUWMM4US.js → chunk-HKX3ULQB.js} +34 -22
- package/{chunk-GMZLP5DV.js → chunk-HNUWUO75.js} +30 -19
- 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-CPUFH46E.js → chunk-ILU2NPWY.js} +10 -10
- package/{chunk-SLLGJZDT.js → chunk-ISQL4V7C.js} +4 -4
- package/chunk-IT3ZZRJE.js +12 -0
- package/{chunk-LPVCRQMM.js → chunk-IZ7OJB6K.js} +20 -16
- 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-FWQEKRTD.js → chunk-LTRUTOHX.js} +36 -31
- 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-DIXLJWCD.js → chunk-PCKVQXYV.js} +274 -93
- package/{chunk-4JMDLJAD.js → chunk-PJNFNEJE.js} +114 -37
- package/{chunk-Z4CSIXYP.js → chunk-PLSVXHSA.js} +3 -3
- package/{chunk-BIDGLJQ3.js → chunk-PLXDDGBK.js} +45 -8
- 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-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-T767MPHB.js → chunk-SMENBO3M.js} +354 -120
- package/{chunk-PCVVZ2MH.js → chunk-SSFDFOVT.js} +26 -31
- package/chunk-SW4S4XYB.js +1794 -0
- package/{chunk-HUFPWXFW.js → chunk-T6X3D7NB.js} +572 -430
- 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-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-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-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-2JMMBU6V.js → chunk-Y2DXOPSO.js} +1920 -644
- 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-DCFPQW22.js → chunk-Z7OJUX6S.js} +122 -107
- package/chunk-ZEZC7IIM.js +126 -0
- package/{chunk-ALGORS6Y.js → chunk-ZF6526IQ.js} +43 -8
- package/chunk-ZIWPQEFU.js +165 -0
- package/chunk-ZKZ5X2HS.js +7012 -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-YOEQUA7T.js → commandRegistry-XN7C5GHO.js} +183 -107
- package/contentThunks-5L7YQI3S.js +84 -0
- package/{cooldownCommands-ZLEPIB4A.js → cooldownCommands-JFKTYS2D.js} +2 -2
- package/{createAgentAutomationAction-5EJL6ROU.js → createAgentAutomationAction-QOPOLCRK.js} +53 -44
- package/createDialogAction-MZ66VY5Q.js +76 -0
- package/{createPageAction-75ELC64R.js → createPageAction-VQDJIXMY.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-KSXPGJB2.js → dialogSlice-6RODVYCK.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-AROBVRCR.js → docStore-ZZA3OPM5.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-EGNWHAUB.js → handleSendMessageAction-DVG5U26T.js} +619 -165
- 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-HXRHFKRC.js +244 -0
- package/localRuntimeAuthority-JDAD7CB6.js +16 -0
- package/{localRuntimeDb-3LRMNLCM.js → localRuntimeDb-CVC62PM5.js} +1 -1
- package/{machineCommands-ARZYKGGE.js → machineCommands-5KBF4RCC.js} +503 -161
- package/{machineInfo-66ZFUMLE.js → machineInfo-UKPTZO5Y.js} +2 -2
- package/machineWsRunDispatch-4OQDEDOR.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-3XOFVARF.js → readlineWorkspace-RIE62QVZ.js} +5022 -921
- package/{removeDialogAgentAction-OSYNZRX7.js → removeDialogAgentAction-E2H3OZU6.js} +29 -28
- package/{runAgentClientLoop-UMF7VZYZ.js → runAgentClientLoop-KLUUXBZS.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-GYGMYOSM.js → streamAgentChatTurn-MN2SSPGA.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-W2MOLERY.js +124 -0
- package/tuiSummaryLlmCaller-BM3VSTBU.js +130 -0
- package/{updateCommands-4EHDLF5J.js → updateCommands-NQXAGFM7.js} +3 -3
- package/{updateDialogTitleAction-4U5W4AMH.js → updateDialogTitleAction-Z4JX6REN.js} +102 -57
- package/workloadLifecycle-36DXRZKU.js +320 -0
- package/action-GI44T4DR.js +0 -31
- package/agentListCommands-IW3GQVUP.js +0 -427
- package/agentRecordCommands-4YBSYPIY.js +0 -134
- package/agentRunCommand-5MU5X5OT.js +0 -161
- package/browser-image-compression-MFDTD7K6.js +0 -1763
- package/chatQueueReduxAdapter-HVHA2HPM.js +0 -186
- package/chromeOpsCommands-IXRLN57H.js +0 -289
- package/chunk-42Z3EMC4.js +0 -25363
- package/chunk-CQ3WA2NE.js +0 -299
- package/chunk-CYSYR67N.js +0 -93
- package/chunk-IAG4FHOJ.js +0 -34
- 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-QU5A4LYX.js +0 -2415
- package/chunk-URMS4XY2.js +0 -10
- package/chunk-UV6VISQJ.js +0 -20
- package/chunk-VJVNU77E.js +0 -83
- package/chunk-WRMKCKZ3.js +0 -13807
- package/chunk-Y5GCAMGP.js +0 -9
- package/chunk-YPREESF4.js +0 -225
- package/contentThunks-AK2F3KNC.js +0 -73
- package/createDialogAction-F5WEWA47.js +0 -66
- package/dialogCommands-G7YBVAMC.js +0 -102
- package/levelLazyShim-GZBKODGI.js +0 -7
- package/machineWsRunDispatch-I7F4L532.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-DU4JXVAV.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
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Database
|
|
3
|
+
} from "./chunk-IT3ZZRJE.js";
|
|
4
|
+
import {
|
|
5
|
+
buildPrimaryExecutionTicket,
|
|
6
|
+
createDockerToolChannel,
|
|
7
|
+
dockerExecutionToolNames
|
|
8
|
+
} from "./chunk-6MJNEXUU.js";
|
|
9
|
+
import {
|
|
10
|
+
DOCKER_SANDBOX_BACKEND_ID,
|
|
11
|
+
confirmDockerSandboxStopped,
|
|
12
|
+
createDockerSandboxExecutionBackend,
|
|
13
|
+
defaultRunSbx,
|
|
14
|
+
resolveMaxActiveSandboxesFromEnv
|
|
15
|
+
} from "./chunk-YVPQATSC.js";
|
|
16
|
+
import "./chunk-PWTNI4N7.js";
|
|
17
|
+
import "./chunk-TNIX77YM.js";
|
|
18
|
+
import "./chunk-4VNS5WPM.js";
|
|
19
|
+
|
|
20
|
+
// packages/agent-runtime/docker/workloadLifecycle.ts
|
|
21
|
+
import { randomUUID } from "node:crypto";
|
|
22
|
+
import { isAbsolute } from "node:path";
|
|
23
|
+
function shQuote(value) {
|
|
24
|
+
return `'${String(value).replace(/'/g, `'\\''`)}'`;
|
|
25
|
+
}
|
|
26
|
+
function createTrustedDockerBindingAuthorizer(bindings) {
|
|
27
|
+
const map = /* @__PURE__ */ new Map();
|
|
28
|
+
for (const b of bindings) {
|
|
29
|
+
if (!b?.authorizedOwner || !b.dockerAccount || !b.credentialContextId) continue;
|
|
30
|
+
map.set(b.authorizedOwner, { authorizedOwner: b.authorizedOwner, dockerAccount: b.dockerAccount, credentialContextId: b.credentialContextId });
|
|
31
|
+
}
|
|
32
|
+
const authorizer = async ({ authenticatedCaller }) => {
|
|
33
|
+
const found = map.get(authenticatedCaller);
|
|
34
|
+
if (!found) return { allowed: false };
|
|
35
|
+
return { allowed: true, binding: { ...found } };
|
|
36
|
+
};
|
|
37
|
+
authorizer.isBound = (caller) => map.has(caller);
|
|
38
|
+
return authorizer;
|
|
39
|
+
}
|
|
40
|
+
function getTrustedDockerBindings(env) {
|
|
41
|
+
const raw = env.NOLO_DOCKER_BINDINGS;
|
|
42
|
+
if (!raw) return [];
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(raw);
|
|
45
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
46
|
+
} catch {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function createDockerBindingAuthorizer(env) {
|
|
51
|
+
return createTrustedDockerBindingAuthorizer(getTrustedDockerBindings(env));
|
|
52
|
+
}
|
|
53
|
+
var DEFAULT_MAX_ACTIVE_RUNS_PER_ACCOUNT = 3;
|
|
54
|
+
var PRE_CREATE_FAILURE_CODES = /* @__PURE__ */ new Set([
|
|
55
|
+
"quota-unverifiable",
|
|
56
|
+
"quota-insufficient",
|
|
57
|
+
"concurrency-rejected",
|
|
58
|
+
"quota-record-failed",
|
|
59
|
+
"invalid-ticket",
|
|
60
|
+
"lease-not-found",
|
|
61
|
+
"lease-mismatch",
|
|
62
|
+
"lease-released",
|
|
63
|
+
"unsupported-request"
|
|
64
|
+
]);
|
|
65
|
+
function prepareMayHaveLeftSandbox(error) {
|
|
66
|
+
const err = error;
|
|
67
|
+
if (err?.cleanupPending === true) return true;
|
|
68
|
+
const code = typeof err?.code === "string" ? err.code : void 0;
|
|
69
|
+
if (code !== void 0 && PRE_CREATE_FAILURE_CODES.has(code)) return false;
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
function resolveMaxActiveRunsPerAccount(requestedMax, env = {}) {
|
|
73
|
+
if (typeof requestedMax === "number" && Number.isInteger(requestedMax) && requestedMax > 0) return requestedMax;
|
|
74
|
+
return resolveMaxActiveSandboxesFromEnv(env) ?? DEFAULT_MAX_ACTIVE_RUNS_PER_ACCOUNT;
|
|
75
|
+
}
|
|
76
|
+
var DockerWorkloadLifecycle = class {
|
|
77
|
+
constructor(options) {
|
|
78
|
+
this.options = options;
|
|
79
|
+
this.maxActiveRunsPerAccount = resolveMaxActiveRunsPerAccount(options.maxActiveRunsPerAccount, options.env ?? {});
|
|
80
|
+
if (options.topology !== "single-host-shared-sqlite" || !isAbsolute(options.journalPath)) {
|
|
81
|
+
throw new Error("docker_atomic_admission_not_configured");
|
|
82
|
+
}
|
|
83
|
+
this.db = new Database(options.journalPath, { create: true });
|
|
84
|
+
this.db.exec("PRAGMA journal_mode=WAL; PRAGMA synchronous=FULL; PRAGMA busy_timeout=5000;");
|
|
85
|
+
this.db.exec(`CREATE TABLE IF NOT EXISTS docker_runs (
|
|
86
|
+
runId TEXT PRIMARY KEY, authenticatedCaller TEXT NOT NULL,
|
|
87
|
+
authorizedOwner TEXT NOT NULL, dockerAccount TEXT NOT NULL,
|
|
88
|
+
credentialContextId TEXT NOT NULL, sandbox TEXT NOT NULL UNIQUE,
|
|
89
|
+
state TEXT NOT NULL, cleanupPending INTEGER NOT NULL, createdAt INTEGER NOT NULL
|
|
90
|
+
);
|
|
91
|
+
DROP INDEX IF EXISTS docker_account_reservation;
|
|
92
|
+
CREATE INDEX IF NOT EXISTS docker_runs_account_active ON docker_runs(dockerAccount, state);
|
|
93
|
+
CREATE TABLE IF NOT EXISTS docker_authorization_audit (
|
|
94
|
+
id TEXT PRIMARY KEY, runId TEXT NOT NULL, authenticatedCaller TEXT NOT NULL,
|
|
95
|
+
authorizedOwner TEXT, dockerAccount TEXT, credentialContextId TEXT,
|
|
96
|
+
authorizationResult TEXT NOT NULL, accountAttestation TEXT NOT NULL DEFAULT 'operator-declared',
|
|
97
|
+
observedAt INTEGER NOT NULL
|
|
98
|
+
);`);
|
|
99
|
+
}
|
|
100
|
+
db;
|
|
101
|
+
maxActiveRunsPerAccount;
|
|
102
|
+
/** BEGIN IMMEDIATE: cleanup_pending continues to occupy the account slot. */
|
|
103
|
+
admitRun(row) {
|
|
104
|
+
const admit = this.db.transaction((r) => {
|
|
105
|
+
const { active } = this.db.query("SELECT COUNT(*) AS active FROM docker_runs WHERE dockerAccount=? AND state!='released'").get(r.dockerAccount);
|
|
106
|
+
if (active >= this.maxActiveRunsPerAccount) throw new Error("docker_atomic_admission_rejected_account_limit");
|
|
107
|
+
this.db.query("INSERT INTO docker_runs VALUES (?, ?, ?, ?, ?, ?, 'cleanup_pending', 1, ?)").run(
|
|
108
|
+
r.runId,
|
|
109
|
+
r.authenticatedCaller,
|
|
110
|
+
r.authorizedOwner,
|
|
111
|
+
r.dockerAccount,
|
|
112
|
+
r.credentialContextId,
|
|
113
|
+
r.sandbox,
|
|
114
|
+
Date.now()
|
|
115
|
+
);
|
|
116
|
+
});
|
|
117
|
+
try {
|
|
118
|
+
admit.immediate(row);
|
|
119
|
+
} catch (error) {
|
|
120
|
+
const message = error instanceof Error ? error.message : "";
|
|
121
|
+
if (message === "docker_atomic_admission_rejected_account_limit") throw error;
|
|
122
|
+
throw new Error("docker_atomic_admission_rejected");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
close() {
|
|
126
|
+
this.db.close();
|
|
127
|
+
}
|
|
128
|
+
audit(runId, caller, result, binding) {
|
|
129
|
+
this.db.query(`INSERT INTO docker_authorization_audit VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(
|
|
130
|
+
randomUUID(),
|
|
131
|
+
runId,
|
|
132
|
+
caller,
|
|
133
|
+
binding?.authorizedOwner ?? null,
|
|
134
|
+
binding?.dockerAccount ?? null,
|
|
135
|
+
binding?.credentialContextId ?? null,
|
|
136
|
+
result,
|
|
137
|
+
"operator-declared",
|
|
138
|
+
Date.now()
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
async stopAndConfirm(row) {
|
|
142
|
+
const deps = this.options.resolveAccount(row);
|
|
143
|
+
const runSbx = deps.runSbx ?? defaultRunSbx;
|
|
144
|
+
this.db.query("UPDATE docker_runs SET state='cleanup_pending', cleanupPending=1 WHERE runId=? AND state!='released'").run(row.runId);
|
|
145
|
+
try {
|
|
146
|
+
await runSbx(["--cloud", "stop", row.sandbox], { timeoutMs: 1e4 });
|
|
147
|
+
} catch {
|
|
148
|
+
}
|
|
149
|
+
const stopConfirm = { attempts: 10, delayMs: 2e3, ...this.options.stopConfirm };
|
|
150
|
+
if (!await confirmDockerSandboxStopped(runSbx, row.sandbox, 1e4, stopConfirm)) {
|
|
151
|
+
throw new Error("docker_stop_unverified_cleanup_pending");
|
|
152
|
+
}
|
|
153
|
+
this.db.query("UPDATE docker_runs SET state='released', cleanupPending=0 WHERE runId=?").run(row.runId);
|
|
154
|
+
}
|
|
155
|
+
async recover() {
|
|
156
|
+
const rows = this.db.query("SELECT * FROM docker_runs WHERE state!='released'").all();
|
|
157
|
+
const released = [], pending = [];
|
|
158
|
+
for (const row of rows) {
|
|
159
|
+
try {
|
|
160
|
+
if (!await this.options.isRunInactive?.(row.runId)) {
|
|
161
|
+
pending.push(row.runId);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
await this.stopAndConfirm(row);
|
|
165
|
+
released.push(row.runId);
|
|
166
|
+
} catch {
|
|
167
|
+
pending.push(row.runId);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return { released, pending };
|
|
171
|
+
}
|
|
172
|
+
async run(input, body) {
|
|
173
|
+
const { runId, authenticatedCaller, grant, signal } = input;
|
|
174
|
+
if (!runId || !authenticatedCaller) throw new Error("docker_authenticated_identity_required");
|
|
175
|
+
let decision;
|
|
176
|
+
try {
|
|
177
|
+
decision = await this.options.authorize?.({ authenticatedCaller, runId }) ?? { allowed: false };
|
|
178
|
+
} catch {
|
|
179
|
+
this.audit(runId, authenticatedCaller, "denied");
|
|
180
|
+
throw new Error("docker_account_binding_denied");
|
|
181
|
+
}
|
|
182
|
+
const binding = decision.allowed ? decision.binding : void 0;
|
|
183
|
+
if (!binding?.authorizedOwner || !binding.dockerAccount || !binding.credentialContextId) {
|
|
184
|
+
this.audit(runId, authenticatedCaller, "denied");
|
|
185
|
+
throw new Error("docker_account_binding_denied");
|
|
186
|
+
}
|
|
187
|
+
if (binding.authorizedOwner !== authenticatedCaller) {
|
|
188
|
+
this.audit(runId, authenticatedCaller, "denied", binding);
|
|
189
|
+
throw new Error("docker_caller_mismatch");
|
|
190
|
+
}
|
|
191
|
+
this.audit(runId, authenticatedCaller, "allowed", binding);
|
|
192
|
+
if (signal?.aborted) throw new Error("docker_run_cancelled");
|
|
193
|
+
const ticket = buildPrimaryExecutionTicket(grant, "oneshot");
|
|
194
|
+
if (ticket.callerUserId && ticket.callerUserId !== authenticatedCaller) {
|
|
195
|
+
this.audit(runId, authenticatedCaller, "denied", binding);
|
|
196
|
+
throw new Error("docker_caller_mismatch");
|
|
197
|
+
}
|
|
198
|
+
const deps = this.options.resolveAccount(binding);
|
|
199
|
+
if (!deps.kvStore || !deps.quotaProvider) throw new Error("docker_account_backend_not_configured");
|
|
200
|
+
if (deps.dockerAccount && deps.dockerAccount !== binding.dockerAccount) throw new Error("docker_quota_account_mismatch");
|
|
201
|
+
if (deps.owner && deps.owner !== binding.authorizedOwner) throw new Error("docker_quota_owner_mismatch");
|
|
202
|
+
const row = { ...binding, runId, authenticatedCaller, sandbox: `nolo-run-${randomUUID()}`, state: "cleanup_pending" };
|
|
203
|
+
this.admitRun(row);
|
|
204
|
+
let active = true;
|
|
205
|
+
let inFlight = Promise.resolve();
|
|
206
|
+
let backend;
|
|
207
|
+
let lease;
|
|
208
|
+
let completed = false, bodyReached = false, mayHaveSandbox = false;
|
|
209
|
+
let prepareFailureCode;
|
|
210
|
+
try {
|
|
211
|
+
backend = createDockerSandboxExecutionBackend({
|
|
212
|
+
...deps,
|
|
213
|
+
owner: binding.authorizedOwner,
|
|
214
|
+
dockerAccount: binding.dockerAccount,
|
|
215
|
+
sandboxName: row.sandbox,
|
|
216
|
+
...typeof deps.quotaVerify === "boolean" ? { quotaVerify: deps.quotaVerify } : typeof this.options.quotaVerify === "boolean" ? { quotaVerify: this.options.quotaVerify } : {},
|
|
217
|
+
maxActiveSandboxesPerAccount: deps.maxActiveSandboxesPerAccount ?? resolveMaxActiveSandboxesFromEnv(this.options.env ?? {}) ?? this.maxActiveRunsPerAccount
|
|
218
|
+
});
|
|
219
|
+
try {
|
|
220
|
+
lease = await backend.prepare(ticket);
|
|
221
|
+
mayHaveSandbox = true;
|
|
222
|
+
} catch (prepareError) {
|
|
223
|
+
mayHaveSandbox = prepareMayHaveLeftSandbox(prepareError);
|
|
224
|
+
prepareFailureCode = typeof prepareError?.code === "string" ? prepareError.code : void 0;
|
|
225
|
+
throw prepareError;
|
|
226
|
+
}
|
|
227
|
+
this.db.query("UPDATE docker_runs SET state='active' WHERE runId=?").run(runId);
|
|
228
|
+
bodyReached = true;
|
|
229
|
+
const boundBackend = backend, boundLease = lease;
|
|
230
|
+
const workload = { kind: "docker", channel: createDockerToolChannel(grant, {
|
|
231
|
+
supportedToolNames: [...dockerExecutionToolNames],
|
|
232
|
+
execute: (request) => {
|
|
233
|
+
const job = inFlight.then(async () => {
|
|
234
|
+
if (!active || signal?.aborted || request.signal?.aborted) throw new Error("docker_run_not_active");
|
|
235
|
+
const argv = request.argv !== void 0 && request.argv.length > 0 ? [...request.argv] : request.command !== void 0 ? ["bash", "-lc", request.cwd !== void 0 ? `cd ${shQuote(request.cwd)} && ${request.command}` : request.command] : void 0;
|
|
236
|
+
if (!argv) throw new Error("docker_request_missing_command");
|
|
237
|
+
const result2 = await boundBackend.execute(boundLease, { kind: "command", argv });
|
|
238
|
+
return JSON.stringify(result2);
|
|
239
|
+
});
|
|
240
|
+
inFlight = job.catch(() => void 0);
|
|
241
|
+
return job;
|
|
242
|
+
}
|
|
243
|
+
}) };
|
|
244
|
+
const runtime = {
|
|
245
|
+
exec: (argv) => {
|
|
246
|
+
const job = inFlight.then(async () => {
|
|
247
|
+
if (!active || signal?.aborted) throw new Error("docker_run_not_active");
|
|
248
|
+
const result2 = await boundBackend.execute(boundLease, { kind: "command", argv: [...argv] });
|
|
249
|
+
const output = result2?.output;
|
|
250
|
+
const stdout = typeof output === "string" ? output : typeof output?.stdout === "string" ? output.stdout : "";
|
|
251
|
+
return {
|
|
252
|
+
ok: result2?.ok === true,
|
|
253
|
+
stdout,
|
|
254
|
+
exitCode: typeof result2?.exitCode === "number" ? result2.exitCode : null
|
|
255
|
+
};
|
|
256
|
+
});
|
|
257
|
+
inFlight = job.catch(() => void 0);
|
|
258
|
+
return job;
|
|
259
|
+
},
|
|
260
|
+
upload: async (localPath, remotePath) => {
|
|
261
|
+
const sent = await (deps.runSbx ?? defaultRunSbx)(
|
|
262
|
+
["--cloud", "cp", "-L", localPath, `${row.sandbox}:${remotePath}`],
|
|
263
|
+
{ timeoutMs: 10 * 6e4 }
|
|
264
|
+
);
|
|
265
|
+
if (sent.exitCode === 0) return { ok: true, detail: "copied" };
|
|
266
|
+
const stderr = String(sent.stderr ?? "").slice(0, 200);
|
|
267
|
+
return { ok: false, detail: `sbx cp exit ${String(sent.exitCode)}${stderr ? `: ${stderr}` : ""}` };
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
const result = await body(workload, runtime);
|
|
271
|
+
completed = true;
|
|
272
|
+
return result;
|
|
273
|
+
} finally {
|
|
274
|
+
active = false;
|
|
275
|
+
await inFlight;
|
|
276
|
+
if (mayHaveSandbox) {
|
|
277
|
+
this.db.query("UPDATE docker_runs SET state='cleanup_pending' WHERE runId=?").run(runId);
|
|
278
|
+
if (lease === void 0) {
|
|
279
|
+
this.audit(runId, authenticatedCaller, `cleanup-after-create-without-lease:${prepareFailureCode ?? "unknown"}`, binding);
|
|
280
|
+
}
|
|
281
|
+
const releaseTarget = lease ?? {
|
|
282
|
+
leaseId: row.sandbox,
|
|
283
|
+
backendId: DOCKER_SANDBOX_BACKEND_ID,
|
|
284
|
+
ticketId: ticket.ticketId,
|
|
285
|
+
grantId: ticket.grantId,
|
|
286
|
+
createdAt: Date.now(),
|
|
287
|
+
readableRoots: [],
|
|
288
|
+
writableRoots: [],
|
|
289
|
+
metadata: { sandboxName: row.sandbox, leaseRecoveredBeforeHandoff: true }
|
|
290
|
+
};
|
|
291
|
+
if (backend) {
|
|
292
|
+
try {
|
|
293
|
+
await backend.release(releaseTarget, signal?.aborted ? "cancelled" : completed ? "completed" : "failed");
|
|
294
|
+
} catch {
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
await this.stopAndConfirm(row);
|
|
299
|
+
} catch (cleanupError) {
|
|
300
|
+
const detail = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);
|
|
301
|
+
this.audit(runId, authenticatedCaller, `cleanup_pending_unverified:${detail}`, binding);
|
|
302
|
+
console.warn(`[dockerWorkloadLifecycle] cleanup_pending run=${runId} sandbox=${row.sandbox}: ${detail}`);
|
|
303
|
+
if (!bodyReached || completed) throw cleanupError;
|
|
304
|
+
}
|
|
305
|
+
} else {
|
|
306
|
+
this.db.query("UPDATE docker_runs SET state='released', cleanupPending=0 WHERE runId=? AND state!='released'").run(runId);
|
|
307
|
+
this.audit(runId, authenticatedCaller, `prepare-failed-released:${prepareFailureCode ?? "unknown"}`, binding);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
export {
|
|
313
|
+
DEFAULT_MAX_ACTIVE_RUNS_PER_ACCOUNT,
|
|
314
|
+
DockerWorkloadLifecycle,
|
|
315
|
+
createDockerBindingAuthorizer,
|
|
316
|
+
createTrustedDockerBindingAuthorizer,
|
|
317
|
+
getTrustedDockerBindings,
|
|
318
|
+
resolveMaxActiveRunsPerAccount,
|
|
319
|
+
shQuote
|
|
320
|
+
};
|
package/action-GI44T4DR.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
shareResourceAction
|
|
3
|
-
} from "./chunk-CU3QB4HW.js";
|
|
4
|
-
import "./chunk-SONWNI3L.js";
|
|
5
|
-
import "./chunk-Y5GCAMGP.js";
|
|
6
|
-
import "./chunk-QDSINZM3.js";
|
|
7
|
-
import "./chunk-KX6YBIHG.js";
|
|
8
|
-
import "./chunk-HYZIYH2H.js";
|
|
9
|
-
import "./chunk-7CHC4W22.js";
|
|
10
|
-
import "./chunk-3AH7LNUB.js";
|
|
11
|
-
import "./chunk-WWC7I6TA.js";
|
|
12
|
-
import "./chunk-QSJ3HFEF.js";
|
|
13
|
-
import "./chunk-IAESIMK7.js";
|
|
14
|
-
import "./chunk-WIWM4FE3.js";
|
|
15
|
-
import "./chunk-QOKAKDPE.js";
|
|
16
|
-
import "./chunk-SEJ5OS6F.js";
|
|
17
|
-
import "./chunk-OW765XBU.js";
|
|
18
|
-
import "./chunk-GBRG75BQ.js";
|
|
19
|
-
import "./chunk-KUG52IAP.js";
|
|
20
|
-
import "./chunk-BNGW5ASC.js";
|
|
21
|
-
import "./chunk-M2EJHDJP.js";
|
|
22
|
-
import "./chunk-3EUW3WEO.js";
|
|
23
|
-
import "./chunk-U6VC4MU4.js";
|
|
24
|
-
import "./chunk-LCBAMY2M.js";
|
|
25
|
-
import "./chunk-4SN6J65J.js";
|
|
26
|
-
import "./chunk-CF7PE763.js";
|
|
27
|
-
import "./chunk-G3SUCT4W.js";
|
|
28
|
-
import "./chunk-4VNS5WPM.js";
|
|
29
|
-
export {
|
|
30
|
-
shareResourceAction
|
|
31
|
-
};
|