@wenathlan/devthink 2.0.12 → 2.0.14
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.
- package/CHANGELOG.md +20 -0
- package/accounts.ts +2087 -0
- package/agent.ts +2331 -0
- package/antigravity.ts +2139 -0
- package/apifreeze.ts +4146 -0
- package/auth.ts +642 -0
- package/background.ts +16837 -0
- package/bridge.ts +2080 -0
- package/build.ts +54 -0
- package/bun.ts +26 -0
- package/capture.ts +1614 -0
- package/checksecrets.ts +72 -0
- package/cjs.ts +9 -0
- package/cli.ts +3500 -0
- package/commands.ts +1101 -0
- package/companion.ts +450 -0
- package/compatibility.ts +37 -0
- package/config.ts +3137 -0
- package/constants.ts +943 -0
- package/core.ts +1473 -0
- package/crossbrowser.ts +1359 -0
- package/dashdone.ts +605 -0
- package/data.ts +943 -0
- package/database.ts +133 -0
- package/debug.ts +850 -0
- package/deno.ts +27 -0
- package/devthink.ts +707 -0
- package/dist/accounts.d.ts +409 -0
- package/dist/agent.d.ts +837 -0
- package/dist/antigravity.d.ts +380 -0
- package/dist/apifreeze.d.ts +113 -0
- package/dist/auth.d.ts +224 -0
- package/{bridge.d.ts → dist/bridge.d.ts} +1 -1
- package/dist/capture.d.ts +595 -0
- package/dist/cjs.d.ts +6 -0
- package/{cli.js → dist/cli.js} +2 -2
- package/dist/commands.d.ts +310 -0
- package/dist/compatibility.d.ts +17 -0
- package/dist/config.d.ts +1853 -0
- package/dist/constants.d.ts +637 -0
- package/dist/core.d.ts +361 -0
- package/dist/data.d.ts +330 -0
- package/dist/database.d.ts +24 -0
- package/dist/debug.d.ts +270 -0
- package/dist/engine.d.ts +74 -0
- package/dist/environments.d.ts +244 -0
- package/dist/evidence.d.ts +277 -0
- package/dist/export.d.ts +311 -0
- package/dist/fingerprint.d.ts +594 -0
- package/dist/flow.d.ts +300 -0
- package/dist/gates.d.ts +103 -0
- package/dist/identity.d.ts +51 -0
- package/dist/ids.d.ts +7 -0
- package/dist/llm.d.ts +652 -0
- package/dist/models.d.ts +1807 -0
- package/dist/net.d.ts +325 -0
- package/dist/neutral.d.ts +41 -0
- package/dist/oauth.d.ts +703 -0
- package/dist/page.d.ts +1166 -0
- package/dist/perf.d.ts +481 -0
- package/dist/plan.d.ts +134 -0
- package/dist/project.d.ts +395 -0
- package/dist/providers.d.ts +37 -0
- package/dist/quota.d.ts +453 -0
- package/dist/recovery.d.ts +621 -0
- package/dist/request.d.ts +1492 -0
- package/dist/run.d.ts +779 -0
- package/dist/runtime.d.ts +212 -0
- package/dist/search.d.ts +375 -0
- package/dist/security.d.ts +534 -0
- package/dist/serve.d.ts +136 -0
- package/dist/session.d.ts +296 -0
- package/dist/storage.d.ts +53 -0
- package/dist/streaming.d.ts +1119 -0
- package/dist/swarm.d.ts +328 -0
- package/dist/tools.d.ts +170 -0
- package/dist/types.d.ts +8357 -0
- package/dist/utils.d.ts +82 -0
- package/dist/version.d.ts +7 -0
- package/dist/versionregistry.d.ts +406 -0
- package/dist/views.d.ts +579 -0
- package/dist/workbenchsession.d.ts +69 -0
- package/dist/workflow.d.ts +649 -0
- package/docs/readme.md +92 -0
- package/docs/schemas/antigravity.json +192 -0
- package/engine.ts +1524 -0
- package/environments.ts +1005 -0
- package/evidence.ts +643 -0
- package/export.ts +889 -0
- package/fingerprint.ts +1458 -0
- package/flow.ts +1190 -0
- package/gates.ts +307 -0
- package/gateway.ts +34 -0
- package/hardening.ts +191 -0
- package/headless.ts +369 -0
- package/http.ts +2110 -0
- package/identity.ts +246 -0
- package/ids.ts +26 -0
- package/index.ts +369 -0
- package/llm.ts +2682 -0
- package/mcp.ts +1835 -0
- package/{memory.js → memory.ts} +3834 -2310
- package/models.ts +3805 -0
- package/modes.ts +43 -0
- package/net.ts +1214 -0
- package/neutral.ts +362 -0
- package/node.ts +26 -0
- package/oauth.ts +2216 -0
- package/offscreen.ts +170 -0
- package/pack.ts +956 -0
- package/package.json +175 -82
- package/page.ts +7824 -0
- package/pagebridge.ts +1116 -0
- package/perf.ts +957 -0
- package/plan.ts +672 -0
- package/plugin.ts +76 -0
- package/{policy.js → policy.ts} +5073 -4679
- package/prisma.config.ts +27 -0
- package/progress.ts +1308 -0
- package/project.ts +1291 -0
- package/protocol.ts +4187 -0
- package/providers.ts +246 -0
- package/quota.ts +1887 -0
- package/recovery.ts +2433 -0
- package/request.ts +4482 -0
- package/run.ts +2135 -0
- package/runtime.ts +526 -0
- package/search.ts +1760 -0
- package/security.ts +1673 -0
- package/serve.ts +419 -0
- package/server.ts +5538 -0
- package/session.ts +1162 -0
- package/storage.ts +182 -0
- package/streaming.ts +4101 -0
- package/swarm.ts +884 -0
- package/sync.ts +56 -0
- package/tests/agentcert.test.ts +128 -0
- package/tests/agentfleet.test.ts +214 -0
- package/tests/agentreview.test.ts +241 -0
- package/tests/agentstream.test.ts +335 -0
- package/tests/agentwork.test.ts +356 -0
- package/tests/apifreeze.test.ts +290 -0
- package/tests/apimap.test.ts +112 -0
- package/tests/approvalgate.test.ts +175 -0
- package/tests/artifactmanifest.test.ts +204 -0
- package/tests/attentionfeed.test.ts +163 -0
- package/tests/backgroundruns.test.ts +100 -0
- package/tests/batchscheduling.test.ts +131 -0
- package/tests/blackboard.test.ts +238 -0
- package/tests/bridge.test.ts +1088 -0
- package/tests/browsercoverage.test.ts +134 -0
- package/tests/browserpolyfills.test.ts +124 -0
- package/tests/build.mjs +1260 -0
- package/tests/clientauth.test.ts +223 -0
- package/tests/clitools.test.ts +578 -0
- package/tests/confirmgates.test.ts +190 -0
- package/tests/containerpack.test.ts +143 -0
- package/tests/controlflow.test.ts +2120 -0
- package/tests/coordination.test.ts +345 -0
- package/tests/copyscreen.test.ts +139 -0
- package/tests/core.test.ts +417 -0
- package/tests/costcert.test.ts +95 -0
- package/tests/crossbrowser.test.ts +115 -0
- package/tests/cspaudit.test.ts +79 -0
- package/tests/dashdone.test.ts +615 -0
- package/tests/datagrid.test.ts +137 -0
- package/tests/doccheck.test.ts +107 -0
- package/tests/dombatch.test.ts +109 -0
- package/tests/emulation.test.ts +282 -0
- package/tests/environments.test.ts +259 -0
- package/tests/evidenceviews.test.ts +88 -0
- package/tests/exporttools.test.ts +185 -0
- package/tests/firefoxprep.test.ts +134 -0
- package/tests/flowlibrary.test.ts +242 -0
- package/tests/flowrun.test.ts +303 -0
- package/tests/forensics.test.ts +439 -0
- package/tests/gateway.test.ts +939 -0
- package/tests/headlesslib.test.ts +171 -0
- package/tests/httpstream.test.ts +277 -0
- package/tests/immutablelog.test.ts +157 -0
- package/tests/inboundguard.test.ts +177 -0
- package/tests/lazyload.test.ts +72 -0
- package/tests/librarymodes.test.ts +623 -0
- package/tests/llm.test.ts +696 -0
- package/tests/manifest.test.ts +226 -0
- package/tests/maskinputs.test.ts +150 -0
- package/tests/matrixverify.test.ts +111 -0
- package/tests/mavenpack.test.ts +75 -0
- package/tests/mcpserver.test.ts +704 -0
- package/tests/memory.test.ts +4155 -0
- package/tests/memorycare.test.ts +230 -0
- package/tests/migrateplan.test.ts +349 -0
- package/tests/minimization.test.ts +414 -0
- package/tests/modelroute.test.ts +112 -0
- package/tests/multiagent.test.ts +440 -0
- package/tests/nativebridge.test.ts +807 -0
- package/tests/navigation.test.ts +284 -0
- package/tests/nugetpack.test.ts +83 -0
- package/tests/orchestration.test.ts +449 -0
- package/tests/originpolicy.test.ts +405 -0
- package/tests/outputcompare.test.ts +97 -0
- package/tests/package.test.ts +91 -0
- package/tests/pagebridge.test.ts +5909 -0
- package/tests/pentest.test.ts +75 -0
- package/tests/perfrecords.test.ts +257 -0
- package/tests/permdiff.test.ts +85 -0
- package/tests/phishguard.test.ts +128 -0
- package/tests/pickerviews.test.ts +155 -0
- package/tests/pipelines.test.ts +381 -0
- package/tests/planlint.test.ts +240 -0
- package/tests/planreview.test.ts +383 -0
- package/tests/platformtargets.test.ts +56 -0
- package/tests/policy.test.ts +8284 -0
- package/tests/portability.test.ts +96 -0
- package/tests/progress.test.ts +1036 -0
- package/tests/promptlibrary.test.ts +116 -0
- package/tests/protocol.test.ts +4793 -0
- package/tests/publishingpipeline.test.ts +314 -0
- package/tests/quickactions.test.ts +164 -0
- package/tests/readiness.test.ts +78 -0
- package/tests/recipes.test.ts +163 -0
- package/tests/redactshots.test.ts +216 -0
- package/tests/registernvidiakeys.ts +51 -0
- package/tests/relayserve.test.ts +304 -0
- package/tests/releasenotes.test.ts +276 -0
- package/tests/resilience.test.ts +467 -0
- package/tests/resourceaware.test.ts +187 -0
- package/tests/runbudget.test.ts +125 -0
- package/tests/runhistory.test.ts +299 -0
- package/tests/runreplay.test.ts +113 -0
- package/tests/runresume.test.ts +184 -0
- package/tests/runstate.test.ts +288 -0
- package/tests/runtimeadapters.test.ts +251 -0
- package/tests/safariskeleton.test.ts +115 -0
- package/tests/sandboxframe.test.ts +196 -0
- package/tests/sbom.test.ts +105 -0
- package/tests/secretvault.test.ts +188 -0
- package/tests/selcache.test.ts +111 -0
- package/tests/sessioninterface.test.ts +791 -0
- package/tests/sessions.test.ts +591 -0
- package/tests/siteprefs.test.ts +228 -0
- package/tests/snapshotdelta.test.ts +165 -0
- package/tests/statusviews.test.ts +237 -0
- package/tests/stepmeter.test.ts +200 -0
- package/tests/streamparse.test.ts +163 -0
- package/tests/stylepruning.test.ts +90 -0
- package/tests/surfaces.test.ts +282 -0
- package/tests/sweep.test.ts +78 -0
- package/tests/syncbridge.test.ts +164 -0
- package/tests/taskqueue.test.ts +206 -0
- package/tests/toolcalls.test.ts +336 -0
- package/tests/toolcatalog.test.ts +201 -0
- package/tests/torture-agent.test.ts +706 -0
- package/tests/torture-auth.test.ts +461 -0
- package/tests/torture-commands.test.ts +895 -0
- package/tests/torture-data.test.ts +923 -0
- package/tests/torture-environments.test.ts +285 -0
- package/tests/torture-export.test.ts +263 -0
- package/tests/torture-http.test.ts +1379 -0
- package/tests/torture-llm.test.ts +808 -0
- package/tests/torture-memory.test.ts +1084 -0
- package/tests/torture-plan.test.ts +829 -0
- package/tests/torture-run.test.ts +626 -0
- package/tests/torture-session.test.ts +928 -0
- package/tests/torture-swarm.test.ts +1245 -0
- package/tests/torture-tools.test.ts +964 -0
- package/tests/torture-workflow.test.ts +2354 -0
- package/tests/tourviews.test.ts +52 -0
- package/tests/transparency.test.ts +147 -0
- package/tests/trigger.test.ts +941 -0
- package/tests/v1sunset.test.ts +428 -0
- package/tests/virtlist.test.ts +94 -0
- package/tests/vision.test.ts +540 -0
- package/tests/vsixpack.test.ts +145 -0
- package/tests/webapi.test.ts +523 -0
- package/tests/workflow.test.ts +1785 -0
- package/tests/workfloweditor.test.ts +759 -0
- package/tests/xpipack.test.ts +128 -0
- package/tools.ts +734 -0
- package/types.ts +9908 -0
- package/umd.ts +9 -0
- package/utils.ts +249 -0
- package/version.ts +8 -0
- package/versionregistry.ts +1310 -0
- package/views.ts +2153 -0
- package/vitest.config.ts +12 -0
- package/web/App.tsx +78 -0
- package/web/README.md +47 -0
- package/web/capacitor.config.ts +46 -0
- package/web/const.ts +19 -0
- package/web/control.shell.tsx +66 -0
- package/web/dashboardpage.ts +554 -0
- package/web/db.ts +493 -0
- package/web/design.html +541 -0
- package/web/gatewayview/Gateway.tsx +345 -0
- package/web/gatewayview/config.ts +1042 -0
- package/web/gatewayview/definition.ts +174 -0
- package/web/icons.ts +15 -0
- package/{manifest.json → web/manifest.json} +1 -1
- package/web/optionspage.ts +691 -0
- package/web/popup.ts +1651 -0
- package/web/schema.prisma +176 -0
- package/web/sidepanel.ts +7941 -0
- package/web/sitemanifest.json +13 -0
- package/web/terminal-ui.tsx +622 -0
- package/web/transparencypage.ts +541 -0
- package/web/vite.config.ts +39 -0
- package/web/workspace.ts +23 -0
- package/workbenchmemory.ts +104 -0
- package/workbenchsession.ts +304 -0
- package/workflow.ts +4495 -0
- package/bridge.d.ts.map +0 -1
- package/bridge.js +0 -1877
- package/bun.d.ts.map +0 -1
- package/bun.js +0 -52329
- package/caps/background.json +0 -712
- package/caps/cli.json +0 -360
- package/caps/library.json +0 -3611
- package/caps/mcp.json +0 -126
- package/caps/pagebridge.json +0 -377
- package/caps/popup.json +0 -51
- package/caps/sidepanel.json +0 -522
- package/checksums.txt +0 -142
- package/cli.d.ts.map +0 -1
- package/companion.d.ts.map +0 -1
- package/companion.js +0 -389
- package/crossbrowser.d.ts.map +0 -1
- package/crossbrowser.js +0 -1191
- package/dashdone.d.ts.map +0 -1
- package/dashdone.js +0 -368
- package/deno.d.ts.map +0 -1
- package/deno.js +0 -52325
- package/devthink.umd.js +0 -52346
- package/fixtures/bun.ts +0 -7
- package/fixtures/cjs.js +0 -6
- package/fixtures/deno.ts +0 -6
- package/fixtures/example-org-pagestate.json +0 -22
- package/fixtures/importers/automa-workflow.json +0 -18
- package/fixtures/importers/selenium-side.json +0 -20
- package/fixtures/importers/tabular-plan.csv +0 -7
- package/fixtures/importers/uivision-macro.json +0 -10
- package/fixtures/importers/v1-plan.json +0 -13
- package/fixtures/mcp-client.mjs +0 -14
- package/fixtures/pages/checkout.html +0 -192
- package/fixtures/pages/dashboard.html +0 -110
- package/fixtures/pages/feed.html +0 -113
- package/fixtures/pages/product-grid.html +0 -150
- package/fixtures/plans/form-inventory-plan.json +0 -11
- package/fixtures/plans/release-notes-plan.json +0 -11
- package/fixtures/recipes/agentscompete.json +0 -11
- package/fixtures/recipes/agentsforms.json +0 -11
- package/fixtures/recipes/agentsmonitor.json +0 -11
- package/fixtures/recipes/agentsreview.json +0 -29
- package/fixtures/recipes/agentswarm.json +0 -11
- package/fixtures/recipes/fillcalendar.json +0 -12
- package/fixtures/recipes/fillcheckout.json +0 -13
- package/fixtures/recipes/filldependentdropdowns.json +0 -12
- package/fixtures/recipes/fillfromcsv.json +0 -13
- package/fixtures/recipes/fillloginform.json +0 -12
- package/fixtures/recipes/fillmultistepwizard.json +0 -13
- package/fixtures/recipes/fillregistration.json +0 -12
- package/fixtures/recipes/fillsearchfilters.json +0 -12
- package/fixtures/recipes/filltypeahead.json +0 -11
- package/fixtures/recipes/monitoralerts.json +0 -12
- package/fixtures/recipes/monitoravailability.json +0 -11
- package/fixtures/recipes/monitornetworkquiet.json +0 -12
- package/fixtures/recipes/monitorpagechanges.json +0 -11
- package/fixtures/recipes/monitorpricechange.json +0 -11
- package/fixtures/recipes/monitorschedule.json +0 -12
- package/fixtures/recipes/scrapedynamicprices.json +0 -13
- package/fixtures/recipes/scrapeimagegallery.json +0 -12
- package/fixtures/recipes/scrapeinfinitefeed.json +0 -13
- package/fixtures/recipes/scrapenestedlists.json +0 -12
- package/fixtures/recipes/scrapeproductgrid.json +0 -12
- package/fixtures/recipes/scrapereviews.json +0 -12
- package/fixtures/recipes/scrapesearchresults.json +0 -12
- package/fixtures/recipes/scrapetablepagination.json +0 -12
- package/fixtures/recipes/testaccessibility.json +0 -34
- package/fixtures/recipes/testconsoleerrors.json +0 -12
- package/fixtures/recipes/testdeeplinks.json +0 -12
- package/fixtures/recipes/testformvalidation.json +0 -13
- package/fixtures/recipes/testlayoutshift.json +0 -12
- package/fixtures/recipes/testlinkcheck.json +0 -12
- package/fixtures/recipes/testloadtiming.json +0 -12
- package/fixtures/recipes/testvisualdiff.json +0 -12
- package/fixtures/workflows/changelog-digest-workflow.json +0 -13
- package/fixtures/workflows/form-survey-workflow.json +0 -13
- package/gallery.json +0 -706
- package/hardening.d.ts.map +0 -1
- package/hardening.js +0 -188
- package/headless.d.ts.map +0 -1
- package/headless.js +0 -11522
- package/http.d.ts.map +0 -1
- package/http.js +0 -2165
- package/index.cjs +0 -54682
- package/index.d.ts.map +0 -1
- package/index.js +0 -52310
- package/index.neutral.js +0 -46343
- package/mcp.d.ts.map +0 -1
- package/mcp.js +0 -20515
- package/memory.d.ts.map +0 -1
- package/nativehost.template.json +0 -10
- package/node.cjs +0 -54686
- package/node.d.ts.map +0 -1
- package/pack.d.ts.map +0 -1
- package/pack.js +0 -805
- package/policy.d.ts.map +0 -1
- package/progress.d.ts.map +0 -1
- package/progress.js +0 -645
- package/protocol.d.ts.map +0 -1
- package/protocol.js +0 -8334
- package/schemas/audit.schema.json +0 -226
- package/schemas/capability.schema.json +0 -113
- package/schemas/envelope.schema.json +0 -162
- package/schemas/memory.schema.json +0 -51
- package/schemas/observation.schema.json +0 -113
- package/schemas/plan.schema.json +0 -208
- package/schemas/progress.schema.json +0 -126
- package/schemas/proposal.schema.json +0 -68
- package/schemas/session.schema.json +0 -82
- package/schemas/tool.schema.json +0 -94
- package/server.d.ts.map +0 -1
- package/server.js +0 -28877
- package/umd-example.html +0 -18
- package/umd.d.ts.map +0 -1
- /package/{bun.d.ts → dist/bun.d.ts} +0 -0
- /package/{cli.d.ts → dist/cli.d.ts} +0 -0
- /package/{companion.d.ts → dist/companion.d.ts} +0 -0
- /package/{crossbrowser.d.ts → dist/crossbrowser.d.ts} +0 -0
- /package/{dashdone.d.ts → dist/dashdone.d.ts} +0 -0
- /package/{deno.d.ts → dist/deno.d.ts} +0 -0
- /package/{hardening.d.ts → dist/hardening.d.ts} +0 -0
- /package/{headless.d.ts → dist/headless.d.ts} +0 -0
- /package/{http.d.ts → dist/http.d.ts} +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{mcp.d.ts → dist/mcp.d.ts} +0 -0
- /package/{memory.d.ts → dist/memory.d.ts} +0 -0
- /package/{node.d.ts → dist/node.d.ts} +0 -0
- /package/{pack.d.ts → dist/pack.d.ts} +0 -0
- /package/{policy.d.ts → dist/policy.d.ts} +0 -0
- /package/{progress.d.ts → dist/progress.d.ts} +0 -0
- /package/{protocol.d.ts → dist/protocol.d.ts} +0 -0
- /package/{server.d.ts → dist/server.d.ts} +0 -0
- /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
|