@jingyi0605/codingns 0.1.0 → 0.1.2

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 (241) hide show
  1. package/README.md +14 -0
  2. package/dist/public/assets/TerminalPage-Dr7knYq2.js +55 -0
  3. package/dist/public/assets/index-BpUi6zoT.js +108 -0
  4. package/dist/public/assets/index-NMtdQNda.css +1 -0
  5. package/dist/public/index.html +2 -2
  6. package/dist/server/config/env.js +72 -7
  7. package/dist/server/config/env.js.map +1 -1
  8. package/dist/server/config/opencode-base-url-resolver.d.ts +13 -8
  9. package/dist/server/config/opencode-base-url-resolver.js +117 -147
  10. package/dist/server/config/opencode-base-url-resolver.js.map +1 -1
  11. package/dist/server/config/opencode-system-probe-helper-client.d.ts +18 -0
  12. package/dist/server/config/opencode-system-probe-helper-client.js +127 -0
  13. package/dist/server/config/opencode-system-probe-helper-client.js.map +1 -0
  14. package/dist/server/config/opencode-system-probe-helper-process.d.ts +1 -0
  15. package/dist/server/config/opencode-system-probe-helper-process.js +208 -0
  16. package/dist/server/config/opencode-system-probe-helper-process.js.map +1 -0
  17. package/dist/server/modules/git/git-command-helper-client.d.ts +25 -0
  18. package/dist/server/modules/git/git-command-helper-client.js +143 -0
  19. package/dist/server/modules/git/git-command-helper-client.js.map +1 -0
  20. package/dist/server/modules/git/git-command-helper-process.d.ts +1 -0
  21. package/dist/server/modules/git/git-command-helper-process.js +237 -0
  22. package/dist/server/modules/git/git-command-helper-process.js.map +1 -0
  23. package/dist/server/modules/git/git-command-runner.d.ts +8 -0
  24. package/dist/server/modules/git/git-command-runner.js +77 -6
  25. package/dist/server/modules/git/git-command-runner.js.map +1 -1
  26. package/dist/server/modules/git/git-controller.d.ts +4 -0
  27. package/dist/server/modules/git/git-controller.js +4 -1
  28. package/dist/server/modules/git/git-controller.js.map +1 -1
  29. package/dist/server/modules/git/git-read-service.d.ts +2 -1
  30. package/dist/server/modules/git/git-read-service.js +30 -0
  31. package/dist/server/modules/git/git-read-service.js.map +1 -1
  32. package/dist/server/modules/git/git-write-service.d.ts +1 -1
  33. package/dist/server/modules/git/git-write-service.js +8 -7
  34. package/dist/server/modules/git/git-write-service.js.map +1 -1
  35. package/dist/server/modules/git/types.d.ts +5 -0
  36. package/dist/server/modules/preferences/common.d.ts +2 -0
  37. package/dist/server/modules/preferences/common.js +13 -0
  38. package/dist/server/modules/preferences/common.js.map +1 -0
  39. package/dist/server/modules/preferences/profile-controller.d.ts +11 -0
  40. package/dist/server/modules/preferences/profile-controller.js +14 -0
  41. package/dist/server/modules/preferences/profile-controller.js.map +1 -0
  42. package/dist/server/modules/preferences/profile-service.d.ts +17 -0
  43. package/dist/server/modules/preferences/profile-service.js +213 -0
  44. package/dist/server/modules/preferences/profile-service.js.map +1 -0
  45. package/dist/server/modules/preferences/quick-phrase-controller.js +2 -12
  46. package/dist/server/modules/preferences/quick-phrase-controller.js.map +1 -1
  47. package/dist/server/modules/provider/codex-model-options.js +26 -165
  48. package/dist/server/modules/provider/codex-model-options.js.map +1 -1
  49. package/dist/server/modules/provider/opencode-model-options.js +6 -71
  50. package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
  51. package/dist/server/modules/provider/provider-controller.d.ts +2 -0
  52. package/dist/server/modules/provider/provider-controller.js +21 -1
  53. package/dist/server/modules/provider/provider-controller.js.map +1 -1
  54. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +25 -0
  55. package/dist/server/modules/provider/provider-discovery-helper-client.js +114 -0
  56. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -0
  57. package/dist/server/modules/provider/provider-discovery-helper-process.d.ts +1 -0
  58. package/dist/server/modules/provider/provider-discovery-helper-process.js +296 -0
  59. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -0
  60. package/dist/server/modules/sessions/claude-runtime-helper-client.d.ts +28 -0
  61. package/dist/server/modules/sessions/claude-runtime-helper-client.js +221 -0
  62. package/dist/server/modules/sessions/claude-runtime-helper-client.js.map +1 -0
  63. package/dist/server/modules/sessions/claude-runtime-helper-process.d.ts +1 -0
  64. package/dist/server/modules/sessions/claude-runtime-helper-process.js +146 -0
  65. package/dist/server/modules/sessions/claude-runtime-helper-process.js.map +1 -0
  66. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +16 -0
  67. package/dist/server/modules/sessions/codex-app-server-helper-client.js +237 -0
  68. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -0
  69. package/dist/server/modules/sessions/codex-app-server-helper-process.d.ts +1 -0
  70. package/dist/server/modules/sessions/codex-app-server-helper-process.js +484 -0
  71. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -0
  72. package/dist/server/modules/sessions/session-activity-authority-service.d.ts +52 -0
  73. package/dist/server/modules/sessions/session-activity-authority-service.js +377 -0
  74. package/dist/server/modules/sessions/session-activity-authority-service.js.map +1 -0
  75. package/dist/server/modules/sessions/session-activity-inspector.js +80 -40
  76. package/dist/server/modules/sessions/session-activity-inspector.js.map +1 -1
  77. package/dist/server/modules/sessions/session-controller.d.ts +15 -1
  78. package/dist/server/modules/sessions/session-controller.js +14 -1
  79. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  80. package/dist/server/modules/sessions/session-history-service.d.ts +8 -3
  81. package/dist/server/modules/sessions/session-history-service.js +303 -64
  82. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  83. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +40 -4
  84. package/dist/server/modules/sessions/session-live-runtime-service.js +334 -44
  85. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  86. package/dist/server/modules/sessions/session-permission-request-service.d.ts +175 -0
  87. package/dist/server/modules/sessions/session-permission-request-service.js +1615 -0
  88. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -0
  89. package/dist/server/modules/sessions/session-provider-error-mapper.js +14 -0
  90. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  91. package/dist/server/modules/terminal/command-template-service.d.ts +2 -2
  92. package/dist/server/modules/terminal/command-template-service.js +3 -3
  93. package/dist/server/modules/terminal/command-template-service.js.map +1 -1
  94. package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-client.d.ts +24 -0
  95. package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-client.js +104 -0
  96. package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-client.js.map +1 -0
  97. package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-process.d.ts +1 -0
  98. package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-process.js +96 -0
  99. package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-process.js.map +1 -0
  100. package/dist/server/modules/terminal/runtime/adapters/conpty-runtime-adapter.d.ts +37 -0
  101. package/dist/server/modules/terminal/runtime/adapters/conpty-runtime-adapter.js +123 -0
  102. package/dist/server/modules/terminal/runtime/adapters/conpty-runtime-adapter.js.map +1 -0
  103. package/dist/server/modules/terminal/runtime/adapters/embedded-pty-runtime-adapter.d.ts +12 -5
  104. package/dist/server/modules/terminal/runtime/adapters/embedded-pty-runtime-adapter.js +44 -4
  105. package/dist/server/modules/terminal/runtime/adapters/embedded-pty-runtime-adapter.js.map +1 -1
  106. package/dist/server/modules/terminal/runtime/adapters/tmux-helper-client.d.ts +14 -0
  107. package/dist/server/modules/terminal/runtime/adapters/tmux-helper-client.js +105 -0
  108. package/dist/server/modules/terminal/runtime/adapters/tmux-helper-client.js.map +1 -0
  109. package/dist/server/modules/terminal/runtime/adapters/tmux-helper-process.d.ts +1 -0
  110. package/dist/server/modules/terminal/runtime/adapters/tmux-helper-process.js +67 -0
  111. package/dist/server/modules/terminal/runtime/adapters/tmux-helper-process.js.map +1 -0
  112. package/dist/server/modules/terminal/runtime/adapters/tmux-runtime-adapter.d.ts +8 -12
  113. package/dist/server/modules/terminal/runtime/adapters/tmux-runtime-adapter.js +112 -21
  114. package/dist/server/modules/terminal/runtime/adapters/tmux-runtime-adapter.js.map +1 -1
  115. package/dist/server/modules/terminal/runtime/conpty-runtime-shared.d.ts +25 -0
  116. package/dist/server/modules/terminal/runtime/conpty-runtime-shared.js +124 -0
  117. package/dist/server/modules/terminal/runtime/conpty-runtime-shared.js.map +1 -0
  118. package/dist/server/modules/terminal/runtime/conpty-session-agent-process.d.ts +1 -0
  119. package/dist/server/modules/terminal/runtime/conpty-session-agent-process.js +205 -0
  120. package/dist/server/modules/terminal/runtime/conpty-session-agent-process.js.map +1 -0
  121. package/dist/server/modules/terminal/runtime/conpty-session-attach-client.d.ts +1 -0
  122. package/dist/server/modules/terminal/runtime/conpty-session-attach-client.js +108 -0
  123. package/dist/server/modules/terminal/runtime/conpty-session-attach-client.js.map +1 -0
  124. package/dist/server/modules/terminal/runtime/conpty-session-control-client.d.ts +1 -0
  125. package/dist/server/modules/terminal/runtime/conpty-session-control-client.js +90 -0
  126. package/dist/server/modules/terminal/runtime/conpty-session-control-client.js.map +1 -0
  127. package/dist/server/modules/terminal/runtime/pty-broker-agent-process.d.ts +1 -0
  128. package/dist/server/modules/terminal/runtime/pty-broker-agent-process.js +179 -0
  129. package/dist/server/modules/terminal/runtime/pty-broker-agent-process.js.map +1 -0
  130. package/dist/server/modules/terminal/runtime/pty-broker-client.d.ts +29 -0
  131. package/dist/server/modules/terminal/runtime/pty-broker-client.js +169 -0
  132. package/dist/server/modules/terminal/runtime/pty-broker-client.js.map +1 -0
  133. package/dist/server/modules/terminal/runtime/pty-broker-shared.d.ts +22 -0
  134. package/dist/server/modules/terminal/runtime/pty-broker-shared.js +123 -0
  135. package/dist/server/modules/terminal/runtime/pty-broker-shared.js.map +1 -0
  136. package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.d.ts +1 -0
  137. package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.js +11 -1
  138. package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.js.map +1 -1
  139. package/dist/server/modules/terminal/runtime/terminal-log-file-store.d.ts +1 -0
  140. package/dist/server/modules/terminal/runtime/terminal-log-file-store.js +7 -1
  141. package/dist/server/modules/terminal/runtime/terminal-log-file-store.js.map +1 -1
  142. package/dist/server/modules/terminal/runtime/terminal-log-spooler.js +3 -2
  143. package/dist/server/modules/terminal/runtime/terminal-log-spooler.js.map +1 -1
  144. package/dist/server/modules/terminal/runtime/terminal-runtime-adapter.d.ts +5 -3
  145. package/dist/server/modules/terminal/runtime/terminal-runtime-manager.d.ts +11 -5
  146. package/dist/server/modules/terminal/runtime/terminal-runtime-manager.js +110 -13
  147. package/dist/server/modules/terminal/runtime/terminal-runtime-manager.js.map +1 -1
  148. package/dist/server/modules/terminal/terminal-controller.js +7 -7
  149. package/dist/server/modules/terminal/terminal-controller.js.map +1 -1
  150. package/dist/server/modules/terminal/terminal-service.d.ts +30 -14
  151. package/dist/server/modules/terminal/terminal-service.js +260 -51
  152. package/dist/server/modules/terminal/terminal-service.js.map +1 -1
  153. package/dist/server/modules/terminal/terminal-shell.d.ts +4 -0
  154. package/dist/server/modules/terminal/terminal-shell.js +165 -18
  155. package/dist/server/modules/terminal/terminal-shell.js.map +1 -1
  156. package/dist/server/modules/workbench/workspace-file-watcher.d.ts +30 -0
  157. package/dist/server/modules/workbench/workspace-file-watcher.js +137 -0
  158. package/dist/server/modules/workbench/workspace-file-watcher.js.map +1 -0
  159. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +43 -7
  160. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  161. package/dist/server/routes/git.js +1 -0
  162. package/dist/server/routes/git.js.map +1 -1
  163. package/dist/server/routes/preferences.d.ts +2 -1
  164. package/dist/server/routes/preferences.js +3 -1
  165. package/dist/server/routes/preferences.js.map +1 -1
  166. package/dist/server/routes/sessions.js +2 -0
  167. package/dist/server/routes/sessions.js.map +1 -1
  168. package/dist/server/server/create-server.d.ts +4 -0
  169. package/dist/server/server/create-server.js +22 -5
  170. package/dist/server/server/create-server.js.map +1 -1
  171. package/dist/server/shared/utils/command-launch.d.ts +6 -0
  172. package/dist/server/shared/utils/command-launch.js +39 -0
  173. package/dist/server/shared/utils/command-launch.js.map +1 -0
  174. package/dist/server/shared/utils/perf-log.d.ts +1 -0
  175. package/dist/server/shared/utils/perf-log.js +8 -2
  176. package/dist/server/shared/utils/perf-log.js.map +1 -1
  177. package/dist/server/shared/utils/permission-debug-log.d.ts +2 -0
  178. package/dist/server/shared/utils/permission-debug-log.js +40 -0
  179. package/dist/server/shared/utils/permission-debug-log.js.map +1 -0
  180. package/dist/server/shared/utils/terminal-debug-log.d.ts +4 -0
  181. package/dist/server/shared/utils/terminal-debug-log.js +71 -0
  182. package/dist/server/shared/utils/terminal-debug-log.js.map +1 -0
  183. package/dist/server/storage/repositories/user-preference-profile-repository.d.ts +8 -0
  184. package/dist/server/storage/repositories/user-preference-profile-repository.js +46 -0
  185. package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -0
  186. package/dist/server/storage/sqlite/schema.sql +13 -0
  187. package/dist/server/types/domain.d.ts +28 -1
  188. package/dist/server/ws/terminal-ws-hub.d.ts +2 -0
  189. package/dist/server/ws/terminal-ws-hub.js +42 -5
  190. package/dist/server/ws/terminal-ws-hub.js.map +1 -1
  191. package/dist/server/ws/workbench-ws-hub.d.ts +9 -1
  192. package/dist/server/ws/workbench-ws-hub.js +132 -21
  193. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  194. package/dist/server/ws/ws-server.d.ts +22 -1
  195. package/dist/server/ws/ws-server.js +134 -46
  196. package/dist/server/ws/ws-server.js.map +1 -1
  197. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.d.ts +4 -1
  198. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js +107 -6
  199. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js.map +1 -1
  200. package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +30 -0
  201. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +103 -0
  202. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -0
  203. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +1 -1
  204. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +38 -6
  205. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  206. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +1 -1
  207. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +1 -1
  208. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  209. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.d.ts +1 -0
  210. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.js +8 -0
  211. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.js.map +1 -0
  212. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js +87 -7
  213. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js.map +1 -1
  214. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +1 -1
  215. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +8 -4
  216. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  217. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.d.ts +1 -0
  218. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +5 -0
  219. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
  220. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.d.ts +5 -0
  221. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +114 -6
  222. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
  223. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +23 -0
  224. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +721 -18
  225. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  226. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.d.ts +3 -0
  227. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js +106 -23
  228. package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js.map +1 -1
  229. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.d.ts +1 -0
  230. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +3 -0
  231. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -1
  232. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +1 -0
  233. package/node_modules/@codingns/session-sync-core/dist/services.d.ts +1 -1
  234. package/node_modules/@codingns/session-sync-core/dist/services.js +2 -2
  235. package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
  236. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +1 -1
  237. package/package.json +6 -2
  238. package/scripts/postinstall.mjs +218 -0
  239. package/dist/public/assets/TerminalPage-Dj_VDew3.js +0 -54
  240. package/dist/public/assets/index-C1GZV2wq.js +0 -106
  241. package/dist/public/assets/index-DU7f8NaZ.css +0 -1
@@ -5,6 +5,7 @@ import { createId } from "../../shared/utils/id.js";
5
5
  import { logPerformance } from "../../shared/utils/perf-log.js";
6
6
  import { nowIso } from "../../shared/utils/time.js";
7
7
  import { inspectSessionActivity } from "./session-activity-inspector.js";
8
+ import { SessionActivityAuthorityService } from "./session-activity-authority-service.js";
8
9
  import { mapSessionProviderError } from "./session-provider-error-mapper.js";
9
10
  import { enrichClaudeCapabilities } from "../provider/claude-model-options.js";
10
11
  import { CodexModelOptionsService, enrichCodexCapabilities } from "../provider/codex-model-options.js";
@@ -21,6 +22,7 @@ export class SessionHistoryService {
21
22
  providerRegistry;
22
23
  sessionSyncService;
23
24
  capabilityService;
25
+ sessionActivityAuthorityService;
24
26
  claudeCodeHomeDir;
25
27
  codexModelOptionsService;
26
28
  openCodeModelOptionsService;
@@ -28,7 +30,7 @@ export class SessionHistoryService {
28
30
  workspaceDiscoveryInflight = new Map();
29
31
  workspaceStateRefreshInflight = new Map();
30
32
  workspaceSessionRelations = new Map();
31
- constructor(db, workspaceRepository, sessionBindingRepository, sessionChangedFileService, sessionIndexRepository, sessionMessageAttachmentService, sessionStateRepository, sessionStatusSnapshotRepository, config) {
33
+ constructor(db, workspaceRepository, sessionBindingRepository, sessionChangedFileService, sessionIndexRepository, sessionMessageAttachmentService, sessionStateRepository, sessionStatusSnapshotRepository, config, sessionActivityAuthorityService = new SessionActivityAuthorityService()) {
32
34
  this.db = db;
33
35
  this.workspaceRepository = workspaceRepository;
34
36
  this.sessionBindingRepository = sessionBindingRepository;
@@ -37,6 +39,7 @@ export class SessionHistoryService {
37
39
  this.sessionMessageAttachmentService = sessionMessageAttachmentService;
38
40
  this.sessionStateRepository = sessionStateRepository;
39
41
  this.sessionStatusSnapshotRepository = sessionStatusSnapshotRepository;
42
+ this.sessionActivityAuthorityService = sessionActivityAuthorityService;
40
43
  this.claudeCodeHomeDir = config.claudeCodeHomeDir;
41
44
  this.providerRegistry = new ProviderRegistry([
42
45
  new ClaudeCodeAdapter({ homeDir: config.claudeCodeHomeDir }),
@@ -345,10 +348,10 @@ export class SessionHistoryService {
345
348
  throw mapSessionProviderError(error);
346
349
  }
347
350
  }
348
- async sendMessage(sessionId, content, clientRequestId) {
351
+ async sendMessage(sessionId, content, clientRequestId, permissionMode = null) {
349
352
  const binding = this.getBindingOrThrow(sessionId);
350
353
  const result = await this.sessionSyncService
351
- .sendMessage(binding.provider, binding.providerSessionId, binding.rawStoreRef, content, clientRequestId)
354
+ .sendMessage(binding.provider, binding.providerSessionId, binding.rawStoreRef, content, clientRequestId, permissionMode)
352
355
  .catch((error) => {
353
356
  this.markSessionError(sessionId, "SEND_FAILED", error);
354
357
  throw mapSessionProviderError(error);
@@ -397,10 +400,14 @@ export class SessionHistoryService {
397
400
  resumedAt: current?.resumedAt ?? null
398
401
  });
399
402
  try {
400
- await this.pullSessionHistory(sessionId, currentCursor, safeLimit, sentMessageIds, onEnvelope, "session.backfill")
401
- .then((nextCursor) => {
402
- currentCursor = nextCursor;
403
- });
403
+ if (currentCursor === null) {
404
+ currentCursor = await this.pullRecentSessionHistory(sessionId, safeLimit, sentMessageIds, onEnvelope, "session.backfill");
405
+ }
406
+ else {
407
+ await this.pullSessionHistory(sessionId, currentCursor, safeLimit, sentMessageIds, onEnvelope, "session.backfill").then((nextCursor) => {
408
+ currentCursor = nextCursor;
409
+ });
410
+ }
404
411
  }
405
412
  catch (error) {
406
413
  this.markSessionError(sessionId, "SUBSCRIBE_FAILED", error);
@@ -566,14 +573,14 @@ export class SessionHistoryService {
566
573
  if (!snapshot.providerSessionId || !snapshot.rawStoreRef) {
567
574
  return;
568
575
  }
569
- const resolvedSnapshot = {
576
+ const resolvedSnapshot = normalizeSessionBindingSnapshot(sessionId, {
570
577
  provider: snapshot.provider,
571
578
  providerSessionId: snapshot.providerSessionId,
572
579
  rawStoreRef: snapshot.rawStoreRef
573
- };
580
+ });
574
581
  const currentBinding = this.sessionBindingRepository.findBySessionId(sessionId);
575
582
  const timestamp = nowIso();
576
- const duplicateBinding = this.findPendingBindingDuplicate(sessionId, currentBinding, resolvedSnapshot);
583
+ const duplicateBinding = this.findPendingBindingDuplicate(sessionId, workspaceId, currentBinding, resolvedSnapshot);
577
584
  this.db.transaction(() => {
578
585
  if (duplicateBinding) {
579
586
  // 新建运行时会话会先写入 pending 绑定,后台发现链路可能在真 ID 回填前先落一条重复记录。
@@ -613,7 +620,8 @@ export class SessionHistoryService {
613
620
  const refreshStateCount = 10;
614
621
  try {
615
622
  const discoverStartedAt = Date.now();
616
- const knownSessions = this.buildKnownSessionSummaries(this.sessionIndexRepository.listByWorkspace(workspaceId, userId), workspace.path);
623
+ const existingWorkspaceSessions = this.sessionIndexRepository.listByWorkspace(workspaceId, userId);
624
+ const knownSessions = this.buildKnownSessionSummaries(existingWorkspaceSessions, workspace.path);
617
625
  const discovery = await this.sessionSyncService
618
626
  .discoverWorkspaceSessions(workspace.path, {
619
627
  knownSessions
@@ -626,9 +634,22 @@ export class SessionHistoryService {
626
634
  const timestamp = nowIso();
627
635
  const discoveredSessionIds = new Map();
628
636
  const persistedSessions = [];
637
+ const claimedPendingSessionIds = new Set();
629
638
  const persist = this.db.transaction(() => {
630
639
  for (const session of sessions) {
631
- const existing = this.sessionBindingRepository.findByProviderSession(session.provider, session.providerSessionId) ?? this.sessionBindingRepository.findByRawStoreRef(session.provider, session.rawStoreRef);
640
+ const exactExisting = this.sessionBindingRepository.findByProviderSession(session.provider, session.providerSessionId) ?? this.sessionBindingRepository.findByRawStoreRef(session.provider, session.rawStoreRef);
641
+ // discover 只能补全当前工作区,不能把别的工作区已有会话偷过来重绑。
642
+ if (exactExisting && exactExisting.workspaceId !== workspaceId) {
643
+ continue;
644
+ }
645
+ const pendingDuplicate = exactExisting
646
+ ?? findClaudePendingDiscoveryDuplicate(session, existingWorkspaceSessions, claimedPendingSessionIds);
647
+ const existing = exactExisting ?? (pendingDuplicate
648
+ ? this.sessionBindingRepository.findBySessionId(pendingDuplicate.sessionId)
649
+ : null);
650
+ if (pendingDuplicate && !exactExisting) {
651
+ claimedPendingSessionIds.add(pendingDuplicate.sessionId);
652
+ }
632
653
  const currentSnapshot = existing
633
654
  ? this.sessionStatusSnapshotRepository.findBySessionId(existing.sessionId)
634
655
  : null;
@@ -746,6 +767,14 @@ export class SessionHistoryService {
746
767
  }
747
768
  }
748
769
  async readPage(sessionId, provider, providerSessionId, rawStoreRef, cursor, limit, direction = "forward", knownTotalMessageCount = null) {
770
+ if (shouldShortCircuitClaudePendingHistory(provider, providerSessionId, rawStoreRef)) {
771
+ return {
772
+ messages: [],
773
+ cursor,
774
+ nextCursor: null,
775
+ total: 0
776
+ };
777
+ }
749
778
  if (shouldShortCircuitMissingSyntheticCodexHistory(provider, rawStoreRef)) {
750
779
  return {
751
780
  messages: [],
@@ -808,60 +837,38 @@ export class SessionHistoryService {
808
837
  if (!relation) {
809
838
  return this.enrichSessionItem(item);
810
839
  }
811
- return {
840
+ return this.enrichSessionItem({
812
841
  ...item,
813
842
  parentSessionId: relation.parentSessionId,
814
843
  isSubagent: relation.isSubagent,
815
844
  subagentLabel: relation.subagentLabel
816
- };
845
+ });
817
846
  });
818
847
  }
819
848
  enrichSessionItem(item) {
820
849
  const relation = this.workspaceSessionRelations.get(item.workspaceId)?.get(item.sessionId);
821
- if (!relation) {
822
- return {
850
+ const nextItem = relation
851
+ ? {
852
+ ...item,
853
+ parentSessionId: relation.parentSessionId,
854
+ isSubagent: relation.isSubagent,
855
+ subagentLabel: relation.subagentLabel
856
+ }
857
+ : {
823
858
  ...item,
824
859
  parentSessionId: item.parentSessionId ?? null,
825
860
  isSubagent: item.isSubagent ?? false,
826
861
  subagentLabel: item.subagentLabel ?? null
827
862
  };
828
- }
829
- return {
830
- ...item,
831
- parentSessionId: relation.parentSessionId,
832
- isSubagent: relation.isSubagent,
833
- subagentLabel: relation.subagentLabel
834
- };
863
+ const resolution = this.sessionActivityAuthorityService.resolvePersistedSession(nextItem);
864
+ return applySessionActivityResolution(nextItem, resolution);
835
865
  }
836
866
  async pullSessionHistory(sessionId, cursor, limit, sentMessageIds, onEnvelope, envelopeType, isClosed = () => false) {
837
867
  let currentCursor = cursor;
838
868
  while (!isClosed()) {
839
869
  const binding = this.getBindingOrThrow(sessionId);
840
870
  const page = await this.readPage(sessionId, binding.provider, binding.providerSessionId, binding.rawStoreRef, currentCursor, limit);
841
- const messages = page.messages.filter((message) => {
842
- if (sentMessageIds.has(message.messageId)) {
843
- return false;
844
- }
845
- sentMessageIds.add(message.messageId);
846
- return true;
847
- });
848
- if (messages.length > 0) {
849
- await this.syncSessionTitleFromProvider(sessionId, binding);
850
- this.upsertSnapshot(sessionId, {
851
- syncStatus: "idle",
852
- syncCursor: page.cursor,
853
- lastSyncAt: nowIso(),
854
- lastErrorCode: null,
855
- lastErrorDetail: null,
856
- resumedAt: this.sessionStatusSnapshotRepository.findBySessionId(sessionId)?.resumedAt ?? null
857
- });
858
- await onEnvelope({
859
- type: envelopeType,
860
- sessionId,
861
- cursor: page.cursor,
862
- messages
863
- });
864
- }
871
+ await this.publishHistoryEnvelope(sessionId, binding, page, sentMessageIds, onEnvelope, envelopeType);
865
872
  currentCursor = page.cursor;
866
873
  if (!page.nextCursor) {
867
874
  return currentCursor;
@@ -869,6 +876,40 @@ export class SessionHistoryService {
869
876
  }
870
877
  return currentCursor;
871
878
  }
879
+ async pullRecentSessionHistory(sessionId, limit, sentMessageIds, onEnvelope, envelopeType) {
880
+ const binding = this.getBindingOrThrow(sessionId);
881
+ const knownTotalMessageCount = this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.messageCount ?? null;
882
+ const page = await this.readPage(sessionId, binding.provider, binding.providerSessionId, binding.rawStoreRef, null, limit, "backward", knownTotalMessageCount);
883
+ await this.publishHistoryEnvelope(sessionId, binding, page, sentMessageIds, onEnvelope, envelopeType);
884
+ return page.cursor;
885
+ }
886
+ async publishHistoryEnvelope(sessionId, binding, page, sentMessageIds, onEnvelope, envelopeType) {
887
+ const messages = page.messages.filter((message) => {
888
+ if (sentMessageIds.has(message.messageId)) {
889
+ return false;
890
+ }
891
+ sentMessageIds.add(message.messageId);
892
+ return true;
893
+ });
894
+ if (messages.length === 0) {
895
+ return;
896
+ }
897
+ await this.syncSessionTitleFromProvider(sessionId, binding);
898
+ this.upsertSnapshot(sessionId, {
899
+ syncStatus: "idle",
900
+ syncCursor: page.cursor,
901
+ lastSyncAt: nowIso(),
902
+ lastErrorCode: null,
903
+ lastErrorDetail: null,
904
+ resumedAt: this.sessionStatusSnapshotRepository.findBySessionId(sessionId)?.resumedAt ?? null
905
+ });
906
+ await onEnvelope({
907
+ type: envelopeType,
908
+ sessionId,
909
+ cursor: page.cursor,
910
+ messages
911
+ });
912
+ }
872
913
  async syncSessionTitleFromProvider(sessionId, binding) {
873
914
  const currentIndex = this.sessionIndexRepository.findIndexRecordBySessionId(sessionId);
874
915
  if (!currentIndex) {
@@ -1012,7 +1053,7 @@ export class SessionHistoryService {
1012
1053
  });
1013
1054
  remove(sessionIds);
1014
1055
  }
1015
- findPendingBindingDuplicate(sessionId, currentBinding, snapshot) {
1056
+ findPendingBindingDuplicate(sessionId, workspaceId, currentBinding, snapshot) {
1016
1057
  if (!currentBinding || !isPendingBindingValue(currentBinding.providerSessionId)) {
1017
1058
  return null;
1018
1059
  }
@@ -1023,6 +1064,9 @@ export class SessionHistoryService {
1023
1064
  if (!existing || existing.sessionId === sessionId) {
1024
1065
  return null;
1025
1066
  }
1067
+ if (existing.workspaceId !== workspaceId) {
1068
+ throw new Error("SESSION_BINDING_WORKSPACE_CONFLICT");
1069
+ }
1026
1070
  return existing;
1027
1071
  }
1028
1072
  mergeSessionIntoTarget(input) {
@@ -1214,7 +1258,9 @@ export class SessionHistoryService {
1214
1258
  .run(sessionId);
1215
1259
  }
1216
1260
  buildKnownSessionSummaries(sessions, workspacePath) {
1217
- return sessions.map((session) => {
1261
+ return sessions
1262
+ .filter((session) => !shouldSkipClaudePendingBinding(session))
1263
+ .map((session) => {
1218
1264
  const stats = safeStat(session.rawStoreRef);
1219
1265
  return {
1220
1266
  provider: session.provider,
@@ -1237,30 +1283,47 @@ export class SessionHistoryService {
1237
1283
  if (shouldPreserveRuntimeTerminalState(current, inspection)) {
1238
1284
  return current;
1239
1285
  }
1286
+ const resolution = this.sessionActivityAuthorityService.observe(buildInspectionActivityObservation(sessionId, inspection, timestamp));
1240
1287
  const nextRecord = {
1241
1288
  sessionId,
1242
1289
  userId,
1243
- runningState: inspection.runningState,
1244
- activitySource: inspection.lastEventAt || inspection.completedAtCandidate ? "inferred" : "none",
1290
+ runningState: mapResolvedRunningStateToStored(resolution.runningState, current),
1291
+ activitySource: mapResolutionSourceToLegacyActivitySource(resolution.activityResolutionSource, inspection),
1245
1292
  favorite: current?.favorite ?? false,
1246
- lastEventAt: inspection.lastEventAt,
1247
- completedAt: inspection.completedAtCandidate,
1293
+ lastEventAt: resolution.lastObservedAt ?? inspection.lastEventAt ?? current?.lastEventAt ?? null,
1294
+ completedAt: isTerminalResolvedRunningState(resolution.runningState)
1295
+ ? resolution.terminalAt ?? inspection.completedAtCandidate ?? current?.completedAt ?? null
1296
+ : null,
1248
1297
  lastSeenAt: current?.lastSeenAt ?? null,
1249
1298
  updatedAt: timestamp
1250
1299
  };
1251
1300
  this.sessionStateRepository.upsert(nextRecord);
1252
1301
  const currentSnapshot = this.sessionStatusSnapshotRepository.findBySessionId(sessionId);
1302
+ const shouldClearRuntimeFailure = current?.runningState === "failed" && resolution.runningState !== "failed";
1253
1303
  this.sessionStatusSnapshotRepository.upsert({
1254
1304
  sessionId,
1255
- syncStatus: inspection.runningState === "failed" ? "error" : currentSnapshot?.syncStatus ?? "idle",
1305
+ syncStatus: resolution.runningState === "failed"
1306
+ ? "error"
1307
+ : shouldClearRuntimeFailure
1308
+ ? "idle"
1309
+ : currentSnapshot?.syncStatus ?? "idle",
1256
1310
  syncCursor: currentSnapshot?.syncCursor ?? null,
1257
- lastSyncAt: inspection.lastEventAt ?? inspection.completedAtCandidate ?? currentSnapshot?.lastSyncAt ?? null,
1258
- lastErrorCode: inspection.runningState === "failed"
1259
- ? inspection.errorCode
1260
- : currentSnapshot?.lastErrorCode ?? null,
1261
- lastErrorDetail: inspection.runningState === "failed"
1262
- ? inspection.errorDetail
1263
- : currentSnapshot?.lastErrorDetail ?? null,
1311
+ lastSyncAt: resolution.lastObservedAt
1312
+ ?? resolution.terminalAt
1313
+ ?? inspection.lastEventAt
1314
+ ?? inspection.completedAtCandidate
1315
+ ?? currentSnapshot?.lastSyncAt
1316
+ ?? null,
1317
+ lastErrorCode: resolution.runningState === "failed"
1318
+ ? resolution.errorCode
1319
+ : shouldClearRuntimeFailure
1320
+ ? null
1321
+ : currentSnapshot?.lastErrorCode ?? null,
1322
+ lastErrorDetail: resolution.runningState === "failed"
1323
+ ? resolution.detail
1324
+ : shouldClearRuntimeFailure
1325
+ ? null
1326
+ : currentSnapshot?.lastErrorDetail ?? null,
1264
1327
  resumedAt: currentSnapshot?.resumedAt ?? null,
1265
1328
  updatedAt: timestamp
1266
1329
  });
@@ -1287,6 +1350,61 @@ export class SessionHistoryService {
1287
1350
  });
1288
1351
  }
1289
1352
  }
1353
+ function buildInspectionActivityObservation(sessionId, inspection, observedAt) {
1354
+ return {
1355
+ sessionId,
1356
+ runId: null,
1357
+ runningState: inspection.runningState,
1358
+ source: hasInspectionEvidence(inspection) ? "inferred_log" : "unknown",
1359
+ confidence: "weak",
1360
+ detail: inspection.errorDetail,
1361
+ errorCode: inspection.errorCode,
1362
+ observedAt: inspection.completedAtCandidate ?? inspection.lastEventAt ?? observedAt
1363
+ };
1364
+ }
1365
+ function hasInspectionEvidence(inspection) {
1366
+ return inspection.runningState !== "idle"
1367
+ || !!inspection.lastEventAt
1368
+ || !!inspection.completedAtCandidate;
1369
+ }
1370
+ function applySessionActivityResolution(item, resolution) {
1371
+ const runningState = resolution.runningState;
1372
+ const shouldClearResolvedFailure = runningState !== "failed" && item.runningState === "failed";
1373
+ const lastEventAt = resolution.lastObservedAt ?? item.lastEventAt;
1374
+ const completedAt = isTerminalResolvedRunningState(runningState)
1375
+ ? resolution.terminalAt ?? item.completedAt
1376
+ : null;
1377
+ const lastErrorCode = runningState === "failed"
1378
+ ? resolution.errorCode ?? item.lastErrorCode
1379
+ : shouldClearResolvedFailure
1380
+ ? null
1381
+ : item.lastErrorCode;
1382
+ const lastErrorDetail = runningState === "failed"
1383
+ ? resolution.detail ?? item.lastErrorDetail
1384
+ : shouldClearResolvedFailure
1385
+ ? null
1386
+ : item.lastErrorDetail;
1387
+ const syncStatus = runningState === "failed"
1388
+ ? "error"
1389
+ : shouldClearResolvedFailure && item.syncStatus === "error"
1390
+ ? "idle"
1391
+ : item.syncStatus;
1392
+ return {
1393
+ ...item,
1394
+ syncStatus,
1395
+ runningState,
1396
+ activitySource: mapResolutionSourceToCompatibilitySource(resolution.activityResolutionSource),
1397
+ activityResolutionSource: resolution.activityResolutionSource,
1398
+ activityConfidence: resolution.activityConfidence,
1399
+ runId: resolution.runId,
1400
+ lastEventAt,
1401
+ completedAt,
1402
+ lastErrorCode,
1403
+ lastErrorDetail,
1404
+ watchdogTriggeredAt: resolution.watchdogTriggeredAt,
1405
+ activityState: resolveActivityState(runningState, completedAt, item.lastSeenAt)
1406
+ };
1407
+ }
1290
1408
  function clampLimit(limit) {
1291
1409
  if (!Number.isFinite(limit)) {
1292
1410
  return 50;
@@ -1439,6 +1557,18 @@ function pickLaterIso(left, right) {
1439
1557
  function buildProviderSessionKey(provider, providerSessionId) {
1440
1558
  return `${provider}::${providerSessionId}`;
1441
1559
  }
1560
+ function normalizeSessionBindingSnapshot(sessionId, snapshot) {
1561
+ if (snapshot.provider !== "claude-code" ||
1562
+ !(isPendingBindingValue(snapshot.providerSessionId) ||
1563
+ isClaudePendingRuntimeRawStoreRef(snapshot.rawStoreRef))) {
1564
+ return snapshot;
1565
+ }
1566
+ return {
1567
+ provider: snapshot.provider,
1568
+ providerSessionId: buildPendingBindingValue("claude-code", sessionId),
1569
+ rawStoreRef: buildPendingBindingValue("claude-code", sessionId)
1570
+ };
1571
+ }
1442
1572
  function shouldSkipClaudePendingBinding(binding) {
1443
1573
  if (binding.provider !== "claude-code") {
1444
1574
  return false;
@@ -1446,12 +1576,82 @@ function shouldSkipClaudePendingBinding(binding) {
1446
1576
  if (isPendingBindingValue(binding.providerSessionId)) {
1447
1577
  return true;
1448
1578
  }
1449
- const normalizedRawStoreRef = binding.rawStoreRef.replaceAll("\\", "/").toLowerCase();
1450
- return normalizedRawStoreRef.includes("/.pending-");
1579
+ return isClaudePendingRuntimeRawStoreRef(binding.rawStoreRef);
1451
1580
  }
1452
1581
  function isPendingBindingValue(value) {
1453
1582
  return value.trim().toLowerCase().startsWith("pending://");
1454
1583
  }
1584
+ function buildPendingBindingValue(provider, sessionId) {
1585
+ return `pending://${provider}/${sessionId}`;
1586
+ }
1587
+ function isClaudePendingRuntimeRawStoreRef(rawStoreRef) {
1588
+ const normalizedRawStoreRef = rawStoreRef.replaceAll("\\", "/").toLowerCase();
1589
+ return normalizedRawStoreRef.includes("/.pending-");
1590
+ }
1591
+ function shouldShortCircuitClaudePendingHistory(provider, providerSessionId, rawStoreRef) {
1592
+ if (provider !== "claude-code") {
1593
+ return false;
1594
+ }
1595
+ return isPendingBindingValue(providerSessionId) || isPendingBindingValue(rawStoreRef);
1596
+ }
1597
+ function findClaudePendingDiscoveryDuplicate(session, existingSessions, claimedSessionIds) {
1598
+ if (session.provider !== "claude-code") {
1599
+ return null;
1600
+ }
1601
+ if (isPendingBindingValue(session.providerSessionId)
1602
+ || session.rawStoreRef.replaceAll("\\", "/").toLowerCase().includes("/.pending-")) {
1603
+ return null;
1604
+ }
1605
+ const comparableTitle = normalizeClaudeComparableTitle(session.title);
1606
+ if (!comparableTitle) {
1607
+ return null;
1608
+ }
1609
+ const titleMatchedCandidates = existingSessions.filter((item) => {
1610
+ if (claimedSessionIds.has(item.sessionId)) {
1611
+ return false;
1612
+ }
1613
+ if (item.provider !== "claude-code" || !shouldSkipClaudePendingBinding(item)) {
1614
+ return false;
1615
+ }
1616
+ if (normalizeClaudeComparableTitle(item.title) !== comparableTitle) {
1617
+ return false;
1618
+ }
1619
+ return isCloseClaudeSessionTimestamp(item.lastMessageAt ?? item.createdAt, session.lastMessageAt);
1620
+ });
1621
+ if (titleMatchedCandidates.length === 1) {
1622
+ return titleMatchedCandidates[0];
1623
+ }
1624
+ const activePendingCandidates = existingSessions.filter((item) => {
1625
+ if (claimedSessionIds.has(item.sessionId)) {
1626
+ return false;
1627
+ }
1628
+ if (item.provider !== "claude-code" || !shouldSkipClaudePendingBinding(item)) {
1629
+ return false;
1630
+ }
1631
+ if (item.activitySource !== "runtime") {
1632
+ return false;
1633
+ }
1634
+ if (item.runningState !== "starting" && item.runningState !== "running") {
1635
+ return false;
1636
+ }
1637
+ return isCloseClaudeSessionTimestamp(item.lastMessageAt ?? item.lastEventAt ?? item.createdAt, session.lastMessageAt);
1638
+ });
1639
+ return activePendingCandidates.length === 1 ? activePendingCandidates[0] : null;
1640
+ }
1641
+ function normalizeClaudeComparableTitle(title) {
1642
+ return title?.trim().replace(/\s+/g, " ").toLowerCase() ?? "";
1643
+ }
1644
+ function isCloseClaudeSessionTimestamp(left, right, maxGapMs = 2 * 60 * 1000) {
1645
+ if (!left || !right) {
1646
+ return true;
1647
+ }
1648
+ const leftAt = Date.parse(left);
1649
+ const rightAt = Date.parse(right);
1650
+ if (!Number.isFinite(leftAt) || !Number.isFinite(rightAt)) {
1651
+ return true;
1652
+ }
1653
+ return Math.abs(leftAt - rightAt) <= maxGapMs;
1654
+ }
1455
1655
  function resolveDiscoveredArchiveState(existingArchived, discoveredArchived) {
1456
1656
  if (existingArchived) {
1457
1657
  return true;
@@ -1548,11 +1748,50 @@ function shouldPreserveRuntimeTerminalState(current, inspection) {
1548
1748
  return inspection.lastEventAt.localeCompare(current.lastEventAt) <= 0;
1549
1749
  }
1550
1750
  if (current.runningState === "starting" || current.runningState === "running") {
1551
- return inspection.lastEventAt.localeCompare(current.lastEventAt) < 0;
1751
+ return inspection.lastEventAt.localeCompare(current.lastEventAt) <= 0;
1552
1752
  }
1553
1753
  return false;
1554
1754
  }
1555
1755
  function isTerminalRunningState(state) {
1556
1756
  return state === "completed" || state === "interrupted" || state === "failed";
1557
1757
  }
1758
+ function isTerminalResolvedRunningState(state) {
1759
+ return state === "completed" || state === "interrupted" || state === "failed";
1760
+ }
1761
+ function mapResolvedRunningStateToStored(runningState, current) {
1762
+ if (runningState !== "stale" && runningState !== "unknown") {
1763
+ return runningState;
1764
+ }
1765
+ if (current?.runningState === "starting" || current?.runningState === "running") {
1766
+ return current.runningState;
1767
+ }
1768
+ return "running";
1769
+ }
1770
+ function mapResolutionSourceToLegacyActivitySource(source, inspection) {
1771
+ if (source === "authoritative_runtime" || source === "authoritative_provider_event") {
1772
+ return "runtime";
1773
+ }
1774
+ if (inspection.lastEventAt || inspection.completedAtCandidate) {
1775
+ return "inferred";
1776
+ }
1777
+ return "none";
1778
+ }
1779
+ function mapResolutionSourceToCompatibilitySource(source) {
1780
+ if (source === "authoritative_runtime" || source === "authoritative_provider_event") {
1781
+ return "runtime";
1782
+ }
1783
+ if (source === "inferred_log") {
1784
+ return "inferred";
1785
+ }
1786
+ return "none";
1787
+ }
1788
+ function resolveActivityState(runningState, completedAt, lastSeenAt) {
1789
+ if (runningState === "starting" || runningState === "running") {
1790
+ return "running";
1791
+ }
1792
+ if (completedAt && (!lastSeenAt || completedAt > lastSeenAt)) {
1793
+ return "completed_unread";
1794
+ }
1795
+ return "idle";
1796
+ }
1558
1797
  //# sourceMappingURL=session-history-service.js.map