@mastra/code-sdk 0.0.0-mastracode-cloud-20260706153555

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 (456) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE.md +30 -0
  3. package/README.md +50 -0
  4. package/dist/acp/agent.d.ts +35 -0
  5. package/dist/acp/agent.d.ts.map +1 -0
  6. package/dist/acp/agent.js +173 -0
  7. package/dist/acp/agent.js.map +1 -0
  8. package/dist/acp/event-mapper.d.ts +22 -0
  9. package/dist/acp/event-mapper.d.ts.map +1 -0
  10. package/dist/acp/event-mapper.js +166 -0
  11. package/dist/acp/event-mapper.js.map +1 -0
  12. package/dist/acp/index.d.ts +8 -0
  13. package/dist/acp/index.d.ts.map +1 -0
  14. package/dist/acp/index.js +54 -0
  15. package/dist/acp/index.js.map +1 -0
  16. package/dist/acp/server.d.ts +7 -0
  17. package/dist/acp/server.d.ts.map +1 -0
  18. package/dist/acp/server.js +34 -0
  19. package/dist/acp/server.js.map +1 -0
  20. package/dist/acp.d.ts +2 -0
  21. package/dist/acp.d.ts.map +1 -0
  22. package/dist/acp.js +5 -0
  23. package/dist/acp.js.map +1 -0
  24. package/dist/agents/instructions.d.ts +6 -0
  25. package/dist/agents/instructions.d.ts.map +1 -0
  26. package/dist/agents/instructions.js +41 -0
  27. package/dist/agents/instructions.js.map +1 -0
  28. package/dist/agents/mastracode-gateway.d.ts +65 -0
  29. package/dist/agents/mastracode-gateway.d.ts.map +1 -0
  30. package/dist/agents/mastracode-gateway.js +442 -0
  31. package/dist/agents/mastracode-gateway.js.map +1 -0
  32. package/dist/agents/memory.d.ts +13 -0
  33. package/dist/agents/memory.d.ts.map +1 -0
  34. package/dist/agents/memory.js +107 -0
  35. package/dist/agents/memory.js.map +1 -0
  36. package/dist/agents/model.d.ts +55 -0
  37. package/dist/agents/model.d.ts.map +1 -0
  38. package/dist/agents/model.js +115 -0
  39. package/dist/agents/model.js.map +1 -0
  40. package/dist/agents/modes/build.d.ts +10 -0
  41. package/dist/agents/modes/build.d.ts.map +1 -0
  42. package/dist/agents/modes/build.js +45 -0
  43. package/dist/agents/modes/build.js.map +1 -0
  44. package/dist/agents/modes/explore.d.ts +10 -0
  45. package/dist/agents/modes/explore.d.ts.map +1 -0
  46. package/dist/agents/modes/explore.js +38 -0
  47. package/dist/agents/modes/explore.js.map +1 -0
  48. package/dist/agents/modes/plan.d.ts +6 -0
  49. package/dist/agents/modes/plan.d.ts.map +1 -0
  50. package/dist/agents/modes/plan.js +38 -0
  51. package/dist/agents/modes/plan.js.map +1 -0
  52. package/dist/agents/prompts/agent-instructions.d.ts +20 -0
  53. package/dist/agents/prompts/agent-instructions.d.ts.map +1 -0
  54. package/dist/agents/prompts/agent-instructions.js +82 -0
  55. package/dist/agents/prompts/agent-instructions.js.map +1 -0
  56. package/dist/agents/prompts/build.d.ts +12 -0
  57. package/dist/agents/prompts/build.d.ts.map +1 -0
  58. package/dist/agents/prompts/build.js +73 -0
  59. package/dist/agents/prompts/build.js.map +1 -0
  60. package/dist/agents/prompts/fast.d.ts +5 -0
  61. package/dist/agents/prompts/fast.d.ts.map +1 -0
  62. package/dist/agents/prompts/fast.js +22 -0
  63. package/dist/agents/prompts/fast.js.map +1 -0
  64. package/dist/agents/prompts/index.d.ts +19 -0
  65. package/dist/agents/prompts/index.d.ts.map +1 -0
  66. package/dist/agents/prompts/index.js +57 -0
  67. package/dist/agents/prompts/index.js.map +1 -0
  68. package/dist/agents/prompts/model.d.ts +5 -0
  69. package/dist/agents/prompts/model.d.ts.map +1 -0
  70. package/dist/agents/prompts/model.js +22 -0
  71. package/dist/agents/prompts/model.js.map +1 -0
  72. package/dist/agents/prompts/plan.d.ts +6 -0
  73. package/dist/agents/prompts/plan.d.ts.map +1 -0
  74. package/dist/agents/prompts/plan.js +107 -0
  75. package/dist/agents/prompts/plan.js.map +1 -0
  76. package/dist/agents/prompts/tool-guidance.d.ts +13 -0
  77. package/dist/agents/prompts/tool-guidance.d.ts.map +1 -0
  78. package/dist/agents/prompts/tool-guidance.js +181 -0
  79. package/dist/agents/prompts/tool-guidance.js.map +1 -0
  80. package/dist/agents/sandbox-filesystem.d.ts +89 -0
  81. package/dist/agents/sandbox-filesystem.d.ts.map +1 -0
  82. package/dist/agents/sandbox-filesystem.js +268 -0
  83. package/dist/agents/sandbox-filesystem.js.map +1 -0
  84. package/dist/agents/sandbox-reattach.d.ts +19 -0
  85. package/dist/agents/sandbox-reattach.d.ts.map +1 -0
  86. package/dist/agents/sandbox-reattach.js +17 -0
  87. package/dist/agents/sandbox-reattach.js.map +1 -0
  88. package/dist/agents/thread-caveman-state.d.ts +17 -0
  89. package/dist/agents/thread-caveman-state.d.ts.map +1 -0
  90. package/dist/agents/thread-caveman-state.js +96 -0
  91. package/dist/agents/thread-caveman-state.js.map +1 -0
  92. package/dist/agents/tool-availability.d.ts +10 -0
  93. package/dist/agents/tool-availability.d.ts.map +1 -0
  94. package/dist/agents/tool-availability.js +105 -0
  95. package/dist/agents/tool-availability.js.map +1 -0
  96. package/dist/agents/tools.d.ts +18 -0
  97. package/dist/agents/tools.d.ts.map +1 -0
  98. package/dist/agents/tools.js +126 -0
  99. package/dist/agents/tools.js.map +1 -0
  100. package/dist/agents/workspace.d.ts +22 -0
  101. package/dist/agents/workspace.d.ts.map +1 -0
  102. package/dist/agents/workspace.js +194 -0
  103. package/dist/agents/workspace.js.map +1 -0
  104. package/dist/analytics.d.ts +18 -0
  105. package/dist/analytics.d.ts.map +1 -0
  106. package/dist/analytics.js +152 -0
  107. package/dist/analytics.js.map +1 -0
  108. package/dist/auth/index.d.ts +9 -0
  109. package/dist/auth/index.d.ts.map +1 -0
  110. package/dist/auth/index.js +11 -0
  111. package/dist/auth/index.js.map +1 -0
  112. package/dist/auth/pkce.d.ts +13 -0
  113. package/dist/auth/pkce.d.ts.map +1 -0
  114. package/dist/auth/pkce.js +21 -0
  115. package/dist/auth/pkce.js.map +1 -0
  116. package/dist/auth/providers/anthropic.d.ts +17 -0
  117. package/dist/auth/providers/anthropic.d.ts.map +1 -0
  118. package/dist/auth/providers/anthropic.js +94 -0
  119. package/dist/auth/providers/anthropic.js.map +1 -0
  120. package/dist/auth/providers/github-copilot.d.ts +100 -0
  121. package/dist/auth/providers/github-copilot.d.ts.map +1 -0
  122. package/dist/auth/providers/github-copilot.js +302 -0
  123. package/dist/auth/providers/github-copilot.js.map +1 -0
  124. package/dist/auth/providers/openai-codex.d.ts +95 -0
  125. package/dist/auth/providers/openai-codex.d.ts.map +1 -0
  126. package/dist/auth/providers/openai-codex.js +527 -0
  127. package/dist/auth/providers/openai-codex.js.map +1 -0
  128. package/dist/auth/storage.d.ts +91 -0
  129. package/dist/auth/storage.d.ts.map +1 -0
  130. package/dist/auth/storage.js +187 -0
  131. package/dist/auth/storage.js.map +1 -0
  132. package/dist/auth/types.d.ts +68 -0
  133. package/dist/auth/types.d.ts.map +1 -0
  134. package/dist/auth/types.js +1 -0
  135. package/dist/auth/types.js.map +1 -0
  136. package/dist/clipboard/index.d.ts +26 -0
  137. package/dist/clipboard/index.d.ts.map +1 -0
  138. package/dist/clipboard/index.js +192 -0
  139. package/dist/clipboard/index.js.map +1 -0
  140. package/dist/constants.d.ts +10 -0
  141. package/dist/constants.d.ts.map +1 -0
  142. package/dist/constants.js +23 -0
  143. package/dist/constants.js.map +1 -0
  144. package/dist/error-classification.d.ts +10 -0
  145. package/dist/error-classification.d.ts.map +1 -0
  146. package/dist/error-classification.js +14 -0
  147. package/dist/error-classification.js.map +1 -0
  148. package/dist/evals/context-builder.d.ts +41 -0
  149. package/dist/evals/context-builder.d.ts.map +1 -0
  150. package/dist/evals/context-builder.js +120 -0
  151. package/dist/evals/context-builder.js.map +1 -0
  152. package/dist/evals/index.d.ts +4 -0
  153. package/dist/evals/index.d.ts.map +1 -0
  154. package/dist/evals/index.js +8 -0
  155. package/dist/evals/index.js.map +1 -0
  156. package/dist/evals/scorers/classify-command.d.ts +31 -0
  157. package/dist/evals/scorers/classify-command.d.ts.map +1 -0
  158. package/dist/evals/scorers/classify-command.js +52 -0
  159. package/dist/evals/scorers/classify-command.js.map +1 -0
  160. package/dist/evals/scorers/efficiency.d.ts +44 -0
  161. package/dist/evals/scorers/efficiency.d.ts.map +1 -0
  162. package/dist/evals/scorers/efficiency.js +201 -0
  163. package/dist/evals/scorers/efficiency.js.map +1 -0
  164. package/dist/evals/scorers/extract-tools.d.ts +25 -0
  165. package/dist/evals/scorers/extract-tools.d.ts.map +1 -0
  166. package/dist/evals/scorers/extract-tools.js +56 -0
  167. package/dist/evals/scorers/extract-tools.js.map +1 -0
  168. package/dist/evals/scorers/index.d.ts +3 -0
  169. package/dist/evals/scorers/index.d.ts.map +1 -0
  170. package/dist/evals/scorers/index.js +7 -0
  171. package/dist/evals/scorers/index.js.map +1 -0
  172. package/dist/evals/scorers/outcome.d.ts +49 -0
  173. package/dist/evals/scorers/outcome.d.ts.map +1 -0
  174. package/dist/evals/scorers/outcome.js +238 -0
  175. package/dist/evals/scorers/outcome.js.map +1 -0
  176. package/dist/headless/cli.d.ts +42 -0
  177. package/dist/headless/cli.d.ts.map +1 -0
  178. package/dist/headless/cli.js +196 -0
  179. package/dist/headless/cli.js.map +1 -0
  180. package/dist/headless/flags.d.ts +33 -0
  181. package/dist/headless/flags.d.ts.map +1 -0
  182. package/dist/headless/flags.js +188 -0
  183. package/dist/headless/flags.js.map +1 -0
  184. package/dist/headless/format.d.ts +38 -0
  185. package/dist/headless/format.d.ts.map +1 -0
  186. package/dist/headless/format.js +85 -0
  187. package/dist/headless/format.js.map +1 -0
  188. package/dist/headless/index.d.ts +25 -0
  189. package/dist/headless/index.d.ts.map +1 -0
  190. package/dist/headless/index.js +32 -0
  191. package/dist/headless/index.js.map +1 -0
  192. package/dist/headless/policy.d.ts +17 -0
  193. package/dist/headless/policy.d.ts.map +1 -0
  194. package/dist/headless/policy.js +38 -0
  195. package/dist/headless/policy.js.map +1 -0
  196. package/dist/headless/run-mc.d.ts +7 -0
  197. package/dist/headless/run-mc.d.ts.map +1 -0
  198. package/dist/headless/run-mc.js +296 -0
  199. package/dist/headless/run-mc.js.map +1 -0
  200. package/dist/headless/types.d.ts +134 -0
  201. package/dist/headless/types.d.ts.map +1 -0
  202. package/dist/headless/types.js +9 -0
  203. package/dist/headless/types.js.map +1 -0
  204. package/dist/hooks/config.d.ts +11 -0
  205. package/dist/hooks/config.d.ts.map +1 -0
  206. package/dist/hooks/config.js +78 -0
  207. package/dist/hooks/config.js.map +1 -0
  208. package/dist/hooks/executor.d.ts +13 -0
  209. package/dist/hooks/executor.d.ts.map +1 -0
  210. package/dist/hooks/executor.js +125 -0
  211. package/dist/hooks/executor.js.map +1 -0
  212. package/dist/hooks/index.d.ts +6 -0
  213. package/dist/hooks/index.d.ts.map +1 -0
  214. package/dist/hooks/index.js +16 -0
  215. package/dist/hooks/index.js.map +1 -0
  216. package/dist/hooks/manager.d.ts +47 -0
  217. package/dist/hooks/manager.d.ts.map +1 -0
  218. package/dist/hooks/manager.js +284 -0
  219. package/dist/hooks/manager.js.map +1 -0
  220. package/dist/hooks/types.d.ts +152 -0
  221. package/dist/hooks/types.d.ts.map +1 -0
  222. package/dist/hooks/types.js +7 -0
  223. package/dist/hooks/types.js.map +1 -0
  224. package/dist/index.d.ts +241 -0
  225. package/dist/index.d.ts.map +1 -0
  226. package/dist/index.js +712 -0
  227. package/dist/index.js.map +1 -0
  228. package/dist/ipc/ipc-reporter.d.ts +14 -0
  229. package/dist/ipc/ipc-reporter.d.ts.map +1 -0
  230. package/dist/ipc/ipc-reporter.js +24 -0
  231. package/dist/ipc/ipc-reporter.js.map +1 -0
  232. package/dist/lsp/client.d.ts +56 -0
  233. package/dist/lsp/client.d.ts.map +1 -0
  234. package/dist/lsp/client.js +309 -0
  235. package/dist/lsp/client.js.map +1 -0
  236. package/dist/lsp/index.d.ts +4 -0
  237. package/dist/lsp/index.d.ts.map +1 -0
  238. package/dist/lsp/index.js +9 -0
  239. package/dist/lsp/index.js.map +1 -0
  240. package/dist/lsp/language.d.ts +9 -0
  241. package/dist/lsp/language.d.ts.map +1 -0
  242. package/dist/lsp/language.js +48 -0
  243. package/dist/lsp/language.js.map +1 -0
  244. package/dist/lsp/manager.d.ts +34 -0
  245. package/dist/lsp/manager.d.ts.map +1 -0
  246. package/dist/lsp/manager.js +97 -0
  247. package/dist/lsp/manager.js.map +1 -0
  248. package/dist/lsp/server.d.ts +27 -0
  249. package/dist/lsp/server.d.ts.map +1 -0
  250. package/dist/lsp/server.js +128 -0
  251. package/dist/lsp/server.js.map +1 -0
  252. package/dist/lsp/workspace.d.ts +9 -0
  253. package/dist/lsp/workspace.d.ts.map +1 -0
  254. package/dist/lsp/workspace.js +52 -0
  255. package/dist/lsp/workspace.js.map +1 -0
  256. package/dist/mcp/config.d.ts +34 -0
  257. package/dist/mcp/config.d.ts.map +1 -0
  258. package/dist/mcp/config.js +205 -0
  259. package/dist/mcp/config.js.map +1 -0
  260. package/dist/mcp/index.d.ts +5 -0
  261. package/dist/mcp/index.d.ts.map +1 -0
  262. package/dist/mcp/index.js +10 -0
  263. package/dist/mcp/index.js.map +1 -0
  264. package/dist/mcp/manager.d.ts +49 -0
  265. package/dist/mcp/manager.d.ts.map +1 -0
  266. package/dist/mcp/manager.js +374 -0
  267. package/dist/mcp/manager.js.map +1 -0
  268. package/dist/mcp/types.d.ts +85 -0
  269. package/dist/mcp/types.d.ts.map +1 -0
  270. package/dist/mcp/types.js +1 -0
  271. package/dist/mcp/types.js.map +1 -0
  272. package/dist/onboarding/custom-packs.d.ts +7 -0
  273. package/dist/onboarding/custom-packs.d.ts.map +1 -0
  274. package/dist/onboarding/custom-packs.js +20 -0
  275. package/dist/onboarding/custom-packs.js.map +1 -0
  276. package/dist/onboarding/custom-providers.d.ts +4 -0
  277. package/dist/onboarding/custom-providers.d.ts.map +1 -0
  278. package/dist/onboarding/custom-providers.js +28 -0
  279. package/dist/onboarding/custom-providers.js.map +1 -0
  280. package/dist/onboarding/index.d.ts +5 -0
  281. package/dist/onboarding/index.d.ts.map +1 -0
  282. package/dist/onboarding/index.js +21 -0
  283. package/dist/onboarding/index.js.map +1 -0
  284. package/dist/onboarding/om-settings.d.ts +20 -0
  285. package/dist/onboarding/om-settings.d.ts.map +1 -0
  286. package/dist/onboarding/om-settings.js +26 -0
  287. package/dist/onboarding/om-settings.js.map +1 -0
  288. package/dist/onboarding/packs.d.ts +48 -0
  289. package/dist/onboarding/packs.d.ts.map +1 -0
  290. package/dist/onboarding/packs.js +111 -0
  291. package/dist/onboarding/packs.js.map +1 -0
  292. package/dist/onboarding/settings.d.ts +323 -0
  293. package/dist/onboarding/settings.d.ts.map +1 -0
  294. package/dist/onboarding/settings.js +594 -0
  295. package/dist/onboarding/settings.js.map +1 -0
  296. package/dist/permissions.d.ts +55 -0
  297. package/dist/permissions.d.ts.map +1 -0
  298. package/dist/permissions.js +119 -0
  299. package/dist/permissions.js.map +1 -0
  300. package/dist/plugin.d.ts +81 -0
  301. package/dist/plugin.d.ts.map +1 -0
  302. package/dist/plugin.js +30 -0
  303. package/dist/plugin.js.map +1 -0
  304. package/dist/plugins/install.d.ts +20 -0
  305. package/dist/plugins/install.d.ts.map +1 -0
  306. package/dist/plugins/install.js +179 -0
  307. package/dist/plugins/install.js.map +1 -0
  308. package/dist/plugins/loader.d.ts +15 -0
  309. package/dist/plugins/loader.d.ts.map +1 -0
  310. package/dist/plugins/loader.js +221 -0
  311. package/dist/plugins/loader.js.map +1 -0
  312. package/dist/plugins/manager.d.ts +60 -0
  313. package/dist/plugins/manager.d.ts.map +1 -0
  314. package/dist/plugins/manager.js +369 -0
  315. package/dist/plugins/manager.js.map +1 -0
  316. package/dist/plugins/manifest.d.ts +14 -0
  317. package/dist/plugins/manifest.d.ts.map +1 -0
  318. package/dist/plugins/manifest.js +75 -0
  319. package/dist/plugins/manifest.js.map +1 -0
  320. package/dist/plugins/package-link.d.ts +2 -0
  321. package/dist/plugins/package-link.d.ts.map +1 -0
  322. package/dist/plugins/package-link.js +20 -0
  323. package/dist/plugins/package-link.js.map +1 -0
  324. package/dist/plugins/paths.d.ts +10 -0
  325. package/dist/plugins/paths.d.ts.map +1 -0
  326. package/dist/plugins/paths.js +26 -0
  327. package/dist/plugins/paths.js.map +1 -0
  328. package/dist/plugins/registry.d.ts +8 -0
  329. package/dist/plugins/registry.d.ts.map +1 -0
  330. package/dist/plugins/registry.js +96 -0
  331. package/dist/plugins/registry.js.map +1 -0
  332. package/dist/plugins/scaffold.d.ts +10 -0
  333. package/dist/plugins/scaffold.d.ts.map +1 -0
  334. package/dist/plugins/scaffold.js +152 -0
  335. package/dist/plugins/scaffold.js.map +1 -0
  336. package/dist/plugins/types.d.ts +45 -0
  337. package/dist/plugins/types.d.ts.map +1 -0
  338. package/dist/plugins/types.js +1 -0
  339. package/dist/plugins/types.js.map +1 -0
  340. package/dist/processors/plan-rejection-abort.d.ts +12 -0
  341. package/dist/processors/plan-rejection-abort.d.ts.map +1 -0
  342. package/dist/processors/plan-rejection-abort.js +53 -0
  343. package/dist/processors/plan-rejection-abort.js.map +1 -0
  344. package/dist/providers/amazon-bedrock-gateway.d.ts +40 -0
  345. package/dist/providers/amazon-bedrock-gateway.d.ts.map +1 -0
  346. package/dist/providers/amazon-bedrock-gateway.js +79 -0
  347. package/dist/providers/amazon-bedrock-gateway.js.map +1 -0
  348. package/dist/providers/amazon-bedrock.d.ts +28 -0
  349. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  350. package/dist/providers/amazon-bedrock.js +62 -0
  351. package/dist/providers/amazon-bedrock.js.map +1 -0
  352. package/dist/providers/claude-max.d.ts +50 -0
  353. package/dist/providers/claude-max.d.ts.map +1 -0
  354. package/dist/providers/claude-max.js +151 -0
  355. package/dist/providers/claude-max.js.map +1 -0
  356. package/dist/providers/github-copilot.d.ts +58 -0
  357. package/dist/providers/github-copilot.d.ts.map +1 -0
  358. package/dist/providers/github-copilot.js +263 -0
  359. package/dist/providers/github-copilot.js.map +1 -0
  360. package/dist/providers/openai-codex.d.ts +70 -0
  361. package/dist/providers/openai-codex.d.ts.map +1 -0
  362. package/dist/providers/openai-codex.js +291 -0
  363. package/dist/providers/openai-codex.js.map +1 -0
  364. package/dist/schema.d.ts +167 -0
  365. package/dist/schema.d.ts.map +1 -0
  366. package/dist/schema.js +92 -0
  367. package/dist/schema.js.map +1 -0
  368. package/dist/theme-palette.d.ts +17 -0
  369. package/dist/theme-palette.d.ts.map +1 -0
  370. package/dist/theme-palette.js +17 -0
  371. package/dist/theme-palette.js.map +1 -0
  372. package/dist/tool-names.d.ts +73 -0
  373. package/dist/tool-names.d.ts.map +1 -0
  374. package/dist/tool-names.js +43 -0
  375. package/dist/tool-names.js.map +1 -0
  376. package/dist/tools/index.d.ts +6 -0
  377. package/dist/tools/index.d.ts.map +1 -0
  378. package/dist/tools/index.js +9 -0
  379. package/dist/tools/index.js.map +1 -0
  380. package/dist/tools/request-sandbox-access.d.ts +6 -0
  381. package/dist/tools/request-sandbox-access.d.ts.map +1 -0
  382. package/dist/tools/request-sandbox-access.js +88 -0
  383. package/dist/tools/request-sandbox-access.js.map +1 -0
  384. package/dist/tools/utils.d.ts +20 -0
  385. package/dist/tools/utils.d.ts.map +1 -0
  386. package/dist/tools/utils.js +22 -0
  387. package/dist/tools/utils.js.map +1 -0
  388. package/dist/tools/web-search.d.ts +35 -0
  389. package/dist/tools/web-search.d.ts.map +1 -0
  390. package/dist/tools/web-search.js +65 -0
  391. package/dist/tools/web-search.js.map +1 -0
  392. package/dist/utils/binaries.d.ts +7 -0
  393. package/dist/utils/binaries.d.ts.map +1 -0
  394. package/dist/utils/binaries.js +74 -0
  395. package/dist/utils/binaries.js.map +1 -0
  396. package/dist/utils/debug-log.d.ts +12 -0
  397. package/dist/utils/debug-log.d.ts.map +1 -0
  398. package/dist/utils/debug-log.js +55 -0
  399. package/dist/utils/debug-log.js.map +1 -0
  400. package/dist/utils/errors.d.ts +36 -0
  401. package/dist/utils/errors.d.ts.map +1 -0
  402. package/dist/utils/errors.js +207 -0
  403. package/dist/utils/errors.js.map +1 -0
  404. package/dist/utils/gateway-sync.d.ts +26 -0
  405. package/dist/utils/gateway-sync.d.ts.map +1 -0
  406. package/dist/utils/gateway-sync.js +49 -0
  407. package/dist/utils/gateway-sync.js.map +1 -0
  408. package/dist/utils/plan-diff.d.ts +25 -0
  409. package/dist/utils/plan-diff.d.ts.map +1 -0
  410. package/dist/utils/plan-diff.js +43 -0
  411. package/dist/utils/plan-diff.js.map +1 -0
  412. package/dist/utils/plans.d.ts +56 -0
  413. package/dist/utils/plans.d.ts.map +1 -0
  414. package/dist/utils/plans.js +99 -0
  415. package/dist/utils/plans.js.map +1 -0
  416. package/dist/utils/project.d.ts +161 -0
  417. package/dist/utils/project.d.ts.map +1 -0
  418. package/dist/utils/project.js +302 -0
  419. package/dist/utils/project.js.map +1 -0
  420. package/dist/utils/signals-pubsub.d.ts +41 -0
  421. package/dist/utils/signals-pubsub.d.ts.map +1 -0
  422. package/dist/utils/signals-pubsub.js +104 -0
  423. package/dist/utils/signals-pubsub.js.map +1 -0
  424. package/dist/utils/slash-command-loader.d.ts +48 -0
  425. package/dist/utils/slash-command-loader.d.ts.map +1 -0
  426. package/dist/utils/slash-command-loader.js +155 -0
  427. package/dist/utils/slash-command-loader.js.map +1 -0
  428. package/dist/utils/slash-command-processor.d.ts +14 -0
  429. package/dist/utils/slash-command-processor.d.ts.map +1 -0
  430. package/dist/utils/slash-command-processor.js +96 -0
  431. package/dist/utils/slash-command-processor.js.map +1 -0
  432. package/dist/utils/stdin-pipe.d.ts +33 -0
  433. package/dist/utils/stdin-pipe.d.ts.map +1 -0
  434. package/dist/utils/stdin-pipe.js +72 -0
  435. package/dist/utils/stdin-pipe.js.map +1 -0
  436. package/dist/utils/storage-factory.d.ts +50 -0
  437. package/dist/utils/storage-factory.d.ts.map +1 -0
  438. package/dist/utils/storage-factory.js +98 -0
  439. package/dist/utils/storage-factory.js.map +1 -0
  440. package/dist/utils/thread-lock.d.ts +26 -0
  441. package/dist/utils/thread-lock.d.ts.map +1 -0
  442. package/dist/utils/thread-lock.js +108 -0
  443. package/dist/utils/thread-lock.js.map +1 -0
  444. package/dist/utils/token-estimator.d.ts +3 -0
  445. package/dist/utils/token-estimator.d.ts.map +1 -0
  446. package/dist/utils/token-estimator.js +21 -0
  447. package/dist/utils/token-estimator.js.map +1 -0
  448. package/dist/utils/update-check.d.ts +52 -0
  449. package/dist/utils/update-check.d.ts.map +1 -0
  450. package/dist/utils/update-check.js +177 -0
  451. package/dist/utils/update-check.js.map +1 -0
  452. package/dist/voice/stt-registry.d.ts +64 -0
  453. package/dist/voice/stt-registry.d.ts.map +1 -0
  454. package/dist/voice/stt-registry.js +126 -0
  455. package/dist/voice/stt-registry.js.map +1 -0
  456. package/package.json +92 -0
@@ -0,0 +1,62 @@
1
+ const MODELS_DEV_API_URL = "https://models.dev/api.json";
2
+ const BEDROCK_PROVIDER_ID = "amazon-bedrock";
3
+ const CATALOG_TTL_MS = 60 * 60 * 1e3;
4
+ const CATALOG_FAILURE_TTL_MS = 60 * 1e3;
5
+ const CATALOG_FETCH_TIMEOUT_MS = 5e3;
6
+ const BEDROCK_FALLBACK_MODELS = [
7
+ { id: "us.anthropic.claude-opus-4-6-v1" },
8
+ { id: "us.anthropic.claude-sonnet-4-5-20250929-v1:0" },
9
+ { id: "us.anthropic.claude-haiku-4-5-20251001-v1:0" }
10
+ ];
11
+ let catalogCache = null;
12
+ let inflightFetch = null;
13
+ function clearBedrockCatalogCache() {
14
+ catalogCache = null;
15
+ inflightFetch = null;
16
+ }
17
+ async function fetchBedrockModels(signal) {
18
+ const response = await fetch(MODELS_DEV_API_URL, { signal });
19
+ if (!response.ok) {
20
+ throw new Error(`models.dev returned ${response.status}`);
21
+ }
22
+ const data = await response.json();
23
+ const provider = data[BEDROCK_PROVIDER_ID];
24
+ const models = provider?.models ?? {};
25
+ return Object.keys(models).sort().map((id) => ({ id }));
26
+ }
27
+ async function getBedrockModelCatalog() {
28
+ const now = Date.now();
29
+ if (catalogCache && now - catalogCache.fetchedAt < catalogCache.ttl) {
30
+ return catalogCache.models;
31
+ }
32
+ if (inflightFetch) return inflightFetch;
33
+ inflightFetch = (async () => {
34
+ const controller = new AbortController();
35
+ const timer = setTimeout(() => controller.abort(), CATALOG_FETCH_TIMEOUT_MS);
36
+ try {
37
+ const models = await fetchBedrockModels(controller.signal);
38
+ catalogCache = { fetchedAt: Date.now(), ttl: CATALOG_TTL_MS, models };
39
+ return models;
40
+ } catch (error) {
41
+ catalogCache = {
42
+ fetchedAt: Date.now(),
43
+ ttl: CATALOG_FAILURE_TTL_MS,
44
+ models: BEDROCK_FALLBACK_MODELS
45
+ };
46
+ console.warn(
47
+ "Failed to fetch live Amazon Bedrock models, using fallback list:",
48
+ error instanceof Error ? error.message : error
49
+ );
50
+ return BEDROCK_FALLBACK_MODELS;
51
+ } finally {
52
+ clearTimeout(timer);
53
+ inflightFetch = null;
54
+ }
55
+ })();
56
+ return inflightFetch;
57
+ }
58
+ export {
59
+ clearBedrockCatalogCache,
60
+ getBedrockModelCatalog
61
+ };
62
+ //# sourceMappingURL=amazon-bedrock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/amazon-bedrock.ts"],"sourcesContent":["/**\n * Amazon Bedrock model catalog.\n *\n * Bedrock is not part of mastracode's gateway-synced model router (it\n * authenticates with AWS SigV4 rather than an API key / base URL, so it is\n * resolved directly in `agents/model.ts`). To still offer Bedrock models in the\n * `/models` picker and packs, we fetch the public models.dev catalog — the same\n * source the model router uses — and expose the `amazon-bedrock` provider's\n * model list. This mirrors the GitHub Copilot catalog approach.\n */\n\nconst MODELS_DEV_API_URL = 'https://models.dev/api.json';\nconst BEDROCK_PROVIDER_ID = 'amazon-bedrock';\n\nconst CATALOG_TTL_MS = 60 * 60 * 1000;\nconst CATALOG_FAILURE_TTL_MS = 60 * 1000;\nconst CATALOG_FETCH_TIMEOUT_MS = 5_000;\n\nexport interface BedrockModelEntry {\n id: string;\n}\n\n/**\n * A small, stable fallback so Bedrock packs keep working offline or when\n * models.dev is unreachable. Intentionally minimal — the live catalog is the\n * source of truth and supersedes this within one fetch.\n */\nconst BEDROCK_FALLBACK_MODELS: BedrockModelEntry[] = [\n { id: 'us.anthropic.claude-opus-4-6-v1' },\n { id: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0' },\n { id: 'us.anthropic.claude-haiku-4-5-20251001-v1:0' },\n];\n\ninterface CatalogCacheEntry {\n fetchedAt: number;\n ttl: number;\n models: BedrockModelEntry[];\n}\n\nlet catalogCache: CatalogCacheEntry | null = null;\nlet inflightFetch: Promise<BedrockModelEntry[]> | null = null;\n\n/** Reset the in-process Bedrock catalog cache (test seam). */\nexport function clearBedrockCatalogCache(): void {\n catalogCache = null;\n inflightFetch = null;\n}\n\nasync function fetchBedrockModels(signal: AbortSignal): Promise<BedrockModelEntry[]> {\n const response = await fetch(MODELS_DEV_API_URL, { signal });\n if (!response.ok) {\n throw new Error(`models.dev returned ${response.status}`);\n }\n const data = (await response.json()) as Record<string, { models?: Record<string, unknown> }>;\n const provider = data[BEDROCK_PROVIDER_ID];\n const models = provider?.models ?? {};\n return Object.keys(models)\n .sort()\n .map(id => ({ id }));\n}\n\n/**\n * Return the available Amazon Bedrock models.\n *\n * - Returns the cached list when a recent fetch succeeded.\n * - On cache miss / expiry, fetches the models.dev catalog with a 5s timeout and\n * caches it for an hour.\n * - On fetch failure, returns a small hard-coded fallback (so packs still work\n * offline) and caches that briefly to avoid hammering the network.\n *\n * Concurrent calls during a fetch share the inflight promise.\n */\nexport async function getBedrockModelCatalog(): Promise<BedrockModelEntry[]> {\n const now = Date.now();\n if (catalogCache && now - catalogCache.fetchedAt < catalogCache.ttl) {\n return catalogCache.models;\n }\n\n if (inflightFetch) return inflightFetch;\n\n inflightFetch = (async (): Promise<BedrockModelEntry[]> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), CATALOG_FETCH_TIMEOUT_MS);\n try {\n const models = await fetchBedrockModels(controller.signal);\n catalogCache = { fetchedAt: Date.now(), ttl: CATALOG_TTL_MS, models };\n return models;\n } catch (error) {\n catalogCache = {\n fetchedAt: Date.now(),\n ttl: CATALOG_FAILURE_TTL_MS,\n models: BEDROCK_FALLBACK_MODELS,\n };\n console.warn(\n 'Failed to fetch live Amazon Bedrock models, using fallback list:',\n error instanceof Error ? error.message : error,\n );\n return BEDROCK_FALLBACK_MODELS;\n } finally {\n clearTimeout(timer);\n inflightFetch = null;\n }\n })();\n\n return inflightFetch;\n}\n"],"mappings":"AAWA,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAE5B,MAAM,iBAAiB,KAAK,KAAK;AACjC,MAAM,yBAAyB,KAAK;AACpC,MAAM,2BAA2B;AAWjC,MAAM,0BAA+C;AAAA,EACnD,EAAE,IAAI,kCAAkC;AAAA,EACxC,EAAE,IAAI,+CAA+C;AAAA,EACrD,EAAE,IAAI,8CAA8C;AACtD;AAQA,IAAI,eAAyC;AAC7C,IAAI,gBAAqD;AAGlD,SAAS,2BAAiC;AAC/C,iBAAe;AACf,kBAAgB;AAClB;AAEA,eAAe,mBAAmB,QAAmD;AACnF,QAAM,WAAW,MAAM,MAAM,oBAAoB,EAAE,OAAO,CAAC;AAC3D,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAAA,EAC1D;AACA,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,QAAM,WAAW,KAAK,mBAAmB;AACzC,QAAM,SAAS,UAAU,UAAU,CAAC;AACpC,SAAO,OAAO,KAAK,MAAM,EACtB,KAAK,EACL,IAAI,SAAO,EAAE,GAAG,EAAE;AACvB;AAaA,eAAsB,yBAAuD;AAC3E,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,gBAAgB,MAAM,aAAa,YAAY,aAAa,KAAK;AACnE,WAAO,aAAa;AAAA,EACtB;AAEA,MAAI,cAAe,QAAO;AAE1B,mBAAiB,YAA0C;AACzD,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,wBAAwB;AAC3E,QAAI;AACF,YAAM,SAAS,MAAM,mBAAmB,WAAW,MAAM;AACzD,qBAAe,EAAE,WAAW,KAAK,IAAI,GAAG,KAAK,gBAAgB,OAAO;AACpE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,qBAAe;AAAA,QACb,WAAW,KAAK,IAAI;AAAA,QACpB,KAAK;AAAA,QACL,QAAQ;AAAA,MACV;AACA,cAAQ;AAAA,QACN;AAAA,QACA,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AACA,aAAO;AAAA,IACT,UAAE;AACA,mBAAa,KAAK;AAClB,sBAAgB;AAAA,IAClB;AAAA,EACF,GAAG;AAEH,SAAO;AACT;","names":[]}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Claude Max OAuth Provider
3
+ *
4
+ * Uses OAuth tokens from AuthStorage to authenticate with Claude Max plan.
5
+ * The OAuth endpoint requires a specific system message to be present.
6
+ */
7
+ import type { MastraModelConfig } from '@mastra/core/llm';
8
+ import type { LanguageModelMiddleware } from 'ai';
9
+ import { AuthStorage } from '../auth/storage.js';
10
+ /**
11
+ * Get or create the shared AuthStorage instance
12
+ */
13
+ export declare function getAuthStorage(): AuthStorage;
14
+ /**
15
+ * Set a custom AuthStorage instance (useful for TUI integration)
16
+ */
17
+ export declare function setAuthStorage(storage: AuthStorage | undefined): void;
18
+ /**
19
+ * Middleware that injects the Claude Code identity system message
20
+ * Required for Claude Max OAuth authentication
21
+ */
22
+ export declare const claudeCodeMiddleware: LanguageModelMiddleware;
23
+ /**
24
+ * Prompt caching middleware for Anthropic
25
+ *
26
+ * Adds cache breakpoints at strategic locations:
27
+ * 1. Last system message (end of static instructions + dynamic memory)
28
+ * 2. Most recent user/assistant message (conversation context)
29
+ *
30
+ * This allows Anthropic to cache:
31
+ * - System prompts and instructions (rarely change)
32
+ * - Conversation history up to the last message
33
+ */
34
+ export declare const promptCacheMiddleware: LanguageModelMiddleware;
35
+ /**
36
+ * Build a fetch function that handles Anthropic OAuth.
37
+ * Preserves non-auth headers from init (critical for gateway auth header to survive
38
+ * when used with the gateway). Strips `authorization` and `x-api-key`.
39
+ */
40
+ export declare function buildAnthropicOAuthFetch(opts?: {
41
+ authStorage?: AuthStorage;
42
+ }): typeof fetch;
43
+ /**
44
+ * Creates an Anthropic model using Claude Max OAuth authentication
45
+ * Uses OAuth tokens from AuthStorage (auto-refreshes when needed)
46
+ */
47
+ export declare function opencodeClaudeMaxProvider(modelId?: string, options?: {
48
+ headers?: Record<string, string>;
49
+ }): MastraModelConfig;
50
+ //# sourceMappingURL=claude-max.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-max.d.ts","sourceRoot":"","sources":["../../src/providers/claude-max.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,IAAI,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAoBjD;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAK5C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAErE;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,uBAkBlC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,EAAE,uBA2DnC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,OAAO,KAAK,CAmD/F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,MAAmC,EAC5C,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC7C,iBAAiB,CA0BnB"}
@@ -0,0 +1,151 @@
1
+ import { createAnthropic } from "@ai-sdk/anthropic";
2
+ import { wrapLanguageModel } from "ai";
3
+ import { AuthStorage } from "../auth/storage.js";
4
+ const claudeCodeIdentity = "You are Claude Code, Anthropic's official CLI for Claude.";
5
+ const OAUTH_REQUIRED_BETAS = [
6
+ "oauth-2025-04-20",
7
+ "claude-code-20250219",
8
+ "interleaved-thinking-2025-05-14",
9
+ "fine-grained-tool-streaming-2025-05-14"
10
+ ];
11
+ let authStorageInstance = null;
12
+ function getAuthStorage() {
13
+ if (!authStorageInstance) {
14
+ authStorageInstance = new AuthStorage();
15
+ }
16
+ return authStorageInstance;
17
+ }
18
+ function setAuthStorage(storage) {
19
+ authStorageInstance = storage ?? null;
20
+ }
21
+ const claudeCodeMiddleware = {
22
+ specificationVersion: "v3",
23
+ transformParams: async ({ params }) => {
24
+ const systemMessage = {
25
+ role: "system",
26
+ content: claudeCodeIdentity
27
+ };
28
+ if (params.temperature) {
29
+ delete params.topP;
30
+ }
31
+ return {
32
+ ...params,
33
+ prompt: [systemMessage, ...params.prompt]
34
+ };
35
+ }
36
+ };
37
+ const promptCacheMiddleware = {
38
+ specificationVersion: "v3",
39
+ transformParams: async ({ params }) => {
40
+ const prompt = [...params.prompt];
41
+ const cacheControl = { type: "ephemeral", ttl: "5m" };
42
+ const addCacheToMessage = (msg) => {
43
+ if (typeof msg.content === "string") {
44
+ return {
45
+ ...msg,
46
+ providerOptions: {
47
+ ...msg.providerOptions,
48
+ anthropic: { ...msg.providerOptions?.anthropic, cacheControl }
49
+ }
50
+ };
51
+ }
52
+ if (Array.isArray(msg.content) && msg.content.length > 0) {
53
+ const content = [...msg.content];
54
+ const lastPart = content[content.length - 1];
55
+ content[content.length - 1] = {
56
+ ...lastPart,
57
+ providerOptions: {
58
+ ...lastPart.providerOptions,
59
+ anthropic: { ...lastPart.providerOptions?.anthropic, cacheControl }
60
+ }
61
+ };
62
+ return { ...msg, content };
63
+ }
64
+ return msg;
65
+ };
66
+ let lastSystemIdx = -1;
67
+ for (let i = prompt.length - 1; i >= 0; i--) {
68
+ if (prompt[i].role === "system") {
69
+ lastSystemIdx = i;
70
+ break;
71
+ }
72
+ }
73
+ if (lastSystemIdx >= 0) {
74
+ prompt[lastSystemIdx] = addCacheToMessage(prompt[lastSystemIdx]);
75
+ }
76
+ const lastIdx = prompt.length - 1;
77
+ if (lastIdx >= 0 && lastIdx !== lastSystemIdx) {
78
+ prompt[lastIdx] = addCacheToMessage(prompt[lastIdx]);
79
+ }
80
+ return { ...params, prompt };
81
+ }
82
+ };
83
+ function buildAnthropicOAuthFetch(opts = {}) {
84
+ return (async (url, init) => {
85
+ const storage = opts.authStorage ?? getAuthStorage();
86
+ storage.reload();
87
+ const storedCred = storage.get("anthropic");
88
+ if (storedCred?.type === "api_key") {
89
+ throw new Error("Anthropic API key credential is configured, but OAuth is required.");
90
+ }
91
+ const accessToken = await storage.getApiKey("anthropic");
92
+ if (!accessToken) {
93
+ throw new Error("Not logged in to Anthropic. Run /login first.");
94
+ }
95
+ const headers = new Headers();
96
+ if (init?.headers) {
97
+ const source = init.headers instanceof Headers ? init.headers : Array.isArray(init.headers) ? new Headers(init.headers) : new Headers(init.headers);
98
+ source.forEach((value, key) => {
99
+ const lower = key.toLowerCase();
100
+ if (lower !== "authorization" && lower !== "x-api-key") {
101
+ headers.set(key, value);
102
+ }
103
+ });
104
+ }
105
+ headers.set("Authorization", `Bearer ${accessToken}`);
106
+ const requestBetas = (headers.get("anthropic-beta") ?? "").split(",").map((beta) => beta.trim()).filter(Boolean);
107
+ headers.set("anthropic-beta", Array.from(/* @__PURE__ */ new Set([...OAUTH_REQUIRED_BETAS, ...requestBetas])).join(","));
108
+ headers.set("anthropic-version", "2023-06-01");
109
+ try {
110
+ return await fetch(url, { ...init, headers });
111
+ } catch (error) {
112
+ if (error && typeof error === "object") {
113
+ Object.assign(error, {
114
+ requestUrl: url instanceof URL ? url.toString() : typeof url === "string" ? url : url.url
115
+ });
116
+ }
117
+ throw error;
118
+ }
119
+ });
120
+ }
121
+ function opencodeClaudeMaxProvider(modelId = "claude-sonnet-4-20250514", options) {
122
+ const headers = options?.headers;
123
+ if (process.env.NODE_ENV === "test" || process.env.VITEST) {
124
+ const anthropic2 = createAnthropic({
125
+ apiKey: "test-api-key",
126
+ headers
127
+ });
128
+ return wrapLanguageModel({
129
+ model: anthropic2(modelId),
130
+ middleware: [claudeCodeMiddleware, promptCacheMiddleware]
131
+ });
132
+ }
133
+ const anthropic = createAnthropic({
134
+ apiKey: "oauth-placeholder",
135
+ headers,
136
+ fetch: buildAnthropicOAuthFetch()
137
+ });
138
+ return wrapLanguageModel({
139
+ model: anthropic(modelId),
140
+ middleware: [claudeCodeMiddleware, promptCacheMiddleware]
141
+ });
142
+ }
143
+ export {
144
+ buildAnthropicOAuthFetch,
145
+ claudeCodeMiddleware,
146
+ getAuthStorage,
147
+ opencodeClaudeMaxProvider,
148
+ promptCacheMiddleware,
149
+ setAuthStorage
150
+ };
151
+ //# sourceMappingURL=claude-max.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/claude-max.ts"],"sourcesContent":["/**\n * Claude Max OAuth Provider\n *\n * Uses OAuth tokens from AuthStorage to authenticate with Claude Max plan.\n * The OAuth endpoint requires a specific system message to be present.\n */\n\nimport { createAnthropic } from '@ai-sdk/anthropic';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport type { LanguageModelMiddleware } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\n\n// Required for Claude Max plan OAuth - the endpoint checks for this system message\nconst claudeCodeIdentity = \"You are Claude Code, Anthropic's official CLI for Claude.\";\n\n// Betas required for Claude Max plan OAuth. Merged with (not replacing) any\n// betas the AI SDK already set on the request — e.g. the SDK adds\n// `server-side-fallback-2026-06-01` when `providerOptions.anthropic.fallbacks`\n// is configured; dropping it makes the API reject the `fallbacks` body field\n// with \"Extra inputs are not permitted\".\nconst OAUTH_REQUIRED_BETAS = [\n 'oauth-2025-04-20',\n 'claude-code-20250219',\n 'interleaved-thinking-2025-05-14',\n 'fine-grained-tool-streaming-2025-05-14',\n];\n\n// Singleton auth storage instance\nlet authStorageInstance: AuthStorage | null = null;\n\n/**\n * Get or create the shared AuthStorage instance\n */\nexport function getAuthStorage(): AuthStorage {\n if (!authStorageInstance) {\n authStorageInstance = new AuthStorage();\n }\n return authStorageInstance;\n}\n\n/**\n * Set a custom AuthStorage instance (useful for TUI integration)\n */\nexport function setAuthStorage(storage: AuthStorage | undefined): void {\n authStorageInstance = storage ?? null;\n}\n\n/**\n * Middleware that injects the Claude Code identity system message\n * Required for Claude Max OAuth authentication\n */\nexport const claudeCodeMiddleware: LanguageModelMiddleware = {\n specificationVersion: 'v3',\n transformParams: async ({ params }) => {\n // Prepend the Claude Code identity as the first system message\n const systemMessage = {\n role: 'system' as const,\n content: claudeCodeIdentity,\n };\n\n if (params.temperature) {\n delete params.topP;\n }\n\n return {\n ...params,\n prompt: [systemMessage, ...params.prompt],\n };\n },\n};\n\n/**\n * Prompt caching middleware for Anthropic\n *\n * Adds cache breakpoints at strategic locations:\n * 1. Last system message (end of static instructions + dynamic memory)\n * 2. Most recent user/assistant message (conversation context)\n *\n * This allows Anthropic to cache:\n * - System prompts and instructions (rarely change)\n * - Conversation history up to the last message\n */\nexport const promptCacheMiddleware: LanguageModelMiddleware = {\n specificationVersion: 'v3',\n transformParams: async ({ params }) => {\n const prompt = [...params.prompt];\n\n const cacheControl = { type: 'ephemeral' as const, ttl: '5m' as const };\n\n // Helper to add cache control to a message's last content part\n const addCacheToMessage = (msg: any) => {\n // For system messages with string content\n if (typeof msg.content === 'string') {\n return {\n ...msg,\n providerOptions: {\n ...msg.providerOptions,\n anthropic: { ...msg.providerOptions?.anthropic, cacheControl },\n },\n };\n }\n\n // For messages with array content, add to last part\n if (Array.isArray(msg.content) && msg.content.length > 0) {\n const content = [...msg.content];\n const lastPart = content[content.length - 1];\n content[content.length - 1] = {\n ...lastPart,\n providerOptions: {\n ...lastPart.providerOptions,\n anthropic: { ...lastPart.providerOptions?.anthropic, cacheControl },\n },\n };\n return { ...msg, content };\n }\n\n return msg;\n };\n\n // Find the last system message index\n let lastSystemIdx = -1;\n for (let i = prompt.length - 1; i >= 0; i--) {\n if ((prompt[i] as any).role === 'system') {\n lastSystemIdx = i;\n break;\n }\n }\n\n // Add cache breakpoint to last system message\n if (lastSystemIdx >= 0) {\n prompt[lastSystemIdx] = addCacheToMessage(prompt[lastSystemIdx]);\n }\n\n // Add cache breakpoint to the most recent message (last in array)\n const lastIdx = prompt.length - 1;\n if (lastIdx >= 0 && lastIdx !== lastSystemIdx) {\n prompt[lastIdx] = addCacheToMessage(prompt[lastIdx]);\n }\n\n return { ...params, prompt };\n },\n};\n\n/**\n * Build a fetch function that handles Anthropic OAuth.\n * Preserves non-auth headers from init (critical for gateway auth header to survive\n * when used with the gateway). Strips `authorization` and `x-api-key`.\n */\nexport function buildAnthropicOAuthFetch(opts: { authStorage?: AuthStorage } = {}): typeof fetch {\n return (async (url: string | URL | Request, init?: Parameters<typeof fetch>[1]) => {\n const storage = opts.authStorage ?? getAuthStorage();\n storage.reload();\n\n const storedCred = storage.get('anthropic');\n if (storedCred?.type === 'api_key') {\n throw new Error('Anthropic API key credential is configured, but OAuth is required.');\n }\n\n const accessToken = await storage.getApiKey('anthropic');\n if (!accessToken) {\n throw new Error('Not logged in to Anthropic. Run /login first.');\n }\n\n // Preserve existing headers, strip auth-related ones\n const headers = new Headers();\n if (init?.headers) {\n const source =\n init.headers instanceof Headers\n ? init.headers\n : Array.isArray(init.headers)\n ? new Headers(init.headers as Array<[string, string]>)\n : new Headers(init.headers as Record<string, string>);\n source.forEach((value, key) => {\n const lower = key.toLowerCase();\n if (lower !== 'authorization' && lower !== 'x-api-key') {\n headers.set(key, value);\n }\n });\n }\n\n headers.set('Authorization', `Bearer ${accessToken}`);\n const requestBetas = (headers.get('anthropic-beta') ?? '')\n .split(',')\n .map(beta => beta.trim())\n .filter(Boolean);\n headers.set('anthropic-beta', Array.from(new Set([...OAUTH_REQUIRED_BETAS, ...requestBetas])).join(','));\n headers.set('anthropic-version', '2023-06-01');\n\n try {\n return await fetch(url, { ...init, headers });\n } catch (error) {\n if (error && typeof error === 'object') {\n Object.assign(error as Record<string, unknown>, {\n requestUrl: url instanceof URL ? url.toString() : typeof url === 'string' ? url : url.url,\n });\n }\n throw error;\n }\n }) as typeof fetch;\n}\n\n/**\n * Creates an Anthropic model using Claude Max OAuth authentication\n * Uses OAuth tokens from AuthStorage (auto-refreshes when needed)\n */\nexport function opencodeClaudeMaxProvider(\n modelId: string = 'claude-sonnet-4-20250514',\n options?: { headers?: Record<string, string> },\n): MastraModelConfig {\n const headers = options?.headers;\n\n // Test environment: use API key\n if (process.env.NODE_ENV === 'test' || process.env.VITEST) {\n const anthropic = createAnthropic({\n apiKey: 'test-api-key',\n headers,\n });\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [claudeCodeMiddleware, promptCacheMiddleware],\n });\n }\n\n const anthropic = createAnthropic({\n apiKey: 'oauth-placeholder',\n headers,\n fetch: buildAnthropicOAuthFetch() as any,\n });\n\n // Wrap with middleware to inject Claude Code identity and enable prompt caching\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [claudeCodeMiddleware, promptCacheMiddleware],\n });\n}\n"],"mappings":"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","names":["anthropic"]}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * GitHub Copilot OAuth Provider
3
+ *
4
+ * Uses OAuth tokens from AuthStorage to authenticate with GitHub Copilot's chat API.
5
+ * The Copilot API speaks an OpenAI-compatible chat format, so we plug
6
+ * `@ai-sdk/openai-compatible` into Copilot's API URL and use a custom fetch to inject
7
+ * the bearer token and Copilot-specific headers.
8
+ *
9
+ * Inspired by:
10
+ * - opencode: https://github.com/anomalyco/opencode/blob/dev/packages/opencode/src/plugin/github-copilot/copilot.ts
11
+ * - pi-mono: https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/utils/oauth/github-copilot.ts
12
+ */
13
+ import type { MastraModelConfig } from '@mastra/core/llm';
14
+ import type { CopilotModelEntry } from '../auth/providers/github-copilot.js';
15
+ import { AuthStorage } from '../auth/storage.js';
16
+ /** Get or create the shared AuthStorage instance. */
17
+ export declare function getAuthStorage(): AuthStorage;
18
+ /** Set a custom AuthStorage instance (useful for tests / TUI integration). */
19
+ export declare function setAuthStorage(storage: AuthStorage | undefined): void;
20
+ /**
21
+ * Build a fetch wrapper that authenticates with GitHub Copilot OAuth.
22
+ *
23
+ * - Injects the short-lived Copilot bearer token (auto-refreshed by AuthStorage).
24
+ * - Adds the VS Code-like Copilot headers required by the API.
25
+ * - Rewrites the request URL onto the per-token API base when `rewriteUrl` is true.
26
+ */
27
+ export declare function buildGitHubCopilotOAuthFetch(opts?: {
28
+ authStorage?: AuthStorage;
29
+ rewriteUrl?: boolean;
30
+ }): typeof fetch;
31
+ /**
32
+ * Creates a model that talks to GitHub Copilot using OAuth credentials.
33
+ *
34
+ * Copilot's `/chat/completions` endpoint is OpenAI-compatible, but GitHub Copilot
35
+ * is not OpenAI. Use the generic OpenAI-compatible adapter with Copilot's base URL
36
+ * instead of the OpenAI provider plus URL rewriting.
37
+ */
38
+ export declare function githubCopilotProvider(modelId?: string, options?: {
39
+ headers?: Record<string, string>;
40
+ }): MastraModelConfig;
41
+ /** Reset the in-process Copilot catalog cache (test seam, also useful after logout). */
42
+ export declare function clearCopilotCatalogCache(): void;
43
+ /**
44
+ * Return the user's currently-available Copilot models.
45
+ *
46
+ * - Returns `[]` when the user is not logged in to GitHub Copilot.
47
+ * - Returns the cached list when a recent fetch succeeded.
48
+ * - On the cache-miss / expired path, fetches `/models` with a 5s timeout, filters
49
+ * to picker-enabled and non-policy-disabled models, then caches for 10 minutes.
50
+ * - On fetch failure, returns a small hard-coded fallback (so packs still work
51
+ * offline) and caches that for 1 minute to avoid hammering the API.
52
+ *
53
+ * Concurrent calls during a fetch share the inflight promise.
54
+ */
55
+ export declare function getCopilotModelCatalog(opts?: {
56
+ authStorage?: AuthStorage;
57
+ }): Promise<CopilotModelEntry[]>;
58
+ //# sourceMappingURL=github-copilot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-copilot.d.ts","sourceRoot":"","sources":["../../src/providers/github-copilot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAM1D,OAAO,KAAK,EAAE,iBAAiB,EAA4B,MAAM,qCAAqC,CAAC;AACvG,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAOjD,qDAAqD;AACrD,wBAAgB,cAAc,IAAI,WAAW,CAK5C;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAErE;AAqED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,WAAW,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7D,OAAO,KAAK,CAgFd;AAwED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,MAAkB,EAC3B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC7C,iBAAiB,CAiBnB;AAsCD,wFAAwF;AACxF,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyDnH"}
@@ -0,0 +1,263 @@
1
+ import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
2
+ import { applyCompatLayer, GoogleSchemaCompatLayer } from "@mastra/schema-compat";
3
+ import { wrapLanguageModel } from "ai";
4
+ import { COPILOT_HEADERS, fetchCopilotModels, getGitHubCopilotBaseUrl } from "../auth/providers/github-copilot.js";
5
+ import { AuthStorage } from "../auth/storage.js";
6
+ const COPILOT_PROVIDER_ID = "github-copilot";
7
+ let authStorageInstance = null;
8
+ function getAuthStorage() {
9
+ if (!authStorageInstance) {
10
+ authStorageInstance = new AuthStorage();
11
+ }
12
+ return authStorageInstance;
13
+ }
14
+ function setAuthStorage(storage) {
15
+ authStorageInstance = storage ?? null;
16
+ }
17
+ function detectIsAgent(body) {
18
+ if (!body || typeof body !== "object") return false;
19
+ const obj = body;
20
+ const messages = obj.messages;
21
+ if (Array.isArray(messages) && messages.length > 0) {
22
+ const last = messages[messages.length - 1];
23
+ if (last?.role && last.role !== "user") return true;
24
+ if (Array.isArray(last?.content)) {
25
+ const hasToolResult = last.content.some(
26
+ (part) => part && typeof part === "object" && part.type === "tool_result"
27
+ );
28
+ if (hasToolResult) return true;
29
+ }
30
+ }
31
+ const input = obj.input;
32
+ if (Array.isArray(input) && input.length > 0) {
33
+ const last = input[input.length - 1];
34
+ if (last?.role && last.role !== "user") return true;
35
+ }
36
+ return false;
37
+ }
38
+ function detectIsVision(body) {
39
+ if (!body || typeof body !== "object") return false;
40
+ const obj = body;
41
+ const matchPart = (part) => {
42
+ if (!part || typeof part !== "object") return false;
43
+ const t = part.type;
44
+ return t === "image" || t === "image_url" || t === "input_image";
45
+ };
46
+ const messages = obj.messages;
47
+ if (Array.isArray(messages)) {
48
+ return messages.some(
49
+ (msg) => msg && typeof msg === "object" && Array.isArray(msg.content) && msg.content.some(matchPart)
50
+ );
51
+ }
52
+ const input = obj.input;
53
+ if (Array.isArray(input)) {
54
+ return input.some(
55
+ (item) => item && typeof item === "object" && Array.isArray(item.content) && item.content.some(matchPart)
56
+ );
57
+ }
58
+ return false;
59
+ }
60
+ function buildGitHubCopilotOAuthFetch(opts = {}) {
61
+ return (async (url, init) => {
62
+ const storage = opts.authStorage ?? getAuthStorage();
63
+ storage.reload();
64
+ const cred = storage.get(COPILOT_PROVIDER_ID);
65
+ if (!cred || cred.type !== "oauth") {
66
+ throw new Error("Not logged in to GitHub Copilot. Run /login first.");
67
+ }
68
+ const accessToken = await storage.getApiKey(COPILOT_PROVIDER_ID);
69
+ if (!accessToken) {
70
+ throw new Error("Failed to refresh GitHub Copilot token. Please /login again.");
71
+ }
72
+ storage.reload();
73
+ const enterpriseUrl = cred.enterpriseUrl;
74
+ let parsedBody;
75
+ if (typeof init?.body === "string") {
76
+ try {
77
+ parsedBody = JSON.parse(init.body);
78
+ } catch {
79
+ parsedBody = void 0;
80
+ }
81
+ }
82
+ const isAgent = detectIsAgent(parsedBody);
83
+ const isVision = detectIsVision(parsedBody);
84
+ const headers = new Headers();
85
+ if (init?.headers) {
86
+ const source = init.headers instanceof Headers ? init.headers : Array.isArray(init.headers) ? new Headers(init.headers) : new Headers(init.headers);
87
+ source.forEach((value, key) => {
88
+ const lower = key.toLowerCase();
89
+ if (lower !== "authorization" && lower !== "x-api-key") {
90
+ headers.set(key, value);
91
+ }
92
+ });
93
+ }
94
+ headers.set("Authorization", `Bearer ${accessToken}`);
95
+ headers.set("x-initiator", isAgent ? "agent" : "user");
96
+ headers.set("Openai-Intent", "conversation-edits");
97
+ if (isVision) {
98
+ headers.set("Copilot-Vision-Request", "true");
99
+ }
100
+ for (const [key, value] of Object.entries(COPILOT_HEADERS)) {
101
+ if (!headers.has(key)) {
102
+ headers.set(key, value);
103
+ }
104
+ }
105
+ const finalUrl = opts.rewriteUrl !== false ? rewriteToCopilotBase(url, accessToken, enterpriseUrl) : url instanceof URL ? url : typeof url === "string" ? new URL(url) : new URL(url.url);
106
+ try {
107
+ return await fetch(finalUrl, { ...init, headers });
108
+ } catch (error) {
109
+ if (error && typeof error === "object") {
110
+ Object.assign(error, {
111
+ requestUrl: finalUrl.toString()
112
+ });
113
+ }
114
+ throw error;
115
+ }
116
+ });
117
+ }
118
+ function rewriteToCopilotBase(url, token, enterpriseDomain) {
119
+ const original = url instanceof URL ? url : new URL(typeof url === "string" ? url : url.url);
120
+ const base = new URL(getGitHubCopilotBaseUrl(token, enterpriseDomain));
121
+ const pathname = original.pathname.replace(/^\/v1(\/|$)/, "/");
122
+ return new URL(`${pathname}${original.search}`, base);
123
+ }
124
+ function isGeminiModel(modelId) {
125
+ return modelId.startsWith("gemini-");
126
+ }
127
+ function applyGeminiSchemaCompatToTools(modelId, tools) {
128
+ if (!Array.isArray(tools)) {
129
+ return tools;
130
+ }
131
+ const compatLayer = new GoogleSchemaCompatLayer({
132
+ provider: COPILOT_PROVIDER_ID,
133
+ modelId,
134
+ supportsStructuredOutputs: false
135
+ });
136
+ return tools.map((tool) => {
137
+ if (!tool || typeof tool !== "object" || tool.type !== "function") {
138
+ return tool;
139
+ }
140
+ const functionTool = tool;
141
+ if (!functionTool.inputSchema) {
142
+ return tool;
143
+ }
144
+ return {
145
+ ...functionTool,
146
+ inputSchema: applyCompatLayer({
147
+ schema: functionTool.inputSchema,
148
+ compatLayers: [compatLayer],
149
+ mode: "aiSdkSchema"
150
+ }).jsonSchema
151
+ };
152
+ });
153
+ }
154
+ function createCopilotMiddleware(modelId) {
155
+ return {
156
+ specificationVersion: "v3",
157
+ transformParams: async ({ params }) => {
158
+ if (params.temperature !== void 0 && params.temperature !== null) {
159
+ delete params.topP;
160
+ }
161
+ if (isGeminiModel(modelId)) {
162
+ params.tools = applyGeminiSchemaCompatToTools(
163
+ modelId,
164
+ params.tools
165
+ );
166
+ }
167
+ return params;
168
+ }
169
+ };
170
+ }
171
+ function githubCopilotProvider(modelId = "gpt-4.1", options) {
172
+ const headers = options?.headers;
173
+ const copilot = createOpenAICompatible({
174
+ name: COPILOT_PROVIDER_ID,
175
+ baseURL: "https://api.githubcopilot.com",
176
+ apiKey: process.env.NODE_ENV === "test" || process.env.VITEST ? "test-api-key" : "oauth-placeholder",
177
+ headers,
178
+ fetch: process.env.NODE_ENV === "test" || process.env.VITEST ? void 0 : buildGitHubCopilotOAuthFetch({ rewriteUrl: false })
179
+ });
180
+ return wrapLanguageModel({
181
+ model: copilot.chatModel(modelId),
182
+ middleware: [createCopilotMiddleware(modelId)]
183
+ });
184
+ }
185
+ const COPILOT_FALLBACK_MODELS = [
186
+ {
187
+ id: "gpt-4.1",
188
+ name: "GPT-4.1",
189
+ vendor: "OpenAI",
190
+ supportedEndpoints: ["/chat/completions"],
191
+ isAnthropicShaped: false,
192
+ supportsVision: true,
193
+ supportsToolCalls: true
194
+ }
195
+ ];
196
+ const CATALOG_TTL_MS = 10 * 60 * 1e3;
197
+ const CATALOG_FAILURE_TTL_MS = 60 * 1e3;
198
+ const CATALOG_FETCH_TIMEOUT_MS = 5e3;
199
+ let catalogCache = null;
200
+ let inflightFetch = null;
201
+ function clearCopilotCatalogCache() {
202
+ catalogCache = null;
203
+ inflightFetch = null;
204
+ }
205
+ async function getCopilotModelCatalog(opts = {}) {
206
+ const storage = opts.authStorage ?? getAuthStorage();
207
+ storage.reload();
208
+ const cred = storage.get(COPILOT_PROVIDER_ID);
209
+ if (!cred || cred.type !== "oauth") {
210
+ return [];
211
+ }
212
+ const now = Date.now();
213
+ if (catalogCache && now - catalogCache.fetchedAt < catalogCache.ttl) {
214
+ return catalogCache.models;
215
+ }
216
+ if (inflightFetch) return inflightFetch;
217
+ inflightFetch = (async () => {
218
+ try {
219
+ const accessToken = await storage.getApiKey(COPILOT_PROVIDER_ID);
220
+ if (!accessToken) throw new Error("No Copilot bearer token");
221
+ storage.reload();
222
+ const refreshed = storage.get(COPILOT_PROVIDER_ID);
223
+ const enterpriseUrl = refreshed?.enterpriseUrl;
224
+ const baseUrl = getGitHubCopilotBaseUrl(accessToken, enterpriseUrl);
225
+ const controller = new AbortController();
226
+ const timer = setTimeout(() => controller.abort(), CATALOG_FETCH_TIMEOUT_MS);
227
+ try {
228
+ const models = await fetchCopilotModels({
229
+ baseUrl,
230
+ bearerToken: accessToken,
231
+ signal: controller.signal
232
+ });
233
+ catalogCache = { fetchedAt: Date.now(), ttl: CATALOG_TTL_MS, models };
234
+ return models;
235
+ } finally {
236
+ clearTimeout(timer);
237
+ }
238
+ } catch (error) {
239
+ catalogCache = {
240
+ fetchedAt: Date.now(),
241
+ ttl: CATALOG_FAILURE_TTL_MS,
242
+ models: COPILOT_FALLBACK_MODELS
243
+ };
244
+ console.warn(
245
+ "Failed to fetch live GitHub Copilot models, using fallback list:",
246
+ error instanceof Error ? error.message : error
247
+ );
248
+ return COPILOT_FALLBACK_MODELS;
249
+ } finally {
250
+ inflightFetch = null;
251
+ }
252
+ })();
253
+ return inflightFetch;
254
+ }
255
+ export {
256
+ buildGitHubCopilotOAuthFetch,
257
+ clearCopilotCatalogCache,
258
+ getAuthStorage,
259
+ getCopilotModelCatalog,
260
+ githubCopilotProvider,
261
+ setAuthStorage
262
+ };
263
+ //# sourceMappingURL=github-copilot.js.map