pi-ghost-autocomplete 0.3.1 → 0.4.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 +561 -0
- package/README.md +464 -236
- package/dist/bench-cli.js +1 -47
- package/dist/bench.d.ts +137 -5
- package/dist/bench.js +1 -241
- package/dist/config.d.ts +47 -1
- package/dist/context-aggregator.d.ts +18 -6
- package/dist/cycle-manager.d.ts +83 -0
- package/dist/entropy-stop.d.ts +105 -0
- package/dist/eval-dataset.d.ts +55 -0
- package/dist/fuzzy-matcher.d.ts +12 -1
- package/dist/ghost-editor.d.ts +332 -6
- package/dist/index.d.ts +21 -1
- package/dist/index.js +1 -210
- package/dist/intent.d.ts +179 -0
- package/dist/metrics.d.ts +103 -3
- package/dist/path-index.d.ts +4 -1
- package/dist/path-matcher.d.ts +13 -1
- package/dist/profile-store.d.ts +85 -0
- package/dist/profile.d.ts +167 -0
- package/dist/providers/cloud-provider.d.ts +14 -2
- package/dist/providers/local-provider.d.ts +12 -2
- package/dist/providers/openai-compat-provider.d.ts +35 -2
- package/dist/providers/race.d.ts +62 -2
- package/dist/providers/types.d.ts +109 -2
- package/dist/recent-paths.d.ts +4 -1
- package/dist/replay-cli.js +2 -0
- package/dist/replay.d.ts +102 -0
- package/package.json +90 -79
- package/dist/bench-cli.d.ts +0 -3
- package/dist/bench-cli.d.ts.map +0 -1
- package/dist/bench-cli.js.map +0 -1
- package/dist/bench.d.ts.map +0 -1
- package/dist/bench.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -187
- package/dist/config.js.map +0 -1
- package/dist/context-aggregator.d.ts.map +0 -1
- package/dist/context-aggregator.js +0 -58
- package/dist/context-aggregator.js.map +0 -1
- package/dist/fuzzy-matcher.d.ts.map +0 -1
- package/dist/fuzzy-matcher.js +0 -160
- package/dist/fuzzy-matcher.js.map +0 -1
- package/dist/ghost-editor.d.ts.map +0 -1
- package/dist/ghost-editor.js +0 -445
- package/dist/ghost-editor.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/metrics.d.ts.map +0 -1
- package/dist/metrics.js +0 -98
- package/dist/metrics.js.map +0 -1
- package/dist/path-index.d.ts.map +0 -1
- package/dist/path-index.js +0 -148
- package/dist/path-index.js.map +0 -1
- package/dist/path-matcher.d.ts.map +0 -1
- package/dist/path-matcher.js +0 -85
- package/dist/path-matcher.js.map +0 -1
- package/dist/providers/cloud-provider.d.ts.map +0 -1
- package/dist/providers/cloud-provider.js +0 -52
- package/dist/providers/cloud-provider.js.map +0 -1
- package/dist/providers/local-provider.d.ts.map +0 -1
- package/dist/providers/local-provider.js +0 -36
- package/dist/providers/local-provider.js.map +0 -1
- package/dist/providers/openai-compat-provider.d.ts.map +0 -1
- package/dist/providers/openai-compat-provider.js +0 -128
- package/dist/providers/openai-compat-provider.js.map +0 -1
- package/dist/providers/openai-completions-runner.d.ts +0 -28
- package/dist/providers/openai-completions-runner.d.ts.map +0 -1
- package/dist/providers/openai-completions-runner.js +0 -46
- package/dist/providers/openai-completions-runner.js.map +0 -1
- package/dist/providers/race.d.ts.map +0 -1
- package/dist/providers/race.js +0 -128
- package/dist/providers/race.js.map +0 -1
- package/dist/providers/truncate.d.ts +0 -7
- package/dist/providers/truncate.d.ts.map +0 -1
- package/dist/providers/truncate.js +0 -39
- package/dist/providers/truncate.js.map +0 -1
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -2
- package/dist/providers/types.js.map +0 -1
- package/dist/recent-paths.d.ts.map +0 -1
- package/dist/recent-paths.js +0 -114
- package/dist/recent-paths.js.map +0 -1
package/dist/providers/race.js
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Implements {@link GhostProvider} by racing several providers in parallel.
|
|
3
|
-
* First non-null result wins; losers are aborted via a shared signal.
|
|
4
|
-
*
|
|
5
|
-
* Trace metadata for the most recent race is exposed via
|
|
6
|
-
* {@link consumeLastTrace}. The editor reads it after `predict()` to emit a
|
|
7
|
-
* multi-provider metrics record. Consumption is one-shot to avoid stale reuse.
|
|
8
|
-
*/
|
|
9
|
-
export class RaceProvider {
|
|
10
|
-
members;
|
|
11
|
-
cfg;
|
|
12
|
-
name;
|
|
13
|
-
cooldownUntil = 0;
|
|
14
|
-
lastTrace = null;
|
|
15
|
-
constructor(members, cfg) {
|
|
16
|
-
this.members = members;
|
|
17
|
-
this.cfg = cfg;
|
|
18
|
-
this.name = `ghost-race:${members.map((p) => p.name).join(",")}`;
|
|
19
|
-
}
|
|
20
|
-
get debounceMs() {
|
|
21
|
-
return this.cfg.pauseMs;
|
|
22
|
-
}
|
|
23
|
-
consumeLastTrace() {
|
|
24
|
-
const t = this.lastTrace;
|
|
25
|
-
this.lastTrace = null;
|
|
26
|
-
return t;
|
|
27
|
-
}
|
|
28
|
-
async predict(req) {
|
|
29
|
-
if (this.members.length === 0)
|
|
30
|
-
return null;
|
|
31
|
-
const now = Date.now();
|
|
32
|
-
if (now < this.cooldownUntil) {
|
|
33
|
-
this.lastTrace = { providers: [] };
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
const trace = [];
|
|
37
|
-
const localCtrl = new AbortController();
|
|
38
|
-
const start = now;
|
|
39
|
-
// Propagate caller cancellation; do not propagate our own internal aborts.
|
|
40
|
-
const onUserAbort = () => localCtrl.abort();
|
|
41
|
-
if (req.signal.aborted) {
|
|
42
|
-
localCtrl.abort();
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
req.signal.addEventListener("abort", onUserAbort, { once: true });
|
|
46
|
-
}
|
|
47
|
-
const cutoffTimer = setTimeout(() => localCtrl.abort(), this.cfg.cutoffMs);
|
|
48
|
-
try {
|
|
49
|
-
const races = this.members.map((p) => this.runMember(p, { ...req, signal: localCtrl.signal }, start, trace));
|
|
50
|
-
const winner = await firstNonNull(races);
|
|
51
|
-
if (winner) {
|
|
52
|
-
localCtrl.abort();
|
|
53
|
-
this.lastTrace = { providers: trace, winner: winner.provider };
|
|
54
|
-
return winner.completion;
|
|
55
|
-
}
|
|
56
|
-
// Skip cooldown when the caller cancelled — that's a normal stutter,
|
|
57
|
-
// not a sign the providers are failing. Only true non-success (empty,
|
|
58
|
-
// rejected, error, internal-cutoff) should throttle the next race.
|
|
59
|
-
if (!req.signal.aborted) {
|
|
60
|
-
this.cooldownUntil = Date.now() + this.cfg.cooldownMs;
|
|
61
|
-
}
|
|
62
|
-
this.lastTrace = { providers: trace };
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
finally {
|
|
66
|
-
clearTimeout(cutoffTimer);
|
|
67
|
-
req.signal.removeEventListener("abort", onUserAbort);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
async runMember(provider, req, start, trace) {
|
|
71
|
-
try {
|
|
72
|
-
const result = await provider.predict(req);
|
|
73
|
-
const latencyMs = Date.now() - start;
|
|
74
|
-
if (req.signal.aborted) {
|
|
75
|
-
trace.push({ provider: provider.name, latencyMs, result: "aborted" });
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
if (result === null || result === "") {
|
|
79
|
-
trace.push({ provider: provider.name, latencyMs, result: "empty" });
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
trace.push({ provider: provider.name, latencyMs, result: "produced" });
|
|
83
|
-
return { provider: provider.name, completion: result };
|
|
84
|
-
}
|
|
85
|
-
catch (err) {
|
|
86
|
-
const latencyMs = Date.now() - start;
|
|
87
|
-
const aborted = err?.name === "AbortError";
|
|
88
|
-
trace.push({
|
|
89
|
-
provider: provider.name,
|
|
90
|
-
latencyMs,
|
|
91
|
-
result: aborted ? "aborted" : "error",
|
|
92
|
-
});
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Resolve to the first non-null value among `promises`. Resolves null when
|
|
99
|
-
* all promises produce null (or throw). Never rejects.
|
|
100
|
-
*/
|
|
101
|
-
export function firstNonNull(promises) {
|
|
102
|
-
if (promises.length === 0)
|
|
103
|
-
return Promise.resolve(null);
|
|
104
|
-
return new Promise((resolve) => {
|
|
105
|
-
let remaining = promises.length;
|
|
106
|
-
let settled = false;
|
|
107
|
-
const finish = (v) => {
|
|
108
|
-
if (settled)
|
|
109
|
-
return;
|
|
110
|
-
settled = true;
|
|
111
|
-
resolve(v);
|
|
112
|
-
};
|
|
113
|
-
for (const p of promises) {
|
|
114
|
-
p.then((v) => {
|
|
115
|
-
if (v !== null) {
|
|
116
|
-
finish(v);
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (--remaining === 0)
|
|
120
|
-
finish(null);
|
|
121
|
-
}, () => {
|
|
122
|
-
if (--remaining === 0)
|
|
123
|
-
finish(null);
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=race.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"race.js","sourceRoot":"","sources":["../../src/providers/race.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { GhostRequest } from "./types.js";
|
|
2
|
-
export declare function buildPromptMessages(req: GhostRequest, maxRecent: number): {
|
|
3
|
-
systemPrompt: string;
|
|
4
|
-
user: string;
|
|
5
|
-
};
|
|
6
|
-
export declare function sanitizeCompletion(raw: string, draft: string, maxLen: number): string | null;
|
|
7
|
-
//# sourceMappingURL=truncate.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../src/providers/truncate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ/C,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,GACf;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAKxC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoB5F"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
const SYSTEM_PROMPT = "You are a terminal autocomplete engine. The user is typing a prompt for an AI coding agent. " +
|
|
2
|
-
"Predict the most likely continuation of the current line — at most one short phrase, no more than 12 words. " +
|
|
3
|
-
"Output ONLY the continuation text, with no quotes, no markdown, no leading whitespace, no explanation. " +
|
|
4
|
-
"If you cannot confidently continue, output an empty string.";
|
|
5
|
-
export function buildPromptMessages(req, maxRecent) {
|
|
6
|
-
const recent = req.recentMessages.slice(-maxRecent).map((m) => `${m.role}: ${truncate(m.text, 280)}`).join("\n");
|
|
7
|
-
const ctx = recent ? `Recent conversation:\n${recent}\n\n` : "";
|
|
8
|
-
const user = `${ctx}Current draft (cursor at end):\n${req.editorTextBeforeCursor}`;
|
|
9
|
-
return { systemPrompt: SYSTEM_PROMPT, user };
|
|
10
|
-
}
|
|
11
|
-
export function sanitizeCompletion(raw, draft, maxLen) {
|
|
12
|
-
let out = raw;
|
|
13
|
-
out = out.replace(/^[\s\r\n]+/, "");
|
|
14
|
-
const newlineIdx = out.indexOf("\n");
|
|
15
|
-
if (newlineIdx >= 0)
|
|
16
|
-
out = out.slice(0, newlineIdx);
|
|
17
|
-
out = out.replace(/^["'`](.*)["'`]$/, "$1");
|
|
18
|
-
if (!out)
|
|
19
|
-
return null;
|
|
20
|
-
const draftTail = draft.split(/\s+/).pop() ?? "";
|
|
21
|
-
if (draftTail) {
|
|
22
|
-
const lower = out.toLowerCase();
|
|
23
|
-
const tail = draftTail.toLowerCase();
|
|
24
|
-
if (lower === tail)
|
|
25
|
-
return null;
|
|
26
|
-
if (lower.startsWith(tail) && out.length > draftTail.length) {
|
|
27
|
-
out = out.slice(draftTail.length);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
if (!out)
|
|
31
|
-
return null;
|
|
32
|
-
if (out.length > maxLen)
|
|
33
|
-
out = out.slice(0, maxLen);
|
|
34
|
-
return out;
|
|
35
|
-
}
|
|
36
|
-
function truncate(s, n) {
|
|
37
|
-
return s.length > n ? `${s.slice(0, n)}…` : s;
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=truncate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../src/providers/truncate.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAClB,8FAA8F;IAC9F,8GAA8G;IAC9G,yGAAyG;IACzG,6DAA6D,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAClC,GAAiB,EACjB,SAAiB;IAEjB,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjH,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,yBAAyB,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,GAAG,GAAG,mCAAmC,GAAG,CAAC,sBAAsB,EAAE,CAAC;IACnF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,KAAa,EAAE,MAAc;IAC5E,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,UAAU,IAAI,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACpD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YAC7D,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IACD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACrC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC;CACjD"}
|
package/dist/providers/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recent-paths.d.ts","sourceRoot":"","sources":["../src/recent-paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,iCAAiC,CAAC;AAEtF,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAkB1E;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAoBzE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,CAOjF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GAClB,aAAa,EAAE,CAiCjB"}
|
package/dist/recent-paths.js
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { extractText } from "./context-aggregator.js";
|
|
2
|
-
const PER_MESSAGE_CAP = 4000;
|
|
3
|
-
// A token containing at least one `/` that looks like a path: leading
|
|
4
|
-
// whitespace/quote/paren/bracket boundary, then path chars across one or more
|
|
5
|
-
// segments.
|
|
6
|
-
const SLASHED_PATH = /(?:^|[\s"'`(\[{])([A-Za-z0-9_.\-][A-Za-z0-9_.\-]*(?:\/[A-Za-z0-9_.\-]+)+)/g;
|
|
7
|
-
// Backticked single-token contents; we accept them as a path mention if they
|
|
8
|
-
// look path-like (slash or dot).
|
|
9
|
-
const BACKTICKED = /`([^`\n]{1,200})`/g;
|
|
10
|
-
// Bare filename with a known code extension. Conservative list to limit
|
|
11
|
-
// false positives during normal English writing.
|
|
12
|
-
const FILENAME_EXT = /\b([A-Za-z0-9_\-]+\.(?:ts|tsx|js|jsx|mjs|cjs|md|json|py|go|rs|java|kt|swift|c|h|cc|cpp|hpp|sh|bash|zsh|yml|yaml|toml|ini|css|scss|html|xml|sql|rb|php|lua))\b/g;
|
|
13
|
-
const PATHLIKE = /^[A-Za-z0-9_./@\-]+$/;
|
|
14
|
-
/**
|
|
15
|
-
* Extract path-like mentions from recent conversation messages. Returns a Set
|
|
16
|
-
* of distinct tokens — full paths (e.g. `src/foo.ts`) and bare filenames with
|
|
17
|
-
* code extensions (e.g. `foo.ts`).
|
|
18
|
-
*
|
|
19
|
-
* Conservative on purpose: triggers ranking boosts only, so noisy mentions
|
|
20
|
-
* just degrade to no-op rather than producing wrong completions.
|
|
21
|
-
*/
|
|
22
|
-
export function extractRecentPaths(messages) {
|
|
23
|
-
const out = new Set();
|
|
24
|
-
for (const m of messages) {
|
|
25
|
-
const text = m.text.length > PER_MESSAGE_CAP ? m.text.slice(0, PER_MESSAGE_CAP) : m.text;
|
|
26
|
-
for (const match of text.matchAll(SLASHED_PATH)) {
|
|
27
|
-
const tok = match[1];
|
|
28
|
-
if (tok)
|
|
29
|
-
out.add(tok);
|
|
30
|
-
}
|
|
31
|
-
for (const match of text.matchAll(BACKTICKED)) {
|
|
32
|
-
const raw = match[1]?.trim();
|
|
33
|
-
if (raw && raw.length <= 200 && !raw.includes(" ") && PATHLIKE.test(raw) && /[/.]/.test(raw)) {
|
|
34
|
-
out.add(raw);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
for (const match of text.matchAll(FILENAME_EXT)) {
|
|
38
|
-
const tok = match[1];
|
|
39
|
-
if (tok)
|
|
40
|
-
out.add(tok);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return out;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Score boost for a matched path given the recent-mention set.
|
|
47
|
-
* - exact full-path hit: +10
|
|
48
|
-
* - basename hit: +7
|
|
49
|
-
* - otherwise: 0
|
|
50
|
-
*/
|
|
51
|
-
export function recentBoost(matchPath, recent) {
|
|
52
|
-
if (!recent || recent.size === 0)
|
|
53
|
-
return 0;
|
|
54
|
-
if (recent.has(matchPath))
|
|
55
|
-
return 10;
|
|
56
|
-
const i = matchPath.lastIndexOf("/");
|
|
57
|
-
const bn = i < 0 ? matchPath : matchPath.slice(i + 1);
|
|
58
|
-
if (recent.has(bn))
|
|
59
|
-
return 7;
|
|
60
|
-
return 0;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Read role-weighted recent messages tailored for path-mention extraction:
|
|
64
|
-
* up to `userMax` most-recent user messages and `assistantMax` most-recent
|
|
65
|
-
* assistant messages. Oldest-first.
|
|
66
|
-
*/
|
|
67
|
-
export function getRoleWeightedRecent(ctx, userMax, assistantMax) {
|
|
68
|
-
if (userMax <= 0 && assistantMax <= 0)
|
|
69
|
-
return [];
|
|
70
|
-
let branch;
|
|
71
|
-
try {
|
|
72
|
-
branch = ctx.sessionManager.getBranch();
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
if (!branch)
|
|
78
|
-
return [];
|
|
79
|
-
const out = [];
|
|
80
|
-
let userTaken = 0;
|
|
81
|
-
let assistantTaken = 0;
|
|
82
|
-
for (let i = branch.length - 1; i >= 0; i--) {
|
|
83
|
-
if (userTaken >= userMax && assistantTaken >= assistantMax)
|
|
84
|
-
break;
|
|
85
|
-
const entry = branch[i];
|
|
86
|
-
if (!entry || entry.type !== "message")
|
|
87
|
-
continue;
|
|
88
|
-
const role = roleOf(entry.message);
|
|
89
|
-
if (role === "user" && userTaken < userMax) {
|
|
90
|
-
const text = extractText(entry.message);
|
|
91
|
-
if (text) {
|
|
92
|
-
out.push({ role, text });
|
|
93
|
-
userTaken++;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
else if (role === "assistant" && assistantTaken < assistantMax) {
|
|
97
|
-
const text = extractText(entry.message);
|
|
98
|
-
if (text) {
|
|
99
|
-
out.push({ role, text });
|
|
100
|
-
assistantTaken++;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
out.reverse();
|
|
105
|
-
return out;
|
|
106
|
-
}
|
|
107
|
-
function roleOf(msg) {
|
|
108
|
-
if (msg && typeof msg === "object" && "role" in msg && typeof msg.role === "string") {
|
|
109
|
-
if (msg.role === "user" || msg.role === "assistant")
|
|
110
|
-
return msg.role;
|
|
111
|
-
}
|
|
112
|
-
return undefined;
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=recent-paths.js.map
|
package/dist/recent-paths.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recent-paths.js","sourceRoot":"","sources":["../src/recent-paths.ts"],"names":[],"mappings":"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"}
|