@slkiser/opencode-quota 4.0.1 → 4.2.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.
Files changed (358) hide show
  1. package/README.md +94 -28
  2. package/dist/bin/opencode-quota.d.ts.map +1 -1
  3. package/dist/bin/opencode-quota.js +8 -0
  4. package/dist/bin/opencode-quota.js.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/lib/anthropic.d.ts.map +1 -1
  8. package/dist/lib/anthropic.js +78 -72
  9. package/dist/lib/anthropic.js.map +1 -1
  10. package/dist/lib/api-key-resolver.d.ts +73 -22
  11. package/dist/lib/api-key-resolver.d.ts.map +1 -1
  12. package/dist/lib/api-key-resolver.js +116 -39
  13. package/dist/lib/api-key-resolver.js.map +1 -1
  14. package/dist/lib/atomic-json.d.ts +3 -1
  15. package/dist/lib/atomic-json.d.ts.map +1 -1
  16. package/dist/lib/atomic-json.js +23 -9
  17. package/dist/lib/atomic-json.js.map +1 -1
  18. package/dist/lib/chutes-config.d.ts.map +1 -1
  19. package/dist/lib/chutes-config.js +2 -4
  20. package/dist/lib/chutes-config.js.map +1 -1
  21. package/dist/lib/chutes.d.ts.map +1 -1
  22. package/dist/lib/chutes.js +28 -23
  23. package/dist/lib/chutes.js.map +1 -1
  24. package/dist/lib/cli-show.d.ts +9 -0
  25. package/dist/lib/cli-show.d.ts.map +1 -1
  26. package/dist/lib/cli-show.js +34 -5
  27. package/dist/lib/cli-show.js.map +1 -1
  28. package/dist/lib/cli-status.d.ts +8 -0
  29. package/dist/lib/cli-status.d.ts.map +1 -0
  30. package/dist/lib/cli-status.js +125 -0
  31. package/dist/lib/cli-status.js.map +1 -0
  32. package/dist/lib/config.d.ts +1 -1
  33. package/dist/lib/config.d.ts.map +1 -1
  34. package/dist/lib/config.js +47 -12
  35. package/dist/lib/config.js.map +1 -1
  36. package/dist/lib/copilot.d.ts +11 -5
  37. package/dist/lib/copilot.d.ts.map +1 -1
  38. package/dist/lib/copilot.js +378 -79
  39. package/dist/lib/copilot.js.map +1 -1
  40. package/dist/lib/deepseek-auth.d.ts.map +1 -1
  41. package/dist/lib/deepseek-auth.js +3 -7
  42. package/dist/lib/deepseek-auth.js.map +1 -1
  43. package/dist/lib/deepseek.d.ts.map +1 -1
  44. package/dist/lib/deepseek.js +22 -17
  45. package/dist/lib/deepseek.js.map +1 -1
  46. package/dist/lib/display-sanitize.d.ts.map +1 -1
  47. package/dist/lib/display-sanitize.js +8 -0
  48. package/dist/lib/display-sanitize.js.map +1 -1
  49. package/dist/lib/entries.d.ts +14 -0
  50. package/dist/lib/entries.d.ts.map +1 -1
  51. package/dist/lib/entries.js.map +1 -1
  52. package/dist/lib/format-utils.d.ts +7 -0
  53. package/dist/lib/format-utils.d.ts.map +1 -1
  54. package/dist/lib/format-utils.js +18 -0
  55. package/dist/lib/format-utils.js.map +1 -1
  56. package/dist/lib/format.d.ts +1 -0
  57. package/dist/lib/format.d.ts.map +1 -1
  58. package/dist/lib/format.js +22 -7
  59. package/dist/lib/format.js.map +1 -1
  60. package/dist/lib/glm-coding-plan.d.ts +18 -0
  61. package/dist/lib/glm-coding-plan.d.ts.map +1 -0
  62. package/dist/lib/glm-coding-plan.js +68 -0
  63. package/dist/lib/glm-coding-plan.js.map +1 -0
  64. package/dist/lib/google-agy-companion.d.ts +4 -25
  65. package/dist/lib/google-agy-companion.d.ts.map +1 -1
  66. package/dist/lib/google-agy-companion.js +47 -272
  67. package/dist/lib/google-agy-companion.js.map +1 -1
  68. package/dist/lib/google-agy.d.ts.map +1 -1
  69. package/dist/lib/google-agy.js +204 -111
  70. package/dist/lib/google-agy.js.map +1 -1
  71. package/dist/lib/google-antigravity-companion.d.ts +4 -25
  72. package/dist/lib/google-antigravity-companion.d.ts.map +1 -1
  73. package/dist/lib/google-antigravity-companion.js +44 -283
  74. package/dist/lib/google-antigravity-companion.js.map +1 -1
  75. package/dist/lib/google-companion-credentials.d.ts +70 -0
  76. package/dist/lib/google-companion-credentials.d.ts.map +1 -0
  77. package/dist/lib/google-companion-credentials.js +265 -0
  78. package/dist/lib/google-companion-credentials.js.map +1 -0
  79. package/dist/lib/google-gemini-cli-companion.d.ts +4 -25
  80. package/dist/lib/google-gemini-cli-companion.d.ts.map +1 -1
  81. package/dist/lib/google-gemini-cli-companion.js +47 -258
  82. package/dist/lib/google-gemini-cli-companion.js.map +1 -1
  83. package/dist/lib/google-gemini-cli.d.ts.map +1 -1
  84. package/dist/lib/google-gemini-cli.js +55 -61
  85. package/dist/lib/google-gemini-cli.js.map +1 -1
  86. package/dist/lib/google-token-cache.d.ts.map +1 -1
  87. package/dist/lib/google-token-cache.js +87 -34
  88. package/dist/lib/google-token-cache.js.map +1 -1
  89. package/dist/lib/google.d.ts.map +1 -1
  90. package/dist/lib/google.js +80 -84
  91. package/dist/lib/google.js.map +1 -1
  92. package/dist/lib/grouped-entry-normalization.d.ts.map +1 -1
  93. package/dist/lib/grouped-entry-normalization.js +7 -1
  94. package/dist/lib/grouped-entry-normalization.js.map +1 -1
  95. package/dist/lib/http.d.ts +12 -7
  96. package/dist/lib/http.d.ts.map +1 -1
  97. package/dist/lib/http.js +28 -15
  98. package/dist/lib/http.js.map +1 -1
  99. package/dist/lib/init-installer.d.ts +2 -1
  100. package/dist/lib/init-installer.d.ts.map +1 -1
  101. package/dist/lib/init-installer.js +29 -2
  102. package/dist/lib/init-installer.js.map +1 -1
  103. package/dist/lib/kimi-auth.d.ts +3 -26
  104. package/dist/lib/kimi-auth.d.ts.map +1 -1
  105. package/dist/lib/kimi-auth.js +24 -91
  106. package/dist/lib/kimi-auth.js.map +1 -1
  107. package/dist/lib/kimi.d.ts.map +1 -1
  108. package/dist/lib/kimi.js +20 -15
  109. package/dist/lib/kimi.js.map +1 -1
  110. package/dist/lib/maintainer-announcements.d.ts.map +1 -1
  111. package/dist/lib/maintainer-announcements.js +5 -0
  112. package/dist/lib/maintainer-announcements.js.map +1 -1
  113. package/dist/lib/map-with-concurrency.d.ts +2 -0
  114. package/dist/lib/map-with-concurrency.d.ts.map +1 -0
  115. package/dist/lib/map-with-concurrency.js +17 -0
  116. package/dist/lib/map-with-concurrency.js.map +1 -0
  117. package/dist/lib/mimo-config.d.ts +29 -0
  118. package/dist/lib/mimo-config.d.ts.map +1 -0
  119. package/dist/lib/mimo-config.js +147 -0
  120. package/dist/lib/mimo-config.js.map +1 -0
  121. package/dist/lib/mimo.d.ts +35 -0
  122. package/dist/lib/mimo.d.ts.map +1 -0
  123. package/dist/lib/mimo.js +236 -0
  124. package/dist/lib/mimo.js.map +1 -0
  125. package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
  126. package/dist/lib/modelsdev-pricing.js +39 -27
  127. package/dist/lib/modelsdev-pricing.js.map +1 -1
  128. package/dist/lib/nanogpt-config.d.ts.map +1 -1
  129. package/dist/lib/nanogpt-config.js +2 -4
  130. package/dist/lib/nanogpt-config.js.map +1 -1
  131. package/dist/lib/nanogpt.d.ts.map +1 -1
  132. package/dist/lib/nanogpt.js +40 -30
  133. package/dist/lib/nanogpt.js.map +1 -1
  134. package/dist/lib/ollama-cloud.d.ts +1 -1
  135. package/dist/lib/ollama-cloud.d.ts.map +1 -1
  136. package/dist/lib/ollama-cloud.js +73 -68
  137. package/dist/lib/ollama-cloud.js.map +1 -1
  138. package/dist/lib/openai.d.ts.map +1 -1
  139. package/dist/lib/openai.js +53 -48
  140. package/dist/lib/openai.js.map +1 -1
  141. package/dist/lib/opencode-config-providers.d.ts.map +1 -1
  142. package/dist/lib/opencode-config-providers.js +13 -16
  143. package/dist/lib/opencode-config-providers.js.map +1 -1
  144. package/dist/lib/opencode-config-read.d.ts +23 -0
  145. package/dist/lib/opencode-config-read.d.ts.map +1 -0
  146. package/dist/lib/opencode-config-read.js +30 -0
  147. package/dist/lib/opencode-config-read.js.map +1 -0
  148. package/dist/lib/opencode-go.d.ts.map +1 -1
  149. package/dist/lib/opencode-go.js +44 -39
  150. package/dist/lib/opencode-go.js.map +1 -1
  151. package/dist/lib/opencode-zen-config.d.ts +34 -0
  152. package/dist/lib/opencode-zen-config.d.ts.map +1 -0
  153. package/dist/lib/opencode-zen-config.js +103 -0
  154. package/dist/lib/opencode-zen-config.js.map +1 -0
  155. package/dist/lib/opencode-zen.d.ts +27 -0
  156. package/dist/lib/opencode-zen.d.ts.map +1 -0
  157. package/dist/lib/opencode-zen.js +143 -0
  158. package/dist/lib/opencode-zen.js.map +1 -0
  159. package/dist/lib/openrouter.d.ts +13 -0
  160. package/dist/lib/openrouter.d.ts.map +1 -0
  161. package/dist/lib/openrouter.js +41 -0
  162. package/dist/lib/openrouter.js.map +1 -0
  163. package/dist/lib/provider-add-command.d.ts.map +1 -1
  164. package/dist/lib/provider-add-command.js +4 -12
  165. package/dist/lib/provider-add-command.js.map +1 -1
  166. package/dist/lib/provider-add-json-v1-questionnaire.d.ts +32 -0
  167. package/dist/lib/provider-add-json-v1-questionnaire.d.ts.map +1 -0
  168. package/dist/lib/provider-add-json-v1-questionnaire.js +336 -0
  169. package/dist/lib/provider-add-json-v1-questionnaire.js.map +1 -0
  170. package/dist/lib/provider-availability.d.ts +2 -2
  171. package/dist/lib/provider-availability.d.ts.map +1 -1
  172. package/dist/lib/provider-availability.js +2 -3
  173. package/dist/lib/provider-availability.js.map +1 -1
  174. package/dist/lib/provider-metadata.d.ts +300 -1
  175. package/dist/lib/provider-metadata.d.ts.map +1 -1
  176. package/dist/lib/provider-metadata.js +332 -227
  177. package/dist/lib/provider-metadata.js.map +1 -1
  178. package/dist/lib/quota-command-format.d.ts.map +1 -1
  179. package/dist/lib/quota-command-format.js +12 -16
  180. package/dist/lib/quota-command-format.js.map +1 -1
  181. package/dist/lib/quota-dialog-commands.d.ts +59 -2
  182. package/dist/lib/quota-dialog-commands.d.ts.map +1 -1
  183. package/dist/lib/quota-dialog-commands.js +73 -39
  184. package/dist/lib/quota-dialog-commands.js.map +1 -1
  185. package/dist/lib/quota-entry-display.d.ts +2 -0
  186. package/dist/lib/quota-entry-display.d.ts.map +1 -1
  187. package/dist/lib/quota-entry-display.js +27 -13
  188. package/dist/lib/quota-entry-display.js.map +1 -1
  189. package/dist/lib/quota-providers-remote.d.ts +0 -1
  190. package/dist/lib/quota-providers-remote.d.ts.map +1 -1
  191. package/dist/lib/quota-providers-remote.js +3 -16
  192. package/dist/lib/quota-providers-remote.js.map +1 -1
  193. package/dist/lib/quota-render-data.d.ts +4 -0
  194. package/dist/lib/quota-render-data.d.ts.map +1 -1
  195. package/dist/lib/quota-render-data.js +118 -127
  196. package/dist/lib/quota-render-data.js.map +1 -1
  197. package/dist/lib/quota-runtime-context.d.ts +9 -1
  198. package/dist/lib/quota-runtime-context.d.ts.map +1 -1
  199. package/dist/lib/quota-runtime-context.js +5 -0
  200. package/dist/lib/quota-runtime-context.js.map +1 -1
  201. package/dist/lib/quota-state.d.ts.map +1 -1
  202. package/dist/lib/quota-state.js +25 -1
  203. package/dist/lib/quota-state.js.map +1 -1
  204. package/dist/lib/quota-stats.d.ts +1 -0
  205. package/dist/lib/quota-stats.d.ts.map +1 -1
  206. package/dist/lib/quota-stats.js +14 -4
  207. package/dist/lib/quota-stats.js.map +1 -1
  208. package/dist/lib/quota-status.d.ts +7 -17
  209. package/dist/lib/quota-status.d.ts.map +1 -1
  210. package/dist/lib/quota-status.js +123 -948
  211. package/dist/lib/quota-status.js.map +1 -1
  212. package/dist/lib/runtime-provider-ids.d.ts +4 -0
  213. package/dist/lib/runtime-provider-ids.d.ts.map +1 -0
  214. package/dist/lib/runtime-provider-ids.js +10 -0
  215. package/dist/lib/runtime-provider-ids.js.map +1 -0
  216. package/dist/lib/session-tokens.d.ts +2 -0
  217. package/dist/lib/session-tokens.d.ts.map +1 -1
  218. package/dist/lib/session-tokens.js +4 -2
  219. package/dist/lib/session-tokens.js.map +1 -1
  220. package/dist/lib/synthetic-config.d.ts.map +1 -1
  221. package/dist/lib/synthetic-config.js +2 -4
  222. package/dist/lib/synthetic-config.js.map +1 -1
  223. package/dist/lib/synthetic.d.ts.map +1 -1
  224. package/dist/lib/synthetic.js +37 -32
  225. package/dist/lib/synthetic.js.map +1 -1
  226. package/dist/lib/toast-format-grouped.d.ts +1 -0
  227. package/dist/lib/toast-format-grouped.d.ts.map +1 -1
  228. package/dist/lib/toast-format-grouped.js +33 -29
  229. package/dist/lib/toast-format-grouped.js.map +1 -1
  230. package/dist/lib/tui-refresh-lifecycle.d.ts +17 -0
  231. package/dist/lib/tui-refresh-lifecycle.d.ts.map +1 -0
  232. package/dist/lib/tui-refresh-lifecycle.js +83 -0
  233. package/dist/lib/tui-refresh-lifecycle.js.map +1 -0
  234. package/dist/lib/tui-runtime.d.ts +0 -5
  235. package/dist/lib/tui-runtime.d.ts.map +1 -1
  236. package/dist/lib/tui-runtime.js +1 -6
  237. package/dist/lib/tui-runtime.js.map +1 -1
  238. package/dist/lib/tui-sidebar-format.d.ts +1 -1
  239. package/dist/lib/tui-sidebar-format.d.ts.map +1 -1
  240. package/dist/lib/tui-sidebar-format.js +1 -0
  241. package/dist/lib/tui-sidebar-format.js.map +1 -1
  242. package/dist/lib/types.d.ts +72 -8
  243. package/dist/lib/types.d.ts.map +1 -1
  244. package/dist/lib/types.js +2 -0
  245. package/dist/lib/types.js.map +1 -1
  246. package/dist/lib/xai.d.ts +39 -0
  247. package/dist/lib/xai.d.ts.map +1 -0
  248. package/dist/lib/xai.js +153 -0
  249. package/dist/lib/xai.js.map +1 -0
  250. package/dist/lib/zai-auth.d.ts +3 -26
  251. package/dist/lib/zai-auth.d.ts.map +1 -1
  252. package/dist/lib/zai-auth.js +24 -94
  253. package/dist/lib/zai-auth.js.map +1 -1
  254. package/dist/lib/zai.d.ts +1 -8
  255. package/dist/lib/zai.d.ts.map +1 -1
  256. package/dist/lib/zai.js +11 -91
  257. package/dist/lib/zai.js.map +1 -1
  258. package/dist/lib/zhipu-auth.d.ts +3 -26
  259. package/dist/lib/zhipu-auth.d.ts.map +1 -1
  260. package/dist/lib/zhipu-auth.js +24 -94
  261. package/dist/lib/zhipu-auth.js.map +1 -1
  262. package/dist/lib/zhipu.d.ts +1 -8
  263. package/dist/lib/zhipu.d.ts.map +1 -1
  264. package/dist/lib/zhipu.js +10 -84
  265. package/dist/lib/zhipu.js.map +1 -1
  266. package/dist/plugin.d.ts.map +1 -1
  267. package/dist/plugin.js +20 -145
  268. package/dist/plugin.js.map +1 -1
  269. package/dist/providers/alibaba-coding-plan.d.ts.map +1 -1
  270. package/dist/providers/alibaba-coding-plan.js +33 -6
  271. package/dist/providers/alibaba-coding-plan.js.map +1 -1
  272. package/dist/providers/anthropic.d.ts.map +1 -1
  273. package/dist/providers/anthropic.js +35 -7
  274. package/dist/providers/anthropic.js.map +1 -1
  275. package/dist/providers/chutes.d.ts.map +1 -1
  276. package/dist/providers/chutes.js +10 -3
  277. package/dist/providers/chutes.js.map +1 -1
  278. package/dist/providers/copilot.d.ts.map +1 -1
  279. package/dist/providers/copilot.js +102 -31
  280. package/dist/providers/copilot.js.map +1 -1
  281. package/dist/providers/cursor.d.ts.map +1 -1
  282. package/dist/providers/cursor.js +34 -6
  283. package/dist/providers/cursor.js.map +1 -1
  284. package/dist/providers/deepseek.d.ts.map +1 -1
  285. package/dist/providers/deepseek.js +10 -3
  286. package/dist/providers/deepseek.js.map +1 -1
  287. package/dist/providers/glm-coding-plan-provider.d.ts +44 -0
  288. package/dist/providers/glm-coding-plan-provider.d.ts.map +1 -0
  289. package/dist/providers/glm-coding-plan-provider.js +62 -0
  290. package/dist/providers/glm-coding-plan-provider.js.map +1 -0
  291. package/dist/providers/google-agy.d.ts.map +1 -1
  292. package/dist/providers/google-agy.js +83 -42
  293. package/dist/providers/google-agy.js.map +1 -1
  294. package/dist/providers/google-antigravity.d.ts.map +1 -1
  295. package/dist/providers/google-antigravity.js +31 -6
  296. package/dist/providers/google-antigravity.js.map +1 -1
  297. package/dist/providers/google-gemini-cli.d.ts.map +1 -1
  298. package/dist/providers/google-gemini-cli.js +24 -6
  299. package/dist/providers/google-gemini-cli.js.map +1 -1
  300. package/dist/providers/kimi-code.d.ts.map +1 -1
  301. package/dist/providers/kimi-code.js +27 -8
  302. package/dist/providers/kimi-code.js.map +1 -1
  303. package/dist/providers/mimo.d.ts +3 -0
  304. package/dist/providers/mimo.d.ts.map +1 -0
  305. package/dist/providers/mimo.js +127 -0
  306. package/dist/providers/mimo.js.map +1 -0
  307. package/dist/providers/minimax-coding-plan.d.ts.map +1 -1
  308. package/dist/providers/minimax-coding-plan.js +68 -32
  309. package/dist/providers/minimax-coding-plan.js.map +1 -1
  310. package/dist/providers/nanogpt.d.ts.map +1 -1
  311. package/dist/providers/nanogpt.js +41 -4
  312. package/dist/providers/nanogpt.js.map +1 -1
  313. package/dist/providers/openai.d.ts.map +1 -1
  314. package/dist/providers/openai.js +20 -3
  315. package/dist/providers/openai.js.map +1 -1
  316. package/dist/providers/opencode-go.d.ts.map +1 -1
  317. package/dist/providers/opencode-go.js +33 -15
  318. package/dist/providers/opencode-go.js.map +1 -1
  319. package/dist/providers/opencode-zen.d.ts +3 -0
  320. package/dist/providers/opencode-zen.d.ts.map +1 -0
  321. package/dist/providers/opencode-zen.js +99 -0
  322. package/dist/providers/opencode-zen.js.map +1 -0
  323. package/dist/providers/openrouter.d.ts +6 -0
  324. package/dist/providers/openrouter.d.ts.map +1 -0
  325. package/dist/providers/openrouter.js +25 -0
  326. package/dist/providers/openrouter.js.map +1 -0
  327. package/dist/providers/quota-providers.d.ts.map +1 -1
  328. package/dist/providers/quota-providers.js +3 -3
  329. package/dist/providers/quota-providers.js.map +1 -1
  330. package/dist/providers/qwen-code.d.ts.map +1 -1
  331. package/dist/providers/qwen-code.js +19 -5
  332. package/dist/providers/qwen-code.js.map +1 -1
  333. package/dist/providers/registry.d.ts.map +1 -1
  334. package/dist/providers/registry.js +8 -0
  335. package/dist/providers/registry.js.map +1 -1
  336. package/dist/providers/result-helpers.d.ts +29 -1
  337. package/dist/providers/result-helpers.d.ts.map +1 -1
  338. package/dist/providers/result-helpers.js +69 -0
  339. package/dist/providers/result-helpers.js.map +1 -1
  340. package/dist/providers/synthetic.d.ts.map +1 -1
  341. package/dist/providers/synthetic.js +10 -3
  342. package/dist/providers/synthetic.js.map +1 -1
  343. package/dist/providers/xai.d.ts +6 -0
  344. package/dist/providers/xai.d.ts.map +1 -0
  345. package/dist/providers/xai.js +51 -0
  346. package/dist/providers/xai.js.map +1 -0
  347. package/dist/providers/zai.d.ts +1 -7
  348. package/dist/providers/zai.d.ts.map +1 -1
  349. package/dist/providers/zai.js +11 -46
  350. package/dist/providers/zai.js.map +1 -1
  351. package/dist/providers/zhipu.d.ts +1 -7
  352. package/dist/providers/zhipu.d.ts.map +1 -1
  353. package/dist/providers/zhipu.js +11 -46
  354. package/dist/providers/zhipu.js.map +1 -1
  355. package/dist/tui.d.ts.map +1 -1
  356. package/dist/tui.js +47 -136
  357. package/dist/tui.tsx +62 -179
  358. package/package.json +1 -1
@@ -0,0 +1,265 @@
1
+ import { readFile } from "fs/promises";
2
+ import { readdirSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, join } from "node:path";
5
+ import { pathToFileURL } from "node:url";
6
+ import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
7
+ const require = createRequire(import.meta.url);
8
+ function isModuleNotFoundError(error) {
9
+ if (!error || typeof error !== "object")
10
+ return false;
11
+ if ("code" in error && error.code === "MODULE_NOT_FOUND")
12
+ return true;
13
+ return error instanceof Error && error.message.includes("Cannot find module");
14
+ }
15
+ function isPackagePathNotExportedError(error) {
16
+ return Boolean(error &&
17
+ typeof error === "object" &&
18
+ "code" in error &&
19
+ error.code === "ERR_PACKAGE_PATH_NOT_EXPORTED");
20
+ }
21
+ function isFallthroughResolutionError(error) {
22
+ return isModuleNotFoundError(error) || isPackagePathNotExportedError(error);
23
+ }
24
+ function isMissingFileError(error) {
25
+ if (!error || typeof error !== "object" || !("code" in error))
26
+ return false;
27
+ return error.code === "ENOENT" || error.code === "ENOTDIR";
28
+ }
29
+ function markPackageFound(error, context) {
30
+ if (isPackagePathNotExportedError(error))
31
+ context.packageFound = true;
32
+ }
33
+ function resolveSpecifier(specifier, searchRuntimePaths, context) {
34
+ try {
35
+ return require.resolve(specifier);
36
+ }
37
+ catch (error) {
38
+ markPackageFound(error, context);
39
+ if (!searchRuntimePaths || !isFallthroughResolutionError(error))
40
+ throw error;
41
+ try {
42
+ return require.resolve(specifier, {
43
+ paths: getOpencodeRuntimeDirCandidates().cacheDirs,
44
+ });
45
+ }
46
+ catch (runtimeError) {
47
+ markPackageFound(runtimeError, context);
48
+ throw runtimeError;
49
+ }
50
+ }
51
+ }
52
+ function getRuntimePackageRoots(descriptor) {
53
+ const cacheDirs = getOpencodeRuntimeDirCandidates().cacheDirs;
54
+ const packageRoots = cacheDirs.map((cacheDir) => join(cacheDir, "node_modules", descriptor.packageName));
55
+ for (const cacheDir of cacheDirs) {
56
+ try {
57
+ const packagesDir = join(cacheDir, "packages");
58
+ if (descriptor.packageScan === "scoped") {
59
+ const [scope, name] = descriptor.packageName.split("/");
60
+ const scopeDir = join(packagesDir, scope);
61
+ for (const entry of readdirSync(scopeDir, { withFileTypes: true })) {
62
+ if (entry.isDirectory() && entry.name.startsWith(name)) {
63
+ const packagePath = join(scopeDir, entry.name);
64
+ packageRoots.push(packagePath);
65
+ packageRoots.push(join(packagePath, "node_modules", descriptor.packageName));
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {
71
+ if (entry.isDirectory() && entry.name.startsWith(descriptor.packageName)) {
72
+ const packagePath = join(packagesDir, entry.name);
73
+ packageRoots.push(packagePath);
74
+ packageRoots.push(join(packagePath, "node_modules", descriptor.packageName));
75
+ }
76
+ }
77
+ }
78
+ }
79
+ catch {
80
+ // A missing runtime packages directory is not an installed companion.
81
+ }
82
+ }
83
+ return packageRoots;
84
+ }
85
+ function buildConfiguredState(params) {
86
+ return {
87
+ presence: {
88
+ state: "present",
89
+ importSpecifier: params.importSpecifier,
90
+ resolvedPath: params.resolvedPath,
91
+ },
92
+ credentials: {
93
+ state: "configured",
94
+ clientId: params.clientId,
95
+ clientSecret: params.clientSecret,
96
+ resolvedPath: params.resolvedPath,
97
+ },
98
+ };
99
+ }
100
+ function buildInvalidState(descriptor, importSpecifier, resolvedPath) {
101
+ return {
102
+ presence: {
103
+ state: "invalid",
104
+ importSpecifier,
105
+ ...(resolvedPath ? { resolvedPath } : {}),
106
+ error: descriptor.invalidError,
107
+ },
108
+ credentials: {
109
+ state: "invalid",
110
+ ...(resolvedPath ? { resolvedPath } : {}),
111
+ error: descriptor.invalidError,
112
+ },
113
+ };
114
+ }
115
+ function parseSourceCredentials(descriptor, content) {
116
+ const readConstant = (name) => {
117
+ const escapedName = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
118
+ return (content
119
+ .match(new RegExp(`(?:export\\s+const|const|var)\\s+${escapedName}\\s*=\\s*["']([^"']+)["']`))?.[1]
120
+ ?.trim() ?? "");
121
+ };
122
+ const clientId = readConstant(descriptor.clientIdExport);
123
+ const clientSecret = readConstant(descriptor.clientSecretExport);
124
+ return clientId && clientSecret ? { clientId, clientSecret } : null;
125
+ }
126
+ async function readCredentialsPath(descriptor, importSpecifier, resolvedPath, readErrors) {
127
+ let content;
128
+ try {
129
+ content = await readFile(resolvedPath, "utf8");
130
+ }
131
+ catch (error) {
132
+ if (readErrors === "fallthrough-all" || isMissingFileError(error))
133
+ return null;
134
+ return buildInvalidState(descriptor, importSpecifier, resolvedPath);
135
+ }
136
+ const credentials = parseSourceCredentials(descriptor, content);
137
+ return credentials
138
+ ? buildConfiguredState({ importSpecifier, resolvedPath, ...credentials })
139
+ : buildInvalidState(descriptor, importSpecifier, resolvedPath);
140
+ }
141
+ async function resolveStage(descriptor, stage, context) {
142
+ if (stage.kind === "dynamic-import") {
143
+ for (const importSpecifier of stage.specifiers) {
144
+ let resolvedPath;
145
+ try {
146
+ resolvedPath = resolveSpecifier(importSpecifier, true, context);
147
+ }
148
+ catch (error) {
149
+ if (isFallthroughResolutionError(error))
150
+ continue;
151
+ return buildInvalidState(descriptor, importSpecifier);
152
+ }
153
+ let companionModule;
154
+ try {
155
+ companionModule = (await import(pathToFileURL(resolvedPath).href));
156
+ }
157
+ catch {
158
+ return buildInvalidState(descriptor, importSpecifier, resolvedPath);
159
+ }
160
+ const clientId = companionModule[descriptor.clientIdExport];
161
+ const clientSecret = companionModule[descriptor.clientSecretExport];
162
+ if (typeof clientId !== "string" ||
163
+ !clientId.trim() ||
164
+ typeof clientSecret !== "string" ||
165
+ !clientSecret.trim()) {
166
+ return buildInvalidState(descriptor, importSpecifier, resolvedPath);
167
+ }
168
+ return buildConfiguredState({
169
+ importSpecifier,
170
+ resolvedPath,
171
+ clientId: clientId.trim(),
172
+ clientSecret: clientSecret.trim(),
173
+ });
174
+ }
175
+ return null;
176
+ }
177
+ if (stage.kind === "runtime-files") {
178
+ for (const packageRoot of getRuntimePackageRoots(descriptor)) {
179
+ for (const parts of stage.candidatePaths) {
180
+ const resolved = await readCredentialsPath(descriptor, stage.importSpecifier, join(packageRoot, ...parts), stage.readErrors);
181
+ if (resolved)
182
+ return resolved;
183
+ }
184
+ }
185
+ return null;
186
+ }
187
+ if (stage.kind === "source-specifier") {
188
+ let resolvedPath;
189
+ try {
190
+ resolvedPath = resolveSpecifier(stage.importSpecifier, stage.searchRuntimePaths, context);
191
+ }
192
+ catch (error) {
193
+ return isFallthroughResolutionError(error)
194
+ ? null
195
+ : buildInvalidState(descriptor, stage.importSpecifier);
196
+ }
197
+ return ((await readCredentialsPath(descriptor, stage.importSpecifier, resolvedPath, stage.readErrors)) ?? buildInvalidState(descriptor, stage.importSpecifier, resolvedPath));
198
+ }
199
+ if (stage.kind === "package-json") {
200
+ let packageJsonPath;
201
+ try {
202
+ packageJsonPath = resolveSpecifier(stage.importSpecifier, true, context);
203
+ }
204
+ catch (error) {
205
+ return isFallthroughResolutionError(error)
206
+ ? null
207
+ : buildInvalidState(descriptor, stage.resolutionErrorImportSpecifier);
208
+ }
209
+ const packageRoot = dirname(packageJsonPath);
210
+ for (const parts of stage.candidatePaths) {
211
+ const resolved = await readCredentialsPath(descriptor, stage.candidateImportSpecifier, join(packageRoot, ...parts), stage.readErrors);
212
+ if (resolved)
213
+ return resolved;
214
+ }
215
+ const invalidPath = stage.exhaustedInvalidPath === "package-json"
216
+ ? packageJsonPath
217
+ : join(packageRoot, ...stage.candidatePaths[0]);
218
+ return buildInvalidState(descriptor, stage.candidateImportSpecifier, invalidPath);
219
+ }
220
+ let packageEntryPath;
221
+ try {
222
+ packageEntryPath = resolveSpecifier(stage.importSpecifier, true, context);
223
+ }
224
+ catch (error) {
225
+ return isFallthroughResolutionError(error)
226
+ ? null
227
+ : buildInvalidState(descriptor, stage.importSpecifier);
228
+ }
229
+ return ((await readCredentialsPath(descriptor, stage.importSpecifier, packageEntryPath, stage.readErrors)) ?? buildInvalidState(descriptor, stage.importSpecifier, packageEntryPath));
230
+ }
231
+ export function createGoogleCompanionCredentialResolver(descriptor) {
232
+ let resolvedStatePromise = null;
233
+ async function getResolvedState() {
234
+ if (!resolvedStatePromise) {
235
+ resolvedStatePromise = (async () => {
236
+ const context = { packageFound: false };
237
+ for (const stage of descriptor.stages) {
238
+ const resolved = await resolveStage(descriptor, stage, context);
239
+ if (resolved)
240
+ return resolved;
241
+ }
242
+ if (context.packageFound) {
243
+ return buildInvalidState(descriptor, descriptor.packageName);
244
+ }
245
+ return {
246
+ presence: {
247
+ state: "missing",
248
+ importSpecifier: descriptor.missingImportSpecifier,
249
+ error: descriptor.missingError,
250
+ },
251
+ credentials: { state: "missing", error: descriptor.missingError },
252
+ };
253
+ })();
254
+ }
255
+ return resolvedStatePromise;
256
+ }
257
+ return {
258
+ inspect: async () => (await getResolvedState()).presence,
259
+ resolveCredentials: async () => (await getResolvedState()).credentials,
260
+ clearCacheForTests: () => {
261
+ resolvedStatePromise = null;
262
+ },
263
+ };
264
+ }
265
+ //# sourceMappingURL=google-companion-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-companion-credentials.js","sourceRoot":"","sources":["../../src/lib/google-companion-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAE9E,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AA6E/C,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB;QAAE,OAAO,IAAI,CAAC;IACtE,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAc;IACnD,OAAO,OAAO,CACZ,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,IAAI,KAAK;QACf,KAAK,CAAC,IAAI,KAAK,+BAA+B,CAC/C,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAc;IAClD,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,6BAA6B,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5E,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;AAC7D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,OAA0B;IAClE,IAAI,6BAA6B,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;AACxE,CAAC;AAED,SAAS,gBAAgB,CACvB,SAAiB,EACjB,kBAA2B,EAC3B,OAA0B;IAE1B,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,kBAAkB,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC;QAE7E,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE;gBAChC,KAAK,EAAE,+BAA+B,EAAE,CAAC,SAAS;aACnD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACtB,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM,YAAY,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAqC;IACnE,MAAM,SAAS,GAAG,+BAA+B,EAAE,CAAC,SAAS,CAAC;IAC9D,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC9C,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC,CACvD,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC/C,IAAI,UAAU,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,KAAM,CAAC,CAAC;gBAC3C,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;oBACnE,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAK,CAAC,EAAE,CAAC;wBACxD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC/C,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;wBAC/B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC/E,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;oBACtE,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBACzE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;wBAClD,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;wBAC/B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC/E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;QACxE,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAK7B;IACC,OAAO;QACL,QAAQ,EAAE;YACR,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC;QACD,WAAW,EAAE;YACX,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,UAAqC,EACrC,eAAuB,EACvB,YAAqB;IAErB,OAAO;QACL,QAAQ,EAAE;YACR,KAAK,EAAE,SAAS;YAChB,eAAe;YACf,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,KAAK,EAAE,UAAU,CAAC,YAAY;SAC/B;QACD,WAAW,EAAE;YACX,KAAK,EAAE,SAAS;YAChB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,KAAK,EAAE,UAAU,CAAC,YAAY;SAC/B;KACF,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,UAAqC,EACrC,OAAe;IAEf,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,CACL,OAAO;aACJ,KAAK,CACJ,IAAI,MAAM,CAAC,oCAAoC,WAAW,2BAA2B,CAAC,CACvF,EAAE,CAAC,CAAC,CAAC;YACN,EAAE,IAAI,EAAE,IAAI,EAAE,CACjB,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACjE,OAAO,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,UAAqC,EACrC,eAAuB,EACvB,YAAoB,EACpB,UAA2B;IAE3B,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,KAAK,iBAAiB,IAAI,kBAAkB,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/E,OAAO,iBAAiB,CAAC,UAAU,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,WAAW,GAAG,sBAAsB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,WAAW;QAChB,CAAC,CAAC,oBAAoB,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,CAAC;QACzE,CAAC,CAAC,iBAAiB,CAAC,UAAU,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,UAAqC,EACrC,KAAqC,EACrC,OAA0B;IAE1B,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACpC,KAAK,MAAM,eAAe,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAC/C,IAAI,YAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,YAAY,GAAG,gBAAgB,CAAC,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,4BAA4B,CAAC,KAAK,CAAC;oBAAE,SAAS;gBAClD,OAAO,iBAAiB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YACxD,CAAC;YAED,IAAI,eAAwC,CAAC;YAC7C,IAAI,CAAC;gBACH,eAAe,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAGhE,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,iBAAiB,CAAC,UAAU,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC5D,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;YACpE,IACE,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAChB,OAAO,YAAY,KAAK,QAAQ;gBAChC,CAAC,YAAY,CAAC,IAAI,EAAE,EACpB,CAAC;gBACD,OAAO,iBAAiB,CAAC,UAAU,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,oBAAoB,CAAC;gBAC1B,eAAe;gBACf,YAAY;gBACZ,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;gBACzB,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE;aAClC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,KAAK,MAAM,WAAW,IAAI,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;gBACzC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC,UAAU,EACV,KAAK,CAAC,eAAe,EACrB,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,EAC3B,KAAK,CAAC,UAAU,CACjB,CAAC;gBACF,IAAI,QAAQ;oBAAE,OAAO,QAAQ,CAAC;YAChC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACtC,IAAI,YAAoB,CAAC;QACzB,IAAI,CAAC;YACH,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC5F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,4BAA4B,CAAC,KAAK,CAAC;gBACxC,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,CACL,CAAC,MAAM,mBAAmB,CACxB,UAAU,EACV,KAAK,CAAC,eAAe,EACrB,YAAY,EACZ,KAAK,CAAC,UAAU,CACjB,CAAC,IAAI,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,eAAe,EAAE,YAAY,CAAC,CACzE,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClC,IAAI,eAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,4BAA4B,CAAC,KAAK,CAAC;gBACxC,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC,UAAU,EACV,KAAK,CAAC,wBAAwB,EAC9B,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,EAC3B,KAAK,CAAC,UAAU,CACjB,CAAC;YACF,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC;QAChC,CAAC;QAED,MAAM,WAAW,GACf,KAAK,CAAC,oBAAoB,KAAK,cAAc;YAC3C,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAE,CAAC,CAAC;QACrD,OAAO,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,gBAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,gBAAgB,GAAG,gBAAgB,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,4BAA4B,CAAC,KAAK,CAAC;YACxC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,CACL,CAAC,MAAM,mBAAmB,CACxB,UAAU,EACV,KAAK,CAAC,eAAe,EACrB,gBAAgB,EAChB,KAAK,CAAC,UAAU,CACjB,CAAC,IAAI,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uCAAuC,CAAC,UAAqC;IAK3F,IAAI,oBAAoB,GAA2C,IAAI,CAAC;IAExE,KAAK,UAAU,gBAAgB;QAC7B,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,oBAAoB,GAAG,CAAC,KAAK,IAAI,EAAE;gBACjC,MAAM,OAAO,GAAsB,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;gBAC3D,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;oBACtC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;oBAChE,IAAI,QAAQ;wBAAE,OAAO,QAAQ,CAAC;gBAChC,CAAC;gBAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;oBACzB,OAAO,iBAAiB,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;gBAC/D,CAAC;gBACD,OAAO;oBACL,QAAQ,EAAE;wBACR,KAAK,EAAE,SAAS;wBAChB,eAAe,EAAE,UAAU,CAAC,sBAAsB;wBAClD,KAAK,EAAE,UAAU,CAAC,YAAY;qBAC/B;oBACD,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,YAAY,EAAE;iBAClE,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC,QAAQ;QACxD,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC,WAAW;QACtE,kBAAkB,EAAE,GAAG,EAAE;YACvB,oBAAoB,GAAG,IAAI,CAAC;QAC9B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,28 +1,7 @@
1
- export type GeminiCliCompanionPresence = {
2
- state: "present";
3
- importSpecifier: string;
4
- resolvedPath: string;
5
- } | {
6
- state: "missing";
7
- importSpecifier: string;
8
- error: string;
9
- } | {
10
- state: "invalid";
11
- importSpecifier: string;
12
- error: string;
13
- resolvedPath?: string;
14
- };
15
- export type GeminiCliConfiguredCredentials = {
16
- state: "configured";
17
- clientId: string;
18
- clientSecret: string;
19
- resolvedPath: string;
20
- };
21
- export type GeminiCliClientCredentials = GeminiCliConfiguredCredentials | {
22
- state: "missing" | "invalid";
23
- error: string;
24
- resolvedPath?: string;
25
- };
1
+ import { type GoogleCompanionClientCredentials, type GoogleCompanionConfiguredCredentials, type GoogleCompanionPresence } from "./google-companion-credentials.js";
2
+ export type GeminiCliCompanionPresence = GoogleCompanionPresence;
3
+ export type GeminiCliConfiguredCredentials = GoogleCompanionConfiguredCredentials;
4
+ export type GeminiCliClientCredentials = GoogleCompanionClientCredentials;
26
5
  export declare function inspectGeminiCliCompanionPresence(): Promise<GeminiCliCompanionPresence>;
27
6
  export declare function resolveGeminiCliClientCredentials(): Promise<GeminiCliClientCredentials>;
28
7
  export declare function clearGeminiCliCompanionCacheForTests(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"google-gemini-cli-companion.d.ts","sourceRoot":"","sources":["../../src/lib/google-gemini-cli-companion.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,0BAA0B,GAClC;IACE,KAAK,EAAE,SAAS,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,KAAK,EAAE,SAAS,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE,KAAK,EAAE,SAAS,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEN,MAAM,MAAM,8BAA8B,GAAG;IAC3C,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAClC,8BAA8B,GAC9B;IACE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAoTN,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAG7F;AAED,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAG7F;AAED,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D"}
1
+ {"version":3,"file":"google-gemini-cli-companion.d.ts","sourceRoot":"","sources":["../../src/lib/google-gemini-cli-companion.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EAEzC,KAAK,uBAAuB,EAC7B,MAAM,mCAAmC,CAAC;AA0D3C,MAAM,MAAM,0BAA0B,GAAG,uBAAuB,CAAC;AACjE,MAAM,MAAM,8BAA8B,GAAG,oCAAoC,CAAC;AAClF,MAAM,MAAM,0BAA0B,GAAG,gCAAgC,CAAC;AAE1E,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAE7F;AAED,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAE7F;AAED,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D"}
@@ -1,275 +1,64 @@
1
- import { readFile } from "fs/promises";
2
- import { readdirSync } from "node:fs";
3
- import { createRequire } from "node:module";
4
- import { dirname, join } from "node:path";
5
- import { pathToFileURL } from "node:url";
6
- import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
7
- const require = createRequire(import.meta.url);
8
- const COMPANION_PACKAGE_NAME = "opencode-gemini-auth";
9
- const COMPANION_JS_IMPORT_SPECIFIERS = [
10
- `${COMPANION_PACKAGE_NAME}/dist/src/constants.js`,
11
- `${COMPANION_PACKAGE_NAME}/src/constants.js`,
12
- ];
13
- const COMPANION_SOURCE_IMPORT_SPECIFIER = `${COMPANION_PACKAGE_NAME}/src/constants.ts`;
14
- const COMPANION_PACKAGE_JSON_SPECIFIER = `${COMPANION_PACKAGE_NAME}/package.json`;
15
- const COMPANION_DIRECT_CANDIDATE_PATHS = [
1
+ import { createGoogleCompanionCredentialResolver, } from "./google-companion-credentials.js";
2
+ const PACKAGE_NAME = "opencode-gemini-auth";
3
+ const SOURCE_SPECIFIER = `${PACKAGE_NAME}/src/constants.ts`;
4
+ const RUNTIME_CANDIDATES = [
16
5
  ["src", "constants.ts"],
17
6
  ["src", "constants.js"],
18
7
  ["dist", "src", "constants.js"],
19
8
  ["dist", "index.js"],
20
9
  ];
21
- const COMPANION_MISSING_ERROR = `Install ${COMPANION_PACKAGE_NAME} separately to enable Gemini CLI quota`;
22
- const COMPANION_INVALID_ERROR = `Installed ${COMPANION_PACKAGE_NAME} package is incompatible`;
23
- let resolvedCompanionStatePromise = null;
24
- function isModuleNotFoundError(error) {
25
- if (!error || typeof error !== "object") {
26
- return false;
27
- }
28
- const code = "code" in error ? error.code : undefined;
29
- if (code === "MODULE_NOT_FOUND") {
30
- return true;
31
- }
32
- const message = error instanceof Error ? error.message : "";
33
- return message.includes("Cannot find module");
34
- }
35
- function isPackagePathNotExportedError(error) {
36
- if (!error || typeof error !== "object") {
37
- return false;
38
- }
39
- return "code" in error && error.code === "ERR_PACKAGE_PATH_NOT_EXPORTED";
40
- }
41
- function isFallthroughResolutionError(error) {
42
- return isModuleNotFoundError(error) || isPackagePathNotExportedError(error);
43
- }
44
- function normalizeCredential(value) {
45
- return typeof value === "string" ? value.trim() : "";
46
- }
47
- function getCompanionResolvePaths() {
48
- const paths = [...getOpencodeRuntimeDirCandidates().cacheDirs];
49
- return paths;
50
- }
51
- function getRuntimePackageRoots() {
52
- const cacheDirs = getOpencodeRuntimeDirCandidates().cacheDirs;
53
- const packageRoots = cacheDirs.map((cacheDir) => join(cacheDir, "node_modules", COMPANION_PACKAGE_NAME));
54
- for (const cacheDir of cacheDirs) {
55
- try {
56
- const packagesDir = join(cacheDir, "packages");
57
- const entries = readdirSync(packagesDir, { withFileTypes: true });
58
- for (const entry of entries) {
59
- if (entry.isDirectory() && entry.name.startsWith(COMPANION_PACKAGE_NAME)) {
60
- packageRoots.push(join(packagesDir, entry.name));
61
- packageRoots.push(join(packagesDir, entry.name, "node_modules", COMPANION_PACKAGE_NAME));
62
- }
63
- }
64
- }
65
- catch {
66
- // Ignore if packages dir doesn't exist
67
- }
68
- }
69
- return packageRoots;
70
- }
71
- function markPackageFoundForExportBlock(error, context) {
72
- if (isPackagePathNotExportedError(error)) {
73
- context.packageFound = true;
74
- }
75
- }
76
- function resolveCompanionSpecifier(specifier, context) {
77
- try {
78
- return require.resolve(specifier);
79
- }
80
- catch (error) {
81
- markPackageFoundForExportBlock(error, context);
82
- if (!isFallthroughResolutionError(error)) {
83
- throw error;
84
- }
85
- try {
86
- return require.resolve(specifier, { paths: getCompanionResolvePaths() });
87
- }
88
- catch (resolvePathsError) {
89
- markPackageFoundForExportBlock(resolvePathsError, context);
90
- throw resolvePathsError;
91
- }
92
- }
93
- }
94
- function buildConfiguredState(params) {
95
- return {
96
- presence: {
97
- state: "present",
98
- importSpecifier: params.importSpecifier,
99
- resolvedPath: params.resolvedPath,
10
+ const descriptor = {
11
+ packageName: PACKAGE_NAME,
12
+ packageScan: "unscoped",
13
+ clientIdExport: "GEMINI_CLIENT_ID",
14
+ clientSecretExport: "GEMINI_CLIENT_SECRET",
15
+ missingImportSpecifier: SOURCE_SPECIFIER,
16
+ missingError: `Install ${PACKAGE_NAME} separately to enable Gemini CLI quota`,
17
+ invalidError: `Installed ${PACKAGE_NAME} package is incompatible`,
18
+ stages: [
19
+ {
20
+ kind: "dynamic-import",
21
+ specifiers: [`${PACKAGE_NAME}/dist/src/constants.js`, `${PACKAGE_NAME}/src/constants.js`],
100
22
  },
101
- credentials: {
102
- state: "configured",
103
- clientId: params.clientId,
104
- clientSecret: params.clientSecret,
105
- resolvedPath: params.resolvedPath,
23
+ {
24
+ kind: "source-specifier",
25
+ importSpecifier: SOURCE_SPECIFIER,
26
+ searchRuntimePaths: false,
27
+ readErrors: "fallthrough-all",
106
28
  },
107
- };
108
- }
109
- function buildInvalidState(importSpecifier, resolvedPath) {
110
- return {
111
- presence: {
112
- state: "invalid",
113
- importSpecifier,
114
- ...(resolvedPath ? { resolvedPath } : {}),
115
- error: COMPANION_INVALID_ERROR,
29
+ {
30
+ kind: "runtime-files",
31
+ importSpecifier: SOURCE_SPECIFIER,
32
+ candidatePaths: RUNTIME_CANDIDATES,
33
+ readErrors: "fallthrough-all",
116
34
  },
117
- credentials: {
118
- state: "invalid",
119
- ...(resolvedPath ? { resolvedPath } : {}),
120
- error: COMPANION_INVALID_ERROR,
35
+ {
36
+ kind: "package-json",
37
+ importSpecifier: `${PACKAGE_NAME}/package.json`,
38
+ candidateImportSpecifier: SOURCE_SPECIFIER,
39
+ candidatePaths: [
40
+ ["src", "constants.ts"],
41
+ ["dist", "index.js"],
42
+ ],
43
+ readErrors: "fallthrough-all",
44
+ resolutionErrorImportSpecifier: SOURCE_SPECIFIER,
45
+ exhaustedInvalidPath: "first-candidate",
121
46
  },
122
- };
123
- }
124
- function parseSourceCredentials(content) {
125
- const clientId = content
126
- .match(/(?:export\s+const|const|var)\s+GEMINI_CLIENT_ID\s*=\s*["']([^"']+)["']/)?.[1]
127
- ?.trim() ?? "";
128
- const clientSecret = content
129
- .match(/(?:export\s+const|const|var)\s+GEMINI_CLIENT_SECRET\s*=\s*["']([^"']+)["']/)?.[1]
130
- ?.trim() ?? "";
131
- return clientId && clientSecret ? { clientId, clientSecret } : null;
132
- }
133
- function getPackageCredentialPaths(packageRoot) {
134
- return COMPANION_DIRECT_CANDIDATE_PATHS.map((parts) => join(packageRoot, ...parts));
135
- }
136
- function getRuntimeSourceConstantPaths() {
137
- return getRuntimePackageRoots().flatMap((packageRoot) => getPackageCredentialPaths(packageRoot));
138
- }
139
- async function tryReadSourceConstantsPath(resolvedPath) {
140
- try {
141
- const content = await readFile(resolvedPath, "utf8");
142
- const credentials = parseSourceCredentials(content);
143
- if (!credentials) {
144
- return buildInvalidState(COMPANION_SOURCE_IMPORT_SPECIFIER, resolvedPath);
145
- }
146
- return buildConfiguredState({
147
- importSpecifier: COMPANION_SOURCE_IMPORT_SPECIFIER,
148
- resolvedPath,
149
- clientId: credentials.clientId,
150
- clientSecret: credentials.clientSecret,
151
- });
152
- }
153
- catch {
154
- return null;
155
- }
156
- }
157
- async function tryResolveJsConstants(importSpecifier, context) {
158
- let resolvedPath;
159
- try {
160
- resolvedPath = resolveCompanionSpecifier(importSpecifier, context);
161
- }
162
- catch (error) {
163
- if (isFallthroughResolutionError(error)) {
164
- return null;
165
- }
166
- return buildInvalidState(importSpecifier);
167
- }
168
- let companionModule;
169
- try {
170
- companionModule = (await import(pathToFileURL(resolvedPath).href));
171
- }
172
- catch {
173
- return buildInvalidState(importSpecifier, resolvedPath);
174
- }
175
- const clientId = normalizeCredential(companionModule.GEMINI_CLIENT_ID);
176
- const clientSecret = normalizeCredential(companionModule.GEMINI_CLIENT_SECRET);
177
- if (!clientId || !clientSecret) {
178
- return buildInvalidState(importSpecifier, resolvedPath);
179
- }
180
- return buildConfiguredState({ importSpecifier, resolvedPath, clientId, clientSecret });
181
- }
182
- async function tryResolvePackageEntry(context) {
183
- try {
184
- const packageEntryPath = resolveCompanionSpecifier(COMPANION_PACKAGE_NAME, context);
185
- const packageEntryResolved = await tryReadSourceConstantsPath(packageEntryPath);
186
- return packageEntryResolved ?? buildInvalidState(COMPANION_PACKAGE_NAME, packageEntryPath);
187
- }
188
- catch (error) {
189
- return isFallthroughResolutionError(error) ? null : buildInvalidState(COMPANION_PACKAGE_NAME);
190
- }
191
- }
192
- async function tryResolveSourceConstants(context) {
193
- let resolvedPath;
194
- try {
195
- resolvedPath = require.resolve(COMPANION_SOURCE_IMPORT_SPECIFIER);
196
- }
197
- catch (error) {
198
- if (!isFallthroughResolutionError(error)) {
199
- return buildInvalidState(COMPANION_SOURCE_IMPORT_SPECIFIER);
200
- }
201
- for (const candidatePath of getRuntimeSourceConstantPaths()) {
202
- const runtimeResolved = await tryReadSourceConstantsPath(candidatePath);
203
- if (runtimeResolved) {
204
- return runtimeResolved;
205
- }
206
- }
207
- try {
208
- const packageJsonPath = resolveCompanionSpecifier(COMPANION_PACKAGE_JSON_SPECIFIER, context);
209
- const packageRoot = dirname(packageJsonPath);
210
- for (const candidatePath of [
211
- join(packageRoot, "src", "constants.ts"),
212
- join(packageRoot, "dist", "index.js"),
213
- ]) {
214
- const packageResolved = await tryReadSourceConstantsPath(candidatePath);
215
- if (packageResolved) {
216
- return packageResolved;
217
- }
218
- }
219
- resolvedPath = join(packageRoot, "src", "constants.ts");
220
- }
221
- catch (packageError) {
222
- if (isFallthroughResolutionError(packageError)) {
223
- return tryResolvePackageEntry(context);
224
- }
225
- return buildInvalidState(COMPANION_SOURCE_IMPORT_SPECIFIER);
226
- }
227
- }
228
- return ((await tryReadSourceConstantsPath(resolvedPath)) ??
229
- buildInvalidState(COMPANION_SOURCE_IMPORT_SPECIFIER, resolvedPath));
230
- }
231
- async function resolveCompanionState() {
232
- const context = { packageFound: false };
233
- for (const importSpecifier of COMPANION_JS_IMPORT_SPECIFIERS) {
234
- const resolved = await tryResolveJsConstants(importSpecifier, context);
235
- if (resolved) {
236
- return resolved;
237
- }
238
- }
239
- const sourceResolved = await tryResolveSourceConstants(context);
240
- if (sourceResolved) {
241
- return sourceResolved;
242
- }
243
- if (context.packageFound) {
244
- return buildInvalidState(COMPANION_PACKAGE_NAME);
245
- }
246
- return {
247
- presence: {
248
- state: "missing",
249
- importSpecifier: COMPANION_SOURCE_IMPORT_SPECIFIER,
250
- error: COMPANION_MISSING_ERROR,
251
- },
252
- credentials: {
253
- state: "missing",
254
- error: COMPANION_MISSING_ERROR,
47
+ {
48
+ kind: "package-entry",
49
+ importSpecifier: PACKAGE_NAME,
50
+ readErrors: "fallthrough-all",
255
51
  },
256
- };
257
- }
258
- async function getResolvedCompanionState() {
259
- if (!resolvedCompanionStatePromise) {
260
- resolvedCompanionStatePromise = resolveCompanionState();
261
- }
262
- return resolvedCompanionStatePromise;
263
- }
52
+ ],
53
+ };
54
+ const resolver = createGoogleCompanionCredentialResolver(descriptor);
264
55
  export async function inspectGeminiCliCompanionPresence() {
265
- const resolved = await getResolvedCompanionState();
266
- return resolved.presence;
56
+ return resolver.inspect();
267
57
  }
268
58
  export async function resolveGeminiCliClientCredentials() {
269
- const resolved = await getResolvedCompanionState();
270
- return resolved.credentials;
59
+ return resolver.resolveCredentials();
271
60
  }
272
61
  export function clearGeminiCliCompanionCacheForTests() {
273
- resolvedCompanionStatePromise = null;
62
+ resolver.clearCacheForTests();
274
63
  }
275
64
  //# sourceMappingURL=google-gemini-cli-companion.js.map