@very_aq/codex-cli-web 0.0.10 → 0.0.12
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/package.json +7 -1
- package/server/dist/history/query/fileChangeDetails.d.ts +21 -0
- package/server/dist/history/query/fileChangeDetails.js +212 -0
- package/server/dist/history/query/fileChangeDetails.js.map +1 -0
- package/server/dist/history/retention/historyRetentionJob.d.ts +32 -0
- package/server/dist/history/retention/historyRetentionJob.js +45 -0
- package/server/dist/history/retention/historyRetentionJob.js.map +1 -0
- package/server/dist/workspace/pathCompare.d.ts +2 -0
- package/server/dist/workspace/pathCompare.js +50 -0
- package/server/dist/workspace/pathCompare.js.map +1 -0
- package/server/dist/workspace/threadListVisibility.js +2 -1
- package/server/dist/workspace/threadListVisibility.js.map +1 -1
- package/web/dist/assets/{index-B87op2EF.js → index-sCkfbE7U.js} +55 -55
- package/web/dist/index.html +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@very_aq/codex-cli-web",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"private": false,
|
|
5
5
|
"bin": {
|
|
6
6
|
"ccw": "bin/ccw.js"
|
|
@@ -28,7 +28,13 @@
|
|
|
28
28
|
"better-sqlite3": "^11.8.1",
|
|
29
29
|
"busboy": "^1.6.0",
|
|
30
30
|
"express": "^4.19.2",
|
|
31
|
+
"micromark-util-sanitize-uri": "^2.0.1",
|
|
32
|
+
"remark-breaks": "^4.0.0",
|
|
33
|
+
"remark-gfm": "^4.0.1",
|
|
34
|
+
"remark-parse": "^11.0.0",
|
|
35
|
+
"remark-rehype": "^11.1.2",
|
|
31
36
|
"socket.io": "^4.8.3",
|
|
37
|
+
"unified": "^11.0.5",
|
|
32
38
|
"ws": "^8.17.1"
|
|
33
39
|
},
|
|
34
40
|
"devDependencies": {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RawEventRecord } from "../sqlite/sqliteHistoryStore";
|
|
2
|
+
/**
|
|
3
|
+
* 历史 file_change 单文件条目(与 Web DiffBlock 所需字段保持一致)。
|
|
4
|
+
*/
|
|
5
|
+
export type HistoryFileChange = {
|
|
6
|
+
path: string;
|
|
7
|
+
kind: string;
|
|
8
|
+
diff: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* 历史 file_change 详情结构:标题 + 文件列表 + 可选工具输出。
|
|
12
|
+
*/
|
|
13
|
+
export type HistoryFileChangeDetail = {
|
|
14
|
+
title: string;
|
|
15
|
+
changes: HistoryFileChange[];
|
|
16
|
+
output?: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* 从 raw_events 重建 file_change 详情映射(messageId -> detail)。
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildFileChangeDetailByMessageId(rawEvents: RawEventRecord[]): Map<string, HistoryFileChangeDetail>;
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildFileChangeDetailByMessageId = buildFileChangeDetailByMessageId;
|
|
4
|
+
const extractIds_1 = require("../projector/extractIds");
|
|
5
|
+
/**
|
|
6
|
+
* 安全解析 raw_event 的 payload_json。
|
|
7
|
+
*/
|
|
8
|
+
function parseRawEventPayload(rawEvent) {
|
|
9
|
+
const rawPayloadJson = String(rawEvent.payloadJson ?? "").trim();
|
|
10
|
+
if (!rawPayloadJson)
|
|
11
|
+
return null;
|
|
12
|
+
try {
|
|
13
|
+
const parsedPayload = JSON.parse(rawPayloadJson);
|
|
14
|
+
const method = typeof parsedPayload.method === "string" ? parsedPayload.method.trim() : "";
|
|
15
|
+
if (!method)
|
|
16
|
+
return null;
|
|
17
|
+
return { method, params: parsedPayload.params };
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 归一化候选字符串;空值返回空串。
|
|
25
|
+
*/
|
|
26
|
+
function normalizeStringCandidate(rawCandidate) {
|
|
27
|
+
if (typeof rawCandidate !== "string")
|
|
28
|
+
return "";
|
|
29
|
+
return rawCandidate.trim();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 归一化 file change path,兼容常见字段变体与嵌套对象。
|
|
33
|
+
*/
|
|
34
|
+
function normalizeFileChangePath(change) {
|
|
35
|
+
const rawPath = change.path ??
|
|
36
|
+
change.file ??
|
|
37
|
+
change.filename ??
|
|
38
|
+
change.target?.path ??
|
|
39
|
+
change.target?.file ??
|
|
40
|
+
change.source?.path ??
|
|
41
|
+
change.source?.file;
|
|
42
|
+
const directPath = normalizeStringCandidate(rawPath);
|
|
43
|
+
if (directPath)
|
|
44
|
+
return directPath;
|
|
45
|
+
if (rawPath && typeof rawPath === "object") {
|
|
46
|
+
const nestedPathObject = rawPath;
|
|
47
|
+
const nestedPath = normalizeStringCandidate(nestedPathObject.path) ||
|
|
48
|
+
normalizeStringCandidate(nestedPathObject.file) ||
|
|
49
|
+
normalizeStringCandidate(nestedPathObject.filename) ||
|
|
50
|
+
normalizeStringCandidate(nestedPathObject.value) ||
|
|
51
|
+
normalizeStringCandidate(nestedPathObject.text);
|
|
52
|
+
if (nestedPath)
|
|
53
|
+
return nestedPath;
|
|
54
|
+
}
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 归一化 file change kind,避免对象值直接转成 `[object Object]`。
|
|
59
|
+
*/
|
|
60
|
+
function normalizeFileChangeKind(change) {
|
|
61
|
+
const rawKind = change.kind ?? change.type ?? change.action ?? change.operation ?? change.op ?? change.status;
|
|
62
|
+
const directKind = normalizeStringCandidate(rawKind);
|
|
63
|
+
if (directKind)
|
|
64
|
+
return directKind;
|
|
65
|
+
if (rawKind && typeof rawKind === "object") {
|
|
66
|
+
const nestedKindObject = rawKind;
|
|
67
|
+
const nestedKind = normalizeStringCandidate(nestedKindObject.kind) ||
|
|
68
|
+
normalizeStringCandidate(nestedKindObject.type) ||
|
|
69
|
+
normalizeStringCandidate(nestedKindObject.action) ||
|
|
70
|
+
normalizeStringCandidate(nestedKindObject.operation) ||
|
|
71
|
+
normalizeStringCandidate(nestedKindObject.op) ||
|
|
72
|
+
normalizeStringCandidate(nestedKindObject.status) ||
|
|
73
|
+
normalizeStringCandidate(nestedKindObject.value) ||
|
|
74
|
+
normalizeStringCandidate(nestedKindObject.name) ||
|
|
75
|
+
normalizeStringCandidate(nestedKindObject.label) ||
|
|
76
|
+
normalizeStringCandidate(nestedKindObject.text);
|
|
77
|
+
if (nestedKind)
|
|
78
|
+
return nestedKind;
|
|
79
|
+
const truthyKey = Object.entries(nestedKindObject).find((entry) => entry[1] === true)?.[0];
|
|
80
|
+
const normalizedTruthyKey = normalizeStringCandidate(truthyKey);
|
|
81
|
+
if (normalizedTruthyKey)
|
|
82
|
+
return normalizedTruthyKey;
|
|
83
|
+
}
|
|
84
|
+
return "change";
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 把未知 changes 数组归一化为稳定结构。
|
|
88
|
+
*/
|
|
89
|
+
function normalizeFileChanges(rawChanges) {
|
|
90
|
+
const rawArray = Array.isArray(rawChanges) ? rawChanges : [];
|
|
91
|
+
const normalizedChanges = [];
|
|
92
|
+
for (const rawChange of rawArray) {
|
|
93
|
+
const changeRecord = rawChange ?? {};
|
|
94
|
+
const path = normalizeFileChangePath(changeRecord);
|
|
95
|
+
if (!path)
|
|
96
|
+
continue;
|
|
97
|
+
const kind = normalizeFileChangeKind(changeRecord);
|
|
98
|
+
const diff = typeof rawChange?.diff === "string"
|
|
99
|
+
? String(rawChange.diff)
|
|
100
|
+
: typeof rawChange?.patch === "string"
|
|
101
|
+
? String(rawChange.patch)
|
|
102
|
+
: typeof rawChange?.unifiedDiff === "string"
|
|
103
|
+
? String(rawChange.unifiedDiff)
|
|
104
|
+
: "";
|
|
105
|
+
normalizedChanges.push({ path, kind, diff });
|
|
106
|
+
}
|
|
107
|
+
return normalizedChanges;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 从未知对象中抽取文件变更列表。
|
|
111
|
+
*/
|
|
112
|
+
function extractFileChangesFromAny(raw) {
|
|
113
|
+
const payload = raw;
|
|
114
|
+
if (!payload)
|
|
115
|
+
return [];
|
|
116
|
+
return normalizeFileChanges(payload?.changes ??
|
|
117
|
+
payload?.diff?.changes ??
|
|
118
|
+
payload?.patch?.changes ??
|
|
119
|
+
payload?.fileChanges ??
|
|
120
|
+
payload?.file_changes ??
|
|
121
|
+
payload?.files ??
|
|
122
|
+
payload?.edits ??
|
|
123
|
+
[]);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 判断 item.type 是否可视为 file change 类型。
|
|
127
|
+
*/
|
|
128
|
+
function isFileChangeItemType(rawItemType) {
|
|
129
|
+
const normalizedItemType = String(rawItemType ?? "").trim().toLowerCase();
|
|
130
|
+
if (!normalizedItemType)
|
|
131
|
+
return false;
|
|
132
|
+
if (normalizedItemType === "filechange" || normalizedItemType === "file_change")
|
|
133
|
+
return true;
|
|
134
|
+
return normalizedItemType.includes("file") || normalizedItemType.includes("patch");
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 判断 method 是否为 file change 增量输出事件。
|
|
138
|
+
*/
|
|
139
|
+
function isFileChangeDeltaMethod(method) {
|
|
140
|
+
const normalizedMethod = method.trim().toLowerCase();
|
|
141
|
+
if (!normalizedMethod)
|
|
142
|
+
return false;
|
|
143
|
+
if (normalizedMethod === "item/filechange/outputdelta")
|
|
144
|
+
return true;
|
|
145
|
+
return normalizedMethod.startsWith("item/") && normalizedMethod.includes("filechange") && normalizedMethod.endsWith("delta");
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 解析 file change 展示标题,优先 title,再退回 text,最后使用稳定默认值。
|
|
149
|
+
*/
|
|
150
|
+
function resolveFileChangeTitle(rawItem) {
|
|
151
|
+
const item = (rawItem ?? {});
|
|
152
|
+
const title = normalizeStringCandidate(item.title);
|
|
153
|
+
if (title)
|
|
154
|
+
return title;
|
|
155
|
+
const text = normalizeStringCandidate(item.text);
|
|
156
|
+
if (text)
|
|
157
|
+
return text;
|
|
158
|
+
return "文件变更";
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* 获取或初始化 messageId 对应的 file change 详情。
|
|
162
|
+
*/
|
|
163
|
+
function getOrCreateDetail(detailByMessageId, messageId) {
|
|
164
|
+
const existingDetail = detailByMessageId.get(messageId);
|
|
165
|
+
if (existingDetail)
|
|
166
|
+
return existingDetail;
|
|
167
|
+
const nextDetail = { title: "文件变更", changes: [] };
|
|
168
|
+
detailByMessageId.set(messageId, nextDetail);
|
|
169
|
+
return nextDetail;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 从 raw_events 重建 file_change 详情映射(messageId -> detail)。
|
|
173
|
+
*/
|
|
174
|
+
function buildFileChangeDetailByMessageId(rawEvents) {
|
|
175
|
+
const detailByMessageId = new Map();
|
|
176
|
+
for (const rawEvent of rawEvents) {
|
|
177
|
+
const parsedPayload = parseRawEventPayload(rawEvent);
|
|
178
|
+
if (!parsedPayload)
|
|
179
|
+
continue;
|
|
180
|
+
const method = parsedPayload.method;
|
|
181
|
+
const params = parsedPayload.params;
|
|
182
|
+
if (method === "item/started" || method === "item/completed") {
|
|
183
|
+
const item = params?.item;
|
|
184
|
+
const rawItemType = item?.type ?? params?.itemType ?? params?.item_type;
|
|
185
|
+
if (!isFileChangeItemType(rawItemType))
|
|
186
|
+
continue;
|
|
187
|
+
const turnId = (0, extractIds_1.extractTurnId)(params);
|
|
188
|
+
const itemId = (0, extractIds_1.extractItemId)(params);
|
|
189
|
+
const messageId = (0, extractIds_1.buildFileChangeMessageId)(turnId, itemId);
|
|
190
|
+
if (!messageId)
|
|
191
|
+
continue;
|
|
192
|
+
const detail = getOrCreateDetail(detailByMessageId, messageId);
|
|
193
|
+
detail.title = resolveFileChangeTitle(item);
|
|
194
|
+
const extractedChanges = extractFileChangesFromAny(item ?? params);
|
|
195
|
+
if (extractedChanges.length)
|
|
196
|
+
detail.changes = extractedChanges;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (!isFileChangeDeltaMethod(method))
|
|
200
|
+
continue;
|
|
201
|
+
const turnId = (0, extractIds_1.extractTurnId)(params);
|
|
202
|
+
const itemId = (0, extractIds_1.extractItemId)(params);
|
|
203
|
+
const messageId = (0, extractIds_1.buildFileChangeMessageId)(turnId, itemId);
|
|
204
|
+
const deltaText = String(params?.delta ?? "");
|
|
205
|
+
if (!messageId || !deltaText)
|
|
206
|
+
continue;
|
|
207
|
+
const detail = getOrCreateDetail(detailByMessageId, messageId);
|
|
208
|
+
detail.output = `${detail.output ?? ""}${deltaText}`;
|
|
209
|
+
}
|
|
210
|
+
return detailByMessageId;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=fileChangeDetails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileChangeDetails.js","sourceRoot":"","sources":["../../../src/history/query/fileChangeDetails.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retention 任务依赖的最小存储接口。
|
|
3
|
+
*/
|
|
4
|
+
export type HistoryRetentionStore = {
|
|
5
|
+
deleteRawEventsOlderThan: (cutoffMs: number) => number;
|
|
6
|
+
deleteChunksOlderThan: (cutoffMs: number) => number;
|
|
7
|
+
incrementalVacuum: () => void;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Retention 任务构造参数。
|
|
11
|
+
*/
|
|
12
|
+
export type HistoryRetentionJobOptions = {
|
|
13
|
+
store: HistoryRetentionStore;
|
|
14
|
+
rawRetentionDays: number;
|
|
15
|
+
chunkRetentionDays: number;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* 历史数据保留任务:
|
|
19
|
+
* - 删除过期 raw_events;
|
|
20
|
+
* - 删除过期 message_chunks;
|
|
21
|
+
* - 执行增量 vacuum。
|
|
22
|
+
*/
|
|
23
|
+
export declare class HistoryRetentionJob {
|
|
24
|
+
private readonly options;
|
|
25
|
+
private readonly rawRetentionDays;
|
|
26
|
+
private readonly chunkRetentionDays;
|
|
27
|
+
constructor(options: HistoryRetentionJobOptions);
|
|
28
|
+
/**
|
|
29
|
+
* 执行一次清理。
|
|
30
|
+
*/
|
|
31
|
+
runOnce(nowMs: number): void;
|
|
32
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HistoryRetentionJob = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 一天对应的毫秒数。
|
|
6
|
+
*/
|
|
7
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
8
|
+
/**
|
|
9
|
+
* 规范化保留天数,非法值回落到 1 天。
|
|
10
|
+
*/
|
|
11
|
+
function normalizeRetentionDays(rawDays) {
|
|
12
|
+
const parsedDays = Number(rawDays);
|
|
13
|
+
if (!Number.isFinite(parsedDays))
|
|
14
|
+
return 1;
|
|
15
|
+
return Math.max(1, Math.floor(parsedDays));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 历史数据保留任务:
|
|
19
|
+
* - 删除过期 raw_events;
|
|
20
|
+
* - 删除过期 message_chunks;
|
|
21
|
+
* - 执行增量 vacuum。
|
|
22
|
+
*/
|
|
23
|
+
class HistoryRetentionJob {
|
|
24
|
+
options;
|
|
25
|
+
rawRetentionDays;
|
|
26
|
+
chunkRetentionDays;
|
|
27
|
+
constructor(options) {
|
|
28
|
+
this.options = options;
|
|
29
|
+
this.rawRetentionDays = normalizeRetentionDays(options.rawRetentionDays);
|
|
30
|
+
this.chunkRetentionDays = normalizeRetentionDays(options.chunkRetentionDays);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 执行一次清理。
|
|
34
|
+
*/
|
|
35
|
+
runOnce(nowMs) {
|
|
36
|
+
const normalizedNowMs = Math.max(0, Math.floor(Number(nowMs)));
|
|
37
|
+
const rawCutoffMs = normalizedNowMs - this.rawRetentionDays * DAY_MS;
|
|
38
|
+
const chunkCutoffMs = normalizedNowMs - this.chunkRetentionDays * DAY_MS;
|
|
39
|
+
this.options.store.deleteRawEventsOlderThan(rawCutoffMs);
|
|
40
|
+
this.options.store.deleteChunksOlderThan(chunkCutoffMs);
|
|
41
|
+
this.options.store.incrementalVacuum();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.HistoryRetentionJob = HistoryRetentionJob;
|
|
45
|
+
//# sourceMappingURL=historyRetentionJob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historyRetentionJob.js","sourceRoot":"","sources":["../../../src/history/retention/historyRetentionJob.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAoBnC;;GAEG;AACH,SAAS,sBAAsB,CAAC,OAAe;IAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAa,mBAAmB;IAID;IAHZ,gBAAgB,CAAS;IACzB,kBAAkB,CAAS;IAE5C,YAA6B,OAAmC;QAAnC,YAAO,GAAP,OAAO,CAA4B;QAC9D,IAAI,CAAC,gBAAgB,GAAG,sBAAsB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACzE,IAAI,CAAC,kBAAkB,GAAG,sBAAsB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAa;QACnB,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,eAAe,GAAG,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;QACrE,MAAM,aAAa,GAAG,eAAe,GAAG,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC;QACzE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACzC,CAAC;CACF;AApBD,kDAoBC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.toExactPathKey = toExactPathKey;
|
|
7
|
+
exports.isExactPathEqual = isExactPathEqual;
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
function isWindowsLikePath(value) {
|
|
10
|
+
const trimmed = String(value ?? "").trim();
|
|
11
|
+
if (!trimmed)
|
|
12
|
+
return false;
|
|
13
|
+
if (trimmed.startsWith("\\\\"))
|
|
14
|
+
return true;
|
|
15
|
+
if (trimmed.startsWith("//"))
|
|
16
|
+
return true;
|
|
17
|
+
return /^[a-zA-Z]:[\\/]/.test(trimmed) || /^[a-zA-Z]:$/.test(trimmed);
|
|
18
|
+
}
|
|
19
|
+
function stripTrailingSeparatorsNonRootWin32(value) {
|
|
20
|
+
const normalized = String(value ?? "");
|
|
21
|
+
if (/^[a-zA-Z]:\\$/.test(normalized))
|
|
22
|
+
return normalized;
|
|
23
|
+
return normalized.replace(/[\\\/]+$/g, "");
|
|
24
|
+
}
|
|
25
|
+
function stripTrailingSlashNonRootPosix(value) {
|
|
26
|
+
const normalized = String(value ?? "");
|
|
27
|
+
if (normalized === "/")
|
|
28
|
+
return "/";
|
|
29
|
+
return normalized.replace(/\/+$/g, "");
|
|
30
|
+
}
|
|
31
|
+
function toExactPathKey(rawPath) {
|
|
32
|
+
const trimmed = String(rawPath ?? "").trim();
|
|
33
|
+
if (!trimmed)
|
|
34
|
+
return "";
|
|
35
|
+
if (isWindowsLikePath(trimmed)) {
|
|
36
|
+
const resolved = node_path_1.default.win32.resolve(trimmed);
|
|
37
|
+
const normalized = node_path_1.default.win32.normalize(resolved);
|
|
38
|
+
const withoutTrailing = stripTrailingSeparatorsNonRootWin32(normalized);
|
|
39
|
+
return withoutTrailing.toLowerCase();
|
|
40
|
+
}
|
|
41
|
+
const normalized = node_path_1.default.posix.normalize(trimmed);
|
|
42
|
+
const withoutTrailing = stripTrailingSlashNonRootPosix(normalized);
|
|
43
|
+
return withoutTrailing;
|
|
44
|
+
}
|
|
45
|
+
function isExactPathEqual(left, right) {
|
|
46
|
+
const l = toExactPathKey(left);
|
|
47
|
+
const r = toExactPathKey(right);
|
|
48
|
+
return Boolean(l) && l === r;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=pathCompare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathCompare.js","sourceRoot":"","sources":["../../src/workspace/pathCompare.ts"],"names":[],"mappings":";;;;;AAsBA,wCAcC;AAED,4CAIC;AA1CD,0DAA6B;AAE7B,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,mCAAmC,CAAC,KAAa;IACxD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACvC,IAAI,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACxD,OAAO,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAa;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACvC,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IACnC,OAAO,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,cAAc,CAAC,OAAe;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,mBAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,mBAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,mCAAmC,CAAC,UAAU,CAAC,CAAC;QACxE,OAAO,eAAe,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,UAAU,GAAG,mBAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,8BAA8B,CAAC,UAAU,CAAC,CAAC;IACnE,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAY,EAAE,KAAa;IAC1D,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -12,6 +12,7 @@ exports.isThreadCwdVisibleToUser = isThreadCwdVisibleToUser;
|
|
|
12
12
|
exports.shouldIncludeThreadForList = shouldIncludeThreadForList;
|
|
13
13
|
const node_path_1 = __importDefault(require("node:path"));
|
|
14
14
|
const accessControl_1 = require("./accessControl");
|
|
15
|
+
const pathCompare_1 = require("./pathCompare");
|
|
15
16
|
// WS/HTTP 统一使用绝对路径 + 去重后的 workspace 列表,避免路径比较歧义。
|
|
16
17
|
function normalizeWorkspacePaths(workspaces) {
|
|
17
18
|
const seen = new Set();
|
|
@@ -99,6 +100,6 @@ function shouldIncludeThreadForList(input) {
|
|
|
99
100
|
if (!input.workspaceFilterCwd)
|
|
100
101
|
return true;
|
|
101
102
|
// 工作区语义按“线程 cwd == 选中 workspace cwd”处理,避免前缀误包含。
|
|
102
|
-
return normalizedThreadCwd
|
|
103
|
+
return (0, pathCompare_1.isExactPathEqual)(normalizedThreadCwd, input.workspaceFilterCwd);
|
|
103
104
|
}
|
|
104
105
|
//# sourceMappingURL=threadListVisibility.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threadListVisibility.js","sourceRoot":"","sources":["../../src/workspace/threadListVisibility.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"threadListVisibility.js","sourceRoot":"","sources":["../../src/workspace/threadListVisibility.ts"],"names":[],"mappings":"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"}
|