exai 1.6.2 → 1.7.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/dist/ai/cache.d.ts +65 -0
- package/dist/ai/cache.d.ts.map +1 -0
- package/dist/ai/cache.js +197 -0
- package/dist/ai/cache.js.map +1 -0
- package/dist/ai/config.d.ts +3 -0
- package/dist/ai/config.d.ts.map +1 -1
- package/dist/ai/config.js +8 -2
- package/dist/ai/config.js.map +1 -1
- package/dist/ai/context-gatherer.d.ts +6 -6
- package/dist/ai/context-gatherer.d.ts.map +1 -1
- package/dist/ai/context-gatherer.js +15 -52
- package/dist/ai/context-gatherer.js.map +1 -1
- package/dist/ai/folder-filter.d.ts +1 -1
- package/dist/ai/folder-filter.d.ts.map +1 -1
- package/dist/ai/folder-filter.js +2 -1
- package/dist/ai/folder-filter.js.map +1 -1
- package/dist/ai/openrouter.d.ts +7 -3
- package/dist/ai/openrouter.d.ts.map +1 -1
- package/dist/ai/openrouter.js +140 -86
- package/dist/ai/openrouter.js.map +1 -1
- package/dist/ai/query-cache.d.ts +9 -24
- package/dist/ai/query-cache.d.ts.map +1 -1
- package/dist/ai/query-cache.js +21 -270
- package/dist/ai/query-cache.js.map +1 -1
- package/dist/cli.js +111 -41
- package/dist/cli.js.map +1 -1
- package/dist/generator/excalidraw-generator.d.ts.map +1 -1
- package/dist/generator/excalidraw-generator.js +41 -2
- package/dist/generator/excalidraw-generator.js.map +1 -1
- package/dist/layout/arrow-router.d.ts +8 -0
- package/dist/layout/arrow-router.d.ts.map +1 -1
- package/dist/layout/arrow-router.js +23 -0
- package/dist/layout/arrow-router.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified ExaiCache
|
|
3
|
+
*
|
|
4
|
+
* All caches share one directory with namespaced files: {ns}__{key}.json
|
|
5
|
+
* Namespaces used: 'llm', 'context', 'filter'
|
|
6
|
+
*
|
|
7
|
+
* Configure the module-level singleton once at startup via cache.configure().
|
|
8
|
+
* All callers (LLM cache, context cache) share TTL, maxEntries, and verbose settings.
|
|
9
|
+
*/
|
|
10
|
+
export interface CacheConfig {
|
|
11
|
+
cacheDir?: string;
|
|
12
|
+
ttlDays?: number;
|
|
13
|
+
maxEntries?: number;
|
|
14
|
+
verbose?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build a deterministic cache key from an arbitrary list of values.
|
|
18
|
+
* Strings are hashed directly; everything else is JSON-serialised first.
|
|
19
|
+
*/
|
|
20
|
+
export declare function makeKey(...parts: unknown[]): string;
|
|
21
|
+
export declare class ExaiCache {
|
|
22
|
+
private dir;
|
|
23
|
+
private ttlMs;
|
|
24
|
+
private max;
|
|
25
|
+
private verbose;
|
|
26
|
+
constructor();
|
|
27
|
+
/** Apply configuration. Call once at startup (e.g. after loading config file). */
|
|
28
|
+
configure(config: CacheConfig): void;
|
|
29
|
+
private ensureDir;
|
|
30
|
+
private filePath;
|
|
31
|
+
/**
|
|
32
|
+
* Read a cached value. Returns null on miss or expiry.
|
|
33
|
+
* @param ns Namespace (e.g. 'llm', 'context', 'filter')
|
|
34
|
+
* @param key Cache key produced by makeKey()
|
|
35
|
+
*/
|
|
36
|
+
get<T>(ns: string, key: string): T | null;
|
|
37
|
+
/**
|
|
38
|
+
* Write a value to cache.
|
|
39
|
+
* @param ns Namespace
|
|
40
|
+
* @param key Cache key produced by makeKey()
|
|
41
|
+
* @param value Any JSON-serialisable value
|
|
42
|
+
*/
|
|
43
|
+
set<T>(ns: string, key: string, value: T): void;
|
|
44
|
+
/**
|
|
45
|
+
* Clear cache entries.
|
|
46
|
+
* @param ns Namespace to clear. Omit to clear everything (including legacy .cache files).
|
|
47
|
+
* @returns Number of files deleted.
|
|
48
|
+
*/
|
|
49
|
+
clear(ns?: string): number;
|
|
50
|
+
/**
|
|
51
|
+
* Return statistics about cached files.
|
|
52
|
+
* @param ns Namespace to scope. Omit for all files.
|
|
53
|
+
*/
|
|
54
|
+
stats(ns?: string): {
|
|
55
|
+
totalEntries: number;
|
|
56
|
+
totalSize: number;
|
|
57
|
+
oldestEntry: number | null;
|
|
58
|
+
newestEntry: number | null;
|
|
59
|
+
};
|
|
60
|
+
/** Remove oldest entries (across all namespaces) when total exceeds maxEntries. */
|
|
61
|
+
_prune(): void;
|
|
62
|
+
}
|
|
63
|
+
/** Shared cache instance. Call cache.configure() once at application startup. */
|
|
64
|
+
export declare const cache: ExaiCache;
|
|
65
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/ai/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAID;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAMnD;AAID,qBAAa,SAAS;IAClB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAU;;IASzB,kFAAkF;IAClF,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAOpC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;IAIhB;;;;OAIG;IACH,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAwBzC;;;;;OAKG;IACH,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAY/C;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAkB1B;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B;IAgCD,mFAAmF;IACnF,MAAM,IAAI,IAAI;CAcjB;AAID,iFAAiF;AACjF,eAAO,MAAM,KAAK,WAAkB,CAAC"}
|
package/dist/ai/cache.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified ExaiCache
|
|
3
|
+
*
|
|
4
|
+
* All caches share one directory with namespaced files: {ns}__{key}.json
|
|
5
|
+
* Namespaces used: 'llm', 'context', 'filter'
|
|
6
|
+
*
|
|
7
|
+
* Configure the module-level singleton once at startup via cache.configure().
|
|
8
|
+
* All callers (LLM cache, context cache) share TTL, maxEntries, and verbose settings.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from 'crypto';
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync, unlinkSync, } from 'fs';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import { tmpdir } from 'os';
|
|
14
|
+
// ── Key helper ────────────────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Build a deterministic cache key from an arbitrary list of values.
|
|
17
|
+
* Strings are hashed directly; everything else is JSON-serialised first.
|
|
18
|
+
*/
|
|
19
|
+
export function makeKey(...parts) {
|
|
20
|
+
const hash = createHash('sha256');
|
|
21
|
+
for (const part of parts) {
|
|
22
|
+
hash.update(typeof part === 'string' ? part : JSON.stringify(part));
|
|
23
|
+
}
|
|
24
|
+
return hash.digest('hex');
|
|
25
|
+
}
|
|
26
|
+
// ── ExaiCache class ───────────────────────────────────────────────────────────
|
|
27
|
+
export class ExaiCache {
|
|
28
|
+
dir;
|
|
29
|
+
ttlMs;
|
|
30
|
+
max;
|
|
31
|
+
verbose;
|
|
32
|
+
constructor() {
|
|
33
|
+
this.dir = join(tmpdir(), 'exai-cache');
|
|
34
|
+
this.ttlMs = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
35
|
+
this.max = 100;
|
|
36
|
+
this.verbose = false;
|
|
37
|
+
}
|
|
38
|
+
/** Apply configuration. Call once at startup (e.g. after loading config file). */
|
|
39
|
+
configure(config) {
|
|
40
|
+
if (config.cacheDir !== undefined)
|
|
41
|
+
this.dir = config.cacheDir;
|
|
42
|
+
if (config.ttlDays !== undefined)
|
|
43
|
+
this.ttlMs = config.ttlDays * 24 * 60 * 60 * 1000;
|
|
44
|
+
if (config.maxEntries !== undefined)
|
|
45
|
+
this.max = config.maxEntries;
|
|
46
|
+
if (config.verbose !== undefined)
|
|
47
|
+
this.verbose = config.verbose;
|
|
48
|
+
}
|
|
49
|
+
ensureDir() {
|
|
50
|
+
if (!existsSync(this.dir))
|
|
51
|
+
mkdirSync(this.dir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
filePath(ns, key) {
|
|
54
|
+
return join(this.dir, `${ns}__${key}.json`);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Read a cached value. Returns null on miss or expiry.
|
|
58
|
+
* @param ns Namespace (e.g. 'llm', 'context', 'filter')
|
|
59
|
+
* @param key Cache key produced by makeKey()
|
|
60
|
+
*/
|
|
61
|
+
get(ns, key) {
|
|
62
|
+
this.ensureDir();
|
|
63
|
+
const path = this.filePath(ns, key);
|
|
64
|
+
if (!existsSync(path)) {
|
|
65
|
+
if (this.verbose)
|
|
66
|
+
console.log(` Cache miss [${ns}]: ${key.slice(0, 12)}...`);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const entry = JSON.parse(readFileSync(path, 'utf-8'));
|
|
71
|
+
if (Date.now() - entry.timestamp > this.ttlMs) {
|
|
72
|
+
if (this.verbose)
|
|
73
|
+
console.log(` Cache expired [${ns}]: ${key.slice(0, 12)}...`);
|
|
74
|
+
try {
|
|
75
|
+
unlinkSync(path);
|
|
76
|
+
}
|
|
77
|
+
catch { /* ignore */ }
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
if (this.verbose) {
|
|
81
|
+
const ageMin = Math.floor((Date.now() - entry.timestamp) / 60_000);
|
|
82
|
+
console.log(` Cache hit [${ns}]: ${key.slice(0, 12)}... (age: ${ageMin}m)`);
|
|
83
|
+
}
|
|
84
|
+
return entry.value;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Write a value to cache.
|
|
92
|
+
* @param ns Namespace
|
|
93
|
+
* @param key Cache key produced by makeKey()
|
|
94
|
+
* @param value Any JSON-serialisable value
|
|
95
|
+
*/
|
|
96
|
+
set(ns, key, value) {
|
|
97
|
+
this.ensureDir();
|
|
98
|
+
const entry = { value, timestamp: Date.now() };
|
|
99
|
+
try {
|
|
100
|
+
writeFileSync(this.filePath(ns, key), JSON.stringify(entry), 'utf-8');
|
|
101
|
+
if (this.verbose)
|
|
102
|
+
console.log(` Cached [${ns}]: ${key.slice(0, 12)}...`);
|
|
103
|
+
this._prune();
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
if (this.verbose)
|
|
107
|
+
console.log(` Cache write error [${ns}]: ${err}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Clear cache entries.
|
|
112
|
+
* @param ns Namespace to clear. Omit to clear everything (including legacy .cache files).
|
|
113
|
+
* @returns Number of files deleted.
|
|
114
|
+
*/
|
|
115
|
+
clear(ns) {
|
|
116
|
+
if (!existsSync(this.dir))
|
|
117
|
+
return 0;
|
|
118
|
+
try {
|
|
119
|
+
const files = readdirSync(this.dir).filter(f => ns
|
|
120
|
+
? (f.startsWith(`${ns}__`) && f.endsWith('.json'))
|
|
121
|
+
: (f.endsWith('.json') || f.endsWith('.cache')));
|
|
122
|
+
let count = 0;
|
|
123
|
+
for (const f of files) {
|
|
124
|
+
try {
|
|
125
|
+
unlinkSync(join(this.dir, f));
|
|
126
|
+
count++;
|
|
127
|
+
}
|
|
128
|
+
catch { /* ignore */ }
|
|
129
|
+
}
|
|
130
|
+
return count;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return 0;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Return statistics about cached files.
|
|
138
|
+
* @param ns Namespace to scope. Omit for all files.
|
|
139
|
+
*/
|
|
140
|
+
stats(ns) {
|
|
141
|
+
if (!existsSync(this.dir)) {
|
|
142
|
+
return { totalEntries: 0, totalSize: 0, oldestEntry: null, newestEntry: null };
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
const files = readdirSync(this.dir)
|
|
146
|
+
.filter(f => ns
|
|
147
|
+
? (f.startsWith(`${ns}__`) && f.endsWith('.json'))
|
|
148
|
+
: (f.endsWith('.json') || f.endsWith('.cache')))
|
|
149
|
+
.map(f => join(this.dir, f));
|
|
150
|
+
let totalSize = 0;
|
|
151
|
+
let oldestEntry = null;
|
|
152
|
+
let newestEntry = null;
|
|
153
|
+
for (const file of files) {
|
|
154
|
+
try {
|
|
155
|
+
const s = statSync(file);
|
|
156
|
+
totalSize += s.size;
|
|
157
|
+
const mtime = s.mtime.getTime();
|
|
158
|
+
if (oldestEntry === null || mtime < oldestEntry)
|
|
159
|
+
oldestEntry = mtime;
|
|
160
|
+
if (newestEntry === null || mtime > newestEntry)
|
|
161
|
+
newestEntry = mtime;
|
|
162
|
+
}
|
|
163
|
+
catch { /* ignore */ }
|
|
164
|
+
}
|
|
165
|
+
return { totalEntries: files.length, totalSize, oldestEntry, newestEntry };
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return { totalEntries: 0, totalSize: 0, oldestEntry: null, newestEntry: null };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** Remove oldest entries (across all namespaces) when total exceeds maxEntries. */
|
|
172
|
+
_prune() {
|
|
173
|
+
if (!existsSync(this.dir))
|
|
174
|
+
return;
|
|
175
|
+
try {
|
|
176
|
+
const files = readdirSync(this.dir)
|
|
177
|
+
.filter(f => f.endsWith('.json'))
|
|
178
|
+
.map(f => ({ path: join(this.dir, f), mtime: statSync(join(this.dir, f)).mtime.getTime() }))
|
|
179
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
180
|
+
if (files.length <= this.max)
|
|
181
|
+
return;
|
|
182
|
+
for (const { path } of files.slice(this.max)) {
|
|
183
|
+
try {
|
|
184
|
+
unlinkSync(path);
|
|
185
|
+
if (this.verbose)
|
|
186
|
+
console.log(` Pruned: ${path}`);
|
|
187
|
+
}
|
|
188
|
+
catch { /* ignore */ }
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch { /* ignore */ }
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// ── Module-level singleton ────────────────────────────────────────────────────
|
|
195
|
+
/** Shared cache instance. Call cache.configure() once at application startup. */
|
|
196
|
+
export const cache = new ExaiCache();
|
|
197
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/ai/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/config.d.ts
CHANGED
|
@@ -40,9 +40,12 @@ export interface CliConfig {
|
|
|
40
40
|
compressMode?: string;
|
|
41
41
|
compressOptions?: ConfigCompressOptions;
|
|
42
42
|
cache?: boolean;
|
|
43
|
+
contextCache?: boolean;
|
|
43
44
|
cacheTtlDays?: number;
|
|
44
45
|
cacheMaxEntries?: number;
|
|
45
46
|
verbose?: boolean;
|
|
47
|
+
/** LLM request timeout in seconds (default: 120) */
|
|
48
|
+
timeoutSecs?: number;
|
|
46
49
|
}
|
|
47
50
|
/**
|
|
48
51
|
* Load and validate a CLI config file.
|
package/dist/ai/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,qBAAqB;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACxC;AAID,MAAM,WAAW,SAAS;IAEtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAGxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,qBAAqB;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACxC;AAID,MAAM,WAAW,SAAS;IAEtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAGxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AA0ED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CA2ExD;AAID;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SA4C7B,CAAC"}
|
package/dist/ai/config.js
CHANGED
|
@@ -24,9 +24,9 @@ const KNOWN_KEYS = new Set([
|
|
|
24
24
|
// Compression
|
|
25
25
|
'compress', 'compressMode', 'compressOptions',
|
|
26
26
|
// Cache
|
|
27
|
-
'cache', 'cacheTtlDays', 'cacheMaxEntries',
|
|
27
|
+
'cache', 'contextCache', 'cacheTtlDays', 'cacheMaxEntries',
|
|
28
28
|
// Misc
|
|
29
|
-
'verbose',
|
|
29
|
+
'verbose', 'timeoutSecs',
|
|
30
30
|
]);
|
|
31
31
|
const COMPRESS_OPTION_KEYS = new Set([
|
|
32
32
|
'removeComments', 'minifyWhitespace', 'extractSignaturesOnly', 'maxFileLines',
|
|
@@ -163,6 +163,8 @@ export function loadConfig(configPath) {
|
|
|
163
163
|
// Cache
|
|
164
164
|
if (obj.cache !== undefined)
|
|
165
165
|
config.cache = assertBoolean(obj, 'cache');
|
|
166
|
+
if (obj.contextCache !== undefined)
|
|
167
|
+
config.contextCache = assertBoolean(obj, 'contextCache');
|
|
166
168
|
if (obj.cacheTtlDays !== undefined)
|
|
167
169
|
config.cacheTtlDays = assertNumber(obj, 'cacheTtlDays');
|
|
168
170
|
if (obj.cacheMaxEntries !== undefined)
|
|
@@ -170,6 +172,8 @@ export function loadConfig(configPath) {
|
|
|
170
172
|
// Misc
|
|
171
173
|
if (obj.verbose !== undefined)
|
|
172
174
|
config.verbose = assertBoolean(obj, 'verbose');
|
|
175
|
+
if (obj.timeoutSecs !== undefined)
|
|
176
|
+
config.timeoutSecs = assertNumber(obj, 'timeoutSecs');
|
|
173
177
|
return config;
|
|
174
178
|
}
|
|
175
179
|
// ── Default template ────────────────────────────────────────────────────────
|
|
@@ -210,9 +214,11 @@ export const CONFIG_TEMPLATE = {
|
|
|
210
214
|
},
|
|
211
215
|
// Cache
|
|
212
216
|
cache: true,
|
|
217
|
+
contextCache: true,
|
|
213
218
|
cacheTtlDays: 7,
|
|
214
219
|
cacheMaxEntries: 100,
|
|
215
220
|
// Misc
|
|
216
221
|
verbose: false,
|
|
222
|
+
timeoutSecs: 120,
|
|
217
223
|
};
|
|
218
224
|
//# sourceMappingURL=config.js.map
|
package/dist/ai/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Responsibilities:
|
|
5
5
|
* - Wraps the context module with OpenRouter-based AI filtering (folder-filter.ts)
|
|
6
|
-
* - Caches full pipeline results keyed on paths + options
|
|
6
|
+
* - Caches full pipeline results keyed on paths + options (via unified ExaiCache)
|
|
7
7
|
* - Forwards all options to the context module
|
|
8
8
|
*/
|
|
9
9
|
import type { GatherResult as ModuleGatherResult, CompressOptions } from '../context/index.js';
|
|
@@ -22,10 +22,10 @@ export interface ContextOptions {
|
|
|
22
22
|
maxDepth?: number;
|
|
23
23
|
/** Max tree items before truncation (default: 1000) */
|
|
24
24
|
maxTreeItems?: number;
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
|
|
25
|
+
/** LLM request timeout in ms (default: 120000) */
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
/** If true, only return from cache — never re-gather. Returns null on miss. */
|
|
28
|
+
cacheOnly?: boolean;
|
|
29
29
|
}
|
|
30
30
|
export interface ContextResult extends ModuleGatherResult {
|
|
31
31
|
fromCache: boolean;
|
|
@@ -35,5 +35,5 @@ export interface ContextResult extends ModuleGatherResult {
|
|
|
35
35
|
* Gather context using the full pipeline:
|
|
36
36
|
* validate → pre-filter → tree → AI filter → read → compress → markdown
|
|
37
37
|
*/
|
|
38
|
-
export declare function gatherContext(paths: string[], options?: ContextOptions): Promise<ContextResult>;
|
|
38
|
+
export declare function gatherContext(paths: string[], options?: ContextOptions): Promise<ContextResult | null>;
|
|
39
39
|
//# sourceMappingURL=context-gatherer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-gatherer.d.ts","sourceRoot":"","sources":["../../src/ai/context-gatherer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"context-gatherer.d.ts","sourceRoot":"","sources":["../../src/ai/context-gatherer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,IAAI,kBAAkB,EAAE,eAAe,EAAc,MAAM,qBAAqB,CAAC;AAM3G,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAkCD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA6D/B"}
|
|
@@ -3,61 +3,20 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Responsibilities:
|
|
5
5
|
* - Wraps the context module with OpenRouter-based AI filtering (folder-filter.ts)
|
|
6
|
-
* - Caches full pipeline results keyed on paths + options
|
|
6
|
+
* - Caches full pipeline results keyed on paths + options (via unified ExaiCache)
|
|
7
7
|
* - Forwards all options to the context module
|
|
8
8
|
*/
|
|
9
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
10
|
-
import { createHash } from 'crypto';
|
|
11
|
-
import { tmpdir } from 'os';
|
|
12
9
|
import { validatePaths, gatherContext as gatherContextModule } from '../context/index.js';
|
|
13
10
|
import { filterFolders } from './folder-filter.js';
|
|
14
|
-
|
|
15
|
-
// ── Cache
|
|
11
|
+
import { cache, makeKey } from './cache.js';
|
|
12
|
+
// ── Cache key ─────────────────────────────────────────────────────────────────
|
|
16
13
|
function generateCacheKey(paths, options) {
|
|
17
|
-
|
|
18
|
-
[...paths].sort().join('|'),
|
|
19
|
-
options.compress ?? true,
|
|
20
|
-
options.allowTestFiles ?? false,
|
|
21
|
-
options.maxFileSize ?? 0,
|
|
22
|
-
options.maxDepth ?? 0,
|
|
23
|
-
options.maxTreeItems ?? 0,
|
|
24
|
-
(options.excludePatterns ?? []).sort().join(','),
|
|
25
|
-
JSON.stringify(options.compressOptions ?? {}),
|
|
26
|
-
];
|
|
27
|
-
return createHash('sha256').update(keyParts.join(':::')).digest('hex') + '_ctx.cache';
|
|
28
|
-
}
|
|
29
|
-
function getCached(cacheKey, verbose) {
|
|
30
|
-
try {
|
|
31
|
-
const cachePath = `${CACHE_DIR}/${cacheKey}`;
|
|
32
|
-
if (existsSync(cachePath)) {
|
|
33
|
-
if (verbose)
|
|
34
|
-
console.log(` Context cache hit: ${cacheKey}`);
|
|
35
|
-
return JSON.parse(readFileSync(cachePath, 'utf-8'));
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
if (verbose)
|
|
40
|
-
console.log(` Context cache read error: ${error}`);
|
|
41
|
-
}
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
function writeCache(cacheKey, result, verbose) {
|
|
45
|
-
try {
|
|
46
|
-
if (!existsSync(CACHE_DIR))
|
|
47
|
-
mkdirSync(CACHE_DIR, { recursive: true });
|
|
48
|
-
writeFileSync(`${CACHE_DIR}/${cacheKey}`, JSON.stringify(result), 'utf-8');
|
|
49
|
-
if (verbose)
|
|
50
|
-
console.log(` Context cached: ${CACHE_DIR}/${cacheKey}`);
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
if (verbose)
|
|
54
|
-
console.log(` Context cache write error: ${error}`);
|
|
55
|
-
}
|
|
14
|
+
return makeKey([...paths].sort().join('|'), options.compress ?? true, options.allowTestFiles ?? false, options.maxFileSize ?? 0, options.maxDepth ?? 0, options.maxTreeItems ?? 0, (options.excludePatterns ?? []).sort().join(','), JSON.stringify(options.compressOptions ?? {}));
|
|
56
15
|
}
|
|
57
16
|
// ── AI filter factory ─────────────────────────────────────────────────────────
|
|
58
|
-
function createAiFilter(apiKey, verbose = false, useCache = true, filterModel) {
|
|
17
|
+
function createAiFilter(apiKey, verbose = false, useCache = true, filterModel, timeoutMs) {
|
|
59
18
|
return async (tree) => {
|
|
60
|
-
const result = await filterFolders(tree, apiKey, filterModel, verbose, useCache);
|
|
19
|
+
const result = await filterFolders(tree, apiKey, filterModel, verbose, useCache, timeoutMs);
|
|
61
20
|
return result.excludePatterns;
|
|
62
21
|
};
|
|
63
22
|
}
|
|
@@ -67,7 +26,7 @@ function createAiFilter(apiKey, verbose = false, useCache = true, filterModel) {
|
|
|
67
26
|
* validate → pre-filter → tree → AI filter → read → compress → markdown
|
|
68
27
|
*/
|
|
69
28
|
export async function gatherContext(paths, options = {}) {
|
|
70
|
-
const { apiKey, filterModel, verbose = false, compress = true, compressOptions, useCache = true, excludePatterns = [], allowTestFiles = false, maxFileSize, maxDepth, maxTreeItems, } = options;
|
|
29
|
+
const { apiKey, filterModel, verbose = false, compress = true, compressOptions, useCache = true, excludePatterns = [], allowTestFiles = false, maxFileSize, maxDepth, maxTreeItems, timeoutMs, cacheOnly = false, } = options;
|
|
71
30
|
if (verbose) {
|
|
72
31
|
console.log(` Received ${paths.length} context path(s) to analyze:`);
|
|
73
32
|
paths.forEach(p => console.log(` - ${p}`));
|
|
@@ -76,18 +35,22 @@ export async function gatherContext(paths, options = {}) {
|
|
|
76
35
|
const validatedPaths = validatePaths(paths);
|
|
77
36
|
// Check cache (key includes all options that affect output)
|
|
78
37
|
const cacheKey = generateCacheKey(validatedPaths, options);
|
|
79
|
-
if (useCache) {
|
|
80
|
-
const cached =
|
|
38
|
+
if (useCache || cacheOnly) {
|
|
39
|
+
const cached = cache.get('context', cacheKey);
|
|
81
40
|
if (cached) {
|
|
82
41
|
if (verbose)
|
|
83
42
|
console.log(` Using cached context (${(cached.markdown.length / 1024).toFixed(1)}KB)`);
|
|
84
43
|
return { ...cached, fromCache: true, cacheKey };
|
|
85
44
|
}
|
|
86
45
|
}
|
|
46
|
+
// cacheOnly: do not re-gather, signal miss to caller
|
|
47
|
+
if (cacheOnly) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
87
50
|
// Run full pipeline via context module
|
|
88
51
|
const result = await gatherContextModule(validatedPaths, {
|
|
89
52
|
excludePatterns,
|
|
90
|
-
aiFilter: createAiFilter(apiKey, verbose, useCache, filterModel),
|
|
53
|
+
aiFilter: createAiFilter(apiKey, verbose, useCache, filterModel, timeoutMs),
|
|
91
54
|
compress,
|
|
92
55
|
compressOptions,
|
|
93
56
|
allowTestFiles,
|
|
@@ -100,7 +63,7 @@ export async function gatherContext(paths, options = {}) {
|
|
|
100
63
|
});
|
|
101
64
|
// Cache the full result
|
|
102
65
|
if (useCache) {
|
|
103
|
-
|
|
66
|
+
cache.set('context', cacheKey, result);
|
|
104
67
|
}
|
|
105
68
|
return { ...result, fromCache: false, cacheKey };
|
|
106
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-gatherer.js","sourceRoot":"","sources":["../../src/ai/context-gatherer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"context-gatherer.js","sourceRoot":"","sources":["../../src/ai/context-gatherer.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,6 @@ interface FilterResult {
|
|
|
12
12
|
* Ask AI model to filter folders from a tree structure.
|
|
13
13
|
* Uses callLLM() as the underlying API call.
|
|
14
14
|
*/
|
|
15
|
-
export declare function filterFolders(treeStructure: string, apiKey?: string, model?: string, verbose?: boolean, useCache?: boolean): Promise<FilterResult>;
|
|
15
|
+
export declare function filterFolders(treeStructure: string, apiKey?: string, model?: string, verbose?: boolean, useCache?: boolean, timeoutMs?: number): Promise<FilterResult>;
|
|
16
16
|
export {};
|
|
17
17
|
//# sourceMappingURL=folder-filter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder-filter.d.ts","sourceRoot":"","sources":["../../src/ai/folder-filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH,UAAU,YAAY;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,GAAE,MAAsB,EAC7B,OAAO,GAAE,OAAe,EACxB,QAAQ,GAAE,OAAc,
|
|
1
|
+
{"version":3,"file":"folder-filter.d.ts","sourceRoot":"","sources":["../../src/ai/folder-filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH,UAAU,YAAY;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,GAAE,MAAsB,EAC7B,OAAO,GAAE,OAAe,EACxB,QAAQ,GAAE,OAAc,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,CAsDvB"}
|
package/dist/ai/folder-filter.js
CHANGED
|
@@ -30,7 +30,7 @@ Do NOT include explanations or other text. ONLY the JSON array.`;
|
|
|
30
30
|
* Ask AI model to filter folders from a tree structure.
|
|
31
31
|
* Uses callLLM() as the underlying API call.
|
|
32
32
|
*/
|
|
33
|
-
export async function filterFolders(treeStructure, apiKey, model = DEFAULT_MODEL, verbose = false, useCache = true) {
|
|
33
|
+
export async function filterFolders(treeStructure, apiKey, model = DEFAULT_MODEL, verbose = false, useCache = true, timeoutMs) {
|
|
34
34
|
const startTime = Date.now();
|
|
35
35
|
const userMessage = `Analyze this project structure and suggest folders to exclude:\n\n${treeStructure}`;
|
|
36
36
|
const output = await callLLM(userMessage, FILTER_SYSTEM_PROMPT, {
|
|
@@ -40,6 +40,7 @@ export async function filterFolders(treeStructure, apiKey, model = DEFAULT_MODEL
|
|
|
40
40
|
verbose,
|
|
41
41
|
useCache,
|
|
42
42
|
cacheFormat: 'folder-filter',
|
|
43
|
+
timeoutMs,
|
|
43
44
|
});
|
|
44
45
|
// Parse JSON output
|
|
45
46
|
let excludePatterns;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder-filter.js","sourceRoot":"","sources":["../../src/ai/folder-filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;gEAoBmC,CAAC;AAQjE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAAqB,EACrB,MAAe,EACf,QAAgB,aAAa,EAC7B,UAAmB,KAAK,EACxB,WAAoB,IAAI;
|
|
1
|
+
{"version":3,"file":"folder-filter.js","sourceRoot":"","sources":["../../src/ai/folder-filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;gEAoBmC,CAAC;AAQjE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAAqB,EACrB,MAAe,EACf,QAAgB,aAAa,EAC7B,UAAmB,KAAK,EACxB,WAAoB,IAAI,EACxB,SAAkB;IAElB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,WAAW,GAAG,qEAAqE,aAAa,EAAE,CAAC;IAEzG,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,oBAAoB,EAAE;QAC9D,MAAM;QACN,KAAK;QACL,WAAW,EAAE,CAAC;QACd,OAAO;QACP,QAAQ;QACR,WAAW,EAAE,eAAe;QAC5B,SAAS;KACV,CAAC,CAAC;IAEH,oBAAoB;IACpB,IAAI,eAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAE9D,mCAAmC;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;QAED,6DAA6D;QAC7D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAEtD,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,kDAAkD,MAAM,cAAc,KAAK,CAAC,OAAO,EAAE,CACtF,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAE5C,OAAO;QACL,eAAe;QACf,YAAY;QACZ,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC"}
|
package/dist/ai/openrouter.d.ts
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* callLLM() → generic reusable LLM call (base)
|
|
5
5
|
* generateFlowchartInput() → flowchart-specific wrapper (uses callLLM)
|
|
6
6
|
*/
|
|
7
|
-
import { type CacheOptions } from './query-cache.js';
|
|
8
7
|
export type OutputFormat = 'dsl' | 'json';
|
|
9
8
|
export interface CallLLMOptions {
|
|
10
9
|
model?: string;
|
|
@@ -12,11 +11,14 @@ export interface CallLLMOptions {
|
|
|
12
11
|
temperature?: number;
|
|
13
12
|
verbose?: boolean;
|
|
14
13
|
useCache?: boolean;
|
|
15
|
-
cacheOptions?: CacheOptions;
|
|
16
14
|
/** Cache format key - used to separate cache namespaces (default: 'text') */
|
|
17
15
|
cacheFormat?: string;
|
|
18
16
|
/** Context string hashed into cache key for more precise cache hits */
|
|
19
17
|
cacheContext?: string;
|
|
18
|
+
/** Request timeout in milliseconds (default: 120000 = 2 min) */
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
/** If true, only return from cache — never call the API. Throws on miss. */
|
|
21
|
+
cacheOnly?: boolean;
|
|
20
22
|
}
|
|
21
23
|
export interface GenerateOptions {
|
|
22
24
|
model?: string;
|
|
@@ -25,7 +27,9 @@ export interface GenerateOptions {
|
|
|
25
27
|
context?: string;
|
|
26
28
|
verbose?: boolean;
|
|
27
29
|
useCache?: boolean;
|
|
28
|
-
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
/** If true, only return from cache — never call the API. Throws on miss. */
|
|
32
|
+
cacheOnly?: boolean;
|
|
29
33
|
}
|
|
30
34
|
/**
|
|
31
35
|
* Generic LLM call via OpenRouter.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/ai/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/ai/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqHH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAiDD;;;;;GAKG;AACH,wBAAsB,OAAO,CACzB,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,GAAE,cAAmB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAiGjB;AAID;;;GAGG;AACH,wBAAsB,sBAAsB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,eAAoB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAkEjB"}
|