attocode 0.1.0

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 (488) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/LICENSE +21 -0
  3. package/README.md +164 -0
  4. package/dist/src/adapters.d.ts +83 -0
  5. package/dist/src/adapters.d.ts.map +1 -0
  6. package/dist/src/adapters.js +221 -0
  7. package/dist/src/adapters.js.map +1 -0
  8. package/dist/src/agent-tools/index.d.ts +7 -0
  9. package/dist/src/agent-tools/index.d.ts.map +1 -0
  10. package/dist/src/agent-tools/index.js +8 -0
  11. package/dist/src/agent-tools/index.js.map +1 -0
  12. package/dist/src/agent-tools/lsp-file-tools.d.ts +33 -0
  13. package/dist/src/agent-tools/lsp-file-tools.d.ts.map +1 -0
  14. package/dist/src/agent-tools/lsp-file-tools.js +200 -0
  15. package/dist/src/agent-tools/lsp-file-tools.js.map +1 -0
  16. package/dist/src/agent.d.ts +667 -0
  17. package/dist/src/agent.d.ts.map +1 -0
  18. package/dist/src/agent.js +2824 -0
  19. package/dist/src/agent.js.map +1 -0
  20. package/dist/src/cli.d.ts +36 -0
  21. package/dist/src/cli.d.ts.map +1 -0
  22. package/dist/src/cli.js +176 -0
  23. package/dist/src/cli.js.map +1 -0
  24. package/dist/src/commands/handler.d.ts +22 -0
  25. package/dist/src/commands/handler.d.ts.map +1 -0
  26. package/dist/src/commands/handler.js +1320 -0
  27. package/dist/src/commands/handler.js.map +1 -0
  28. package/dist/src/commands/init.d.ts +7 -0
  29. package/dist/src/commands/init.d.ts.map +1 -0
  30. package/dist/src/commands/init.js +153 -0
  31. package/dist/src/commands/init.js.map +1 -0
  32. package/dist/src/commands/types.d.ts +70 -0
  33. package/dist/src/commands/types.d.ts.map +1 -0
  34. package/dist/src/commands/types.js +8 -0
  35. package/dist/src/commands/types.js.map +1 -0
  36. package/dist/src/config.d.ts +22 -0
  37. package/dist/src/config.d.ts.map +1 -0
  38. package/dist/src/config.js +25 -0
  39. package/dist/src/config.js.map +1 -0
  40. package/dist/src/core/index.d.ts +32 -0
  41. package/dist/src/core/index.d.ts.map +1 -0
  42. package/dist/src/core/index.js +35 -0
  43. package/dist/src/core/index.js.map +1 -0
  44. package/dist/src/core/process-handlers.d.ts +43 -0
  45. package/dist/src/core/process-handlers.d.ts.map +1 -0
  46. package/dist/src/core/process-handlers.js +117 -0
  47. package/dist/src/core/process-handlers.js.map +1 -0
  48. package/dist/src/core/protocol/bridge.d.ts +117 -0
  49. package/dist/src/core/protocol/bridge.d.ts.map +1 -0
  50. package/dist/src/core/protocol/bridge.js +149 -0
  51. package/dist/src/core/protocol/bridge.js.map +1 -0
  52. package/dist/src/core/protocol/index.d.ts +8 -0
  53. package/dist/src/core/protocol/index.d.ts.map +1 -0
  54. package/dist/src/core/protocol/index.js +8 -0
  55. package/dist/src/core/protocol/index.js.map +1 -0
  56. package/dist/src/core/protocol/types.d.ts +539 -0
  57. package/dist/src/core/protocol/types.d.ts.map +1 -0
  58. package/dist/src/core/protocol/types.js +149 -0
  59. package/dist/src/core/protocol/types.js.map +1 -0
  60. package/dist/src/core/queues/atomic-counter.d.ts +36 -0
  61. package/dist/src/core/queues/atomic-counter.d.ts.map +1 -0
  62. package/dist/src/core/queues/atomic-counter.js +46 -0
  63. package/dist/src/core/queues/atomic-counter.js.map +1 -0
  64. package/dist/src/core/queues/event-queue.d.ts +126 -0
  65. package/dist/src/core/queues/event-queue.d.ts.map +1 -0
  66. package/dist/src/core/queues/event-queue.js +208 -0
  67. package/dist/src/core/queues/event-queue.js.map +1 -0
  68. package/dist/src/core/queues/index.d.ts +12 -0
  69. package/dist/src/core/queues/index.d.ts.map +1 -0
  70. package/dist/src/core/queues/index.js +15 -0
  71. package/dist/src/core/queues/index.js.map +1 -0
  72. package/dist/src/core/queues/submission-queue.d.ts +116 -0
  73. package/dist/src/core/queues/submission-queue.d.ts.map +1 -0
  74. package/dist/src/core/queues/submission-queue.js +236 -0
  75. package/dist/src/core/queues/submission-queue.js.map +1 -0
  76. package/dist/src/costs/index.d.ts +22 -0
  77. package/dist/src/costs/index.d.ts.map +1 -0
  78. package/dist/src/costs/index.js +22 -0
  79. package/dist/src/costs/index.js.map +1 -0
  80. package/dist/src/costs/model-registry.d.ts +80 -0
  81. package/dist/src/costs/model-registry.d.ts.map +1 -0
  82. package/dist/src/costs/model-registry.js +237 -0
  83. package/dist/src/costs/model-registry.js.map +1 -0
  84. package/dist/src/costs/types.d.ts +50 -0
  85. package/dist/src/costs/types.d.ts.map +1 -0
  86. package/dist/src/costs/types.js +2 -0
  87. package/dist/src/costs/types.js.map +1 -0
  88. package/dist/src/defaults.d.ts +114 -0
  89. package/dist/src/defaults.d.ts.map +1 -0
  90. package/dist/src/defaults.js +457 -0
  91. package/dist/src/defaults.js.map +1 -0
  92. package/dist/src/first-run.d.ts +35 -0
  93. package/dist/src/first-run.d.ts.map +1 -0
  94. package/dist/src/first-run.js +94 -0
  95. package/dist/src/first-run.js.map +1 -0
  96. package/dist/src/hello.d.ts +2 -0
  97. package/dist/src/hello.d.ts.map +1 -0
  98. package/dist/src/hello.js +4 -0
  99. package/dist/src/hello.js.map +1 -0
  100. package/dist/src/integrations/agent-registry.d.ts +160 -0
  101. package/dist/src/integrations/agent-registry.d.ts.map +1 -0
  102. package/dist/src/integrations/agent-registry.js +446 -0
  103. package/dist/src/integrations/agent-registry.js.map +1 -0
  104. package/dist/src/integrations/auto-compaction.d.ts +177 -0
  105. package/dist/src/integrations/auto-compaction.d.ts.map +1 -0
  106. package/dist/src/integrations/auto-compaction.js +428 -0
  107. package/dist/src/integrations/auto-compaction.js.map +1 -0
  108. package/dist/src/integrations/cancellation.d.ts +162 -0
  109. package/dist/src/integrations/cancellation.d.ts.map +1 -0
  110. package/dist/src/integrations/cancellation.js +339 -0
  111. package/dist/src/integrations/cancellation.js.map +1 -0
  112. package/dist/src/integrations/codebase-context.d.ts +319 -0
  113. package/dist/src/integrations/codebase-context.d.ts.map +1 -0
  114. package/dist/src/integrations/codebase-context.js +816 -0
  115. package/dist/src/integrations/codebase-context.js.map +1 -0
  116. package/dist/src/integrations/compaction.d.ts +192 -0
  117. package/dist/src/integrations/compaction.d.ts.map +1 -0
  118. package/dist/src/integrations/compaction.js +376 -0
  119. package/dist/src/integrations/compaction.js.map +1 -0
  120. package/dist/src/integrations/context-engineering.d.ts +246 -0
  121. package/dist/src/integrations/context-engineering.d.ts.map +1 -0
  122. package/dist/src/integrations/context-engineering.js +394 -0
  123. package/dist/src/integrations/context-engineering.js.map +1 -0
  124. package/dist/src/integrations/diff-utils.d.ts +105 -0
  125. package/dist/src/integrations/diff-utils.d.ts.map +1 -0
  126. package/dist/src/integrations/diff-utils.js +497 -0
  127. package/dist/src/integrations/diff-utils.js.map +1 -0
  128. package/dist/src/integrations/economics.d.ts +192 -0
  129. package/dist/src/integrations/economics.d.ts.map +1 -0
  130. package/dist/src/integrations/economics.js +431 -0
  131. package/dist/src/integrations/economics.js.map +1 -0
  132. package/dist/src/integrations/execution-policy.d.ts +189 -0
  133. package/dist/src/integrations/execution-policy.d.ts.map +1 -0
  134. package/dist/src/integrations/execution-policy.js +352 -0
  135. package/dist/src/integrations/execution-policy.js.map +1 -0
  136. package/dist/src/integrations/file-change-tracker.d.ts +161 -0
  137. package/dist/src/integrations/file-change-tracker.d.ts.map +1 -0
  138. package/dist/src/integrations/file-change-tracker.js +520 -0
  139. package/dist/src/integrations/file-change-tracker.js.map +1 -0
  140. package/dist/src/integrations/hierarchical-config.d.ts +212 -0
  141. package/dist/src/integrations/hierarchical-config.d.ts.map +1 -0
  142. package/dist/src/integrations/hierarchical-config.js +484 -0
  143. package/dist/src/integrations/hierarchical-config.js.map +1 -0
  144. package/dist/src/integrations/hooks.d.ts +114 -0
  145. package/dist/src/integrations/hooks.d.ts.map +1 -0
  146. package/dist/src/integrations/hooks.js +326 -0
  147. package/dist/src/integrations/hooks.js.map +1 -0
  148. package/dist/src/integrations/ignore.d.ts +143 -0
  149. package/dist/src/integrations/ignore.d.ts.map +1 -0
  150. package/dist/src/integrations/ignore.js +417 -0
  151. package/dist/src/integrations/ignore.js.map +1 -0
  152. package/dist/src/integrations/image-renderer.d.ts +119 -0
  153. package/dist/src/integrations/image-renderer.d.ts.map +1 -0
  154. package/dist/src/integrations/image-renderer.js +306 -0
  155. package/dist/src/integrations/image-renderer.js.map +1 -0
  156. package/dist/src/integrations/index.d.ts +42 -0
  157. package/dist/src/integrations/index.d.ts.map +1 -0
  158. package/dist/src/integrations/index.js +73 -0
  159. package/dist/src/integrations/index.js.map +1 -0
  160. package/dist/src/integrations/lsp.d.ts +196 -0
  161. package/dist/src/integrations/lsp.d.ts.map +1 -0
  162. package/dist/src/integrations/lsp.js +582 -0
  163. package/dist/src/integrations/lsp.js.map +1 -0
  164. package/dist/src/integrations/mcp-client.d.ts +270 -0
  165. package/dist/src/integrations/mcp-client.d.ts.map +1 -0
  166. package/dist/src/integrations/mcp-client.js +698 -0
  167. package/dist/src/integrations/mcp-client.js.map +1 -0
  168. package/dist/src/integrations/mcp-tool-search.d.ts +77 -0
  169. package/dist/src/integrations/mcp-tool-search.d.ts.map +1 -0
  170. package/dist/src/integrations/mcp-tool-search.js +220 -0
  171. package/dist/src/integrations/mcp-tool-search.js.map +1 -0
  172. package/dist/src/integrations/memory.d.ts +108 -0
  173. package/dist/src/integrations/memory.d.ts.map +1 -0
  174. package/dist/src/integrations/memory.js +288 -0
  175. package/dist/src/integrations/memory.js.map +1 -0
  176. package/dist/src/integrations/multi-agent.d.ts +150 -0
  177. package/dist/src/integrations/multi-agent.d.ts.map +1 -0
  178. package/dist/src/integrations/multi-agent.js +306 -0
  179. package/dist/src/integrations/multi-agent.js.map +1 -0
  180. package/dist/src/integrations/observability.d.ts +162 -0
  181. package/dist/src/integrations/observability.d.ts.map +1 -0
  182. package/dist/src/integrations/observability.js +406 -0
  183. package/dist/src/integrations/observability.js.map +1 -0
  184. package/dist/src/integrations/openrouter-pricing.d.ts +42 -0
  185. package/dist/src/integrations/openrouter-pricing.d.ts.map +1 -0
  186. package/dist/src/integrations/openrouter-pricing.js +124 -0
  187. package/dist/src/integrations/openrouter-pricing.js.map +1 -0
  188. package/dist/src/integrations/pending-plan.d.ts +171 -0
  189. package/dist/src/integrations/pending-plan.d.ts.map +1 -0
  190. package/dist/src/integrations/pending-plan.js +244 -0
  191. package/dist/src/integrations/pending-plan.js.map +1 -0
  192. package/dist/src/integrations/persistence.d.ts +48 -0
  193. package/dist/src/integrations/persistence.d.ts.map +1 -0
  194. package/dist/src/integrations/persistence.js +196 -0
  195. package/dist/src/integrations/persistence.js.map +1 -0
  196. package/dist/src/integrations/planning.d.ts +96 -0
  197. package/dist/src/integrations/planning.d.ts.map +1 -0
  198. package/dist/src/integrations/planning.js +338 -0
  199. package/dist/src/integrations/planning.js.map +1 -0
  200. package/dist/src/integrations/pty-shell.d.ts +169 -0
  201. package/dist/src/integrations/pty-shell.d.ts.map +1 -0
  202. package/dist/src/integrations/pty-shell.js +367 -0
  203. package/dist/src/integrations/pty-shell.js.map +1 -0
  204. package/dist/src/integrations/react.d.ts +139 -0
  205. package/dist/src/integrations/react.d.ts.map +1 -0
  206. package/dist/src/integrations/react.js +273 -0
  207. package/dist/src/integrations/react.js.map +1 -0
  208. package/dist/src/integrations/resources.d.ts +177 -0
  209. package/dist/src/integrations/resources.d.ts.map +1 -0
  210. package/dist/src/integrations/resources.js +311 -0
  211. package/dist/src/integrations/resources.js.map +1 -0
  212. package/dist/src/integrations/result-synthesizer.d.ts +389 -0
  213. package/dist/src/integrations/result-synthesizer.d.ts.map +1 -0
  214. package/dist/src/integrations/result-synthesizer.js +951 -0
  215. package/dist/src/integrations/result-synthesizer.js.map +1 -0
  216. package/dist/src/integrations/routing.d.ts +117 -0
  217. package/dist/src/integrations/routing.d.ts.map +1 -0
  218. package/dist/src/integrations/routing.js +347 -0
  219. package/dist/src/integrations/routing.js.map +1 -0
  220. package/dist/src/integrations/rules.d.ts +131 -0
  221. package/dist/src/integrations/rules.d.ts.map +1 -0
  222. package/dist/src/integrations/rules.js +284 -0
  223. package/dist/src/integrations/rules.js.map +1 -0
  224. package/dist/src/integrations/safety.d.ts +142 -0
  225. package/dist/src/integrations/safety.d.ts.map +1 -0
  226. package/dist/src/integrations/safety.js +342 -0
  227. package/dist/src/integrations/safety.js.map +1 -0
  228. package/dist/src/integrations/sandbox/basic.d.ts +74 -0
  229. package/dist/src/integrations/sandbox/basic.d.ts.map +1 -0
  230. package/dist/src/integrations/sandbox/basic.js +310 -0
  231. package/dist/src/integrations/sandbox/basic.js.map +1 -0
  232. package/dist/src/integrations/sandbox/docker.d.ts +94 -0
  233. package/dist/src/integrations/sandbox/docker.d.ts.map +1 -0
  234. package/dist/src/integrations/sandbox/docker.js +293 -0
  235. package/dist/src/integrations/sandbox/docker.js.map +1 -0
  236. package/dist/src/integrations/sandbox/index.d.ts +182 -0
  237. package/dist/src/integrations/sandbox/index.d.ts.map +1 -0
  238. package/dist/src/integrations/sandbox/index.js +382 -0
  239. package/dist/src/integrations/sandbox/index.js.map +1 -0
  240. package/dist/src/integrations/sandbox/landlock.d.ts +59 -0
  241. package/dist/src/integrations/sandbox/landlock.d.ts.map +1 -0
  242. package/dist/src/integrations/sandbox/landlock.js +326 -0
  243. package/dist/src/integrations/sandbox/landlock.js.map +1 -0
  244. package/dist/src/integrations/sandbox/seatbelt.d.ts +68 -0
  245. package/dist/src/integrations/sandbox/seatbelt.d.ts.map +1 -0
  246. package/dist/src/integrations/sandbox/seatbelt.js +298 -0
  247. package/dist/src/integrations/sandbox/seatbelt.js.map +1 -0
  248. package/dist/src/integrations/semantic-cache.d.ts +178 -0
  249. package/dist/src/integrations/semantic-cache.d.ts.map +1 -0
  250. package/dist/src/integrations/semantic-cache.js +372 -0
  251. package/dist/src/integrations/semantic-cache.js.map +1 -0
  252. package/dist/src/integrations/session-store.d.ts +183 -0
  253. package/dist/src/integrations/session-store.d.ts.map +1 -0
  254. package/dist/src/integrations/session-store.js +345 -0
  255. package/dist/src/integrations/session-store.js.map +1 -0
  256. package/dist/src/integrations/shared-blackboard.d.ts +403 -0
  257. package/dist/src/integrations/shared-blackboard.d.ts.map +1 -0
  258. package/dist/src/integrations/shared-blackboard.js +710 -0
  259. package/dist/src/integrations/shared-blackboard.js.map +1 -0
  260. package/dist/src/integrations/skills.d.ts +171 -0
  261. package/dist/src/integrations/skills.d.ts.map +1 -0
  262. package/dist/src/integrations/skills.js +403 -0
  263. package/dist/src/integrations/skills.js.map +1 -0
  264. package/dist/src/integrations/smart-decomposer.d.ts +322 -0
  265. package/dist/src/integrations/smart-decomposer.d.ts.map +1 -0
  266. package/dist/src/integrations/smart-decomposer.js +856 -0
  267. package/dist/src/integrations/smart-decomposer.js.map +1 -0
  268. package/dist/src/integrations/sourcegraph.d.ts +169 -0
  269. package/dist/src/integrations/sourcegraph.d.ts.map +1 -0
  270. package/dist/src/integrations/sourcegraph.js +379 -0
  271. package/dist/src/integrations/sourcegraph.js.map +1 -0
  272. package/dist/src/integrations/sqlite-store.d.ts +518 -0
  273. package/dist/src/integrations/sqlite-store.d.ts.map +1 -0
  274. package/dist/src/integrations/sqlite-store.js +1423 -0
  275. package/dist/src/integrations/sqlite-store.js.map +1 -0
  276. package/dist/src/integrations/streaming.d.ts +102 -0
  277. package/dist/src/integrations/streaming.d.ts.map +1 -0
  278. package/dist/src/integrations/streaming.js +362 -0
  279. package/dist/src/integrations/streaming.js.map +1 -0
  280. package/dist/src/integrations/thread-manager.d.ts +199 -0
  281. package/dist/src/integrations/thread-manager.d.ts.map +1 -0
  282. package/dist/src/integrations/thread-manager.js +357 -0
  283. package/dist/src/integrations/thread-manager.js.map +1 -0
  284. package/dist/src/main.d.ts +26 -0
  285. package/dist/src/main.d.ts.map +1 -0
  286. package/dist/src/main.js +170 -0
  287. package/dist/src/main.js.map +1 -0
  288. package/dist/src/modes/index.d.ts +10 -0
  289. package/dist/src/modes/index.d.ts.map +1 -0
  290. package/dist/src/modes/index.js +10 -0
  291. package/dist/src/modes/index.js.map +1 -0
  292. package/dist/src/modes/repl.d.ts +19 -0
  293. package/dist/src/modes/repl.d.ts.map +1 -0
  294. package/dist/src/modes/repl.js +393 -0
  295. package/dist/src/modes/repl.js.map +1 -0
  296. package/dist/src/modes/tui.d.ts +29 -0
  297. package/dist/src/modes/tui.d.ts.map +1 -0
  298. package/dist/src/modes/tui.js +272 -0
  299. package/dist/src/modes/tui.js.map +1 -0
  300. package/dist/src/modes.d.ts +179 -0
  301. package/dist/src/modes.d.ts.map +1 -0
  302. package/dist/src/modes.js +385 -0
  303. package/dist/src/modes.js.map +1 -0
  304. package/dist/src/observability/tracer.d.ts +111 -0
  305. package/dist/src/observability/tracer.d.ts.map +1 -0
  306. package/dist/src/observability/tracer.js +300 -0
  307. package/dist/src/observability/tracer.js.map +1 -0
  308. package/dist/src/observability/types.d.ts +271 -0
  309. package/dist/src/observability/types.d.ts.map +1 -0
  310. package/dist/src/observability/types.js +24 -0
  311. package/dist/src/observability/types.js.map +1 -0
  312. package/dist/src/paths.d.ts +101 -0
  313. package/dist/src/paths.d.ts.map +1 -0
  314. package/dist/src/paths.js +148 -0
  315. package/dist/src/paths.js.map +1 -0
  316. package/dist/src/persistence/index.d.ts +38 -0
  317. package/dist/src/persistence/index.d.ts.map +1 -0
  318. package/dist/src/persistence/index.js +48 -0
  319. package/dist/src/persistence/index.js.map +1 -0
  320. package/dist/src/persistence/migrator.d.ts +135 -0
  321. package/dist/src/persistence/migrator.d.ts.map +1 -0
  322. package/dist/src/persistence/migrator.js +303 -0
  323. package/dist/src/persistence/migrator.js.map +1 -0
  324. package/dist/src/persistence/schema.d.ts +101 -0
  325. package/dist/src/persistence/schema.d.ts.map +1 -0
  326. package/dist/src/persistence/schema.js +395 -0
  327. package/dist/src/persistence/schema.js.map +1 -0
  328. package/dist/src/providers/adapters/anthropic.d.ts +20 -0
  329. package/dist/src/providers/adapters/anthropic.d.ts.map +1 -0
  330. package/dist/src/providers/adapters/anthropic.js +124 -0
  331. package/dist/src/providers/adapters/anthropic.js.map +1 -0
  332. package/dist/src/providers/adapters/mock.d.ts +25 -0
  333. package/dist/src/providers/adapters/mock.d.ts.map +1 -0
  334. package/dist/src/providers/adapters/mock.js +133 -0
  335. package/dist/src/providers/adapters/mock.js.map +1 -0
  336. package/dist/src/providers/adapters/openai.d.ts +21 -0
  337. package/dist/src/providers/adapters/openai.d.ts.map +1 -0
  338. package/dist/src/providers/adapters/openai.js +126 -0
  339. package/dist/src/providers/adapters/openai.js.map +1 -0
  340. package/dist/src/providers/adapters/openrouter.d.ts +49 -0
  341. package/dist/src/providers/adapters/openrouter.d.ts.map +1 -0
  342. package/dist/src/providers/adapters/openrouter.js +363 -0
  343. package/dist/src/providers/adapters/openrouter.js.map +1 -0
  344. package/dist/src/providers/provider.d.ts +54 -0
  345. package/dist/src/providers/provider.d.ts.map +1 -0
  346. package/dist/src/providers/provider.js +111 -0
  347. package/dist/src/providers/provider.js.map +1 -0
  348. package/dist/src/providers/resilient-fetch.d.ts +99 -0
  349. package/dist/src/providers/resilient-fetch.d.ts.map +1 -0
  350. package/dist/src/providers/resilient-fetch.js +208 -0
  351. package/dist/src/providers/resilient-fetch.js.map +1 -0
  352. package/dist/src/providers/types.d.ts +227 -0
  353. package/dist/src/providers/types.d.ts.map +1 -0
  354. package/dist/src/providers/types.js +24 -0
  355. package/dist/src/providers/types.js.map +1 -0
  356. package/dist/src/session-picker.d.ts +28 -0
  357. package/dist/src/session-picker.d.ts.map +1 -0
  358. package/dist/src/session-picker.js +256 -0
  359. package/dist/src/session-picker.js.map +1 -0
  360. package/dist/src/test-sqlite.d.ts +2 -0
  361. package/dist/src/test-sqlite.d.ts.map +1 -0
  362. package/dist/src/test-sqlite.js +114 -0
  363. package/dist/src/test-sqlite.js.map +1 -0
  364. package/dist/src/tools/agent.d.ts +44 -0
  365. package/dist/src/tools/agent.d.ts.map +1 -0
  366. package/dist/src/tools/agent.js +110 -0
  367. package/dist/src/tools/agent.js.map +1 -0
  368. package/dist/src/tools/bash.d.ts +52 -0
  369. package/dist/src/tools/bash.d.ts.map +1 -0
  370. package/dist/src/tools/bash.js +141 -0
  371. package/dist/src/tools/bash.js.map +1 -0
  372. package/dist/src/tools/file.d.ts +47 -0
  373. package/dist/src/tools/file.d.ts.map +1 -0
  374. package/dist/src/tools/file.js +263 -0
  375. package/dist/src/tools/file.js.map +1 -0
  376. package/dist/src/tools/permission.d.ts +43 -0
  377. package/dist/src/tools/permission.d.ts.map +1 -0
  378. package/dist/src/tools/permission.js +216 -0
  379. package/dist/src/tools/permission.js.map +1 -0
  380. package/dist/src/tools/registry.d.ts +63 -0
  381. package/dist/src/tools/registry.d.ts.map +1 -0
  382. package/dist/src/tools/registry.js +250 -0
  383. package/dist/src/tools/registry.js.map +1 -0
  384. package/dist/src/tools/standard.d.ts +57 -0
  385. package/dist/src/tools/standard.d.ts.map +1 -0
  386. package/dist/src/tools/standard.js +113 -0
  387. package/dist/src/tools/standard.js.map +1 -0
  388. package/dist/src/tools/types.d.ts +146 -0
  389. package/dist/src/tools/types.d.ts.map +1 -0
  390. package/dist/src/tools/types.js +28 -0
  391. package/dist/src/tools/types.js.map +1 -0
  392. package/dist/src/tools/undo.d.ts +71 -0
  393. package/dist/src/tools/undo.d.ts.map +1 -0
  394. package/dist/src/tools/undo.js +123 -0
  395. package/dist/src/tools/undo.js.map +1 -0
  396. package/dist/src/tracing/cache-boundary-tracker.d.ts +189 -0
  397. package/dist/src/tracing/cache-boundary-tracker.d.ts.map +1 -0
  398. package/dist/src/tracing/cache-boundary-tracker.js +411 -0
  399. package/dist/src/tracing/cache-boundary-tracker.js.map +1 -0
  400. package/dist/src/tracing/trace-collector.d.ts +274 -0
  401. package/dist/src/tracing/trace-collector.d.ts.map +1 -0
  402. package/dist/src/tracing/trace-collector.js +727 -0
  403. package/dist/src/tracing/trace-collector.js.map +1 -0
  404. package/dist/src/tracing/types.d.ts +657 -0
  405. package/dist/src/tracing/types.d.ts.map +1 -0
  406. package/dist/src/tracing/types.js +39 -0
  407. package/dist/src/tracing/types.js.map +1 -0
  408. package/dist/src/tricks/failure-evidence.d.ts +268 -0
  409. package/dist/src/tricks/failure-evidence.d.ts.map +1 -0
  410. package/dist/src/tricks/failure-evidence.js +544 -0
  411. package/dist/src/tricks/failure-evidence.js.map +1 -0
  412. package/dist/src/tricks/json-utils.d.ts +77 -0
  413. package/dist/src/tricks/json-utils.d.ts.map +1 -0
  414. package/dist/src/tricks/json-utils.js +247 -0
  415. package/dist/src/tricks/json-utils.js.map +1 -0
  416. package/dist/src/tricks/kv-cache-context.d.ts +227 -0
  417. package/dist/src/tricks/kv-cache-context.d.ts.map +1 -0
  418. package/dist/src/tricks/kv-cache-context.js +377 -0
  419. package/dist/src/tricks/kv-cache-context.js.map +1 -0
  420. package/dist/src/tricks/recitation.d.ts +208 -0
  421. package/dist/src/tricks/recitation.d.ts.map +1 -0
  422. package/dist/src/tricks/recitation.js +374 -0
  423. package/dist/src/tricks/recitation.js.map +1 -0
  424. package/dist/src/tricks/reversible-compaction.d.ts +251 -0
  425. package/dist/src/tricks/reversible-compaction.d.ts.map +1 -0
  426. package/dist/src/tricks/reversible-compaction.js +555 -0
  427. package/dist/src/tricks/reversible-compaction.js.map +1 -0
  428. package/dist/src/tricks/serialization-diversity.d.ts +197 -0
  429. package/dist/src/tricks/serialization-diversity.d.ts.map +1 -0
  430. package/dist/src/tricks/serialization-diversity.js +460 -0
  431. package/dist/src/tricks/serialization-diversity.js.map +1 -0
  432. package/dist/src/tui/app.d.ts +42 -0
  433. package/dist/src/tui/app.d.ts.map +1 -0
  434. package/dist/src/tui/app.js +1076 -0
  435. package/dist/src/tui/app.js.map +1 -0
  436. package/dist/src/tui/components/ApprovalDialog.d.ts +28 -0
  437. package/dist/src/tui/components/ApprovalDialog.d.ts.map +1 -0
  438. package/dist/src/tui/components/ApprovalDialog.js +59 -0
  439. package/dist/src/tui/components/ApprovalDialog.js.map +1 -0
  440. package/dist/src/tui/components/InputArea.d.ts +35 -0
  441. package/dist/src/tui/components/InputArea.d.ts.map +1 -0
  442. package/dist/src/tui/components/InputArea.js +144 -0
  443. package/dist/src/tui/components/InputArea.js.map +1 -0
  444. package/dist/src/tui/components/MessageItem.d.ts +28 -0
  445. package/dist/src/tui/components/MessageItem.d.ts.map +1 -0
  446. package/dist/src/tui/components/MessageItem.js +27 -0
  447. package/dist/src/tui/components/MessageItem.js.map +1 -0
  448. package/dist/src/tui/components/ScrollableBox.d.ts +41 -0
  449. package/dist/src/tui/components/ScrollableBox.d.ts.map +1 -0
  450. package/dist/src/tui/components/ScrollableBox.js +101 -0
  451. package/dist/src/tui/components/ScrollableBox.js.map +1 -0
  452. package/dist/src/tui/components/ToolCallItem.d.ts +33 -0
  453. package/dist/src/tui/components/ToolCallItem.d.ts.map +1 -0
  454. package/dist/src/tui/components/ToolCallItem.js +91 -0
  455. package/dist/src/tui/components/ToolCallItem.js.map +1 -0
  456. package/dist/src/tui/components/index.d.ts +13 -0
  457. package/dist/src/tui/components/index.d.ts.map +1 -0
  458. package/dist/src/tui/components/index.js +15 -0
  459. package/dist/src/tui/components/index.js.map +1 -0
  460. package/dist/src/tui/event-display.d.ts +19 -0
  461. package/dist/src/tui/event-display.d.ts.map +1 -0
  462. package/dist/src/tui/event-display.js +178 -0
  463. package/dist/src/tui/event-display.js.map +1 -0
  464. package/dist/src/tui/index.d.ts +105 -0
  465. package/dist/src/tui/index.d.ts.map +1 -0
  466. package/dist/src/tui/index.js +214 -0
  467. package/dist/src/tui/index.js.map +1 -0
  468. package/dist/src/tui/input/CommandPalette.d.ts +55 -0
  469. package/dist/src/tui/input/CommandPalette.d.ts.map +1 -0
  470. package/dist/src/tui/input/CommandPalette.js +135 -0
  471. package/dist/src/tui/input/CommandPalette.js.map +1 -0
  472. package/dist/src/tui/input/index.d.ts +7 -0
  473. package/dist/src/tui/input/index.d.ts.map +1 -0
  474. package/dist/src/tui/input/index.js +7 -0
  475. package/dist/src/tui/input/index.js.map +1 -0
  476. package/dist/src/tui/theme/index.d.ts +45 -0
  477. package/dist/src/tui/theme/index.d.ts.map +1 -0
  478. package/dist/src/tui/theme/index.js +215 -0
  479. package/dist/src/tui/theme/index.js.map +1 -0
  480. package/dist/src/tui/types.d.ts +214 -0
  481. package/dist/src/tui/types.d.ts.map +1 -0
  482. package/dist/src/tui/types.js +27 -0
  483. package/dist/src/tui/types.js.map +1 -0
  484. package/dist/src/types.d.ts +905 -0
  485. package/dist/src/types.d.ts.map +1 -0
  486. package/dist/src/types.js +9 -0
  487. package/dist/src/types.js.map +1 -0
  488. package/package.json +89 -0
@@ -0,0 +1,363 @@
1
+ /**
2
+ * OpenRouter Provider Adapter
3
+ *
4
+ * Adapts the OpenRouter API (OpenAI-compatible) to our LLMProvider interface.
5
+ * OpenRouter provides access to 100+ models from various providers through
6
+ * a single API key.
7
+ */
8
+ import { ProviderError } from '../types.js';
9
+ import { registerProvider, hasEnv, requireEnv } from '../provider.js';
10
+ import { resilientFetch } from '../resilient-fetch.js';
11
+ // =============================================================================
12
+ // DEFAULT MODEL SELECTION
13
+ // =============================================================================
14
+ /**
15
+ * TODO: Choose your default model for OpenRouter.
16
+ *
17
+ * This is a meaningful design choice based on your priorities:
18
+ *
19
+ * Cost-optimized options:
20
+ * - 'meta-llama/llama-3.1-8b-instruct' - Very cheap, good for simple tasks
21
+ * - 'mistralai/mistral-7b-instruct' - Budget-friendly, solid performance
22
+ *
23
+ * Balanced options:
24
+ * - 'anthropic/claude-sonnet-4' - Good balance of quality and cost
25
+ * - 'openai/gpt-4o-mini' - Fast, cheap, capable
26
+ *
27
+ * Quality-optimized options:
28
+ * - 'anthropic/claude-opus-4' - Highest Claude quality
29
+ * - 'openai/gpt-4-turbo' - High quality, good for complex tasks
30
+ *
31
+ * Consider: What's your primary use case? Development/testing (use cheaper),
32
+ * production (use quality), or experimentation (use balanced)?
33
+ */
34
+ function getDefaultModel() {
35
+ // Using Gemini Flash - fast, cheap, and good tool use support
36
+ // Change to 'anthropic/claude-sonnet-4' for higher quality
37
+ return 'google/gemini-2.0-flash-001';
38
+ }
39
+ // =============================================================================
40
+ // OPENROUTER PROVIDER
41
+ // =============================================================================
42
+ export class OpenRouterProvider {
43
+ name = 'openrouter';
44
+ defaultModel;
45
+ apiKey;
46
+ model;
47
+ baseUrl = 'https://openrouter.ai/api/v1';
48
+ siteUrl;
49
+ siteName;
50
+ networkConfig;
51
+ constructor(config) {
52
+ this.apiKey = config?.apiKey ?? requireEnv('OPENROUTER_API_KEY');
53
+ this.defaultModel = getDefaultModel();
54
+ this.model = config?.model ?? process.env.OPENROUTER_MODEL ?? this.defaultModel;
55
+ this.siteUrl = config?.siteUrl ?? process.env.OPENROUTER_SITE_URL;
56
+ this.siteName = config?.siteName ?? process.env.OPENROUTER_SITE_NAME;
57
+ this.networkConfig = {
58
+ timeout: 120000, // 2 minutes
59
+ maxRetries: 3,
60
+ baseRetryDelay: 1000,
61
+ };
62
+ }
63
+ isConfigured() {
64
+ return hasEnv('OPENROUTER_API_KEY');
65
+ }
66
+ async chat(messages, options) {
67
+ const model = options?.model ?? this.model;
68
+ // OpenRouter uses OpenAI-compatible message format
69
+ const openRouterMessages = messages.map(m => ({
70
+ role: m.role,
71
+ content: m.content,
72
+ }));
73
+ // Build request body (OpenAI-compatible)
74
+ const body = {
75
+ model,
76
+ messages: openRouterMessages,
77
+ max_tokens: options?.maxTokens ?? 4096,
78
+ temperature: options?.temperature ?? 0.7,
79
+ ...(options?.stopSequences && { stop: options.stopSequences }),
80
+ // Enable usage accounting to get actual cost from OpenRouter
81
+ usage: { include: true },
82
+ };
83
+ // OpenRouter requires specific headers for analytics
84
+ const headers = {
85
+ 'Content-Type': 'application/json',
86
+ 'Authorization': `Bearer ${this.apiKey}`,
87
+ };
88
+ // Optional headers for OpenRouter analytics/rate limits
89
+ if (this.siteUrl) {
90
+ headers['HTTP-Referer'] = this.siteUrl;
91
+ }
92
+ if (this.siteName) {
93
+ headers['X-Title'] = this.siteName;
94
+ }
95
+ try {
96
+ const { response } = await resilientFetch({
97
+ url: `${this.baseUrl}/chat/completions`,
98
+ init: {
99
+ method: 'POST',
100
+ headers,
101
+ body: JSON.stringify(body),
102
+ },
103
+ providerName: this.name,
104
+ networkConfig: this.networkConfig,
105
+ onRetry: (attempt, delay, error) => {
106
+ console.warn(`[OpenRouter] Retry attempt ${attempt} after ${delay}ms: ${error.message}`);
107
+ },
108
+ });
109
+ if (!response.ok) {
110
+ const error = await response.text();
111
+ throw this.handleError(response.status, error);
112
+ }
113
+ const data = await response.json();
114
+ const choice = data.choices[0];
115
+ // Get cost: try inline first, then query generation endpoint
116
+ let cost = data.usage.cost;
117
+ if (cost === undefined && data.id) {
118
+ cost = await this.queryGenerationCost(data.id);
119
+ }
120
+ return {
121
+ content: choice.message.content,
122
+ stopReason: this.mapStopReason(choice.finish_reason),
123
+ usage: {
124
+ inputTokens: data.usage.prompt_tokens,
125
+ outputTokens: data.usage.completion_tokens,
126
+ cost,
127
+ },
128
+ };
129
+ }
130
+ catch (error) {
131
+ if (error instanceof ProviderError)
132
+ throw error;
133
+ throw new ProviderError(`OpenRouter request failed: ${error.message}`, this.name, 'NETWORK_ERROR', error);
134
+ }
135
+ }
136
+ /**
137
+ * ═══════════════════════════════════════════════════════════════════════════
138
+ * NATIVE TOOL USE: Why This Matters
139
+ * ═══════════════════════════════════════════════════════════════════════════
140
+ *
141
+ * Before (Lesson 1): Parse JSON from text response
142
+ * LLM returns: "I'll use the read_file tool:\n```json\n{\"path\": \"x.ts\"}\n```"
143
+ * We parse: Extract JSON with regex → JSON.parse → Hope it's valid
144
+ * Problems: Hallucinated formats, partial JSON, extra text
145
+ *
146
+ * After (Native tool use):
147
+ * LLM returns: { tool_calls: [{ function: { name: "read_file", arguments: "{\"path\":\"x.ts\"}" }}] }
148
+ * We use: Structured response → Always valid JSON → Type-safe
149
+ * Benefits: No parsing errors, proper function calling semantics
150
+ *
151
+ * This method enables native tool use through OpenRouter's OpenAI-compatible API.
152
+ * ═══════════════════════════════════════════════════════════════════════════
153
+ */
154
+ async chatWithTools(messages, options) {
155
+ const model = options?.model ?? this.model;
156
+ // Convert messages to OpenRouter format
157
+ // This handles both simple string content and structured content with cache_control
158
+ const openRouterMessages = messages.map(m => {
159
+ // Handle tool role messages (results from tool execution)
160
+ if ('tool_call_id' in m && m.role === 'tool') {
161
+ const toolMsg = {
162
+ role: 'tool',
163
+ content: typeof m.content === 'string' ? m.content : m.content.map(c => c.text).join(''),
164
+ tool_call_id: m.tool_call_id,
165
+ };
166
+ // Include name if present (required for Gemini)
167
+ if ('name' in m && m.name) {
168
+ toolMsg.name = m.name;
169
+ }
170
+ return toolMsg;
171
+ }
172
+ // Handle assistant messages with tool calls
173
+ if ('tool_calls' in m && m.tool_calls) {
174
+ return {
175
+ role: 'assistant',
176
+ content: typeof m.content === 'string' ? m.content : (m.content.length > 0 ? m.content.map(c => c.text).join('') : null),
177
+ tool_calls: m.tool_calls,
178
+ };
179
+ }
180
+ // Handle structured content (with potential cache_control)
181
+ if (typeof m.content !== 'string') {
182
+ return {
183
+ role: m.role,
184
+ content: m.content, // Pass through structured content for caching
185
+ };
186
+ }
187
+ // Simple string content
188
+ return {
189
+ role: m.role,
190
+ content: m.content,
191
+ };
192
+ });
193
+ // Build request body with tool definitions
194
+ const body = {
195
+ model,
196
+ messages: openRouterMessages,
197
+ max_tokens: options?.maxTokens ?? 4096,
198
+ temperature: options?.temperature ?? 0.7,
199
+ ...(options?.stopSequences && { stop: options.stopSequences }),
200
+ // Enable usage accounting to get cached_tokens in response
201
+ usage: { include: true },
202
+ };
203
+ // Add tool definitions if provided
204
+ if (options?.tools && options.tools.length > 0) {
205
+ body.tools = options.tools;
206
+ body.tool_choice = options?.tool_choice ?? 'auto';
207
+ }
208
+ const headers = {
209
+ 'Content-Type': 'application/json',
210
+ 'Authorization': `Bearer ${this.apiKey}`,
211
+ };
212
+ if (this.siteUrl) {
213
+ headers['HTTP-Referer'] = this.siteUrl;
214
+ }
215
+ if (this.siteName) {
216
+ headers['X-Title'] = this.siteName;
217
+ }
218
+ try {
219
+ const { response } = await resilientFetch({
220
+ url: `${this.baseUrl}/chat/completions`,
221
+ init: {
222
+ method: 'POST',
223
+ headers,
224
+ body: JSON.stringify(body),
225
+ },
226
+ providerName: this.name,
227
+ networkConfig: this.networkConfig,
228
+ onRetry: (attempt, delay, error) => {
229
+ console.warn(`[OpenRouter] Retry attempt ${attempt} after ${delay}ms: ${error.message}`);
230
+ },
231
+ });
232
+ if (!response.ok) {
233
+ const error = await response.text();
234
+ throw this.handleError(response.status, error);
235
+ }
236
+ const data = await response.json();
237
+ const choice = data.choices[0];
238
+ // Get cost: try inline first, then query generation endpoint
239
+ let cost = data.usage.cost;
240
+ if (cost === undefined && data.id) {
241
+ cost = await this.queryGenerationCost(data.id);
242
+ }
243
+ if (process.env.DEBUG_COST) {
244
+ console.log('[OpenRouter] Response ID:', data.id);
245
+ console.log('[OpenRouter] Usage:', JSON.stringify(data.usage));
246
+ console.log('[OpenRouter] Final cost:', cost);
247
+ }
248
+ // Extract tool calls if present
249
+ const toolCalls = choice.message.tool_calls?.map(tc => ({
250
+ id: tc.id,
251
+ type: tc.type,
252
+ function: {
253
+ name: tc.function.name,
254
+ arguments: tc.function.arguments,
255
+ },
256
+ }));
257
+ return {
258
+ content: choice.message.content ?? '',
259
+ stopReason: this.mapStopReason(choice.finish_reason),
260
+ usage: {
261
+ inputTokens: data.usage.prompt_tokens,
262
+ outputTokens: data.usage.completion_tokens,
263
+ cachedTokens: data.usage.prompt_tokens_details?.cached_tokens,
264
+ // Use actual cost from OpenRouter
265
+ cost,
266
+ },
267
+ toolCalls,
268
+ };
269
+ }
270
+ catch (error) {
271
+ if (error instanceof ProviderError)
272
+ throw error;
273
+ throw new ProviderError(`OpenRouter request failed: ${error.message}`, this.name, 'NETWORK_ERROR', error);
274
+ }
275
+ }
276
+ /**
277
+ * Query the generation endpoint to get actual cost with retry.
278
+ * OpenRouter's generation data may not be immediately available after completion,
279
+ * so we retry with exponential backoff.
280
+ */
281
+ async queryGenerationCost(generationId) {
282
+ const maxRetries = 3;
283
+ const delays = [100, 300, 600]; // ms - exponential backoff
284
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
285
+ try {
286
+ // Wait before querying (generation data needs time to propagate)
287
+ await new Promise(resolve => setTimeout(resolve, delays[attempt]));
288
+ const response = await fetch(`${this.baseUrl}/generation?id=${generationId}`, {
289
+ method: 'GET',
290
+ headers: {
291
+ 'Authorization': `Bearer ${this.apiKey}`,
292
+ },
293
+ });
294
+ if (!response.ok) {
295
+ if (process.env.DEBUG_COST) {
296
+ console.log(`[OpenRouter] Generation query attempt ${attempt + 1} failed:`, response.status);
297
+ }
298
+ continue; // Retry on non-OK response
299
+ }
300
+ const data = await response.json();
301
+ // OpenRouter returns cost in data.total_cost or data.usage
302
+ const cost = data.data?.total_cost ?? data.data?.usage;
303
+ if (process.env.DEBUG_COST) {
304
+ console.log(`[OpenRouter] Generation attempt ${attempt + 1}:`, JSON.stringify(data.data));
305
+ console.log('[OpenRouter] Cost from generation:', cost);
306
+ }
307
+ // If we got a valid cost, return it
308
+ if (cost !== undefined && cost > 0) {
309
+ return cost;
310
+ }
311
+ // Cost not ready yet, continue to retry
312
+ if (process.env.DEBUG_COST) {
313
+ console.log(`[OpenRouter] Cost not ready, attempt ${attempt + 1}/${maxRetries}`);
314
+ }
315
+ }
316
+ catch (err) {
317
+ if (process.env.DEBUG_COST) {
318
+ console.log(`[OpenRouter] Generation query error attempt ${attempt + 1}:`, err);
319
+ }
320
+ }
321
+ }
322
+ if (process.env.DEBUG_COST) {
323
+ console.log('[OpenRouter] Failed to get cost after all retries');
324
+ }
325
+ return undefined;
326
+ }
327
+ handleError(status, body) {
328
+ let code = 'UNKNOWN';
329
+ if (status === 401)
330
+ code = 'AUTHENTICATION_FAILED';
331
+ else if (status === 429)
332
+ code = 'RATE_LIMITED';
333
+ else if (status === 400) {
334
+ if (body.includes('context_length')) {
335
+ code = 'CONTEXT_LENGTH_EXCEEDED';
336
+ }
337
+ else {
338
+ code = 'INVALID_REQUEST';
339
+ }
340
+ }
341
+ else if (status >= 500)
342
+ code = 'SERVER_ERROR';
343
+ return new ProviderError(`OpenRouter API error (${status}): ${body}`, this.name, code);
344
+ }
345
+ mapStopReason(reason) {
346
+ switch (reason) {
347
+ case 'stop': return 'end_turn';
348
+ case 'length': return 'max_tokens';
349
+ case 'stop_sequence': return 'stop_sequence';
350
+ case 'tool_calls': return 'end_turn'; // Tool calls are a form of completion
351
+ default: return 'end_turn';
352
+ }
353
+ }
354
+ }
355
+ // =============================================================================
356
+ // REGISTRATION
357
+ // =============================================================================
358
+ registerProvider('openrouter', {
359
+ priority: 0, // Highest priority - becomes default when configured
360
+ detect: () => hasEnv('OPENROUTER_API_KEY'),
361
+ create: async () => new OpenRouterProvider(),
362
+ });
363
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../../src/providers/adapters/openrouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Lesson 2: Provider Factory
3
+ *
4
+ * Creates and manages LLM providers with auto-detection.
5
+ */
6
+ import type { LLMProvider, ProviderConfig } from './types.js';
7
+ /**
8
+ * Registry of available providers.
9
+ * Each provider has a detection function and factory.
10
+ */
11
+ interface ProviderRegistry {
12
+ detect: () => boolean;
13
+ create: () => Promise<LLMProvider>;
14
+ priority: number;
15
+ }
16
+ /**
17
+ * Register a provider.
18
+ * Call this for each provider adapter.
19
+ */
20
+ export declare function registerProvider(name: string, registry: ProviderRegistry): void;
21
+ /**
22
+ * Auto-detect and create the best available provider.
23
+ *
24
+ * Detection order (by priority):
25
+ * 0. OpenRouter (if OPENROUTER_API_KEY set)
26
+ * 1. Anthropic (if ANTHROPIC_API_KEY set)
27
+ * 2. OpenAI (if OPENAI_API_KEY set)
28
+ * 3. Azure (if AZURE_OPENAI_* set)
29
+ * 100. Mock (always available as fallback)
30
+ */
31
+ export declare function getProvider(preferred?: string): Promise<LLMProvider>;
32
+ /**
33
+ * Create a provider from explicit configuration.
34
+ * Use this when you don't want auto-detection.
35
+ */
36
+ export declare function createProvider(config: ProviderConfig): Promise<LLMProvider>;
37
+ /**
38
+ * List all registered providers and their status.
39
+ */
40
+ export declare function listProviders(): Array<{
41
+ name: string;
42
+ configured: boolean;
43
+ priority: number;
44
+ }>;
45
+ /**
46
+ * Check if an environment variable is set and non-empty.
47
+ */
48
+ export declare function hasEnv(key: string): boolean;
49
+ /**
50
+ * Get environment variable or throw.
51
+ */
52
+ export declare function requireEnv(key: string): string;
53
+ export {};
54
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/providers/provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO9D;;;GAGG;AACH,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,gBAAgB,GACzB,IAAI,CAEN;AAMD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA8B1E;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CA8BjF;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ9F;AAMD;;GAEG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG3C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM9C"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Lesson 2: Provider Factory
3
+ *
4
+ * Creates and manages LLM providers with auto-detection.
5
+ */
6
+ import { ProviderError } from './types.js';
7
+ const providers = new Map();
8
+ /**
9
+ * Register a provider.
10
+ * Call this for each provider adapter.
11
+ */
12
+ export function registerProvider(name, registry) {
13
+ providers.set(name, registry);
14
+ }
15
+ // =============================================================================
16
+ // PROVIDER FACTORY
17
+ // =============================================================================
18
+ /**
19
+ * Auto-detect and create the best available provider.
20
+ *
21
+ * Detection order (by priority):
22
+ * 0. OpenRouter (if OPENROUTER_API_KEY set)
23
+ * 1. Anthropic (if ANTHROPIC_API_KEY set)
24
+ * 2. OpenAI (if OPENAI_API_KEY set)
25
+ * 3. Azure (if AZURE_OPENAI_* set)
26
+ * 100. Mock (always available as fallback)
27
+ */
28
+ export async function getProvider(preferred) {
29
+ // If preferred provider specified, try it first
30
+ if (preferred) {
31
+ const registry = providers.get(preferred);
32
+ if (registry?.detect()) {
33
+ return registry.create();
34
+ }
35
+ throw new ProviderError(`Preferred provider "${preferred}" is not configured`, preferred, 'NOT_CONFIGURED');
36
+ }
37
+ // Sort by priority and find first configured provider
38
+ const sorted = [...providers.entries()]
39
+ .sort((a, b) => a[1].priority - b[1].priority);
40
+ for (const [name, registry] of sorted) {
41
+ if (registry.detect()) {
42
+ console.log(`🔌 Using provider: ${name}`);
43
+ return registry.create();
44
+ }
45
+ }
46
+ throw new ProviderError('No LLM provider configured. Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or AZURE_OPENAI_* environment variables.', 'none', 'NOT_CONFIGURED');
47
+ }
48
+ /**
49
+ * Create a provider from explicit configuration.
50
+ * Use this when you don't want auto-detection.
51
+ */
52
+ export async function createProvider(config) {
53
+ switch (config.type) {
54
+ case 'anthropic': {
55
+ const { AnthropicProvider } = await import('./adapters/anthropic.js');
56
+ return new AnthropicProvider(config.config);
57
+ }
58
+ case 'openai': {
59
+ const { OpenAIProvider } = await import('./adapters/openai.js');
60
+ return new OpenAIProvider(config.config);
61
+ }
62
+ // Azure provider not included in attocode
63
+ // case 'azure': {
64
+ // const { AzureOpenAIProvider } = await import('./adapters/azure.js');
65
+ // return new AzureOpenAIProvider(config.config);
66
+ // }
67
+ case 'openrouter': {
68
+ const { OpenRouterProvider } = await import('./adapters/openrouter.js');
69
+ return new OpenRouterProvider(config.config);
70
+ }
71
+ case 'mock': {
72
+ const { MockProvider } = await import('./adapters/mock.js');
73
+ return new MockProvider();
74
+ }
75
+ default:
76
+ throw new ProviderError(`Unknown provider type: ${config.type}`, 'unknown', 'INVALID_REQUEST');
77
+ }
78
+ }
79
+ /**
80
+ * List all registered providers and their status.
81
+ */
82
+ export function listProviders() {
83
+ return [...providers.entries()]
84
+ .map(([name, registry]) => ({
85
+ name,
86
+ configured: registry.detect(),
87
+ priority: registry.priority,
88
+ }))
89
+ .sort((a, b) => a.priority - b.priority);
90
+ }
91
+ // =============================================================================
92
+ // HELPER FOR ADAPTER REGISTRATION
93
+ // =============================================================================
94
+ /**
95
+ * Check if an environment variable is set and non-empty.
96
+ */
97
+ export function hasEnv(key) {
98
+ const value = process.env[key];
99
+ return value !== undefined && value.trim() !== '';
100
+ }
101
+ /**
102
+ * Get environment variable or throw.
103
+ */
104
+ export function requireEnv(key) {
105
+ const value = process.env[key];
106
+ if (!value) {
107
+ throw new Error(`Missing required environment variable: ${key}`);
108
+ }
109
+ return value;
110
+ }
111
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Resilient Fetch Utility
3
+ *
4
+ * Provides network resilience for LLM provider requests:
5
+ * - Configurable timeout to prevent infinite hangs
6
+ * - Retry with exponential backoff for transient failures
7
+ * - Rate limit handling with Retry-After header parsing
8
+ * - Cancellation token support for user interrupts
9
+ */
10
+ /**
11
+ * Network configuration for resilient fetch.
12
+ */
13
+ export interface NetworkConfig {
14
+ /** Request timeout in milliseconds (default: 30000) */
15
+ timeout?: number;
16
+ /** Maximum retry attempts (default: 3) */
17
+ maxRetries?: number;
18
+ /** Base delay between retries in ms (default: 1000) */
19
+ baseRetryDelay?: number;
20
+ /** Maximum delay between retries in ms (default: 30000) */
21
+ maxRetryDelay?: number;
22
+ /** HTTP status codes that trigger retry (default: [429, 500, 502, 503, 504]) */
23
+ retryableStatusCodes?: number[];
24
+ }
25
+ /**
26
+ * Cancellation token interface for external cancellation.
27
+ */
28
+ export interface CancellationToken {
29
+ /** Whether cancellation has been requested */
30
+ isCancelled: boolean;
31
+ /** Register a callback to be called on cancellation */
32
+ onCancel?: (callback: () => void) => void;
33
+ }
34
+ /**
35
+ * Options for resilient fetch.
36
+ */
37
+ export interface ResilientFetchOptions {
38
+ /** URL to fetch */
39
+ url: string;
40
+ /** Fetch init options (method, headers, body, etc.) */
41
+ init: RequestInit;
42
+ /** Provider name for error messages */
43
+ providerName: string;
44
+ /** Network configuration */
45
+ networkConfig?: NetworkConfig;
46
+ /** External cancellation token */
47
+ cancellationToken?: CancellationToken;
48
+ /** Callback for retry events */
49
+ onRetry?: (attempt: number, delay: number, error: Error) => void;
50
+ }
51
+ /**
52
+ * Result of resilient fetch.
53
+ */
54
+ export interface ResilientFetchResult {
55
+ /** The fetch response */
56
+ response: Response;
57
+ /** Number of attempts made */
58
+ attempts: number;
59
+ /** Total duration in milliseconds */
60
+ duration: number;
61
+ }
62
+ /**
63
+ * Error thrown when fetch fails after all retries.
64
+ */
65
+ export declare class ResilientFetchError extends Error {
66
+ readonly providerName: string;
67
+ readonly attempts: number;
68
+ readonly lastError?: Error | undefined;
69
+ readonly isTimeout: boolean;
70
+ readonly isCancelled: boolean;
71
+ constructor(message: string, providerName: string, attempts: number, lastError?: Error | undefined, isTimeout?: boolean, isCancelled?: boolean);
72
+ }
73
+ /**
74
+ * Perform a fetch with timeout, retry, and cancellation support.
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const { response, attempts, duration } = await resilientFetch({
79
+ * url: 'https://api.anthropic.com/v1/messages',
80
+ * init: { method: 'POST', headers: {...}, body: JSON.stringify(body) },
81
+ * providerName: 'anthropic',
82
+ * networkConfig: { timeout: 60000, maxRetries: 3 },
83
+ * });
84
+ * ```
85
+ */
86
+ export declare function resilientFetch(options: ResilientFetchOptions): Promise<ResilientFetchResult>;
87
+ /**
88
+ * Check if an error is a resilient fetch error.
89
+ */
90
+ export declare function isResilientFetchError(error: unknown): error is ResilientFetchError;
91
+ /**
92
+ * Check if an error is a timeout error.
93
+ */
94
+ export declare function isTimeoutError(error: unknown): boolean;
95
+ /**
96
+ * Check if an error is a cancellation error.
97
+ */
98
+ export declare function isCancellationError(error: unknown): boolean;
99
+ //# sourceMappingURL=resilient-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resilient-fetch.d.ts","sourceRoot":"","sources":["../../../src/providers/resilient-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,mBAAmB;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,IAAI,EAAE,WAAW,CAAC;IAClB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kCAAkC;IAClC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,gCAAgC;IAChC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClE;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,YAAY,EAAE,MAAM;aACpB,QAAQ,EAAE,MAAM;aAChB,SAAS,CAAC,EAAE,KAAK;aACjB,SAAS,EAAE,OAAO;aAClB,WAAW,EAAE,OAAO;gBALpC,OAAO,EAAE,MAAM,EACC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,KAAK,YAAA,EACjB,SAAS,GAAE,OAAe,EAC1B,WAAW,GAAE,OAAe;CAK/C;AAkBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAmJ/B;AA0DD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE3D"}