@jingyi0605/codingns 0.8.0 → 0.8.1

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 (425) hide show
  1. package/dist/public/assets/{AdaptiveButlerPage-BsgVNRAa.js → AdaptiveButlerPage-b7s6F_sd.js} +1 -1
  2. package/dist/public/assets/{App-tPcbyRdS.js → App-B0q8uDA-.js} +3 -3
  3. package/dist/public/assets/{BootstrapPage--MDOigQi.js → BootstrapPage-jFfl7KNK.js} +1 -1
  4. package/dist/public/assets/{ConversationPage-BBss5ED8.js → ConversationPage-sj_rn4q0.js} +1 -1
  5. package/dist/public/assets/{DesktopDetachPreviewPage-CB8DoqwU.js → DesktopDetachPreviewPage-C5c88SOX.js} +1 -1
  6. package/dist/public/assets/{DesktopWindowPage-GtIx5m8K.js → DesktopWindowPage-BdKUZrKG.js} +1 -1
  7. package/dist/public/assets/{FileContextPanel-BcM7AIT4.js → FileContextPanel-lM5mBcfn.js} +1 -1
  8. package/dist/public/assets/{GitSidebar-CMtkaxuI.js → GitSidebar-CmXAhyjo.js} +1 -1
  9. package/dist/public/assets/{MobileCreateSessionSheet-CrFY41_8.js → MobileCreateSessionSheet-CceV0-AH.js} +1 -1
  10. package/dist/public/assets/{MobileTopHeaderFrame-DGVOzXyg.js → MobileTopHeaderFrame-_I0t7cC_.js} +1 -1
  11. package/dist/public/assets/{MobileWorkspaceSwitcherHeader-DLkACTnQ.js → MobileWorkspaceSwitcherHeader-DhaM9fgx.js} +1 -1
  12. package/dist/public/assets/{RelayConnectEntryPage-0MPPjxtQ.js → RelayConnectEntryPage-CMtDWyGS.js} +1 -1
  13. package/dist/public/assets/{ServerSettingsModal-vgOhwus4.js → ServerSettingsModal-Rkgn3jft.js} +1 -1
  14. package/dist/public/assets/{SessionIndexPage-KK626Ra9.js → SessionIndexPage-BOumP3ij.js} +1 -1
  15. package/dist/public/assets/{SettingsPage-B3edBJIo.js → SettingsPage-vx_c-00-.js} +1 -1
  16. package/dist/public/assets/{TerminalManagerPanel-BxlhZp8c.js → TerminalManagerPanel-D9JHCS6d.js} +1 -1
  17. package/dist/public/assets/{TerminalPage-B6Rdhylx.js → TerminalPage-CBIKHI33.js} +1 -1
  18. package/dist/public/assets/{TerminalRuntimeFallbackModal-BVLfrpSa.js → TerminalRuntimeFallbackModal-W5NjqFEz.js} +1 -1
  19. package/dist/public/assets/{ToolFilesPage-N_gwwUjD.js → ToolFilesPage-DWtpaN_7.js} +1 -1
  20. package/dist/public/assets/{ToolGitPage-DOcuuWM1.js → ToolGitPage-MpGXsw4_.js} +1 -1
  21. package/dist/public/assets/{ToolProcessesPage-D-FfJ7Re.js → ToolProcessesPage-B1jHQKhZ.js} +1 -1
  22. package/dist/public/assets/{ToolsHomePage-CHfPxd20.js → ToolsHomePage-CJrn8ZFl.js} +1 -1
  23. package/dist/public/assets/{WorkbenchLandingPage-CTTnfovY.js → WorkbenchLandingPage-CJQ1V5U-.js} +1 -1
  24. package/dist/public/assets/{WorkbenchLayout-CbpJg0g1.js → WorkbenchLayout-D48i71PU.js} +3 -3
  25. package/dist/public/assets/{WorkbenchModal-Bt_1fYmM.js → WorkbenchModal-BYNuMIoV.js} +1 -1
  26. package/dist/public/assets/WorkbenchShellRoute-CGKjy4J-.js +1 -0
  27. package/dist/public/assets/{WorkspaceDebugDetailPage-s7yuDIxR.js → WorkspaceDebugDetailPage-DCAYgays.js} +1 -1
  28. package/dist/public/assets/{WorkspaceDetailPage-Cf-gVpqK.js → WorkspaceDetailPage-D5v-nUIi.js} +1 -1
  29. package/dist/public/assets/{WorkspaceHomePage-COf6I8sT.js → WorkspaceHomePage-I5G1p5SR.js} +1 -1
  30. package/dist/public/assets/{client-runtime-manager-DGdKvYzx.js → client-runtime-manager-CdJP7nUp.js} +1 -1
  31. package/dist/public/assets/{file-tree-icon-BeHqeru9.js → file-tree-icon-BFwaPxKs.js} +6 -6
  32. package/dist/public/assets/{index-CuzMc7q2.js → index-CjewzOUG.js} +3 -3
  33. package/dist/public/assets/{index-CcaQt50x.css → index-VVxfF0s5.css} +1 -1
  34. package/dist/public/assets/{login-direct-candidate-resolver-DEP_xCmR.js → login-direct-candidate-resolver-C-mo698r.js} +1 -1
  35. package/dist/public/assets/{model-switch-api-c6kcbBGm.js → model-switch-api-Br0ivfe5.js} +1 -1
  36. package/dist/public/assets/{preferences-service-CV6Ih0BG.js → preferences-service-CnaTvZq2.js} +1 -1
  37. package/dist/public/assets/{realtime-client-CRCx5xBt.js → realtime-client-BlQRqVmm.js} +1 -1
  38. package/dist/public/assets/{relay-entry-C751A-Sm.js → relay-entry-D7OgZZN-.js} +1 -1
  39. package/dist/public/assets/{terminal-runtime-meta-CRAVR-8G.js → terminal-runtime-meta-BCtAYB0E.js} +1 -1
  40. package/dist/public/assets/{useRegisteredDebugTemplates-D6YtNS0r.js → useRegisteredDebugTemplates-CXmxu69X.js} +1 -1
  41. package/dist/public/index.html +2 -2
  42. package/dist/server/main.js +2 -0
  43. package/dist/server/main.js.map +1 -1
  44. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +1 -0
  45. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +1 -0
  46. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  47. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +1 -0
  48. package/dist/server/modules/assistant-capability/assistant-capability-service.js +1 -0
  49. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  50. package/dist/server/modules/browser-runtime/browser-runtime-controller.d.ts +2 -1
  51. package/dist/server/modules/browser-runtime/browser-runtime-controller.js +1 -0
  52. package/dist/server/modules/browser-runtime/browser-runtime-controller.js.map +1 -1
  53. package/dist/server/modules/browser-runtime/browser-runtime-service.d.ts +4 -1
  54. package/dist/server/modules/browser-runtime/browser-runtime-service.js +40 -0
  55. package/dist/server/modules/browser-runtime/browser-runtime-service.js.map +1 -1
  56. package/dist/server/modules/browser-runtime/browser-task-payload.d.ts +2 -0
  57. package/dist/server/modules/browser-runtime/browser-task-payload.js.map +1 -1
  58. package/dist/server/modules/git/git-command-helper-process.js +0 -18
  59. package/dist/server/modules/git/git-command-helper-process.js.map +1 -1
  60. package/dist/server/modules/git/git-command-runner.js +0 -18
  61. package/dist/server/modules/git/git-command-runner.js.map +1 -1
  62. package/dist/server/modules/sessions/session-live-runtime-service.js +46 -3
  63. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  64. package/dist/server/modules/sessions/workspace-session-runtime-context-service.d.ts +1 -0
  65. package/dist/server/modules/sessions/workspace-session-runtime-context-service.js +11 -2
  66. package/dist/server/modules/sessions/workspace-session-runtime-context-service.js.map +1 -1
  67. package/dist/server/modules/skills/builtin-skills/codingns-workspace-session/SKILL.md +2 -2
  68. package/dist/server/shared/http/error-handler.js +53 -19
  69. package/dist/server/shared/http/error-handler.js.map +1 -1
  70. package/dist/server/shared/utils/install-console-timestamp-prefix.d.ts +1 -0
  71. package/dist/server/shared/utils/install-console-timestamp-prefix.js +28 -0
  72. package/dist/server/shared/utils/install-console-timestamp-prefix.js.map +1 -0
  73. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.d.ts +42 -0
  74. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js +346 -0
  75. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js.map +1 -0
  76. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.d.ts +1 -0
  77. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js +80 -0
  78. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js.map +1 -0
  79. package/node_modules/@codingns/session-sync-core/dist/index.d.ts +18 -0
  80. package/node_modules/@codingns/session-sync-core/dist/index.js +19 -0
  81. package/node_modules/@codingns/session-sync-core/dist/index.js.map +1 -0
  82. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.d.ts +18 -0
  83. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.js +659 -0
  84. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.js.map +1 -0
  85. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.d.ts +11 -0
  86. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.js +72 -0
  87. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.js.map +1 -0
  88. package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +67 -0
  89. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +752 -0
  90. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -0
  91. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +48 -0
  92. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +1184 -0
  93. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -0
  94. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.d.ts +11 -0
  95. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js +105 -0
  96. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js.map +1 -0
  97. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +84 -0
  98. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +2436 -0
  99. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -0
  100. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.d.ts +47 -0
  101. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +1480 -0
  102. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -0
  103. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.d.ts +33 -0
  104. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js +684 -0
  105. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js.map +1 -0
  106. package/node_modules/@codingns/session-sync-core/dist/providers/legna-code.d.ts +9 -0
  107. package/node_modules/@codingns/session-sync-core/dist/providers/legna-code.js +17 -0
  108. package/node_modules/@codingns/session-sync-core/dist/providers/legna-code.js.map +1 -0
  109. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.d.ts +1 -0
  110. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.js +8 -0
  111. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.js.map +1 -0
  112. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.d.ts +48 -0
  113. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js +373 -0
  114. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js.map +1 -0
  115. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +61 -0
  116. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +1191 -0
  117. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -0
  118. package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +27 -0
  119. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +415 -0
  120. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -0
  121. package/node_modules/@codingns/session-sync-core/dist/registry.d.ts +7 -0
  122. package/node_modules/@codingns/session-sync-core/dist/registry.js +22 -0
  123. package/node_modules/@codingns/session-sync-core/dist/registry.js.map +1 -0
  124. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.d.ts +24 -0
  125. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +329 -0
  126. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -0
  127. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.d.ts +30 -0
  128. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +939 -0
  129. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -0
  130. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.d.ts +1 -0
  131. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js +16 -0
  132. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js.map +1 -0
  133. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +70 -0
  134. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +2571 -0
  135. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -0
  136. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.d.ts +21 -0
  137. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js +561 -0
  138. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js.map +1 -0
  139. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.d.ts +38 -0
  140. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.js +911 -0
  141. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.js.map +1 -0
  142. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.d.ts +15 -0
  143. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.js +16 -0
  144. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.js.map +1 -0
  145. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.d.ts +38 -0
  146. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js +970 -0
  147. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js.map +1 -0
  148. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.d.ts +21 -0
  149. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +168 -0
  150. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -0
  151. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +152 -0
  152. package/node_modules/@codingns/session-sync-core/dist/runtime/types.js +2 -0
  153. package/node_modules/@codingns/session-sync-core/dist/runtime/types.js.map +1 -0
  154. package/node_modules/@codingns/session-sync-core/dist/services.d.ts +28 -0
  155. package/node_modules/@codingns/session-sync-core/dist/services.js +148 -0
  156. package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -0
  157. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.d.ts +6 -0
  158. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js +9 -0
  159. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js.map +1 -0
  160. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +198 -0
  161. package/node_modules/@codingns/session-sync-core/dist/types.js +2 -0
  162. package/node_modules/@codingns/session-sync-core/dist/types.js.map +1 -0
  163. package/node_modules/@codingns/session-sync-core/package.json +33 -0
  164. package/package.json +6 -4
  165. package/vendor/node-pty-fork/LICENSE +69 -0
  166. package/vendor/node-pty-fork/README.md +91 -0
  167. package/vendor/node-pty-fork/binding.gyp +117 -0
  168. package/vendor/node-pty-fork/deps/.editorconfig +2 -0
  169. package/vendor/node-pty-fork/deps/winpty/.drone.yml +17 -0
  170. package/vendor/node-pty-fork/deps/winpty/.gitattributes +19 -0
  171. package/vendor/node-pty-fork/deps/winpty/LICENSE +21 -0
  172. package/vendor/node-pty-fork/deps/winpty/Makefile +166 -0
  173. package/vendor/node-pty-fork/deps/winpty/README.md +151 -0
  174. package/vendor/node-pty-fork/deps/winpty/RELEASES.md +280 -0
  175. package/vendor/node-pty-fork/deps/winpty/VERSION.txt +1 -0
  176. package/vendor/node-pty-fork/deps/winpty/configure +167 -0
  177. package/vendor/node-pty-fork/deps/winpty/misc/BufferResizeTests.cc +90 -0
  178. package/vendor/node-pty-fork/deps/winpty/misc/ChangeScreenBuffer.cc +53 -0
  179. package/vendor/node-pty-fork/deps/winpty/misc/ClearConsole.cc +72 -0
  180. package/vendor/node-pty-fork/deps/winpty/misc/ConinMode.cc +117 -0
  181. package/vendor/node-pty-fork/deps/winpty/misc/ConinMode.ps1 +116 -0
  182. package/vendor/node-pty-fork/deps/winpty/misc/ConoutMode.cc +113 -0
  183. package/vendor/node-pty-fork/deps/winpty/misc/DebugClient.py +42 -0
  184. package/vendor/node-pty-fork/deps/winpty/misc/DebugServer.py +63 -0
  185. package/vendor/node-pty-fork/deps/winpty/misc/DumpLines.py +5 -0
  186. package/vendor/node-pty-fork/deps/winpty/misc/EnableExtendedFlags.txt +46 -0
  187. package/vendor/node-pty-fork/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +528 -0
  188. package/vendor/node-pty-fork/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +633 -0
  189. package/vendor/node-pty-fork/deps/winpty/misc/Font-Report-June2016/CP932.txt +630 -0
  190. package/vendor/node-pty-fork/deps/winpty/misc/Font-Report-June2016/CP936.txt +630 -0
  191. package/vendor/node-pty-fork/deps/winpty/misc/Font-Report-June2016/CP949.txt +630 -0
  192. package/vendor/node-pty-fork/deps/winpty/misc/Font-Report-June2016/CP950.txt +630 -0
  193. package/vendor/node-pty-fork/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +16 -0
  194. package/vendor/node-pty-fork/deps/winpty/misc/Font-Report-June2016/Results.txt +4 -0
  195. package/vendor/node-pty-fork/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +144 -0
  196. package/vendor/node-pty-fork/deps/winpty/misc/FontSurvey.cc +100 -0
  197. package/vendor/node-pty-fork/deps/winpty/misc/FormatChar.h +21 -0
  198. package/vendor/node-pty-fork/deps/winpty/misc/FreezePerfTest.cc +62 -0
  199. package/vendor/node-pty-fork/deps/winpty/misc/GetCh.cc +20 -0
  200. package/vendor/node-pty-fork/deps/winpty/misc/GetConsolePos.cc +41 -0
  201. package/vendor/node-pty-fork/deps/winpty/misc/GetFont.cc +261 -0
  202. package/vendor/node-pty-fork/deps/winpty/misc/IdentifyConsoleWindow.ps1 +51 -0
  203. package/vendor/node-pty-fork/deps/winpty/misc/IsNewConsole.cc +87 -0
  204. package/vendor/node-pty-fork/deps/winpty/misc/MouseInputNotes.txt +90 -0
  205. package/vendor/node-pty-fork/deps/winpty/misc/MoveConsoleWindow.cc +34 -0
  206. package/vendor/node-pty-fork/deps/winpty/misc/Notes.txt +219 -0
  207. package/vendor/node-pty-fork/deps/winpty/misc/OSVersion.cc +27 -0
  208. package/vendor/node-pty-fork/deps/winpty/misc/ScreenBufferFreezeInactive.cc +101 -0
  209. package/vendor/node-pty-fork/deps/winpty/misc/ScreenBufferTest.cc +671 -0
  210. package/vendor/node-pty-fork/deps/winpty/misc/ScreenBufferTest2.cc +151 -0
  211. package/vendor/node-pty-fork/deps/winpty/misc/SelectAllTest.cc +45 -0
  212. package/vendor/node-pty-fork/deps/winpty/misc/SetBufferSize.cc +32 -0
  213. package/vendor/node-pty-fork/deps/winpty/misc/SetCursorPos.cc +10 -0
  214. package/vendor/node-pty-fork/deps/winpty/misc/SetFont.cc +145 -0
  215. package/vendor/node-pty-fork/deps/winpty/misc/SetWindowRect.cc +36 -0
  216. package/vendor/node-pty-fork/deps/winpty/misc/ShowArgv.cc +12 -0
  217. package/vendor/node-pty-fork/deps/winpty/misc/ShowConsoleInput.cc +40 -0
  218. package/vendor/node-pty-fork/deps/winpty/misc/Spew.py +5 -0
  219. package/vendor/node-pty-fork/deps/winpty/misc/TestUtil.cc +172 -0
  220. package/vendor/node-pty-fork/deps/winpty/misc/UnicodeDoubleWidthTest.cc +102 -0
  221. package/vendor/node-pty-fork/deps/winpty/misc/UnicodeWideTest1.cc +246 -0
  222. package/vendor/node-pty-fork/deps/winpty/misc/UnicodeWideTest2.cc +130 -0
  223. package/vendor/node-pty-fork/deps/winpty/misc/UnixEcho.cc +89 -0
  224. package/vendor/node-pty-fork/deps/winpty/misc/Utf16Echo.cc +46 -0
  225. package/vendor/node-pty-fork/deps/winpty/misc/VeryLargeRead.cc +122 -0
  226. package/vendor/node-pty-fork/deps/winpty/misc/VkEscapeTest.cc +56 -0
  227. package/vendor/node-pty-fork/deps/winpty/misc/Win10ResizeWhileFrozen.cc +52 -0
  228. package/vendor/node-pty-fork/deps/winpty/misc/Win10WrapTest1.cc +57 -0
  229. package/vendor/node-pty-fork/deps/winpty/misc/Win10WrapTest2.cc +30 -0
  230. package/vendor/node-pty-fork/deps/winpty/misc/Win32Echo1.cc +26 -0
  231. package/vendor/node-pty-fork/deps/winpty/misc/Win32Echo2.cc +19 -0
  232. package/vendor/node-pty-fork/deps/winpty/misc/Win32Test1.cc +46 -0
  233. package/vendor/node-pty-fork/deps/winpty/misc/Win32Test2.cc +70 -0
  234. package/vendor/node-pty-fork/deps/winpty/misc/Win32Test3.cc +78 -0
  235. package/vendor/node-pty-fork/deps/winpty/misc/Win32Write1.cc +44 -0
  236. package/vendor/node-pty-fork/deps/winpty/misc/WindowsBugCrashReader.cc +27 -0
  237. package/vendor/node-pty-fork/deps/winpty/misc/WriteConsole.cc +106 -0
  238. package/vendor/node-pty-fork/deps/winpty/misc/build32.sh +9 -0
  239. package/vendor/node-pty-fork/deps/winpty/misc/build64.sh +9 -0
  240. package/vendor/node-pty-fork/deps/winpty/misc/color-test.sh +212 -0
  241. package/vendor/node-pty-fork/deps/winpty/misc/font-notes.txt +300 -0
  242. package/vendor/node-pty-fork/deps/winpty/misc/winbug-15048.cc +201 -0
  243. package/vendor/node-pty-fork/deps/winpty/ship/build-pty4j-libpty.bat +36 -0
  244. package/vendor/node-pty-fork/deps/winpty/ship/common_ship.py +53 -0
  245. package/vendor/node-pty-fork/deps/winpty/ship/make_msvc_package.py +165 -0
  246. package/vendor/node-pty-fork/deps/winpty/ship/ship.py +108 -0
  247. package/vendor/node-pty-fork/deps/winpty/src/agent/Agent.cc +605 -0
  248. package/vendor/node-pty-fork/deps/winpty/src/agent/Agent.h +103 -0
  249. package/vendor/node-pty-fork/deps/winpty/src/agent/AgentCreateDesktop.cc +84 -0
  250. package/vendor/node-pty-fork/deps/winpty/src/agent/AgentCreateDesktop.h +28 -0
  251. package/vendor/node-pty-fork/deps/winpty/src/agent/ConsoleFont.cc +632 -0
  252. package/vendor/node-pty-fork/deps/winpty/src/agent/ConsoleFont.h +28 -0
  253. package/vendor/node-pty-fork/deps/winpty/src/agent/ConsoleInput.cc +852 -0
  254. package/vendor/node-pty-fork/deps/winpty/src/agent/ConsoleInput.h +109 -0
  255. package/vendor/node-pty-fork/deps/winpty/src/agent/ConsoleInputReencoding.cc +121 -0
  256. package/vendor/node-pty-fork/deps/winpty/src/agent/ConsoleInputReencoding.h +36 -0
  257. package/vendor/node-pty-fork/deps/winpty/src/agent/ConsoleLine.cc +152 -0
  258. package/vendor/node-pty-fork/deps/winpty/src/agent/ConsoleLine.h +41 -0
  259. package/vendor/node-pty-fork/deps/winpty/src/agent/Coord.h +87 -0
  260. package/vendor/node-pty-fork/deps/winpty/src/agent/DebugShowInput.cc +239 -0
  261. package/vendor/node-pty-fork/deps/winpty/src/agent/DebugShowInput.h +32 -0
  262. package/vendor/node-pty-fork/deps/winpty/src/agent/DefaultInputMap.cc +422 -0
  263. package/vendor/node-pty-fork/deps/winpty/src/agent/DefaultInputMap.h +28 -0
  264. package/vendor/node-pty-fork/deps/winpty/src/agent/DsrSender.h +30 -0
  265. package/vendor/node-pty-fork/deps/winpty/src/agent/EventLoop.cc +99 -0
  266. package/vendor/node-pty-fork/deps/winpty/src/agent/EventLoop.h +47 -0
  267. package/vendor/node-pty-fork/deps/winpty/src/agent/InputMap.cc +246 -0
  268. package/vendor/node-pty-fork/deps/winpty/src/agent/InputMap.h +114 -0
  269. package/vendor/node-pty-fork/deps/winpty/src/agent/LargeConsoleRead.cc +71 -0
  270. package/vendor/node-pty-fork/deps/winpty/src/agent/LargeConsoleRead.h +68 -0
  271. package/vendor/node-pty-fork/deps/winpty/src/agent/NamedPipe.cc +378 -0
  272. package/vendor/node-pty-fork/deps/winpty/src/agent/NamedPipe.h +125 -0
  273. package/vendor/node-pty-fork/deps/winpty/src/agent/Scraper.cc +699 -0
  274. package/vendor/node-pty-fork/deps/winpty/src/agent/Scraper.h +103 -0
  275. package/vendor/node-pty-fork/deps/winpty/src/agent/SimplePool.h +75 -0
  276. package/vendor/node-pty-fork/deps/winpty/src/agent/SmallRect.h +143 -0
  277. package/vendor/node-pty-fork/deps/winpty/src/agent/Terminal.cc +535 -0
  278. package/vendor/node-pty-fork/deps/winpty/src/agent/Terminal.h +69 -0
  279. package/vendor/node-pty-fork/deps/winpty/src/agent/UnicodeEncoding.h +157 -0
  280. package/vendor/node-pty-fork/deps/winpty/src/agent/UnicodeEncodingTest.cc +189 -0
  281. package/vendor/node-pty-fork/deps/winpty/src/agent/Win32Console.cc +107 -0
  282. package/vendor/node-pty-fork/deps/winpty/src/agent/Win32Console.h +67 -0
  283. package/vendor/node-pty-fork/deps/winpty/src/agent/Win32ConsoleBuffer.cc +193 -0
  284. package/vendor/node-pty-fork/deps/winpty/src/agent/Win32ConsoleBuffer.h +99 -0
  285. package/vendor/node-pty-fork/deps/winpty/src/agent/main.cc +114 -0
  286. package/vendor/node-pty-fork/deps/winpty/src/agent/subdir.mk +61 -0
  287. package/vendor/node-pty-fork/deps/winpty/src/configurations.gypi +60 -0
  288. package/vendor/node-pty-fork/deps/winpty/src/debugserver/DebugServer.cc +117 -0
  289. package/vendor/node-pty-fork/deps/winpty/src/debugserver/subdir.mk +41 -0
  290. package/vendor/node-pty-fork/deps/winpty/src/include/winpty.h +242 -0
  291. package/vendor/node-pty-fork/deps/winpty/src/include/winpty_constants.h +131 -0
  292. package/vendor/node-pty-fork/deps/winpty/src/libwinpty/AgentLocation.cc +75 -0
  293. package/vendor/node-pty-fork/deps/winpty/src/libwinpty/AgentLocation.h +28 -0
  294. package/vendor/node-pty-fork/deps/winpty/src/libwinpty/LibWinptyException.h +54 -0
  295. package/vendor/node-pty-fork/deps/winpty/src/libwinpty/WinptyInternal.h +72 -0
  296. package/vendor/node-pty-fork/deps/winpty/src/libwinpty/subdir.mk +46 -0
  297. package/vendor/node-pty-fork/deps/winpty/src/libwinpty/winpty.cc +970 -0
  298. package/vendor/node-pty-fork/deps/winpty/src/shared/AgentMsg.h +38 -0
  299. package/vendor/node-pty-fork/deps/winpty/src/shared/BackgroundDesktop.cc +122 -0
  300. package/vendor/node-pty-fork/deps/winpty/src/shared/BackgroundDesktop.h +73 -0
  301. package/vendor/node-pty-fork/deps/winpty/src/shared/Buffer.cc +103 -0
  302. package/vendor/node-pty-fork/deps/winpty/src/shared/Buffer.h +102 -0
  303. package/vendor/node-pty-fork/deps/winpty/src/shared/DebugClient.cc +187 -0
  304. package/vendor/node-pty-fork/deps/winpty/src/shared/DebugClient.h +38 -0
  305. package/vendor/node-pty-fork/deps/winpty/src/shared/GenRandom.cc +138 -0
  306. package/vendor/node-pty-fork/deps/winpty/src/shared/GenRandom.h +55 -0
  307. package/vendor/node-pty-fork/deps/winpty/src/shared/GetCommitHash.bat +13 -0
  308. package/vendor/node-pty-fork/deps/winpty/src/shared/Mutex.h +54 -0
  309. package/vendor/node-pty-fork/deps/winpty/src/shared/OsModule.h +63 -0
  310. package/vendor/node-pty-fork/deps/winpty/src/shared/OwnedHandle.cc +36 -0
  311. package/vendor/node-pty-fork/deps/winpty/src/shared/OwnedHandle.h +45 -0
  312. package/vendor/node-pty-fork/deps/winpty/src/shared/PrecompiledHeader.h +43 -0
  313. package/vendor/node-pty-fork/deps/winpty/src/shared/StringBuilder.h +227 -0
  314. package/vendor/node-pty-fork/deps/winpty/src/shared/StringBuilderTest.cc +114 -0
  315. package/vendor/node-pty-fork/deps/winpty/src/shared/StringUtil.cc +55 -0
  316. package/vendor/node-pty-fork/deps/winpty/src/shared/StringUtil.h +80 -0
  317. package/vendor/node-pty-fork/deps/winpty/src/shared/TimeMeasurement.h +63 -0
  318. package/vendor/node-pty-fork/deps/winpty/src/shared/UnixCtrlChars.h +45 -0
  319. package/vendor/node-pty-fork/deps/winpty/src/shared/UpdateGenVersion.bat +20 -0
  320. package/vendor/node-pty-fork/deps/winpty/src/shared/WindowsSecurity.cc +460 -0
  321. package/vendor/node-pty-fork/deps/winpty/src/shared/WindowsSecurity.h +104 -0
  322. package/vendor/node-pty-fork/deps/winpty/src/shared/WindowsVersion.cc +252 -0
  323. package/vendor/node-pty-fork/deps/winpty/src/shared/WindowsVersion.h +29 -0
  324. package/vendor/node-pty-fork/deps/winpty/src/shared/WinptyAssert.cc +55 -0
  325. package/vendor/node-pty-fork/deps/winpty/src/shared/WinptyAssert.h +64 -0
  326. package/vendor/node-pty-fork/deps/winpty/src/shared/WinptyException.cc +57 -0
  327. package/vendor/node-pty-fork/deps/winpty/src/shared/WinptyException.h +43 -0
  328. package/vendor/node-pty-fork/deps/winpty/src/shared/WinptyVersion.cc +42 -0
  329. package/vendor/node-pty-fork/deps/winpty/src/shared/WinptyVersion.h +27 -0
  330. package/vendor/node-pty-fork/deps/winpty/src/shared/winpty_snprintf.h +99 -0
  331. package/vendor/node-pty-fork/deps/winpty/src/subdir.mk +5 -0
  332. package/vendor/node-pty-fork/deps/winpty/src/tests/subdir.mk +28 -0
  333. package/vendor/node-pty-fork/deps/winpty/src/tests/trivial_test.cc +158 -0
  334. package/vendor/node-pty-fork/deps/winpty/src/unix-adapter/InputHandler.cc +114 -0
  335. package/vendor/node-pty-fork/deps/winpty/src/unix-adapter/InputHandler.h +56 -0
  336. package/vendor/node-pty-fork/deps/winpty/src/unix-adapter/OutputHandler.cc +80 -0
  337. package/vendor/node-pty-fork/deps/winpty/src/unix-adapter/OutputHandler.h +53 -0
  338. package/vendor/node-pty-fork/deps/winpty/src/unix-adapter/Util.cc +86 -0
  339. package/vendor/node-pty-fork/deps/winpty/src/unix-adapter/Util.h +31 -0
  340. package/vendor/node-pty-fork/deps/winpty/src/unix-adapter/WakeupFd.cc +70 -0
  341. package/vendor/node-pty-fork/deps/winpty/src/unix-adapter/WakeupFd.h +42 -0
  342. package/vendor/node-pty-fork/deps/winpty/src/unix-adapter/main.cc +729 -0
  343. package/vendor/node-pty-fork/deps/winpty/src/unix-adapter/subdir.mk +41 -0
  344. package/vendor/node-pty-fork/deps/winpty/src/winpty.gyp +206 -0
  345. package/vendor/node-pty-fork/deps/winpty/vcbuild.bat +83 -0
  346. package/vendor/node-pty-fork/lib/conpty_console_list_agent.js +20 -0
  347. package/vendor/node-pty-fork/lib/conpty_console_list_agent.js.map +1 -0
  348. package/vendor/node-pty-fork/lib/eventEmitter2.js +47 -0
  349. package/vendor/node-pty-fork/lib/eventEmitter2.js.map +1 -0
  350. package/vendor/node-pty-fork/lib/eventEmitter2.test.js +30 -0
  351. package/vendor/node-pty-fork/lib/eventEmitter2.test.js.map +1 -0
  352. package/vendor/node-pty-fork/lib/index.js +51 -0
  353. package/vendor/node-pty-fork/lib/index.js.map +1 -0
  354. package/vendor/node-pty-fork/lib/interfaces.js +7 -0
  355. package/vendor/node-pty-fork/lib/interfaces.js.map +1 -0
  356. package/vendor/node-pty-fork/lib/shared/conout.js +11 -0
  357. package/vendor/node-pty-fork/lib/shared/conout.js.map +1 -0
  358. package/vendor/node-pty-fork/lib/terminal.js +190 -0
  359. package/vendor/node-pty-fork/lib/terminal.js.map +1 -0
  360. package/vendor/node-pty-fork/lib/terminal.test.js +139 -0
  361. package/vendor/node-pty-fork/lib/terminal.test.js.map +1 -0
  362. package/vendor/node-pty-fork/lib/testUtils.test.js +28 -0
  363. package/vendor/node-pty-fork/lib/testUtils.test.js.map +1 -0
  364. package/vendor/node-pty-fork/lib/types.js +7 -0
  365. package/vendor/node-pty-fork/lib/types.js.map +1 -0
  366. package/vendor/node-pty-fork/lib/unixTerminal.js +304 -0
  367. package/vendor/node-pty-fork/lib/unixTerminal.js.map +1 -0
  368. package/vendor/node-pty-fork/lib/unixTerminal.test.js +330 -0
  369. package/vendor/node-pty-fork/lib/unixTerminal.test.js.map +1 -0
  370. package/vendor/node-pty-fork/lib/utils.js +17 -0
  371. package/vendor/node-pty-fork/lib/utils.js.map +1 -0
  372. package/vendor/node-pty-fork/lib/windowsConoutConnection.js +122 -0
  373. package/vendor/node-pty-fork/lib/windowsConoutConnection.js.map +1 -0
  374. package/vendor/node-pty-fork/lib/windowsPtyAgent.js +324 -0
  375. package/vendor/node-pty-fork/lib/windowsPtyAgent.js.map +1 -0
  376. package/vendor/node-pty-fork/lib/windowsPtyAgent.test.js +90 -0
  377. package/vendor/node-pty-fork/lib/windowsPtyAgent.test.js.map +1 -0
  378. package/vendor/node-pty-fork/lib/windowsTerminal.js +201 -0
  379. package/vendor/node-pty-fork/lib/windowsTerminal.js.map +1 -0
  380. package/vendor/node-pty-fork/lib/windowsTerminal.test.js +203 -0
  381. package/vendor/node-pty-fork/lib/windowsTerminal.test.js.map +1 -0
  382. package/vendor/node-pty-fork/lib/worker/conoutSocketWorker.js +22 -0
  383. package/vendor/node-pty-fork/lib/worker/conoutSocketWorker.js.map +1 -0
  384. package/vendor/node-pty-fork/package.json +35 -0
  385. package/vendor/node-pty-fork/scripts/apply-patches.mjs +341 -0
  386. package/vendor/node-pty-fork/scripts/fetch-upstream.mjs +41 -0
  387. package/vendor/node-pty-fork/scripts/install-smoke.cjs +59 -0
  388. package/vendor/node-pty-fork/scripts/smoke-load.cjs +10 -0
  389. package/vendor/node-pty-fork/scripts/sync-upstream.mjs +29 -0
  390. package/vendor/node-pty-fork/scripts/verify-runtime.cjs +54 -0
  391. package/vendor/node-pty-fork/scripts/verify-runtime.test.cjs +22 -0
  392. package/vendor/node-pty-fork/scripts/verify-tarball.cjs +80 -0
  393. package/vendor/node-pty-fork/src/conpty_console_list_agent.ts +19 -0
  394. package/vendor/node-pty-fork/src/eventEmitter2.test.ts +30 -0
  395. package/vendor/node-pty-fork/src/eventEmitter2.ts +48 -0
  396. package/vendor/node-pty-fork/src/index.ts +51 -0
  397. package/vendor/node-pty-fork/src/interfaces.ts +129 -0
  398. package/vendor/node-pty-fork/src/native.d.ts +56 -0
  399. package/vendor/node-pty-fork/src/shared/conout.ts +15 -0
  400. package/vendor/node-pty-fork/src/terminal.test.ts +119 -0
  401. package/vendor/node-pty-fork/src/terminal.ts +211 -0
  402. package/vendor/node-pty-fork/src/testUtils.test.ts +23 -0
  403. package/vendor/node-pty-fork/src/tsconfig.json +22 -0
  404. package/vendor/node-pty-fork/src/types.ts +15 -0
  405. package/vendor/node-pty-fork/src/unix/pty.cc +826 -0
  406. package/vendor/node-pty-fork/src/unix/spawn-helper.cc +23 -0
  407. package/vendor/node-pty-fork/src/unixTerminal.test.ts +335 -0
  408. package/vendor/node-pty-fork/src/unixTerminal.ts +320 -0
  409. package/vendor/node-pty-fork/src/utils.ts +9 -0
  410. package/vendor/node-pty-fork/src/win/conpty.cc +500 -0
  411. package/vendor/node-pty-fork/src/win/conpty_console_list.cc +43 -0
  412. package/vendor/node-pty-fork/src/win/path_util.cc +73 -0
  413. package/vendor/node-pty-fork/src/win/path_util.h +22 -0
  414. package/vendor/node-pty-fork/src/win/winpty.cc +322 -0
  415. package/vendor/node-pty-fork/src/windowsConoutConnection.ts +79 -0
  416. package/vendor/node-pty-fork/src/windowsPtyAgent.test.ts +94 -0
  417. package/vendor/node-pty-fork/src/windowsPtyAgent.ts +323 -0
  418. package/vendor/node-pty-fork/src/windowsTerminal.test.ts +214 -0
  419. package/vendor/node-pty-fork/src/windowsTerminal.ts +208 -0
  420. package/vendor/node-pty-fork/src/worker/conoutSocketWorker.ts +22 -0
  421. package/vendor/node-pty-fork/typings/node-pty.d.ts +203 -0
  422. package/dist/public/assets/WorkbenchShellRoute-DyaMnPfS.js +0 -1
  423. package/dist/server/modules/channels/wechat-claw-client.d.ts +0 -51
  424. package/dist/server/modules/channels/wechat-claw-client.js +0 -245
  425. package/dist/server/modules/channels/wechat-claw-client.js.map +0 -1
@@ -0,0 +1,970 @@
1
+ import { appendFileSync, mkdirSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { buildSessionRawStoreRef, normalizeOpenCodeMessageEnvelopes, normalizeOpenCodePartMessage, normalizeOpenCodeToolStatus, parseSessionIdFromRawStoreRef, toJsonRecord } from "../providers/opencode-shared.js";
5
+ import { createOpenCodeMessagePermissionOptions } from "../providers/opencode-permissions.js";
6
+ import { ensureText, extractTextBlocks, nextTimestamp, normalizeWorkspacePath } from "../providers/utils.js";
7
+ const DEFAULT_REQUEST_TIMEOUT_MS = 10_000;
8
+ const TIMEOUT_WARNING_THRESHOLD_MS = 15_000;
9
+ const MAX_CONSECUTIVE_TIMEOUTS = 5;
10
+ const OPENCODE_STALE_EVENT_GRACE_MS = 15_000;
11
+ const OPENCODE_REALISTIC_EPOCH_MS_THRESHOLD = Date.UTC(2000, 0, 1);
12
+ const OPENCODE_SUBMIT_TIMEOUT_AMBIGUOUS = "OPENCODE_SUBMIT_TIMEOUT_AMBIGUOUS";
13
+ const OPENCODE_ORDER_DEBUG_ENABLED = /^(1|true|yes)$/i.test(process.env.CODINGNS_OPENCODE_ORDER_DEBUG?.trim() ?? "");
14
+ const OPENCODE_ORDER_DEBUG_FILE_PATH = resolveOpenCodeOrderDebugFilePath();
15
+ export class OpenCodeRuntimeAdapter {
16
+ options;
17
+ providerId = "opencode";
18
+ constructor(options = {}) {
19
+ this.options = options;
20
+ }
21
+ async startSession(request, sink) {
22
+ const providerSessionId = await this.createSession(request.workspacePath, request.runtimeHomeDir ?? null);
23
+ const rawStoreRef = buildSessionRawStoreRef(providerSessionId);
24
+ sink.updateSessionBinding({
25
+ providerSessionId,
26
+ rawStoreRef
27
+ });
28
+ return this.createLaunchResult(request, sink, providerSessionId, rawStoreRef);
29
+ }
30
+ async continueSession(request, sink) {
31
+ const providerSessionId = this.resolveProviderSessionId(request.providerSessionId, request.rawStoreRef);
32
+ const rawStoreRef = request.rawStoreRef ?? buildSessionRawStoreRef(providerSessionId);
33
+ sink.updateSessionBinding({
34
+ providerSessionId,
35
+ rawStoreRef
36
+ });
37
+ return this.createLaunchResult(request, sink, providerSessionId, rawStoreRef);
38
+ }
39
+ createLaunchResult(request, sink, providerSessionId, rawStoreRef) {
40
+ const abortController = new AbortController();
41
+ const runStartedAtMs = Date.now();
42
+ const managedServerLeaseId = this.options.acquireManagedServerLease?.(request.workspacePath, request.runtimeHomeDir ?? null)?.trim() || null;
43
+ const completed = this.runSession(request, {
44
+ providerSessionId,
45
+ rawStoreRef,
46
+ workspacePath: request.workspacePath,
47
+ runtimeHomeDir: request.runtimeHomeDir?.trim() || null,
48
+ runStartedAtMs,
49
+ sequence: Math.max(0, request.sequenceBase ?? 0),
50
+ terminalStatus: null,
51
+ hasObservedActivity: false,
52
+ currentRunHasAcceptedActivity: false,
53
+ abortController,
54
+ sink,
55
+ messageInfoById: new Map(),
56
+ partById: new Map(),
57
+ messageIdByPartId: new Map(),
58
+ partIdsByMessageId: new Map(),
59
+ emittedPartSignatures: new Map(),
60
+ emittedSequenceByMessageId: new Map(),
61
+ emittedPartOrderByPartId: new Map(),
62
+ nextPartOrdinalByMessageKind: new Map()
63
+ }, abortController.signal).finally(() => {
64
+ if (managedServerLeaseId) {
65
+ this.options.releaseManagedServerLease?.(request.workspacePath, managedServerLeaseId, request.runtimeHomeDir ?? null);
66
+ }
67
+ });
68
+ return {
69
+ providerSessionId,
70
+ rawStoreRef,
71
+ interrupt: async () => {
72
+ await this.abortSession(providerSessionId, request.workspacePath, request.runtimeHomeDir ?? null);
73
+ abortController.abort();
74
+ },
75
+ completed
76
+ };
77
+ }
78
+ async runSession(request, state, signal) {
79
+ const eventStreamPromise = this.consumeEventStream(state, signal);
80
+ const promptStartedAt = nextTimestamp();
81
+ try {
82
+ await this.sendPrompt(state.providerSessionId, request, signal);
83
+ }
84
+ catch (error) {
85
+ if (signal.aborted) {
86
+ return;
87
+ }
88
+ if (!state.hasObservedActivity && state.terminalStatus === null) {
89
+ await waitForOpenCodeProgress(state, signal, 1_500);
90
+ }
91
+ if (!signal.aborted
92
+ && !state.hasObservedActivity
93
+ && state.terminalStatus === null
94
+ && isOpenCodeSubmitTimeoutAmbiguous(error)) {
95
+ const acceptedMessage = await this.findAcceptedUserMessage(state.providerSessionId, request.options.providerPrompt?.trim() || request.options.content.trim(), promptStartedAt, request.workspacePath, request.runtimeHomeDir ?? null);
96
+ if (acceptedMessage) {
97
+ try {
98
+ await eventStreamPromise;
99
+ }
100
+ catch (streamError) {
101
+ if (!signal.aborted
102
+ && state.terminalStatus !== "completed"
103
+ && state.terminalStatus !== "failed") {
104
+ await this.emitRuntimeFailure(state, streamError);
105
+ }
106
+ }
107
+ return;
108
+ }
109
+ }
110
+ if (signal.aborted
111
+ || state.hasObservedActivity
112
+ || state.terminalStatus === "completed"
113
+ || state.terminalStatus === "failed") {
114
+ try {
115
+ await eventStreamPromise;
116
+ }
117
+ catch (streamError) {
118
+ if (!signal.aborted
119
+ && state.terminalStatus !== "completed"
120
+ && state.terminalStatus !== "failed") {
121
+ await this.emitRuntimeFailure(state, streamError);
122
+ }
123
+ }
124
+ return;
125
+ }
126
+ state.abortController.abort();
127
+ try {
128
+ await eventStreamPromise;
129
+ }
130
+ catch {
131
+ // 主动中断流后这里抛出的通常是 abort,直接吞掉。
132
+ }
133
+ await this.emitRuntimeFailure(state, error);
134
+ return;
135
+ }
136
+ try {
137
+ await eventStreamPromise;
138
+ }
139
+ catch (error) {
140
+ if (signal.aborted) {
141
+ return;
142
+ }
143
+ if (state.terminalStatus === "completed" || state.terminalStatus === "failed") {
144
+ return;
145
+ }
146
+ await this.emitRuntimeFailure(state, error);
147
+ }
148
+ }
149
+ async consumeEventStream(state, signal) {
150
+ const response = await this.fetchResponse("/event", {
151
+ signal,
152
+ workspacePath: state.workspacePath,
153
+ runtimeHomeDir: state.runtimeHomeDir
154
+ });
155
+ if (!response.body) {
156
+ throw new Error("OPENCODE_EVENT_STREAM_UNAVAILABLE");
157
+ }
158
+ const reader = response.body.getReader();
159
+ const decoder = new TextDecoder();
160
+ let buffer = "";
161
+ try {
162
+ while (true) {
163
+ const next = await reader.read();
164
+ if (next.done) {
165
+ break;
166
+ }
167
+ buffer += decoder.decode(next.value, { stream: true });
168
+ while (true) {
169
+ const separatorIndex = buffer.indexOf("\n\n");
170
+ if (separatorIndex < 0) {
171
+ break;
172
+ }
173
+ const frame = buffer.slice(0, separatorIndex);
174
+ buffer = buffer.slice(separatorIndex + 2);
175
+ const payload = extractSseData(frame);
176
+ if (!payload) {
177
+ continue;
178
+ }
179
+ const rawEvent = JSON.parse(payload);
180
+ const event = unwrapEventPayload(rawEvent);
181
+ if (!event) {
182
+ continue;
183
+ }
184
+ logOpenCodeOrderDebug("sse.event", {
185
+ providerSessionId: state.providerSessionId,
186
+ event
187
+ });
188
+ const terminal = await this.handleEvent(event, state);
189
+ if (terminal) {
190
+ return;
191
+ }
192
+ }
193
+ }
194
+ }
195
+ catch (error) {
196
+ if (signal.aborted) {
197
+ return;
198
+ }
199
+ throw error;
200
+ }
201
+ finally {
202
+ reader.releaseLock();
203
+ }
204
+ }
205
+ async handleEvent(event, state) {
206
+ const eventType = ensureText(event.type).trim();
207
+ if (!eventType) {
208
+ return false;
209
+ }
210
+ if (eventType === "session.error") {
211
+ const properties = toJsonRecord(event.properties) ?? {};
212
+ const sessionId = ensureText(properties.sessionID).trim();
213
+ if (sessionId && sessionId !== state.providerSessionId) {
214
+ return false;
215
+ }
216
+ const errorPayload = toJsonRecord(properties.error) ?? {};
217
+ state.hasObservedActivity = true;
218
+ state.terminalStatus = "failed";
219
+ await state.sink.emit({
220
+ type: "error",
221
+ status: "failed",
222
+ providerSessionId: state.providerSessionId,
223
+ rawStoreRef: state.rawStoreRef,
224
+ errorCode: ensureText(errorPayload.type).trim() || "OPENCODE_SESSION_ERROR",
225
+ detail: extractTextBlocks(errorPayload).trim() || "OpenCode session failed",
226
+ timestamp: nextTimestamp()
227
+ });
228
+ return true;
229
+ }
230
+ if (eventType === "session.status") {
231
+ const properties = toJsonRecord(event.properties) ?? {};
232
+ if (ensureText(properties.sessionID).trim() !== state.providerSessionId) {
233
+ return false;
234
+ }
235
+ const status = toJsonRecord(properties.status) ?? {};
236
+ const mapped = mapSessionStatus(status);
237
+ state.hasObservedActivity = true;
238
+ if (mapped.status === "running") {
239
+ state.currentRunHasAcceptedActivity = true;
240
+ }
241
+ await state.sink.emit({
242
+ type: "status",
243
+ status: mapped.status,
244
+ providerSessionId: state.providerSessionId,
245
+ rawStoreRef: state.rawStoreRef,
246
+ detail: mapped.detail,
247
+ timestamp: nextTimestamp()
248
+ });
249
+ return false;
250
+ }
251
+ if (eventType === "session.idle") {
252
+ const properties = toJsonRecord(event.properties) ?? {};
253
+ if (ensureText(properties.sessionID).trim() !== state.providerSessionId) {
254
+ return false;
255
+ }
256
+ if (!state.currentRunHasAcceptedActivity) {
257
+ return false;
258
+ }
259
+ state.hasObservedActivity = true;
260
+ state.terminalStatus = "completed";
261
+ await state.sink.emit({
262
+ type: "complete",
263
+ status: "completed",
264
+ providerSessionId: state.providerSessionId,
265
+ rawStoreRef: state.rawStoreRef,
266
+ detail: "OpenCode 本轮输出已结束",
267
+ timestamp: nextTimestamp()
268
+ });
269
+ return true;
270
+ }
271
+ if (eventType === "message.updated") {
272
+ const info = toJsonRecord(toJsonRecord(event.properties)?.info);
273
+ const messageId = ensureText(info?.id).trim();
274
+ const sessionId = ensureText(info?.sessionID).trim();
275
+ if (!info || !messageId || sessionId !== state.providerSessionId) {
276
+ return false;
277
+ }
278
+ if (shouldIgnoreStaleOpenCodeRuntimeEvent(extractOpenCodeMessageInfoTimestampMs(info), state.runStartedAtMs)) {
279
+ logOpenCodeOrderDebug("sse.event.ignored_stale_message", {
280
+ providerSessionId: state.providerSessionId,
281
+ messageId,
282
+ info
283
+ });
284
+ return false;
285
+ }
286
+ state.hasObservedActivity = true;
287
+ state.currentRunHasAcceptedActivity = true;
288
+ state.messageInfoById.set(messageId, info);
289
+ const partIds = state.partIdsByMessageId.get(messageId);
290
+ if (!partIds) {
291
+ return false;
292
+ }
293
+ for (const partId of partIds) {
294
+ const part = state.partById.get(partId);
295
+ if (part) {
296
+ await this.emitNormalizedPartMessage(part, state);
297
+ }
298
+ }
299
+ return false;
300
+ }
301
+ if (eventType === "message.part.updated") {
302
+ const part = toJsonRecord(toJsonRecord(event.properties)?.part);
303
+ const partId = ensureText(part?.id).trim();
304
+ const messageId = ensureText(part?.messageID).trim();
305
+ const sessionId = ensureText(part?.sessionID).trim();
306
+ if (!part || !partId || !messageId || sessionId !== state.providerSessionId) {
307
+ return false;
308
+ }
309
+ if (shouldIgnoreStaleOpenCodeRuntimeEvent(extractOpenCodePartTimestampMs(part), state.runStartedAtMs)) {
310
+ logOpenCodeOrderDebug("sse.event.ignored_stale_part", {
311
+ providerSessionId: state.providerSessionId,
312
+ messageId,
313
+ partId,
314
+ part
315
+ });
316
+ return false;
317
+ }
318
+ state.hasObservedActivity = true;
319
+ state.currentRunHasAcceptedActivity = true;
320
+ const merged = mergeRecords(state.partById.get(partId), part);
321
+ state.partById.set(partId, merged);
322
+ state.messageIdByPartId.set(partId, messageId);
323
+ const knownPartIds = state.partIdsByMessageId.get(messageId) ?? new Set();
324
+ knownPartIds.add(partId);
325
+ state.partIdsByMessageId.set(messageId, knownPartIds);
326
+ await this.emitNormalizedPartMessage(merged, state);
327
+ return false;
328
+ }
329
+ if (eventType === "message.part.delta") {
330
+ const properties = toJsonRecord(event.properties) ?? {};
331
+ const partId = ensureText(properties.partID).trim();
332
+ const messageId = ensureText(properties.messageID).trim();
333
+ const sessionId = ensureText(properties.sessionID).trim();
334
+ if (!partId || sessionId !== state.providerSessionId) {
335
+ return false;
336
+ }
337
+ const existingPart = state.partById.get(partId);
338
+ const existingMessage = messageId
339
+ ? state.messageInfoById.get(messageId)
340
+ : state.messageInfoById.get(state.messageIdByPartId.get(partId) ?? "");
341
+ const deltaTimestampMs = firstFiniteNumber(extractOpenCodePartTimestampMs(existingPart), extractOpenCodeMessageInfoTimestampMs(existingMessage));
342
+ if (shouldIgnoreStaleOpenCodeRuntimeEvent(deltaTimestampMs, state.runStartedAtMs)) {
343
+ logOpenCodeOrderDebug("sse.event.ignored_stale_delta", {
344
+ providerSessionId: state.providerSessionId,
345
+ messageId: messageId || state.messageIdByPartId.get(partId) || null,
346
+ partId,
347
+ properties
348
+ });
349
+ return false;
350
+ }
351
+ state.hasObservedActivity = true;
352
+ state.currentRunHasAcceptedActivity = true;
353
+ const existing = state.partById.get(partId) ?? {};
354
+ const field = ensureText(properties.field).trim();
355
+ const delta = ensureText(properties.delta);
356
+ const knownMessageId = messageId || state.messageIdByPartId.get(partId) || "";
357
+ const nextPart = {
358
+ ...existing,
359
+ id: ensureText(existing.id).trim() || partId,
360
+ messageID: ensureText(existing.messageID).trim() || knownMessageId,
361
+ sessionID: ensureText(existing.sessionID).trim() || state.providerSessionId
362
+ };
363
+ if (field === "text") {
364
+ if (!ensureText(nextPart.type).trim()) {
365
+ nextPart.type = "text";
366
+ }
367
+ nextPart.text = `${ensureText(existing.text)}${delta}`;
368
+ }
369
+ state.partById.set(partId, nextPart);
370
+ if (knownMessageId) {
371
+ state.messageIdByPartId.set(partId, knownMessageId);
372
+ const knownPartIds = state.partIdsByMessageId.get(knownMessageId) ?? new Set();
373
+ knownPartIds.add(partId);
374
+ state.partIdsByMessageId.set(knownMessageId, knownPartIds);
375
+ }
376
+ await this.emitNormalizedPartMessage(nextPart, state);
377
+ return false;
378
+ }
379
+ return false;
380
+ }
381
+ async emitNormalizedPartMessage(partPayload, state) {
382
+ if (!shouldEmitPart(partPayload)) {
383
+ return;
384
+ }
385
+ const partId = ensureText(partPayload.id).trim();
386
+ const messageId = ensureText(partPayload.messageID).trim() || state.messageIdByPartId.get(partId) || "";
387
+ const existingMessagePayload = state.messageInfoById.get(messageId);
388
+ const messagePayload = existingMessagePayload ?? createSyntheticMessagePayload(partPayload, messageId, state.providerSessionId);
389
+ if (!messageId || !partId || !messagePayload) {
390
+ return;
391
+ }
392
+ state.messageIdByPartId.set(partId, messageId);
393
+ if (!existingMessagePayload) {
394
+ state.messageInfoById.set(messageId, messagePayload);
395
+ }
396
+ const currentSequence = state.emittedSequenceByMessageId.get(messageId)
397
+ ?? (() => {
398
+ state.sequence += 1;
399
+ state.emittedSequenceByMessageId.set(messageId, state.sequence);
400
+ return state.sequence;
401
+ })();
402
+ const partOrder = resolveOpenCodeRuntimePartOrder(partPayload, messageId, partId, state);
403
+ const normalized = normalizeOpenCodePartMessage({
404
+ sessionId: state.providerSessionId,
405
+ providerSessionId: state.providerSessionId,
406
+ partId,
407
+ messageId,
408
+ partPayload,
409
+ messagePayload,
410
+ defaultTimestamp: nextTimestamp(),
411
+ rawRefOrder: {
412
+ part: partOrder
413
+ }
414
+ });
415
+ if (!normalized) {
416
+ return;
417
+ }
418
+ const signature = [
419
+ normalized.kind,
420
+ normalized.content,
421
+ normalized.toolCall?.status ?? "",
422
+ normalized.toolCall?.output ?? "",
423
+ normalized.toolCall?.error ?? "",
424
+ normalized.timestamp,
425
+ normalized.rawRef
426
+ ].join("|");
427
+ if (state.emittedPartSignatures.get(partId) === signature) {
428
+ return;
429
+ }
430
+ state.emittedPartSignatures.set(partId, signature);
431
+ logOpenCodeOrderDebug("runtime.message.emit", {
432
+ providerSessionId: state.providerSessionId,
433
+ messageId,
434
+ partId,
435
+ sequence: currentSequence,
436
+ normalized: {
437
+ messageId: normalized.messageId,
438
+ role: normalized.role,
439
+ kind: normalized.kind,
440
+ timestamp: normalized.timestamp,
441
+ rawRef: normalized.rawRef,
442
+ content: normalized.content
443
+ }
444
+ });
445
+ await state.sink.emit({
446
+ type: "message",
447
+ providerSessionId: state.providerSessionId,
448
+ rawStoreRef: state.rawStoreRef,
449
+ message: {
450
+ ...normalized,
451
+ sequence: currentSequence
452
+ },
453
+ status: "running",
454
+ timestamp: normalized.timestamp,
455
+ rawEventRef: normalized.rawRef
456
+ });
457
+ }
458
+ async createSession(workspacePath, runtimeHomeDir) {
459
+ const response = await this.fetchJson("/session", {
460
+ method: "POST",
461
+ headers: {
462
+ "content-type": "application/json"
463
+ },
464
+ query: {
465
+ directory: workspacePath
466
+ },
467
+ body: JSON.stringify({
468
+ directory: workspacePath
469
+ }),
470
+ workspacePath,
471
+ runtimeHomeDir
472
+ });
473
+ const sessionId = ensureText(response.id).trim();
474
+ if (!sessionId) {
475
+ throw new Error("PROVIDER_SESSION_ID_REQUIRED");
476
+ }
477
+ await this.assertSessionDirectory(sessionId, workspacePath, runtimeHomeDir);
478
+ return sessionId;
479
+ }
480
+ async assertSessionDirectory(providerSessionId, expectedWorkspacePath, runtimeHomeDir) {
481
+ const response = await this.fetchJson(`/session/${encodeURIComponent(providerSessionId)}`, {
482
+ workspacePath: expectedWorkspacePath,
483
+ runtimeHomeDir
484
+ });
485
+ const actualWorkspacePath = ensureText(response.directory).trim();
486
+ if (normalizeWorkspacePath(actualWorkspacePath) ===
487
+ normalizeWorkspacePath(expectedWorkspacePath)) {
488
+ return;
489
+ }
490
+ throw new Error("OPENCODE_SESSION_DIRECTORY_MISMATCH");
491
+ }
492
+ resolveProviderSessionId(providerSessionId, rawStoreRef) {
493
+ const explicit = providerSessionId?.trim();
494
+ if (explicit) {
495
+ return explicit;
496
+ }
497
+ const parsed = rawStoreRef ? parseSessionIdFromRawStoreRef(rawStoreRef) : null;
498
+ if (parsed) {
499
+ return parsed;
500
+ }
501
+ throw new Error("PROVIDER_SESSION_ID_REQUIRED");
502
+ }
503
+ async sendPrompt(providerSessionId, request, signal) {
504
+ const content = request.options.providerPrompt?.trim() || request.options.content.trim();
505
+ if (!content) {
506
+ throw new Error("INVALID_INPUT");
507
+ }
508
+ const body = {
509
+ ...createOpenCodeMessagePermissionOptions(request.options.permissionMode),
510
+ parts: [
511
+ {
512
+ type: "text",
513
+ text: content
514
+ }
515
+ ]
516
+ };
517
+ const model = parseModelSelection(request.options.model);
518
+ if (model) {
519
+ body.model = model;
520
+ }
521
+ await this.fetchJson(`/session/${encodeURIComponent(providerSessionId)}/message`, {
522
+ method: "POST",
523
+ headers: {
524
+ "content-type": "application/json"
525
+ },
526
+ body: JSON.stringify(body),
527
+ signal,
528
+ timeoutErrorMessage: OPENCODE_SUBMIT_TIMEOUT_AMBIGUOUS,
529
+ workspacePath: request.workspacePath,
530
+ runtimeHomeDir: request.runtimeHomeDir ?? null
531
+ });
532
+ }
533
+ async findAcceptedUserMessage(providerSessionId, content, minTimestamp, workspacePath, runtimeHomeDir) {
534
+ try {
535
+ const response = await this.fetchJson(`/session/${encodeURIComponent(providerSessionId)}/message`, {
536
+ query: {
537
+ limit: "20"
538
+ },
539
+ workspacePath,
540
+ runtimeHomeDir
541
+ });
542
+ const messages = normalizeOpenCodeMessageEnvelopes(providerSessionId, providerSessionId, response.reverse());
543
+ const trimmed = content.trim();
544
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
545
+ const message = messages[index];
546
+ if (message?.role === "user"
547
+ && message.content.trim() === trimmed
548
+ && isTimestampOnOrAfter(message.timestamp, minTimestamp)) {
549
+ return message;
550
+ }
551
+ }
552
+ return null;
553
+ }
554
+ catch {
555
+ return null;
556
+ }
557
+ }
558
+ async emitRuntimeFailure(state, error) {
559
+ await state.sink.emit({
560
+ type: "error",
561
+ status: "failed",
562
+ providerSessionId: state.providerSessionId,
563
+ rawStoreRef: state.rawStoreRef,
564
+ errorCode: mapOpenCodeRuntimeErrorCode(error),
565
+ detail: error instanceof Error ? error.message : "opencode runtime failed",
566
+ timestamp: nextTimestamp()
567
+ });
568
+ }
569
+ async abortSession(providerSessionId, workspacePath, runtimeHomeDir) {
570
+ await this.fetchJson(`/session/${encodeURIComponent(providerSessionId)}/abort`, {
571
+ method: "POST",
572
+ workspacePath,
573
+ runtimeHomeDir
574
+ });
575
+ }
576
+ async resolveBaseUrl(refresh = false, workspacePath, runtimeHomeDir) {
577
+ const resolved = this.options.baseUrlResolver
578
+ ? await this.options.baseUrlResolver({ refresh, workspacePath, runtimeHomeDir })
579
+ : this.options.baseUrl?.trim();
580
+ if (!resolved) {
581
+ throw new Error("SERVER_UNAVAILABLE");
582
+ }
583
+ return resolved.trim().replace(/\/+$/, "");
584
+ }
585
+ resolveRequestTimeoutMs() {
586
+ const configured = this.options.requestTimeoutMs;
587
+ if (!Number.isFinite(configured)) {
588
+ return DEFAULT_REQUEST_TIMEOUT_MS;
589
+ }
590
+ return Math.max(1_000, Math.floor(configured));
591
+ }
592
+ async fetchResponse(pathname, input = {}) {
593
+ return this.fetchResponseWithRetry(pathname, input, false);
594
+ }
595
+ async fetchResponseWithRetry(pathname, input, refresh, timeoutState = createTimeoutRetryState()) {
596
+ const url = new URL(pathname, `${await this.resolveBaseUrl(refresh, input.workspacePath, input.runtimeHomeDir ?? null)}/`);
597
+ if (input.query) {
598
+ for (const [key, value] of Object.entries(input.query)) {
599
+ if (value) {
600
+ url.searchParams.set(key, value);
601
+ }
602
+ }
603
+ }
604
+ const controller = new AbortController();
605
+ const cleanup = bindAbortSignals(controller, input.signal);
606
+ const timer = setTimeout(() => {
607
+ controller.abort();
608
+ }, this.resolveRequestTimeoutMs());
609
+ try {
610
+ const response = await fetch(url, {
611
+ method: input.method ?? "GET",
612
+ headers: input.headers,
613
+ body: input.body,
614
+ signal: controller.signal
615
+ });
616
+ if (!response.ok) {
617
+ const detail = await safeReadResponseText(response);
618
+ const mapped = mapRuntimeHttpError(response.status, detail);
619
+ if (!refresh && isRuntimeServerUnavailableError(mapped) && this.options.baseUrlResolver) {
620
+ return this.fetchResponseWithRetry(pathname, input, true);
621
+ }
622
+ throw mapped;
623
+ }
624
+ return response;
625
+ }
626
+ catch (error) {
627
+ if (controller.signal.aborted) {
628
+ if (input.signal?.aborted) {
629
+ throw error;
630
+ }
631
+ if (!isTimeoutRetryableMethod(input.method)) {
632
+ throw new Error(input.timeoutErrorMessage ?? "SERVER_TIMEOUT");
633
+ }
634
+ const nextTimeoutState = advanceTimeoutRetryState(timeoutState);
635
+ if (!shouldSurfaceTimeout(nextTimeoutState)) {
636
+ if (!refresh && this.options.baseUrlResolver) {
637
+ return this.fetchResponseWithRetry(pathname, input, true, nextTimeoutState);
638
+ }
639
+ return this.fetchResponseWithRetry(pathname, input, refresh, nextTimeoutState);
640
+ }
641
+ throw new Error("SERVER_TIMEOUT");
642
+ }
643
+ if (isRuntimeRequestUnavailable(error)) {
644
+ if (!refresh && this.options.baseUrlResolver) {
645
+ return this.fetchResponseWithRetry(pathname, input, true, timeoutState);
646
+ }
647
+ throw new Error("SERVER_UNAVAILABLE");
648
+ }
649
+ throw error;
650
+ }
651
+ finally {
652
+ clearTimeout(timer);
653
+ cleanup();
654
+ }
655
+ }
656
+ async fetchJson(pathname, input = {}) {
657
+ const response = await this.fetchResponse(pathname, input);
658
+ const text = await response.text();
659
+ return text.length > 0 ? JSON.parse(text) : undefined;
660
+ }
661
+ }
662
+ function shouldEmitPart(partPayload) {
663
+ const partType = ensureText(partPayload.type).trim().toLowerCase();
664
+ if (partType === "text") {
665
+ const text = ensureText(partPayload.text).trim();
666
+ return text.length > 0;
667
+ }
668
+ if (partType === "reasoning") {
669
+ const text = ensureText(partPayload.text).trim();
670
+ return text.length > 0;
671
+ }
672
+ if (partType === "tool") {
673
+ const status = normalizeOpenCodeToolStatus(toJsonRecord(partPayload.state)?.status);
674
+ return status !== "running";
675
+ }
676
+ if (partType === "step-start" || partType === "step-finish") {
677
+ return false;
678
+ }
679
+ return true;
680
+ }
681
+ function createSyntheticMessagePayload(partPayload, messageId, providerSessionId) {
682
+ const normalizedMessageId = messageId.trim();
683
+ if (!normalizedMessageId) {
684
+ return null;
685
+ }
686
+ const partTime = toJsonRecord(partPayload.time);
687
+ const createdAt = typeof partTime?.start === "number"
688
+ ? partTime.start
689
+ : typeof partTime?.created === "number"
690
+ ? partTime.created
691
+ : typeof partTime?.end === "number"
692
+ ? partTime.end
693
+ : null;
694
+ return {
695
+ id: normalizedMessageId,
696
+ sessionID: providerSessionId,
697
+ // OpenCode 的正文增量经常先于 message.updated 到达。
698
+ // 这里先用 assistant 占位,保证前端能实时看到同一条消息的连续增长。
699
+ role: "assistant",
700
+ time: createdAt === null ? {} : { created: createdAt }
701
+ };
702
+ }
703
+ function resolveOpenCodeRuntimePartOrder(partPayload, messageId, partId, state) {
704
+ const existing = state.emittedPartOrderByPartId.get(partId);
705
+ if (typeof existing === "number" && Number.isFinite(existing) && existing > 0) {
706
+ return existing;
707
+ }
708
+ const kindBucket = resolveOpenCodeRuntimePartKindBucket(partPayload);
709
+ const counterKey = `${messageId}:${kindBucket}`;
710
+ const nextOrdinal = (state.nextPartOrdinalByMessageKind.get(counterKey) ?? 0) + 1;
711
+ const partOrder = kindBucket * 1_000 + nextOrdinal;
712
+ state.nextPartOrdinalByMessageKind.set(counterKey, nextOrdinal);
713
+ state.emittedPartOrderByPartId.set(partId, partOrder);
714
+ return partOrder;
715
+ }
716
+ function resolveOpenCodeRuntimePartKindBucket(partPayload) {
717
+ const partType = ensureText(partPayload.type).trim().toLowerCase();
718
+ if (partType === "reasoning" || partType === "thinking") {
719
+ return 1;
720
+ }
721
+ if (partType === "text") {
722
+ return 2;
723
+ }
724
+ if (partType === "tool" || partType === "patch") {
725
+ return 3;
726
+ }
727
+ return 4;
728
+ }
729
+ function shouldIgnoreStaleOpenCodeRuntimeEvent(eventTimestampMs, runStartedAtMs) {
730
+ if (eventTimestampMs === null
731
+ || !Number.isFinite(eventTimestampMs)
732
+ || eventTimestampMs < OPENCODE_REALISTIC_EPOCH_MS_THRESHOLD) {
733
+ return false;
734
+ }
735
+ return eventTimestampMs + OPENCODE_STALE_EVENT_GRACE_MS < runStartedAtMs;
736
+ }
737
+ function extractOpenCodePartTimestampMs(partPayload) {
738
+ const partTime = toJsonRecord(partPayload?.time);
739
+ return firstFiniteNumber(partTime?.start, partTime?.created, partTime?.end);
740
+ }
741
+ function extractOpenCodeMessageInfoTimestampMs(messagePayload) {
742
+ const messageTime = toJsonRecord(messagePayload?.time);
743
+ return firstFiniteNumber(messageTime?.created, messageTime?.completed, messageTime?.updated);
744
+ }
745
+ function firstFiniteNumber(...values) {
746
+ for (const value of values) {
747
+ if (typeof value === "number" && Number.isFinite(value)) {
748
+ return value;
749
+ }
750
+ }
751
+ return null;
752
+ }
753
+ function logOpenCodeOrderDebug(scope, detail) {
754
+ if (!OPENCODE_ORDER_DEBUG_ENABLED) {
755
+ return;
756
+ }
757
+ const payload = {
758
+ timestamp: new Date().toISOString(),
759
+ scope,
760
+ ...detail
761
+ };
762
+ console.info(`[opencode-order-host] ${scope}`, payload);
763
+ if (!OPENCODE_ORDER_DEBUG_FILE_PATH) {
764
+ return;
765
+ }
766
+ try {
767
+ mkdirSync(dirname(OPENCODE_ORDER_DEBUG_FILE_PATH), { recursive: true });
768
+ appendFileSync(OPENCODE_ORDER_DEBUG_FILE_PATH, `${JSON.stringify(payload)}\n`, "utf8");
769
+ }
770
+ catch {
771
+ // 调试日志写失败不能影响主流程。
772
+ }
773
+ }
774
+ function resolveOpenCodeOrderDebugFilePath() {
775
+ if (!OPENCODE_ORDER_DEBUG_ENABLED) {
776
+ return null;
777
+ }
778
+ const explicit = process.env.CODINGNS_OPENCODE_ORDER_DEBUG_FILE?.trim();
779
+ if (explicit) {
780
+ return explicit;
781
+ }
782
+ return join(homedir(), "WorkFile", "codingns-opencode-order.ndjson");
783
+ }
784
+ function mergeRecords(current, next) {
785
+ if (!current) {
786
+ return { ...next };
787
+ }
788
+ const merged = {
789
+ ...current,
790
+ ...next
791
+ };
792
+ const currentState = toJsonRecord(current.state);
793
+ const nextState = toJsonRecord(next.state);
794
+ if (currentState || nextState) {
795
+ merged.state = {
796
+ ...(currentState ?? {}),
797
+ ...(nextState ?? {})
798
+ };
799
+ }
800
+ const currentTime = toJsonRecord(current.time);
801
+ const nextTime = toJsonRecord(next.time);
802
+ if (currentTime || nextTime) {
803
+ merged.time = {
804
+ ...(currentTime ?? {}),
805
+ ...(nextTime ?? {})
806
+ };
807
+ }
808
+ return merged;
809
+ }
810
+ async function waitForOpenCodeProgress(state, signal, timeoutMs) {
811
+ const startedAt = Date.now();
812
+ while (!signal.aborted
813
+ && !state.hasObservedActivity
814
+ && state.terminalStatus === null
815
+ && Date.now() - startedAt < timeoutMs) {
816
+ await new Promise((resolve) => {
817
+ setTimeout(resolve, 50);
818
+ });
819
+ }
820
+ }
821
+ function extractSseData(frame) {
822
+ const lines = frame.split(/\r?\n/);
823
+ const dataLines = lines
824
+ .filter((line) => line.startsWith("data:"))
825
+ .map((line) => line.slice(5).trimStart());
826
+ if (dataLines.length === 0) {
827
+ return null;
828
+ }
829
+ return dataLines.join("\n");
830
+ }
831
+ function unwrapEventPayload(rawEvent) {
832
+ const record = toJsonRecord(rawEvent);
833
+ if (!record) {
834
+ return null;
835
+ }
836
+ const payload = toJsonRecord(record.payload);
837
+ return payload ?? record;
838
+ }
839
+ function mapSessionStatus(status) {
840
+ const statusType = ensureText(status.type).trim().toLowerCase();
841
+ if (statusType === "busy") {
842
+ return {
843
+ status: "running",
844
+ detail: "OpenCode 正在处理这轮输入"
845
+ };
846
+ }
847
+ if (statusType === "retry") {
848
+ const attempt = ensureText(status.attempt).trim();
849
+ const message = ensureText(status.message).trim();
850
+ return {
851
+ status: "running",
852
+ detail: message || (attempt ? `OpenCode 正在重试(第 ${attempt} 次)` : "OpenCode 正在重试")
853
+ };
854
+ }
855
+ return {
856
+ status: "completed",
857
+ detail: "OpenCode 当前空闲"
858
+ };
859
+ }
860
+ function parseModelSelection(model) {
861
+ const normalized = model?.trim();
862
+ if (!normalized) {
863
+ return null;
864
+ }
865
+ const slashIndex = normalized.indexOf("/");
866
+ if (slashIndex > 0) {
867
+ return {
868
+ providerID: normalized.slice(0, slashIndex),
869
+ modelID: normalized.slice(slashIndex + 1)
870
+ };
871
+ }
872
+ return null;
873
+ }
874
+ function bindAbortSignals(controller, upstream) {
875
+ if (!upstream) {
876
+ return () => {
877
+ return;
878
+ };
879
+ }
880
+ const handleAbort = () => {
881
+ controller.abort();
882
+ };
883
+ upstream.addEventListener("abort", handleAbort);
884
+ return () => {
885
+ upstream.removeEventListener("abort", handleAbort);
886
+ };
887
+ }
888
+ function mapRuntimeHttpError(statusCode, detail) {
889
+ if (statusCode === 404) {
890
+ return new Error("PROVIDER_SESSION_NOT_FOUND");
891
+ }
892
+ if (statusCode === 409 && /active|running|busy/i.test(detail)) {
893
+ return new Error("ACTIVE_RUN_EXISTS");
894
+ }
895
+ if (statusCode >= 500) {
896
+ return new Error("SERVER_UNAVAILABLE");
897
+ }
898
+ return new Error(detail || `OPENCODE_HTTP_${statusCode}`);
899
+ }
900
+ async function safeReadResponseText(response) {
901
+ try {
902
+ return (await response.text()).trim();
903
+ }
904
+ catch {
905
+ return "";
906
+ }
907
+ }
908
+ function isRuntimeServerUnavailableError(error) {
909
+ return error instanceof Error && error.message === "SERVER_UNAVAILABLE";
910
+ }
911
+ function isRuntimeRequestUnavailable(error) {
912
+ if (!(error instanceof Error)) {
913
+ return false;
914
+ }
915
+ const cause = "cause" in error ? error.cause : null;
916
+ if (cause && typeof cause === "object" && "code" in cause) {
917
+ const code = typeof cause.code === "string" ? cause.code : "";
918
+ if (code === "ECONNREFUSED" || code === "ECONNRESET" || code === "ENOTFOUND") {
919
+ return true;
920
+ }
921
+ }
922
+ return error.message === "fetch failed";
923
+ }
924
+ function createTimeoutRetryState() {
925
+ return {
926
+ startedAtMs: Date.now(),
927
+ timeoutCount: 0
928
+ };
929
+ }
930
+ function advanceTimeoutRetryState(state) {
931
+ return {
932
+ startedAtMs: state.startedAtMs,
933
+ timeoutCount: state.timeoutCount + 1
934
+ };
935
+ }
936
+ function isTimeoutRetryableMethod(method) {
937
+ const normalized = (method ?? "GET").trim().toUpperCase();
938
+ return normalized === "GET" || normalized === "HEAD" || normalized === "OPTIONS";
939
+ }
940
+ function shouldSurfaceTimeout(state) {
941
+ return (state.timeoutCount >= MAX_CONSECUTIVE_TIMEOUTS
942
+ || Date.now() - state.startedAtMs >= TIMEOUT_WARNING_THRESHOLD_MS);
943
+ }
944
+ function isOpenCodeSubmitTimeoutAmbiguous(error) {
945
+ return error instanceof Error && error.message === OPENCODE_SUBMIT_TIMEOUT_AMBIGUOUS;
946
+ }
947
+ function isTimestampOnOrAfter(timestamp, minTimestamp) {
948
+ const timestampMs = Date.parse(timestamp);
949
+ const minTimestampMs = Date.parse(minTimestamp);
950
+ if (!Number.isFinite(timestampMs) || !Number.isFinite(minTimestampMs)) {
951
+ return timestamp >= minTimestamp;
952
+ }
953
+ return timestampMs >= minTimestampMs;
954
+ }
955
+ function mapOpenCodeRuntimeErrorCode(error) {
956
+ if (!(error instanceof Error)) {
957
+ return "OPENCODE_RUNTIME_FAILED";
958
+ }
959
+ if (error.message === OPENCODE_SUBMIT_TIMEOUT_AMBIGUOUS) {
960
+ return OPENCODE_SUBMIT_TIMEOUT_AMBIGUOUS;
961
+ }
962
+ if (error.message === "SERVER_TIMEOUT") {
963
+ return "OPENCODE_REQUEST_TIMEOUT";
964
+ }
965
+ if (error.message === "SERVER_UNAVAILABLE") {
966
+ return "OPENCODE_SERVER_UNAVAILABLE";
967
+ }
968
+ return "OPENCODE_RUNTIME_FAILED";
969
+ }
970
+ //# sourceMappingURL=opencode-runtime.js.map