@jingyi0605/codingns 0.6.1 → 0.7.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 (291) hide show
  1. package/bin/codingns.mjs +225 -0
  2. package/dist/public/assets/AdaptiveButlerPage-B8mg25ze.js +3 -0
  3. package/dist/public/assets/{App-Dsf3ooXU.js → App-C2lNmeKL.js} +6 -6
  4. package/dist/public/assets/{BootstrapPage-CE0m1qSR.js → BootstrapPage-CAVA-a8h.js} +1 -1
  5. package/dist/public/assets/ConversationPage-B6BGOX4C.js +6 -0
  6. package/dist/public/assets/{DesktopDetachPreviewPage-Dxarr_Wf.js → DesktopDetachPreviewPage-B37DUL15.js} +1 -1
  7. package/dist/public/assets/{DesktopWindowPage-VytPwJ4c.js → DesktopWindowPage-CDA6l7lm.js} +1 -1
  8. package/dist/public/assets/{FileContextPanel-DwFzLsOp.js → FileContextPanel-CMGTtAB6.js} +1 -1
  9. package/dist/public/assets/{GitSidebar-CH6WqTrM.js → GitSidebar--DCqBiGL.js} +1 -1
  10. package/dist/public/assets/{MobileCreateSessionSheet-DcxKM00P.js → MobileCreateSessionSheet-THIrIzJ3.js} +1 -1
  11. package/dist/public/assets/{MobileTopHeaderFrame-C5rIKQT6.js → MobileTopHeaderFrame-D-X7pVnV.js} +1 -1
  12. package/dist/public/assets/{MobileWorkspaceSwitcherHeader-CfUnHgv_.js → MobileWorkspaceSwitcherHeader-Cczi7RYu.js} +1 -1
  13. package/dist/public/assets/{RelayConnectEntryPage-CgMvVZwa.js → RelayConnectEntryPage-D417tgWj.js} +1 -1
  14. package/dist/public/assets/{ServerSettingsModal-CFul__z1.js → ServerSettingsModal-BdTxbRbU.js} +1 -1
  15. package/dist/public/assets/SessionIndexPage-D5iefVcc.js +1 -0
  16. package/dist/public/assets/SettingsPage-iCFe_DHP.js +2 -0
  17. package/dist/public/assets/{TerminalManagerPanel-BbORd-ee.js → TerminalManagerPanel-CtldwWz8.js} +1 -1
  18. package/dist/public/assets/{TerminalPage-DWHv6mlu.js → TerminalPage-DAzQTmQC.js} +19 -19
  19. package/dist/public/assets/{TerminalRuntimeFallbackModal-B29YxbQe.js → TerminalRuntimeFallbackModal-DLOhAvaq.js} +1 -1
  20. package/dist/public/assets/{ToolFilesPage-Dx9cv9hu.js → ToolFilesPage-D7thcDEv.js} +1 -1
  21. package/dist/public/assets/{ToolGitPage-D7H3vAia.js → ToolGitPage-uPRsxdcn.js} +1 -1
  22. package/dist/public/assets/{ToolProcessesPage-PqQWxsy-.js → ToolProcessesPage-B1uOk0Ef.js} +1 -1
  23. package/dist/public/assets/{ToolsHomePage-CX05Pe_4.js → ToolsHomePage-rU3V8mmh.js} +1 -1
  24. package/dist/public/assets/{WorkbenchLandingPage-CchkAC75.js → WorkbenchLandingPage-BudM2C69.js} +1 -1
  25. package/dist/public/assets/WorkbenchLayout-Dybarc1V.js +244 -0
  26. package/dist/public/assets/WorkbenchModal-DMQutm1x.js +1 -0
  27. package/dist/public/assets/WorkbenchShellRoute-Cy4WBbzq.js +1 -0
  28. package/dist/public/assets/{WorkbenchShellRoute-RGZpA0_J.css → WorkbenchShellRoute-DhQo_0vu.css} +1 -1
  29. package/dist/public/assets/{WorkspaceDebugDetailPage-Deqy2_pO.js → WorkspaceDebugDetailPage-CHqo-uDf.js} +1 -1
  30. package/dist/public/assets/{WorkspaceDetailPage-Cvf-ZdlB.js → WorkspaceDetailPage-CGkAH1W-.js} +1 -1
  31. package/dist/public/assets/{WorkspaceHomePage-Dsyvqyk1.js → WorkspaceHomePage-CfuPVITd.js} +1 -1
  32. package/dist/public/assets/{client-runtime-manager-DROQJ9v3.js → client-runtime-manager-CKbtaemV.js} +1 -1
  33. package/dist/public/assets/file-tree-icon-Bc0KADEl.js +3 -0
  34. package/dist/public/assets/index-DNRyROOG.css +1 -0
  35. package/dist/public/assets/index-oGylLBIX.js +42 -0
  36. package/dist/public/assets/{login-direct-candidate-resolver-DotM530R.js → login-direct-candidate-resolver-DjJMbqB7.js} +1 -1
  37. package/dist/public/assets/model-switch-api-T55eW6D4.js +1 -0
  38. package/dist/public/assets/{preferences-service-BG6GKG29.js → preferences-service-BTKBl5xM.js} +1 -1
  39. package/dist/public/assets/realtime-client-ww7MnbTD.js +1 -0
  40. package/dist/public/assets/{relay-entry-pmr-c42O.js → relay-entry-sdeFnTbY.js} +1 -1
  41. package/dist/public/assets/styles-BjPytabP.css +1 -0
  42. package/dist/public/assets/{terminal-runtime-meta-8_uRZf7h.js → terminal-runtime-meta-Cvt1ID92.js} +1 -1
  43. package/dist/public/assets/{useRegisteredDebugTemplates-DWX7LXQu.js → useRegisteredDebugTemplates-O-ymgLd9.js} +1 -1
  44. package/dist/public/index.html +2 -2
  45. package/dist/server/config/env.js +21 -1
  46. package/dist/server/config/env.js.map +1 -1
  47. package/dist/server/config/opencode-base-url-resolver.d.ts +16 -0
  48. package/dist/server/config/opencode-base-url-resolver.js +154 -0
  49. package/dist/server/config/opencode-base-url-resolver.js.map +1 -1
  50. package/dist/server/helpers/wechat-claw-runtime/main.d.ts +1 -0
  51. package/dist/server/helpers/wechat-claw-runtime/main.js +38 -0
  52. package/dist/server/helpers/wechat-claw-runtime/main.js.map +1 -0
  53. package/dist/server/helpers/wechat-claw-runtime/modules/errors.d.ts +5 -0
  54. package/dist/server/helpers/wechat-claw-runtime/modules/errors.js +32 -0
  55. package/dist/server/helpers/wechat-claw-runtime/modules/errors.js.map +1 -0
  56. package/dist/server/helpers/wechat-claw-runtime/modules/login-service.d.ts +16 -0
  57. package/dist/server/helpers/wechat-claw-runtime/modules/login-service.js +209 -0
  58. package/dist/server/helpers/wechat-claw-runtime/modules/login-service.js.map +1 -0
  59. package/dist/server/helpers/wechat-claw-runtime/modules/poll-service.d.ts +18 -0
  60. package/dist/server/helpers/wechat-claw-runtime/modules/poll-service.js +135 -0
  61. package/dist/server/helpers/wechat-claw-runtime/modules/poll-service.js.map +1 -0
  62. package/dist/server/helpers/wechat-claw-runtime/modules/runtime-state-store.d.ts +34 -0
  63. package/dist/server/helpers/wechat-claw-runtime/modules/runtime-state-store.js +394 -0
  64. package/dist/server/helpers/wechat-claw-runtime/modules/runtime-state-store.js.map +1 -0
  65. package/dist/server/helpers/wechat-claw-runtime/modules/send-service.d.ts +9 -0
  66. package/dist/server/helpers/wechat-claw-runtime/modules/send-service.js +64 -0
  67. package/dist/server/helpers/wechat-claw-runtime/modules/send-service.js.map +1 -0
  68. package/dist/server/helpers/wechat-claw-runtime/modules/types.d.ts +167 -0
  69. package/dist/server/helpers/wechat-claw-runtime/modules/types.js +3 -0
  70. package/dist/server/helpers/wechat-claw-runtime/modules/types.js.map +1 -0
  71. package/dist/server/helpers/wechat-claw-runtime/modules/wechat-api-client.d.ts +34 -0
  72. package/dist/server/helpers/wechat-claw-runtime/modules/wechat-api-client.js +160 -0
  73. package/dist/server/helpers/wechat-claw-runtime/modules/wechat-api-client.js.map +1 -0
  74. package/dist/server/helpers/wechat-claw-runtime/routes/accounts.d.ts +9 -0
  75. package/dist/server/helpers/wechat-claw-runtime/routes/accounts.js +24 -0
  76. package/dist/server/helpers/wechat-claw-runtime/routes/accounts.js.map +1 -0
  77. package/dist/server/helpers/wechat-claw-runtime/server.d.ts +5 -0
  78. package/dist/server/helpers/wechat-claw-runtime/server.js +36 -0
  79. package/dist/server/helpers/wechat-claw-runtime/server.js.map +1 -0
  80. package/dist/server/middlewares/auth-guard.js +4 -1
  81. package/dist/server/middlewares/auth-guard.js.map +1 -1
  82. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +4 -1
  83. package/dist/server/modules/assistant-capability/assistant-capability-service.js +12 -1
  84. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  85. package/dist/server/modules/butler/butler-control-session-service.d.ts +20 -2
  86. package/dist/server/modules/butler/butler-control-session-service.js +121 -74
  87. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  88. package/dist/server/modules/butler/butler-profile-service.d.ts +3 -1
  89. package/dist/server/modules/butler/butler-profile-service.js +16 -4
  90. package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
  91. package/dist/server/modules/butler/butler-session-service.js +44 -15
  92. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  93. package/dist/server/modules/channels/channel-bridge-service.d.ts +55 -0
  94. package/dist/server/modules/channels/channel-bridge-service.js +340 -0
  95. package/dist/server/modules/channels/channel-bridge-service.js.map +1 -0
  96. package/dist/server/modules/channels/channel-controller.d.ts +52 -0
  97. package/dist/server/modules/channels/channel-controller.js +54 -0
  98. package/dist/server/modules/channels/channel-controller.js.map +1 -0
  99. package/dist/server/modules/channels/channel-delivery-service.d.ts +63 -0
  100. package/dist/server/modules/channels/channel-delivery-service.js +429 -0
  101. package/dist/server/modules/channels/channel-delivery-service.js.map +1 -0
  102. package/dist/server/modules/channels/channel-gateway-controller.d.ts +15 -0
  103. package/dist/server/modules/channels/channel-gateway-controller.js +16 -0
  104. package/dist/server/modules/channels/channel-gateway-controller.js.map +1 -0
  105. package/dist/server/modules/channels/channel-gateway-service.d.ts +24 -0
  106. package/dist/server/modules/channels/channel-gateway-service.js +56 -0
  107. package/dist/server/modules/channels/channel-gateway-service.js.map +1 -0
  108. package/dist/server/modules/channels/channel-platform-adapters.d.ts +46 -0
  109. package/dist/server/modules/channels/channel-platform-adapters.js +315 -0
  110. package/dist/server/modules/channels/channel-platform-adapters.js.map +1 -0
  111. package/dist/server/modules/channels/channel-platform-catalog.d.ts +3 -0
  112. package/dist/server/modules/channels/channel-platform-catalog.js +42 -0
  113. package/dist/server/modules/channels/channel-platform-catalog.js.map +1 -0
  114. package/dist/server/modules/channels/channel-polling-scheduler.d.ts +31 -0
  115. package/dist/server/modules/channels/channel-polling-scheduler.js +93 -0
  116. package/dist/server/modules/channels/channel-polling-scheduler.js.map +1 -0
  117. package/dist/server/modules/channels/channel-polling-service.d.ts +46 -0
  118. package/dist/server/modules/channels/channel-polling-service.js +176 -0
  119. package/dist/server/modules/channels/channel-polling-service.js.map +1 -0
  120. package/dist/server/modules/channels/channel-service.d.ts +108 -0
  121. package/dist/server/modules/channels/channel-service.js +397 -0
  122. package/dist/server/modules/channels/channel-service.js.map +1 -0
  123. package/dist/server/modules/channels/wechat-claw-client.d.ts +51 -0
  124. package/dist/server/modules/channels/wechat-claw-client.js +245 -0
  125. package/dist/server/modules/channels/wechat-claw-client.js.map +1 -0
  126. package/dist/server/modules/channels/wechat-claw-runtime-boundary.d.ts +4 -0
  127. package/dist/server/modules/channels/wechat-claw-runtime-boundary.js +13 -0
  128. package/dist/server/modules/channels/wechat-claw-runtime-boundary.js.map +1 -0
  129. package/dist/server/modules/channels/wechat-claw-runtime-client.d.ts +14 -0
  130. package/dist/server/modules/channels/wechat-claw-runtime-client.js +95 -0
  131. package/dist/server/modules/channels/wechat-claw-runtime-client.js.map +1 -0
  132. package/dist/server/modules/channels/wechat-claw-runtime-manager.d.ts +16 -0
  133. package/dist/server/modules/channels/wechat-claw-runtime-manager.js +133 -0
  134. package/dist/server/modules/channels/wechat-claw-runtime-manager.js.map +1 -0
  135. package/dist/server/modules/channels/wechat-claw-runtime-types.d.ts +1 -0
  136. package/dist/server/modules/channels/wechat-claw-runtime-types.js +2 -0
  137. package/dist/server/modules/channels/wechat-claw-runtime-types.js.map +1 -0
  138. package/dist/server/modules/opencli/opencli-bridge-skill-service.d.ts +12 -0
  139. package/dist/server/modules/opencli/opencli-bridge-skill-service.js +125 -0
  140. package/dist/server/modules/opencli/opencli-bridge-skill-service.js.map +1 -0
  141. package/dist/server/modules/opencli/opencli-catalog-service.d.ts +50 -0
  142. package/dist/server/modules/opencli/opencli-catalog-service.js +345 -0
  143. package/dist/server/modules/opencli/opencli-catalog-service.js.map +1 -0
  144. package/dist/server/modules/opencli/opencli-controller.d.ts +13 -0
  145. package/dist/server/modules/opencli/opencli-controller.js +30 -0
  146. package/dist/server/modules/opencli/opencli-controller.js.map +1 -0
  147. package/dist/server/modules/opencli/opencli-health-service.d.ts +28 -0
  148. package/dist/server/modules/opencli/opencli-health-service.js +106 -0
  149. package/dist/server/modules/opencli/opencli-health-service.js.map +1 -0
  150. package/dist/server/modules/opencli/opencli-install-discovery.d.ts +23 -0
  151. package/dist/server/modules/opencli/opencli-install-discovery.js +130 -0
  152. package/dist/server/modules/opencli/opencli-install-discovery.js.map +1 -0
  153. package/dist/server/modules/opencli/opencli-management-service.d.ts +59 -0
  154. package/dist/server/modules/opencli/opencli-management-service.js +152 -0
  155. package/dist/server/modules/opencli/opencli-management-service.js.map +1 -0
  156. package/dist/server/modules/opencli/opencli-runtime-builder.d.ts +11 -0
  157. package/dist/server/modules/opencli/opencli-runtime-builder.js +214 -0
  158. package/dist/server/modules/opencli/opencli-runtime-builder.js.map +1 -0
  159. package/dist/server/modules/opencli/opencli-runtime-layout.d.ts +3 -0
  160. package/dist/server/modules/opencli/opencli-runtime-layout.js +11 -0
  161. package/dist/server/modules/opencli/opencli-runtime-layout.js.map +1 -0
  162. package/dist/server/modules/opencli/opencli-runtime-profile-service.d.ts +29 -0
  163. package/dist/server/modules/opencli/opencli-runtime-profile-service.js +104 -0
  164. package/dist/server/modules/opencli/opencli-runtime-profile-service.js.map +1 -0
  165. package/dist/server/modules/opencli/opencli-runtime-resolver.d.ts +29 -0
  166. package/dist/server/modules/opencli/opencli-runtime-resolver.js +110 -0
  167. package/dist/server/modules/opencli/opencli-runtime-resolver.js.map +1 -0
  168. package/dist/server/modules/opencli/opencli-session-prompt-service.d.ts +11 -0
  169. package/dist/server/modules/opencli/opencli-session-prompt-service.js +66 -0
  170. package/dist/server/modules/opencli/opencli-session-prompt-service.js.map +1 -0
  171. package/dist/server/modules/provider/provider-catalog-service.d.ts +45 -0
  172. package/dist/server/modules/provider/provider-catalog-service.js +204 -0
  173. package/dist/server/modules/provider/provider-catalog-service.js.map +1 -0
  174. package/dist/server/modules/provider/provider-controller.d.ts +16 -2
  175. package/dist/server/modules/provider/provider-controller.js +49 -6
  176. package/dist/server/modules/provider/provider-controller.js.map +1 -1
  177. package/dist/server/modules/provider/provider-disabled.d.ts +8 -0
  178. package/dist/server/modules/provider/provider-disabled.js +45 -0
  179. package/dist/server/modules/provider/provider-disabled.js.map +1 -0
  180. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +1 -0
  181. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  182. package/dist/server/modules/provider/provider-discovery-helper-process.js +3 -3
  183. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  184. package/dist/server/modules/provider/provider-discovery-runtime.d.ts +1 -1
  185. package/dist/server/modules/provider/provider-discovery-runtime.js +12 -8
  186. package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -1
  187. package/dist/server/modules/provider/provider-runtime-state-service.d.ts +24 -0
  188. package/dist/server/modules/provider/provider-runtime-state-service.js +141 -0
  189. package/dist/server/modules/provider/provider-runtime-state-service.js.map +1 -0
  190. package/dist/server/modules/sessions/claude-compatible-provider-registry.d.ts +16 -0
  191. package/dist/server/modules/sessions/claude-compatible-provider-registry.js +91 -0
  192. package/dist/server/modules/sessions/claude-compatible-provider-registry.js.map +1 -0
  193. package/dist/server/modules/sessions/session-history-service.d.ts +9 -3
  194. package/dist/server/modules/sessions/session-history-service.js +198 -62
  195. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  196. package/dist/server/modules/sessions/session-live-runtime-router-service.js +9 -4
  197. package/dist/server/modules/sessions/session-live-runtime-router-service.js.map +1 -1
  198. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +8 -4
  199. package/dist/server/modules/sessions/session-live-runtime-service.js +99 -88
  200. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  201. package/dist/server/modules/sessions/session-permission-request-service.d.ts +5 -2
  202. package/dist/server/modules/sessions/session-permission-request-service.js +26 -27
  203. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  204. package/dist/server/modules/sessions/session-provider-config-service.d.ts +18 -1
  205. package/dist/server/modules/sessions/session-provider-config-service.js +142 -17
  206. package/dist/server/modules/sessions/session-provider-config-service.js.map +1 -1
  207. package/dist/server/modules/sessions/session-provider-error-mapper.js +7 -0
  208. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  209. package/dist/server/modules/skills/skill-manager-service.d.ts +5 -0
  210. package/dist/server/modules/skills/skill-manager-service.js +26 -0
  211. package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
  212. package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +1 -0
  213. package/dist/server/modules/tasks/task-helper-process-handlers.js +1 -1
  214. package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
  215. package/dist/server/modules/tasks/task-types.d.ts +2 -0
  216. package/dist/server/modules/tasks/task-types.js +2 -0
  217. package/dist/server/modules/tasks/task-types.js.map +1 -1
  218. package/dist/server/routes/channels.d.ts +3 -0
  219. package/dist/server/routes/channels.js +16 -0
  220. package/dist/server/routes/channels.js.map +1 -0
  221. package/dist/server/routes/opencli.d.ts +3 -0
  222. package/dist/server/routes/opencli.js +7 -0
  223. package/dist/server/routes/opencli.js.map +1 -0
  224. package/dist/server/routes/providers.js +5 -2
  225. package/dist/server/routes/providers.js.map +1 -1
  226. package/dist/server/routes/public.d.ts +2 -1
  227. package/dist/server/routes/public.js +3 -1
  228. package/dist/server/routes/public.js.map +1 -1
  229. package/dist/server/server/create-server.d.ts +30 -0
  230. package/dist/server/server/create-server.js +104 -12
  231. package/dist/server/server/create-server.js.map +1 -1
  232. package/dist/server/shared/http/error-handler.js +59 -3
  233. package/dist/server/shared/http/error-handler.js.map +1 -1
  234. package/dist/server/storage/repositories/channel-account-repository.d.ts +12 -0
  235. package/dist/server/storage/repositories/channel-account-repository.js +153 -0
  236. package/dist/server/storage/repositories/channel-account-repository.js.map +1 -0
  237. package/dist/server/storage/repositories/channel-delivery-repository.d.ts +13 -0
  238. package/dist/server/storage/repositories/channel-delivery-repository.js +156 -0
  239. package/dist/server/storage/repositories/channel-delivery-repository.js.map +1 -0
  240. package/dist/server/storage/repositories/channel-inbound-event-repository.d.ts +12 -0
  241. package/dist/server/storage/repositories/channel-inbound-event-repository.js +144 -0
  242. package/dist/server/storage/repositories/channel-inbound-event-repository.js.map +1 -0
  243. package/dist/server/storage/repositories/channel-thread-repository.d.ts +12 -0
  244. package/dist/server/storage/repositories/channel-thread-repository.js +152 -0
  245. package/dist/server/storage/repositories/channel-thread-repository.js.map +1 -0
  246. package/dist/server/storage/repositories/opencli-catalog-entry-repository.d.ts +9 -0
  247. package/dist/server/storage/repositories/opencli-catalog-entry-repository.js +85 -0
  248. package/dist/server/storage/repositories/opencli-catalog-entry-repository.js.map +1 -0
  249. package/dist/server/storage/repositories/opencli-provider-repository.d.ts +8 -0
  250. package/dist/server/storage/repositories/opencli-provider-repository.js +88 -0
  251. package/dist/server/storage/repositories/opencli-provider-repository.js.map +1 -0
  252. package/dist/server/storage/repositories/opencli-runtime-profile-repository.d.ts +11 -0
  253. package/dist/server/storage/repositories/opencli-runtime-profile-repository.js +127 -0
  254. package/dist/server/storage/repositories/opencli-runtime-profile-repository.js.map +1 -0
  255. package/dist/server/storage/repositories/provider-control-repository.d.ts +9 -0
  256. package/dist/server/storage/repositories/provider-control-repository.js +51 -0
  257. package/dist/server/storage/repositories/provider-control-repository.js.map +1 -0
  258. package/dist/server/storage/repositories/provider-runtime-state-repository.d.ts +9 -0
  259. package/dist/server/storage/repositories/provider-runtime-state-repository.js +50 -0
  260. package/dist/server/storage/repositories/provider-runtime-state-repository.js.map +1 -0
  261. package/dist/server/storage/sqlite/client.js +53 -0
  262. package/dist/server/storage/sqlite/client.js.map +1 -1
  263. package/dist/server/storage/sqlite/schema.sql +180 -0
  264. package/dist/server/types/domain.d.ts +132 -0
  265. package/dist/server/ws/workbench-ws-hub.js +8 -2
  266. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  267. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +28 -11
  268. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  269. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +61 -8
  270. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  271. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.d.ts +5 -0
  272. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.js +1 -1
  273. package/node_modules/@codingns/session-sync-core/dist/runtime/legna-runtime.js.map +1 -1
  274. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.d.ts +3 -0
  275. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js +94 -21
  276. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js.map +1 -1
  277. package/package.json +1 -1
  278. package/dist/public/assets/AdaptiveButlerPage-Dw72U3hG.js +0 -3
  279. package/dist/public/assets/ConversationPage-8wOY7SX-.js +0 -4
  280. package/dist/public/assets/SessionIndexPage-B-tRhBXC.js +0 -1
  281. package/dist/public/assets/SettingsPage-C9LGxSQZ.js +0 -1
  282. package/dist/public/assets/WorkbenchLayout-pOZvEqp7.js +0 -3
  283. package/dist/public/assets/WorkbenchModal-ColqvV6a.js +0 -1
  284. package/dist/public/assets/WorkbenchShellRoute-C0_h4lP6.js +0 -1
  285. package/dist/public/assets/file-tree-icon-Bp3Ntt7u.js +0 -31
  286. package/dist/public/assets/index-B84Po2NA.css +0 -1
  287. package/dist/public/assets/index-C-0oeG_5.js +0 -42
  288. package/dist/public/assets/model-switch-api-Bh9nYslz.js +0 -1
  289. package/dist/public/assets/session-runtime-machine-YN84QBlr.js +0 -21
  290. package/dist/public/assets/styles-CsEMfdaS.css +0 -1
  291. /package/dist/public/assets/{styles-DRVvx_kv.js → styles-lhQGDlPF.js} +0 -0
@@ -6,7 +6,6 @@ import { createId } from "../../shared/utils/id.js";
6
6
  import { logPerformance } from "../../shared/utils/perf-log.js";
7
7
  import { isTerminalDebugEnabled, logTerminalDebug, terminalDebugNowMs } from "../../shared/utils/terminal-debug-log.js";
8
8
  import { nowIso } from "../../shared/utils/time.js";
9
- import { isCommandAvailable } from "../../shared/utils/command-availability.js";
10
9
  import { inspectSessionActivity } from "./session-activity-inspector.js";
11
10
  import { SessionActivityAuthorityService } from "./session-activity-authority-service.js";
12
11
  import { mapSessionProviderError } from "./session-provider-error-mapper.js";
@@ -17,6 +16,8 @@ import { CodexModelOptionsService, createFallbackCodexModelOptions, enrichCodexC
17
16
  import { OpenCodeModelOptionsService, createFallbackOpenCodeModelOptions, enrichOpenCodeCapabilities } from "../provider/opencode-model-options.js";
18
17
  import { getSharedProviderDiscoveryHelperClient } from "../provider/provider-discovery-helper-client.js";
19
18
  import { discoverWorkspaceSessionsInRuntime } from "../provider/provider-discovery-runtime.js";
19
+ import { applyProviderDisabledState, createProviderCapabilityBlockedError } from "../provider/provider-disabled.js";
20
+ import { ProviderRuntimeStateService } from "../provider/provider-runtime-state-service.js";
20
21
  import { createTaskManager } from "../tasks/task-manager.js";
21
22
  import { HOST_TASK_TYPES } from "../tasks/task-types.js";
22
23
  import { CodexAppServerHelperClient } from "./codex-app-server-helper-client.js";
@@ -71,14 +72,14 @@ export class SessionHistoryService {
71
72
  claudeCodeHomeDir;
72
73
  codexModelOptionsService;
73
74
  openCodeModelOptionsService;
74
- providerCliCommandPaths;
75
- providerCliAvailability;
76
75
  parallelSessionGroupRepository;
77
76
  parallelSessionMemberRepository;
78
77
  sessionIsolatedWorkspaceRepository;
79
78
  providerDiscoveryHelperClient = getSharedProviderDiscoveryHelperClient();
80
79
  providerSessionDiscoveryConfig;
80
+ providerRuntimeStateService;
81
81
  sessionProviderConfigService;
82
+ providerControlRepository;
82
83
  taskManager;
83
84
  workspaceDiscoveryStatuses = new Map();
84
85
  workspaceStateRefreshStatuses = new Map();
@@ -88,7 +89,7 @@ export class SessionHistoryService {
88
89
  sessionDeletedObservers = new Set();
89
90
  workspaceSessionRelations = new Map();
90
91
  workspaceStateRefreshTaskSequence = 0;
91
- constructor(db, workspaceRepository, sessionBindingRepository, sessionChangedFileService, sessionIndexRepository, sessionMessageAttachmentService, sessionStateRepository, sessionStatusSnapshotRepository, config, sessionActivityAuthorityService = new SessionActivityAuthorityService(), sessionMessageOriginRepository = null, sessionForkRepository = null, adapterOverrides = {}, taskManager = createTaskManager(), parallelSessionGroupRepository = null, parallelSessionMemberRepository = null, sessionIsolatedWorkspaceRepository = null, sessionProviderConfigService = null) {
92
+ constructor(db, workspaceRepository, sessionBindingRepository, sessionChangedFileService, sessionIndexRepository, sessionMessageAttachmentService, sessionStateRepository, sessionStatusSnapshotRepository, config, sessionActivityAuthorityService = new SessionActivityAuthorityService(), sessionMessageOriginRepository = null, sessionForkRepository = null, adapterOverrides = {}, taskManager = createTaskManager(), parallelSessionGroupRepository = null, parallelSessionMemberRepository = null, sessionIsolatedWorkspaceRepository = null, sessionProviderConfigService = null, providerControlRepository = null, providerRuntimeStateService = null) {
92
93
  this.db = db;
93
94
  this.workspaceRepository = workspaceRepository;
94
95
  this.sessionBindingRepository = sessionBindingRepository;
@@ -107,16 +108,16 @@ export class SessionHistoryService {
107
108
  this.parallelSessionMemberRepository = parallelSessionMemberRepository;
108
109
  this.sessionIsolatedWorkspaceRepository = sessionIsolatedWorkspaceRepository;
109
110
  this.sessionProviderConfigService = sessionProviderConfigService;
110
- this.claudeCodeHomeDir = config.claudeCodeHomeDir;
111
- this.providerCliCommandPaths = {
112
- "claude-code": process.platform === "win32" ? "claude.cmd" : "claude",
113
- "legna-code": config.legnaCodeCliPath,
114
- codex: config.codexCliPath,
115
- gemini: config.geminiCliPath,
116
- kimi: config.kimiCliPath
111
+ this.providerRuntimeStateService = providerRuntimeStateService
112
+ ?? new ProviderRuntimeStateService(config);
113
+ this.providerControlRepository = providerControlRepository ?? {
114
+ get: (providerId) => ({
115
+ providerId: providerId.trim(),
116
+ enabled: true,
117
+ updatedAt: ""
118
+ })
117
119
  };
118
- // CLI 是否可用只在 Host 启动时探测一次;后续统一读缓存,更新 CLI 后重启 Host 生效。
119
- this.providerCliAvailability = buildProviderCliAvailabilitySnapshot(this.providerCliCommandPaths);
120
+ this.claudeCodeHomeDir = config.claudeCodeHomeDir;
120
121
  this.providerSessionDiscoveryConfig = {
121
122
  claudeCodeHomeDir: config.claudeCodeHomeDir,
122
123
  legnaCodeHomeDir: config.legnaCodeHomeDir,
@@ -208,7 +209,7 @@ export class SessionHistoryService {
208
209
  executionLane: "helper_process",
209
210
  concurrency: WORKSPACE_DISCOVERY_SCAN_CONCURRENCY,
210
211
  helperProcessHandler: "session.workspace_discovery",
211
- run: async ({ config, workspacePath, knownSessions }, context) => await discoverWorkspaceSessionsInRuntime(config, workspacePath, knownSessions, context.signal)
212
+ run: async ({ config, workspacePath, knownSessions, enabledProviders }, context) => await discoverWorkspaceSessionsInRuntime(config, workspacePath, knownSessions, enabledProviders, context.signal)
212
213
  });
213
214
  }
214
215
  if (!this.taskManager.has(HOST_TASK_TYPES.providerCapabilityRefresh)) {
@@ -453,11 +454,11 @@ export class SessionHistoryService {
453
454
  .listByWorkspace(workspaceId, userId)
454
455
  .filter((item) => !this.isPendingSessionAlias(item));
455
456
  const projectedItems = this.listProjectedIsolatedWorkspaceSessions(workspaceId, userId);
456
- return this.enrichSessionItems(workspaceId, sortSessionListItemsByRecentActivity(mergeSessionListItemsBySessionId([...directItems, ...projectedItems])));
457
+ return this.filterDisabledProviderSessions(this.enrichSessionItems(workspaceId, sortSessionListItemsByRecentActivity(mergeSessionListItemsBySessionId([...directItems, ...projectedItems]))));
457
458
  }
458
459
  getProviderCapabilitiesSnapshot(provider) {
459
460
  try {
460
- return this.resolveProviderCapabilitiesImmediate(this.applyProviderCliAvailability(this.capabilityService.getProviderCapabilities(provider)), null);
461
+ return this.applyProviderEnabledState(this.resolveProviderCapabilitiesImmediate(this.applyProviderCliAvailability(this.capabilityService.getProviderCapabilities(provider)), null));
461
462
  }
462
463
  catch (error) {
463
464
  throw mapSessionProviderError(error);
@@ -474,10 +475,10 @@ export class SessionHistoryService {
474
475
  refreshedAt: Date.now(),
475
476
  value: refreshed
476
477
  });
477
- return refreshed;
478
+ return this.applyProviderEnabledState(refreshed);
478
479
  }
479
480
  this.scheduleProviderCapabilityRefresh(baseCapabilities, workspacePath);
480
- return this.resolveProviderCapabilitiesImmediate(baseCapabilities, workspacePath);
481
+ return this.applyProviderEnabledState(this.resolveProviderCapabilitiesImmediate(baseCapabilities, workspacePath));
481
482
  }
482
483
  catch (error) {
483
484
  throw mapSessionProviderError(error);
@@ -499,11 +500,11 @@ export class SessionHistoryService {
499
500
  refreshedAt: Date.now(),
500
501
  value: refreshed
501
502
  });
502
- return refreshed;
503
+ return this.applyProviderEnabledState(refreshed);
503
504
  });
504
505
  }
505
506
  this.scheduleProviderCapabilityRefresh(normalizedCapabilities, workspacePath);
506
- return this.resolveProviderCapabilitiesImmediate(normalizedCapabilities, workspacePath);
507
+ return this.applyProviderEnabledState(this.resolveProviderCapabilitiesImmediate(normalizedCapabilities, workspacePath));
507
508
  })
508
509
  .catch((error) => {
509
510
  throw mapSessionProviderError(error);
@@ -531,6 +532,9 @@ export class SessionHistoryService {
531
532
  return applyImmediateModelOptionFallbacks(claudeEnriched, this.codexModelOptionsService.peekSnapshot(), this.openCodeModelOptionsService.peekSnapshot(workspacePath));
532
533
  }
533
534
  scheduleProviderCapabilityRefresh(capabilities, workspacePath) {
535
+ if (!this.isProviderEnabled(capabilities.provider)) {
536
+ return;
537
+ }
534
538
  const cacheKey = buildProviderCapabilityCacheKey(capabilities.provider, workspacePath);
535
539
  const cached = this.providerCapabilityCache.get(cacheKey);
536
540
  if (cached &&
@@ -563,7 +567,7 @@ export class SessionHistoryService {
563
567
  if (!isProviderCliBacked(capabilities.provider)) {
564
568
  return capabilities;
565
569
  }
566
- if (this.providerCliAvailability[capabilities.provider]) {
570
+ if (this.providerRuntimeStateService.isProviderCliAvailable(capabilities.provider)) {
567
571
  return capabilities;
568
572
  }
569
573
  const limitation = buildProviderCliUnavailableMessage(capabilities.provider);
@@ -582,17 +586,31 @@ export class SessionHistoryService {
582
586
  limitations
583
587
  };
584
588
  }
589
+ applyProviderEnabledState(capabilities) {
590
+ if (this.isProviderEnabled(capabilities.provider)) {
591
+ return capabilities;
592
+ }
593
+ return applyProviderDisabledState(capabilities);
594
+ }
595
+ isProviderEnabled(provider) {
596
+ return this.providerControlRepository.get(provider.trim()).enabled;
597
+ }
598
+ filterDisabledProviderSessions(items) {
599
+ return items.filter((item) => this.isProviderEnabled(item.provider));
600
+ }
585
601
  assertProviderCapabilityEnabled(provider, capability, fallbackDetail) {
586
602
  const capabilities = this.getProviderCapabilitiesSnapshot(provider);
587
603
  if (capabilities[capability]) {
588
604
  return;
589
605
  }
590
- throw new AppError({
591
- statusCode: 409,
592
- errorCode: "PROVIDER_UNAVAILABLE",
593
- detail: capabilities.limitations[0] ?? fallbackDetail,
594
- field: "provider"
595
- });
606
+ throw createProviderCapabilityBlockedError(capabilities, "provider", fallbackDetail);
607
+ }
608
+ assertProviderSendEnabled(provider, field, fallbackDetail) {
609
+ const capabilities = this.getProviderCapabilitiesSnapshot(provider);
610
+ if (capabilities.canSendMessage) {
611
+ return;
612
+ }
613
+ throw createProviderCapabilityBlockedError(capabilities, field, fallbackDetail);
596
614
  }
597
615
  async getSessionContextUsage(sessionId) {
598
616
  const binding = this.getBindingOrThrow(sessionId);
@@ -629,6 +647,7 @@ export class SessionHistoryService {
629
647
  }
630
648
  }
631
649
  async startSession(input) {
650
+ this.assertProviderCapabilityEnabled(input.provider, "canStartSession", "当前 provider 不支持创建会话");
632
651
  if (SESSION_START_DEFERRED_PROVIDERS.has(input.provider)) {
633
652
  throw new AppError({
634
653
  statusCode: 409,
@@ -1008,6 +1027,7 @@ export class SessionHistoryService {
1008
1027
  }
1009
1028
  async sendMessage(sessionId, content, clientRequestId, permissionMode = null) {
1010
1029
  const binding = this.getBindingOrThrow(sessionId);
1030
+ this.assertProviderSendEnabled(binding.provider, "sessionId", "当前 provider 不支持继续发送消息");
1011
1031
  const result = await this.sessionSyncService
1012
1032
  .sendMessage(binding.provider, binding.providerSessionId, binding.rawStoreRef, content, clientRequestId, permissionMode)
1013
1033
  .catch((error) => {
@@ -1383,14 +1403,19 @@ export class SessionHistoryService {
1383
1403
  try {
1384
1404
  const discoverStartedAt = Date.now();
1385
1405
  const existingWorkspaceSessions = this.sessionIndexRepository.listByWorkspace(workspaceId, userId);
1386
- const knownSessions = this.buildKnownSessionSummaries(existingWorkspaceSessions, workspace.path);
1406
+ const enabledProviders = this.providerRegistry
1407
+ .list()
1408
+ .map((adapter) => adapter.providerId)
1409
+ .filter((providerId) => this.isProviderEnabled(providerId));
1410
+ const knownSessions = this.buildKnownSessionSummaries(existingWorkspaceSessions.filter((session) => enabledProviders.includes(session.provider)), workspace.path);
1387
1411
  const discoveryHandle = this.taskManager.enqueue(HOST_TASK_TYPES.workspaceDiscoveryScan, {
1388
1412
  key: workspaceId,
1389
1413
  source: "session_history.workspace_discovery.scan",
1390
1414
  input: {
1391
1415
  config: this.providerSessionDiscoveryConfig,
1392
1416
  workspacePath: workspace.path,
1393
- knownSessions
1417
+ knownSessions,
1418
+ enabledProviders
1394
1419
  }
1395
1420
  });
1396
1421
  const discovery = await awaitTaskHandleWithSignal(discoveryHandle, signal).catch((error) => {
@@ -1532,12 +1557,15 @@ export class SessionHistoryService {
1532
1557
  annotationSourceText: relation?.annotationSourceText
1533
1558
  ?? persistedSession.existingIndex?.annotationSourceText
1534
1559
  ?? null,
1535
- isSubagent: relation?.isSubagent
1536
- ?? persistedSession.existingIndex?.isSubagent
1537
- ?? false,
1538
- subagentLabel: relation?.subagentLabel
1539
- ?? persistedSession.existingIndex?.subagentLabel
1540
- ?? null,
1560
+ isSubagent: resolvePersistedSubagentState({
1561
+ discoveredIsSubagent: relation?.isSubagent,
1562
+ existingIsSubagent: persistedSession.existingIndex?.isSubagent
1563
+ }),
1564
+ subagentLabel: resolvePersistedSubagentLabel({
1565
+ discoveredIsSubagent: relation?.isSubagent,
1566
+ discoveredSubagentLabel: relation?.subagentLabel ?? null,
1567
+ existingSubagentLabel: persistedSession.existingIndex?.subagentLabel ?? null
1568
+ }),
1541
1569
  title: resolvePersistedSessionTitle(persistedSession.session.provider, persistedSession.session.title, persistedSession.existingIndex?.title ?? null, resolvedParentTitle),
1542
1570
  messageCount: persistedSession.session.messageCount,
1543
1571
  isArchived: resolveDiscoveredArchiveState(persistedSession.session.provider, persistedSession.existingIndex?.isArchived ?? false, persistedSession.session.isArchived),
@@ -1830,6 +1858,7 @@ export class SessionHistoryService {
1830
1858
  if (!sessionId) {
1831
1859
  continue;
1832
1860
  }
1861
+ const existingIndex = this.sessionIndexRepository.findIndexRecordBySessionId(sessionId);
1833
1862
  const parentSessionId = session.parentProviderSessionId
1834
1863
  ? discoveredSessionIds.get(buildProviderSessionKey(session.provider, session.parentProviderSessionId)) ??
1835
1864
  this.sessionBindingRepository.findByProviderSession(session.provider, session.parentProviderSessionId)?.sessionId ??
@@ -1837,14 +1866,18 @@ export class SessionHistoryService {
1837
1866
  : this.resolvePersistedParentSessionId(sessionId);
1838
1867
  relationMap.set(sessionId, {
1839
1868
  parentSessionId,
1840
- sessionKind: this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.sessionKind ?? "default",
1841
- annotationSourceMessageId: this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.annotationSourceMessageId ?? null,
1842
- annotationSourceText: this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.annotationSourceText ?? null,
1843
- isSubagent: session.isSubagent === true
1844
- || this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.isSubagent === true,
1845
- subagentLabel: session.subagentLabel?.trim()
1846
- || this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.subagentLabel
1847
- || null
1869
+ sessionKind: existingIndex?.sessionKind ?? "default",
1870
+ annotationSourceMessageId: existingIndex?.annotationSourceMessageId ?? null,
1871
+ annotationSourceText: existingIndex?.annotationSourceText ?? null,
1872
+ isSubagent: resolvePersistedSubagentState({
1873
+ discoveredIsSubagent: session.isSubagent,
1874
+ existingIsSubagent: existingIndex?.isSubagent
1875
+ }),
1876
+ subagentLabel: resolvePersistedSubagentLabel({
1877
+ discoveredIsSubagent: session.isSubagent,
1878
+ discoveredSubagentLabel: session.subagentLabel ?? null,
1879
+ existingSubagentLabel: existingIndex?.subagentLabel ?? null
1880
+ })
1848
1881
  });
1849
1882
  }
1850
1883
  return relationMap;
@@ -1976,8 +2009,13 @@ export class SessionHistoryService {
1976
2009
  .listBySourceWorkspaceId(workspaceId)
1977
2010
  .filter((record) => record.lifecycleStatus === "active"
1978
2011
  || record.lifecycleStatus === "removing")
1979
- .map((record) => this.sessionIndexRepository.findBySessionId(record.ownerSessionId, userId))
1980
- .filter((item) => Boolean(item))
2012
+ .flatMap((record) => {
2013
+ const isolatedWorkspaceItems = this.sessionIndexRepository.listByWorkspace(record.workspaceId, userId);
2014
+ if (isolatedWorkspaceItems.length === 0) {
2015
+ return [];
2016
+ }
2017
+ return filterProjectedIsolatedWorkspaceSessionTree(isolatedWorkspaceItems, record.ownerSessionId);
2018
+ })
1981
2019
  .filter((item) => !this.isPendingSessionAlias(item));
1982
2020
  }
1983
2021
  async pullSessionHistory(sessionId, cursor, limit, deliveredMessages, onEnvelope, envelopeType, isClosed = () => false) {
@@ -2668,15 +2706,15 @@ export class SessionHistoryService {
2668
2706
  ?? targetIndex?.annotationSourceText
2669
2707
  ?? sourceIndex?.annotationSourceText
2670
2708
  ?? null,
2671
- isSubagent: Boolean(targetRelation?.isSubagent
2672
- || sourceRelation?.isSubagent
2673
- || targetIndex?.isSubagent
2674
- || sourceIndex?.isSubagent),
2675
- subagentLabel: targetRelation?.subagentLabel
2676
- ?? sourceRelation?.subagentLabel
2677
- ?? targetIndex?.subagentLabel
2678
- ?? sourceIndex?.subagentLabel
2679
- ?? null
2709
+ isSubagent: resolvePersistedSubagentState({
2710
+ discoveredIsSubagent: targetRelation?.isSubagent ?? sourceRelation?.isSubagent,
2711
+ existingIsSubagent: targetIndex?.isSubagent ?? sourceIndex?.isSubagent
2712
+ }),
2713
+ subagentLabel: resolvePersistedSubagentLabel({
2714
+ discoveredIsSubagent: targetRelation?.isSubagent ?? sourceRelation?.isSubagent,
2715
+ discoveredSubagentLabel: targetRelation?.subagentLabel ?? sourceRelation?.subagentLabel ?? null,
2716
+ existingSubagentLabel: targetIndex?.subagentLabel ?? sourceIndex?.subagentLabel ?? null
2717
+ })
2680
2718
  });
2681
2719
  for (const relation of relationMap.values()) {
2682
2720
  if (relation.parentSessionId === sourceSessionId) {
@@ -2725,6 +2763,12 @@ export class SessionHistoryService {
2725
2763
  return Number(row?.count ?? 0);
2726
2764
  }
2727
2765
  detachSessionRelationsBeforeDelete(sessionId) {
2766
+ const controlSessionIds = this.db
2767
+ .prepare(`SELECT id
2768
+ FROM butler_control_sessions
2769
+ WHERE session_id = ?`)
2770
+ .all(sessionId)
2771
+ .map((row) => String(row.id));
2728
2772
  this.db
2729
2773
  .prepare(`UPDATE session_indices
2730
2774
  SET parent_session_id = NULL
@@ -2735,6 +2779,47 @@ export class SessionHistoryService {
2735
2779
  WHERE parent_session_id = ?
2736
2780
  OR fork_source_session_id = ?`)
2737
2781
  .run(sessionId, sessionId);
2782
+ if (controlSessionIds.length > 0) {
2783
+ const controlSessionPlaceholders = controlSessionIds.map(() => "?").join(", ");
2784
+ this.db
2785
+ .prepare(`UPDATE channel_threads
2786
+ SET control_session_id = NULL,
2787
+ session_id = NULL
2788
+ WHERE session_id = ?
2789
+ OR control_session_id IN (${controlSessionPlaceholders})`)
2790
+ .run(sessionId, ...controlSessionIds);
2791
+ this.db
2792
+ .prepare(`UPDATE channel_inbound_events
2793
+ SET control_session_id = NULL,
2794
+ session_id = NULL
2795
+ WHERE session_id = ?
2796
+ OR control_session_id IN (${controlSessionPlaceholders})`)
2797
+ .run(sessionId, ...controlSessionIds);
2798
+ this.db
2799
+ .prepare(`UPDATE channel_deliveries
2800
+ SET control_session_id = NULL,
2801
+ session_id = NULL
2802
+ WHERE session_id = ?
2803
+ OR control_session_id IN (${controlSessionPlaceholders})`)
2804
+ .run(sessionId, ...controlSessionIds);
2805
+ }
2806
+ else {
2807
+ this.db
2808
+ .prepare(`UPDATE channel_threads
2809
+ SET session_id = NULL
2810
+ WHERE session_id = ?`)
2811
+ .run(sessionId);
2812
+ this.db
2813
+ .prepare(`UPDATE channel_inbound_events
2814
+ SET session_id = NULL
2815
+ WHERE session_id = ?`)
2816
+ .run(sessionId);
2817
+ this.db
2818
+ .prepare(`UPDATE channel_deliveries
2819
+ SET session_id = NULL
2820
+ WHERE session_id = ?`)
2821
+ .run(sessionId);
2822
+ }
2738
2823
  this.db
2739
2824
  .prepare("DELETE FROM butler_control_sessions WHERE session_id = ?")
2740
2825
  .run(sessionId);
@@ -2966,6 +3051,42 @@ export class SessionHistoryService {
2966
3051
  });
2967
3052
  }
2968
3053
  }
3054
+ function filterProjectedIsolatedWorkspaceSessionTree(items, ownerSessionId) {
3055
+ const normalizedOwnerSessionId = ownerSessionId.trim();
3056
+ if (!normalizedOwnerSessionId) {
3057
+ return [];
3058
+ }
3059
+ const itemBySessionId = new Map(items.map((item) => [item.sessionId, item]));
3060
+ const ownerItem = itemBySessionId.get(normalizedOwnerSessionId);
3061
+ if (!ownerItem) {
3062
+ return [];
3063
+ }
3064
+ const childSessionIdsByParentId = new Map();
3065
+ for (const item of items) {
3066
+ const parentSessionId = item.parentSessionId?.trim();
3067
+ if (!parentSessionId) {
3068
+ continue;
3069
+ }
3070
+ const sessionIds = childSessionIdsByParentId.get(parentSessionId) ?? [];
3071
+ sessionIds.push(item.sessionId);
3072
+ childSessionIdsByParentId.set(parentSessionId, sessionIds);
3073
+ }
3074
+ const projectedSessionIds = new Set();
3075
+ const queue = [normalizedOwnerSessionId];
3076
+ while (queue.length > 0) {
3077
+ const currentSessionId = queue.shift();
3078
+ if (!currentSessionId || projectedSessionIds.has(currentSessionId)) {
3079
+ continue;
3080
+ }
3081
+ projectedSessionIds.add(currentSessionId);
3082
+ for (const childSessionId of childSessionIdsByParentId.get(currentSessionId) ?? []) {
3083
+ if (!projectedSessionIds.has(childSessionId)) {
3084
+ queue.push(childSessionId);
3085
+ }
3086
+ }
3087
+ }
3088
+ return items.filter((item) => projectedSessionIds.has(item.sessionId));
3089
+ }
2969
3090
  function isProviderCliBacked(provider) {
2970
3091
  return provider === "claude-code"
2971
3092
  || provider === "legna-code"
@@ -2973,12 +3094,6 @@ function isProviderCliBacked(provider) {
2973
3094
  || provider === "gemini"
2974
3095
  || provider === "kimi";
2975
3096
  }
2976
- function buildProviderCliAvailabilitySnapshot(commandPaths) {
2977
- return Object.freeze(Object.fromEntries(Object.entries(commandPaths).map(([provider, commandPath]) => [
2978
- provider,
2979
- isCommandAvailable(commandPath)
2980
- ])));
2981
- }
2982
3097
  function buildProviderCliUnavailableMessage(provider) {
2983
3098
  switch (provider) {
2984
3099
  case "claude-code":
@@ -3220,8 +3335,13 @@ function mergeSessionIndexRecord(input) {
3220
3335
  sessionKind: input.target?.sessionKind ?? input.source?.sessionKind ?? "default",
3221
3336
  annotationSourceMessageId: input.target?.annotationSourceMessageId ?? input.source?.annotationSourceMessageId ?? null,
3222
3337
  annotationSourceText: input.target?.annotationSourceText ?? input.source?.annotationSourceText ?? null,
3223
- isSubagent: Boolean(input.target?.isSubagent || input.source?.isSubagent),
3224
- subagentLabel: input.target?.subagentLabel ?? input.source?.subagentLabel ?? null,
3338
+ isSubagent: resolvePersistedSubagentState({
3339
+ discoveredIsSubagent: input.target?.isSubagent ?? input.source?.isSubagent
3340
+ }),
3341
+ subagentLabel: resolvePersistedSubagentLabel({
3342
+ discoveredIsSubagent: input.target?.isSubagent ?? input.source?.isSubagent,
3343
+ discoveredSubagentLabel: input.target?.subagentLabel ?? input.source?.subagentLabel ?? null
3344
+ }),
3225
3345
  title: pickPreferredSessionTitle(input.target?.title ?? null, input.source?.title ?? null),
3226
3346
  messageCount: Math.max(input.target?.messageCount ?? 0, input.source?.messageCount ?? 0),
3227
3347
  isArchived: mergePersistedArchiveState(input.provider, input.target?.isArchived, input.source?.isArchived),
@@ -3238,6 +3358,22 @@ function mergePersistedArchiveState(provider, targetArchived, sourceArchived) {
3238
3358
  }
3239
3359
  return targetArchived ?? sourceArchived ?? false;
3240
3360
  }
3361
+ function resolvePersistedSubagentState(input) {
3362
+ if (typeof input.discoveredIsSubagent === "boolean") {
3363
+ return input.discoveredIsSubagent;
3364
+ }
3365
+ return input.existingIsSubagent === true;
3366
+ }
3367
+ function resolvePersistedSubagentLabel(input) {
3368
+ if (input.discoveredIsSubagent === false) {
3369
+ return null;
3370
+ }
3371
+ const discoveredSubagentLabel = input.discoveredSubagentLabel?.trim() || null;
3372
+ if (discoveredSubagentLabel) {
3373
+ return discoveredSubagentLabel;
3374
+ }
3375
+ return input.existingSubagentLabel ?? null;
3376
+ }
3241
3377
  function mergeSessionStatusSnapshot(input) {
3242
3378
  if (!input.target && !input.source) {
3243
3379
  return null;