@zhachory1/mewrite-ai 0.65.3

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 (238) hide show
  1. package/README.md +1330 -0
  2. package/dist/api-registry.d.ts +20 -0
  3. package/dist/api-registry.d.ts.map +1 -0
  4. package/dist/api-registry.js +44 -0
  5. package/dist/api-registry.js.map +1 -0
  6. package/dist/bedrock-provider.d.ts +5 -0
  7. package/dist/bedrock-provider.d.ts.map +1 -0
  8. package/dist/bedrock-provider.js +6 -0
  9. package/dist/bedrock-provider.js.map +1 -0
  10. package/dist/cache/__tests__/compaction.test.d.ts +2 -0
  11. package/dist/cache/__tests__/compaction.test.d.ts.map +1 -0
  12. package/dist/cache/__tests__/compaction.test.js +100 -0
  13. package/dist/cache/__tests__/compaction.test.js.map +1 -0
  14. package/dist/cache/__tests__/layers.test.d.ts +2 -0
  15. package/dist/cache/__tests__/layers.test.d.ts.map +1 -0
  16. package/dist/cache/__tests__/layers.test.js +71 -0
  17. package/dist/cache/__tests__/layers.test.js.map +1 -0
  18. package/dist/cache/__tests__/policy.test.d.ts +2 -0
  19. package/dist/cache/__tests__/policy.test.d.ts.map +1 -0
  20. package/dist/cache/__tests__/policy.test.js +79 -0
  21. package/dist/cache/__tests__/policy.test.js.map +1 -0
  22. package/dist/cache/__tests__/tool-serializer.test.d.ts +2 -0
  23. package/dist/cache/__tests__/tool-serializer.test.d.ts.map +1 -0
  24. package/dist/cache/__tests__/tool-serializer.test.js +64 -0
  25. package/dist/cache/__tests__/tool-serializer.test.js.map +1 -0
  26. package/dist/cache/compaction.d.ts +30 -0
  27. package/dist/cache/compaction.d.ts.map +1 -0
  28. package/dist/cache/compaction.js +50 -0
  29. package/dist/cache/compaction.js.map +1 -0
  30. package/dist/cache/index.d.ts +5 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/index.js +5 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/cache/layers.d.ts +17 -0
  35. package/dist/cache/layers.d.ts.map +1 -0
  36. package/dist/cache/layers.js +48 -0
  37. package/dist/cache/layers.js.map +1 -0
  38. package/dist/cache/policy.d.ts +40 -0
  39. package/dist/cache/policy.d.ts.map +1 -0
  40. package/dist/cache/policy.js +50 -0
  41. package/dist/cache/policy.js.map +1 -0
  42. package/dist/cache/tool-serializer.d.ts +8 -0
  43. package/dist/cache/tool-serializer.d.ts.map +1 -0
  44. package/dist/cache/tool-serializer.js +35 -0
  45. package/dist/cache/tool-serializer.js.map +1 -0
  46. package/dist/cli.d.ts +3 -0
  47. package/dist/cli.d.ts.map +1 -0
  48. package/dist/cli.js +116 -0
  49. package/dist/cli.js.map +1 -0
  50. package/dist/env-api-keys.d.ts +27 -0
  51. package/dist/env-api-keys.d.ts.map +1 -0
  52. package/dist/env-api-keys.js +223 -0
  53. package/dist/env-api-keys.js.map +1 -0
  54. package/dist/index.d.ts +32 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +21 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/models.d.ts +34 -0
  59. package/dist/models.d.ts.map +1 -0
  60. package/dist/models.generated.d.ts +14370 -0
  61. package/dist/models.generated.d.ts.map +1 -0
  62. package/dist/models.generated.js +14181 -0
  63. package/dist/models.generated.js.map +1 -0
  64. package/dist/models.js +140 -0
  65. package/dist/models.js.map +1 -0
  66. package/dist/oauth.d.ts +2 -0
  67. package/dist/oauth.d.ts.map +1 -0
  68. package/dist/oauth.js +2 -0
  69. package/dist/oauth.js.map +1 -0
  70. package/dist/providers/amazon-bedrock.d.ts +20 -0
  71. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  72. package/dist/providers/amazon-bedrock.js +651 -0
  73. package/dist/providers/amazon-bedrock.js.map +1 -0
  74. package/dist/providers/anthropic-capabilities.d.ts +65 -0
  75. package/dist/providers/anthropic-capabilities.d.ts.map +1 -0
  76. package/dist/providers/anthropic-capabilities.js +155 -0
  77. package/dist/providers/anthropic-capabilities.js.map +1 -0
  78. package/dist/providers/anthropic-discovery.d.ts +49 -0
  79. package/dist/providers/anthropic-discovery.d.ts.map +1 -0
  80. package/dist/providers/anthropic-discovery.js +218 -0
  81. package/dist/providers/anthropic-discovery.js.map +1 -0
  82. package/dist/providers/anthropic.d.ts +40 -0
  83. package/dist/providers/anthropic.d.ts.map +1 -0
  84. package/dist/providers/anthropic.js +766 -0
  85. package/dist/providers/anthropic.js.map +1 -0
  86. package/dist/providers/azure-openai-responses.d.ts +15 -0
  87. package/dist/providers/azure-openai-responses.d.ts.map +1 -0
  88. package/dist/providers/azure-openai-responses.js +176 -0
  89. package/dist/providers/azure-openai-responses.js.map +1 -0
  90. package/dist/providers/faux.d.ts +56 -0
  91. package/dist/providers/faux.d.ts.map +1 -0
  92. package/dist/providers/faux.js +367 -0
  93. package/dist/providers/faux.js.map +1 -0
  94. package/dist/providers/github-copilot-headers.d.ts +8 -0
  95. package/dist/providers/github-copilot-headers.d.ts.map +1 -0
  96. package/dist/providers/github-copilot-headers.js +29 -0
  97. package/dist/providers/github-copilot-headers.js.map +1 -0
  98. package/dist/providers/google-gemini-cli.d.ts +74 -0
  99. package/dist/providers/google-gemini-cli.d.ts.map +1 -0
  100. package/dist/providers/google-gemini-cli.js +776 -0
  101. package/dist/providers/google-gemini-cli.js.map +1 -0
  102. package/dist/providers/google-shared.d.ts +65 -0
  103. package/dist/providers/google-shared.d.ts.map +1 -0
  104. package/dist/providers/google-shared.js +312 -0
  105. package/dist/providers/google-shared.js.map +1 -0
  106. package/dist/providers/google-vertex.d.ts +15 -0
  107. package/dist/providers/google-vertex.d.ts.map +1 -0
  108. package/dist/providers/google-vertex.js +419 -0
  109. package/dist/providers/google-vertex.js.map +1 -0
  110. package/dist/providers/google.d.ts +13 -0
  111. package/dist/providers/google.d.ts.map +1 -0
  112. package/dist/providers/google.js +374 -0
  113. package/dist/providers/google.js.map +1 -0
  114. package/dist/providers/mistral.d.ts +22 -0
  115. package/dist/providers/mistral.d.ts.map +1 -0
  116. package/dist/providers/mistral.js +501 -0
  117. package/dist/providers/mistral.js.map +1 -0
  118. package/dist/providers/openai-codex-responses.d.ts +9 -0
  119. package/dist/providers/openai-codex-responses.d.ts.map +1 -0
  120. package/dist/providers/openai-codex-responses.js +741 -0
  121. package/dist/providers/openai-codex-responses.js.map +1 -0
  122. package/dist/providers/openai-completions.d.ts +15 -0
  123. package/dist/providers/openai-completions.d.ts.map +1 -0
  124. package/dist/providers/openai-completions.js +753 -0
  125. package/dist/providers/openai-completions.js.map +1 -0
  126. package/dist/providers/openai-responses-shared.d.ts +17 -0
  127. package/dist/providers/openai-responses-shared.d.ts.map +1 -0
  128. package/dist/providers/openai-responses-shared.js +470 -0
  129. package/dist/providers/openai-responses-shared.js.map +1 -0
  130. package/dist/providers/openai-responses.d.ts +13 -0
  131. package/dist/providers/openai-responses.d.ts.map +1 -0
  132. package/dist/providers/openai-responses.js +190 -0
  133. package/dist/providers/openai-responses.js.map +1 -0
  134. package/dist/providers/register-builtins.d.ts +38 -0
  135. package/dist/providers/register-builtins.d.ts.map +1 -0
  136. package/dist/providers/register-builtins.js +261 -0
  137. package/dist/providers/register-builtins.js.map +1 -0
  138. package/dist/providers/simple-options.d.ts +8 -0
  139. package/dist/providers/simple-options.d.ts.map +1 -0
  140. package/dist/providers/simple-options.js +35 -0
  141. package/dist/providers/simple-options.js.map +1 -0
  142. package/dist/providers/transform-messages.d.ts +8 -0
  143. package/dist/providers/transform-messages.d.ts.map +1 -0
  144. package/dist/providers/transform-messages.js +155 -0
  145. package/dist/providers/transform-messages.js.map +1 -0
  146. package/dist/registry/fetcher.d.ts +26 -0
  147. package/dist/registry/fetcher.d.ts.map +1 -0
  148. package/dist/registry/fetcher.js +69 -0
  149. package/dist/registry/fetcher.js.map +1 -0
  150. package/dist/registry/index.d.ts +8 -0
  151. package/dist/registry/index.d.ts.map +1 -0
  152. package/dist/registry/index.js +8 -0
  153. package/dist/registry/index.js.map +1 -0
  154. package/dist/registry/loader.d.ts +38 -0
  155. package/dist/registry/loader.d.ts.map +1 -0
  156. package/dist/registry/loader.js +90 -0
  157. package/dist/registry/loader.js.map +1 -0
  158. package/dist/registry/merger.d.ts +21 -0
  159. package/dist/registry/merger.d.ts.map +1 -0
  160. package/dist/registry/merger.js +90 -0
  161. package/dist/registry/merger.js.map +1 -0
  162. package/dist/registry/schema.d.ts +130 -0
  163. package/dist/registry/schema.d.ts.map +1 -0
  164. package/dist/registry/schema.js +103 -0
  165. package/dist/registry/schema.js.map +1 -0
  166. package/dist/stream.d.ts +8 -0
  167. package/dist/stream.d.ts.map +1 -0
  168. package/dist/stream.js +27 -0
  169. package/dist/stream.js.map +1 -0
  170. package/dist/types.d.ts +296 -0
  171. package/dist/types.d.ts.map +1 -0
  172. package/dist/types.js +2 -0
  173. package/dist/types.js.map +1 -0
  174. package/dist/utils/event-stream.d.ts +21 -0
  175. package/dist/utils/event-stream.d.ts.map +1 -0
  176. package/dist/utils/event-stream.js +81 -0
  177. package/dist/utils/event-stream.js.map +1 -0
  178. package/dist/utils/hash.d.ts +3 -0
  179. package/dist/utils/hash.d.ts.map +1 -0
  180. package/dist/utils/hash.js +14 -0
  181. package/dist/utils/hash.js.map +1 -0
  182. package/dist/utils/json-parse.d.ts +9 -0
  183. package/dist/utils/json-parse.d.ts.map +1 -0
  184. package/dist/utils/json-parse.js +29 -0
  185. package/dist/utils/json-parse.js.map +1 -0
  186. package/dist/utils/oauth/anthropic.d.ts +25 -0
  187. package/dist/utils/oauth/anthropic.d.ts.map +1 -0
  188. package/dist/utils/oauth/anthropic.js +336 -0
  189. package/dist/utils/oauth/anthropic.js.map +1 -0
  190. package/dist/utils/oauth/github-copilot.d.ts +30 -0
  191. package/dist/utils/oauth/github-copilot.d.ts.map +1 -0
  192. package/dist/utils/oauth/github-copilot.js +293 -0
  193. package/dist/utils/oauth/github-copilot.js.map +1 -0
  194. package/dist/utils/oauth/google-antigravity.d.ts +26 -0
  195. package/dist/utils/oauth/google-antigravity.d.ts.map +1 -0
  196. package/dist/utils/oauth/google-antigravity.js +376 -0
  197. package/dist/utils/oauth/google-antigravity.js.map +1 -0
  198. package/dist/utils/oauth/google-gemini-cli.d.ts +26 -0
  199. package/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -0
  200. package/dist/utils/oauth/google-gemini-cli.js +482 -0
  201. package/dist/utils/oauth/google-gemini-cli.js.map +1 -0
  202. package/dist/utils/oauth/index.d.ts +61 -0
  203. package/dist/utils/oauth/index.d.ts.map +1 -0
  204. package/dist/utils/oauth/index.js +131 -0
  205. package/dist/utils/oauth/index.js.map +1 -0
  206. package/dist/utils/oauth/oauth-page.d.ts +3 -0
  207. package/dist/utils/oauth/oauth-page.d.ts.map +1 -0
  208. package/dist/utils/oauth/oauth-page.js +105 -0
  209. package/dist/utils/oauth/oauth-page.js.map +1 -0
  210. package/dist/utils/oauth/openai-codex.d.ts +34 -0
  211. package/dist/utils/oauth/openai-codex.d.ts.map +1 -0
  212. package/dist/utils/oauth/openai-codex.js +374 -0
  213. package/dist/utils/oauth/openai-codex.js.map +1 -0
  214. package/dist/utils/oauth/pkce.d.ts +13 -0
  215. package/dist/utils/oauth/pkce.d.ts.map +1 -0
  216. package/dist/utils/oauth/pkce.js +31 -0
  217. package/dist/utils/oauth/pkce.js.map +1 -0
  218. package/dist/utils/oauth/types.d.ts +49 -0
  219. package/dist/utils/oauth/types.d.ts.map +1 -0
  220. package/dist/utils/oauth/types.js +2 -0
  221. package/dist/utils/oauth/types.js.map +1 -0
  222. package/dist/utils/overflow.d.ts +53 -0
  223. package/dist/utils/overflow.d.ts.map +1 -0
  224. package/dist/utils/overflow.js +132 -0
  225. package/dist/utils/overflow.js.map +1 -0
  226. package/dist/utils/sanitize-unicode.d.ts +22 -0
  227. package/dist/utils/sanitize-unicode.d.ts.map +1 -0
  228. package/dist/utils/sanitize-unicode.js +26 -0
  229. package/dist/utils/sanitize-unicode.js.map +1 -0
  230. package/dist/utils/typebox-helpers.d.ts +17 -0
  231. package/dist/utils/typebox-helpers.d.ts.map +1 -0
  232. package/dist/utils/typebox-helpers.js +21 -0
  233. package/dist/utils/typebox-helpers.js.map +1 -0
  234. package/dist/utils/validation.d.ts +18 -0
  235. package/dist/utils/validation.d.ts.map +1 -0
  236. package/dist/utils/validation.js +80 -0
  237. package/dist/utils/validation.js.map +1 -0
  238. package/package.json +129 -0
@@ -0,0 +1,223 @@
1
+ // NEVER convert to top-level imports - breaks browser/Vite builds (web-ui)
2
+ let _existsSync = null;
3
+ let _homedir = null;
4
+ let _join = null;
5
+ const dynamicImport = (specifier) => import(specifier);
6
+ const NODE_FS_SPECIFIER = "node:" + "fs";
7
+ const NODE_OS_SPECIFIER = "node:" + "os";
8
+ const NODE_PATH_SPECIFIER = "node:" + "path";
9
+ // Eagerly load in Node.js/Bun environment only
10
+ if (typeof process !== "undefined" && (process.versions?.node || process.versions?.bun)) {
11
+ dynamicImport(NODE_FS_SPECIFIER).then((m) => {
12
+ _existsSync = m.existsSync;
13
+ });
14
+ dynamicImport(NODE_OS_SPECIFIER).then((m) => {
15
+ _homedir = m.homedir;
16
+ });
17
+ dynamicImport(NODE_PATH_SPECIFIER).then((m) => {
18
+ _join = m.join;
19
+ });
20
+ }
21
+ let cachedVertexAdcCredentialsExists = null;
22
+ function hasVertexAdcCredentials() {
23
+ if (cachedVertexAdcCredentialsExists === null) {
24
+ // If node modules haven't loaded yet (async import race at startup),
25
+ // return false WITHOUT caching so the next call retries once they're ready.
26
+ // Only cache false permanently in a browser environment where fs is never available.
27
+ if (!_existsSync || !_homedir || !_join) {
28
+ const isNode = typeof process !== "undefined" && (process.versions?.node || process.versions?.bun);
29
+ if (!isNode) {
30
+ // Definitively in a browser — safe to cache false permanently
31
+ cachedVertexAdcCredentialsExists = false;
32
+ }
33
+ return false;
34
+ }
35
+ // Check GOOGLE_APPLICATION_CREDENTIALS env var first (standard way)
36
+ const gacPath = process.env.GOOGLE_APPLICATION_CREDENTIALS;
37
+ if (gacPath) {
38
+ cachedVertexAdcCredentialsExists = _existsSync(gacPath);
39
+ }
40
+ else {
41
+ // Fall back to default ADC path (lazy evaluation)
42
+ cachedVertexAdcCredentialsExists = _existsSync(_join(_homedir(), ".config", "gcloud", "application_default_credentials.json"));
43
+ }
44
+ }
45
+ return cachedVertexAdcCredentialsExists;
46
+ }
47
+ export function getEnvApiKey(provider) {
48
+ // Fall back to environment variables
49
+ if (provider === "github-copilot") {
50
+ return process.env.COPILOT_GITHUB_TOKEN || process.env.GH_TOKEN || process.env.GITHUB_TOKEN;
51
+ }
52
+ // ANTHROPIC_OAUTH_TOKEN takes precedence over ANTHROPIC_API_KEY
53
+ if (provider === "anthropic") {
54
+ return process.env.ANTHROPIC_OAUTH_TOKEN || process.env.ANTHROPIC_API_KEY;
55
+ }
56
+ // Vertex AI supports either an explicit API key or Application Default Credentials
57
+ // Auth is configured via `gcloud auth application-default login`
58
+ if (provider === "google-vertex") {
59
+ if (process.env.GOOGLE_CLOUD_API_KEY) {
60
+ return process.env.GOOGLE_CLOUD_API_KEY;
61
+ }
62
+ const hasCredentials = hasVertexAdcCredentials();
63
+ const hasProject = !!(process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT);
64
+ const hasLocation = !!process.env.GOOGLE_CLOUD_LOCATION;
65
+ if (hasCredentials && hasProject && hasLocation) {
66
+ return "<authenticated>";
67
+ }
68
+ }
69
+ if (provider === "amazon-bedrock") {
70
+ // Amazon Bedrock supports multiple credential sources:
71
+ // 1. AWS_PROFILE - named profile from ~/.aws/credentials
72
+ // 2. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY - standard IAM keys
73
+ // 3. AWS_BEARER_TOKEN_BEDROCK - Bedrock API keys (bearer token)
74
+ // 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles
75
+ // 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI)
76
+ // 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts)
77
+ if (process.env.AWS_PROFILE ||
78
+ (process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) ||
79
+ process.env.AWS_BEARER_TOKEN_BEDROCK ||
80
+ process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ||
81
+ process.env.AWS_CONTAINER_CREDENTIALS_FULL_URI ||
82
+ process.env.AWS_WEB_IDENTITY_TOKEN_FILE) {
83
+ return "<authenticated>";
84
+ }
85
+ }
86
+ const envMap = {
87
+ openai: "OPENAI_API_KEY",
88
+ "azure-openai-responses": "AZURE_OPENAI_API_KEY",
89
+ google: "GEMINI_API_KEY",
90
+ groq: "GROQ_API_KEY",
91
+ cerebras: "CEREBRAS_API_KEY",
92
+ xai: "XAI_API_KEY",
93
+ openrouter: "OPENROUTER_API_KEY",
94
+ "vercel-ai-gateway": "AI_GATEWAY_API_KEY",
95
+ zai: "ZAI_API_KEY",
96
+ mistral: "MISTRAL_API_KEY",
97
+ minimax: "MINIMAX_API_KEY",
98
+ "minimax-cn": "MINIMAX_CN_API_KEY",
99
+ huggingface: "HF_TOKEN",
100
+ opencode: "OPENCODE_API_KEY",
101
+ "opencode-go": "OPENCODE_API_KEY",
102
+ "kimi-coding": "KIMI_API_KEY",
103
+ };
104
+ const envVar = envMap[provider];
105
+ return envVar ? process.env[envVar] : undefined;
106
+ }
107
+ export const ENV_VAR_BY_PROVIDER = {
108
+ openai: "OPENAI_API_KEY",
109
+ "azure-openai-responses": "AZURE_OPENAI_API_KEY",
110
+ anthropic: "ANTHROPIC_API_KEY",
111
+ google: "GEMINI_API_KEY",
112
+ groq: "GROQ_API_KEY",
113
+ cerebras: "CEREBRAS_API_KEY",
114
+ xai: "XAI_API_KEY",
115
+ openrouter: "OPENROUTER_API_KEY",
116
+ "vercel-ai-gateway": "AI_GATEWAY_API_KEY",
117
+ zai: "ZAI_API_KEY",
118
+ mistral: "MISTRAL_API_KEY",
119
+ minimax: "MINIMAX_API_KEY",
120
+ "minimax-cn": "MINIMAX_CN_API_KEY",
121
+ huggingface: "HF_TOKEN",
122
+ opencode: "OPENCODE_API_KEY",
123
+ "opencode-go": "OPENCODE_API_KEY",
124
+ "kimi-coding": "KIMI_API_KEY",
125
+ };
126
+ const OAUTH_PROVIDERS = new Set([
127
+ "anthropic",
128
+ "github-copilot",
129
+ "google-gemini-cli",
130
+ "google-antigravity",
131
+ "openai-codex",
132
+ ]);
133
+ /**
134
+ * Describe how a provider authenticates and whether the user is set up for it.
135
+ *
136
+ * The UI uses this to badge providers (`✓` / `🔑` / `✗` / `⚙`) and surface
137
+ * actionable hints without having to know about every provider's idiosyncrasies.
138
+ */
139
+ export function getProviderAuthStatus(provider) {
140
+ if (provider === "github-copilot") {
141
+ const token = process.env.COPILOT_GITHUB_TOKEN || process.env.GH_TOKEN || process.env.GITHUB_TOKEN;
142
+ if (token)
143
+ return { kind: "env", configured: true, envVar: "GITHUB_TOKEN" };
144
+ return {
145
+ kind: "oauth",
146
+ configured: false,
147
+ hint: "/login github-copilot",
148
+ envVar: "GITHUB_TOKEN",
149
+ };
150
+ }
151
+ if (provider === "anthropic") {
152
+ if (process.env.ANTHROPIC_OAUTH_TOKEN) {
153
+ return { kind: "oauth", configured: true, envVar: "ANTHROPIC_OAUTH_TOKEN" };
154
+ }
155
+ if (process.env.ANTHROPIC_API_KEY) {
156
+ return { kind: "env", configured: true, envVar: "ANTHROPIC_API_KEY" };
157
+ }
158
+ return {
159
+ kind: "missing",
160
+ configured: false,
161
+ hint: "set ANTHROPIC_API_KEY or /login anthropic",
162
+ envVar: "ANTHROPIC_API_KEY",
163
+ };
164
+ }
165
+ if (provider === "google-vertex") {
166
+ if (process.env.GOOGLE_CLOUD_API_KEY) {
167
+ return { kind: "env", configured: true, envVar: "GOOGLE_CLOUD_API_KEY" };
168
+ }
169
+ const hasCredentials = hasVertexAdcCredentials();
170
+ const hasProject = !!(process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT);
171
+ const hasLocation = !!process.env.GOOGLE_CLOUD_LOCATION;
172
+ if (hasCredentials && hasProject && hasLocation) {
173
+ return { kind: "file", configured: true };
174
+ }
175
+ return {
176
+ kind: "file",
177
+ configured: false,
178
+ hint: "run `gcloud auth application-default login` and set GOOGLE_CLOUD_PROJECT/LOCATION",
179
+ };
180
+ }
181
+ if (provider === "amazon-bedrock") {
182
+ const hasCreds = process.env.AWS_PROFILE ||
183
+ (process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) ||
184
+ process.env.AWS_BEARER_TOKEN_BEDROCK ||
185
+ process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ||
186
+ process.env.AWS_CONTAINER_CREDENTIALS_FULL_URI ||
187
+ process.env.AWS_WEB_IDENTITY_TOKEN_FILE;
188
+ if (!hasCreds) {
189
+ return {
190
+ kind: "missing",
191
+ configured: false,
192
+ hint: "set AWS_PROFILE or AWS_ACCESS_KEY_ID/SECRET",
193
+ };
194
+ }
195
+ // Region is required for Bedrock. AWS SDK looks at AWS_REGION/AWS_DEFAULT_REGION
196
+ // or the profile's `region`. We don't read the profile here; the env signal is
197
+ // the cheap reliable check.
198
+ if (!(process.env.AWS_REGION || process.env.AWS_DEFAULT_REGION)) {
199
+ return {
200
+ kind: "needs-region",
201
+ configured: false,
202
+ hint: "set AWS_REGION (or configure profile region)",
203
+ };
204
+ }
205
+ return { kind: "file", configured: true };
206
+ }
207
+ if (OAUTH_PROVIDERS.has(provider)) {
208
+ return {
209
+ kind: "oauth",
210
+ configured: false,
211
+ hint: `/login ${provider}`,
212
+ };
213
+ }
214
+ const envVar = ENV_VAR_BY_PROVIDER[provider];
215
+ if (envVar) {
216
+ const value = process.env[envVar];
217
+ if (value)
218
+ return { kind: "env", configured: true, envVar };
219
+ return { kind: "missing", configured: false, hint: `set ${envVar}`, envVar };
220
+ }
221
+ return { kind: "missing", configured: false, hint: "no known auth source" };
222
+ }
223
+ //# sourceMappingURL=env-api-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-api-keys.js","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"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","sourcesContent":["// NEVER convert to top-level imports - breaks browser/Vite builds (web-ui)\nlet _existsSync: typeof import(\"node:fs\").existsSync | null = null;\nlet _homedir: typeof import(\"node:os\").homedir | null = null;\nlet _join: typeof import(\"node:path\").join | null = null;\n\ntype DynamicImport = (specifier: string) => Promise<unknown>;\n\nconst dynamicImport: DynamicImport = (specifier) => import(specifier);\nconst NODE_FS_SPECIFIER = \"node:\" + \"fs\";\nconst NODE_OS_SPECIFIER = \"node:\" + \"os\";\nconst NODE_PATH_SPECIFIER = \"node:\" + \"path\";\n\n// Eagerly load in Node.js/Bun environment only\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n\tdynamicImport(NODE_FS_SPECIFIER).then((m) => {\n\t\t_existsSync = (m as typeof import(\"node:fs\")).existsSync;\n\t});\n\tdynamicImport(NODE_OS_SPECIFIER).then((m) => {\n\t\t_homedir = (m as typeof import(\"node:os\")).homedir;\n\t});\n\tdynamicImport(NODE_PATH_SPECIFIER).then((m) => {\n\t\t_join = (m as typeof import(\"node:path\")).join;\n\t});\n}\n\nimport type { KnownProvider } from \"./types.js\";\n\nlet cachedVertexAdcCredentialsExists: boolean | null = null;\n\nfunction hasVertexAdcCredentials(): boolean {\n\tif (cachedVertexAdcCredentialsExists === null) {\n\t\t// If node modules haven't loaded yet (async import race at startup),\n\t\t// return false WITHOUT caching so the next call retries once they're ready.\n\t\t// Only cache false permanently in a browser environment where fs is never available.\n\t\tif (!_existsSync || !_homedir || !_join) {\n\t\t\tconst isNode = typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun);\n\t\t\tif (!isNode) {\n\t\t\t\t// Definitively in a browser — safe to cache false permanently\n\t\t\t\tcachedVertexAdcCredentialsExists = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check GOOGLE_APPLICATION_CREDENTIALS env var first (standard way)\n\t\tconst gacPath = process.env.GOOGLE_APPLICATION_CREDENTIALS;\n\t\tif (gacPath) {\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(gacPath);\n\t\t} else {\n\t\t\t// Fall back to default ADC path (lazy evaluation)\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(\n\t\t\t\t_join(_homedir(), \".config\", \"gcloud\", \"application_default_credentials.json\"),\n\t\t\t);\n\t\t}\n\t}\n\treturn cachedVertexAdcCredentialsExists;\n}\n\n/**\n * Get API key for provider from known environment variables, e.g. OPENAI_API_KEY.\n *\n * Will not return API keys for providers that require OAuth tokens.\n */\nexport function getEnvApiKey(provider: KnownProvider): string | undefined;\nexport function getEnvApiKey(provider: string): string | undefined;\nexport function getEnvApiKey(provider: any): string | undefined {\n\t// Fall back to environment variables\n\tif (provider === \"github-copilot\") {\n\t\treturn process.env.COPILOT_GITHUB_TOKEN || process.env.GH_TOKEN || process.env.GITHUB_TOKEN;\n\t}\n\n\t// ANTHROPIC_OAUTH_TOKEN takes precedence over ANTHROPIC_API_KEY\n\tif (provider === \"anthropic\") {\n\t\treturn process.env.ANTHROPIC_OAUTH_TOKEN || process.env.ANTHROPIC_API_KEY;\n\t}\n\n\t// Vertex AI supports either an explicit API key or Application Default Credentials\n\t// Auth is configured via `gcloud auth application-default login`\n\tif (provider === \"google-vertex\") {\n\t\tif (process.env.GOOGLE_CLOUD_API_KEY) {\n\t\t\treturn process.env.GOOGLE_CLOUD_API_KEY;\n\t\t}\n\n\t\tconst hasCredentials = hasVertexAdcCredentials();\n\t\tconst hasProject = !!(process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT);\n\t\tconst hasLocation = !!process.env.GOOGLE_CLOUD_LOCATION;\n\n\t\tif (hasCredentials && hasProject && hasLocation) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\tif (provider === \"amazon-bedrock\") {\n\t\t// Amazon Bedrock supports multiple credential sources:\n\t\t// 1. AWS_PROFILE - named profile from ~/.aws/credentials\n\t\t// 2. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY - standard IAM keys\n\t\t// 3. AWS_BEARER_TOKEN_BEDROCK - Bedrock API keys (bearer token)\n\t\t// 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles\n\t\t// 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI)\n\t\t// 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts)\n\t\tif (\n\t\t\tprocess.env.AWS_PROFILE ||\n\t\t\t(process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) ||\n\t\t\tprocess.env.AWS_BEARER_TOKEN_BEDROCK ||\n\t\t\tprocess.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ||\n\t\t\tprocess.env.AWS_CONTAINER_CREDENTIALS_FULL_URI ||\n\t\t\tprocess.env.AWS_WEB_IDENTITY_TOKEN_FILE\n\t\t) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\tconst envMap: Record<string, string> = {\n\t\topenai: \"OPENAI_API_KEY\",\n\t\t\"azure-openai-responses\": \"AZURE_OPENAI_API_KEY\",\n\t\tgoogle: \"GEMINI_API_KEY\",\n\t\tgroq: \"GROQ_API_KEY\",\n\t\tcerebras: \"CEREBRAS_API_KEY\",\n\t\txai: \"XAI_API_KEY\",\n\t\topenrouter: \"OPENROUTER_API_KEY\",\n\t\t\"vercel-ai-gateway\": \"AI_GATEWAY_API_KEY\",\n\t\tzai: \"ZAI_API_KEY\",\n\t\tmistral: \"MISTRAL_API_KEY\",\n\t\tminimax: \"MINIMAX_API_KEY\",\n\t\t\"minimax-cn\": \"MINIMAX_CN_API_KEY\",\n\t\thuggingface: \"HF_TOKEN\",\n\t\topencode: \"OPENCODE_API_KEY\",\n\t\t\"opencode-go\": \"OPENCODE_API_KEY\",\n\t\t\"kimi-coding\": \"KIMI_API_KEY\",\n\t};\n\n\tconst envVar = envMap[provider];\n\treturn envVar ? process.env[envVar] : undefined;\n}\n\nexport const ENV_VAR_BY_PROVIDER: Record<string, string> = {\n\topenai: \"OPENAI_API_KEY\",\n\t\"azure-openai-responses\": \"AZURE_OPENAI_API_KEY\",\n\tanthropic: \"ANTHROPIC_API_KEY\",\n\tgoogle: \"GEMINI_API_KEY\",\n\tgroq: \"GROQ_API_KEY\",\n\tcerebras: \"CEREBRAS_API_KEY\",\n\txai: \"XAI_API_KEY\",\n\topenrouter: \"OPENROUTER_API_KEY\",\n\t\"vercel-ai-gateway\": \"AI_GATEWAY_API_KEY\",\n\tzai: \"ZAI_API_KEY\",\n\tmistral: \"MISTRAL_API_KEY\",\n\tminimax: \"MINIMAX_API_KEY\",\n\t\"minimax-cn\": \"MINIMAX_CN_API_KEY\",\n\thuggingface: \"HF_TOKEN\",\n\topencode: \"OPENCODE_API_KEY\",\n\t\"opencode-go\": \"OPENCODE_API_KEY\",\n\t\"kimi-coding\": \"KIMI_API_KEY\",\n};\n\nconst OAUTH_PROVIDERS = new Set([\n\t\"anthropic\",\n\t\"github-copilot\",\n\t\"google-gemini-cli\",\n\t\"google-antigravity\",\n\t\"openai-codex\",\n]);\n\nexport type ProviderAuthKind = \"env\" | \"oauth\" | \"file\" | \"needs-region\" | \"missing\";\n\nexport interface ProviderAuthStatus {\n\tkind: ProviderAuthKind;\n\t/** Short user-facing hint, e.g. \"set XAI_API_KEY\" or \"/login anthropic\". */\n\thint?: string;\n\t/** The env var name this provider would use, if any. */\n\tenvVar?: string;\n\t/** True when the agent can dispatch a request right now without further setup. */\n\tconfigured: boolean;\n}\n\n/**\n * Describe how a provider authenticates and whether the user is set up for it.\n *\n * The UI uses this to badge providers (`✓` / `🔑` / `✗` / `⚙`) and surface\n * actionable hints without having to know about every provider's idiosyncrasies.\n */\nexport function getProviderAuthStatus(provider: string): ProviderAuthStatus {\n\tif (provider === \"github-copilot\") {\n\t\tconst token = process.env.COPILOT_GITHUB_TOKEN || process.env.GH_TOKEN || process.env.GITHUB_TOKEN;\n\t\tif (token) return { kind: \"env\", configured: true, envVar: \"GITHUB_TOKEN\" };\n\t\treturn {\n\t\t\tkind: \"oauth\",\n\t\t\tconfigured: false,\n\t\t\thint: \"/login github-copilot\",\n\t\t\tenvVar: \"GITHUB_TOKEN\",\n\t\t};\n\t}\n\n\tif (provider === \"anthropic\") {\n\t\tif (process.env.ANTHROPIC_OAUTH_TOKEN) {\n\t\t\treturn { kind: \"oauth\", configured: true, envVar: \"ANTHROPIC_OAUTH_TOKEN\" };\n\t\t}\n\t\tif (process.env.ANTHROPIC_API_KEY) {\n\t\t\treturn { kind: \"env\", configured: true, envVar: \"ANTHROPIC_API_KEY\" };\n\t\t}\n\t\treturn {\n\t\t\tkind: \"missing\",\n\t\t\tconfigured: false,\n\t\t\thint: \"set ANTHROPIC_API_KEY or /login anthropic\",\n\t\t\tenvVar: \"ANTHROPIC_API_KEY\",\n\t\t};\n\t}\n\n\tif (provider === \"google-vertex\") {\n\t\tif (process.env.GOOGLE_CLOUD_API_KEY) {\n\t\t\treturn { kind: \"env\", configured: true, envVar: \"GOOGLE_CLOUD_API_KEY\" };\n\t\t}\n\t\tconst hasCredentials = hasVertexAdcCredentials();\n\t\tconst hasProject = !!(process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT);\n\t\tconst hasLocation = !!process.env.GOOGLE_CLOUD_LOCATION;\n\t\tif (hasCredentials && hasProject && hasLocation) {\n\t\t\treturn { kind: \"file\", configured: true };\n\t\t}\n\t\treturn {\n\t\t\tkind: \"file\",\n\t\t\tconfigured: false,\n\t\t\thint: \"run `gcloud auth application-default login` and set GOOGLE_CLOUD_PROJECT/LOCATION\",\n\t\t};\n\t}\n\n\tif (provider === \"amazon-bedrock\") {\n\t\tconst hasCreds =\n\t\t\tprocess.env.AWS_PROFILE ||\n\t\t\t(process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) ||\n\t\t\tprocess.env.AWS_BEARER_TOKEN_BEDROCK ||\n\t\t\tprocess.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ||\n\t\t\tprocess.env.AWS_CONTAINER_CREDENTIALS_FULL_URI ||\n\t\t\tprocess.env.AWS_WEB_IDENTITY_TOKEN_FILE;\n\t\tif (!hasCreds) {\n\t\t\treturn {\n\t\t\t\tkind: \"missing\",\n\t\t\t\tconfigured: false,\n\t\t\t\thint: \"set AWS_PROFILE or AWS_ACCESS_KEY_ID/SECRET\",\n\t\t\t};\n\t\t}\n\t\t// Region is required for Bedrock. AWS SDK looks at AWS_REGION/AWS_DEFAULT_REGION\n\t\t// or the profile's `region`. We don't read the profile here; the env signal is\n\t\t// the cheap reliable check.\n\t\tif (!(process.env.AWS_REGION || process.env.AWS_DEFAULT_REGION)) {\n\t\t\treturn {\n\t\t\t\tkind: \"needs-region\",\n\t\t\t\tconfigured: false,\n\t\t\t\thint: \"set AWS_REGION (or configure profile region)\",\n\t\t\t};\n\t\t}\n\t\treturn { kind: \"file\", configured: true };\n\t}\n\n\tif (OAUTH_PROVIDERS.has(provider)) {\n\t\treturn {\n\t\t\tkind: \"oauth\",\n\t\t\tconfigured: false,\n\t\t\thint: `/login ${provider}`,\n\t\t};\n\t}\n\n\tconst envVar = ENV_VAR_BY_PROVIDER[provider];\n\tif (envVar) {\n\t\tconst value = process.env[envVar];\n\t\tif (value) return { kind: \"env\", configured: true, envVar };\n\t\treturn { kind: \"missing\", configured: false, hint: `set ${envVar}`, envVar };\n\t}\n\n\treturn { kind: \"missing\", configured: false, hint: \"no known auth source\" };\n}\n"]}
@@ -0,0 +1,32 @@
1
+ export type { Static, TSchema } from "@sinclair/typebox";
2
+ export { Type } from "@sinclair/typebox";
3
+ export * from "./api-registry.js";
4
+ export type { CacheLayer, CachePolicy, CacheRetention, CacheUsageReport, LayerBlock, LayeredPayload, RetentionResolveContext, } from "./cache/index.js";
5
+ export { CACHE_LAYER_ORDER, defaultPolicy, resolveRetention, totalInputTokens, usageToCacheReport, validateLayers, } from "./cache/index.js";
6
+ export * from "./env-api-keys.js";
7
+ export * from "./models.js";
8
+ export type { BedrockOptions } from "./providers/amazon-bedrock.js";
9
+ export type { AnthropicOptions } from "./providers/anthropic.js";
10
+ export { type AnthropicModelCapabilities, type AnthropicThinkingSchema, getAnthropicCapabilities, supportsAdaptiveThinking, } from "./providers/anthropic-capabilities.js";
11
+ export { discoverAnthropicCapabilities } from "./providers/anthropic-discovery.js";
12
+ export type { AzureOpenAIResponsesOptions } from "./providers/azure-openai-responses.js";
13
+ export * from "./providers/faux.js";
14
+ export type { GoogleOptions } from "./providers/google.js";
15
+ export type { GoogleGeminiCliOptions, GoogleThinkingLevel } from "./providers/google-gemini-cli.js";
16
+ export type { GoogleVertexOptions } from "./providers/google-vertex.js";
17
+ export type { MistralOptions } from "./providers/mistral.js";
18
+ export type { OpenAICodexResponsesOptions } from "./providers/openai-codex-responses.js";
19
+ export type { OpenAICompletionsOptions } from "./providers/openai-completions.js";
20
+ export type { OpenAIResponsesOptions } from "./providers/openai-responses.js";
21
+ export * from "./providers/register-builtins.js";
22
+ export * from "./registry/index.js";
23
+ export * from "./stream.js";
24
+ export * from "./types.js";
25
+ export * from "./utils/event-stream.js";
26
+ export * from "./utils/json-parse.js";
27
+ export { getOAuthProvider, getOAuthProviderInfoList, getOAuthProviders, registerOAuthProvider, resetOAuthProviders, unregisterOAuthProvider, } from "./utils/oauth/index.js";
28
+ export type { OAuthAuthInfo, OAuthCredentials, OAuthLoginCallbacks, OAuthPrompt, OAuthProvider, OAuthProviderId, OAuthProviderInfo, OAuthProviderInterface, } from "./utils/oauth/types.js";
29
+ export * from "./utils/overflow.js";
30
+ export * from "./utils/typebox-helpers.js";
31
+ export * from "./utils/validation.js";
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,cAAc,mBAAmB,CAAC;AAClC,YAAY,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,uBAAuB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACd,MAAM,kBAAkB,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EACN,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,wBAAwB,EACxB,wBAAwB,GACxB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,YAAY,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACzF,cAAc,qBAAqB,CAAC;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACpG,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACzF,YAAY,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,YAAY,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,cAAc,kCAAkC,CAAC;AAEjD,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AAEtC,OAAO,EACN,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,GACvB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACX,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,sBAAsB,GACtB,MAAM,wBAAwB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC","sourcesContent":["export type { Static, TSchema } from \"@sinclair/typebox\";\nexport { Type } from \"@sinclair/typebox\";\n\nexport * from \"./api-registry.js\";\nexport type {\n\tCacheLayer,\n\tCachePolicy,\n\tCacheRetention,\n\tCacheUsageReport,\n\tLayerBlock,\n\tLayeredPayload,\n\tRetentionResolveContext,\n} from \"./cache/index.js\";\nexport {\n\tCACHE_LAYER_ORDER,\n\tdefaultPolicy,\n\tresolveRetention,\n\ttotalInputTokens,\n\tusageToCacheReport,\n\tvalidateLayers,\n} from \"./cache/index.js\";\nexport * from \"./env-api-keys.js\";\nexport * from \"./models.js\";\nexport type { BedrockOptions } from \"./providers/amazon-bedrock.js\";\nexport type { AnthropicOptions } from \"./providers/anthropic.js\";\nexport {\n\ttype AnthropicModelCapabilities,\n\ttype AnthropicThinkingSchema,\n\tgetAnthropicCapabilities,\n\tsupportsAdaptiveThinking,\n} from \"./providers/anthropic-capabilities.js\";\nexport { discoverAnthropicCapabilities } from \"./providers/anthropic-discovery.js\";\nexport type { AzureOpenAIResponsesOptions } from \"./providers/azure-openai-responses.js\";\nexport * from \"./providers/faux.js\";\nexport type { GoogleOptions } from \"./providers/google.js\";\nexport type { GoogleGeminiCliOptions, GoogleThinkingLevel } from \"./providers/google-gemini-cli.js\";\nexport type { GoogleVertexOptions } from \"./providers/google-vertex.js\";\nexport type { MistralOptions } from \"./providers/mistral.js\";\nexport type { OpenAICodexResponsesOptions } from \"./providers/openai-codex-responses.js\";\nexport type { OpenAICompletionsOptions } from \"./providers/openai-completions.js\";\nexport type { OpenAIResponsesOptions } from \"./providers/openai-responses.js\";\nexport * from \"./providers/register-builtins.js\";\n// WS15: Catwalk-style provider/model registry\nexport * from \"./registry/index.js\";\nexport * from \"./stream.js\";\nexport * from \"./types.js\";\nexport * from \"./utils/event-stream.js\";\nexport * from \"./utils/json-parse.js\";\n// WS11: caveman login dispatcher needs the OAuth provider registry helpers.\nexport {\n\tgetOAuthProvider,\n\tgetOAuthProviderInfoList,\n\tgetOAuthProviders,\n\tregisterOAuthProvider,\n\tresetOAuthProviders,\n\tunregisterOAuthProvider,\n} from \"./utils/oauth/index.js\";\nexport type {\n\tOAuthAuthInfo,\n\tOAuthCredentials,\n\tOAuthLoginCallbacks,\n\tOAuthPrompt,\n\tOAuthProvider,\n\tOAuthProviderId,\n\tOAuthProviderInfo,\n\tOAuthProviderInterface,\n} from \"./utils/oauth/types.js\";\nexport * from \"./utils/overflow.js\";\nexport * from \"./utils/typebox-helpers.js\";\nexport * from \"./utils/validation.js\";\n"]}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ export { Type } from "@sinclair/typebox";
2
+ export * from "./api-registry.js";
3
+ export { CACHE_LAYER_ORDER, defaultPolicy, resolveRetention, totalInputTokens, usageToCacheReport, validateLayers, } from "./cache/index.js";
4
+ export * from "./env-api-keys.js";
5
+ export * from "./models.js";
6
+ export { getAnthropicCapabilities, supportsAdaptiveThinking, } from "./providers/anthropic-capabilities.js";
7
+ export { discoverAnthropicCapabilities } from "./providers/anthropic-discovery.js";
8
+ export * from "./providers/faux.js";
9
+ export * from "./providers/register-builtins.js";
10
+ // WS15: Catwalk-style provider/model registry
11
+ export * from "./registry/index.js";
12
+ export * from "./stream.js";
13
+ export * from "./types.js";
14
+ export * from "./utils/event-stream.js";
15
+ export * from "./utils/json-parse.js";
16
+ // WS11: caveman login dispatcher needs the OAuth provider registry helpers.
17
+ export { getOAuthProvider, getOAuthProviderInfoList, getOAuthProviders, registerOAuthProvider, resetOAuthProviders, unregisterOAuthProvider, } from "./utils/oauth/index.js";
18
+ export * from "./utils/overflow.js";
19
+ export * from "./utils/typebox-helpers.js";
20
+ export * from "./utils/validation.js";
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,cAAc,mBAAmB,CAAC;AAUlC,OAAO,EACN,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACd,MAAM,kBAAkB,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAG5B,OAAO,EAGN,wBAAwB,EACxB,wBAAwB,GACxB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,cAAc,qBAAqB,CAAC;AAQpC,cAAc,kCAAkC,CAAC;AACjD,8CAA8C;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,4EAA4E;AAC5E,OAAO,EACN,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,GACvB,MAAM,wBAAwB,CAAC;AAWhC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC","sourcesContent":["export type { Static, TSchema } from \"@sinclair/typebox\";\nexport { Type } from \"@sinclair/typebox\";\n\nexport * from \"./api-registry.js\";\nexport type {\n\tCacheLayer,\n\tCachePolicy,\n\tCacheRetention,\n\tCacheUsageReport,\n\tLayerBlock,\n\tLayeredPayload,\n\tRetentionResolveContext,\n} from \"./cache/index.js\";\nexport {\n\tCACHE_LAYER_ORDER,\n\tdefaultPolicy,\n\tresolveRetention,\n\ttotalInputTokens,\n\tusageToCacheReport,\n\tvalidateLayers,\n} from \"./cache/index.js\";\nexport * from \"./env-api-keys.js\";\nexport * from \"./models.js\";\nexport type { BedrockOptions } from \"./providers/amazon-bedrock.js\";\nexport type { AnthropicOptions } from \"./providers/anthropic.js\";\nexport {\n\ttype AnthropicModelCapabilities,\n\ttype AnthropicThinkingSchema,\n\tgetAnthropicCapabilities,\n\tsupportsAdaptiveThinking,\n} from \"./providers/anthropic-capabilities.js\";\nexport { discoverAnthropicCapabilities } from \"./providers/anthropic-discovery.js\";\nexport type { AzureOpenAIResponsesOptions } from \"./providers/azure-openai-responses.js\";\nexport * from \"./providers/faux.js\";\nexport type { GoogleOptions } from \"./providers/google.js\";\nexport type { GoogleGeminiCliOptions, GoogleThinkingLevel } from \"./providers/google-gemini-cli.js\";\nexport type { GoogleVertexOptions } from \"./providers/google-vertex.js\";\nexport type { MistralOptions } from \"./providers/mistral.js\";\nexport type { OpenAICodexResponsesOptions } from \"./providers/openai-codex-responses.js\";\nexport type { OpenAICompletionsOptions } from \"./providers/openai-completions.js\";\nexport type { OpenAIResponsesOptions } from \"./providers/openai-responses.js\";\nexport * from \"./providers/register-builtins.js\";\n// WS15: Catwalk-style provider/model registry\nexport * from \"./registry/index.js\";\nexport * from \"./stream.js\";\nexport * from \"./types.js\";\nexport * from \"./utils/event-stream.js\";\nexport * from \"./utils/json-parse.js\";\n// WS11: caveman login dispatcher needs the OAuth provider registry helpers.\nexport {\n\tgetOAuthProvider,\n\tgetOAuthProviderInfoList,\n\tgetOAuthProviders,\n\tregisterOAuthProvider,\n\tresetOAuthProviders,\n\tunregisterOAuthProvider,\n} from \"./utils/oauth/index.js\";\nexport type {\n\tOAuthAuthInfo,\n\tOAuthCredentials,\n\tOAuthLoginCallbacks,\n\tOAuthPrompt,\n\tOAuthProvider,\n\tOAuthProviderId,\n\tOAuthProviderInfo,\n\tOAuthProviderInterface,\n} from \"./utils/oauth/types.js\";\nexport * from \"./utils/overflow.js\";\nexport * from \"./utils/typebox-helpers.js\";\nexport * from \"./utils/validation.js\";\n"]}
@@ -0,0 +1,34 @@
1
+ import { MODELS } from "./models.generated.js";
2
+ import type { Api, KnownProvider, Model, Usage } from "./types.js";
3
+ export type ModelRegistryChangeEvent = {
4
+ type: "added";
5
+ provider: string;
6
+ model: Model<Api>;
7
+ };
8
+ /**
9
+ * Subscribe to registry mutations performed by the discovery layer
10
+ * (newly-published model ids). Returns an unsubscribe function.
11
+ */
12
+ export declare function onModelRegistryChange(listener: (e: ModelRegistryChangeEvent) => void): () => void;
13
+ type ModelApi<TProvider extends KnownProvider, TModelId extends keyof (typeof MODELS)[TProvider]> = (typeof MODELS)[TProvider][TModelId] extends {
14
+ api: infer TApi;
15
+ } ? (TApi extends Api ? TApi : never) : never;
16
+ export declare function getModel<TProvider extends KnownProvider, TModelId extends keyof (typeof MODELS)[TProvider]>(provider: TProvider, modelId: TModelId): Model<ModelApi<TProvider, TModelId>>;
17
+ export declare function getProviders(): KnownProvider[];
18
+ export declare function getModels<TProvider extends KnownProvider>(provider: TProvider): Model<ModelApi<TProvider, keyof (typeof MODELS)[TProvider]>>[];
19
+ export declare function calculateCost<TApi extends Api>(model: Model<TApi>, usage: Usage): Usage["cost"];
20
+ /**
21
+ * Check if a model supports xhigh thinking level.
22
+ *
23
+ * Supported today:
24
+ * - GPT-5.2 / GPT-5.3 / GPT-5.4 / GPT-5.5 model families
25
+ * - Opus 4.6 models (xhigh maps to adaptive effort "max" on Anthropic-compatible providers)
26
+ */
27
+ export declare function supportsXhigh<TApi extends Api>(model: Model<TApi>): boolean;
28
+ /**
29
+ * Check if two models are equal by comparing both their id and provider.
30
+ * Returns false if either model is null or undefined.
31
+ */
32
+ export declare function modelsAreEqual<TApi extends Api>(a: Model<TApi> | null | undefined, b: Model<TApi> | null | undefined): boolean;
33
+ export {};
34
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AA8EnE,MAAM,MAAM,wBAAwB,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;CAAE,CAAC;AAG9F;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,wBAAwB,KAAK,IAAI,GAAG,MAAM,IAAI,CAMjG;AAMD,KAAK,QAAQ,CACZ,SAAS,SAAS,aAAa,EAC/B,QAAQ,SAAS,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,IAC9C,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS;IAAE,GAAG,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAEjH,wBAAgB,QAAQ,CAAC,SAAS,SAAS,aAAa,EAAE,QAAQ,SAAS,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,EAC1G,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,QAAQ,GACf,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAGtC;AAED,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAE9C;AAED,wBAAgB,SAAS,CAAC,SAAS,SAAS,aAAa,EACxD,QAAQ,EAAE,SAAS,GACjB,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAGhE;AAED,wBAAgB,aAAa,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAO/F;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAe3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,SAAS,GAAG,EAC9C,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,EACjC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,GAC/B,OAAO,CAGT","sourcesContent":["import { MODELS } from \"./models.generated.js\";\nimport { getAnthropicCapabilities } from \"./providers/anthropic-capabilities.js\";\nimport { _setRegistryHook } from \"./providers/anthropic-discovery.js\";\nimport type { Api, KnownProvider, Model, Usage } from \"./types.js\";\n\nconst modelRegistry: Map<string, Map<string, Model<Api>>> = new Map();\n\n/**\n * Apply per-model capability overrides at registry-load time.\n *\n * The generated `models.generated.ts` mirrors what the provider reports for\n * the default tier (e.g. Anthropic's 200k window for Opus 4.5). When the\n * capability table declares an opt-in that unlocks a larger window, the\n * registry should advertise that window so the UI (modeline, picker) and\n * compaction logic operate against the real ceiling we will request.\n *\n * Runtime discovery (see anthropic-discovery.ts) may also push fresher\n * model entries into the registry post-auth via `_registerModelForDiscovery`\n * below; this load-time pass is the cold-start fallback only.\n */\nfunction applyCapabilityOverrides(model: Model<Api>): Model<Api> {\n\tif (model.api !== \"anthropic-messages\" && model.api !== \"bedrock-converse-stream\") {\n\t\treturn model;\n\t}\n\tconst caps = getAnthropicCapabilities(model.id, model.provider);\n\tif (caps.contextWindow && caps.contextWindow !== model.contextWindow) {\n\t\treturn { ...model, contextWindow: caps.contextWindow };\n\t}\n\treturn model;\n}\n\n// Initialize registry from MODELS on module load\nfor (const [provider, models] of Object.entries(MODELS)) {\n\tconst providerModels = new Map<string, Model<Api>>();\n\tfor (const [id, model] of Object.entries(models)) {\n\t\tproviderModels.set(id, applyCapabilityOverrides(model as Model<Api>));\n\t}\n\tmodelRegistry.set(provider, providerModels);\n}\n\n/**\n * Insert or upgrade a registry entry. Used by the discovery layer to surface\n * newly-discovered model ids (e.g. `claude-opus-4.6-1m` on Copilot) without\n * regenerating models.generated.ts.\n *\n * When an existing entry is present, the capability-related fields are\n * refreshed but the pricing is preserved (discovery endpoints rarely\n * report cost). When new, the fresh entry is inserted as-is.\n *\n * Fires registered change listeners so downstream snapshots\n * (e.g. coding-agent's ModelRegistry) can rebuild.\n */\nfunction _registerModelForDiscovery(provider: string, model: Model<Api>): void {\n\tlet providerModels = modelRegistry.get(provider);\n\tif (!providerModels) {\n\t\tproviderModels = new Map();\n\t\tmodelRegistry.set(provider, providerModels);\n\t}\n\tconst prev = providerModels.get(model.id);\n\tconst isNew = !prev;\n\tconst merged: Model<Api> = prev\n\t\t? {\n\t\t\t\t...prev,\n\t\t\t\tcontextWindow: model.contextWindow,\n\t\t\t\tmaxTokens: model.maxTokens,\n\t\t\t\treasoning: model.reasoning,\n\t\t\t\tinput: model.input,\n\t\t\t}\n\t\t: model;\n\tproviderModels.set(model.id, merged);\n\tif (isNew) {\n\t\tfor (const listener of modelChangeListeners) {\n\t\t\ttry {\n\t\t\t\tlistener({ type: \"added\", provider, model: merged });\n\t\t\t} catch {\n\t\t\t\t// Listener errors must not break discovery.\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type ModelRegistryChangeEvent = { type: \"added\"; provider: string; model: Model<Api> };\nconst modelChangeListeners: Array<(e: ModelRegistryChangeEvent) => void> = [];\n\n/**\n * Subscribe to registry mutations performed by the discovery layer\n * (newly-published model ids). Returns an unsubscribe function.\n */\nexport function onModelRegistryChange(listener: (e: ModelRegistryChangeEvent) => void): () => void {\n\tmodelChangeListeners.push(listener);\n\treturn () => {\n\t\tconst i = modelChangeListeners.indexOf(listener);\n\t\tif (i >= 0) modelChangeListeners.splice(i, 1);\n\t};\n}\n\n// Wire the registry-mutation hook into the discovery module so it does not\n// need a back-reference to models.ts (which would cycle).\n_setRegistryHook(_registerModelForDiscovery);\n\ntype ModelApi<\n\tTProvider extends KnownProvider,\n\tTModelId extends keyof (typeof MODELS)[TProvider],\n> = (typeof MODELS)[TProvider][TModelId] extends { api: infer TApi } ? (TApi extends Api ? TApi : never) : never;\n\nexport function getModel<TProvider extends KnownProvider, TModelId extends keyof (typeof MODELS)[TProvider]>(\n\tprovider: TProvider,\n\tmodelId: TModelId,\n): Model<ModelApi<TProvider, TModelId>> {\n\tconst providerModels = modelRegistry.get(provider);\n\treturn providerModels?.get(modelId as string) as Model<ModelApi<TProvider, TModelId>>;\n}\n\nexport function getProviders(): KnownProvider[] {\n\treturn Array.from(modelRegistry.keys()) as KnownProvider[];\n}\n\nexport function getModels<TProvider extends KnownProvider>(\n\tprovider: TProvider,\n): Model<ModelApi<TProvider, keyof (typeof MODELS)[TProvider]>>[] {\n\tconst models = modelRegistry.get(provider);\n\treturn models ? (Array.from(models.values()) as Model<ModelApi<TProvider, keyof (typeof MODELS)[TProvider]>>[]) : [];\n}\n\nexport function calculateCost<TApi extends Api>(model: Model<TApi>, usage: Usage): Usage[\"cost\"] {\n\tusage.cost.input = (model.cost.input / 1000000) * usage.input;\n\tusage.cost.output = (model.cost.output / 1000000) * usage.output;\n\tusage.cost.cacheRead = (model.cost.cacheRead / 1000000) * usage.cacheRead;\n\tusage.cost.cacheWrite = (model.cost.cacheWrite / 1000000) * usage.cacheWrite;\n\tusage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;\n\treturn usage.cost;\n}\n\n/**\n * Check if a model supports xhigh thinking level.\n *\n * Supported today:\n * - GPT-5.2 / GPT-5.3 / GPT-5.4 / GPT-5.5 model families\n * - Opus 4.6 models (xhigh maps to adaptive effort \"max\" on Anthropic-compatible providers)\n */\nexport function supportsXhigh<TApi extends Api>(model: Model<TApi>): boolean {\n\tif (\n\t\tmodel.id.includes(\"gpt-5.2\") ||\n\t\tmodel.id.includes(\"gpt-5.3\") ||\n\t\tmodel.id.includes(\"gpt-5.4\") ||\n\t\tmodel.id.includes(\"gpt-5.5\")\n\t) {\n\t\treturn true;\n\t}\n\n\tif (getAnthropicCapabilities(model.id, model.provider).xhighEffort) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Check if two models are equal by comparing both their id and provider.\n * Returns false if either model is null or undefined.\n */\nexport function modelsAreEqual<TApi extends Api>(\n\ta: Model<TApi> | null | undefined,\n\tb: Model<TApi> | null | undefined,\n): boolean {\n\tif (!a || !b) return false;\n\treturn a.id === b.id && a.provider === b.provider;\n}\n"]}