@mastra/code-sdk 0.0.0-esbuild-bundle-worker-20260807173433

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 (491) hide show
  1. package/CHANGELOG.md +1349 -0
  2. package/LICENSE.md +30 -0
  3. package/README.md +70 -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 +161 -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 +214 -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 +65 -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 +35 -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 +2 -0
  23. package/dist/agents/credential-resolver.d.ts +51 -0
  24. package/dist/agents/credential-resolver.d.ts.map +1 -0
  25. package/dist/agents/credential-resolver.js +52 -0
  26. package/dist/agents/credential-resolver.js.map +1 -0
  27. package/dist/agents/custom-provider-source.d.ts +35 -0
  28. package/dist/agents/custom-provider-source.d.ts.map +1 -0
  29. package/dist/agents/custom-provider-source.js +25 -0
  30. package/dist/agents/custom-provider-source.js.map +1 -0
  31. package/dist/agents/instructions.d.ts +6 -0
  32. package/dist/agents/instructions.d.ts.map +1 -0
  33. package/dist/agents/instructions.js +32 -0
  34. package/dist/agents/instructions.js.map +1 -0
  35. package/dist/agents/mastracode-gateway.d.ts +74 -0
  36. package/dist/agents/mastracode-gateway.d.ts.map +1 -0
  37. package/dist/agents/mastracode-gateway.js +400 -0
  38. package/dist/agents/mastracode-gateway.js.map +1 -0
  39. package/dist/agents/memory.d.ts +13 -0
  40. package/dist/agents/memory.d.ts.map +1 -0
  41. package/dist/agents/memory.js +116 -0
  42. package/dist/agents/memory.js.map +1 -0
  43. package/dist/agents/model.d.ts +59 -0
  44. package/dist/agents/model.d.ts.map +1 -0
  45. package/dist/agents/model.js +132 -0
  46. package/dist/agents/model.js.map +1 -0
  47. package/dist/agents/modes/build.d.ts +10 -0
  48. package/dist/agents/modes/build.d.ts.map +1 -0
  49. package/dist/agents/modes/build.js +44 -0
  50. package/dist/agents/modes/build.js.map +1 -0
  51. package/dist/agents/modes/explore.d.ts +10 -0
  52. package/dist/agents/modes/explore.d.ts.map +1 -0
  53. package/dist/agents/modes/explore.js +39 -0
  54. package/dist/agents/modes/explore.js.map +1 -0
  55. package/dist/agents/modes/plan.d.ts +6 -0
  56. package/dist/agents/modes/plan.d.ts.map +1 -0
  57. package/dist/agents/modes/plan.js +37 -0
  58. package/dist/agents/modes/plan.js.map +1 -0
  59. package/dist/agents/prompts/agent-instructions.d.ts +61 -0
  60. package/dist/agents/prompts/agent-instructions.d.ts.map +1 -0
  61. package/dist/agents/prompts/agent-instructions.js +201 -0
  62. package/dist/agents/prompts/agent-instructions.js.map +1 -0
  63. package/dist/agents/prompts/build.d.ts +12 -0
  64. package/dist/agents/prompts/build.d.ts.map +1 -0
  65. package/dist/agents/prompts/build.js +76 -0
  66. package/dist/agents/prompts/build.js.map +1 -0
  67. package/dist/agents/prompts/fast.d.ts +5 -0
  68. package/dist/agents/prompts/fast.d.ts.map +1 -0
  69. package/dist/agents/prompts/fast.js +26 -0
  70. package/dist/agents/prompts/fast.js.map +1 -0
  71. package/dist/agents/prompts/index.d.ts +19 -0
  72. package/dist/agents/prompts/index.d.ts.map +1 -0
  73. package/dist/agents/prompts/index.js +65 -0
  74. package/dist/agents/prompts/index.js.map +1 -0
  75. package/dist/agents/prompts/model.d.ts +5 -0
  76. package/dist/agents/prompts/model.d.ts.map +1 -0
  77. package/dist/agents/prompts/model.js +23 -0
  78. package/dist/agents/prompts/model.js.map +1 -0
  79. package/dist/agents/prompts/plan.d.ts +6 -0
  80. package/dist/agents/prompts/plan.d.ts.map +1 -0
  81. package/dist/agents/prompts/plan.js +111 -0
  82. package/dist/agents/prompts/plan.js.map +1 -0
  83. package/dist/agents/prompts/tool-guidance.d.ts +13 -0
  84. package/dist/agents/prompts/tool-guidance.d.ts.map +1 -0
  85. package/dist/agents/prompts/tool-guidance.js +149 -0
  86. package/dist/agents/prompts/tool-guidance.js.map +1 -0
  87. package/dist/agents/sandbox-filesystem.d.ts +99 -0
  88. package/dist/agents/sandbox-filesystem.d.ts.map +1 -0
  89. package/dist/agents/sandbox-filesystem.js +328 -0
  90. package/dist/agents/sandbox-filesystem.js.map +1 -0
  91. package/dist/agents/sandbox-reattach.d.ts +19 -0
  92. package/dist/agents/sandbox-reattach.d.ts.map +1 -0
  93. package/dist/agents/sandbox-reattach.js +15 -0
  94. package/dist/agents/sandbox-reattach.js.map +1 -0
  95. package/dist/agents/thread-caveman-state.d.ts +17 -0
  96. package/dist/agents/thread-caveman-state.d.ts.map +1 -0
  97. package/dist/agents/thread-caveman-state.js +107 -0
  98. package/dist/agents/thread-caveman-state.js.map +1 -0
  99. package/dist/agents/tool-availability.d.ts +10 -0
  100. package/dist/agents/tool-availability.d.ts.map +1 -0
  101. package/dist/agents/tool-availability.js +87 -0
  102. package/dist/agents/tool-availability.js.map +1 -0
  103. package/dist/agents/tools.d.ts +19 -0
  104. package/dist/agents/tools.d.ts.map +1 -0
  105. package/dist/agents/tools.js +105 -0
  106. package/dist/agents/tools.js.map +1 -0
  107. package/dist/agents/workspace.d.ts +32 -0
  108. package/dist/agents/workspace.d.ts.map +1 -0
  109. package/dist/agents/workspace.js +251 -0
  110. package/dist/agents/workspace.js.map +1 -0
  111. package/dist/analytics.d.ts +18 -0
  112. package/dist/analytics.d.ts.map +1 -0
  113. package/dist/analytics.js +163 -0
  114. package/dist/analytics.js.map +1 -0
  115. package/dist/auth/authorization-input.d.ts +16 -0
  116. package/dist/auth/authorization-input.d.ts.map +1 -0
  117. package/dist/auth/authorization-input.js +42 -0
  118. package/dist/auth/authorization-input.js.map +1 -0
  119. package/dist/auth/device-code.d.ts +93 -0
  120. package/dist/auth/device-code.d.ts.map +1 -0
  121. package/dist/auth/device-code.js +129 -0
  122. package/dist/auth/device-code.js.map +1 -0
  123. package/dist/auth/index.d.ts +10 -0
  124. package/dist/auth/index.d.ts.map +1 -0
  125. package/dist/auth/index.js +6 -0
  126. package/dist/auth/pkce.d.ts +13 -0
  127. package/dist/auth/pkce.d.ts.map +1 -0
  128. package/dist/auth/pkce.js +32 -0
  129. package/dist/auth/pkce.js.map +1 -0
  130. package/dist/auth/providers/anthropic.d.ts +40 -0
  131. package/dist/auth/providers/anthropic.d.ts.map +1 -0
  132. package/dist/auth/providers/anthropic.js +126 -0
  133. package/dist/auth/providers/anthropic.js.map +1 -0
  134. package/dist/auth/providers/github-copilot.d.ts +154 -0
  135. package/dist/auth/providers/github-copilot.d.ts.map +1 -0
  136. package/dist/auth/providers/github-copilot.js +340 -0
  137. package/dist/auth/providers/github-copilot.js.map +1 -0
  138. package/dist/auth/providers/openai-codex.d.ts +139 -0
  139. package/dist/auth/providers/openai-codex.d.ts.map +1 -0
  140. package/dist/auth/providers/openai-codex.js +519 -0
  141. package/dist/auth/providers/openai-codex.js.map +1 -0
  142. package/dist/auth/providers/xai.d.ts +64 -0
  143. package/dist/auth/providers/xai.d.ts.map +1 -0
  144. package/dist/auth/providers/xai.js +205 -0
  145. package/dist/auth/providers/xai.js.map +1 -0
  146. package/dist/auth/storage.d.ts +91 -0
  147. package/dist/auth/storage.d.ts.map +1 -0
  148. package/dist/auth/storage.js +197 -0
  149. package/dist/auth/storage.js.map +1 -0
  150. package/dist/auth/types.d.ts +89 -0
  151. package/dist/auth/types.d.ts.map +1 -0
  152. package/dist/auth/types.js +1 -0
  153. package/dist/clipboard/index.d.ts +26 -0
  154. package/dist/clipboard/index.d.ts.map +1 -0
  155. package/dist/clipboard/index.js +226 -0
  156. package/dist/clipboard/index.js.map +1 -0
  157. package/dist/constants.d.ts +10 -0
  158. package/dist/constants.d.ts.map +1 -0
  159. package/dist/constants.js +18 -0
  160. package/dist/constants.js.map +1 -0
  161. package/dist/error-classification.d.ts +10 -0
  162. package/dist/error-classification.d.ts.map +1 -0
  163. package/dist/error-classification.js +22 -0
  164. package/dist/error-classification.js.map +1 -0
  165. package/dist/evals/context-builder.d.ts +41 -0
  166. package/dist/evals/context-builder.d.ts.map +1 -0
  167. package/dist/evals/context-builder.js +161 -0
  168. package/dist/evals/context-builder.js.map +1 -0
  169. package/dist/evals/index.d.ts +4 -0
  170. package/dist/evals/index.d.ts.map +1 -0
  171. package/dist/evals/index.js +5 -0
  172. package/dist/evals/scorers/classify-command.d.ts +31 -0
  173. package/dist/evals/scorers/classify-command.d.ts.map +1 -0
  174. package/dist/evals/scorers/classify-command.js +73 -0
  175. package/dist/evals/scorers/classify-command.js.map +1 -0
  176. package/dist/evals/scorers/efficiency.d.ts +44 -0
  177. package/dist/evals/scorers/efficiency.d.ts.map +1 -0
  178. package/dist/evals/scorers/efficiency.js +259 -0
  179. package/dist/evals/scorers/efficiency.js.map +1 -0
  180. package/dist/evals/scorers/extract-tools.d.ts +25 -0
  181. package/dist/evals/scorers/extract-tools.d.ts.map +1 -0
  182. package/dist/evals/scorers/extract-tools.js +60 -0
  183. package/dist/evals/scorers/extract-tools.js.map +1 -0
  184. package/dist/evals/scorers/index.d.ts +3 -0
  185. package/dist/evals/scorers/index.d.ts.map +1 -0
  186. package/dist/evals/scorers/index.js +3 -0
  187. package/dist/evals/scorers/outcome.d.ts +49 -0
  188. package/dist/evals/scorers/outcome.d.ts.map +1 -0
  189. package/dist/evals/scorers/outcome.js +347 -0
  190. package/dist/evals/scorers/outcome.js.map +1 -0
  191. package/dist/goal-manager.d.ts +78 -0
  192. package/dist/goal-manager.d.ts.map +1 -0
  193. package/dist/goal-manager.js +273 -0
  194. package/dist/goal-manager.js.map +1 -0
  195. package/dist/goal-signal.d.ts +14 -0
  196. package/dist/goal-signal.d.ts.map +1 -0
  197. package/dist/goal-signal.js +17 -0
  198. package/dist/goal-signal.js.map +1 -0
  199. package/dist/headless/cli.d.ts +42 -0
  200. package/dist/headless/cli.d.ts.map +1 -0
  201. package/dist/headless/cli.js +195 -0
  202. package/dist/headless/cli.js.map +1 -0
  203. package/dist/headless/flags.d.ts +33 -0
  204. package/dist/headless/flags.d.ts.map +1 -0
  205. package/dist/headless/flags.js +190 -0
  206. package/dist/headless/flags.js.map +1 -0
  207. package/dist/headless/format.d.ts +38 -0
  208. package/dist/headless/format.d.ts.map +1 -0
  209. package/dist/headless/format.js +89 -0
  210. package/dist/headless/format.js.map +1 -0
  211. package/dist/headless/index.d.ts +25 -0
  212. package/dist/headless/index.d.ts.map +1 -0
  213. package/dist/headless/index.js +6 -0
  214. package/dist/headless/policy.d.ts +17 -0
  215. package/dist/headless/policy.d.ts.map +1 -0
  216. package/dist/headless/policy.js +42 -0
  217. package/dist/headless/policy.js.map +1 -0
  218. package/dist/headless/run-mc.d.ts +7 -0
  219. package/dist/headless/run-mc.d.ts.map +1 -0
  220. package/dist/headless/run-mc.js +346 -0
  221. package/dist/headless/run-mc.js.map +1 -0
  222. package/dist/headless/types.d.ts +158 -0
  223. package/dist/headless/types.d.ts.map +1 -0
  224. package/dist/headless/types.js +18 -0
  225. package/dist/headless/types.js.map +1 -0
  226. package/dist/hooks/config.d.ts +11 -0
  227. package/dist/hooks/config.d.ts.map +1 -0
  228. package/dist/hooks/config.js +73 -0
  229. package/dist/hooks/config.js.map +1 -0
  230. package/dist/hooks/executor.d.ts +13 -0
  231. package/dist/hooks/executor.d.ts.map +1 -0
  232. package/dist/hooks/executor.js +128 -0
  233. package/dist/hooks/executor.js.map +1 -0
  234. package/dist/hooks/index.d.ts +6 -0
  235. package/dist/hooks/index.d.ts.map +1 -0
  236. package/dist/hooks/index.js +5 -0
  237. package/dist/hooks/manager.d.ts +47 -0
  238. package/dist/hooks/manager.d.ts.map +1 -0
  239. package/dist/hooks/manager.js +225 -0
  240. package/dist/hooks/manager.js.map +1 -0
  241. package/dist/hooks/types.d.ts +152 -0
  242. package/dist/hooks/types.d.ts.map +1 -0
  243. package/dist/hooks/types.js +8 -0
  244. package/dist/hooks/types.js.map +1 -0
  245. package/dist/index.d.ts +258 -0
  246. package/dist/index.d.ts.map +1 -0
  247. package/dist/index.js +740 -0
  248. package/dist/index.js.map +1 -0
  249. package/dist/ipc/ipc-reporter.d.ts +14 -0
  250. package/dist/ipc/ipc-reporter.d.ts.map +1 -0
  251. package/dist/ipc/ipc-reporter.js +21 -0
  252. package/dist/ipc/ipc-reporter.js.map +1 -0
  253. package/dist/lsp/client.d.ts +56 -0
  254. package/dist/lsp/client.d.ts.map +1 -0
  255. package/dist/lsp/client.js +251 -0
  256. package/dist/lsp/client.js.map +1 -0
  257. package/dist/lsp/index.d.ts +4 -0
  258. package/dist/lsp/index.d.ts.map +1 -0
  259. package/dist/lsp/index.js +4 -0
  260. package/dist/lsp/language.d.ts +9 -0
  261. package/dist/lsp/language.d.ts.map +1 -0
  262. package/dist/lsp/language.js +44 -0
  263. package/dist/lsp/language.js.map +1 -0
  264. package/dist/lsp/manager.d.ts +34 -0
  265. package/dist/lsp/manager.d.ts.map +1 -0
  266. package/dist/lsp/manager.js +82 -0
  267. package/dist/lsp/manager.js.map +1 -0
  268. package/dist/lsp/server.d.ts +27 -0
  269. package/dist/lsp/server.d.ts.map +1 -0
  270. package/dist/lsp/server.js +159 -0
  271. package/dist/lsp/server.js.map +1 -0
  272. package/dist/lsp/workspace.d.ts +9 -0
  273. package/dist/lsp/workspace.d.ts.map +1 -0
  274. package/dist/lsp/workspace.js +55 -0
  275. package/dist/lsp/workspace.js.map +1 -0
  276. package/dist/mcp/config.d.ts +54 -0
  277. package/dist/mcp/config.d.ts.map +1 -0
  278. package/dist/mcp/config.js +240 -0
  279. package/dist/mcp/config.js.map +1 -0
  280. package/dist/mcp/index.d.ts +5 -0
  281. package/dist/mcp/index.d.ts.map +1 -0
  282. package/dist/mcp/index.js +3 -0
  283. package/dist/mcp/manager.d.ts +98 -0
  284. package/dist/mcp/manager.d.ts.map +1 -0
  285. package/dist/mcp/manager.js +612 -0
  286. package/dist/mcp/manager.js.map +1 -0
  287. package/dist/mcp/state.d.ts +33 -0
  288. package/dist/mcp/state.d.ts.map +1 -0
  289. package/dist/mcp/state.js +88 -0
  290. package/dist/mcp/state.js.map +1 -0
  291. package/dist/mcp/types.d.ts +120 -0
  292. package/dist/mcp/types.d.ts.map +1 -0
  293. package/dist/mcp/types.js +1 -0
  294. package/dist/onboarding/custom-packs.d.ts +7 -0
  295. package/dist/onboarding/custom-packs.d.ts.map +1 -0
  296. package/dist/onboarding/custom-packs.js +17 -0
  297. package/dist/onboarding/custom-packs.js.map +1 -0
  298. package/dist/onboarding/custom-providers.d.ts +4 -0
  299. package/dist/onboarding/custom-providers.d.ts.map +1 -0
  300. package/dist/onboarding/custom-providers.js +30 -0
  301. package/dist/onboarding/custom-providers.js.map +1 -0
  302. package/dist/onboarding/index.d.ts +5 -0
  303. package/dist/onboarding/index.d.ts.map +1 -0
  304. package/dist/onboarding/index.js +3 -0
  305. package/dist/onboarding/om-settings.d.ts +25 -0
  306. package/dist/onboarding/om-settings.d.ts.map +1 -0
  307. package/dist/onboarding/om-settings.js +47 -0
  308. package/dist/onboarding/om-settings.js.map +1 -0
  309. package/dist/onboarding/packs.d.ts +46 -0
  310. package/dist/onboarding/packs.d.ts.map +1 -0
  311. package/dist/onboarding/packs.js +160 -0
  312. package/dist/onboarding/packs.js.map +1 -0
  313. package/dist/onboarding/settings.d.ts +338 -0
  314. package/dist/onboarding/settings.d.ts.map +1 -0
  315. package/dist/onboarding/settings.js +673 -0
  316. package/dist/onboarding/settings.js.map +1 -0
  317. package/dist/permissions.d.ts +55 -0
  318. package/dist/permissions.d.ts.map +1 -0
  319. package/dist/permissions.js +132 -0
  320. package/dist/permissions.js.map +1 -0
  321. package/dist/plugin.d.ts +81 -0
  322. package/dist/plugin.d.ts.map +1 -0
  323. package/dist/plugin.js +28 -0
  324. package/dist/plugin.js.map +1 -0
  325. package/dist/plugins/dependencies.d.ts +9 -0
  326. package/dist/plugins/dependencies.d.ts.map +1 -0
  327. package/dist/plugins/dependencies.js +88 -0
  328. package/dist/plugins/dependencies.js.map +1 -0
  329. package/dist/plugins/install.d.ts +21 -0
  330. package/dist/plugins/install.d.ts.map +1 -0
  331. package/dist/plugins/install.js +190 -0
  332. package/dist/plugins/install.js.map +1 -0
  333. package/dist/plugins/loader.d.ts +15 -0
  334. package/dist/plugins/loader.d.ts.map +1 -0
  335. package/dist/plugins/loader.js +206 -0
  336. package/dist/plugins/loader.js.map +1 -0
  337. package/dist/plugins/manager.d.ts +64 -0
  338. package/dist/plugins/manager.d.ts.map +1 -0
  339. package/dist/plugins/manager.js +384 -0
  340. package/dist/plugins/manager.js.map +1 -0
  341. package/dist/plugins/manifest.d.ts +14 -0
  342. package/dist/plugins/manifest.d.ts.map +1 -0
  343. package/dist/plugins/manifest.js +50 -0
  344. package/dist/plugins/manifest.js.map +1 -0
  345. package/dist/plugins/package-link.d.ts +3 -0
  346. package/dist/plugins/package-link.d.ts.map +1 -0
  347. package/dist/plugins/package-link.js +61 -0
  348. package/dist/plugins/package-link.js.map +1 -0
  349. package/dist/plugins/paths.d.ts +10 -0
  350. package/dist/plugins/paths.d.ts.map +1 -0
  351. package/dist/plugins/paths.js +25 -0
  352. package/dist/plugins/paths.js.map +1 -0
  353. package/dist/plugins/registry.d.ts +8 -0
  354. package/dist/plugins/registry.d.ts.map +1 -0
  355. package/dist/plugins/registry.js +112 -0
  356. package/dist/plugins/registry.js.map +1 -0
  357. package/dist/plugins/scaffold.d.ts +10 -0
  358. package/dist/plugins/scaffold.d.ts.map +1 -0
  359. package/dist/plugins/scaffold.js +116 -0
  360. package/dist/plugins/scaffold.js.map +1 -0
  361. package/dist/plugins/types.d.ts +45 -0
  362. package/dist/plugins/types.d.ts.map +1 -0
  363. package/dist/plugins/types.js +1 -0
  364. package/dist/processors/plan-rejection-abort.d.ts +12 -0
  365. package/dist/processors/plan-rejection-abort.d.ts.map +1 -0
  366. package/dist/processors/plan-rejection-abort.js +54 -0
  367. package/dist/processors/plan-rejection-abort.js.map +1 -0
  368. package/dist/providers/amazon-bedrock-gateway.d.ts +47 -0
  369. package/dist/providers/amazon-bedrock-gateway.d.ts.map +1 -0
  370. package/dist/providers/amazon-bedrock-gateway.js +152 -0
  371. package/dist/providers/amazon-bedrock-gateway.js.map +1 -0
  372. package/dist/providers/amazon-bedrock.d.ts +28 -0
  373. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  374. package/dist/providers/amazon-bedrock.js +83 -0
  375. package/dist/providers/amazon-bedrock.js.map +1 -0
  376. package/dist/providers/claude-max.d.ts +52 -0
  377. package/dist/providers/claude-max.d.ts.map +1 -0
  378. package/dist/providers/claude-max.js +171 -0
  379. package/dist/providers/claude-max.js.map +1 -0
  380. package/dist/providers/github-copilot.d.ts +60 -0
  381. package/dist/providers/github-copilot.d.ts.map +1 -0
  382. package/dist/providers/github-copilot.js +265 -0
  383. package/dist/providers/github-copilot.js.map +1 -0
  384. package/dist/providers/openai-codex.d.ts +72 -0
  385. package/dist/providers/openai-codex.d.ts.map +1 -0
  386. package/dist/providers/openai-codex.js +302 -0
  387. package/dist/providers/openai-codex.js.map +1 -0
  388. package/dist/providers/xai.d.ts +33 -0
  389. package/dist/providers/xai.d.ts.map +1 -0
  390. package/dist/providers/xai.js +70 -0
  391. package/dist/providers/xai.js.map +1 -0
  392. package/dist/schema.d.ts +192 -0
  393. package/dist/schema.d.ts.map +1 -0
  394. package/dist/schema.js +98 -0
  395. package/dist/schema.js.map +1 -0
  396. package/dist/theme-palette.d.ts +17 -0
  397. package/dist/theme-palette.d.ts.map +1 -0
  398. package/dist/theme-palette.js +21 -0
  399. package/dist/theme-palette.js.map +1 -0
  400. package/dist/tool-names.d.ts +73 -0
  401. package/dist/tool-names.d.ts.map +1 -0
  402. package/dist/tool-names.js +52 -0
  403. package/dist/tool-names.js.map +1 -0
  404. package/dist/tools/index.d.ts +6 -0
  405. package/dist/tools/index.d.ts.map +1 -0
  406. package/dist/tools/index.js +3 -0
  407. package/dist/tools/request-sandbox-access.d.ts +6 -0
  408. package/dist/tools/request-sandbox-access.d.ts.map +1 -0
  409. package/dist/tools/request-sandbox-access.js +79 -0
  410. package/dist/tools/request-sandbox-access.js.map +1 -0
  411. package/dist/tools/utils.d.ts +20 -0
  412. package/dist/tools/utils.d.ts.map +1 -0
  413. package/dist/tools/utils.js +32 -0
  414. package/dist/tools/utils.js.map +1 -0
  415. package/dist/tools/web-search.d.ts +35 -0
  416. package/dist/tools/web-search.d.ts.map +1 -0
  417. package/dist/tools/web-search.js +61 -0
  418. package/dist/tools/web-search.js.map +1 -0
  419. package/dist/utils/binaries.d.ts +7 -0
  420. package/dist/utils/binaries.d.ts.map +1 -0
  421. package/dist/utils/binaries.js +78 -0
  422. package/dist/utils/binaries.js.map +1 -0
  423. package/dist/utils/debug-log.d.ts +12 -0
  424. package/dist/utils/debug-log.d.ts.map +1 -0
  425. package/dist/utils/debug-log.js +59 -0
  426. package/dist/utils/debug-log.js.map +1 -0
  427. package/dist/utils/errors.d.ts +36 -0
  428. package/dist/utils/errors.d.ts.map +1 -0
  429. package/dist/utils/errors.js +172 -0
  430. package/dist/utils/errors.js.map +1 -0
  431. package/dist/utils/gateway-sync.d.ts +26 -0
  432. package/dist/utils/gateway-sync.d.ts.map +1 -0
  433. package/dist/utils/gateway-sync.js +61 -0
  434. package/dist/utils/gateway-sync.js.map +1 -0
  435. package/dist/utils/path-security.d.ts +2 -0
  436. package/dist/utils/path-security.d.ts.map +1 -0
  437. package/dist/utils/path-security.js +10 -0
  438. package/dist/utils/path-security.js.map +1 -0
  439. package/dist/utils/plan-diff.d.ts +25 -0
  440. package/dist/utils/plan-diff.d.ts.map +1 -0
  441. package/dist/utils/plan-diff.js +62 -0
  442. package/dist/utils/plan-diff.js.map +1 -0
  443. package/dist/utils/plans.d.ts +56 -0
  444. package/dist/utils/plans.d.ts.map +1 -0
  445. package/dist/utils/plans.js +117 -0
  446. package/dist/utils/plans.js.map +1 -0
  447. package/dist/utils/project.d.ts +160 -0
  448. package/dist/utils/project.d.ts.map +1 -0
  449. package/dist/utils/project.js +364 -0
  450. package/dist/utils/project.js.map +1 -0
  451. package/dist/utils/signals-pubsub.d.ts +41 -0
  452. package/dist/utils/signals-pubsub.d.ts.map +1 -0
  453. package/dist/utils/signals-pubsub.js +122 -0
  454. package/dist/utils/signals-pubsub.js.map +1 -0
  455. package/dist/utils/slash-command-loader.d.ts +52 -0
  456. package/dist/utils/slash-command-loader.d.ts.map +1 -0
  457. package/dist/utils/slash-command-loader.js +141 -0
  458. package/dist/utils/slash-command-loader.js.map +1 -0
  459. package/dist/utils/slash-command-processor.d.ts +14 -0
  460. package/dist/utils/slash-command-processor.d.ts.map +1 -0
  461. package/dist/utils/slash-command-processor.js +105 -0
  462. package/dist/utils/slash-command-processor.js.map +1 -0
  463. package/dist/utils/stdin-pipe.d.ts +33 -0
  464. package/dist/utils/stdin-pipe.d.ts.map +1 -0
  465. package/dist/utils/stdin-pipe.js +96 -0
  466. package/dist/utils/stdin-pipe.js.map +1 -0
  467. package/dist/utils/storage-factory.d.ts +50 -0
  468. package/dist/utils/storage-factory.d.ts.map +1 -0
  469. package/dist/utils/storage-factory.js +121 -0
  470. package/dist/utils/storage-factory.js.map +1 -0
  471. package/dist/utils/storage-maintenance.d.ts +103 -0
  472. package/dist/utils/storage-maintenance.d.ts.map +1 -0
  473. package/dist/utils/storage-maintenance.js +274 -0
  474. package/dist/utils/storage-maintenance.js.map +1 -0
  475. package/dist/utils/thread-lock.d.ts +26 -0
  476. package/dist/utils/thread-lock.d.ts.map +1 -0
  477. package/dist/utils/thread-lock.js +112 -0
  478. package/dist/utils/thread-lock.js.map +1 -0
  479. package/dist/utils/token-estimator.d.ts +3 -0
  480. package/dist/utils/token-estimator.d.ts.map +1 -0
  481. package/dist/utils/token-estimator.js +21 -0
  482. package/dist/utils/token-estimator.js.map +1 -0
  483. package/dist/utils/update-check.d.ts +101 -0
  484. package/dist/utils/update-check.d.ts.map +1 -0
  485. package/dist/utils/update-check.js +383 -0
  486. package/dist/utils/update-check.js.map +1 -0
  487. package/dist/voice/stt-registry.d.ts +64 -0
  488. package/dist/voice/stt-registry.d.ts.map +1 -0
  489. package/dist/voice/stt-registry.js +144 -0
  490. package/dist/voice/stt-registry.js.map +1 -0
  491. package/package.json +96 -0
@@ -0,0 +1,163 @@
1
+ import { randomUUID } from "crypto";
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
3
+ import os from "os";
4
+ import path from "path";
5
+ import { PostHog } from "posthog-node";
6
+ //#region src/analytics.ts
7
+ const POSTHOG_API_KEY = "phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT";
8
+ const POSTHOG_HOST = "https://us.posthog.com";
9
+ const MASTRA_SOURCE = "mastracode";
10
+ const TRUTHY_DISABLED_VALUES = /* @__PURE__ */ new Set([
11
+ "1",
12
+ "true",
13
+ "yes",
14
+ "on"
15
+ ]);
16
+ const ANALYTICS_CONFIG_PATH = path.join(os.homedir(), ".mastracode", "analytics.json");
17
+ function createMastraAnalyticsDistinctId() {
18
+ return `mastra-${randomUUID()}`;
19
+ }
20
+ function isHostnameDerivedDistinctId(distinctId, hostname = os.hostname()) {
21
+ return distinctId === `mastra-${hostname}`;
22
+ }
23
+ function isValidMastraAnalyticsDistinctId(distinctId) {
24
+ return /^mastra-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(distinctId);
25
+ }
26
+ function writeAnalyticsConfig(distinctId, configPath = ANALYTICS_CONFIG_PATH) {
27
+ try {
28
+ mkdirSync(path.dirname(configPath), { recursive: true });
29
+ writeFileSync(configPath, JSON.stringify({ distinctId }));
30
+ } catch {}
31
+ }
32
+ function getMastraAnalyticsDistinctId(configPath = ANALYTICS_CONFIG_PATH) {
33
+ try {
34
+ if (existsSync(configPath)) {
35
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
36
+ if (config.distinctId && isValidMastraAnalyticsDistinctId(config.distinctId) && !isHostnameDerivedDistinctId(config.distinctId)) return config.distinctId;
37
+ }
38
+ } catch {}
39
+ const distinctId = createMastraAnalyticsDistinctId();
40
+ writeAnalyticsConfig(distinctId, configPath);
41
+ return distinctId;
42
+ }
43
+ function isAnalyticsDebugEnabled() {
44
+ return TRUTHY_DISABLED_VALUES.has(process.env.MASTRACODE_ANALYTICS_DEBUG?.trim().toLowerCase() ?? "");
45
+ }
46
+ function debugAnalytics(message, properties) {
47
+ if (!isAnalyticsDebugEnabled()) return;
48
+ const suffix = properties ? ` ${JSON.stringify(properties)}` : "";
49
+ process.stderr.write(`[mastracode analytics] ${message}${suffix}\n`);
50
+ }
51
+ var NoopMastraCodeAnalytics = class {
52
+ capture(event) {
53
+ debugAnalytics("capture skipped: telemetry disabled", { event });
54
+ }
55
+ trackCommand(command) {
56
+ debugAnalytics("command skipped: telemetry disabled", { command });
57
+ }
58
+ trackInteractivePrompt(promptType) {
59
+ debugAnalytics("interactive prompt skipped: telemetry disabled", { promptType });
60
+ }
61
+ async shutdown() {
62
+ debugAnalytics("shutdown skipped: telemetry disabled");
63
+ }
64
+ isEnabled() {
65
+ return false;
66
+ }
67
+ };
68
+ var PostHogMastraCodeAnalytics = class {
69
+ client;
70
+ distinctId;
71
+ sessionId = randomUUID();
72
+ version;
73
+ constructor({ version, apiKey = POSTHOG_API_KEY, host = POSTHOG_HOST }) {
74
+ this.version = version;
75
+ this.distinctId = getMastraAnalyticsDistinctId();
76
+ this.client = new PostHog(apiKey, {
77
+ host,
78
+ flushAt: 1,
79
+ flushInterval: 0,
80
+ disableGeoip: false
81
+ });
82
+ this.client.register({ mastraSource: MASTRA_SOURCE });
83
+ debugAnalytics("enabled", {
84
+ host,
85
+ distinctId: this.distinctId,
86
+ version
87
+ });
88
+ }
89
+ capture(event, properties) {
90
+ try {
91
+ const eventProperties = {
92
+ ...this.getBaseProperties(),
93
+ ...properties
94
+ };
95
+ debugAnalytics("capture", {
96
+ event,
97
+ properties: eventProperties
98
+ });
99
+ this.client.capture({
100
+ distinctId: this.distinctId,
101
+ event,
102
+ properties: eventProperties
103
+ });
104
+ } catch (error) {
105
+ debugAnalytics("capture failed", {
106
+ event,
107
+ error: error instanceof Error ? error.message : String(error)
108
+ });
109
+ }
110
+ }
111
+ trackCommand(command, properties) {
112
+ this.capture("mastracode_command_used", {
113
+ command,
114
+ ...properties
115
+ });
116
+ }
117
+ trackInteractivePrompt(promptType, properties) {
118
+ this.capture("mastracode_interactive_prompt_shown", {
119
+ promptType,
120
+ ...properties
121
+ });
122
+ }
123
+ async shutdown() {
124
+ try {
125
+ debugAnalytics("shutdown start");
126
+ await this.client.shutdown();
127
+ debugAnalytics("shutdown complete");
128
+ } catch (error) {
129
+ debugAnalytics("shutdown failed", { error: error instanceof Error ? error.message : String(error) });
130
+ }
131
+ }
132
+ isEnabled() {
133
+ return true;
134
+ }
135
+ getBaseProperties() {
136
+ return {
137
+ mastraSource: MASTRA_SOURCE,
138
+ sessionId: this.sessionId,
139
+ version: this.version,
140
+ os: process.platform,
141
+ osVersion: os.release(),
142
+ nodeVersion: process.version,
143
+ platform: process.arch,
144
+ machineId: os.hostname()
145
+ };
146
+ }
147
+ };
148
+ function isTelemetryDisabled(env = process.env) {
149
+ const value = env.MASTRA_TELEMETRY_DISABLED;
150
+ if (!value) return false;
151
+ return TRUTHY_DISABLED_VALUES.has(value.trim().toLowerCase());
152
+ }
153
+ function createMastraCodeAnalytics(options) {
154
+ if (isTelemetryDisabled()) {
155
+ debugAnalytics("disabled by MASTRA_TELEMETRY_DISABLED", { value: process.env.MASTRA_TELEMETRY_DISABLED });
156
+ return new NoopMastraCodeAnalytics();
157
+ }
158
+ return new PostHogMastraCodeAnalytics(options);
159
+ }
160
+ //#endregion
161
+ export { createMastraCodeAnalytics, getMastraAnalyticsDistinctId, isTelemetryDisabled };
162
+
163
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","names":[],"sources":["../src/analytics.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { PostHog } from 'posthog-node';\n\nconst POSTHOG_API_KEY = 'phc_SBLpZVAB6jmHOct9CABq3PF0Yn5FU3G2FgT4xUr2XrT';\nconst POSTHOG_HOST = 'https://us.posthog.com';\nconst MASTRA_SOURCE = 'mastracode';\nconst TRUTHY_DISABLED_VALUES = new Set(['1', 'true', 'yes', 'on']);\nconst ANALYTICS_CONFIG_PATH = path.join(os.homedir(), '.mastracode', 'analytics.json');\n\ninterface AnalyticsConfig {\n distinctId?: string;\n}\n\nfunction createMastraAnalyticsDistinctId(): string {\n return `mastra-${randomUUID()}`;\n}\n\nfunction isHostnameDerivedDistinctId(distinctId: string, hostname = os.hostname()): boolean {\n return distinctId === `mastra-${hostname}`;\n}\n\nfunction isValidMastraAnalyticsDistinctId(distinctId: string): boolean {\n return /^mastra-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(distinctId);\n}\n\nfunction writeAnalyticsConfig(distinctId: string, configPath = ANALYTICS_CONFIG_PATH): void {\n try {\n mkdirSync(path.dirname(configPath), { recursive: true });\n writeFileSync(configPath, JSON.stringify({ distinctId }));\n } catch {\n // swallow analytics persistence errors\n }\n}\n\nexport function getMastraAnalyticsDistinctId(configPath = ANALYTICS_CONFIG_PATH): string {\n try {\n if (existsSync(configPath)) {\n const config = JSON.parse(readFileSync(configPath, 'utf-8')) as AnalyticsConfig;\n if (\n config.distinctId &&\n isValidMastraAnalyticsDistinctId(config.distinctId) &&\n !isHostnameDerivedDistinctId(config.distinctId)\n ) {\n return config.distinctId;\n }\n }\n } catch {\n // regenerate below\n }\n\n const distinctId = createMastraAnalyticsDistinctId();\n writeAnalyticsConfig(distinctId, configPath);\n return distinctId;\n}\n\nfunction isAnalyticsDebugEnabled(): boolean {\n return TRUTHY_DISABLED_VALUES.has(process.env.MASTRACODE_ANALYTICS_DEBUG?.trim().toLowerCase() ?? '');\n}\n\nfunction debugAnalytics(message: string, properties?: Record<string, unknown>): void {\n if (!isAnalyticsDebugEnabled()) {\n return;\n }\n\n const suffix = properties ? ` ${JSON.stringify(properties)}` : '';\n process.stderr.write(`[mastracode analytics] ${message}${suffix}\\n`);\n}\n\nexport type MastraCodeAnalyticsEvent =\n | 'mastracode_session_started'\n | 'mastracode_prompt_submitted'\n | 'mastracode_thread_changed'\n | 'mastracode_model_changed'\n | 'mastracode_command_used'\n | 'mastracode_interactive_prompt_shown';\n\nexport interface MastraCodeAnalytics {\n capture(event: MastraCodeAnalyticsEvent, properties?: Record<string, unknown>): void;\n trackCommand(command: string, properties?: Record<string, unknown>): void;\n trackInteractivePrompt(promptType: string, properties?: Record<string, unknown>): void;\n shutdown(): Promise<void>;\n isEnabled(): boolean;\n}\n\ninterface MastraCodeAnalyticsOptions {\n version: string;\n host?: string;\n apiKey?: string;\n}\n\nclass NoopMastraCodeAnalytics implements MastraCodeAnalytics {\n capture(event: MastraCodeAnalyticsEvent): void {\n debugAnalytics('capture skipped: telemetry disabled', { event });\n }\n trackCommand(command: string): void {\n debugAnalytics('command skipped: telemetry disabled', { command });\n }\n trackInteractivePrompt(promptType: string): void {\n debugAnalytics('interactive prompt skipped: telemetry disabled', { promptType });\n }\n async shutdown(): Promise<void> {\n debugAnalytics('shutdown skipped: telemetry disabled');\n }\n isEnabled(): boolean {\n return false;\n }\n}\n\nclass PostHogMastraCodeAnalytics implements MastraCodeAnalytics {\n private readonly client: PostHog;\n private readonly distinctId: string;\n private readonly sessionId = randomUUID();\n private readonly version: string;\n\n constructor({ version, apiKey = POSTHOG_API_KEY, host = POSTHOG_HOST }: MastraCodeAnalyticsOptions) {\n this.version = version;\n this.distinctId = getMastraAnalyticsDistinctId();\n this.client = new PostHog(apiKey, {\n host,\n flushAt: 1,\n flushInterval: 0,\n disableGeoip: false,\n });\n this.client.register({ mastraSource: MASTRA_SOURCE });\n debugAnalytics('enabled', { host, distinctId: this.distinctId, version });\n }\n\n capture(event: MastraCodeAnalyticsEvent, properties?: Record<string, unknown>): void {\n try {\n const eventProperties = {\n ...this.getBaseProperties(),\n ...properties,\n };\n debugAnalytics('capture', { event, properties: eventProperties });\n this.client.capture({\n distinctId: this.distinctId,\n event,\n properties: eventProperties,\n });\n } catch (error) {\n debugAnalytics('capture failed', { event, error: error instanceof Error ? error.message : String(error) });\n // swallow analytics errors\n }\n }\n\n trackCommand(command: string, properties?: Record<string, unknown>): void {\n this.capture('mastracode_command_used', { command, ...properties });\n }\n\n trackInteractivePrompt(promptType: string, properties?: Record<string, unknown>): void {\n this.capture('mastracode_interactive_prompt_shown', { promptType, ...properties });\n }\n\n async shutdown(): Promise<void> {\n try {\n debugAnalytics('shutdown start');\n await this.client.shutdown();\n debugAnalytics('shutdown complete');\n } catch (error) {\n debugAnalytics('shutdown failed', { error: error instanceof Error ? error.message : String(error) });\n // swallow analytics errors\n }\n }\n\n isEnabled(): boolean {\n return true;\n }\n\n private getBaseProperties(): Record<string, unknown> {\n return {\n mastraSource: MASTRA_SOURCE,\n sessionId: this.sessionId,\n version: this.version,\n os: process.platform,\n osVersion: os.release(),\n nodeVersion: process.version,\n platform: process.arch,\n machineId: os.hostname(),\n };\n }\n}\n\nexport function isTelemetryDisabled(env: NodeJS.ProcessEnv = process.env): boolean {\n const value = env.MASTRA_TELEMETRY_DISABLED;\n if (!value) {\n return false;\n }\n\n return TRUTHY_DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nexport function createMastraCodeAnalytics(options: MastraCodeAnalyticsOptions): MastraCodeAnalytics {\n if (isTelemetryDisabled()) {\n debugAnalytics('disabled by MASTRA_TELEMETRY_DISABLED', { value: process.env.MASTRA_TELEMETRY_DISABLED });\n return new NoopMastraCodeAnalytics();\n }\n\n return new PostHogMastraCodeAnalytics(options);\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Forgiving parser for user-pasted OAuth authorization input.
3
+ *
4
+ * Accepts, in order of preference:
5
+ * - a full redirect URL (`https://.../callback?code=...&state=...`)
6
+ * - the `code#state` form shown on Anthropic's hosted callback page
7
+ * - a raw query string (`code=...&state=...`)
8
+ * - a bare authorization code
9
+ *
10
+ * Ported from pi-mono's `parseAuthorizationInput`.
11
+ */
12
+ export declare function parseAuthorizationInput(input: string): {
13
+ code?: string;
14
+ state?: string;
15
+ };
16
+ //# sourceMappingURL=authorization-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-input.d.ts","sourceRoot":"","sources":["../../src/auth/authorization-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CA4BA"}
@@ -0,0 +1,42 @@
1
+ //#region src/auth/authorization-input.ts
2
+ /**
3
+ * Forgiving parser for user-pasted OAuth authorization input.
4
+ *
5
+ * Accepts, in order of preference:
6
+ * - a full redirect URL (`https://.../callback?code=...&state=...`)
7
+ * - the `code#state` form shown on Anthropic's hosted callback page
8
+ * - a raw query string (`code=...&state=...`)
9
+ * - a bare authorization code
10
+ *
11
+ * Ported from pi-mono's `parseAuthorizationInput`.
12
+ */
13
+ function parseAuthorizationInput(input) {
14
+ const value = input.trim();
15
+ if (!value) return {};
16
+ try {
17
+ const url = new URL(value);
18
+ return {
19
+ code: url.searchParams.get("code") ?? void 0,
20
+ state: url.searchParams.get("state") ?? void 0
21
+ };
22
+ } catch {}
23
+ if (value.includes("#")) {
24
+ const [code, state] = value.split("#", 2);
25
+ return {
26
+ code,
27
+ state
28
+ };
29
+ }
30
+ if (value.includes("code=")) {
31
+ const params = new URLSearchParams(value);
32
+ return {
33
+ code: params.get("code") ?? void 0,
34
+ state: params.get("state") ?? void 0
35
+ };
36
+ }
37
+ return { code: value };
38
+ }
39
+ //#endregion
40
+ export { parseAuthorizationInput };
41
+
42
+ //# sourceMappingURL=authorization-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-input.js","names":[],"sources":["../../src/auth/authorization-input.ts"],"sourcesContent":["/**\n * Forgiving parser for user-pasted OAuth authorization input.\n *\n * Accepts, in order of preference:\n * - a full redirect URL (`https://.../callback?code=...&state=...`)\n * - the `code#state` form shown on Anthropic's hosted callback page\n * - a raw query string (`code=...&state=...`)\n * - a bare authorization code\n *\n * Ported from pi-mono's `parseAuthorizationInput`.\n */\nexport function parseAuthorizationInput(input: string): {\n code?: string;\n state?: string;\n} {\n const value = input.trim();\n if (!value) return {};\n\n try {\n const url = new URL(value);\n return {\n code: url.searchParams.get('code') ?? undefined,\n state: url.searchParams.get('state') ?? undefined,\n };\n } catch {\n // not a URL\n }\n\n if (value.includes('#')) {\n const [code, state] = value.split('#', 2);\n return { code, state };\n }\n\n if (value.includes('code=')) {\n const params = new URLSearchParams(value);\n return {\n code: params.get('code') ?? undefined,\n state: params.get('state') ?? undefined,\n };\n }\n\n return { code: value };\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,wBAAwB,OAGtC;CACA,MAAM,QAAQ,MAAM,KAAK;CACzB,IAAI,CAAC,OAAO,OAAO,CAAC;CAEpB,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EACzB,OAAO;GACL,MAAM,IAAI,aAAa,IAAI,MAAM,KAAK,KAAA;GACtC,OAAO,IAAI,aAAa,IAAI,OAAO,KAAK,KAAA;EAC1C;CACF,QAAQ,CAER;CAEA,IAAI,MAAM,SAAS,GAAG,GAAG;EACvB,MAAM,CAAC,MAAM,SAAS,MAAM,MAAM,KAAK,CAAC;EACxC,OAAO;GAAE;GAAM;EAAM;CACvB;CAEA,IAAI,MAAM,SAAS,OAAO,GAAG;EAC3B,MAAM,SAAS,IAAI,gBAAgB,KAAK;EACxC,OAAO;GACL,MAAM,OAAO,IAAI,MAAM,KAAK,KAAA;GAC5B,OAAO,OAAO,IAAI,OAAO,KAAK,KAAA;EAChC;CACF;CAEA,OAAO,EAAE,MAAM,MAAM;AACvB"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Generic RFC 8628 (OAuth 2.0 Device Authorization Grant) polling helpers.
3
+ *
4
+ * Ported from pi-mono's device-code utility, restructured as a single-step
5
+ * API so the same poll semantics can be driven two ways:
6
+ * - `pollDeviceCodeUntilComplete()` — blocking loop for TUI flows.
7
+ * - `stepDeviceCodePoll()` — exactly one upstream poll per call, with a
8
+ * JSON-serializable `DeviceCodePollState` so web routes can persist the
9
+ * state between HTTP requests (any replica can continue the poll).
10
+ *
11
+ * Inspired by pi-mono:
12
+ * https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/utils/oauth/device-code.ts
13
+ */
14
+ /**
15
+ * Serializable poll-loop state. Safe to round-trip through JSON (e.g. a
16
+ * `pending jsonb` column) so device-code polling can span HTTP requests.
17
+ */
18
+ export interface DeviceCodePollState {
19
+ /** ms epoch after which the device authorization is considered expired. */
20
+ deadlineAt: number;
21
+ /** Current base poll interval in ms (grows on slow_down responses). */
22
+ intervalMs: number;
23
+ /** Number of slow_down responses observed so far. */
24
+ slowDownResponses: number;
25
+ }
26
+ export declare function createDeviceCodePollState(options: {
27
+ /** Poll interval suggested by the server, in seconds. Defaults to 5 (RFC 8628). */
28
+ intervalSeconds?: number;
29
+ /** Lifetime of the device code, in seconds. */
30
+ expiresInSeconds: number;
31
+ /** Override "now" for tests. */
32
+ now?: number;
33
+ }): DeviceCodePollState;
34
+ /**
35
+ * Classified result of one upstream token-endpoint poll. Providers implement
36
+ * the HTTP request and map their response shape onto this union.
37
+ */
38
+ export type DeviceCodePollOutcome<T> = {
39
+ status: 'complete';
40
+ result: T;
41
+ } | {
42
+ status: 'pending';
43
+ intervalSeconds?: number;
44
+ } | {
45
+ status: 'slow_down';
46
+ intervalSeconds?: number;
47
+ } | {
48
+ status: 'failed';
49
+ error: string;
50
+ };
51
+ export type DeviceCodeStepResult<T> = {
52
+ status: 'complete';
53
+ result: T;
54
+ state: DeviceCodePollState;
55
+ } | {
56
+ status: 'pending';
57
+ nextPollMs: number;
58
+ state: DeviceCodePollState;
59
+ } | {
60
+ status: 'slow_down';
61
+ nextPollMs: number;
62
+ state: DeviceCodePollState;
63
+ } | {
64
+ status: 'failed';
65
+ error: string;
66
+ state: DeviceCodePollState;
67
+ };
68
+ /**
69
+ * Delay to wait before the next poll, honoring slow_down growth and clamped
70
+ * to the remaining lifetime of the device code.
71
+ */
72
+ export declare function nextPollDelayMs(state: DeviceCodePollState, now?: number): number;
73
+ /**
74
+ * Perform exactly one upstream poll and fold the outcome into the poll state.
75
+ * Never throws for flow-level conditions — timeouts and provider errors are
76
+ * reported as `{ status: 'failed' }` so callers can persist/report them.
77
+ */
78
+ export declare function stepDeviceCodePoll<T>(state: DeviceCodePollState, pollOnce: () => Promise<DeviceCodePollOutcome<T>>, now?: number): Promise<DeviceCodeStepResult<T>>;
79
+ /** Sleep that can be interrupted by an AbortSignal. */
80
+ export declare function abortableSleep(ms: number, signal?: AbortSignal): Promise<void>;
81
+ /**
82
+ * Blocking poll loop for TUI flows: waits the appropriate interval between
83
+ * polls, honors slow_down growth, aborts on the signal, and throws on
84
+ * failure/timeout (with a clock-drift hint after slow_down responses).
85
+ */
86
+ export declare function pollDeviceCodeUntilComplete<T>(options: {
87
+ state: DeviceCodePollState;
88
+ pollOnce: () => Promise<DeviceCodePollOutcome<T>>;
89
+ signal?: AbortSignal;
90
+ /** Override the sleep implementation for tests. */
91
+ sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
92
+ }): Promise<T>;
93
+ //# sourceMappingURL=device-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-code.d.ts","sourceRoot":"","sources":["../../src/auth/device-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,gBAAgB,EAAE,MAAM,CAAC;IACzB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,mBAAmB,CAWtB;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAC/B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAC9B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GAC7D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GACrE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GACvE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAWpE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAK5F;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EACjD,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAiClC;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9E;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,CAAC,EAAE,OAAO,EAAE;IAC5D,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,mDAAmD;IACnD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,GAAG,OAAO,CAAC,CAAC,CAAC,CAwBb"}
@@ -0,0 +1,129 @@
1
+ //#region src/auth/device-code.ts
2
+ /**
3
+ * Generic RFC 8628 (OAuth 2.0 Device Authorization Grant) polling helpers.
4
+ *
5
+ * Ported from pi-mono's device-code utility, restructured as a single-step
6
+ * API so the same poll semantics can be driven two ways:
7
+ * - `pollDeviceCodeUntilComplete()` — blocking loop for TUI flows.
8
+ * - `stepDeviceCodePoll()` — exactly one upstream poll per call, with a
9
+ * JSON-serializable `DeviceCodePollState` so web routes can persist the
10
+ * state between HTTP requests (any replica can continue the poll).
11
+ *
12
+ * Inspired by pi-mono:
13
+ * https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/utils/oauth/device-code.ts
14
+ */
15
+ const DEFAULT_INTERVAL_SECONDS = 5;
16
+ const INITIAL_POLL_INTERVAL_MULTIPLIER = 1.2;
17
+ const SLOW_DOWN_POLL_INTERVAL_MULTIPLIER = 1.4;
18
+ const SLOW_DOWN_INTERVAL_INCREMENT_MS = 5e3;
19
+ function createDeviceCodePollState(options) {
20
+ const now = options.now ?? Date.now();
21
+ const intervalSeconds = typeof options.intervalSeconds === "number" && options.intervalSeconds > 0 ? options.intervalSeconds : DEFAULT_INTERVAL_SECONDS;
22
+ return {
23
+ deadlineAt: now + options.expiresInSeconds * 1e3,
24
+ intervalMs: Math.max(1e3, Math.floor(intervalSeconds * 1e3)),
25
+ slowDownResponses: 0
26
+ };
27
+ }
28
+ function timeoutMessage(state) {
29
+ if (state.slowDownResponses > 0) return "Device flow timed out after one or more slow_down responses. This is often caused by clock drift in WSL or VM environments. Please sync or restart the VM clock and try again.";
30
+ return "Device flow timed out";
31
+ }
32
+ /**
33
+ * Delay to wait before the next poll, honoring slow_down growth and clamped
34
+ * to the remaining lifetime of the device code.
35
+ */
36
+ function nextPollDelayMs(state, now = Date.now()) {
37
+ const multiplier = state.slowDownResponses > 0 ? SLOW_DOWN_POLL_INTERVAL_MULTIPLIER : INITIAL_POLL_INTERVAL_MULTIPLIER;
38
+ const remainingMs = Math.max(0, state.deadlineAt - now);
39
+ return Math.min(Math.ceil(state.intervalMs * multiplier), remainingMs);
40
+ }
41
+ /**
42
+ * Perform exactly one upstream poll and fold the outcome into the poll state.
43
+ * Never throws for flow-level conditions — timeouts and provider errors are
44
+ * reported as `{ status: 'failed' }` so callers can persist/report them.
45
+ */
46
+ async function stepDeviceCodePoll(state, pollOnce, now = Date.now()) {
47
+ if (now >= state.deadlineAt) return {
48
+ status: "failed",
49
+ error: timeoutMessage(state),
50
+ state
51
+ };
52
+ const outcome = await pollOnce();
53
+ switch (outcome.status) {
54
+ case "complete": return {
55
+ status: "complete",
56
+ result: outcome.result,
57
+ state
58
+ };
59
+ case "failed": return {
60
+ status: "failed",
61
+ error: outcome.error,
62
+ state
63
+ };
64
+ case "slow_down": {
65
+ const next = {
66
+ ...state,
67
+ slowDownResponses: state.slowDownResponses + 1,
68
+ intervalMs: typeof outcome.intervalSeconds === "number" && outcome.intervalSeconds > 0 ? outcome.intervalSeconds * 1e3 : Math.max(1e3, state.intervalMs + SLOW_DOWN_INTERVAL_INCREMENT_MS)
69
+ };
70
+ return {
71
+ status: "slow_down",
72
+ nextPollMs: nextPollDelayMs(next, now),
73
+ state: next
74
+ };
75
+ }
76
+ case "pending": {
77
+ const next = typeof outcome.intervalSeconds === "number" && outcome.intervalSeconds > 0 ? {
78
+ ...state,
79
+ intervalMs: Math.max(1e3, outcome.intervalSeconds * 1e3)
80
+ } : state;
81
+ return {
82
+ status: "pending",
83
+ nextPollMs: nextPollDelayMs(next, now),
84
+ state: next
85
+ };
86
+ }
87
+ }
88
+ }
89
+ /** Sleep that can be interrupted by an AbortSignal. */
90
+ function abortableSleep(ms, signal) {
91
+ return new Promise((resolve, reject) => {
92
+ if (signal?.aborted) {
93
+ reject(/* @__PURE__ */ new Error("Login cancelled"));
94
+ return;
95
+ }
96
+ let timeout;
97
+ const onAbort = () => {
98
+ clearTimeout(timeout);
99
+ reject(/* @__PURE__ */ new Error("Login cancelled"));
100
+ };
101
+ timeout = setTimeout(() => {
102
+ signal?.removeEventListener("abort", onAbort);
103
+ resolve();
104
+ }, ms);
105
+ signal?.addEventListener("abort", onAbort, { once: true });
106
+ });
107
+ }
108
+ /**
109
+ * Blocking poll loop for TUI flows: waits the appropriate interval between
110
+ * polls, honors slow_down growth, aborts on the signal, and throws on
111
+ * failure/timeout (with a clock-drift hint after slow_down responses).
112
+ */
113
+ async function pollDeviceCodeUntilComplete(options) {
114
+ let state = options.state;
115
+ const sleep = options.sleep ?? abortableSleep;
116
+ while (true) {
117
+ if (options.signal?.aborted) throw new Error("Login cancelled");
118
+ if (Date.now() >= state.deadlineAt) throw new Error(timeoutMessage(state));
119
+ await sleep(nextPollDelayMs(state), options.signal);
120
+ const step = await stepDeviceCodePoll(state, options.pollOnce);
121
+ state = step.state;
122
+ if (step.status === "complete") return step.result;
123
+ if (step.status === "failed") throw new Error(step.error);
124
+ }
125
+ }
126
+ //#endregion
127
+ export { abortableSleep, createDeviceCodePollState, nextPollDelayMs, pollDeviceCodeUntilComplete, stepDeviceCodePoll };
128
+
129
+ //# sourceMappingURL=device-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-code.js","names":[],"sources":["../../src/auth/device-code.ts"],"sourcesContent":["/**\n * Generic RFC 8628 (OAuth 2.0 Device Authorization Grant) polling helpers.\n *\n * Ported from pi-mono's device-code utility, restructured as a single-step\n * API so the same poll semantics can be driven two ways:\n * - `pollDeviceCodeUntilComplete()` — blocking loop for TUI flows.\n * - `stepDeviceCodePoll()` — exactly one upstream poll per call, with a\n * JSON-serializable `DeviceCodePollState` so web routes can persist the\n * state between HTTP requests (any replica can continue the poll).\n *\n * Inspired by pi-mono:\n * https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/utils/oauth/device-code.ts\n */\n\nconst DEFAULT_INTERVAL_SECONDS = 5;\nconst INITIAL_POLL_INTERVAL_MULTIPLIER = 1.2;\nconst SLOW_DOWN_POLL_INTERVAL_MULTIPLIER = 1.4;\nconst SLOW_DOWN_INTERVAL_INCREMENT_MS = 5000;\n\n/**\n * Serializable poll-loop state. Safe to round-trip through JSON (e.g. a\n * `pending jsonb` column) so device-code polling can span HTTP requests.\n */\nexport interface DeviceCodePollState {\n /** ms epoch after which the device authorization is considered expired. */\n deadlineAt: number;\n /** Current base poll interval in ms (grows on slow_down responses). */\n intervalMs: number;\n /** Number of slow_down responses observed so far. */\n slowDownResponses: number;\n}\n\nexport function createDeviceCodePollState(options: {\n /** Poll interval suggested by the server, in seconds. Defaults to 5 (RFC 8628). */\n intervalSeconds?: number;\n /** Lifetime of the device code, in seconds. */\n expiresInSeconds: number;\n /** Override \"now\" for tests. */\n now?: number;\n}): DeviceCodePollState {\n const now = options.now ?? Date.now();\n const intervalSeconds =\n typeof options.intervalSeconds === 'number' && options.intervalSeconds > 0\n ? options.intervalSeconds\n : DEFAULT_INTERVAL_SECONDS;\n return {\n deadlineAt: now + options.expiresInSeconds * 1000,\n intervalMs: Math.max(1000, Math.floor(intervalSeconds * 1000)),\n slowDownResponses: 0,\n };\n}\n\n/**\n * Classified result of one upstream token-endpoint poll. Providers implement\n * the HTTP request and map their response shape onto this union.\n */\nexport type DeviceCodePollOutcome<T> =\n | { status: 'complete'; result: T }\n | { status: 'pending'; intervalSeconds?: number }\n | { status: 'slow_down'; intervalSeconds?: number }\n | { status: 'failed'; error: string };\n\nexport type DeviceCodeStepResult<T> =\n | { status: 'complete'; result: T; state: DeviceCodePollState }\n | { status: 'pending'; nextPollMs: number; state: DeviceCodePollState }\n | { status: 'slow_down'; nextPollMs: number; state: DeviceCodePollState }\n | { status: 'failed'; error: string; state: DeviceCodePollState };\n\nfunction timeoutMessage(state: DeviceCodePollState): string {\n if (state.slowDownResponses > 0) {\n // Repeated slow_down responses followed by a timeout usually means the\n // local clock is behind the server's (common in WSL/VMs after sleep).\n return 'Device flow timed out after one or more slow_down responses. This is often caused by clock drift in WSL or VM environments. Please sync or restart the VM clock and try again.';\n }\n return 'Device flow timed out';\n}\n\n/**\n * Delay to wait before the next poll, honoring slow_down growth and clamped\n * to the remaining lifetime of the device code.\n */\nexport function nextPollDelayMs(state: DeviceCodePollState, now: number = Date.now()): number {\n const multiplier =\n state.slowDownResponses > 0 ? SLOW_DOWN_POLL_INTERVAL_MULTIPLIER : INITIAL_POLL_INTERVAL_MULTIPLIER;\n const remainingMs = Math.max(0, state.deadlineAt - now);\n return Math.min(Math.ceil(state.intervalMs * multiplier), remainingMs);\n}\n\n/**\n * Perform exactly one upstream poll and fold the outcome into the poll state.\n * Never throws for flow-level conditions — timeouts and provider errors are\n * reported as `{ status: 'failed' }` so callers can persist/report them.\n */\nexport async function stepDeviceCodePoll<T>(\n state: DeviceCodePollState,\n pollOnce: () => Promise<DeviceCodePollOutcome<T>>,\n now: number = Date.now(),\n): Promise<DeviceCodeStepResult<T>> {\n if (now >= state.deadlineAt) {\n return { status: 'failed', error: timeoutMessage(state), state };\n }\n\n const outcome = await pollOnce();\n\n switch (outcome.status) {\n case 'complete':\n return { status: 'complete', result: outcome.result, state };\n case 'failed':\n return { status: 'failed', error: outcome.error, state };\n case 'slow_down': {\n const next: DeviceCodePollState = {\n ...state,\n slowDownResponses: state.slowDownResponses + 1,\n // RFC 8628 section 3.5: grow the interval by 5 seconds, unless the\n // server told us the interval to use.\n intervalMs:\n typeof outcome.intervalSeconds === 'number' && outcome.intervalSeconds > 0\n ? outcome.intervalSeconds * 1000\n : Math.max(1000, state.intervalMs + SLOW_DOWN_INTERVAL_INCREMENT_MS),\n };\n return { status: 'slow_down', nextPollMs: nextPollDelayMs(next, now), state: next };\n }\n case 'pending': {\n const next: DeviceCodePollState =\n typeof outcome.intervalSeconds === 'number' && outcome.intervalSeconds > 0\n ? { ...state, intervalMs: Math.max(1000, outcome.intervalSeconds * 1000) }\n : state;\n return { status: 'pending', nextPollMs: nextPollDelayMs(next, now), state: next };\n }\n }\n}\n\n/** Sleep that can be interrupted by an AbortSignal. */\nexport function abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error('Login cancelled'));\n return;\n }\n\n let timeout: ReturnType<typeof setTimeout>;\n const onAbort = () => {\n clearTimeout(timeout);\n reject(new Error('Login cancelled'));\n };\n\n timeout = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Blocking poll loop for TUI flows: waits the appropriate interval between\n * polls, honors slow_down growth, aborts on the signal, and throws on\n * failure/timeout (with a clock-drift hint after slow_down responses).\n */\nexport async function pollDeviceCodeUntilComplete<T>(options: {\n state: DeviceCodePollState;\n pollOnce: () => Promise<DeviceCodePollOutcome<T>>;\n signal?: AbortSignal;\n /** Override the sleep implementation for tests. */\n sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;\n}): Promise<T> {\n let state = options.state;\n const sleep = options.sleep ?? abortableSleep;\n\n while (true) {\n if (options.signal?.aborted) {\n throw new Error('Login cancelled');\n }\n if (Date.now() >= state.deadlineAt) {\n throw new Error(timeoutMessage(state));\n }\n\n await sleep(nextPollDelayMs(state), options.signal);\n\n const step = await stepDeviceCodePoll(state, options.pollOnce);\n state = step.state;\n\n if (step.status === 'complete') {\n return step.result;\n }\n if (step.status === 'failed') {\n throw new Error(step.error);\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * OAuth credential management for AI providers.
3
+ */
4
+ export * from './types.js';
5
+ export * from './storage.js';
6
+ export { anthropicOAuthProvider } from './providers/anthropic.js';
7
+ export { githubCopilotOAuthProvider } from './providers/github-copilot.js';
8
+ export { openaiCodexOAuthProvider } from './providers/openai-codex.js';
9
+ export { xaiOAuthProvider } from './providers/xai.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { anthropicOAuthProvider } from "./providers/anthropic.js";
2
+ import { githubCopilotOAuthProvider } from "./providers/github-copilot.js";
3
+ import { openaiCodexOAuthProvider } from "./providers/openai-codex.js";
4
+ import { xaiOAuthProvider } from "./providers/xai.js";
5
+ import { AuthStorage, PROVIDER_DEFAULT_MODELS, getOAuthProvider, getOAuthProviders } from "./storage.js";
6
+ export { AuthStorage, PROVIDER_DEFAULT_MODELS, anthropicOAuthProvider, getOAuthProvider, getOAuthProviders, githubCopilotOAuthProvider, openaiCodexOAuthProvider, xaiOAuthProvider };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * PKCE utilities using Web Crypto API.
3
+ * Works in both Node.js 20+ and browsers.
4
+ */
5
+ /**
6
+ * Generate PKCE code verifier and challenge.
7
+ * Uses Web Crypto API for cross-platform compatibility.
8
+ */
9
+ export declare function generatePKCE(): Promise<{
10
+ verifier: string;
11
+ challenge: string;
12
+ }>;
13
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/auth/pkce.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAaD"}
@@ -0,0 +1,32 @@
1
+ //#region src/auth/pkce.ts
2
+ /**
3
+ * PKCE utilities using Web Crypto API.
4
+ * Works in both Node.js 20+ and browsers.
5
+ */
6
+ /**
7
+ * Encode bytes as base64url string.
8
+ */
9
+ function base64urlEncode(bytes) {
10
+ let binary = "";
11
+ for (const byte of bytes) binary += String.fromCharCode(byte);
12
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
13
+ }
14
+ /**
15
+ * Generate PKCE code verifier and challenge.
16
+ * Uses Web Crypto API for cross-platform compatibility.
17
+ */
18
+ async function generatePKCE() {
19
+ const verifierBytes = /* @__PURE__ */ new Uint8Array(32);
20
+ crypto.getRandomValues(verifierBytes);
21
+ const verifier = base64urlEncode(verifierBytes);
22
+ const data = new TextEncoder().encode(verifier);
23
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
24
+ return {
25
+ verifier,
26
+ challenge: base64urlEncode(new Uint8Array(hashBuffer))
27
+ };
28
+ }
29
+ //#endregion
30
+ export { generatePKCE };
31
+
32
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","names":[],"sources":["../../src/auth/pkce.ts"],"sourcesContent":["/**\n * PKCE utilities using Web Crypto API.\n * Works in both Node.js 20+ and browsers.\n */\n\n/**\n * Encode bytes as base64url string.\n */\nfunction base64urlEncode(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\n/**\n * Generate PKCE code verifier and challenge.\n * Uses Web Crypto API for cross-platform compatibility.\n */\nexport async function generatePKCE(): Promise<{\n verifier: string;\n challenge: string;\n}> {\n // Generate random verifier\n const verifierBytes = new Uint8Array(32);\n crypto.getRandomValues(verifierBytes);\n const verifier = base64urlEncode(verifierBytes);\n\n // Compute SHA-256 challenge\n const encoder = new TextEncoder();\n const data = encoder.encode(verifier);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const challenge = base64urlEncode(new Uint8Array(hashBuffer));\n\n return { verifier, challenge };\n}\n"],"mappings":";;;;;;;;AAQA,SAAS,gBAAgB,OAA2B;CAClD,IAAI,SAAS;CACb,KAAK,MAAM,QAAQ,OACjB,UAAU,OAAO,aAAa,IAAI;CAEpC,OAAO,KAAK,MAAM,CAAC,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,MAAM,EAAE;AAC9E;;;;;AAMA,eAAsB,eAGnB;CAED,MAAM,gCAAgB,IAAI,WAAW,EAAE;CACvC,OAAO,gBAAgB,aAAa;CACpC,MAAM,WAAW,gBAAgB,aAAa;CAI9C,MAAM,OAAO,IADO,YACD,CAAC,CAAC,OAAO,QAAQ;CACpC,MAAM,aAAa,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI;CAG7D,OAAO;EAAE;EAAU,WAFD,gBAAgB,IAAI,WAAW,UAAU,CAEhC;CAAE;AAC/B"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Anthropic OAuth flow (Claude Pro/Max)
3
+ *
4
+ * Inspired by pi-mono's OAuth implementation:
5
+ * https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/utils/oauth/anthropic.ts
6
+ *
7
+ * The flow is a paste-code PKCE flow: the redirect lands on Anthropic's hosted
8
+ * callback page which displays `code#state` for the user to paste back. That
9
+ * makes it deployable without any inbound connection to the server, so the
10
+ * primitives are split into `startAnthropicLogin()` / `completeAnthropicLogin()`
11
+ * which can span separate HTTP requests (only the PKCE verifier needs to be
12
+ * persisted in between).
13
+ */
14
+ import type { OAuthCredentials, OAuthProviderInterface } from '../types.js';
15
+ export interface AnthropicLoginStart {
16
+ /** Authorization URL for the user to open. */
17
+ url: string;
18
+ /** PKCE code verifier — persist it to complete the login later. */
19
+ verifier: string;
20
+ }
21
+ /**
22
+ * Start an Anthropic login: generate PKCE state and build the authorization URL.
23
+ */
24
+ export declare function startAnthropicLogin(): Promise<AnthropicLoginStart>;
25
+ /**
26
+ * Complete an Anthropic login: parse the pasted authorization input
27
+ * (full URL, `code#state`, or query string), validate its state, and exchange
28
+ * it for tokens using the verifier from `startAnthropicLogin()`.
29
+ */
30
+ export declare function completeAnthropicLogin(input: string, verifier: string): Promise<OAuthCredentials>;
31
+ /**
32
+ * Login with Anthropic OAuth (paste-code flow), blocking on the prompt callback.
33
+ */
34
+ export declare function loginAnthropic(onAuthUrl: (url: string) => void, onPromptCode: () => Promise<string>): Promise<OAuthCredentials>;
35
+ /**
36
+ * Refresh Anthropic OAuth token
37
+ */
38
+ export declare function refreshAnthropicToken(refreshToken: string): Promise<OAuthCredentials>;
39
+ export declare const anthropicOAuthProvider: OAuthProviderInterface;
40
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAuB,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAYjG,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAexE;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+CvG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAChC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAClC,OAAO,CAAC,gBAAgB,CAAC,CAU3B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4B3F;AAED,eAAO,MAAM,sBAAsB,EAAE,sBAkBpC,CAAC"}