@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.
- package/README.md +14 -0
- package/dist/public/assets/TerminalPage-Dr7knYq2.js +55 -0
- package/dist/public/assets/index-BpUi6zoT.js +108 -0
- package/dist/public/assets/index-NMtdQNda.css +1 -0
- package/dist/public/index.html +2 -2
- package/dist/server/config/env.js +72 -7
- package/dist/server/config/env.js.map +1 -1
- package/dist/server/config/opencode-base-url-resolver.d.ts +13 -8
- package/dist/server/config/opencode-base-url-resolver.js +117 -147
- package/dist/server/config/opencode-base-url-resolver.js.map +1 -1
- package/dist/server/config/opencode-system-probe-helper-client.d.ts +18 -0
- package/dist/server/config/opencode-system-probe-helper-client.js +127 -0
- package/dist/server/config/opencode-system-probe-helper-client.js.map +1 -0
- package/dist/server/config/opencode-system-probe-helper-process.d.ts +1 -0
- package/dist/server/config/opencode-system-probe-helper-process.js +208 -0
- package/dist/server/config/opencode-system-probe-helper-process.js.map +1 -0
- package/dist/server/modules/git/git-command-helper-client.d.ts +25 -0
- package/dist/server/modules/git/git-command-helper-client.js +143 -0
- package/dist/server/modules/git/git-command-helper-client.js.map +1 -0
- package/dist/server/modules/git/git-command-helper-process.d.ts +1 -0
- package/dist/server/modules/git/git-command-helper-process.js +237 -0
- package/dist/server/modules/git/git-command-helper-process.js.map +1 -0
- package/dist/server/modules/git/git-command-runner.d.ts +8 -0
- package/dist/server/modules/git/git-command-runner.js +77 -6
- package/dist/server/modules/git/git-command-runner.js.map +1 -1
- package/dist/server/modules/git/git-controller.d.ts +4 -0
- package/dist/server/modules/git/git-controller.js +4 -1
- package/dist/server/modules/git/git-controller.js.map +1 -1
- package/dist/server/modules/git/git-read-service.d.ts +2 -1
- package/dist/server/modules/git/git-read-service.js +30 -0
- package/dist/server/modules/git/git-read-service.js.map +1 -1
- package/dist/server/modules/git/git-write-service.d.ts +1 -1
- package/dist/server/modules/git/git-write-service.js +8 -7
- package/dist/server/modules/git/git-write-service.js.map +1 -1
- package/dist/server/modules/git/types.d.ts +5 -0
- package/dist/server/modules/preferences/common.d.ts +2 -0
- package/dist/server/modules/preferences/common.js +13 -0
- package/dist/server/modules/preferences/common.js.map +1 -0
- package/dist/server/modules/preferences/profile-controller.d.ts +11 -0
- package/dist/server/modules/preferences/profile-controller.js +14 -0
- package/dist/server/modules/preferences/profile-controller.js.map +1 -0
- package/dist/server/modules/preferences/profile-service.d.ts +17 -0
- package/dist/server/modules/preferences/profile-service.js +213 -0
- package/dist/server/modules/preferences/profile-service.js.map +1 -0
- package/dist/server/modules/preferences/quick-phrase-controller.js +2 -12
- package/dist/server/modules/preferences/quick-phrase-controller.js.map +1 -1
- package/dist/server/modules/provider/codex-model-options.js +26 -165
- package/dist/server/modules/provider/codex-model-options.js.map +1 -1
- package/dist/server/modules/provider/opencode-model-options.js +6 -71
- package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
- package/dist/server/modules/provider/provider-controller.d.ts +2 -0
- package/dist/server/modules/provider/provider-controller.js +21 -1
- package/dist/server/modules/provider/provider-controller.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +25 -0
- package/dist/server/modules/provider/provider-discovery-helper-client.js +114 -0
- package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -0
- package/dist/server/modules/provider/provider-discovery-helper-process.d.ts +1 -0
- package/dist/server/modules/provider/provider-discovery-helper-process.js +296 -0
- package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -0
- package/dist/server/modules/sessions/claude-runtime-helper-client.d.ts +28 -0
- package/dist/server/modules/sessions/claude-runtime-helper-client.js +221 -0
- package/dist/server/modules/sessions/claude-runtime-helper-client.js.map +1 -0
- package/dist/server/modules/sessions/claude-runtime-helper-process.d.ts +1 -0
- package/dist/server/modules/sessions/claude-runtime-helper-process.js +146 -0
- package/dist/server/modules/sessions/claude-runtime-helper-process.js.map +1 -0
- package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +16 -0
- package/dist/server/modules/sessions/codex-app-server-helper-client.js +237 -0
- package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -0
- package/dist/server/modules/sessions/codex-app-server-helper-process.d.ts +1 -0
- package/dist/server/modules/sessions/codex-app-server-helper-process.js +484 -0
- package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -0
- package/dist/server/modules/sessions/session-activity-authority-service.d.ts +52 -0
- package/dist/server/modules/sessions/session-activity-authority-service.js +377 -0
- package/dist/server/modules/sessions/session-activity-authority-service.js.map +1 -0
- package/dist/server/modules/sessions/session-activity-inspector.js +80 -40
- package/dist/server/modules/sessions/session-activity-inspector.js.map +1 -1
- package/dist/server/modules/sessions/session-controller.d.ts +15 -1
- package/dist/server/modules/sessions/session-controller.js +14 -1
- package/dist/server/modules/sessions/session-controller.js.map +1 -1
- package/dist/server/modules/sessions/session-history-service.d.ts +8 -3
- package/dist/server/modules/sessions/session-history-service.js +303 -64
- package/dist/server/modules/sessions/session-history-service.js.map +1 -1
- package/dist/server/modules/sessions/session-live-runtime-service.d.ts +40 -4
- package/dist/server/modules/sessions/session-live-runtime-service.js +334 -44
- package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
- package/dist/server/modules/sessions/session-permission-request-service.d.ts +175 -0
- package/dist/server/modules/sessions/session-permission-request-service.js +1615 -0
- package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -0
- package/dist/server/modules/sessions/session-provider-error-mapper.js +14 -0
- package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
- package/dist/server/modules/terminal/command-template-service.d.ts +2 -2
- package/dist/server/modules/terminal/command-template-service.js +3 -3
- package/dist/server/modules/terminal/command-template-service.js.map +1 -1
- package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-client.d.ts +24 -0
- package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-client.js +104 -0
- package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-client.js.map +1 -0
- package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-process.d.ts +1 -0
- package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-process.js +96 -0
- package/dist/server/modules/terminal/runtime/adapters/conpty-control-helper-process.js.map +1 -0
- package/dist/server/modules/terminal/runtime/adapters/conpty-runtime-adapter.d.ts +37 -0
- package/dist/server/modules/terminal/runtime/adapters/conpty-runtime-adapter.js +123 -0
- package/dist/server/modules/terminal/runtime/adapters/conpty-runtime-adapter.js.map +1 -0
- package/dist/server/modules/terminal/runtime/adapters/embedded-pty-runtime-adapter.d.ts +12 -5
- package/dist/server/modules/terminal/runtime/adapters/embedded-pty-runtime-adapter.js +44 -4
- package/dist/server/modules/terminal/runtime/adapters/embedded-pty-runtime-adapter.js.map +1 -1
- package/dist/server/modules/terminal/runtime/adapters/tmux-helper-client.d.ts +14 -0
- package/dist/server/modules/terminal/runtime/adapters/tmux-helper-client.js +105 -0
- package/dist/server/modules/terminal/runtime/adapters/tmux-helper-client.js.map +1 -0
- package/dist/server/modules/terminal/runtime/adapters/tmux-helper-process.d.ts +1 -0
- package/dist/server/modules/terminal/runtime/adapters/tmux-helper-process.js +67 -0
- package/dist/server/modules/terminal/runtime/adapters/tmux-helper-process.js.map +1 -0
- package/dist/server/modules/terminal/runtime/adapters/tmux-runtime-adapter.d.ts +8 -12
- package/dist/server/modules/terminal/runtime/adapters/tmux-runtime-adapter.js +112 -21
- package/dist/server/modules/terminal/runtime/adapters/tmux-runtime-adapter.js.map +1 -1
- package/dist/server/modules/terminal/runtime/conpty-runtime-shared.d.ts +25 -0
- package/dist/server/modules/terminal/runtime/conpty-runtime-shared.js +124 -0
- package/dist/server/modules/terminal/runtime/conpty-runtime-shared.js.map +1 -0
- package/dist/server/modules/terminal/runtime/conpty-session-agent-process.d.ts +1 -0
- package/dist/server/modules/terminal/runtime/conpty-session-agent-process.js +205 -0
- package/dist/server/modules/terminal/runtime/conpty-session-agent-process.js.map +1 -0
- package/dist/server/modules/terminal/runtime/conpty-session-attach-client.d.ts +1 -0
- package/dist/server/modules/terminal/runtime/conpty-session-attach-client.js +108 -0
- package/dist/server/modules/terminal/runtime/conpty-session-attach-client.js.map +1 -0
- package/dist/server/modules/terminal/runtime/conpty-session-control-client.d.ts +1 -0
- package/dist/server/modules/terminal/runtime/conpty-session-control-client.js +90 -0
- package/dist/server/modules/terminal/runtime/conpty-session-control-client.js.map +1 -0
- package/dist/server/modules/terminal/runtime/pty-broker-agent-process.d.ts +1 -0
- package/dist/server/modules/terminal/runtime/pty-broker-agent-process.js +179 -0
- package/dist/server/modules/terminal/runtime/pty-broker-agent-process.js.map +1 -0
- package/dist/server/modules/terminal/runtime/pty-broker-client.d.ts +29 -0
- package/dist/server/modules/terminal/runtime/pty-broker-client.js +169 -0
- package/dist/server/modules/terminal/runtime/pty-broker-client.js.map +1 -0
- package/dist/server/modules/terminal/runtime/pty-broker-shared.d.ts +22 -0
- package/dist/server/modules/terminal/runtime/pty-broker-shared.js +123 -0
- package/dist/server/modules/terminal/runtime/pty-broker-shared.js.map +1 -0
- package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.d.ts +1 -0
- package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.js +11 -1
- package/dist/server/modules/terminal/runtime/pty-host-attachment-manager.js.map +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-file-store.d.ts +1 -0
- package/dist/server/modules/terminal/runtime/terminal-log-file-store.js +7 -1
- package/dist/server/modules/terminal/runtime/terminal-log-file-store.js.map +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-spooler.js +3 -2
- package/dist/server/modules/terminal/runtime/terminal-log-spooler.js.map +1 -1
- package/dist/server/modules/terminal/runtime/terminal-runtime-adapter.d.ts +5 -3
- package/dist/server/modules/terminal/runtime/terminal-runtime-manager.d.ts +11 -5
- package/dist/server/modules/terminal/runtime/terminal-runtime-manager.js +110 -13
- package/dist/server/modules/terminal/runtime/terminal-runtime-manager.js.map +1 -1
- package/dist/server/modules/terminal/terminal-controller.js +7 -7
- package/dist/server/modules/terminal/terminal-controller.js.map +1 -1
- package/dist/server/modules/terminal/terminal-service.d.ts +30 -14
- package/dist/server/modules/terminal/terminal-service.js +260 -51
- package/dist/server/modules/terminal/terminal-service.js.map +1 -1
- package/dist/server/modules/terminal/terminal-shell.d.ts +4 -0
- package/dist/server/modules/terminal/terminal-shell.js +165 -18
- package/dist/server/modules/terminal/terminal-shell.js.map +1 -1
- package/dist/server/modules/workbench/workspace-file-watcher.d.ts +30 -0
- package/dist/server/modules/workbench/workspace-file-watcher.js +137 -0
- package/dist/server/modules/workbench/workspace-file-watcher.js.map +1 -0
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +43 -7
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
- package/dist/server/routes/git.js +1 -0
- package/dist/server/routes/git.js.map +1 -1
- package/dist/server/routes/preferences.d.ts +2 -1
- package/dist/server/routes/preferences.js +3 -1
- package/dist/server/routes/preferences.js.map +1 -1
- package/dist/server/routes/sessions.js +2 -0
- package/dist/server/routes/sessions.js.map +1 -1
- package/dist/server/server/create-server.d.ts +4 -0
- package/dist/server/server/create-server.js +22 -5
- package/dist/server/server/create-server.js.map +1 -1
- package/dist/server/shared/utils/command-launch.d.ts +6 -0
- package/dist/server/shared/utils/command-launch.js +39 -0
- package/dist/server/shared/utils/command-launch.js.map +1 -0
- package/dist/server/shared/utils/perf-log.d.ts +1 -0
- package/dist/server/shared/utils/perf-log.js +8 -2
- package/dist/server/shared/utils/perf-log.js.map +1 -1
- package/dist/server/shared/utils/permission-debug-log.d.ts +2 -0
- package/dist/server/shared/utils/permission-debug-log.js +40 -0
- package/dist/server/shared/utils/permission-debug-log.js.map +1 -0
- package/dist/server/shared/utils/terminal-debug-log.d.ts +4 -0
- package/dist/server/shared/utils/terminal-debug-log.js +71 -0
- package/dist/server/shared/utils/terminal-debug-log.js.map +1 -0
- package/dist/server/storage/repositories/user-preference-profile-repository.d.ts +8 -0
- package/dist/server/storage/repositories/user-preference-profile-repository.js +46 -0
- package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -0
- package/dist/server/storage/sqlite/schema.sql +13 -0
- package/dist/server/types/domain.d.ts +28 -1
- package/dist/server/ws/terminal-ws-hub.d.ts +2 -0
- package/dist/server/ws/terminal-ws-hub.js +42 -5
- package/dist/server/ws/terminal-ws-hub.js.map +1 -1
- package/dist/server/ws/workbench-ws-hub.d.ts +9 -1
- package/dist/server/ws/workbench-ws-hub.js +132 -21
- package/dist/server/ws/workbench-ws-hub.js.map +1 -1
- package/dist/server/ws/ws-server.d.ts +22 -1
- package/dist/server/ws/ws-server.js +134 -46
- package/dist/server/ws/ws-server.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.d.ts +4 -1
- package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js +107 -6
- package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +30 -0
- package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +103 -0
- package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +38 -6
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.js +8 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode-permissions.js.map +1 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js +87 -7
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +8 -4
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +5 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.d.ts +5 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +114 -6
- package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +23 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +721 -18
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.d.ts +3 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js +106 -23
- package/node_modules/@codingns/session-sync-core/dist/runtime/opencode-runtime.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +3 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/services.d.ts +1 -1
- package/node_modules/@codingns/session-sync-core/dist/services.js +2 -2
- package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/types.d.ts +1 -1
- package/package.json +6 -2
- package/scripts/postinstall.mjs +218 -0
- package/dist/public/assets/TerminalPage-Dj_VDew3.js +0 -54
- package/dist/public/assets/index-C1GZV2wq.js +0 -106
- 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
|
-
|
|
401
|
-
.
|
|
402
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
822
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
1244
|
-
activitySource:
|
|
1290
|
+
runningState: mapResolvedRunningStateToStored(resolution.runningState, current),
|
|
1291
|
+
activitySource: mapResolutionSourceToLegacyActivitySource(resolution.activityResolutionSource, inspection),
|
|
1245
1292
|
favorite: current?.favorite ?? false,
|
|
1246
|
-
lastEventAt: inspection.lastEventAt,
|
|
1247
|
-
completedAt:
|
|
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:
|
|
1305
|
+
syncStatus: resolution.runningState === "failed"
|
|
1306
|
+
? "error"
|
|
1307
|
+
: shouldClearRuntimeFailure
|
|
1308
|
+
? "idle"
|
|
1309
|
+
: currentSnapshot?.syncStatus ?? "idle",
|
|
1256
1310
|
syncCursor: currentSnapshot?.syncCursor ?? null,
|
|
1257
|
-
lastSyncAt:
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
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
|
-
|
|
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)
|
|
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
|