@snoglobe/helios 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 (327) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +222 -0
  3. package/dist/app.d.ts +9 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +289 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/core/agent-loop.d.ts +16 -0
  8. package/dist/core/agent-loop.d.ts.map +1 -0
  9. package/dist/core/agent-loop.js +64 -0
  10. package/dist/core/agent-loop.js.map +1 -0
  11. package/dist/core/monitor.d.ts +15 -0
  12. package/dist/core/monitor.d.ts.map +1 -0
  13. package/dist/core/monitor.js +40 -0
  14. package/dist/core/monitor.js.map +1 -0
  15. package/dist/core/orchestrator.d.ts +51 -0
  16. package/dist/core/orchestrator.d.ts.map +1 -0
  17. package/dist/core/orchestrator.js +235 -0
  18. package/dist/core/orchestrator.js.map +1 -0
  19. package/dist/core/state-machine.d.ts +19 -0
  20. package/dist/core/state-machine.d.ts.map +1 -0
  21. package/dist/core/state-machine.js +42 -0
  22. package/dist/core/state-machine.js.map +1 -0
  23. package/dist/core/stickies.d.ts +20 -0
  24. package/dist/core/stickies.d.ts.map +1 -0
  25. package/dist/core/stickies.js +41 -0
  26. package/dist/core/stickies.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +68 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/memory/context-gate.d.ts +49 -0
  32. package/dist/memory/context-gate.d.ts.map +1 -0
  33. package/dist/memory/context-gate.js +109 -0
  34. package/dist/memory/context-gate.js.map +1 -0
  35. package/dist/memory/experiment-tracker.d.ts +21 -0
  36. package/dist/memory/experiment-tracker.d.ts.map +1 -0
  37. package/dist/memory/experiment-tracker.js +117 -0
  38. package/dist/memory/experiment-tracker.js.map +1 -0
  39. package/dist/memory/memory-store.d.ts +37 -0
  40. package/dist/memory/memory-store.d.ts.map +1 -0
  41. package/dist/memory/memory-store.js +150 -0
  42. package/dist/memory/memory-store.js.map +1 -0
  43. package/dist/memory/token-estimator.d.ts +7 -0
  44. package/dist/memory/token-estimator.d.ts.map +1 -0
  45. package/dist/memory/token-estimator.js +30 -0
  46. package/dist/memory/token-estimator.js.map +1 -0
  47. package/dist/metrics/analyzer.d.ts +15 -0
  48. package/dist/metrics/analyzer.d.ts.map +1 -0
  49. package/dist/metrics/analyzer.js +67 -0
  50. package/dist/metrics/analyzer.js.map +1 -0
  51. package/dist/metrics/collector.d.ts +23 -0
  52. package/dist/metrics/collector.d.ts.map +1 -0
  53. package/dist/metrics/collector.js +60 -0
  54. package/dist/metrics/collector.js.map +1 -0
  55. package/dist/metrics/parser.d.ts +21 -0
  56. package/dist/metrics/parser.d.ts.map +1 -0
  57. package/dist/metrics/parser.js +43 -0
  58. package/dist/metrics/parser.js.map +1 -0
  59. package/dist/metrics/parsers/csv.d.ts +8 -0
  60. package/dist/metrics/parsers/csv.d.ts.map +1 -0
  61. package/dist/metrics/parsers/csv.js +37 -0
  62. package/dist/metrics/parsers/csv.js.map +1 -0
  63. package/dist/metrics/parsers/json.d.ts +8 -0
  64. package/dist/metrics/parsers/json.d.ts.map +1 -0
  65. package/dist/metrics/parsers/json.js +42 -0
  66. package/dist/metrics/parsers/json.js.map +1 -0
  67. package/dist/metrics/parsers/stdout.d.ts +3 -0
  68. package/dist/metrics/parsers/stdout.d.ts.map +1 -0
  69. package/dist/metrics/parsers/stdout.js +79 -0
  70. package/dist/metrics/parsers/stdout.js.map +1 -0
  71. package/dist/metrics/parsers/tensorboard.d.ts +16 -0
  72. package/dist/metrics/parsers/tensorboard.d.ts.map +1 -0
  73. package/dist/metrics/parsers/tensorboard.js +22 -0
  74. package/dist/metrics/parsers/tensorboard.js.map +1 -0
  75. package/dist/metrics/store.d.ts +33 -0
  76. package/dist/metrics/store.d.ts.map +1 -0
  77. package/dist/metrics/store.js +141 -0
  78. package/dist/metrics/store.js.map +1 -0
  79. package/dist/providers/auth/auth-manager.d.ts +22 -0
  80. package/dist/providers/auth/auth-manager.d.ts.map +1 -0
  81. package/dist/providers/auth/auth-manager.js +77 -0
  82. package/dist/providers/auth/auth-manager.js.map +1 -0
  83. package/dist/providers/auth/token-store.d.ts +14 -0
  84. package/dist/providers/auth/token-store.d.ts.map +1 -0
  85. package/dist/providers/auth/token-store.js +55 -0
  86. package/dist/providers/auth/token-store.js.map +1 -0
  87. package/dist/providers/claude/provider.d.ts +46 -0
  88. package/dist/providers/claude/provider.d.ts.map +1 -0
  89. package/dist/providers/claude/provider.js +606 -0
  90. package/dist/providers/claude/provider.js.map +1 -0
  91. package/dist/providers/openai/callback-server.d.ts +11 -0
  92. package/dist/providers/openai/callback-server.d.ts.map +1 -0
  93. package/dist/providers/openai/callback-server.js +58 -0
  94. package/dist/providers/openai/callback-server.js.map +1 -0
  95. package/dist/providers/openai/oauth.d.ts +16 -0
  96. package/dist/providers/openai/oauth.d.ts.map +1 -0
  97. package/dist/providers/openai/oauth.js +110 -0
  98. package/dist/providers/openai/oauth.js.map +1 -0
  99. package/dist/providers/openai/provider.d.ts +29 -0
  100. package/dist/providers/openai/provider.d.ts.map +1 -0
  101. package/dist/providers/openai/provider.js +363 -0
  102. package/dist/providers/openai/provider.js.map +1 -0
  103. package/dist/providers/retry.d.ts +6 -0
  104. package/dist/providers/retry.d.ts.map +1 -0
  105. package/dist/providers/retry.js +13 -0
  106. package/dist/providers/retry.js.map +1 -0
  107. package/dist/providers/sse.d.ts +6 -0
  108. package/dist/providers/sse.d.ts.map +1 -0
  109. package/dist/providers/sse.js +35 -0
  110. package/dist/providers/sse.js.map +1 -0
  111. package/dist/providers/types.d.ts +102 -0
  112. package/dist/providers/types.d.ts.map +1 -0
  113. package/dist/providers/types.js +11 -0
  114. package/dist/providers/types.js.map +1 -0
  115. package/dist/remote/config.d.ts +14 -0
  116. package/dist/remote/config.d.ts.map +1 -0
  117. package/dist/remote/config.js +81 -0
  118. package/dist/remote/config.js.map +1 -0
  119. package/dist/remote/connection-pool.d.ts +26 -0
  120. package/dist/remote/connection-pool.d.ts.map +1 -0
  121. package/dist/remote/connection-pool.js +268 -0
  122. package/dist/remote/connection-pool.js.map +1 -0
  123. package/dist/remote/executor.d.ts +23 -0
  124. package/dist/remote/executor.d.ts.map +1 -0
  125. package/dist/remote/executor.js +53 -0
  126. package/dist/remote/executor.js.map +1 -0
  127. package/dist/remote/file-sync.d.ts +19 -0
  128. package/dist/remote/file-sync.d.ts.map +1 -0
  129. package/dist/remote/file-sync.js +44 -0
  130. package/dist/remote/file-sync.js.map +1 -0
  131. package/dist/remote/types.d.ts +33 -0
  132. package/dist/remote/types.d.ts.map +1 -0
  133. package/dist/remote/types.js +2 -0
  134. package/dist/remote/types.js.map +1 -0
  135. package/dist/scheduler/sleep-manager.d.ts +33 -0
  136. package/dist/scheduler/sleep-manager.d.ts.map +1 -0
  137. package/dist/scheduler/sleep-manager.js +132 -0
  138. package/dist/scheduler/sleep-manager.js.map +1 -0
  139. package/dist/scheduler/ssh-batcher.d.ts +23 -0
  140. package/dist/scheduler/ssh-batcher.d.ts.map +1 -0
  141. package/dist/scheduler/ssh-batcher.js +98 -0
  142. package/dist/scheduler/ssh-batcher.js.map +1 -0
  143. package/dist/scheduler/state-store.d.ts +8 -0
  144. package/dist/scheduler/state-store.d.ts.map +1 -0
  145. package/dist/scheduler/state-store.js +48 -0
  146. package/dist/scheduler/state-store.js.map +1 -0
  147. package/dist/scheduler/trigger-scheduler.d.ts +24 -0
  148. package/dist/scheduler/trigger-scheduler.d.ts.map +1 -0
  149. package/dist/scheduler/trigger-scheduler.js +142 -0
  150. package/dist/scheduler/trigger-scheduler.js.map +1 -0
  151. package/dist/scheduler/triggers/file.d.ts +4 -0
  152. package/dist/scheduler/triggers/file.d.ts.map +1 -0
  153. package/dist/scheduler/triggers/file.js +39 -0
  154. package/dist/scheduler/triggers/file.js.map +1 -0
  155. package/dist/scheduler/triggers/metric.d.ts +4 -0
  156. package/dist/scheduler/triggers/metric.d.ts.map +1 -0
  157. package/dist/scheduler/triggers/metric.js +74 -0
  158. package/dist/scheduler/triggers/metric.js.map +1 -0
  159. package/dist/scheduler/triggers/process-exit.d.ts +4 -0
  160. package/dist/scheduler/triggers/process-exit.d.ts.map +1 -0
  161. package/dist/scheduler/triggers/process-exit.js +13 -0
  162. package/dist/scheduler/triggers/process-exit.js.map +1 -0
  163. package/dist/scheduler/triggers/resource.d.ts +4 -0
  164. package/dist/scheduler/triggers/resource.d.ts.map +1 -0
  165. package/dist/scheduler/triggers/resource.js +54 -0
  166. package/dist/scheduler/triggers/resource.js.map +1 -0
  167. package/dist/scheduler/triggers/timer.d.ts +3 -0
  168. package/dist/scheduler/triggers/timer.d.ts.map +1 -0
  169. package/dist/scheduler/triggers/timer.js +4 -0
  170. package/dist/scheduler/triggers/timer.js.map +1 -0
  171. package/dist/scheduler/triggers/types.d.ts +95 -0
  172. package/dist/scheduler/triggers/types.d.ts.map +1 -0
  173. package/dist/scheduler/triggers/types.js +11 -0
  174. package/dist/scheduler/triggers/types.js.map +1 -0
  175. package/dist/store/database.d.ts +5 -0
  176. package/dist/store/database.d.ts.map +1 -0
  177. package/dist/store/database.js +29 -0
  178. package/dist/store/database.js.map +1 -0
  179. package/dist/store/migrations.d.ts +3 -0
  180. package/dist/store/migrations.d.ts.map +1 -0
  181. package/dist/store/migrations.js +124 -0
  182. package/dist/store/migrations.js.map +1 -0
  183. package/dist/store/preferences.d.ts +7 -0
  184. package/dist/store/preferences.d.ts.map +1 -0
  185. package/dist/store/preferences.js +26 -0
  186. package/dist/store/preferences.js.map +1 -0
  187. package/dist/store/session-store.d.ts +29 -0
  188. package/dist/store/session-store.d.ts.map +1 -0
  189. package/dist/store/session-store.js +103 -0
  190. package/dist/store/session-store.js.map +1 -0
  191. package/dist/tools/clear-metrics.d.ts +5 -0
  192. package/dist/tools/clear-metrics.d.ts.map +1 -0
  193. package/dist/tools/clear-metrics.js +27 -0
  194. package/dist/tools/clear-metrics.js.map +1 -0
  195. package/dist/tools/compare-runs.d.ts +4 -0
  196. package/dist/tools/compare-runs.d.ts.map +1 -0
  197. package/dist/tools/compare-runs.js +77 -0
  198. package/dist/tools/compare-runs.js.map +1 -0
  199. package/dist/tools/consult.d.ts +3 -0
  200. package/dist/tools/consult.d.ts.map +1 -0
  201. package/dist/tools/consult.js +62 -0
  202. package/dist/tools/consult.js.map +1 -0
  203. package/dist/tools/file-ops.d.ts +6 -0
  204. package/dist/tools/file-ops.d.ts.map +1 -0
  205. package/dist/tools/file-ops.js +158 -0
  206. package/dist/tools/file-ops.js.map +1 -0
  207. package/dist/tools/kill-task.d.ts +6 -0
  208. package/dist/tools/kill-task.d.ts.map +1 -0
  209. package/dist/tools/kill-task.js +55 -0
  210. package/dist/tools/kill-task.js.map +1 -0
  211. package/dist/tools/list-machines.d.ts +4 -0
  212. package/dist/tools/list-machines.d.ts.map +1 -0
  213. package/dist/tools/list-machines.js +24 -0
  214. package/dist/tools/list-machines.js.map +1 -0
  215. package/dist/tools/memory-tools.d.ts +8 -0
  216. package/dist/tools/memory-tools.d.ts.map +1 -0
  217. package/dist/tools/memory-tools.js +122 -0
  218. package/dist/tools/memory-tools.js.map +1 -0
  219. package/dist/tools/metrics-query.d.ts +4 -0
  220. package/dist/tools/metrics-query.d.ts.map +1 -0
  221. package/dist/tools/metrics-query.js +69 -0
  222. package/dist/tools/metrics-query.js.map +1 -0
  223. package/dist/tools/monitor.d.ts +5 -0
  224. package/dist/tools/monitor.d.ts.map +1 -0
  225. package/dist/tools/monitor.js +64 -0
  226. package/dist/tools/monitor.js.map +1 -0
  227. package/dist/tools/remote-exec.d.ts +6 -0
  228. package/dist/tools/remote-exec.d.ts.map +1 -0
  229. package/dist/tools/remote-exec.js +98 -0
  230. package/dist/tools/remote-exec.js.map +1 -0
  231. package/dist/tools/remote-sync.d.ts +5 -0
  232. package/dist/tools/remote-sync.d.ts.map +1 -0
  233. package/dist/tools/remote-sync.js +57 -0
  234. package/dist/tools/remote-sync.js.map +1 -0
  235. package/dist/tools/show-metrics.d.ts +4 -0
  236. package/dist/tools/show-metrics.d.ts.map +1 -0
  237. package/dist/tools/show-metrics.js +69 -0
  238. package/dist/tools/show-metrics.js.map +1 -0
  239. package/dist/tools/sleep.d.ts +4 -0
  240. package/dist/tools/sleep.d.ts.map +1 -0
  241. package/dist/tools/sleep.js +116 -0
  242. package/dist/tools/sleep.js.map +1 -0
  243. package/dist/tools/task-output.d.ts +5 -0
  244. package/dist/tools/task-output.d.ts.map +1 -0
  245. package/dist/tools/task-output.js +51 -0
  246. package/dist/tools/task-output.js.map +1 -0
  247. package/dist/tools/web-fetch.d.ts +3 -0
  248. package/dist/tools/web-fetch.d.ts.map +1 -0
  249. package/dist/tools/web-fetch.js +112 -0
  250. package/dist/tools/web-fetch.js.map +1 -0
  251. package/dist/ui/commands.d.ts +7 -0
  252. package/dist/ui/commands.d.ts.map +1 -0
  253. package/dist/ui/commands.js +21 -0
  254. package/dist/ui/commands.js.map +1 -0
  255. package/dist/ui/components/gradient-edge.d.ts +7 -0
  256. package/dist/ui/components/gradient-edge.d.ts.map +1 -0
  257. package/dist/ui/components/gradient-edge.js +33 -0
  258. package/dist/ui/components/gradient-edge.js.map +1 -0
  259. package/dist/ui/components/input-bar.d.ts +8 -0
  260. package/dist/ui/components/input-bar.d.ts.map +1 -0
  261. package/dist/ui/components/input-bar.js +139 -0
  262. package/dist/ui/components/input-bar.js.map +1 -0
  263. package/dist/ui/components/key-hint-rule.d.ts +2 -0
  264. package/dist/ui/components/key-hint-rule.d.ts.map +1 -0
  265. package/dist/ui/components/key-hint-rule.js +19 -0
  266. package/dist/ui/components/key-hint-rule.js.map +1 -0
  267. package/dist/ui/components/overlay-header.d.ts +6 -0
  268. package/dist/ui/components/overlay-header.d.ts.map +1 -0
  269. package/dist/ui/components/overlay-header.js +10 -0
  270. package/dist/ui/components/overlay-header.js.map +1 -0
  271. package/dist/ui/components/status-bar.d.ts +11 -0
  272. package/dist/ui/components/status-bar.d.ts.map +1 -0
  273. package/dist/ui/components/status-bar.js +55 -0
  274. package/dist/ui/components/status-bar.js.map +1 -0
  275. package/dist/ui/format.d.ts +12 -0
  276. package/dist/ui/format.d.ts.map +1 -0
  277. package/dist/ui/format.js +36 -0
  278. package/dist/ui/format.js.map +1 -0
  279. package/dist/ui/layout.d.ts +48 -0
  280. package/dist/ui/layout.d.ts.map +1 -0
  281. package/dist/ui/layout.js +857 -0
  282. package/dist/ui/layout.js.map +1 -0
  283. package/dist/ui/markdown.d.ts +7 -0
  284. package/dist/ui/markdown.d.ts.map +1 -0
  285. package/dist/ui/markdown.js +67 -0
  286. package/dist/ui/markdown.js.map +1 -0
  287. package/dist/ui/mouse-filter.d.ts +21 -0
  288. package/dist/ui/mouse-filter.d.ts.map +1 -0
  289. package/dist/ui/mouse-filter.js +66 -0
  290. package/dist/ui/mouse-filter.js.map +1 -0
  291. package/dist/ui/overlays/metrics-overlay.d.ts +11 -0
  292. package/dist/ui/overlays/metrics-overlay.d.ts.map +1 -0
  293. package/dist/ui/overlays/metrics-overlay.js +86 -0
  294. package/dist/ui/overlays/metrics-overlay.js.map +1 -0
  295. package/dist/ui/overlays/task-overlay.d.ts +12 -0
  296. package/dist/ui/overlays/task-overlay.d.ts.map +1 -0
  297. package/dist/ui/overlays/task-overlay.js +77 -0
  298. package/dist/ui/overlays/task-overlay.js.map +1 -0
  299. package/dist/ui/panels/conversation.d.ts +8 -0
  300. package/dist/ui/panels/conversation.d.ts.map +1 -0
  301. package/dist/ui/panels/conversation.js +216 -0
  302. package/dist/ui/panels/conversation.js.map +1 -0
  303. package/dist/ui/panels/metrics-dashboard.d.ts +8 -0
  304. package/dist/ui/panels/metrics-dashboard.d.ts.map +1 -0
  305. package/dist/ui/panels/metrics-dashboard.js +56 -0
  306. package/dist/ui/panels/metrics-dashboard.js.map +1 -0
  307. package/dist/ui/panels/sleep-panel.d.ts +7 -0
  308. package/dist/ui/panels/sleep-panel.d.ts.map +1 -0
  309. package/dist/ui/panels/sleep-panel.js +48 -0
  310. package/dist/ui/panels/sleep-panel.js.map +1 -0
  311. package/dist/ui/panels/sticky-notes.d.ts +8 -0
  312. package/dist/ui/panels/sticky-notes.d.ts.map +1 -0
  313. package/dist/ui/panels/sticky-notes.js +49 -0
  314. package/dist/ui/panels/sticky-notes.js.map +1 -0
  315. package/dist/ui/panels/task-list.d.ts +8 -0
  316. package/dist/ui/panels/task-list.d.ts.map +1 -0
  317. package/dist/ui/panels/task-list.js +39 -0
  318. package/dist/ui/panels/task-list.js.map +1 -0
  319. package/dist/ui/theme.d.ts +25 -0
  320. package/dist/ui/theme.d.ts.map +1 -0
  321. package/dist/ui/theme.js +50 -0
  322. package/dist/ui/theme.js.map +1 -0
  323. package/dist/version.d.ts +9 -0
  324. package/dist/version.d.ts.map +1 -0
  325. package/dist/version.js +62 -0
  326. package/dist/version.js.map +1 -0
  327. package/package.json +59 -0
@@ -0,0 +1,58 @@
1
+ import { Hono } from "hono";
2
+ import { serve } from "@hono/node-server";
3
+ /**
4
+ * Local HTTP server for OAuth callback.
5
+ * Listens on 127.0.0.1 for the redirect from the OAuth provider.
6
+ */
7
+ export function startCallbackServer(expectedState, port, path) {
8
+ return new Promise((resolve, reject) => {
9
+ const app = new Hono();
10
+ let server = null;
11
+ let timeoutTimer = null;
12
+ const cleanup = () => {
13
+ if (timeoutTimer) {
14
+ clearTimeout(timeoutTimer);
15
+ timeoutTimer = null;
16
+ }
17
+ if (server) {
18
+ server.close();
19
+ server = null;
20
+ }
21
+ };
22
+ app.get(path, (c) => {
23
+ const code = c.req.query("code");
24
+ const state = c.req.query("state");
25
+ const error = c.req.query("error");
26
+ const errorDescription = c.req.query("error_description");
27
+ if (error) {
28
+ setTimeout(cleanup, 100);
29
+ reject(new Error(`OAuth error: ${error}${errorDescription ? ` - ${errorDescription}` : ""}`));
30
+ return c.html("<html><body><h1>Authentication failed</h1><p>You can close this tab.</p></body></html>");
31
+ }
32
+ if (!code || !state) {
33
+ setTimeout(cleanup, 100);
34
+ reject(new Error("Missing code or state in callback"));
35
+ return c.html("<html><body><h1>Authentication failed</h1><p>Missing parameters.</p></body></html>");
36
+ }
37
+ if (state !== expectedState) {
38
+ setTimeout(cleanup, 100);
39
+ reject(new Error("State mismatch — possible CSRF attack"));
40
+ return c.html("<html><body><h1>Authentication failed</h1><p>Invalid state.</p></body></html>");
41
+ }
42
+ setTimeout(cleanup, 100);
43
+ resolve({ code, state });
44
+ return c.html("<html><body><h1>Authenticated!</h1><p>You can close this tab and return to Helios.</p></body></html>");
45
+ });
46
+ server = serve({
47
+ fetch: app.fetch,
48
+ port,
49
+ hostname: "localhost",
50
+ });
51
+ // Timeout after 5 minutes
52
+ timeoutTimer = setTimeout(() => {
53
+ cleanup();
54
+ reject(new Error("OAuth callback timed out after 5 minutes"));
55
+ }, 5 * 60 * 1000);
56
+ });
57
+ }
58
+ //# sourceMappingURL=callback-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.js","sourceRoot":"","sources":["../../../src/providers/openai/callback-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAQ1C;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,aAAqB,EACrB,IAAY,EACZ,IAAY;IAEZ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,YAAY,GAAyC,IAAI,CAAC;QAE9D,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC3B,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;YAClB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAE1D,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACzB,MAAM,CACJ,IAAI,KAAK,CACP,gBAAgB,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3E,CACF,CAAC;gBACF,OAAO,CAAC,CAAC,IAAI,CACX,wFAAwF,CACzF,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpB,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACzB,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;gBACvD,OAAO,CAAC,CAAC,IAAI,CACX,oFAAoF,CACrF,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;gBAC5B,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACzB,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,CAAC,IAAI,CACX,+EAA+E,CAChF,CAAC;YACJ,CAAC;YAED,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACzB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAEzB,OAAO,CAAC,CAAC,IAAI,CACX,sGAAsG,CACvG,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,KAAK,CAAC;YACb,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI;YACJ,QAAQ,EAAE,WAAW;SACtB,CAAsB,CAAC;QAExB,0BAA0B;QAC1B,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;QAChE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { AuthManager } from "../auth/auth-manager.js";
2
+ /**
3
+ * OpenAI OAuth 2.0 + PKCE flow.
4
+ * Authenticates via ChatGPT Plus/Pro subscription.
5
+ */
6
+ export declare class OpenAIOAuth {
7
+ private authManager;
8
+ constructor(authManager: AuthManager);
9
+ login(): Promise<void>;
10
+ refresh(refreshToken: string): Promise<{
11
+ accessToken: string;
12
+ refreshToken: string;
13
+ expiresAt: number;
14
+ }>;
15
+ }
16
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/oauth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAU3D;;;GAGG;AACH,qBAAa,WAAW;IACV,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,WAAW;IAEtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BtB,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAC3C,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CA4BH"}
@@ -0,0 +1,110 @@
1
+ import { randomBytes, createHash } from "node:crypto";
2
+ import { exec } from "node:child_process";
3
+ import { startCallbackServer } from "./callback-server.js";
4
+ const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
5
+ const AUTH_URL = "https://auth.openai.com/oauth/authorize";
6
+ const TOKEN_URL = "https://auth.openai.com/oauth/token";
7
+ const CALLBACK_PORT = 1455;
8
+ const CALLBACK_PATH = "/auth/callback";
9
+ const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
10
+ /**
11
+ * OpenAI OAuth 2.0 + PKCE flow.
12
+ * Authenticates via ChatGPT Plus/Pro subscription.
13
+ */
14
+ export class OpenAIOAuth {
15
+ authManager;
16
+ constructor(authManager) {
17
+ this.authManager = authManager;
18
+ }
19
+ async login() {
20
+ const { verifier, challenge } = generatePKCE();
21
+ const state = randomBytes(32).toString("hex");
22
+ const authUrl = buildAuthUrl(challenge, state);
23
+ // Start callback server in parallel with browser open
24
+ const codePromise = startCallbackServer(state, CALLBACK_PORT, CALLBACK_PATH);
25
+ // Open browser
26
+ openBrowser(authUrl);
27
+ // Wait for callback
28
+ const { code } = await codePromise;
29
+ // Exchange code for tokens
30
+ const tokens = await exchangeCode(code, verifier);
31
+ // Store
32
+ await this.authManager.setOAuthTokens("openai", tokens.accessToken, tokens.refreshToken, tokens.expiresAt);
33
+ }
34
+ async refresh(refreshToken) {
35
+ const resp = await fetch(TOKEN_URL, {
36
+ method: "POST",
37
+ headers: { "Content-Type": "application/json" },
38
+ body: JSON.stringify({
39
+ grant_type: "refresh_token",
40
+ client_id: CLIENT_ID,
41
+ refresh_token: refreshToken,
42
+ }),
43
+ });
44
+ if (!resp.ok) {
45
+ const text = await resp.text();
46
+ throw new Error(`Token refresh failed: ${resp.status} ${text}`);
47
+ }
48
+ const data = (await resp.json());
49
+ return {
50
+ accessToken: data.access_token,
51
+ refreshToken: data.refresh_token,
52
+ expiresAt: Date.now() + data.expires_in * 1000,
53
+ };
54
+ }
55
+ }
56
+ function generatePKCE() {
57
+ const verifier = randomBytes(32).toString("base64url");
58
+ const challenge = createHash("sha256")
59
+ .update(verifier)
60
+ .digest("base64url");
61
+ return { verifier, challenge };
62
+ }
63
+ function buildAuthUrl(challenge, state) {
64
+ const params = new URLSearchParams({
65
+ client_id: CLIENT_ID,
66
+ redirect_uri: REDIRECT_URI,
67
+ response_type: "code",
68
+ code_challenge: challenge,
69
+ code_challenge_method: "S256",
70
+ state,
71
+ scope: "openid profile email offline_access api.connectors.read api.connectors.invoke",
72
+ id_token_add_organizations: "true",
73
+ codex_cli_simplified_flow: "true",
74
+ originator: "codex_cli_rs",
75
+ });
76
+ return `${AUTH_URL}?${params.toString()}`;
77
+ }
78
+ async function exchangeCode(code, verifier) {
79
+ const body = new URLSearchParams({
80
+ grant_type: "authorization_code",
81
+ client_id: CLIENT_ID,
82
+ code,
83
+ code_verifier: verifier,
84
+ redirect_uri: REDIRECT_URI,
85
+ });
86
+ const resp = await fetch(TOKEN_URL, {
87
+ method: "POST",
88
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
89
+ body: body.toString(),
90
+ });
91
+ if (!resp.ok) {
92
+ const text = await resp.text();
93
+ throw new Error(`Token exchange failed: ${resp.status} ${text}`);
94
+ }
95
+ const data = (await resp.json());
96
+ return {
97
+ accessToken: data.access_token,
98
+ refreshToken: data.refresh_token,
99
+ expiresAt: Date.now() + data.expires_in * 1000,
100
+ };
101
+ }
102
+ function openBrowser(url) {
103
+ const cmd = process.platform === "darwin"
104
+ ? "open"
105
+ : process.platform === "win32"
106
+ ? "start"
107
+ : "xdg-open";
108
+ exec(`${cmd} "${url}"`);
109
+ }
110
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/providers/openai/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type ModelProvider, type ModelInfo, type ToolDefinition, type Session, type SessionConfig, type AgentEvent, type ReasoningEffort } from "../types.js";
2
+ import type { AuthManager } from "../auth/auth-manager.js";
3
+ export declare class OpenAIProvider implements ModelProvider {
4
+ readonly name: "openai";
5
+ readonly displayName = "OpenAI";
6
+ currentModel: string;
7
+ reasoningEffort: ReasoningEffort;
8
+ private authManager;
9
+ private sessionStore;
10
+ private oauth;
11
+ private abortController;
12
+ private instructions;
13
+ private conversationHistory;
14
+ constructor(authManager: AuthManager);
15
+ isAuthenticated(): Promise<boolean>;
16
+ authenticate(): Promise<void>;
17
+ fetchModels(): Promise<ModelInfo[]>;
18
+ private getDefaultModels;
19
+ createSession(config: SessionConfig): Promise<Session>;
20
+ resumeSession(id: string): Promise<Session>;
21
+ send(session: Session, message: string, tools: ToolDefinition[]): AsyncGenerator<AgentEvent>;
22
+ resetHistory(session: Session, briefingMessage: string): void;
23
+ interrupt(_session: Session): void;
24
+ closeSession(session: Session): Promise<void>;
25
+ private streamApi;
26
+ private parseSSEStream;
27
+ }
28
+ /** Error subclass for transient failures that should be retried. */
29
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAqC3D,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,WAAW,YAAY;IAChC,YAAY,EAAE,MAAM,CAAiB;IACrC,eAAe,EAAE,eAAe,CAAY;IAE5C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,mBAAmB,CAAqC;gBAEpD,WAAW,EAAE,WAAW;IAM9B,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB7B,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAmCzC,OAAO,CAAC,gBAAgB;IAalB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IActD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1C,IAAI,CACT,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,cAAc,EAAE,GACtB,cAAc,CAAC,UAAU,CAAC;IAgH7B,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAgB7D,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAO5B,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAOpC,SAAS;YA+DT,cAAc;CAwF9B;AAUD,oEAAoE"}
@@ -0,0 +1,363 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { CHECKPOINT_ACK, } from "../types.js";
3
+ import { TransientError, isTransient, sleep } from "../retry.js";
4
+ import { parseSSELines } from "../sse.js";
5
+ import { SessionStore } from "../../store/session-store.js";
6
+ import { OpenAIOAuth } from "./oauth.js";
7
+ const CODEX_API_URL = "https://chatgpt.com/backend-api/codex/responses";
8
+ const MODELS_API_URL = "https://chatgpt.com/backend-api/models";
9
+ const DEFAULT_MODEL = "gpt-5.4";
10
+ // ─── Provider ────────────────────────────────────────
11
+ export class OpenAIProvider {
12
+ name = "openai";
13
+ displayName = "OpenAI";
14
+ currentModel = DEFAULT_MODEL;
15
+ reasoningEffort = "medium";
16
+ authManager;
17
+ sessionStore;
18
+ oauth;
19
+ abortController = null;
20
+ instructions = new Map();
21
+ conversationHistory = new Map();
22
+ constructor(authManager) {
23
+ this.authManager = authManager;
24
+ this.sessionStore = new SessionStore();
25
+ this.oauth = new OpenAIOAuth(authManager);
26
+ }
27
+ async isAuthenticated() {
28
+ return this.authManager.isAuthenticated("openai");
29
+ }
30
+ async authenticate() {
31
+ const creds = await this.authManager.getCredentials("openai");
32
+ if (creds && !this.authManager.tokenStore.isExpired("openai"))
33
+ return;
34
+ if (creds?.refreshToken) {
35
+ try {
36
+ const tokens = await this.oauth.refresh(creds.refreshToken);
37
+ await this.authManager.setOAuthTokens("openai", tokens.accessToken, tokens.refreshToken, tokens.expiresAt);
38
+ return;
39
+ }
40
+ catch {
41
+ // Refresh failed, do full login
42
+ }
43
+ }
44
+ await this.oauth.login();
45
+ }
46
+ async fetchModels() {
47
+ const creds = await this.authManager.getCredentials("openai");
48
+ if (!creds?.accessToken)
49
+ throw new Error("Not authenticated");
50
+ try {
51
+ const resp = await fetch(MODELS_API_URL, {
52
+ headers: {
53
+ Authorization: `Bearer ${creds.accessToken}`,
54
+ },
55
+ });
56
+ if (!resp.ok)
57
+ return this.getDefaultModels();
58
+ const data = (await resp.json());
59
+ if (data.models && data.models.length > 0) {
60
+ return data.models.map((m) => ({
61
+ id: m.slug,
62
+ name: m.title ?? m.slug,
63
+ description: m.description,
64
+ }));
65
+ }
66
+ }
67
+ catch {
68
+ // Ignore
69
+ }
70
+ return this.getDefaultModels();
71
+ }
72
+ getDefaultModels() {
73
+ return [
74
+ { id: "gpt-5.4", name: "GPT-5.4", description: "Latest flagship, recommended (~400k)" },
75
+ { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Codex (~400k)" },
76
+ { id: "gpt-5.3-codex-spark", name: "GPT-5.3 Codex Spark", description: "Research preview, text-only (~400k)" },
77
+ { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Codex (~400k)" },
78
+ { id: "gpt-5.2", name: "GPT-5.2", description: "(~400k)" },
79
+ { id: "gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Max compute (~400k)" },
80
+ { id: "gpt-5.1", name: "GPT-5.1", description: "(~400k)" },
81
+ { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex (~400k)" },
82
+ ];
83
+ }
84
+ async createSession(config) {
85
+ const session = this.sessionStore.createSession("openai", config.model ?? this.currentModel);
86
+ this.conversationHistory.set(session.id, []);
87
+ if (config.systemPrompt) {
88
+ this.instructions.set(session.id, config.systemPrompt);
89
+ }
90
+ return session;
91
+ }
92
+ async resumeSession(id) {
93
+ const session = this.sessionStore.getSession(id);
94
+ if (!session)
95
+ throw new Error(`Session ${id} not found`);
96
+ if (!this.conversationHistory.has(id)) {
97
+ this.conversationHistory.set(id, []);
98
+ }
99
+ return session;
100
+ }
101
+ async *send(session, message, tools) {
102
+ const creds = await this.authManager.getCredentials("openai");
103
+ if (!creds?.accessToken)
104
+ throw new Error("Not authenticated");
105
+ const history = this.conversationHistory.get(session.id) ?? [];
106
+ // Add user message in Responses API format
107
+ history.push({
108
+ type: "message",
109
+ role: "user",
110
+ content: [{ type: "input_text", text: message }],
111
+ });
112
+ // Agent loop: send → stream response → tool calls → repeat
113
+ const MAX_RETRIES = 3;
114
+ let continueLoop = true;
115
+ while (continueLoop) {
116
+ continueLoop = false;
117
+ let result;
118
+ let lastError;
119
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
120
+ if (attempt > 0) {
121
+ const delayMs = Math.min(1000 * 2 ** (attempt - 1), 15000);
122
+ yield { type: "text", text: `\n*[retrying in ${Math.round(delayMs / 1000)}s — attempt ${attempt + 1}/${MAX_RETRIES + 1}]*\n`, delta: `\n*[retrying in ${Math.round(delayMs / 1000)}s — attempt ${attempt + 1}/${MAX_RETRIES + 1}]*\n` };
123
+ await sleep(delayMs);
124
+ }
125
+ try {
126
+ result = undefined;
127
+ for await (const event of this.streamApi(session, creds.accessToken, history, tools)) {
128
+ if (event.kind === "delta") {
129
+ yield { type: "text", text: event.text, delta: event.text };
130
+ }
131
+ else {
132
+ result = event;
133
+ }
134
+ }
135
+ break; // success
136
+ }
137
+ catch (err) {
138
+ lastError = err;
139
+ if (!isTransient(err) || attempt === MAX_RETRIES)
140
+ throw err;
141
+ // Transient error — retry
142
+ }
143
+ }
144
+ if (!result)
145
+ throw lastError ?? new Error("No response from API");
146
+ // Append response items to history
147
+ history.push(...result.responseItems);
148
+ // Emit server-handled tool calls (web search) for UI display
149
+ for (const stId of result.serverToolIds) {
150
+ yield { type: "tool_call", id: stId, name: "web_search", args: {} };
151
+ yield { type: "tool_result", callId: stId, result: "(server-executed)" };
152
+ }
153
+ if (result.toolCalls.length > 0) {
154
+ for (const tc of result.toolCalls) {
155
+ yield {
156
+ type: "tool_call",
157
+ id: tc.call_id,
158
+ name: tc.name,
159
+ args: tc.args,
160
+ };
161
+ const tool = tools.find((t) => t.name === tc.name);
162
+ let toolResult;
163
+ let isError = false;
164
+ if (!tool) {
165
+ toolResult = `Unknown tool: ${tc.name}`;
166
+ isError = true;
167
+ }
168
+ else {
169
+ try {
170
+ toolResult = await tool.execute(tc.args);
171
+ }
172
+ catch (err) {
173
+ toolResult = `Error: ${err instanceof Error ? err.message : String(err)}`;
174
+ isError = true;
175
+ }
176
+ }
177
+ yield { type: "tool_result", callId: tc.call_id, result: toolResult, isError };
178
+ history.push({
179
+ type: "function_call_output",
180
+ call_id: tc.call_id,
181
+ output: toolResult,
182
+ });
183
+ }
184
+ continueLoop = true;
185
+ }
186
+ if (!continueLoop) {
187
+ yield {
188
+ type: "done",
189
+ usage: result.usage
190
+ ? { inputTokens: result.usage.input_tokens, outputTokens: result.usage.output_tokens }
191
+ : undefined,
192
+ };
193
+ }
194
+ }
195
+ this.conversationHistory.set(session.id, history);
196
+ }
197
+ resetHistory(session, briefingMessage) {
198
+ // Replace conversation history with a single exchange containing the briefing
199
+ this.conversationHistory.set(session.id, [
200
+ {
201
+ type: "message",
202
+ role: "user",
203
+ content: [{ type: "input_text", text: briefingMessage }],
204
+ },
205
+ {
206
+ type: "message",
207
+ role: "assistant",
208
+ content: [{ type: "output_text", text: CHECKPOINT_ACK }],
209
+ },
210
+ ]);
211
+ }
212
+ interrupt(_session) {
213
+ if (this.abortController) {
214
+ this.abortController.abort();
215
+ this.abortController = null;
216
+ }
217
+ }
218
+ async closeSession(session) {
219
+ this.conversationHistory.delete(session.id);
220
+ this.instructions.delete(session.id);
221
+ }
222
+ // ─── Streaming API call ─────────────────────────────
223
+ async *streamApi(session, accessToken, input, tools) {
224
+ this.abortController = new AbortController();
225
+ const functionTools = tools.map((t) => ({
226
+ type: "function",
227
+ name: t.name,
228
+ description: t.description,
229
+ parameters: t.parameters,
230
+ strict: false,
231
+ }));
232
+ // Include OpenAI's built-in web search
233
+ const toolDefs = [
234
+ ...functionTools,
235
+ { type: "web_search", search_context_size: "medium" },
236
+ ];
237
+ const body = {
238
+ model: this.currentModel,
239
+ instructions: this.instructions.get(session.id) || "You are a helpful assistant.",
240
+ input,
241
+ tools: toolDefs,
242
+ tool_choice: "auto",
243
+ parallel_tool_calls: true,
244
+ reasoning: {
245
+ effort: this.reasoningEffort,
246
+ },
247
+ stream: true,
248
+ store: false,
249
+ include: [],
250
+ };
251
+ const resp = await fetch(CODEX_API_URL, {
252
+ method: "POST",
253
+ headers: {
254
+ Authorization: `Bearer ${accessToken}`,
255
+ "Content-Type": "application/json",
256
+ Accept: "text/event-stream",
257
+ originator: "codex_cli_rs",
258
+ },
259
+ body: JSON.stringify(body),
260
+ signal: this.abortController.signal,
261
+ });
262
+ if (!resp.ok) {
263
+ const errText = await resp.text();
264
+ const status = resp.status;
265
+ if (status === 429 || status >= 500) {
266
+ throw new TransientError(`OpenAI API error: ${status} ${errText}`);
267
+ }
268
+ throw new Error(`OpenAI API error: ${status} ${errText}`);
269
+ }
270
+ yield* this.parseSSEStream(resp);
271
+ }
272
+ // ─── SSE stream parser ──────────────────────────────
273
+ async *parseSSEStream(resp) {
274
+ let text = "";
275
+ const toolCalls = [];
276
+ const serverToolIds = [];
277
+ const responseItems = [];
278
+ let usage;
279
+ for await (const evt of parseSSELines(resp)) {
280
+ switch (evt.type) {
281
+ case "response.output_text.delta": {
282
+ if (evt.delta) {
283
+ text += evt.delta;
284
+ yield { kind: "delta", text: evt.delta };
285
+ }
286
+ break;
287
+ }
288
+ case "response.output_item.done": {
289
+ const item = evt.item;
290
+ if (!item)
291
+ break;
292
+ if (item.type === "message" && item.role === "assistant") {
293
+ responseItems.push({
294
+ type: "message",
295
+ role: "assistant",
296
+ content: item.content ?? [],
297
+ });
298
+ }
299
+ if (item.type === "function_call") {
300
+ const callId = item.call_id ?? randomUUID();
301
+ const args = safeJsonParse(item.arguments ?? "{}");
302
+ toolCalls.push({
303
+ call_id: callId,
304
+ name: item.name,
305
+ args,
306
+ });
307
+ responseItems.push({
308
+ type: "function_call",
309
+ name: item.name,
310
+ arguments: item.arguments ?? "{}",
311
+ call_id: callId,
312
+ });
313
+ }
314
+ if (item.type === "web_search_call") {
315
+ serverToolIds.push(item.id ?? randomUUID());
316
+ }
317
+ break;
318
+ }
319
+ case "response.completed": {
320
+ const r = evt.response;
321
+ const u = r?.usage;
322
+ if (u) {
323
+ usage = {
324
+ input_tokens: u.input_tokens ?? 0,
325
+ output_tokens: u.output_tokens ?? 0,
326
+ };
327
+ }
328
+ break;
329
+ }
330
+ case "response.failed": {
331
+ const r = evt.response;
332
+ const err = r?.error;
333
+ const msg = err?.message ?? "Response failed";
334
+ const code = err?.code ?? "";
335
+ // Server errors, rate limits, and generic "error occurred" messages are transient
336
+ if (code === "server_error" || code === "rate_limit_exceeded" || /error occurred|try again|server/i.test(msg)) {
337
+ throw new TransientError(msg);
338
+ }
339
+ throw new Error(msg);
340
+ }
341
+ }
342
+ }
343
+ // If we accumulated text but no assistant message item, create one for history
344
+ if (text && !responseItems.some((i) => i.type === "message")) {
345
+ responseItems.push({
346
+ type: "message",
347
+ role: "assistant",
348
+ content: [{ type: "output_text", text }],
349
+ });
350
+ }
351
+ yield { kind: "complete", text, toolCalls, serverToolIds, responseItems, usage };
352
+ }
353
+ }
354
+ function safeJsonParse(str) {
355
+ try {
356
+ return JSON.parse(str);
357
+ }
358
+ catch {
359
+ return {};
360
+ }
361
+ }
362
+ /** Error subclass for transient failures that should be retried. */
363
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/openai/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare class TransientError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare function isTransient(err: unknown): boolean;
5
+ export declare function sleep(ms: number): Promise<void>;
6
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/providers/retry.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEjD;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
@@ -0,0 +1,13 @@
1
+ export class TransientError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "TransientError";
5
+ }
6
+ }
7
+ export function isTransient(err) {
8
+ return err instanceof TransientError;
9
+ }
10
+ export function sleep(ms) {
11
+ return new Promise((resolve) => setTimeout(resolve, ms));
12
+ }
13
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/providers/retry.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,GAAG,YAAY,cAAc,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}