@jingyi0605/codingns 0.6.5 → 0.7.1

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 (225) hide show
  1. package/dist/public/assets/AdaptiveButlerPage-Cd8nPdO0.js +3 -0
  2. package/dist/public/assets/{App-B9HcTkMT.js → App-CyxK-Nos.js} +6 -6
  3. package/dist/public/assets/{BootstrapPage-BgLdZEKQ.js → BootstrapPage-DEwPKWR8.js} +1 -1
  4. package/dist/public/assets/ConversationPage-CxWtRhfz.js +6 -0
  5. package/dist/public/assets/{DesktopDetachPreviewPage-YCBnyC58.js → DesktopDetachPreviewPage-DDOWolgB.js} +1 -1
  6. package/dist/public/assets/{DesktopWindowPage-CrvndE23.js → DesktopWindowPage-CtS9D8FD.js} +1 -1
  7. package/dist/public/assets/{FileContextPanel-CdC7GGw5.js → FileContextPanel-CNOjhsi5.js} +1 -1
  8. package/dist/public/assets/GitSidebar-DpC4UhFy.js +6 -0
  9. package/dist/public/assets/{MobileCreateSessionSheet-Cb2HM-y3.js → MobileCreateSessionSheet-DE4pTyXj.js} +1 -1
  10. package/dist/public/assets/{MobileTopHeaderFrame-etF2HKlm.js → MobileTopHeaderFrame-D_ZbS0qi.js} +1 -1
  11. package/dist/public/assets/{MobileWorkspaceSwitcherHeader-CuGJ31kb.js → MobileWorkspaceSwitcherHeader-Dc12IAXc.js} +1 -1
  12. package/dist/public/assets/{RelayConnectEntryPage-BB6DbGtP.js → RelayConnectEntryPage-D8kyZfdm.js} +1 -1
  13. package/dist/public/assets/{ServerSettingsModal-Bl1sacZg.js → ServerSettingsModal-8eRu6VXr.js} +1 -1
  14. package/dist/public/assets/SessionIndexPage-DIi0JWKP.js +1 -0
  15. package/dist/public/assets/SettingsPage-OQq3kp32.js +2 -0
  16. package/dist/public/assets/{TerminalManagerPanel-BOm8Hi_v.js → TerminalManagerPanel-BEMzisSy.js} +1 -1
  17. package/dist/public/assets/{TerminalPage-B5JNFU6w.js → TerminalPage-CXLQfwjU.js} +18 -18
  18. package/dist/public/assets/{TerminalRuntimeFallbackModal-CM3LRKOJ.js → TerminalRuntimeFallbackModal-BY_VUAbq.js} +1 -1
  19. package/dist/public/assets/ToolFilesPage-CYx3DgHg.js +1 -0
  20. package/dist/public/assets/ToolGitPage-fgQcvF6v.js +1 -0
  21. package/dist/public/assets/ToolProcessesPage-BL6yDDPV.js +1 -0
  22. package/dist/public/assets/{ToolsHomePage-DsJp0y8A.js → ToolsHomePage-B1n2OeVw.js} +1 -1
  23. package/dist/public/assets/{WorkbenchLandingPage-DyPei0e-.js → WorkbenchLandingPage-Cu9yAWYo.js} +1 -1
  24. package/dist/public/assets/WorkbenchLayout-D6hGXWGE.js +244 -0
  25. package/dist/public/assets/{WorkbenchModal-LNfB69qx.js → WorkbenchModal-Bpb_G1-U.js} +1 -1
  26. package/dist/public/assets/WorkbenchShellRoute-BCjcGWhl.js +1 -0
  27. package/dist/public/assets/{WorkspaceDebugDetailPage-CaXj5zVI.js → WorkspaceDebugDetailPage-CZwT99iQ.js} +1 -1
  28. package/dist/public/assets/{WorkspaceDetailPage-DOexuuaw.js → WorkspaceDetailPage-DCM-olfU.js} +1 -1
  29. package/dist/public/assets/{WorkspaceHomePage-DkCHNjKD.js → WorkspaceHomePage-CsIIqIma.js} +1 -1
  30. package/dist/public/assets/{client-runtime-manager-6OoYHXGd.js → client-runtime-manager-CMK7kLp8.js} +1 -1
  31. package/dist/public/assets/file-tree-icon-Bv-apgA1.js +3 -0
  32. package/dist/public/assets/index-CkkzIvxs.css +1 -0
  33. package/dist/public/assets/index-O3gOb1E0.js +42 -0
  34. package/dist/public/assets/{login-direct-candidate-resolver-CLlYtBRq.js → login-direct-candidate-resolver-Bn4I5JHh.js} +1 -1
  35. package/dist/public/assets/model-switch-api-ZGnyVir7.js +1 -0
  36. package/dist/public/assets/{preferences-service-BCcfYP_d.js → preferences-service-scuqVhuA.js} +1 -1
  37. package/dist/public/assets/realtime-client-TRootbbB.js +1 -0
  38. package/dist/public/assets/{relay-entry-BmLkMKuq.js → relay-entry-eyCjVFMA.js} +1 -1
  39. package/dist/public/assets/styles-DkbkRgWw.css +1 -0
  40. package/dist/public/assets/{terminal-runtime-meta-0h-75uRy.js → terminal-runtime-meta-BGcnzxqn.js} +1 -1
  41. package/dist/public/assets/{useRegisteredDebugTemplates-rBVmAqh3.js → useRegisteredDebugTemplates-BdgPIDVM.js} +1 -1
  42. package/dist/public/index.html +2 -2
  43. package/dist/server/config/env.js +21 -1
  44. package/dist/server/config/env.js.map +1 -1
  45. package/dist/server/config/opencode-base-url-resolver.d.ts +16 -0
  46. package/dist/server/config/opencode-base-url-resolver.js +154 -0
  47. package/dist/server/config/opencode-base-url-resolver.js.map +1 -1
  48. package/dist/server/helpers/wechat-claw-runtime/main.d.ts +1 -0
  49. package/dist/server/helpers/wechat-claw-runtime/main.js +38 -0
  50. package/dist/server/helpers/wechat-claw-runtime/main.js.map +1 -0
  51. package/dist/server/helpers/wechat-claw-runtime/modules/errors.d.ts +5 -0
  52. package/dist/server/helpers/wechat-claw-runtime/modules/errors.js +32 -0
  53. package/dist/server/helpers/wechat-claw-runtime/modules/errors.js.map +1 -0
  54. package/dist/server/helpers/wechat-claw-runtime/modules/login-service.d.ts +16 -0
  55. package/dist/server/helpers/wechat-claw-runtime/modules/login-service.js +209 -0
  56. package/dist/server/helpers/wechat-claw-runtime/modules/login-service.js.map +1 -0
  57. package/dist/server/helpers/wechat-claw-runtime/modules/poll-service.d.ts +18 -0
  58. package/dist/server/helpers/wechat-claw-runtime/modules/poll-service.js +135 -0
  59. package/dist/server/helpers/wechat-claw-runtime/modules/poll-service.js.map +1 -0
  60. package/dist/server/helpers/wechat-claw-runtime/modules/runtime-state-store.d.ts +34 -0
  61. package/dist/server/helpers/wechat-claw-runtime/modules/runtime-state-store.js +394 -0
  62. package/dist/server/helpers/wechat-claw-runtime/modules/runtime-state-store.js.map +1 -0
  63. package/dist/server/helpers/wechat-claw-runtime/modules/send-service.d.ts +9 -0
  64. package/dist/server/helpers/wechat-claw-runtime/modules/send-service.js +64 -0
  65. package/dist/server/helpers/wechat-claw-runtime/modules/send-service.js.map +1 -0
  66. package/dist/server/helpers/wechat-claw-runtime/modules/types.d.ts +167 -0
  67. package/dist/server/helpers/wechat-claw-runtime/modules/types.js +3 -0
  68. package/dist/server/helpers/wechat-claw-runtime/modules/types.js.map +1 -0
  69. package/dist/server/helpers/wechat-claw-runtime/modules/wechat-api-client.d.ts +34 -0
  70. package/dist/server/helpers/wechat-claw-runtime/modules/wechat-api-client.js +160 -0
  71. package/dist/server/helpers/wechat-claw-runtime/modules/wechat-api-client.js.map +1 -0
  72. package/dist/server/helpers/wechat-claw-runtime/routes/accounts.d.ts +9 -0
  73. package/dist/server/helpers/wechat-claw-runtime/routes/accounts.js +24 -0
  74. package/dist/server/helpers/wechat-claw-runtime/routes/accounts.js.map +1 -0
  75. package/dist/server/helpers/wechat-claw-runtime/server.d.ts +5 -0
  76. package/dist/server/helpers/wechat-claw-runtime/server.js +36 -0
  77. package/dist/server/helpers/wechat-claw-runtime/server.js.map +1 -0
  78. package/dist/server/middlewares/auth-guard.js +4 -1
  79. package/dist/server/middlewares/auth-guard.js.map +1 -1
  80. package/dist/server/modules/butler/butler-control-session-service.d.ts +16 -1
  81. package/dist/server/modules/butler/butler-control-session-service.js +106 -75
  82. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  83. package/dist/server/modules/butler/butler-session-service.js +44 -15
  84. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  85. package/dist/server/modules/channels/channel-bridge-service.d.ts +55 -0
  86. package/dist/server/modules/channels/channel-bridge-service.js +340 -0
  87. package/dist/server/modules/channels/channel-bridge-service.js.map +1 -0
  88. package/dist/server/modules/channels/channel-controller.d.ts +52 -0
  89. package/dist/server/modules/channels/channel-controller.js +54 -0
  90. package/dist/server/modules/channels/channel-controller.js.map +1 -0
  91. package/dist/server/modules/channels/channel-delivery-service.d.ts +63 -0
  92. package/dist/server/modules/channels/channel-delivery-service.js +429 -0
  93. package/dist/server/modules/channels/channel-delivery-service.js.map +1 -0
  94. package/dist/server/modules/channels/channel-gateway-controller.d.ts +15 -0
  95. package/dist/server/modules/channels/channel-gateway-controller.js +16 -0
  96. package/dist/server/modules/channels/channel-gateway-controller.js.map +1 -0
  97. package/dist/server/modules/channels/channel-gateway-service.d.ts +24 -0
  98. package/dist/server/modules/channels/channel-gateway-service.js +56 -0
  99. package/dist/server/modules/channels/channel-gateway-service.js.map +1 -0
  100. package/dist/server/modules/channels/channel-platform-adapters.d.ts +46 -0
  101. package/dist/server/modules/channels/channel-platform-adapters.js +315 -0
  102. package/dist/server/modules/channels/channel-platform-adapters.js.map +1 -0
  103. package/dist/server/modules/channels/channel-platform-catalog.d.ts +3 -0
  104. package/dist/server/modules/channels/channel-platform-catalog.js +42 -0
  105. package/dist/server/modules/channels/channel-platform-catalog.js.map +1 -0
  106. package/dist/server/modules/channels/channel-polling-scheduler.d.ts +31 -0
  107. package/dist/server/modules/channels/channel-polling-scheduler.js +93 -0
  108. package/dist/server/modules/channels/channel-polling-scheduler.js.map +1 -0
  109. package/dist/server/modules/channels/channel-polling-service.d.ts +46 -0
  110. package/dist/server/modules/channels/channel-polling-service.js +176 -0
  111. package/dist/server/modules/channels/channel-polling-service.js.map +1 -0
  112. package/dist/server/modules/channels/channel-service.d.ts +108 -0
  113. package/dist/server/modules/channels/channel-service.js +397 -0
  114. package/dist/server/modules/channels/channel-service.js.map +1 -0
  115. package/dist/server/modules/channels/wechat-claw-runtime-boundary.d.ts +4 -0
  116. package/dist/server/modules/channels/wechat-claw-runtime-boundary.js +13 -0
  117. package/dist/server/modules/channels/wechat-claw-runtime-boundary.js.map +1 -0
  118. package/dist/server/modules/channels/wechat-claw-runtime-client.d.ts +14 -0
  119. package/dist/server/modules/channels/wechat-claw-runtime-client.js +95 -0
  120. package/dist/server/modules/channels/wechat-claw-runtime-client.js.map +1 -0
  121. package/dist/server/modules/channels/wechat-claw-runtime-manager.d.ts +16 -0
  122. package/dist/server/modules/channels/wechat-claw-runtime-manager.js +133 -0
  123. package/dist/server/modules/channels/wechat-claw-runtime-manager.js.map +1 -0
  124. package/dist/server/modules/channels/wechat-claw-runtime-types.d.ts +1 -0
  125. package/dist/server/modules/channels/wechat-claw-runtime-types.js +2 -0
  126. package/dist/server/modules/channels/wechat-claw-runtime-types.js.map +1 -0
  127. package/dist/server/modules/git/git-controller.d.ts +3 -1
  128. package/dist/server/modules/git/git-controller.js +9 -2
  129. package/dist/server/modules/git/git-controller.js.map +1 -1
  130. package/dist/server/modules/git/git-read-service.js +2 -1
  131. package/dist/server/modules/git/git-read-service.js.map +1 -1
  132. package/dist/server/modules/git/git-remote-credential-service.d.ts +1 -0
  133. package/dist/server/modules/git/git-remote-credential-service.js +4 -0
  134. package/dist/server/modules/git/git-remote-credential-service.js.map +1 -1
  135. package/dist/server/modules/git/types.d.ts +1 -0
  136. package/dist/server/modules/opencli/opencli-bridge-skill-service.js +2 -1
  137. package/dist/server/modules/opencli/opencli-bridge-skill-service.js.map +1 -1
  138. package/dist/server/modules/provider/codex-model-options.js +14 -15
  139. package/dist/server/modules/provider/codex-model-options.js.map +1 -1
  140. package/dist/server/modules/provider/provider-catalog-service.d.ts +5 -6
  141. package/dist/server/modules/provider/provider-catalog-service.js +12 -57
  142. package/dist/server/modules/provider/provider-catalog-service.js.map +1 -1
  143. package/dist/server/modules/provider/provider-controller.d.ts +1 -0
  144. package/dist/server/modules/provider/provider-controller.js +5 -0
  145. package/dist/server/modules/provider/provider-controller.js.map +1 -1
  146. package/dist/server/modules/provider/provider-discovery-helper-process.js +2 -1
  147. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  148. package/dist/server/modules/provider/provider-runtime-state-service.d.ts +24 -0
  149. package/dist/server/modules/provider/provider-runtime-state-service.js +141 -0
  150. package/dist/server/modules/provider/provider-runtime-state-service.js.map +1 -0
  151. package/dist/server/modules/sessions/session-history-service.d.ts +3 -3
  152. package/dist/server/modules/sessions/session-history-service.js +150 -47
  153. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  154. package/dist/server/modules/sessions/session-live-runtime-service.js +9 -11
  155. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  156. package/dist/server/modules/sessions/session-provider-config-service.d.ts +1 -0
  157. package/dist/server/modules/sessions/session-provider-config-service.js +28 -7
  158. package/dist/server/modules/sessions/session-provider-config-service.js.map +1 -1
  159. package/dist/server/modules/sessions/session-provider-error-mapper.js +7 -0
  160. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  161. package/dist/server/modules/tasks/task-types.d.ts +2 -0
  162. package/dist/server/modules/tasks/task-types.js +2 -0
  163. package/dist/server/modules/tasks/task-types.js.map +1 -1
  164. package/dist/server/routes/channels.d.ts +3 -0
  165. package/dist/server/routes/channels.js +16 -0
  166. package/dist/server/routes/channels.js.map +1 -0
  167. package/dist/server/routes/providers.js +1 -0
  168. package/dist/server/routes/providers.js.map +1 -1
  169. package/dist/server/routes/public.d.ts +2 -1
  170. package/dist/server/routes/public.js +3 -1
  171. package/dist/server/routes/public.js.map +1 -1
  172. package/dist/server/server/create-server.d.ts +22 -0
  173. package/dist/server/server/create-server.js +63 -4
  174. package/dist/server/server/create-server.js.map +1 -1
  175. package/dist/server/shared/http/error-handler.js +59 -3
  176. package/dist/server/shared/http/error-handler.js.map +1 -1
  177. package/dist/server/storage/repositories/channel-account-repository.d.ts +12 -0
  178. package/dist/server/storage/repositories/channel-account-repository.js +153 -0
  179. package/dist/server/storage/repositories/channel-account-repository.js.map +1 -0
  180. package/dist/server/storage/repositories/channel-delivery-repository.d.ts +13 -0
  181. package/dist/server/storage/repositories/channel-delivery-repository.js +156 -0
  182. package/dist/server/storage/repositories/channel-delivery-repository.js.map +1 -0
  183. package/dist/server/storage/repositories/channel-inbound-event-repository.d.ts +12 -0
  184. package/dist/server/storage/repositories/channel-inbound-event-repository.js +144 -0
  185. package/dist/server/storage/repositories/channel-inbound-event-repository.js.map +1 -0
  186. package/dist/server/storage/repositories/channel-thread-repository.d.ts +12 -0
  187. package/dist/server/storage/repositories/channel-thread-repository.js +152 -0
  188. package/dist/server/storage/repositories/channel-thread-repository.js.map +1 -0
  189. package/dist/server/storage/repositories/provider-runtime-state-repository.d.ts +9 -0
  190. package/dist/server/storage/repositories/provider-runtime-state-repository.js +50 -0
  191. package/dist/server/storage/repositories/provider-runtime-state-repository.js.map +1 -0
  192. package/dist/server/storage/sqlite/schema.sql +114 -0
  193. package/dist/server/types/domain.d.ts +82 -0
  194. package/dist/server/ws/workbench-ws-hub.js +8 -2
  195. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  196. package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +6 -0
  197. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +398 -0
  198. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -1
  199. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +75 -15
  200. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  201. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +61 -8
  202. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  203. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +32 -4
  204. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  205. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.d.ts +3 -0
  206. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js +94 -21
  207. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js.map +1 -1
  208. package/package.json +5 -1
  209. package/dist/public/assets/AdaptiveButlerPage-CfsUVZKl.js +0 -3
  210. package/dist/public/assets/ConversationPage-Cj8go7L0.js +0 -4
  211. package/dist/public/assets/GitSidebar-z2SBinQh.js +0 -6
  212. package/dist/public/assets/SessionIndexPage-NbF9gJnp.js +0 -1
  213. package/dist/public/assets/SettingsPage-DGsmQpLv.js +0 -1
  214. package/dist/public/assets/ToolFilesPage-GSqKQsj_.js +0 -1
  215. package/dist/public/assets/ToolGitPage-BVFWMMQp.js +0 -1
  216. package/dist/public/assets/ToolProcessesPage-DZ456fYz.js +0 -1
  217. package/dist/public/assets/WorkbenchLayout-DlbgBT3n.js +0 -4
  218. package/dist/public/assets/WorkbenchShellRoute-BsxumYx5.js +0 -1
  219. package/dist/public/assets/file-tree-icon-9pt1OStn.js +0 -31
  220. package/dist/public/assets/index-BwlbvwaA.css +0 -1
  221. package/dist/public/assets/index-DSw-TkQL.js +0 -42
  222. package/dist/public/assets/model-switch-api-C-l8-E1S.js +0 -1
  223. package/dist/public/assets/session-runtime-machine-DgtvREca.js +0 -21
  224. package/dist/public/assets/styles-CsEMfdaS.css +0 -1
  225. /package/dist/public/assets/{styles-DRVvx_kv.js → styles-JKFlsYFv.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";
@@ -18,6 +17,7 @@ import { OpenCodeModelOptionsService, createFallbackOpenCodeModelOptions, enrich
18
17
  import { getSharedProviderDiscoveryHelperClient } from "../provider/provider-discovery-helper-client.js";
19
18
  import { discoverWorkspaceSessionsInRuntime } from "../provider/provider-discovery-runtime.js";
20
19
  import { applyProviderDisabledState, createProviderCapabilityBlockedError } from "../provider/provider-disabled.js";
20
+ import { ProviderRuntimeStateService } from "../provider/provider-runtime-state-service.js";
21
21
  import { createTaskManager } from "../tasks/task-manager.js";
22
22
  import { HOST_TASK_TYPES } from "../tasks/task-types.js";
23
23
  import { CodexAppServerHelperClient } from "./codex-app-server-helper-client.js";
@@ -72,13 +72,12 @@ export class SessionHistoryService {
72
72
  claudeCodeHomeDir;
73
73
  codexModelOptionsService;
74
74
  openCodeModelOptionsService;
75
- providerCliCommandPaths;
76
- providerCliAvailability;
77
75
  parallelSessionGroupRepository;
78
76
  parallelSessionMemberRepository;
79
77
  sessionIsolatedWorkspaceRepository;
80
78
  providerDiscoveryHelperClient = getSharedProviderDiscoveryHelperClient();
81
79
  providerSessionDiscoveryConfig;
80
+ providerRuntimeStateService;
82
81
  sessionProviderConfigService;
83
82
  providerControlRepository;
84
83
  taskManager;
@@ -90,7 +89,7 @@ export class SessionHistoryService {
90
89
  sessionDeletedObservers = new Set();
91
90
  workspaceSessionRelations = new Map();
92
91
  workspaceStateRefreshTaskSequence = 0;
93
- 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) {
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) {
94
93
  this.db = db;
95
94
  this.workspaceRepository = workspaceRepository;
96
95
  this.sessionBindingRepository = sessionBindingRepository;
@@ -109,6 +108,8 @@ export class SessionHistoryService {
109
108
  this.parallelSessionMemberRepository = parallelSessionMemberRepository;
110
109
  this.sessionIsolatedWorkspaceRepository = sessionIsolatedWorkspaceRepository;
111
110
  this.sessionProviderConfigService = sessionProviderConfigService;
111
+ this.providerRuntimeStateService = providerRuntimeStateService
112
+ ?? new ProviderRuntimeStateService(config);
112
113
  this.providerControlRepository = providerControlRepository ?? {
113
114
  get: (providerId) => ({
114
115
  providerId: providerId.trim(),
@@ -117,15 +118,6 @@ export class SessionHistoryService {
117
118
  })
118
119
  };
119
120
  this.claudeCodeHomeDir = config.claudeCodeHomeDir;
120
- this.providerCliCommandPaths = {
121
- "claude-code": process.platform === "win32" ? "claude.cmd" : "claude",
122
- "legna-code": config.legnaCodeCliPath,
123
- codex: config.codexCliPath,
124
- gemini: config.geminiCliPath,
125
- kimi: config.kimiCliPath
126
- };
127
- // CLI 是否可用只在 Host 启动时探测一次;后续统一读缓存,更新 CLI 后重启 Host 生效。
128
- this.providerCliAvailability = buildProviderCliAvailabilitySnapshot(this.providerCliCommandPaths);
129
121
  this.providerSessionDiscoveryConfig = {
130
122
  claudeCodeHomeDir: config.claudeCodeHomeDir,
131
123
  legnaCodeHomeDir: config.legnaCodeHomeDir,
@@ -575,7 +567,7 @@ export class SessionHistoryService {
575
567
  if (!isProviderCliBacked(capabilities.provider)) {
576
568
  return capabilities;
577
569
  }
578
- if (this.providerCliAvailability[capabilities.provider]) {
570
+ if (this.providerRuntimeStateService.isProviderCliAvailable(capabilities.provider)) {
579
571
  return capabilities;
580
572
  }
581
573
  const limitation = buildProviderCliUnavailableMessage(capabilities.provider);
@@ -1565,12 +1557,15 @@ export class SessionHistoryService {
1565
1557
  annotationSourceText: relation?.annotationSourceText
1566
1558
  ?? persistedSession.existingIndex?.annotationSourceText
1567
1559
  ?? null,
1568
- isSubagent: relation?.isSubagent
1569
- ?? persistedSession.existingIndex?.isSubagent
1570
- ?? false,
1571
- subagentLabel: relation?.subagentLabel
1572
- ?? persistedSession.existingIndex?.subagentLabel
1573
- ?? 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
+ }),
1574
1569
  title: resolvePersistedSessionTitle(persistedSession.session.provider, persistedSession.session.title, persistedSession.existingIndex?.title ?? null, resolvedParentTitle),
1575
1570
  messageCount: persistedSession.session.messageCount,
1576
1571
  isArchived: resolveDiscoveredArchiveState(persistedSession.session.provider, persistedSession.existingIndex?.isArchived ?? false, persistedSession.session.isArchived),
@@ -1863,6 +1858,7 @@ export class SessionHistoryService {
1863
1858
  if (!sessionId) {
1864
1859
  continue;
1865
1860
  }
1861
+ const existingIndex = this.sessionIndexRepository.findIndexRecordBySessionId(sessionId);
1866
1862
  const parentSessionId = session.parentProviderSessionId
1867
1863
  ? discoveredSessionIds.get(buildProviderSessionKey(session.provider, session.parentProviderSessionId)) ??
1868
1864
  this.sessionBindingRepository.findByProviderSession(session.provider, session.parentProviderSessionId)?.sessionId ??
@@ -1870,14 +1866,18 @@ export class SessionHistoryService {
1870
1866
  : this.resolvePersistedParentSessionId(sessionId);
1871
1867
  relationMap.set(sessionId, {
1872
1868
  parentSessionId,
1873
- sessionKind: this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.sessionKind ?? "default",
1874
- annotationSourceMessageId: this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.annotationSourceMessageId ?? null,
1875
- annotationSourceText: this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.annotationSourceText ?? null,
1876
- isSubagent: session.isSubagent === true
1877
- || this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.isSubagent === true,
1878
- subagentLabel: session.subagentLabel?.trim()
1879
- || this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.subagentLabel
1880
- || 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
+ })
1881
1881
  });
1882
1882
  }
1883
1883
  return relationMap;
@@ -2009,8 +2009,13 @@ export class SessionHistoryService {
2009
2009
  .listBySourceWorkspaceId(workspaceId)
2010
2010
  .filter((record) => record.lifecycleStatus === "active"
2011
2011
  || record.lifecycleStatus === "removing")
2012
- .map((record) => this.sessionIndexRepository.findBySessionId(record.ownerSessionId, userId))
2013
- .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
+ })
2014
2019
  .filter((item) => !this.isPendingSessionAlias(item));
2015
2020
  }
2016
2021
  async pullSessionHistory(sessionId, cursor, limit, deliveredMessages, onEnvelope, envelopeType, isClosed = () => false) {
@@ -2701,15 +2706,15 @@ export class SessionHistoryService {
2701
2706
  ?? targetIndex?.annotationSourceText
2702
2707
  ?? sourceIndex?.annotationSourceText
2703
2708
  ?? null,
2704
- isSubagent: Boolean(targetRelation?.isSubagent
2705
- || sourceRelation?.isSubagent
2706
- || targetIndex?.isSubagent
2707
- || sourceIndex?.isSubagent),
2708
- subagentLabel: targetRelation?.subagentLabel
2709
- ?? sourceRelation?.subagentLabel
2710
- ?? targetIndex?.subagentLabel
2711
- ?? sourceIndex?.subagentLabel
2712
- ?? 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
+ })
2713
2718
  });
2714
2719
  for (const relation of relationMap.values()) {
2715
2720
  if (relation.parentSessionId === sourceSessionId) {
@@ -2758,6 +2763,12 @@ export class SessionHistoryService {
2758
2763
  return Number(row?.count ?? 0);
2759
2764
  }
2760
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));
2761
2772
  this.db
2762
2773
  .prepare(`UPDATE session_indices
2763
2774
  SET parent_session_id = NULL
@@ -2768,6 +2779,47 @@ export class SessionHistoryService {
2768
2779
  WHERE parent_session_id = ?
2769
2780
  OR fork_source_session_id = ?`)
2770
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
+ }
2771
2823
  this.db
2772
2824
  .prepare("DELETE FROM butler_control_sessions WHERE session_id = ?")
2773
2825
  .run(sessionId);
@@ -2999,6 +3051,42 @@ export class SessionHistoryService {
2999
3051
  });
3000
3052
  }
3001
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
+ }
3002
3090
  function isProviderCliBacked(provider) {
3003
3091
  return provider === "claude-code"
3004
3092
  || provider === "legna-code"
@@ -3006,12 +3094,6 @@ function isProviderCliBacked(provider) {
3006
3094
  || provider === "gemini"
3007
3095
  || provider === "kimi";
3008
3096
  }
3009
- function buildProviderCliAvailabilitySnapshot(commandPaths) {
3010
- return Object.freeze(Object.fromEntries(Object.entries(commandPaths).map(([provider, commandPath]) => [
3011
- provider,
3012
- isCommandAvailable(commandPath)
3013
- ])));
3014
- }
3015
3097
  function buildProviderCliUnavailableMessage(provider) {
3016
3098
  switch (provider) {
3017
3099
  case "claude-code":
@@ -3253,8 +3335,13 @@ function mergeSessionIndexRecord(input) {
3253
3335
  sessionKind: input.target?.sessionKind ?? input.source?.sessionKind ?? "default",
3254
3336
  annotationSourceMessageId: input.target?.annotationSourceMessageId ?? input.source?.annotationSourceMessageId ?? null,
3255
3337
  annotationSourceText: input.target?.annotationSourceText ?? input.source?.annotationSourceText ?? null,
3256
- isSubagent: Boolean(input.target?.isSubagent || input.source?.isSubagent),
3257
- 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
+ }),
3258
3345
  title: pickPreferredSessionTitle(input.target?.title ?? null, input.source?.title ?? null),
3259
3346
  messageCount: Math.max(input.target?.messageCount ?? 0, input.source?.messageCount ?? 0),
3260
3347
  isArchived: mergePersistedArchiveState(input.provider, input.target?.isArchived, input.source?.isArchived),
@@ -3271,6 +3358,22 @@ function mergePersistedArchiveState(provider, targetArchived, sourceArchived) {
3271
3358
  }
3272
3359
  return targetArchived ?? sourceArchived ?? false;
3273
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
+ }
3274
3377
  function mergeSessionStatusSnapshot(input) {
3275
3378
  if (!input.target && !input.source) {
3276
3379
  return null;