@wenathlan/devthink 2.0.13 → 2.0.15

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 (444) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/accounts.ts +2087 -0
  3. package/agent.ts +2331 -0
  4. package/antigravity.ts +2139 -0
  5. package/apifreeze.ts +4146 -0
  6. package/auth.ts +642 -0
  7. package/background.ts +16837 -0
  8. package/bridge.ts +2080 -0
  9. package/build.ts +54 -0
  10. package/bun.ts +26 -0
  11. package/capture.ts +1614 -0
  12. package/checksecrets.ts +72 -0
  13. package/cjs.ts +9 -0
  14. package/cli.ts +3500 -0
  15. package/commands.ts +1101 -0
  16. package/companion.ts +450 -0
  17. package/compatibility.ts +37 -0
  18. package/config.ts +3137 -0
  19. package/constants.ts +943 -0
  20. package/core.ts +1473 -0
  21. package/crossbrowser.ts +1359 -0
  22. package/dashdone.ts +605 -0
  23. package/data.ts +943 -0
  24. package/database.ts +133 -0
  25. package/debug.ts +850 -0
  26. package/deno.ts +27 -0
  27. package/devthink.ts +707 -0
  28. package/dist/accounts.d.ts +409 -0
  29. package/dist/agent.d.ts +837 -0
  30. package/dist/antigravity.d.ts +380 -0
  31. package/dist/apifreeze.d.ts +113 -0
  32. package/dist/auth.d.ts +224 -0
  33. package/{bridge.d.ts → dist/bridge.d.ts} +1 -1
  34. package/dist/capture.d.ts +595 -0
  35. package/dist/cjs.d.ts +6 -0
  36. package/{cli.js → dist/cli.js} +2 -2
  37. package/dist/commands.d.ts +310 -0
  38. package/dist/compatibility.d.ts +17 -0
  39. package/dist/config.d.ts +1853 -0
  40. package/dist/constants.d.ts +637 -0
  41. package/dist/core.d.ts +361 -0
  42. package/dist/data.d.ts +330 -0
  43. package/dist/database.d.ts +24 -0
  44. package/dist/debug.d.ts +270 -0
  45. package/dist/engine.d.ts +74 -0
  46. package/dist/environments.d.ts +244 -0
  47. package/dist/evidence.d.ts +277 -0
  48. package/dist/export.d.ts +311 -0
  49. package/dist/fingerprint.d.ts +594 -0
  50. package/dist/flow.d.ts +300 -0
  51. package/dist/gates.d.ts +103 -0
  52. package/dist/identity.d.ts +51 -0
  53. package/dist/ids.d.ts +7 -0
  54. package/dist/llm.d.ts +652 -0
  55. package/dist/models.d.ts +1807 -0
  56. package/dist/net.d.ts +325 -0
  57. package/dist/neutral.d.ts +41 -0
  58. package/dist/oauth.d.ts +703 -0
  59. package/dist/page.d.ts +1166 -0
  60. package/dist/perf.d.ts +481 -0
  61. package/dist/plan.d.ts +134 -0
  62. package/dist/project.d.ts +395 -0
  63. package/dist/providers.d.ts +37 -0
  64. package/dist/quota.d.ts +453 -0
  65. package/dist/recovery.d.ts +621 -0
  66. package/dist/request.d.ts +1492 -0
  67. package/dist/run.d.ts +779 -0
  68. package/dist/runtime.d.ts +212 -0
  69. package/dist/search.d.ts +375 -0
  70. package/dist/security.d.ts +534 -0
  71. package/dist/serve.d.ts +136 -0
  72. package/dist/session.d.ts +296 -0
  73. package/dist/storage.d.ts +53 -0
  74. package/dist/streaming.d.ts +1119 -0
  75. package/dist/swarm.d.ts +328 -0
  76. package/dist/tools.d.ts +170 -0
  77. package/dist/types.d.ts +8357 -0
  78. package/dist/utils.d.ts +82 -0
  79. package/dist/version.d.ts +7 -0
  80. package/dist/versionregistry.d.ts +406 -0
  81. package/dist/views.d.ts +579 -0
  82. package/dist/workbenchsession.d.ts +69 -0
  83. package/dist/workflow.d.ts +649 -0
  84. package/docs/readme.md +92 -0
  85. package/docs/schemas/antigravity.json +192 -0
  86. package/engine.ts +1524 -0
  87. package/environments.ts +1005 -0
  88. package/evidence.ts +643 -0
  89. package/export.ts +889 -0
  90. package/fingerprint.ts +1458 -0
  91. package/flow.ts +1190 -0
  92. package/gates.ts +307 -0
  93. package/gateway.ts +34 -0
  94. package/hardening.ts +191 -0
  95. package/headless.ts +369 -0
  96. package/http.ts +2110 -0
  97. package/identity.ts +246 -0
  98. package/ids.ts +26 -0
  99. package/index.ts +369 -0
  100. package/llm.ts +2682 -0
  101. package/mcp.ts +1835 -0
  102. package/{memory.js → memory.ts} +3834 -2310
  103. package/models.ts +3805 -0
  104. package/modes.ts +43 -0
  105. package/net.ts +1214 -0
  106. package/neutral.ts +362 -0
  107. package/node.ts +26 -0
  108. package/oauth.ts +2216 -0
  109. package/offscreen.ts +170 -0
  110. package/pack.ts +956 -0
  111. package/package.json +175 -82
  112. package/page.ts +7824 -0
  113. package/pagebridge.ts +1116 -0
  114. package/perf.ts +957 -0
  115. package/plan.ts +672 -0
  116. package/plugin.ts +76 -0
  117. package/{policy.js → policy.ts} +5073 -4679
  118. package/prisma.config.ts +27 -0
  119. package/progress.ts +1308 -0
  120. package/project.ts +1291 -0
  121. package/protocol.ts +4187 -0
  122. package/providers.ts +246 -0
  123. package/quota.ts +1887 -0
  124. package/recovery.ts +2433 -0
  125. package/request.ts +4482 -0
  126. package/run.ts +2135 -0
  127. package/runtime.ts +526 -0
  128. package/search.ts +1760 -0
  129. package/security.ts +1673 -0
  130. package/serve.ts +419 -0
  131. package/server.ts +5538 -0
  132. package/session.ts +1162 -0
  133. package/storage.ts +182 -0
  134. package/streaming.ts +4101 -0
  135. package/swarm.ts +884 -0
  136. package/sync.ts +56 -0
  137. package/tests/agentcert.test.ts +128 -0
  138. package/tests/agentfleet.test.ts +214 -0
  139. package/tests/agentreview.test.ts +241 -0
  140. package/tests/agentstream.test.ts +335 -0
  141. package/tests/agentwork.test.ts +356 -0
  142. package/tests/apifreeze.test.ts +290 -0
  143. package/tests/apimap.test.ts +112 -0
  144. package/tests/approvalgate.test.ts +175 -0
  145. package/tests/artifactmanifest.test.ts +204 -0
  146. package/tests/attentionfeed.test.ts +163 -0
  147. package/tests/backgroundruns.test.ts +100 -0
  148. package/tests/batchscheduling.test.ts +131 -0
  149. package/tests/blackboard.test.ts +238 -0
  150. package/tests/bridge.test.ts +1088 -0
  151. package/tests/browsercoverage.test.ts +134 -0
  152. package/tests/browserpolyfills.test.ts +124 -0
  153. package/tests/build.mjs +1260 -0
  154. package/tests/clientauth.test.ts +223 -0
  155. package/tests/clitools.test.ts +578 -0
  156. package/tests/confirmgates.test.ts +190 -0
  157. package/tests/containerpack.test.ts +143 -0
  158. package/tests/controlflow.test.ts +2120 -0
  159. package/tests/coordination.test.ts +345 -0
  160. package/tests/copyscreen.test.ts +139 -0
  161. package/tests/core.test.ts +417 -0
  162. package/tests/costcert.test.ts +95 -0
  163. package/tests/crossbrowser.test.ts +115 -0
  164. package/tests/cspaudit.test.ts +79 -0
  165. package/tests/dashdone.test.ts +615 -0
  166. package/tests/datagrid.test.ts +137 -0
  167. package/tests/doccheck.test.ts +107 -0
  168. package/tests/dombatch.test.ts +109 -0
  169. package/tests/emulation.test.ts +282 -0
  170. package/tests/environments.test.ts +259 -0
  171. package/tests/evidenceviews.test.ts +88 -0
  172. package/tests/exporttools.test.ts +185 -0
  173. package/tests/firefoxprep.test.ts +134 -0
  174. package/tests/flowlibrary.test.ts +242 -0
  175. package/tests/flowrun.test.ts +303 -0
  176. package/tests/forensics.test.ts +439 -0
  177. package/tests/gateway.test.ts +939 -0
  178. package/tests/headlesslib.test.ts +171 -0
  179. package/tests/httpstream.test.ts +277 -0
  180. package/tests/immutablelog.test.ts +157 -0
  181. package/tests/inboundguard.test.ts +177 -0
  182. package/tests/lazyload.test.ts +72 -0
  183. package/tests/librarymodes.test.ts +623 -0
  184. package/tests/llm.test.ts +696 -0
  185. package/tests/manifest.test.ts +226 -0
  186. package/tests/maskinputs.test.ts +150 -0
  187. package/tests/matrixverify.test.ts +111 -0
  188. package/tests/mavenpack.test.ts +75 -0
  189. package/tests/mcpserver.test.ts +704 -0
  190. package/tests/memory.test.ts +4155 -0
  191. package/tests/memorycare.test.ts +230 -0
  192. package/tests/migrateplan.test.ts +349 -0
  193. package/tests/minimization.test.ts +414 -0
  194. package/tests/modelroute.test.ts +112 -0
  195. package/tests/multiagent.test.ts +440 -0
  196. package/tests/nativebridge.test.ts +807 -0
  197. package/tests/navigation.test.ts +284 -0
  198. package/tests/nugetpack.test.ts +83 -0
  199. package/tests/orchestration.test.ts +449 -0
  200. package/tests/originpolicy.test.ts +405 -0
  201. package/tests/outputcompare.test.ts +97 -0
  202. package/tests/package.test.ts +91 -0
  203. package/tests/pagebridge.test.ts +5909 -0
  204. package/tests/pentest.test.ts +75 -0
  205. package/tests/perfrecords.test.ts +257 -0
  206. package/tests/permdiff.test.ts +85 -0
  207. package/tests/phishguard.test.ts +128 -0
  208. package/tests/pickerviews.test.ts +155 -0
  209. package/tests/pipelines.test.ts +381 -0
  210. package/tests/planlint.test.ts +240 -0
  211. package/tests/planreview.test.ts +383 -0
  212. package/tests/platformtargets.test.ts +56 -0
  213. package/tests/policy.test.ts +8284 -0
  214. package/tests/portability.test.ts +96 -0
  215. package/tests/progress.test.ts +1036 -0
  216. package/tests/promptlibrary.test.ts +116 -0
  217. package/tests/protocol.test.ts +4793 -0
  218. package/tests/publishingpipeline.test.ts +314 -0
  219. package/tests/quickactions.test.ts +164 -0
  220. package/tests/readiness.test.ts +78 -0
  221. package/tests/recipes.test.ts +163 -0
  222. package/tests/redactshots.test.ts +216 -0
  223. package/tests/registernvidiakeys.ts +51 -0
  224. package/tests/relayserve.test.ts +304 -0
  225. package/tests/releasenotes.test.ts +276 -0
  226. package/tests/resilience.test.ts +467 -0
  227. package/tests/resourceaware.test.ts +187 -0
  228. package/tests/runbudget.test.ts +125 -0
  229. package/tests/runhistory.test.ts +299 -0
  230. package/tests/runreplay.test.ts +113 -0
  231. package/tests/runresume.test.ts +184 -0
  232. package/tests/runstate.test.ts +288 -0
  233. package/tests/runtimeadapters.test.ts +251 -0
  234. package/tests/safariskeleton.test.ts +115 -0
  235. package/tests/sandboxframe.test.ts +196 -0
  236. package/tests/sbom.test.ts +105 -0
  237. package/tests/secretvault.test.ts +188 -0
  238. package/tests/selcache.test.ts +111 -0
  239. package/tests/sessioninterface.test.ts +791 -0
  240. package/tests/sessions.test.ts +591 -0
  241. package/tests/siteprefs.test.ts +228 -0
  242. package/tests/snapshotdelta.test.ts +165 -0
  243. package/tests/statusviews.test.ts +237 -0
  244. package/tests/stepmeter.test.ts +200 -0
  245. package/tests/streamparse.test.ts +163 -0
  246. package/tests/stylepruning.test.ts +90 -0
  247. package/tests/surfaces.test.ts +282 -0
  248. package/tests/sweep.test.ts +78 -0
  249. package/tests/syncbridge.test.ts +164 -0
  250. package/tests/taskqueue.test.ts +206 -0
  251. package/tests/toolcalls.test.ts +336 -0
  252. package/tests/toolcatalog.test.ts +201 -0
  253. package/tests/torture-agent.test.ts +706 -0
  254. package/tests/torture-auth.test.ts +461 -0
  255. package/tests/torture-commands.test.ts +895 -0
  256. package/tests/torture-data.test.ts +923 -0
  257. package/tests/torture-environments.test.ts +285 -0
  258. package/tests/torture-export.test.ts +263 -0
  259. package/tests/torture-http.test.ts +1379 -0
  260. package/tests/torture-llm.test.ts +808 -0
  261. package/tests/torture-memory.test.ts +1084 -0
  262. package/tests/torture-plan.test.ts +829 -0
  263. package/tests/torture-run.test.ts +626 -0
  264. package/tests/torture-session.test.ts +928 -0
  265. package/tests/torture-swarm.test.ts +1245 -0
  266. package/tests/torture-tools.test.ts +964 -0
  267. package/tests/torture-workflow.test.ts +2354 -0
  268. package/tests/tourviews.test.ts +52 -0
  269. package/tests/transparency.test.ts +147 -0
  270. package/tests/trigger.test.ts +941 -0
  271. package/tests/v1sunset.test.ts +428 -0
  272. package/tests/virtlist.test.ts +94 -0
  273. package/tests/vision.test.ts +540 -0
  274. package/tests/vsixpack.test.ts +145 -0
  275. package/tests/webapi.test.ts +523 -0
  276. package/tests/workflow.test.ts +1785 -0
  277. package/tests/workfloweditor.test.ts +759 -0
  278. package/tests/xpipack.test.ts +128 -0
  279. package/tools.ts +734 -0
  280. package/types.ts +9908 -0
  281. package/umd.ts +9 -0
  282. package/utils.ts +249 -0
  283. package/version.ts +8 -0
  284. package/versionregistry.ts +1310 -0
  285. package/views.ts +2153 -0
  286. package/vitest.config.ts +12 -0
  287. package/web/App.tsx +78 -0
  288. package/web/README.md +47 -0
  289. package/web/capacitor.config.ts +46 -0
  290. package/web/const.ts +19 -0
  291. package/web/control.shell.tsx +66 -0
  292. package/web/dashboardpage.ts +554 -0
  293. package/web/db.ts +493 -0
  294. package/web/design.html +541 -0
  295. package/web/gatewayview/Gateway.tsx +345 -0
  296. package/web/gatewayview/config.ts +1042 -0
  297. package/web/gatewayview/definition.ts +174 -0
  298. package/web/icons.ts +15 -0
  299. package/{manifest.json → web/manifest.json} +1 -1
  300. package/web/optionspage.ts +691 -0
  301. package/web/popup.ts +1651 -0
  302. package/web/schema.prisma +176 -0
  303. package/web/sidepanel.ts +7941 -0
  304. package/web/sitemanifest.json +13 -0
  305. package/web/terminal-ui.tsx +622 -0
  306. package/web/transparencypage.ts +541 -0
  307. package/web/vite.config.ts +39 -0
  308. package/web/workspace.ts +23 -0
  309. package/workbenchmemory.ts +104 -0
  310. package/workbenchsession.ts +304 -0
  311. package/workflow.ts +4495 -0
  312. package/bridge.d.ts.map +0 -1
  313. package/bridge.js +0 -1877
  314. package/bun.d.ts.map +0 -1
  315. package/bun.js +0 -52329
  316. package/caps/background.json +0 -712
  317. package/caps/cli.json +0 -360
  318. package/caps/library.json +0 -3611
  319. package/caps/mcp.json +0 -126
  320. package/caps/pagebridge.json +0 -377
  321. package/caps/popup.json +0 -51
  322. package/caps/sidepanel.json +0 -522
  323. package/checksums.txt +0 -142
  324. package/cli.d.ts.map +0 -1
  325. package/companion.d.ts.map +0 -1
  326. package/companion.js +0 -389
  327. package/crossbrowser.d.ts.map +0 -1
  328. package/crossbrowser.js +0 -1191
  329. package/dashdone.d.ts.map +0 -1
  330. package/dashdone.js +0 -368
  331. package/deno.d.ts.map +0 -1
  332. package/deno.js +0 -52325
  333. package/devthink.umd.js +0 -52346
  334. package/fixtures/bun.ts +0 -7
  335. package/fixtures/cjs.js +0 -6
  336. package/fixtures/deno.ts +0 -6
  337. package/fixtures/example-org-pagestate.json +0 -22
  338. package/fixtures/importers/automa-workflow.json +0 -18
  339. package/fixtures/importers/selenium-side.json +0 -20
  340. package/fixtures/importers/tabular-plan.csv +0 -7
  341. package/fixtures/importers/uivision-macro.json +0 -10
  342. package/fixtures/importers/v1-plan.json +0 -13
  343. package/fixtures/mcp-client.mjs +0 -14
  344. package/fixtures/pages/checkout.html +0 -192
  345. package/fixtures/pages/dashboard.html +0 -110
  346. package/fixtures/pages/feed.html +0 -113
  347. package/fixtures/pages/product-grid.html +0 -150
  348. package/fixtures/plans/form-inventory-plan.json +0 -11
  349. package/fixtures/plans/release-notes-plan.json +0 -11
  350. package/fixtures/recipes/agentscompete.json +0 -11
  351. package/fixtures/recipes/agentsforms.json +0 -11
  352. package/fixtures/recipes/agentsmonitor.json +0 -11
  353. package/fixtures/recipes/agentsreview.json +0 -29
  354. package/fixtures/recipes/agentswarm.json +0 -11
  355. package/fixtures/recipes/fillcalendar.json +0 -12
  356. package/fixtures/recipes/fillcheckout.json +0 -13
  357. package/fixtures/recipes/filldependentdropdowns.json +0 -12
  358. package/fixtures/recipes/fillfromcsv.json +0 -13
  359. package/fixtures/recipes/fillloginform.json +0 -12
  360. package/fixtures/recipes/fillmultistepwizard.json +0 -13
  361. package/fixtures/recipes/fillregistration.json +0 -12
  362. package/fixtures/recipes/fillsearchfilters.json +0 -12
  363. package/fixtures/recipes/filltypeahead.json +0 -11
  364. package/fixtures/recipes/monitoralerts.json +0 -12
  365. package/fixtures/recipes/monitoravailability.json +0 -11
  366. package/fixtures/recipes/monitornetworkquiet.json +0 -12
  367. package/fixtures/recipes/monitorpagechanges.json +0 -11
  368. package/fixtures/recipes/monitorpricechange.json +0 -11
  369. package/fixtures/recipes/monitorschedule.json +0 -12
  370. package/fixtures/recipes/scrapedynamicprices.json +0 -13
  371. package/fixtures/recipes/scrapeimagegallery.json +0 -12
  372. package/fixtures/recipes/scrapeinfinitefeed.json +0 -13
  373. package/fixtures/recipes/scrapenestedlists.json +0 -12
  374. package/fixtures/recipes/scrapeproductgrid.json +0 -12
  375. package/fixtures/recipes/scrapereviews.json +0 -12
  376. package/fixtures/recipes/scrapesearchresults.json +0 -12
  377. package/fixtures/recipes/scrapetablepagination.json +0 -12
  378. package/fixtures/recipes/testaccessibility.json +0 -34
  379. package/fixtures/recipes/testconsoleerrors.json +0 -12
  380. package/fixtures/recipes/testdeeplinks.json +0 -12
  381. package/fixtures/recipes/testformvalidation.json +0 -13
  382. package/fixtures/recipes/testlayoutshift.json +0 -12
  383. package/fixtures/recipes/testlinkcheck.json +0 -12
  384. package/fixtures/recipes/testloadtiming.json +0 -12
  385. package/fixtures/recipes/testvisualdiff.json +0 -12
  386. package/fixtures/workflows/changelog-digest-workflow.json +0 -13
  387. package/fixtures/workflows/form-survey-workflow.json +0 -13
  388. package/gallery.json +0 -706
  389. package/hardening.d.ts.map +0 -1
  390. package/hardening.js +0 -188
  391. package/headless.d.ts.map +0 -1
  392. package/headless.js +0 -11522
  393. package/http.d.ts.map +0 -1
  394. package/http.js +0 -2165
  395. package/index.cjs +0 -54682
  396. package/index.d.ts.map +0 -1
  397. package/index.js +0 -52310
  398. package/index.neutral.js +0 -46343
  399. package/mcp.d.ts.map +0 -1
  400. package/mcp.js +0 -20515
  401. package/memory.d.ts.map +0 -1
  402. package/nativehost.template.json +0 -10
  403. package/node.cjs +0 -54686
  404. package/node.d.ts.map +0 -1
  405. package/pack.d.ts.map +0 -1
  406. package/pack.js +0 -805
  407. package/policy.d.ts.map +0 -1
  408. package/progress.d.ts.map +0 -1
  409. package/progress.js +0 -645
  410. package/protocol.d.ts.map +0 -1
  411. package/protocol.js +0 -8334
  412. package/schemas/audit.schema.json +0 -226
  413. package/schemas/capability.schema.json +0 -113
  414. package/schemas/envelope.schema.json +0 -162
  415. package/schemas/memory.schema.json +0 -51
  416. package/schemas/observation.schema.json +0 -113
  417. package/schemas/plan.schema.json +0 -208
  418. package/schemas/progress.schema.json +0 -126
  419. package/schemas/proposal.schema.json +0 -68
  420. package/schemas/session.schema.json +0 -82
  421. package/schemas/tool.schema.json +0 -94
  422. package/server.d.ts.map +0 -1
  423. package/server.js +0 -28877
  424. package/umd-example.html +0 -18
  425. package/umd.d.ts.map +0 -1
  426. /package/{bun.d.ts → dist/bun.d.ts} +0 -0
  427. /package/{cli.d.ts → dist/cli.d.ts} +0 -0
  428. /package/{companion.d.ts → dist/companion.d.ts} +0 -0
  429. /package/{crossbrowser.d.ts → dist/crossbrowser.d.ts} +0 -0
  430. /package/{dashdone.d.ts → dist/dashdone.d.ts} +0 -0
  431. /package/{deno.d.ts → dist/deno.d.ts} +0 -0
  432. /package/{hardening.d.ts → dist/hardening.d.ts} +0 -0
  433. /package/{headless.d.ts → dist/headless.d.ts} +0 -0
  434. /package/{http.d.ts → dist/http.d.ts} +0 -0
  435. /package/{index.d.ts → dist/index.d.ts} +0 -0
  436. /package/{mcp.d.ts → dist/mcp.d.ts} +0 -0
  437. /package/{memory.d.ts → dist/memory.d.ts} +0 -0
  438. /package/{node.d.ts → dist/node.d.ts} +0 -0
  439. /package/{pack.d.ts → dist/pack.d.ts} +0 -0
  440. /package/{policy.d.ts → dist/policy.d.ts} +0 -0
  441. /package/{progress.d.ts → dist/progress.d.ts} +0 -0
  442. /package/{protocol.d.ts → dist/protocol.d.ts} +0 -0
  443. /package/{server.d.ts → dist/server.d.ts} +0 -0
  444. /package/{umd.d.ts → dist/umd.d.ts} +0 -0
@@ -0,0 +1,1119 @@
1
+ /**
2
+ * @file streaming.ts
3
+ * @module provider/streaming
4
+ * @description
5
+ * Third-person observer view: the library watches Antigravity / CloudCode
6
+ * traffic and reproduces its streaming behavior without running Antigravity
7
+ * itself.
8
+ *
9
+ * Responsibilities isolated here:
10
+ * - Incremental SSE parser tolerant to network splits (parseSSEChunk)
11
+ * - Heterogeneous payload normalization (unwrap response/candidates/parts)
12
+ * - LRU cache for thinking signatures — 100 entries — Map-based
13
+ * - Preservation of thinking blocks between chunks (delta tracking)
14
+ * - OpenAI / Anthropic transformers compatible with opencode plugin SDK
15
+ * - Auto-recovery exponential backoff + jitter 0-80ms
16
+ * - Synthetic finish injection when cloudcode-pa closes abruptly
17
+ *
18
+ * Architectural constraints:
19
+ * - Library-first, root-first (no src/ folder)
20
+ * - Direct cloudcode-pa.googleapis.com — no localhost v1 proxy
21
+ * - Only node:* builtins + global fetch (Node >=18)
22
+ * -> node:crypto for FNV-1a, signature hashing, jitter
23
+ * -> global TextDecoder / ReadableStream (web standards in Node)
24
+ * - Production-ready: never throws in parser, defensive JSON tolerant,
25
+ * JSDoc everywhere, explicit error handling, no placeholder
26
+ *
27
+ * Date governance: 25/08/2026 — Canto do Buriti, PI, BR
28
+ * Version: 2.0.0 — the merged provider lineage
29
+ *
30
+ * Related modules:
31
+ * - constants.ts — endpoints, LRU_THINKING_CACHE_SIZE, models 2026
32
+ * - fingerprint.ts — FNV-1a reused here for deterministic ids
33
+ * - request.ts — builds Antigravity request body
34
+ * - recovery.ts — higher level auto-recovery using this module
35
+ *
36
+ * @author devthink
37
+ * @license MIT
38
+ */
39
+ import { BACKOFF_BASE_MS, BACKOFF_FACTOR, BACKOFF_MAX_MS, GEMINI_CLI_OAUTH_CLIENT_ID as GEMINI_CLI_CLIENT_ID, GEMINI_CLI_OAUTH_CLIENT_SECRET as GEMINI_CLI_CLIENT_SECRET, JITTER_MAX_MS, JITTER_MIN_MS, LRU_THINKING_CACHE_SIZE, MAX_RETRIES, PROJECT_FALLBACK } from "./constants.js";
40
+ import { fnv1a32, getJitter, thinkingCache } from "./core.js";
41
+ export { BACKOFF_BASE_MS, BACKOFF_FACTOR, BACKOFF_MAX_MS, GEMINI_CLI_CLIENT_ID, GEMINI_CLI_CLIENT_SECRET, JITTER_MAX_MS, JITTER_MIN_MS, LRU_THINKING_CACHE_SIZE, MAX_RETRIES, PROJECT_FALLBACK, fnv1a32, getJitter, thinkingCache, };
42
+ /** Retryable HTTP status codes for cloudcode-pa */
43
+ /** Sentinel that Gemini / Antigravity sends to close stream */
44
+ export declare const SSE_DONE_SENTINEL: "[DONE]";
45
+ /**
46
+ * SHA-256 hex truncated to 16 chars — stable key for thinking text
47
+ * when length > few hundred chars. Falls back to FNV-1a if crypto fails.
48
+ *
49
+ * @param text - thinking text to hash
50
+ */
51
+ export declare function hashThinkingText(text: string): string;
52
+ /**
53
+ * Promise-based sleep with jitter included for backoff
54
+ * @param ms - base delay
55
+ */
56
+ export declare function sleepWithJitter(ms: number): Promise<void>;
57
+ /**
58
+ * @description
59
+ * The observer notes that Claude thinking blocks carry `thoughtSignature`
60
+ * that must be preserved across turns, otherwise API returns
61
+ * "invalid signature". Original plugin stored 100 entries in Map.
62
+ * LRU eviction keeps most recent.
63
+ *
64
+ * This implementation is library-first: no external LRU dep,
65
+ * uses Map insertion order (ES2015 guarantees order).
66
+ */
67
+ export declare class ReplaySignatureCache {
68
+ private readonly maxSize;
69
+ private readonly map;
70
+ /**
71
+ * @param maxSize - max entries, default 100 per spec
72
+ */
73
+ constructor(maxSize?: number);
74
+ /** Current size */
75
+ get size(): number;
76
+ /** Max configured */
77
+ get capacity(): number;
78
+ /**
79
+ * Retrieves signature for given thinking text.
80
+ * The cache key is hash of normalized text (trimmed).
81
+ *
82
+ * @param thinkingText - full thinking block text
83
+ * @returns signature or undefined
84
+ */
85
+ get(thinkingText: string): string | undefined;
86
+ /**
87
+ * Retrieves signature by direct hash key (when caller already hashed)
88
+ */
89
+ getByHash(hashKey: string): string | undefined;
90
+ /**
91
+ * Stores signature keyed by thinking text
92
+ * @param thinkingText - full text
93
+ * @param signature - opaque signature string from API
94
+ */
95
+ set(thinkingText: string, signature: string): void;
96
+ /**
97
+ * Direct hash->signature set (when text not available)
98
+ */
99
+ setByHash(hashKey: string, signature: string): void;
100
+ /** Checks presence without touching LRU order */
101
+ has(thinkingText: string): boolean;
102
+ /** Deletes entry by thinking text */
103
+ delete(thinkingText: string): boolean;
104
+ /** Clears all */
105
+ clear(): void;
106
+ /** Iterates entries LRU order (oldest first) */
107
+ entries(): IterableIterator<[string, string]>;
108
+ /** Keys in LRU order */
109
+ keys(): IterableIterator<string>;
110
+ /** Returns diagnostic snapshot oldest->newest */
111
+ snapshot(): Array<{
112
+ hash: string;
113
+ signaturePreview: string;
114
+ }>;
115
+ private evictIfNeeded;
116
+ }
117
+ /** Global singleton used by transformers — library-first convenience */
118
+ export declare const globalThinkingSignatureCache: ReplaySignatureCache;
119
+ /**
120
+ * Raw SSE event parsed from wire.
121
+ * Observer keeps it minimal — only what cloudcode-pa uses.
122
+ */
123
+ export interface ParsedSSEEvent {
124
+ /** Event type if server sent `event: xxx` */
125
+ event?: string | undefined;
126
+ /** Optional id `id: xxx` */
127
+ id?: string | undefined;
128
+ /** Retry interval `retry: xxx` */
129
+ retry?: number | undefined;
130
+ /** Joined data payload (may be JSON string, may be [DONE]) */
131
+ data: string;
132
+ /** Raw block for debugging */
133
+ rawBlock: string;
134
+ }
135
+ /**
136
+ * Mutable buffer holding incomplete SSE tail between network chunks.
137
+ * Third-person: the observer accumulates until double newline terminator.
138
+ */
139
+ export interface SSEParserState {
140
+ /** Leftover incomplete tail */
141
+ buffer: string;
142
+ /** How many events parsed so far — useful for diagnostics */
143
+ eventsSeen: number;
144
+ }
145
+ /**
146
+ * Creates fresh parser state.
147
+ */
148
+ export declare function createSSEParserState(): SSEParserState;
149
+ /**
150
+ * Parses one text chunk incrementally, tolerant to splits.
151
+ *
152
+ * The observer learned from production: fetch streaming may split in middle
153
+ * of `data: {` JSON, or split the `\n\n` delimiter across chunks.
154
+ * Strategy:
155
+ * 1. Append chunk to state.buffer
156
+ * 2. Normalize \r\n -> \n, \r -> \n
157
+ * 3. While buffer contains `\n\n` extract block
158
+ * 4. For each block, extract data: lines (join with \n per SSE spec)
159
+ * 5. Leave incomplete tail in buffer
160
+ *
161
+ * @param chunk - new text arrived from decoder (may be partial)
162
+ * @param state - mutable buffer object — will be updated in place
163
+ * @returns parsed events from this chunk only
164
+ *
165
+ * @example
166
+ * const state = createSSEParserState();
167
+ * let ev = parseSSEChunk("data: {\"cand", state); // [] — buffered
168
+ * ev = parseSSEChunk("idates\":[]}\n\n", state); // 1 event
169
+ */
170
+ export declare function parseSSEChunk(chunk: string, state: SSEParserState): ParsedSSEEvent[];
171
+ /**
172
+ * Parses a Uint8Array / Buffer chunk using TextDecoder streaming.
173
+ * Convenience wrapper around parseSSEChunk for binary fetch streams.
174
+ *
175
+ * @param binaryChunk - Uint8Array from reader.read()
176
+ * @param decoder - TextDecoder with {stream:true}
177
+ * @param state - parser state
178
+ */
179
+ export declare function parseSSEBinaryChunk(binaryChunk: Uint8Array, decoder: {
180
+ decode(input: Uint8Array, options?: {
181
+ stream?: boolean;
182
+ }): string;
183
+ }, state: SSEParserState): ParsedSSEEvent[];
184
+ /**
185
+ * Normalized tool call extracted from Antigravity part
186
+ */
187
+ export interface NormalizedToolCall {
188
+ /** Deterministic id if not provided by model */
189
+ id: string;
190
+ /** Function / tool name sanitized */
191
+ name: string;
192
+ /** Parsed args object if JSON parsable, otherwise raw string */
193
+ args: unknown;
194
+ /** Raw JSON string of args — for OpenAI delta streaming */
195
+ argsJson: string;
196
+ /** Whether this is delta (partial args) or final */
197
+ isDelta?: boolean;
198
+ }
199
+ /**
200
+ * Single normalized chunk produced from one or more raw payloads
201
+ */
202
+ export interface NormalizedChunk {
203
+ /** Text delta to emit (incremental already deduped) */
204
+ text?: string | undefined;
205
+ /** Full accumulated text for tracking */
206
+ fullText?: string | undefined;
207
+ /** Thinking delta */
208
+ thinking?: string | undefined;
209
+ /** Full accumulated thinking */
210
+ fullThinking?: string | undefined;
211
+ /** Signature for thinking block if present */
212
+ thinkingSignature?: string | undefined;
213
+ /** Tool calls extracted */
214
+ toolCalls?: NormalizedToolCall[] | undefined;
215
+ /** Finish reason from cloudcode-pa, normalized to lowercase (stop, max_tokens, safety) */
216
+ finishReason?: string | undefined;
217
+ /** Raw original payload for debugging / grounding */
218
+ raw: unknown;
219
+ /** Candidate index if payload contained multiple candidates */
220
+ candidateIndex?: number | undefined;
221
+ /** Whether this part was marked as thought */
222
+ isThought?: boolean | undefined;
223
+ /** Grounding metadata e.g. groundingMetadata, groundingChunks */
224
+ groundingMetadata?: unknown | undefined;
225
+ /** Safety ratings if present */
226
+ safetyRatings?: unknown | undefined;
227
+ /** Usage metadata if present */
228
+ usageMetadata?: unknown | undefined;
229
+ /** Indicates stream is done (from [DONE] or finishReason) */
230
+ isFinished?: boolean | undefined;
231
+ }
232
+ /**
233
+ * Safe JSON parse — never throws, returns null on failure
234
+ * @param text - raw data string
235
+ */
236
+ export declare function safeJsonParse(text: string): unknown | null;
237
+ /**
238
+ * Unwraps heterogeneous envelope into candidate array.
239
+ * Handles observed shapes:
240
+ * - {response:{candidates:[...]}}
241
+ * - {candidates:[...]}
242
+ * - {candidate:{...}}
243
+ * - [{...}, {...}] (already array)
244
+ * - {content:{parts:[...]}} single candidate
245
+ * - {parts:[...]} direct parts
246
+ *
247
+ * @param payload - parsed JSON object
248
+ * @returns array of candidate-like objects
249
+ */
250
+ export declare function unwrapCandidates(payload: unknown): unknown[];
251
+ /**
252
+ * Extracts parts array from candidate
253
+ */
254
+ export declare function extractParts(candidate: unknown): unknown[];
255
+ /**
256
+ * Normalizes single part object into text/thinking/toolCall
257
+ * @param part - raw part
258
+ */
259
+ export declare function normalizePart(part: unknown): {
260
+ text?: string;
261
+ thinking?: string;
262
+ thinkingSignature?: string;
263
+ toolCall?: NormalizedToolCall;
264
+ isThought?: boolean;
265
+ };
266
+ /**
267
+ * Maps Gemini finishReason to normalized lowercase reason
268
+ */
269
+ export declare function mapFinishReason(rawReason: unknown): string | undefined;
270
+ /**
271
+ * Core normalizer — converts raw SSE data strings (JSON) into normalized chunks.
272
+ * Tolerant to heterogeneous shapes observed in prod, daily, sandbox.
273
+ *
274
+ * @param rawDataStrings - array of data: payloads (already stripped of `data:` prefix)
275
+ * @returns normalized chunks (may be more than input if multiple candidates)
276
+ */
277
+ export declare function normalizePayloads(rawDataStrings: (string | unknown)[]): NormalizedChunk[];
278
+ /**
279
+ * Extracts delta from full text given previously sent buffer.
280
+ * If new text starts with old, returns suffix, else returns full new.
281
+ * This handles both cumulative and incremental server behavior.
282
+ *
283
+ * @param full - current accumulated text from server (may be cumulative)
284
+ * @param alreadySent - buffer already emitted to client
285
+ * @returns delta to emit now
286
+ */
287
+ export declare function extractDelta(full: string, alreadySent: string): string;
288
+ /**
289
+ * Tracks streaming session to preserve thinking and text between chunks.
290
+ * The observer watches two buffers: sentThinkingBuffer and sentTextBuffer.
291
+ * Prevents duplicated thinking blocks in UI (bug #120 in original repo).
292
+ */
293
+ export declare class StreamingSessionTracker {
294
+ readonly signatureCache: ReplaySignatureCache;
295
+ private fullThinking;
296
+ private sentThinking;
297
+ private fullText;
298
+ private sentText;
299
+ private thinkingSignature?;
300
+ private finished;
301
+ private lastFinishReason?;
302
+ private toolCallsSeen;
303
+ /**
304
+ * @param signatureCache - optional LRU cache for thinking signatures
305
+ */
306
+ constructor(signatureCache?: ReplaySignatureCache);
307
+ /** Whether stream already finished */
308
+ get isFinished(): boolean;
309
+ get currentThinking(): string;
310
+ get currentText(): string;
311
+ /**
312
+ * Pushes new normalized chunk, deduplicates thinking/text, updates signature cache,
313
+ * and returns delta-only chunk ready for transformer.
314
+ *
315
+ * @param chunk - normalized from normalizePayloads
316
+ * @returns delta chunk (with only new portions) + metadata
317
+ */
318
+ push(chunk: NormalizedChunk): NormalizedChunk;
319
+ /**
320
+ * Returns synthetic finish chunk if stream ended without explicit finish.
321
+ * Preserves last known signature.
322
+ */
323
+ createSyntheticFinish(reason?: string): NormalizedChunk | null;
324
+ /** Resets tracker for new stream */
325
+ reset(): void;
326
+ /** Diagnostic snapshot */
327
+ snapshot(): {
328
+ fullThinkingLen: number;
329
+ sentThinkingLen: number;
330
+ fullTextLen: number;
331
+ sentTextLen: number;
332
+ finished: boolean;
333
+ toolCalls: number;
334
+ hasSignature: boolean;
335
+ };
336
+ }
337
+ export interface OpenAIChunkOptions {
338
+ /** Model id to echo back — e.g. antigravity-gemini-3-flash */
339
+ model: string;
340
+ /** Optional fixed id for stream — if not provided random-ish */
341
+ id?: string;
342
+ /** Creation timestamp in seconds */
343
+ created?: number;
344
+ }
345
+ /**
346
+ * Transforms normalized chunks into OpenAI SSE lines.
347
+ * Library-first: stateless transform + session tracker for delta.
348
+ *
349
+ * The observer emits reasoning_content for thinking (opencode supports both
350
+ * reasoning and reasoning_content per 2026 spec).
351
+ *
352
+ * @param chunk - delta chunk from StreamingSessionTracker
353
+ * @param opts - model/id/created
354
+ * @returns array of SSE formatted strings `data: {...}\n\n`
355
+ */
356
+ export declare function transformToOpenAI(chunk: NormalizedChunk, opts: OpenAIChunkOptions, tracker?: StreamingSessionTracker): string[];
357
+ /**
358
+ * Factory that returns stateful OpenAI transformer with internal tracker
359
+ * and LRU signature cache. Suitable for opencode plugin hook.
360
+ *
361
+ * @param opts - model options
362
+ * @param cache - optional cache injection
363
+ */
364
+ export declare function createOpenAIStreamingTransformer(opts: OpenAIChunkOptions, cache?: ReplaySignatureCache): {
365
+ tracker: StreamingSessionTracker;
366
+ transform: (chunk: NormalizedChunk) => string[];
367
+ final: () => string[];
368
+ };
369
+ export interface AnthropicChunkOptions {
370
+ /** Model to echo */
371
+ model: string;
372
+ /** Message id */
373
+ messageId?: string;
374
+ }
375
+ type AnthropicBlockType = "text" | "thinking" | "tool_use";
376
+ /**
377
+ * Internal state for Anthropic streaming sequence.
378
+ * Observer maintains index counters per content block.
379
+ */
380
+ declare class AnthropicStateMachine {
381
+ messageStarted: boolean;
382
+ nextBlockIndex: number;
383
+ activeBlocks: Map<number, AnthropicBlockType>;
384
+ blockThinkingSent: Map<number, string>;
385
+ blockTextSent: Map<number, string>;
386
+ toolJsonSent: Map<string, string>;
387
+ finished: boolean;
388
+ reset(): void;
389
+ }
390
+ /**
391
+ * Transforms normalized chunk into Anthropic SSE events.
392
+ * Emits event: / data: pairs as per Anthropic Messages streaming spec:
393
+ * message_start, content_block_start, content_block_delta, content_block_stop,
394
+ * message_delta, message_stop
395
+ *
396
+ * Library-first: each call returns array of formatted SSE lines.
397
+ *
398
+ * @param chunk - delta chunk from tracker
399
+ * @param opts - model/message options
400
+ * @param state - anthropic state machine (mutable)
401
+ * @returns array of SSE lines (`event: xxx\ndata: {...}\n\n`)
402
+ */
403
+ export declare function transformToAnthropic(chunk: NormalizedChunk, opts: AnthropicChunkOptions, state: AnthropicStateMachine): string[];
404
+ /**
405
+ * Factory for Anthropic streaming transformer compatible with opencode
406
+ *
407
+ * @param opts - model options
408
+ * @param cache - LRU signature cache
409
+ */
410
+ export declare function createAnthropicStreamingTransformer(opts: AnthropicChunkOptions, cache?: ReplaySignatureCache): {
411
+ tracker: StreamingSessionTracker;
412
+ anthropicState: AnthropicStateMachine;
413
+ transform: (chunk: NormalizedChunk) => string[];
414
+ final: () => string[];
415
+ };
416
+ export interface RetryOptions {
417
+ /** Max attempts including first */
418
+ maxRetries?: number;
419
+ /** Base delay ms */
420
+ baseMs?: number;
421
+ /** Factor */
422
+ factor?: number;
423
+ /** Max delay ms */
424
+ maxMs?: number;
425
+ /** Which status codes trigger retry */
426
+ retryableStatus?: number[];
427
+ }
428
+ /**
429
+ * Determines if error/status is retryable.
430
+ * Observer pattern: checks 429, 5xx, and network failures.
431
+ *
432
+ * @param status - HTTP status or undefined for network error
433
+ */
434
+ export declare function isRetryableNetworkStatus(status: number | undefined, opts?: RetryOptions): boolean;
435
+ /**
436
+ * Fetches with exponential backoff + jitter.
437
+ * Uses only node builtins + global fetch.
438
+ * Third-person observer: it watches fetch, retries on transient errors.
439
+ *
440
+ * @param input - RequestInfo
441
+ * @param init - RequestInit
442
+ * @param retryOpts - backoff options
443
+ * @returns Response
444
+ * @throws last error after retries exhausted
445
+ */
446
+ export declare function fetchWithExponentialRetry(input: Parameters<typeof fetch>[0], init?: RequestInit, retryOpts?: RetryOptions): Promise<Response>;
447
+ /**
448
+ * Creates synthetic finish chunk when stream closes abruptly.
449
+ * Observer injects `stop` finish to keep opencode SDK happy.
450
+ *
451
+ * @param tracker - session tracker to know current state
452
+ * @param reason - finish reason, default stop
453
+ * @returns normalized finish chunk or null if already finished
454
+ */
455
+ export declare function injectSyntheticFinish(tracker: StreamingSessionTracker, reason?: string): NormalizedChunk | null;
456
+ /**
457
+ * Wraps streaming response reading with auto-recovery.
458
+ * If reader throws before finish, retries whole fetch (exponential).
459
+ * On final failure, injects synthetic finish so UI doesn't hang.
460
+ *
461
+ * @param fetchFn - function that returns Promise<Response> (fresh fetch each attempt)
462
+ * @param onChunk - callback for each normalized chunk (deduped)
463
+ * @param retryOpts - retry options for fetch phase
464
+ * @param tracker - optional tracker (if not provided new one created)
465
+ */
466
+ export declare function withAutoRecoveryStreaming(fetchFn: () => Promise<Response>, onChunk: (chunk: NormalizedChunk) => void | Promise<void>, retryOpts?: RetryOptions, tracker?: StreamingSessionTracker): Promise<void>;
467
+ /**
468
+ * Async generator that reads a fetch Response body (cloudcode-pa alt=sse)
469
+ * and yields normalized chunks with preserved thinking blocks.
470
+ *
471
+ * The observer directly consumes https://cloudcode-pa.googleapis.com
472
+ * (or daily-.../sandbox) without localhost v1 proxy.
473
+ *
474
+ * @param response - fetch Response with body ReadableStream
475
+ * @param tracker - optional tracker for delta preservation (new one if not provided)
476
+ * @yields NormalizedChunk (deduped delta already applied via tracker)
477
+ */
478
+ export declare function readSSEStream(response: Response, tracker?: StreamingSessionTracker): AsyncGenerator<NormalizedChunk>;
479
+ /**
480
+ * Convenience: stream cloudcode-pa response and transform to OpenAI SSE lines.
481
+ * Used by opencode plugin fetch interceptor.
482
+ *
483
+ * @param response - fetch Response from cloudcode-pa
484
+ * @param openAIOpts - model info
485
+ * @param cache - optional LRU cache
486
+ * @returns AsyncGenerator<string> of `data: {...}\n\n` lines
487
+ */
488
+ export declare function streamToOpenAI(response: Response, openAIOpts: OpenAIChunkOptions, cache?: ReplaySignatureCache): AsyncGenerator<string>;
489
+ /**
490
+ * Convenience: stream cloudcode-pa response and transform to Anthropic SSE lines.
491
+ *
492
+ * @param response - fetch Response
493
+ * @param anthropicOpts - model info
494
+ * @param cache - optional LRU cache
495
+ * @returns AsyncGenerator<string> of `event: ...\ndata: ...\n\n`
496
+ */
497
+ export declare function streamToAnthropic(response: Response, anthropicOpts: AnthropicChunkOptions, cache?: ReplaySignatureCache): AsyncGenerator<string>;
498
+ /** Production Cloud Code Assist base endpoint. */
499
+ /** Exact User-Agent sent by Gemini CLI 0.57.0. */
500
+ /** X-Goog-Api-Client value observed on real Gemini CLI traffic. */
501
+ /** Client-Metadata header string used by Gemini CLI bypass requests. */
502
+ import { MODELS_2026_LEGACY as MODELS_2026 } from "./models.js";
503
+ import type { ModelId2026 } from "./models.js";
504
+ export { MODELS_2026 };
505
+ export type { ModelId2026 };
506
+ /**
507
+ * Raw part shape emitted by cloudcode-pa (Gemini core with Claude interop).
508
+ */
509
+ export interface RawPart {
510
+ text?: string;
511
+ thought?: boolean;
512
+ thoughtSignature?: string;
513
+ functionCall?: {
514
+ name: string;
515
+ args?: Record<string, unknown> | string;
516
+ id?: string;
517
+ };
518
+ inlineData?: {
519
+ mimeType: string;
520
+ data: string;
521
+ };
522
+ [k: string]: unknown;
523
+ }
524
+ /**
525
+ * Raw content container — either wrapped parts or bare text.
526
+ */
527
+ export interface RawContent {
528
+ role?: string;
529
+ parts?: RawPart[];
530
+ text?: string;
531
+ }
532
+ /**
533
+ * Raw candidate inside a cloudcode-pa chunk.
534
+ */
535
+ export interface RawCandidate {
536
+ content?: RawContent;
537
+ finishReason?: string;
538
+ finishMessage?: string;
539
+ index?: number;
540
+ tokenCount?: number;
541
+ safetyRatings?: unknown[];
542
+ parts?: RawPart[];
543
+ text?: string;
544
+ thought?: boolean;
545
+ thoughtSignature?: string;
546
+ }
547
+ /**
548
+ * Heterogeneous raw chunk from v1internal:streamGenerateContent.
549
+ */
550
+ export interface CloudCodeRawChunk {
551
+ candidates?: RawCandidate[];
552
+ content?: RawContent;
553
+ parts?: RawPart[];
554
+ response?: CloudCodeRawChunk;
555
+ usageMetadata?: {
556
+ promptTokenCount?: number;
557
+ candidatesTokenCount?: number;
558
+ totalTokenCount?: number;
559
+ thoughtsTokenCount?: number;
560
+ };
561
+ model?: string;
562
+ modelVersion?: string;
563
+ thought?: string;
564
+ thoughtSignature?: string;
565
+ [k: string]: unknown;
566
+ }
567
+ /** Kind discriminator for {@link NormalizedPart}. */
568
+ export type NormalizedPartKind = "text" | "thinking" | "thought_signature" | "function_call" | "inline_data";
569
+ /**
570
+ * One normalized part with provenance indexes and optional signature.
571
+ */
572
+ export interface NormalizedPart {
573
+ kind: NormalizedPartKind;
574
+ text: string;
575
+ thought: boolean;
576
+ thoughtSignature?: string | undefined;
577
+ functionCall?: {
578
+ name: string;
579
+ args: string;
580
+ id: string;
581
+ };
582
+ rawIndex: number;
583
+ candidateIndex: number;
584
+ finishReason?: string | undefined;
585
+ }
586
+ /**
587
+ * Fully normalized payload: parts plus finish/usage metadata.
588
+ */
589
+ export interface NormalizedPayload {
590
+ parts: NormalizedPart[];
591
+ finishReason?: string | undefined;
592
+ usage?: CloudCodeRawChunk["usageMetadata"] | undefined;
593
+ model?: string | undefined;
594
+ isThinkingChunk: boolean;
595
+ hasFinish: boolean;
596
+ raw: CloudCodeRawChunk;
597
+ }
598
+ /**
599
+ * Mutable state shared by the stateful OpenAI / Anthropic transformers.
600
+ */
601
+ export interface StreamingState {
602
+ completionId: string;
603
+ model: string;
604
+ created: number;
605
+ sentRole: boolean;
606
+ accumulatedText: string;
607
+ accumulatedThinking: string;
608
+ lastFinishReason?: string | undefined;
609
+ insideThinking: boolean;
610
+ anthropicBlockIndex: number;
611
+ anthropicBlockKinds: Map<number, NormalizedPartKind>;
612
+ toolCallIdCounter: number;
613
+ pendingSignatures: string[];
614
+ }
615
+ /**
616
+ * OpenAI chat.completion.chunk wire type emitted by the transformer.
617
+ */
618
+ export interface OpenAIChatChunk {
619
+ id: string;
620
+ object: "chat.completion.chunk";
621
+ created: number;
622
+ model: string;
623
+ choices: Array<{
624
+ index: number;
625
+ delta: {
626
+ role?: "assistant";
627
+ content?: string;
628
+ reasoning_content?: string;
629
+ reasoning?: string;
630
+ tool_calls?: Array<{
631
+ index: number;
632
+ id: string;
633
+ type: "function";
634
+ function: {
635
+ name: string;
636
+ arguments: string;
637
+ };
638
+ }>;
639
+ };
640
+ finish_reason: string | null;
641
+ }>;
642
+ usage?: {
643
+ prompt_tokens?: number;
644
+ completion_tokens?: number;
645
+ total_tokens?: number;
646
+ completion_tokens_details?: {
647
+ reasoning_tokens?: number;
648
+ };
649
+ };
650
+ }
651
+ /**
652
+ * Anthropic-style SSE event descriptor.
653
+ */
654
+ export interface AnthropicSSEEvent {
655
+ type: string;
656
+ data?: unknown;
657
+ sse?: string;
658
+ }
659
+ /**
660
+ * Diagnostic result shape for remainder-based SSE parsing.
661
+ */
662
+ export interface ParseSSEChunkResult {
663
+ payloads: CloudCodeRawChunk[];
664
+ remainder: string;
665
+ consumedBytes: number;
666
+ errors: string[];
667
+ }
668
+ /**
669
+ * Cached signature entry with turn/model provenance.
670
+ */
671
+ export interface ReplaySignatureEntry {
672
+ signature: string;
673
+ thinkingText: string;
674
+ model: string;
675
+ timestamp: number;
676
+ turnId: string;
677
+ tokenCount?: number | undefined;
678
+ }
679
+ /**
680
+ * Entry-based LRU cache for thinking signatures across turns.
681
+ * Preserves thoughtSignature values that must be replayed on multi-turn
682
+ * requests for gemini-3-pro / claude thinking models.
683
+ *
684
+ * Kept alongside {@link ReplaySignatureCache}, which maps plain text hashes
685
+ * to signature strings.
686
+ */
687
+ export declare class ThinkingSignatureLRUCache {
688
+ private readonly maxEntries;
689
+ private readonly map;
690
+ constructor(maxEntries?: number);
691
+ private touch;
692
+ get(key: string): ReplaySignatureEntry | undefined;
693
+ set(key: string, entry: ReplaySignatureEntry): void;
694
+ /**
695
+ * Short FNV-1a hex hash of thinking text, used as key when no turnId exists.
696
+ */
697
+ static hashThinking(text: string): string;
698
+ /**
699
+ * Adds an entry derived from a payload fragment and returns the cache key.
700
+ */
701
+ addFromPayload(payload: {
702
+ signature: string;
703
+ thinkingText?: string;
704
+ model?: string;
705
+ turnId?: string;
706
+ tokenCount?: number;
707
+ }): string;
708
+ findByModel(model: string): ReplaySignatureEntry[];
709
+ clear(): void;
710
+ get size(): number;
711
+ entries(): IterableIterator<[string, ReplaySignatureEntry]>;
712
+ toJSON(): Record<string, ReplaySignatureEntry>;
713
+ }
714
+ /**
715
+ * Global singleton of the entry-based LRU cache. Kept alongside the text-hash
716
+ * singleton {@link globalThinkingSignatureCache}.
717
+ */
718
+ export declare const globalThinkingSignatureLRUCache: ThinkingSignatureLRUCache;
719
+ /**
720
+ * Minimal SSE event shape used by the lightweight parser utilities.
721
+ */
722
+ export type sseEvent = {
723
+ data: string;
724
+ };
725
+ /**
726
+ * Linear-time strip of SDK-injected `[cache_control...]` markers (regex-free;
727
+ * the former /\[cache_control.*?\]/g replace was polynomial on uncontrolled input).
728
+ */
729
+ export declare const stripCacheControlMarkers: (text: string) => string;
730
+ /**
731
+ * Strips SDK-injected cache_control markers from a thinking block payload.
732
+ *
733
+ * @param p - payload possibly containing `thinking`
734
+ * @param keepThinking - kept for API compatibility; both branches preserve thinking
735
+ * @returns payload with cleaned thinking text
736
+ */
737
+ export declare const handleThinkingBlock: (p: any, keepThinking?: boolean) => any;
738
+ /**
739
+ * Remainder-based SSE parser for cloudcode-pa streams. Pure function: feed each
740
+ * network chunk together with the previous remainder; it returns fully parsed
741
+ * payloads plus the new remainder. Tolerates UTF-8 splits, concatenated JSON,
742
+ * ndjson without SSE framing and `[DONE]` sentinels.
743
+ *
744
+ * Named `parseSSEPayloads` because {@link parseSSEChunk} already owns the
745
+ * event-block parser name in this module.
746
+ *
747
+ * @param chunk - new raw text or binary chunk
748
+ * @param previousRemainder - leftover text from the previous call
749
+ * @returns parsed payloads, new remainder, error notes and consumed length
750
+ *
751
+ * @example
752
+ * let remainder = "";
753
+ * for await (const raw of stream) {
754
+ * const { payloads, remainder: next } = parseSSEPayloads(raw, remainder);
755
+ * remainder = next;
756
+ * for (const p of payloads) handle(p);
757
+ * }
758
+ */
759
+ export declare function parseSSEPayloads(chunk: string | Uint8Array, previousRemainder?: string): {
760
+ payloads: CloudCodeRawChunk[];
761
+ remainder: string;
762
+ errors: string[];
763
+ consumed: number;
764
+ };
765
+ /**
766
+ * Normalizes heterogeneous raw chunks into {@link NormalizedPayload} arrays:
767
+ * unwraps `{response:{...}}`, builds virtual candidates for content/parts/text
768
+ * shapes, classifies parts into text/thinking/function_call/inline_data/
769
+ * thought_signature kinds and carries finish reasons and usage metadata.
770
+ *
771
+ * Named `normalizeRawPayloads` because the string-based {@link normalizePayloads}
772
+ * keeps its historical name in this module.
773
+ *
774
+ * @param rawChunks - typed raw chunks (output of parseSSEPayloads)
775
+ * @param opts - model fallback and candidate index fallback
776
+ * @returns normalized payloads
777
+ */
778
+ export declare function normalizeRawPayloads(rawChunks: CloudCodeRawChunk[], opts?: {
779
+ model?: string;
780
+ candidateIndexFallback?: number;
781
+ }): NormalizedPayload[];
782
+ /**
783
+ * Creates the mutable state shared by the merged transformers.
784
+ *
785
+ * @param model - model id echoed back to clients
786
+ * @param completionId - optional fixed completion id
787
+ */
788
+ export declare function createInitialStreamingState(model: string, completionId?: string): StreamingState;
789
+ /**
790
+ * Transforms normalized payloads into OpenAI chat.completion.chunk objects.
791
+ * Emits a leading role chunk, routes thinking into reasoning_content/reasoning,
792
+ * caches thought signatures in the global entry-based LRU and streams tool calls.
793
+ *
794
+ * @param payloads - normalized payloads
795
+ * @param state - mutable streaming state updated in place
796
+ * @returns OpenAI chunk objects (serialize with serializeOpenAIChunksToSSE)
797
+ */
798
+ export declare function transformToOpenAIChunks(payloads: NormalizedPayload[], state: StreamingState): OpenAIChatChunk[];
799
+ /**
800
+ * Builds the final OpenAI finish chunk (with optional usage mapping) once the
801
+ * stream ends. The caller serializes it and appends the `[DONE]` marker.
802
+ *
803
+ * @param state - streaming state carrying the last observed finish reason
804
+ * @param reason - fallback finish reason
805
+ * @param usage - usage metadata captured from the stream
806
+ */
807
+ export declare function createSyntheticFinishChunks(state: StreamingState, reason?: string, usage?: NormalizedPayload["usage"]): OpenAIChatChunk[];
808
+ /**
809
+ * Serializes OpenAI chunks into SSE data lines ready for the wire.
810
+ *
811
+ * @param chunks - OpenAI chunk objects
812
+ * @returns array of `data: {...}\n\n` strings
813
+ */
814
+ export declare function serializeOpenAIChunksToSSE(chunks: OpenAIChatChunk[]): string[];
815
+ /**
816
+ * Transforms normalized payloads into Anthropic Messages SSE lines:
817
+ * message_start, content_block_start/delta/stop and message_delta/stop.
818
+ * Opens separate blocks when thinking interleaves with text so block ordering
819
+ * satisfies Claude validation.
820
+ *
821
+ * @param payloads - normalized payloads
822
+ * @param state - mutable streaming state updated in place
823
+ * @returns formatted SSE strings (`event: ...\ndata: {...}\n\n`)
824
+ */
825
+ export declare function transformToAnthropicEvents(payloads: NormalizedPayload[], state: StreamingState): string[];
826
+ /**
827
+ * Emits the final Anthropic events (block stop, message_delta with stop_reason,
828
+ * message_stop) once the stream ends.
829
+ *
830
+ * @param state - streaming state
831
+ * @param reason - fallback stop reason
832
+ * @param usage - usage metadata captured from the stream
833
+ * @returns formatted SSE strings
834
+ */
835
+ export declare function createAnthropicSyntheticFinish(state: StreamingState, reason?: string, usage?: NormalizedPayload["usage"]): string[];
836
+ /**
837
+ * Stateful incremental SSE parser wrapping parseSSEPayloads with streaming
838
+ * UTF-8 decoding and byte accounting.
839
+ */
840
+ export declare class IncrementalSSEParser {
841
+ private buffer;
842
+ private readonly decoder;
843
+ private totalBytes;
844
+ constructor();
845
+ /**
846
+ * Pushes an incremental chunk (string, Uint8Array or Buffer), tolerating
847
+ * splits anywhere, and returns payloads parsed so far.
848
+ */
849
+ push(chunk: string | Uint8Array | Buffer): CloudCodeRawChunk[];
850
+ /**
851
+ * Final flush: decodes any pending bytes and attempts to parse the remainder.
852
+ */
853
+ flush(): CloudCodeRawChunk[];
854
+ get remainder(): string;
855
+ get bytesReceived(): number;
856
+ reset(): void;
857
+ }
858
+ /** Output format selector for {@link CloudCodeStreamingTransformer}. */
859
+ export type OutputFormat = "openai" | "anthropic" | "raw";
860
+ /**
861
+ * Options for the high-level streaming transformer.
862
+ */
863
+ export interface StreamingTransformerOptions {
864
+ /** Target model id. */
865
+ model: string;
866
+ /** Wire format, openai by default. */
867
+ format?: OutputFormat;
868
+ /** Optional fixed completion id. */
869
+ completionId?: string;
870
+ /** External entry-based LRU cache (defaults to the global singleton). */
871
+ thinkingCache?: ThinkingSignatureLRUCache;
872
+ /** Inject a synthetic finish when the stream ends without one? Default true. */
873
+ injectSyntheticFinish?: boolean;
874
+ /** Append `[DONE]` after OpenAI SSE? Default true. */
875
+ includeDoneMarker?: boolean;
876
+ /** Callback invoked for every transformed SSE line. */
877
+ onChunk?: (sseLine: string, state: StreamingState) => void;
878
+ }
879
+ /**
880
+ * High-level cloudcode-pa SSE transformer: push raw network chunks in, receive
881
+ * serialized SSE lines out in the configured format, with synthetic finish
882
+ * injection and `[DONE]` handling on flush.
883
+ */
884
+ export declare class CloudCodeStreamingTransformer {
885
+ private readonly parser;
886
+ private readonly state;
887
+ private readonly options;
888
+ private sentFinished;
889
+ private lastUsage?;
890
+ constructor(opts: StreamingTransformerOptions);
891
+ get streamingState(): StreamingState;
892
+ /**
893
+ * Transforms one raw chunk into output SSE lines.
894
+ */
895
+ transformChunk(rawChunk: string | Uint8Array): string[];
896
+ /**
897
+ * Flushes buffered input and injects the synthetic finish plus `[DONE]`.
898
+ */
899
+ flush(): string[];
900
+ private createFinish;
901
+ reset(model?: string): void;
902
+ }
903
+ /**
904
+ * Options for {@link resilientFetch}.
905
+ */
906
+ export interface ResilientFetchOptions {
907
+ /** Max attempts including the first. */
908
+ maxRetries?: number;
909
+ /** Base delay in ms. */
910
+ baseDelayMs?: number;
911
+ /** Max delay in ms. */
912
+ maxDelayMs?: number;
913
+ /** Apply jitter? Default true. */
914
+ jitter?: boolean;
915
+ /** Status codes that trigger a retry. */
916
+ retryOn?: number[];
917
+ /** External abort signal. */
918
+ signal?: AbortSignal;
919
+ /** Per-attempt timeout in ms. */
920
+ timeoutMs?: number;
921
+ }
922
+ /**
923
+ * Computes exponential delay with optional multiplicative jitter (0.7x-1.3x).
924
+ *
925
+ * @param attempt - zero-based attempt index
926
+ * @param base - base delay ms
927
+ * @param max - maximum delay ms
928
+ * @param jitter - apply jitter
929
+ */
930
+ export declare function computeExponentialDelay(attempt: number, base: number, max: number, jitter: boolean): number;
931
+ /**
932
+ * Fetches streamGenerateContent with exponential backoff, per-attempt timeout
933
+ * and external-signal support, keeping Gemini CLI bypass headers intact.
934
+ *
935
+ * Equivalent sibling of {@link fetchWithExponentialRetry}; both are kept.
936
+ *
937
+ * @param url - endpoint URL
938
+ * @param init - RequestInit for fetch
939
+ * @param opts - retry options
940
+ * @returns Response with body stream
941
+ */
942
+ export declare function resilientFetch(url: string, init: RequestInit, opts?: ResilientFetchOptions): Promise<Response>;
943
+ /**
944
+ * High-level wrapper consuming streamGenerateContent with auto-recovery and
945
+ * yielding SSE strings in the configured format. Tolerant to mid-stream breaks
946
+ * (synthetic finish), missing finish reasons and UTF-8/JSON splits.
947
+ *
948
+ * @example
949
+ * for await (const sseLine of createResilientTransformedStream(url, init, { model, format: "openai" })) {
950
+ * res.write(sseLine);
951
+ * }
952
+ */
953
+ export declare function createResilientTransformedStream(url: string, init: RequestInit, transformerOpts: StreamingTransformerOptions, fetchOpts?: ResilientFetchOptions): AsyncGenerator<string, void, unknown>;
954
+ /**
955
+ * Options for {@link buildGeminiCliBypassHeaders}.
956
+ */
957
+ export interface BypassHeadersOptions {
958
+ model?: string;
959
+ accessToken?: string;
960
+ projectId?: string;
961
+ includeAuth?: boolean;
962
+ }
963
+ /**
964
+ * Builds headers fully compatible with official Gemini CLI traffic against
965
+ * cloudcode-pa, including the X-Goog-Request-Params project binding.
966
+ *
967
+ * @param opts - auth/project options
968
+ * @returns headers record ready for fetch
969
+ */
970
+ export declare function buildGeminiCliBypassHeaders(opts?: BypassHeadersOptions): Record<string, string>;
971
+ /**
972
+ * Deterministic session id (FNV-1a hex) derived from directory, hostname, cwd
973
+ * and pid. Streaming-module variant kept alongside the request-module version.
974
+ *
975
+ * @param directory - optional directory seed
976
+ * @returns 8-char hex digest
977
+ */
978
+ export declare function buildHostSessionId(directory?: string): string;
979
+ /**
980
+ * Detects whether any payload carries thinking content.
981
+ *
982
+ * @param payloads - normalized payloads
983
+ */
984
+ export declare function hasThinkingContent(payloads: NormalizedPayload[]): boolean;
985
+ /**
986
+ * Collects all distinct thinking signatures for multi-turn replay.
987
+ *
988
+ * @param payloads - normalized payloads
989
+ * @returns unique signature strings
990
+ */
991
+ export declare function extractThinkingSignatures(payloads: NormalizedPayload[]): string[];
992
+ /**
993
+ * Exposes accumulated state metrics for observability in the opencode UI.
994
+ *
995
+ * @param state - streaming state
996
+ */
997
+ export declare function getStreamingSummary(state: StreamingState): {
998
+ completionId: string;
999
+ model: string;
1000
+ textChars: number;
1001
+ thinkingChars: number;
1002
+ finishReason?: string | undefined;
1003
+ toolCalls: number;
1004
+ pendingSignatures: number;
1005
+ };
1006
+ /**
1007
+ * Passes through the raw candidate payload when present, otherwise rebuilds a
1008
+ * minimal Gemini-shaped response from the normalized view.
1009
+ *
1010
+ * @param p - normalized payload-like object
1011
+ * @returns raw payload or reconstructed Gemini candidates envelope
1012
+ */
1013
+ export declare const transformToGemini: (p: any) => any;
1014
+ /**
1015
+ * Named bundle mirroring the legacy ONDA 4 module surface. Renamed members are
1016
+ * wired to their merged equivalents: `parseSSEPayloads`, `normalizeRawPayloads`
1017
+ * and the module-level `isRetryableNetworkStatus`.
1018
+ */
1019
+ export declare const Streaming: {
1020
+ readonly IncrementalSSEParser: typeof IncrementalSSEParser;
1021
+ readonly CloudCodeStreamingTransformer: typeof CloudCodeStreamingTransformer;
1022
+ readonly ThinkingSignatureLRUCache: typeof ThinkingSignatureLRUCache;
1023
+ readonly globalThinkingSignatureCache: ReplaySignatureCache;
1024
+ readonly globalThinkingSignatureLRUCache: ThinkingSignatureLRUCache;
1025
+ readonly parseSSEPayloads: typeof parseSSEPayloads;
1026
+ readonly normalizeRawPayloads: typeof normalizeRawPayloads;
1027
+ readonly transformToOpenAIChunks: typeof transformToOpenAIChunks;
1028
+ readonly transformToAnthropicEvents: typeof transformToAnthropicEvents;
1029
+ readonly serializeOpenAIChunksToSSE: typeof serializeOpenAIChunksToSSE;
1030
+ readonly createSyntheticFinishChunks: typeof createSyntheticFinishChunks;
1031
+ readonly createAnthropicSyntheticFinish: typeof createAnthropicSyntheticFinish;
1032
+ readonly createInitialStreamingState: typeof createInitialStreamingState;
1033
+ readonly resilientFetch: typeof resilientFetch;
1034
+ readonly createResilientTransformedStream: typeof createResilientTransformedStream;
1035
+ readonly computeExponentialDelay: typeof computeExponentialDelay;
1036
+ readonly isRetryableNetworkStatus: typeof isRetryableNetworkStatus;
1037
+ readonly buildGeminiCliBypassHeaders: typeof buildGeminiCliBypassHeaders;
1038
+ readonly buildHostSessionId: typeof buildHostSessionId;
1039
+ readonly hasThinkingContent: typeof hasThinkingContent;
1040
+ readonly extractThinkingSignatures: typeof extractThinkingSignatures;
1041
+ readonly getStreamingSummary: typeof getStreamingSummary;
1042
+ readonly transformToGemini: typeof transformToGemini;
1043
+ readonly handleThinkingBlock: typeof handleThinkingBlock;
1044
+ readonly GEMINI_CLI_CLIENT_ID: string;
1045
+ readonly GEMINI_CLI_CLIENT_SECRET: string;
1046
+ readonly GEMINI_CLI_USER_AGENT: "GeminiCLI/0.57.0/gemini-3-pro-preview (linux; x64; GitHub) google-api-nodejs-client/9.15.1";
1047
+ readonly X_GOOG_API_CLIENT: "gl-node/22.19.0";
1048
+ readonly CLIENT_METADATA_RAW: "ideType=IDE_UNSPECIFIED,platform=PLATFORM_UNSPECIFIED,pluginType=GEMINI";
1049
+ readonly PROJECT_FALLBACK: "rising-fact-p41fc";
1050
+ readonly MODELS_2026: readonly ["antigravity-gemini-3-pro", "antigravity-gemini-3.1-pro", "antigravity-gemini-3-flash", "antigravity-claude-sonnet-4-6", "antigravity-claude-opus-4-6-thinking", "gemini-2.5-flash", "gemini-2.5-pro", "gemini-3-flash-preview", "gemini-3-pro-preview", "gemini-3.1-pro-preview", "gemini-3.1-pro-preview-customtools"];
1051
+ };
1052
+ /**
1053
+ * Default export for barrel compatibility: contains all primary helpers
1054
+ */
1055
+ declare const streamingModule: {
1056
+ LRU_THINKING_CACHE_SIZE: 100;
1057
+ ReplaySignatureCache: typeof ReplaySignatureCache;
1058
+ globalThinkingSignatureCache: ReplaySignatureCache;
1059
+ createSSEParserState: typeof createSSEParserState;
1060
+ parseSSEChunk: typeof parseSSEChunk;
1061
+ parseSSEBinaryChunk: typeof parseSSEBinaryChunk;
1062
+ safeJsonParse: typeof safeJsonParse;
1063
+ unwrapCandidates: typeof unwrapCandidates;
1064
+ extractParts: typeof extractParts;
1065
+ normalizePart: typeof normalizePart;
1066
+ normalizePayloads: typeof normalizePayloads;
1067
+ mapFinishReason: typeof mapFinishReason;
1068
+ extractDelta: typeof extractDelta;
1069
+ StreamingSessionTracker: typeof StreamingSessionTracker;
1070
+ transformToOpenAI: typeof transformToOpenAI;
1071
+ createOpenAIStreamingTransformer: typeof createOpenAIStreamingTransformer;
1072
+ transformToAnthropic: typeof transformToAnthropic;
1073
+ createAnthropicStreamingTransformer: typeof createAnthropicStreamingTransformer;
1074
+ fetchWithExponentialRetry: typeof fetchWithExponentialRetry;
1075
+ injectSyntheticFinish: typeof injectSyntheticFinish;
1076
+ withAutoRecoveryStreaming: typeof withAutoRecoveryStreaming;
1077
+ readSSEStream: typeof readSSEStream;
1078
+ streamToOpenAI: typeof streamToOpenAI;
1079
+ streamToAnthropic: typeof streamToAnthropic;
1080
+ fnv1a32: typeof fnv1a32;
1081
+ hashThinkingText: typeof hashThinkingText;
1082
+ getJitter: typeof getJitter;
1083
+ sleepWithJitter: typeof sleepWithJitter;
1084
+ SSE_DONE_SENTINEL: "[DONE]";
1085
+ };
1086
+ export default streamingModule;
1087
+ export type ChatEvent = {
1088
+ type: "start";
1089
+ provider: string;
1090
+ model: string;
1091
+ } | {
1092
+ type: "text";
1093
+ text: string;
1094
+ } | {
1095
+ type: "reasoning";
1096
+ text: string;
1097
+ } | {
1098
+ type: "tool";
1099
+ name: string;
1100
+ input: unknown;
1101
+ } | {
1102
+ type: "error";
1103
+ message: string;
1104
+ } | {
1105
+ type: "finish";
1106
+ reason?: string;
1107
+ };
1108
+ export type StreamOptions = {
1109
+ provider: string;
1110
+ model: string;
1111
+ signal?: AbortSignal | undefined;
1112
+ };
1113
+ export declare function normalizeFrame(provider: string, frame: Record<string, unknown>): ChatEvent[];
1114
+ export declare function parseEventStream(response: Response, options: StreamOptions): AsyncGenerator<ChatEvent>;
1115
+ export declare function collectEvents(events: AsyncIterable<ChatEvent>): Promise<{
1116
+ text: string;
1117
+ reasoning: string;
1118
+ }>;
1119
+ //# sourceMappingURL=streaming.d.ts.map