@jingyi0605/codingns 0.7.4 → 0.8.0

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