@jingyi0605/codingns 0.1.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 (405) hide show
  1. package/README.md +24 -0
  2. package/bin/codingns.mjs +173 -0
  3. package/dist/public/assets/TerminalPage-6GBZ9nXN.css +32 -0
  4. package/dist/public/assets/TerminalPage-Dj_VDew3.js +54 -0
  5. package/dist/public/assets/index-C1GZV2wq.js +106 -0
  6. package/dist/public/assets/index-DU7f8NaZ.css +1 -0
  7. package/dist/public/index.html +13 -0
  8. package/dist/public/logo.png +0 -0
  9. package/dist/public/logo.svg +162 -0
  10. package/dist/server/config/env.d.ts +24 -0
  11. package/dist/server/config/env.js +152 -0
  12. package/dist/server/config/env.js.map +1 -0
  13. package/dist/server/config/opencode-base-url-resolver.d.ts +37 -0
  14. package/dist/server/config/opencode-base-url-resolver.js +422 -0
  15. package/dist/server/config/opencode-base-url-resolver.js.map +1 -0
  16. package/dist/server/main.d.ts +1 -0
  17. package/dist/server/main.js +3 -0
  18. package/dist/server/main.js.map +1 -0
  19. package/dist/server/middlewares/auth-guard.d.ts +4 -0
  20. package/dist/server/middlewares/auth-guard.js +35 -0
  21. package/dist/server/middlewares/auth-guard.js.map +1 -0
  22. package/dist/server/modules/auth/auth-controller.d.ts +15 -0
  23. package/dist/server/modules/auth/auth-controller.js +20 -0
  24. package/dist/server/modules/auth/auth-controller.js.map +1 -0
  25. package/dist/server/modules/auth/auth-service.d.ts +44 -0
  26. package/dist/server/modules/auth/auth-service.js +151 -0
  27. package/dist/server/modules/auth/auth-service.js.map +1 -0
  28. package/dist/server/modules/bootstrap/bootstrap-controller.d.ts +10 -0
  29. package/dist/server/modules/bootstrap/bootstrap-controller.js +13 -0
  30. package/dist/server/modules/bootstrap/bootstrap-controller.js.map +1 -0
  31. package/dist/server/modules/bootstrap/bootstrap-service.d.ts +20 -0
  32. package/dist/server/modules/bootstrap/bootstrap-service.js +71 -0
  33. package/dist/server/modules/bootstrap/bootstrap-service.js.map +1 -0
  34. package/dist/server/modules/client/client-controller.d.ts +9 -0
  35. package/dist/server/modules/client/client-controller.js +65 -0
  36. package/dist/server/modules/client/client-controller.js.map +1 -0
  37. package/dist/server/modules/client/client-service.d.ts +37 -0
  38. package/dist/server/modules/client/client-service.js +186 -0
  39. package/dist/server/modules/client/client-service.js.map +1 -0
  40. package/dist/server/modules/file/file-access-guard.d.ts +27 -0
  41. package/dist/server/modules/file/file-access-guard.js +99 -0
  42. package/dist/server/modules/file/file-access-guard.js.map +1 -0
  43. package/dist/server/modules/file/file-constants.d.ts +6 -0
  44. package/dist/server/modules/file/file-constants.js +7 -0
  45. package/dist/server/modules/file/file-constants.js.map +1 -0
  46. package/dist/server/modules/file/file-content-service.d.ts +65 -0
  47. package/dist/server/modules/file/file-content-service.js +239 -0
  48. package/dist/server/modules/file/file-content-service.js.map +1 -0
  49. package/dist/server/modules/file/file-context-controller.d.ts +29 -0
  50. package/dist/server/modules/file/file-context-controller.js +52 -0
  51. package/dist/server/modules/file/file-context-controller.js.map +1 -0
  52. package/dist/server/modules/file/file-context-service.d.ts +22 -0
  53. package/dist/server/modules/file/file-context-service.js +90 -0
  54. package/dist/server/modules/file/file-context-service.js.map +1 -0
  55. package/dist/server/modules/file/file-controller.d.ts +68 -0
  56. package/dist/server/modules/file/file-controller.js +111 -0
  57. package/dist/server/modules/file/file-controller.js.map +1 -0
  58. package/dist/server/modules/file/file-preview-service.d.ts +19 -0
  59. package/dist/server/modules/file/file-preview-service.js +60 -0
  60. package/dist/server/modules/file/file-preview-service.js.map +1 -0
  61. package/dist/server/modules/file/file-search-service.d.ts +13 -0
  62. package/dist/server/modules/file/file-search-service.js +62 -0
  63. package/dist/server/modules/file/file-search-service.js.map +1 -0
  64. package/dist/server/modules/file/file-tree-service.d.ts +7 -0
  65. package/dist/server/modules/file/file-tree-service.js +43 -0
  66. package/dist/server/modules/file/file-tree-service.js.map +1 -0
  67. package/dist/server/modules/file/file-version-checker.d.ts +10 -0
  68. package/dist/server/modules/file/file-version-checker.js +30 -0
  69. package/dist/server/modules/file/file-version-checker.js.map +1 -0
  70. package/dist/server/modules/file/path-normalizer.d.ts +2 -0
  71. package/dist/server/modules/file/path-normalizer.js +80 -0
  72. package/dist/server/modules/file/path-normalizer.js.map +1 -0
  73. package/dist/server/modules/file/recent-file-service.d.ts +10 -0
  74. package/dist/server/modules/file/recent-file-service.js +28 -0
  75. package/dist/server/modules/file/recent-file-service.js.map +1 -0
  76. package/dist/server/modules/git/commit-draft-service.d.ts +7 -0
  77. package/dist/server/modules/git/commit-draft-service.js +76 -0
  78. package/dist/server/modules/git/commit-draft-service.js.map +1 -0
  79. package/dist/server/modules/git/commit-orchestrator.d.ts +28 -0
  80. package/dist/server/modules/git/commit-orchestrator.js +47 -0
  81. package/dist/server/modules/git/commit-orchestrator.js.map +1 -0
  82. package/dist/server/modules/git/commit-rule-engine.d.ts +5 -0
  83. package/dist/server/modules/git/commit-rule-engine.js +22 -0
  84. package/dist/server/modules/git/commit-rule-engine.js.map +1 -0
  85. package/dist/server/modules/git/git-command-runner.d.ts +16 -0
  86. package/dist/server/modules/git/git-command-runner.js +102 -0
  87. package/dist/server/modules/git/git-command-runner.js.map +1 -0
  88. package/dist/server/modules/git/git-controller.d.ts +104 -0
  89. package/dist/server/modules/git/git-controller.js +140 -0
  90. package/dist/server/modules/git/git-controller.js.map +1 -0
  91. package/dist/server/modules/git/git-read-service.d.ts +15 -0
  92. package/dist/server/modules/git/git-read-service.js +393 -0
  93. package/dist/server/modules/git/git-read-service.js.map +1 -0
  94. package/dist/server/modules/git/git-rule-repository.d.ts +9 -0
  95. package/dist/server/modules/git/git-rule-repository.js +43 -0
  96. package/dist/server/modules/git/git-rule-repository.js.map +1 -0
  97. package/dist/server/modules/git/git-write-service.d.ts +28 -0
  98. package/dist/server/modules/git/git-write-service.js +330 -0
  99. package/dist/server/modules/git/git-write-service.js.map +1 -0
  100. package/dist/server/modules/git/types.d.ts +99 -0
  101. package/dist/server/modules/git/types.js +2 -0
  102. package/dist/server/modules/git/types.js.map +1 -0
  103. package/dist/server/modules/git/workspace-repo-guard.d.ts +17 -0
  104. package/dist/server/modules/git/workspace-repo-guard.js +124 -0
  105. package/dist/server/modules/git/workspace-repo-guard.js.map +1 -0
  106. package/dist/server/modules/preferences/quick-phrase-controller.d.ts +17 -0
  107. package/dist/server/modules/preferences/quick-phrase-controller.js +37 -0
  108. package/dist/server/modules/preferences/quick-phrase-controller.js.map +1 -0
  109. package/dist/server/modules/preferences/quick-phrase-service.d.ts +13 -0
  110. package/dist/server/modules/preferences/quick-phrase-service.js +67 -0
  111. package/dist/server/modules/preferences/quick-phrase-service.js.map +1 -0
  112. package/dist/server/modules/provider/claude-model-options.d.ts +5 -0
  113. package/dist/server/modules/provider/claude-model-options.js +116 -0
  114. package/dist/server/modules/provider/claude-model-options.js.map +1 -0
  115. package/dist/server/modules/provider/codex-model-options.d.ts +23 -0
  116. package/dist/server/modules/provider/codex-model-options.js +308 -0
  117. package/dist/server/modules/provider/codex-model-options.js.map +1 -0
  118. package/dist/server/modules/provider/opencode-model-options.d.ts +30 -0
  119. package/dist/server/modules/provider/opencode-model-options.js +362 -0
  120. package/dist/server/modules/provider/opencode-model-options.js.map +1 -0
  121. package/dist/server/modules/provider/provider-controller.d.ts +33 -0
  122. package/dist/server/modules/provider/provider-controller.js +50 -0
  123. package/dist/server/modules/provider/provider-controller.js.map +1 -0
  124. package/dist/server/modules/sessions/session-activity-inspector.d.ts +10 -0
  125. package/dist/server/modules/sessions/session-activity-inspector.js +271 -0
  126. package/dist/server/modules/sessions/session-activity-inspector.js.map +1 -0
  127. package/dist/server/modules/sessions/session-changed-file-service.d.ts +14 -0
  128. package/dist/server/modules/sessions/session-changed-file-service.js +175 -0
  129. package/dist/server/modules/sessions/session-changed-file-service.js.map +1 -0
  130. package/dist/server/modules/sessions/session-controller.d.ts +134 -0
  131. package/dist/server/modules/sessions/session-controller.js +253 -0
  132. package/dist/server/modules/sessions/session-controller.js.map +1 -0
  133. package/dist/server/modules/sessions/session-history-service.d.ts +128 -0
  134. package/dist/server/modules/sessions/session-history-service.js +1558 -0
  135. package/dist/server/modules/sessions/session-history-service.js.map +1 -0
  136. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +191 -0
  137. package/dist/server/modules/sessions/session-live-runtime-service.js +1303 -0
  138. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -0
  139. package/dist/server/modules/sessions/session-message-attachment-service.d.ts +42 -0
  140. package/dist/server/modules/sessions/session-message-attachment-service.js +244 -0
  141. package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -0
  142. package/dist/server/modules/sessions/session-provider-error-mapper.d.ts +2 -0
  143. package/dist/server/modules/sessions/session-provider-error-mapper.js +101 -0
  144. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -0
  145. package/dist/server/modules/terminal/command-template-service.d.ts +48 -0
  146. package/dist/server/modules/terminal/command-template-service.js +273 -0
  147. package/dist/server/modules/terminal/command-template-service.js.map +1 -0
  148. package/dist/server/modules/terminal/runtime/adapters/embedded-pty-runtime-adapter.d.ts +22 -0
  149. package/dist/server/modules/terminal/runtime/adapters/embedded-pty-runtime-adapter.js +30 -0
  150. package/dist/server/modules/terminal/runtime/adapters/embedded-pty-runtime-adapter.js.map +1 -0
  151. package/dist/server/modules/terminal/runtime/adapters/tmux-runtime-adapter.d.ts +31 -0
  152. package/dist/server/modules/terminal/runtime/adapters/tmux-runtime-adapter.js +199 -0
  153. package/dist/server/modules/terminal/runtime/adapters/tmux-runtime-adapter.js.map +1 -0
  154. package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.d.ts +36 -0
  155. package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.js +141 -0
  156. package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.js.map +1 -0
  157. package/dist/server/modules/terminal/runtime/pty-runtime-manager.d.ts +29 -0
  158. package/dist/server/modules/terminal/runtime/pty-runtime-manager.js +138 -0
  159. package/dist/server/modules/terminal/runtime/pty-runtime-manager.js.map +1 -0
  160. package/dist/server/modules/terminal/runtime/terminal-log-file-store.d.ts +14 -0
  161. package/dist/server/modules/terminal/runtime/terminal-log-file-store.js +47 -0
  162. package/dist/server/modules/terminal/runtime/terminal-log-file-store.js.map +1 -0
  163. package/dist/server/modules/terminal/runtime/terminal-log-spooler.d.ts +28 -0
  164. package/dist/server/modules/terminal/runtime/terminal-log-spooler.js +162 -0
  165. package/dist/server/modules/terminal/runtime/terminal-log-spooler.js.map +1 -0
  166. package/dist/server/modules/terminal/runtime/terminal-output-buffer.d.ts +18 -0
  167. package/dist/server/modules/terminal/runtime/terminal-output-buffer.js +109 -0
  168. package/dist/server/modules/terminal/runtime/terminal-output-buffer.js.map +1 -0
  169. package/dist/server/modules/terminal/runtime/terminal-runtime-adapter.d.ts +34 -0
  170. package/dist/server/modules/terminal/runtime/terminal-runtime-adapter.js +2 -0
  171. package/dist/server/modules/terminal/runtime/terminal-runtime-adapter.js.map +1 -0
  172. package/dist/server/modules/terminal/runtime/terminal-runtime-manager.d.ts +41 -0
  173. package/dist/server/modules/terminal/runtime/terminal-runtime-manager.js +138 -0
  174. package/dist/server/modules/terminal/runtime/terminal-runtime-manager.js.map +1 -0
  175. package/dist/server/modules/terminal/template-port-runtime.d.ts +6 -0
  176. package/dist/server/modules/terminal/template-port-runtime.js +199 -0
  177. package/dist/server/modules/terminal/template-port-runtime.js.map +1 -0
  178. package/dist/server/modules/terminal/terminal-controller.d.ts +94 -0
  179. package/dist/server/modules/terminal/terminal-controller.js +236 -0
  180. package/dist/server/modules/terminal/terminal-controller.js.map +1 -0
  181. package/dist/server/modules/terminal/terminal-history.d.ts +18 -0
  182. package/dist/server/modules/terminal/terminal-history.js +2 -0
  183. package/dist/server/modules/terminal/terminal-history.js.map +1 -0
  184. package/dist/server/modules/terminal/terminal-paths.d.ts +1 -0
  185. package/dist/server/modules/terminal/terminal-paths.js +27 -0
  186. package/dist/server/modules/terminal/terminal-paths.js.map +1 -0
  187. package/dist/server/modules/terminal/terminal-service.d.ts +112 -0
  188. package/dist/server/modules/terminal/terminal-service.js +794 -0
  189. package/dist/server/modules/terminal/terminal-service.js.map +1 -0
  190. package/dist/server/modules/terminal/terminal-shell.d.ts +13 -0
  191. package/dist/server/modules/terminal/terminal-shell.js +293 -0
  192. package/dist/server/modules/terminal/terminal-shell.js.map +1 -0
  193. package/dist/server/modules/workbench/workbench-controller.d.ts +7 -0
  194. package/dist/server/modules/workbench/workbench-controller.js +22 -0
  195. package/dist/server/modules/workbench/workbench-controller.js.map +1 -0
  196. package/dist/server/modules/workbench/workbench-service.d.ts +19 -0
  197. package/dist/server/modules/workbench/workbench-service.js +46 -0
  198. package/dist/server/modules/workbench/workbench-service.js.map +1 -0
  199. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +65 -0
  200. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +176 -0
  201. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -0
  202. package/dist/server/modules/workspace/workspace-controller.d.ts +57 -0
  203. package/dist/server/modules/workspace/workspace-controller.js +38 -0
  204. package/dist/server/modules/workspace/workspace-controller.js.map +1 -0
  205. package/dist/server/modules/workspace/workspace-service.d.ts +81 -0
  206. package/dist/server/modules/workspace/workspace-service.js +659 -0
  207. package/dist/server/modules/workspace/workspace-service.js.map +1 -0
  208. package/dist/server/routes/auth.d.ts +3 -0
  209. package/dist/server/routes/auth.js +6 -0
  210. package/dist/server/routes/auth.js.map +1 -0
  211. package/dist/server/routes/client.d.ts +3 -0
  212. package/dist/server/routes/client.js +6 -0
  213. package/dist/server/routes/client.js.map +1 -0
  214. package/dist/server/routes/files.d.ts +3 -0
  215. package/dist/server/routes/files.js +15 -0
  216. package/dist/server/routes/files.js.map +1 -0
  217. package/dist/server/routes/git.d.ts +3 -0
  218. package/dist/server/routes/git.js +18 -0
  219. package/dist/server/routes/git.js.map +1 -0
  220. package/dist/server/routes/preferences.d.ts +3 -0
  221. package/dist/server/routes/preferences.js +5 -0
  222. package/dist/server/routes/preferences.js.map +1 -0
  223. package/dist/server/routes/providers.d.ts +3 -0
  224. package/dist/server/routes/providers.js +6 -0
  225. package/dist/server/routes/providers.js.map +1 -0
  226. package/dist/server/routes/public.d.ts +3 -0
  227. package/dist/server/routes/public.js +5 -0
  228. package/dist/server/routes/public.js.map +1 -0
  229. package/dist/server/routes/session-contexts.d.ts +3 -0
  230. package/dist/server/routes/session-contexts.js +6 -0
  231. package/dist/server/routes/session-contexts.js.map +1 -0
  232. package/dist/server/routes/sessions.d.ts +3 -0
  233. package/dist/server/routes/sessions.js +24 -0
  234. package/dist/server/routes/sessions.js.map +1 -0
  235. package/dist/server/routes/terminals.d.ts +3 -0
  236. package/dist/server/routes/terminals.js +17 -0
  237. package/dist/server/routes/terminals.js.map +1 -0
  238. package/dist/server/routes/workbench.d.ts +3 -0
  239. package/dist/server/routes/workbench.js +4 -0
  240. package/dist/server/routes/workbench.js.map +1 -0
  241. package/dist/server/routes/workspaces.d.ts +3 -0
  242. package/dist/server/routes/workspaces.js +10 -0
  243. package/dist/server/routes/workspaces.js.map +1 -0
  244. package/dist/server/server/create-server.d.ts +103 -0
  245. package/dist/server/server/create-server.js +259 -0
  246. package/dist/server/server/create-server.js.map +1 -0
  247. package/dist/server/server/start-host.d.ts +8 -0
  248. package/dist/server/server/start-host.js +40 -0
  249. package/dist/server/server/start-host.js.map +1 -0
  250. package/dist/server/server/static-web.d.ts +2 -0
  251. package/dist/server/server/static-web.js +75 -0
  252. package/dist/server/server/static-web.js.map +1 -0
  253. package/dist/server/shared/errors/app-error.d.ts +13 -0
  254. package/dist/server/shared/errors/app-error.js +16 -0
  255. package/dist/server/shared/errors/app-error.js.map +1 -0
  256. package/dist/server/shared/http/error-handler.d.ts +9 -0
  257. package/dist/server/shared/http/error-handler.js +25 -0
  258. package/dist/server/shared/http/error-handler.js.map +1 -0
  259. package/dist/server/shared/utils/hash.d.ts +4 -0
  260. package/dist/server/shared/utils/hash.js +27 -0
  261. package/dist/server/shared/utils/hash.js.map +1 -0
  262. package/dist/server/shared/utils/id.d.ts +1 -0
  263. package/dist/server/shared/utils/id.js +5 -0
  264. package/dist/server/shared/utils/id.js.map +1 -0
  265. package/dist/server/shared/utils/perf-log.d.ts +6 -0
  266. package/dist/server/shared/utils/perf-log.js +40 -0
  267. package/dist/server/shared/utils/perf-log.js.map +1 -0
  268. package/dist/server/shared/utils/time.d.ts +2 -0
  269. package/dist/server/shared/utils/time.js +7 -0
  270. package/dist/server/shared/utils/time.js.map +1 -0
  271. package/dist/server/shared/utils/tokens.d.ts +1 -0
  272. package/dist/server/shared/utils/tokens.js +5 -0
  273. package/dist/server/shared/utils/tokens.js.map +1 -0
  274. package/dist/server/storage/repositories/auth-token-repository.d.ts +9 -0
  275. package/dist/server/storage/repositories/auth-token-repository.js +45 -0
  276. package/dist/server/storage/repositories/auth-token-repository.js.map +1 -0
  277. package/dist/server/storage/repositories/auth-user-repository.d.ts +11 -0
  278. package/dist/server/storage/repositories/auth-user-repository.js +61 -0
  279. package/dist/server/storage/repositories/auth-user-repository.js.map +1 -0
  280. package/dist/server/storage/repositories/bootstrap-state-repository.d.ts +8 -0
  281. package/dist/server/storage/repositories/bootstrap-state-repository.js +29 -0
  282. package/dist/server/storage/repositories/bootstrap-state-repository.js.map +1 -0
  283. package/dist/server/storage/repositories/commit-rule-profile-repository.d.ts +8 -0
  284. package/dist/server/storage/repositories/commit-rule-profile-repository.js +48 -0
  285. package/dist/server/storage/repositories/commit-rule-profile-repository.js.map +1 -0
  286. package/dist/server/storage/repositories/file-context-binding-repository.d.ts +12 -0
  287. package/dist/server/storage/repositories/file-context-binding-repository.js +130 -0
  288. package/dist/server/storage/repositories/file-context-binding-repository.js.map +1 -0
  289. package/dist/server/storage/repositories/recent-file-repository.d.ts +10 -0
  290. package/dist/server/storage/repositories/recent-file-repository.js +64 -0
  291. package/dist/server/storage/repositories/recent-file-repository.js.map +1 -0
  292. package/dist/server/storage/repositories/session-binding-repository.d.ts +10 -0
  293. package/dist/server/storage/repositories/session-binding-repository.js +63 -0
  294. package/dist/server/storage/repositories/session-binding-repository.js.map +1 -0
  295. package/dist/server/storage/repositories/session-changed-file-repository.d.ts +11 -0
  296. package/dist/server/storage/repositories/session-changed-file-repository.js +94 -0
  297. package/dist/server/storage/repositories/session-changed-file-repository.js.map +1 -0
  298. package/dist/server/storage/repositories/session-index-repository.d.ts +11 -0
  299. package/dist/server/storage/repositories/session-index-repository.js +200 -0
  300. package/dist/server/storage/repositories/session-index-repository.js.map +1 -0
  301. package/dist/server/storage/repositories/session-message-attachment-repository.d.ts +13 -0
  302. package/dist/server/storage/repositories/session-message-attachment-repository.js +139 -0
  303. package/dist/server/storage/repositories/session-message-attachment-repository.js.map +1 -0
  304. package/dist/server/storage/repositories/session-send-queue-repository.d.ts +15 -0
  305. package/dist/server/storage/repositories/session-send-queue-repository.js +165 -0
  306. package/dist/server/storage/repositories/session-send-queue-repository.js.map +1 -0
  307. package/dist/server/storage/repositories/session-state-repository.d.ts +8 -0
  308. package/dist/server/storage/repositories/session-state-repository.js +60 -0
  309. package/dist/server/storage/repositories/session-state-repository.js.map +1 -0
  310. package/dist/server/storage/repositories/session-status-snapshot-repository.d.ts +8 -0
  311. package/dist/server/storage/repositories/session-status-snapshot-repository.js +49 -0
  312. package/dist/server/storage/repositories/session-status-snapshot-repository.js.map +1 -0
  313. package/dist/server/storage/repositories/terminal-command-template-repository.d.ts +11 -0
  314. package/dist/server/storage/repositories/terminal-command-template-repository.js +99 -0
  315. package/dist/server/storage/repositories/terminal-command-template-repository.js.map +1 -0
  316. package/dist/server/storage/repositories/terminal-instance-repository.d.ts +23 -0
  317. package/dist/server/storage/repositories/terminal-instance-repository.js +149 -0
  318. package/dist/server/storage/repositories/terminal-instance-repository.js.map +1 -0
  319. package/dist/server/storage/repositories/terminal-log-file-repository.d.ts +20 -0
  320. package/dist/server/storage/repositories/terminal-log-file-repository.js +106 -0
  321. package/dist/server/storage/repositories/terminal-log-file-repository.js.map +1 -0
  322. package/dist/server/storage/repositories/terminal-log-segment-repository.d.ts +11 -0
  323. package/dist/server/storage/repositories/terminal-log-segment-repository.js +110 -0
  324. package/dist/server/storage/repositories/terminal-log-segment-repository.js.map +1 -0
  325. package/dist/server/storage/repositories/terminal-runtime-session-repository.d.ts +24 -0
  326. package/dist/server/storage/repositories/terminal-runtime-session-repository.js +134 -0
  327. package/dist/server/storage/repositories/terminal-runtime-session-repository.js.map +1 -0
  328. package/dist/server/storage/repositories/user-quick-phrase-preference-repository.d.ts +8 -0
  329. package/dist/server/storage/repositories/user-quick-phrase-preference-repository.js +37 -0
  330. package/dist/server/storage/repositories/user-quick-phrase-preference-repository.js.map +1 -0
  331. package/dist/server/storage/repositories/workspace-repository.d.ts +16 -0
  332. package/dist/server/storage/repositories/workspace-repository.js +71 -0
  333. package/dist/server/storage/repositories/workspace-repository.js.map +1 -0
  334. package/dist/server/storage/sqlite/client.d.ts +6 -0
  335. package/dist/server/storage/sqlite/client.js +446 -0
  336. package/dist/server/storage/sqlite/client.js.map +1 -0
  337. package/dist/server/storage/sqlite/schema.sql +357 -0
  338. package/dist/server/types/domain.d.ts +306 -0
  339. package/dist/server/types/domain.js +2 -0
  340. package/dist/server/types/domain.js.map +1 -0
  341. package/dist/server/ws/terminal-ws-hub.d.ts +32 -0
  342. package/dist/server/ws/terminal-ws-hub.js +181 -0
  343. package/dist/server/ws/terminal-ws-hub.js.map +1 -0
  344. package/dist/server/ws/workbench-ws-hub.d.ts +30 -0
  345. package/dist/server/ws/workbench-ws-hub.js +480 -0
  346. package/dist/server/ws/workbench-ws-hub.js.map +1 -0
  347. package/dist/server/ws/ws-auth-guard.d.ts +7 -0
  348. package/dist/server/ws/ws-auth-guard.js +28 -0
  349. package/dist/server/ws/ws-auth-guard.js.map +1 -0
  350. package/dist/server/ws/ws-server.d.ts +11 -0
  351. package/dist/server/ws/ws-server.js +218 -0
  352. package/dist/server/ws/ws-server.js.map +1 -0
  353. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.d.ts +36 -0
  354. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js +213 -0
  355. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js.map +1 -0
  356. package/node_modules/@codingns/session-sync-core/dist/index.d.ts +12 -0
  357. package/node_modules/@codingns/session-sync-core/dist/index.js +13 -0
  358. package/node_modules/@codingns/session-sync-core/dist/index.js.map +1 -0
  359. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +30 -0
  360. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +567 -0
  361. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -0
  362. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +41 -0
  363. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +1365 -0
  364. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -0
  365. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.d.ts +41 -0
  366. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js +280 -0
  367. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js.map +1 -0
  368. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +53 -0
  369. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +745 -0
  370. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -0
  371. package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +25 -0
  372. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +284 -0
  373. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -0
  374. package/node_modules/@codingns/session-sync-core/dist/registry.d.ts +7 -0
  375. package/node_modules/@codingns/session-sync-core/dist/registry.js +22 -0
  376. package/node_modules/@codingns/session-sync-core/dist/registry.js.map +1 -0
  377. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.d.ts +18 -0
  378. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +236 -0
  379. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -0
  380. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.d.ts +21 -0
  381. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +732 -0
  382. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -0
  383. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.d.ts +1 -0
  384. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js +16 -0
  385. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js.map +1 -0
  386. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +26 -0
  387. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +892 -0
  388. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -0
  389. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.d.ts +31 -0
  390. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js +626 -0
  391. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js.map +1 -0
  392. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.d.ts +18 -0
  393. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +148 -0
  394. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -0
  395. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +141 -0
  396. package/node_modules/@codingns/session-sync-core/dist/runtime/types.js +2 -0
  397. package/node_modules/@codingns/session-sync-core/dist/runtime/types.js.map +1 -0
  398. package/node_modules/@codingns/session-sync-core/dist/services.d.ts +26 -0
  399. package/node_modules/@codingns/session-sync-core/dist/services.js +85 -0
  400. package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -0
  401. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +159 -0
  402. package/node_modules/@codingns/session-sync-core/dist/types.js +2 -0
  403. package/node_modules/@codingns/session-sync-core/dist/types.js.map +1 -0
  404. package/node_modules/@codingns/session-sync-core/package.json +25 -0
  405. package/package.json +34 -0
@@ -0,0 +1,745 @@
1
+ import { existsSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { DatabaseSync } from "node:sqlite";
5
+ import { ensureText, nextTimestamp, normalizeWorkspacePath, sliceHistory } from "./utils.js";
6
+ import { buildMessageRawRef, buildSessionRawStoreRef, firstValidNumber, normalizeOpenCodeMessageEnvelopes, parseSessionIdFromRawStoreRef, readInteger, toIsoTimestamp, toJsonRecord, workspaceMatches } from "./opencode-shared.js";
7
+ const DEFAULT_DATA_DIR = join(homedir(), ".local", "share", "opencode");
8
+ const DEFAULT_REQUEST_TIMEOUT_MS = 10_000;
9
+ const DEFAULT_POLL_INTERVAL_MS = 800;
10
+ const MIN_POLL_INTERVAL_MS = 200;
11
+ const DEFAULT_SERVER_PAGE_LIMIT = 100;
12
+ const TIMEOUT_WARNING_THRESHOLD_MS = 15_000;
13
+ const MAX_CONSECUTIVE_TIMEOUTS = 5;
14
+ export class OpenCodeAdapter {
15
+ options;
16
+ providerId = "opencode";
17
+ constructor(options = {}) {
18
+ this.options = options;
19
+ }
20
+ async detectSessions(workspacePath, options) {
21
+ const discovery = await this.detectSessionsDetailed(workspacePath, options);
22
+ return discovery.sessions;
23
+ }
24
+ async detectSessionsDetailed(workspacePath, options) {
25
+ const targetPath = normalizeWorkspacePath(workspacePath);
26
+ const knownSessions = (options?.knownSessions ?? []).filter((session) => session.provider === this.providerId &&
27
+ workspaceMatches(targetPath, normalizeWorkspacePath(session.workspacePath)));
28
+ const serverDiscovery = await this.tryDetectSessionsFromServer(targetPath, knownSessions);
29
+ if (serverDiscovery) {
30
+ return serverDiscovery;
31
+ }
32
+ const rows = this.withReadonlyDb((db) => {
33
+ return db.prepare(`SELECT
34
+ s.id AS id,
35
+ s.parent_id AS parent_id,
36
+ s.directory AS directory,
37
+ s.title AS title,
38
+ s.time_created AS time_created,
39
+ s.time_updated AS time_updated,
40
+ s.time_archived AS time_archived,
41
+ COALESCE(stats.message_count, 0) AS message_count,
42
+ stats.last_message_time_ms AS last_message_time_ms
43
+ FROM session s
44
+ LEFT JOIN (
45
+ SELECT
46
+ session_id,
47
+ COUNT(*) AS message_count,
48
+ MAX(COALESCE(time_updated, time_created)) AS last_message_time_ms
49
+ FROM message
50
+ GROUP BY session_id
51
+ ) AS stats
52
+ ON stats.session_id = s.id`).all();
53
+ });
54
+ return {
55
+ sessions: rows
56
+ .map((row) => this.normalizeSqliteSessionSummaryRow(row))
57
+ .filter((summary) => summary !== null)
58
+ .filter((summary) => workspaceMatches(targetPath, normalizeWorkspacePath(summary.workspacePath)))
59
+ .sort((left, right) => (right.lastMessageAt ?? "").localeCompare(left.lastMessageAt ?? "")),
60
+ isComplete: true
61
+ };
62
+ }
63
+ async readRecentSessionHistory(providerSessionId, rawStoreRef, _totalMessageCount, limit) {
64
+ return this.readSessionHistory(providerSessionId, rawStoreRef, null, limit, "backward");
65
+ }
66
+ async readSessionHistory(providerSessionId, rawStoreRef, cursor, limit, direction = "forward") {
67
+ const sessionId = this.resolveSessionId(providerSessionId, rawStoreRef);
68
+ const serverMessages = await this.tryReadSessionMessagesFromServer(sessionId);
69
+ const messages = serverMessages ?? this.readSessionMessagesFromSqlite(sessionId);
70
+ return sliceHistory(messages, cursor, limit, direction);
71
+ }
72
+ subscribeSession(providerSessionId, rawStoreRef, cursor, limit, onEvent) {
73
+ const sessionId = this.resolveSessionId(providerSessionId, rawStoreRef);
74
+ const pollIntervalMs = this.resolvePollIntervalMs();
75
+ const normalizedRawStoreRef = buildSessionRawStoreRef(sessionId);
76
+ let currentCursor = cursor;
77
+ let closed = false;
78
+ let inFlight = false;
79
+ const timer = setInterval(() => {
80
+ if (closed || inFlight) {
81
+ return;
82
+ }
83
+ inFlight = true;
84
+ void this.readSessionHistory(sessionId, normalizedRawStoreRef, currentCursor, limit, "forward")
85
+ .then(async (page) => {
86
+ if (page.messages.length === 0) {
87
+ return;
88
+ }
89
+ currentCursor = page.cursor;
90
+ await onEvent({
91
+ messages: page.messages,
92
+ cursor: page.cursor
93
+ });
94
+ })
95
+ .catch(() => {
96
+ return;
97
+ })
98
+ .finally(() => {
99
+ inFlight = false;
100
+ });
101
+ }, pollIntervalMs);
102
+ return {
103
+ close() {
104
+ closed = true;
105
+ clearInterval(timer);
106
+ }
107
+ };
108
+ }
109
+ async resumeSession(providerSessionId, rawStoreRef) {
110
+ const sessionId = this.resolveSessionId(providerSessionId, rawStoreRef);
111
+ if (!(await this.tryAssertSessionExistsOnServer(sessionId))) {
112
+ this.assertSessionExistsOnSqlite(sessionId);
113
+ }
114
+ return {
115
+ provider: this.providerId,
116
+ providerSessionId: sessionId,
117
+ resumedAt: nextTimestamp(),
118
+ rawStoreRef: buildSessionRawStoreRef(sessionId)
119
+ };
120
+ }
121
+ async startSession(workspacePath, options) {
122
+ const session = await this.createSessionOnServer(workspacePath);
123
+ if (options.initialPrompt?.trim()) {
124
+ await this.postTextPrompt(session.id, options.initialPrompt.trim());
125
+ }
126
+ const summary = await this.readSessionSummaryFromServer(session.id)
127
+ .catch(() => null);
128
+ const sessionSummary = summary ?? this.normalizeServerSessionSummary(session, new Map()) ?? {
129
+ provider: this.providerId,
130
+ providerSessionId: session.id,
131
+ title: ensureText(session.title).trim() || session.id,
132
+ workspacePath,
133
+ rawStoreRef: buildSessionRawStoreRef(session.id),
134
+ isArchived: false,
135
+ lastMessageAt: nextTimestamp(),
136
+ messageCount: options.initialPrompt?.trim() ? 1 : 0,
137
+ parentProviderSessionId: null,
138
+ isSubagent: false,
139
+ subagentLabel: null
140
+ };
141
+ return {
142
+ session: sessionSummary,
143
+ initialCursor: null
144
+ };
145
+ }
146
+ async sendMessage(providerSessionId, rawStoreRef, content, clientRequestId) {
147
+ const sessionId = this.resolveSessionId(providerSessionId, rawStoreRef);
148
+ const trimmed = content.trim();
149
+ if (!trimmed) {
150
+ throw new Error("INVALID_INPUT");
151
+ }
152
+ const acceptedAt = nextTimestamp();
153
+ await this.postTextPrompt(sessionId, trimmed);
154
+ const message = await this.findAcceptedUserMessage(sessionId, trimmed)
155
+ ?? buildSyntheticAcceptedMessage(sessionId, trimmed, acceptedAt);
156
+ return {
157
+ acceptedAt,
158
+ clientRequestId,
159
+ message
160
+ };
161
+ }
162
+ async readSessionTitle(providerSessionId, rawStoreRef) {
163
+ const sessionId = this.resolveSessionId(providerSessionId, rawStoreRef);
164
+ const serverTitle = await this.tryReadSessionTitleFromServer(sessionId);
165
+ if (serverTitle) {
166
+ return serverTitle;
167
+ }
168
+ const row = this.withReadonlyDb((db) => {
169
+ return db.prepare(`SELECT title FROM session WHERE id = ? LIMIT 1`).get(sessionId);
170
+ });
171
+ if (!row) {
172
+ throw new Error("PROVIDER_SESSION_NOT_FOUND");
173
+ }
174
+ const title = ensureText(row.title).trim();
175
+ return title || sessionId;
176
+ }
177
+ async renameSessionTitle(providerSessionId, rawStoreRef, title) {
178
+ const sessionId = this.resolveSessionId(providerSessionId, rawStoreRef);
179
+ const nextTitle = title.trim();
180
+ if (!nextTitle) {
181
+ throw new Error("INVALID_INPUT");
182
+ }
183
+ const response = await this.fetchJson(`/session/${encodeURIComponent(sessionId)}`, {
184
+ method: "PATCH",
185
+ headers: {
186
+ "content-type": "application/json"
187
+ },
188
+ body: JSON.stringify({
189
+ title: nextTitle
190
+ })
191
+ });
192
+ return ensureText(response.data.title).trim() || nextTitle;
193
+ }
194
+ async updateSessionArchiveState(_providerSessionId, _rawStoreRef, _isArchived) {
195
+ throw new Error("OPENCODE_ARCHIVE_NOT_SUPPORTED");
196
+ }
197
+ getProviderCapabilities() {
198
+ return {
199
+ provider: this.providerId,
200
+ canStartSession: true,
201
+ canResumeSession: true,
202
+ canSendMessage: true,
203
+ inRunInputMode: "none",
204
+ supportsSubagents: true,
205
+ supportsInterrupt: true,
206
+ supportsStructuredToolCalls: true,
207
+ supportsTokenUsage: false,
208
+ supportsAttachments: false,
209
+ supportsPermissionPrompt: false,
210
+ supportsCheckpoint: false,
211
+ supportsTodo: true,
212
+ supportsSessionDiff: true,
213
+ supportsPermissionRequests: true,
214
+ supportsSessionFork: true,
215
+ supportsSessionShare: true,
216
+ supportsAsyncPrompt: true,
217
+ supportsNativeAgents: true,
218
+ limitations: [
219
+ "当前 OpenCode 先以 server 为主链路;server 不可达时只对历史读取做 sqlite 只读兜底。",
220
+ "附件上传、权限回复和分享管理还没有接到当前 UI。"
221
+ ]
222
+ };
223
+ }
224
+ async getSessionCapabilities() {
225
+ return this.getProviderCapabilities();
226
+ }
227
+ async tryDetectSessionsFromServer(targetPath, knownSessions) {
228
+ try {
229
+ const response = await this.fetchJson("/session", {
230
+ query: {
231
+ directory: targetPath || undefined,
232
+ roots: "true"
233
+ }
234
+ });
235
+ const ids = response.data
236
+ .map((session) => ensureText(session.id).trim())
237
+ .filter((value) => value.length > 0);
238
+ const metadata = this.readSessionMetadata(ids);
239
+ const serverSessions = response.data
240
+ .map((session) => this.normalizeServerSessionSummary(session, metadata))
241
+ .filter((summary) => summary !== null)
242
+ .filter((summary) => workspaceMatches(targetPath, normalizeWorkspacePath(summary.workspacePath)))
243
+ .sort((left, right) => (right.lastMessageAt ?? "").localeCompare(left.lastMessageAt ?? ""));
244
+ const mergedSessions = new Map(serverSessions.map((session) => [session.providerSessionId, session]));
245
+ const missingKnownSessions = knownSessions.filter((session) => !mergedSessions.has(session.providerSessionId));
246
+ let isComplete = true;
247
+ if (missingKnownSessions.length > 0) {
248
+ const recoveredSessions = this.readSessionSummariesByIds(missingKnownSessions.map((session) => session.providerSessionId), targetPath);
249
+ if (recoveredSessions === null) {
250
+ isComplete = false;
251
+ }
252
+ else if (recoveredSessions.length > 0) {
253
+ isComplete = false;
254
+ for (const session of recoveredSessions) {
255
+ if (!mergedSessions.has(session.providerSessionId)) {
256
+ mergedSessions.set(session.providerSessionId, session);
257
+ }
258
+ }
259
+ }
260
+ }
261
+ return {
262
+ sessions: [...mergedSessions.values()].sort((left, right) => (right.lastMessageAt ?? "").localeCompare(left.lastMessageAt ?? "")),
263
+ isComplete
264
+ };
265
+ }
266
+ catch (error) {
267
+ if (isServerUnavailableError(error)) {
268
+ return null;
269
+ }
270
+ throw error;
271
+ }
272
+ }
273
+ async tryReadSessionMessagesFromServer(sessionId) {
274
+ try {
275
+ return await this.readSessionMessagesFromServer(sessionId);
276
+ }
277
+ catch (error) {
278
+ if (isServerUnavailableError(error)) {
279
+ return null;
280
+ }
281
+ throw error;
282
+ }
283
+ }
284
+ async readSessionMessagesFromServer(sessionId) {
285
+ const envelopes = [];
286
+ let before = null;
287
+ while (true) {
288
+ const response = await this.fetchJson(`/session/${encodeURIComponent(sessionId)}/message`, {
289
+ query: {
290
+ limit: String(DEFAULT_SERVER_PAGE_LIMIT),
291
+ before: before ?? undefined
292
+ }
293
+ });
294
+ envelopes.push(...response.data);
295
+ const nextCursor = response.headers.get("x-next-cursor");
296
+ if (!nextCursor) {
297
+ break;
298
+ }
299
+ before = nextCursor;
300
+ }
301
+ return normalizeOpenCodeMessageEnvelopes(sessionId, sessionId, envelopes);
302
+ }
303
+ async createSessionOnServer(workspacePath) {
304
+ const response = await this.fetchJson("/session", {
305
+ method: "POST",
306
+ headers: {
307
+ "content-type": "application/json"
308
+ },
309
+ query: {
310
+ directory: workspacePath
311
+ },
312
+ body: JSON.stringify({})
313
+ });
314
+ const sessionId = ensureText(response.data.id).trim();
315
+ if (!sessionId) {
316
+ throw new Error("PROVIDER_SESSION_ID_REQUIRED");
317
+ }
318
+ return {
319
+ id: sessionId,
320
+ title: response.data.title
321
+ };
322
+ }
323
+ async postTextPrompt(sessionId, text) {
324
+ await this.fetchJson(`/session/${encodeURIComponent(sessionId)}/message`, {
325
+ method: "POST",
326
+ headers: {
327
+ "content-type": "application/json"
328
+ },
329
+ body: JSON.stringify({
330
+ parts: [
331
+ {
332
+ type: "text",
333
+ text
334
+ }
335
+ ]
336
+ })
337
+ });
338
+ }
339
+ async findAcceptedUserMessage(sessionId, content) {
340
+ try {
341
+ const response = await this.fetchJson(`/session/${encodeURIComponent(sessionId)}/message`, {
342
+ query: {
343
+ limit: "20"
344
+ }
345
+ });
346
+ const messages = normalizeOpenCodeMessageEnvelopes(sessionId, sessionId, response.data.reverse());
347
+ const trimmed = content.trim();
348
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
349
+ const message = messages[index];
350
+ if (message?.role === "user"
351
+ && message.content.trim() === trimmed) {
352
+ return message;
353
+ }
354
+ }
355
+ return null;
356
+ }
357
+ catch {
358
+ return null;
359
+ }
360
+ }
361
+ async readSessionSummaryFromServer(sessionId) {
362
+ const response = await this.fetchJson(`/session/${encodeURIComponent(sessionId)}`);
363
+ const metadata = this.readSessionMetadata([sessionId]);
364
+ return this.normalizeServerSessionSummary(response.data, metadata);
365
+ }
366
+ async tryReadSessionTitleFromServer(sessionId) {
367
+ try {
368
+ const response = await this.fetchJson(`/session/${encodeURIComponent(sessionId)}`);
369
+ const title = ensureText(response.data.title).trim();
370
+ return title || sessionId;
371
+ }
372
+ catch (error) {
373
+ if (isServerUnavailableError(error)) {
374
+ return null;
375
+ }
376
+ throw error;
377
+ }
378
+ }
379
+ async tryAssertSessionExistsOnServer(sessionId) {
380
+ try {
381
+ await this.fetchJson(`/session/${encodeURIComponent(sessionId)}`);
382
+ return true;
383
+ }
384
+ catch (error) {
385
+ if (isServerUnavailableError(error)) {
386
+ return false;
387
+ }
388
+ if (error instanceof Error && error.message === "PROVIDER_SESSION_NOT_FOUND") {
389
+ throw error;
390
+ }
391
+ throw error;
392
+ }
393
+ }
394
+ async resolveBaseUrl(refresh = false) {
395
+ const resolved = this.options.baseUrlResolver
396
+ ? await this.options.baseUrlResolver({ refresh })
397
+ : this.options.baseUrl?.trim();
398
+ if (!resolved) {
399
+ throw new Error("SERVER_UNAVAILABLE");
400
+ }
401
+ return resolved.trim().replace(/\/+$/, "");
402
+ }
403
+ resolveDbPath() {
404
+ const configuredPath = this.options.dbPath?.trim();
405
+ if (configuredPath) {
406
+ return configuredPath;
407
+ }
408
+ const dataDir = this.options.dataDir?.trim() || DEFAULT_DATA_DIR;
409
+ return join(dataDir, "opencode.db");
410
+ }
411
+ resolvePollIntervalMs() {
412
+ const configured = this.options.pollIntervalMs;
413
+ if (!Number.isFinite(configured)) {
414
+ return DEFAULT_POLL_INTERVAL_MS;
415
+ }
416
+ return Math.max(MIN_POLL_INTERVAL_MS, Math.floor(configured));
417
+ }
418
+ resolveRequestTimeoutMs() {
419
+ const configured = this.options.requestTimeoutMs;
420
+ if (!Number.isFinite(configured)) {
421
+ return DEFAULT_REQUEST_TIMEOUT_MS;
422
+ }
423
+ return Math.max(1_000, Math.floor(configured));
424
+ }
425
+ async fetchJson(pathname, input = {}) {
426
+ return this.fetchJsonWithRetry(pathname, input, false);
427
+ }
428
+ async fetchJsonWithRetry(pathname, input, refresh, timeoutState = createTimeoutRetryState()) {
429
+ const url = new URL(pathname, `${await this.resolveBaseUrl(refresh)}/`);
430
+ if (input.query) {
431
+ for (const [key, value] of Object.entries(input.query)) {
432
+ if (value) {
433
+ url.searchParams.set(key, value);
434
+ }
435
+ }
436
+ }
437
+ const controller = new AbortController();
438
+ const timer = setTimeout(() => {
439
+ controller.abort();
440
+ }, this.resolveRequestTimeoutMs());
441
+ let response;
442
+ try {
443
+ response = await fetch(url, {
444
+ method: input.method ?? "GET",
445
+ headers: input.headers,
446
+ body: input.body,
447
+ signal: controller.signal
448
+ });
449
+ }
450
+ catch (error) {
451
+ clearTimeout(timer);
452
+ if (error instanceof Error && error.name === "AbortError") {
453
+ const nextTimeoutState = advanceTimeoutRetryState(timeoutState);
454
+ if (!shouldSurfaceTimeout(nextTimeoutState)) {
455
+ if (!refresh && this.options.baseUrlResolver) {
456
+ return this.fetchJsonWithRetry(pathname, input, true, nextTimeoutState);
457
+ }
458
+ return this.fetchJsonWithRetry(pathname, input, refresh, nextTimeoutState);
459
+ }
460
+ throw new Error("SERVER_TIMEOUT");
461
+ }
462
+ if (!refresh && this.options.baseUrlResolver) {
463
+ return this.fetchJsonWithRetry(pathname, input, true, timeoutState);
464
+ }
465
+ throw new Error("SERVER_UNAVAILABLE");
466
+ }
467
+ clearTimeout(timer);
468
+ if (!response.ok) {
469
+ const detail = await safeReadResponseText(response);
470
+ const mapped = mapOpenCodeHttpError(response.status, detail);
471
+ if (!refresh && isServerUnavailableError(mapped) && this.options.baseUrlResolver) {
472
+ return this.fetchJsonWithRetry(pathname, input, true);
473
+ }
474
+ throw mapped;
475
+ }
476
+ const text = await response.text();
477
+ return {
478
+ data: text.length > 0 ? JSON.parse(text) : undefined,
479
+ headers: response.headers
480
+ };
481
+ }
482
+ withReadonlyDb(run) {
483
+ const dbPath = this.resolveDbPath();
484
+ if (!existsSync(dbPath)) {
485
+ throw new Error("OPENCODE_DB_NOT_FOUND");
486
+ }
487
+ let db = null;
488
+ try {
489
+ db = new DatabaseSync(dbPath, { open: true, readOnly: true });
490
+ return run(db);
491
+ }
492
+ finally {
493
+ db?.close();
494
+ }
495
+ }
496
+ resolveSessionId(providerSessionId, rawStoreRef) {
497
+ const explicit = providerSessionId.trim();
498
+ if (explicit.length > 0) {
499
+ return explicit;
500
+ }
501
+ const parsed = parseSessionIdFromRawStoreRef(rawStoreRef);
502
+ if (parsed) {
503
+ return parsed;
504
+ }
505
+ throw new Error("PROVIDER_SESSION_ID_REQUIRED");
506
+ }
507
+ assertSessionExistsOnSqlite(sessionId) {
508
+ const row = this.withReadonlyDb((db) => {
509
+ return db.prepare(`SELECT EXISTS(SELECT 1 FROM session WHERE id = ?) AS session_exists`).get(sessionId);
510
+ });
511
+ const exists = readInteger(row?.session_exists);
512
+ if (exists !== 1) {
513
+ throw new Error("PROVIDER_SESSION_NOT_FOUND");
514
+ }
515
+ }
516
+ normalizeSqliteSessionSummaryRow(row) {
517
+ const sessionId = ensureText(row.id).trim();
518
+ if (!sessionId) {
519
+ return null;
520
+ }
521
+ const workspacePath = ensureText(row.directory).trim();
522
+ const summaryUpdatedAtMs = firstValidNumber(row.last_message_time_ms, row.time_updated, row.time_created);
523
+ const lastMessageAt = toIsoTimestamp(summaryUpdatedAtMs, null);
524
+ const title = ensureText(row.title).trim() || sessionId;
525
+ const parentProviderSessionId = ensureText(row.parent_id).trim() || null;
526
+ const isArchived = row.time_archived !== null && row.time_archived !== undefined;
527
+ return {
528
+ provider: this.providerId,
529
+ providerSessionId: sessionId,
530
+ title,
531
+ workspacePath,
532
+ rawStoreRef: buildSessionRawStoreRef(sessionId),
533
+ isArchived,
534
+ lastMessageAt,
535
+ messageCount: Math.max(0, readInteger(row.message_count) ?? 0),
536
+ parentProviderSessionId,
537
+ isSubagent: Boolean(parentProviderSessionId),
538
+ subagentLabel: null
539
+ };
540
+ }
541
+ normalizeServerSessionSummary(session, metadataById) {
542
+ const sessionId = ensureText(session.id).trim();
543
+ if (!sessionId) {
544
+ return null;
545
+ }
546
+ const metadata = metadataById.get(sessionId);
547
+ const time = toJsonRecord(session.time);
548
+ const summaryUpdatedAtMs = firstValidNumber(time?.updated, time?.created);
549
+ const parentProviderSessionId = ensureText(session.parentID).trim()
550
+ || ensureText(session.parent_id).trim()
551
+ || metadata?.parentProviderSessionId
552
+ || null;
553
+ const workspacePath = ensureText(session.directory).trim();
554
+ return {
555
+ provider: this.providerId,
556
+ providerSessionId: sessionId,
557
+ title: ensureText(session.title).trim() || sessionId,
558
+ workspacePath,
559
+ rawStoreRef: buildSessionRawStoreRef(sessionId),
560
+ isArchived: metadata?.isArchived ?? false,
561
+ lastMessageAt: toIsoTimestamp(summaryUpdatedAtMs, null),
562
+ messageCount: metadata?.messageCount ?? 0,
563
+ parentProviderSessionId,
564
+ isSubagent: Boolean(parentProviderSessionId),
565
+ subagentLabel: null
566
+ };
567
+ }
568
+ readSessionMetadata(sessionIds) {
569
+ if (sessionIds.length === 0 || !existsSync(this.resolveDbPath())) {
570
+ return new Map();
571
+ }
572
+ return this.withReadonlyDb((db) => {
573
+ const placeholders = sessionIds.map(() => "?").join(", ");
574
+ const rows = db.prepare(`SELECT
575
+ s.id AS id,
576
+ s.parent_id AS parent_id,
577
+ s.time_archived AS time_archived,
578
+ COALESCE(stats.message_count, 0) AS message_count
579
+ FROM session s
580
+ LEFT JOIN (
581
+ SELECT session_id, COUNT(*) AS message_count
582
+ FROM message
583
+ GROUP BY session_id
584
+ ) AS stats
585
+ ON stats.session_id = s.id
586
+ WHERE s.id IN (${placeholders})`).all(...sessionIds);
587
+ return new Map(rows
588
+ .map((row) => {
589
+ const sessionId = ensureText(row.id).trim();
590
+ if (!sessionId) {
591
+ return null;
592
+ }
593
+ return [
594
+ sessionId,
595
+ {
596
+ parentProviderSessionId: ensureText(row.parent_id).trim() || null,
597
+ isArchived: row.time_archived !== null && row.time_archived !== undefined,
598
+ messageCount: Math.max(0, readInteger(row.message_count) ?? 0)
599
+ }
600
+ ];
601
+ })
602
+ .filter((entry) => entry !== null));
603
+ });
604
+ }
605
+ readSessionSummariesByIds(sessionIds, targetPath) {
606
+ if (sessionIds.length === 0) {
607
+ return [];
608
+ }
609
+ if (!existsSync(this.resolveDbPath())) {
610
+ return null;
611
+ }
612
+ return this.withReadonlyDb((db) => {
613
+ const placeholders = sessionIds.map(() => "?").join(", ");
614
+ const rows = db.prepare(`SELECT
615
+ s.id AS id,
616
+ s.parent_id AS parent_id,
617
+ s.directory AS directory,
618
+ s.title AS title,
619
+ s.time_created AS time_created,
620
+ s.time_updated AS time_updated,
621
+ s.time_archived AS time_archived,
622
+ COALESCE(stats.message_count, 0) AS message_count,
623
+ stats.last_message_time_ms AS last_message_time_ms
624
+ FROM session s
625
+ LEFT JOIN (
626
+ SELECT
627
+ session_id,
628
+ COUNT(*) AS message_count,
629
+ MAX(COALESCE(time_updated, time_created)) AS last_message_time_ms
630
+ FROM message
631
+ GROUP BY session_id
632
+ ) AS stats
633
+ ON stats.session_id = s.id
634
+ WHERE s.id IN (${placeholders})`).all(...sessionIds);
635
+ return rows
636
+ .map((row) => this.normalizeSqliteSessionSummaryRow(row))
637
+ .filter((summary) => summary !== null)
638
+ .filter((summary) => workspaceMatches(targetPath, normalizeWorkspacePath(summary.workspacePath)));
639
+ });
640
+ }
641
+ readSessionMessagesFromSqlite(sessionId) {
642
+ this.assertSessionExistsOnSqlite(sessionId);
643
+ const rows = this.withReadonlyDb((db) => {
644
+ return db.prepare(`SELECT
645
+ p.id AS part_id,
646
+ p.message_id AS message_id,
647
+ p.time_created AS part_time_created,
648
+ p.data AS part_data,
649
+ m.time_created AS message_time_created,
650
+ m.data AS message_data
651
+ FROM part p
652
+ INNER JOIN message m
653
+ ON m.id = p.message_id
654
+ WHERE p.session_id = ?
655
+ ORDER BY p.time_created ASC, p.rowid ASC`).all(sessionId);
656
+ });
657
+ const envelopes = rows.reduce((map, row) => {
658
+ const messageId = ensureText(row.message_id).trim();
659
+ const partId = ensureText(row.part_id).trim();
660
+ const messagePayload = toJsonRecord(row.message_data);
661
+ const partPayload = toJsonRecord(row.part_data);
662
+ if (!messageId || !partId || !messagePayload || !partPayload) {
663
+ return map;
664
+ }
665
+ const existing = map.get(messageId) ?? {
666
+ info: {
667
+ ...messagePayload,
668
+ id: messageId,
669
+ sessionID: sessionId,
670
+ time: {
671
+ ...(toJsonRecord(messagePayload.time) ?? {}),
672
+ created: firstValidNumber(row.message_time_created) ?? undefined
673
+ }
674
+ },
675
+ parts: []
676
+ };
677
+ const parts = Array.isArray(existing.parts) ? existing.parts : [];
678
+ parts.push({
679
+ ...partPayload,
680
+ id: partId,
681
+ sessionID: sessionId,
682
+ messageID: messageId
683
+ });
684
+ existing.parts = parts;
685
+ map.set(messageId, existing);
686
+ return map;
687
+ }, new Map());
688
+ return normalizeOpenCodeMessageEnvelopes(sessionId, sessionId, [...envelopes.values()]);
689
+ }
690
+ }
691
+ function buildSyntheticAcceptedMessage(sessionId, content, timestamp) {
692
+ const rawRef = `${buildMessageRawRef(sessionId, `accepted-${Date.parse(timestamp)}`)}#synthetic`;
693
+ return {
694
+ messageId: `opencode-accepted-${Date.parse(timestamp)}`,
695
+ provider: "opencode",
696
+ providerSessionId: sessionId,
697
+ role: "user",
698
+ kind: "text",
699
+ content,
700
+ toolCall: null,
701
+ timestamp,
702
+ sequence: 1,
703
+ rawRef
704
+ };
705
+ }
706
+ function mapOpenCodeHttpError(statusCode, detail) {
707
+ if (statusCode === 404) {
708
+ return new Error("PROVIDER_SESSION_NOT_FOUND");
709
+ }
710
+ if (statusCode >= 500) {
711
+ return new Error("SERVER_UNAVAILABLE");
712
+ }
713
+ if (statusCode === 409 && /active|running|busy/i.test(detail)) {
714
+ return new Error("ACTIVE_RUN_EXISTS");
715
+ }
716
+ return new Error(detail || `OPENCODE_HTTP_${statusCode}`);
717
+ }
718
+ async function safeReadResponseText(response) {
719
+ try {
720
+ return (await response.text()).trim();
721
+ }
722
+ catch {
723
+ return "";
724
+ }
725
+ }
726
+ function isServerUnavailableError(error) {
727
+ return error instanceof Error && error.message === "SERVER_UNAVAILABLE";
728
+ }
729
+ function createTimeoutRetryState() {
730
+ return {
731
+ startedAtMs: Date.now(),
732
+ timeoutCount: 0
733
+ };
734
+ }
735
+ function advanceTimeoutRetryState(state) {
736
+ return {
737
+ startedAtMs: state.startedAtMs,
738
+ timeoutCount: state.timeoutCount + 1
739
+ };
740
+ }
741
+ function shouldSurfaceTimeout(state) {
742
+ return (state.timeoutCount >= MAX_CONSECUTIVE_TIMEOUTS
743
+ || Date.now() - state.startedAtMs >= TIMEOUT_WARNING_THRESHOLD_MS);
744
+ }
745
+ //# sourceMappingURL=opencode.js.map