@jingyi0605/codingns 0.3.0 → 0.3.6

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 (261) hide show
  1. package/README.md +13 -0
  2. package/bin/codingns.mjs +880 -9
  3. package/dist/public/assets/{TerminalPage-Dfw1QUqW.js → TerminalPage-D00S4KM6.js} +19 -19
  4. package/dist/public/assets/index-BlOinYqR.js +122 -0
  5. package/dist/public/assets/index-Dg_7g6lA.css +1 -0
  6. package/dist/public/index.html +2 -2
  7. package/dist/server/config/env.d.ts +2 -0
  8. package/dist/server/config/env.js +35 -0
  9. package/dist/server/config/env.js.map +1 -1
  10. package/dist/server/config/opencode-base-url-resolver.d.ts +7 -0
  11. package/dist/server/config/opencode-base-url-resolver.js +48 -11
  12. package/dist/server/config/opencode-base-url-resolver.js.map +1 -1
  13. package/dist/server/config/opencode-system-probe-helper-client.d.ts +4 -0
  14. package/dist/server/config/opencode-system-probe-helper-client.js +29 -0
  15. package/dist/server/config/opencode-system-probe-helper-client.js.map +1 -1
  16. package/dist/server/config/opencode-system-probe-helper-process.d.ts +12 -0
  17. package/dist/server/config/opencode-system-probe-helper-process.js +34 -7
  18. package/dist/server/config/opencode-system-probe-helper-process.js.map +1 -1
  19. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +144 -0
  20. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +242 -1
  21. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  22. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +133 -2
  23. package/dist/server/modules/assistant-capability/assistant-capability-service.js +395 -2
  24. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  25. package/dist/server/modules/auth/auth-service.d.ts +18 -1
  26. package/dist/server/modules/auth/auth-service.js +168 -7
  27. package/dist/server/modules/auth/auth-service.js.map +1 -1
  28. package/dist/server/modules/butler/butler-codex-model-policy.d.ts +1 -0
  29. package/dist/server/modules/butler/butler-codex-model-policy.js +36 -0
  30. package/dist/server/modules/butler/butler-codex-model-policy.js.map +1 -0
  31. package/dist/server/modules/butler/butler-control-session-service.d.ts +13 -1
  32. package/dist/server/modules/butler/butler-control-session-service.js +55 -231
  33. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  34. package/dist/server/modules/butler/butler-controller.d.ts +17 -0
  35. package/dist/server/modules/butler/butler-controller.js +20 -1
  36. package/dist/server/modules/butler/butler-controller.js.map +1 -1
  37. package/dist/server/modules/butler/butler-follow-up-service.js +7 -3
  38. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  39. package/dist/server/modules/butler/butler-inbox-analysis-service.d.ts +36 -0
  40. package/dist/server/modules/butler/butler-inbox-analysis-service.js +375 -0
  41. package/dist/server/modules/butler/butler-inbox-analysis-service.js.map +1 -0
  42. package/dist/server/modules/butler/butler-inbox-instruction-adapter.d.ts +23 -0
  43. package/dist/server/modules/butler/butler-inbox-instruction-adapter.js +97 -0
  44. package/dist/server/modules/butler/butler-inbox-instruction-adapter.js.map +1 -0
  45. package/dist/server/modules/butler/butler-inbox-service.d.ts +39 -2
  46. package/dist/server/modules/butler/butler-inbox-service.js +392 -2
  47. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
  48. package/dist/server/modules/butler/butler-session-service.d.ts +8 -0
  49. package/dist/server/modules/butler/butler-session-service.js +205 -53
  50. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  51. package/dist/server/modules/butler/butler-session-summary-service.d.ts +1 -0
  52. package/dist/server/modules/butler/butler-session-summary-service.js +48 -23
  53. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  54. package/dist/server/modules/butler/butler-workspace-context.d.ts +13 -0
  55. package/dist/server/modules/butler/butler-workspace-context.js +234 -0
  56. package/dist/server/modules/butler/butler-workspace-context.js.map +1 -0
  57. package/dist/server/modules/client/client-controller.d.ts +6 -0
  58. package/dist/server/modules/client/client-controller.js +30 -8
  59. package/dist/server/modules/client/client-controller.js.map +1 -1
  60. package/dist/server/modules/client/client-service.d.ts +22 -10
  61. package/dist/server/modules/client/client-service.js +77 -100
  62. package/dist/server/modules/client/client-service.js.map +1 -1
  63. package/dist/server/modules/client/npm-global-package-service.d.ts +21 -0
  64. package/dist/server/modules/client/npm-global-package-service.js +210 -0
  65. package/dist/server/modules/client/npm-global-package-service.js.map +1 -0
  66. package/dist/server/modules/client/service-update-task-service.d.ts +15 -0
  67. package/dist/server/modules/client/service-update-task-service.js +147 -0
  68. package/dist/server/modules/client/service-update-task-service.js.map +1 -0
  69. package/dist/server/modules/client/service-update-types.d.ts +30 -0
  70. package/dist/server/modules/client/service-update-types.js +2 -0
  71. package/dist/server/modules/client/service-update-types.js.map +1 -0
  72. package/dist/server/modules/debug-target/debug-target-controller.d.ts +13 -0
  73. package/dist/server/modules/debug-target/debug-target-controller.js +77 -2
  74. package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -1
  75. package/dist/server/modules/debug-target/debug-target-service.d.ts +11 -2
  76. package/dist/server/modules/debug-target/debug-target-service.js +138 -3
  77. package/dist/server/modules/debug-target/debug-target-service.js.map +1 -1
  78. package/dist/server/modules/git/git-command-helper-client.d.ts +2 -0
  79. package/dist/server/modules/git/git-command-helper-client.js +52 -3
  80. package/dist/server/modules/git/git-command-helper-client.js.map +1 -1
  81. package/dist/server/modules/git/git-command-helper-process.js +62 -9
  82. package/dist/server/modules/git/git-command-helper-process.js.map +1 -1
  83. package/dist/server/modules/git/git-command-runner.d.ts +1 -0
  84. package/dist/server/modules/git/git-command-runner.js +25 -0
  85. package/dist/server/modules/git/git-command-runner.js.map +1 -1
  86. package/dist/server/modules/git/git-controller.js +8 -7
  87. package/dist/server/modules/git/git-controller.js.map +1 -1
  88. package/dist/server/modules/git/git-read-service.d.ts +7 -7
  89. package/dist/server/modules/git/git-read-service.js +41 -24
  90. package/dist/server/modules/git/git-read-service.js.map +1 -1
  91. package/dist/server/modules/model-switch/cc-switch-adapter.d.ts +36 -0
  92. package/dist/server/modules/model-switch/cc-switch-adapter.js +321 -0
  93. package/dist/server/modules/model-switch/cc-switch-adapter.js.map +1 -0
  94. package/dist/server/modules/model-switch/model-switch-controller.d.ts +11 -0
  95. package/dist/server/modules/model-switch/model-switch-controller.js +30 -0
  96. package/dist/server/modules/model-switch/model-switch-controller.js.map +1 -0
  97. package/dist/server/modules/model-switch/model-switch-service.d.ts +16 -0
  98. package/dist/server/modules/model-switch/model-switch-service.js +29 -0
  99. package/dist/server/modules/model-switch/model-switch-service.js.map +1 -0
  100. package/dist/server/modules/preferences/profile-service.d.ts +1 -0
  101. package/dist/server/modules/preferences/profile-service.js +9 -0
  102. package/dist/server/modules/preferences/profile-service.js.map +1 -1
  103. package/dist/server/modules/provider/codex-model-options.js +2 -3
  104. package/dist/server/modules/provider/codex-model-options.js.map +1 -1
  105. package/dist/server/modules/provider/opencode-model-options.js +2 -3
  106. package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
  107. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +9 -4
  108. package/dist/server/modules/provider/provider-discovery-helper-client.js +87 -11
  109. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  110. package/dist/server/modules/provider/provider-discovery-helper-process.js +52 -47
  111. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  112. package/dist/server/modules/provider/provider-discovery-runtime.d.ts +4 -0
  113. package/dist/server/modules/provider/provider-discovery-runtime.js +65 -0
  114. package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -0
  115. package/dist/server/modules/sessions/codex-app-server-helper-process.js +3 -0
  116. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  117. package/dist/server/modules/sessions/session-activity-authority-service.d.ts +3 -1
  118. package/dist/server/modules/sessions/session-activity-authority-service.js +3 -0
  119. package/dist/server/modules/sessions/session-activity-authority-service.js.map +1 -1
  120. package/dist/server/modules/sessions/session-activity-inspector.d.ts +1 -1
  121. package/dist/server/modules/sessions/session-activity-inspector.js +43 -16
  122. package/dist/server/modules/sessions/session-activity-inspector.js.map +1 -1
  123. package/dist/server/modules/sessions/session-controller.d.ts +3 -3
  124. package/dist/server/modules/sessions/session-controller.js +3 -3
  125. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  126. package/dist/server/modules/sessions/session-history-service.d.ts +8 -2
  127. package/dist/server/modules/sessions/session-history-service.js +473 -65
  128. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  129. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +9 -3
  130. package/dist/server/modules/sessions/session-live-runtime-service.js +114 -34
  131. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  132. package/dist/server/modules/sessions/session-message-attachment-service.d.ts +8 -8
  133. package/dist/server/modules/sessions/session-message-attachment-service.js +25 -34
  134. package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -1
  135. package/dist/server/modules/sessions/session-provider-error-mapper.js +7 -0
  136. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  137. package/dist/server/modules/skills/builtin-skill-service.d.ts +12 -0
  138. package/dist/server/modules/skills/builtin-skill-service.js +49 -0
  139. package/dist/server/modules/skills/builtin-skill-service.js.map +1 -0
  140. package/dist/server/modules/skills/builtin-skills/codingns-assistant/SKILL.md +75 -0
  141. package/dist/server/modules/skills/builtin-skills/codingns-assistant/agents/openai.yaml +4 -0
  142. package/dist/server/modules/skills/builtin-skills/codingns-assistant/references/cli-workflow.md +130 -0
  143. package/dist/server/modules/skills/skill-manager-service.d.ts +7 -0
  144. package/dist/server/modules/skills/skill-manager-service.js +98 -0
  145. package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
  146. package/dist/server/modules/tailscale/tailscale-helper-client.d.ts +1 -0
  147. package/dist/server/modules/tailscale/tailscale-helper-client.js +12 -0
  148. package/dist/server/modules/tailscale/tailscale-helper-client.js.map +1 -1
  149. package/dist/server/modules/tailscale/tailscale-manager.js +5 -1
  150. package/dist/server/modules/tailscale/tailscale-manager.js.map +1 -1
  151. package/dist/server/modules/tasks/task-helper-client.d.ts +5 -0
  152. package/dist/server/modules/tasks/task-helper-client.js +45 -0
  153. package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
  154. package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +10 -3
  155. package/dist/server/modules/tasks/task-helper-process-handlers.js +7 -5
  156. package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
  157. package/dist/server/modules/tasks/task-helper-process.js +11 -1
  158. package/dist/server/modules/tasks/task-helper-process.js.map +1 -1
  159. package/dist/server/modules/tasks/task-lane-executors.js +5 -2
  160. package/dist/server/modules/tasks/task-lane-executors.js.map +1 -1
  161. package/dist/server/modules/tasks/task-types.d.ts +3 -0
  162. package/dist/server/modules/tasks/task-types.js +4 -1
  163. package/dist/server/modules/tasks/task-types.js.map +1 -1
  164. package/dist/server/modules/terminal/command-template-service.d.ts +2 -2
  165. package/dist/server/modules/terminal/command-template-service.js +14 -5
  166. package/dist/server/modules/terminal/command-template-service.js.map +1 -1
  167. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js +1 -1
  168. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js.map +1 -1
  169. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +160 -11
  170. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -1
  171. package/dist/server/modules/terminal/template-port-runtime.d.ts +13 -2
  172. package/dist/server/modules/terminal/template-port-runtime.js +266 -44
  173. package/dist/server/modules/terminal/template-port-runtime.js.map +1 -1
  174. package/dist/server/modules/terminal/terminal-service.d.ts +4 -0
  175. package/dist/server/modules/terminal/terminal-service.js +65 -4
  176. package/dist/server/modules/terminal/terminal-service.js.map +1 -1
  177. package/dist/server/modules/workbench/workbench-service.js +3 -3
  178. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  179. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +1 -0
  180. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +118 -39
  181. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  182. package/dist/server/modules/workspace/workspace-code-composition.d.ts +1 -0
  183. package/dist/server/modules/workspace/workspace-code-composition.js +277 -2
  184. package/dist/server/modules/workspace/workspace-code-composition.js.map +1 -1
  185. package/dist/server/modules/workspace/workspace-service.js +54 -17
  186. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  187. package/dist/server/modules/worktree/worktree-cleanup-service.d.ts +1 -1
  188. package/dist/server/modules/worktree/worktree-cleanup-service.js +22 -17
  189. package/dist/server/modules/worktree/worktree-cleanup-service.js.map +1 -1
  190. package/dist/server/modules/worktree/worktree-controller.js +6 -5
  191. package/dist/server/modules/worktree/worktree-controller.js.map +1 -1
  192. package/dist/server/modules/worktree/worktree-manager.d.ts +1 -1
  193. package/dist/server/modules/worktree/worktree-manager.js +26 -19
  194. package/dist/server/modules/worktree/worktree-manager.js.map +1 -1
  195. package/dist/server/modules/worktree/worktree-merge-service.d.ts +2 -2
  196. package/dist/server/modules/worktree/worktree-merge-service.js +34 -27
  197. package/dist/server/modules/worktree/worktree-merge-service.js.map +1 -1
  198. package/dist/server/modules/worktree/worktree-sync-service.d.ts +1 -1
  199. package/dist/server/modules/worktree/worktree-sync-service.js +5 -3
  200. package/dist/server/modules/worktree/worktree-sync-service.js.map +1 -1
  201. package/dist/server/routes/assistant.js +24 -0
  202. package/dist/server/routes/assistant.js.map +1 -1
  203. package/dist/server/routes/butler.js +4 -0
  204. package/dist/server/routes/butler.js.map +1 -1
  205. package/dist/server/routes/client.js +2 -0
  206. package/dist/server/routes/client.js.map +1 -1
  207. package/dist/server/routes/sessions.js +1 -1
  208. package/dist/server/routes/sessions.js.map +1 -1
  209. package/dist/server/routes/system.d.ts +2 -1
  210. package/dist/server/routes/system.js +3 -1
  211. package/dist/server/routes/system.js.map +1 -1
  212. package/dist/server/server/create-server.d.ts +4 -0
  213. package/dist/server/server/create-server.js +67 -8
  214. package/dist/server/server/create-server.js.map +1 -1
  215. package/dist/server/shared/errors/app-error.d.ts +2 -0
  216. package/dist/server/shared/errors/app-error.js +2 -0
  217. package/dist/server/shared/errors/app-error.js.map +1 -1
  218. package/dist/server/shared/http/error-handler.d.ts +2 -1
  219. package/dist/server/shared/http/error-handler.js +3 -2
  220. package/dist/server/shared/http/error-handler.js.map +1 -1
  221. package/dist/server/shared/http/request-abort.d.ts +2 -0
  222. package/dist/server/shared/http/request-abort.js +38 -0
  223. package/dist/server/shared/http/request-abort.js.map +1 -0
  224. package/dist/server/storage/repositories/auth-login-attempt-repository.d.ts +9 -0
  225. package/dist/server/storage/repositories/auth-login-attempt-repository.js +59 -0
  226. package/dist/server/storage/repositories/auth-login-attempt-repository.js.map +1 -0
  227. package/dist/server/storage/repositories/butler-control-session-repository.d.ts +3 -0
  228. package/dist/server/storage/repositories/butler-control-session-repository.js +80 -4
  229. package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
  230. package/dist/server/storage/repositories/butler-inbox-item-repository.js +54 -3
  231. package/dist/server/storage/repositories/butler-inbox-item-repository.js.map +1 -1
  232. package/dist/server/storage/repositories/terminal-instance-repository.js +1 -1
  233. package/dist/server/storage/repositories/terminal-instance-repository.js.map +1 -1
  234. package/dist/server/storage/repositories/user-preference-profile-repository.js +6 -3
  235. package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -1
  236. package/dist/server/storage/sqlite/client.js +127 -0
  237. package/dist/server/storage/sqlite/client.js.map +1 -1
  238. package/dist/server/storage/sqlite/schema.sql +19 -1
  239. package/dist/server/types/domain.d.ts +37 -1
  240. package/dist/server/ws/workbench-ws-hub.d.ts +1 -0
  241. package/dist/server/ws/workbench-ws-hub.js +25 -3
  242. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  243. package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +23 -0
  244. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +162 -0
  245. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -1
  246. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +1 -0
  247. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +89 -33
  248. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  249. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +18 -2
  250. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
  251. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +3 -1
  252. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +238 -53
  253. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  254. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +1 -0
  255. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -1
  256. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +6 -2
  257. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +1 -1
  258. package/package.json +1 -1
  259. package/scripts/postinstall.mjs +33 -0
  260. package/dist/public/assets/index-DR2rPNi7.css +0 -1
  261. package/dist/public/assets/index-DTOruahn.js +0 -114
@@ -2,7 +2,7 @@ import { existsSync, readdirSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { performance } from "node:perf_hooks";
4
4
  import { ClaudeRuntimeAdapter, CodexRuntimeAdapter, GeminiRuntimeAdapter, KimiRuntimeAdapter, OpenCodeRuntimeAdapter, ProviderRuntimeService } from "@codingns/session-sync-core";
5
- import { AppError } from "../../shared/errors/app-error.js";
5
+ import { AppError, isAppError } from "../../shared/errors/app-error.js";
6
6
  import { createId } from "../../shared/utils/id.js";
7
7
  import { isPerfDebugEnabled, logPerformance } from "../../shared/utils/perf-log.js";
8
8
  import { logPermissionDebug } from "../../shared/utils/permission-debug-log.js";
@@ -103,7 +103,6 @@ export class SessionLiveRuntimeService {
103
103
  userId: input.userId
104
104
  });
105
105
  const snapshot = handle.getSnapshot();
106
- this.attachRuntimePersistence(handle, sessionId, workspace.id, input.userId);
107
106
  this.createRuntimeBackedSession({
108
107
  sessionId,
109
108
  workspaceId: workspace.id,
@@ -116,6 +115,9 @@ export class SessionLiveRuntimeService {
116
115
  initialContent: input.content,
117
116
  snapshot
118
117
  });
118
+ // 先把基础记录建出来,再回放 runtime 缓存事件,避免超快启动时出现
119
+ // “事件先到、索引还没落库”的竞态窗口。
120
+ this.attachRuntimePersistence(handle, sessionId, workspace.id, input.userId);
119
121
  const startBindingTask = this.waitForResolvedStartBinding(sessionId, workspace.id, input.provider, handle).catch(() => {
120
122
  return;
121
123
  });
@@ -143,7 +145,18 @@ export class SessionLiveRuntimeService {
143
145
  }
144
146
  const acceptedAt = acceptedMessage?.timestamp ?? nowIso();
145
147
  const boundAttachments = this.sessionMessageAttachmentService.bindClientRequestToMessage(sessionId, input.clientRequestId, acceptedMessage?.messageId ?? null);
146
- const session = this.sessionHistoryService.getSession(sessionId, input.userId);
148
+ const session = this.resolveStartedSession({
149
+ sessionId,
150
+ workspaceId: workspace.id,
151
+ userId: input.userId,
152
+ provider: input.provider,
153
+ parentSessionId: input.parentSessionId ?? null,
154
+ sessionKind: input.sessionKind ?? "default",
155
+ annotationSourceMessageId: input.annotationSourceMessageId ?? null,
156
+ annotationSourceText: input.annotationSourceText ?? null,
157
+ initialContent: input.content,
158
+ handle
159
+ });
147
160
  this.markSendDebugResponseReady(debugTrace, {
148
161
  returnedAcceptedMessage: Boolean(acceptedMessage),
149
162
  returnedSyntheticUser: !acceptedMessage,
@@ -428,6 +441,10 @@ export class SessionLiveRuntimeService {
428
441
  const runtimeSessionId = this.resolveRuntimeSessionId(sessionId);
429
442
  const runtimeSnapshot = this.providerRuntimeService.getSnapshot(runtimeSessionId);
430
443
  const externalRuntimeSnapshot = this.externalRuntimeSnapshots.get(runtimeSessionId) ?? null;
444
+ const runtimeHasActiveRun = runtimeSnapshot ? isActiveRuntimeState(runtimeSnapshot.runningState) : false;
445
+ const externalHasActiveRun = externalRuntimeSnapshot
446
+ ? isActiveRuntimeState(externalRuntimeSnapshot.runningState)
447
+ : false;
431
448
  const session = runtimeSnapshot || externalRuntimeSnapshot
432
449
  ? this.sessionHistoryService.getSession(sessionId, userId)
433
450
  : await this.sessionHistoryService.refreshRuntimeFallbackSession(sessionId, userId);
@@ -445,14 +462,15 @@ export class SessionLiveRuntimeService {
445
462
  provider: session.provider,
446
463
  providerSessionId: runtimeSnapshot.providerSessionId ?? session.providerSessionId,
447
464
  runningState: resolution.runningState,
448
- hasActiveRun: true,
449
- canAttach: true,
450
- canInterrupt: runtimeSnapshot.supportsInterrupt,
465
+ hasActiveRun: runtimeHasActiveRun,
466
+ canAttach: runtimeHasActiveRun,
467
+ canInterrupt: runtimeHasActiveRun && runtimeSnapshot.supportsInterrupt,
451
468
  inRunInputMode: capabilities.inRunInputMode,
452
469
  activityResolutionSource: resolution.activityResolutionSource,
453
470
  activityConfidence: resolution.activityConfidence,
454
471
  runId: resolution.runId,
455
472
  detail: resolution.detail,
473
+ interruptSource: resolution.interruptSource,
456
474
  errorCode: resolution.runningState === "failed"
457
475
  ? resolution.errorCode ?? session.lastErrorCode
458
476
  : null,
@@ -470,7 +488,7 @@ export class SessionLiveRuntimeService {
470
488
  provider: "claude-code",
471
489
  providerSessionId: externalRuntimeSnapshot.providerSessionId,
472
490
  runningState: resolution.runningState,
473
- hasActiveRun: true,
491
+ hasActiveRun: externalHasActiveRun,
474
492
  canAttach: false,
475
493
  canInterrupt: false,
476
494
  inRunInputMode: capabilities.inRunInputMode,
@@ -478,6 +496,7 @@ export class SessionLiveRuntimeService {
478
496
  activityConfidence: resolution.activityConfidence,
479
497
  runId: resolution.runId,
480
498
  detail: resolution.detail,
499
+ interruptSource: resolution.interruptSource,
481
500
  errorCode: resolution.runningState === "failed" ? resolution.errorCode ?? session.lastErrorCode : null,
482
501
  errorDetail: resolution.runningState === "failed" ? resolution.detail ?? session.lastErrorDetail : null,
483
502
  updatedAt: resolution.updatedAt,
@@ -500,6 +519,7 @@ export class SessionLiveRuntimeService {
500
519
  activityConfidence: resolution.activityConfidence,
501
520
  runId: resolution.runId,
502
521
  detail: persistedErrorDetail,
522
+ interruptSource: resolution.interruptSource,
503
523
  errorCode: persistedErrorCode,
504
524
  errorDetail: persistedErrorDetail,
505
525
  updatedAt: resolution.updatedAt,
@@ -573,6 +593,7 @@ export class SessionLiveRuntimeService {
573
593
  sessionId,
574
594
  status: runtimeSnapshot.runningState,
575
595
  detail: runtimeSnapshot.detail,
596
+ interruptSource: runtimeSnapshot.interruptSource,
576
597
  timestamp: runtimeSnapshot.lastEventAt ?? runtimeSnapshot.startedAt
577
598
  });
578
599
  }
@@ -582,6 +603,7 @@ export class SessionLiveRuntimeService {
582
603
  sessionId,
583
604
  status: externalRuntimeSnapshot.runningState,
584
605
  detail: externalRuntimeSnapshot.detail,
606
+ interruptSource: null,
585
607
  timestamp: externalRuntimeSnapshot.updatedAt
586
608
  });
587
609
  }
@@ -669,8 +691,8 @@ export class SessionLiveRuntimeService {
669
691
  const resolution = this.sessionActivityAuthorityService.observe(createRuntimeActivityObservation(runtimeSessionId, runtimeSnapshot));
670
692
  return {
671
693
  ...this.mapResolutionToActivityEnvelope(resolution, {
672
- hasActiveRun: true,
673
- canInterrupt: runtimeSnapshot.supportsInterrupt
694
+ hasActiveRun: isActiveRuntimeState(runtimeSnapshot.runningState),
695
+ canInterrupt: isActiveRuntimeState(runtimeSnapshot.runningState) && runtimeSnapshot.supportsInterrupt
674
696
  }),
675
697
  sessionId
676
698
  };
@@ -680,7 +702,7 @@ export class SessionLiveRuntimeService {
680
702
  const resolution = this.sessionActivityAuthorityService.observe(createExternalRuntimeActivityObservation(runtimeSessionId, externalRuntimeSnapshot));
681
703
  return {
682
704
  ...this.mapResolutionToActivityEnvelope(resolution, {
683
- hasActiveRun: true,
705
+ hasActiveRun: isActiveRuntimeState(externalRuntimeSnapshot.runningState),
684
706
  canInterrupt: false
685
707
  }),
686
708
  sessionId
@@ -734,6 +756,7 @@ export class SessionLiveRuntimeService {
734
756
  activityConfidence: resolution.activityConfidence,
735
757
  runId: resolution.runId,
736
758
  detail: resolution.detail,
759
+ interruptSource: resolution.interruptSource,
737
760
  errorCode: resolution.errorCode,
738
761
  errorDetail: resolution.detail,
739
762
  hasActiveRun: options.hasActiveRun,
@@ -852,6 +875,7 @@ export class SessionLiveRuntimeService {
852
875
  source: "authoritative_provider_event",
853
876
  confidence: input.runningState === "failed" ? "strong" : "authoritative",
854
877
  detail: input.detail,
878
+ interruptSource: null,
855
879
  errorCode: input.runningState === "failed" ? "CLAUDE_HOOK_STOP_FAILURE" : null,
856
880
  observedAt: input.timestamp
857
881
  });
@@ -882,6 +906,7 @@ export class SessionLiveRuntimeService {
882
906
  sessionId: input.sessionId,
883
907
  status: input.runningState,
884
908
  detail: input.detail,
909
+ interruptSource: null,
885
910
  timestamp: input.timestamp
886
911
  };
887
912
  await this.emitExternalRuntimeEnvelope(envelope);
@@ -1171,42 +1196,71 @@ export class SessionLiveRuntimeService {
1171
1196
  });
1172
1197
  }
1173
1198
  createRuntimeBackedSession(input) {
1199
+ this.upsertRuntimeBackedSessionRecords(input);
1200
+ }
1201
+ resolveStartedSession(input) {
1202
+ try {
1203
+ return this.sessionHistoryService.getSession(input.sessionId, input.userId);
1204
+ }
1205
+ catch (error) {
1206
+ if (!isRepairableStartedSessionLookupError(error)) {
1207
+ throw error;
1208
+ }
1209
+ this.upsertRuntimeBackedSessionRecords({
1210
+ sessionId: input.sessionId,
1211
+ workspaceId: input.workspaceId,
1212
+ userId: input.userId,
1213
+ provider: input.provider,
1214
+ parentSessionId: input.parentSessionId,
1215
+ sessionKind: input.sessionKind,
1216
+ annotationSourceMessageId: input.annotationSourceMessageId,
1217
+ annotationSourceText: input.annotationSourceText,
1218
+ initialContent: input.initialContent,
1219
+ snapshot: input.handle.getSnapshot()
1220
+ });
1221
+ return this.sessionHistoryService.getSession(input.sessionId, input.userId);
1222
+ }
1223
+ }
1224
+ upsertRuntimeBackedSessionRecords(input) {
1174
1225
  const timestamp = nowIso();
1226
+ const currentIndex = this.sessionIndexRepository.findIndexRecordBySessionId(input.sessionId);
1227
+ const currentState = this.sessionStateRepository.findBySessionAndUser(input.sessionId, input.userId);
1228
+ const currentSnapshot = this.sessionStatusSnapshotRepository.findBySessionId(input.sessionId);
1175
1229
  this.sessionHistoryService.persistSessionBinding(input.sessionId, input.workspaceId, this.buildBindingSnapshot(input.sessionId, input.snapshot.provider, input.snapshot.providerSessionId, input.snapshot.rawStoreRef));
1176
1230
  this.sessionIndexRepository.upsert({
1177
1231
  sessionId: input.sessionId,
1178
1232
  workspaceId: input.workspaceId,
1179
1233
  provider: input.provider,
1180
- parentSessionId: input.parentSessionId,
1181
- sessionKind: input.sessionKind,
1182
- annotationSourceMessageId: input.annotationSourceMessageId,
1183
- annotationSourceText: input.annotationSourceText,
1184
- isSubagent: false,
1185
- subagentLabel: null,
1186
- title: buildSessionTitle(input.initialContent),
1187
- messageCount: 0,
1188
- isArchived: false,
1189
- lastMessageAt: input.snapshot.lastEventAt,
1190
- createdAt: timestamp,
1234
+ parentSessionId: currentIndex?.parentSessionId ?? input.parentSessionId,
1235
+ sessionKind: currentIndex?.sessionKind ?? input.sessionKind,
1236
+ annotationSourceMessageId: currentIndex?.annotationSourceMessageId ?? input.annotationSourceMessageId,
1237
+ annotationSourceText: currentIndex?.annotationSourceText ?? input.annotationSourceText,
1238
+ isSubagent: currentIndex?.isSubagent ?? false,
1239
+ subagentLabel: currentIndex?.subagentLabel ?? null,
1240
+ title: currentIndex?.title?.trim() || buildSessionTitle(input.initialContent),
1241
+ messageCount: currentIndex?.messageCount ?? 0,
1242
+ isArchived: currentIndex?.isArchived ?? false,
1243
+ lastMessageAt: currentIndex?.lastMessageAt ?? input.snapshot.lastEventAt,
1244
+ createdAt: currentIndex?.createdAt ?? timestamp,
1191
1245
  updatedAt: timestamp
1192
1246
  });
1193
1247
  this.upsertSnapshot(input.sessionId, {
1194
- syncStatus: "idle",
1195
- syncCursor: null,
1196
- lastSyncAt: input.snapshot.lastEventAt ?? timestamp,
1197
- lastErrorCode: null,
1198
- lastErrorDetail: null,
1199
- resumedAt: null
1248
+ syncStatus: currentSnapshot?.syncStatus ?? "idle",
1249
+ syncCursor: currentSnapshot?.syncCursor ?? null,
1250
+ lastSyncAt: currentSnapshot?.lastSyncAt ?? input.snapshot.lastEventAt ?? timestamp,
1251
+ lastErrorCode: currentSnapshot?.lastErrorCode ?? null,
1252
+ lastErrorDetail: currentSnapshot?.lastErrorDetail ?? null,
1253
+ resumedAt: currentSnapshot?.resumedAt ?? null
1200
1254
  });
1201
1255
  this.sessionStateRepository.upsert({
1202
1256
  sessionId: input.sessionId,
1203
1257
  userId: input.userId,
1204
1258
  runningState: toStoredRunningState(input.snapshot.runningState),
1205
1259
  activitySource: "runtime",
1206
- favorite: false,
1207
- lastEventAt: input.snapshot.lastEventAt,
1208
- completedAt: input.snapshot.completedAt,
1209
- lastSeenAt: null,
1260
+ favorite: currentState?.favorite ?? false,
1261
+ lastEventAt: input.snapshot.lastEventAt ?? currentState?.lastEventAt ?? null,
1262
+ completedAt: input.snapshot.completedAt ?? currentState?.completedAt ?? null,
1263
+ lastSeenAt: currentState?.lastSeenAt ?? null,
1210
1264
  updatedAt: timestamp
1211
1265
  });
1212
1266
  this.sessionActivityAuthorityService.observe(createRuntimeActivityObservation(input.sessionId, input.snapshot));
@@ -1489,13 +1543,13 @@ export class SessionLiveRuntimeService {
1489
1543
  return Math.max(maxSequence + 1, 1);
1490
1544
  }
1491
1545
  async waitForResolvedStartBinding(sessionId, workspaceId, provider, handle) {
1492
- if (provider !== "gemini" && provider !== "kimi") {
1546
+ if (provider !== "gemini" && provider !== "kimi" && provider !== "codex") {
1493
1547
  return;
1494
1548
  }
1495
1549
  const startedAt = Date.now();
1496
1550
  while (Date.now() - startedAt < RUNTIME_START_BINDING_WAIT_TIMEOUT_MS) {
1497
1551
  const snapshot = handle.getSnapshot();
1498
- if (hasResolvedRuntimeBinding(snapshot.providerSessionId, snapshot.rawStoreRef)) {
1552
+ if (shouldPersistResolvedStartBinding(snapshot.provider, snapshot.providerSessionId, snapshot.rawStoreRef)) {
1499
1553
  this.sessionHistoryService.persistSessionBinding(sessionId, workspaceId, {
1500
1554
  provider: snapshot.provider,
1501
1555
  providerSessionId: snapshot.providerSessionId,
@@ -1513,7 +1567,7 @@ export class SessionLiveRuntimeService {
1513
1567
  runtimeAttachments: []
1514
1568
  };
1515
1569
  }
1516
- return this.sessionMessageAttachmentService.persistImageAttachments({
1570
+ return this.sessionMessageAttachmentService.persistAttachments({
1517
1571
  sessionId,
1518
1572
  clientRequestId,
1519
1573
  attachments
@@ -1560,6 +1614,7 @@ export class SessionLiveRuntimeService {
1560
1614
  type: "session.interrupted",
1561
1615
  sessionId,
1562
1616
  detail: event.detail,
1617
+ interruptSource: event.interruptSource,
1563
1618
  timestamp: event.timestamp
1564
1619
  };
1565
1620
  }
@@ -1568,6 +1623,7 @@ export class SessionLiveRuntimeService {
1568
1623
  sessionId,
1569
1624
  status: event.status,
1570
1625
  detail: event.detail,
1626
+ interruptSource: event.interruptSource,
1571
1627
  timestamp: event.timestamp
1572
1628
  };
1573
1629
  }
@@ -1673,6 +1729,7 @@ function createRuntimeActivityObservation(sessionId, snapshot) {
1673
1729
  ? "strong"
1674
1730
  : "authoritative",
1675
1731
  detail: snapshot.detail,
1732
+ interruptSource: snapshot.interruptSource,
1676
1733
  errorCode: snapshot.runningState === "failed" ? snapshot.errorCode ?? null : null,
1677
1734
  observedAt: snapshot.lastEventAt ?? snapshot.startedAt
1678
1735
  };
@@ -1685,6 +1742,7 @@ function createExternalRuntimeActivityObservation(sessionId, snapshot) {
1685
1742
  source: "authoritative_provider_event",
1686
1743
  confidence: snapshot.runningState === "failed" ? "strong" : "authoritative",
1687
1744
  detail: snapshot.detail,
1745
+ interruptSource: null,
1688
1746
  errorCode: snapshot.runningState === "failed" ? "CLAUDE_HOOK_STOP_FAILURE" : null,
1689
1747
  observedAt: snapshot.updatedAt
1690
1748
  };
@@ -1701,6 +1759,7 @@ function createRuntimeEventObservation(sessionId, event, startedAt) {
1701
1759
  detail: event.type === "message"
1702
1760
  ? "Host 正在接收这一轮运行的实时事件"
1703
1761
  : event.detail,
1762
+ interruptSource: event.interruptSource,
1704
1763
  errorCode: event.type === "error" ? event.errorCode : null,
1705
1764
  observedAt: event.type === "message" ? event.message.timestamp : event.timestamp
1706
1765
  };
@@ -1901,6 +1960,23 @@ function hasResolvedRuntimeBinding(providerSessionId, rawStoreRef) {
1901
1960
  return !providerSessionId.trim().toLowerCase().startsWith("pending://")
1902
1961
  && !rawStoreRef.trim().toLowerCase().startsWith("pending://");
1903
1962
  }
1963
+ function shouldPersistResolvedStartBinding(provider, providerSessionId, rawStoreRef) {
1964
+ if (!hasResolvedRuntimeBinding(providerSessionId, rawStoreRef)) {
1965
+ return false;
1966
+ }
1967
+ if (provider === "codex") {
1968
+ return !isSyntheticCodexRuntimeBinding(rawStoreRef);
1969
+ }
1970
+ return true;
1971
+ }
1972
+ function isSyntheticCodexRuntimeBinding(rawStoreRef) {
1973
+ if (!rawStoreRef?.trim()) {
1974
+ return false;
1975
+ }
1976
+ const normalizedRawStoreRef = rawStoreRef.trim().replaceAll("\\", "/").toLowerCase();
1977
+ return normalizedRawStoreRef.includes("/runtime/codex/")
1978
+ || normalizedRawStoreRef.startsWith("runtime/codex/");
1979
+ }
1904
1980
  function waitForRuntimeBindingPoll() {
1905
1981
  return new Promise((resolve) => {
1906
1982
  setTimeout(resolve, START_BINDING_POLL_INTERVAL_MS);
@@ -1912,6 +1988,10 @@ function isGeminiPendingRuntimeAliasBinding(value, targetSessionId) {
1912
1988
  function shouldAwaitAcceptedUserMessage(provider) {
1913
1989
  return provider !== "gemini";
1914
1990
  }
1991
+ function isRepairableStartedSessionLookupError(error) {
1992
+ return isAppError(error)
1993
+ && (error.errorCode === "SESSION_INDEX_MISSING" || error.errorCode === "SESSION_NOT_FOUND");
1994
+ }
1915
1995
  function shouldAwaitStartBindingBeforeAcceptedUserLookup(provider) {
1916
1996
  return provider === "kimi";
1917
1997
  }