@jingyi0605/codingns 0.3.6 → 0.5.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 (369) hide show
  1. package/README.md +3 -0
  2. package/bin/codingns.mjs +913 -1
  3. package/dist/public/assets/AdaptiveButlerPage-B153lk5H.css +1 -0
  4. package/dist/public/assets/AdaptiveButlerPage-R-XZw7pd.js +3 -0
  5. package/dist/public/assets/App-DUAg5urj.css +1 -0
  6. package/dist/public/assets/App-DkvE5EyM.js +30 -0
  7. package/dist/public/assets/BootstrapPage-Vu5oEJ8z.js +1 -0
  8. package/dist/public/assets/ConversationPage-Cjpg6g0J.js +2 -0
  9. package/dist/public/assets/DesktopDetachPreviewPage-BgeEqbc5.js +1 -0
  10. package/dist/public/assets/DesktopWindowPage-1WelvxdH.js +2 -0
  11. package/dist/public/assets/FileContextPanel-D_ghXJuW.js +1 -0
  12. package/dist/public/assets/GitSidebar-D9f9Jxwr.js +6 -0
  13. package/dist/public/assets/MobileCreateSessionSheet-DLq5qPkx.js +1 -0
  14. package/dist/public/assets/MobileSheet-DLg-gX1t.js +1 -0
  15. package/dist/public/assets/MobileTopHeaderFrame-DArgZI7L.js +1 -0
  16. package/dist/public/assets/MobileWorkspaceSwitcherHeader-0ywJKfBQ.js +1 -0
  17. package/dist/public/assets/ServerSettingsModal-izoYMx9U.js +1 -0
  18. package/dist/public/assets/SessionIndexPage-C5aG8FIv.js +1 -0
  19. package/dist/public/assets/SettingsPage-HJIC-P-4.js +1 -0
  20. package/dist/public/assets/TerminalManagerPanel-DpyUTo9k.js +1 -0
  21. package/dist/public/assets/{TerminalPage-D00S4KM6.js → TerminalPage-CtKXIU0h.js} +19 -19
  22. package/dist/public/assets/TerminalRuntimeFallbackModal-CRhOQOsT.js +1 -0
  23. package/dist/public/assets/ToolFilesPage-DcYPsS-e.js +1 -0
  24. package/dist/public/assets/ToolGitPage-CsPl89ty.js +1 -0
  25. package/dist/public/assets/ToolProcessesPage-D0dvR8xK.js +1 -0
  26. package/dist/public/assets/ToolsHomePage-4fP-KRiv.js +1 -0
  27. package/dist/public/assets/WorkbenchLandingPage-kvlfyxRo.js +1 -0
  28. package/dist/public/assets/WorkbenchLayout-ByFw4eeu.js +3 -0
  29. package/dist/public/assets/WorkbenchModal-Ctob14VR.js +1 -0
  30. package/dist/public/assets/WorkbenchShellRoute-BUITtdAg.css +1 -0
  31. package/dist/public/assets/WorkbenchShellRoute-Kw7JEZI3.js +1 -0
  32. package/dist/public/assets/WorkspaceDebugDetailPage-Com5kEXJ.js +1 -0
  33. package/dist/public/assets/WorkspaceDetailPage-D0Lrx4Uz.js +1 -0
  34. package/dist/public/assets/WorkspaceHomePage-wR8d3aP9.js +1 -0
  35. package/dist/public/assets/butler-records-events-DgWCG364.js +1 -0
  36. package/dist/public/assets/default-session-permission-mode-CcGwR4Kk.js +1 -0
  37. package/dist/public/assets/event-DvH9tcej.js +1 -0
  38. package/dist/public/assets/file-tree-icon-UFVoVzhM.js +31 -0
  39. package/dist/public/assets/index-Byp9hJ0c.js +42 -0
  40. package/dist/public/assets/index-_52jxu4a.css +1 -0
  41. package/dist/public/assets/preferences-service-KIYeE2gk.js +1 -0
  42. package/dist/public/assets/session-runtime-machine-0KNSSPp5.js +17 -0
  43. package/dist/public/assets/styles-BWPBZvze.css +1 -0
  44. package/dist/public/assets/styles-CSUx5LGe.js +1 -0
  45. package/dist/public/assets/terminal-runtime-meta-AWXJpN4r.js +1 -0
  46. package/dist/public/assets/useRegisteredDebugTemplates-DBDRdptr.js +1 -0
  47. package/dist/public/assets/window-BWqRixxq.js +1 -0
  48. package/dist/public/index.html +2 -2
  49. package/dist/server/middlewares/auth-guard.d.ts +4 -0
  50. package/dist/server/middlewares/auth-guard.js +42 -4
  51. package/dist/server/middlewares/auth-guard.js.map +1 -1
  52. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +234 -0
  53. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +365 -0
  54. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  55. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +262 -2
  56. package/dist/server/modules/assistant-capability/assistant-capability-service.js +737 -3
  57. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  58. package/dist/server/modules/auth/auth-controller.d.ts +11 -1
  59. package/dist/server/modules/auth/auth-controller.js +61 -2
  60. package/dist/server/modules/auth/auth-controller.js.map +1 -1
  61. package/dist/server/modules/auth/auth-device-display-name.d.ts +10 -0
  62. package/dist/server/modules/auth/auth-device-display-name.js +190 -0
  63. package/dist/server/modules/auth/auth-device-display-name.js.map +1 -0
  64. package/dist/server/modules/auth/auth-service.d.ts +80 -5
  65. package/dist/server/modules/auth/auth-service.js +333 -23
  66. package/dist/server/modules/auth/auth-service.js.map +1 -1
  67. package/dist/server/modules/butler/assistant-automation-service.d.ts +112 -0
  68. package/dist/server/modules/butler/assistant-automation-service.js +832 -0
  69. package/dist/server/modules/butler/assistant-automation-service.js.map +1 -0
  70. package/dist/server/modules/butler/assistant-automation-trigger.d.ts +94 -0
  71. package/dist/server/modules/butler/assistant-automation-trigger.js +400 -0
  72. package/dist/server/modules/butler/assistant-automation-trigger.js.map +1 -0
  73. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.d.ts +32 -0
  74. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js +93 -0
  75. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js.map +1 -0
  76. package/dist/server/modules/butler/assistant-sandbox-service.d.ts +69 -0
  77. package/dist/server/modules/butler/assistant-sandbox-service.js +399 -0
  78. package/dist/server/modules/butler/assistant-sandbox-service.js.map +1 -0
  79. package/dist/server/modules/butler/butler-action-context-service.d.ts +4 -1
  80. package/dist/server/modules/butler/butler-action-context-service.js +8 -2
  81. package/dist/server/modules/butler/butler-action-context-service.js.map +1 -1
  82. package/dist/server/modules/butler/butler-auth-service.js +7 -2
  83. package/dist/server/modules/butler/butler-auth-service.js.map +1 -1
  84. package/dist/server/modules/butler/butler-control-session-service.d.ts +11 -1
  85. package/dist/server/modules/butler/butler-control-session-service.js +173 -40
  86. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  87. package/dist/server/modules/butler/butler-control-timer-scheduler.d.ts +32 -0
  88. package/dist/server/modules/butler/butler-control-timer-scheduler.js +93 -0
  89. package/dist/server/modules/butler/butler-control-timer-scheduler.js.map +1 -0
  90. package/dist/server/modules/butler/butler-control-timer-service.d.ts +42 -0
  91. package/dist/server/modules/butler/butler-control-timer-service.js +132 -0
  92. package/dist/server/modules/butler/butler-control-timer-service.js.map +1 -0
  93. package/dist/server/modules/butler/butler-controller.d.ts +42 -2
  94. package/dist/server/modules/butler/butler-controller.js +79 -12
  95. package/dist/server/modules/butler/butler-controller.js.map +1 -1
  96. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.d.ts +2 -1
  97. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js +27 -25
  98. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js.map +1 -1
  99. package/dist/server/modules/butler/butler-follow-up-service.d.ts +41 -5
  100. package/dist/server/modules/butler/butler-follow-up-service.js +568 -371
  101. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  102. package/dist/server/modules/butler/butler-inbox-analysis-service.d.ts +4 -1
  103. package/dist/server/modules/butler/butler-inbox-analysis-service.js +18 -4
  104. package/dist/server/modules/butler/butler-inbox-analysis-service.js.map +1 -1
  105. package/dist/server/modules/butler/butler-inbox-service.js +1 -0
  106. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
  107. package/dist/server/modules/butler/butler-profile-service.js +2 -5
  108. package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
  109. package/dist/server/modules/butler/butler-project-service.d.ts +3 -1
  110. package/dist/server/modules/butler/butler-project-service.js +7 -1
  111. package/dist/server/modules/butler/butler-project-service.js.map +1 -1
  112. package/dist/server/modules/butler/butler-session-service.d.ts +5 -1
  113. package/dist/server/modules/butler/butler-session-service.js +26 -1
  114. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  115. package/dist/server/modules/butler/butler-session-summary-service.js +2 -1
  116. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  117. package/dist/server/modules/butler/butler-workspace-context.d.ts +4 -1
  118. package/dist/server/modules/butler/butler-workspace-context.js +204 -58
  119. package/dist/server/modules/butler/butler-workspace-context.js.map +1 -1
  120. package/dist/server/modules/butler/patrol-execution-service.js +2 -1
  121. package/dist/server/modules/butler/patrol-execution-service.js.map +1 -1
  122. package/dist/server/modules/butler/provider-adapter-registry.d.ts +3 -0
  123. package/dist/server/modules/butler/provider-adapter-registry.js +18 -1
  124. package/dist/server/modules/butler/provider-adapter-registry.js.map +1 -1
  125. package/dist/server/modules/butler/verification-run-service.d.ts +9 -2
  126. package/dist/server/modules/butler/verification-run-service.js +188 -34
  127. package/dist/server/modules/butler/verification-run-service.js.map +1 -1
  128. package/dist/server/modules/debug-target/debug-target-controller.js +1 -1
  129. package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -1
  130. package/dist/server/modules/debug-target/debug-target-service.d.ts +7 -2
  131. package/dist/server/modules/debug-target/debug-target-service.js +563 -100
  132. package/dist/server/modules/debug-target/debug-target-service.js.map +1 -1
  133. package/dist/server/modules/git/git-command-helper-client.d.ts +1 -0
  134. package/dist/server/modules/git/git-command-helper-client.js +19 -26
  135. package/dist/server/modules/git/git-command-helper-client.js.map +1 -1
  136. package/dist/server/modules/git/git-command-runner.js +19 -1
  137. package/dist/server/modules/git/git-command-runner.js.map +1 -1
  138. package/dist/server/modules/preferences/profile-service.d.ts +3 -1
  139. package/dist/server/modules/preferences/profile-service.js +74 -3
  140. package/dist/server/modules/preferences/profile-service.js.map +1 -1
  141. package/dist/server/modules/provider/provider-controller.d.ts +1 -1
  142. package/dist/server/modules/provider/provider-controller.js.map +1 -1
  143. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +5 -3
  144. package/dist/server/modules/provider/provider-discovery-helper-client.js +129 -43
  145. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  146. package/dist/server/modules/provider/provider-discovery-helper-process.js +44 -0
  147. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  148. package/dist/server/modules/provider/provider-discovery-runtime.js +83 -3
  149. package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -1
  150. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.d.ts +10 -0
  151. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.js +48 -0
  152. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.js.map +1 -0
  153. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.d.ts +48 -0
  154. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.js +11 -0
  155. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.js.map +1 -0
  156. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.d.ts +74 -0
  157. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.js +302 -0
  158. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.js.map +1 -0
  159. package/dist/server/modules/relay-tunnel/relay-tunnel-controller.d.ts +33 -0
  160. package/dist/server/modules/relay-tunnel/relay-tunnel-controller.js +57 -0
  161. package/dist/server/modules/relay-tunnel/relay-tunnel-controller.js.map +1 -0
  162. package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.d.ts +9 -0
  163. package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.js +25 -0
  164. package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.js.map +1 -0
  165. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.d.ts +18 -0
  166. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.js +230 -0
  167. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.js.map +1 -0
  168. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.d.ts +41 -0
  169. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.js +443 -0
  170. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.js.map +1 -0
  171. package/dist/server/modules/relay-tunnel/relay-tunnel-service.d.ts +111 -0
  172. package/dist/server/modules/relay-tunnel/relay-tunnel-service.js +771 -0
  173. package/dist/server/modules/relay-tunnel/relay-tunnel-service.js.map +1 -0
  174. package/dist/server/modules/sessions/claude-runtime-helper-client.js +23 -1
  175. package/dist/server/modules/sessions/claude-runtime-helper-client.js.map +1 -1
  176. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +2 -1
  177. package/dist/server/modules/sessions/codex-app-server-helper-client.js +78 -0
  178. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  179. package/dist/server/modules/sessions/codex-app-server-helper-process.js +84 -2
  180. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  181. package/dist/server/modules/sessions/provider-session-delete-cli.d.ts +15 -0
  182. package/dist/server/modules/sessions/provider-session-delete-cli.js +148 -0
  183. package/dist/server/modules/sessions/provider-session-delete-cli.js.map +1 -0
  184. package/dist/server/modules/sessions/session-controller.d.ts +4 -1
  185. package/dist/server/modules/sessions/session-controller.js +4 -0
  186. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  187. package/dist/server/modules/sessions/session-history-service.d.ts +24 -1
  188. package/dist/server/modules/sessions/session-history-service.js +401 -42
  189. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  190. package/dist/server/modules/sessions/session-live-runtime-router-service.d.ts +25 -0
  191. package/dist/server/modules/sessions/session-live-runtime-router-service.js +42 -0
  192. package/dist/server/modules/sessions/session-live-runtime-router-service.js.map +1 -0
  193. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +6 -0
  194. package/dist/server/modules/sessions/session-live-runtime-service.js +130 -28
  195. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  196. package/dist/server/modules/sessions/session-message-attachment-service.d.ts +1 -0
  197. package/dist/server/modules/sessions/session-message-attachment-service.js +22 -0
  198. package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -1
  199. package/dist/server/modules/sessions/session-message-origin-utils.d.ts +12 -0
  200. package/dist/server/modules/sessions/session-message-origin-utils.js +45 -0
  201. package/dist/server/modules/sessions/session-message-origin-utils.js.map +1 -0
  202. package/dist/server/modules/sessions/session-permission-request-service.d.ts +1 -0
  203. package/dist/server/modules/sessions/session-permission-request-service.js +367 -5
  204. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  205. package/dist/server/modules/sessions/session-provider-error-mapper.js +32 -0
  206. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  207. package/dist/server/modules/sessions/session-provider-usage-guard-service.d.ts +37 -0
  208. package/dist/server/modules/sessions/session-provider-usage-guard-service.js +179 -0
  209. package/dist/server/modules/sessions/session-provider-usage-guard-service.js.map +1 -0
  210. package/dist/server/modules/sessions/session-provider-usage-limit.d.ts +17 -0
  211. package/dist/server/modules/sessions/session-provider-usage-limit.js +465 -0
  212. package/dist/server/modules/sessions/session-provider-usage-limit.js.map +1 -0
  213. package/dist/server/modules/skills/assistant-runtime-skill-catalog.d.ts +8 -0
  214. package/dist/server/modules/skills/assistant-runtime-skill-catalog.js +26 -0
  215. package/dist/server/modules/skills/assistant-runtime-skill-catalog.js.map +1 -0
  216. package/dist/server/modules/skills/assistant-runtime-skill-cleanup.d.ts +9 -0
  217. package/dist/server/modules/skills/assistant-runtime-skill-cleanup.js +55 -0
  218. package/dist/server/modules/skills/assistant-runtime-skill-cleanup.js.map +1 -0
  219. package/dist/server/modules/skills/builtin-skill-service.js +1 -6
  220. package/dist/server/modules/skills/builtin-skill-service.js.map +1 -1
  221. package/dist/server/modules/skills/builtin-skills/codingns-assistant/SKILL.md +19 -12
  222. package/dist/server/modules/skills/builtin-skills/codingns-assistant/references/cli-workflow.md +9 -3
  223. package/dist/server/modules/skills/skill-controller.d.ts +2 -2
  224. package/dist/server/modules/skills/skill-controller.js +9 -1
  225. package/dist/server/modules/skills/skill-controller.js.map +1 -1
  226. package/dist/server/modules/skills/skill-manager-service.d.ts +26 -1
  227. package/dist/server/modules/skills/skill-manager-service.js +346 -90
  228. package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
  229. package/dist/server/modules/skills/skill-name-policy.d.ts +2 -0
  230. package/dist/server/modules/skills/skill-name-policy.js +10 -0
  231. package/dist/server/modules/skills/skill-name-policy.js.map +1 -0
  232. package/dist/server/modules/tailscale/tailscale-service.d.ts +2 -0
  233. package/dist/server/modules/tailscale/tailscale-service.js +21 -8
  234. package/dist/server/modules/tailscale/tailscale-service.js.map +1 -1
  235. package/dist/server/modules/tasks/task-helper-client.d.ts +5 -2
  236. package/dist/server/modules/tasks/task-helper-client.js +118 -38
  237. package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
  238. package/dist/server/modules/tasks/task-helper-process.js +94 -3
  239. package/dist/server/modules/tasks/task-helper-process.js.map +1 -1
  240. package/dist/server/modules/tasks/task-types.d.ts +6 -0
  241. package/dist/server/modules/tasks/task-types.js +7 -1
  242. package/dist/server/modules/tasks/task-types.js.map +1 -1
  243. package/dist/server/modules/terminal/command-template-service.d.ts +9 -0
  244. package/dist/server/modules/terminal/command-template-service.js +87 -5
  245. package/dist/server/modules/terminal/command-template-service.js.map +1 -1
  246. package/dist/server/modules/terminal/template-reverse-proxy-service.js +71 -3
  247. package/dist/server/modules/terminal/template-reverse-proxy-service.js.map +1 -1
  248. package/dist/server/modules/terminal/terminal-controller.d.ts +3 -0
  249. package/dist/server/modules/terminal/terminal-controller.js +41 -0
  250. package/dist/server/modules/terminal/terminal-controller.js.map +1 -1
  251. package/dist/server/modules/workbench/workbench-service.d.ts +3 -0
  252. package/dist/server/modules/workbench/workbench-service.js +4 -3
  253. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  254. package/dist/server/modules/workbench/workspace-file-watcher.d.ts +14 -6
  255. package/dist/server/modules/workbench/workspace-file-watcher.js +267 -57
  256. package/dist/server/modules/workbench/workspace-file-watcher.js.map +1 -1
  257. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +2 -0
  258. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +32 -3
  259. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  260. package/dist/server/modules/worktree/worktree-manager.d.ts +9 -1
  261. package/dist/server/modules/worktree/worktree-manager.js +9 -1
  262. package/dist/server/modules/worktree/worktree-manager.js.map +1 -1
  263. package/dist/server/routes/assistant.js +49 -0
  264. package/dist/server/routes/assistant.js.map +1 -1
  265. package/dist/server/routes/auth.js +4 -0
  266. package/dist/server/routes/auth.js.map +1 -1
  267. package/dist/server/routes/butler.js +5 -0
  268. package/dist/server/routes/butler.js.map +1 -1
  269. package/dist/server/routes/sessions.js +1 -0
  270. package/dist/server/routes/sessions.js.map +1 -1
  271. package/dist/server/routes/system.d.ts +2 -1
  272. package/dist/server/routes/system.js +13 -1
  273. package/dist/server/routes/system.js.map +1 -1
  274. package/dist/server/server/create-server.d.ts +18 -0
  275. package/dist/server/server/create-server.js +113 -20
  276. package/dist/server/server/create-server.js.map +1 -1
  277. package/dist/server/shared/utils/tokens.d.ts +3 -1
  278. package/dist/server/shared/utils/tokens.js +9 -2
  279. package/dist/server/shared/utils/tokens.js.map +1 -1
  280. package/dist/server/storage/repositories/assistant-automation-run-repository.d.ts +12 -0
  281. package/dist/server/storage/repositories/assistant-automation-run-repository.js +139 -0
  282. package/dist/server/storage/repositories/assistant-automation-run-repository.js.map +1 -0
  283. package/dist/server/storage/repositories/assistant-automation-task-repository.d.ts +17 -0
  284. package/dist/server/storage/repositories/assistant-automation-task-repository.js +179 -0
  285. package/dist/server/storage/repositories/assistant-automation-task-repository.js.map +1 -0
  286. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.d.ts +18 -0
  287. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js +191 -0
  288. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js.map +1 -0
  289. package/dist/server/storage/repositories/auth-device-repository.d.ts +22 -0
  290. package/dist/server/storage/repositories/auth-device-repository.js +97 -0
  291. package/dist/server/storage/repositories/auth-device-repository.js.map +1 -0
  292. package/dist/server/storage/repositories/auth-device-session-repository.d.ts +17 -0
  293. package/dist/server/storage/repositories/auth-device-session-repository.js +82 -0
  294. package/dist/server/storage/repositories/auth-device-session-repository.js.map +1 -0
  295. package/dist/server/storage/repositories/auth-login-event-repository.d.ts +9 -0
  296. package/dist/server/storage/repositories/auth-login-event-repository.js +53 -0
  297. package/dist/server/storage/repositories/auth-login-event-repository.js.map +1 -0
  298. package/dist/server/storage/repositories/auth-token-repository.d.ts +4 -0
  299. package/dist/server/storage/repositories/auth-token-repository.js +58 -5
  300. package/dist/server/storage/repositories/auth-token-repository.js.map +1 -1
  301. package/dist/server/storage/repositories/butler-control-session-repository.js +27 -3
  302. package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
  303. package/dist/server/storage/repositories/butler-control-timer-repository.d.ts +15 -0
  304. package/dist/server/storage/repositories/butler-control-timer-repository.js +157 -0
  305. package/dist/server/storage/repositories/butler-control-timer-repository.js.map +1 -0
  306. package/dist/server/storage/repositories/butler-follow-up-task-repository.js +21 -3
  307. package/dist/server/storage/repositories/butler-follow-up-task-repository.js.map +1 -1
  308. package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.d.ts +8 -0
  309. package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.js +52 -0
  310. package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.js.map +1 -0
  311. package/dist/server/storage/repositories/instance-relay-tunnel-repository.d.ts +10 -0
  312. package/dist/server/storage/repositories/instance-relay-tunnel-repository.js +153 -0
  313. package/dist/server/storage/repositories/instance-relay-tunnel-repository.js.map +1 -0
  314. package/dist/server/storage/repositories/instance-tailscale-repository.js +6 -3
  315. package/dist/server/storage/repositories/instance-tailscale-repository.js.map +1 -1
  316. package/dist/server/storage/repositories/managed-skill-repository.d.ts +2 -1
  317. package/dist/server/storage/repositories/managed-skill-repository.js +14 -4
  318. package/dist/server/storage/repositories/managed-skill-repository.js.map +1 -1
  319. package/dist/server/storage/repositories/session-message-attachment-repository.d.ts +2 -0
  320. package/dist/server/storage/repositories/session-message-attachment-repository.js +24 -0
  321. package/dist/server/storage/repositories/session-message-attachment-repository.js.map +1 -1
  322. package/dist/server/storage/repositories/user-preference-profile-repository.js +6 -3
  323. package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -1
  324. package/dist/server/storage/sqlite/client.js +534 -2
  325. package/dist/server/storage/sqlite/client.js.map +1 -1
  326. package/dist/server/storage/sqlite/schema.sql +228 -4
  327. package/dist/server/types/domain.d.ts +170 -2
  328. package/dist/server/ws/workbench-ws-hub.d.ts +14 -8
  329. package/dist/server/ws/workbench-ws-hub.js +369 -209
  330. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  331. package/dist/server/ws/ws-auth-guard.js +1 -4
  332. package/dist/server/ws/ws-auth-guard.js.map +1 -1
  333. package/dist/server/ws/ws-server.d.ts +1 -1
  334. package/dist/server/ws/ws-server.js.map +1 -1
  335. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.d.ts +1 -0
  336. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js +80 -0
  337. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js.map +1 -0
  338. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +5 -1
  339. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +122 -4
  340. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  341. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +17 -1
  342. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +437 -51
  343. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  344. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.d.ts +7 -1
  345. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +240 -27
  346. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -1
  347. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.d.ts +5 -1
  348. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js +108 -2
  349. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js.map +1 -1
  350. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +3 -0
  351. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +101 -8
  352. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  353. package/node_modules/@codingns/session-sync-core/dist/providers/utils.d.ts +1 -0
  354. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +4 -1
  355. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -1
  356. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +44 -0
  357. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
  358. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +5 -1
  359. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +153 -60
  360. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  361. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +1 -0
  362. package/node_modules/@codingns/session-sync-core/dist/services.d.ts +1 -0
  363. package/node_modules/@codingns/session-sync-core/dist/services.js +24 -8
  364. package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
  365. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +6 -0
  366. package/package.json +1 -1
  367. package/scripts/postinstall.mjs +0 -33
  368. package/dist/public/assets/index-BlOinYqR.js +0 -122
  369. package/dist/public/assets/index-Dg_7g6lA.css +0 -1
@@ -0,0 +1,25 @@
1
+ import type { ProviderSubscription } from "@codingns/session-sync-core";
2
+ import type { SessionHistoryEnvelope } from "./session-history-service.js";
3
+ import type { SessionLiveRuntimeService, SessionRuntimeEnvelope } from "./session-live-runtime-service.js";
4
+ export type SessionRuntimeRouterServiceContract = Pick<SessionLiveRuntimeService, "startLiveSession" | "sendLiveMessage" | "enqueueLiveMessage" | "getSessionRuntime" | "interruptSession" | "subscribeRuntime" | "listPermissionRequests" | "replyPermissionRequest" | "listQueuedMessages" | "deleteQueuedMessage" | "steerQueuedMessage" | "getClaudeHookBridgeConfig" | "ingestClaudeHookEvent" | "resolveLiveActivityObservation">;
5
+ export declare class SessionLiveRuntimeRouterService implements SessionRuntimeRouterServiceContract {
6
+ private readonly primaryService;
7
+ private readonly services;
8
+ constructor(primaryService: SessionRuntimeRouterServiceContract, delegatedServices: readonly SessionRuntimeRouterServiceContract[]);
9
+ readonly startLiveSession: SessionLiveRuntimeService["startLiveSession"];
10
+ readonly sendLiveMessage: SessionLiveRuntimeService["sendLiveMessage"];
11
+ readonly enqueueLiveMessage: SessionLiveRuntimeService["enqueueLiveMessage"];
12
+ readonly getSessionRuntime: SessionLiveRuntimeService["getSessionRuntime"];
13
+ readonly interruptSession: SessionLiveRuntimeService["interruptSession"];
14
+ readonly subscribeRuntime: (sessionId: string, onEnvelope: (envelope: SessionRuntimeEnvelope | SessionHistoryEnvelope) => Promise<void> | void) => ProviderSubscription;
15
+ readonly listPermissionRequests: SessionLiveRuntimeService["listPermissionRequests"];
16
+ readonly replyPermissionRequest: SessionLiveRuntimeService["replyPermissionRequest"];
17
+ readonly listQueuedMessages: SessionLiveRuntimeService["listQueuedMessages"];
18
+ readonly deleteQueuedMessage: SessionLiveRuntimeService["deleteQueuedMessage"];
19
+ readonly steerQueuedMessage: SessionLiveRuntimeService["steerQueuedMessage"];
20
+ readonly getClaudeHookBridgeConfig: SessionLiveRuntimeService["getClaudeHookBridgeConfig"];
21
+ readonly ingestClaudeHookEvent: SessionLiveRuntimeService["ingestClaudeHookEvent"];
22
+ readonly resolveLiveActivityObservation: SessionLiveRuntimeService["resolveLiveActivityObservation"];
23
+ private resolveServiceForSession;
24
+ private findOwningService;
25
+ }
@@ -0,0 +1,42 @@
1
+ export class SessionLiveRuntimeRouterService {
2
+ primaryService;
3
+ services;
4
+ constructor(primaryService, delegatedServices) {
5
+ this.primaryService = primaryService;
6
+ this.services = [primaryService, ...delegatedServices];
7
+ }
8
+ startLiveSession = async (input) => this.primaryService.startLiveSession(input);
9
+ sendLiveMessage = async (input) => this.resolveServiceForSession(input.sessionId).sendLiveMessage(input);
10
+ enqueueLiveMessage = async (input) => this.resolveServiceForSession(input.sessionId).enqueueLiveMessage(input);
11
+ getSessionRuntime = async (sessionId, userId) => this.resolveServiceForSession(sessionId).getSessionRuntime(sessionId, userId);
12
+ interruptSession = async (sessionId, userId) => this.resolveServiceForSession(sessionId).interruptSession(sessionId, userId);
13
+ subscribeRuntime = (sessionId, onEnvelope) => this.resolveServiceForSession(sessionId).subscribeRuntime(sessionId, onEnvelope);
14
+ listPermissionRequests = async (sessionId, userId) => this.resolveServiceForSession(sessionId).listPermissionRequests(sessionId, userId);
15
+ replyPermissionRequest = async (sessionId, userId, requestId, input) => this.resolveServiceForSession(sessionId).replyPermissionRequest(sessionId, userId, requestId, input);
16
+ listQueuedMessages = async (sessionId, userId) => this.resolveServiceForSession(sessionId).listQueuedMessages(sessionId, userId);
17
+ deleteQueuedMessage = async (sessionId, userId, queueItemId) => this.resolveServiceForSession(sessionId).deleteQueuedMessage(sessionId, userId, queueItemId);
18
+ steerQueuedMessage = async (sessionId, userId, queueItemId) => this.resolveServiceForSession(sessionId).steerQueuedMessage(sessionId, userId, queueItemId);
19
+ getClaudeHookBridgeConfig = () => this.primaryService.getClaudeHookBridgeConfig();
20
+ ingestClaudeHookEvent = async (payload) => {
21
+ for (const service of this.services) {
22
+ const result = await service.ingestClaudeHookEvent(payload);
23
+ if (!result.ignored || result.sessionId) {
24
+ return result;
25
+ }
26
+ }
27
+ return this.primaryService.ingestClaudeHookEvent(payload);
28
+ };
29
+ resolveLiveActivityObservation = (sessionId) => this.findOwningService(sessionId)?.resolveLiveActivityObservation(sessionId) ?? null;
30
+ resolveServiceForSession(sessionId) {
31
+ return this.findOwningService(sessionId) ?? this.primaryService;
32
+ }
33
+ findOwningService(sessionId) {
34
+ for (const service of this.services) {
35
+ if (service.resolveLiveActivityObservation(sessionId)) {
36
+ return service;
37
+ }
38
+ }
39
+ return null;
40
+ }
41
+ }
42
+ //# sourceMappingURL=session-live-runtime-router-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-live-runtime-router-service.js","sourceRoot":"","sources":["../../../../src/modules/sessions/session-live-runtime-router-service.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ interface RuntimeSendOptions {
18
18
  model?: string | null;
19
19
  reasoningLevel?: string | null;
20
20
  permissionMode?: string | null;
21
+ providerInstructionFilePath?: string | null;
21
22
  attachments?: SessionAttachmentInput[];
22
23
  }
23
24
  interface StartLiveSessionInput {
@@ -188,6 +189,7 @@ export declare class SessionLiveRuntimeService {
188
189
  private readonly externalRuntimeSnapshots;
189
190
  private readonly runtimeListeners;
190
191
  private readonly terminalStateListeners;
192
+ private readonly deadRuntimeReconciliationSessions;
191
193
  private readonly runtimeMessageSeenSessions;
192
194
  private readonly runtimeHistoryFallbackSentSessions;
193
195
  private readonly queueDispatchSessions;
@@ -217,6 +219,10 @@ export declare class SessionLiveRuntimeService {
217
219
  dispose(): Promise<void>;
218
220
  private subscribeExternalRuntime;
219
221
  private emitExternalRuntimeEnvelope;
222
+ private getLiveRuntimeSnapshot;
223
+ private demoteDeadRuntimeSnapshot;
224
+ private scheduleDeadRuntimeReconciliation;
225
+ private reconcileDeadRuntimeSession;
220
226
  private buildSessionActivityEnvelope;
221
227
  private resolveRuntimeSessionId;
222
228
  private isLinkedGeminiRuntimeSession;
@@ -33,6 +33,7 @@ export class SessionLiveRuntimeService {
33
33
  externalRuntimeSnapshots = new Map();
34
34
  runtimeListeners = new Map();
35
35
  terminalStateListeners = new Set();
36
+ deadRuntimeReconciliationSessions = new Set();
36
37
  runtimeMessageSeenSessions = new Set();
37
38
  runtimeHistoryFallbackSentSessions = new Set();
38
39
  queueDispatchSessions = new Set();
@@ -78,6 +79,7 @@ export class SessionLiveRuntimeService {
78
79
  this.ensurePendingSessionBinding(sessionId, workspace.id, input.provider);
79
80
  const persistedAttachments = this.persistMessageAttachments(sessionId, input.clientRequestId, input.runtimeOptions?.attachments ?? []);
80
81
  const providerPrompt = this.sessionMessageAttachmentService.buildProviderPrompt(input.provider, input.content, persistedAttachments.runtimeAttachments);
82
+ const providerInstructionFilePath = resolveRuntimeInstructionFilePath(input.provider, workspace.path, input.runtimeOptions?.providerInstructionFilePath ?? null);
81
83
  this.ensureCapability(capabilities.canStartSession, "provider", "provider 不支持 start-live");
82
84
  this.ensureCapability(capabilities.canSendMessage, "provider", "provider 不支持实时对话");
83
85
  const launchRuntimeStartedAtMs = performance.now();
@@ -96,6 +98,7 @@ export class SessionLiveRuntimeService {
96
98
  reasoningLevel: input.runtimeOptions?.reasoningLevel ?? null,
97
99
  permissionMode: input.runtimeOptions?.permissionMode ?? null,
98
100
  providerPrompt,
101
+ providerInstructionFilePath,
99
102
  attachments: persistedAttachments.runtimeAttachments
100
103
  }
101
104
  }, "start");
@@ -238,16 +241,6 @@ export class SessionLiveRuntimeService {
238
241
  field: "queueItemId"
239
242
  });
240
243
  }
241
- const runtimeSessionId = this.resolveRuntimeSessionId(sessionId);
242
- const runtimeSnapshot = this.providerRuntimeService.getSnapshot(runtimeSessionId);
243
- if (!runtimeSnapshot || !isActiveRuntimeState(runtimeSnapshot.runningState)) {
244
- throw new AppError({
245
- statusCode: 409,
246
- errorCode: "SESSION_NOT_RUNNING",
247
- detail: "当前会话不在运行中,无法立刻引导这条消息",
248
- field: "queueItemId"
249
- });
250
- }
251
244
  const capabilities = await this.sessionHistoryService.getSessionCapabilities(sessionId);
252
245
  if (capabilities.inRunInputMode === "none") {
253
246
  throw new AppError({
@@ -275,6 +268,8 @@ export class SessionLiveRuntimeService {
275
268
  runtimeAttachments: restoredAttachments
276
269
  };
277
270
  try {
271
+ // 队列里的“引导”语义是立刻发这条,而不是死盯着“必须命中当前 run”。
272
+ // 有 active run 时走原生 steer;空闲时就直接起新一轮,把指定队列项先发出去。
278
273
  const result = await this.sendLiveMessageDirect({
279
274
  sessionId,
280
275
  userId,
@@ -439,7 +434,7 @@ export class SessionLiveRuntimeService {
439
434
  }
440
435
  async getSessionRuntime(sessionId, userId) {
441
436
  const runtimeSessionId = this.resolveRuntimeSessionId(sessionId);
442
- const runtimeSnapshot = this.providerRuntimeService.getSnapshot(runtimeSessionId);
437
+ const runtimeSnapshot = this.getLiveRuntimeSnapshot(runtimeSessionId);
443
438
  const externalRuntimeSnapshot = this.externalRuntimeSnapshots.get(runtimeSessionId) ?? null;
444
439
  const runtimeHasActiveRun = runtimeSnapshot ? isActiveRuntimeState(runtimeSnapshot.runningState) : false;
445
440
  const externalHasActiveRun = externalRuntimeSnapshot
@@ -529,7 +524,7 @@ export class SessionLiveRuntimeService {
529
524
  }
530
525
  resolveLiveActivityObservation(sessionId) {
531
526
  const runtimeSessionId = this.resolveRuntimeSessionId(sessionId);
532
- const runtimeSnapshot = this.providerRuntimeService.getSnapshot(runtimeSessionId);
527
+ const runtimeSnapshot = this.getLiveRuntimeSnapshot(runtimeSessionId);
533
528
  if (runtimeSnapshot) {
534
529
  return createRuntimeActivityObservation(runtimeSessionId, runtimeSnapshot);
535
530
  }
@@ -542,8 +537,17 @@ export class SessionLiveRuntimeService {
542
537
  async interruptSession(sessionId, userId) {
543
538
  this.sessionHistoryService.getSession(sessionId, userId);
544
539
  const runtimeSessionId = this.resolveRuntimeSessionId(sessionId);
545
- const runtime = this.providerRuntimeService.getSnapshot(runtimeSessionId);
540
+ const runtime = this.getLiveRuntimeSnapshot(runtimeSessionId);
541
+ const externalRuntimeSnapshot = this.externalRuntimeSnapshots.get(runtimeSessionId) ?? null;
546
542
  if (!runtime || (runtime.runningState !== "running" && runtime.runningState !== "starting")) {
543
+ if (externalRuntimeSnapshot && isActiveRuntimeState(externalRuntimeSnapshot.runningState)) {
544
+ throw new AppError({
545
+ statusCode: 409,
546
+ errorCode: "CAPABILITY_NOT_SUPPORTED",
547
+ detail: "当前 Claude 外部运行仍在进行,但现有链路不支持中断",
548
+ field: "sessionId"
549
+ });
550
+ }
547
551
  throw new AppError({
548
552
  statusCode: 409,
549
553
  errorCode: "SESSION_NOT_RUNNING",
@@ -584,7 +588,7 @@ export class SessionLiveRuntimeService {
584
588
  }
585
589
  subscribeRuntime(sessionId, onEnvelope) {
586
590
  const runtimeSessionId = this.resolveRuntimeSessionId(sessionId);
587
- const runtimeSnapshot = this.providerRuntimeService.getSnapshot(runtimeSessionId);
591
+ const runtimeSnapshot = this.getLiveRuntimeSnapshot(runtimeSessionId);
588
592
  const externalRuntimeSnapshot = this.externalRuntimeSnapshots.get(runtimeSessionId) ?? null;
589
593
  const initialActivityEnvelope = this.buildSessionActivityEnvelope(sessionId, runtimeSessionId);
590
594
  if (runtimeSnapshot) {
@@ -685,8 +689,74 @@ export class SessionLiveRuntimeService {
685
689
  await listener(envelope);
686
690
  }));
687
691
  }
692
+ getLiveRuntimeSnapshot(sessionId) {
693
+ const snapshot = this.providerRuntimeService.getSnapshot(sessionId);
694
+ if (!snapshot) {
695
+ return null;
696
+ }
697
+ if (!isActiveRuntimeState(snapshot.runningState)) {
698
+ return snapshot;
699
+ }
700
+ if (this.providerRuntimeService.isRunHealthy(sessionId) === false) {
701
+ this.demoteDeadRuntimeSnapshot(snapshot);
702
+ this.scheduleDeadRuntimeReconciliation(snapshot);
703
+ return null;
704
+ }
705
+ return snapshot;
706
+ }
707
+ demoteDeadRuntimeSnapshot(snapshot) {
708
+ const updatedAt = nowIso();
709
+ for (const userId of this.authUserRepository.listIds()) {
710
+ const current = this.sessionStateRepository.findBySessionAndUser(snapshot.sessionId, userId);
711
+ if (!current || !isPendingSessionRunningState(current.runningState) || current.activitySource !== "runtime") {
712
+ continue;
713
+ }
714
+ this.sessionStateRepository.upsert({
715
+ ...current,
716
+ runningState: "interrupted",
717
+ activitySource: "runtime",
718
+ completedAt: updatedAt,
719
+ updatedAt
720
+ });
721
+ }
722
+ this.sessionActivityAuthorityService.observe({
723
+ sessionId: snapshot.sessionId,
724
+ runId: buildRuntimeRunId(snapshot.sessionId, snapshot.startedAt),
725
+ runningState: "interrupted",
726
+ source: "authoritative_runtime",
727
+ confidence: "strong",
728
+ detail: "Host 检测到这轮运行已经异常结束,已自动回收残留运行态",
729
+ interruptSource: "runtime",
730
+ errorCode: null,
731
+ observedAt: updatedAt
732
+ });
733
+ }
734
+ scheduleDeadRuntimeReconciliation(snapshot) {
735
+ if (this.deadRuntimeReconciliationSessions.has(snapshot.sessionId)) {
736
+ return;
737
+ }
738
+ this.deadRuntimeReconciliationSessions.add(snapshot.sessionId);
739
+ void this.reconcileDeadRuntimeSession(snapshot).finally(() => {
740
+ this.deadRuntimeReconciliationSessions.delete(snapshot.sessionId);
741
+ });
742
+ }
743
+ async reconcileDeadRuntimeSession(snapshot) {
744
+ await this.providerRuntimeService.abandonRun(snapshot.sessionId).catch(() => {
745
+ return;
746
+ });
747
+ for (const userId of this.authUserRepository.listIds()) {
748
+ await this.sessionHistoryService.refreshRuntimeFallbackSession(snapshot.sessionId, userId).catch(() => {
749
+ return;
750
+ });
751
+ }
752
+ const envelope = this.buildSessionActivityEnvelope(snapshot.sessionId, snapshot.sessionId);
753
+ if (envelope) {
754
+ await this.emitExternalRuntimeEnvelope(envelope);
755
+ }
756
+ void this.dispatchNextQueuedMessage(snapshot.sessionId);
757
+ }
688
758
  buildSessionActivityEnvelope(sessionId, runtimeSessionId = sessionId) {
689
- const runtimeSnapshot = this.providerRuntimeService.getSnapshot(runtimeSessionId);
759
+ const runtimeSnapshot = this.getLiveRuntimeSnapshot(runtimeSessionId);
690
760
  if (runtimeSnapshot) {
691
761
  const resolution = this.sessionActivityAuthorityService.observe(createRuntimeActivityObservation(runtimeSessionId, runtimeSnapshot));
692
762
  return {
@@ -968,6 +1038,7 @@ export class SessionLiveRuntimeService {
968
1038
  const resolvedAttachments = persistedAttachments
969
1039
  ?? this.persistMessageAttachments(input.sessionId, input.clientRequestId, input.runtimeOptions?.attachments ?? []);
970
1040
  const providerPrompt = this.sessionMessageAttachmentService.buildProviderPrompt(session.provider, input.content, resolvedAttachments.runtimeAttachments);
1041
+ const providerInstructionFilePath = resolveRuntimeInstructionFilePath(session.provider, workspace.path, input.runtimeOptions?.providerInstructionFilePath ?? null);
971
1042
  this.ensureCapability(capabilities.canSendMessage, "sessionId", "provider 不支持实时对话");
972
1043
  const runtimeRequest = {
973
1044
  sessionId: input.sessionId,
@@ -984,11 +1055,12 @@ export class SessionLiveRuntimeService {
984
1055
  reasoningLevel: input.runtimeOptions?.reasoningLevel ?? null,
985
1056
  permissionMode: input.runtimeOptions?.permissionMode ?? null,
986
1057
  providerPrompt,
1058
+ providerInstructionFilePath,
987
1059
  attachments: resolvedAttachments.runtimeAttachments
988
1060
  }
989
1061
  };
990
1062
  const runtimeSessionId = this.resolveRuntimeSessionId(input.sessionId);
991
- const activeRun = this.providerRuntimeService.getSnapshot(runtimeSessionId);
1063
+ const activeRun = this.getLiveRuntimeSnapshot(runtimeSessionId);
992
1064
  const externalRuntimeSnapshot = this.externalRuntimeSnapshots.get(runtimeSessionId);
993
1065
  if (activeRun &&
994
1066
  activeRun.provider === "claude-code" &&
@@ -1008,14 +1080,29 @@ export class SessionLiveRuntimeService {
1008
1080
  }
1009
1081
  if (activeRun && isActiveRuntimeState(activeRun.runningState)) {
1010
1082
  const submitStartedAtMs = performance.now();
1011
- await this.providerRuntimeService.submitToActiveRun(runtimeSessionId, runtimeRequest.options)
1012
- .catch((error) => {
1013
- throw mapSessionProviderError(error);
1014
- });
1015
- this.logSendDebugStep(debugTrace, "submit_to_active_run", submitStartedAtMs, {
1016
- runtimeMode,
1017
- activeRunState: activeRun.runningState
1018
- });
1083
+ try {
1084
+ await this.providerRuntimeService.submitToActiveRun(runtimeSessionId, runtimeRequest.options);
1085
+ this.logSendDebugStep(debugTrace, "submit_to_active_run", submitStartedAtMs, {
1086
+ runtimeMode,
1087
+ activeRunState: activeRun.runningState
1088
+ });
1089
+ }
1090
+ catch (error) {
1091
+ const mapped = mapSessionProviderError(error);
1092
+ // 运行时句柄还没来得及收尾时,steer 可能会撞上 provider 已终态。
1093
+ // 这里直接失败只会把一条正常消息变成偶发 409,属于纯粹的坏味道。
1094
+ if (mapped.errorCode === "SESSION_NOT_RUNNING") {
1095
+ await this.providerRuntimeService.abandonRun(runtimeSessionId);
1096
+ const restartRuntimeStartedAtMs = performance.now();
1097
+ await this.startRuntimeRun(runtimeRequest, input.userId, runtimeMode);
1098
+ this.logSendDebugStep(debugTrace, "restart_runtime_after_stale_active_run", restartRuntimeStartedAtMs, {
1099
+ runtimeMode
1100
+ });
1101
+ }
1102
+ else {
1103
+ throw mapped;
1104
+ }
1105
+ }
1019
1106
  }
1020
1107
  else {
1021
1108
  const startRuntimeStartedAtMs = performance.now();
@@ -1031,6 +1118,7 @@ export class SessionLiveRuntimeService {
1031
1118
  matched: Boolean(acceptedMessage)
1032
1119
  });
1033
1120
  const acceptedAt = acceptedMessage?.timestamp ?? nowIso();
1121
+ this.sessionHistoryService.resolveMessageOriginByClientRequestId(input.sessionId, input.clientRequestId, acceptedMessage?.messageId ?? null, acceptedAt);
1034
1122
  const boundAttachments = this.sessionMessageAttachmentService.bindClientRequestToMessage(input.sessionId, input.clientRequestId, acceptedMessage?.messageId ?? null);
1035
1123
  this.refreshSyntheticSessionTitle(session, input.content, input.userId);
1036
1124
  this.markSendDebugResponseReady(debugTrace, {
@@ -1067,7 +1155,7 @@ export class SessionLiveRuntimeService {
1067
1155
  }
1068
1156
  this.queueDispatchSessions.add(sessionId);
1069
1157
  try {
1070
- const runtimeSnapshot = this.providerRuntimeService.getSnapshot(sessionId);
1158
+ const runtimeSnapshot = this.getLiveRuntimeSnapshot(sessionId);
1071
1159
  const externalRuntimeSnapshot = this.externalRuntimeSnapshots.get(sessionId);
1072
1160
  if ((runtimeSnapshot && isActiveRuntimeState(runtimeSnapshot.runningState))
1073
1161
  || (externalRuntimeSnapshot && isActiveRuntimeState(externalRuntimeSnapshot.runningState))) {
@@ -1130,7 +1218,7 @@ export class SessionLiveRuntimeService {
1130
1218
  void this.dispatchNextQueuedMessage(session.sessionId);
1131
1219
  }
1132
1220
  shouldBlockQueueDispatch(session) {
1133
- const runtimeSnapshot = this.providerRuntimeService.getSnapshot(session.sessionId);
1221
+ const runtimeSnapshot = this.getLiveRuntimeSnapshot(session.sessionId);
1134
1222
  if (runtimeSnapshot && isActiveRuntimeState(runtimeSnapshot.runningState)) {
1135
1223
  return true;
1136
1224
  }
@@ -1170,7 +1258,7 @@ export class SessionLiveRuntimeService {
1170
1258
  || !isPendingSessionRunningState(session.runningState)) {
1171
1259
  return session;
1172
1260
  }
1173
- const runtimeSnapshot = this.providerRuntimeService.getSnapshot(sessionId);
1261
+ const runtimeSnapshot = this.getLiveRuntimeSnapshot(sessionId);
1174
1262
  const externalRuntimeSnapshot = this.externalRuntimeSnapshots.get(sessionId);
1175
1263
  if ((runtimeSnapshot && isActiveRuntimeState(runtimeSnapshot.runningState))
1176
1264
  || (externalRuntimeSnapshot && isActiveRuntimeState(externalRuntimeSnapshot.runningState))) {
@@ -1668,7 +1756,7 @@ export class SessionLiveRuntimeService {
1668
1756
  });
1669
1757
  }
1670
1758
  shouldIgnoreClaudeExternalRuntimeUpdate(sessionId) {
1671
- const runtimeSnapshot = this.providerRuntimeService.getSnapshot(sessionId);
1759
+ const runtimeSnapshot = this.getLiveRuntimeSnapshot(sessionId);
1672
1760
  return Boolean(runtimeSnapshot &&
1673
1761
  runtimeSnapshot.provider === "claude-code" &&
1674
1762
  isActiveRuntimeState(runtimeSnapshot.runningState));
@@ -2056,6 +2144,20 @@ function createProviderRuntimeAdapters(config, options = {}) {
2056
2144
  disposables
2057
2145
  };
2058
2146
  }
2147
+ function resolveRuntimeInstructionFilePath(provider, workspacePath, explicitFilePath) {
2148
+ const normalizedExplicit = explicitFilePath?.trim();
2149
+ if (normalizedExplicit) {
2150
+ const resolvedExplicit = path.resolve(normalizedExplicit);
2151
+ return existsSync(resolvedExplicit) ? resolvedExplicit : null;
2152
+ }
2153
+ if (provider !== "claude-code") {
2154
+ return null;
2155
+ }
2156
+ const defaultClaudeInstructionPath = path.join(workspacePath, "CLAUDE.md");
2157
+ return existsSync(defaultClaudeInstructionPath)
2158
+ ? path.resolve(defaultClaudeInstructionPath)
2159
+ : null;
2160
+ }
2059
2161
  function buildClaudeHookBridgeConfig(config) {
2060
2162
  const bridgeUrl = `http://127.0.0.1:${config.port}/api/providers/claude-code/hook-bridge/events`;
2061
2163
  const scriptPath = resolveClaudeHookBridgeScriptPath();