capman 0.6.0 → 0.6.2
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/CODEBASE.md +6 -5
- package/dist/cjs/cache.d.ts +9 -0
- package/dist/cjs/cache.d.ts.map +1 -1
- package/dist/cjs/cache.js +37 -7
- package/dist/cjs/cache.js.map +1 -1
- package/dist/cjs/concurrent.d.ts +53 -0
- package/dist/cjs/concurrent.d.ts.map +1 -0
- package/dist/cjs/concurrent.js +71 -0
- package/dist/cjs/concurrent.js.map +1 -0
- package/dist/cjs/engine.d.ts +92 -7
- package/dist/cjs/engine.d.ts.map +1 -1
- package/dist/cjs/engine.js +269 -57
- package/dist/cjs/engine.js.map +1 -1
- package/dist/cjs/generator.d.ts.map +1 -1
- package/dist/cjs/generator.js +28 -6
- package/dist/cjs/generator.js.map +1 -1
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +5 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/learning.d.ts +16 -1
- package/dist/cjs/learning.d.ts.map +1 -1
- package/dist/cjs/learning.js +95 -14
- package/dist/cjs/learning.js.map +1 -1
- package/dist/cjs/matcher.d.ts +51 -2
- package/dist/cjs/matcher.d.ts.map +1 -1
- package/dist/cjs/matcher.js +173 -33
- package/dist/cjs/matcher.js.map +1 -1
- package/dist/cjs/parser.js +27 -9
- package/dist/cjs/parser.js.map +1 -1
- package/dist/cjs/resolver.d.ts +2 -2
- package/dist/cjs/resolver.d.ts.map +1 -1
- package/dist/cjs/resolver.js +66 -26
- package/dist/cjs/resolver.js.map +1 -1
- package/dist/cjs/schema.d.ts +821 -68
- package/dist/cjs/schema.d.ts.map +1 -1
- package/dist/cjs/schema.js +62 -13
- package/dist/cjs/schema.js.map +1 -1
- package/dist/cjs/types.d.ts +156 -9
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/cache.d.ts +9 -0
- package/dist/esm/cache.js +37 -7
- package/dist/esm/concurrent.d.ts +52 -0
- package/dist/esm/concurrent.js +66 -0
- package/dist/esm/engine.d.ts +92 -7
- package/dist/esm/engine.js +270 -58
- package/dist/esm/generator.js +28 -6
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/learning.d.ts +16 -1
- package/dist/esm/learning.js +95 -14
- package/dist/esm/matcher.d.ts +51 -2
- package/dist/esm/matcher.js +170 -33
- package/dist/esm/parser.js +27 -9
- package/dist/esm/resolver.d.ts +2 -2
- package/dist/esm/resolver.js +66 -26
- package/dist/esm/schema.d.ts +821 -68
- package/dist/esm/schema.js +62 -13
- package/dist/esm/types.d.ts +156 -9
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
package/CODEBASE.md
CHANGED
|
@@ -169,12 +169,11 @@ Usage analytics and keyword index — incremental, PII-safe.
|
|
|
169
169
|
|
|
170
170
|
Key exports:
|
|
171
171
|
- `LearningStore` interface — `record(entry)`, `getStats()`, `getTopCapabilities(limit)`, `getIndex()`, `destroy()`
|
|
172
|
-
- `FileLearningStore` — persists to `.capman/learning.json`, caps at 10,000 entries. Saves debounced (5s) with synchronous flush on process exit
|
|
173
|
-
- `MemoryLearningStore` — in-memory only, used in tests
|
|
174
|
-
- `LearningIndex` — internal class shared by both stores. Maintains keyword index and stats counters incrementally. Eliminates ~80 lines of duplication
|
|
172
|
+
- `FileLearningStore(filePath, halfLifeDays)` — persists to `.capman/learning.json`, caps at 10,000 entries. Saves debounced (5s) with synchronous flush on process exit. Migration guard: pre-v0.7 entries without `lastUpdated` use file mtime as fallback
|
|
173
|
+
- `MemoryLearningStore(halfLifeDays)` — in-memory only, used in tests
|
|
174
|
+
- `LearningIndex(halfLifeDays)` — internal class shared by both stores. Maintains keyword index and stats counters incrementally. Time decay applied lazily on `getStats()` read — not on write. `halfLifeDays` must be positive; throws `RangeError` otherwise Eliminates ~80 lines of duplication
|
|
175
175
|
|
|
176
|
-
`LearningEntry
|
|
177
|
-
- `query` — stored as tokenized keywords only, never raw text. PII (emails, names, IDs) stripped before persistence
|
|
176
|
+
- `LearningEntry` — query stored as tokenized keywords only (PII-safe), plus capabilityId, confidence, intent, resolvedVia, timestamp, `lastUpdated` (ms since epoch — used for time decay)
|
|
178
177
|
- `capabilityId`, `confidence`, `intent`, `extractedParams`
|
|
179
178
|
- `resolvedVia: 'keyword' | 'llm' | 'cache'`
|
|
180
179
|
- `timestamp`
|
|
@@ -222,6 +221,8 @@ Key exports:
|
|
|
222
221
|
- `cacheTtlMs` — optional TTL for cache entries in ms (default: no expiry)
|
|
223
222
|
- `maxLLMCallsPerMinute` — rate limit (default: 60). Set to 0 to disable LLM entirely
|
|
224
223
|
- `llmCooldownMs`, `llmCircuitBreakerThreshold`, `llmCircuitBreakerResetMs`
|
|
224
|
+
- `learningHalfLifeDays` — half-life in days for time-decayed learning (default: 30). Only applies when engine creates its own default store
|
|
225
|
+
- `embedding` — optional `EmbeddingProvider` for semantic similarity. Pre-encodes capabilities at construction and after `loadManifest()`. Fused into RRF as third signal. Failures fall back gracefully to BM25+fuzzy
|
|
225
226
|
|
|
226
227
|
Matching pipeline in `ask()`:
|
|
227
228
|
1. Cache check — return immediately on hit (public capabilities only). Re-extracts params fresh from current query
|
package/dist/cjs/cache.d.ts
CHANGED
|
@@ -31,10 +31,19 @@ export declare class FileCache implements CacheStore {
|
|
|
31
31
|
private store;
|
|
32
32
|
private loadPromise;
|
|
33
33
|
private saveQueue;
|
|
34
|
+
private dirty;
|
|
35
|
+
private saveTimer;
|
|
34
36
|
constructor(filePath?: string);
|
|
35
37
|
private load;
|
|
36
38
|
private _doLoad;
|
|
37
39
|
private save;
|
|
40
|
+
/**
|
|
41
|
+
* Debounced save — batches evictions and rapid writes into a single disk flush.
|
|
42
|
+
* Prevents a flurry of full-file writes when many TTL-expired entries are read
|
|
43
|
+
* in quick succession (e.g. after a server restart with a stale cache file).
|
|
44
|
+
* Mirrors the scheduleSave() pattern in FileLearningStore.
|
|
45
|
+
*/
|
|
46
|
+
private scheduleSave;
|
|
38
47
|
private _doSave;
|
|
39
48
|
get(key: string, ttlMs?: number): Promise<CacheEntry | null>;
|
|
40
49
|
set(key: string, result: MatchResult): Promise<void>;
|
package/dist/cjs/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAK1C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAID,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CACxB;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;;;;GAKG;AAEH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAC7C,MAAM,CAQR;AAOD,qBAAa,WAAY,YAAW,UAAU;IAC5C,OAAO,CAAC,KAAK,CAAgC;IAEvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiB5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAepD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAC9B;AAMD,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,SAAS,CAA+C;gBAEpD,QAAQ,SAAuB;IAcvC,OAAO,CAAC,IAAI;YAUE,OAAO;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAK1C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAID,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CACxB;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;;;;GAKG;AAEH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAC7C,MAAM,CAQR;AAOD,qBAAa,WAAY,YAAW,UAAU;IAC5C,OAAO,CAAC,KAAK,CAAgC;IAEvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiB5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAepD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAC9B;AAMD,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,SAAS,CAA+C;gBAEpD,QAAQ,SAAuB;IAcvC,OAAO,CAAC,IAAI;YAUE,OAAO;IAwCzB,OAAO,CAAC,IAAI;IAKZ;;;;;OAKG;IACH,OAAO,CAAC,YAAY;YAaN,OAAO;IAYf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAuB5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAI9B;AAID,qBAAa,UAAW,YAAW,UAAU;IAC3C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,IAAI,CAAW;gBAEX,QAAQ,SAAuB;IAKrC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAY5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;0EACsE;IAChE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAG9B"}
|
package/dist/cjs/cache.js
CHANGED
|
@@ -112,6 +112,8 @@ class FileCache {
|
|
|
112
112
|
this.store = new Map();
|
|
113
113
|
this.loadPromise = null;
|
|
114
114
|
this.saveQueue = Promise.resolve();
|
|
115
|
+
this.dirty = false;
|
|
116
|
+
this.saveTimer = null;
|
|
115
117
|
const cwd = process.cwd();
|
|
116
118
|
const resolved = path.resolve(cwd, filePath);
|
|
117
119
|
const allowedPrefix = cwd === '/' ? '/' : cwd + path.sep;
|
|
@@ -141,12 +143,20 @@ class FileCache {
|
|
|
141
143
|
// e.g. "Show me articles" and "show me articles" collapse to the same key.
|
|
142
144
|
const normalized = new Map();
|
|
143
145
|
for (const [k, v] of Object.entries(parsed)) {
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
146
|
+
// Validate entry structure before accepting — a corrupted entry
|
|
147
|
+
// (null result, missing cachedAt) would cause runtime errors deep
|
|
148
|
+
// in the engine when capability fields are accessed.
|
|
149
|
+
if (v !== null && typeof v === 'object' &&
|
|
150
|
+
'result' in v && v.result !== null &&
|
|
151
|
+
typeof v.cachedAt === 'string') {
|
|
152
|
+
const storeKey = (k.startsWith('cap:') || k.startsWith('query:'))
|
|
153
|
+
? k
|
|
154
|
+
: normalizeQuery(k);
|
|
155
|
+
normalized.set(storeKey, v);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
logger_1.logger.warn(`File cache: skipping invalid entry for key "${k}"`);
|
|
159
|
+
}
|
|
150
160
|
}
|
|
151
161
|
this.store = normalized;
|
|
152
162
|
logger_1.logger.debug(`File cache loaded: ${this.store.size} entries`);
|
|
@@ -167,6 +177,24 @@ class FileCache {
|
|
|
167
177
|
this.saveQueue = this.saveQueue.then(() => this._doSave());
|
|
168
178
|
return this.saveQueue;
|
|
169
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Debounced save — batches evictions and rapid writes into a single disk flush.
|
|
182
|
+
* Prevents a flurry of full-file writes when many TTL-expired entries are read
|
|
183
|
+
* in quick succession (e.g. after a server restart with a stale cache file).
|
|
184
|
+
* Mirrors the scheduleSave() pattern in FileLearningStore.
|
|
185
|
+
*/
|
|
186
|
+
scheduleSave(urgencyMs = 5_000) {
|
|
187
|
+
this.dirty = true;
|
|
188
|
+
if (!this.saveTimer) {
|
|
189
|
+
this.saveTimer = setTimeout(() => {
|
|
190
|
+
this.saveTimer = null;
|
|
191
|
+
if (this.dirty) {
|
|
192
|
+
this.dirty = false;
|
|
193
|
+
this.save();
|
|
194
|
+
}
|
|
195
|
+
}, urgencyMs);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
170
198
|
async _doSave() {
|
|
171
199
|
try {
|
|
172
200
|
const dir = path.dirname(this.filePath);
|
|
@@ -186,7 +214,9 @@ class FileCache {
|
|
|
186
214
|
return null;
|
|
187
215
|
if (ttlMs && Date.now() - new Date(entry.cachedAt).getTime() > ttlMs) {
|
|
188
216
|
this.store.delete(key);
|
|
189
|
-
|
|
217
|
+
// Batch the eviction write — immediate save() on every expired read causes
|
|
218
|
+
// a full file rewrite per request during cold-start with a stale cache.
|
|
219
|
+
this.scheduleSave();
|
|
190
220
|
logger_1.logger.debug(`Cache entry expired (file): "${key}"`);
|
|
191
221
|
return null;
|
|
192
222
|
}
|
package/dist/cjs/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,wCAOC;AASD,sCAYC;AArDD,uCAAwB;AACxB,2CAA4B;AAE5B,qCAAiC;AAoBjC,iFAAiF;AAEjF,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK;SACT,WAAW,EAAE;SACb,IAAI,EAAE;SACN,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAE,gEAAgE;SACzF,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAA;AACX,CAAC;AAED;;;;;GAKG;AAEH,SAAgB,aAAa,CAC3B,KAAa,EACb,YAA2B,EAC3B,eAA8C;IAE9C,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,cAAc,CAAC,KAAK,CAAC,EAAE,CAAA;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;SAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;SAC7B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;SAC5B,IAAI,CAAC,GAAG,CAAC,CAAA;IACZ,OAAO,OAAO,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AAC/D,CAAC;AAED,iFAAiF;AAEjF,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAG5B,MAAa,WAAW;IAAxB;QACU,UAAK,GAAG,IAAI,GAAG,EAAsB,CAAA;IAoC/C,CAAC;IAlCC,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAc;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;gBACrE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACtB,eAAM,CAAC,KAAK,CAAC,kCAAkC,GAAG,GAAG,CAAC,CAAA;gBACtD,OAAO,IAAI,CAAA;YACb,CAAC;YACD,KAAK,CAAC,IAAI,EAAE,CAAA;YACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAC1B,eAAM,CAAC,KAAK,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAA;YAC5C,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,MAAmB;QACxC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;YAC7C,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACnD,eAAM,CAAC,KAAK,CAAC,wCAAwC,gBAAgB,WAAW,CAAC,CAAA;QACnF,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,GAAG;YACV,MAAM;YACN,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAClC,IAAI,EAAE,CAAC;SACR,CAAC,CAAA;QACF,eAAM,CAAC,KAAK,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,KAAK,KAAoB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,KAAsB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAA,CAAC,CAAC;CACzD;AArCD,kCAqCC;AAED,iFAAiF;AAEjF,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,MAAa,SAAS;IAQpB,YAAY,QAAQ,GAAG,oBAAoB;QANnC,UAAK,GAAkC,IAAI,GAAG,EAAE,CAAA;QAChD,gBAAW,GAA4B,IAAI,CAAA;QAC3C,cAAS,GAA8B,OAAO,CAAC,OAAO,EAAE,CAAA;QACxD,UAAK,GAAkC,KAAK,CAAA;QAC5C,cAAS,GAA2C,IAAI,CAAA;QAG9D,MAAM,GAAG,GAAQ,OAAO,CAAC,GAAG,EAAE,CAAA;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QAC5C,MAAM,aAAa,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QACxD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,mBAAmB,QAAQ,6CAA6C;gBACxE,aAAa,QAAQ,eAAe,GAAG,EAAE,CAC1C,CAAA;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,eAAM,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;IACrE,CAAC;IAEW,IAAI;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA,CAAE,2BAA2B;gBACpD,MAAM,GAAG,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAEW,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACP,MAAM,GAAG,GAAM,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACjE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC9B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,2EAA2E;gBAC3E,qEAAqE;gBACrE,2EAA2E;gBAC3E,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAA;gBAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5C,gEAAgE;oBAChE,kEAAkE;oBAClE,qDAAqD;oBACrD,IACE,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;wBACnC,QAAQ,IAAK,CAAY,IAAK,CAAgB,CAAC,MAAM,KAAK,IAAI;wBAC9D,OAAQ,CAAgB,CAAC,QAAQ,KAAK,QAAQ,EAC9C,CAAC;wBACD,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;4BAC/D,CAAC,CAAC,CAAC;4BACH,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;wBACrB,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAe,CAAC,CAAA;oBAC3C,CAAC;yBAAM,CAAC;wBACN,eAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,GAAG,CAAC,CAAA;oBAClE,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAA;gBACvB,eAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,CAAA;YAC/D,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,+CAA+C,CAAC,CAAA;YAC5F,CAAC;QACC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAA;YAChD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,eAAM,CAAC,IAAI,CAAC,kCAAkC,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,eAAe,oBAAoB,CAAC,CAAA;YAC9G,CAAC;YACD,6EAA6E;QAC/E,CAAC;IACP,CAAC;IAEO,IAAI;QACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1D,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED;;;;;OAKG;IACK,YAAY,CAAC,SAAS,GAAG,KAAK;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;gBACrB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;oBAClB,IAAI,CAAC,IAAI,EAAE,CAAA;gBACb,CAAC;YACH,CAAC,EAAE,SAAS,CAAC,CAAA;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACvC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACjD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,MAAM,CAAA;YAClC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACzF,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,eAAM,CAAC,IAAI,CAAC,gCAAgC,IAAI,CAAC,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACnH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAc;QACnC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAEvB,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;YACrE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACtB,2EAA2E;YAC3E,wEAAwE;YACxE,IAAI,CAAC,YAAY,EAAE,CAAA;YACnB,eAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,GAAG,CAAC,CAAA;YACpD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,KAAK,CAAC,IAAI,EAAE,CAAA;QACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,CAAI,mCAAmC;QAC7D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC1B,qDAAqD;QACrD,iFAAiF;QACjF,eAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,GAAG,CAAC,CAAA;QAC1C,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,MAAmB;QACxC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACjB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;YAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBACzB,eAAM,CAAC,KAAK,CAAC,6CAA6C,cAAc,WAAW,CAAC,CAAA;YACtF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,GAAG;YACV,MAAM;YACN,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAClC,IAAI,EAAE,CAAC;SACR,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACjB,eAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,GAAG,CAAC,CAAA;IAC5C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAClB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAA;IACxB,CAAC;CACF;AA/JD,8BA+JC;AAED,iFAAiF;AAEjF,MAAa,UAAU;IAIrB,YAAY,QAAQ,GAAG,oBAAoB;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,EAAE,CAAA;QAC/B,IAAI,CAAC,IAAI,GAAK,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAc;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAChD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAA;QAEzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC/C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;YAC1C,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,MAAmB;QACxC,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;SAC3B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;SAClB,CAAC,CAAA;IACJ,CAAC;IAED;0EACsE;IACtE,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IACzB,CAAC;CACF;AAxCD,gCAwCC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConcurrentCapmanEngine — a thin wrapper around CapmanEngine that serialises
|
|
3
|
+
* ask() and explain() calls via an internal promise queue.
|
|
4
|
+
*
|
|
5
|
+
* Use this when sharing a single CapmanEngine instance across concurrent async
|
|
6
|
+
* request handlers (e.g. a long-lived Express server with balanced/accurate mode).
|
|
7
|
+
*
|
|
8
|
+
* Why a promise queue instead of async-mutex:
|
|
9
|
+
* - Zero external dependencies — no new package.json entries for consumers
|
|
10
|
+
* - Identical serialisation guarantee to a FIFO mutex
|
|
11
|
+
* - Simpler audit surface
|
|
12
|
+
*
|
|
13
|
+
* Why opt-in, not default:
|
|
14
|
+
* - Per-request engine patterns pay zero overhead (recommended for most servers)
|
|
15
|
+
* - Cheap mode shared engines pay zero overhead
|
|
16
|
+
* - Consumer retains full control over their concurrency model
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // Safe shared engine across concurrent requests
|
|
20
|
+
* const engine = new ConcurrentCapmanEngine({ manifest, llm, mode: 'balanced' })
|
|
21
|
+
* app.post('/ask', async (req, res) => {
|
|
22
|
+
* const result = await engine.ask(req.body.query)
|
|
23
|
+
* res.json(result)
|
|
24
|
+
* })
|
|
25
|
+
*/
|
|
26
|
+
import { type EngineOptions, type EngineResult } from './engine';
|
|
27
|
+
import type { Manifest } from './types';
|
|
28
|
+
import type { ResolveOptions } from './resolver';
|
|
29
|
+
import type { ExplainResult } from './types';
|
|
30
|
+
export declare class ConcurrentCapmanEngine {
|
|
31
|
+
private engine;
|
|
32
|
+
/**
|
|
33
|
+
* The tail of the promise chain — each new call appends to this.
|
|
34
|
+
* On rejection, the queue resets to a resolved promise so subsequent
|
|
35
|
+
* calls are not permanently blocked by a single failure.
|
|
36
|
+
*/
|
|
37
|
+
private queue;
|
|
38
|
+
constructor(options: EngineOptions);
|
|
39
|
+
ask(query: string, overrides?: Partial<ResolveOptions>): Promise<EngineResult>;
|
|
40
|
+
explain(query: string): Promise<ExplainResult>;
|
|
41
|
+
/** Swap the manifest. Safe to call outside the queue — triggers cache clear internally. */
|
|
42
|
+
loadManifest(manifest: Manifest): Promise<void>;
|
|
43
|
+
/** Returns learning stats or null if learning is disabled. */
|
|
44
|
+
getStats(): Promise<import("./learning").KeywordStats | null>;
|
|
45
|
+
/** Returns top-N most frequently matched capabilities. */
|
|
46
|
+
getTopCapabilities(limit?: number): Promise<{
|
|
47
|
+
id: string;
|
|
48
|
+
hits: number;
|
|
49
|
+
}[]>;
|
|
50
|
+
/** Clear the cache. */
|
|
51
|
+
clearCache(): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=concurrent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrent.d.ts","sourceRoot":"","sources":["../../src/concurrent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAA;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAc;IAC5B;;;;OAIG;IACH,OAAO,CAAC,KAAK,CAAsC;gBAEvC,OAAO,EAAE,aAAa;IAIlC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ9E,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAQ9C,2FAA2F;IAC3F,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,8DAA8D;IAC9D,QAAQ;IAIR,0DAA0D;IAC1D,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM;;;;IAIjC,uBAAuB;IACvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ConcurrentCapmanEngine — a thin wrapper around CapmanEngine that serialises
|
|
4
|
+
* ask() and explain() calls via an internal promise queue.
|
|
5
|
+
*
|
|
6
|
+
* Use this when sharing a single CapmanEngine instance across concurrent async
|
|
7
|
+
* request handlers (e.g. a long-lived Express server with balanced/accurate mode).
|
|
8
|
+
*
|
|
9
|
+
* Why a promise queue instead of async-mutex:
|
|
10
|
+
* - Zero external dependencies — no new package.json entries for consumers
|
|
11
|
+
* - Identical serialisation guarantee to a FIFO mutex
|
|
12
|
+
* - Simpler audit surface
|
|
13
|
+
*
|
|
14
|
+
* Why opt-in, not default:
|
|
15
|
+
* - Per-request engine patterns pay zero overhead (recommended for most servers)
|
|
16
|
+
* - Cheap mode shared engines pay zero overhead
|
|
17
|
+
* - Consumer retains full control over their concurrency model
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // Safe shared engine across concurrent requests
|
|
21
|
+
* const engine = new ConcurrentCapmanEngine({ manifest, llm, mode: 'balanced' })
|
|
22
|
+
* app.post('/ask', async (req, res) => {
|
|
23
|
+
* const result = await engine.ask(req.body.query)
|
|
24
|
+
* res.json(result)
|
|
25
|
+
* })
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.ConcurrentCapmanEngine = void 0;
|
|
29
|
+
const engine_1 = require("./engine");
|
|
30
|
+
class ConcurrentCapmanEngine {
|
|
31
|
+
constructor(options) {
|
|
32
|
+
/**
|
|
33
|
+
* The tail of the promise chain — each new call appends to this.
|
|
34
|
+
* On rejection, the queue resets to a resolved promise so subsequent
|
|
35
|
+
* calls are not permanently blocked by a single failure.
|
|
36
|
+
*/
|
|
37
|
+
this.queue = Promise.resolve();
|
|
38
|
+
this.engine = new engine_1.CapmanEngine(options);
|
|
39
|
+
}
|
|
40
|
+
ask(query, overrides) {
|
|
41
|
+
const result = this.queue.then(() => this.engine.ask(query, overrides));
|
|
42
|
+
// Reset queue tail to resolved on failure — one bad call must not
|
|
43
|
+
// block all subsequent callers indefinitely.
|
|
44
|
+
this.queue = result.catch(() => { });
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
explain(query) {
|
|
48
|
+
const result = this.queue.then(() => this.engine.explain(query));
|
|
49
|
+
this.queue = result.catch(() => { });
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
// ── Delegated methods — safe to call directly, no serialisation needed ──
|
|
53
|
+
/** Swap the manifest. Safe to call outside the queue — triggers cache clear internally. */
|
|
54
|
+
loadManifest(manifest) {
|
|
55
|
+
return this.engine.loadManifest(manifest);
|
|
56
|
+
}
|
|
57
|
+
/** Returns learning stats or null if learning is disabled. */
|
|
58
|
+
getStats() {
|
|
59
|
+
return this.engine.getStats();
|
|
60
|
+
}
|
|
61
|
+
/** Returns top-N most frequently matched capabilities. */
|
|
62
|
+
getTopCapabilities(limit) {
|
|
63
|
+
return this.engine.getTopCapabilities(limit);
|
|
64
|
+
}
|
|
65
|
+
/** Clear the cache. */
|
|
66
|
+
clearCache() {
|
|
67
|
+
return this.engine.clearCache();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.ConcurrentCapmanEngine = ConcurrentCapmanEngine;
|
|
71
|
+
//# sourceMappingURL=concurrent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrent.js","sourceRoot":"","sources":["../../src/concurrent.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;;;AAEH,qCAA8E;AAK9E,MAAa,sBAAsB;IASjC,YAAY,OAAsB;QAPlC;;;;WAIG;QACK,UAAK,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAA;QAGjD,IAAI,CAAC,MAAM,GAAG,IAAI,qBAAY,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,SAAmC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAA;QACvE,kEAAkE;QAClE,6CAA6C;QAC7C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACnC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAChE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACnC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,2EAA2E;IAE3E,2FAA2F;IAC3F,YAAY,CAAC,QAAkB;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC3C,CAAC;IAED,8DAA8D;IAC9D,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;IAC/B,CAAC;IAED,0DAA0D;IAC1D,kBAAkB,CAAC,KAAc;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAC9C,CAAC;IAED,uBAAuB;IACvB,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAA;IACjC,CAAC;CACF;AAhDD,wDAgDC"}
|
package/dist/cjs/engine.d.ts
CHANGED
|
@@ -3,17 +3,34 @@ import type { LLMMatcherOptions } from './matcher';
|
|
|
3
3
|
import type { ResolveOptions, AuthContext } from './resolver';
|
|
4
4
|
import type { CacheStore } from './cache';
|
|
5
5
|
import type { LearningStore } from './learning';
|
|
6
|
+
import type { EmbeddingProvider } from './types';
|
|
6
7
|
import type { MatchMode } from './types';
|
|
7
8
|
/**
|
|
8
9
|
* Options for constructing a CapmanEngine instance.
|
|
9
10
|
*
|
|
10
|
-
* ⚠️ CONCURRENCY: CapmanEngine is
|
|
11
|
-
* async request handlers
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
11
|
+
* ⚠️ CONCURRENCY: CapmanEngine is NOT safe for sharing a single instance
|
|
12
|
+
* across concurrent async request handlers in a server environment.
|
|
13
|
+
*
|
|
14
|
+
* Node.js is single-threaded — classical data races do not apply. What does
|
|
15
|
+
* apply is async interleaving: two ask() chains can interleave at await
|
|
16
|
+
* suspension points. The following hazards are real:
|
|
17
|
+
*
|
|
18
|
+
* - Calling loadManifest() while ask() calls are in-flight: mitigated by
|
|
19
|
+
* an optimistic manifestVersion guard — in-flight results skip the cache
|
|
20
|
+
* write rather than polluting it with stale data.
|
|
21
|
+
* - Sharing one instance across concurrent balanced/accurate LLM calls:
|
|
22
|
+
* rate limiter and circuit-breaker state can interleave.
|
|
23
|
+
*
|
|
24
|
+
* The following are NOT hazards (synchronous within the event loop):
|
|
25
|
+
* - MemoryCache Map mutations
|
|
26
|
+
* - LLM counter increments (llmCallsThisMinute++ is atomic in Node.js)
|
|
27
|
+
* - statsCounter updates
|
|
28
|
+
*
|
|
29
|
+
* Safe patterns:
|
|
30
|
+
* (a) One engine per request — safest, zero shared state
|
|
31
|
+
* (b) Single shared instance in cheap mode only (no LLM calls)
|
|
32
|
+
* (c) ConcurrentCapmanEngine wrapper (v0.8.0) — serialises ask() via
|
|
33
|
+
* a zero-dependency promise queue
|
|
17
34
|
*
|
|
18
35
|
* @example
|
|
19
36
|
* // Safe — per-request engine
|
|
@@ -87,6 +104,15 @@ export interface EngineOptions {
|
|
|
87
104
|
* @default 60000
|
|
88
105
|
*/
|
|
89
106
|
llmCircuitBreakerResetMs?: number;
|
|
107
|
+
/**
|
|
108
|
+
* Half-life in days for time-decayed learning weights.
|
|
109
|
+
* A learning entry that is exactly this many days old retains 50% of its
|
|
110
|
+
* original weight. Older entries fade faster; recent ones dominate.
|
|
111
|
+
* Only applies when the engine creates its own default MemoryLearningStore.
|
|
112
|
+
* If you pass a custom learning store, configure halfLifeDays on it directly.
|
|
113
|
+
* @default 30
|
|
114
|
+
*/
|
|
115
|
+
learningHalfLifeDays?: number;
|
|
90
116
|
/**
|
|
91
117
|
* Enable fuzzy matching using Fuse.js — catches paraphrases, typos,
|
|
92
118
|
* and morphological variants that exact keyword matching misses.
|
|
@@ -114,6 +140,44 @@ export interface EngineOptions {
|
|
|
114
140
|
* When undefined, calibrated automatically from manifest score distribution.
|
|
115
141
|
*/
|
|
116
142
|
adaptiveMarginOverride?: number;
|
|
143
|
+
/**
|
|
144
|
+
* Target environment for server selection from manifest.servers[].
|
|
145
|
+
* When manifest.servers is present and this matches a server's environment,
|
|
146
|
+
* that server's URL is used as baseUrl.
|
|
147
|
+
* Falls back to first server, then EngineOptions.baseUrl if no match.
|
|
148
|
+
*/
|
|
149
|
+
environment?: string;
|
|
150
|
+
/**
|
|
151
|
+
* Half-life for time-decayed learning in days.
|
|
152
|
+
* A learning signal that is halfLifeDays old contributes half its original weight.
|
|
153
|
+
* Only applies when using the engine's default MemoryLearningStore.
|
|
154
|
+
* For FileLearningStore, pass halfLifeDays directly to its constructor.
|
|
155
|
+
* @default 30
|
|
156
|
+
*/
|
|
157
|
+
halfLifeDays?: number;
|
|
158
|
+
/**
|
|
159
|
+
* Optional embedding provider for semantic similarity matching.
|
|
160
|
+
* When provided, capability texts are pre-encoded at construction time
|
|
161
|
+
* and query embeddings are computed on each ask() call. The embedding
|
|
162
|
+
* signal is fused with BM25 and fuzzy signals via RRF.
|
|
163
|
+
*
|
|
164
|
+
* Zero mandatory dependencies — bring your own provider:
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* const engine = new CapmanEngine({
|
|
168
|
+
* manifest,
|
|
169
|
+
* embedding: {
|
|
170
|
+
* async encode(texts: string[]) {
|
|
171
|
+
* // call your embedding API here
|
|
172
|
+
* return texts.map(t => myEmbedModel.embed(t))
|
|
173
|
+
* }
|
|
174
|
+
* }
|
|
175
|
+
* })
|
|
176
|
+
*
|
|
177
|
+
* Note: embedding is purely additive — if encode() throws, the engine
|
|
178
|
+
* falls back to BM25 + fuzzy scoring without interrupting operation.
|
|
179
|
+
*/
|
|
180
|
+
embedding?: EmbeddingProvider;
|
|
117
181
|
}
|
|
118
182
|
export interface EngineResult {
|
|
119
183
|
match: MatchResult;
|
|
@@ -135,6 +199,7 @@ export declare class CapmanEngine {
|
|
|
135
199
|
/** Maximum allowed query length in characters. Queries exceeding this throw RangeError. */
|
|
136
200
|
static readonly MAX_QUERY_LENGTH = 1000;
|
|
137
201
|
private manifest;
|
|
202
|
+
private manifestVersion;
|
|
138
203
|
private mode;
|
|
139
204
|
private llm?;
|
|
140
205
|
private cache;
|
|
@@ -152,6 +217,11 @@ export declare class CapmanEngine {
|
|
|
152
217
|
private bm25B;
|
|
153
218
|
private marginAwareLLM;
|
|
154
219
|
private adaptiveMargin;
|
|
220
|
+
private environment?;
|
|
221
|
+
private embedding?;
|
|
222
|
+
private capEmbeddings?;
|
|
223
|
+
/** Resolves when the post-loadManifest re-encode completes. Awaited by buildEmbeddingScores(). */
|
|
224
|
+
private pendingEmbedding;
|
|
155
225
|
private maxLLMCallsPerMinute;
|
|
156
226
|
private llmCooldownMs;
|
|
157
227
|
private llmCircuitBreakerThreshold;
|
|
@@ -191,6 +261,12 @@ export declare class CapmanEngine {
|
|
|
191
261
|
*/
|
|
192
262
|
clearCache(): Promise<void>;
|
|
193
263
|
private checkManifestVersion;
|
|
264
|
+
private checkCapabilityLifecycle;
|
|
265
|
+
/** Cosine similarity between two equal-length vectors */
|
|
266
|
+
private cosineSim;
|
|
267
|
+
/** Encode query and return cosine similarity scores (0–100) keyed by capability ID */
|
|
268
|
+
private buildEmbeddingScores;
|
|
269
|
+
private checkMatchHint;
|
|
194
270
|
/**
|
|
195
271
|
* Replaces the active manifest without creating a new engine instance.
|
|
196
272
|
* Useful for hot-reloading manifests in long-running servers without
|
|
@@ -252,6 +328,11 @@ export declare class CapmanEngine {
|
|
|
252
328
|
* score boost — capped at +15 to avoid overriding strong keyword matches.
|
|
253
329
|
*/
|
|
254
330
|
private applyLearningBoost;
|
|
331
|
+
/**
|
|
332
|
+
* Resolves the effective baseUrl from manifest.servers[] or EngineOptions.baseUrl.
|
|
333
|
+
* Priority: environment-matched server > first server > explicit baseUrl > undefined
|
|
334
|
+
*/
|
|
335
|
+
private resolveBaseUrl;
|
|
255
336
|
private resolveOptions;
|
|
256
337
|
private recordLearning;
|
|
257
338
|
private calibrateBM25Ceiling;
|
|
@@ -266,6 +347,10 @@ export declare class CapmanEngine {
|
|
|
266
347
|
* For manifests with ≤100 capabilities this is negligible (<10ms).
|
|
267
348
|
* For very large manifests (500+ capabilities), consider passing
|
|
268
349
|
* `adaptiveMarginOverride` to skip calibration.
|
|
350
|
+
*
|
|
351
|
+
* Note: constructor total cost also includes BM25 index build O(capabilities × tokens)
|
|
352
|
+
* and embedding pre-encoding O(capabilities) if an EmbeddingProvider is configured.
|
|
353
|
+
* For 100 capabilities with embeddings, expect ~100–500ms depending on provider latency.
|
|
269
354
|
*/
|
|
270
355
|
private calibrateAdaptiveMargin;
|
|
271
356
|
private computeVerdict;
|
package/dist/cjs/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAa,aAAa,
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
|