@xiaoso/dsh-tool-plus 0.1.0-beta.2 → 0.1.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/README.en.md +122 -0
  2. package/README.md +3 -2
  3. package/THIRD_PARTY_NOTICES.md +4 -35
  4. package/lib/abort-B7izMMna.mjs +51 -0
  5. package/lib/abort-D1_Z5Ut5.mjs +51 -0
  6. package/lib/abort-dIkZBV7Q.mjs +51 -0
  7. package/lib/amazon-bedrock-B0nxT06F.mjs +917 -0
  8. package/lib/amazon-bedrock-D-shAr1X.mjs +917 -0
  9. package/lib/amazon-bedrock-WQhvjHYu.mjs +917 -0
  10. package/lib/anthropic-BWsZFzU8.mjs +262 -0
  11. package/lib/anthropic-CJCauvYz.mjs +3115 -0
  12. package/lib/anthropic-CMT1Qj1t.mjs +3115 -0
  13. package/lib/anthropic-CZghe_9U.mjs +3115 -0
  14. package/lib/anthropic-sCMH7JID.mjs +262 -0
  15. package/lib/anthropic-tTntD8BD.mjs +262 -0
  16. package/lib/api-key-login-BzqNdM2y.mjs +157 -0
  17. package/lib/api-key-login-CWVwvHT1.mjs +157 -0
  18. package/lib/api-key-login-CpzSezsi.mjs +157 -0
  19. package/lib/aws-credentials-8Mgn5MAy.mjs +867 -0
  20. package/lib/aws-credentials-CXryMobh.mjs +867 -0
  21. package/lib/aws-credentials-ChG79ey-.mjs +867 -0
  22. package/lib/azure-openai-responses-CNkHiLUh.mjs +274 -0
  23. package/lib/azure-openai-responses-Cgmc-rbL.mjs +274 -0
  24. package/lib/azure-openai-responses-DuukbD0F.mjs +274 -0
  25. package/lib/bun-shim.mjs +252 -12
  26. package/lib/bundled-references-CSuBco5p.mjs +55 -0
  27. package/lib/bundled-references-Cavaffah.mjs +55 -0
  28. package/lib/bundled-references-sLN0YdXU.mjs +55 -0
  29. package/lib/callback-server-BEFNf-jf.mjs +398 -0
  30. package/lib/callback-server-CQ5Jo8F-.mjs +398 -0
  31. package/lib/callback-server-DDSrZ6l_.mjs +398 -0
  32. package/lib/client.js +111 -41
  33. package/lib/cursor-B3zg7EHj.mjs +273 -0
  34. package/lib/cursor-B6TUEmgP.mjs +135 -0
  35. package/lib/cursor-BIQfBC6V.mjs +135 -0
  36. package/lib/cursor-D8gvtTL3.mjs +135 -0
  37. package/lib/cursor-DNk6eXDd.mjs +5470 -0
  38. package/lib/cursor-DkSX2h3H.mjs +5441 -0
  39. package/lib/cursor-MjSm74IJ.mjs +273 -0
  40. package/lib/cursor-aJrXeYCb.mjs +273 -0
  41. package/lib/cursor-mJQwUKXK.mjs +5441 -0
  42. package/lib/device-code-DBo3B5nh.mjs +51 -0
  43. package/lib/device-code-DIb0FU-H.mjs +51 -0
  44. package/lib/device-code-OI_tQcmc.mjs +51 -0
  45. package/lib/devin-BHZZyMhO.mjs +95 -0
  46. package/lib/devin-BK7DHeca.mjs +114 -0
  47. package/lib/devin-CfMp3cXS.mjs +95 -0
  48. package/lib/devin-CldyPD8K.mjs +95 -0
  49. package/lib/devin-CzRpTUOA.mjs +114 -0
  50. package/lib/devin-D9zR5B_R.mjs +542 -0
  51. package/lib/devin-DXOeNyU7.mjs +542 -0
  52. package/lib/devin-Q1yem3lp.mjs +114 -0
  53. package/lib/devin-vNZTNUON.mjs +542 -0
  54. package/lib/error-B3bevhrs.mjs +1449 -0
  55. package/lib/error-Dd8DIqs-.mjs +1449 -0
  56. package/lib/error-yCSG0mGC.mjs +1449 -0
  57. package/lib/event-stream-BDPi64mK.mjs +151 -0
  58. package/lib/event-stream-BbFZJy-z.mjs +151 -0
  59. package/lib/event-stream-loUa0s1T.mjs +151 -0
  60. package/lib/fs-promises-shim-Bx0fpxuk.mjs +57 -0
  61. package/lib/github-copilot-4GaMtQmg.mjs +208 -0
  62. package/lib/github-copilot-B1yiyVRh.mjs +104 -0
  63. package/lib/github-copilot-B2HGSIJK.mjs +104 -0
  64. package/lib/github-copilot-BWT3eAOF.mjs +208 -0
  65. package/lib/github-copilot-CYkjeTi3.mjs +208 -0
  66. package/lib/github-copilot-jscUZ8Hf.mjs +104 -0
  67. package/lib/gitlab-duo-CM7Ref1H.mjs +155 -0
  68. package/lib/gitlab-duo-akICyfeD.mjs +155 -0
  69. package/lib/gitlab-duo-gubO4FNw.mjs +155 -0
  70. package/lib/gitlab-duo-workflow-BGAF6JDw.mjs +91 -0
  71. package/lib/gitlab-duo-workflow-CSEgYk3N.mjs +91 -0
  72. package/lib/gitlab-duo-workflow-D78tdn8E.mjs +91 -0
  73. package/lib/google-BS4T25Pn.mjs +30 -0
  74. package/lib/google-TFe-7-of.mjs +30 -0
  75. package/lib/google-antigravity-DGmwC2KV.mjs +198 -0
  76. package/lib/google-antigravity-DNYhgTpA.mjs +198 -0
  77. package/lib/google-antigravity-Dlkdhahq.mjs +198 -0
  78. package/lib/google-auth-B6gjsZvg.mjs +232 -0
  79. package/lib/google-auth-De7_s3eo.mjs +232 -0
  80. package/lib/google-auth-DhqpOYrX.mjs +232 -0
  81. package/lib/google-gemini-cli-BG_LRdIV.mjs +850 -0
  82. package/lib/google-gemini-cli-CWu8HvXW.mjs +211 -0
  83. package/lib/google-gemini-cli-Cb97bzQc.mjs +850 -0
  84. package/lib/google-gemini-cli-Cqds_Q5T.mjs +850 -0
  85. package/lib/google-gemini-cli-Dsztq0N5.mjs +211 -0
  86. package/lib/google-gemini-cli-zJhiOcND.mjs +211 -0
  87. package/lib/google-oauth-shared-CuEHaDDj.mjs +147 -0
  88. package/lib/google-oauth-shared-CwNWYdmR.mjs +147 -0
  89. package/lib/google-oauth-shared-yqlyqPPC.mjs +147 -0
  90. package/lib/google-shared-CgKmmdO3.mjs +760 -0
  91. package/lib/google-shared-Dr-VG-ap.mjs +760 -0
  92. package/lib/google-shared-DzhCb9b0.mjs +760 -0
  93. package/lib/google-vertex-BDN2tLaD.mjs +99 -0
  94. package/lib/google-vertex-DopVOQOG.mjs +99 -0
  95. package/lib/google-vertex-kscbkyRb.mjs +99 -0
  96. package/lib/google-zyDOG9x7.mjs +30 -0
  97. package/lib/identity-Da1GPU9a.mjs +219 -0
  98. package/lib/identity-DnB63pS7.mjs +219 -0
  99. package/lib/identity-xRP7_eSR.mjs +219 -0
  100. package/lib/idle-iterator-Baoyn3Hp.mjs +366 -0
  101. package/lib/idle-iterator-C6XbWcuB.mjs +366 -0
  102. package/lib/idle-iterator-DUjKQEGT.mjs +366 -0
  103. package/lib/index.mjs +4608 -3935
  104. package/lib/kimi--wUOWER5.mjs +236 -0
  105. package/lib/kimi-DMVI-zrZ.mjs +236 -0
  106. package/lib/kimi-Dh0pv3WZ.mjs +236 -0
  107. package/lib/markit-BL3cH47U.mjs +1417 -0
  108. package/lib/markit-BNiNY6SE.mjs +1417 -0
  109. package/lib/markit-M0jhziqU.mjs +1417 -0
  110. package/lib/minimax-code-BK-3eBbz.mjs +53 -0
  111. package/lib/minimax-code-DCbuA6Yk.mjs +53 -0
  112. package/lib/minimax-code-Uq8Qu9LW.mjs +53 -0
  113. package/lib/models-CfT4coYT.mjs +104660 -0
  114. package/lib/models-D_XnT6ay.mjs +104660 -0
  115. package/lib/models-SGASygJ3.mjs +104660 -0
  116. package/lib/ollama-BQMGPxtV.mjs +589 -0
  117. package/lib/ollama-DPzBmq89.mjs +589 -0
  118. package/lib/ollama-DoBz5SFm.mjs +589 -0
  119. package/lib/openai-codex-Bi-4S4PX.mjs +255 -0
  120. package/lib/openai-codex-CQL_kvYL.mjs +255 -0
  121. package/lib/openai-codex-Ch8CkT3p.mjs +255 -0
  122. package/lib/openai-codex-responses-CvxL_FMF.mjs +3144 -0
  123. package/lib/openai-codex-responses-Cz-2qpC7.mjs +3144 -0
  124. package/lib/openai-codex-responses-pejZgdZo.mjs +3144 -0
  125. package/lib/openai-completions-CF8IyNtP.mjs +1360 -0
  126. package/lib/openai-completions-DIf361kF.mjs +1360 -0
  127. package/lib/openai-completions-i8doczAk.mjs +1360 -0
  128. package/lib/openai-reasoning-fallback-DGVVLgd1.mjs +286 -0
  129. package/lib/openai-reasoning-fallback-Nj6yB2rY.mjs +286 -0
  130. package/lib/openai-reasoning-fallback-OdJREP1o.mjs +286 -0
  131. package/lib/openai-responses-BqXJInHX.mjs +867 -0
  132. package/lib/openai-responses-DTkBiiy-.mjs +867 -0
  133. package/lib/openai-responses-Db_a-U4-.mjs +867 -0
  134. package/lib/opencode-DaJjcUbf.mjs +38 -0
  135. package/lib/opencode-DhMolSoB.mjs +38 -0
  136. package/lib/opencode-Rq_Q2vAO.mjs +38 -0
  137. package/lib/perplexity-9b-RQ0mV.mjs +194 -0
  138. package/lib/perplexity-C4iLVMUj.mjs +194 -0
  139. package/lib/perplexity-Uu7Jzg5b.mjs +194 -0
  140. package/lib/proxy-DDqrmjjC.mjs +190 -0
  141. package/lib/proxy-ZtUcl6r5.mjs +190 -0
  142. package/lib/proxy-pM_NIv-H.mjs +190 -0
  143. package/lib/request-debug-HJMoJncL.mjs +183 -0
  144. package/lib/sanitize-text-CfcXzw5X.mjs +33 -0
  145. package/lib/scrapers-BkFfcPHj.mjs +9198 -0
  146. package/lib/scrapers-CL-WgdU1.mjs +9198 -0
  147. package/lib/scrapers-CVptboMs.mjs +9198 -0
  148. package/lib/scrapers-CipyKyCH.mjs +9198 -0
  149. package/lib/scrapers-DGfrYhtw.mjs +9198 -0
  150. package/lib/scrapers-DSUPYoUF.mjs +9198 -0
  151. package/lib/scrapers-DZ2GXmp7.mjs +9198 -0
  152. package/lib/scrapers-nhQAvc8d.mjs +9198 -0
  153. package/lib/shell-snapshot-fn-env.sh +67 -43
  154. package/lib/src-BgpusnsB.mjs +5076 -0
  155. package/lib/src-DTid0g4K.mjs +5001 -0
  156. package/lib/src-lDmkSRbm.mjs +5006 -0
  157. package/lib/stream-BlldLkVq.mjs +10236 -0
  158. package/lib/stream-CRtexYLe.mjs +10236 -0
  159. package/lib/stream-C_RAoxJC.mjs +10236 -0
  160. package/lib/stream-markup-healing-2toHXWXM.mjs +491 -0
  161. package/lib/stream-markup-healing-DMsxBx1L.mjs +491 -0
  162. package/lib/stream-markup-healing-KMkiAA00.mjs +491 -0
  163. package/lib/turndown-DN7ByzEI.mjs +667 -0
  164. package/lib/types/client/locales.d.ts +1 -1
  165. package/lib/types/config/fields.d.ts +1 -1
  166. package/lib/types/config/settings.d.ts +25 -3
  167. package/lib/types/config/truncate.d.ts +9 -5
  168. package/lib/types/tools/bash/background.d.ts +1 -1
  169. package/lib/types/tools/bash/bash-executor.d.ts +4 -0
  170. package/lib/types/tools/bash/bash-interceptor.d.ts +10 -8
  171. package/lib/types/tools/bash/cd-workdir.d.ts +35 -0
  172. package/lib/types/tools/bash/non-interactive-env.d.ts +2 -0
  173. package/lib/types/tools/bash/render.d.ts +4 -3
  174. package/lib/types/tools/bash/sanitize-text.d.ts +5 -0
  175. package/lib/types/tools/bash/shell-snapshot.d.ts +4 -1
  176. package/lib/types/tools/bash/shell-tokenize.d.ts +60 -0
  177. package/lib/types/tools/bash/streaming-output.d.ts +12 -212
  178. package/lib/types/tools/bash/which.d.ts +20 -0
  179. package/lib/types/tools/bash/windows-shell.d.ts +31 -0
  180. package/lib/types/tools/edit/adapter/index.d.ts +25 -3
  181. package/lib/types/tools/edit/adapter/tools/auto-generated-guard.d.ts +7 -17
  182. package/lib/types/tools/glob/adapter/index.d.ts +27 -1
  183. package/lib/types/tools/grep/adapter/index.d.ts +29 -1
  184. package/lib/types/tools/omp/edit/dispatch.d.ts +43 -0
  185. package/lib/types/tools/omp/edit/hashline/noop-loop-guard.d.ts +3 -1
  186. package/lib/types/tools/omp/sdk.d.ts +6 -0
  187. package/lib/types/tools/omp/tools/auto-generated-guard.d.ts +20 -0
  188. package/lib/types/tools/omp/tools/fetch.d.ts +2 -0
  189. package/lib/types/tools/omp/tools/read.d.ts +2 -8
  190. package/lib/types/tools/omp/tools/write.d.ts +4 -4
  191. package/lib/types/tools/omp/utils/image-loading.d.ts +10 -36
  192. package/lib/types/tools/read/adapter/index.d.ts +4 -1
  193. package/lib/types/tools/read-image/index.d.ts +4 -0
  194. package/lib/types/tools/shared/auto-generated-guard.dsh.d.ts +16 -4
  195. package/lib/types/tools/shared/bun-shim.d.ts +39 -3
  196. package/lib/types/tools/shared/fs-promises-shim.d.ts +3 -1
  197. package/lib/types/tools/shared/image-bridge.d.ts +98 -0
  198. package/lib/types/tools/shared/omp-prompt.d.ts +17 -9
  199. package/lib/types/tools/shared/session-state.d.ts +9 -3
  200. package/lib/utils-2Wq2eATG.mjs +8119 -0
  201. package/lib/utils-BnX8O3vi.mjs +12303 -0
  202. package/lib/utils-Bw139LTz.mjs +8119 -0
  203. package/lib/utils-CE8N8P4Q.mjs +12315 -0
  204. package/lib/utils-CZw4tVZQ.mjs +12315 -0
  205. package/lib/utils-C_MrQ_0z.mjs +12301 -0
  206. package/lib/utils-CiGN7OHR.mjs +12315 -0
  207. package/lib/utils-Cp76gCyk.mjs +8119 -0
  208. package/lib/utils-D0GRDgAr.mjs +12315 -0
  209. package/lib/utils-D0Z1fyoO.mjs +12299 -0
  210. package/lib/utils-D2YknRk4.mjs +51 -0
  211. package/lib/utils-DppGHXQB.mjs +51 -0
  212. package/lib/utils-DzXZDfYc.mjs +51 -0
  213. package/lib/utils-W8WdSBpX.mjs +12315 -0
  214. package/lib/vision-guard-01qSwFpf.mjs +92 -0
  215. package/lib/vision-guard-BDD4OrKo.mjs +92 -0
  216. package/lib/vision-guard-DzZGaOga.mjs +92 -0
  217. package/lib/wafer-CgtPHerf.mjs +17 -0
  218. package/lib/wafer-DRU0EjZX.mjs +17 -0
  219. package/lib/wafer-cBtrn6q9.mjs +17 -0
  220. package/lib/xai-oauth-Buk8XVvM.mjs +446 -0
  221. package/lib/xai-oauth-CMal8l1O.mjs +446 -0
  222. package/lib/xai-oauth-DPHDXKD7.mjs +446 -0
  223. package/lib/xiaomi-CZgwvX2G.mjs +157 -0
  224. package/lib/xiaomi-D2qT5cAC.mjs +157 -0
  225. package/lib/xiaomi-Dd87KSg5.mjs +157 -0
  226. package/lib/zai-7DWMkEqM.mjs +203 -0
  227. package/lib/zai-C59YnomG.mjs +203 -0
  228. package/lib/zai-CFeOt-53.mjs +203 -0
  229. package/lib/zip-Cg9ANN_U.mjs +1316 -0
  230. package/lib/zip-D36ZKsP8.mjs +1316 -0
  231. package/lib/zip-D6QXpvaJ.mjs +1316 -0
  232. package/package.json +14 -10
  233. package/presets/package.json +1 -1
  234. package/presets/tool-plus-ptc/preset.yml +1 -1
  235. package/presets/tool-plus-standard/preset.yml +1 -1
@@ -0,0 +1,211 @@
1
+ import { installBunShim as __installBunShim } from "./bun-shim.mjs";
2
+ __installBunShim();
3
+ import { P as $env } from "./src-lDmkSRbm.mjs";
4
+ import { c as OAuthError } from "./error-yCSG0mGC.mjs";
5
+ import { i as getGeminiCliHeaders } from "./gemini-headers-DKUShltF.mjs";
6
+ import { n as runGoogleOAuthLogin, r as throwIfLoginCancelled, t as oauthFetch } from "./google-oauth-shared-yqlyqPPC.mjs";
7
+ //#region node_modules/.pnpm/@oh-my-pi+pi-ai@17.3.5/node_modules/@oh-my-pi/pi-ai/src/registry/oauth/google-gemini-cli.ts
8
+ /**
9
+ * Gemini CLI OAuth flow (Google Cloud Code Assist)
10
+ * Standard Gemini models only (gemini-2.0-flash, gemini-2.5-*)
11
+ */
12
+ const decode = (s) => atob(s);
13
+ const CLIENT_ID = decode("NjgxMjU1ODA5Mzk1LW9vOGZ0Mm9wcmRybnA5ZTNhcWY2YXYzaG1kaWIxMzVqLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29t");
14
+ const CLIENT_SECRET = decode("R09DU1BYLTR1SGdNUG0tMW83U2stZ2VWNkN1NWNsWEZzeGw=");
15
+ const CALLBACK_PORT = 8085;
16
+ const CALLBACK_PATH = "/oauth2callback";
17
+ const SCOPES = [
18
+ "https://www.googleapis.com/auth/cloud-platform",
19
+ "https://www.googleapis.com/auth/userinfo.email",
20
+ "https://www.googleapis.com/auth/userinfo.profile"
21
+ ];
22
+ const AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
23
+ const TOKEN_URL = "https://oauth2.googleapis.com/token";
24
+ const CODE_ASSIST_ENDPOINT = "https://cloudcode-pa.googleapis.com";
25
+ const TIER_FREE = "free-tier";
26
+ const TIER_LEGACY = "legacy-tier";
27
+ const TIER_STANDARD = "standard-tier";
28
+ function getDefaultTier(allowedTiers) {
29
+ if (!allowedTiers || allowedTiers.length === 0) return { id: TIER_LEGACY };
30
+ return allowedTiers.find((t) => t.isDefault) ?? { id: TIER_LEGACY };
31
+ }
32
+ function isVpcScAffectedUser(payload) {
33
+ if (!payload || typeof payload !== "object") return false;
34
+ if (!("error" in payload)) return false;
35
+ const error = payload.error;
36
+ if (!error?.details || !Array.isArray(error.details)) return false;
37
+ return error.details.some((detail) => detail.reason === "SECURITY_POLICY_VIOLATED");
38
+ }
39
+ /**
40
+ * LRO poll cadence and bound. Cloud Code Assist project provisioning normally
41
+ * completes within a handful of polls; the attempt cap converts a stuck
42
+ * `done: false` operation (or a service incident) into a bounded login error
43
+ * instead of the previous unbounded loop.
44
+ */
45
+ const POLL_INTERVAL_MS = 5e3;
46
+ async function pollOperation(operationName, headers, signal, onProgress) {
47
+ for (let attempt = 0; attempt < 24; attempt += 1) {
48
+ if (attempt > 0) {
49
+ onProgress?.(`Waiting for project provisioning (attempt ${attempt + 1}/24)...`);
50
+ throwIfLoginCancelled(signal);
51
+ await Bun.sleep(POLL_INTERVAL_MS);
52
+ }
53
+ throwIfLoginCancelled(signal);
54
+ const response = await oauthFetch(`${CODE_ASSIST_ENDPOINT}/v1internal/${operationName}`, {
55
+ method: "GET",
56
+ headers
57
+ }, {
58
+ provider: "google-gemini-cli",
59
+ signal
60
+ });
61
+ if (!response.ok) throw new OAuthError(`Failed to poll operation: ${response.status} ${response.statusText}`, {
62
+ kind: "polling",
63
+ provider: "google-gemini-cli",
64
+ status: response.status
65
+ });
66
+ const data = await response.json();
67
+ if (data.done) return data;
68
+ }
69
+ throw new OAuthError(`Project provisioning did not complete after 24 attempts`, {
70
+ kind: "timeout",
71
+ provider: "google-gemini-cli"
72
+ });
73
+ }
74
+ async function discoverProject(accessToken, onProgress, signal) {
75
+ const envProjectId = $env.GOOGLE_CLOUD_PROJECT || $env.GOOGLE_CLOUD_PROJECT_ID;
76
+ const headers = {
77
+ Authorization: `Bearer ${accessToken}`,
78
+ "Content-Type": "application/json",
79
+ ...getGeminiCliHeaders()
80
+ };
81
+ onProgress?.("Checking for existing Cloud Code Assist project...");
82
+ const loadResponse = await oauthFetch(`${CODE_ASSIST_ENDPOINT}/v1internal:loadCodeAssist`, {
83
+ method: "POST",
84
+ headers,
85
+ body: JSON.stringify({
86
+ cloudaicompanionProject: envProjectId,
87
+ metadata: {
88
+ ideType: "IDE_UNSPECIFIED",
89
+ platform: "PLATFORM_UNSPECIFIED",
90
+ pluginType: "GEMINI",
91
+ duetProject: envProjectId
92
+ }
93
+ })
94
+ }, {
95
+ provider: "google-gemini-cli",
96
+ signal
97
+ });
98
+ let data;
99
+ if (!loadResponse.ok) {
100
+ let errorPayload;
101
+ try {
102
+ errorPayload = await loadResponse.clone().json();
103
+ } catch {
104
+ errorPayload = void 0;
105
+ }
106
+ if (isVpcScAffectedUser(errorPayload)) data = { currentTier: { id: TIER_STANDARD } };
107
+ else {
108
+ const errorText = await loadResponse.text();
109
+ throw new OAuthError(`loadCodeAssist failed: ${loadResponse.status} ${loadResponse.statusText}: ${errorText}`, {
110
+ kind: "discovery",
111
+ provider: "google-gemini-cli",
112
+ status: loadResponse.status
113
+ });
114
+ }
115
+ } else data = await loadResponse.json();
116
+ if (data.currentTier) {
117
+ if (data.cloudaicompanionProject) return data.cloudaicompanionProject;
118
+ if (envProjectId) return envProjectId;
119
+ throw new OAuthError("This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. See https://goo.gle/gemini-cli-auth-docs#workspace-gca", {
120
+ kind: "configuration",
121
+ provider: "google-gemini-cli"
122
+ });
123
+ }
124
+ const tierId = getDefaultTier(data.allowedTiers)?.id ?? TIER_FREE;
125
+ if (tierId !== TIER_FREE && !envProjectId) throw new OAuthError("This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. See https://goo.gle/gemini-cli-auth-docs#workspace-gca", {
126
+ kind: "configuration",
127
+ provider: "google-gemini-cli"
128
+ });
129
+ onProgress?.("Provisioning Cloud Code Assist project (this may take a moment)...");
130
+ const onboardBody = {
131
+ tierId,
132
+ metadata: {
133
+ ideType: "IDE_UNSPECIFIED",
134
+ platform: "PLATFORM_UNSPECIFIED",
135
+ pluginType: "GEMINI"
136
+ }
137
+ };
138
+ if (tierId !== TIER_FREE && envProjectId) {
139
+ onboardBody.cloudaicompanionProject = envProjectId;
140
+ onboardBody.metadata.duetProject = envProjectId;
141
+ }
142
+ const onboardResponse = await oauthFetch(`${CODE_ASSIST_ENDPOINT}/v1internal:onboardUser`, {
143
+ method: "POST",
144
+ headers,
145
+ body: JSON.stringify(onboardBody)
146
+ }, {
147
+ provider: "google-gemini-cli",
148
+ signal
149
+ });
150
+ if (!onboardResponse.ok) {
151
+ const errorText = await onboardResponse.text();
152
+ throw new OAuthError(`onboardUser failed: ${onboardResponse.status} ${onboardResponse.statusText}: ${errorText}`, {
153
+ kind: "provisioning",
154
+ provider: "google-gemini-cli",
155
+ status: onboardResponse.status
156
+ });
157
+ }
158
+ let lroData = await onboardResponse.json();
159
+ if (!lroData.done && lroData.name) lroData = await pollOperation(lroData.name, headers, signal, onProgress);
160
+ const projectId = lroData.response?.cloudaicompanionProject?.id;
161
+ if (projectId) return projectId;
162
+ if (envProjectId) return envProjectId;
163
+ throw new OAuthError("Could not discover or provision a Google Cloud project. Try setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. See https://goo.gle/gemini-cli-auth-docs#workspace-gca", {
164
+ kind: "validation",
165
+ provider: "google-gemini-cli"
166
+ });
167
+ }
168
+ async function loginGeminiCli(ctrl) {
169
+ return runGoogleOAuthLogin(ctrl, {
170
+ provider: "google-gemini-cli",
171
+ clientId: CLIENT_ID,
172
+ clientSecret: CLIENT_SECRET,
173
+ authUrl: AUTH_URL,
174
+ tokenUrl: TOKEN_URL,
175
+ scopes: SCOPES,
176
+ callbackPort: CALLBACK_PORT,
177
+ callbackPath: CALLBACK_PATH,
178
+ discoverProject
179
+ });
180
+ }
181
+ /**
182
+ * Refresh Google Cloud Code Assist token
183
+ */
184
+ async function refreshGoogleCloudToken(refreshToken, projectId) {
185
+ const response = await fetch(TOKEN_URL, {
186
+ method: "POST",
187
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
188
+ body: new URLSearchParams({
189
+ client_id: CLIENT_ID,
190
+ client_secret: CLIENT_SECRET,
191
+ refresh_token: refreshToken,
192
+ grant_type: "refresh_token"
193
+ })
194
+ });
195
+ if (!response.ok) {
196
+ const error = await response.text();
197
+ throw new OAuthError(`Google Cloud token refresh failed: ${error}`, {
198
+ kind: "token-refresh",
199
+ provider: "google-gemini-cli"
200
+ });
201
+ }
202
+ const data = await response.json();
203
+ return {
204
+ refresh: data.refresh_token || refreshToken,
205
+ access: data.access_token,
206
+ expires: Date.now() + data.expires_in * 1e3 - 3e5,
207
+ projectId
208
+ };
209
+ }
210
+ //#endregion
211
+ export { loginGeminiCli, refreshGoogleCloudToken };