@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,732 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { accessSync, constants, existsSync, readdirSync, statSync, writeFileSync } from "node:fs";
3
+ import { delimiter, dirname, isAbsolute, join, sep } from "node:path";
4
+ import { spawn } from "node:child_process";
5
+ import { buildClaudeStableRawRef, normalizeClaudeMessagePart, normalizeClaudeMessageParts, readClaudeMessageId, toClaudeRecord } from "../claude-message-utils.js";
6
+ import { ensureDirectory, ensureText, nextTimestamp, safeDate, stringifyStructuredValue, workspaceSlug } from "../providers/utils.js";
7
+ /**
8
+ * Claude 真实运行时:通过 claude.cmd 流式读取事件,而不是伪造写文件。
9
+ */
10
+ export class ClaudeRuntimeAdapter {
11
+ options;
12
+ providerId = "claude-code";
13
+ commandPath;
14
+ constructor(options) {
15
+ this.options = options;
16
+ this.commandPath = resolveClaudeCommand(options.commandPath);
17
+ }
18
+ async startSession(request, sink) {
19
+ const providerSessionId = request.providerSessionId ?? buildPendingClaudeSessionId(request.sessionId);
20
+ const rawStoreRef = buildClaudePendingRawStoreRef(this.options.homeDir, request.workspacePath, request.sessionId);
21
+ sink.updateSessionBinding({
22
+ providerSessionId,
23
+ rawStoreRef
24
+ });
25
+ return this.launchClaude(request, sink, providerSessionId, rawStoreRef, []);
26
+ }
27
+ async continueSession(request, sink) {
28
+ const providerSessionId = ensureNonEmpty(request.providerSessionId, "CLAUDE_PROVIDER_SESSION_ID_REQUIRED");
29
+ const rawStoreRef = findClaudeSessionFile(this.options.homeDir, providerSessionId) ??
30
+ request.rawStoreRef ??
31
+ buildClaudeRawStoreRef(this.options.homeDir, request.workspacePath, providerSessionId);
32
+ sink.updateSessionBinding({
33
+ providerSessionId,
34
+ rawStoreRef
35
+ });
36
+ return this.launchClaude(request, sink, providerSessionId, rawStoreRef, ["--resume", providerSessionId]);
37
+ }
38
+ launchClaude(request, sink, providerSessionId, rawStoreRef, sessionArgs) {
39
+ const attachmentDirectories = Array.from(new Set(request.options.attachments.map((attachment) => dirname(attachment.filePath))));
40
+ const args = [
41
+ "-p",
42
+ "--verbose",
43
+ "--output-format",
44
+ "stream-json",
45
+ "--input-format",
46
+ "stream-json",
47
+ "--include-partial-messages",
48
+ ...attachmentDirectories.flatMap((directory) => ["--add-dir", directory]),
49
+ ...sessionArgs
50
+ ];
51
+ const permissionArgs = buildClaudePermissionArgs(request.options.permissionMode);
52
+ if (permissionArgs.length > 0) {
53
+ args.push(...permissionArgs);
54
+ }
55
+ if (request.options.model) {
56
+ args.push("--model", request.options.model);
57
+ }
58
+ let sequence = 0;
59
+ const toolNameById = new Map();
60
+ const stableMessageRefByIdentity = new Map();
61
+ const streamEventState = {
62
+ currentMessageKey: null,
63
+ messages: new Map()
64
+ };
65
+ let interrupted = false;
66
+ let completed = false;
67
+ let fatalWriteError = null;
68
+ let fatalWriteErrorCode = null;
69
+ let stderrBuffer = "";
70
+ let stdoutBuffer = "";
71
+ let stdinClosed = false;
72
+ let activeProviderSessionId = providerSessionId;
73
+ let activeRawStoreRef = rawStoreRef;
74
+ const refreshBinding = (parsed) => {
75
+ const discoveredProviderSessionId = extractClaudeSessionId(parsed);
76
+ let changed = false;
77
+ if (discoveredProviderSessionId &&
78
+ discoveredProviderSessionId !== activeProviderSessionId &&
79
+ !isPendingClaudeSessionId(discoveredProviderSessionId)) {
80
+ activeProviderSessionId = discoveredProviderSessionId;
81
+ changed = true;
82
+ }
83
+ if (!isPendingClaudeSessionId(activeProviderSessionId)) {
84
+ const nextRawStoreRef = findClaudeSessionFile(this.options.homeDir, activeProviderSessionId) ??
85
+ buildClaudeRawStoreRef(this.options.homeDir, request.workspacePath, activeProviderSessionId);
86
+ if (nextRawStoreRef !== activeRawStoreRef) {
87
+ activeRawStoreRef = nextRawStoreRef;
88
+ this.ensureRuntimeStoreReady(activeRawStoreRef);
89
+ changed = true;
90
+ }
91
+ }
92
+ if (changed) {
93
+ sink.updateSessionBinding({
94
+ providerSessionId: activeProviderSessionId,
95
+ rawStoreRef: activeRawStoreRef
96
+ });
97
+ }
98
+ return {
99
+ providerSessionId: activeProviderSessionId,
100
+ rawStoreRef: activeRawStoreRef
101
+ };
102
+ };
103
+ this.ensureRuntimeStoreReady(activeRawStoreRef);
104
+ const proc = spawn(this.commandPath, args, {
105
+ cwd: request.workspacePath,
106
+ shell: shouldSpawnClaudeViaShell(this.commandPath),
107
+ windowsHide: true,
108
+ stdio: ["pipe", "pipe", "pipe"]
109
+ });
110
+ let pendingInputWrite = Promise.resolve();
111
+ const submitDuringRun = (options) => {
112
+ pendingInputWrite = pendingInputWrite.then(() => writeClaudeStreamingInput(proc, options, completed || interrupted || stdinClosed));
113
+ return pendingInputWrite;
114
+ };
115
+ const bindingRefreshTimer = setInterval(() => {
116
+ refreshBinding();
117
+ }, 250);
118
+ void submitDuringRun(request.options).catch((error) => {
119
+ if (completed || interrupted) {
120
+ return;
121
+ }
122
+ fatalWriteError = error instanceof Error ? error.message : "claude stdin write failed";
123
+ fatalWriteErrorCode = "CLAUDE_CLI_STDIN_WRITE_FAILED";
124
+ stderrBuffer = `${stderrBuffer}\n${fatalWriteError}`.trim();
125
+ if (!proc.killed) {
126
+ proc.kill("SIGTERM");
127
+ }
128
+ });
129
+ const completedPromise = new Promise((resolve) => {
130
+ const shutdownProcessAfterTurn = () => {
131
+ stdinClosed = true;
132
+ if (!proc.stdin.destroyed) {
133
+ proc.stdin.end();
134
+ }
135
+ if (!proc.killed) {
136
+ proc.kill("SIGTERM");
137
+ }
138
+ };
139
+ const emitRuntimeError = async (detail, errorCode = "CLAUDE_RUNTIME_ERROR") => {
140
+ if (completed) {
141
+ return;
142
+ }
143
+ completed = true;
144
+ const binding = refreshBinding();
145
+ await sink.emit({
146
+ type: "error",
147
+ status: "failed",
148
+ providerSessionId: binding.providerSessionId,
149
+ rawStoreRef: binding.rawStoreRef,
150
+ errorCode,
151
+ detail
152
+ });
153
+ };
154
+ const emitRuntimeComplete = async (status, detail) => {
155
+ if (completed) {
156
+ return;
157
+ }
158
+ completed = true;
159
+ const binding = refreshBinding();
160
+ await sink.emit({
161
+ type: status,
162
+ status: status === "complete" ? "completed" : "interrupted",
163
+ providerSessionId: binding.providerSessionId,
164
+ rawStoreRef: binding.rawStoreRef,
165
+ detail
166
+ });
167
+ };
168
+ const handleControlLine = (parsed) => {
169
+ const result = readClaudeResultOutcome(parsed);
170
+ if (!result) {
171
+ return false;
172
+ }
173
+ stableMessageRefByIdentity.clear();
174
+ const settle = result.kind === "complete"
175
+ ? emitRuntimeComplete("complete", result.detail)
176
+ : emitRuntimeError(result.detail, result.errorCode);
177
+ void settle.finally(() => {
178
+ shutdownProcessAfterTurn();
179
+ resolve();
180
+ });
181
+ return true;
182
+ };
183
+ proc.stdout.setEncoding("utf8");
184
+ proc.stdout.on("data", (chunk) => {
185
+ stdoutBuffer += chunk;
186
+ const lines = stdoutBuffer.split(/\r?\n/);
187
+ stdoutBuffer = lines.pop() ?? "";
188
+ for (const line of lines) {
189
+ const trimmed = line.trim();
190
+ if (!trimmed) {
191
+ continue;
192
+ }
193
+ void this.consumeStreamLine({
194
+ line: trimmed,
195
+ onParsed: handleControlLine,
196
+ refreshBinding,
197
+ sink,
198
+ allocateSequence: () => {
199
+ sequence += 1;
200
+ return sequence;
201
+ },
202
+ toolNameById,
203
+ stableMessageRefByIdentity,
204
+ streamEventState
205
+ });
206
+ }
207
+ });
208
+ proc.stderr.setEncoding("utf8");
209
+ proc.stderr.on("data", (chunk) => {
210
+ stderrBuffer += chunk;
211
+ });
212
+ proc.on("error", (error) => {
213
+ clearInterval(bindingRefreshTimer);
214
+ stdinClosed = true;
215
+ void emitRuntimeError(error.message, "CLAUDE_CLI_SPAWN_FAILED").finally(resolve);
216
+ });
217
+ proc.on("close", (code, signal) => {
218
+ clearInterval(bindingRefreshTimer);
219
+ stdinClosed = true;
220
+ if (fatalWriteError) {
221
+ void emitRuntimeError(fatalWriteError, fatalWriteErrorCode ?? "CLAUDE_CLI_STDIN_WRITE_FAILED").finally(resolve);
222
+ return;
223
+ }
224
+ if (interrupted || signal === "SIGTERM" || signal === "SIGINT") {
225
+ void emitRuntimeComplete("interrupted", "claude process interrupted").finally(resolve);
226
+ return;
227
+ }
228
+ if (code === 0) {
229
+ void emitRuntimeComplete("complete", "claude turn completed").finally(resolve);
230
+ return;
231
+ }
232
+ const detail = stderrBuffer.trim() || `claude exited with code ${String(code)}`;
233
+ void emitRuntimeError(detail, "CLAUDE_CLI_EXIT_NON_ZERO").finally(resolve);
234
+ });
235
+ });
236
+ return {
237
+ providerSessionId: activeProviderSessionId,
238
+ rawStoreRef: activeRawStoreRef,
239
+ completed: completedPromise,
240
+ submitDuringRun,
241
+ interrupt: async () => {
242
+ if (proc.killed) {
243
+ return;
244
+ }
245
+ interrupted = true;
246
+ stdinClosed = true;
247
+ if (!proc.stdin.destroyed) {
248
+ proc.stdin.end();
249
+ }
250
+ proc.kill("SIGTERM");
251
+ }
252
+ };
253
+ }
254
+ ensureRuntimeStoreReady(rawStoreRef) {
255
+ ensureDirectory(dirname(rawStoreRef));
256
+ if (existsSync(rawStoreRef)) {
257
+ return;
258
+ }
259
+ writeFileSync(rawStoreRef, "", "utf8");
260
+ }
261
+ async consumeStreamLine(input) {
262
+ let parsed;
263
+ try {
264
+ parsed = JSON.parse(input.line);
265
+ }
266
+ catch {
267
+ return;
268
+ }
269
+ if (input.onParsed(parsed)) {
270
+ return;
271
+ }
272
+ const binding = input.refreshBinding(parsed);
273
+ const envelopes = collectMessageEnvelopes(parsed, input.streamEventState);
274
+ for (const envelope of envelopes) {
275
+ const parts = normalizeClaudeMessageParts(envelope.message.content);
276
+ for (let partIndex = 0; partIndex < parts.length; partIndex += 1) {
277
+ const part = parts[partIndex];
278
+ const normalized = normalizeClaudeMessagePart({
279
+ part,
280
+ envelope,
281
+ providerSessionId: binding.providerSessionId,
282
+ partIndex,
283
+ timestamp: safeDate(envelope.timestamp, nextTimestamp()),
284
+ toolNameById: input.toolNameById,
285
+ resolveStableMessageRef: (identity) => {
286
+ const existing = input.stableMessageRefByIdentity.get(identity);
287
+ if (existing) {
288
+ return existing;
289
+ }
290
+ const sequence = input.allocateSequence();
291
+ const created = {
292
+ sequence,
293
+ rawRef: buildClaudeStableRawRef(binding.rawStoreRef, sequence, partIndex)
294
+ };
295
+ input.stableMessageRefByIdentity.set(identity, created);
296
+ return created;
297
+ }
298
+ });
299
+ if (!normalized) {
300
+ continue;
301
+ }
302
+ await input.sink.emit({
303
+ type: "message",
304
+ providerSessionId: binding.providerSessionId,
305
+ rawStoreRef: binding.rawStoreRef,
306
+ message: normalized,
307
+ status: "running",
308
+ rawEventRef: normalized.rawRef
309
+ });
310
+ }
311
+ }
312
+ }
313
+ }
314
+ function writeClaudeStreamingInput(proc, options, isClosed) {
315
+ if (isClosed || proc.killed || proc.stdin.destroyed || !proc.stdin.writable) {
316
+ return Promise.reject(new Error("IN_RUN_INPUT_NOT_SUPPORTED"));
317
+ }
318
+ const payload = JSON.stringify(buildClaudeStreamingUserInput(options));
319
+ return new Promise((resolve, reject) => {
320
+ proc.stdin.write(`${payload}\n`, "utf8", (error) => {
321
+ if (error) {
322
+ reject(error);
323
+ return;
324
+ }
325
+ resolve();
326
+ });
327
+ });
328
+ }
329
+ function buildClaudeStreamingUserInput(options) {
330
+ return {
331
+ type: "user",
332
+ message: {
333
+ role: "user",
334
+ content: [
335
+ {
336
+ type: "text",
337
+ text: options.providerPrompt ?? options.content
338
+ }
339
+ ]
340
+ }
341
+ };
342
+ }
343
+ export function buildClaudePermissionArgs(permissionMode) {
344
+ if (permissionMode === "default" ||
345
+ permissionMode === "acceptEdits" ||
346
+ permissionMode === "bypassPermissions") {
347
+ return ["--permission-mode", permissionMode];
348
+ }
349
+ return [];
350
+ }
351
+ function resolveClaudeCommand(explicitPath) {
352
+ const explicitCandidate = pickFirstNonEmpty(explicitPath, process.env.CODINGNS_CLAUDE_CODE_COMMAND, process.env.CLAUDE_CODE_COMMAND);
353
+ if (explicitCandidate) {
354
+ return resolveExecutableCandidate(explicitCandidate) ?? explicitCandidate;
355
+ }
356
+ const candidates = process.platform === "win32"
357
+ ? [
358
+ "claude.cmd",
359
+ process.env.APPDATA ? join(process.env.APPDATA, "npm", "claude.cmd") : "",
360
+ process.env.USERPROFILE
361
+ ? join(process.env.USERPROFILE, "AppData", "Roaming", "npm", "claude.cmd")
362
+ : "",
363
+ "claude"
364
+ ]
365
+ : ["claude", "/opt/homebrew/bin/claude", "/usr/local/bin/claude", "/usr/bin/claude"];
366
+ for (const candidate of candidates) {
367
+ const resolved = resolveExecutableCandidate(candidate);
368
+ if (resolved) {
369
+ return resolved;
370
+ }
371
+ }
372
+ return process.platform === "win32" ? "claude.cmd" : "claude";
373
+ }
374
+ function shouldSpawnClaudeViaShell(commandPath) {
375
+ return process.platform === "win32" && /\.(cmd|bat)$/i.test(commandPath);
376
+ }
377
+ function resolveExecutableCandidate(candidate) {
378
+ const trimmed = candidate.trim();
379
+ if (!trimmed) {
380
+ return null;
381
+ }
382
+ if (hasPathSegment(trimmed)) {
383
+ return isExecutableFile(trimmed) ? trimmed : null;
384
+ }
385
+ return resolveExecutableOnPath(trimmed);
386
+ }
387
+ function resolveExecutableOnPath(command) {
388
+ const pathValue = process.env.PATH ?? "";
389
+ if (!pathValue.trim()) {
390
+ return null;
391
+ }
392
+ const extensions = process.platform === "win32"
393
+ ? buildWindowsExecutableExtensions(command)
394
+ : [""];
395
+ for (const entry of pathValue.split(delimiter)) {
396
+ const trimmedEntry = entry.trim();
397
+ if (!trimmedEntry) {
398
+ continue;
399
+ }
400
+ for (const extension of extensions) {
401
+ const candidatePath = join(trimmedEntry, `${command}${extension}`);
402
+ if (isExecutableFile(candidatePath)) {
403
+ return candidatePath;
404
+ }
405
+ }
406
+ }
407
+ return null;
408
+ }
409
+ function buildWindowsExecutableExtensions(command) {
410
+ if (/\.[^./\\]+$/.test(command)) {
411
+ return [""];
412
+ }
413
+ const pathExtensions = (process.env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD")
414
+ .split(";")
415
+ .map((value) => value.trim())
416
+ .filter((value) => value.length > 0);
417
+ return ["", ...pathExtensions];
418
+ }
419
+ function hasPathSegment(value) {
420
+ return isAbsolute(value) || value.includes(sep) || value.includes("/") || value.includes("\\");
421
+ }
422
+ function isExecutableFile(filePath) {
423
+ if (!existsSync(filePath)) {
424
+ return false;
425
+ }
426
+ if (process.platform === "win32") {
427
+ return true;
428
+ }
429
+ try {
430
+ accessSync(filePath, constants.X_OK);
431
+ return true;
432
+ }
433
+ catch {
434
+ return false;
435
+ }
436
+ }
437
+ function pickFirstNonEmpty(...values) {
438
+ for (const value of values) {
439
+ if (value && value.trim().length > 0) {
440
+ return value.trim();
441
+ }
442
+ }
443
+ return null;
444
+ }
445
+ function buildPendingClaudeSessionId(sessionId) {
446
+ return `pending://claude-code/${sessionId}`;
447
+ }
448
+ function isPendingClaudeSessionId(sessionId) {
449
+ return sessionId.startsWith("pending://claude-code/");
450
+ }
451
+ function buildClaudeRawStoreRef(homeDir, workspacePath, sessionId) {
452
+ return join(homeDir, "projects", workspaceSlug(workspacePath), `${sessionId}.jsonl`);
453
+ }
454
+ function buildClaudePendingRawStoreRef(homeDir, workspacePath, sessionId) {
455
+ return join(homeDir, "projects", workspaceSlug(workspacePath), `.pending-${sessionId}.jsonl`);
456
+ }
457
+ function findClaudeSessionFile(homeDir, sessionId) {
458
+ const projectsDir = join(homeDir, "projects");
459
+ if (!existsSync(projectsDir)) {
460
+ return null;
461
+ }
462
+ const candidates = readdirSync(projectsDir, { withFileTypes: true })
463
+ .filter((entry) => entry.isDirectory())
464
+ .map((entry) => join(projectsDir, entry.name, `${sessionId}.jsonl`))
465
+ .filter((filePath) => existsSync(filePath));
466
+ if (candidates.length === 0) {
467
+ return null;
468
+ }
469
+ candidates.sort((left, right) => compareClaudeSessionFiles(right, left));
470
+ return candidates[0] ?? null;
471
+ }
472
+ function compareClaudeSessionFiles(left, right) {
473
+ const leftStat = statSync(left);
474
+ const rightStat = statSync(right);
475
+ if (leftStat.size !== rightStat.size) {
476
+ return leftStat.size - rightStat.size;
477
+ }
478
+ return leftStat.mtimeMs - rightStat.mtimeMs;
479
+ }
480
+ function extractClaudeSessionId(parsed) {
481
+ const directSessionId = ensureText(parsed?.session_id).trim();
482
+ if (directSessionId.length > 0) {
483
+ return directSessionId;
484
+ }
485
+ const resultSessionId = ensureText((parsed?.result ?? {}).session_id).trim();
486
+ if (resultSessionId.length > 0) {
487
+ return resultSessionId;
488
+ }
489
+ return null;
490
+ }
491
+ function ensureNonEmpty(value, errorCode) {
492
+ if (!value || value.trim().length === 0) {
493
+ throw new Error(errorCode);
494
+ }
495
+ return value.trim();
496
+ }
497
+ function readClaudeResultOutcome(record) {
498
+ if (ensureText(record.type).trim() !== "result") {
499
+ return null;
500
+ }
501
+ const subtype = ensureText(record.subtype).trim().toLowerCase();
502
+ const stopReason = ensureText(record.stop_reason).trim();
503
+ const resultRecord = (record.result ?? {});
504
+ const nestedStopReason = ensureText(resultRecord.stop_reason).trim();
505
+ const detailCandidate = ensureText(record.error).trim()
506
+ || ensureText(record.message).trim()
507
+ || ensureText(resultRecord.error).trim()
508
+ || ensureText(resultRecord.message).trim()
509
+ || stopReason
510
+ || nestedStopReason;
511
+ if (!subtype || subtype === "success" || subtype === "completed") {
512
+ return {
513
+ kind: "complete",
514
+ detail: detailCandidate || "claude turn completed"
515
+ };
516
+ }
517
+ return {
518
+ kind: "error",
519
+ detail: detailCandidate || `claude result ${subtype}`,
520
+ errorCode: `CLAUDE_RESULT_${subtype.toUpperCase().replace(/[^A-Z0-9]+/g, "_")}`
521
+ };
522
+ }
523
+ function collectMessageEnvelopes(record, streamEventState) {
524
+ if (ensureText(record.type).trim() === "stream_event") {
525
+ return collectStreamEventEnvelopes(record, streamEventState);
526
+ }
527
+ const envelopes = [];
528
+ const directType = ensureText(record.type).trim();
529
+ const directMessage = toClaudeRecord(record.message);
530
+ if (directType === "user" || directType === "assistant") {
531
+ envelopes.push({
532
+ type: directType,
533
+ source: "direct",
534
+ messageId: readClaudeMessageId(directMessage, record),
535
+ timestamp: record.timestamp,
536
+ message: directMessage
537
+ });
538
+ }
539
+ const progressMessage = readProgressEnvelope(record);
540
+ if (progressMessage) {
541
+ envelopes.push(progressMessage);
542
+ }
543
+ return envelopes;
544
+ }
545
+ function readProgressEnvelope(record) {
546
+ if (ensureText(record.type) !== "progress") {
547
+ return null;
548
+ }
549
+ const nested = toClaudeRecord(toClaudeRecord(record.data).message);
550
+ const nestedType = ensureText(nested.type).trim();
551
+ const nestedMessage = toClaudeRecord(nested.message);
552
+ if (nestedType !== "user" && nestedType !== "assistant") {
553
+ return null;
554
+ }
555
+ return {
556
+ type: nestedType,
557
+ source: "progress",
558
+ messageId: readClaudeMessageId(nestedMessage, nested),
559
+ timestamp: nested.timestamp ?? record.timestamp,
560
+ message: nestedMessage
561
+ };
562
+ }
563
+ function collectStreamEventEnvelopes(record, state) {
564
+ const event = toClaudeRecord(record.event);
565
+ const eventType = ensureText(event.type).trim();
566
+ if (!eventType) {
567
+ return [];
568
+ }
569
+ if (eventType === "message_start") {
570
+ const message = toClaudeRecord(event.message);
571
+ const role = ensureText(message.role).trim();
572
+ if (role !== "user" && role !== "assistant") {
573
+ return [];
574
+ }
575
+ const messageId = readClaudeMessageId(message, message);
576
+ const messageKey = messageId || `stream:${randomUUID()}`;
577
+ const messageState = {
578
+ type: role,
579
+ messageId,
580
+ timestamp: message.timestamp ?? record.timestamp,
581
+ partsByIndex: new Map()
582
+ };
583
+ const initialParts = normalizeClaudeMessageParts(message.content);
584
+ initialParts.forEach((part, partIndex) => {
585
+ messageState.partsByIndex.set(partIndex, {
586
+ part: { ...part }
587
+ });
588
+ });
589
+ state.currentMessageKey = messageKey;
590
+ state.messages.set(messageKey, messageState);
591
+ return [];
592
+ }
593
+ const messageKey = resolveClaudeStreamMessageKey(record, state);
594
+ if (!messageKey) {
595
+ return [];
596
+ }
597
+ const messageState = state.messages.get(messageKey);
598
+ if (!messageState) {
599
+ return [];
600
+ }
601
+ if (record.timestamp !== undefined && record.timestamp !== null) {
602
+ messageState.timestamp = record.timestamp;
603
+ }
604
+ if (eventType === "content_block_start") {
605
+ const partIndex = readClaudeContentBlockIndex(event);
606
+ if (partIndex < 0) {
607
+ return [];
608
+ }
609
+ const contentBlock = toClaudeRecord(event.content_block);
610
+ const partState = {
611
+ part: { ...contentBlock }
612
+ };
613
+ if (ensureText(contentBlock.type).trim() === "tool_use") {
614
+ partState.jsonBuffer = serializeClaudeToolInput(contentBlock.input);
615
+ }
616
+ messageState.partsByIndex.set(partIndex, partState);
617
+ return [buildClaudeStreamEnvelope(messageState, partIndex)];
618
+ }
619
+ if (eventType === "content_block_delta") {
620
+ const partIndex = readClaudeContentBlockIndex(event);
621
+ if (partIndex < 0) {
622
+ return [];
623
+ }
624
+ const partState = messageState.partsByIndex.get(partIndex);
625
+ if (!partState) {
626
+ return [];
627
+ }
628
+ applyClaudeContentBlockDelta(partState, toClaudeRecord(event.delta));
629
+ return [buildClaudeStreamEnvelope(messageState, partIndex)];
630
+ }
631
+ if (eventType === "content_block_stop") {
632
+ const partIndex = readClaudeContentBlockIndex(event);
633
+ if (partIndex < 0 || !messageState.partsByIndex.has(partIndex)) {
634
+ return [];
635
+ }
636
+ return [buildClaudeStreamEnvelope(messageState, partIndex)];
637
+ }
638
+ if (eventType === "message_delta") {
639
+ const delta = toClaudeRecord(event.delta);
640
+ messageState.stopReason = ensureText(delta.stop_reason).trim() || null;
641
+ return [];
642
+ }
643
+ if (eventType === "message_stop") {
644
+ state.messages.delete(messageKey);
645
+ if (state.currentMessageKey === messageKey) {
646
+ state.currentMessageKey = null;
647
+ }
648
+ }
649
+ return [];
650
+ }
651
+ function resolveClaudeStreamMessageKey(record, state) {
652
+ const event = toClaudeRecord(record.event);
653
+ const eventMessage = toClaudeRecord(event.message);
654
+ const eventDelta = toClaudeRecord(event.delta);
655
+ const directKey = readClaudeMessageId(eventMessage, eventMessage)
656
+ || ensureText(event.message_id).trim()
657
+ || ensureText(eventDelta.message_id).trim()
658
+ || ensureText(record.message_id).trim();
659
+ if (directKey.length > 0 && state.messages.has(directKey)) {
660
+ state.currentMessageKey = directKey;
661
+ return directKey;
662
+ }
663
+ if (state.currentMessageKey && state.messages.has(state.currentMessageKey)) {
664
+ return state.currentMessageKey;
665
+ }
666
+ return directKey.length > 0 ? directKey : null;
667
+ }
668
+ function readClaudeContentBlockIndex(event) {
669
+ const candidates = [event.index, event.content_block_index, event.contentBlockIndex];
670
+ for (const candidate of candidates) {
671
+ if (typeof candidate === "number" && Number.isInteger(candidate) && candidate >= 0) {
672
+ return candidate;
673
+ }
674
+ }
675
+ return -1;
676
+ }
677
+ function buildClaudeStreamEnvelope(messageState, partIndex) {
678
+ const content = Array.from({ length: partIndex + 1 }, (_, index) => index === partIndex ? { ...(messageState.partsByIndex.get(partIndex)?.part ?? {}) } : "");
679
+ return {
680
+ type: messageState.type,
681
+ source: "stream_event",
682
+ messageId: messageState.messageId,
683
+ timestamp: messageState.timestamp,
684
+ message: {
685
+ content
686
+ }
687
+ };
688
+ }
689
+ function applyClaudeContentBlockDelta(partState, delta) {
690
+ const deltaType = ensureText(delta.type).trim();
691
+ if (deltaType === "text_delta") {
692
+ partState.part.text = `${ensureText(partState.part.text)}${ensureText(delta.text)}`;
693
+ return;
694
+ }
695
+ if (deltaType === "thinking_delta") {
696
+ partState.part.type = ensureText(partState.part.type).trim() || "thinking";
697
+ partState.part.thinking = `${ensureText(partState.part.thinking)}${ensureText(delta.thinking)}`;
698
+ return;
699
+ }
700
+ if (deltaType === "input_json_delta") {
701
+ partState.part.type = ensureText(partState.part.type).trim() || "tool_use";
702
+ const nextBuffer = `${partState.jsonBuffer ?? ""}${ensureText(delta.partial_json)}`;
703
+ partState.jsonBuffer = nextBuffer;
704
+ partState.part.input = parseClaudePartialJson(nextBuffer);
705
+ return;
706
+ }
707
+ if (deltaType === "signature_delta") {
708
+ partState.part.signature = `${ensureText(partState.part.signature)}${ensureText(delta.signature)}`;
709
+ }
710
+ }
711
+ function parseClaudePartialJson(value) {
712
+ const trimmed = value.trim();
713
+ if (!trimmed) {
714
+ return "";
715
+ }
716
+ try {
717
+ return JSON.parse(trimmed);
718
+ }
719
+ catch {
720
+ return trimmed;
721
+ }
722
+ }
723
+ function serializeClaudeToolInput(value) {
724
+ if (typeof value === "string") {
725
+ return value;
726
+ }
727
+ if (value === undefined || value === null) {
728
+ return "";
729
+ }
730
+ return stringifyStructuredValue(value);
731
+ }
732
+ //# sourceMappingURL=claude-runtime.js.map