@remodex/rmx 1.0.2

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 (588) hide show
  1. package/AGENTS_INSTALL.md +91 -0
  2. package/LICENSE +21 -0
  3. package/README.md +242 -0
  4. package/assets/architecture.png +0 -0
  5. package/assets/banner.png +0 -0
  6. package/assets/claude-code-models.gif +0 -0
  7. package/assets/codex-app-picker.png +0 -0
  8. package/bin/ocx.mjs +584 -0
  9. package/bin/package-main.mjs +9 -0
  10. package/gui/dist/assets/index-CZqebSPQ.css +1 -0
  11. package/gui/dist/assets/index-CkETtt7P.js +71 -0
  12. package/gui/dist/favicon.png +0 -0
  13. package/gui/dist/fonts/google-sans-cyrillic.woff2 +0 -0
  14. package/gui/dist/fonts/google-sans-latin.woff2 +0 -0
  15. package/gui/dist/icons.svg +24 -0
  16. package/gui/dist/index.html +25 -0
  17. package/gui/dist/logo.png +0 -0
  18. package/gui/dist/provider-icons/alibaba-color.svg +1 -0
  19. package/gui/dist/provider-icons/antigravity-color.svg +1 -0
  20. package/gui/dist/provider-icons/claude-color.svg +1 -0
  21. package/gui/dist/provider-icons/cline-color.svg +16 -0
  22. package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
  23. package/gui/dist/provider-icons/commandcode-color.svg +1 -0
  24. package/gui/dist/provider-icons/copilot-color.svg +1 -0
  25. package/gui/dist/provider-icons/cursor-color.svg +2 -0
  26. package/gui/dist/provider-icons/deepseek-color.svg +1 -0
  27. package/gui/dist/provider-icons/discord.svg +1 -0
  28. package/gui/dist/provider-icons/firepass-color.svg +1 -0
  29. package/gui/dist/provider-icons/fireworks-color.svg +1 -0
  30. package/gui/dist/provider-icons/gemini-color.svg +1 -0
  31. package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
  32. package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
  33. package/gui/dist/provider-icons/grok.svg +1 -0
  34. package/gui/dist/provider-icons/groq-color.svg +1 -0
  35. package/gui/dist/provider-icons/huggingface-color.svg +1 -0
  36. package/gui/dist/provider-icons/kimi-color.svg +1 -0
  37. package/gui/dist/provider-icons/kiro-color.svg +15 -0
  38. package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
  39. package/gui/dist/provider-icons/mistral-color.svg +1 -0
  40. package/gui/dist/provider-icons/moonshot-color.svg +1 -0
  41. package/gui/dist/provider-icons/nvidia-color.svg +1 -0
  42. package/gui/dist/provider-icons/ollama-color.svg +1 -0
  43. package/gui/dist/provider-icons/openai.svg +1 -0
  44. package/gui/dist/provider-icons/opencode.svg +2 -0
  45. package/gui/dist/provider-icons/openrouter-color.svg +1 -0
  46. package/gui/dist/provider-icons/pi.svg +21 -0
  47. package/gui/dist/provider-icons/qianfan-color.svg +1 -0
  48. package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
  49. package/gui/dist/provider-icons/telegram.svg +1 -0
  50. package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
  51. package/gui/dist/provider-icons/vllm-color.svg +1 -0
  52. package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
  53. package/package.json +118 -0
  54. package/src/AGENTS.md +28 -0
  55. package/src/adapters/anthropic-image-guard.ts +251 -0
  56. package/src/adapters/anthropic-image-normalize.ts +518 -0
  57. package/src/adapters/anthropic.ts +1205 -0
  58. package/src/adapters/azure.ts +36 -0
  59. package/src/adapters/base.ts +83 -0
  60. package/src/adapters/client-fingerprint.ts +59 -0
  61. package/src/adapters/command-code.ts +453 -0
  62. package/src/adapters/cursor/arg-codec.ts +38 -0
  63. package/src/adapters/cursor/arg-normalize.ts +104 -0
  64. package/src/adapters/cursor/cursor-errors.ts +165 -0
  65. package/src/adapters/cursor/discovery.ts +276 -0
  66. package/src/adapters/cursor/effort-map.ts +139 -0
  67. package/src/adapters/cursor/exec-policy.ts +88 -0
  68. package/src/adapters/cursor/framing.ts +250 -0
  69. package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
  70. package/src/adapters/cursor/kv-store.ts +52 -0
  71. package/src/adapters/cursor/live-models.ts +153 -0
  72. package/src/adapters/cursor/live-smoke-gate.ts +41 -0
  73. package/src/adapters/cursor/live-transport.ts +1235 -0
  74. package/src/adapters/cursor/mcp-config.ts +42 -0
  75. package/src/adapters/cursor/mcp-manager.ts +333 -0
  76. package/src/adapters/cursor/message-mapper.ts +49 -0
  77. package/src/adapters/cursor/native-exec-common.ts +59 -0
  78. package/src/adapters/cursor/native-exec-desktop.ts +184 -0
  79. package/src/adapters/cursor/native-exec-fs.ts +332 -0
  80. package/src/adapters/cursor/native-exec-mcp.ts +153 -0
  81. package/src/adapters/cursor/native-exec-network.ts +43 -0
  82. package/src/adapters/cursor/native-exec-shell.ts +548 -0
  83. package/src/adapters/cursor/native-exec-tools.ts +118 -0
  84. package/src/adapters/cursor/native-exec.ts +604 -0
  85. package/src/adapters/cursor/protobuf-events.ts +735 -0
  86. package/src/adapters/cursor/protobuf-request.ts +719 -0
  87. package/src/adapters/cursor/request-builder.ts +280 -0
  88. package/src/adapters/cursor/thread-continuity.ts +67 -0
  89. package/src/adapters/cursor/tool-definitions.ts +621 -0
  90. package/src/adapters/cursor/transport-retry.ts +132 -0
  91. package/src/adapters/cursor/transport.ts +57 -0
  92. package/src/adapters/cursor/types.ts +59 -0
  93. package/src/adapters/cursor.ts +196 -0
  94. package/src/adapters/google-antigravity-replay.ts +520 -0
  95. package/src/adapters/google-antigravity-wire.ts +140 -0
  96. package/src/adapters/google-errors.ts +85 -0
  97. package/src/adapters/google-http.ts +100 -0
  98. package/src/adapters/google-tool-schema.ts +173 -0
  99. package/src/adapters/google-truncation.ts +24 -0
  100. package/src/adapters/google-wire-compiler.ts +232 -0
  101. package/src/adapters/google.ts +859 -0
  102. package/src/adapters/identity.ts +77 -0
  103. package/src/adapters/image.ts +23 -0
  104. package/src/adapters/kiro-constants.ts +16 -0
  105. package/src/adapters/kiro-errors.ts +208 -0
  106. package/src/adapters/kiro-events.ts +197 -0
  107. package/src/adapters/kiro-images.ts +129 -0
  108. package/src/adapters/kiro-retry.ts +312 -0
  109. package/src/adapters/kiro-thinking.ts +104 -0
  110. package/src/adapters/kiro-tool-fallback.ts +36 -0
  111. package/src/adapters/kiro-tools.ts +224 -0
  112. package/src/adapters/kiro-truncation.ts +33 -0
  113. package/src/adapters/kiro-wire.ts +129 -0
  114. package/src/adapters/kiro.ts +1924 -0
  115. package/src/adapters/mimo-free.ts +263 -0
  116. package/src/adapters/openai-chat.ts +1265 -0
  117. package/src/adapters/openai-responses.ts +1309 -0
  118. package/src/adapters/run-turn-queue.ts +114 -0
  119. package/src/adapters/tool-catalog-nudge.ts +71 -0
  120. package/src/adapters/upstream-http-error.ts +48 -0
  121. package/src/android-remote/assets.ts +218 -0
  122. package/src/android-remote/attachments.ts +168 -0
  123. package/src/android-remote/auth.ts +237 -0
  124. package/src/android-remote/cloudflare-provisioning.ts +409 -0
  125. package/src/android-remote/cloudflare-secret.ts +106 -0
  126. package/src/android-remote/cloudflare-tunnel.ts +488 -0
  127. package/src/android-remote/cloudflared.ts +286 -0
  128. package/src/android-remote/codex-app-server.ts +565 -0
  129. package/src/android-remote/desktop-history-page.ts +936 -0
  130. package/src/android-remote/desktop-ipc.ts +3643 -0
  131. package/src/android-remote/desktop-ownership-store.ts +98 -0
  132. package/src/android-remote/desktop-project-registration.ts +129 -0
  133. package/src/android-remote/desktop-session-stream.ts +1110 -0
  134. package/src/android-remote/desktop-workspace-state.ts +443 -0
  135. package/src/android-remote/file-change-parser.ts +112 -0
  136. package/src/android-remote/gateway.ts +9108 -0
  137. package/src/android-remote/mutation-store.ts +299 -0
  138. package/src/android-remote/projection.ts +1780 -0
  139. package/src/android-remote/queued-turn-store.ts +248 -0
  140. package/src/android-remote/session-command-recovery.ts +1384 -0
  141. package/src/android-remote/store.ts +466 -0
  142. package/src/android-remote/thread-reconciliation.ts +133 -0
  143. package/src/android-remote/thread-source-paths.ts +307 -0
  144. package/src/android-remote/thread-stream.ts +546 -0
  145. package/src/android-remote/turn-activity.ts +235 -0
  146. package/src/android-remote/user-message-identity.ts +94 -0
  147. package/src/bridge.ts +1793 -0
  148. package/src/chat/inbound.ts +295 -0
  149. package/src/chat/outbound.ts +821 -0
  150. package/src/claude/agents-inject.ts +267 -0
  151. package/src/claude/alias.ts +149 -0
  152. package/src/claude/auth-detect.ts +229 -0
  153. package/src/claude/auth-mode-migration.ts +32 -0
  154. package/src/claude/auth-mode.ts +62 -0
  155. package/src/claude/context-windows.ts +189 -0
  156. package/src/claude/desktop-3p-guard.ts +35 -0
  157. package/src/claude/desktop-3p-paths.ts +84 -0
  158. package/src/claude/desktop-3p.ts +601 -0
  159. package/src/claude/desktop-health.ts +26 -0
  160. package/src/claude/desktop-profile.ts +263 -0
  161. package/src/claude/gateway-cache.ts +70 -0
  162. package/src/claude/inbound-debug.ts +163 -0
  163. package/src/claude/inbound.ts +519 -0
  164. package/src/claude/model-info.ts +154 -0
  165. package/src/claude/outbound.ts +898 -0
  166. package/src/cli/access.ts +108 -0
  167. package/src/cli/account-api.ts +296 -0
  168. package/src/cli/account-auth.ts +250 -0
  169. package/src/cli/account-catalog-refresh.ts +14 -0
  170. package/src/cli/account-extended.ts +476 -0
  171. package/src/cli/account-main.ts +317 -0
  172. package/src/cli/account.ts +297 -0
  173. package/src/cli/agent-driven.ts +70 -0
  174. package/src/cli/agent.ts +184 -0
  175. package/src/cli/catalog-prewarm.ts +27 -0
  176. package/src/cli/claude-desktop.ts +211 -0
  177. package/src/cli/claude.ts +302 -0
  178. package/src/cli/codex-shim-autorestore.ts +45 -0
  179. package/src/cli/codex-shim-readiness.ts +69 -0
  180. package/src/cli/combo.ts +124 -0
  181. package/src/cli/config-command.ts +183 -0
  182. package/src/cli/debug.ts +228 -0
  183. package/src/cli/desktop-first-run.ts +25 -0
  184. package/src/cli/doctor.ts +1022 -0
  185. package/src/cli/export-command.ts +201 -0
  186. package/src/cli/help.ts +370 -0
  187. package/src/cli/index.ts +1565 -0
  188. package/src/cli/init.ts +224 -0
  189. package/src/cli/integrations.ts +225 -0
  190. package/src/cli/interactive-confirm.ts +133 -0
  191. package/src/cli/internal-dispatch.ts +35 -0
  192. package/src/cli/launcher-context.ts +77 -0
  193. package/src/cli/models-runtime.ts +224 -0
  194. package/src/cli/models.ts +340 -0
  195. package/src/cli/observe.ts +170 -0
  196. package/src/cli/opencode.ts +587 -0
  197. package/src/cli/provider-runtime.ts +179 -0
  198. package/src/cli/provider.ts +476 -0
  199. package/src/cli/ready.ts +301 -0
  200. package/src/cli/route-policy.ts +92 -0
  201. package/src/cli/runtime-api.ts +328 -0
  202. package/src/cli/star-prompt.ts +211 -0
  203. package/src/cli/status-oauth.ts +78 -0
  204. package/src/cli/status.ts +321 -0
  205. package/src/cli/system-command.ts +196 -0
  206. package/src/cli/system-restart-client.ts +146 -0
  207. package/src/cli/tray-proxy.ts +205 -0
  208. package/src/cli/v2.ts +200 -0
  209. package/src/cli.ts +10 -0
  210. package/src/clients/config-export.ts +1109 -0
  211. package/src/codex/account-id.ts +34 -0
  212. package/src/codex/account-label.ts +34 -0
  213. package/src/codex/account-lifecycle.ts +172 -0
  214. package/src/codex/account-namespace-match.ts +63 -0
  215. package/src/codex/account-namespaces.ts +195 -0
  216. package/src/codex/account-pause.ts +20 -0
  217. package/src/codex/account-priority.ts +83 -0
  218. package/src/codex/account-runtime-state.ts +31 -0
  219. package/src/codex/account-store.ts +517 -0
  220. package/src/codex/account-usability.ts +40 -0
  221. package/src/codex/admission.ts +263 -0
  222. package/src/codex/app-server-processes.ts +799 -0
  223. package/src/codex/auth-api.ts +2098 -0
  224. package/src/codex/auth-collision.ts +107 -0
  225. package/src/codex/auth-context.ts +480 -0
  226. package/src/codex/autostart-health.ts +156 -0
  227. package/src/codex/catalog/account-models.ts +67 -0
  228. package/src/codex/catalog/aggregation.ts +471 -0
  229. package/src/codex/catalog/bundled.ts +533 -0
  230. package/src/codex/catalog/effort.ts +432 -0
  231. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  232. package/src/codex/catalog/kinds.ts +2 -0
  233. package/src/codex/catalog/metadata.ts +287 -0
  234. package/src/codex/catalog/native-models.ts +7 -0
  235. package/src/codex/catalog/parsing.ts +503 -0
  236. package/src/codex/catalog/provider-fetch.ts +2267 -0
  237. package/src/codex/catalog/sync.ts +1606 -0
  238. package/src/codex/catalog-admission.ts +197 -0
  239. package/src/codex/catalog-refresh-status.ts +87 -0
  240. package/src/codex/catalog-write-serialization.ts +242 -0
  241. package/src/codex/catalog.ts +15 -0
  242. package/src/codex/codex-write-lock.ts +384 -0
  243. package/src/codex/convergence-types.ts +593 -0
  244. package/src/codex/convergence.ts +580 -0
  245. package/src/codex/custom-model-catalog-migration.ts +176 -0
  246. package/src/codex/data/upstream-models.json +830 -0
  247. package/src/codex/desired-state.ts +230 -0
  248. package/src/codex/desktop-client-processes.ts +521 -0
  249. package/src/codex/exec-invocation.ts +22 -0
  250. package/src/codex/features.ts +1091 -0
  251. package/src/codex/generation.ts +202 -0
  252. package/src/codex/history-job.ts +347 -0
  253. package/src/codex/history-lock.ts +242 -0
  254. package/src/codex/history-migration-guardian.ts +115 -0
  255. package/src/codex/history-provider.ts +1075 -0
  256. package/src/codex/history-transition.ts +105 -0
  257. package/src/codex/history-worker.ts +204 -0
  258. package/src/codex/home.ts +206 -0
  259. package/src/codex/inject-coordination.ts +257 -0
  260. package/src/codex/inject.ts +1857 -0
  261. package/src/codex/injected-marker.ts +79 -0
  262. package/src/codex/integration-record.ts +266 -0
  263. package/src/codex/internal/catalog-writer.ts +203 -0
  264. package/src/codex/internal/history-writer.ts +105 -0
  265. package/src/codex/journal.ts +172 -0
  266. package/src/codex/main-account-cache.ts +56 -0
  267. package/src/codex/main-account.ts +40 -0
  268. package/src/codex/management-convergence.ts +114 -0
  269. package/src/codex/model-cache.ts +267 -0
  270. package/src/codex/native-main-admission.ts +47 -0
  271. package/src/codex/native-main-auth-temp.ts +187 -0
  272. package/src/codex/native-main-claim.ts +167 -0
  273. package/src/codex/native-main-lock-file.ts +162 -0
  274. package/src/codex/native-main-owner.ts +329 -0
  275. package/src/codex/native-profile-api.ts +247 -0
  276. package/src/codex/native-profile-manager.ts +1531 -0
  277. package/src/codex/native-profile-processes.ts +121 -0
  278. package/src/codex/native-profile-recovery.ts +99 -0
  279. package/src/codex/native-profile-stage-store.ts +387 -0
  280. package/src/codex/native-profile-startup.ts +348 -0
  281. package/src/codex/native-profile-store.ts +855 -0
  282. package/src/codex/native-profile-types.ts +120 -0
  283. package/src/codex/native-residue.ts +691 -0
  284. package/src/codex/paths.ts +78 -0
  285. package/src/codex/plugins-doctor.ts +242 -0
  286. package/src/codex/pool-rotation.ts +295 -0
  287. package/src/codex/project-config-warnings.ts +426 -0
  288. package/src/codex/prompt-journal.ts +311 -0
  289. package/src/codex/prompt-layers.ts +967 -0
  290. package/src/codex/prompt-lock.ts +143 -0
  291. package/src/codex/provider-adoption.ts +242 -0
  292. package/src/codex/quota-rejection.ts +224 -0
  293. package/src/codex/quota.ts +494 -0
  294. package/src/codex/refresh.ts +60 -0
  295. package/src/codex/routing.ts +1855 -0
  296. package/src/codex/runtime.ts +659 -0
  297. package/src/codex/shim.ts +1215 -0
  298. package/src/codex/subagent-defaults.ts +557 -0
  299. package/src/codex/subagent-model-fallback.ts +560 -0
  300. package/src/codex/sync.ts +238 -0
  301. package/src/codex/transition-state.ts +612 -0
  302. package/src/codex/upstream-host-health.ts +368 -0
  303. package/src/codex/user-identity.ts +374 -0
  304. package/src/codex/warmup.ts +192 -0
  305. package/src/codex/websocket-registry.ts +100 -0
  306. package/src/codex/write-coordination.ts +114 -0
  307. package/src/combos/failover.ts +140 -0
  308. package/src/combos/index.ts +44 -0
  309. package/src/combos/request.ts +64 -0
  310. package/src/combos/resolve.ts +232 -0
  311. package/src/combos/types.ts +392 -0
  312. package/src/config.ts +3270 -0
  313. package/src/generated/model-metadata.ts +144 -0
  314. package/src/github/star-state.ts +203 -0
  315. package/src/grok/inject.ts +540 -0
  316. package/src/grok/inspect.ts +45 -0
  317. package/src/grok/status.ts +127 -0
  318. package/src/grok/sync.ts +66 -0
  319. package/src/images/artifacts.ts +516 -0
  320. package/src/images/fulfill-video.ts +163 -0
  321. package/src/images/fulfill.ts +149 -0
  322. package/src/images/index.ts +4 -0
  323. package/src/images/loop.ts +922 -0
  324. package/src/images/plan.ts +133 -0
  325. package/src/images/synthetic-tool.ts +133 -0
  326. package/src/images/types.ts +41 -0
  327. package/src/images/xai-client.ts +141 -0
  328. package/src/images/xai-video-client.ts +163 -0
  329. package/src/index.ts +22 -0
  330. package/src/integrations/config-io.ts +151 -0
  331. package/src/integrations/journal.ts +315 -0
  332. package/src/integrations/merge.ts +135 -0
  333. package/src/integrations/native/ownership-preflight.ts +202 -0
  334. package/src/integrations/ownership.ts +111 -0
  335. package/src/integrations/registry.ts +108 -0
  336. package/src/integrations/serialize.ts +235 -0
  337. package/src/integrations/state.ts +290 -0
  338. package/src/integrations/store.ts +103 -0
  339. package/src/integrations/writer.ts +492 -0
  340. package/src/lib/abort.ts +146 -0
  341. package/src/lib/admin-secrets.ts +25 -0
  342. package/src/lib/admission.ts +83 -0
  343. package/src/lib/app-owned-memory-stores.ts +173 -0
  344. package/src/lib/app-owned-memory.ts +265 -0
  345. package/src/lib/bounded-body.ts +242 -0
  346. package/src/lib/bun-binary-validator.d.mts +3 -0
  347. package/src/lib/bun-binary-validator.mjs +18 -0
  348. package/src/lib/bun-runtime.ts +184 -0
  349. package/src/lib/bun-stream-caps.ts +127 -0
  350. package/src/lib/config-ownership.ts +438 -0
  351. package/src/lib/crash-guard.ts +344 -0
  352. package/src/lib/debug-log-buffer.ts +83 -0
  353. package/src/lib/debug-settings.ts +108 -0
  354. package/src/lib/debug.ts +31 -0
  355. package/src/lib/destination-policy.ts +316 -0
  356. package/src/lib/errors.ts +364 -0
  357. package/src/lib/eventstream-decoder.ts +253 -0
  358. package/src/lib/gcp-adc.ts +341 -0
  359. package/src/lib/injection-debug-log.ts +58 -0
  360. package/src/lib/local-management-attestation.ts +51 -0
  361. package/src/lib/open-url.ts +25 -0
  362. package/src/lib/pinned-http.ts +182 -0
  363. package/src/lib/privacy.ts +20 -0
  364. package/src/lib/process-control.ts +168 -0
  365. package/src/lib/provider-environment.ts +470 -0
  366. package/src/lib/provider-outbound.ts +203 -0
  367. package/src/lib/provider-url.ts +14 -0
  368. package/src/lib/proxy-env.ts +18 -0
  369. package/src/lib/redact.ts +510 -0
  370. package/src/lib/remodex-home.ts +616 -0
  371. package/src/lib/retry-after.ts +55 -0
  372. package/src/lib/service-secrets.ts +178 -0
  373. package/src/lib/shadow-call.ts +54 -0
  374. package/src/lib/sidecar-tracker.ts +52 -0
  375. package/src/lib/sse-decoder.ts +364 -0
  376. package/src/lib/state-store-registrations.ts +109 -0
  377. package/src/lib/state-store-sweeper.ts +184 -0
  378. package/src/lib/system-restart-contract.ts +73 -0
  379. package/src/lib/test-home-guard.ts +98 -0
  380. package/src/lib/token-estimate.ts +69 -0
  381. package/src/lib/translator-budget.ts +366 -0
  382. package/src/lib/upstream-reachability.ts +91 -0
  383. package/src/lib/upstream-retry.ts +508 -0
  384. package/src/lib/win-exec.ts +115 -0
  385. package/src/lib/win-paths.ts +68 -0
  386. package/src/lib/windows-elevation.ts +705 -0
  387. package/src/lib/windows-secret-acl.ts +817 -0
  388. package/src/lib/windows-user-principal.ts +283 -0
  389. package/src/lib/winsw.ts +402 -0
  390. package/src/model-sources.ts +73 -0
  391. package/src/oauth/anthropic-routing.ts +594 -0
  392. package/src/oauth/anthropic.ts +177 -0
  393. package/src/oauth/callback-server.ts +294 -0
  394. package/src/oauth/chatgpt.ts +150 -0
  395. package/src/oauth/command-code.ts +239 -0
  396. package/src/oauth/cursor.ts +231 -0
  397. package/src/oauth/github-copilot.ts +428 -0
  398. package/src/oauth/google-antigravity.ts +230 -0
  399. package/src/oauth/health.ts +443 -0
  400. package/src/oauth/index.ts +1280 -0
  401. package/src/oauth/key-providers.ts +128 -0
  402. package/src/oauth/kimi.ts +213 -0
  403. package/src/oauth/kiro-credentials.ts +726 -0
  404. package/src/oauth/kiro.ts +621 -0
  405. package/src/oauth/local-token-detect.ts +121 -0
  406. package/src/oauth/log.ts +48 -0
  407. package/src/oauth/login-cli.ts +163 -0
  408. package/src/oauth/pkce.ts +15 -0
  409. package/src/oauth/store.ts +655 -0
  410. package/src/oauth/token-guardian.ts +309 -0
  411. package/src/oauth/types.ts +62 -0
  412. package/src/oauth/xai.ts +241 -0
  413. package/src/providers/alibaba-region-backup.ts +75 -0
  414. package/src/providers/alibaba-region-migration.ts +156 -0
  415. package/src/providers/alibaba-region-startup.ts +36 -0
  416. package/src/providers/antigravity-models.ts +317 -0
  417. package/src/providers/api-keys.ts +140 -0
  418. package/src/providers/base-url-choices.ts +64 -0
  419. package/src/providers/codex-capacity.ts +288 -0
  420. package/src/providers/command-code-efforts.ts +85 -0
  421. package/src/providers/context-cap.ts +73 -0
  422. package/src/providers/derive.ts +451 -0
  423. package/src/providers/free-directory.ts +187 -0
  424. package/src/providers/github-copilot-transport.ts +56 -0
  425. package/src/providers/google-vertex-location.ts +14 -0
  426. package/src/providers/key-failover.ts +271 -0
  427. package/src/providers/kiro-models.ts +67 -0
  428. package/src/providers/label.ts +19 -0
  429. package/src/providers/model-discovery-limits.ts +16 -0
  430. package/src/providers/model-discovery.ts +361 -0
  431. package/src/providers/openai-sidecar.ts +235 -0
  432. package/src/providers/openai-tier-startup.ts +27 -0
  433. package/src/providers/openai-tiers.ts +301 -0
  434. package/src/providers/openai-virtual-models.ts +83 -0
  435. package/src/providers/openrouter-routing.ts +102 -0
  436. package/src/providers/provider-id-rewrite.ts +179 -0
  437. package/src/providers/quota.ts +1942 -0
  438. package/src/providers/reasoning-capabilities.ts +336 -0
  439. package/src/providers/registry.ts +2375 -0
  440. package/src/providers/slug-codec.ts +74 -0
  441. package/src/providers/xai-transport.ts +149 -0
  442. package/src/reasoning-effort.ts +243 -0
  443. package/src/responses/compaction.ts +124 -0
  444. package/src/responses/hosted-tool-policy.ts +9 -0
  445. package/src/responses/parser.ts +714 -0
  446. package/src/responses/reasoning-envelope.ts +60 -0
  447. package/src/responses/reasoning-replay-cache.ts +106 -0
  448. package/src/responses/schema.ts +159 -0
  449. package/src/responses/spill-store.ts +431 -0
  450. package/src/responses/state.ts +1039 -0
  451. package/src/responses/tool-groups.ts +19 -0
  452. package/src/router.ts +802 -0
  453. package/src/routing/analytics.ts +377 -0
  454. package/src/routing/capability.ts +205 -0
  455. package/src/routing/cost.ts +77 -0
  456. package/src/routing/evaluator.ts +444 -0
  457. package/src/routing/health.ts +401 -0
  458. package/src/routing/history/cursor.ts +43 -0
  459. package/src/routing/history/indexer.ts +605 -0
  460. package/src/routing/history/schema.ts +72 -0
  461. package/src/routing/profile-namespace.ts +15 -0
  462. package/src/routing/profile.ts +424 -0
  463. package/src/routing/quota.ts +145 -0
  464. package/src/routing/request-evidence.ts +45 -0
  465. package/src/routing/trace.ts +686 -0
  466. package/src/server/adapter-resolve.ts +83 -0
  467. package/src/server/auth-cors.ts +606 -0
  468. package/src/server/chat-completions.ts +379 -0
  469. package/src/server/claude-messages.ts +980 -0
  470. package/src/server/effort-policy.ts +251 -0
  471. package/src/server/github-copilot-responses-repair.ts +338 -0
  472. package/src/server/gui-static.ts +152 -0
  473. package/src/server/image-retry.ts +42 -0
  474. package/src/server/images.ts +485 -0
  475. package/src/server/index.ts +1633 -0
  476. package/src/server/lifecycle.ts +482 -0
  477. package/src/server/live.ts +609 -0
  478. package/src/server/management/agent-settings-routes.ts +1180 -0
  479. package/src/server/management/android-remote-routes.ts +390 -0
  480. package/src/server/management/api-access.ts +141 -0
  481. package/src/server/management/api-key-usage.ts +167 -0
  482. package/src/server/management/body.ts +35 -0
  483. package/src/server/management/combo-routes.ts +244 -0
  484. package/src/server/management/config-routes.ts +602 -0
  485. package/src/server/management/context.ts +88 -0
  486. package/src/server/management/integration-routes.ts +538 -0
  487. package/src/server/management/logs-usage-routes.ts +516 -0
  488. package/src/server/management/model-routes.ts +519 -0
  489. package/src/server/management/model-rows.ts +143 -0
  490. package/src/server/management/native-integration-routes.ts +781 -0
  491. package/src/server/management/oauth-account-routes.ts +573 -0
  492. package/src/server/management/provider-routes.ts +781 -0
  493. package/src/server/management/request-history-routes.ts +191 -0
  494. package/src/server/management/routing-analytics-routes.ts +74 -0
  495. package/src/server/management/routing-profile-routes.ts +384 -0
  496. package/src/server/management/shared.ts +277 -0
  497. package/src/server/management/sidebar-routes.ts +106 -0
  498. package/src/server/management/sync-response.ts +69 -0
  499. package/src/server/management/system-restart.ts +433 -0
  500. package/src/server/management/system-routes.ts +141 -0
  501. package/src/server/management/usage-summary-cache.ts +86 -0
  502. package/src/server/management-api.ts +269 -0
  503. package/src/server/management-auth.ts +353 -0
  504. package/src/server/memory-watchdog.ts +156 -0
  505. package/src/server/port-reclaim.ts +307 -0
  506. package/src/server/ports.ts +156 -0
  507. package/src/server/proxy-liveness.ts +326 -0
  508. package/src/server/proxy-stop.ts +92 -0
  509. package/src/server/readiness.ts +99 -0
  510. package/src/server/relay-eager.ts +353 -0
  511. package/src/server/relay.ts +1179 -0
  512. package/src/server/request-decompress.ts +132 -0
  513. package/src/server/request-log-conversation.ts +168 -0
  514. package/src/server/request-log.ts +1072 -0
  515. package/src/server/responses/collaboration.ts +409 -0
  516. package/src/server/responses/compact.ts +710 -0
  517. package/src/server/responses/core.ts +3561 -0
  518. package/src/server/responses/encrypted-payload.ts +308 -0
  519. package/src/server/responses/fetch-helpers.ts +171 -0
  520. package/src/server/responses/passthrough-error.ts +78 -0
  521. package/src/server/responses/policy-fallback.ts +152 -0
  522. package/src/server/responses/terminal-guard.ts +230 -0
  523. package/src/server/responses/upstream-error.ts +48 -0
  524. package/src/server/responses-image-gen-repair.ts +132 -0
  525. package/src/server/responses-item-id-repair.ts +272 -0
  526. package/src/server/responses-json-events.ts +52 -0
  527. package/src/server/responses-model-rewrite.ts +29 -0
  528. package/src/server/responses-snapshot-repair.ts +621 -0
  529. package/src/server/responses.ts +10 -0
  530. package/src/server/search.ts +181 -0
  531. package/src/server/sse-frame-buffer.ts +292 -0
  532. package/src/server/sse-payload-rewrite.ts +263 -0
  533. package/src/server/startup-action-control.ts +308 -0
  534. package/src/server/startup-health-cache.ts +119 -0
  535. package/src/server/system-env.ts +418 -0
  536. package/src/server/windows-tcp-drop.ts +184 -0
  537. package/src/server/windows-tray-control.ts +41 -0
  538. package/src/server/ws-bridge.ts +470 -0
  539. package/src/service-manager-probe.ts +824 -0
  540. package/src/service.ts +3011 -0
  541. package/src/stall-timeout.ts +20 -0
  542. package/src/storage/cleanup-job.ts +57 -0
  543. package/src/storage/cleanup.ts +3085 -0
  544. package/src/storage/policy-job.ts +457 -0
  545. package/src/storage/policy-scheduler.ts +40 -0
  546. package/src/storage/policy-worker.ts +59 -0
  547. package/src/storage/policy.ts +527 -0
  548. package/src/storage/restore-job.ts +299 -0
  549. package/src/storage/restore-worker.ts +58 -0
  550. package/src/storage/scanner.ts +238 -0
  551. package/src/storage/storage-mutation-coordinator.ts +139 -0
  552. package/src/storage/worker-lifecycle.ts +215 -0
  553. package/src/tray/assets/opencodex-tray-offline.ico +0 -0
  554. package/src/tray/assets/opencodex-tray-online.ico +0 -0
  555. package/src/tray/assets/opencodex-tray-warning.ico +0 -0
  556. package/src/tray/assets/opencodex-tray.png +0 -0
  557. package/src/tray/windows-tray.ps1 +364 -0
  558. package/src/tray/windows.ts +738 -0
  559. package/src/types.ts +1531 -0
  560. package/src/update/badge.ts +72 -0
  561. package/src/update/desktop-release.ts +1620 -0
  562. package/src/update/index.ts +402 -0
  563. package/src/update/job.ts +1906 -0
  564. package/src/update/notify.ts +261 -0
  565. package/src/update/npm-cache-preflight.d.mts +47 -0
  566. package/src/update/npm-cache-preflight.mjs +201 -0
  567. package/src/update/npm-invocation.d.mts +23 -0
  568. package/src/update/npm-invocation.mjs +94 -0
  569. package/src/update/tray-update-plan.d.mts +18 -0
  570. package/src/update/tray-update-plan.mjs +38 -0
  571. package/src/usage/cost.ts +0 -0
  572. package/src/usage/debug.ts +97 -0
  573. package/src/usage/expected-prices.ts +283 -0
  574. package/src/usage/log.ts +695 -0
  575. package/src/usage/summary.ts +585 -0
  576. package/src/usage/totals.ts +14 -0
  577. package/src/vision/anthropic-describe.ts +185 -0
  578. package/src/vision/describe.ts +127 -0
  579. package/src/vision/index.ts +558 -0
  580. package/src/vision/reasoning.ts +55 -0
  581. package/src/web-search/anthropic-executor.ts +189 -0
  582. package/src/web-search/executor.ts +105 -0
  583. package/src/web-search/format-result.ts +89 -0
  584. package/src/web-search/index.ts +196 -0
  585. package/src/web-search/loop.ts +791 -0
  586. package/src/web-search/parse.ts +235 -0
  587. package/src/web-search/progress-stream.ts +342 -0
  588. package/src/web-search/synthetic-tool.ts +47 -0
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Per-model Cursor reasoning-effort mapping.
3
+ *
4
+ * Cursor model ids encode the reasoning effort as a suffix (`claude-4.6-opus-high`), and the available
5
+ * tiers differ per model — `claude-4.6-opus` tops out at `-max`, `claude-opus-4-8` at `-xhigh`,
6
+ * `claude-4.6-sonnet` only has `-medium`, and most `composer`/`gemini` models take no suffix at all.
7
+ * Grok Fast puts its mode marker after the effort (`grok-4.5-high-fast`). A bare id for a model that
8
+ * requires a suffix is rejected `ERROR_BAD_MODEL_NAME` (devlog 350.105).
9
+ *
10
+ * Canonical effort order is always low < medium < high < xhigh < max (max is the top tier, confirmed
11
+ * against Anthropic docs and Cursor's live lineup). Tiers are stored in ascending canonical order.
12
+ *
13
+ * `CURSOR_MODEL_EFFORT_TIERS` is the real catalog (from the Cursor `GetUsableModels` naming, mirrored in
14
+ * jawcode's bundle), each base model -> its available suffixes in ascending order. `cursorEffortSuffix`
15
+ * is literal-first: when the requested effort is one of the model's tiers, the effort you name is the
16
+ * suffix Cursor receives. It only clamps Codex effort ranks for efforts outside that model's tier set.
17
+ */
18
+
19
+ const CURSOR_MODEL_EFFORT_TIERS: Record<string, readonly string[]> = {
20
+ "claude-4.5-opus": ["high"],
21
+ "claude-4.6-opus": ["high", "max"],
22
+ "claude-4.6-sonnet": ["medium"],
23
+ // max is always the top tier (canonical order: low < medium < high < xhigh < max), confirmed
24
+ // against Anthropic's effort ladder docs and Cursor's live model lineup.
25
+ "claude-fable-5": ["low", "medium", "high", "xhigh", "max"],
26
+ "claude-opus-4-7": ["low", "medium", "high", "xhigh", "max"],
27
+ "claude-opus-4-8": ["low", "medium", "high", "xhigh", "max"],
28
+ "claude-opus-5": ["low", "medium", "high", "xhigh", "max"],
29
+ "claude-sonnet-5": ["low", "medium", "high", "xhigh", "max"],
30
+ "glm-5.2": ["high", "max"],
31
+ // GetUsableModels (2026-07-28) lists kimi-k3 only as effort-suffixed kimi-k3-{low,high,max};
32
+ // the bare id returns not_found. Tiers mirror the native Kimi provider's K3 ladder.
33
+ "kimi-k3": ["low", "high", "max"],
34
+ // Cursor renamed the Grok 4.5 slugs to cursor-grok-4.5-{low,medium,high} and
35
+ // cursor-grok-4.5-{low,medium,high}-fast. The bare Fast id returns not_found.
36
+ "grok-4.5": ["low", "medium", "high"],
37
+ "grok-4.5-fast": ["low", "medium", "high"],
38
+ "gpt-5.1": ["low", "high"],
39
+ "gpt-5.1-codex-max": ["low", "medium", "high", "xhigh"],
40
+ "gpt-5.1-codex-mini": ["low", "high"],
41
+ "gpt-5.2": ["low", "high", "xhigh"],
42
+ "gpt-5.2-codex": ["low", "high", "xhigh"],
43
+ "gpt-5.3-codex": ["low", "high", "xhigh"],
44
+ "gpt-5.4": ["low", "medium", "high", "xhigh"],
45
+ "gpt-5.4-mini": ["low", "medium", "high", "xhigh"],
46
+ "gpt-5.4-nano": ["low", "medium", "high", "xhigh"],
47
+ "gpt-5.5": ["low", "medium", "high"],
48
+ "gpt-5.5-extra": ["high"],
49
+ "gpt-5.6-sol": ["low", "medium", "high", "xhigh", "max"],
50
+ "gpt-5.6-terra": ["low", "medium", "high", "xhigh", "max"],
51
+ "gpt-5.6-luna": ["low", "medium", "high", "xhigh", "max"],
52
+ };
53
+
54
+ /** All effort suffixes accepted when matching live Cursor model ids to configured base ids. */
55
+ export const CANONICAL_EFFORT_SUFFIXES: ReadonlySet<string> = new Set([
56
+ "none",
57
+ ...Object.values(CURSOR_MODEL_EFFORT_TIERS).flat(),
58
+ ]);
59
+
60
+ const CANONICAL_CODEX_EFFORT_ORDER = ["low", "medium", "high", "xhigh", "max"] as const;
61
+
62
+ function normalizeRequestedEffort(reasoning: string | undefined): string | undefined {
63
+ const normalized = reasoning?.toLowerCase();
64
+ return normalized === "ultra" ? "max" : normalized;
65
+ }
66
+
67
+ /** Collapse a Codex reasoning-effort label to a low/medium/high rank for clamping onto a model's tiers. */
68
+ function codexEffortRank(reasoning: string | undefined): "low" | "medium" | "high" {
69
+ switch (normalizeRequestedEffort(reasoning) ?? "") {
70
+ case "none":
71
+ case "minimal":
72
+ case "low":
73
+ return "low";
74
+ case "medium":
75
+ return "medium";
76
+ case "high":
77
+ case "max":
78
+ case "xhigh":
79
+ return "high";
80
+ default:
81
+ // No explicit effort: a bare reasoning-model id is invalid, so pick the model's top tier.
82
+ return "high";
83
+ }
84
+ }
85
+
86
+ /**
87
+ * The Cursor effort suffix to use for `baseModelId` given a Codex reasoning effort, or `undefined` when
88
+ * the model takes no suffix (bare). Literal model tiers pass through; unknown efforts clamp by rank.
89
+ */
90
+ export function cursorEffortSuffix(baseModelId: string, reasoning: string | undefined): string | undefined {
91
+ const tiers = CURSOR_MODEL_EFFORT_TIERS[baseModelId];
92
+ if (!tiers || tiers.length === 0) return undefined;
93
+ const requested = normalizeRequestedEffort(reasoning);
94
+ if (requested && tiers.includes(requested)) return requested;
95
+ switch (codexEffortRank(reasoning)) {
96
+ case "low":
97
+ return tiers[0];
98
+ case "high":
99
+ return tiers[tiers.length - 1];
100
+ case "medium":
101
+ return tiers[Math.floor((tiers.length - 1) / 2)];
102
+ }
103
+ }
104
+
105
+ /** The Codex-facing picker ladder for a Cursor model, sorted in canonical Codex effort order. */
106
+ export function cursorModelEffortLadder(baseModelId: string): string[] | undefined {
107
+ const tiers = CURSOR_MODEL_EFFORT_TIERS[baseModelId];
108
+ if (!tiers || tiers.length === 0) return undefined;
109
+ const tierSet = new Set(tiers);
110
+ return CANONICAL_CODEX_EFFORT_ORDER.filter(effort => tierSet.has(effort));
111
+ }
112
+
113
+ /** Base models known to carry a reasoning-effort suffix (everything else is sent bare). */
114
+ export function cursorModelHasEffortTiers(baseModelId: string): boolean {
115
+ return (CURSOR_MODEL_EFFORT_TIERS[baseModelId]?.length ?? 0) > 0;
116
+ }
117
+
118
+ /**
119
+ * Compose Cursor's flattened model id from a Codex-facing base id and effort tier. Discovery uses
120
+ * this for the ids returned by GetUsableModels. Parameterized Grok Fast requests bypass the flat id
121
+ * and send the base model plus requested_model parameters instead.
122
+ */
123
+ export function cursorWireModelIdWithEffort(baseModelId: string, effortSuffix: string): string {
124
+ if (baseModelId.endsWith("-fast")) {
125
+ return `${baseModelId.slice(0, -"-fast".length)}-${effortSuffix}-fast`;
126
+ }
127
+ return `${baseModelId}-${effortSuffix}`;
128
+ }
129
+
130
+ /**
131
+ * Compose the exact flattened id sent by AgentService/Run. Discovery normalizes Cursor's optional
132
+ * `cursor-` prefix only for catalog matching, but regular Grok 4.5 requests require that prefix on
133
+ * the wire. Keep this separate from {@link cursorWireModelIdWithEffort} so discovery can continue
134
+ * comparing canonical, prefix-free ids. Grok Fast uses requested_model parameters instead.
135
+ */
136
+ export function cursorRequestWireModelIdWithEffort(baseModelId: string, effortSuffix: string): string {
137
+ const flattened = cursorWireModelIdWithEffort(baseModelId, effortSuffix);
138
+ return baseModelId === "grok-4.5" ? `cursor-${flattened}` : flattened;
139
+ }
@@ -0,0 +1,88 @@
1
+ import type { OcxProviderConfig } from "../../types";
2
+ import type { CursorClientMessage } from "./types";
3
+
4
+ export type CursorNativeExecMode = "off" | "codex-sandbox" | "on";
5
+
6
+ /** Codex permissions template marker, e.g. "`sandbox_mode` is `danger-full-access`". */
7
+ export const CURSOR_SANDBOX_FULL_ACCESS_RE = /sandbox_mode[^\n]{0,80}danger-full-access/i;
8
+
9
+ /**
10
+ * Config-owner-selected policy; explicit mode wins, legacy boolean maps to "on".
11
+ * The UNSET default is "off". `nativeLocalExec: "on"` is the only non-legacy setting that
12
+ * authorizes Cursor server-driven local read/write/delete/ls/grep/shell/fetch execution.
13
+ * `nativeLocalExec: "codex-sandbox"` is kept as a recognized legacy/deprecated spelling but is
14
+ * fail-closed: Remodex has no trustworthy per-request attestation that caller-supplied
15
+ * Responses instructions/system/developer prose reflects a real Codex sandbox state.
16
+ */
17
+ export function resolveCursorNativeExecMode(provider: OcxProviderConfig): CursorNativeExecMode {
18
+ const mode = provider.nativeLocalExec;
19
+ if (mode === "off" || mode === "codex-sandbox" || mode === "on") return mode;
20
+ return provider.unsafeAllowNativeLocalExec === true ? "on" : "off";
21
+ }
22
+
23
+ /**
24
+ * True when the request itself declares the Codex full-access sandbox. Carriers are the
25
+ * system/instructions entries and developer-role messages ONLY. This is diagnostic/context
26
+ * metadata; request text is caller-controlled and never authorizes native local exec.
27
+ */
28
+ export function cursorRequestDeclaresFullAccess(
29
+ request: { system: string[]; messages: Array<{ role: string; content: string }> },
30
+ ): boolean {
31
+ for (const entry of request.system) {
32
+ if (CURSOR_SANDBOX_FULL_ACCESS_RE.test(entry)) return true;
33
+ }
34
+ for (const message of request.messages) {
35
+ if (message.role === "developer" && CURSOR_SANDBOX_FULL_ACCESS_RE.test(message.content)) return true;
36
+ }
37
+ return false;
38
+ }
39
+
40
+ /** Effective per-request allowance: only server-local config opt-in enables native exec. */
41
+ export function effectiveCursorNativeExecAllow(provider: OcxProviderConfig, requestDeclaresFullAccess: boolean): boolean {
42
+ const mode = resolveCursorNativeExecMode(provider);
43
+ void requestDeclaresFullAccess;
44
+ return mode === "on";
45
+ }
46
+
47
+ export const CURSOR_EXEC_CASES_DENIED = [
48
+ "readArgs",
49
+ "lsArgs",
50
+ "grepArgs",
51
+ "writeArgs",
52
+ "deleteArgs",
53
+ "shellArgs",
54
+ "shellStreamArgs",
55
+ "diagnosticsArgs",
56
+ "mcpArgs",
57
+ "fetchArgs",
58
+ "recordScreenArgs",
59
+ "computerUseArgs",
60
+ "unknownExecCase",
61
+ ] as const;
62
+
63
+ export type CursorDeniedExecCase = (typeof CURSOR_EXEC_CASES_DENIED)[number];
64
+
65
+ export function cursorExecDeniedMessage(execCase: string): string {
66
+ return [
67
+ `Cursor legacy mock transport cannot execute ${execCase}.`,
68
+ "Production Cursor requests use the live protobuf native exec bridge.",
69
+ "The legacy mock path returns a non-executing placeholder for tests only.",
70
+ ].join(" ");
71
+ }
72
+
73
+ export function cursorExecResult(requestId: string, execCase: string): CursorClientMessage {
74
+ if (execCase === "requestContextArgs") {
75
+ return {
76
+ type: "exec_result",
77
+ requestId,
78
+ ok: true,
79
+ message: "Cursor request context is empty in legacy mock transport mode.",
80
+ };
81
+ }
82
+ return {
83
+ type: "exec_result",
84
+ requestId,
85
+ ok: false,
86
+ message: cursorExecDeniedMessage(execCase),
87
+ };
88
+ }
@@ -0,0 +1,250 @@
1
+ export const CONNECT_FRAME_HEADER_BYTES = 5;
2
+ export const CONNECT_FLAG_COMPRESSED = 0x01;
3
+ export const CONNECT_FLAG_END_STREAM = 0x02;
4
+ export const MAX_CONNECT_FRAME_PAYLOAD_BYTES = 0xffffffff;
5
+
6
+ export type ConnectFrameErrorCode =
7
+ | "invalid_offset"
8
+ | "invalid_flags"
9
+ | "payload_too_large"
10
+ | "frame_incomplete";
11
+
12
+ export interface ConnectFrame {
13
+ flags: number;
14
+ payload: Uint8Array;
15
+ compressed: boolean;
16
+ endStream: boolean;
17
+ }
18
+
19
+ export interface DecodedConnectFrame {
20
+ frame: ConnectFrame;
21
+ readBytes: number;
22
+ }
23
+
24
+ export interface DecodedConnectFrames {
25
+ frames: ConnectFrame[];
26
+ remainder: Uint8Array;
27
+ }
28
+
29
+ interface CopyReservation {
30
+ commitRetained(): void;
31
+ release(): void;
32
+ }
33
+
34
+ interface InspectedConnectFrame {
35
+ flags: number;
36
+ length: number;
37
+ payloadStart: number;
38
+ readBytes: number;
39
+ }
40
+
41
+ export class ConnectFrameError extends Error {
42
+ constructor(
43
+ public readonly code: ConnectFrameErrorCode,
44
+ message: string,
45
+ ) {
46
+ super(message);
47
+ this.name = "ConnectFrameError";
48
+ }
49
+ }
50
+
51
+ export function isConnectFrameCompressed(flags: number): boolean {
52
+ return (flags & CONNECT_FLAG_COMPRESSED) === CONNECT_FLAG_COMPRESSED;
53
+ }
54
+
55
+ export function isConnectFrameEndStream(flags: number): boolean {
56
+ return (flags & CONNECT_FLAG_END_STREAM) === CONNECT_FLAG_END_STREAM;
57
+ }
58
+
59
+ export function encodeConnectFrame(
60
+ payload: Uint8Array,
61
+ options: { flags?: number; compressed?: boolean; endStream?: boolean } = {},
62
+ ): Uint8Array {
63
+ if (payload.length > MAX_CONNECT_FRAME_PAYLOAD_BYTES) {
64
+ throw new ConnectFrameError("payload_too_large", `Connect frame payload too large: ${payload.length}`);
65
+ }
66
+
67
+ let flags = options.flags ?? 0;
68
+ assertByte(flags, "invalid_flags", `Connect frame flags must be a byte: ${flags}`);
69
+ if (options.compressed) flags |= CONNECT_FLAG_COMPRESSED;
70
+ if (options.endStream) flags |= CONNECT_FLAG_END_STREAM;
71
+
72
+ const frame = new Uint8Array(CONNECT_FRAME_HEADER_BYTES + payload.length);
73
+ frame[0] = flags;
74
+ new DataView(frame.buffer, frame.byteOffset, frame.byteLength)
75
+ .setUint32(1, payload.length, false);
76
+ frame.set(payload, CONNECT_FRAME_HEADER_BYTES);
77
+ return frame;
78
+ }
79
+
80
+ export function tryDecodeConnectFrame(
81
+ input: Uint8Array,
82
+ offset = 0,
83
+ maxPayloadBytes = MAX_CONNECT_FRAME_PAYLOAD_BYTES,
84
+ reservePayloadCopy?: (bytes: number) => CopyReservation | undefined,
85
+ ): DecodedConnectFrame | null {
86
+ assertOffset(input, offset);
87
+ const inspected = inspectConnectFrame(input, offset, maxPayloadBytes);
88
+ if (!inspected) return null;
89
+ const payloadEnd = inspected.payloadStart + inspected.length;
90
+ const reservation = reservePayloadCopy?.(inspected.length);
91
+ let payload: Uint8Array;
92
+ try {
93
+ payload = input.slice(inspected.payloadStart, payloadEnd);
94
+ reservation?.commitRetained();
95
+ } catch (error) {
96
+ reservation?.release();
97
+ throw error;
98
+ }
99
+ return {
100
+ frame: {
101
+ flags: inspected.flags,
102
+ payload,
103
+ compressed: isConnectFrameCompressed(inspected.flags),
104
+ endStream: isConnectFrameEndStream(inspected.flags),
105
+ },
106
+ readBytes: inspected.readBytes,
107
+ };
108
+ }
109
+
110
+ export function decodeConnectFrame(input: Uint8Array, offset = 0): DecodedConnectFrame {
111
+ const decoded = tryDecodeConnectFrame(input, offset);
112
+ if (!decoded) {
113
+ throw new ConnectFrameError("frame_incomplete", "Incomplete Connect frame");
114
+ }
115
+ return decoded;
116
+ }
117
+
118
+ export function decodeConnectFrames(input: Uint8Array): ConnectFrame[] {
119
+ const frames: ConnectFrame[] = [];
120
+ let offset = 0;
121
+ while (offset < input.length) {
122
+ const decoded = decodeConnectFrame(input, offset);
123
+ frames.push(decoded.frame);
124
+ offset += decoded.readBytes;
125
+ }
126
+ return frames;
127
+ }
128
+
129
+ export function decodeAvailableConnectFrames(
130
+ input: Uint8Array,
131
+ maxPayloadBytes = MAX_CONNECT_FRAME_PAYLOAD_BYTES,
132
+ availableFrameSlots = Number.POSITIVE_INFINITY,
133
+ reservePayloadCopy?: (bytes: number) => CopyReservation | undefined,
134
+ ): DecodedConnectFrames {
135
+ const planned: Array<InspectedConnectFrame & { reservation?: CopyReservation }> = [];
136
+ let offset = 0;
137
+ let remainderReservation: CopyReservation | undefined;
138
+ try {
139
+ while (offset < input.length && planned.length < availableFrameSlots) {
140
+ const inspected = inspectConnectFrame(input, offset, maxPayloadBytes);
141
+ if (!inspected) break;
142
+ const reservation = reservePayloadCopy?.(inspected.length);
143
+ planned.push({ ...inspected, reservation });
144
+ offset += inspected.readBytes;
145
+ }
146
+ const remainderBytes = offset === input.length ? 0 : bufferedPayloadBytes(input, offset);
147
+ remainderReservation = reservePayloadCopy?.(remainderBytes);
148
+
149
+ // Keep every reservation transient until every batch allocation succeeds. A later admission
150
+ // failure can then roll the entire batch back without needing ownership of unreturned frames.
151
+ const frames = planned.map(({ flags, length, payloadStart }) => {
152
+ const payload = input.slice(payloadStart, payloadStart + length);
153
+ return {
154
+ flags,
155
+ payload,
156
+ compressed: isConnectFrameCompressed(flags),
157
+ endStream: isConnectFrameEndStream(flags),
158
+ };
159
+ });
160
+ const remainder = offset === input.length ? new Uint8Array() : input.slice(offset);
161
+ for (const entry of planned) entry.reservation?.commitRetained();
162
+ remainderReservation?.commitRetained();
163
+ return { frames, remainder };
164
+ } catch (error) {
165
+ for (const entry of planned) entry.reservation?.release();
166
+ remainderReservation?.release();
167
+ throw error;
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Cursor-based sibling of decodeAvailableConnectFrames for callers that keep
173
+ * their own raw backlog: consumes complete frames from the FRONT of `input`
174
+ * and reports how many bytes were consumed (headers included) instead of
175
+ * materializing a remainder copy, and hands payload VIEWS (not copies) back so
176
+ * the caller can transfer the already-charged bytes to the frame lifecycle
177
+ * instead of reserving a second copy. The caller advances its own cursor by
178
+ * `consumedBytes` and never pays an O(backlog) copy per drain.
179
+ */
180
+ export function consumeConnectFrames(
181
+ input: Uint8Array,
182
+ maxPayloadBytes = MAX_CONNECT_FRAME_PAYLOAD_BYTES,
183
+ availableFrameSlots = Number.POSITIVE_INFINITY,
184
+ ): { frames: ConnectFrame[]; consumedBytes: number } {
185
+ const planned: InspectedConnectFrame[] = [];
186
+ let offset = 0;
187
+ while (offset < input.length && planned.length < availableFrameSlots) {
188
+ const inspected = inspectConnectFrame(input, offset, maxPayloadBytes);
189
+ if (!inspected) break;
190
+ planned.push(inspected);
191
+ offset += inspected.readBytes;
192
+ }
193
+ // Zero-copy handoff for large payloads: VIEWS into the caller's backlog
194
+ // buffer (safe: append-only at its end, compaction/growth replace the
195
+ // buffer, a consumed region is never mutated in place). Small payloads are
196
+ // COPIED instead — a small view would pin the whole backlog buffer (up to
197
+ // 32 MiB) alive while the frame waits in the work queue.
198
+ const COPY_PIN_THRESHOLD_BYTES = 64 * 1024;
199
+ const frames = planned.map(({ flags, length, payloadStart }) => ({
200
+ flags,
201
+ payload: length <= COPY_PIN_THRESHOLD_BYTES
202
+ ? input.slice(payloadStart, payloadStart + length)
203
+ : input.subarray(payloadStart, payloadStart + length),
204
+ compressed: isConnectFrameCompressed(flags),
205
+ endStream: isConnectFrameEndStream(flags),
206
+ }));
207
+ return { frames, consumedBytes: offset };
208
+ }
209
+
210
+ function inspectConnectFrame(
211
+ input: Uint8Array,
212
+ offset: number,
213
+ maxPayloadBytes: number,
214
+ ): InspectedConnectFrame | null {
215
+ if (input.length - offset < CONNECT_FRAME_HEADER_BYTES) return null;
216
+ const view = new DataView(input.buffer, input.byteOffset + offset, input.byteLength - offset);
217
+ const flags = view.getUint8(0);
218
+ const length = view.getUint32(1, false);
219
+ if (length > maxPayloadBytes) {
220
+ throw new ConnectFrameError("payload_too_large", `Connect frame payload too large: ${length}`);
221
+ }
222
+ const readBytes = CONNECT_FRAME_HEADER_BYTES + length;
223
+ if (input.length - offset < readBytes) return null;
224
+ return { flags, length, payloadStart: offset + CONNECT_FRAME_HEADER_BYTES, readBytes };
225
+ }
226
+
227
+ function bufferedPayloadBytes(input: Uint8Array, start: number): number {
228
+ let offset = start;
229
+ let payloadBytes = 0;
230
+ while (input.byteLength - offset >= CONNECT_FRAME_HEADER_BYTES) {
231
+ const length = new DataView(input.buffer, input.byteOffset + offset, input.byteLength - offset).getUint32(1, false);
232
+ const available = Math.min(length, input.byteLength - offset - CONNECT_FRAME_HEADER_BYTES);
233
+ payloadBytes += available;
234
+ if (available < length) break;
235
+ offset += CONNECT_FRAME_HEADER_BYTES + length;
236
+ }
237
+ return payloadBytes;
238
+ }
239
+
240
+ function assertOffset(input: Uint8Array, offset: number): void {
241
+ if (!Number.isInteger(offset) || offset < 0 || offset > input.length) {
242
+ throw new ConnectFrameError("invalid_offset", `Invalid Connect frame offset: ${offset}`);
243
+ }
244
+ }
245
+
246
+ function assertByte(value: number, code: ConnectFrameErrorCode, message: string): void {
247
+ if (!Number.isInteger(value) || value < 0 || value > 0xff) {
248
+ throw new ConnectFrameError(code, message);
249
+ }
250
+ }