@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.
- package/dist/public/assets/TerminalPage-CVG1cGAJ.js +55 -0
- package/dist/public/assets/index-BUPByQPG.css +1 -0
- package/dist/public/assets/index-D1CwTkI2.js +106 -0
- package/dist/public/index.html +2 -2
- package/dist/server/config/env.js +51 -7
- package/dist/server/config/env.js.map +1 -1
- package/dist/server/modules/sessions/session-history-service.d.ts +4 -1
- package/dist/server/modules/sessions/session-history-service.js +152 -35
- package/dist/server/modules/sessions/session-history-service.js.map +1 -1
- package/dist/server/modules/sessions/session-live-runtime-service.js +4 -0
- package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
- package/dist/server/ws/ws-server.js +55 -3
- 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 +65 -6
- package/node_modules/@codingns/session-sync-core/dist/claude-message-utils.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +36 -5
- package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js +56 -7
- package/node_modules/@codingns/session-sync-core/dist/providers/opencode-shared.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +32 -5
- 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.js +33 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +1 -0
- package/package.json +5 -2
- package/scripts/postinstall.mjs +211 -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
package/dist/public/index.html
CHANGED
|
@@ -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-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
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
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAyB1E,MAAM,UAAU,iBAAiB,CAAC,YAAiC,EAAE;IACnE,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,eAAe,GACnB,SAAS,CAAC,eAAe;QACzB,OAAO,CAAC,GAAG,CAAC,0BAA0B;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,YAAY,GAChB,SAAS,CAAC,YAAY;QACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACvD,MAAM,cAAc,GAClB,SAAS,CAAC,cAAc;QACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB;QACrC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,mBAAmB,CACtC,SAAS,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAC5D,OAAO,CACR,CAAC;IACF,MAAM,eAAe,GAAG,sBAAsB,CAC5C,SAAS,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAClE,OAAO,CACR,CAAC;IACF,MAAM,yBAAyB,GAAG,qBAAqB,CACrD,SAAS,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,IAAI,CAC5E,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS;QAC9D,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC;QACnE,QAAQ,EACN,SAAS,CAAC,QAAQ;YAClB,kBAAkB,CAChB,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAC1F;QACH,YAAY;QACZ,eAAe,EAAE,yBAAyB,IAAI,EAAE;QAChD,eAAe;QACf,uBAAuB,EACrB,SAAS,CAAC,uBAAuB;eAC9B,IAAI,uBAAuB,CAAC;gBAC7B,iBAAiB,EAAE,yBAAyB;gBAC5C,WAAW,EAAE,eAAe;aAC7B,CAAC;QACJ,eAAe;QACf,cAAc;QACd,cAAc,EACZ,SAAS,CAAC,cAAc;YACxB,CAAE,OAAO,CAAC,GAAG,CAAC,wBAA0D,IAAI,QAAQ,CAAC;QACvF,mBAAmB,EACjB,SAAS,CAAC,mBAAmB;YAC7B,OAAO,CAAC,GAAG,CAAC,8BAA8B;YAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC;QAC3C,qBAAqB,EACnB,SAAS,CAAC,qBAAqB;YAC/B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,UAAU,CAAC;QAC7D,sBAAsB,EACpB,SAAS,CAAC,sBAAsB;YAChC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,UAAU,CAAC;QAC9D,0BAA0B,EACxB,SAAS,CAAC,0BAA0B;YACpC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,KAAK,CAAC;QAC7D,iBAAiB,EACf,SAAS,CAAC,iBAAiB;YAC3B,OAAO,CAAC,GAAG,CAAC,yBAAyB;YACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;QAC/B,YAAY,EACV,SAAS,CAAC,YAAY;YACtB,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC9B,YAAY;QACZ,qBAAqB,EACnB,SAAS,CAAC,qBAAqB;YAC/B,OAAO,CAAC,GAAG,CAAC,0BAA0B;YACtC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACrF,uBAAuB,EACrB,SAAS,CAAC,uBAAuB;YACjC,OAAO,CAAC,GAAG,CAAC,mCAAmC;YAC/C,sBAAsB;QACxB,kBAAkB,EAChB,SAAS,CAAC,kBAAkB;YAC5B,OAAO,CAAC,GAAG,CAAC,8BAA8B;YAC1C,4BAA4B;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEtD,uDAAuD;IACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrF,CAAC;AAED,SAAS,mBAAmB,CAAC,cAAkC,EAAE,OAAe;IAC9E,MAAM,wBAAwB,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC;IAExD,IAAI,wBAAwB,EAAE,CAAC;QAC7B,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAED,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,4BAA4B,CAAC,CAAC;IAEjF,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,iBAAiB,GAAG,WAAW,CAAC;QACpC,OAAO,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACzC,iBAAiB,EAAE;KACpB,CAAC,CAAC;IACH,MAAM,iBAAiB,GAAG,CAAC,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAC3F,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC7C,CAAC,CAAC;YACA,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,CAAC;gBACpD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,CAAC;gBACpD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC;gBAChD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,iBAAiB,EAAE,WAAW,CAAC;gBAClD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,iBAAiB,EAAE,WAAW,CAAC;gBAClD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,iBAAiB,EAAE,OAAO,CAAC;aAC/C,CAAC;YACF,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBACxC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAiB,EAAE,KAAK,EAAE,WAAW,CAAC;gBAC9D,CAAC,CAAC,IAAI;YACR,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBACxC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAiB,EAAE,KAAK,EAAE,WAAW,CAAC;gBAC9D,CAAC,CAAC,IAAI;SACT;QACD,CAAC,CAAC;YACA,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC;gBAChD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,iBAAiB,EAAE,OAAO,CAAC;aAC/C,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC;YAC7F,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;YAC5C,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,IAAI;SAC1F,CAAC;IAEJ,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,sBAAsB,CAAC,cAAkC,EAAE,OAAe;IACjF,MAAM,wBAAwB,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC;IAExD,IAAI,wBAAwB,EAAE,CAAC;QAC7B,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAED,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACrE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAiB,EAAE,KAAK,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,0BAA0B,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAChF,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAsB,EAAE,UAAU,CAAC;QAC3D,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC7C,CAAC,CAAC;YACA,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI;YAC7F,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,CAAC;YACnE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,CAAC;YACnE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC;YAClD,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI;YAC7E,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI;SAC9E;QACD,CAAC,CAAC;YACA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC;SAChD,CAAC;IAEJ,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,uBAAuB,CAAC,UAAkB;IACjD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAEzD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC1D,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAgC;IAC7D,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACjC,OAAO,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAwB;IAClD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,MAAgB;IACnC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAiB;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -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
|
-
|
|
401
|
-
.
|
|
402
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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;
|