@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.
Files changed (123) hide show
  1. package/dist/public/assets/AdaptiveButlerPage-CLHLiZSY.js +2 -0
  2. package/dist/public/assets/{App-CHsm-VrM.js → App-FYuZfAoO.js} +6 -6
  3. package/dist/public/assets/{BootstrapPage-Bp0KfySv.js → BootstrapPage-3xpnsG-A.js} +1 -1
  4. package/dist/public/assets/ConversationPage-C5_ZqhU3.js +9 -0
  5. package/dist/public/assets/{DesktopDetachPreviewPage-DlDSb_tf.js → DesktopDetachPreviewPage-B77MG82y.js} +1 -1
  6. package/dist/public/assets/{DesktopModal-Csj5AdAN.js → DesktopModal-K5bEcj38.js} +1 -1
  7. package/dist/public/assets/{DesktopWindowPage-CacXiWjV.js → DesktopWindowPage-DbG-RBAf.js} +1 -1
  8. package/dist/public/assets/{FileContextPanel-DzMUQvE5.js → FileContextPanel-C-1yOton.js} +1 -1
  9. package/dist/public/assets/{GitSidebar-C8IC18GH.js → GitSidebar-DFHAPT3S.js} +1 -1
  10. package/dist/public/assets/{MobileCreateSessionSheet-BtqR_hKc.js → MobileCreateSessionSheet-gOyAZ857.js} +1 -1
  11. package/dist/public/assets/{MobileSheet-Co-qPMBD.js → MobileSheet-D0MfNkTv.js} +1 -1
  12. package/dist/public/assets/{PluginAccessOverview-D-KXkcyj.js → PluginAccessOverview-IrYIPLg3.js} +1 -1
  13. package/dist/public/assets/{PluginContainerPage-BKwCIs4r.js → PluginContainerPage-b9LQVuqG.js} +1 -1
  14. package/dist/public/assets/{PluginDetailPage-Djv_swcO.js → PluginDetailPage-BX7gohai.js} +1 -1
  15. package/dist/public/assets/{PluginsListPage-DAECNoN6.js → PluginsListPage-R0SibHMi.js} +1 -1
  16. package/dist/public/assets/{PureConversationPage-DP1X7Hix.js → PureConversationPage-CcakFvo0.js} +1 -1
  17. package/dist/public/assets/{RelayConnectEntryPage-xL_IPH8a.js → RelayConnectEntryPage-cAVq_kNM.js} +1 -1
  18. package/dist/public/assets/{ServerSettingsModal-CyhMgk10.js → ServerSettingsModal-BJwYHdKD.js} +1 -1
  19. package/dist/public/assets/{SessionIndexPage-CVEz50tc.js → SessionIndexPage-CJKRHB_F.js} +1 -1
  20. package/dist/public/assets/SettingsPage-Csp7wEBC.js +2 -0
  21. package/dist/public/assets/{TerminalManagerPanel-wVnoRA8u.js → TerminalManagerPanel-2HG-NyfR.js} +1 -1
  22. package/dist/public/assets/{ToolFilesPage-BospXumK.js → ToolFilesPage-BAZdjNaF.js} +1 -1
  23. package/dist/public/assets/{ToolGitPage-B2zOeCAD.js → ToolGitPage-CGkPmgsz.js} +1 -1
  24. package/dist/public/assets/{ToolProcessesPage-BDShao4b.js → ToolProcessesPage-BHpS7-VH.js} +1 -1
  25. package/dist/public/assets/{ToolsHomePage-s4zH7D9M.js → ToolsHomePage-DDGqYwYU.js} +1 -1
  26. package/dist/public/assets/{WorkbenchLandingPage-D51QCU_u.js → WorkbenchLandingPage-B4aooEYJ.js} +1 -1
  27. package/dist/public/assets/WorkbenchLayout-DrAvGjGK.js +1083 -0
  28. package/dist/public/assets/{WorkbenchModal-YsyEdJ_m.js → WorkbenchModal-BK5ix8YI.js} +1 -1
  29. package/dist/public/assets/WorkbenchShellRoute-DpycFsbp.css +1 -0
  30. package/dist/public/assets/WorkbenchShellRoute-p1FvkoPN.js +1 -0
  31. package/dist/public/assets/{WorkspaceDebugDetailPage-CMjNLqFq.js → WorkspaceDebugDetailPage-CPgAe8dd.js} +1 -1
  32. package/dist/public/assets/{WorkspaceDetailPage-CKxTbPKh.js → WorkspaceDetailPage-YM85dTGg.js} +1 -1
  33. package/dist/public/assets/{WorkspaceHomePage-CEy4ShCu.js → WorkspaceHomePage-DPPvwM93.js} +1 -1
  34. package/dist/public/assets/{client-runtime-manager-BFXU9DmS.js → client-runtime-manager-Clq-8rWh.js} +1 -1
  35. package/dist/public/assets/{host-alias-Zb2xyVrf.js → host-alias-BxzpRYrt.js} +1 -1
  36. package/dist/public/assets/index-BArTKWXk.js +50 -0
  37. package/dist/public/assets/index-CqKepLbu.css +1 -0
  38. package/dist/public/assets/{login-direct-candidate-resolver-DL8DS-Si.js → login-direct-candidate-resolver-BiWwFKnk.js} +1 -1
  39. package/dist/public/assets/peer-host-config-sync-kTom1_pp.js +1 -0
  40. package/dist/public/assets/{plugin-permission-copy-DrLk22m5.js → plugin-permission-copy-1_1wViri.js} +1 -1
  41. package/dist/public/assets/{plugins-api-COF4oh24.js → plugins-api-C0JqR2-W.js} +1 -1
  42. package/dist/public/assets/{preferences-service-CEWNV1w9.js → preferences-service-DWeLWZST.js} +1 -1
  43. package/dist/public/assets/{relay-entry-Cmc8vTlE.js → relay-entry-ClEd3cjN.js} +1 -1
  44. package/dist/public/assets/{useRegisteredDebugTemplates-FdmHG2S4.js → useRegisteredDebugTemplates-wJGOYam9.js} +1 -1
  45. package/dist/public/assets/{workbench-navigation-ED0157V-.js → workbench-navigation-vIWt3Rv_.js} +1 -1
  46. package/dist/public/index.html +2 -2
  47. package/dist/server/modules/client/client-controller.d.ts +1 -0
  48. package/dist/server/modules/client/client-controller.js +4 -0
  49. package/dist/server/modules/client/client-controller.js.map +1 -1
  50. package/dist/server/modules/client/client-service.d.ts +3 -0
  51. package/dist/server/modules/client/client-service.js +3 -0
  52. package/dist/server/modules/client/client-service.js.map +1 -1
  53. package/dist/server/modules/client/npm-global-package-service.js +32 -7
  54. package/dist/server/modules/client/npm-global-package-service.js.map +1 -1
  55. package/dist/server/modules/peer-host/host-ws-proxy-service.js +73 -12
  56. package/dist/server/modules/peer-host/host-ws-proxy-service.js.map +1 -1
  57. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +2 -0
  58. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  59. package/dist/server/modules/provider/provider-discovery-helper-process.js +6 -3
  60. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  61. package/dist/server/modules/provider/provider-discovery-runtime.js +4 -1
  62. package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -1
  63. package/dist/server/modules/sessions/codex-app-server-helper-process.js +84 -20
  64. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  65. package/dist/server/modules/sessions/session-controller.js +2 -1
  66. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  67. package/dist/server/modules/sessions/session-history-service.d.ts +8 -0
  68. package/dist/server/modules/sessions/session-history-service.js +123 -5
  69. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  70. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +27 -0
  71. package/dist/server/modules/sessions/session-live-runtime-service.js +457 -9
  72. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  73. package/dist/server/modules/sessions/session-permission-request-service.d.ts +17 -1
  74. package/dist/server/modules/sessions/session-permission-request-service.js +397 -9
  75. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  76. package/dist/server/modules/sessions/session-provider-config-service.js +1 -0
  77. package/dist/server/modules/sessions/session-provider-config-service.js.map +1 -1
  78. package/dist/server/modules/sessions/workspace-session-runtime-context-service.js +15 -1
  79. package/dist/server/modules/sessions/workspace-session-runtime-context-service.js.map +1 -1
  80. package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +1 -0
  81. package/dist/server/modules/tasks/task-helper-process-handlers.js +4 -1
  82. package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
  83. package/dist/server/modules/workbench/workbench-service.js +7 -4
  84. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  85. package/dist/server/routes/client.js +1 -0
  86. package/dist/server/routes/client.js.map +1 -1
  87. package/dist/server/shared/utils/peer-host-proxy-log.d.ts +3 -0
  88. package/dist/server/shared/utils/peer-host-proxy-log.js +48 -0
  89. package/dist/server/shared/utils/peer-host-proxy-log.js.map +1 -0
  90. package/dist/server/storage/repositories/session-send-queue-repository.d.ts +1 -0
  91. package/dist/server/storage/repositories/session-send-queue-repository.js +23 -0
  92. package/dist/server/storage/repositories/session-send-queue-repository.js.map +1 -1
  93. package/node_modules/@codingns/session-sync-core/dist/index.d.ts +1 -0
  94. package/node_modules/@codingns/session-sync-core/dist/index.js +1 -0
  95. package/node_modules/@codingns/session-sync-core/dist/index.js.map +1 -1
  96. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +2 -0
  97. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +93 -12
  98. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  99. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +3 -0
  100. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +116 -2
  101. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  102. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.d.ts +1 -0
  103. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +19 -8
  104. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
  105. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.d.ts +27 -1
  106. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js +48 -4
  107. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-permissions.js.map +1 -1
  108. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +53 -15
  109. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  110. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.d.ts +1 -0
  111. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +30 -2
  112. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -1
  113. package/package.json +2 -1
  114. package/scripts/claude-hook-bridge.cjs +167 -0
  115. package/dist/public/assets/AdaptiveButlerPage-BYETYaIe.js +0 -2
  116. package/dist/public/assets/ConversationPage-BCrNml1k.js +0 -9
  117. package/dist/public/assets/SettingsPage-CQNCrgaj.js +0 -2
  118. package/dist/public/assets/WorkbenchLayout-Bo2BbMY6.js +0 -1081
  119. package/dist/public/assets/WorkbenchShellRoute-D3l4aWJS.js +0 -1
  120. package/dist/public/assets/WorkbenchShellRoute-D5fnyF8z.css +0 -1
  121. package/dist/public/assets/index-BilHJjYU.js +0 -50
  122. package/dist/public/assets/index-OR7OITpQ.css +0 -1
  123. 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(config, workspacePath, knownSessions, enabledProviders, context.signal)
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 messagesWithAttachments = this.sessionMessageAttachmentService.enrichMessages(sessionId, sanitizedPage.messages);
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
- ...sanitizedPage,
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) {