@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,157 @@
1
+ import { installBunShim as __installBunShim } from "./bun-shim.mjs";
2
+ __installBunShim();
3
+ import { V as ProviderHttpError, _ as OnPromptRequiredError, h as LoginCancelledError, m as ApiKeyRequiredError } from "./error-yCSG0mGC.mjs";
4
+ //#region node_modules/.pnpm/@oh-my-pi+pi-ai@17.3.5/node_modules/@oh-my-pi/pi-ai/src/registry/api-key-validation.ts
5
+ const VALIDATION_TIMEOUT_MS = 15e3;
6
+ function normalizeAnthropicCompatibleBaseUrl(baseUrl) {
7
+ const trimmed = baseUrl.trim().replace(/\/+$/, "");
8
+ return trimmed.endsWith("/v1") ? trimmed.slice(0, -3) : trimmed;
9
+ }
10
+ function resolveValidationHeaders(headers) {
11
+ return typeof headers === "function" ? headers() : headers;
12
+ }
13
+ async function createApiKeyValidationError(provider, response) {
14
+ let details = "";
15
+ try {
16
+ details = (await response.text()).trim();
17
+ } catch {}
18
+ const message = details ? `${provider} API key validation failed (${response.status}): ${details}` : `${provider} API key validation failed (${response.status})`;
19
+ return new ProviderHttpError(message, response.status, { headers: response.headers });
20
+ }
21
+ /**
22
+ * Validate an API key against an OpenAI-compatible chat completions endpoint.
23
+ *
24
+ * Performs a minimal request to verify credentials and endpoint access.
25
+ */
26
+ async function validateOpenAICompatibleApiKey(options) {
27
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
28
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
29
+ const response = await (options.fetch ?? fetch)(`${options.baseUrl}/chat/completions`, {
30
+ method: "POST",
31
+ headers: {
32
+ "Content-Type": "application/json",
33
+ Authorization: `Bearer ${options.apiKey}`
34
+ },
35
+ body: JSON.stringify({
36
+ model: options.model,
37
+ messages: [{
38
+ role: "user",
39
+ content: "ping"
40
+ }],
41
+ max_tokens: 1,
42
+ temperature: 0
43
+ }),
44
+ signal
45
+ });
46
+ if (response.ok) return;
47
+ throw await createApiKeyValidationError(options.provider, response);
48
+ }
49
+ /**
50
+ * Validate an API key against an Anthropic-compatible messages endpoint.
51
+ */
52
+ async function validateAnthropicCompatibleApiKey(options) {
53
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
54
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
55
+ const baseUrl = normalizeAnthropicCompatibleBaseUrl(options.baseUrl);
56
+ const response = await (options.fetch ?? fetch)(`${baseUrl}/v1/messages`, {
57
+ method: "POST",
58
+ headers: {
59
+ "Content-Type": "application/json",
60
+ "anthropic-version": "2023-06-01",
61
+ "x-api-key": options.apiKey
62
+ },
63
+ body: JSON.stringify({
64
+ model: options.model,
65
+ messages: [{
66
+ role: "user",
67
+ content: "ping"
68
+ }],
69
+ max_tokens: 1
70
+ }),
71
+ signal
72
+ });
73
+ if (response.ok) return;
74
+ throw await createApiKeyValidationError(options.provider, response);
75
+ }
76
+ /**
77
+ * Validate an API key against a provider models endpoint.
78
+ *
79
+ * Useful for providers where access to specific models may vary by plan and
80
+ * should not block key validation.
81
+ */
82
+ async function validateApiKeyAgainstModelsEndpoint(options) {
83
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
84
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
85
+ const response = await (options.fetch ?? fetch)(options.modelsUrl, {
86
+ method: "GET",
87
+ headers: {
88
+ ...resolveValidationHeaders(options.headers) ?? {},
89
+ Authorization: `Bearer ${options.apiKey}`
90
+ },
91
+ signal
92
+ });
93
+ if (response.ok) return;
94
+ throw await createApiKeyValidationError(options.provider, response);
95
+ }
96
+ //#endregion
97
+ //#region node_modules/.pnpm/@oh-my-pi+pi-ai@17.3.5/node_modules/@oh-my-pi/pi-ai/src/registry/api-key-login.ts
98
+ /**
99
+ * Shared factory for API-key-paste "login" flows.
100
+ *
101
+ * Several providers (Cerebras, Synthetic, Moonshot, Together, NanoGPT, ZenMux)
102
+ * don't actually implement OAuth — they just ask the user to paste an API key,
103
+ * optionally validate it, and return the trimmed key.
104
+ */
105
+ function createApiKeyLogin(config) {
106
+ return async function login(options) {
107
+ if (!options.onPrompt) throw new OnPromptRequiredError(config.providerLabel);
108
+ if (config.authUrl && config.instructions) options.onAuth?.({
109
+ url: config.authUrl,
110
+ instructions: config.instructions
111
+ });
112
+ const apiKey = config.emptyKeyFallback === void 0 ? await options.onPrompt({
113
+ message: config.promptMessage,
114
+ placeholder: config.placeholder
115
+ }) : await options.onPrompt({
116
+ message: config.promptMessage,
117
+ placeholder: config.placeholder,
118
+ allowEmpty: true
119
+ });
120
+ if (options.signal?.aborted) throw new LoginCancelledError();
121
+ const trimmed = apiKey.trim();
122
+ if (!trimmed) {
123
+ if (config.emptyKeyFallback !== void 0) return config.emptyKeyFallback;
124
+ throw new ApiKeyRequiredError();
125
+ }
126
+ if (config.validation) {
127
+ options.onProgress?.("Validating API key...");
128
+ if (config.validation.kind === "chat-completions") await validateOpenAICompatibleApiKey({
129
+ provider: config.validation.provider,
130
+ apiKey: trimmed,
131
+ baseUrl: config.validation.baseUrl,
132
+ model: config.validation.model,
133
+ signal: options.signal,
134
+ fetch: options.fetch
135
+ });
136
+ else if (config.validation.kind === "anthropic-messages") await validateAnthropicCompatibleApiKey({
137
+ provider: config.validation.provider,
138
+ apiKey: trimmed,
139
+ baseUrl: config.validation.baseUrl,
140
+ model: config.validation.model,
141
+ signal: options.signal,
142
+ fetch: options.fetch
143
+ });
144
+ else await validateApiKeyAgainstModelsEndpoint({
145
+ provider: config.validation.provider,
146
+ apiKey: trimmed,
147
+ modelsUrl: typeof config.validation.modelsUrl === "function" ? config.validation.modelsUrl() : config.validation.modelsUrl,
148
+ headers: config.validation.headers,
149
+ signal: options.signal,
150
+ fetch: options.fetch
151
+ });
152
+ }
153
+ return trimmed;
154
+ };
155
+ }
156
+ //#endregion
157
+ export { validateApiKeyAgainstModelsEndpoint as n, validateOpenAICompatibleApiKey as r, createApiKeyLogin as t };
@@ -0,0 +1,157 @@
1
+ import { installBunShim as __installBunShim } from "./bun-shim.mjs";
2
+ __installBunShim();
3
+ import { V as ProviderHttpError, _ as OnPromptRequiredError, h as LoginCancelledError, m as ApiKeyRequiredError } from "./error-B3bevhrs.mjs";
4
+ //#region node_modules/.pnpm/@oh-my-pi+pi-ai@17.3.5/node_modules/@oh-my-pi/pi-ai/src/registry/api-key-validation.ts
5
+ const VALIDATION_TIMEOUT_MS = 15e3;
6
+ function normalizeAnthropicCompatibleBaseUrl(baseUrl) {
7
+ const trimmed = baseUrl.trim().replace(/\/+$/, "");
8
+ return trimmed.endsWith("/v1") ? trimmed.slice(0, -3) : trimmed;
9
+ }
10
+ function resolveValidationHeaders(headers) {
11
+ return typeof headers === "function" ? headers() : headers;
12
+ }
13
+ async function createApiKeyValidationError(provider, response) {
14
+ let details = "";
15
+ try {
16
+ details = (await response.text()).trim();
17
+ } catch {}
18
+ const message = details ? `${provider} API key validation failed (${response.status}): ${details}` : `${provider} API key validation failed (${response.status})`;
19
+ return new ProviderHttpError(message, response.status, { headers: response.headers });
20
+ }
21
+ /**
22
+ * Validate an API key against an OpenAI-compatible chat completions endpoint.
23
+ *
24
+ * Performs a minimal request to verify credentials and endpoint access.
25
+ */
26
+ async function validateOpenAICompatibleApiKey(options) {
27
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
28
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
29
+ const response = await (options.fetch ?? fetch)(`${options.baseUrl}/chat/completions`, {
30
+ method: "POST",
31
+ headers: {
32
+ "Content-Type": "application/json",
33
+ Authorization: `Bearer ${options.apiKey}`
34
+ },
35
+ body: JSON.stringify({
36
+ model: options.model,
37
+ messages: [{
38
+ role: "user",
39
+ content: "ping"
40
+ }],
41
+ max_tokens: 1,
42
+ temperature: 0
43
+ }),
44
+ signal
45
+ });
46
+ if (response.ok) return;
47
+ throw await createApiKeyValidationError(options.provider, response);
48
+ }
49
+ /**
50
+ * Validate an API key against an Anthropic-compatible messages endpoint.
51
+ */
52
+ async function validateAnthropicCompatibleApiKey(options) {
53
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
54
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
55
+ const baseUrl = normalizeAnthropicCompatibleBaseUrl(options.baseUrl);
56
+ const response = await (options.fetch ?? fetch)(`${baseUrl}/v1/messages`, {
57
+ method: "POST",
58
+ headers: {
59
+ "Content-Type": "application/json",
60
+ "anthropic-version": "2023-06-01",
61
+ "x-api-key": options.apiKey
62
+ },
63
+ body: JSON.stringify({
64
+ model: options.model,
65
+ messages: [{
66
+ role: "user",
67
+ content: "ping"
68
+ }],
69
+ max_tokens: 1
70
+ }),
71
+ signal
72
+ });
73
+ if (response.ok) return;
74
+ throw await createApiKeyValidationError(options.provider, response);
75
+ }
76
+ /**
77
+ * Validate an API key against a provider models endpoint.
78
+ *
79
+ * Useful for providers where access to specific models may vary by plan and
80
+ * should not block key validation.
81
+ */
82
+ async function validateApiKeyAgainstModelsEndpoint(options) {
83
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
84
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
85
+ const response = await (options.fetch ?? fetch)(options.modelsUrl, {
86
+ method: "GET",
87
+ headers: {
88
+ ...resolveValidationHeaders(options.headers) ?? {},
89
+ Authorization: `Bearer ${options.apiKey}`
90
+ },
91
+ signal
92
+ });
93
+ if (response.ok) return;
94
+ throw await createApiKeyValidationError(options.provider, response);
95
+ }
96
+ //#endregion
97
+ //#region node_modules/.pnpm/@oh-my-pi+pi-ai@17.3.5/node_modules/@oh-my-pi/pi-ai/src/registry/api-key-login.ts
98
+ /**
99
+ * Shared factory for API-key-paste "login" flows.
100
+ *
101
+ * Several providers (Cerebras, Synthetic, Moonshot, Together, NanoGPT, ZenMux)
102
+ * don't actually implement OAuth — they just ask the user to paste an API key,
103
+ * optionally validate it, and return the trimmed key.
104
+ */
105
+ function createApiKeyLogin(config) {
106
+ return async function login(options) {
107
+ if (!options.onPrompt) throw new OnPromptRequiredError(config.providerLabel);
108
+ if (config.authUrl && config.instructions) options.onAuth?.({
109
+ url: config.authUrl,
110
+ instructions: config.instructions
111
+ });
112
+ const apiKey = config.emptyKeyFallback === void 0 ? await options.onPrompt({
113
+ message: config.promptMessage,
114
+ placeholder: config.placeholder
115
+ }) : await options.onPrompt({
116
+ message: config.promptMessage,
117
+ placeholder: config.placeholder,
118
+ allowEmpty: true
119
+ });
120
+ if (options.signal?.aborted) throw new LoginCancelledError();
121
+ const trimmed = apiKey.trim();
122
+ if (!trimmed) {
123
+ if (config.emptyKeyFallback !== void 0) return config.emptyKeyFallback;
124
+ throw new ApiKeyRequiredError();
125
+ }
126
+ if (config.validation) {
127
+ options.onProgress?.("Validating API key...");
128
+ if (config.validation.kind === "chat-completions") await validateOpenAICompatibleApiKey({
129
+ provider: config.validation.provider,
130
+ apiKey: trimmed,
131
+ baseUrl: config.validation.baseUrl,
132
+ model: config.validation.model,
133
+ signal: options.signal,
134
+ fetch: options.fetch
135
+ });
136
+ else if (config.validation.kind === "anthropic-messages") await validateAnthropicCompatibleApiKey({
137
+ provider: config.validation.provider,
138
+ apiKey: trimmed,
139
+ baseUrl: config.validation.baseUrl,
140
+ model: config.validation.model,
141
+ signal: options.signal,
142
+ fetch: options.fetch
143
+ });
144
+ else await validateApiKeyAgainstModelsEndpoint({
145
+ provider: config.validation.provider,
146
+ apiKey: trimmed,
147
+ modelsUrl: typeof config.validation.modelsUrl === "function" ? config.validation.modelsUrl() : config.validation.modelsUrl,
148
+ headers: config.validation.headers,
149
+ signal: options.signal,
150
+ fetch: options.fetch
151
+ });
152
+ }
153
+ return trimmed;
154
+ };
155
+ }
156
+ //#endregion
157
+ export { validateApiKeyAgainstModelsEndpoint as n, validateOpenAICompatibleApiKey as r, createApiKeyLogin as t };