nolo-cli 0.157.0-alpha.1 → 0.157.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{_executeModel-5WS2PA62.js → _executeModel-ZIQHOREX.js} +55 -55
- package/{accountResolver-7RYB4D2P.js → accountResolver-55EDKEIK.js} +1 -1
- package/{action-ZJYUBXFC.js → action-GPPJC5TI.js} +5 -5
- package/{addContentAction-TVHB4526.js → addContentAction-XJQEJ4XW.js} +8 -8
- package/{addDialogAgentAction-FDPBU6K6.js → addDialogAgentAction-5WZX5CAY.js} +7 -7
- package/{agentDeleteCommand-Q6M4F3U6.js → agentDeleteCommand-LQSOJEXY.js} +75 -76
- package/{agentEmailCommands-FNH6FEHS.js → agentEmailCommands-HTPKXONW.js} +78 -79
- package/{agentListCommands-JUNMFS6E.js → agentListCommands-GOCGOQUB.js} +36 -36
- package/{agentMachineCommands-VNLDEKNT.js → agentMachineCommands-T7DAZG77.js} +35 -32
- package/{agentProviderCommands-X2HQE6HY.js → agentProviderCommands-CXBHNONN.js} +5 -5
- package/{agentPullCommand-FA43RBRU.js → agentPullCommand-GXXEDOSA.js} +4 -4
- package/{agentRecordCommands-47XXRVPI.js → agentRecordCommands-HSW3RJ4H.js} +72 -73
- package/{agentRunCommand-QEXFJUXQ.js → agentRunCommand-TIRJ57DK.js} +75 -75
- package/{agentRunControl-2C5GM3BW.js → agentRunControl-QWFFIAQY.js} +9 -7
- package/{agentRuntimeLocal-O5GDAFTN.js → agentRuntimeLocal-J6I63NZC.js} +21 -19
- package/{agentSlice-E3XS5FTQ.js → agentSlice-JNM3HF3V.js} +8 -8
- package/{appDeleteCommands-C2J5RQ3I.js → appDeleteCommands-KKLAK2UR.js} +31 -29
- package/{appDeployCommands-3YRK7PSU.js → appDeployCommands-PXWK4FAX.js} +31 -29
- package/{appDeployStatusCommands-FPAX7MOK.js → appDeployStatusCommands-3NGWDZTX.js} +31 -29
- package/{appGetCommands-XAC2V766.js → appGetCommands-APWYPEO3.js} +31 -29
- package/{appListCommands-ZJL2W5O7.js → appListCommands-OP7IRALO.js} +31 -29
- package/{authCommand-J3XILHWW.js → authCommand-3Z52KJID.js} +22 -302
- package/{authCommands-77CHYBGF.js → authCommands-QOCKVPX3.js} +5 -5
- package/{builtinSkillRegistry-A6VSPJEJ.js → builtinSkillRegistry-LJV7FHNI.js} +4 -4
- package/{chromeCommands-OBBNJCLS.js → chromeCommands-IY4NVSXZ.js} +17 -10
- package/{chunk-SW4S4XYB.js → chunk-2AB2HA4M.js} +84 -34
- package/{chunk-C5VPAHIU.js → chunk-32ZKZET7.js} +1 -1
- package/{chunk-XPWGOTBQ.js → chunk-3L2WKC3W.js} +1 -8
- package/{chunk-3XZKV7QQ.js → chunk-3L5MSPWX.js} +1 -1
- package/{chunk-QLQ573SU.js → chunk-3M52COK5.js} +120 -0
- package/{chunk-VSOWPETY.js → chunk-4226O6F7.js} +10 -10
- package/{chunk-Z6KQDSZW.js → chunk-43OFVLWJ.js} +6 -6
- package/{chunk-TJ2VPCBE.js → chunk-4JCAW7TO.js} +2 -2
- package/{chunk-6TF64IF2.js → chunk-4L4K6YR7.js} +16 -2
- package/{chunk-PEO24UB5.js → chunk-5E5VB7PS.js} +324 -57
- package/{chunk-ZD2BLOY6.js → chunk-5EDQTOUR.js} +7 -7
- package/{chunk-HKT6QXP3.js → chunk-5IKRTRRR.js} +5 -5
- package/{chunk-P5QACQDK.js → chunk-62TBKWTV.js} +1 -1
- package/{chunk-TRW43TSC.js → chunk-6EQD4AQL.js} +41 -1
- package/{chunk-YLMMECCH.js → chunk-6XIE5ZGI.js} +1 -1
- package/{chunk-OH2M7WEU.js → chunk-6Y3ETA2Y.js} +3 -3
- package/{chunk-7A4LJCDR.js → chunk-B3ZIFOFI.js} +5 -5
- package/{chunk-WZ6OU4NX.js → chunk-BAWAKW7X.js} +2 -2
- package/{chunk-UUPR3TD7.js → chunk-BL4HFN6L.js} +2 -4
- package/{chunk-2GGXHQIW.js → chunk-BLVSFYQ3.js} +4 -2
- package/{chunk-HP6O6LTV.js → chunk-CDLP56BS.js} +9 -9
- package/{chunk-UTIMX333.js → chunk-DJ2BOPJY.js} +1 -1
- package/{chunk-36OMEXXR.js → chunk-DLV3H464.js} +8 -8
- package/{chunk-CE7PIHQD.js → chunk-ESMZW5PE.js} +3 -3
- package/{chunk-PSJWPSKS.js → chunk-EWO77ZGF.js} +9 -43
- package/{chunk-ZWG3C7VI.js → chunk-F3SOW2EU.js} +81 -1
- package/{chunk-FY4SDK2E.js → chunk-FDLDMJTM.js} +1 -1
- package/{chunk-KOB75UNU.js → chunk-FHG46N5C.js} +53 -4
- package/{chunk-7KYVUFDG.js → chunk-G3VYRPTV.js} +5 -267
- package/{chunk-DW7MGLMG.js → chunk-GGUTTH6C.js} +35 -207
- package/{chunk-6MJNEXUU.js → chunk-HGDKT2D6.js} +4 -0
- package/{chunk-B2EGWZJG.js → chunk-I7S63QUU.js} +1 -1
- package/{chunk-ROPSATAB.js → chunk-IF7V3CBU.js} +1 -1
- package/chunk-IKOKYBYJ.js +2685 -0
- package/{chunk-T6CBQ6BN.js → chunk-INFHX73M.js} +1 -1
- package/{chunk-YBNHPX4S.js → chunk-IW64YHXL.js} +155 -31
- package/{chunk-K43ZF2C3.js → chunk-JPPQ3GUO.js} +1 -1
- package/{chunk-TZTWMGE3.js → chunk-JWEXJ573.js} +3 -3
- package/{chunk-RUNKPFM5.js → chunk-K6Y5T4GE.js} +12 -8
- package/{chunk-MVJVF4ED.js → chunk-KESKU5BG.js} +18 -17
- package/{chunk-I2ZMGXXF.js → chunk-KFHREHUQ.js} +1 -1
- package/{chunk-3C2QLERX.js → chunk-KMDDG73K.js} +1 -1
- package/{chunk-5MM7NNO6.js → chunk-KSTEXKL6.js} +78 -39
- package/{chunk-EM3YOZJ4.js → chunk-L2JMH4I5.js} +3 -3
- package/{chunk-MM3662RS.js → chunk-LPO6AMQU.js} +780 -64
- package/{chunk-D4OWHT5Y.js → chunk-MAYW6V3E.js} +2 -2
- package/{chunk-IPAW7XLD.js → chunk-MFVOJ6KF.js} +2 -2
- package/{chunk-FDT27L7S.js → chunk-MLEANT7D.js} +19 -17
- package/{chunk-7GC3EKUG.js → chunk-MMSQTZCJ.js} +3 -3
- package/{chunk-XFKZ3MCV.js → chunk-MR3ITQEV.js} +344 -88
- package/{chunk-CBHGZRCE.js → chunk-MYOH447Z.js} +1 -1
- package/{chunk-6MPAEODB.js → chunk-NHEWV5FD.js} +17 -3
- package/{chunk-ZEHTARJA.js → chunk-NLFTBC6S.js} +321 -150
- package/{chunk-SKPPKHD3.js → chunk-OLUKIUX6.js} +2 -2
- package/{chunk-SUKSWFLP.js → chunk-PIG2IUVZ.js} +1 -1
- package/{chunk-SEJ5OS6F.js → chunk-PXYBUFDB.js} +4 -0
- package/{chunk-2MTE2PEH.js → chunk-QA2C5NKI.js} +5 -739
- package/{chunk-L6EQV5OC.js → chunk-QXZH5UDF.js} +3 -3
- package/{chunk-TNIX77YM.js → chunk-R5GO3YZP.js} +34 -1
- package/{chunk-X5SUT4CN.js → chunk-R7GCGOGZ.js} +6 -6
- package/{chunk-4Z245KOA.js → chunk-SH3XD4E2.js} +8 -4
- package/{chunk-JGRPBIZZ.js → chunk-SQX235S2.js} +1 -1
- package/chunk-TT644UJD.js +188 -0
- package/{chunk-IYBIRCQV.js → chunk-U34KT53V.js} +29 -11
- package/{chunk-ANJTRG52.js → chunk-ULQAD7ZY.js} +18 -43
- package/{chunk-QDA4Y5O6.js → chunk-UVYSBQ2M.js} +21 -17
- package/{chunk-I2RMFLLH.js → chunk-V7PCFWX3.js} +1 -1
- package/{chunk-HXHSTRGH.js → chunk-VYNMQ6HW.js} +0 -27
- package/{chunk-G47IPDOK.js → chunk-W7FGZRLK.js} +1 -1
- package/{chunk-7BSQK2UC.js → chunk-WRCZXJ4N.js} +2 -2
- package/{chunk-KX6LPG7W.js → chunk-WYJTNSVL.js} +9 -9
- package/{chunk-H4KACZMG.js → chunk-XZIW3Q5B.js} +271 -138
- package/chunk-Y5GCAMGP.js +9 -0
- package/{chunk-JZX2XLKC.js → chunk-YCRROBDY.js} +1 -1
- package/{chunk-FPWT3RH2.js → chunk-YN5DT4JS.js} +22 -22
- package/{chunk-SCJD2PNK.js → chunk-YPG7TUQD.js} +3 -3
- package/{chunk-EJU23ST5.js → chunk-ZKVS36H3.js} +5069 -3730
- package/{chunk-YANF2RR4.js → chunk-ZPKUJROL.js} +1 -1
- package/{chunk-TYND6RDQ.js → chunk-ZZDVBZOP.js} +74 -3
- package/{commandRegistry-OUBQIF62.js → commandRegistry-DR2RPWK6.js} +88 -96
- package/{contentThunks-B3FRQGP7.js → contentThunks-CSJDJDEJ.js} +21 -21
- package/{createAgentAutomationAction-T2YFJ6MY.js → createAgentAutomationAction-ISEUEQSY.js} +21 -21
- package/{createDialogAction-2NFGFBXW.js → createDialogAction-HUCFOZY3.js} +25 -25
- package/{createPageAction-LDAVZDN7.js → createPageAction-DT5CYXCL.js} +24 -25
- package/{dbSlice-5QGKMQLO.js → dbSlice-6PVPY44C.js} +7 -7
- package/{deleteFile-EW6QNRRT.js → deleteFile-YM6NDPAR.js} +5 -5
- package/{dialogCommands-ZLBEAQHE.js → dialogCommands-3W6AIUXT.js} +35 -32
- package/{dialogSlice-64S3J6CP.js → dialogSlice-WJEEPG4W.js} +20 -20
- package/{dist-NJC2W7I4.js → dist-Q2JSMAKA.js} +7 -361
- package/{docCreateCommands-XOG5BBFQ.js → docCreateCommands-KQHQNLRX.js} +32 -30
- package/{docDeleteCommands-NCW3BBRX.js → docDeleteCommands-O3DWFX2W.js} +33 -31
- package/{docReadCommands-OT7X44Y3.js → docReadCommands-2U2BUONC.js} +32 -30
- package/{docStore-NIP7OO4I.js → docStore-7JPYT25V.js} +8 -8
- package/{docUpdateCommands-JW7OWW2J.js → docUpdateCommands-MF3C52XI.js} +32 -30
- package/{getPricing-TX35D7PI.js → getPricing-XQ3N3RBP.js} +2 -2
- package/{handleSendMessageAction-TOKA7ED7.js → handleSendMessageAction-BV5FMID4.js} +43 -39
- package/index.js +8 -8
- package/{localRuntimeAdapter-EQM6LFYC.js → localRuntimeAdapter-6FBEJJ4D.js} +70 -69
- package/{localRuntimeAuthority-JDAD7CB6.js → localRuntimeAuthority-BPN5OAQG.js} +2 -2
- package/{localRuntimeDb-CVC62PM5.js → localRuntimeDb-QIVAXMUL.js} +1 -1
- package/{machineCommands-WJ7FZ67T.js → machineCommands-WCAFDI5N.js} +80 -79
- package/{machineWsRunDispatch-BQT4DEA2.js → machineWsRunDispatch-ZF6BBQ3X.js} +70 -71
- package/{memberThunks-KRV5YXOB.js → memberThunks-AZINUM4S.js} +10 -10
- package/package.json +6 -2
- package/{profileConfig-ZGOFORWV.js → profileConfig-KN3N2BLF.js} +7 -1
- package/{providerPresetApply-CRZFMQD5.js → providerPresetApply-PKUOHQJT.js} +5 -5
- package/{providerRegistry-7IS43D3X.js → providerRegistry-HNQLIFN2.js} +5 -5
- package/{read-5KAZHHDM.js → read-7JPIWRBQ.js} +5 -5
- package/{readDocTool-5QO34OSX.js → readDocTool-AAQTB2Y3.js} +1 -1
- package/{readlineWorkspace-JHJSU5DS.js → readlineWorkspace-I5MHMEUE.js} +375 -200
- package/{removeDialogAgentAction-6X63HMI3.js → removeDialogAgentAction-RMVRILLK.js} +9 -9
- package/{runAgentClientLoop-5QIGEALK.js → runAgentClientLoop-TSNSRQEP.js} +59 -54
- package/{runtimeDoctorCommands-56NWKNON.js → runtimeDoctorCommands-MMCP4B4U.js} +12 -12
- package/{secretCommands-ZXZRLR3R.js → secretCommands-DNY56NSU.js} +11 -1
- package/{setDialogExtraReferencesAction-4MAYKKYW.js → setDialogExtraReferencesAction-L3V7JTMG.js} +8 -8
- package/{setPrimaryDialogAgentAction-EGBAMREH.js → setPrimaryDialogAgentAction-X52JQGTJ.js} +9 -9
- package/settingThunks-N6XFWPOU.js +923 -0
- package/{spaceCommands-ZWDPTURU.js → spaceCommands-NDPGHDMD.js} +29 -27
- package/{streamAgentChatTurn-456DWXNY.js → streamAgentChatTurn-RJLDV4WZ.js} +154 -95
- package/{switchDialogAgentAction-YBKTD6DO.js → switchDialogAgentAction-ZJ5CGU7J.js} +7 -7
- package/{tableCommands-U3QDY4L6.js → tableCommands-IVC5S7Y3.js} +11 -11
- package/{toolApiClient-7WSJJJBV.js → toolApiClient-HGNO53TC.js} +2 -2
- package/{tools-IWNXKK4Y.js → tools-X6QNIYFJ.js} +43 -44
- package/{tuiSummaryLlmCaller-KLK6K3Q3.js → tuiSummaryLlmCaller-FESHBDTT.js} +7 -7
- package/{updateCommands-NQXAGFM7.js → updateCommands-FJHGWD3Q.js} +5 -3
- package/{updateDialogTitleAction-SX53FZWO.js → updateDialogTitleAction-6LURCTMG.js} +21 -21
- package/{workloadLifecycle-36DXRZKU.js → workloadLifecycle-6O6PMISX.js} +2 -2
- package/chunk-IA7TRNNR.js +0 -11
- package/chunk-UKZX3NHN.js +0 -48
- package/chunk-VAZHH6FO.js +0 -7012
- package/chunk-W4S6OTSC.js +0 -35
- package/clipboardy-GCO3GT3I.js +0 -11793
- package/settingThunks-FTDRZNSJ.js +0 -1371
- package/{agentGrantCommands-HOJ3JBBQ.js → agentGrantCommands-5DPHYEKP.js} +3 -3
- package/{chromeOpsCommands-3Z34RKSE.js → chromeOpsCommands-GZVVK7HU.js} +4 -4
- package/{chunk-XETG4RIX.js → chunk-AETZ7AD6.js} +4 -4
- package/{chunk-2IXDJNZI.js → chunk-GAGGEA7D.js} +3 -3
- package/{memoryCommands-CUNBFRVS.js → memoryCommands-ZS3VQJAL.js} +3 -3
- package/{offlineMarxistsAgentCommand-2QTHJCHV.js → offlineMarxistsAgentCommand-3GLX4QQY.js} +3 -3
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
parseFlagWithOptionalValue,
|
|
4
4
|
runCloudflareOAuthLogin,
|
|
5
5
|
upsertEnvVariable
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-I7S63QUU.js";
|
|
7
7
|
import {
|
|
8
8
|
ANTHROPIC_OAUTH_AUTHORIZE_URL,
|
|
9
9
|
ANTHROPIC_OAUTH_CALLBACK_PORT,
|
|
@@ -19,11 +19,6 @@ import {
|
|
|
19
19
|
CURSOR_POLL_MAX_CONSECUTIVE_ERRORS,
|
|
20
20
|
CURSOR_POLL_MAX_DELAY_MS,
|
|
21
21
|
CURSOR_POLL_URL,
|
|
22
|
-
WORKBUDDY_APP_VERSION,
|
|
23
|
-
WORKBUDDY_POLL_INTERVAL_MS,
|
|
24
|
-
WORKBUDDY_REQUEST_TIMEOUT_MS,
|
|
25
|
-
WORKBUDDY_SIGN_IN_TIMEOUT_MS,
|
|
26
|
-
WORKBUDDY_UA_VERSION,
|
|
27
22
|
XAI_ACCESS_TOKEN_CLIENT_SKEW_MS,
|
|
28
23
|
XAI_DEVICE_CODE_DEFAULT_EXPIRES_MS,
|
|
29
24
|
XAI_DEVICE_CODE_DEFAULT_INTERVAL_MS,
|
|
@@ -39,9 +34,7 @@ import {
|
|
|
39
34
|
XAI_TOKEN_REQUEST_TIMEOUT_MS,
|
|
40
35
|
decodeJwtExp,
|
|
41
36
|
generatePkcePair,
|
|
42
|
-
getWorkBuddySite,
|
|
43
37
|
normalizeAnthropicTokenPayload,
|
|
44
|
-
normalizeWorkBuddyTokenPayload,
|
|
45
38
|
readJsonBody,
|
|
46
39
|
refreshAntigravityOAuthToken,
|
|
47
40
|
renderDeviceCodeDisplay,
|
|
@@ -49,18 +42,16 @@ import {
|
|
|
49
42
|
runAntigravityOAuthLogin,
|
|
50
43
|
runOpenAiCodexBrowserPkce,
|
|
51
44
|
runOpenAiCodexDeviceCode,
|
|
52
|
-
sanitizeWorkBuddyDomain,
|
|
53
|
-
sanitizeWorkBuddyError,
|
|
54
45
|
startCallbackServer,
|
|
55
46
|
validateXAIEndpoint,
|
|
56
47
|
xaiOAuthDiscovery
|
|
57
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-G3VYRPTV.js";
|
|
58
49
|
import {
|
|
59
50
|
t
|
|
60
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-2AB2HA4M.js";
|
|
61
52
|
import {
|
|
62
53
|
defaultOpenBrowser
|
|
63
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-DLV3H464.js";
|
|
64
55
|
import "./chunk-TY3TIUJK.js";
|
|
65
56
|
import "./chunk-S73EPYNC.js";
|
|
66
57
|
import "./chunk-ZEZC7IIM.js";
|
|
@@ -74,19 +65,30 @@ import {
|
|
|
74
65
|
detectLocalDevinCredentials,
|
|
75
66
|
extractDevinToken,
|
|
76
67
|
fetchAntigravityCloudCodeCompletion
|
|
77
|
-
} from "./chunk-
|
|
68
|
+
} from "./chunk-KMDDG73K.js";
|
|
78
69
|
import "./chunk-HNUWUO75.js";
|
|
79
70
|
import "./chunk-5ZUL4CUO.js";
|
|
80
71
|
import "./chunk-5EMSBTQ6.js";
|
|
81
72
|
import "./chunk-I42VC5KR.js";
|
|
82
73
|
import "./chunk-U6VC4MU4.js";
|
|
83
|
-
import "./chunk-
|
|
74
|
+
import "./chunk-FDLDMJTM.js";
|
|
75
|
+
import "./chunk-GLKOYSRU.js";
|
|
76
|
+
import {
|
|
77
|
+
parseUserIdFromAuthToken
|
|
78
|
+
} from "./chunk-A7GB5UGH.js";
|
|
79
|
+
import "./chunk-OLZBQWZU.js";
|
|
80
|
+
import "./chunk-LCBAMY2M.js";
|
|
81
|
+
import {
|
|
82
|
+
getProfileOAuthSync,
|
|
83
|
+
saveProfileOAuthSync
|
|
84
|
+
} from "./chunk-R5GO3YZP.js";
|
|
85
|
+
import "./chunk-SQX235S2.js";
|
|
84
86
|
import {
|
|
85
87
|
asOptionalFiniteNumber
|
|
86
88
|
} from "./chunk-WWC7I6TA.js";
|
|
87
|
-
import "./chunk-
|
|
88
|
-
import "./chunk-
|
|
89
|
-
import "./chunk-
|
|
89
|
+
import "./chunk-PIG2IUVZ.js";
|
|
90
|
+
import "./chunk-V7PCFWX3.js";
|
|
91
|
+
import "./chunk-6EQD4AQL.js";
|
|
90
92
|
import "./chunk-5BHQICF2.js";
|
|
91
93
|
import {
|
|
92
94
|
isRecord
|
|
@@ -97,20 +99,9 @@ import {
|
|
|
97
99
|
import {
|
|
98
100
|
toErrorMessage
|
|
99
101
|
} from "./chunk-HNMXYYJR.js";
|
|
100
|
-
import "./chunk-FY4SDK2E.js";
|
|
101
|
-
import "./chunk-GLKOYSRU.js";
|
|
102
|
-
import {
|
|
103
|
-
parseUserIdFromAuthToken
|
|
104
|
-
} from "./chunk-A7GB5UGH.js";
|
|
105
|
-
import "./chunk-OLZBQWZU.js";
|
|
106
|
-
import "./chunk-LCBAMY2M.js";
|
|
107
102
|
import "./chunk-4SN6J65J.js";
|
|
108
103
|
import "./chunk-CF7PE763.js";
|
|
109
104
|
import "./chunk-G3SUCT4W.js";
|
|
110
|
-
import {
|
|
111
|
-
getProfileOAuthSync,
|
|
112
|
-
saveProfileOAuthSync
|
|
113
|
-
} from "./chunk-TNIX77YM.js";
|
|
114
105
|
import "./chunk-CGFNDIKK.js";
|
|
115
106
|
import "./chunk-QSJ3HFEF.js";
|
|
116
107
|
import {
|
|
@@ -725,219 +716,6 @@ async function runDevinOAuthLogin(deps = {}) {
|
|
|
725
716
|
return buildDevinOAuthCredential(token);
|
|
726
717
|
}
|
|
727
718
|
|
|
728
|
-
// packages/cli/oauth/flows/workbuddy.ts
|
|
729
|
-
import { randomBytes as randomBytes2 } from "node:crypto";
|
|
730
|
-
function validateWorkBuddyAuthUrl(site, authUrlString) {
|
|
731
|
-
let url;
|
|
732
|
-
try {
|
|
733
|
-
url = new URL(authUrlString);
|
|
734
|
-
} catch {
|
|
735
|
-
throw new Error(`Invalid WorkBuddy auth URL: "${authUrlString}"`);
|
|
736
|
-
}
|
|
737
|
-
if (url.protocol !== "https:") {
|
|
738
|
-
throw new Error(`WorkBuddy sign-in page must use https:, got ${url.protocol}`);
|
|
739
|
-
}
|
|
740
|
-
const hostname = url.hostname.toLowerCase();
|
|
741
|
-
if (site === "workbuddy") {
|
|
742
|
-
const isAllowed = hostname === "copilot.tencent.com" || hostname.endsWith(".tencent.com");
|
|
743
|
-
if (!isAllowed) {
|
|
744
|
-
throw new Error(`Untrusted authorization host for WorkBuddy: ${hostname}`);
|
|
745
|
-
}
|
|
746
|
-
} else if (site === "workbuddy-ai") {
|
|
747
|
-
const isAllowed = hostname === "www.workbuddy.ai" || hostname === "workbuddy.ai" || hostname.endsWith(".workbuddy.ai");
|
|
748
|
-
if (!isAllowed) {
|
|
749
|
-
throw new Error(`Untrusted authorization host for WorkBuddy AI: ${hostname}`);
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
return url;
|
|
753
|
-
}
|
|
754
|
-
async function callWorkBuddyApi(siteConfig, method, path, headers, body, fetchImpl) {
|
|
755
|
-
let response;
|
|
756
|
-
try {
|
|
757
|
-
response = await fetchImpl(`${siteConfig.endpoint}${path}`, {
|
|
758
|
-
method,
|
|
759
|
-
headers: {
|
|
760
|
-
"Content-Type": "application/json",
|
|
761
|
-
Accept: "application/json",
|
|
762
|
-
"User-Agent": `WorkBuddy/${WORKBUDDY_UA_VERSION}`,
|
|
763
|
-
...headers
|
|
764
|
-
},
|
|
765
|
-
body: body === void 0 ? void 0 : JSON.stringify(body),
|
|
766
|
-
signal: AbortSignal.timeout(WORKBUDDY_REQUEST_TIMEOUT_MS)
|
|
767
|
-
});
|
|
768
|
-
} catch (error) {
|
|
769
|
-
throw new Error(
|
|
770
|
-
sanitizeWorkBuddyError(`${siteConfig.name} API request failed: ${toErrorMessage(error)}`)
|
|
771
|
-
);
|
|
772
|
-
}
|
|
773
|
-
let text = "";
|
|
774
|
-
try {
|
|
775
|
-
text = await response.text();
|
|
776
|
-
} catch {
|
|
777
|
-
}
|
|
778
|
-
let env = {};
|
|
779
|
-
try {
|
|
780
|
-
env = JSON.parse(text);
|
|
781
|
-
} catch {
|
|
782
|
-
}
|
|
783
|
-
const code = typeof env.code === "number" ? env.code : Number.parseInt(String(env.code ?? ""), 10) || 0;
|
|
784
|
-
if (!response.ok) {
|
|
785
|
-
const why = String(env.msg || env.message || text.slice(0, 200) || response.statusText);
|
|
786
|
-
const err = new Error(
|
|
787
|
-
sanitizeWorkBuddyError(
|
|
788
|
-
`${siteConfig.name}: ${why} (HTTP ${response.status}${code ? `, code ${code}` : ""})`
|
|
789
|
-
)
|
|
790
|
-
);
|
|
791
|
-
err.code = code;
|
|
792
|
-
err.status = response.status;
|
|
793
|
-
throw err;
|
|
794
|
-
}
|
|
795
|
-
if (code !== 0) {
|
|
796
|
-
const why = String(env.msg || env.message || "error");
|
|
797
|
-
const err = new Error(
|
|
798
|
-
sanitizeWorkBuddyError(`${siteConfig.name}: ${why} (${code})`)
|
|
799
|
-
);
|
|
800
|
-
err.code = code;
|
|
801
|
-
err.status = response.status;
|
|
802
|
-
throw err;
|
|
803
|
-
}
|
|
804
|
-
return env.data;
|
|
805
|
-
}
|
|
806
|
-
async function pollWorkBuddyEndpoint(siteConfig, path, headers, retryCodes, deadline, fetchImpl, sleepFn, nowFn) {
|
|
807
|
-
while (true) {
|
|
808
|
-
if (nowFn() > deadline) {
|
|
809
|
-
throw new Error(`${siteConfig.name} sign-in timed out. Please try again.`);
|
|
810
|
-
}
|
|
811
|
-
try {
|
|
812
|
-
const data = await callWorkBuddyApi(siteConfig, "GET", path, headers, void 0, fetchImpl);
|
|
813
|
-
if (data && typeof data === "object" && Object.keys(data).length > 0) {
|
|
814
|
-
return data;
|
|
815
|
-
}
|
|
816
|
-
} catch (rawError) {
|
|
817
|
-
const err = rawError;
|
|
818
|
-
const isRetryable = typeof err.code === "number" && retryCodes.includes(err.code) || err.status === 408 || err.status === 429;
|
|
819
|
-
if (!isRetryable) {
|
|
820
|
-
throw rawError;
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
await sleepFn(WORKBUDDY_POLL_INTERVAL_MS);
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
async function resolveEnterpriseId(siteConfig, accessToken, domain, who, fetchImpl) {
|
|
827
|
-
const own = typeof who.enterpriseId === "string" ? who.enterpriseId.trim() : "";
|
|
828
|
-
if (own) return own;
|
|
829
|
-
const type = String(who.type ?? "").trim().toLowerCase();
|
|
830
|
-
if (!type || type === "personal") return "";
|
|
831
|
-
try {
|
|
832
|
-
const list = await callWorkBuddyApi(
|
|
833
|
-
siteConfig,
|
|
834
|
-
"GET",
|
|
835
|
-
"/v2/plugin/accounts",
|
|
836
|
-
{
|
|
837
|
-
Authorization: `Bearer ${accessToken}`,
|
|
838
|
-
"X-Domain": domain
|
|
839
|
-
},
|
|
840
|
-
void 0,
|
|
841
|
-
fetchImpl
|
|
842
|
-
);
|
|
843
|
-
const mine = (list?.accounts ?? []).filter(
|
|
844
|
-
(x) => x?.uid === who.uid && typeof x?.enterpriseId === "string" && x.enterpriseId.trim()
|
|
845
|
-
);
|
|
846
|
-
const same = mine.filter((x) => String(x.type ?? "").trim().toLowerCase() === type);
|
|
847
|
-
const last = mine.filter((x) => x.lastLogin);
|
|
848
|
-
const pick = same.length === 1 ? same[0] : last.length === 1 ? last[0] : mine.length === 1 ? mine[0] : void 0;
|
|
849
|
-
return pick && typeof pick.enterpriseId === "string" ? pick.enterpriseId.trim() : "";
|
|
850
|
-
} catch {
|
|
851
|
-
return "";
|
|
852
|
-
}
|
|
853
|
-
}
|
|
854
|
-
async function runWorkBuddyOAuthLogin(site, deps = {}) {
|
|
855
|
-
const siteConfig = getWorkBuddySite(site);
|
|
856
|
-
const output = deps.output ?? console;
|
|
857
|
-
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
858
|
-
const sleepFn = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
859
|
-
const nowFn = deps.now ?? (() => Date.now());
|
|
860
|
-
const stateData = await callWorkBuddyApi(
|
|
861
|
-
siteConfig,
|
|
862
|
-
"POST",
|
|
863
|
-
`/v2/plugin/auth/state?platform=${encodeURIComponent(siteConfig.platform)}`,
|
|
864
|
-
{
|
|
865
|
-
"X-No-Authorization": "true",
|
|
866
|
-
"X-No-User-Id": "true",
|
|
867
|
-
"X-No-Enterprise-Id": "true",
|
|
868
|
-
"X-No-Department-Info": "true"
|
|
869
|
-
},
|
|
870
|
-
{},
|
|
871
|
-
fetchImpl
|
|
872
|
-
);
|
|
873
|
-
if (!stateData?.state || !stateData?.authUrl) {
|
|
874
|
-
throw new Error(`${siteConfig.name} gave no sign-in page`);
|
|
875
|
-
}
|
|
876
|
-
const validatedUrl = validateWorkBuddyAuthUrl(site, stateData.authUrl);
|
|
877
|
-
validatedUrl.searchParams.set("version", WORKBUDDY_APP_VERSION);
|
|
878
|
-
validatedUrl.searchParams.set("loginSessionId", randomBytes2(16).toString("hex"));
|
|
879
|
-
const finalAuthUrl = validatedUrl.toString();
|
|
880
|
-
output.log(
|
|
881
|
-
`
|
|
882
|
-
Open this URL in your browser to authorize ${siteConfig.name}:
|
|
883
|
-
${finalAuthUrl}
|
|
884
|
-
|
|
885
|
-
Waiting for browser authentication...`
|
|
886
|
-
);
|
|
887
|
-
if (deps.openBrowser) {
|
|
888
|
-
try {
|
|
889
|
-
await deps.openBrowser(finalAuthUrl);
|
|
890
|
-
} catch {
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
const deadline = nowFn() + WORKBUDDY_SIGN_IN_TIMEOUT_MS;
|
|
894
|
-
const qState = encodeURIComponent(stateData.state);
|
|
895
|
-
const token = await pollWorkBuddyEndpoint(
|
|
896
|
-
siteConfig,
|
|
897
|
-
`/v2/plugin/auth/token?state=${qState}`,
|
|
898
|
-
{},
|
|
899
|
-
[11217],
|
|
900
|
-
deadline,
|
|
901
|
-
fetchImpl,
|
|
902
|
-
sleepFn,
|
|
903
|
-
nowFn
|
|
904
|
-
);
|
|
905
|
-
if (typeof token?.accessToken !== "string" || !token.accessToken.trim()) {
|
|
906
|
-
throw new Error(`${siteConfig.name} sent back no token`);
|
|
907
|
-
}
|
|
908
|
-
const defaultHost = new URL(siteConfig.endpoint).host;
|
|
909
|
-
const tokenDomain = sanitizeWorkBuddyDomain(token.domain, defaultHost);
|
|
910
|
-
const who = await pollWorkBuddyEndpoint(
|
|
911
|
-
siteConfig,
|
|
912
|
-
`/v2/plugin/login/account?state=${qState}`,
|
|
913
|
-
{
|
|
914
|
-
Authorization: `Bearer ${token.accessToken}`,
|
|
915
|
-
"X-Domain": tokenDomain,
|
|
916
|
-
"X-No-User-Id": "true",
|
|
917
|
-
"X-No-Enterprise-Id": "true"
|
|
918
|
-
},
|
|
919
|
-
[12151],
|
|
920
|
-
deadline,
|
|
921
|
-
fetchImpl,
|
|
922
|
-
sleepFn,
|
|
923
|
-
nowFn
|
|
924
|
-
);
|
|
925
|
-
const enterpriseId = await resolveEnterpriseId(
|
|
926
|
-
siteConfig,
|
|
927
|
-
token.accessToken,
|
|
928
|
-
tokenDomain,
|
|
929
|
-
who,
|
|
930
|
-
fetchImpl
|
|
931
|
-
);
|
|
932
|
-
const now = nowFn();
|
|
933
|
-
return normalizeWorkBuddyTokenPayload(site, {
|
|
934
|
-
...token,
|
|
935
|
-
uid: who.uid,
|
|
936
|
-
nickname: who.nickname || who.phoneNumber,
|
|
937
|
-
enterpriseId: enterpriseId || who.enterpriseId
|
|
938
|
-
}, void 0, now);
|
|
939
|
-
}
|
|
940
|
-
|
|
941
719
|
// packages/cli/oauth/authCommand.ts
|
|
942
720
|
var SYNC_HELP_LINE = ` --sync-to-server After local save, push the credential to your nolo server and remember this choice.
|
|
943
721
|
--no-sync-to-server Skip server sync and remember this choice (keeps credentials local only).
|
|
@@ -1118,42 +896,6 @@ Options:
|
|
|
1118
896
|
${SYNC_HELP_LINE}
|
|
1119
897
|
--help, -h Show this help and exit.
|
|
1120
898
|
`;
|
|
1121
|
-
var WORKBUDDY_HELP_TEXT = `Authorize nolo-cli to call WorkBuddy (China) models via your WorkBuddy account.
|
|
1122
|
-
|
|
1123
|
-
This authorizes model API access only. It does NOT log you into the Nolo
|
|
1124
|
-
platform. To manage agents, docs, spaces, and other Nolo resources, run
|
|
1125
|
-
"nolo login" first.
|
|
1126
|
-
|
|
1127
|
-
Usage: nolo auth workbuddy [--browser] [--no-browser] [--sync-to-server] [--help]
|
|
1128
|
-
|
|
1129
|
-
The flow opens https://copilot.tencent.com in your browser and polls the login status.
|
|
1130
|
-
After approval, tokens are stored in $NOLO_HOME/credentials/workbuddy.json (or ~/.nolo/credentials/workbuddy.json when NOLO_HOME is unset).
|
|
1131
|
-
Agents can reference the stored token with apiKeyRef: "workbuddy".
|
|
1132
|
-
|
|
1133
|
-
Options:
|
|
1134
|
-
--browser Open the login URL in your browser automatically (default).
|
|
1135
|
-
--no-browser Print the login URL without opening a browser.
|
|
1136
|
-
${SYNC_HELP_LINE}
|
|
1137
|
-
--help, -h Show this help and exit.
|
|
1138
|
-
`;
|
|
1139
|
-
var WORKBUDDY_AI_HELP_TEXT = `Authorize nolo-cli to call WorkBuddy AI (International) models via your WorkBuddy AI account.
|
|
1140
|
-
|
|
1141
|
-
This authorizes model API access only. It does NOT log you into the Nolo
|
|
1142
|
-
platform. To manage agents, docs, spaces, and other Nolo resources, run
|
|
1143
|
-
"nolo login" first.
|
|
1144
|
-
|
|
1145
|
-
Usage: nolo auth workbuddy-ai [--browser] [--no-browser] [--sync-to-server] [--help]
|
|
1146
|
-
|
|
1147
|
-
The flow opens https://www.workbuddy.ai in your browser and polls the login status.
|
|
1148
|
-
After approval, tokens are stored in $NOLO_HOME/credentials/workbuddy-ai.json (or ~/.nolo/credentials/workbuddy-ai.json when NOLO_HOME is unset).
|
|
1149
|
-
Agents can reference the stored token with apiKeyRef: "workbuddy-ai".
|
|
1150
|
-
|
|
1151
|
-
Options:
|
|
1152
|
-
--browser Open the login URL in your browser automatically (default).
|
|
1153
|
-
--no-browser Print the login URL without opening a browser.
|
|
1154
|
-
${SYNC_HELP_LINE}
|
|
1155
|
-
--help, -h Show this help and exit.
|
|
1156
|
-
`;
|
|
1157
899
|
var HELP_BY_PROVIDER = {
|
|
1158
900
|
chatgpt: CHATGPT_HELP_TEXT,
|
|
1159
901
|
xai: XAI_HELP_TEXT,
|
|
@@ -1161,9 +903,7 @@ var HELP_BY_PROVIDER = {
|
|
|
1161
903
|
claude: CLAUDE_HELP_TEXT,
|
|
1162
904
|
cloudflare: CLOUDFLARE_HELP_TEXT,
|
|
1163
905
|
cursor: CURSOR_HELP_TEXT,
|
|
1164
|
-
devin: DEVIN_HELP_TEXT
|
|
1165
|
-
workbuddy: WORKBUDDY_HELP_TEXT,
|
|
1166
|
-
"workbuddy-ai": WORKBUDDY_AI_HELP_TEXT
|
|
906
|
+
devin: DEVIN_HELP_TEXT
|
|
1167
907
|
};
|
|
1168
908
|
function markCredentialServerManaged(provider, credential, syncConfig, deps) {
|
|
1169
909
|
const output = deps.output ?? console;
|
|
@@ -1404,8 +1144,6 @@ async function runAuthProviderCommand(provider, args, _ctx, deps = {}) {
|
|
|
1404
1144
|
credential = await runCursorOAuthLogin(flowDeps);
|
|
1405
1145
|
} else if (provider === "devin") {
|
|
1406
1146
|
credential = await runDevinOAuthLogin(flowDeps);
|
|
1407
|
-
} else if (provider === "workbuddy" || provider === "workbuddy-ai") {
|
|
1408
|
-
credential = await runWorkBuddyOAuthLogin(provider, flowDeps);
|
|
1409
1147
|
} else if (provider === "cloudflare") {
|
|
1410
1148
|
credential = await runCloudflareOAuthLogin({
|
|
1411
1149
|
...flowDeps,
|
|
@@ -1460,17 +1198,7 @@ async function runAuthProviderCommand(provider, args, _ctx, deps = {}) {
|
|
|
1460
1198
|
saveProfileOAuthSync(p, s);
|
|
1461
1199
|
});
|
|
1462
1200
|
let shouldSync = false;
|
|
1463
|
-
if (
|
|
1464
|
-
if (hasExplicitSync) {
|
|
1465
|
-
setOAuthSync(provider, true);
|
|
1466
|
-
shouldSync = true;
|
|
1467
|
-
} else {
|
|
1468
|
-
if (hasExplicitNoSync) {
|
|
1469
|
-
setOAuthSync(provider, false);
|
|
1470
|
-
}
|
|
1471
|
-
shouldSync = false;
|
|
1472
|
-
}
|
|
1473
|
-
} else if (hasExplicitNoSync || envAutoSync === "0") {
|
|
1201
|
+
if (hasExplicitNoSync || envAutoSync === "0") {
|
|
1474
1202
|
if (hasExplicitNoSync) {
|
|
1475
1203
|
setOAuthSync(provider, false);
|
|
1476
1204
|
}
|
|
@@ -1568,12 +1296,6 @@ async function runAuthCursorCommand(args, ctx, deps) {
|
|
|
1568
1296
|
async function runAuthDevinCommand(args, ctx, deps) {
|
|
1569
1297
|
return runAuthProviderCommand("devin", args, ctx, deps);
|
|
1570
1298
|
}
|
|
1571
|
-
async function runAuthWorkbuddyCommand(args, ctx, deps) {
|
|
1572
|
-
return runAuthProviderCommand("workbuddy", args, ctx, deps);
|
|
1573
|
-
}
|
|
1574
|
-
async function runAuthWorkbuddyAiCommand(args, ctx, deps) {
|
|
1575
|
-
return runAuthProviderCommand("workbuddy-ai", args, ctx, deps);
|
|
1576
|
-
}
|
|
1577
1299
|
export {
|
|
1578
1300
|
resolveServerSyncConfig,
|
|
1579
1301
|
runAuthAntigravityCommand,
|
|
@@ -1583,7 +1305,5 @@ export {
|
|
|
1583
1305
|
runAuthCursorCommand,
|
|
1584
1306
|
runAuthDevinCommand,
|
|
1585
1307
|
runAuthProviderCommand,
|
|
1586
|
-
runAuthWorkbuddyAiCommand,
|
|
1587
|
-
runAuthWorkbuddyCommand,
|
|
1588
1308
|
runAuthXaiCommand
|
|
1589
1309
|
};
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
runLogoutCommand,
|
|
8
8
|
runWhoamiCommand,
|
|
9
9
|
saveTokenLogin
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-DLV3H464.js";
|
|
11
11
|
import "./chunk-TY3TIUJK.js";
|
|
12
12
|
import "./chunk-S73EPYNC.js";
|
|
13
13
|
import "./chunk-ZEZC7IIM.js";
|
|
@@ -15,17 +15,17 @@ import "./chunk-OW765XBU.js";
|
|
|
15
15
|
import "./chunk-5EMSBTQ6.js";
|
|
16
16
|
import "./chunk-I42VC5KR.js";
|
|
17
17
|
import "./chunk-U6VC4MU4.js";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-3EUW3WEO.js";
|
|
20
|
-
import "./chunk-FY4SDK2E.js";
|
|
18
|
+
import "./chunk-FDLDMJTM.js";
|
|
21
19
|
import "./chunk-GLKOYSRU.js";
|
|
22
20
|
import "./chunk-A7GB5UGH.js";
|
|
23
21
|
import "./chunk-OLZBQWZU.js";
|
|
24
22
|
import "./chunk-LCBAMY2M.js";
|
|
23
|
+
import "./chunk-R5GO3YZP.js";
|
|
24
|
+
import "./chunk-WWC7I6TA.js";
|
|
25
|
+
import "./chunk-3EUW3WEO.js";
|
|
25
26
|
import "./chunk-4SN6J65J.js";
|
|
26
27
|
import "./chunk-CF7PE763.js";
|
|
27
28
|
import "./chunk-G3SUCT4W.js";
|
|
28
|
-
import "./chunk-TNIX77YM.js";
|
|
29
29
|
import "./chunk-4VNS5WPM.js";
|
|
30
30
|
export {
|
|
31
31
|
LOGIN_HELP_TEXT,
|
|
@@ -7,11 +7,12 @@ import {
|
|
|
7
7
|
resolveBuiltinSkillEntry,
|
|
8
8
|
resolveBuiltinSkillPage,
|
|
9
9
|
resolveBuiltinSkillSlug
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-SH3XD4E2.js";
|
|
11
|
+
import "./chunk-YCRROBDY.js";
|
|
12
12
|
import "./chunk-EUGTFFO6.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-AETZ7AD6.js";
|
|
14
14
|
import "./chunk-Y6ORVLSS.js";
|
|
15
|
+
import "./chunk-KHCLMKZZ.js";
|
|
15
16
|
import "./chunk-5EBLANFT.js";
|
|
16
17
|
import "./chunk-NYYFIKHI.js";
|
|
17
18
|
import "./chunk-LOEO7LRC.js";
|
|
@@ -22,7 +23,6 @@ import "./chunk-U6VC4MU4.js";
|
|
|
22
23
|
import "./chunk-WWC7I6TA.js";
|
|
23
24
|
import "./chunk-3EUW3WEO.js";
|
|
24
25
|
import "./chunk-G3SUCT4W.js";
|
|
25
|
-
import "./chunk-KHCLMKZZ.js";
|
|
26
26
|
import "./chunk-4VNS5WPM.js";
|
|
27
27
|
export {
|
|
28
28
|
CAPABILITY_SLUG_COLLISIONS,
|
|
@@ -22,7 +22,7 @@ import { resolve as resolve2 } from "node:path";
|
|
|
22
22
|
// packages/desktop-chrome-connector/nativeHostInstall.mjs
|
|
23
23
|
import { chmodSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
24
24
|
import { createHash, randomBytes } from "node:crypto";
|
|
25
|
-
import { dirname, resolve } from "node:path";
|
|
25
|
+
import { dirname, isAbsolute, resolve } from "node:path";
|
|
26
26
|
import { execFileSync } from "node:child_process";
|
|
27
27
|
import { fileURLToPath } from "node:url";
|
|
28
28
|
var DEFAULT_CONNECTOR_ROOT = dirname(fileURLToPath(import.meta.url));
|
|
@@ -34,15 +34,22 @@ function extensionIdFromPublicKey(publicKeyBase64) {
|
|
|
34
34
|
(byte) => `${String.fromCharCode(97 + (byte >> 4))}${String.fromCharCode(97 + (byte & 15))}`
|
|
35
35
|
).join("");
|
|
36
36
|
}
|
|
37
|
-
function
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
function resolveNativeHostRuntimePath({ env = process.env } = {}) {
|
|
38
|
+
for (const runtime of ["bun", "node"]) {
|
|
39
|
+
try {
|
|
40
|
+
const output = execFileSync("/usr/bin/env", [
|
|
41
|
+
runtime,
|
|
42
|
+
"-e",
|
|
43
|
+
"console.log(JSON.stringify({execPath:process.execPath,bun:process.versions.bun,node:process.versions.node}))"
|
|
44
|
+
], { env, encoding: "utf8", timeout: 5e3, stdio: ["ignore", "pipe", "pipe"] });
|
|
45
|
+
const probe = JSON.parse(output.trim());
|
|
46
|
+
if (isAbsolute(probe.execPath) && (runtime === "bun" ? probe.bun : probe.node && !probe.bun)) {
|
|
47
|
+
return probe.execPath;
|
|
48
|
+
}
|
|
49
|
+
} catch {
|
|
50
|
+
}
|
|
41
51
|
}
|
|
42
|
-
|
|
43
|
-
encoding: "utf8"
|
|
44
|
-
}).trim();
|
|
45
|
-
return resolved || "node";
|
|
52
|
+
throw new Error("Native host requires a standalone Bun executable (preferred) or Node.js on PATH; install Bun or pass nodePath explicitly.");
|
|
46
53
|
}
|
|
47
54
|
function nativeMessagingHostsDir({
|
|
48
55
|
home = process.env.HOME || "",
|
|
@@ -114,7 +121,7 @@ function installNativeHostManifest({
|
|
|
114
121
|
const manifest = JSON.parse(readFileSync(paths.templatePath, "utf8"));
|
|
115
122
|
const extensionManifest = JSON.parse(readFileSync(paths.extensionManifestPath, "utf8"));
|
|
116
123
|
const resolvedExtensionId = extensionId || (browser === "firefox" ? FIREFOX_EXTENSION_ID : extensionIdFromPublicKey(extensionManifest.key));
|
|
117
|
-
const resolvedNodePath = nodePath ||
|
|
124
|
+
const resolvedNodePath = nodePath || resolveNativeHostRuntimePath();
|
|
118
125
|
mkdirSync(paths.supportDir, { recursive: true });
|
|
119
126
|
const existingToken = existsSync(paths.tokenPath) ? readFileSync(paths.tokenPath, "utf8").trim() : "";
|
|
120
127
|
const token = existingToken || randomBytes(32).toString("hex");
|