@jingyi0605/codingns 0.1.0 → 0.1.1

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 (30) hide show
  1. package/dist/public/assets/TerminalPage-CVG1cGAJ.js +55 -0
  2. package/dist/public/assets/index-BUPByQPG.css +1 -0
  3. package/dist/public/assets/index-D1CwTkI2.js +106 -0
  4. package/dist/public/index.html +2 -2
  5. package/dist/server/config/env.js +51 -7
  6. package/dist/server/config/env.js.map +1 -1
  7. package/dist/server/modules/sessions/session-history-service.d.ts +4 -1
  8. package/dist/server/modules/sessions/session-history-service.js +152 -35
  9. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  10. package/dist/server/modules/sessions/session-live-runtime-service.js +4 -0
  11. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  12. package/dist/server/ws/ws-server.js +55 -3
  13. package/dist/server/ws/ws-server.js.map +1 -1
  14. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.d.ts +4 -1
  15. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js +65 -6
  16. package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js.map +1 -1
  17. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +36 -5
  18. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  19. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js +56 -7
  20. package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js.map +1 -1
  21. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +32 -5
  22. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
  23. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +33 -1
  24. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  25. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +1 -0
  26. package/package.json +5 -2
  27. package/scripts/postinstall.mjs +211 -0
  28. package/dist/public/assets/TerminalPage-Dj_VDew3.js +0 -54
  29. package/dist/public/assets/index-C1GZV2wq.js +0 -106
  30. package/dist/public/assets/index-DU7f8NaZ.css +0 -1
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
6
  <title>CodingNS</title>
7
- <script type="module" crossorigin src="/assets/index-C1GZV2wq.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-DU7f8NaZ.css">
7
+ <script type="module" crossorigin src="/assets/index-D1CwTkI2.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-BUPByQPG.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
@@ -1,4 +1,5 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { createRequire } from "node:module";
2
3
  import crypto from "node:crypto";
3
4
  import os from "node:os";
4
5
  import path from "node:path";
@@ -74,14 +75,45 @@ function resolveCodexCliPath(configuredPath, homeDir) {
74
75
  if (normalizedConfiguredPath) {
75
76
  return normalizedConfiguredPath;
76
77
  }
77
- const candidates = [
78
- path.resolve(process.cwd(), "node_modules", ".bin", "codex"),
79
- path.resolve(process.cwd(), "packages", "session-sync-core", "node_modules", ".bin", "codex"),
80
- path.join(homeDir, ".local", "bin", "codex"),
81
- process.platform === "darwin" ? "/Applications/Codex.app/Contents/Resources/codex" : null
82
- ].filter((value) => Boolean(value));
78
+ const resolvedCodexScript = resolveModuleSpecifier("@openai/codex/bin/codex.js");
79
+ if (resolvedCodexScript) {
80
+ return resolvedCodexScript;
81
+ }
82
+ const configDir = path.dirname(fileURLToPath(import.meta.url));
83
+ const moduleSearchRoots = uniquePaths([
84
+ process.cwd(),
85
+ path.resolve(configDir, "..", "..", ".."),
86
+ resolveAppRootDir()
87
+ ]);
88
+ const nestedBinSegments = ["node_modules", "@openai", "codex-sdk", "node_modules", ".bin"];
89
+ const candidates = process.platform === "win32"
90
+ ? [
91
+ ...moduleSearchRoots.flatMap((root) => [
92
+ path.join(root, "node_modules", ".bin", "codex.cmd"),
93
+ path.join(root, "node_modules", ".bin", "codex.exe"),
94
+ path.join(root, "node_modules", ".bin", "codex"),
95
+ path.join(root, ...nestedBinSegments, "codex.cmd"),
96
+ path.join(root, ...nestedBinSegments, "codex.exe"),
97
+ path.join(root, ...nestedBinSegments, "codex")
98
+ ]),
99
+ normalizeOptionalText(process.env.APPDATA)
100
+ ? path.join(process.env.APPDATA, "npm", "codex.cmd")
101
+ : null,
102
+ normalizeOptionalText(process.env.APPDATA)
103
+ ? path.join(process.env.APPDATA, "npm", "codex.exe")
104
+ : null
105
+ ]
106
+ : [
107
+ ...moduleSearchRoots.flatMap((root) => [
108
+ path.join(root, "node_modules", ".bin", "codex"),
109
+ path.join(root, ...nestedBinSegments, "codex")
110
+ ]),
111
+ path.resolve(process.cwd(), "packages", "session-sync-core", "node_modules", ".bin", "codex"),
112
+ path.join(homeDir, ".local", "bin", "codex"),
113
+ process.platform === "darwin" ? "/Applications/Codex.app/Contents/Resources/codex" : null
114
+ ];
83
115
  for (const candidate of candidates) {
84
- if (existsSync(candidate)) {
116
+ if (candidate && existsSync(candidate)) {
85
117
  return candidate;
86
118
  }
87
119
  }
@@ -149,4 +181,16 @@ function resolveExistingDir(candidate) {
149
181
  }
150
182
  return existsSync(candidate) ? candidate : null;
151
183
  }
184
+ function uniquePaths(values) {
185
+ return [...new Set(values.map((value) => path.resolve(value)))];
186
+ }
187
+ function resolveModuleSpecifier(specifier) {
188
+ try {
189
+ const require = createRequire(import.meta.url);
190
+ return require.resolve(specifier);
191
+ }
192
+ catch {
193
+ return null;
194
+ }
195
+ }
152
196
  //# sourceMappingURL=env.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/config/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/config/env.ts"],"names":[],"mappings":"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"}
@@ -26,9 +26,10 @@ interface FavoriteSessionInput {
26
26
  isFavorite: boolean;
27
27
  }
28
28
  export interface SessionHistoryEnvelope {
29
- type: "session.backfill" | "session.delta";
29
+ type: "session.backfill" | "session.delta" | "session.history_older";
30
30
  sessionId: string;
31
31
  cursor: string | null;
32
+ olderCursor?: string | null;
32
33
  messages: HistoryPage["messages"];
33
34
  }
34
35
  export declare class SessionHistoryService {
@@ -104,6 +105,8 @@ export declare class SessionHistoryService {
104
105
  private enrichSessionItems;
105
106
  private enrichSessionItem;
106
107
  private pullSessionHistory;
108
+ private pullRecentSessionHistory;
109
+ private publishHistoryEnvelope;
107
110
  private syncSessionTitleFromProvider;
108
111
  private ensureSessionChangedFilesIndexed;
109
112
  private persistSessionChangedFiles;
@@ -397,10 +397,14 @@ export class SessionHistoryService {
397
397
  resumedAt: current?.resumedAt ?? null
398
398
  });
399
399
  try {
400
- await this.pullSessionHistory(sessionId, currentCursor, safeLimit, sentMessageIds, onEnvelope, "session.backfill")
401
- .then((nextCursor) => {
402
- currentCursor = nextCursor;
403
- });
400
+ if (currentCursor === null) {
401
+ currentCursor = await this.pullRecentSessionHistory(sessionId, safeLimit, sentMessageIds, onEnvelope, "session.backfill");
402
+ }
403
+ else {
404
+ await this.pullSessionHistory(sessionId, currentCursor, safeLimit, sentMessageIds, onEnvelope, "session.backfill").then((nextCursor) => {
405
+ currentCursor = nextCursor;
406
+ });
407
+ }
404
408
  }
405
409
  catch (error) {
406
410
  this.markSessionError(sessionId, "SUBSCRIBE_FAILED", error);
@@ -566,11 +570,11 @@ export class SessionHistoryService {
566
570
  if (!snapshot.providerSessionId || !snapshot.rawStoreRef) {
567
571
  return;
568
572
  }
569
- const resolvedSnapshot = {
573
+ const resolvedSnapshot = normalizeSessionBindingSnapshot(sessionId, {
570
574
  provider: snapshot.provider,
571
575
  providerSessionId: snapshot.providerSessionId,
572
576
  rawStoreRef: snapshot.rawStoreRef
573
- };
577
+ });
574
578
  const currentBinding = this.sessionBindingRepository.findBySessionId(sessionId);
575
579
  const timestamp = nowIso();
576
580
  const duplicateBinding = this.findPendingBindingDuplicate(sessionId, currentBinding, resolvedSnapshot);
@@ -613,7 +617,8 @@ export class SessionHistoryService {
613
617
  const refreshStateCount = 10;
614
618
  try {
615
619
  const discoverStartedAt = Date.now();
616
- const knownSessions = this.buildKnownSessionSummaries(this.sessionIndexRepository.listByWorkspace(workspaceId, userId), workspace.path);
620
+ const existingWorkspaceSessions = this.sessionIndexRepository.listByWorkspace(workspaceId, userId);
621
+ const knownSessions = this.buildKnownSessionSummaries(existingWorkspaceSessions, workspace.path);
617
622
  const discovery = await this.sessionSyncService
618
623
  .discoverWorkspaceSessions(workspace.path, {
619
624
  knownSessions
@@ -626,9 +631,18 @@ export class SessionHistoryService {
626
631
  const timestamp = nowIso();
627
632
  const discoveredSessionIds = new Map();
628
633
  const persistedSessions = [];
634
+ const claimedPendingSessionIds = new Set();
629
635
  const persist = this.db.transaction(() => {
630
636
  for (const session of sessions) {
631
- const existing = this.sessionBindingRepository.findByProviderSession(session.provider, session.providerSessionId) ?? this.sessionBindingRepository.findByRawStoreRef(session.provider, session.rawStoreRef);
637
+ const exactExisting = this.sessionBindingRepository.findByProviderSession(session.provider, session.providerSessionId) ?? this.sessionBindingRepository.findByRawStoreRef(session.provider, session.rawStoreRef);
638
+ const pendingDuplicate = exactExisting
639
+ ?? findClaudePendingDiscoveryDuplicate(session, existingWorkspaceSessions, claimedPendingSessionIds);
640
+ const existing = exactExisting ?? (pendingDuplicate
641
+ ? this.sessionBindingRepository.findBySessionId(pendingDuplicate.sessionId)
642
+ : null);
643
+ if (pendingDuplicate && !exactExisting) {
644
+ claimedPendingSessionIds.add(pendingDuplicate.sessionId);
645
+ }
632
646
  const currentSnapshot = existing
633
647
  ? this.sessionStatusSnapshotRepository.findBySessionId(existing.sessionId)
634
648
  : null;
@@ -746,6 +760,14 @@ export class SessionHistoryService {
746
760
  }
747
761
  }
748
762
  async readPage(sessionId, provider, providerSessionId, rawStoreRef, cursor, limit, direction = "forward", knownTotalMessageCount = null) {
763
+ if (shouldShortCircuitClaudePendingHistory(provider, providerSessionId, rawStoreRef)) {
764
+ return {
765
+ messages: [],
766
+ cursor,
767
+ nextCursor: null,
768
+ total: 0
769
+ };
770
+ }
749
771
  if (shouldShortCircuitMissingSyntheticCodexHistory(provider, rawStoreRef)) {
750
772
  return {
751
773
  messages: [],
@@ -838,30 +860,7 @@ export class SessionHistoryService {
838
860
  while (!isClosed()) {
839
861
  const binding = this.getBindingOrThrow(sessionId);
840
862
  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
- }
863
+ await this.publishHistoryEnvelope(sessionId, binding, page, sentMessageIds, onEnvelope, envelopeType);
865
864
  currentCursor = page.cursor;
866
865
  if (!page.nextCursor) {
867
866
  return currentCursor;
@@ -869,6 +868,40 @@ export class SessionHistoryService {
869
868
  }
870
869
  return currentCursor;
871
870
  }
871
+ async pullRecentSessionHistory(sessionId, limit, sentMessageIds, onEnvelope, envelopeType) {
872
+ const binding = this.getBindingOrThrow(sessionId);
873
+ const knownTotalMessageCount = this.sessionIndexRepository.findIndexRecordBySessionId(sessionId)?.messageCount ?? null;
874
+ const page = await this.readPage(sessionId, binding.provider, binding.providerSessionId, binding.rawStoreRef, null, limit, "backward", knownTotalMessageCount);
875
+ await this.publishHistoryEnvelope(sessionId, binding, page, sentMessageIds, onEnvelope, envelopeType);
876
+ return page.cursor;
877
+ }
878
+ async publishHistoryEnvelope(sessionId, binding, page, sentMessageIds, onEnvelope, envelopeType) {
879
+ const messages = page.messages.filter((message) => {
880
+ if (sentMessageIds.has(message.messageId)) {
881
+ return false;
882
+ }
883
+ sentMessageIds.add(message.messageId);
884
+ return true;
885
+ });
886
+ if (messages.length === 0) {
887
+ return;
888
+ }
889
+ await this.syncSessionTitleFromProvider(sessionId, binding);
890
+ this.upsertSnapshot(sessionId, {
891
+ syncStatus: "idle",
892
+ syncCursor: page.cursor,
893
+ lastSyncAt: nowIso(),
894
+ lastErrorCode: null,
895
+ lastErrorDetail: null,
896
+ resumedAt: this.sessionStatusSnapshotRepository.findBySessionId(sessionId)?.resumedAt ?? null
897
+ });
898
+ await onEnvelope({
899
+ type: envelopeType,
900
+ sessionId,
901
+ cursor: page.cursor,
902
+ messages
903
+ });
904
+ }
872
905
  async syncSessionTitleFromProvider(sessionId, binding) {
873
906
  const currentIndex = this.sessionIndexRepository.findIndexRecordBySessionId(sessionId);
874
907
  if (!currentIndex) {
@@ -1214,7 +1247,9 @@ export class SessionHistoryService {
1214
1247
  .run(sessionId);
1215
1248
  }
1216
1249
  buildKnownSessionSummaries(sessions, workspacePath) {
1217
- return sessions.map((session) => {
1250
+ return sessions
1251
+ .filter((session) => !shouldSkipClaudePendingBinding(session))
1252
+ .map((session) => {
1218
1253
  const stats = safeStat(session.rawStoreRef);
1219
1254
  return {
1220
1255
  provider: session.provider,
@@ -1439,6 +1474,18 @@ function pickLaterIso(left, right) {
1439
1474
  function buildProviderSessionKey(provider, providerSessionId) {
1440
1475
  return `${provider}::${providerSessionId}`;
1441
1476
  }
1477
+ function normalizeSessionBindingSnapshot(sessionId, snapshot) {
1478
+ if (snapshot.provider !== "claude-code" ||
1479
+ !(isPendingBindingValue(snapshot.providerSessionId) ||
1480
+ isClaudePendingRuntimeRawStoreRef(snapshot.rawStoreRef))) {
1481
+ return snapshot;
1482
+ }
1483
+ return {
1484
+ provider: snapshot.provider,
1485
+ providerSessionId: buildPendingBindingValue("claude-code", sessionId),
1486
+ rawStoreRef: buildPendingBindingValue("claude-code", sessionId)
1487
+ };
1488
+ }
1442
1489
  function shouldSkipClaudePendingBinding(binding) {
1443
1490
  if (binding.provider !== "claude-code") {
1444
1491
  return false;
@@ -1446,12 +1493,82 @@ function shouldSkipClaudePendingBinding(binding) {
1446
1493
  if (isPendingBindingValue(binding.providerSessionId)) {
1447
1494
  return true;
1448
1495
  }
1449
- const normalizedRawStoreRef = binding.rawStoreRef.replaceAll("\\", "/").toLowerCase();
1450
- return normalizedRawStoreRef.includes("/.pending-");
1496
+ return isClaudePendingRuntimeRawStoreRef(binding.rawStoreRef);
1451
1497
  }
1452
1498
  function isPendingBindingValue(value) {
1453
1499
  return value.trim().toLowerCase().startsWith("pending://");
1454
1500
  }
1501
+ function buildPendingBindingValue(provider, sessionId) {
1502
+ return `pending://${provider}/${sessionId}`;
1503
+ }
1504
+ function isClaudePendingRuntimeRawStoreRef(rawStoreRef) {
1505
+ const normalizedRawStoreRef = rawStoreRef.replaceAll("\\", "/").toLowerCase();
1506
+ return normalizedRawStoreRef.includes("/.pending-");
1507
+ }
1508
+ function shouldShortCircuitClaudePendingHistory(provider, providerSessionId, rawStoreRef) {
1509
+ if (provider !== "claude-code") {
1510
+ return false;
1511
+ }
1512
+ return isPendingBindingValue(providerSessionId) || isPendingBindingValue(rawStoreRef);
1513
+ }
1514
+ function findClaudePendingDiscoveryDuplicate(session, existingSessions, claimedSessionIds) {
1515
+ if (session.provider !== "claude-code") {
1516
+ return null;
1517
+ }
1518
+ if (isPendingBindingValue(session.providerSessionId)
1519
+ || session.rawStoreRef.replaceAll("\\", "/").toLowerCase().includes("/.pending-")) {
1520
+ return null;
1521
+ }
1522
+ const comparableTitle = normalizeClaudeComparableTitle(session.title);
1523
+ if (!comparableTitle) {
1524
+ return null;
1525
+ }
1526
+ const titleMatchedCandidates = existingSessions.filter((item) => {
1527
+ if (claimedSessionIds.has(item.sessionId)) {
1528
+ return false;
1529
+ }
1530
+ if (item.provider !== "claude-code" || !shouldSkipClaudePendingBinding(item)) {
1531
+ return false;
1532
+ }
1533
+ if (normalizeClaudeComparableTitle(item.title) !== comparableTitle) {
1534
+ return false;
1535
+ }
1536
+ return isCloseClaudeSessionTimestamp(item.lastMessageAt ?? item.createdAt, session.lastMessageAt);
1537
+ });
1538
+ if (titleMatchedCandidates.length === 1) {
1539
+ return titleMatchedCandidates[0];
1540
+ }
1541
+ const activePendingCandidates = existingSessions.filter((item) => {
1542
+ if (claimedSessionIds.has(item.sessionId)) {
1543
+ return false;
1544
+ }
1545
+ if (item.provider !== "claude-code" || !shouldSkipClaudePendingBinding(item)) {
1546
+ return false;
1547
+ }
1548
+ if (item.activitySource !== "runtime") {
1549
+ return false;
1550
+ }
1551
+ if (item.runningState !== "starting" && item.runningState !== "running") {
1552
+ return false;
1553
+ }
1554
+ return isCloseClaudeSessionTimestamp(item.lastMessageAt ?? item.lastEventAt ?? item.createdAt, session.lastMessageAt);
1555
+ });
1556
+ return activePendingCandidates.length === 1 ? activePendingCandidates[0] : null;
1557
+ }
1558
+ function normalizeClaudeComparableTitle(title) {
1559
+ return title?.trim().replace(/\s+/g, " ").toLowerCase() ?? "";
1560
+ }
1561
+ function isCloseClaudeSessionTimestamp(left, right, maxGapMs = 2 * 60 * 1000) {
1562
+ if (!left || !right) {
1563
+ return true;
1564
+ }
1565
+ const leftAt = Date.parse(left);
1566
+ const rightAt = Date.parse(right);
1567
+ if (!Number.isFinite(leftAt) || !Number.isFinite(rightAt)) {
1568
+ return true;
1569
+ }
1570
+ return Math.abs(leftAt - rightAt) <= maxGapMs;
1571
+ }
1455
1572
  function resolveDiscoveredArchiveState(existingArchived, discoveredArchived) {
1456
1573
  if (existingArchived) {
1457
1574
  return true;