indusagi-coding-agent 0.1.37 → 0.1.39

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 (489) hide show
  1. package/CHANGELOG.md +23 -7
  2. package/README.md +2 -4
  3. package/dist/cli/args.d.ts +6 -128
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +277 -472
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/config-selector.d.ts +9 -62
  8. package/dist/cli/config-selector.d.ts.map +1 -1
  9. package/dist/cli/config-selector.js +31 -146
  10. package/dist/cli/config-selector.js.map +1 -1
  11. package/dist/cli/file-processor.d.ts +1 -69
  12. package/dist/cli/file-processor.d.ts.map +1 -1
  13. package/dist/cli/file-processor.js +36 -267
  14. package/dist/cli/file-processor.js.map +1 -1
  15. package/dist/cli/list-models.d.ts +0 -60
  16. package/dist/cli/list-models.d.ts.map +1 -1
  17. package/dist/cli/list-models.js +53 -246
  18. package/dist/cli/list-models.js.map +1 -1
  19. package/dist/cli/session-picker.d.ts +1 -72
  20. package/dist/cli/session-picker.d.ts.map +1 -1
  21. package/dist/cli/session-picker.js +57 -231
  22. package/dist/cli/session-picker.js.map +1 -1
  23. package/dist/cli.js +25 -31
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config.d.ts +0 -42
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +62 -97
  28. package/dist/config.js.map +1 -1
  29. package/dist/core/agent-session.d.ts +23 -0
  30. package/dist/core/agent-session.d.ts.map +1 -1
  31. package/dist/core/agent-session.js +78 -66
  32. package/dist/core/agent-session.js.map +1 -1
  33. package/dist/core/auth-storage.d.ts +4 -95
  34. package/dist/core/auth-storage.d.ts.map +1 -1
  35. package/dist/core/auth-storage.js +233 -288
  36. package/dist/core/auth-storage.js.map +1 -1
  37. package/dist/core/bash-executor.d.ts +0 -323
  38. package/dist/core/bash-executor.d.ts.map +1 -1
  39. package/dist/core/bash-executor.js +126 -359
  40. package/dist/core/bash-executor.js.map +1 -1
  41. package/dist/core/compaction/branch-summarization.d.ts +3 -3
  42. package/dist/core/compaction/branch-summarization.js +16 -16
  43. package/dist/core/compaction/branch-summarization.js.map +1 -1
  44. package/dist/core/compaction/compaction.d.ts +3 -3
  45. package/dist/core/compaction/compaction.js +40 -40
  46. package/dist/core/compaction/compaction.js.map +1 -1
  47. package/dist/core/compaction/index.d.ts +32 -4
  48. package/dist/core/compaction/index.d.ts.map +1 -1
  49. package/dist/core/compaction/index.js +30 -4
  50. package/dist/core/compaction/index.js.map +1 -1
  51. package/dist/core/compaction/utils.d.ts +1 -19
  52. package/dist/core/compaction/utils.d.ts.map +1 -1
  53. package/dist/core/compaction/utils.js +92 -113
  54. package/dist/core/compaction/utils.js.map +1 -1
  55. package/dist/core/discover-packages.d.ts +0 -4
  56. package/dist/core/discover-packages.d.ts.map +1 -1
  57. package/dist/core/discover-packages.js +41 -44
  58. package/dist/core/discover-packages.js.map +1 -1
  59. package/dist/core/event-bus.d.ts +1 -147
  60. package/dist/core/event-bus.d.ts.map +1 -1
  61. package/dist/core/event-bus.js +17 -106
  62. package/dist/core/event-bus.js.map +1 -1
  63. package/dist/core/exec.d.ts +0 -16
  64. package/dist/core/exec.d.ts.map +1 -1
  65. package/dist/core/exec.js +18 -27
  66. package/dist/core/exec.js.map +1 -1
  67. package/dist/core/export-html/ansi-to-html.ts +262 -0
  68. package/dist/core/export-html/index.ts +433 -0
  69. package/dist/core/export-html/template.html +48 -26
  70. package/dist/core/export-html/tool-renderer.d.ts +0 -21
  71. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  72. package/dist/core/export-html/tool-renderer.js +35 -51
  73. package/dist/core/export-html/tool-renderer.js.map +1 -1
  74. package/dist/core/export-html/tool-renderer.ts +80 -0
  75. package/dist/core/export-html/vendor/highlight.min.js +401 -370
  76. package/dist/core/export-html/vendor/marked.min.js +71 -3
  77. package/dist/core/extensions/index.d.ts +7 -4
  78. package/dist/core/extensions/index.d.ts.map +1 -1
  79. package/dist/core/extensions/index.js +17 -3
  80. package/dist/core/extensions/index.js.map +1 -1
  81. package/dist/core/extensions/loader.d.ts +0 -6
  82. package/dist/core/extensions/loader.d.ts.map +1 -1
  83. package/dist/core/extensions/loader.js +60 -56
  84. package/dist/core/extensions/loader.js.map +1 -1
  85. package/dist/core/extensions/runner.d.ts +3 -0
  86. package/dist/core/extensions/runner.d.ts.map +1 -1
  87. package/dist/core/extensions/runner.js +48 -80
  88. package/dist/core/extensions/runner.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +50 -23
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/footer-data-provider.d.ts +2 -15
  92. package/dist/core/footer-data-provider.d.ts.map +1 -1
  93. package/dist/core/footer-data-provider.js +21 -33
  94. package/dist/core/footer-data-provider.js.map +1 -1
  95. package/dist/core/hooks/loader.js +2 -2
  96. package/dist/core/hooks/loader.js.map +1 -1
  97. package/dist/core/index.d.ts +29 -10
  98. package/dist/core/index.d.ts.map +1 -1
  99. package/dist/core/index.js +29 -10
  100. package/dist/core/index.js.map +1 -1
  101. package/dist/core/keybindings.d.ts +2 -179
  102. package/dist/core/keybindings.d.ts.map +1 -1
  103. package/dist/core/keybindings.js +64 -238
  104. package/dist/core/keybindings.js.map +1 -1
  105. package/dist/core/model-registry.d.ts +26 -181
  106. package/dist/core/model-registry.d.ts.map +1 -1
  107. package/dist/core/model-registry.js +228 -407
  108. package/dist/core/model-registry.js.map +1 -1
  109. package/dist/core/model-resolver.d.ts +0 -139
  110. package/dist/core/model-resolver.d.ts.map +1 -1
  111. package/dist/core/model-resolver.js +36 -217
  112. package/dist/core/model-resolver.js.map +1 -1
  113. package/dist/core/package-manager.d.ts +25 -57
  114. package/dist/core/package-manager.d.ts.map +1 -1
  115. package/dist/core/package-manager.js +326 -964
  116. package/dist/core/package-manager.js.map +1 -1
  117. package/dist/core/prompt-templates.d.ts +2 -34
  118. package/dist/core/prompt-templates.d.ts.map +1 -1
  119. package/dist/core/prompt-templates.js +122 -170
  120. package/dist/core/prompt-templates.js.map +1 -1
  121. package/dist/core/resource-loader.d.ts +19 -12
  122. package/dist/core/resource-loader.d.ts.map +1 -1
  123. package/dist/core/resource-loader.js +353 -467
  124. package/dist/core/resource-loader.js.map +1 -1
  125. package/dist/core/sdk.d.ts +2 -61
  126. package/dist/core/sdk.d.ts.map +1 -1
  127. package/dist/core/sdk.js +184 -252
  128. package/dist/core/sdk.js.map +1 -1
  129. package/dist/core/session-manager.d.ts +447 -1
  130. package/dist/core/session-manager.d.ts.map +1 -1
  131. package/dist/core/session-manager.js +1176 -1
  132. package/dist/core/session-manager.js.map +1 -1
  133. package/dist/core/settings-manager.d.ts +9 -12
  134. package/dist/core/settings-manager.d.ts.map +1 -1
  135. package/dist/core/settings-manager.js +170 -398
  136. package/dist/core/settings-manager.js.map +1 -1
  137. package/dist/core/skills.d.ts +2 -27
  138. package/dist/core/skills.d.ts.map +1 -1
  139. package/dist/core/skills.js +149 -212
  140. package/dist/core/skills.js.map +1 -1
  141. package/dist/core/subagents.d.ts +2 -2
  142. package/dist/core/subagents.d.ts.map +1 -1
  143. package/dist/core/subagents.js +21 -14
  144. package/dist/core/subagents.js.map +1 -1
  145. package/dist/core/system-prompt.d.ts +0 -11
  146. package/dist/core/system-prompt.d.ts.map +1 -1
  147. package/dist/core/system-prompt.js +168 -139
  148. package/dist/core/system-prompt.js.map +1 -1
  149. package/dist/core/timings.d.ts +1 -4
  150. package/dist/core/timings.d.ts.map +1 -1
  151. package/dist/core/timings.js +34 -18
  152. package/dist/core/timings.js.map +1 -1
  153. package/dist/core/todo-store.d.ts +20 -0
  154. package/dist/core/todo-store.d.ts.map +1 -0
  155. package/dist/core/todo-store.js +60 -0
  156. package/dist/core/todo-store.js.map +1 -0
  157. package/dist/core/tools/bash.d.ts +2 -0
  158. package/dist/core/tools/bash.d.ts.map +1 -0
  159. package/dist/core/tools/bash.js +2 -0
  160. package/dist/core/tools/bash.js.map +1 -0
  161. package/dist/core/tools/bg-process.d.ts +1 -6
  162. package/dist/core/tools/bg-process.d.ts.map +1 -1
  163. package/dist/core/tools/bg-process.js +4 -18
  164. package/dist/core/tools/bg-process.js.map +1 -1
  165. package/dist/core/tools/edit-diff.d.ts +9 -0
  166. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  167. package/dist/core/tools/edit-diff.js +2 -0
  168. package/dist/core/tools/edit-diff.js.map +1 -0
  169. package/dist/core/tools/edit.d.ts +2 -0
  170. package/dist/core/tools/edit.d.ts.map +1 -0
  171. package/dist/core/tools/edit.js +2 -0
  172. package/dist/core/tools/edit.js.map +1 -0
  173. package/dist/core/tools/find.d.ts +2 -0
  174. package/dist/core/tools/find.d.ts.map +1 -0
  175. package/dist/core/tools/find.js +2 -0
  176. package/dist/core/tools/find.js.map +1 -0
  177. package/dist/core/tools/grep.d.ts +2 -0
  178. package/dist/core/tools/grep.d.ts.map +1 -0
  179. package/dist/core/tools/grep.js +2 -0
  180. package/dist/core/tools/grep.js.map +1 -0
  181. package/dist/core/tools/index.d.ts +7 -1
  182. package/dist/core/tools/index.d.ts.map +1 -1
  183. package/dist/core/tools/ls.d.ts +2 -0
  184. package/dist/core/tools/ls.d.ts.map +1 -0
  185. package/dist/core/tools/ls.js +2 -0
  186. package/dist/core/tools/ls.js.map +1 -0
  187. package/dist/core/tools/path-utils.d.ts +2 -0
  188. package/dist/core/tools/path-utils.d.ts.map +1 -0
  189. package/dist/core/tools/path-utils.js +2 -0
  190. package/dist/core/tools/path-utils.js.map +1 -0
  191. package/dist/core/tools/read.d.ts +2 -0
  192. package/dist/core/tools/read.d.ts.map +1 -0
  193. package/dist/core/tools/read.js +2 -0
  194. package/dist/core/tools/read.js.map +1 -0
  195. package/dist/core/tools/registry.d.ts +0 -15
  196. package/dist/core/tools/registry.d.ts.map +1 -1
  197. package/dist/core/tools/registry.js +13 -37
  198. package/dist/core/tools/registry.js.map +1 -1
  199. package/dist/core/tools/task.d.ts +17 -23
  200. package/dist/core/tools/task.d.ts.map +1 -1
  201. package/dist/core/tools/task.js +43 -82
  202. package/dist/core/tools/task.js.map +1 -1
  203. package/dist/core/tools/todo.d.ts +17 -20
  204. package/dist/core/tools/todo.d.ts.map +1 -1
  205. package/dist/core/tools/todo.js +79 -58
  206. package/dist/core/tools/todo.js.map +1 -1
  207. package/dist/core/tools/truncate.d.ts +2 -0
  208. package/dist/core/tools/truncate.d.ts.map +1 -0
  209. package/dist/core/tools/truncate.js +2 -0
  210. package/dist/core/tools/truncate.js.map +1 -0
  211. package/dist/core/tools/webfetch.d.ts +2 -0
  212. package/dist/core/tools/webfetch.d.ts.map +1 -0
  213. package/dist/core/tools/webfetch.js +2 -0
  214. package/dist/core/tools/webfetch.js.map +1 -0
  215. package/dist/core/tools/websearch.d.ts +2 -0
  216. package/dist/core/tools/websearch.d.ts.map +1 -0
  217. package/dist/core/tools/websearch.js +2 -0
  218. package/dist/core/tools/websearch.js.map +1 -0
  219. package/dist/core/tools/write.d.ts +2 -0
  220. package/dist/core/tools/write.d.ts.map +1 -0
  221. package/dist/core/tools/write.js +2 -0
  222. package/dist/core/tools/write.js.map +1 -0
  223. package/dist/index.d.ts +35 -29
  224. package/dist/index.d.ts.map +1 -1
  225. package/dist/index.js +33 -41
  226. package/dist/index.js.map +1 -1
  227. package/dist/main.d.ts.map +1 -1
  228. package/dist/main.js +237 -225
  229. package/dist/main.js.map +1 -1
  230. package/dist/migrations.d.ts +0 -25
  231. package/dist/migrations.d.ts.map +1 -1
  232. package/dist/migrations.js +129 -180
  233. package/dist/migrations.js.map +1 -1
  234. package/dist/modes/index.d.ts +13 -6
  235. package/dist/modes/index.d.ts.map +1 -1
  236. package/dist/modes/index.js +11 -5
  237. package/dist/modes/index.js.map +1 -1
  238. package/dist/modes/interactive/components/armin.d.ts +8 -23
  239. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/armin.js +217 -266
  241. package/dist/modes/interactive/components/armin.js.map +1 -1
  242. package/dist/modes/interactive/components/assistant-message.d.ts +2 -168
  243. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  244. package/dist/modes/interactive/components/assistant-message.js +61 -216
  245. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  246. package/dist/modes/interactive/components/bash-execution.d.ts +6 -313
  247. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  248. package/dist/modes/interactive/components/bash-execution.js +86 -403
  249. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  250. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -3
  251. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  252. package/dist/modes/interactive/components/bordered-loader.js +59 -29
  253. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  254. package/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
  255. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  256. package/dist/modes/interactive/components/branch-summary-message.js +30 -17
  257. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  258. package/dist/modes/interactive/components/compaction-summary-message.d.ts +3 -3
  259. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  260. package/dist/modes/interactive/components/compaction-summary-message.js +35 -18
  261. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  262. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  263. package/dist/modes/interactive/components/config-selector.js +60 -68
  264. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  265. package/dist/modes/interactive/components/countdown-timer.d.ts +2 -6
  266. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  267. package/dist/modes/interactive/components/countdown-timer.js +32 -18
  268. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  269. package/dist/modes/interactive/components/custom-editor.d.ts +1 -5
  270. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  271. package/dist/modes/interactive/components/custom-editor.js +45 -37
  272. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  273. package/dist/modes/interactive/components/custom-message.d.ts +5 -6
  274. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  275. package/dist/modes/interactive/components/custom-message.js +43 -53
  276. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  277. package/dist/modes/interactive/components/diff.d.ts +0 -3
  278. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  279. package/dist/modes/interactive/components/diff.js +101 -108
  280. package/dist/modes/interactive/components/diff.js.map +1 -1
  281. package/dist/modes/interactive/components/dynamic-border.d.ts +7 -2
  282. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  283. package/dist/modes/interactive/components/dynamic-border.js +24 -4
  284. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  285. package/dist/modes/interactive/components/extension-editor.d.ts +5 -9
  286. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  287. package/dist/modes/interactive/components/extension-editor.js +43 -46
  288. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  289. package/dist/modes/interactive/components/extension-input.d.ts +4 -9
  290. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  291. package/dist/modes/interactive/components/extension-input.js +45 -28
  292. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  293. package/dist/modes/interactive/components/extension-selector.d.ts +7 -12
  294. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  295. package/dist/modes/interactive/components/extension-selector.js +54 -32
  296. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  297. package/dist/modes/interactive/components/footer.d.ts +2 -11
  298. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  299. package/dist/modes/interactive/components/footer.js +135 -183
  300. package/dist/modes/interactive/components/footer.js.map +1 -1
  301. package/dist/modes/interactive/components/index.d.ts +79 -30
  302. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  303. package/dist/modes/interactive/components/index.js +73 -31
  304. package/dist/modes/interactive/components/index.js.map +1 -1
  305. package/dist/modes/interactive/components/keybinding-hints.d.ts +0 -18
  306. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  307. package/dist/modes/interactive/components/keybinding-hints.js +24 -31
  308. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  309. package/dist/modes/interactive/components/login-dialog.d.ts +11 -24
  310. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  311. package/dist/modes/interactive/components/login-dialog.js +89 -86
  312. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  313. package/dist/modes/interactive/components/model-selector.d.ts +15 -19
  314. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  315. package/dist/modes/interactive/components/model-selector.js +104 -157
  316. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  317. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  318. package/dist/modes/interactive/components/oauth-selector.js +5 -5
  319. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  320. package/dist/modes/interactive/components/scoped-models-selector.d.ts +12 -22
  321. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  322. package/dist/modes/interactive/components/scoped-models-selector.js +111 -132
  323. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  324. package/dist/modes/interactive/components/session-selector-search.d.ts +3 -3
  325. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  326. package/dist/modes/interactive/components/session-selector-search.js +92 -103
  327. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  328. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  329. package/dist/modes/interactive/components/session-selector.js +28 -39
  330. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  331. package/dist/modes/interactive/components/settings-selector.d.ts +1 -1
  332. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  333. package/dist/modes/interactive/components/settings-selector.js +111 -203
  334. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  335. package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
  336. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  337. package/dist/modes/interactive/components/show-images-selector.js +17 -19
  338. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  339. package/dist/modes/interactive/components/skill-invocation-message.d.ts +3 -3
  340. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  341. package/dist/modes/interactive/components/skill-invocation-message.js +29 -19
  342. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  343. package/dist/modes/interactive/components/theme-selector.d.ts +2 -2
  344. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  345. package/dist/modes/interactive/components/theme-selector.js +20 -25
  346. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  347. package/dist/modes/interactive/components/thinking-selector.d.ts +1 -1
  348. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  349. package/dist/modes/interactive/components/thinking-selector.js +19 -20
  350. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  351. package/dist/modes/interactive/components/tool-execution.d.ts +12 -10
  352. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  353. package/dist/modes/interactive/components/tool-execution.js +14 -8
  354. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  355. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  356. package/dist/modes/interactive/components/tree-selector.js +53 -60
  357. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  358. package/dist/modes/interactive/components/user-message-selector.d.ts +3 -9
  359. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  360. package/dist/modes/interactive/components/user-message-selector.js +57 -68
  361. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  362. package/dist/modes/interactive/components/visual-truncate.d.ts +0 -12
  363. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/visual-truncate.js +14 -22
  365. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  366. package/dist/modes/interactive/interactive-mode.d.ts +6 -0
  367. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  368. package/dist/modes/interactive/interactive-mode.js +118 -113
  369. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  370. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  371. package/dist/modes/interactive/theme/theme.js +189 -39
  372. package/dist/modes/interactive/theme/theme.js.map +1 -1
  373. package/dist/modes/rpc/rpc-client.d.ts +8 -1
  374. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  375. package/dist/modes/rpc/rpc-client.js +88 -59
  376. package/dist/modes/rpc/rpc-client.js.map +1 -1
  377. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  378. package/dist/modes/rpc/rpc-mode.js +24 -46
  379. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  380. package/dist/modes/rpc/rpc-types.d.ts +75 -409
  381. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  382. package/dist/modes/rpc/rpc-types.js +21 -360
  383. package/dist/modes/rpc/rpc-types.js.map +1 -1
  384. package/dist/observability/core/config.d.ts +28 -0
  385. package/dist/observability/core/config.d.ts.map +1 -0
  386. package/dist/observability/core/config.js +150 -0
  387. package/dist/observability/core/config.js.map +1 -0
  388. package/dist/observability/core/event-bus.d.ts +15 -0
  389. package/dist/observability/core/event-bus.d.ts.map +1 -0
  390. package/dist/observability/core/event-bus.js +37 -0
  391. package/dist/observability/core/event-bus.js.map +1 -0
  392. package/dist/observability/core/index.d.ts +12 -0
  393. package/dist/observability/core/index.d.ts.map +1 -0
  394. package/dist/observability/core/index.js +14 -0
  395. package/dist/observability/core/index.js.map +1 -0
  396. package/dist/observability/core/observability.d.ts +63 -0
  397. package/dist/observability/core/observability.d.ts.map +1 -0
  398. package/dist/observability/core/observability.js +127 -0
  399. package/dist/observability/core/observability.js.map +1 -0
  400. package/dist/observability/core/span.d.ts +37 -0
  401. package/dist/observability/core/span.d.ts.map +1 -0
  402. package/dist/observability/core/span.js +90 -0
  403. package/dist/observability/core/span.js.map +1 -0
  404. package/dist/observability/core/tracer.d.ts +22 -0
  405. package/dist/observability/core/tracer.d.ts.map +1 -0
  406. package/dist/observability/core/tracer.js +79 -0
  407. package/dist/observability/core/tracer.js.map +1 -0
  408. package/dist/observability/core/types.d.ts +155 -0
  409. package/dist/observability/core/types.d.ts.map +1 -0
  410. package/dist/observability/core/types.js +38 -0
  411. package/dist/observability/core/types.js.map +1 -0
  412. package/dist/observability/exporters/base-exporter.d.ts +16 -0
  413. package/dist/observability/exporters/base-exporter.d.ts.map +1 -0
  414. package/dist/observability/exporters/base-exporter.js +26 -0
  415. package/dist/observability/exporters/base-exporter.js.map +1 -0
  416. package/dist/observability/exporters/console-exporter.d.ts +22 -0
  417. package/dist/observability/exporters/console-exporter.d.ts.map +1 -0
  418. package/dist/observability/exporters/console-exporter.js +80 -0
  419. package/dist/observability/exporters/console-exporter.js.map +1 -0
  420. package/dist/observability/exporters/file-exporter.d.ts +31 -0
  421. package/dist/observability/exporters/file-exporter.d.ts.map +1 -0
  422. package/dist/observability/exporters/file-exporter.js +120 -0
  423. package/dist/observability/exporters/file-exporter.js.map +1 -0
  424. package/dist/observability/exporters/index.d.ts +12 -0
  425. package/dist/observability/exporters/index.d.ts.map +1 -0
  426. package/dist/observability/exporters/index.js +11 -0
  427. package/dist/observability/exporters/index.js.map +1 -0
  428. package/dist/observability/exporters/langfuse-exporter.d.ts +27 -0
  429. package/dist/observability/exporters/langfuse-exporter.d.ts.map +1 -0
  430. package/dist/observability/exporters/langfuse-exporter.js +146 -0
  431. package/dist/observability/exporters/langfuse-exporter.js.map +1 -0
  432. package/dist/observability/exporters/sentry-exporter.d.ts +22 -0
  433. package/dist/observability/exporters/sentry-exporter.d.ts.map +1 -0
  434. package/dist/observability/exporters/sentry-exporter.js +121 -0
  435. package/dist/observability/exporters/sentry-exporter.js.map +1 -0
  436. package/dist/observability/index.d.ts +3 -0
  437. package/dist/observability/index.d.ts.map +1 -0
  438. package/dist/observability/index.js +3 -0
  439. package/dist/observability/index.js.map +1 -0
  440. package/dist/utils/changelog.d.ts +1 -2
  441. package/dist/utils/changelog.d.ts.map +1 -1
  442. package/dist/utils/changelog.js +53 -61
  443. package/dist/utils/changelog.js.map +1 -1
  444. package/dist/utils/clipboard-image.d.ts.map +1 -1
  445. package/dist/utils/clipboard-image.js +77 -83
  446. package/dist/utils/clipboard-image.js.map +1 -1
  447. package/dist/utils/clipboard.d.ts.map +1 -1
  448. package/dist/utils/clipboard.js +62 -49
  449. package/dist/utils/clipboard.js.map +1 -1
  450. package/dist/utils/image-convert.d.ts +6 -6
  451. package/dist/utils/image-convert.d.ts.map +1 -1
  452. package/dist/utils/image-convert.js +29 -23
  453. package/dist/utils/image-convert.js.map +1 -1
  454. package/dist/utils/image-resize.d.ts +0 -17
  455. package/dist/utils/image-resize.d.ts.map +1 -1
  456. package/dist/utils/image-resize.js +100 -138
  457. package/dist/utils/image-resize.js.map +1 -1
  458. package/dist/utils/mime.d.ts +1 -0
  459. package/dist/utils/mime.d.ts.map +1 -1
  460. package/dist/utils/mime.js +35 -15
  461. package/dist/utils/mime.js.map +1 -1
  462. package/dist/utils/photon.d.ts +4 -15
  463. package/dist/utils/photon.d.ts.map +1 -1
  464. package/dist/utils/photon.js +71 -60
  465. package/dist/utils/photon.js.map +1 -1
  466. package/dist/utils/shell.d.ts +4 -21
  467. package/dist/utils/shell.d.ts.map +1 -1
  468. package/dist/utils/shell.js +101 -124
  469. package/dist/utils/shell.js.map +1 -1
  470. package/dist/utils/sleep.d.ts +1 -1
  471. package/dist/utils/sleep.d.ts.map +1 -1
  472. package/dist/utils/sleep.js +32 -8
  473. package/dist/utils/sleep.js.map +1 -1
  474. package/dist/utils/tools-manager.d.ts +4 -2
  475. package/dist/utils/tools-manager.d.ts.map +1 -1
  476. package/dist/utils/tools-manager.js +96 -122
  477. package/dist/utils/tools-manager.js.map +1 -1
  478. package/docs/PI_MONO_MIT_REMOVAL_GUIDE.md +2132 -0
  479. package/docs/SAME_TO_SAME_PARITY_REPORT.md +312 -0
  480. package/examples/README.md +12 -0
  481. package/package.json +60 -88
  482. package/LICENSE.md +0 -22
  483. package/dist/modes/interactive/theme/dark.json +0 -85
  484. package/dist/modes/interactive/theme/light.json +0 -84
  485. package/dist/modes/interactive/theme/theme-schema.json +0 -335
  486. package/docs/FEATURES.md +0 -306
  487. package/docs/MCP.md +0 -341
  488. package/docs/MEMORY.md +0 -443
  489. package/examples/mcp-servers.example.json +0 -50
@@ -1,174 +1,200 @@
1
- /**
2
- * Credential storage for API keys and OAuth tokens.
3
- * Handles loading, saving, and refreshing credentials from auth.json.
4
- *
5
- * MULTI-ACCOUNT SUPPORT: Each provider can have multiple named accounts.
6
- *
7
- * Uses file locking to prevent race conditions when multiple indusagi instances
8
- * try to refresh tokens simultaneously.
9
- */
10
1
  import { getEnvApiKey, getOAuthApiKey, getOAuthProvider, getOAuthProviders, } from "indusagi/ai";
11
- import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
2
+ import { chmodSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "fs";
12
3
  import { dirname, join } from "path";
13
4
  import lockfile from "proper-lockfile";
14
5
  import { getAgentDir } from "../config.js";
15
- /**
16
- * Credential storage backed by a JSON file.
17
- * Supports multiple accounts per provider.
18
- */
19
- export class AuthStorage {
20
- constructor(authPath = join(getAgentDir(), "auth.json")) {
21
- this.authPath = authPath;
22
- this.data = {};
23
- this.runtimeOverrides = new Map(); // provider -> accountId -> apiKey
24
- this.defaultAccounts = new Map(); // provider -> default accountId
25
- this.reload();
6
+ function resolveAuthPath(input) {
7
+ if (!input) {
8
+ return join(getAgentDir(), "auth.json");
9
+ }
10
+ if (input.endsWith(".json")) {
11
+ return input;
12
+ }
13
+ try {
14
+ if (existsSync(input) && statSync(input).isDirectory()) {
15
+ return join(input, "auth.json");
16
+ }
17
+ }
18
+ catch {
19
+ // Fall through to path join below.
20
+ }
21
+ return join(input, "auth.json");
22
+ }
23
+ function cloneCredential(credential) {
24
+ return { ...credential };
25
+ }
26
+ function cloneStorageData(data) {
27
+ const cloned = {};
28
+ for (const [provider, accounts] of Object.entries(data)) {
29
+ cloned[provider] = {};
30
+ for (const [accountId, credential] of Object.entries(accounts)) {
31
+ cloned[provider][accountId] = cloneCredential(credential);
32
+ }
33
+ }
34
+ return cloned;
35
+ }
36
+ function ensureStorageFile(filePath) {
37
+ const storageDir = dirname(filePath);
38
+ if (!existsSync(storageDir)) {
39
+ mkdirSync(storageDir, { recursive: true, mode: 0o700 });
26
40
  }
27
- /**
28
- * Migrate from legacy single-account format to multi-account format
29
- */
30
- migrateLegacyData(legacyData) {
31
- const migrated = {};
32
- for (const [provider, credential] of Object.entries(legacyData)) {
33
- // Create default account for legacy credential
34
- const accountId = "default";
35
- const accountName = "Default";
36
- if (!migrated[provider]) {
37
- migrated[provider] = {};
41
+ if (!existsSync(filePath)) {
42
+ writeFileSync(filePath, "{}", "utf-8");
43
+ chmodSync(filePath, 0o600);
44
+ }
45
+ }
46
+ function isLegacyFormat(data) {
47
+ if (!data || typeof data !== "object") {
48
+ return false;
49
+ }
50
+ for (const [key, value] of Object.entries(data)) {
51
+ if (key.startsWith("_")) {
52
+ continue;
53
+ }
54
+ if (value && typeof value === "object" && "type" in value) {
55
+ return true;
56
+ }
57
+ }
58
+ return false;
59
+ }
60
+ function migrateLegacyData(legacyData) {
61
+ const migrated = {};
62
+ for (const [provider, credential] of Object.entries(legacyData)) {
63
+ migrated[provider] = {
64
+ default: {
65
+ ...credential,
66
+ accountId: "default",
67
+ accountName: credential.accountName || "Default",
68
+ },
69
+ };
70
+ }
71
+ return migrated;
72
+ }
73
+ function normalizeAuthData(raw) {
74
+ if (!raw || typeof raw !== "object") {
75
+ return { data: {}, defaults: new Map(), migrated: false };
76
+ }
77
+ const payload = raw;
78
+ if (isLegacyFormat(payload)) {
79
+ return {
80
+ data: migrateLegacyData(payload),
81
+ defaults: new Map(),
82
+ migrated: true,
83
+ };
84
+ }
85
+ const data = {};
86
+ for (const [provider, accounts] of Object.entries(payload)) {
87
+ if (provider.startsWith("_")) {
88
+ continue;
89
+ }
90
+ if (!accounts || typeof accounts !== "object") {
91
+ continue;
92
+ }
93
+ data[provider] = {};
94
+ for (const [accountId, credential] of Object.entries(accounts)) {
95
+ if (!credential || typeof credential !== "object") {
96
+ continue;
38
97
  }
39
- migrated[provider][accountId] = {
98
+ data[provider][accountId] = {
40
99
  ...credential,
41
100
  accountId,
42
- accountName,
101
+ accountName: credential.accountName || accountId,
43
102
  };
44
103
  }
45
- return migrated;
46
104
  }
47
- /**
48
- * Set a runtime API key override (not persisted to disk).
49
- * Used for CLI --api-key flag.
50
- */
51
- setRuntimeApiKey(provider, apiKey, accountId = "default") {
52
- if (!this.runtimeOverrides.has(provider)) {
53
- this.runtimeOverrides.set(provider, new Map());
105
+ return {
106
+ data,
107
+ defaults: new Map(Object.entries(payload._defaults ?? {})),
108
+ migrated: false,
109
+ };
110
+ }
111
+ function getConfiguredDefaultAccount(provider, defaults) {
112
+ const envKey = `INDUSAGI_DEFAULT_ACCOUNT_${provider.replace(/-/g, "_").toUpperCase()}`;
113
+ return process.env[envKey] || defaults.get(provider);
114
+ }
115
+ function selectAccountId(provider, requestedAccountId, defaults) {
116
+ return requestedAccountId || getConfiguredDefaultAccount(provider, defaults) || "default";
117
+ }
118
+ function collectOAuthCredentials(accounts) {
119
+ const result = {};
120
+ for (const [accountId, credential] of Object.entries(accounts ?? {})) {
121
+ if (credential.type === "oauth") {
122
+ result[accountId] = credential;
54
123
  }
55
- this.runtimeOverrides.get(provider).set(accountId, apiKey);
56
124
  }
57
- /**
58
- * Remove a runtime API key override.
59
- */
125
+ return result;
126
+ }
127
+ export class AuthStorage {
128
+ constructor(authPathOrAgentDir) {
129
+ this.data = {};
130
+ this.runtimeOverrides = new Map();
131
+ this.defaultAccounts = new Map();
132
+ this.authPath = resolveAuthPath(authPathOrAgentDir);
133
+ this.reload();
134
+ }
135
+ setRuntimeApiKey(provider, apiKey, accountId = "default") {
136
+ const providerOverrides = this.runtimeOverrides.get(provider) ?? new Map();
137
+ providerOverrides.set(accountId, apiKey);
138
+ this.runtimeOverrides.set(provider, providerOverrides);
139
+ }
60
140
  removeRuntimeApiKey(provider, accountId) {
61
- if (accountId) {
62
- this.runtimeOverrides.get(provider)?.delete(accountId);
63
- }
64
- else {
141
+ if (!accountId) {
65
142
  this.runtimeOverrides.delete(provider);
143
+ return;
66
144
  }
145
+ this.runtimeOverrides.get(provider)?.delete(accountId);
67
146
  }
68
- /**
69
- * Set default account for a provider
70
- */
71
147
  setDefaultAccount(provider, accountId) {
72
148
  this.defaultAccounts.set(provider, accountId);
73
149
  }
74
- /**
75
- * Get default account for a provider
76
- */
77
150
  getDefaultAccount(provider) {
78
- // Check env var first
79
- const envDefault = process.env[`INDUSAGI_DEFAULT_ACCOUNT_${provider.replace(/-/g, '_').toUpperCase()}`];
80
- if (envDefault)
81
- return envDefault;
82
- // Then check saved default
83
- return this.defaultAccounts.get(provider);
84
- }
85
- /**
86
- * Set a fallback resolver for API keys not found in auth.json or env vars.
87
- * Used for custom provider keys from models.json.
88
- */
151
+ return getConfiguredDefaultAccount(provider, this.defaultAccounts);
152
+ }
89
153
  setFallbackResolver(resolver) {
90
154
  this.fallbackResolver = resolver;
91
155
  }
92
- /**
93
- * Reload credentials from disk.
94
- */
95
156
  reload() {
96
157
  if (!existsSync(this.authPath)) {
97
158
  this.data = {};
159
+ this.defaultAccounts = new Map();
98
160
  return;
99
161
  }
100
162
  try {
101
163
  const raw = JSON.parse(readFileSync(this.authPath, "utf-8"));
102
- // Detect legacy format and migrate
103
- if (this.isLegacyFormat(raw)) {
104
- this.data = this.migrateLegacyData(raw);
105
- this.save(); // Save in new format
106
- }
107
- else {
108
- this.data = raw;
109
- }
110
- // Load default accounts
111
- if (raw._defaults) {
112
- this.defaultAccounts = new Map(Object.entries(raw._defaults));
164
+ const normalized = normalizeAuthData(raw);
165
+ this.data = normalized.data;
166
+ this.defaultAccounts = normalized.defaults;
167
+ if (normalized.migrated) {
168
+ this.save();
113
169
  }
114
170
  }
115
171
  catch {
116
172
  this.data = {};
173
+ this.defaultAccounts = new Map();
117
174
  }
118
175
  }
119
- /**
120
- * Check if data is in legacy format (single account per provider)
121
- */
122
- isLegacyFormat(data) {
123
- if (!data || typeof data !== "object")
124
- return false;
125
- for (const [key, value] of Object.entries(data)) {
126
- if (key.startsWith("_"))
127
- continue; // Skip metadata
128
- // If value has 'type' field directly, it's legacy format
129
- if (value && typeof value === "object" && value.type) {
130
- return true;
131
- }
132
- }
133
- return false;
134
- }
135
- /**
136
- * Save credentials to disk.
137
- */
138
- save() {
139
- const dir = dirname(this.authPath);
140
- if (!existsSync(dir)) {
141
- mkdirSync(dir, { recursive: true, mode: 0o700 });
142
- }
143
- // Include defaults in saved data
144
- const dataToSave = {
145
- ...this.data,
176
+ persistAuthData() {
177
+ ensureStorageFile(this.authPath);
178
+ const payload = {
179
+ ...cloneStorageData(this.data),
146
180
  _defaults: Object.fromEntries(this.defaultAccounts),
147
181
  };
148
- writeFileSync(this.authPath, JSON.stringify(dataToSave, null, 2), "utf-8");
182
+ writeFileSync(this.authPath, JSON.stringify(payload, null, 2), "utf-8");
149
183
  chmodSync(this.authPath, 0o600);
150
184
  }
151
- /**
152
- * Get credential for a provider and account.
153
- */
185
+ save() {
186
+ this.persistAuthData();
187
+ }
154
188
  get(provider, accountId = "default") {
155
- return this.data[provider]?.[accountId];
189
+ const credential = this.data[provider]?.[accountId];
190
+ return credential ? cloneCredential(credential) : undefined;
156
191
  }
157
- /**
158
- * Get all accounts for a provider.
159
- */
160
192
  getAccounts(provider) {
161
- const providerData = this.data[provider];
162
- if (!providerData)
163
- return [];
164
- return Object.entries(providerData).map(([accountId, credential]) => ({
193
+ return Object.entries(this.data[provider] ?? {}).map(([accountId, credential]) => ({
165
194
  accountId,
166
- credential,
195
+ credential: cloneCredential(credential),
167
196
  }));
168
197
  }
169
- /**
170
- * Set credential for a provider and account.
171
- */
172
198
  set(provider, accountId, credential) {
173
199
  if (!this.data[provider]) {
174
200
  this.data[provider] = {};
@@ -178,171 +204,110 @@ export class AuthStorage {
178
204
  accountId,
179
205
  accountName: credential.accountName || accountId,
180
206
  };
181
- // If this is the first account, set it as default
182
207
  if (Object.keys(this.data[provider]).length === 1) {
183
- this.setDefaultAccount(provider, accountId);
208
+ this.defaultAccounts.set(provider, accountId);
184
209
  }
185
210
  this.save();
186
211
  }
187
- /**
188
- * Remove credential for a provider and account.
189
- */
190
212
  remove(provider, accountId) {
191
- if (accountId) {
192
- delete this.data[provider]?.[accountId];
193
- // If we removed the default, pick a new one
194
- if (this.getDefaultAccount(provider) === accountId) {
195
- const remaining = this.getAccounts(provider);
196
- if (remaining.length > 0) {
197
- this.setDefaultAccount(provider, remaining[0].accountId);
198
- }
199
- else {
200
- this.defaultAccounts.delete(provider);
201
- }
213
+ if (!accountId) {
214
+ delete this.data[provider];
215
+ this.defaultAccounts.delete(provider);
216
+ this.save();
217
+ return;
218
+ }
219
+ delete this.data[provider]?.[accountId];
220
+ if (this.getDefaultAccount(provider) === accountId) {
221
+ const remainingAccounts = Object.keys(this.data[provider] ?? {});
222
+ if (remainingAccounts.length > 0) {
223
+ this.defaultAccounts.set(provider, remainingAccounts[0]);
224
+ }
225
+ else {
226
+ this.defaultAccounts.delete(provider);
202
227
  }
203
228
  }
204
- else {
229
+ if (this.data[provider] && Object.keys(this.data[provider]).length === 0) {
205
230
  delete this.data[provider];
206
- this.defaultAccounts.delete(provider);
207
231
  }
208
232
  this.save();
209
233
  }
210
- /**
211
- * List all providers with credentials.
212
- */
213
234
  list() {
214
235
  return Object.keys(this.data);
215
236
  }
216
- /**
217
- * Check if credentials exist for a provider in auth.json.
218
- */
219
237
  has(provider, accountId) {
220
238
  if (accountId) {
221
- return accountId in (this.data[provider] || {});
239
+ return accountId in (this.data[provider] ?? {});
222
240
  }
223
- return provider in this.data && Object.keys(this.data[provider]).length > 0;
241
+ return Object.keys(this.data[provider] ?? {}).length > 0;
224
242
  }
225
- /**
226
- * Check if any form of auth is configured for a provider.
227
- * Unlike getApiKey(), this doesn't refresh OAuth tokens.
228
- */
229
243
  hasAuth(provider, accountId) {
230
- // Check runtime override
231
- if (accountId) {
232
- if (this.runtimeOverrides.get(provider)?.has(accountId))
233
- return true;
234
- }
235
- else {
236
- if (this.runtimeOverrides.get(provider)?.size)
237
- return true;
244
+ const targetAccount = selectAccountId(provider, accountId, this.defaultAccounts);
245
+ if (this.runtimeOverrides.get(provider)?.has(targetAccount)) {
246
+ return true;
238
247
  }
239
- // Check saved credentials
240
248
  if (accountId) {
241
- if (this.has(provider, accountId))
242
- return true;
243
- }
244
- else {
245
- if (this.has(provider))
249
+ if (this.has(provider, targetAccount))
246
250
  return true;
247
251
  }
248
- // Check env var
249
- if (getEnvApiKey(provider))
252
+ else if (this.has(provider)) {
250
253
  return true;
251
- // Check fallback
252
- if (this.fallbackResolver?.(provider))
254
+ }
255
+ if (getEnvApiKey(provider)) {
253
256
  return true;
254
- return false;
257
+ }
258
+ return !!this.fallbackResolver?.(provider);
255
259
  }
256
- /**
257
- * Get all credentials (for passing to getOAuthApiKey).
258
- */
259
260
  getAll() {
260
- return { ...this.data };
261
+ return cloneStorageData(this.data);
261
262
  }
262
- /**
263
- * Login to an OAuth provider.
264
- */
265
263
  async login(providerId, callbacks, accountId = "default", accountName) {
266
264
  const provider = getOAuthProvider(providerId);
267
265
  if (!provider) {
268
266
  throw new Error(`Unknown OAuth provider: ${providerId}`);
269
267
  }
270
268
  const credentials = await provider.login(callbacks);
271
- const oauthCred = {
269
+ this.set(providerId, accountId, {
272
270
  type: "oauth",
273
271
  accountId,
274
272
  accountName: accountName || accountId,
275
273
  ...credentials,
276
- };
277
- this.set(providerId, accountId, oauthCred);
274
+ });
278
275
  }
279
- /**
280
- * Logout from a provider.
281
- */
282
276
  logout(provider, accountId) {
283
277
  this.remove(provider, accountId);
284
278
  }
285
- /**
286
- * Refresh OAuth token with file locking to prevent race conditions.
287
- */
288
279
  async refreshOAuthTokenWithLock(providerId, accountId) {
289
280
  const provider = getOAuthProvider(providerId);
290
281
  if (!provider) {
291
282
  return null;
292
283
  }
293
- // Ensure auth file exists for locking
294
- if (!existsSync(this.authPath)) {
295
- const dir = dirname(this.authPath);
296
- if (!existsSync(dir)) {
297
- mkdirSync(dir, { recursive: true, mode: 0o700 });
298
- }
299
- writeFileSync(this.authPath, "{}", "utf-8");
300
- chmodSync(this.authPath, 0o600);
301
- }
284
+ ensureStorageFile(this.authPath);
302
285
  let release;
303
286
  try {
304
- // Acquire exclusive lock with retry and timeout
305
287
  release = await lockfile.lock(this.authPath, {
306
- retries: {
307
- retries: 10,
308
- factor: 2,
309
- minTimeout: 100,
310
- maxTimeout: 10000,
311
- randomize: true,
312
- },
288
+ retries: { retries: 10, factor: 2, minTimeout: 100, maxTimeout: 10000, randomize: true },
313
289
  stale: 30000,
314
290
  });
315
- // Re-read file after acquiring lock
316
291
  this.reload();
317
- const cred = this.data[providerId]?.[accountId];
318
- if (cred?.type !== "oauth") {
292
+ const credential = this.data[providerId]?.[accountId];
293
+ if (credential?.type !== "oauth") {
319
294
  return null;
320
295
  }
321
- // Check if token is still expired after re-reading
322
- if (Date.now() < cred.expires) {
323
- // Token is now valid - another instance refreshed it
324
- const apiKey = provider.getApiKey(cred);
325
- return { apiKey, newCredentials: cred };
326
- }
327
- // Token still expired, we need to refresh
328
- const oauthCreds = {};
329
- for (const [key, value] of Object.entries(this.data[providerId] || {})) {
330
- if (value.type === "oauth") {
331
- oauthCreds[key] = value;
332
- }
296
+ if (Date.now() < credential.expires) {
297
+ return { apiKey: provider.getApiKey(credential), newCredentials: credential };
333
298
  }
334
- const result = await getOAuthApiKey(providerId, oauthCreds);
335
- if (result) {
336
- this.data[providerId][accountId] = {
337
- type: "oauth",
338
- accountId,
339
- accountName: cred.accountName,
340
- ...result.newCredentials,
341
- };
342
- this.save();
343
- return result;
299
+ const result = await getOAuthApiKey(providerId, collectOAuthCredentials(this.data[providerId]));
300
+ if (!result) {
301
+ return null;
344
302
  }
345
- return null;
303
+ this.data[providerId][accountId] = {
304
+ type: "oauth",
305
+ accountId,
306
+ accountName: credential.accountName,
307
+ ...result.newCredentials,
308
+ };
309
+ this.save();
310
+ return result;
346
311
  }
347
312
  finally {
348
313
  if (release) {
@@ -350,83 +315,63 @@ export class AuthStorage {
350
315
  await release();
351
316
  }
352
317
  catch {
353
- // Ignore unlock errors
318
+ // Ignore unlock failures.
354
319
  }
355
320
  }
356
321
  }
357
322
  }
358
- /**
359
- * Get API key for a provider and account.
360
- * Priority:
361
- * 1. Runtime override (CLI --api-key)
362
- * 2. API key from auth.json
363
- * 3. OAuth token from auth.json (auto-refreshed with locking)
364
- * 4. Environment variable
365
- * 5. Fallback resolver (models.json custom providers)
366
- */
323
+ resolveCredentialSource(provider, accountId) {
324
+ const targetAccount = selectAccountId(provider, accountId, this.defaultAccounts);
325
+ const runtimeKey = this.runtimeOverrides.get(provider)?.get(targetAccount);
326
+ const credential = this.data[provider]?.[targetAccount];
327
+ const envKey = getEnvApiKey(provider);
328
+ const fallbackKey = this.fallbackResolver?.(provider);
329
+ return { targetAccount, runtimeKey, credential, envKey, fallbackKey };
330
+ }
367
331
  async getApiKey(providerId, accountId) {
368
- // Use default account if not specified
369
- const targetAccount = accountId || this.getDefaultAccount(providerId) || "default";
370
- // Runtime override takes highest priority
371
- const runtimeKey = this.runtimeOverrides.get(providerId)?.get(targetAccount);
372
- if (runtimeKey) {
373
- return runtimeKey;
332
+ const source = this.resolveCredentialSource(providerId, accountId);
333
+ if (source.runtimeKey) {
334
+ return source.runtimeKey;
374
335
  }
375
- const cred = this.data[providerId]?.[targetAccount];
376
- if (cred?.type === "api_key") {
377
- return cred.key;
336
+ if (source.credential?.type === "api_key") {
337
+ return source.credential.key;
378
338
  }
379
- if (cred?.type === "oauth") {
339
+ if (source.credential?.type === "oauth") {
380
340
  const provider = getOAuthProvider(providerId);
381
341
  if (!provider) {
382
342
  return undefined;
383
343
  }
384
- // Check if token needs refresh
385
- const needsRefresh = Date.now() >= cred.expires;
386
- if (needsRefresh) {
387
- try {
388
- const result = await this.refreshOAuthTokenWithLock(providerId, targetAccount);
389
- if (result) {
390
- return result.apiKey;
391
- }
392
- }
393
- catch {
394
- // Refresh failed - re-read file
395
- this.reload();
396
- const updatedCred = this.data[providerId]?.[targetAccount];
397
- if (updatedCred?.type === "oauth" && Date.now() < updatedCred.expires) {
398
- return provider.getApiKey(updatedCred);
399
- }
400
- return undefined;
344
+ if (Date.now() < source.credential.expires) {
345
+ return provider.getApiKey(source.credential);
346
+ }
347
+ try {
348
+ const refreshed = await this.refreshOAuthTokenWithLock(providerId, source.targetAccount);
349
+ if (refreshed) {
350
+ return refreshed.apiKey;
401
351
  }
402
352
  }
403
- else {
404
- return provider.getApiKey(cred);
353
+ catch {
354
+ this.reload();
355
+ const updated = this.data[providerId]?.[source.targetAccount];
356
+ if (updated?.type === "oauth" && Date.now() < updated.expires) {
357
+ return provider.getApiKey(updated);
358
+ }
359
+ return undefined;
405
360
  }
406
361
  }
407
- // Fall back to environment variable
408
- const envKey = getEnvApiKey(providerId);
409
- if (envKey)
410
- return envKey;
411
- // Fall back to custom resolver
412
- return this.fallbackResolver?.(providerId) ?? undefined;
413
- }
414
- /**
415
- * Get all registered OAuth providers
416
- */
362
+ return source.envKey ?? source.fallbackKey;
363
+ }
417
364
  getOAuthProviders() {
418
365
  return getOAuthProviders();
419
366
  }
420
- /**
421
- * Get account info for display
422
- */
423
367
  getAccountInfo(provider, accountId) {
424
- const cred = this.get(provider, accountId);
425
- if (!cred)
368
+ const credential = this.data[provider]?.[accountId];
369
+ if (!credential) {
426
370
  return undefined;
371
+ }
427
372
  return {
428
- name: cred.accountName || accountId,
429
- type: cred.type,
373
+ name: credential.accountName || accountId,
374
+ type: credential.type,
430
375
  };
431
376
  }
432
377
  }