spec-cat 0.1.63 → 0.1.65

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 (271) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/B-bFNWCF.js +43 -0
  3. package/.output/public/_nuxt/{D4LyIv_t.js → BEWSHKZd.js} +1 -1
  4. package/.output/public/_nuxt/{Su-Cl_JF.js → BHhMtuRK.js} +1 -1
  5. package/.output/public/_nuxt/{DwpuOtAP.js → BwRpECPL.js} +1 -1
  6. package/.output/public/_nuxt/{FfyCVKRU.js → CC_9aMCT.js} +1 -1
  7. package/.output/public/_nuxt/CHHbeXzh.js +1 -0
  8. package/.output/public/_nuxt/{DIOhMCOf.js → CzV__9yP.js} +3 -3
  9. package/.output/public/_nuxt/{Bz2rU2zs.js → DWDrIutw.js} +1 -1
  10. package/.output/public/_nuxt/D_4Ow2w2.js +1 -0
  11. package/.output/public/_nuxt/D_T_F7lf.js +1 -0
  12. package/.output/public/_nuxt/{DPOGSCeV.js → DqFq1MXh.js} +1 -1
  13. package/.output/public/_nuxt/YzuyFhrD.js +174 -0
  14. package/.output/public/_nuxt/builds/latest.json +1 -1
  15. package/.output/public/_nuxt/builds/meta/cdc4ded8-9ff7-4e22-abbe-3b8c94caa781.json +1 -0
  16. package/.output/public/_nuxt/default.Cyeq1Er8.css +1 -0
  17. package/.output/public/_nuxt/entry.uBSFaL6A.css +1 -0
  18. package/.output/public/_nuxt/{useTheme.Cny4Z64J.css → useTheme.B4wINCoW.css} +1 -1
  19. package/.output/public/_nuxt/uyJF9wDo.js +58 -0
  20. package/.output/server/chunks/_/aiProviderRegistry.mjs +1 -2
  21. package/.output/server/chunks/_/aiProviderRegistry.mjs.map +1 -1
  22. package/.output/server/chunks/_/aiProviderSelection.mjs +2 -2
  23. package/.output/server/chunks/_/chatGit.mjs +1 -2
  24. package/.output/server/chunks/_/chatGit.mjs.map +1 -1
  25. package/.output/server/chunks/_/claudeProvider.mjs +1 -215
  26. package/.output/server/chunks/_/claudeProvider.mjs.map +1 -1
  27. package/.output/server/chunks/_/claudeService.mjs +50 -54
  28. package/.output/server/chunks/_/claudeService.mjs.map +1 -1
  29. package/.output/server/chunks/_/codexProvider.mjs +47 -812
  30. package/.output/server/chunks/_/codexProvider.mjs.map +1 -1
  31. package/.output/server/chunks/_/git.mjs +1 -2
  32. package/.output/server/chunks/_/git.mjs.map +1 -1
  33. package/.output/server/chunks/_/gitApiHelpers.mjs +1 -1
  34. package/.output/server/chunks/_/gitBranchOperations.mjs +1 -1
  35. package/.output/server/chunks/_/interactiveProviderQuery.mjs +160 -0
  36. package/.output/server/chunks/_/interactiveProviderQuery.mjs.map +1 -0
  37. package/.output/server/chunks/_/jobPersister.mjs +37 -6
  38. package/.output/server/chunks/_/jobPersister.mjs.map +1 -1
  39. package/.output/server/chunks/_/jobQueue.mjs +430 -278
  40. package/.output/server/chunks/_/jobQueue.mjs.map +1 -1
  41. package/.output/server/chunks/_/terminalSessions.mjs +582 -0
  42. package/.output/server/chunks/_/terminalSessions.mjs.map +1 -0
  43. package/.output/server/chunks/_/worktreeSetup.mjs +98 -0
  44. package/.output/server/chunks/_/worktreeSetup.mjs.map +1 -0
  45. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  46. package/.output/server/chunks/build/client.precomputed.mjs.map +1 -1
  47. package/.output/server/chunks/nitro/nitro.mjs +1227 -620
  48. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  49. package/.output/server/chunks/routes/_ws.mjs +21 -111
  50. package/.output/server/chunks/routes/_ws.mjs.map +1 -1
  51. package/.output/server/chunks/routes/api/ai/providers.get.mjs +3 -1
  52. package/.output/server/chunks/routes/api/ai/providers.get.mjs.map +1 -1
  53. package/.output/server/chunks/routes/api/chat/compare.get.mjs +4 -5
  54. package/.output/server/chunks/routes/api/chat/compare.get.mjs.map +1 -1
  55. package/.output/server/chunks/routes/api/chat/context.get.mjs +4 -2
  56. package/.output/server/chunks/routes/api/chat/context.get.mjs.map +1 -1
  57. package/.output/server/chunks/routes/api/chat/finalize.post.mjs +11 -7
  58. package/.output/server/chunks/routes/api/chat/finalize.post.mjs.map +1 -1
  59. package/.output/server/chunks/routes/api/chat/generate-commit-message.post.mjs +26 -29
  60. package/.output/server/chunks/routes/api/chat/generate-commit-message.post.mjs.map +1 -1
  61. package/.output/server/chunks/routes/api/chat/preview-sync.post.mjs +4 -5
  62. package/.output/server/chunks/routes/api/chat/preview-sync.post.mjs.map +1 -1
  63. package/.output/server/chunks/routes/api/chat/preview.delete.mjs +4 -5
  64. package/.output/server/chunks/routes/api/chat/preview.delete.mjs.map +1 -1
  65. package/.output/server/chunks/routes/api/chat/preview.post.mjs +4 -6
  66. package/.output/server/chunks/routes/api/chat/preview.post.mjs.map +1 -1
  67. package/.output/server/chunks/routes/api/chat/rebase.post.mjs +4 -7
  68. package/.output/server/chunks/routes/api/chat/rebase.post.mjs.map +1 -1
  69. package/.output/server/chunks/routes/api/chat/worktree-commit.post.mjs +4 -6
  70. package/.output/server/chunks/routes/api/chat/worktree-commit.post.mjs.map +1 -1
  71. package/.output/server/chunks/routes/api/chat/worktree.delete.mjs +11 -4
  72. package/.output/server/chunks/routes/api/chat/worktree.delete.mjs.map +1 -1
  73. package/.output/server/chunks/routes/api/chat/worktree.post.mjs +4 -6
  74. package/.output/server/chunks/routes/api/chat/worktree.post.mjs.map +1 -1
  75. package/.output/server/chunks/routes/api/conversations/_conversationId/archive.post.mjs +10 -9
  76. package/.output/server/chunks/routes/api/conversations/_conversationId/archive.post.mjs.map +1 -1
  77. package/.output/server/chunks/routes/api/conversations/archives/_archiveId/restore.post.mjs +4 -7
  78. package/.output/server/chunks/routes/api/conversations/archives/_archiveId/restore.post.mjs.map +1 -1
  79. package/.output/server/chunks/routes/api/conversations/archives/_archiveId_.delete.mjs +4 -7
  80. package/.output/server/chunks/routes/api/conversations/archives/_archiveId_.delete.mjs.map +1 -1
  81. package/.output/server/chunks/routes/api/conversations/archives.delete.mjs +40 -0
  82. package/.output/server/chunks/routes/api/conversations/archives.delete.mjs.map +1 -0
  83. package/.output/server/chunks/routes/api/conversations/archives.get.mjs +4 -7
  84. package/.output/server/chunks/routes/api/conversations/archives.get.mjs.map +1 -1
  85. package/.output/server/chunks/routes/api/conversations/update.post.mjs +4 -7
  86. package/.output/server/chunks/routes/api/conversations/update.post.mjs.map +1 -1
  87. package/.output/server/chunks/routes/api/conversations.get.mjs +4 -7
  88. package/.output/server/chunks/routes/api/conversations.get.mjs.map +1 -1
  89. package/.output/server/chunks/routes/api/conversations.post.mjs +4 -7
  90. package/.output/server/chunks/routes/api/conversations.post.mjs.map +1 -1
  91. package/.output/server/chunks/routes/api/cwd.get.mjs +4 -2
  92. package/.output/server/chunks/routes/api/cwd.get.mjs.map +1 -1
  93. package/.output/server/chunks/routes/api/git/branch-rename.post.mjs +3 -4
  94. package/.output/server/chunks/routes/api/git/branch-rename.post.mjs.map +1 -1
  95. package/.output/server/chunks/routes/api/git/branch.delete.mjs +4 -5
  96. package/.output/server/chunks/routes/api/git/branch.delete.mjs.map +1 -1
  97. package/.output/server/chunks/routes/api/git/branches.get.mjs +4 -6
  98. package/.output/server/chunks/routes/api/git/branches.get.mjs.map +1 -1
  99. package/.output/server/chunks/routes/api/git/checkout.post.mjs +4 -5
  100. package/.output/server/chunks/routes/api/git/checkout.post.mjs.map +1 -1
  101. package/.output/server/chunks/routes/api/git/cherry-pick.post.mjs +3 -4
  102. package/.output/server/chunks/routes/api/git/cherry-pick.post.mjs.map +1 -1
  103. package/.output/server/chunks/routes/api/git/clean.post.mjs +3 -4
  104. package/.output/server/chunks/routes/api/git/clean.post.mjs.map +1 -1
  105. package/.output/server/chunks/routes/api/git/commit/_id_.get.mjs +3 -4
  106. package/.output/server/chunks/routes/api/git/commit/_id_.get.mjs.map +1 -1
  107. package/.output/server/chunks/routes/api/git/commit.post.mjs +4 -5
  108. package/.output/server/chunks/routes/api/git/commit.post.mjs.map +1 -1
  109. package/.output/server/chunks/routes/api/git/diff.get.mjs +4 -5
  110. package/.output/server/chunks/routes/api/git/diff.get.mjs.map +1 -1
  111. package/.output/server/chunks/routes/api/git/fetch.post.mjs +3 -4
  112. package/.output/server/chunks/routes/api/git/fetch.post.mjs.map +1 -1
  113. package/.output/server/chunks/routes/api/git/file-diff.get.mjs +4 -5
  114. package/.output/server/chunks/routes/api/git/file-diff.get.mjs.map +1 -1
  115. package/.output/server/chunks/routes/api/git/graph.get.mjs +4 -5
  116. package/.output/server/chunks/routes/api/git/graph.get.mjs.map +1 -1
  117. package/.output/server/chunks/routes/api/git/log.get.mjs +4 -5
  118. package/.output/server/chunks/routes/api/git/log.get.mjs.map +1 -1
  119. package/.output/server/chunks/routes/api/git/merge-base.get.mjs +4 -5
  120. package/.output/server/chunks/routes/api/git/merge-base.get.mjs.map +1 -1
  121. package/.output/server/chunks/routes/api/git/merge.post.mjs +3 -4
  122. package/.output/server/chunks/routes/api/git/merge.post.mjs.map +1 -1
  123. package/.output/server/chunks/routes/api/git/pull.post.mjs +3 -4
  124. package/.output/server/chunks/routes/api/git/pull.post.mjs.map +1 -1
  125. package/.output/server/chunks/routes/api/git/push.post.mjs +3 -4
  126. package/.output/server/chunks/routes/api/git/push.post.mjs.map +1 -1
  127. package/.output/server/chunks/routes/api/git/rebase.post.mjs +3 -4
  128. package/.output/server/chunks/routes/api/git/rebase.post.mjs.map +1 -1
  129. package/.output/server/chunks/routes/api/git/remote.delete.mjs +3 -4
  130. package/.output/server/chunks/routes/api/git/remote.delete.mjs.map +1 -1
  131. package/.output/server/chunks/routes/api/git/remote.post.mjs +3 -4
  132. package/.output/server/chunks/routes/api/git/remote.post.mjs.map +1 -1
  133. package/.output/server/chunks/routes/api/git/remote.put.mjs +3 -4
  134. package/.output/server/chunks/routes/api/git/remote.put.mjs.map +1 -1
  135. package/.output/server/chunks/routes/api/git/remotes.get.mjs +3 -4
  136. package/.output/server/chunks/routes/api/git/remotes.get.mjs.map +1 -1
  137. package/.output/server/chunks/routes/api/git/reset.post.mjs +3 -4
  138. package/.output/server/chunks/routes/api/git/reset.post.mjs.map +1 -1
  139. package/.output/server/chunks/routes/api/git/revert.post.mjs +3 -4
  140. package/.output/server/chunks/routes/api/git/revert.post.mjs.map +1 -1
  141. package/.output/server/chunks/routes/api/git/show.get.mjs +4 -5
  142. package/.output/server/chunks/routes/api/git/show.get.mjs.map +1 -1
  143. package/.output/server/chunks/routes/api/git/stage.post.mjs +4 -5
  144. package/.output/server/chunks/routes/api/git/stage.post.mjs.map +1 -1
  145. package/.output/server/chunks/routes/api/git/stash-apply.post.mjs +3 -4
  146. package/.output/server/chunks/routes/api/git/stash-apply.post.mjs.map +1 -1
  147. package/.output/server/chunks/routes/api/git/stash-branch.post.mjs +3 -4
  148. package/.output/server/chunks/routes/api/git/stash-branch.post.mjs.map +1 -1
  149. package/.output/server/chunks/routes/api/git/stash-drop.post.mjs +3 -4
  150. package/.output/server/chunks/routes/api/git/stash-drop.post.mjs.map +1 -1
  151. package/.output/server/chunks/routes/api/git/stash-pop.post.mjs +3 -4
  152. package/.output/server/chunks/routes/api/git/stash-pop.post.mjs.map +1 -1
  153. package/.output/server/chunks/routes/api/git/stash.get.mjs +3 -4
  154. package/.output/server/chunks/routes/api/git/stash.get.mjs.map +1 -1
  155. package/.output/server/chunks/routes/api/git/stash.post.mjs +3 -4
  156. package/.output/server/chunks/routes/api/git/stash.post.mjs.map +1 -1
  157. package/.output/server/chunks/routes/api/git/state.get.mjs +3 -4
  158. package/.output/server/chunks/routes/api/git/state.get.mjs.map +1 -1
  159. package/.output/server/chunks/routes/api/git/status.get.mjs +4 -5
  160. package/.output/server/chunks/routes/api/git/status.get.mjs.map +1 -1
  161. package/.output/server/chunks/routes/api/git/tag/_name_.get.mjs +3 -4
  162. package/.output/server/chunks/routes/api/git/tag/_name_.get.mjs.map +1 -1
  163. package/.output/server/chunks/routes/api/git/tag-push.post.mjs +3 -4
  164. package/.output/server/chunks/routes/api/git/tag-push.post.mjs.map +1 -1
  165. package/.output/server/chunks/routes/api/git/tag.delete.mjs +3 -4
  166. package/.output/server/chunks/routes/api/git/tag.delete.mjs.map +1 -1
  167. package/.output/server/chunks/routes/api/git/tag.post.mjs +3 -4
  168. package/.output/server/chunks/routes/api/git/tag.post.mjs.map +1 -1
  169. package/.output/server/chunks/routes/api/git/unstage.post.mjs +4 -5
  170. package/.output/server/chunks/routes/api/git/unstage.post.mjs.map +1 -1
  171. package/.output/server/chunks/routes/api/index.get.mjs +7 -4
  172. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  173. package/.output/server/chunks/routes/api/index.get2.mjs +4 -2
  174. package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
  175. package/.output/server/chunks/routes/api/index.get3.mjs +4 -2
  176. package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
  177. package/.output/server/chunks/routes/api/index.post.mjs +19 -16
  178. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  179. package/.output/server/chunks/routes/api/index.post2.mjs +4 -6
  180. package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
  181. package/.output/server/chunks/routes/api/jobs/_id/cancel.post.mjs +6 -3
  182. package/.output/server/chunks/routes/api/jobs/_id/cancel.post.mjs.map +1 -1
  183. package/.output/server/chunks/routes/api/jobs/_id_.get.mjs +7 -4
  184. package/.output/server/chunks/routes/api/jobs/_id_.get.mjs.map +1 -1
  185. package/.output/server/chunks/routes/api/rebase/abort.post.mjs +4 -2
  186. package/.output/server/chunks/routes/api/rebase/abort.post.mjs.map +1 -1
  187. package/.output/server/chunks/routes/api/rebase/ai-resolve.post.mjs +19 -105
  188. package/.output/server/chunks/routes/api/rebase/ai-resolve.post.mjs.map +1 -1
  189. package/.output/server/chunks/routes/api/rebase/conflicts.get.mjs +3 -1
  190. package/.output/server/chunks/routes/api/rebase/conflicts.get.mjs.map +1 -1
  191. package/.output/server/chunks/routes/api/rebase/continue-sync.post.mjs +4 -2
  192. package/.output/server/chunks/routes/api/rebase/continue-sync.post.mjs.map +1 -1
  193. package/.output/server/chunks/routes/api/rebase/continue.post.mjs +71 -73
  194. package/.output/server/chunks/routes/api/rebase/continue.post.mjs.map +1 -1
  195. package/.output/server/chunks/routes/api/rebase/resolve.put.mjs +3 -1
  196. package/.output/server/chunks/routes/api/rebase/resolve.put.mjs.map +1 -1
  197. package/.output/server/chunks/routes/api/repository/status.get.mjs +4 -5
  198. package/.output/server/chunks/routes/api/repository/status.get.mjs.map +1 -1
  199. package/.output/server/chunks/routes/api/settings.get.mjs +6 -5
  200. package/.output/server/chunks/routes/api/settings.get.mjs.map +1 -1
  201. package/.output/server/chunks/routes/api/settings.post.mjs +5 -3
  202. package/.output/server/chunks/routes/api/settings.post.mjs.map +1 -1
  203. package/.output/server/chunks/routes/api/skills/_skillId/prompt.post.mjs +3 -1
  204. package/.output/server/chunks/routes/api/skills/_skillId/prompt.post.mjs.map +1 -1
  205. package/.output/server/chunks/routes/api/specs/_featureId/_...filename_.get.mjs +3 -1
  206. package/.output/server/chunks/routes/api/specs/_featureId/_...filename_.get.mjs.map +1 -1
  207. package/.output/server/chunks/routes/api/specs/_featureId/_...filename_.put.mjs +3 -1
  208. package/.output/server/chunks/routes/api/specs/_featureId/_...filename_.put.mjs.map +1 -1
  209. package/.output/server/chunks/routes/api/specs/features.get.mjs +3 -1
  210. package/.output/server/chunks/routes/api/specs/features.get.mjs.map +1 -1
  211. package/.output/server/chunks/routes/api/specs/reindex.post.mjs +4 -2
  212. package/.output/server/chunks/routes/api/specs/reindex.post.mjs.map +1 -1
  213. package/.output/server/chunks/routes/api/specs/search.get.mjs +4 -2
  214. package/.output/server/chunks/routes/api/specs/search.get.mjs.map +1 -1
  215. package/.output/server/chunks/routes/api/specs/status.get.mjs +4 -2
  216. package/.output/server/chunks/routes/api/specs/status.get.mjs.map +1 -1
  217. package/.output/server/chunks/routes/api/specs/traceability/_featureId_.get.mjs +4 -2
  218. package/.output/server/chunks/routes/api/specs/traceability/_featureId_.get.mjs.map +1 -1
  219. package/.output/server/chunks/routes/api/worktrees/_name/switch.post.mjs +4 -2
  220. package/.output/server/chunks/routes/api/worktrees/_name/switch.post.mjs.map +1 -1
  221. package/.output/server/chunks/routes/api/worktrees/_name_.delete.mjs +3 -1
  222. package/.output/server/chunks/routes/api/worktrees/_name_.delete.mjs.map +1 -1
  223. package/.output/server/chunks/routes/git-watcher-ws.mjs +4 -2
  224. package/.output/server/chunks/routes/git-watcher-ws.mjs.map +1 -1
  225. package/.output/server/chunks/routes/renderer.mjs +4 -2
  226. package/.output/server/chunks/routes/terminal-ws.mjs +230 -0
  227. package/.output/server/chunks/routes/terminal-ws.mjs.map +1 -0
  228. package/.output/server/index.mjs +4 -2
  229. package/.output/server/index.mjs.map +1 -1
  230. package/.output/server/node_modules/node-pty/build/Makefile +369 -0
  231. package/.output/server/node_modules/node-pty/build/Release/pty.node +0 -0
  232. package/.output/server/node_modules/node-pty/build/binding.Makefile +6 -0
  233. package/.output/server/node_modules/node-pty/build/config.gypi +513 -0
  234. package/.output/server/node_modules/node-pty/build/pty.target.mk +168 -0
  235. package/.output/server/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  236. package/.output/server/node_modules/node-pty/lib/index.js +52 -0
  237. package/.output/server/node_modules/node-pty/lib/shared/conout.js +11 -0
  238. package/.output/server/node_modules/node-pty/lib/terminal.js +190 -0
  239. package/.output/server/node_modules/node-pty/lib/unixTerminal.js +346 -0
  240. package/.output/server/node_modules/node-pty/lib/utils.js +39 -0
  241. package/.output/server/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  242. package/.output/server/node_modules/node-pty/lib/windowsPtyAgent.js +320 -0
  243. package/.output/server/node_modules/node-pty/lib/windowsTerminal.js +199 -0
  244. package/.output/server/node_modules/node-pty/package.json +64 -0
  245. package/.output/server/package.json +2 -1
  246. package/package.json +6 -1
  247. package/.output/public/_nuxt/2zamijve.js +0 -1
  248. package/.output/public/_nuxt/BEjIzkrM.js +0 -85
  249. package/.output/public/_nuxt/BaSsfm-t.js +0 -36
  250. package/.output/public/_nuxt/BjdLSVUw.js +0 -1
  251. package/.output/public/_nuxt/DeqM2TrP.js +0 -1
  252. package/.output/public/_nuxt/builds/meta/74089fa1-2fbb-4792-94aa-7535d2aec557.json +0 -1
  253. package/.output/public/_nuxt/default.DKSPicGu.css +0 -1
  254. package/.output/public/_nuxt/entry.BUDfUMkE.css +0 -1
  255. package/.output/public/_nuxt/zrVRZSxq.js +0 -64
  256. package/.output/server/chunks/_/baseBranch.mjs +0 -137
  257. package/.output/server/chunks/_/baseBranch.mjs.map +0 -1
  258. package/.output/server/chunks/_/claude.mjs +0 -164
  259. package/.output/server/chunks/_/claude.mjs.map +0 -1
  260. package/.output/server/chunks/_/conversationStore.mjs +0 -257
  261. package/.output/server/chunks/_/conversationStore.mjs.map +0 -1
  262. package/.output/server/chunks/_/geminiProvider.mjs +0 -372
  263. package/.output/server/chunks/_/geminiProvider.mjs.map +0 -1
  264. package/.output/server/chunks/_/gitExec.mjs +0 -48
  265. package/.output/server/chunks/_/gitExec.mjs.map +0 -1
  266. package/.output/server/chunks/_/providerProcessError.mjs +0 -163
  267. package/.output/server/chunks/_/providerProcessError.mjs.map +0 -1
  268. package/.output/server/chunks/_/uiAdapter.mjs +0 -421
  269. package/.output/server/chunks/_/uiAdapter.mjs.map +0 -1
  270. package/.output/server/chunks/routes/api/chat.post.mjs +0 -276
  271. package/.output/server/chunks/routes/api/chat.post.mjs.map +0 -1
@@ -1,137 +0,0 @@
1
- import { a as execGitCommand } from './gitExec.mjs';
2
-
3
- const DEFAULT_BRANCH_CANDIDATES = ["main", "master"];
4
- const WORKTREE_BRANCH_PREFIX = "sc/";
5
- const COMMIT_HASH_RE = /^[0-9a-f]{7,40}$/i;
6
- function isCommitHashLike(value) {
7
- return typeof value === "string" && COMMIT_HASH_RE.test(value.trim());
8
- }
9
- function isWorktreeBranch(value) {
10
- return typeof value === "string" && value.startsWith(WORKTREE_BRANCH_PREFIX);
11
- }
12
- function isUsableBaseBranchName(value) {
13
- if (typeof value !== "string") return false;
14
- const branch = value.trim();
15
- return branch.length > 0 && branch !== "HEAD" && !isWorktreeBranch(branch) && !isCommitHashLike(branch);
16
- }
17
- async function listLocalBranches(cwd) {
18
- try {
19
- const output = await execGitCommand(["for-each-ref", "--format=%(refname:short)", "refs/heads"], cwd);
20
- return output.split("\n").map((branch) => branch.trim()).filter(Boolean);
21
- } catch {
22
- return [];
23
- }
24
- }
25
- async function branchExists(cwd, branch) {
26
- try {
27
- await execGitCommand(["rev-parse", "--verify", `refs/heads/${branch}^{commit}`], cwd);
28
- return true;
29
- } catch {
30
- return false;
31
- }
32
- }
33
- async function getHeadHash(cwd) {
34
- try {
35
- return await execGitCommand(["rev-parse", "HEAD"], cwd);
36
- } catch {
37
- return null;
38
- }
39
- }
40
- async function getBranchesPointingAt(cwd, ref) {
41
- try {
42
- const output = await execGitCommand(["for-each-ref", "--format=%(refname:short)", "--points-at", ref, "refs/heads"], cwd);
43
- return output.split("\n").map((branch) => branch.trim()).filter(Boolean);
44
- } catch {
45
- return [];
46
- }
47
- }
48
- async function detectDefaultBranch(cwd) {
49
- try {
50
- const ref = await execGitCommand(["symbolic-ref", "refs/remotes/origin/HEAD"], cwd);
51
- const branch = ref.replace("refs/remotes/origin/", "").trim();
52
- if (isUsableBaseBranchName(branch) && await branchExists(cwd, branch)) {
53
- return branch;
54
- }
55
- } catch {
56
- }
57
- for (const name of DEFAULT_BRANCH_CANDIDATES) {
58
- if (await branchExists(cwd, name)) {
59
- return name;
60
- }
61
- }
62
- return null;
63
- }
64
- async function resolvePreferredBaseBranch(cwd) {
65
- try {
66
- const currentBranch = await execGitCommand(["rev-parse", "--abbrev-ref", "HEAD"], cwd);
67
- if (isUsableBaseBranchName(currentBranch) && await branchExists(cwd, currentBranch)) {
68
- return currentBranch;
69
- }
70
- } catch {
71
- }
72
- const defaultBranch = await detectDefaultBranch(cwd);
73
- const headHash = await getHeadHash(cwd);
74
- if (headHash) {
75
- const matchingBranches = (await getBranchesPointingAt(cwd, headHash)).filter((branch) => isUsableBaseBranchName(branch));
76
- if (defaultBranch && matchingBranches.includes(defaultBranch)) {
77
- return defaultBranch;
78
- }
79
- if (matchingBranches.length === 1) {
80
- return matchingBranches[0];
81
- }
82
- if (matchingBranches.length > 0) {
83
- return matchingBranches[0];
84
- }
85
- }
86
- return defaultBranch;
87
- }
88
- async function resolveConversationBaseBranch(options) {
89
- const { cwd, storedBaseBranch, worktreeBranch } = options;
90
- const branch = (storedBaseBranch == null ? void 0 : storedBaseBranch.trim()) || "";
91
- if (isUsableBaseBranchName(branch) && await branchExists(cwd, branch)) {
92
- return branch;
93
- }
94
- const normalizedWorktreeBranch = (worktreeBranch == null ? void 0 : worktreeBranch.trim()) || "";
95
- if (isCommitHashLike(branch) && normalizedWorktreeBranch && await branchExists(cwd, normalizedWorktreeBranch)) {
96
- const defaultBranch = await detectDefaultBranch(cwd);
97
- const candidates = (await listLocalBranches(cwd)).filter((candidate) => isUsableBaseBranchName(candidate) && candidate !== normalizedWorktreeBranch);
98
- const matches = [];
99
- for (const candidate of candidates) {
100
- try {
101
- const mergeBase = await execGitCommand(["merge-base", candidate, normalizedWorktreeBranch], cwd);
102
- if (mergeBase === branch) {
103
- matches.push(candidate);
104
- }
105
- } catch {
106
- }
107
- }
108
- if (defaultBranch && matches.includes(defaultBranch)) {
109
- return defaultBranch;
110
- }
111
- if (matches.length > 0) {
112
- return matches[0];
113
- }
114
- }
115
- return resolvePreferredBaseBranch(cwd);
116
- }
117
- async function resolveExistingBaseBranch(options) {
118
- const { cwd, requestedBaseBranch, worktreeBranch } = options;
119
- const branch = (requestedBaseBranch == null ? void 0 : requestedBaseBranch.trim()) || "";
120
- if (isUsableBaseBranchName(branch) && await branchExists(cwd, branch)) {
121
- return branch;
122
- }
123
- if (branch) {
124
- const normalized = await resolveConversationBaseBranch({
125
- cwd,
126
- storedBaseBranch: branch,
127
- worktreeBranch
128
- });
129
- if (normalized && await branchExists(cwd, normalized)) {
130
- return normalized;
131
- }
132
- }
133
- return resolvePreferredBaseBranch(cwd);
134
- }
135
-
136
- export { resolvePreferredBaseBranch as a, resolveConversationBaseBranch as b, isUsableBaseBranchName as i, resolveExistingBaseBranch as r };
137
- //# sourceMappingURL=baseBranch.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"baseBranch.mjs","sources":["../../../../server/utils/baseBranch.ts"],"names":[],"mappings":";;AAEA,MAAM,yBAAA,GAA4B,CAAC,MAAA,EAAQ,QAAQ,CAAA;AACnD,MAAM,sBAAA,GAAyB,KAAA;AAC/B,MAAM,cAAA,GAAiB,mBAAA;AAEhB,SAAS,iBAAiB,KAAA,EAAmD;AAClF,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,eAAe,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACtE;AAEO,SAAS,iBAAiB,KAAA,EAA2C;AAC1E,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,WAAW,sBAAsB,CAAA;AAC7E;AAEO,SAAS,uBAAuB,KAAA,EAAmD;AACxF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,EAAK;AAC1B,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,MAAA,KAAW,MAAA,IAAU,CAAC,gBAAA,CAAiB,MAAM,CAAA,IAAK,CAAC,gBAAA,CAAiB,MAAM,CAAA;AACxG;AAEA,eAAe,kBAAkB,GAAA,EAAgC;AAC/D,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,CAAC,gBAAgB,2BAAA,EAA6B,YAAY,GAAG,GAAG,CAAA;AACpG,IAAA,OAAO,MAAA,CACJ,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,IAAA,EAAM,CAAA,CAC3B,MAAA,CAAO,OAAO,CAAA;AAAA,EACnB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,eAAe,YAAA,CAAa,KAAa,MAAA,EAAkC;AACzE,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,CAAe,CAAC,WAAA,EAAa,UAAA,EAAY,cAAc,MAAM,CAAA,SAAA,CAAW,GAAG,GAAG,CAAA;AACpF,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,eAAe,YAAY,GAAA,EAAqC;AAC9D,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,cAAA,CAAe,CAAC,WAAA,EAAa,MAAM,GAAG,GAAG,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAe,qBAAA,CAAsB,KAAa,GAAA,EAAgC;AAChF,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,CAAC,cAAA,EAAgB,6BAA6B,aAAA,EAAe,GAAA,EAAK,YAAY,CAAA,EAAG,GAAG,CAAA;AACxH,IAAA,OAAO,MAAA,CACJ,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,IAAA,EAAM,CAAA,CAC3B,MAAA,CAAO,OAAO,CAAA;AAAA,EACnB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,eAAsB,oBAAoB,GAAA,EAAqC;AAC7E,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,cAAA,CAAe,CAAC,cAAA,EAAgB,0BAA0B,GAAG,GAAG,CAAA;AAClF,IAAA,MAAM,SAAS,GAAA,CAAI,OAAA,CAAQ,sBAAA,EAAwB,EAAE,EAAE,IAAA,EAAK;AAC5D,IAAA,IAAI,uBAAuB,MAAM,CAAA,IAAK,MAAM,YAAA,CAAa,GAAA,EAAK,MAAM,CAAA,EAAG;AACrE,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,KAAA,MAAW,QAAQ,yBAAA,EAA2B;AAC5C,IAAA,IAAI,MAAM,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA,EAAG;AACjC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,eAAsB,2BAA2B,GAAA,EAAqC;AACpF,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,MAAM,cAAA,CAAe,CAAC,aAAa,cAAA,EAAgB,MAAM,GAAG,GAAG,CAAA;AACrF,IAAA,IAAI,uBAAuB,aAAa,CAAA,IAAK,MAAM,YAAA,CAAa,GAAA,EAAK,aAAa,CAAA,EAAG;AACnF,MAAA,OAAO,aAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAM,mBAAA,CAAoB,GAAG,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,GAAG,CAAA;AACtC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,gBAAA,GAAA,CAAoB,MAAM,qBAAA,CAAsB,GAAA,EAAK,QAAQ,GAChE,MAAA,CAAO,CAAA,MAAA,KAAU,sBAAA,CAAuB,MAAM,CAAC,CAAA;AAElD,IAAA,IAAI,aAAA,IAAiB,gBAAA,CAAiB,QAAA,CAAS,aAAa,CAAA,EAAG;AAC7D,MAAA,OAAO,aAAA;AAAA,IACT;AACA,IAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,MAAA,OAAO,iBAAiB,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,OAAO,iBAAiB,CAAC,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,aAAA;AACT;AAEA,eAAsB,8BAA8B,OAAA,EAIzB;AACzB,EAAA,MAAM,EAAE,GAAA,EAAK,gBAAA,EAAkB,cAAA,EAAe,GAAI,OAAA;AAClD,EAAA,MAAM,MAAA,GAAA,CAAS,qDAAkB,IAAA,EAAA,KAAU,EAAA;AAE3C,EAAA,IAAI,uBAAuB,MAAM,CAAA,IAAK,MAAM,YAAA,CAAa,GAAA,EAAK,MAAM,CAAA,EAAG;AACrE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,wBAAA,GAAA,CAA2B,iDAAgB,IAAA,EAAA,KAAU,EAAA;AAE3D,EAAA,IAAI,gBAAA,CAAiB,MAAM,CAAA,IAAK,wBAAA,IAA4B,MAAM,YAAA,CAAa,GAAA,EAAK,wBAAwB,CAAA,EAAG;AAC7G,IAAA,MAAM,aAAA,GAAgB,MAAM,mBAAA,CAAoB,GAAG,CAAA;AACnD,IAAA,MAAM,UAAA,GAAA,CAAc,MAAM,iBAAA,CAAkB,GAAG,CAAA,EAC5C,MAAA,CAAO,CAAA,SAAA,KAAa,sBAAA,CAAuB,SAAS,CAAA,IAAK,SAAA,KAAc,wBAAwB,CAAA;AAElG,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,CAAC,cAAc,SAAA,EAAW,wBAAwB,GAAG,GAAG,CAAA;AAC/F,QAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,UAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AAAA,QACxB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,IAAiB,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAAG;AACpD,MAAA,OAAO,aAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,2BAA2B,GAAG,CAAA;AACvC;AAEA,eAAsB,0BAA0B,OAAA,EAIrB;AACzB,EAAA,MAAM,EAAE,GAAA,EAAK,mBAAA,EAAqB,cAAA,EAAe,GAAI,OAAA;AACrD,EAAA,MAAM,MAAA,GAAA,CAAS,2DAAqB,IAAA,EAAA,KAAU,EAAA;AAE9C,EAAA,IAAI,uBAAuB,MAAM,CAAA,IAAK,MAAM,YAAA,CAAa,GAAA,EAAK,MAAM,CAAA,EAAG;AACrE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,UAAA,GAAa,MAAM,6BAAA,CAA8B;AAAA,MACrD,GAAA;AAAA,MACA,gBAAA,EAAkB,MAAA;AAAA,MAClB;AAAA,KACD,CAAA;AACD,IAAA,IAAI,UAAA,IAAc,MAAM,YAAA,CAAa,GAAA,EAAK,UAAU,CAAA,EAAG;AACrD,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,2BAA2B,GAAG,CAAA;AACvC;;;;"}
@@ -1,164 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { spawn, execSync } from 'node:child_process';
4
- import { h as readSpecCatStore } from '../nitro/nitro.mjs';
5
-
6
- const DEFAULT_MODEL = "sonnet";
7
- const MODEL_IDS = {
8
- fable: "claude-fable-5",
9
- sonnet: "claude-sonnet-4-20250514",
10
- opus: "claude-opus-4-20250514",
11
- haiku: "claude-3-5-haiku-20241022"
12
- };
13
- function isClaudeModel(value) {
14
- return value === "fable" || value === "sonnet" || value === "opus" || value === "haiku";
15
- }
16
- async function getConfiguredClaudeModel() {
17
- const settings = await readSpecCatStore("settings.json", {});
18
- const stored = settings.claudeModel;
19
- return isClaudeModel(stored) ? stored : DEFAULT_MODEL;
20
- }
21
- async function getConfiguredClaudeModelId() {
22
- const model = await getConfiguredClaudeModel();
23
- return MODEL_IDS[model];
24
- }
25
- function getClaudeModelId(modelKey) {
26
- const model = isClaudeModel(modelKey) ? modelKey : DEFAULT_MODEL;
27
- return MODEL_IDS[model];
28
- }
29
-
30
- function detectClaudeCli() {
31
- const systemPaths = [
32
- // User local bin (common for npm/pnpm global installs)
33
- join(process.env.HOME || "", ".local/bin/claude"),
34
- // Standard unix paths
35
- "/usr/local/bin/claude",
36
- "/usr/bin/claude"
37
- ];
38
- for (const path of systemPaths) {
39
- if (existsSync(path)) {
40
- console.log(`[Claude CLI] Found system installation: ${path}`);
41
- return path;
42
- }
43
- }
44
- try {
45
- const whichResult = execSync("which claude 2>/dev/null", { encoding: "utf-8" }).trim();
46
- if (whichResult && existsSync(whichResult)) {
47
- console.log(`[Claude CLI] Found via which: ${whichResult}`);
48
- return whichResult;
49
- }
50
- } catch {
51
- }
52
- return null;
53
- }
54
- let cachedCliPath = null;
55
- function getClaudeCliPath() {
56
- if (cachedCliPath === null) {
57
- cachedCliPath = detectClaudeCli();
58
- }
59
- if (!cachedCliPath) {
60
- throw new Error(
61
- "Claude Code CLI not found. Please install Claude Code CLI globally."
62
- );
63
- }
64
- return cachedCliPath;
65
- }
66
- async function runClaudeCliStream(options) {
67
- const cliPath = getClaudeCliPath();
68
- const modelId = options.modelId || await getConfiguredClaudeModelId();
69
- const args = [
70
- "-p",
71
- options.prompt,
72
- "--output-format",
73
- "stream-json",
74
- "--verbose",
75
- "--dangerously-skip-permissions"
76
- ];
77
- args.push("--model", modelId);
78
- if (options.includePartial) {
79
- args.push("--include-partial-messages");
80
- }
81
- if (options.resumeSessionId) {
82
- args.push("--resume", options.resumeSessionId);
83
- }
84
- const proc = spawn(cliPath, args, {
85
- cwd: options.cwd,
86
- env: {
87
- ...process.env,
88
- NODE_NO_WARNINGS: "1"
89
- },
90
- stdio: ["pipe", "pipe", "pipe"]
91
- });
92
- proc.stdin.end();
93
- let lineBuffer = "";
94
- let resultText = "";
95
- let sessionId;
96
- const handleMessage = (msg) => {
97
- if (options.onMessage) {
98
- options.onMessage(msg);
99
- }
100
- if ("session_id" in msg && typeof msg.session_id === "string") {
101
- sessionId = msg.session_id;
102
- }
103
- if (msg.type === "assistant" && typeof msg.message === "object" && msg.message) {
104
- const message = msg.message;
105
- if (Array.isArray(message.content)) {
106
- for (const block of message.content) {
107
- if (block.type === "text" && block.text) {
108
- resultText += block.text;
109
- }
110
- }
111
- }
112
- }
113
- };
114
- const parseLine = (line) => {
115
- if (!line.trim()) return;
116
- try {
117
- const parsed = JSON.parse(line);
118
- handleMessage(parsed);
119
- } catch {
120
- }
121
- };
122
- proc.stdout.on("data", (chunk) => {
123
- lineBuffer += chunk.toString();
124
- const lines = lineBuffer.split("\n");
125
- lineBuffer = lines.pop() || "";
126
- for (const line of lines) {
127
- parseLine(line);
128
- }
129
- });
130
- const errorChunks = [];
131
- proc.stderr.on("data", (chunk) => {
132
- errorChunks.push(chunk.toString());
133
- });
134
- if (options.abortSignal) {
135
- if (options.abortSignal.aborted) {
136
- proc.kill("SIGTERM");
137
- } else {
138
- options.abortSignal.addEventListener("abort", () => {
139
- proc.kill("SIGTERM");
140
- });
141
- }
142
- }
143
- return await new Promise((resolve) => {
144
- proc.on("close", (code) => {
145
- if (lineBuffer.trim()) {
146
- parseLine(lineBuffer);
147
- }
148
- if (code === 0) {
149
- resolve({ success: true, text: resultText, sessionId });
150
- return;
151
- }
152
- const stderr = errorChunks.join("").trim();
153
- const parts = [`Claude CLI exited with code ${code}`];
154
- if (stderr) {
155
- parts.push(`stderr: ${stderr}`);
156
- }
157
- const errorText = parts.join("\n");
158
- resolve({ success: false, error: errorText, text: resultText, sessionId });
159
- });
160
- });
161
- }
162
-
163
- export { getClaudeCliPath as a, getClaudeModelId as g, runClaudeCliStream as r };
164
- //# sourceMappingURL=claude.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude.mjs","sources":["../../../../server/utils/claudeModel.ts","../../../../server/utils/claude.ts"],"names":[],"mappings":"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"}
@@ -1,257 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { writeFile, readdir, rm, readFile, mkdir } from 'node:fs/promises';
3
- import { join } from 'node:path';
4
- import { h as readSpecCatStore, j as getSpecCatDataDir, e as getProjectDir } from '../nitro/nitro.mjs';
5
- import { i as isUsableBaseBranchName, b as resolveConversationBaseBranch } from './baseBranch.mjs';
6
-
7
- function generateBlockId() {
8
- return `blk-${Date.now()}-${Math.random().toString(36).substring(2, 6)}`;
9
- }
10
- function generateMessageId() {
11
- return `msg-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
12
- }
13
- const STORAGE_VERSION = 2;
14
- function generateConversationId() {
15
- return `conv-${Math.random().toString(36).slice(2, 12)}`;
16
- }
17
- function generateArchivedConversationId() {
18
- return `arch-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
19
- }
20
- function generateConversationTitle(firstMessage) {
21
- const MAX_LENGTH = 50;
22
- const cleaned = firstMessage.trim().replace(/\n/g, " ");
23
- if (cleaned.length <= MAX_LENGTH) return cleaned;
24
- return cleaned.slice(0, MAX_LENGTH).trim() + "...";
25
- }
26
- function isValidConversation(obj) {
27
- if (!obj || typeof obj !== "object") return false;
28
- const conv = obj;
29
- return typeof conv.id === "string" && typeof conv.title === "string" && Array.isArray(conv.messages) && typeof conv.createdAt === "string" && typeof conv.updatedAt === "string" && typeof conv.cwd === "string";
30
- }
31
-
32
- const LEGACY_FILENAME = "conversations.json";
33
- const ARCHIVED_FILENAME = "archived-conversations.json";
34
- const CONVERSATIONS_DIRNAME = "conversations";
35
- const DEFAULTS = {
36
- version: STORAGE_VERSION,
37
- conversations: [],
38
- archivedConversations: []
39
- };
40
- function getConversationsDirPath() {
41
- return join(getSpecCatDataDir(), CONVERSATIONS_DIRNAME);
42
- }
43
- function getConversationFilePath(conversationId) {
44
- return join(getConversationsDirPath(), `${conversationId}.json`);
45
- }
46
- function isSafeConversationId(value) {
47
- return typeof value === "string" && /^[A-Za-z0-9._-]+$/.test(value);
48
- }
49
- function getRecordId(entry) {
50
- if (!entry || typeof entry !== "object") return null;
51
- const value = entry.id;
52
- return isSafeConversationId(value) ? value : null;
53
- }
54
- async function ensureDataDir() {
55
- const root = getSpecCatDataDir();
56
- if (!existsSync(root)) {
57
- await mkdir(root, { recursive: true });
58
- }
59
- }
60
- async function ensureConversationsDir() {
61
- const dir = getConversationsDirPath();
62
- if (!existsSync(dir)) {
63
- await mkdir(dir, { recursive: true });
64
- }
65
- }
66
- async function readArchivedFile() {
67
- const data = await readSpecCatStore(ARCHIVED_FILENAME, {
68
- version: STORAGE_VERSION,
69
- archivedConversations: []
70
- });
71
- return {
72
- version: typeof data.version === "number" ? data.version : STORAGE_VERSION,
73
- archivedConversations: Array.isArray(data.archivedConversations) ? data.archivedConversations : []
74
- };
75
- }
76
- async function writeArchivedFile(data) {
77
- await ensureDataDir();
78
- const filePath = join(getSpecCatDataDir(), ARCHIVED_FILENAME);
79
- await writeFile(filePath, JSON.stringify(data, null, 2), "utf-8");
80
- }
81
- async function readConversationFiles() {
82
- const dir = getConversationsDirPath();
83
- if (!existsSync(dir)) return [];
84
- const entries = await readdir(dir, { withFileTypes: true });
85
- const conversations = [];
86
- for (const entry of entries) {
87
- if (!entry.isFile() || !entry.name.endsWith(".json")) continue;
88
- const filePath = join(dir, entry.name);
89
- try {
90
- const raw = await readFile(filePath, "utf-8");
91
- const parsed = JSON.parse(raw);
92
- conversations.push(parsed);
93
- } catch {
94
- }
95
- }
96
- return conversations;
97
- }
98
- async function migrateLegacyStoreIfNeeded(conversationsFromFiles, archivedFromFile) {
99
- const legacy = await readSpecCatStore(LEGACY_FILENAME, DEFAULTS);
100
- const legacyConversations = Array.isArray(legacy.conversations) ? legacy.conversations : [];
101
- const legacyArchived = Array.isArray(legacy.archivedConversations) ? legacy.archivedConversations : [];
102
- const mergedConversations = conversationsFromFiles.slice();
103
- const existingConversationIds = /* @__PURE__ */ new Set();
104
- for (const conv of mergedConversations) {
105
- const id = getRecordId(conv);
106
- if (id) existingConversationIds.add(id);
107
- }
108
- let conversationsChanged = false;
109
- for (const legacyConversation of legacyConversations) {
110
- const id = getRecordId(legacyConversation);
111
- if (!id || existingConversationIds.has(id)) continue;
112
- mergedConversations.push(legacyConversation);
113
- existingConversationIds.add(id);
114
- conversationsChanged = true;
115
- }
116
- const archived = archivedFromFile.archivedConversations.slice();
117
- const archivedIds = /* @__PURE__ */ new Set();
118
- for (const item of archived) {
119
- const id = getRecordId(item);
120
- if (id) archivedIds.add(id);
121
- }
122
- let archivedChanged = false;
123
- for (const legacyArchive of legacyArchived) {
124
- const id = getRecordId(legacyArchive);
125
- if (!id || archivedIds.has(id)) continue;
126
- archived.push(legacyArchive);
127
- archivedIds.add(id);
128
- archivedChanged = true;
129
- }
130
- if (conversationsChanged) {
131
- await ensureConversationsDir();
132
- for (const item of mergedConversations) {
133
- const id = getRecordId(item);
134
- if (!id) continue;
135
- await writeFile(getConversationFilePath(id), JSON.stringify(item, null, 2), "utf-8");
136
- }
137
- }
138
- const resolvedVersion = typeof legacy.version === "number" ? legacy.version : archivedFromFile.version;
139
- if (archivedChanged || legacyArchived.length > 0 && !existsSync(join(getSpecCatDataDir(), ARCHIVED_FILENAME))) {
140
- await writeArchivedFile({
141
- version: resolvedVersion,
142
- archivedConversations: archived
143
- });
144
- }
145
- return {
146
- conversations: mergedConversations,
147
- archived: {
148
- version: resolvedVersion,
149
- archivedConversations: archived
150
- }
151
- };
152
- }
153
- async function normalizeBaseBranches(state) {
154
- const projectDir = getProjectDir();
155
- let activeChanged = false;
156
- let archivedChanged = false;
157
- const conversations = await Promise.all(state.conversations.map(async (entry) => {
158
- if (!entry || typeof entry !== "object") return entry;
159
- const record = entry;
160
- if (typeof record.baseBranch !== "string" || record.baseBranch.trim().length === 0) {
161
- return entry;
162
- }
163
- if (isUsableBaseBranchName(record.baseBranch)) {
164
- return entry;
165
- }
166
- const normalized = await resolveConversationBaseBranch({
167
- cwd: projectDir,
168
- storedBaseBranch: record.baseBranch,
169
- worktreeBranch: typeof record.worktreeBranch === "string" ? record.worktreeBranch : null
170
- });
171
- if (!normalized || normalized === record.baseBranch) {
172
- return entry;
173
- }
174
- activeChanged = true;
175
- return { ...record, baseBranch: normalized };
176
- }));
177
- const archivedConversations = await Promise.all(state.archivedConversations.map(async (entry) => {
178
- if (!entry || typeof entry !== "object") return entry;
179
- const record = entry;
180
- if (typeof record.baseBranch !== "string" || record.baseBranch.trim().length === 0) {
181
- return entry;
182
- }
183
- if (isUsableBaseBranchName(record.baseBranch)) {
184
- return entry;
185
- }
186
- const normalized = await resolveConversationBaseBranch({
187
- cwd: projectDir,
188
- storedBaseBranch: record.baseBranch
189
- });
190
- if (!normalized || normalized === record.baseBranch) {
191
- return entry;
192
- }
193
- archivedChanged = true;
194
- return { ...record, baseBranch: normalized };
195
- }));
196
- if (!activeChanged && !archivedChanged) {
197
- return state;
198
- }
199
- const normalizedState = {
200
- version: state.version,
201
- conversations,
202
- archivedConversations
203
- };
204
- await writeConversationStorageState(normalizedState);
205
- return normalizedState;
206
- }
207
- async function readConversationStorageState() {
208
- const conversationsFromFiles = await readConversationFiles();
209
- const archivedFromFile = await readArchivedFile();
210
- const migrated = await migrateLegacyStoreIfNeeded(conversationsFromFiles, archivedFromFile);
211
- return normalizeBaseBranches({
212
- version: typeof migrated.archived.version === "number" ? migrated.archived.version : STORAGE_VERSION,
213
- conversations: migrated.conversations,
214
- archivedConversations: migrated.archived.archivedConversations
215
- });
216
- }
217
- async function writeConversationStorageState(state) {
218
- await ensureConversationsDir();
219
- const conversations = Array.isArray(state.conversations) ? state.conversations : [];
220
- const archivedConversations = Array.isArray(state.archivedConversations) ? state.archivedConversations : [];
221
- const version = typeof state.version === "number" ? state.version : STORAGE_VERSION;
222
- const expectedFiles = /* @__PURE__ */ new Set();
223
- for (const conversation of conversations) {
224
- const id = getRecordId(conversation);
225
- if (!id) continue;
226
- expectedFiles.add(`${id}.json`);
227
- await writeFile(getConversationFilePath(id), JSON.stringify(conversation, null, 2), "utf-8");
228
- }
229
- const dir = getConversationsDirPath();
230
- const entries = await readdir(dir, { withFileTypes: true });
231
- for (const entry of entries) {
232
- if (!entry.isFile() || !entry.name.endsWith(".json")) continue;
233
- if (expectedFiles.has(entry.name)) continue;
234
- await rm(join(dir, entry.name), { force: true });
235
- }
236
- await writeArchivedFile({
237
- version,
238
- archivedConversations
239
- });
240
- }
241
- async function upsertConversationInStorage(conversation, version) {
242
- const id = getRecordId(conversation);
243
- if (!id) {
244
- throw new Error("Conversation id is missing or invalid");
245
- }
246
- await ensureConversationsDir();
247
- await writeFile(getConversationFilePath(id), JSON.stringify(conversation, null, 2), "utf-8");
248
- if (typeof version === "number") {
249
- const archived = await readArchivedFile();
250
- if (archived.version !== version) {
251
- await writeArchivedFile({ ...archived, version });
252
- }
253
- }
254
- }
255
-
256
- export { STORAGE_VERSION as S, generateConversationId as a, generateConversationTitle as b, generateMessageId as c, generateBlockId as d, generateArchivedConversationId as g, isValidConversation as i, readConversationStorageState as r, upsertConversationInStorage as u, writeConversationStorageState as w };
257
- //# sourceMappingURL=conversationStore.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversationStore.mjs","sources":["../../../../types/chat.ts","../../../../server/utils/conversationStore.ts"],"names":[],"mappings":"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"}