@yadsh/dsh-user-correction-miner 0.1.0
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/LICENSE +21 -0
- package/README.md +68 -0
- package/compatibility.json +16 -0
- package/cordis.patch.yml +4 -0
- package/lib/config.d.ts +109 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +80 -0
- package/lib/config.js.map +1 -0
- package/lib/dsh/commands.d.ts +25 -0
- package/lib/dsh/commands.d.ts.map +1 -0
- package/lib/dsh/commands.js +69 -0
- package/lib/dsh/commands.js.map +1 -0
- package/lib/dsh/lifecycle.d.ts +5 -0
- package/lib/dsh/lifecycle.d.ts.map +1 -0
- package/lib/dsh/lifecycle.js +10 -0
- package/lib/dsh/lifecycle.js.map +1 -0
- package/lib/dsh/plugin.d.ts +11 -0
- package/lib/dsh/plugin.d.ts.map +1 -0
- package/lib/dsh/plugin.js +58 -0
- package/lib/dsh/plugin.js.map +1 -0
- package/lib/dsh/sessions.d.ts +14 -0
- package/lib/dsh/sessions.d.ts.map +1 -0
- package/lib/dsh/sessions.js +27 -0
- package/lib/dsh/sessions.js.map +1 -0
- package/lib/dsh/storage.d.ts +108 -0
- package/lib/dsh/storage.d.ts.map +1 -0
- package/lib/dsh/storage.js +159 -0
- package/lib/dsh/storage.js.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/lib/mining/context-extractor.d.ts +9 -0
- package/lib/mining/context-extractor.d.ts.map +1 -0
- package/lib/mining/context-extractor.js +75 -0
- package/lib/mining/context-extractor.js.map +1 -0
- package/lib/mining/engine.d.ts +39 -0
- package/lib/mining/engine.d.ts.map +1 -0
- package/lib/mining/engine.js +241 -0
- package/lib/mining/engine.js.map +1 -0
- package/lib/mining/message-text.d.ts +4 -0
- package/lib/mining/message-text.d.ts.map +1 -0
- package/lib/mining/message-text.js +14 -0
- package/lib/mining/message-text.js.map +1 -0
- package/lib/mining/prefilter.d.ts +7 -0
- package/lib/mining/prefilter.d.ts.map +1 -0
- package/lib/mining/prefilter.js +39 -0
- package/lib/mining/prefilter.js.map +1 -0
- package/lib/mining/sanitize.d.ts +3 -0
- package/lib/mining/sanitize.d.ts.map +1 -0
- package/lib/mining/sanitize.js +13 -0
- package/lib/mining/sanitize.js.map +1 -0
- package/lib/mining/scanner.d.ts +14 -0
- package/lib/mining/scanner.d.ts.map +1 -0
- package/lib/mining/scanner.js +25 -0
- package/lib/mining/scanner.js.map +1 -0
- package/lib/mining/text-budget.d.ts +7 -0
- package/lib/mining/text-budget.d.ts.map +1 -0
- package/lib/mining/text-budget.js +34 -0
- package/lib/mining/text-budget.js.map +1 -0
- package/lib/types.d.ts +81 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/utils/hashing.d.ts +3 -0
- package/lib/utils/hashing.d.ts.map +1 -0
- package/lib/utils/hashing.js +8 -0
- package/lib/utils/hashing.js.map +1 -0
- package/lib/utils/workspace.d.ts +4 -0
- package/lib/utils/workspace.d.ts.map +1 -0
- package/lib/utils/workspace.js +14 -0
- package/lib/utils/workspace.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { correctionRecordId, sha256 } from "../utils/hashing.js";
|
|
2
|
+
import { workspaceKey } from "../utils/workspace.js";
|
|
3
|
+
import { isDirectUserMessage, messageText } from "./message-text.js";
|
|
4
|
+
import { prefilterCorrection } from "./prefilter.js";
|
|
5
|
+
import { boundText, redactSecrets } from "./sanitize.js";
|
|
6
|
+
import { scanSession } from "./scanner.js";
|
|
7
|
+
function emptyCursor(key) {
|
|
8
|
+
return { workspaceKey: key, sessionWatermarks: {}, updatedAt: 0 };
|
|
9
|
+
}
|
|
10
|
+
function abortReason(signal) {
|
|
11
|
+
return signal.reason instanceof Error ? signal.reason : new Error("The operation was aborted");
|
|
12
|
+
}
|
|
13
|
+
export class CorrectionMinerEngine {
|
|
14
|
+
source;
|
|
15
|
+
store;
|
|
16
|
+
config;
|
|
17
|
+
logger;
|
|
18
|
+
now;
|
|
19
|
+
pending = new Map();
|
|
20
|
+
workspaceQueues = new Map();
|
|
21
|
+
constructor(source, store, config, logger, now = Date.now) {
|
|
22
|
+
this.source = source;
|
|
23
|
+
this.store = store;
|
|
24
|
+
this.config = config;
|
|
25
|
+
this.logger = logger;
|
|
26
|
+
this.now = now;
|
|
27
|
+
}
|
|
28
|
+
scan(request, signal) {
|
|
29
|
+
const key = workspaceKey(request.cwd);
|
|
30
|
+
return this.enqueue(key, () => this.runHistoricalScan(request, signal));
|
|
31
|
+
}
|
|
32
|
+
observeEvent(session, event) {
|
|
33
|
+
if (!this.config.enabled)
|
|
34
|
+
return;
|
|
35
|
+
const observedAt = this.now();
|
|
36
|
+
this.evictExpired(observedAt);
|
|
37
|
+
const sessionId = String(session.id);
|
|
38
|
+
const current = this.pending.get(sessionId);
|
|
39
|
+
if (current !== undefined)
|
|
40
|
+
current.lastEventAt = observedAt;
|
|
41
|
+
if (event.type === "user/message" && isDirectUserMessage(event.data)) {
|
|
42
|
+
const result = prefilterCorrection(messageText(event.data));
|
|
43
|
+
if (result.matched) {
|
|
44
|
+
const pending = current ?? this.createPendingSession(sessionId, observedAt);
|
|
45
|
+
pending.eventSeqs.add(event.seq);
|
|
46
|
+
while (pending.eventSeqs.size > this.config.live.maxPendingEventsPerSession) {
|
|
47
|
+
const oldestEventSeq = pending.eventSeqs.values().next().value;
|
|
48
|
+
pending.eventSeqs.delete(oldestEventSeq);
|
|
49
|
+
this.warnPendingEviction("event-cap", sessionId, 1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (event.type === "turn/end")
|
|
55
|
+
this.scheduleLiveSession(session);
|
|
56
|
+
}
|
|
57
|
+
observeDisposed(session) {
|
|
58
|
+
if (!this.config.enabled)
|
|
59
|
+
return;
|
|
60
|
+
this.evictExpired(this.now());
|
|
61
|
+
this.scheduleLiveSession(session);
|
|
62
|
+
}
|
|
63
|
+
dispose() {
|
|
64
|
+
this.pending.clear();
|
|
65
|
+
}
|
|
66
|
+
count(cwd) {
|
|
67
|
+
return this.store.countCorrections(workspaceKey(cwd));
|
|
68
|
+
}
|
|
69
|
+
list(cwd, limit = 50) {
|
|
70
|
+
return this.store.listCorrections(workspaceKey(cwd), limit);
|
|
71
|
+
}
|
|
72
|
+
scheduleLiveSession(session) {
|
|
73
|
+
const sessionId = String(session.id);
|
|
74
|
+
const pending = this.pending.get(sessionId);
|
|
75
|
+
if ((pending?.eventSeqs.size ?? 0) === 0)
|
|
76
|
+
return;
|
|
77
|
+
this.pending.delete(sessionId);
|
|
78
|
+
const cwd = session.header.cwd;
|
|
79
|
+
if (cwd === undefined) {
|
|
80
|
+
this.warnPendingEviction("no-cwd", sessionId, pending?.eventSeqs.size ?? 0);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const snapshot = {
|
|
84
|
+
session: session.header,
|
|
85
|
+
events: session.events,
|
|
86
|
+
};
|
|
87
|
+
const key = workspaceKey(cwd);
|
|
88
|
+
void this.enqueue(key, () => this.runSnapshot(snapshot, key, true)).catch((error) => {
|
|
89
|
+
this.logger.warn("incremental_scan.failed", {
|
|
90
|
+
sessionId,
|
|
91
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async runHistoricalScan(request, signal) {
|
|
96
|
+
const key = workspaceKey(request.cwd);
|
|
97
|
+
const sessions = await this.source.list(request, signal);
|
|
98
|
+
let sessionsScanned = 0;
|
|
99
|
+
let sessionsFailed = 0;
|
|
100
|
+
let eventsScanned = 0;
|
|
101
|
+
let correctionsFound = 0;
|
|
102
|
+
let correctionsAdded = 0;
|
|
103
|
+
for (const record of sessions) {
|
|
104
|
+
if (signal?.aborted === true)
|
|
105
|
+
throw abortReason(signal);
|
|
106
|
+
try {
|
|
107
|
+
const snapshot = await this.source.read(String(record.header.id));
|
|
108
|
+
const report = await this.runSnapshot(snapshot, key, request.incremental !== false);
|
|
109
|
+
sessionsScanned += 1;
|
|
110
|
+
eventsScanned += report.eventsScanned;
|
|
111
|
+
correctionsFound += report.correctionsFound;
|
|
112
|
+
correctionsAdded += report.correctionsAdded;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
sessionsFailed += 1;
|
|
116
|
+
this.logger.warn("historical_scan.session_failed", {
|
|
117
|
+
sessionId: String(record.header.id),
|
|
118
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const report = {
|
|
123
|
+
workspaceKey: key,
|
|
124
|
+
sessionsConsidered: sessions.length,
|
|
125
|
+
sessionsScanned,
|
|
126
|
+
sessionsFailed,
|
|
127
|
+
eventsScanned,
|
|
128
|
+
correctionsFound,
|
|
129
|
+
correctionsAdded,
|
|
130
|
+
};
|
|
131
|
+
this.logger.info("historical_scan.completed", report);
|
|
132
|
+
return report;
|
|
133
|
+
}
|
|
134
|
+
async runSnapshot(snapshot, key, incremental) {
|
|
135
|
+
const cursor = this.store.getCursor(key) ?? emptyCursor(key);
|
|
136
|
+
const sessionId = String(snapshot.session.id);
|
|
137
|
+
const afterSeq = incremental ? (cursor.sessionWatermarks[sessionId] ?? -1) : -1;
|
|
138
|
+
const result = scanSession(snapshot, afterSeq, this.config.analysis);
|
|
139
|
+
let correctionsAdded = 0;
|
|
140
|
+
for (const evidence of result.evidence) {
|
|
141
|
+
const record = this.toRecord(evidence, key);
|
|
142
|
+
const existed = this.store.hasCorrection(record.id);
|
|
143
|
+
await this.store.putCorrection(record, this.config.retention.maxRecordsPerWorkspace);
|
|
144
|
+
if (!existed)
|
|
145
|
+
correctionsAdded += 1;
|
|
146
|
+
}
|
|
147
|
+
const capturedThroughSeq = result.capturedThroughSeq;
|
|
148
|
+
const nextCursor = {
|
|
149
|
+
workspaceKey: key,
|
|
150
|
+
lastAnalyzedSession: sessionId,
|
|
151
|
+
...(capturedThroughSeq === null ? {} : { lastAnalyzedEventSeq: capturedThroughSeq }),
|
|
152
|
+
sessionWatermarks: {
|
|
153
|
+
...cursor.sessionWatermarks,
|
|
154
|
+
...(capturedThroughSeq === null
|
|
155
|
+
? {}
|
|
156
|
+
: { [sessionId]: Math.max(afterSeq, capturedThroughSeq) }),
|
|
157
|
+
},
|
|
158
|
+
updatedAt: this.now(),
|
|
159
|
+
};
|
|
160
|
+
await this.store.putCursor(nextCursor);
|
|
161
|
+
return {
|
|
162
|
+
eventsScanned: result.eventsScanned,
|
|
163
|
+
correctionsFound: result.evidence.length,
|
|
164
|
+
correctionsAdded,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
toRecord(evidence, key) {
|
|
168
|
+
const sanitize = (text) => {
|
|
169
|
+
const redacted = this.config.privacy.redactSecrets ? redactSecrets(text) : text;
|
|
170
|
+
return this.config.privacy.persistRawMessages
|
|
171
|
+
? redacted
|
|
172
|
+
: boundText(redacted, this.config.privacy.maxStoredTextChars);
|
|
173
|
+
};
|
|
174
|
+
return {
|
|
175
|
+
id: correctionRecordId(evidence.sessionId, evidence.userEventSeq),
|
|
176
|
+
sessionId: evidence.sessionId,
|
|
177
|
+
eventSeq: evidence.userEventSeq,
|
|
178
|
+
workspaceKey: key,
|
|
179
|
+
cwd: evidence.cwd,
|
|
180
|
+
text: sanitize(evidence.userText),
|
|
181
|
+
textDigest: sha256(evidence.userText),
|
|
182
|
+
contextDigest: evidence.contextDigest,
|
|
183
|
+
contextEvents: evidence.contextEvents.map((event) => ({ ...event, text: sanitize(event.text) })),
|
|
184
|
+
...(evidence.previousUserEvent === undefined
|
|
185
|
+
? {}
|
|
186
|
+
: { previousUserEvent: evidence.previousUserEvent }),
|
|
187
|
+
previousAssistantEvents: [...evidence.previousAssistantEvents],
|
|
188
|
+
previousToolEvents: [...evidence.previousToolEvents],
|
|
189
|
+
matchedSignals: [...evidence.matchedSignals],
|
|
190
|
+
likelyOneOff: evidence.likelyOneOff,
|
|
191
|
+
createdAt: evidence.timestamp,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
enqueue(key, work) {
|
|
195
|
+
const previous = this.workspaceQueues.get(key) ?? Promise.resolve();
|
|
196
|
+
const next = previous.catch(() => undefined).then(work);
|
|
197
|
+
this.workspaceQueues.set(key, next);
|
|
198
|
+
void next.finally(() => {
|
|
199
|
+
if (this.workspaceQueues.get(key) === next)
|
|
200
|
+
this.workspaceQueues.delete(key);
|
|
201
|
+
}).catch(() => undefined);
|
|
202
|
+
return next;
|
|
203
|
+
}
|
|
204
|
+
createPendingSession(sessionId, observedAt) {
|
|
205
|
+
while (this.pending.size >= this.config.live.maxPendingSessions) {
|
|
206
|
+
let oldestSessionId;
|
|
207
|
+
let oldestObservedAt = Number.POSITIVE_INFINITY;
|
|
208
|
+
for (const [candidateId, candidate] of this.pending) {
|
|
209
|
+
if (candidate.lastEventAt < oldestObservedAt) {
|
|
210
|
+
oldestSessionId = candidateId;
|
|
211
|
+
oldestObservedAt = candidate.lastEventAt;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (oldestSessionId === undefined)
|
|
215
|
+
break;
|
|
216
|
+
const evicted = this.pending.get(oldestSessionId);
|
|
217
|
+
this.pending.delete(oldestSessionId);
|
|
218
|
+
this.warnPendingEviction("session-cap", oldestSessionId, evicted?.eventSeqs.size ?? 0);
|
|
219
|
+
}
|
|
220
|
+
const pending = { eventSeqs: new Set(), lastEventAt: observedAt };
|
|
221
|
+
this.pending.set(sessionId, pending);
|
|
222
|
+
return pending;
|
|
223
|
+
}
|
|
224
|
+
evictExpired(observedAt) {
|
|
225
|
+
for (const [sessionId, pending] of this.pending) {
|
|
226
|
+
if (observedAt - pending.lastEventAt < this.config.live.pendingTtlMs)
|
|
227
|
+
continue;
|
|
228
|
+
this.pending.delete(sessionId);
|
|
229
|
+
this.warnPendingEviction("ttl", sessionId, pending.eventSeqs.size);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
warnPendingEviction(reason, sessionId, evictedEvents) {
|
|
233
|
+
this.logger.warn("pending.evicted", {
|
|
234
|
+
reason,
|
|
235
|
+
sessionId,
|
|
236
|
+
evictedEvents,
|
|
237
|
+
pendingSessions: this.pending.size,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/mining/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-text.d.ts","sourceRoot":"","sources":["../../src/mining/message-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAQ/E,wBAAgB,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,CAErE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAEjE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
function blockText(block) {
|
|
2
|
+
if (block.type === "text")
|
|
3
|
+
return [block.text];
|
|
4
|
+
if (block.type === "tool-result")
|
|
5
|
+
return block.content.flatMap(blockText);
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
export function messageText(message) {
|
|
9
|
+
return message.content.flatMap(blockText).join("\n").trim();
|
|
10
|
+
}
|
|
11
|
+
export function isDirectUserMessage(message) {
|
|
12
|
+
return message.source.kind === "user";
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=message-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-text.js","sourceRoot":"","sources":["../../src/mining/message-text.ts"],"names":[],"mappings":"AAEA,SAAS,SAAS,CAAC,KAAmB;IACpC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1E,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAiC;IAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAoB;IACtD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface CorrectionPrefilterResult {
|
|
2
|
+
readonly matched: boolean;
|
|
3
|
+
readonly signals: readonly string[];
|
|
4
|
+
readonly likelyOneOff: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function prefilterCorrection(text: string): CorrectionPrefilterResult;
|
|
7
|
+
//# sourceMappingURL=prefilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefilter.d.ts","sourceRoot":"","sources":["../../src/mining/prefilter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AA+BD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,CAS3E"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const SIGNALS = [
|
|
2
|
+
[
|
|
3
|
+
"negative-imperative",
|
|
4
|
+
/(?:^|[^\p{L}\p{N}_])(?:не\s+(?:надо|нужно|запускай|меняй|трогай|делай|используй)|do\s+not|don't)(?=$|[^\p{L}\p{N}_])/iu,
|
|
5
|
+
],
|
|
6
|
+
[
|
|
7
|
+
"wrong-target",
|
|
8
|
+
/(?:^|[^\p{L}\p{N}_])(?:не\s+(?:тот|та|то|те)|wrong\s+(?:file|directory|command|tool)|not\s+the\s+right)(?=$|[^\p{L}\p{N}_])/iu,
|
|
9
|
+
],
|
|
10
|
+
[
|
|
11
|
+
"reminder",
|
|
12
|
+
/(?:^|[^\p{L}\p{N}_])(?:я\s+же\s+просил(?:а)?|зачем\s+ты|i\s+(?:already\s+)?asked\s+you|why\s+did\s+you)(?=$|[^\p{L}\p{N}_])/iu,
|
|
13
|
+
],
|
|
14
|
+
[
|
|
15
|
+
"replacement",
|
|
16
|
+
/(?:^|[^\p{L}\p{N}_])(?:вместо(?=$|[^\p{L}\p{N}_]).{0,80}используй|используй|используйте|use(?=$|[^\p{L}\p{N}_]).{0,80}instead|prefer)(?=$|[^\p{L}\p{N}_])/iu,
|
|
17
|
+
],
|
|
18
|
+
[
|
|
19
|
+
"durable-language",
|
|
20
|
+
/(?:^|[^\p{L}\p{N}_])(?:всегда|никогда|always|never)(?=$|[^\p{L}\p{N}_])/iu,
|
|
21
|
+
],
|
|
22
|
+
[
|
|
23
|
+
"workflow-order",
|
|
24
|
+
/(?:^|[^\p{L}\p{N}_])(?:сначала|сперва|first)(?=$|[^\p{L}\p{N}_])/iu,
|
|
25
|
+
],
|
|
26
|
+
];
|
|
27
|
+
const ONE_OFF = /(?:^|[^\p{L}\p{N}_])(?:сейчас|пока|в\s+этот\s+раз|только\s+сегодня|for\s+now|right\s+now|this\s+time|today)(?=$|[^\p{L}\p{N}_])/iu;
|
|
28
|
+
export function prefilterCorrection(text) {
|
|
29
|
+
const normalized = text.replace(/\s+/gu, " ").trim();
|
|
30
|
+
if (normalized.length === 0)
|
|
31
|
+
return { matched: false, signals: [], likelyOneOff: false };
|
|
32
|
+
const signals = SIGNALS.filter(([, pattern]) => pattern.test(normalized)).map(([name]) => name);
|
|
33
|
+
return {
|
|
34
|
+
matched: signals.length > 0,
|
|
35
|
+
signals,
|
|
36
|
+
likelyOneOff: ONE_OFF.test(normalized),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=prefilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefilter.js","sourceRoot":"","sources":["../../src/mining/prefilter.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,GAA4D;IACvE;QACE,qBAAqB;QACrB,wHAAwH;KACzH;IACD;QACE,cAAc;QACd,+HAA+H;KAChI;IACD;QACE,UAAU;QACV,+HAA+H;KAChI;IACD;QACE,aAAa;QACb,6JAA6J;KAC9J;IACD;QACE,kBAAkB;QAClB,2EAA2E;KAC5E;IACD;QACE,gBAAgB;QAChB,oEAAoE;KACrE;CACF,CAAC;AAEF,MAAM,OAAO,GAAG,mIAAmI,CAAC;AAEpJ,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACzF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAChG,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;QAC3B,OAAO;QACP,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;KACvC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/mining/sanitize.ts"],"names":[],"mappings":"AAQA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { truncateText } from "./text-budget.js";
|
|
2
|
+
const SECRET_PATTERNS = [
|
|
3
|
+
/\b(?:sk|pk|ghp|github_pat)_[A-Za-z0-9_-]{12,}\b/gu,
|
|
4
|
+
/\b(?:api[_-]?key|token|password|secret)\s*[:=]\s*[^\s,;]+/giu,
|
|
5
|
+
/\bBearer\s+[A-Za-z0-9._~+/=-]{10,}\b/giu,
|
|
6
|
+
];
|
|
7
|
+
export function redactSecrets(text) {
|
|
8
|
+
return SECRET_PATTERNS.reduce((current, pattern) => current.replace(pattern, "[REDACTED]"), text);
|
|
9
|
+
}
|
|
10
|
+
export function boundText(text, maxChars) {
|
|
11
|
+
return truncateText(text, maxChars, "code-points");
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/mining/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,eAAe,GAAsB;IACzC,mDAAmD;IACnD,8DAA8D;IAC9D,yCAAyC;CAC1C,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,QAAgB;IACtD,OAAO,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SessionEvent, SessionHeader } from "@deepseek-ai/dsh-session";
|
|
2
|
+
import type { CorrectionEvidence } from "../types.js";
|
|
3
|
+
import { type ContextLimits } from "./context-extractor.js";
|
|
4
|
+
export interface SessionSnapshot {
|
|
5
|
+
readonly session: SessionHeader;
|
|
6
|
+
readonly events: readonly SessionEvent[];
|
|
7
|
+
}
|
|
8
|
+
export interface SessionScanResult {
|
|
9
|
+
readonly evidence: readonly CorrectionEvidence[];
|
|
10
|
+
readonly eventsScanned: number;
|
|
11
|
+
readonly capturedThroughSeq: number | null;
|
|
12
|
+
}
|
|
13
|
+
export declare function scanSession(snapshot: SessionSnapshot, afterSeq: number, limits: ContextLimits): SessionScanResult;
|
|
14
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/mining/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAIvF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACjD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,GACpB,iBAAiB,CAiBnB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { extractCorrectionEvidence } from "./context-extractor.js";
|
|
2
|
+
import { isDirectUserMessage, messageText } from "./message-text.js";
|
|
3
|
+
import { prefilterCorrection } from "./prefilter.js";
|
|
4
|
+
export function scanSession(snapshot, afterSeq, limits) {
|
|
5
|
+
const evidence = [];
|
|
6
|
+
let eventsScanned = 0;
|
|
7
|
+
for (let index = 0; index < snapshot.events.length; index += 1) {
|
|
8
|
+
const event = snapshot.events[index];
|
|
9
|
+
if (event === undefined || event.seq <= afterSeq)
|
|
10
|
+
continue;
|
|
11
|
+
eventsScanned += 1;
|
|
12
|
+
if (event.type !== "user/message" || !isDirectUserMessage(event.data))
|
|
13
|
+
continue;
|
|
14
|
+
const prefilter = prefilterCorrection(messageText(event.data));
|
|
15
|
+
if (!prefilter.matched)
|
|
16
|
+
continue;
|
|
17
|
+
evidence.push(extractCorrectionEvidence(snapshot.session, snapshot.events, index, prefilter, limits));
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
evidence,
|
|
21
|
+
eventsScanned,
|
|
22
|
+
capturedThroughSeq: snapshot.events.at(-1)?.seq ?? null,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/mining/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAsB,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAarD,MAAM,UAAU,WAAW,CACzB,QAAyB,EACzB,QAAgB,EAChB,MAAqB;IAErB,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,IAAI,QAAQ;YAAE,SAAS;QAC3D,aAAa,IAAI,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAChF,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,SAAS;QACjC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACxG,CAAC;IACD,OAAO;QACL,QAAQ;QACR,aAAa;QACb,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI;KACxD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type TextBudgetUnit = "code-points" | "utf8-bytes";
|
|
2
|
+
/**
|
|
3
|
+
* Truncates text only between Unicode code points and includes the ellipsis in
|
|
4
|
+
* the requested budget.
|
|
5
|
+
*/
|
|
6
|
+
export declare function truncateText(text: string, maxSize: number, unit: TextBudgetUnit): string;
|
|
7
|
+
//# sourceMappingURL=text-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-budget.d.ts","sourceRoot":"","sources":["../../src/mining/text-budget.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAM1D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAuBxF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
const ELLIPSIS = "…";
|
|
3
|
+
function segmentSize(segment, unit) {
|
|
4
|
+
return unit === "code-points" ? 1 : Buffer.byteLength(segment, "utf8");
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Truncates text only between Unicode code points and includes the ellipsis in
|
|
8
|
+
* the requested budget.
|
|
9
|
+
*/
|
|
10
|
+
export function truncateText(text, maxSize, unit) {
|
|
11
|
+
const ellipsisSize = segmentSize(ELLIPSIS, unit);
|
|
12
|
+
if (maxSize < ellipsisSize)
|
|
13
|
+
return "";
|
|
14
|
+
const payloadLimit = maxSize - ellipsisSize;
|
|
15
|
+
const prefix = [];
|
|
16
|
+
let prefixSize = 0;
|
|
17
|
+
let totalSize = 0;
|
|
18
|
+
let prefixComplete = false;
|
|
19
|
+
for (const codePoint of text) {
|
|
20
|
+
const size = segmentSize(codePoint, unit);
|
|
21
|
+
totalSize += size;
|
|
22
|
+
if (!prefixComplete && prefixSize + size <= payloadLimit) {
|
|
23
|
+
prefix.push(codePoint);
|
|
24
|
+
prefixSize += size;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
prefixComplete = true;
|
|
28
|
+
if (totalSize > maxSize)
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return totalSize <= maxSize ? text : `${prefix.join("")}${ELLIPSIS}`;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=text-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-budget.js","sourceRoot":"","sources":["../../src/mining/text-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAIrB,SAAS,WAAW,CAAC,OAAe,EAAE,IAAoB;IACxD,OAAO,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAe,EAAE,IAAoB;IAC9E,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,OAAO,GAAG,YAAY;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,YAAY,GAAG,OAAO,GAAG,YAAY,CAAC;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC1C,SAAS,IAAI,IAAI,CAAC;QAClB,IAAI,CAAC,cAAc,IAAI,UAAU,GAAG,IAAI,IAAI,YAAY,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,UAAU,IAAI,IAAI,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,IAAI,CAAC;YACtB,IAAI,SAAS,GAAG,OAAO;gBAAE,MAAM;QACjC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC;AACvE,CAAC"}
|
package/lib/types.d.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export type CorrectionTarget = "file-selection" | "filesystem-scope" | "tool-choice" | "command" | "workflow" | "package-manager" | "git" | "deploy" | "style" | "testing" | "environment" | "agent-behavior" | "other";
|
|
2
|
+
export type CorrectionDurability = "one-off" | "likely-project-rule" | "likely-user-rule" | "likely-skill" | "uncertain";
|
|
3
|
+
export interface CorrectionClassification {
|
|
4
|
+
readonly isCorrection: boolean;
|
|
5
|
+
readonly confidence: number;
|
|
6
|
+
readonly target: CorrectionTarget;
|
|
7
|
+
readonly durability: CorrectionDurability;
|
|
8
|
+
readonly severity: "preference" | "workflow" | "destructive-risk" | "security";
|
|
9
|
+
readonly correctedBehavior?: string;
|
|
10
|
+
}
|
|
11
|
+
export type ContextEventKind = "user" | "assistant" | "tool-call" | "tool-result";
|
|
12
|
+
export interface CorrectionContextEvent {
|
|
13
|
+
readonly seq: number;
|
|
14
|
+
readonly kind: ContextEventKind;
|
|
15
|
+
readonly text: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CorrectionEvidence {
|
|
18
|
+
readonly sessionId: string;
|
|
19
|
+
readonly userEventSeq: number;
|
|
20
|
+
readonly userText: string;
|
|
21
|
+
readonly previousUserEvent?: number;
|
|
22
|
+
readonly previousAssistantEvents: readonly number[];
|
|
23
|
+
readonly previousToolEvents: readonly number[];
|
|
24
|
+
readonly contextEvents: readonly CorrectionContextEvent[];
|
|
25
|
+
readonly contextDigest: string;
|
|
26
|
+
readonly cwd: string;
|
|
27
|
+
readonly timestamp: number;
|
|
28
|
+
readonly matchedSignals: readonly string[];
|
|
29
|
+
readonly likelyOneOff: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface CorrectionRecord {
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly sessionId: string;
|
|
34
|
+
readonly eventSeq: number;
|
|
35
|
+
readonly workspaceKey: string;
|
|
36
|
+
readonly cwd: string;
|
|
37
|
+
/** Bounded, redacted text by default; full raw text only when explicitly configured. */
|
|
38
|
+
readonly text: string;
|
|
39
|
+
readonly textDigest: string;
|
|
40
|
+
readonly contextDigest: string;
|
|
41
|
+
readonly contextEvents: readonly CorrectionContextEvent[];
|
|
42
|
+
readonly previousUserEvent?: number;
|
|
43
|
+
readonly previousAssistantEvents: readonly number[];
|
|
44
|
+
readonly previousToolEvents: readonly number[];
|
|
45
|
+
readonly matchedSignals: readonly string[];
|
|
46
|
+
readonly likelyOneOff: boolean;
|
|
47
|
+
readonly classification?: CorrectionClassification;
|
|
48
|
+
readonly createdAt: number;
|
|
49
|
+
}
|
|
50
|
+
export interface ScanCursor {
|
|
51
|
+
readonly workspaceKey: string;
|
|
52
|
+
readonly lastAnalyzedSession?: string;
|
|
53
|
+
readonly lastAnalyzedEventSeq?: number;
|
|
54
|
+
readonly sessionWatermarks: Readonly<Record<string, number>>;
|
|
55
|
+
readonly updatedAt: number;
|
|
56
|
+
}
|
|
57
|
+
export interface ScanRequest {
|
|
58
|
+
readonly cwd: string;
|
|
59
|
+
readonly lastSessions?: number;
|
|
60
|
+
readonly from?: number;
|
|
61
|
+
readonly to?: number;
|
|
62
|
+
readonly incremental?: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface ScanReport {
|
|
65
|
+
readonly workspaceKey: string;
|
|
66
|
+
readonly sessionsConsidered: number;
|
|
67
|
+
readonly sessionsScanned: number;
|
|
68
|
+
readonly sessionsFailed: number;
|
|
69
|
+
readonly eventsScanned: number;
|
|
70
|
+
readonly correctionsFound: number;
|
|
71
|
+
readonly correctionsAdded: number;
|
|
72
|
+
}
|
|
73
|
+
export interface CorrectionStore {
|
|
74
|
+
getCursor(workspaceKey: string): ScanCursor | undefined;
|
|
75
|
+
putCursor(cursor: ScanCursor): Promise<void>;
|
|
76
|
+
hasCorrection(id: string): boolean;
|
|
77
|
+
putCorrection(record: CorrectionRecord, maxRecordsPerWorkspace: number): Promise<void>;
|
|
78
|
+
countCorrections(workspaceKey: string): number;
|
|
79
|
+
listCorrections(workspaceKey: string, limit?: number): readonly CorrectionRecord[];
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/lib/types.js
ADDED
package/lib/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashing.d.ts","sourceRoot":"","sources":["../../src/utils/hashing.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9E"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export function sha256(value) {
|
|
3
|
+
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
4
|
+
}
|
|
5
|
+
export function correctionRecordId(sessionId, eventSeq) {
|
|
6
|
+
return sha256(`${sessionId}\0${eventSeq}`);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=hashing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashing.js","sourceRoot":"","sources":["../../src/utils/hashing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,QAAgB;IACpE,OAAO,MAAM,CAAC,GAAG,SAAS,KAAK,QAAQ,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/utils/workspace.ts"],"names":[],"mappings":"AAIA,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { platform } from "node:os";
|
|
3
|
+
import { sha256 } from "./hashing.js";
|
|
4
|
+
export function normalizeWorkspacePath(cwd) {
|
|
5
|
+
const normalized = resolve(cwd).replaceAll("\\", "/").replace(/\/$/u, "");
|
|
6
|
+
return platform() === "win32" ? normalized.toLocaleLowerCase("en-US") : normalized;
|
|
7
|
+
}
|
|
8
|
+
export function workspaceKey(cwd) {
|
|
9
|
+
return sha256(normalizeWorkspacePath(cwd));
|
|
10
|
+
}
|
|
11
|
+
export function sameWorkspace(left, right) {
|
|
12
|
+
return left !== undefined && normalizeWorkspacePath(left) === normalizeWorkspacePath(right);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/utils/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1E,OAAO,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,MAAM,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAwB,EAAE,KAAa;IACnE,OAAO,IAAI,KAAK,SAAS,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAC9F,CAAC"}
|