@jingyi0605/codingns 1.0.0-beta.1 → 1.0.0-beta.3
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/dist/public/assets/AdaptiveButlerPage-CLHLiZSY.js +2 -0
- package/dist/public/assets/{App-CHsm-VrM.js → App-FYuZfAoO.js} +6 -6
- package/dist/public/assets/{BootstrapPage-Bp0KfySv.js → BootstrapPage-3xpnsG-A.js} +1 -1
- package/dist/public/assets/ConversationPage-C5_ZqhU3.js +9 -0
- package/dist/public/assets/{DesktopDetachPreviewPage-DlDSb_tf.js → DesktopDetachPreviewPage-B77MG82y.js} +1 -1
- package/dist/public/assets/{DesktopModal-Csj5AdAN.js → DesktopModal-K5bEcj38.js} +1 -1
- package/dist/public/assets/{DesktopWindowPage-CacXiWjV.js → DesktopWindowPage-DbG-RBAf.js} +1 -1
- package/dist/public/assets/{FileContextPanel-DzMUQvE5.js → FileContextPanel-C-1yOton.js} +1 -1
- package/dist/public/assets/{GitSidebar-C8IC18GH.js → GitSidebar-DFHAPT3S.js} +1 -1
- package/dist/public/assets/{MobileCreateSessionSheet-BtqR_hKc.js → MobileCreateSessionSheet-gOyAZ857.js} +1 -1
- package/dist/public/assets/{MobileSheet-Co-qPMBD.js → MobileSheet-D0MfNkTv.js} +1 -1
- package/dist/public/assets/{PluginAccessOverview-D-KXkcyj.js → PluginAccessOverview-IrYIPLg3.js} +1 -1
- package/dist/public/assets/{PluginContainerPage-BKwCIs4r.js → PluginContainerPage-b9LQVuqG.js} +1 -1
- package/dist/public/assets/{PluginDetailPage-Djv_swcO.js → PluginDetailPage-BX7gohai.js} +1 -1
- package/dist/public/assets/{PluginsListPage-DAECNoN6.js → PluginsListPage-R0SibHMi.js} +1 -1
- package/dist/public/assets/{PureConversationPage-DP1X7Hix.js → PureConversationPage-CcakFvo0.js} +1 -1
- package/dist/public/assets/{RelayConnectEntryPage-xL_IPH8a.js → RelayConnectEntryPage-cAVq_kNM.js} +1 -1
- package/dist/public/assets/{ServerSettingsModal-CyhMgk10.js → ServerSettingsModal-BJwYHdKD.js} +1 -1
- package/dist/public/assets/{SessionIndexPage-CVEz50tc.js → SessionIndexPage-CJKRHB_F.js} +1 -1
- package/dist/public/assets/SettingsPage-Csp7wEBC.js +2 -0
- package/dist/public/assets/{TerminalManagerPanel-wVnoRA8u.js → TerminalManagerPanel-2HG-NyfR.js} +1 -1
- package/dist/public/assets/{ToolFilesPage-BospXumK.js → ToolFilesPage-BAZdjNaF.js} +1 -1
- package/dist/public/assets/{ToolGitPage-B2zOeCAD.js → ToolGitPage-CGkPmgsz.js} +1 -1
- package/dist/public/assets/{ToolProcessesPage-BDShao4b.js → ToolProcessesPage-BHpS7-VH.js} +1 -1
- package/dist/public/assets/{ToolsHomePage-s4zH7D9M.js → ToolsHomePage-DDGqYwYU.js} +1 -1
- package/dist/public/assets/{WorkbenchLandingPage-D51QCU_u.js → WorkbenchLandingPage-B4aooEYJ.js} +1 -1
- package/dist/public/assets/WorkbenchLayout-DrAvGjGK.js +1083 -0
- package/dist/public/assets/{WorkbenchModal-YsyEdJ_m.js → WorkbenchModal-BK5ix8YI.js} +1 -1
- package/dist/public/assets/WorkbenchShellRoute-DpycFsbp.css +1 -0
- package/dist/public/assets/WorkbenchShellRoute-p1FvkoPN.js +1 -0
- package/dist/public/assets/{WorkspaceDebugDetailPage-CMjNLqFq.js → WorkspaceDebugDetailPage-CPgAe8dd.js} +1 -1
- package/dist/public/assets/{WorkspaceDetailPage-CKxTbPKh.js → WorkspaceDetailPage-YM85dTGg.js} +1 -1
- package/dist/public/assets/{WorkspaceHomePage-CEy4ShCu.js → WorkspaceHomePage-DPPvwM93.js} +1 -1
- package/dist/public/assets/{client-runtime-manager-BFXU9DmS.js → client-runtime-manager-Clq-8rWh.js} +1 -1
- package/dist/public/assets/{host-alias-Zb2xyVrf.js → host-alias-BxzpRYrt.js} +1 -1
- package/dist/public/assets/index-BArTKWXk.js +50 -0
- package/dist/public/assets/index-CqKepLbu.css +1 -0
- package/dist/public/assets/{login-direct-candidate-resolver-DL8DS-Si.js → login-direct-candidate-resolver-BiWwFKnk.js} +1 -1
- package/dist/public/assets/peer-host-config-sync-kTom1_pp.js +1 -0
- package/dist/public/assets/{plugin-permission-copy-DrLk22m5.js → plugin-permission-copy-1_1wViri.js} +1 -1
- package/dist/public/assets/{plugins-api-COF4oh24.js → plugins-api-C0JqR2-W.js} +1 -1
- package/dist/public/assets/{preferences-service-CEWNV1w9.js → preferences-service-DWeLWZST.js} +1 -1
- package/dist/public/assets/{relay-entry-Cmc8vTlE.js → relay-entry-ClEd3cjN.js} +1 -1
- package/dist/public/assets/{useRegisteredDebugTemplates-FdmHG2S4.js → useRegisteredDebugTemplates-wJGOYam9.js} +1 -1
- package/dist/public/assets/{workbench-navigation-ED0157V-.js → workbench-navigation-vIWt3Rv_.js} +1 -1
- package/dist/public/index.html +2 -2
- package/dist/server/modules/client/client-controller.d.ts +1 -0
- package/dist/server/modules/client/client-controller.js +4 -0
- package/dist/server/modules/client/client-controller.js.map +1 -1
- package/dist/server/modules/client/client-service.d.ts +3 -0
- package/dist/server/modules/client/client-service.js +3 -0
- package/dist/server/modules/client/client-service.js.map +1 -1
- package/dist/server/modules/client/npm-global-package-service.js +32 -7
- package/dist/server/modules/client/npm-global-package-service.js.map +1 -1
- package/dist/server/modules/peer-host/host-ws-proxy-service.js +73 -12
- package/dist/server/modules/peer-host/host-ws-proxy-service.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +2 -0
- package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-process.js +6 -3
- package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-runtime.js +4 -1
- package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -1
- package/dist/server/modules/sessions/codex-app-server-helper-process.js +84 -20
- package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
- package/dist/server/modules/sessions/session-controller.js +2 -1
- package/dist/server/modules/sessions/session-controller.js.map +1 -1
- package/dist/server/modules/sessions/session-history-service.d.ts +8 -0
- package/dist/server/modules/sessions/session-history-service.js +123 -5
- package/dist/server/modules/sessions/session-history-service.js.map +1 -1
- package/dist/server/modules/sessions/session-live-runtime-service.d.ts +27 -0
- package/dist/server/modules/sessions/session-live-runtime-service.js +457 -9
- package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
- package/dist/server/modules/sessions/session-permission-request-service.d.ts +17 -1
- package/dist/server/modules/sessions/session-permission-request-service.js +397 -9
- package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
- package/dist/server/modules/sessions/session-provider-config-service.js +1 -0
- package/dist/server/modules/sessions/session-provider-config-service.js.map +1 -1
- package/dist/server/modules/sessions/workspace-session-runtime-context-service.js +15 -1
- package/dist/server/modules/sessions/workspace-session-runtime-context-service.js.map +1 -1
- package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +1 -0
- package/dist/server/modules/tasks/task-helper-process-handlers.js +4 -1
- package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
- package/dist/server/modules/workbench/workbench-service.js +7 -4
- package/dist/server/modules/workbench/workbench-service.js.map +1 -1
- package/dist/server/routes/client.js +1 -0
- package/dist/server/routes/client.js.map +1 -1
- package/dist/server/shared/utils/peer-host-proxy-log.d.ts +3 -0
- package/dist/server/shared/utils/peer-host-proxy-log.js +48 -0
- package/dist/server/shared/utils/peer-host-proxy-log.js.map +1 -0
- package/dist/server/storage/repositories/session-send-queue-repository.d.ts +1 -0
- package/dist/server/storage/repositories/session-send-queue-repository.js +23 -0
- package/dist/server/storage/repositories/session-send-queue-repository.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/index.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/index.js +1 -0
- package/node_modules/@codingns/session-sync-core/dist/index.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +2 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +93 -12
- 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 +3 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +116 -2
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +19 -8
- 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-permissions.d.ts +27 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js +48 -4
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +53 -15
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-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 +30 -2
- package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -1
- package/package.json +2 -1
- package/scripts/claude-hook-bridge.cjs +167 -0
- package/dist/public/assets/AdaptiveButlerPage-BYETYaIe.js +0 -2
- package/dist/public/assets/ConversationPage-BCrNml1k.js +0 -9
- package/dist/public/assets/SettingsPage-CQNCrgaj.js +0 -2
- package/dist/public/assets/WorkbenchLayout-Bo2BbMY6.js +0 -1081
- package/dist/public/assets/WorkbenchShellRoute-D3l4aWJS.js +0 -1
- package/dist/public/assets/WorkbenchShellRoute-D5fnyF8z.css +0 -1
- package/dist/public/assets/index-BilHJjYU.js +0 -50
- package/dist/public/assets/index-OR7OITpQ.css +0 -1
- package/dist/public/assets/peer-host-config-sync-d2ZcPC5P.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import { CapabilityService, ClaudeCodeAdapter, CodexAdapter, GeminiAdapter, KimiAdapter, LegnaCodeAdapter, OpenCodeAdapter, ProviderRegistry, SessionSyncService } from "@codingns/session-sync-core";
|
|
4
4
|
import { AppError } from "../../shared/errors/app-error.js";
|
|
@@ -302,7 +302,10 @@ export class SessionHistoryService {
|
|
|
302
302
|
executionLane: "helper_process",
|
|
303
303
|
concurrency: WORKSPACE_DISCOVERY_SCAN_CONCURRENCY,
|
|
304
304
|
helperProcessHandler: "session.workspace_discovery",
|
|
305
|
-
run: async ({ config, workspacePath, knownSessions, enabledProviders }, context) => await discoverWorkspaceSessionsInRuntime(
|
|
305
|
+
run: async ({ config, workspacePath, knownSessions, enabledProviders, claudeExtraProjectRoots }, context) => await discoverWorkspaceSessionsInRuntime({
|
|
306
|
+
...config,
|
|
307
|
+
claudeExtraProjectRoots
|
|
308
|
+
}, workspacePath, knownSessions, enabledProviders, context.signal)
|
|
306
309
|
});
|
|
307
310
|
}
|
|
308
311
|
if (!this.taskManager.has(HOST_TASK_TYPES.providerCapabilityRefresh)) {
|
|
@@ -1398,6 +1401,29 @@ export class SessionHistoryService {
|
|
|
1398
1401
|
field: "sessionId"
|
|
1399
1402
|
});
|
|
1400
1403
|
}
|
|
1404
|
+
// 先查出子Agent会话列表,用于级联删除文件和数据库记录
|
|
1405
|
+
const subagentRows = this.db
|
|
1406
|
+
.prepare(`SELECT sb.session_id, sb.provider, sb.provider_session_id, sb.raw_store_ref
|
|
1407
|
+
FROM session_indices si
|
|
1408
|
+
JOIN session_bindings sb ON si.session_id = sb.session_id
|
|
1409
|
+
WHERE si.parent_session_id = ?
|
|
1410
|
+
AND si.is_subagent = 1`)
|
|
1411
|
+
.all(sessionId);
|
|
1412
|
+
// 删除子Agent的 JSONL 文件
|
|
1413
|
+
for (const subagent of subagentRows) {
|
|
1414
|
+
try {
|
|
1415
|
+
await this.providerSessionDeleteCli.deleteSession({
|
|
1416
|
+
provider: subagent.provider,
|
|
1417
|
+
providerSessionId: subagent.provider_session_id,
|
|
1418
|
+
rawStoreRef: subagent.raw_store_ref
|
|
1419
|
+
});
|
|
1420
|
+
}
|
|
1421
|
+
catch (error) {
|
|
1422
|
+
if (!isProviderSessionMissing(error)) {
|
|
1423
|
+
// 子Agent文件删除失败不阻断父会话删除
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1401
1427
|
try {
|
|
1402
1428
|
await this.providerSessionDeleteCli.deleteSession({
|
|
1403
1429
|
provider: binding.provider,
|
|
@@ -1410,6 +1436,8 @@ export class SessionHistoryService {
|
|
|
1410
1436
|
throw mapSessionProviderError(error);
|
|
1411
1437
|
}
|
|
1412
1438
|
}
|
|
1439
|
+
// 保险清理:如果父会话 rawStoreRef 对应目录下有 subagents/ 子目录,直接清掉整个目录
|
|
1440
|
+
this.cleanupSubagentFilesOnDisk(binding.rawStoreRef);
|
|
1413
1441
|
for (const observer of this.sessionDeletedObservers) {
|
|
1414
1442
|
await observer({
|
|
1415
1443
|
sessionId,
|
|
@@ -1418,7 +1446,14 @@ export class SessionHistoryService {
|
|
|
1418
1446
|
remainingWorkspaceSessionCount: this.countOtherWorkspaceSessions(binding.workspaceId, sessionId)
|
|
1419
1447
|
});
|
|
1420
1448
|
}
|
|
1449
|
+
const subagentSessionIds = subagentRows.map((row) => row.session_id);
|
|
1421
1450
|
const deleteTransaction = this.db.transaction((targetSessionId) => {
|
|
1451
|
+
// 级联删除子Agent会话的数据库记录
|
|
1452
|
+
for (const subagentId of subagentSessionIds) {
|
|
1453
|
+
this.detachSessionRelationsBeforeDelete(subagentId);
|
|
1454
|
+
this.deleteSessionById(subagentId);
|
|
1455
|
+
this.removeWorkspaceSessionRelation(subagentId);
|
|
1456
|
+
}
|
|
1422
1457
|
this.detachSessionRelationsBeforeDelete(targetSessionId);
|
|
1423
1458
|
this.deleteSessionById(targetSessionId);
|
|
1424
1459
|
});
|
|
@@ -1554,6 +1589,7 @@ export class SessionHistoryService {
|
|
|
1554
1589
|
.map((adapter) => adapter.providerId)
|
|
1555
1590
|
.filter((providerId) => this.isProviderEnabled(providerId));
|
|
1556
1591
|
const knownSessions = this.buildKnownSessionSummaries(existingWorkspaceSessions.filter((session) => enabledProviders.includes(session.provider)), existingWorkspaceSourceIndexes.filter((record) => enabledProviders.includes(record.provider)), workspace.path, activeRepairScope);
|
|
1592
|
+
const claudeExtraProjectRoots = this.collectClaudeDiscoveryProjectRoots(workspaceId, existingWorkspaceSessions);
|
|
1557
1593
|
const discoveryHandle = this.taskManager.enqueue(HOST_TASK_TYPES.workspaceDiscoveryScan, {
|
|
1558
1594
|
key: workspaceId,
|
|
1559
1595
|
source: "session_history.workspace_discovery.scan",
|
|
@@ -1561,7 +1597,8 @@ export class SessionHistoryService {
|
|
|
1561
1597
|
config: this.providerSessionDiscoveryConfig,
|
|
1562
1598
|
workspacePath: workspace.path,
|
|
1563
1599
|
knownSessions,
|
|
1564
|
-
enabledProviders
|
|
1600
|
+
enabledProviders,
|
|
1601
|
+
claudeExtraProjectRoots
|
|
1565
1602
|
}
|
|
1566
1603
|
});
|
|
1567
1604
|
const discovery = await awaitTaskHandleWithSignal(discoveryHandle, signal).catch((error) => {
|
|
@@ -1899,11 +1936,12 @@ export class SessionHistoryService {
|
|
|
1899
1936
|
return historyTask
|
|
1900
1937
|
.then(async (page) => {
|
|
1901
1938
|
const sanitizedPage = await this.sanitizeForkHistoryPage(sessionId, page, cursor, direction);
|
|
1902
|
-
const
|
|
1939
|
+
const orderedPage = this.offsetClaudeNativeForkRuntimePage(sessionId, sanitizedPage);
|
|
1940
|
+
const messagesWithAttachments = this.sessionMessageAttachmentService.enrichMessages(sessionId, orderedPage.messages);
|
|
1903
1941
|
const messages = this.enrichMessagesWithOrigin(sessionId, messagesWithAttachments);
|
|
1904
1942
|
this.persistSessionChangedFiles(sessionId, messages);
|
|
1905
1943
|
return {
|
|
1906
|
-
...
|
|
1944
|
+
...orderedPage,
|
|
1907
1945
|
messages
|
|
1908
1946
|
};
|
|
1909
1947
|
})
|
|
@@ -1987,6 +2025,44 @@ export class SessionHistoryService {
|
|
|
1987
2025
|
total: Math.max(0, page.total - leakedInheritedCount)
|
|
1988
2026
|
};
|
|
1989
2027
|
}
|
|
2028
|
+
offsetClaudeNativeForkRuntimePage(sessionId, page) {
|
|
2029
|
+
if (page.messages.length === 0) {
|
|
2030
|
+
return page;
|
|
2031
|
+
}
|
|
2032
|
+
const forkRecord = this.sessionForkRepository.findBySessionId(sessionId);
|
|
2033
|
+
if (!forkRecord
|
|
2034
|
+
|| forkRecord.provider !== "claude-code"
|
|
2035
|
+
|| (forkRecord.forkMethod !== "native_message_fork"
|
|
2036
|
+
&& forkRecord.forkMethod !== "native_session_fork")
|
|
2037
|
+
|| typeof forkRecord.inheritedPrefixMessageCount !== "number") {
|
|
2038
|
+
return page;
|
|
2039
|
+
}
|
|
2040
|
+
const inheritedPrefixMessageCount = Math.max(0, forkRecord.inheritedPrefixMessageCount);
|
|
2041
|
+
if (inheritedPrefixMessageCount <= 0) {
|
|
2042
|
+
return page;
|
|
2043
|
+
}
|
|
2044
|
+
const childSession = this.sessionIndexRepository.findIndexRecordBySessionId(sessionId);
|
|
2045
|
+
const childCreatedAt = childSession?.createdAt?.trim() || null;
|
|
2046
|
+
if (!childCreatedAt) {
|
|
2047
|
+
return page;
|
|
2048
|
+
}
|
|
2049
|
+
const containsInheritedMessages = page.messages.some((message) => message.sequence <= inheritedPrefixMessageCount
|
|
2050
|
+
&& message.timestamp < childCreatedAt);
|
|
2051
|
+
if (containsInheritedMessages) {
|
|
2052
|
+
return page;
|
|
2053
|
+
}
|
|
2054
|
+
const containsOnlyChildRuntimeMessages = page.messages.every((message) => message.timestamp >= childCreatedAt);
|
|
2055
|
+
if (!containsOnlyChildRuntimeMessages) {
|
|
2056
|
+
return page;
|
|
2057
|
+
}
|
|
2058
|
+
return {
|
|
2059
|
+
...page,
|
|
2060
|
+
messages: page.messages.map((message) => ({
|
|
2061
|
+
...message,
|
|
2062
|
+
sequence: message.sequence + inheritedPrefixMessageCount
|
|
2063
|
+
}))
|
|
2064
|
+
};
|
|
2065
|
+
}
|
|
1990
2066
|
resolveMessageOrigins(sessionId, messages) {
|
|
1991
2067
|
const originRepository = this.sessionMessageOriginRepository;
|
|
1992
2068
|
if (!originRepository || messages.length === 0) {
|
|
@@ -3252,6 +3328,32 @@ export class SessionHistoryService {
|
|
|
3252
3328
|
.get(workspaceId, sessionId);
|
|
3253
3329
|
return Number(row?.count ?? 0);
|
|
3254
3330
|
}
|
|
3331
|
+
/**
|
|
3332
|
+
* 清理父会话 rawStoreRef 对应目录下的 subagents/ 子目录。
|
|
3333
|
+
* 这是保险措施:即使子Agent会话没有被数据库记录(如尚未被 provider 发现),
|
|
3334
|
+
* 磁盘上的子Agent JSONL 文件也会被清理掉,避免下次扫描时重新出现为孤儿会话。
|
|
3335
|
+
*/
|
|
3336
|
+
cleanupSubagentFilesOnDisk(rawStoreRef) {
|
|
3337
|
+
try {
|
|
3338
|
+
const rawDir = rawStoreRef.replace(/\.jsonl$/i, "");
|
|
3339
|
+
if (!existsSync(rawDir)) {
|
|
3340
|
+
return;
|
|
3341
|
+
}
|
|
3342
|
+
const subagentsDir = join(rawDir, "subagents");
|
|
3343
|
+
if (!existsSync(subagentsDir)) {
|
|
3344
|
+
return;
|
|
3345
|
+
}
|
|
3346
|
+
rmSync(subagentsDir, { recursive: true, force: true });
|
|
3347
|
+
// 如果父目录也空了(只有 subagents 子目录),一并清理
|
|
3348
|
+
const remaining = readdirSync(rawDir);
|
|
3349
|
+
if (remaining.length === 0) {
|
|
3350
|
+
rmSync(rawDir, { recursive: true, force: true });
|
|
3351
|
+
}
|
|
3352
|
+
}
|
|
3353
|
+
catch {
|
|
3354
|
+
// 磁盘清理失败不阻断删除流程
|
|
3355
|
+
}
|
|
3356
|
+
}
|
|
3255
3357
|
detachSessionRelationsBeforeDelete(sessionId) {
|
|
3256
3358
|
const controlSessionIds = this.db
|
|
3257
3359
|
.prepare(`SELECT id
|
|
@@ -3420,6 +3522,22 @@ export class SessionHistoryService {
|
|
|
3420
3522
|
}
|
|
3421
3523
|
return [...merged.values()];
|
|
3422
3524
|
}
|
|
3525
|
+
collectClaudeDiscoveryProjectRoots(workspaceId, sessions) {
|
|
3526
|
+
const roots = new Set();
|
|
3527
|
+
for (const session of sessions) {
|
|
3528
|
+
if (session.provider !== "claude-code") {
|
|
3529
|
+
continue;
|
|
3530
|
+
}
|
|
3531
|
+
const binding = this.sessionBindingRepository.findBySessionId(session.sessionId);
|
|
3532
|
+
if (!binding || binding.workspaceId !== workspaceId) {
|
|
3533
|
+
continue;
|
|
3534
|
+
}
|
|
3535
|
+
for (const root of collectClaudeProjectsRootsNearBinding(binding)) {
|
|
3536
|
+
roots.add(root);
|
|
3537
|
+
}
|
|
3538
|
+
}
|
|
3539
|
+
return Array.from(roots);
|
|
3540
|
+
}
|
|
3423
3541
|
persistSessionSourceIndexRecords(workspaceId, workspacePath, sessions, existingSourceIndexes, timestamp) {
|
|
3424
3542
|
const existingByKey = new Map(existingSourceIndexes.map((record) => [record.sourceKey, record]));
|
|
3425
3543
|
for (const session of sessions) {
|