@jingyi0605/codingns 0.7.4 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/README.md +6 -0
  2. package/bin/codingns.mjs +747 -28
  3. package/bin/office-mcp-server.mjs +620 -0
  4. package/dist/public/assets/{AdaptiveButlerPage-CgBX49t-.js → AdaptiveButlerPage-BsgVNRAa.js} +1 -1
  5. package/dist/public/assets/{App-tXOqoHNl.js → App-tPcbyRdS.js} +3 -3
  6. package/dist/public/assets/{BootstrapPage-DoRMz87R.js → BootstrapPage--MDOigQi.js} +1 -1
  7. package/dist/public/assets/{ConversationPage-DXR6Hp4O.js → ConversationPage-BBss5ED8.js} +6 -6
  8. package/dist/public/assets/{DesktopDetachPreviewPage-Cyk-ZYCk.js → DesktopDetachPreviewPage-CB8DoqwU.js} +1 -1
  9. package/dist/public/assets/{DesktopWindowPage-DNVNK3hs.js → DesktopWindowPage-GtIx5m8K.js} +1 -1
  10. package/dist/public/assets/FileContextPanel-BcM7AIT4.js +1 -0
  11. package/dist/public/assets/{GitSidebar-Cr3Z9OUI.js → GitSidebar-CMtkaxuI.js} +2 -2
  12. package/dist/public/assets/{MobileCreateSessionSheet-DMW0V6GJ.js → MobileCreateSessionSheet-CrFY41_8.js} +1 -1
  13. package/dist/public/assets/{MobileTopHeaderFrame-CkdnZ_MU.js → MobileTopHeaderFrame-DGVOzXyg.js} +1 -1
  14. package/dist/public/assets/{MobileWorkspaceSwitcherHeader-KIbqBYJN.js → MobileWorkspaceSwitcherHeader-DLkACTnQ.js} +1 -1
  15. package/dist/public/assets/{RelayConnectEntryPage-DIRBH3hw.js → RelayConnectEntryPage-0MPPjxtQ.js} +1 -1
  16. package/dist/public/assets/{ServerSettingsModal-C-9RxdWP.js → ServerSettingsModal-vgOhwus4.js} +1 -1
  17. package/dist/public/assets/{SessionIndexPage-bRlIydRA.js → SessionIndexPage-KK626Ra9.js} +1 -1
  18. package/dist/public/assets/{SettingsPage-CMEt4ua9.js → SettingsPage-B3edBJIo.js} +2 -2
  19. package/dist/public/assets/{TerminalManagerPanel-2bi9wVhT.js → TerminalManagerPanel-BxlhZp8c.js} +1 -1
  20. package/dist/public/assets/{TerminalPage-DayZz2Tf.js → TerminalPage-B6Rdhylx.js} +1 -1
  21. package/dist/public/assets/{TerminalRuntimeFallbackModal-DgwYcp-Y.js → TerminalRuntimeFallbackModal-BVLfrpSa.js} +1 -1
  22. package/dist/public/assets/{ToolFilesPage-YvnP_FXW.js → ToolFilesPage-N_gwwUjD.js} +1 -1
  23. package/dist/public/assets/{ToolGitPage-GMcQKtV9.js → ToolGitPage-DOcuuWM1.js} +1 -1
  24. package/dist/public/assets/{ToolProcessesPage-DFIQ7BCd.js → ToolProcessesPage-D-FfJ7Re.js} +1 -1
  25. package/dist/public/assets/{ToolsHomePage-CSilFzXR.js → ToolsHomePage-CHfPxd20.js} +1 -1
  26. package/dist/public/assets/{WorkbenchLandingPage-1VtToSz9.js → WorkbenchLandingPage-CTTnfovY.js} +1 -1
  27. package/dist/public/assets/WorkbenchLayout-CbpJg0g1.js +244 -0
  28. package/dist/public/assets/{WorkbenchModal-BWXYSXmC.js → WorkbenchModal-Bt_1fYmM.js} +1 -1
  29. package/dist/public/assets/WorkbenchShellRoute-B4XB8SwG.css +1 -0
  30. package/dist/public/assets/WorkbenchShellRoute-DyaMnPfS.js +1 -0
  31. package/dist/public/assets/{WorkspaceDebugDetailPage-Ux8_Q7la.js → WorkspaceDebugDetailPage-s7yuDIxR.js} +1 -1
  32. package/dist/public/assets/{WorkspaceDetailPage-B402p99m.js → WorkspaceDetailPage-Cf-gVpqK.js} +1 -1
  33. package/dist/public/assets/{WorkspaceHomePage-D2pob6HI.js → WorkspaceHomePage-COf6I8sT.js} +1 -1
  34. package/dist/public/assets/{client-runtime-manager-C5D76ewj.js → client-runtime-manager-DGdKvYzx.js} +1 -1
  35. package/dist/public/assets/file-tree-icon-BeHqeru9.js +590 -0
  36. package/dist/public/assets/index-CcaQt50x.css +1 -0
  37. package/dist/public/assets/index-CuzMc7q2.js +42 -0
  38. package/dist/public/assets/{login-direct-candidate-resolver-wXSaB0i7.js → login-direct-candidate-resolver-DEP_xCmR.js} +1 -1
  39. package/dist/public/assets/{model-switch-api-CPtou49j.js → model-switch-api-c6kcbBGm.js} +1 -1
  40. package/dist/public/assets/{preferences-service-CdaK7zA8.js → preferences-service-CV6Ih0BG.js} +1 -1
  41. package/dist/public/assets/{realtime-client-BjQazYsK.js → realtime-client-CRCx5xBt.js} +1 -1
  42. package/dist/public/assets/{relay-entry-BwE5nw0l.js → relay-entry-C751A-Sm.js} +1 -1
  43. package/dist/public/assets/{terminal-runtime-meta-C-Lbyx2i.js → terminal-runtime-meta-CRAVR-8G.js} +1 -1
  44. package/dist/public/assets/{useRegisteredDebugTemplates-BM7-c-gx.js → useRegisteredDebugTemplates-D6YtNS0r.js} +1 -1
  45. package/dist/public/index.html +2 -2
  46. package/dist/server/config/env.d.ts +3 -0
  47. package/dist/server/config/env.js +67 -1
  48. package/dist/server/config/env.js.map +1 -1
  49. package/dist/server/config/opencode-base-url-resolver.d.ts +3 -2
  50. package/dist/server/config/opencode-base-url-resolver.js +64 -24
  51. package/dist/server/config/opencode-base-url-resolver.js.map +1 -1
  52. package/dist/server/middlewares/auth-guard.js +4 -0
  53. package/dist/server/middlewares/auth-guard.js.map +1 -1
  54. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +168 -1
  55. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +205 -4
  56. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  57. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +296 -2
  58. package/dist/server/modules/assistant-capability/assistant-capability-service.js +872 -3
  59. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  60. package/dist/server/modules/auth/auth-service.d.ts +21 -1
  61. package/dist/server/modules/auth/auth-service.js +64 -0
  62. package/dist/server/modules/auth/auth-service.js.map +1 -1
  63. package/dist/server/modules/browser-runtime/browser-profile-service.d.ts +26 -0
  64. package/dist/server/modules/browser-runtime/browser-profile-service.js +85 -0
  65. package/dist/server/modules/browser-runtime/browser-profile-service.js.map +1 -0
  66. package/dist/server/modules/browser-runtime/browser-runtime-controller.d.ts +69 -0
  67. package/dist/server/modules/browser-runtime/browser-runtime-controller.js +83 -0
  68. package/dist/server/modules/browser-runtime/browser-runtime-controller.js.map +1 -0
  69. package/dist/server/modules/browser-runtime/browser-runtime-service.d.ts +56 -0
  70. package/dist/server/modules/browser-runtime/browser-runtime-service.js +215 -0
  71. package/dist/server/modules/browser-runtime/browser-runtime-service.js.map +1 -0
  72. package/dist/server/modules/browser-runtime/browser-task-execution-support.d.ts +65 -0
  73. package/dist/server/modules/browser-runtime/browser-task-execution-support.js +432 -0
  74. package/dist/server/modules/browser-runtime/browser-task-execution-support.js.map +1 -0
  75. package/dist/server/modules/browser-runtime/browser-task-executor-registry.d.ts +7 -0
  76. package/dist/server/modules/browser-runtime/browser-task-executor-registry.js +21 -0
  77. package/dist/server/modules/browser-runtime/browser-task-executor-registry.js.map +1 -0
  78. package/dist/server/modules/browser-runtime/browser-task-executor.d.ts +55 -0
  79. package/dist/server/modules/browser-runtime/browser-task-executor.js +2 -0
  80. package/dist/server/modules/browser-runtime/browser-task-executor.js.map +1 -0
  81. package/dist/server/modules/browser-runtime/browser-task-payload.d.ts +31 -0
  82. package/dist/server/modules/browser-runtime/browser-task-payload.js +55 -0
  83. package/dist/server/modules/browser-runtime/browser-task-payload.js.map +1 -0
  84. package/dist/server/modules/browser-runtime/opencli-bridge-browser-executor.d.ts +19 -0
  85. package/dist/server/modules/browser-runtime/opencli-bridge-browser-executor.js +219 -0
  86. package/dist/server/modules/browser-runtime/opencli-bridge-browser-executor.js.map +1 -0
  87. package/dist/server/modules/browser-runtime/opencli-browser-bridge-service.d.ts +15 -0
  88. package/dist/server/modules/browser-runtime/opencli-browser-bridge-service.js +33 -0
  89. package/dist/server/modules/browser-runtime/opencli-browser-bridge-service.js.map +1 -0
  90. package/dist/server/modules/browser-runtime/playwright-browser-executor.d.ts +16 -0
  91. package/dist/server/modules/browser-runtime/playwright-browser-executor.js +272 -0
  92. package/dist/server/modules/browser-runtime/playwright-browser-executor.js.map +1 -0
  93. package/dist/server/modules/butler/butler-auth-service.js +4 -0
  94. package/dist/server/modules/butler/butler-auth-service.js.map +1 -1
  95. package/dist/server/modules/butler/butler-inbox-instruction-adapter.js +1 -0
  96. package/dist/server/modules/butler/butler-inbox-instruction-adapter.js.map +1 -1
  97. package/dist/server/modules/butler/butler-session-summary-service.d.ts +1 -0
  98. package/dist/server/modules/butler/butler-session-summary-service.js +5 -3
  99. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  100. package/dist/server/modules/butler/butler-workspace-context.js +23 -0
  101. package/dist/server/modules/butler/butler-workspace-context.js.map +1 -1
  102. package/dist/server/modules/debug-target/debug-target-service.d.ts +2 -0
  103. package/dist/server/modules/debug-target/debug-target-service.js +14 -0
  104. package/dist/server/modules/debug-target/debug-target-service.js.map +1 -1
  105. package/dist/server/modules/document-runtime/document-docx-fallback-renderer.py +139 -0
  106. package/dist/server/modules/document-runtime/document-export-executor.d.ts +50 -0
  107. package/dist/server/modules/document-runtime/document-export-executor.js +827 -0
  108. package/dist/server/modules/document-runtime/document-export-executor.js.map +1 -0
  109. package/dist/server/modules/document-runtime/document-runtime-controller.d.ts +127 -0
  110. package/dist/server/modules/document-runtime/document-runtime-controller.js +131 -0
  111. package/dist/server/modules/document-runtime/document-runtime-controller.js.map +1 -0
  112. package/dist/server/modules/document-runtime/document-runtime-service.d.ts +125 -0
  113. package/dist/server/modules/document-runtime/document-runtime-service.js +706 -0
  114. package/dist/server/modules/document-runtime/document-runtime-service.js.map +1 -0
  115. package/dist/server/modules/office/office-controller.d.ts +77 -0
  116. package/dist/server/modules/office/office-controller.js +174 -0
  117. package/dist/server/modules/office/office-controller.js.map +1 -0
  118. package/dist/server/modules/office/office-preview-link-service.d.ts +27 -0
  119. package/dist/server/modules/office/office-preview-link-service.js +121 -0
  120. package/dist/server/modules/office/office-preview-link-service.js.map +1 -0
  121. package/dist/server/modules/office/office-service.d.ts +67 -0
  122. package/dist/server/modules/office/office-service.js +359 -0
  123. package/dist/server/modules/office/office-service.js.map +1 -0
  124. package/dist/server/modules/opencli/opencli-bridge-skill-service.js +38 -14
  125. package/dist/server/modules/opencli/opencli-bridge-skill-service.js.map +1 -1
  126. package/dist/server/modules/opencli/opencli-install-discovery.d.ts +4 -0
  127. package/dist/server/modules/opencli/opencli-install-discovery.js +94 -0
  128. package/dist/server/modules/opencli/opencli-install-discovery.js.map +1 -1
  129. package/dist/server/modules/opencli/opencli-runtime-builder.js +29 -0
  130. package/dist/server/modules/opencli/opencli-runtime-builder.js.map +1 -1
  131. package/dist/server/modules/opencli/opencli-runtime-guard.d.ts +2 -0
  132. package/dist/server/modules/opencli/opencli-runtime-guard.js +5 -0
  133. package/dist/server/modules/opencli/opencli-runtime-guard.js.map +1 -0
  134. package/dist/server/modules/ops-runtime/ops-runtime-controller.d.ts +70 -0
  135. package/dist/server/modules/ops-runtime/ops-runtime-controller.js +83 -0
  136. package/dist/server/modules/ops-runtime/ops-runtime-controller.js.map +1 -0
  137. package/dist/server/modules/ops-runtime/ops-runtime-service.d.ts +80 -0
  138. package/dist/server/modules/ops-runtime/ops-runtime-service.js +327 -0
  139. package/dist/server/modules/ops-runtime/ops-runtime-service.js.map +1 -0
  140. package/dist/server/modules/ops-runtime/ssh-ops-executor.d.ts +41 -0
  141. package/dist/server/modules/ops-runtime/ssh-ops-executor.js +478 -0
  142. package/dist/server/modules/ops-runtime/ssh-ops-executor.js.map +1 -0
  143. package/dist/server/modules/presentation/presentation-controller.d.ts +22 -0
  144. package/dist/server/modules/presentation/presentation-controller.js +59 -0
  145. package/dist/server/modules/presentation/presentation-controller.js.map +1 -0
  146. package/dist/server/modules/presentation/presentation-export-task-service.d.ts +24 -0
  147. package/dist/server/modules/presentation/presentation-export-task-service.js +137 -0
  148. package/dist/server/modules/presentation/presentation-export-task-service.js.map +1 -0
  149. package/dist/server/modules/presentation/presentation-export-types.d.ts +12 -0
  150. package/dist/server/modules/presentation/presentation-export-types.js +2 -0
  151. package/dist/server/modules/presentation/presentation-export-types.js.map +1 -0
  152. package/dist/server/modules/presentation/presentation-pdf-export-service.d.ts +20 -0
  153. package/dist/server/modules/presentation/presentation-pdf-export-service.js +29 -0
  154. package/dist/server/modules/presentation/presentation-pdf-export-service.js.map +1 -0
  155. package/dist/server/modules/presentation/presentation-pptx-export-service.d.ts +20 -0
  156. package/dist/server/modules/presentation/presentation-pptx-export-service.js +64 -0
  157. package/dist/server/modules/presentation/presentation-pptx-export-service.js.map +1 -0
  158. package/dist/server/modules/presentation/presentation-renderer.d.ts +21 -0
  159. package/dist/server/modules/presentation/presentation-renderer.js +208 -0
  160. package/dist/server/modules/presentation/presentation-renderer.js.map +1 -0
  161. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.js +3 -3
  162. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.js.map +1 -1
  163. package/dist/server/modules/relay-tunnel/relay-tunnel-service.js +6 -1
  164. package/dist/server/modules/relay-tunnel/relay-tunnel-service.js.map +1 -1
  165. package/dist/server/modules/sessions/codex-app-server-helper-process.js +2 -1
  166. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  167. package/dist/server/modules/sessions/session-controller.d.ts +1 -0
  168. package/dist/server/modules/sessions/session-controller.js +59 -4
  169. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  170. package/dist/server/modules/sessions/session-history-service.js +17 -5
  171. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  172. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +5 -1
  173. package/dist/server/modules/sessions/session-live-runtime-service.js +86 -8
  174. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  175. package/dist/server/modules/sessions/session-provider-config-service.d.ts +25 -1
  176. package/dist/server/modules/sessions/session-provider-config-service.js +54 -5
  177. package/dist/server/modules/sessions/session-provider-config-service.js.map +1 -1
  178. package/dist/server/modules/sessions/workspace-office-mcp-config.d.ts +14 -0
  179. package/dist/server/modules/sessions/workspace-office-mcp-config.js +54 -0
  180. package/dist/server/modules/sessions/workspace-office-mcp-config.js.map +1 -0
  181. package/dist/server/modules/sessions/workspace-session-auth-service.d.ts +27 -0
  182. package/dist/server/modules/sessions/workspace-session-auth-service.js +109 -0
  183. package/dist/server/modules/sessions/workspace-session-auth-service.js.map +1 -0
  184. package/dist/server/modules/sessions/workspace-session-runtime-context-service.d.ts +50 -0
  185. package/dist/server/modules/sessions/workspace-session-runtime-context-service.js +332 -0
  186. package/dist/server/modules/sessions/workspace-session-runtime-context-service.js.map +1 -0
  187. package/dist/server/modules/skills/assistant-runtime-skill-catalog.js +5 -0
  188. package/dist/server/modules/skills/assistant-runtime-skill-catalog.js.map +1 -1
  189. package/dist/server/modules/skills/builtin-skills/codingns-workspace-session/SKILL.md +67 -0
  190. package/dist/server/modules/skills/builtin-skills/codingns-workspace-session/agents/openai.yaml +4 -0
  191. package/dist/server/modules/skills/builtin-skills/codingns-workspace-session/references/cli-workflow.md +133 -0
  192. package/dist/server/modules/skills/skill-controller.d.ts +7 -0
  193. package/dist/server/modules/skills/skill-controller.js +7 -0
  194. package/dist/server/modules/skills/skill-controller.js.map +1 -1
  195. package/dist/server/modules/skills/skill-manager-service.d.ts +61 -0
  196. package/dist/server/modules/skills/skill-manager-service.js +218 -0
  197. package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
  198. package/dist/server/modules/skills/skill-name-policy.js +2 -1
  199. package/dist/server/modules/skills/skill-name-policy.js.map +1 -1
  200. package/dist/server/modules/tasks/task-helper-client.d.ts +1 -0
  201. package/dist/server/modules/tasks/task-helper-client.js +45 -9
  202. package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
  203. package/dist/server/modules/tasks/task-types.d.ts +5 -0
  204. package/dist/server/modules/tasks/task-types.js +6 -1
  205. package/dist/server/modules/tasks/task-types.js.map +1 -1
  206. package/dist/server/modules/terminal/runtime/conpty-session-agent-process.js +2 -1
  207. package/dist/server/modules/terminal/runtime/conpty-session-agent-process.js.map +1 -1
  208. package/dist/server/modules/terminal/runtime/node-pty-loader.d.ts +5 -0
  209. package/dist/server/modules/terminal/runtime/node-pty-loader.js +68 -0
  210. package/dist/server/modules/terminal/runtime/node-pty-loader.js.map +1 -0
  211. package/dist/server/modules/terminal/runtime/pty-broker-agent-process.js +2 -1
  212. package/dist/server/modules/terminal/runtime/pty-broker-agent-process.js.map +1 -1
  213. package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.js +6 -9
  214. package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.js.map +1 -1
  215. package/dist/server/modules/terminal/runtime/pty-runtime-manager.js +6 -9
  216. package/dist/server/modules/terminal/runtime/pty-runtime-manager.js.map +1 -1
  217. package/dist/server/routes/assistant.d.ts +2 -1
  218. package/dist/server/routes/assistant.js +20 -1
  219. package/dist/server/routes/assistant.js.map +1 -1
  220. package/dist/server/routes/browser-runtime.d.ts +3 -0
  221. package/dist/server/routes/browser-runtime.js +14 -0
  222. package/dist/server/routes/browser-runtime.js.map +1 -0
  223. package/dist/server/routes/document-runtime.d.ts +3 -0
  224. package/dist/server/routes/document-runtime.js +18 -0
  225. package/dist/server/routes/document-runtime.js.map +1 -0
  226. package/dist/server/routes/office.d.ts +3 -0
  227. package/dist/server/routes/office.js +16 -0
  228. package/dist/server/routes/office.js.map +1 -0
  229. package/dist/server/routes/ops-runtime.d.ts +3 -0
  230. package/dist/server/routes/ops-runtime.js +13 -0
  231. package/dist/server/routes/ops-runtime.js.map +1 -0
  232. package/dist/server/routes/presentation.d.ts +3 -0
  233. package/dist/server/routes/presentation.js +5 -0
  234. package/dist/server/routes/presentation.js.map +1 -0
  235. package/dist/server/routes/skills.js +1 -0
  236. package/dist/server/routes/skills.js.map +1 -1
  237. package/dist/server/server/create-server.d.ts +36 -0
  238. package/dist/server/server/create-server.js +215 -4
  239. package/dist/server/server/create-server.js.map +1 -1
  240. package/dist/server/server/release-manifest-sync.d.ts +1 -0
  241. package/dist/server/server/release-manifest-sync.js +2 -2
  242. package/dist/server/server/release-manifest-sync.js.map +1 -1
  243. package/dist/server/server/start-host.js +1 -1
  244. package/dist/server/server/start-host.js.map +1 -1
  245. package/dist/server/storage/repositories/auth-token-repository.js +22 -6
  246. package/dist/server/storage/repositories/auth-token-repository.js.map +1 -1
  247. package/dist/server/storage/repositories/browser-profile-repository.d.ts +18 -0
  248. package/dist/server/storage/repositories/browser-profile-repository.js +134 -0
  249. package/dist/server/storage/repositories/browser-profile-repository.js.map +1 -0
  250. package/dist/server/storage/repositories/document-comment-repository.d.ts +10 -0
  251. package/dist/server/storage/repositories/document-comment-repository.js +118 -0
  252. package/dist/server/storage/repositories/document-comment-repository.js.map +1 -0
  253. package/dist/server/storage/repositories/document-repository.d.ts +16 -0
  254. package/dist/server/storage/repositories/document-repository.js +109 -0
  255. package/dist/server/storage/repositories/document-repository.js.map +1 -0
  256. package/dist/server/storage/repositories/document-revision-repository.d.ts +10 -0
  257. package/dist/server/storage/repositories/document-revision-repository.js +79 -0
  258. package/dist/server/storage/repositories/document-revision-repository.js.map +1 -0
  259. package/dist/server/storage/repositories/document-template-repository.d.ts +13 -0
  260. package/dist/server/storage/repositories/document-template-repository.js +244 -0
  261. package/dist/server/storage/repositories/document-template-repository.js.map +1 -0
  262. package/dist/server/storage/repositories/office-approval-repository.d.ts +11 -0
  263. package/dist/server/storage/repositories/office-approval-repository.js +109 -0
  264. package/dist/server/storage/repositories/office-approval-repository.js.map +1 -0
  265. package/dist/server/storage/repositories/office-artifact-repository.d.ts +10 -0
  266. package/dist/server/storage/repositories/office-artifact-repository.js +89 -0
  267. package/dist/server/storage/repositories/office-artifact-repository.js.map +1 -0
  268. package/dist/server/storage/repositories/office-audit-event-repository.d.ts +8 -0
  269. package/dist/server/storage/repositories/office-audit-event-repository.js +54 -0
  270. package/dist/server/storage/repositories/office-audit-event-repository.js.map +1 -0
  271. package/dist/server/storage/repositories/office-connector-repository.d.ts +10 -0
  272. package/dist/server/storage/repositories/office-connector-repository.js +97 -0
  273. package/dist/server/storage/repositories/office-connector-repository.js.map +1 -0
  274. package/dist/server/storage/repositories/office-receipt-repository.d.ts +8 -0
  275. package/dist/server/storage/repositories/office-receipt-repository.js +48 -0
  276. package/dist/server/storage/repositories/office-receipt-repository.js.map +1 -0
  277. package/dist/server/storage/repositories/office-rollback-record-repository.d.ts +8 -0
  278. package/dist/server/storage/repositories/office-rollback-record-repository.js +60 -0
  279. package/dist/server/storage/repositories/office-rollback-record-repository.js.map +1 -0
  280. package/dist/server/storage/repositories/office-task-repository.d.ts +19 -0
  281. package/dist/server/storage/repositories/office-task-repository.js +199 -0
  282. package/dist/server/storage/repositories/office-task-repository.js.map +1 -0
  283. package/dist/server/storage/repositories/office-task-step-repository.d.ts +10 -0
  284. package/dist/server/storage/repositories/office-task-step-repository.js +110 -0
  285. package/dist/server/storage/repositories/office-task-step-repository.js.map +1 -0
  286. package/dist/server/storage/repositories/ops-target-repository.d.ts +16 -0
  287. package/dist/server/storage/repositories/ops-target-repository.js +119 -0
  288. package/dist/server/storage/repositories/ops-target-repository.js.map +1 -0
  289. package/dist/server/storage/repositories/session-binding-repository.d.ts +4 -0
  290. package/dist/server/storage/repositories/session-binding-repository.js +70 -69
  291. package/dist/server/storage/repositories/session-binding-repository.js.map +1 -1
  292. package/dist/server/storage/repositories/session-changed-file-repository.d.ts +6 -0
  293. package/dist/server/storage/repositories/session-changed-file-repository.js +44 -43
  294. package/dist/server/storage/repositories/session-changed-file-repository.js.map +1 -1
  295. package/dist/server/storage/repositories/session-fork-repository.d.ts +2 -0
  296. package/dist/server/storage/repositories/session-fork-repository.js +42 -41
  297. package/dist/server/storage/repositories/session-fork-repository.js.map +1 -1
  298. package/dist/server/storage/repositories/session-index-repository.d.ts +5 -0
  299. package/dist/server/storage/repositories/session-index-repository.js +153 -152
  300. package/dist/server/storage/repositories/session-index-repository.js.map +1 -1
  301. package/dist/server/storage/repositories/session-message-attachment-repository.d.ts +7 -0
  302. package/dist/server/storage/repositories/session-message-attachment-repository.js +91 -90
  303. package/dist/server/storage/repositories/session-message-attachment-repository.js.map +1 -1
  304. package/dist/server/storage/repositories/session-message-origin-repository.d.ts +2 -0
  305. package/dist/server/storage/repositories/session-message-origin-repository.js +25 -24
  306. package/dist/server/storage/repositories/session-message-origin-repository.js.map +1 -1
  307. package/dist/server/storage/repositories/session-state-repository.d.ts +2 -0
  308. package/dist/server/storage/repositories/session-state-repository.js +35 -34
  309. package/dist/server/storage/repositories/session-state-repository.js.map +1 -1
  310. package/dist/server/storage/repositories/session-status-snapshot-repository.d.ts +2 -0
  311. package/dist/server/storage/repositories/session-status-snapshot-repository.js +25 -24
  312. package/dist/server/storage/repositories/session-status-snapshot-repository.js.map +1 -1
  313. package/dist/server/storage/sqlite/client.js +123 -1
  314. package/dist/server/storage/sqlite/client.js.map +1 -1
  315. package/dist/server/storage/sqlite/schema.sql +300 -1
  316. package/dist/server/types/domain.d.ts +205 -1
  317. package/package.json +14 -7
  318. package/scripts/postinstall.mjs +159 -7
  319. package/dist/public/assets/FileContextPanel-xGTYDclT.js +0 -1
  320. package/dist/public/assets/WorkbenchLayout-DScHaza9.js +0 -244
  321. package/dist/public/assets/WorkbenchShellRoute-DN6LdrqC.js +0 -1
  322. package/dist/public/assets/WorkbenchShellRoute-DhQo_0vu.css +0 -1
  323. package/dist/public/assets/file-tree-icon-lfU9Ag77.js +0 -3
  324. package/dist/public/assets/index-CFYXCsyx.css +0 -1
  325. package/dist/public/assets/index-NGxWr8Ix.js +0 -42
  326. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.d.ts +0 -42
  327. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js +0 -346
  328. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js.map +0 -1
  329. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.d.ts +0 -1
  330. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js +0 -80
  331. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js.map +0 -1
  332. package/node_modules/@codingns/session-sync-core/dist/index.d.ts +0 -18
  333. package/node_modules/@codingns/session-sync-core/dist/index.js +0 -19
  334. package/node_modules/@codingns/session-sync-core/dist/index.js.map +0 -1
  335. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.d.ts +0 -18
  336. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.js +0 -659
  337. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.js.map +0 -1
  338. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.d.ts +0 -11
  339. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.js +0 -72
  340. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.js.map +0 -1
  341. package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +0 -67
  342. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +0 -752
  343. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +0 -1
  344. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +0 -48
  345. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +0 -1184
  346. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +0 -1
  347. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.d.ts +0 -11
  348. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js +0 -105
  349. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js.map +0 -1
  350. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +0 -84
  351. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +0 -2436
  352. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +0 -1
  353. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.d.ts +0 -47
  354. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +0 -1480
  355. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +0 -1
  356. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.d.ts +0 -33
  357. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js +0 -684
  358. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js.map +0 -1
  359. package/node_modules/@codingns/session-sync-core/dist/providers/legna-code.d.ts +0 -9
  360. package/node_modules/@codingns/session-sync-core/dist/providers/legna-code.js +0 -17
  361. package/node_modules/@codingns/session-sync-core/dist/providers/legna-code.js.map +0 -1
  362. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.d.ts +0 -1
  363. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.js +0 -8
  364. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.js.map +0 -1
  365. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.d.ts +0 -48
  366. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js +0 -373
  367. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js.map +0 -1
  368. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +0 -61
  369. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +0 -1191
  370. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +0 -1
  371. package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +0 -27
  372. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +0 -415
  373. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +0 -1
  374. package/node_modules/@codingns/session-sync-core/dist/registry.d.ts +0 -7
  375. package/node_modules/@codingns/session-sync-core/dist/registry.js +0 -22
  376. package/node_modules/@codingns/session-sync-core/dist/registry.js.map +0 -1
  377. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.d.ts +0 -24
  378. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +0 -329
  379. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +0 -1
  380. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.d.ts +0 -30
  381. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +0 -939
  382. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +0 -1
  383. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.d.ts +0 -1
  384. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js +0 -16
  385. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js.map +0 -1
  386. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +0 -70
  387. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +0 -2571
  388. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +0 -1
  389. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.d.ts +0 -21
  390. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js +0 -561
  391. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js.map +0 -1
  392. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.d.ts +0 -38
  393. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.js +0 -911
  394. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.js.map +0 -1
  395. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.d.ts +0 -15
  396. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.js +0 -16
  397. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.js.map +0 -1
  398. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.d.ts +0 -37
  399. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js +0 -963
  400. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js.map +0 -1
  401. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.d.ts +0 -21
  402. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +0 -168
  403. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +0 -1
  404. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +0 -152
  405. package/node_modules/@codingns/session-sync-core/dist/runtime/types.js +0 -2
  406. package/node_modules/@codingns/session-sync-core/dist/runtime/types.js.map +0 -1
  407. package/node_modules/@codingns/session-sync-core/dist/services.d.ts +0 -28
  408. package/node_modules/@codingns/session-sync-core/dist/services.js +0 -148
  409. package/node_modules/@codingns/session-sync-core/dist/services.js.map +0 -1
  410. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.d.ts +0 -6
  411. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js +0 -9
  412. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js.map +0 -1
  413. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +0 -198
  414. package/node_modules/@codingns/session-sync-core/dist/types.js +0 -2
  415. package/node_modules/@codingns/session-sync-core/dist/types.js.map +0 -1
  416. package/node_modules/@codingns/session-sync-core/package.json +0 -33
@@ -1,1184 +0,0 @@
1
- import { basename, dirname, join } from "node:path";
2
- import { existsSync, rmSync, statSync, writeFileSync } from "node:fs";
3
- import crypto from "node:crypto";
4
- import { buildClaudeMessageSignature, buildClaudeProgressiveTrackKey, buildClaudeStableRawRef, normalizeClaudeMessagePart, normalizeClaudeMessageParts, readClaudeMessageId, shouldReuseClaudeProgressiveIdentity, toClaudeRecord } from "../claude-message-utils.js";
5
- import { appendJsonLine, createRawRef, encodeCursor, ensureDirectory, ensureText, messageIdFromRawRef, nextTimestamp, normalizeWorkspacePath, readFirstNonEmptyLine, readJsonLines, safeDate, sliceHistory } from "./utils.js";
6
- import { CLAUDE_CODE_SESSION_STORE_PROFILE } from "./claude-session-store.js";
7
- const HISTORY_CACHE_LIMIT = 6;
8
- const SESSION_SUMMARY_CACHE_LIMIT = 512;
9
- const DEFAULT_CLAUDE_CONTEXT_WINDOW = 200_000;
10
- export const CLAUDE_COMPAT_MODEL_OPTIONS = [
11
- {
12
- id: "provider-default",
13
- name: "跟随 CLI 默认模型",
14
- usesProviderDefault: true
15
- },
16
- {
17
- id: "sonnet",
18
- name: "Sonnet"
19
- },
20
- {
21
- id: "opus",
22
- name: "Opus"
23
- },
24
- {
25
- id: "haiku",
26
- name: "Haiku"
27
- }
28
- ];
29
- export class ClaudeCodeAdapter {
30
- options;
31
- providerId;
32
- historyCache = new Map();
33
- sessionSummaryCache = new Map();
34
- constructor(options) {
35
- this.options = options;
36
- this.providerId = options.providerId ?? "claude-code";
37
- }
38
- async detectSessions(workspacePath, options) {
39
- const discovery = await this.detectSessionsDetailed(workspacePath, options);
40
- return discovery.sessions;
41
- }
42
- async detectSessionsDetailed(workspacePath, options) {
43
- const startedAt = Date.now();
44
- const targetPath = normalizeWorkspacePath(workspacePath);
45
- const files = this.listWorkspaceFiles(workspacePath);
46
- const subagentMetadataByFilePath = buildClaudeSubagentMetadataIndex(files);
47
- const knownByRawStoreRef = new Map((options?.knownSessions ?? [])
48
- .filter((session) => session.provider === this.providerId)
49
- .map((session) => [session.rawStoreRef, session]));
50
- const sessions = [];
51
- let scannedFiles = 0;
52
- let skippedByMtimeSize = 0;
53
- let parsedFiles = 0;
54
- let bytesRead = 0;
55
- for (const filePath of files) {
56
- scannedFiles += 1;
57
- if (isPendingClaudeRuntimeFile(filePath)) {
58
- continue;
59
- }
60
- if (shouldHideClaudeDebugSession(filePath)) {
61
- continue;
62
- }
63
- const stats = statSync(filePath);
64
- const cachedSummary = this.sessionSummaryCache.get(filePath);
65
- const known = knownByRawStoreRef.get(filePath);
66
- const subagentMetadata = subagentMetadataByFilePath.get(filePath);
67
- const providerSessionId = subagentMetadata?.providerSessionId ?? basename(filePath, ".jsonl");
68
- if (cachedSummary &&
69
- cachedSummary.mtimeMs === stats.mtimeMs &&
70
- cachedSummary.size === stats.size) {
71
- this.touchSessionSummaryCache(filePath, cachedSummary);
72
- skippedByMtimeSize += 1;
73
- if (cachedSummary.summary &&
74
- normalizeWorkspacePath(cachedSummary.summary.workspacePath) === targetPath) {
75
- sessions.push({
76
- ...cachedSummary.summary,
77
- provider: this.providerId,
78
- providerSessionId,
79
- rawStoreRef: filePath,
80
- parentProviderSessionId: subagentMetadata?.parentProviderSessionId ?? null,
81
- isSubagent: subagentMetadata !== undefined,
82
- subagentLabel: cachedSummary.summary.subagentLabel ?? subagentMetadata?.subagentLabel ?? null,
83
- sourceMtimeMs: stats.mtimeMs,
84
- sourceSizeBytes: stats.size
85
- });
86
- continue;
87
- }
88
- if (cachedSummary.workspacePath &&
89
- normalizeWorkspacePath(cachedSummary.workspacePath) !== targetPath) {
90
- continue;
91
- }
92
- }
93
- if (known
94
- && known.sourceMtimeMs === stats.mtimeMs
95
- && known.sourceSizeBytes === stats.size
96
- && normalizeWorkspacePath(known.workspacePath) === targetPath) {
97
- skippedByMtimeSize += 1;
98
- sessions.push({
99
- ...known,
100
- provider: this.providerId,
101
- providerSessionId,
102
- rawStoreRef: filePath,
103
- parentProviderSessionId: subagentMetadata?.parentProviderSessionId ?? null,
104
- isSubagent: subagentMetadata !== undefined,
105
- subagentLabel: known.subagentLabel ?? subagentMetadata?.subagentLabel ?? null,
106
- sourceMtimeMs: stats.mtimeMs,
107
- sourceSizeBytes: stats.size
108
- });
109
- this.touchSessionSummaryCache(filePath, {
110
- filePath,
111
- mtimeMs: stats.mtimeMs,
112
- size: stats.size,
113
- workspacePath: known.workspacePath,
114
- summary: {
115
- ...known,
116
- provider: this.providerId,
117
- providerSessionId,
118
- rawStoreRef: filePath,
119
- parentProviderSessionId: subagentMetadata?.parentProviderSessionId ?? null,
120
- isSubagent: subagentMetadata !== undefined,
121
- subagentLabel: known.subagentLabel ?? subagentMetadata?.subagentLabel ?? null,
122
- sourceMtimeMs: stats.mtimeMs,
123
- sourceSizeBytes: stats.size
124
- }
125
- });
126
- continue;
127
- }
128
- parsedFiles += 1;
129
- bytesRead += stats.size;
130
- const records = readJsonLines(filePath);
131
- const typedRecords = records.map((record) => record.data);
132
- const detectedWorkspacePath = typedRecords
133
- .map((record) => normalizeWorkspacePath(ensureText(record.cwd)))
134
- .find((value) => value.length > 0) ?? null;
135
- const matchesWorkspace = detectedWorkspacePath === targetPath;
136
- if (!matchesWorkspace) {
137
- this.touchSessionSummaryCache(filePath, {
138
- filePath,
139
- mtimeMs: stats.mtimeMs,
140
- size: stats.size,
141
- workspacePath: detectedWorkspacePath,
142
- summary: null
143
- });
144
- continue;
145
- }
146
- const messages = this.parseMessages(filePath, typedRecords);
147
- const title = this.resolveDetectedClaudeTitle(typedRecords, messages, filePath);
148
- const lastMessageAt = messages.at(-1)?.timestamp ??
149
- (ensureText(typedRecords.at(-1)?.timestamp) || null);
150
- const summary = {
151
- provider: this.providerId,
152
- providerSessionId,
153
- title,
154
- workspacePath,
155
- rawStoreRef: filePath,
156
- lastMessageAt,
157
- messageCount: messages.length,
158
- parentProviderSessionId: subagentMetadata?.parentProviderSessionId ?? null,
159
- isSubagent: subagentMetadata !== undefined,
160
- subagentLabel: subagentMetadata?.subagentLabel ?? null,
161
- sourceMtimeMs: stats.mtimeMs,
162
- sourceSizeBytes: stats.size
163
- };
164
- sessions.push(summary);
165
- this.touchSessionSummaryCache(filePath, {
166
- filePath,
167
- mtimeMs: stats.mtimeMs,
168
- size: stats.size,
169
- workspacePath,
170
- summary
171
- });
172
- }
173
- const sortedSessions = sessions.sort((left, right) => (left.lastMessageAt ?? "").localeCompare(right.lastMessageAt ?? ""));
174
- const diagnostic = {
175
- provider: this.providerId,
176
- status: "success",
177
- durationMs: Date.now() - startedAt,
178
- sessionCount: sortedSessions.length,
179
- isComplete: true,
180
- errorMessage: null,
181
- scannedFiles,
182
- skippedByMtimeSize,
183
- parsedFiles,
184
- bytesRead
185
- };
186
- return {
187
- sessions: sortedSessions,
188
- isComplete: true,
189
- providerDiagnostics: [diagnostic]
190
- };
191
- }
192
- async readSessionHistory(providerSessionId, rawStoreRef, cursor, limit, direction = "forward") {
193
- const messages = this.getParsedMessages(rawStoreRef, providerSessionId);
194
- return sliceHistory(messages, cursor, limit, direction);
195
- }
196
- subscribeSession(providerSessionId, rawStoreRef, cursor, limit, onEvent) {
197
- let currentCursor = cursor;
198
- let lastMtime = statSync(rawStoreRef).mtimeMs;
199
- const timer = setInterval(async () => {
200
- const nextStat = statSync(rawStoreRef);
201
- if (nextStat.mtimeMs <= lastMtime) {
202
- return;
203
- }
204
- lastMtime = nextStat.mtimeMs;
205
- const page = await this.readSessionHistory(providerSessionId, rawStoreRef, currentCursor, limit);
206
- if (page.messages.length === 0) {
207
- return;
208
- }
209
- currentCursor = page.cursor;
210
- await onEvent({
211
- messages: page.messages,
212
- cursor: page.cursor
213
- });
214
- }, 300);
215
- return {
216
- close() {
217
- clearInterval(timer);
218
- }
219
- };
220
- }
221
- async resumeSession(providerSessionId, rawStoreRef) {
222
- statSync(rawStoreRef);
223
- return {
224
- provider: this.providerId,
225
- providerSessionId,
226
- resumedAt: nextTimestamp(),
227
- rawStoreRef
228
- };
229
- }
230
- async startSession(workspacePath, options) {
231
- const sessionId = crypto.randomUUID();
232
- const filePath = this.getSessionStoreProfile().resolveSessionFilePath(this.options.homeDir, workspacePath, sessionId);
233
- const projectDir = dirname(filePath);
234
- ensureDirectory(projectDir);
235
- const now = nextTimestamp();
236
- appendJsonLine(filePath, {
237
- type: "queue-operation",
238
- operation: "enqueue",
239
- timestamp: now,
240
- sessionId
241
- });
242
- if (options.initialPrompt) {
243
- appendJsonLine(filePath, {
244
- parentUuid: null,
245
- isSidechain: false,
246
- promptId: crypto.randomUUID(),
247
- type: "user",
248
- message: {
249
- role: "user",
250
- content: [{ type: "text", text: options.initialPrompt }]
251
- },
252
- uuid: crypto.randomUUID(),
253
- timestamp: now,
254
- cwd: workspacePath,
255
- sessionId
256
- });
257
- }
258
- appendJsonLine(filePath, {
259
- type: "ai-title",
260
- sessionId,
261
- aiTitle: options.initialPrompt?.slice(0, 48) || this.getDefaultSessionTitle()
262
- });
263
- return {
264
- session: {
265
- provider: this.providerId,
266
- providerSessionId: sessionId,
267
- title: options.initialPrompt?.slice(0, 48) || this.getDefaultSessionTitle(),
268
- workspacePath,
269
- rawStoreRef: filePath,
270
- isArchived: false,
271
- lastMessageAt: now,
272
- messageCount: options.initialPrompt ? 1 : 0
273
- },
274
- initialCursor: encodeCursor(options.initialPrompt ? 1 : 0)
275
- };
276
- }
277
- async forkSession(providerSessionId, workspacePath, options) {
278
- const sourceFilePath = this.resolveForkSourceFilePath(options.rawStoreRef, providerSessionId, workspacePath);
279
- const sourceRecords = readJsonLines(sourceFilePath).map((record) => record.data);
280
- const forkedSessionId = crypto.randomUUID();
281
- const targetFilePath = this.getSessionStoreProfile().resolveSessionFilePath(this.options.homeDir, workspacePath, forkedSessionId);
282
- const projectDir = dirname(targetFilePath);
283
- ensureDirectory(projectDir);
284
- let forkedRecords = sourceRecords.map((record) => cloneJsonRecord(record));
285
- let providerSourceMessageId = null;
286
- let forkMethod = "native_session_fork";
287
- if (options.sourceType === "message") {
288
- const targetMessageId = options.sourceMessageId?.trim();
289
- if (!targetMessageId) {
290
- throw new Error("FORK_SOURCE_MESSAGE_ID_REQUIRED");
291
- }
292
- const target = this.locateForkTarget(sourceRecords, providerSessionId, targetMessageId);
293
- if (!target) {
294
- throw new Error("FORK_SOURCE_MESSAGE_NOT_FOUND");
295
- }
296
- forkedRecords = forkedRecords.slice(0, target.recordIndex + 1);
297
- forkedRecords[target.recordIndex] = truncateClaudeForkRecord(forkedRecords[target.recordIndex], target, options.sourceMessageSnapshot ?? null);
298
- providerSourceMessageId = target.providerSourceMessageId;
299
- forkMethod = "native_message_fork";
300
- }
301
- const persistedForkRecords = forkedRecords
302
- // fork 后的标题必须由子会话自己生成,不能把父会话的 ai-title 原样抄过去。
303
- .filter((record) => shouldPreserveClaudeForkRecord(record));
304
- const serializedRecords = persistedForkRecords
305
- .map((record) => replaceClaudeRecordSessionId(record, forkedSessionId))
306
- .map((record) => JSON.stringify(record))
307
- .join("\n");
308
- writeFileSync(targetFilePath, `${serializedRecords}\n`, "utf8");
309
- this.historyCache.delete(targetFilePath);
310
- this.sessionSummaryCache.delete(targetFilePath);
311
- const messages = this.getParsedMessages(targetFilePath, forkedSessionId);
312
- const title = this.resolveClaudeTitle(persistedForkRecords) || "";
313
- return {
314
- session: {
315
- provider: this.providerId,
316
- providerSessionId: forkedSessionId,
317
- title,
318
- workspacePath,
319
- rawStoreRef: targetFilePath,
320
- isArchived: false,
321
- lastMessageAt: messages.at(-1)?.timestamp ?? nextTimestamp(),
322
- messageCount: messages.length,
323
- parentProviderSessionId: null,
324
- isSubagent: false,
325
- subagentLabel: null
326
- },
327
- forkMethod,
328
- forkSourceType: options.sourceType,
329
- inheritedPrefixMessageCount: messages.length,
330
- providerSourceMessageId
331
- };
332
- }
333
- async sendMessage(providerSessionId, rawStoreRef, content, clientRequestId, _permissionMode) {
334
- const records = readJsonLines(rawStoreRef).map((record) => record.data);
335
- const lineNumber = records.length + 1;
336
- const acceptedAt = nextTimestamp();
337
- const cwd = records
338
- .map((record) => ensureText(record.cwd))
339
- .find((value) => value.length > 0) ?? "";
340
- appendJsonLine(rawStoreRef, {
341
- parentUuid: null,
342
- isSidechain: false,
343
- promptId: crypto.randomUUID(),
344
- type: "user",
345
- message: {
346
- role: "user",
347
- content: [{ type: "text", text: content }]
348
- },
349
- uuid: crypto.randomUUID(),
350
- timestamp: acceptedAt,
351
- cwd,
352
- sessionId: providerSessionId,
353
- clientRequestId
354
- });
355
- const rawRef = createRawRef(this.providerId, rawStoreRef, lineNumber, 0);
356
- this.historyCache.delete(rawStoreRef);
357
- this.sessionSummaryCache.delete(rawStoreRef);
358
- return {
359
- acceptedAt,
360
- clientRequestId,
361
- message: {
362
- messageId: messageIdFromRawRef(rawRef),
363
- provider: this.providerId,
364
- providerSessionId,
365
- role: "user",
366
- kind: "text",
367
- content,
368
- toolCall: null,
369
- timestamp: acceptedAt,
370
- sequence: this.parseMessages(rawStoreRef, readJsonLines(rawStoreRef).map((record) => record.data), providerSessionId).length,
371
- rawRef
372
- }
373
- };
374
- }
375
- async readSessionTitle(providerSessionId, rawStoreRef) {
376
- if (isPendingClaudeRuntimeRef(providerSessionId, rawStoreRef)) {
377
- return "";
378
- }
379
- statSync(rawStoreRef);
380
- const records = readJsonLines(rawStoreRef).map((record) => record.data);
381
- const messages = this.parseMessages(rawStoreRef, records, providerSessionId);
382
- return this.resolveDetectedClaudeTitle(records, messages, rawStoreRef);
383
- }
384
- async renameSessionTitle(providerSessionId, rawStoreRef, title) {
385
- const nextTitle = title.trim();
386
- statSync(rawStoreRef);
387
- appendJsonLine(rawStoreRef, {
388
- type: "ai-title",
389
- sessionId: providerSessionId,
390
- aiTitle: nextTitle
391
- });
392
- this.historyCache.delete(rawStoreRef);
393
- this.sessionSummaryCache.delete(rawStoreRef);
394
- return nextTitle;
395
- }
396
- async updateSessionArchiveState() {
397
- throw new Error("claude-code archive state is managed by host");
398
- }
399
- async deleteSession(providerSessionId, rawStoreRef) {
400
- const targetFilePath = this.resolveForkSourceFilePath(rawStoreRef, providerSessionId);
401
- if (!existsSync(targetFilePath)) {
402
- throw new Error("PROVIDER_SESSION_NOT_FOUND");
403
- }
404
- rmSync(targetFilePath, { force: true });
405
- this.historyCache.delete(targetFilePath);
406
- this.sessionSummaryCache.delete(targetFilePath);
407
- }
408
- getProviderCapabilities() {
409
- return {
410
- provider: this.providerId,
411
- canStartSession: true,
412
- canResumeSession: true,
413
- canSendMessage: true,
414
- inRunInputMode: "streaming_guidance",
415
- supportsSubagents: true,
416
- supportsInterrupt: false,
417
- supportsStructuredToolCalls: true,
418
- supportsTokenUsage: true,
419
- supportsAttachments: true,
420
- supportsPermissionPrompt: true,
421
- supportsPermissionRequests: true,
422
- supportsSessionFork: true,
423
- supportsSessionDelete: true,
424
- supportsCheckpoint: false,
425
- modelOptions: this.options.modelOptions ?? CLAUDE_COMPAT_MODEL_OPTIONS,
426
- limitations: this.options.capabilityLimitations
427
- ?? ["当前实现只读取原生 jsonl,会话恢复不负责拉起外部 Claude 进程。"]
428
- };
429
- }
430
- async getSessionCapabilities() {
431
- return this.getProviderCapabilities();
432
- }
433
- async readContextUsage(providerSessionId, rawStoreRef) {
434
- statSync(rawStoreRef);
435
- const records = readJsonLines(rawStoreRef).map((record) => record.data);
436
- for (let index = records.length - 1; index >= 0; index -= 1) {
437
- const snapshot = extractClaudeUsageSnapshot(records[index]);
438
- if (!snapshot) {
439
- continue;
440
- }
441
- const uncachedInputTokens = readNonNegativeInteger(snapshot.usage.input_tokens) ?? 0;
442
- const cacheCreationInputTokens = readNonNegativeInteger(snapshot.usage.cache_creation_input_tokens) ?? 0;
443
- const cacheReadInputTokens = readNonNegativeInteger(snapshot.usage.cache_read_input_tokens) ?? 0;
444
- const cachedInputTokens = cacheCreationInputTokens + cacheReadInputTokens;
445
- const promptTokens = uncachedInputTokens + cachedInputTokens;
446
- const modelId = ensureText(snapshot.model ?? snapshot.recordModel).trim() || null;
447
- const contextWindow = resolveClaudeContextWindow(modelId);
448
- return {
449
- provider: this.providerId,
450
- promptTokens,
451
- uncachedInputTokens,
452
- cachedInputTokens,
453
- contextWindow,
454
- usageRatio: clampClaudeUsageRatio(promptTokens, contextWindow),
455
- source: "provider-log",
456
- contextWindowSource: "model-map",
457
- modelId,
458
- capturedAt: safeDate(snapshot.timestamp, "").trim() || null,
459
- isEstimated: true
460
- };
461
- }
462
- return null;
463
- }
464
- resolveClaudeTitle(records) {
465
- // Claude 会在会话过程中多次刷新 ai-title,取最后一个有效值才是当前标题。
466
- for (let index = records.length - 1; index >= 0; index -= 1) {
467
- const record = records[index];
468
- if (record?.type !== "ai-title") {
469
- continue;
470
- }
471
- const title = ensureText(record.aiTitle).trim();
472
- if (title.length > 0) {
473
- return title;
474
- }
475
- }
476
- return "";
477
- }
478
- resolveDetectedClaudeTitle(records, messages, rawStoreRef) {
479
- return (this.resolveClaudeTitle(records) ||
480
- resolveClaudeFallbackTitle(messages) ||
481
- this.resolveClaudeSlug(records) ||
482
- basename(rawStoreRef, ".jsonl"));
483
- }
484
- resolveClaudeSlug(records) {
485
- for (let index = records.length - 1; index >= 0; index -= 1) {
486
- const slug = ensureText(records[index]?.slug).trim();
487
- if (slug.length > 0) {
488
- return slug;
489
- }
490
- }
491
- return "";
492
- }
493
- listWorkspaceFiles(workspacePath) {
494
- return this.getSessionStoreProfile().resolveWorkspaceFiles(this.options.homeDir, workspacePath);
495
- }
496
- resolveForkSourceFilePath(rawStoreRef, providerSessionId, workspacePath = "") {
497
- if (existsSync(rawStoreRef)) {
498
- return rawStoreRef;
499
- }
500
- const discoveredFilePath = this.getSessionStoreProfile().findSessionFile(this.options.homeDir, workspacePath, providerSessionId);
501
- if (discoveredFilePath) {
502
- return discoveredFilePath;
503
- }
504
- throw new Error("PROVIDER_SESSION_NOT_FOUND");
505
- }
506
- locateForkTarget(records, providerSessionId, sourceMessageId) {
507
- const toolNameById = new Map();
508
- const stableMessageRefByIdentity = new Map();
509
- const progressiveMessagesByTrackKey = new Map();
510
- let sequence = 0;
511
- let matched = null;
512
- records.forEach((record, recordIndex) => {
513
- this.collectMessageEnvelopes(record).forEach((envelope) => {
514
- const parts = normalizeClaudeMessageParts(envelope.message.content);
515
- parts.forEach((part, partIndex) => {
516
- const normalized = normalizeClaudeMessagePart({
517
- part,
518
- envelope,
519
- providerId: this.providerId,
520
- providerSessionId,
521
- partIndex,
522
- timestamp: safeDate(envelope.timestamp, nextTimestamp()),
523
- toolNameById,
524
- resolveStableMessageRef: (identity) => {
525
- const existing = stableMessageRefByIdentity.get(identity);
526
- if (existing) {
527
- return existing;
528
- }
529
- sequence += 1;
530
- const created = {
531
- sequence,
532
- rawRef: buildClaudeStableRawRef(identity, this.providerId)
533
- };
534
- stableMessageRefByIdentity.set(identity, created);
535
- return created;
536
- }
537
- });
538
- if (!normalized) {
539
- return;
540
- }
541
- if (normalized.role === "user") {
542
- progressiveMessagesByTrackKey.clear();
543
- }
544
- const trackKey = buildClaudeProgressiveTrackKey(normalized, partIndex);
545
- const previousProgressive = trackKey
546
- ? progressiveMessagesByTrackKey.get(trackKey) ?? null
547
- : null;
548
- const nextMessage = previousProgressive && shouldReuseClaudeProgressiveIdentity(previousProgressive, normalized)
549
- ? {
550
- ...normalized,
551
- messageId: previousProgressive.messageId,
552
- rawRef: previousProgressive.rawRef,
553
- sequence: previousProgressive.sequence
554
- }
555
- : normalized;
556
- if (trackKey) {
557
- progressiveMessagesByTrackKey.set(trackKey, nextMessage);
558
- }
559
- if (nextMessage.messageId === sourceMessageId) {
560
- matched = {
561
- recordIndex,
562
- partIndex,
563
- recordSource: envelope.source,
564
- providerSourceMessageId: envelope.messageId
565
- };
566
- }
567
- });
568
- });
569
- });
570
- return matched;
571
- }
572
- getParsedMessages(filePath, providerSessionId) {
573
- const stats = statSync(filePath);
574
- const cached = this.historyCache.get(filePath);
575
- if (cached
576
- && cached.providerSessionId === providerSessionId
577
- && cached.mtimeMs === stats.mtimeMs
578
- && cached.size === stats.size) {
579
- this.touchHistoryCache(filePath, cached);
580
- return cached.messages;
581
- }
582
- const records = readJsonLines(filePath).map((record) => record.data);
583
- const messages = this.parseMessages(filePath, records, providerSessionId);
584
- this.touchHistoryCache(filePath, {
585
- filePath,
586
- providerSessionId,
587
- mtimeMs: stats.mtimeMs,
588
- size: stats.size,
589
- messages
590
- });
591
- return messages;
592
- }
593
- touchHistoryCache(filePath, entry) {
594
- this.historyCache.delete(filePath);
595
- this.historyCache.set(filePath, entry);
596
- while (this.historyCache.size > HISTORY_CACHE_LIMIT) {
597
- const oldestKey = this.historyCache.keys().next().value;
598
- if (!oldestKey) {
599
- break;
600
- }
601
- this.historyCache.delete(oldestKey);
602
- }
603
- }
604
- touchSessionSummaryCache(filePath, entry) {
605
- this.sessionSummaryCache.delete(filePath);
606
- this.sessionSummaryCache.set(filePath, entry);
607
- while (this.sessionSummaryCache.size > SESSION_SUMMARY_CACHE_LIMIT) {
608
- const oldestKey = this.sessionSummaryCache.keys().next().value;
609
- if (!oldestKey) {
610
- break;
611
- }
612
- this.sessionSummaryCache.delete(oldestKey);
613
- }
614
- }
615
- parseMessages(filePath, records, providerSessionId = basename(filePath, ".jsonl")) {
616
- const messageEntries = [];
617
- const entryIndexByMessageId = new Map();
618
- const toolNameById = new Map();
619
- const stableMessageRefByIdentity = new Map();
620
- const progressiveMessagesByTrackKey = new Map();
621
- let sequence = 0;
622
- let nextGroupOrder = 0;
623
- const groupOrderByKey = new Map();
624
- records.forEach((record, recordIndex) => {
625
- this.collectMessageEnvelopes(record).forEach((envelope, envelopeIndex) => {
626
- const parts = normalizeClaudeMessageParts(envelope.message.content);
627
- const groupKey = buildClaudeEnvelopeGroupKey(envelope, record, recordIndex, envelopeIndex);
628
- const groupOrder = (() => {
629
- const existing = groupOrderByKey.get(groupKey);
630
- if (existing !== undefined) {
631
- return existing;
632
- }
633
- nextGroupOrder += 1;
634
- groupOrderByKey.set(groupKey, nextGroupOrder);
635
- return nextGroupOrder;
636
- })();
637
- parts.forEach((part, partIndex) => {
638
- const normalized = normalizeClaudeMessagePart({
639
- part,
640
- envelope,
641
- providerId: this.providerId,
642
- providerSessionId,
643
- partIndex,
644
- timestamp: safeDate(envelope.timestamp, nextTimestamp()),
645
- toolNameById,
646
- resolveStableMessageRef: (identity) => {
647
- const existing = stableMessageRefByIdentity.get(identity);
648
- if (existing) {
649
- return existing;
650
- }
651
- sequence += 1;
652
- const created = {
653
- sequence,
654
- rawRef: buildClaudeStableRawRef(identity, this.providerId)
655
- };
656
- stableMessageRefByIdentity.set(identity, created);
657
- return created;
658
- }
659
- });
660
- if (!normalized) {
661
- return;
662
- }
663
- if (normalized.role === "user") {
664
- progressiveMessagesByTrackKey.clear();
665
- }
666
- const trackKey = buildClaudeProgressiveTrackKey(normalized, partIndex);
667
- const previousProgressive = trackKey
668
- ? progressiveMessagesByTrackKey.get(trackKey) ?? null
669
- : null;
670
- const nextMessage = previousProgressive && shouldReuseClaudeProgressiveIdentity(previousProgressive, normalized)
671
- ? {
672
- ...normalized,
673
- messageId: previousProgressive.messageId,
674
- rawRef: previousProgressive.rawRef,
675
- sequence: previousProgressive.sequence
676
- }
677
- : normalized;
678
- if (trackKey) {
679
- progressiveMessagesByTrackKey.set(trackKey, nextMessage);
680
- }
681
- const signature = buildClaudeMessageSignature(nextMessage);
682
- const currentEntryIndex = entryIndexByMessageId.get(nextMessage.messageId);
683
- const current = currentEntryIndex === undefined
684
- ? null
685
- : (messageEntries[currentEntryIndex]?.message ?? null);
686
- if (current && buildClaudeMessageSignature(current) === signature) {
687
- return;
688
- }
689
- if (currentEntryIndex === undefined) {
690
- entryIndexByMessageId.set(nextMessage.messageId, messageEntries.length);
691
- messageEntries.push({
692
- message: nextMessage,
693
- groupOrder,
694
- partIndex
695
- });
696
- return;
697
- }
698
- messageEntries[currentEntryIndex] = {
699
- message: nextMessage,
700
- groupOrder,
701
- partIndex
702
- };
703
- });
704
- });
705
- });
706
- return messageEntries
707
- .sort((left, right) => {
708
- if (left.groupOrder !== right.groupOrder) {
709
- return left.groupOrder - right.groupOrder;
710
- }
711
- const kindOrder = resolveClaudeHistoryKindOrder(left.message.kind)
712
- - resolveClaudeHistoryKindOrder(right.message.kind);
713
- if (kindOrder !== 0) {
714
- return kindOrder;
715
- }
716
- if (left.partIndex !== right.partIndex) {
717
- return left.partIndex - right.partIndex;
718
- }
719
- const timestampOrder = left.message.timestamp.localeCompare(right.message.timestamp);
720
- if (timestampOrder !== 0) {
721
- return timestampOrder;
722
- }
723
- return left.message.rawRef.localeCompare(right.message.rawRef);
724
- })
725
- .map((entry, index) => ({
726
- ...entry.message,
727
- sequence: index + 1
728
- }));
729
- }
730
- collectMessageEnvelopes(record) {
731
- const envelopes = [];
732
- const directType = ensureText(record.type);
733
- const directMessage = toClaudeRecord(record.message);
734
- if (directType === "user" || directType === "assistant") {
735
- envelopes.push({
736
- type: directType,
737
- source: "direct",
738
- messageId: readClaudeMessageId(directMessage, record),
739
- timestamp: record.timestamp,
740
- message: directMessage
741
- });
742
- }
743
- const progressMessage = this.readProgressEnvelope(record);
744
- if (progressMessage) {
745
- envelopes.push(progressMessage);
746
- }
747
- return envelopes;
748
- }
749
- readProgressEnvelope(record) {
750
- if (ensureText(record.type) !== "progress") {
751
- return null;
752
- }
753
- const nested = toClaudeRecord(toClaudeRecord(record.data).message);
754
- const nestedType = ensureText(nested.type);
755
- const nestedMessage = toClaudeRecord(nested.message);
756
- if (nestedType !== "user" && nestedType !== "assistant") {
757
- return null;
758
- }
759
- return {
760
- type: nestedType,
761
- source: "progress",
762
- messageId: readClaudeMessageId(nestedMessage, nested),
763
- timestamp: nested.timestamp ?? record.timestamp,
764
- message: nestedMessage
765
- };
766
- }
767
- getSessionStoreProfile() {
768
- return this.options.sessionStoreProfile ?? CLAUDE_CODE_SESSION_STORE_PROFILE;
769
- }
770
- getDefaultSessionTitle() {
771
- return this.options.defaultSessionTitle ?? "New Claude Code session";
772
- }
773
- }
774
- function buildClaudeEnvelopeGroupKey(envelope, record, recordIndex, envelopeIndex) {
775
- if (envelope.messageId) {
776
- return `${envelope.type}:message:${envelope.messageId}`;
777
- }
778
- const sessionId = ensureText(record.sessionId).trim()
779
- || ensureText(record.session_id).trim()
780
- || "unknown";
781
- const timestamp = ensureText(record.timestamp).trim() || `record-${recordIndex}`;
782
- return `${envelope.type}:${envelope.source}:${sessionId}:${timestamp}:${recordIndex}:${envelopeIndex}`;
783
- }
784
- function resolveClaudeHistoryKindOrder(kind) {
785
- switch (kind) {
786
- case "thinking":
787
- return 0;
788
- case "text":
789
- return 1;
790
- case "tool_call":
791
- return 2;
792
- case "tool_result":
793
- return 3;
794
- default:
795
- return 4;
796
- }
797
- }
798
- function isPendingClaudeRuntimeRef(providerSessionId, rawStoreRef) {
799
- if (providerSessionId.trim().toLowerCase().startsWith("pending://")) {
800
- return true;
801
- }
802
- const normalizedRawStoreRef = rawStoreRef.replaceAll("\\", "/").toLowerCase();
803
- return normalizedRawStoreRef.includes("/.pending-");
804
- }
805
- function resolveClaudeFallbackTitle(messages) {
806
- const preferredMessage = messages.find((message) => message.role === "user" && !looksLikeClaudeSyntheticTitleMessage(message.content));
807
- if (preferredMessage) {
808
- return normalizeClaudeMessageTitle(preferredMessage.content);
809
- }
810
- const firstUserMessage = messages.find((message) => message.role === "user");
811
- return normalizeClaudeMessageTitle(firstUserMessage?.content);
812
- }
813
- function normalizeClaudeMessageTitle(content) {
814
- const normalized = ensureText(content).trim().replace(/\s+/g, " ");
815
- if (normalized.length === 0) {
816
- return null;
817
- }
818
- return normalized.slice(0, 48);
819
- }
820
- function looksLikeClaudeSyntheticTitleMessage(content) {
821
- const normalized = content.trim();
822
- if (normalized.length === 0) {
823
- return true;
824
- }
825
- if (looksLikeClaudeRulesMessage(normalized)) {
826
- return true;
827
- }
828
- return /^<(?:ide_[a-z0-9_:-]+|local-command-[a-z0-9_:-]+|command-name)>[\s\S]*$/i.test(normalized);
829
- }
830
- function looksLikeClaudeRulesMessage(content) {
831
- const beginsWithRulesHeader = /^#?\s*AGENTS\.md instructions for\b/i.test(content);
832
- if (beginsWithRulesHeader) {
833
- return true;
834
- }
835
- return /AGENTS\.md instructions for/i.test(content)
836
- && /<INSTRUCTIONS>/i.test(content);
837
- }
838
- function cloneJsonRecord(value) {
839
- return JSON.parse(JSON.stringify(value));
840
- }
841
- function replaceClaudeRecordSessionId(record, sessionId) {
842
- const nextRecord = cloneJsonRecord(record);
843
- replaceClaudeSessionIdRecursive(nextRecord, sessionId);
844
- return nextRecord;
845
- }
846
- function replaceClaudeSessionIdRecursive(value, sessionId) {
847
- if (!value || typeof value !== "object") {
848
- return;
849
- }
850
- if (Array.isArray(value)) {
851
- value.forEach((item) => replaceClaudeSessionIdRecursive(item, sessionId));
852
- return;
853
- }
854
- const record = value;
855
- if (typeof record.sessionId === "string" && record.sessionId.trim().length > 0) {
856
- record.sessionId = sessionId;
857
- }
858
- Object.values(record).forEach((nested) => replaceClaudeSessionIdRecursive(nested, sessionId));
859
- }
860
- function truncateClaudeForkRecord(record, target, snapshot = null) {
861
- const nextRecord = cloneJsonRecord(record);
862
- if (target.recordSource === "progress") {
863
- const progressData = toClaudeRecord(nextRecord.data);
864
- const nestedEnvelope = toClaudeRecord(progressData.message);
865
- nestedEnvelope.message = truncateClaudeMessageContent(toClaudeRecord(nestedEnvelope.message), target.partIndex, snapshot);
866
- progressData.message = nestedEnvelope;
867
- nextRecord.data = progressData;
868
- return nextRecord;
869
- }
870
- nextRecord.message = truncateClaudeMessageContent(toClaudeRecord(nextRecord.message), target.partIndex, snapshot);
871
- return nextRecord;
872
- }
873
- function truncateClaudeMessageContent(message, partIndex, snapshot = null) {
874
- const content = message.content;
875
- if (Array.isArray(content)) {
876
- const truncated = content.slice(0, partIndex + 1);
877
- const targetPart = truncated[partIndex];
878
- if (snapshot && targetPart && typeof targetPart === "object" && !Array.isArray(targetPart)) {
879
- const nextPart = { ...targetPart };
880
- if (snapshot.kind === "thinking") {
881
- nextPart.thinking = snapshot.content;
882
- }
883
- else {
884
- nextPart.text = snapshot.content;
885
- }
886
- truncated[partIndex] = nextPart;
887
- }
888
- message.content = truncated;
889
- }
890
- return message;
891
- }
892
- function shouldPreserveClaudeForkRecord(record) {
893
- return record.type !== "ai-title";
894
- }
895
- function buildClaudeSubagentMetadataIndex(files) {
896
- const metadataByFilePath = new Map();
897
- const filePathSet = new Set(files);
898
- for (const filePath of files) {
899
- const metadata = parseClaudeSubagentPathMetadata(filePath);
900
- if (!metadata) {
901
- continue;
902
- }
903
- metadataByFilePath.set(filePath, metadata);
904
- }
905
- for (const filePath of files) {
906
- const records = readJsonLines(filePath).map((record) => record.data);
907
- const taskSpawnMetadata = parseClaudeTaskSpawnMetadata(filePath, records, filePathSet);
908
- for (const [childFilePath, metadata] of taskSpawnMetadata) {
909
- const existing = metadataByFilePath.get(childFilePath);
910
- if (!existing) {
911
- metadataByFilePath.set(childFilePath, metadata);
912
- continue;
913
- }
914
- metadataByFilePath.set(childFilePath, {
915
- ...existing,
916
- subagentLabel: existing.subagentLabel ?? metadata.subagentLabel
917
- });
918
- }
919
- }
920
- return metadataByFilePath;
921
- }
922
- function parseClaudeSubagentPathMetadata(filePath) {
923
- const normalizedPath = filePath.replaceAll("\\", "/");
924
- const matched = normalizedPath.match(/\/([^/]+)\/subagents\/([^/]+)\.jsonl$/i);
925
- if (!matched?.[1] || !matched[2]) {
926
- return null;
927
- }
928
- const parentProviderSessionId = matched[1];
929
- const agentFileName = matched[2];
930
- return {
931
- providerSessionId: `${parentProviderSessionId}::${agentFileName}`,
932
- parentProviderSessionId,
933
- subagentLabel: readClaudeSubagentMetaLabel(filePath)
934
- };
935
- }
936
- function parseClaudeTaskSpawnMetadata(filePath, records, filePathSet) {
937
- const taskSpawnMetadata = new Map();
938
- const taskRequestByToolId = new Map();
939
- const parentDir = dirname(filePath);
940
- for (const record of records) {
941
- const sessionId = ensureText(record.sessionId).trim();
942
- if (!sessionId) {
943
- continue;
944
- }
945
- for (const message of collectClaudeRecordMessages(record)) {
946
- if (message.role === "assistant") {
947
- for (const taskRequest of extractClaudeTaskRequests(message.message)) {
948
- taskRequestByToolId.set(taskRequest.toolUseId, {
949
- parentProviderSessionId: sessionId,
950
- subagentLabel: formatClaudeSubagentLabel(taskRequest.subagentType, taskRequest.description)
951
- });
952
- }
953
- continue;
954
- }
955
- if (message.role !== "user") {
956
- continue;
957
- }
958
- for (const toolUseId of extractClaudeToolResultIds(message.message)) {
959
- const taskRequest = taskRequestByToolId.get(toolUseId);
960
- const agentFileName = normalizeClaudeAgentFileName(readClaudeTaskResultAgentId(record));
961
- if (!taskRequest || !agentFileName) {
962
- continue;
963
- }
964
- const childFilePath = join(parentDir, `${agentFileName}.jsonl`);
965
- if (!filePathSet.has(childFilePath)) {
966
- continue;
967
- }
968
- taskSpawnMetadata.set(childFilePath, {
969
- providerSessionId: `${taskRequest.parentProviderSessionId}::${agentFileName}`,
970
- parentProviderSessionId: taskRequest.parentProviderSessionId,
971
- subagentLabel: taskRequest.subagentLabel
972
- });
973
- }
974
- }
975
- }
976
- return taskSpawnMetadata;
977
- }
978
- function collectClaudeRecordMessages(record) {
979
- const messages = [];
980
- const directRole = ensureText(toClaudeRecord(record.message).role).trim();
981
- const directMessage = toClaudeRecord(record.message);
982
- if ((directRole === "assistant" || directRole === "user") && Object.keys(directMessage).length > 0) {
983
- messages.push({
984
- role: directRole,
985
- message: directMessage
986
- });
987
- }
988
- if (ensureText(record.type) !== "progress") {
989
- return messages;
990
- }
991
- const nested = toClaudeRecord(toClaudeRecord(record.data).message);
992
- const nestedRole = ensureText(toClaudeRecord(nested.message).role).trim();
993
- const nestedMessage = toClaudeRecord(nested.message);
994
- if ((nestedRole === "assistant" || nestedRole === "user") && Object.keys(nestedMessage).length > 0) {
995
- messages.push({
996
- role: nestedRole,
997
- message: nestedMessage
998
- });
999
- }
1000
- return messages;
1001
- }
1002
- function extractClaudeTaskRequests(message) {
1003
- const content = Array.isArray(message.content) ? message.content : [];
1004
- const requests = [];
1005
- for (const item of content) {
1006
- const part = toClaudeRecord(item);
1007
- const partType = ensureText(part.type).trim();
1008
- const toolUseId = ensureText(part.id).trim();
1009
- const toolName = ensureText(part.name).trim();
1010
- if (partType !== "tool_use" || toolName !== "Task" || !toolUseId) {
1011
- continue;
1012
- }
1013
- const input = toClaudeRecord(part.input);
1014
- requests.push({
1015
- toolUseId,
1016
- subagentType: ensureText(input.subagent_type).trim(),
1017
- description: ensureText(input.description).trim()
1018
- });
1019
- }
1020
- return requests;
1021
- }
1022
- function extractClaudeToolResultIds(message) {
1023
- const content = Array.isArray(message.content) ? message.content : [];
1024
- const toolResultIds = [];
1025
- for (const item of content) {
1026
- const part = toClaudeRecord(item);
1027
- if (ensureText(part.type).trim() !== "tool_result") {
1028
- continue;
1029
- }
1030
- const toolUseId = ensureText(part.tool_use_id).trim();
1031
- if (toolUseId) {
1032
- toolResultIds.push(toolUseId);
1033
- }
1034
- }
1035
- return toolResultIds;
1036
- }
1037
- function readClaudeTaskResultAgentId(record) {
1038
- const toolUseResult = toClaudeRecord(record.toolUseResult);
1039
- return ensureText(toolUseResult.agentId).trim();
1040
- }
1041
- function normalizeClaudeAgentFileName(agentId) {
1042
- const normalizedAgentId = agentId.trim();
1043
- if (!normalizedAgentId) {
1044
- return null;
1045
- }
1046
- if (/^agent-[^/]+$/i.test(normalizedAgentId)) {
1047
- return normalizedAgentId;
1048
- }
1049
- return /^[-a-z0-9_]+$/i.test(normalizedAgentId) ? `agent-${normalizedAgentId}` : null;
1050
- }
1051
- function readClaudeSubagentMetaLabel(filePath) {
1052
- const metaFilePath = filePath.replace(/\.jsonl$/i, ".meta.json");
1053
- if (!existsSync(metaFilePath)) {
1054
- return null;
1055
- }
1056
- try {
1057
- const meta = JSON.parse(readFirstNonEmptyLine(metaFilePath, 64 * 1024) ?? "{}");
1058
- return formatClaudeSubagentLabel(ensureText(meta.agentType).trim(), ensureText(meta.description).trim());
1059
- }
1060
- catch {
1061
- return null;
1062
- }
1063
- }
1064
- function formatClaudeSubagentLabel(subagentType, description) {
1065
- const normalizedType = subagentType.trim().toLowerCase();
1066
- const normalizedDescription = description.trim();
1067
- if (!normalizedType && !normalizedDescription) {
1068
- return null;
1069
- }
1070
- if (!normalizedType) {
1071
- return normalizedDescription;
1072
- }
1073
- if (!normalizedDescription) {
1074
- return normalizedType;
1075
- }
1076
- return `${normalizedType} · ${normalizedDescription}`;
1077
- }
1078
- function shouldHideClaudeDebugSession(filePath) {
1079
- const normalizedPath = filePath.replaceAll("\\", "/");
1080
- if (normalizedPath.includes("/subagents/")) {
1081
- return false;
1082
- }
1083
- const firstLine = readFirstNonEmptyLine(filePath);
1084
- if (!firstLine) {
1085
- return false;
1086
- }
1087
- try {
1088
- const record = JSON.parse(firstLine);
1089
- const firstUserContent = extractClaudeDebugMessageText(record.message?.content);
1090
- return (record.type === "user" &&
1091
- Boolean(record.isSidechain) &&
1092
- ensureText(record.agentId).trim().length > 0 &&
1093
- /^agent-[^/]+\.jsonl$/i.test(basename(filePath)) &&
1094
- firstUserContent === "Warmup");
1095
- }
1096
- catch {
1097
- return false;
1098
- }
1099
- }
1100
- function isPendingClaudeRuntimeFile(filePath) {
1101
- const normalizedPath = filePath.replaceAll("\\", "/").toLowerCase();
1102
- return /\/\.pending-[^/]+\.jsonl$/i.test(normalizedPath);
1103
- }
1104
- function extractClaudeDebugMessageText(content) {
1105
- if (typeof content === "string") {
1106
- return content.trim();
1107
- }
1108
- if (!Array.isArray(content)) {
1109
- return "";
1110
- }
1111
- return content
1112
- .map((item) => {
1113
- if (typeof item === "string") {
1114
- return item;
1115
- }
1116
- if (!item || typeof item !== "object") {
1117
- return "";
1118
- }
1119
- return ensureText(item.text);
1120
- })
1121
- .join("\n")
1122
- .trim();
1123
- }
1124
- function extractClaudeUsageSnapshot(record) {
1125
- const directType = ensureText(record.type).trim();
1126
- if (directType === "assistant") {
1127
- const message = (record.message ?? {});
1128
- const usage = (message.usage ?? {});
1129
- if (Object.keys(usage).length > 0) {
1130
- return {
1131
- usage,
1132
- timestamp: record.timestamp,
1133
- model: message.model,
1134
- recordModel: record.model
1135
- };
1136
- }
1137
- }
1138
- if (directType !== "progress") {
1139
- return null;
1140
- }
1141
- const data = (record.data ?? {});
1142
- const nested = (data.message ?? {});
1143
- if (ensureText(nested.type).trim() !== "assistant") {
1144
- return null;
1145
- }
1146
- const message = (nested.message ?? {});
1147
- const usage = (message.usage ?? {});
1148
- if (Object.keys(usage).length === 0) {
1149
- return null;
1150
- }
1151
- return {
1152
- usage,
1153
- timestamp: nested.timestamp ?? record.timestamp,
1154
- model: message.model,
1155
- recordModel: nested.model ?? record.model
1156
- };
1157
- }
1158
- function readNonNegativeInteger(value) {
1159
- if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
1160
- return Math.trunc(value);
1161
- }
1162
- if (typeof value === "string" && /^\d+$/.test(value.trim())) {
1163
- return Number.parseInt(value.trim(), 10);
1164
- }
1165
- return null;
1166
- }
1167
- function resolveClaudeContextWindow(modelId) {
1168
- const normalizedModelId = modelId?.trim().toLowerCase() ?? "";
1169
- if (normalizedModelId.includes("claude") ||
1170
- normalizedModelId === "sonnet" ||
1171
- normalizedModelId === "opus" ||
1172
- normalizedModelId === "haiku" ||
1173
- normalizedModelId.length === 0) {
1174
- return DEFAULT_CLAUDE_CONTEXT_WINDOW;
1175
- }
1176
- return DEFAULT_CLAUDE_CONTEXT_WINDOW;
1177
- }
1178
- function clampClaudeUsageRatio(promptTokens, contextWindow) {
1179
- if (contextWindow <= 0) {
1180
- return 0;
1181
- }
1182
- return Math.min(Math.max(promptTokens / contextWindow, 0), 1);
1183
- }
1184
- //# sourceMappingURL=claude-code.js.map