@wenathlan/devthink 2.0.15 → 2.0.19

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 +45 -0
  2. package/{dist/bridge.d.ts → bridge.d.ts} +1 -1
  3. package/bridge.d.ts.map +1 -0
  4. package/bridge.js +1877 -0
  5. package/bun.d.ts.map +1 -0
  6. package/bun.js +52329 -0
  7. package/caps/background.json +712 -0
  8. package/caps/cli.json +360 -0
  9. package/caps/library.json +3611 -0
  10. package/caps/mcp.json +126 -0
  11. package/caps/pagebridge.json +377 -0
  12. package/caps/popup.json +51 -0
  13. package/caps/sidepanel.json +522 -0
  14. package/checksums.txt +142 -0
  15. package/cli.d.ts.map +1 -0
  16. package/{dist/cli.js → cli.js} +2 -2
  17. package/companion.d.ts.map +1 -0
  18. package/companion.js +389 -0
  19. package/crossbrowser.d.ts.map +1 -0
  20. package/crossbrowser.js +1191 -0
  21. package/dashdone.d.ts.map +1 -0
  22. package/dashdone.js +368 -0
  23. package/deno.d.ts.map +1 -0
  24. package/deno.js +52325 -0
  25. package/devthink.umd.js +52346 -0
  26. package/fixtures/bun.ts +7 -0
  27. package/fixtures/cjs.js +6 -0
  28. package/fixtures/deno.ts +6 -0
  29. package/fixtures/example-org-pagestate.json +22 -0
  30. package/fixtures/importers/automa-workflow.json +18 -0
  31. package/fixtures/importers/selenium-side.json +20 -0
  32. package/fixtures/importers/tabular-plan.csv +7 -0
  33. package/fixtures/importers/uivision-macro.json +10 -0
  34. package/fixtures/importers/v1-plan.json +13 -0
  35. package/fixtures/mcp-client.mjs +14 -0
  36. package/fixtures/pages/checkout.html +192 -0
  37. package/fixtures/pages/dashboard.html +110 -0
  38. package/fixtures/pages/feed.html +113 -0
  39. package/fixtures/pages/product-grid.html +150 -0
  40. package/fixtures/plans/form-inventory-plan.json +11 -0
  41. package/fixtures/plans/release-notes-plan.json +11 -0
  42. package/fixtures/recipes/agentscompete.json +11 -0
  43. package/fixtures/recipes/agentsforms.json +11 -0
  44. package/fixtures/recipes/agentsmonitor.json +11 -0
  45. package/fixtures/recipes/agentsreview.json +29 -0
  46. package/fixtures/recipes/agentswarm.json +11 -0
  47. package/fixtures/recipes/fillcalendar.json +12 -0
  48. package/fixtures/recipes/fillcheckout.json +13 -0
  49. package/fixtures/recipes/filldependentdropdowns.json +12 -0
  50. package/fixtures/recipes/fillfromcsv.json +13 -0
  51. package/fixtures/recipes/fillloginform.json +12 -0
  52. package/fixtures/recipes/fillmultistepwizard.json +13 -0
  53. package/fixtures/recipes/fillregistration.json +12 -0
  54. package/fixtures/recipes/fillsearchfilters.json +12 -0
  55. package/fixtures/recipes/filltypeahead.json +11 -0
  56. package/fixtures/recipes/monitoralerts.json +12 -0
  57. package/fixtures/recipes/monitoravailability.json +11 -0
  58. package/fixtures/recipes/monitornetworkquiet.json +12 -0
  59. package/fixtures/recipes/monitorpagechanges.json +11 -0
  60. package/fixtures/recipes/monitorpricechange.json +11 -0
  61. package/fixtures/recipes/monitorschedule.json +12 -0
  62. package/fixtures/recipes/scrapedynamicprices.json +13 -0
  63. package/fixtures/recipes/scrapeimagegallery.json +12 -0
  64. package/fixtures/recipes/scrapeinfinitefeed.json +13 -0
  65. package/fixtures/recipes/scrapenestedlists.json +12 -0
  66. package/fixtures/recipes/scrapeproductgrid.json +12 -0
  67. package/fixtures/recipes/scrapereviews.json +12 -0
  68. package/fixtures/recipes/scrapesearchresults.json +12 -0
  69. package/fixtures/recipes/scrapetablepagination.json +12 -0
  70. package/fixtures/recipes/testaccessibility.json +34 -0
  71. package/fixtures/recipes/testconsoleerrors.json +12 -0
  72. package/fixtures/recipes/testdeeplinks.json +12 -0
  73. package/fixtures/recipes/testformvalidation.json +13 -0
  74. package/fixtures/recipes/testlayoutshift.json +12 -0
  75. package/fixtures/recipes/testlinkcheck.json +12 -0
  76. package/fixtures/recipes/testloadtiming.json +12 -0
  77. package/fixtures/recipes/testvisualdiff.json +12 -0
  78. package/fixtures/workflows/changelog-digest-workflow.json +13 -0
  79. package/fixtures/workflows/form-survey-workflow.json +13 -0
  80. package/gallery.json +706 -0
  81. package/hardening.d.ts.map +1 -0
  82. package/hardening.js +188 -0
  83. package/headless.d.ts.map +1 -0
  84. package/headless.js +11522 -0
  85. package/http.d.ts.map +1 -0
  86. package/http.js +2165 -0
  87. package/index.cjs +54682 -0
  88. package/index.d.ts.map +1 -0
  89. package/index.js +52310 -0
  90. package/index.neutral.js +46343 -0
  91. package/{web/manifest.json → manifest.json} +1 -1
  92. package/mcp.d.ts.map +1 -0
  93. package/mcp.js +20515 -0
  94. package/memory.d.ts.map +1 -0
  95. package/{memory.ts → memory.js} +2310 -3834
  96. package/nativehost.template.json +10 -0
  97. package/node.cjs +54686 -0
  98. package/node.d.ts.map +1 -0
  99. package/pack.d.ts.map +1 -0
  100. package/pack.js +805 -0
  101. package/package.json +83 -176
  102. package/policy.d.ts.map +1 -0
  103. package/{policy.ts → policy.js} +4679 -5073
  104. package/progress.d.ts.map +1 -0
  105. package/progress.js +645 -0
  106. package/protocol.d.ts.map +1 -0
  107. package/protocol.js +8334 -0
  108. package/schemas/audit.schema.json +226 -0
  109. package/schemas/capability.schema.json +113 -0
  110. package/schemas/envelope.schema.json +162 -0
  111. package/schemas/memory.schema.json +51 -0
  112. package/schemas/observation.schema.json +113 -0
  113. package/schemas/plan.schema.json +208 -0
  114. package/schemas/progress.schema.json +126 -0
  115. package/schemas/proposal.schema.json +68 -0
  116. package/schemas/session.schema.json +82 -0
  117. package/schemas/tool.schema.json +94 -0
  118. package/server.d.ts.map +1 -0
  119. package/server.js +28877 -0
  120. package/umd-example.html +18 -0
  121. package/umd.d.ts.map +1 -0
  122. package/accounts.ts +0 -2087
  123. package/agent.ts +0 -2331
  124. package/antigravity.ts +0 -2139
  125. package/apifreeze.ts +0 -4146
  126. package/auth.ts +0 -642
  127. package/background.ts +0 -16837
  128. package/bridge.ts +0 -2080
  129. package/build.ts +0 -54
  130. package/bun.ts +0 -26
  131. package/capture.ts +0 -1614
  132. package/checksecrets.ts +0 -72
  133. package/cjs.ts +0 -9
  134. package/cli.ts +0 -3500
  135. package/commands.ts +0 -1101
  136. package/companion.ts +0 -450
  137. package/compatibility.ts +0 -37
  138. package/config.ts +0 -3137
  139. package/constants.ts +0 -943
  140. package/core.ts +0 -1473
  141. package/crossbrowser.ts +0 -1359
  142. package/dashdone.ts +0 -605
  143. package/data.ts +0 -943
  144. package/database.ts +0 -133
  145. package/debug.ts +0 -850
  146. package/deno.ts +0 -27
  147. package/devthink.ts +0 -707
  148. package/dist/accounts.d.ts +0 -409
  149. package/dist/agent.d.ts +0 -837
  150. package/dist/antigravity.d.ts +0 -380
  151. package/dist/apifreeze.d.ts +0 -113
  152. package/dist/auth.d.ts +0 -224
  153. package/dist/capture.d.ts +0 -595
  154. package/dist/cjs.d.ts +0 -6
  155. package/dist/commands.d.ts +0 -310
  156. package/dist/compatibility.d.ts +0 -17
  157. package/dist/config.d.ts +0 -1853
  158. package/dist/constants.d.ts +0 -637
  159. package/dist/core.d.ts +0 -361
  160. package/dist/data.d.ts +0 -330
  161. package/dist/database.d.ts +0 -24
  162. package/dist/debug.d.ts +0 -270
  163. package/dist/engine.d.ts +0 -74
  164. package/dist/environments.d.ts +0 -244
  165. package/dist/evidence.d.ts +0 -277
  166. package/dist/export.d.ts +0 -311
  167. package/dist/fingerprint.d.ts +0 -594
  168. package/dist/flow.d.ts +0 -300
  169. package/dist/gates.d.ts +0 -103
  170. package/dist/identity.d.ts +0 -51
  171. package/dist/ids.d.ts +0 -7
  172. package/dist/llm.d.ts +0 -652
  173. package/dist/models.d.ts +0 -1807
  174. package/dist/net.d.ts +0 -325
  175. package/dist/neutral.d.ts +0 -41
  176. package/dist/oauth.d.ts +0 -703
  177. package/dist/page.d.ts +0 -1166
  178. package/dist/perf.d.ts +0 -481
  179. package/dist/plan.d.ts +0 -134
  180. package/dist/project.d.ts +0 -395
  181. package/dist/providers.d.ts +0 -37
  182. package/dist/quota.d.ts +0 -453
  183. package/dist/recovery.d.ts +0 -621
  184. package/dist/request.d.ts +0 -1492
  185. package/dist/run.d.ts +0 -779
  186. package/dist/runtime.d.ts +0 -212
  187. package/dist/search.d.ts +0 -375
  188. package/dist/security.d.ts +0 -534
  189. package/dist/serve.d.ts +0 -136
  190. package/dist/session.d.ts +0 -296
  191. package/dist/storage.d.ts +0 -53
  192. package/dist/streaming.d.ts +0 -1119
  193. package/dist/swarm.d.ts +0 -328
  194. package/dist/tools.d.ts +0 -170
  195. package/dist/types.d.ts +0 -8357
  196. package/dist/utils.d.ts +0 -82
  197. package/dist/version.d.ts +0 -7
  198. package/dist/versionregistry.d.ts +0 -406
  199. package/dist/views.d.ts +0 -579
  200. package/dist/workbenchsession.d.ts +0 -69
  201. package/dist/workflow.d.ts +0 -649
  202. package/docs/readme.md +0 -92
  203. package/docs/schemas/antigravity.json +0 -192
  204. package/engine.ts +0 -1524
  205. package/environments.ts +0 -1005
  206. package/evidence.ts +0 -643
  207. package/export.ts +0 -889
  208. package/fingerprint.ts +0 -1458
  209. package/flow.ts +0 -1190
  210. package/gates.ts +0 -307
  211. package/gateway.ts +0 -34
  212. package/hardening.ts +0 -191
  213. package/headless.ts +0 -369
  214. package/http.ts +0 -2110
  215. package/identity.ts +0 -246
  216. package/ids.ts +0 -26
  217. package/index.ts +0 -369
  218. package/llm.ts +0 -2682
  219. package/mcp.ts +0 -1835
  220. package/models.ts +0 -3805
  221. package/modes.ts +0 -43
  222. package/net.ts +0 -1214
  223. package/neutral.ts +0 -362
  224. package/node.ts +0 -26
  225. package/oauth.ts +0 -2216
  226. package/offscreen.ts +0 -170
  227. package/pack.ts +0 -956
  228. package/page.ts +0 -7824
  229. package/pagebridge.ts +0 -1116
  230. package/perf.ts +0 -957
  231. package/plan.ts +0 -672
  232. package/plugin.ts +0 -76
  233. package/prisma.config.ts +0 -27
  234. package/progress.ts +0 -1308
  235. package/project.ts +0 -1291
  236. package/protocol.ts +0 -4187
  237. package/providers.ts +0 -246
  238. package/quota.ts +0 -1887
  239. package/recovery.ts +0 -2433
  240. package/request.ts +0 -4482
  241. package/run.ts +0 -2135
  242. package/runtime.ts +0 -526
  243. package/search.ts +0 -1760
  244. package/security.ts +0 -1673
  245. package/serve.ts +0 -419
  246. package/server.ts +0 -5538
  247. package/session.ts +0 -1162
  248. package/storage.ts +0 -182
  249. package/streaming.ts +0 -4101
  250. package/swarm.ts +0 -884
  251. package/sync.ts +0 -56
  252. package/tests/agentcert.test.ts +0 -128
  253. package/tests/agentfleet.test.ts +0 -214
  254. package/tests/agentreview.test.ts +0 -241
  255. package/tests/agentstream.test.ts +0 -335
  256. package/tests/agentwork.test.ts +0 -356
  257. package/tests/apifreeze.test.ts +0 -290
  258. package/tests/apimap.test.ts +0 -112
  259. package/tests/approvalgate.test.ts +0 -175
  260. package/tests/artifactmanifest.test.ts +0 -204
  261. package/tests/attentionfeed.test.ts +0 -163
  262. package/tests/backgroundruns.test.ts +0 -100
  263. package/tests/batchscheduling.test.ts +0 -131
  264. package/tests/blackboard.test.ts +0 -238
  265. package/tests/bridge.test.ts +0 -1088
  266. package/tests/browsercoverage.test.ts +0 -134
  267. package/tests/browserpolyfills.test.ts +0 -124
  268. package/tests/build.mjs +0 -1260
  269. package/tests/clientauth.test.ts +0 -223
  270. package/tests/clitools.test.ts +0 -578
  271. package/tests/confirmgates.test.ts +0 -190
  272. package/tests/containerpack.test.ts +0 -143
  273. package/tests/controlflow.test.ts +0 -2120
  274. package/tests/coordination.test.ts +0 -345
  275. package/tests/copyscreen.test.ts +0 -139
  276. package/tests/core.test.ts +0 -417
  277. package/tests/costcert.test.ts +0 -95
  278. package/tests/crossbrowser.test.ts +0 -115
  279. package/tests/cspaudit.test.ts +0 -79
  280. package/tests/dashdone.test.ts +0 -615
  281. package/tests/datagrid.test.ts +0 -137
  282. package/tests/doccheck.test.ts +0 -107
  283. package/tests/dombatch.test.ts +0 -109
  284. package/tests/emulation.test.ts +0 -282
  285. package/tests/environments.test.ts +0 -259
  286. package/tests/evidenceviews.test.ts +0 -88
  287. package/tests/exporttools.test.ts +0 -185
  288. package/tests/firefoxprep.test.ts +0 -134
  289. package/tests/flowlibrary.test.ts +0 -242
  290. package/tests/flowrun.test.ts +0 -303
  291. package/tests/forensics.test.ts +0 -439
  292. package/tests/gateway.test.ts +0 -939
  293. package/tests/headlesslib.test.ts +0 -171
  294. package/tests/httpstream.test.ts +0 -277
  295. package/tests/immutablelog.test.ts +0 -157
  296. package/tests/inboundguard.test.ts +0 -177
  297. package/tests/lazyload.test.ts +0 -72
  298. package/tests/librarymodes.test.ts +0 -623
  299. package/tests/llm.test.ts +0 -696
  300. package/tests/manifest.test.ts +0 -226
  301. package/tests/maskinputs.test.ts +0 -150
  302. package/tests/matrixverify.test.ts +0 -111
  303. package/tests/mavenpack.test.ts +0 -75
  304. package/tests/mcpserver.test.ts +0 -704
  305. package/tests/memory.test.ts +0 -4155
  306. package/tests/memorycare.test.ts +0 -230
  307. package/tests/migrateplan.test.ts +0 -349
  308. package/tests/minimization.test.ts +0 -414
  309. package/tests/modelroute.test.ts +0 -112
  310. package/tests/multiagent.test.ts +0 -440
  311. package/tests/nativebridge.test.ts +0 -807
  312. package/tests/navigation.test.ts +0 -284
  313. package/tests/nugetpack.test.ts +0 -83
  314. package/tests/orchestration.test.ts +0 -449
  315. package/tests/originpolicy.test.ts +0 -405
  316. package/tests/outputcompare.test.ts +0 -97
  317. package/tests/package.test.ts +0 -91
  318. package/tests/pagebridge.test.ts +0 -5909
  319. package/tests/pentest.test.ts +0 -75
  320. package/tests/perfrecords.test.ts +0 -257
  321. package/tests/permdiff.test.ts +0 -85
  322. package/tests/phishguard.test.ts +0 -128
  323. package/tests/pickerviews.test.ts +0 -155
  324. package/tests/pipelines.test.ts +0 -381
  325. package/tests/planlint.test.ts +0 -240
  326. package/tests/planreview.test.ts +0 -383
  327. package/tests/platformtargets.test.ts +0 -56
  328. package/tests/policy.test.ts +0 -8284
  329. package/tests/portability.test.ts +0 -96
  330. package/tests/progress.test.ts +0 -1036
  331. package/tests/promptlibrary.test.ts +0 -116
  332. package/tests/protocol.test.ts +0 -4793
  333. package/tests/publishingpipeline.test.ts +0 -314
  334. package/tests/quickactions.test.ts +0 -164
  335. package/tests/readiness.test.ts +0 -78
  336. package/tests/recipes.test.ts +0 -163
  337. package/tests/redactshots.test.ts +0 -216
  338. package/tests/registernvidiakeys.ts +0 -51
  339. package/tests/relayserve.test.ts +0 -304
  340. package/tests/releasenotes.test.ts +0 -276
  341. package/tests/resilience.test.ts +0 -467
  342. package/tests/resourceaware.test.ts +0 -187
  343. package/tests/runbudget.test.ts +0 -125
  344. package/tests/runhistory.test.ts +0 -299
  345. package/tests/runreplay.test.ts +0 -113
  346. package/tests/runresume.test.ts +0 -184
  347. package/tests/runstate.test.ts +0 -288
  348. package/tests/runtimeadapters.test.ts +0 -251
  349. package/tests/safariskeleton.test.ts +0 -115
  350. package/tests/sandboxframe.test.ts +0 -196
  351. package/tests/sbom.test.ts +0 -105
  352. package/tests/secretvault.test.ts +0 -188
  353. package/tests/selcache.test.ts +0 -111
  354. package/tests/sessioninterface.test.ts +0 -791
  355. package/tests/sessions.test.ts +0 -591
  356. package/tests/siteprefs.test.ts +0 -228
  357. package/tests/snapshotdelta.test.ts +0 -165
  358. package/tests/statusviews.test.ts +0 -237
  359. package/tests/stepmeter.test.ts +0 -200
  360. package/tests/streamparse.test.ts +0 -163
  361. package/tests/stylepruning.test.ts +0 -90
  362. package/tests/surfaces.test.ts +0 -282
  363. package/tests/sweep.test.ts +0 -78
  364. package/tests/syncbridge.test.ts +0 -164
  365. package/tests/taskqueue.test.ts +0 -206
  366. package/tests/toolcalls.test.ts +0 -336
  367. package/tests/toolcatalog.test.ts +0 -201
  368. package/tests/torture-agent.test.ts +0 -706
  369. package/tests/torture-auth.test.ts +0 -461
  370. package/tests/torture-commands.test.ts +0 -895
  371. package/tests/torture-data.test.ts +0 -923
  372. package/tests/torture-environments.test.ts +0 -285
  373. package/tests/torture-export.test.ts +0 -263
  374. package/tests/torture-http.test.ts +0 -1379
  375. package/tests/torture-llm.test.ts +0 -808
  376. package/tests/torture-memory.test.ts +0 -1084
  377. package/tests/torture-plan.test.ts +0 -829
  378. package/tests/torture-run.test.ts +0 -626
  379. package/tests/torture-session.test.ts +0 -928
  380. package/tests/torture-swarm.test.ts +0 -1245
  381. package/tests/torture-tools.test.ts +0 -964
  382. package/tests/torture-workflow.test.ts +0 -2354
  383. package/tests/tourviews.test.ts +0 -52
  384. package/tests/transparency.test.ts +0 -147
  385. package/tests/trigger.test.ts +0 -941
  386. package/tests/v1sunset.test.ts +0 -428
  387. package/tests/virtlist.test.ts +0 -94
  388. package/tests/vision.test.ts +0 -540
  389. package/tests/vsixpack.test.ts +0 -145
  390. package/tests/webapi.test.ts +0 -523
  391. package/tests/workflow.test.ts +0 -1785
  392. package/tests/workfloweditor.test.ts +0 -759
  393. package/tests/xpipack.test.ts +0 -128
  394. package/tools.ts +0 -734
  395. package/types.ts +0 -9908
  396. package/umd.ts +0 -9
  397. package/utils.ts +0 -249
  398. package/version.ts +0 -8
  399. package/versionregistry.ts +0 -1310
  400. package/views.ts +0 -2153
  401. package/vitest.config.ts +0 -12
  402. package/web/App.tsx +0 -78
  403. package/web/README.md +0 -47
  404. package/web/capacitor.config.ts +0 -46
  405. package/web/const.ts +0 -19
  406. package/web/control.shell.tsx +0 -66
  407. package/web/dashboardpage.ts +0 -554
  408. package/web/db.ts +0 -493
  409. package/web/design.html +0 -541
  410. package/web/gatewayview/Gateway.tsx +0 -345
  411. package/web/gatewayview/config.ts +0 -1042
  412. package/web/gatewayview/definition.ts +0 -174
  413. package/web/icons.ts +0 -15
  414. package/web/optionspage.ts +0 -691
  415. package/web/popup.ts +0 -1651
  416. package/web/schema.prisma +0 -176
  417. package/web/sidepanel.ts +0 -7941
  418. package/web/sitemanifest.json +0 -13
  419. package/web/terminal-ui.tsx +0 -622
  420. package/web/transparencypage.ts +0 -541
  421. package/web/vite.config.ts +0 -39
  422. package/web/workspace.ts +0 -23
  423. package/workbenchmemory.ts +0 -104
  424. package/workbenchsession.ts +0 -304
  425. package/workflow.ts +0 -4495
  426. /package/{dist/bun.d.ts → bun.d.ts} +0 -0
  427. /package/{dist/cli.d.ts → cli.d.ts} +0 -0
  428. /package/{dist/companion.d.ts → companion.d.ts} +0 -0
  429. /package/{dist/crossbrowser.d.ts → crossbrowser.d.ts} +0 -0
  430. /package/{dist/dashdone.d.ts → dashdone.d.ts} +0 -0
  431. /package/{dist/deno.d.ts → deno.d.ts} +0 -0
  432. /package/{dist/hardening.d.ts → hardening.d.ts} +0 -0
  433. /package/{dist/headless.d.ts → headless.d.ts} +0 -0
  434. /package/{dist/http.d.ts → http.d.ts} +0 -0
  435. /package/{dist/index.d.ts → index.d.ts} +0 -0
  436. /package/{dist/mcp.d.ts → mcp.d.ts} +0 -0
  437. /package/{dist/memory.d.ts → memory.d.ts} +0 -0
  438. /package/{dist/node.d.ts → node.d.ts} +0 -0
  439. /package/{dist/pack.d.ts → pack.d.ts} +0 -0
  440. /package/{dist/policy.d.ts → policy.d.ts} +0 -0
  441. /package/{dist/progress.d.ts → progress.d.ts} +0 -0
  442. /package/{dist/protocol.d.ts → protocol.d.ts} +0 -0
  443. /package/{dist/server.d.ts → server.d.ts} +0 -0
  444. /package/{dist/umd.d.ts → umd.d.ts} +0 -0
@@ -1,1119 +0,0 @@
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