@backendkit-labs/curator-codex-agent 0.2.0 → 1.0.1
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/analyzer.d.ts +1 -17
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +80 -163
- package/dist/analyzer.js.map +1 -1
- package/dist/audit.d.ts +27 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +43 -0
- package/dist/audit.js.map +1 -0
- package/dist/checksum.d.ts +0 -22
- package/dist/checksum.d.ts.map +1 -1
- package/dist/checksum.js +14 -103
- package/dist/checksum.js.map +1 -1
- package/dist/documentation-curator.d.ts +1 -1
- package/dist/documentation-curator.d.ts.map +1 -1
- package/dist/documentation-curator.js +79 -95
- package/dist/documentation-curator.js.map +1 -1
- package/dist/index.d.ts +19 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -22
- package/dist/index.js.map +1 -1
- package/dist/knowledge/embedder-worker.d.ts +2 -0
- package/dist/knowledge/embedder-worker.d.ts.map +1 -0
- package/dist/knowledge/embedder-worker.js +55 -0
- package/dist/knowledge/embedder-worker.js.map +1 -0
- package/dist/knowledge/engine.d.ts +10 -56
- package/dist/knowledge/engine.d.ts.map +1 -1
- package/dist/knowledge/engine.js +42 -153
- package/dist/knowledge/engine.js.map +1 -1
- package/dist/knowledge/rag-provider.d.ts +14 -56
- package/dist/knowledge/rag-provider.d.ts.map +1 -1
- package/dist/knowledge/rag-provider.js +63 -154
- package/dist/knowledge/rag-provider.js.map +1 -1
- package/dist/knowledge/synthesis.d.ts +0 -10
- package/dist/knowledge/synthesis.d.ts.map +1 -1
- package/dist/knowledge/synthesis.js +32 -77
- package/dist/knowledge/synthesis.js.map +1 -1
- package/dist/knowledge/transformers-embedder.d.ts +61 -0
- package/dist/knowledge/transformers-embedder.d.ts.map +1 -0
- package/dist/knowledge/transformers-embedder.js +222 -0
- package/dist/knowledge/transformers-embedder.js.map +1 -0
- package/dist/pdf-reader.d.ts +11 -0
- package/dist/pdf-reader.d.ts.map +1 -0
- package/dist/pdf-reader.js +21 -0
- package/dist/pdf-reader.js.map +1 -0
- package/dist/project.d.ts +28 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +88 -0
- package/dist/project.js.map +1 -0
- package/dist/providers/anthropic-adapter.d.ts +2 -2
- package/dist/providers/anthropic-adapter.d.ts.map +1 -1
- package/dist/providers/anthropic-adapter.js +7 -13
- package/dist/providers/anthropic-adapter.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +13 -20
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai-adapter.d.ts +2 -2
- package/dist/providers/openai-adapter.d.ts.map +1 -1
- package/dist/providers/openai-adapter.js +7 -13
- package/dist/providers/openai-adapter.js.map +1 -1
- package/dist/providers/types.d.ts +8 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +1 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -3
- package/dist/types.js.map +1 -1
- package/dist/vault-dedup.d.ts +35 -0
- package/dist/vault-dedup.d.ts.map +1 -0
- package/dist/vault-dedup.js +130 -0
- package/dist/vault-dedup.js.map +1 -0
- package/package.json +45 -58
- package/AGENT.md +0 -187
- package/README.md +0 -475
- package/dist/api/config.d.ts +0 -57
- package/dist/api/config.d.ts.map +0 -1
- package/dist/api/config.js +0 -183
- package/dist/api/config.js.map +0 -1
- package/dist/api/http-server.d.ts +0 -24
- package/dist/api/http-server.d.ts.map +0 -1
- package/dist/api/http-server.js +0 -108
- package/dist/api/http-server.js.map +0 -1
- package/dist/api/routes.d.ts +0 -8
- package/dist/api/routes.d.ts.map +0 -1
- package/dist/api/routes.js +0 -382
- package/dist/api/routes.js.map +0 -1
- package/dist/api/security.d.ts +0 -107
- package/dist/api/security.d.ts.map +0 -1
- package/dist/api/security.js +0 -200
- package/dist/api/security.js.map +0 -1
- package/dist/http-server-main.d.ts +0 -28
- package/dist/http-server-main.d.ts.map +0 -1
- package/dist/http-server-main.js +0 -69
- package/dist/http-server-main.js.map +0 -1
- package/dist/server.d.ts +0 -33
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -640
- package/dist/server.js.map +0 -1
- package/dist/watcher.d.ts +0 -26
- package/dist/watcher.d.ts.map +0 -1
- package/dist/watcher.js +0 -168
- package/dist/watcher.js.map +0 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { Worker } from 'node:worker_threads';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
const DEFAULT_POOL_SIZE = 2;
|
|
5
|
+
// Don't split a batch into more chunks than this would leave per chunk — below this,
|
|
6
|
+
// the fixed per-call overhead (worker round-trip, tokenizer setup) stops being worth
|
|
7
|
+
// paying for the extra parallelism. Benchmarked against a small-pool workload; revisit
|
|
8
|
+
// if CODEX_EMBED_WORKERS is tuned for a much larger concurrent load.
|
|
9
|
+
const MIN_TEXTS_PER_CHUNK = 8;
|
|
10
|
+
// How long to hold a batch open waiting for more concurrent embed() calls to join it,
|
|
11
|
+
// measured from the first call in the batch (not reset on each new arrival — a steady
|
|
12
|
+
// stream of calls would otherwise starve the flush indefinitely). setImmediate only
|
|
13
|
+
// catches calls issued in the exact same tick; real bursts (e.g. curate_path walking a
|
|
14
|
+
// directory) tend to arrive a few ms apart, missing that window entirely. Every call
|
|
15
|
+
// pays this as fixed added latency, so keep it small.
|
|
16
|
+
const DEFAULT_BATCH_WINDOW_MS = 8;
|
|
17
|
+
/** One worker thread plus its own in-flight request table — the pool's unit of dispatch. */
|
|
18
|
+
class WorkerSlot {
|
|
19
|
+
worker;
|
|
20
|
+
pending = new Map();
|
|
21
|
+
constructor(worker) {
|
|
22
|
+
this.worker = worker;
|
|
23
|
+
}
|
|
24
|
+
get inFlight() {
|
|
25
|
+
return this.pending.size;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Embedder backed by a pool of worker threads (see embedder-worker.ts). The
|
|
30
|
+
* transformers.js model inference is CPU-bound and single-threaded per worker;
|
|
31
|
+
* running it off the main thread keeps the MCP server responsive to search_vault
|
|
32
|
+
* while a reindex embeds in background.
|
|
33
|
+
*
|
|
34
|
+
* Two things that matter under concurrent load from multiple callers:
|
|
35
|
+
* - **Pool, not one worker.** A single worker serializes every embed() behind
|
|
36
|
+
* one CPU-bound thread — concurrent callers just queue. A bounded pool
|
|
37
|
+
* (CODEX_EMBED_WORKERS, default 2, capped at os.cpus().length) lets that many
|
|
38
|
+
* embed batches actually run in parallel instead.
|
|
39
|
+
* - **Micro-batching.** embed() calls made within a short window (CODEX_EMBED_BATCH_MS,
|
|
40
|
+
* default 8ms — not just the same event-loop tick) are merged and split across the
|
|
41
|
+
* pool (see flushBatch()), amortizing the model's fixed per-call overhead across
|
|
42
|
+
* calls that arrive close together but not perfectly simultaneously.
|
|
43
|
+
*/
|
|
44
|
+
export class TransformersEmbedder {
|
|
45
|
+
model;
|
|
46
|
+
quantized = true;
|
|
47
|
+
poolSize;
|
|
48
|
+
batchWindowMs;
|
|
49
|
+
slots = [];
|
|
50
|
+
seq = 0;
|
|
51
|
+
progressCb;
|
|
52
|
+
batchQueue = [];
|
|
53
|
+
batchScheduled = false;
|
|
54
|
+
constructor(modelId = 'Xenova/nomic-embed-text-v1', poolSize, batchWindowMs) {
|
|
55
|
+
this.model = modelId;
|
|
56
|
+
const envSize = parseInt(process.env.CODEX_EMBED_WORKERS ?? '', 10);
|
|
57
|
+
const requested = poolSize ?? (Number.isFinite(envSize) && envSize > 0 ? envSize : DEFAULT_POOL_SIZE);
|
|
58
|
+
this.poolSize = Math.max(1, Math.min(requested, os.cpus().length));
|
|
59
|
+
const envWindow = parseInt(process.env.CODEX_EMBED_BATCH_MS ?? '', 10);
|
|
60
|
+
this.batchWindowMs = batchWindowMs
|
|
61
|
+
?? (Number.isFinite(envWindow) && envWindow >= 0 ? envWindow : DEFAULT_BATCH_WINDOW_MS);
|
|
62
|
+
}
|
|
63
|
+
// ── Pool management ──────────────────────────────────────────────────────
|
|
64
|
+
ensurePool() {
|
|
65
|
+
if (this.slots.length === 0) {
|
|
66
|
+
for (let i = 0; i < this.poolSize; i++) {
|
|
67
|
+
this.slots.push(this.spawnWorker());
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return this.slots;
|
|
71
|
+
}
|
|
72
|
+
spawnWorker() {
|
|
73
|
+
const workerPath = fileURLToPath(new URL('./embedder-worker.js', import.meta.url));
|
|
74
|
+
const worker = new Worker(workerPath);
|
|
75
|
+
const slot = new WorkerSlot(worker);
|
|
76
|
+
worker.on('message', (msg) => {
|
|
77
|
+
if (msg.type === 'progress') {
|
|
78
|
+
if (msg.info)
|
|
79
|
+
this.progressCb?.(msg.info);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (typeof msg.id !== 'number')
|
|
83
|
+
return;
|
|
84
|
+
const p = slot.pending.get(msg.id);
|
|
85
|
+
if (!p)
|
|
86
|
+
return;
|
|
87
|
+
slot.pending.delete(msg.id);
|
|
88
|
+
this.updateRef(slot);
|
|
89
|
+
if (msg.ok)
|
|
90
|
+
p.resolve(msg);
|
|
91
|
+
else
|
|
92
|
+
p.reject(new Error(msg.error ?? 'embedder worker error'));
|
|
93
|
+
});
|
|
94
|
+
worker.on('error', (err) => {
|
|
95
|
+
for (const p of slot.pending.values())
|
|
96
|
+
p.reject(err);
|
|
97
|
+
slot.pending.clear();
|
|
98
|
+
});
|
|
99
|
+
worker.on('exit', (code) => {
|
|
100
|
+
if (code !== 0) {
|
|
101
|
+
const err = new Error(`embedder worker exited with code ${code}`);
|
|
102
|
+
for (const p of slot.pending.values())
|
|
103
|
+
p.reject(err);
|
|
104
|
+
slot.pending.clear();
|
|
105
|
+
}
|
|
106
|
+
this.slots = this.slots.filter(s => s !== slot);
|
|
107
|
+
});
|
|
108
|
+
// Idle worker should not keep the process alive on its own; ref() only
|
|
109
|
+
// while it has requests in flight (see updateRef) so embeds never get cut off.
|
|
110
|
+
worker.unref();
|
|
111
|
+
return slot;
|
|
112
|
+
}
|
|
113
|
+
/** Keep the process alive while this worker has requests in flight, release it when idle. */
|
|
114
|
+
updateRef(slot) {
|
|
115
|
+
if (slot.inFlight > 0)
|
|
116
|
+
slot.worker.ref();
|
|
117
|
+
else
|
|
118
|
+
slot.worker.unref();
|
|
119
|
+
}
|
|
120
|
+
/** Least-busy routing — picks the slot with the fewest in-flight requests. */
|
|
121
|
+
pickSlot() {
|
|
122
|
+
const slots = this.ensurePool();
|
|
123
|
+
return slots.reduce((best, s) => (s.inFlight < best.inFlight ? s : best), slots[0]);
|
|
124
|
+
}
|
|
125
|
+
request(slot, payload) {
|
|
126
|
+
const id = ++this.seq;
|
|
127
|
+
return new Promise((resolve, reject) => {
|
|
128
|
+
slot.pending.set(id, { resolve, reject });
|
|
129
|
+
this.updateRef(slot);
|
|
130
|
+
slot.worker.postMessage({ id, model: this.model, quantized: this.quantized, ...payload });
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
// ── Public API ────────────────────────────────────────────────────────────
|
|
134
|
+
/**
|
|
135
|
+
* Warms up every worker in the pool so the first real embed() isn't the one
|
|
136
|
+
* paying model-load cost. The first worker inits alone (it may need to
|
|
137
|
+
* download the model); once cached to disk, the rest init in parallel since
|
|
138
|
+
* loading a cached model is fast and safe to parallelize.
|
|
139
|
+
*/
|
|
140
|
+
async init(onProgress) {
|
|
141
|
+
const alreadyCached = this.slots.length > 0;
|
|
142
|
+
const slots = this.ensurePool();
|
|
143
|
+
this.progressCb = onProgress;
|
|
144
|
+
try {
|
|
145
|
+
await this.request(slots[0], { type: 'init' });
|
|
146
|
+
this.progressCb = undefined;
|
|
147
|
+
if (slots.length > 1) {
|
|
148
|
+
await Promise.all(slots.slice(1).map(s => this.request(s, { type: 'init' })));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
this.progressCb = undefined;
|
|
153
|
+
}
|
|
154
|
+
return { alreadyCached };
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Embeds a batch of texts. Calls made within batchWindowMs of each other are
|
|
158
|
+
* merged into shared worker requests — see flushBatch().
|
|
159
|
+
*/
|
|
160
|
+
async embed(texts) {
|
|
161
|
+
if (texts.length === 0)
|
|
162
|
+
return [];
|
|
163
|
+
return new Promise((resolve, reject) => {
|
|
164
|
+
this.batchQueue.push({ texts, resolve, reject });
|
|
165
|
+
if (!this.batchScheduled) {
|
|
166
|
+
this.batchScheduled = true;
|
|
167
|
+
setTimeout(() => this.flushBatch(), this.batchWindowMs);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async embedOne(text) {
|
|
172
|
+
const results = await this.embed([text]);
|
|
173
|
+
return results[0] ?? [];
|
|
174
|
+
}
|
|
175
|
+
// ── Batching ──────────────────────────────────────────────────────────────
|
|
176
|
+
async flushBatch() {
|
|
177
|
+
const batch = this.batchQueue;
|
|
178
|
+
this.batchQueue = [];
|
|
179
|
+
this.batchScheduled = false;
|
|
180
|
+
if (batch.length === 0)
|
|
181
|
+
return;
|
|
182
|
+
// Split the batch across up to poolSize workers instead of sending it all to
|
|
183
|
+
// one — otherwise a pool of N idle workers buys nothing (everything still
|
|
184
|
+
// funnels through a single inference call) while still paying N times the
|
|
185
|
+
// model-load cost at init(). Also never split below MIN_TEXTS_PER_CHUNK texts
|
|
186
|
+
// per chunk — a pool sized for a bigger burst shouldn't over-shard a small batch.
|
|
187
|
+
const totalTexts = batch.reduce((n, e) => n + e.texts.length, 0);
|
|
188
|
+
const maxChunksByWork = Math.max(1, Math.floor(totalTexts / MIN_TEXTS_PER_CHUNK));
|
|
189
|
+
const chunkCount = Math.min(this.ensurePool().length, batch.length, maxChunksByWork);
|
|
190
|
+
const chunks = this.splitIntoChunks(batch, chunkCount);
|
|
191
|
+
await Promise.all(chunks.map(chunk => this.runChunk(chunk)));
|
|
192
|
+
}
|
|
193
|
+
splitIntoChunks(batch, chunkCount) {
|
|
194
|
+
const chunks = Array.from({ length: chunkCount }, () => []);
|
|
195
|
+
batch.forEach((entry, i) => chunks[i % chunkCount].push(entry));
|
|
196
|
+
return chunks;
|
|
197
|
+
}
|
|
198
|
+
async runChunk(chunk) {
|
|
199
|
+
if (chunk.length === 0)
|
|
200
|
+
return;
|
|
201
|
+
const allTexts = chunk.flatMap(e => e.texts);
|
|
202
|
+
// Picked per chunk, after earlier chunks in this same flush have already
|
|
203
|
+
// claimed a slot — inFlight is updated synchronously inside request(), so
|
|
204
|
+
// concurrent chunks land on different workers instead of piling onto one.
|
|
205
|
+
const slot = this.pickSlot();
|
|
206
|
+
try {
|
|
207
|
+
const reply = await this.request(slot, { type: 'embed', texts: allTexts });
|
|
208
|
+
const embeddings = reply.embeddings ?? [];
|
|
209
|
+
let offset = 0;
|
|
210
|
+
for (const entry of chunk) {
|
|
211
|
+
entry.resolve(embeddings.slice(offset, offset + entry.texts.length));
|
|
212
|
+
offset += entry.texts.length;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
217
|
+
for (const entry of chunk)
|
|
218
|
+
entry.reject(e);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=transformers-embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers-embedder.js","sourceRoot":"","sources":["../../src/knowledge/transformers-embedder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface PdfContent {
|
|
2
|
+
text: string;
|
|
3
|
+
pages: number;
|
|
4
|
+
filename: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Extract plain text from a PDF file.
|
|
8
|
+
* Returns the full text content, page count, and filename.
|
|
9
|
+
*/
|
|
10
|
+
export declare function extractPdfText(filePath: string): Promise<PdfContent>;
|
|
11
|
+
//# sourceMappingURL=pdf-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-reader.d.ts","sourceRoot":"","sources":["../src/pdf-reader.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAY1E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
// pdf-parse is CJS — use createRequire to load it safely in ESM/NodeNext
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
/**
|
|
7
|
+
* Extract plain text from a PDF file.
|
|
8
|
+
* Returns the full text content, page count, and filename.
|
|
9
|
+
*/
|
|
10
|
+
export async function extractPdfText(filePath) {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
12
|
+
const pdfParse = require('pdf-parse');
|
|
13
|
+
const buffer = await fs.readFile(filePath);
|
|
14
|
+
const data = await pdfParse(buffer);
|
|
15
|
+
return {
|
|
16
|
+
text: data.text.trim(),
|
|
17
|
+
pages: data.numpages,
|
|
18
|
+
filename: path.basename(filePath),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=pdf-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-reader.js","sourceRoot":"","sources":["../src/pdf-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,yEAAyE;AACzE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAQ/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACjD,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAgF,CAAC;IAErH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEpC,OAAO;QACH,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACtB,KAAK,EAAE,IAAI,CAAC,QAAQ;QACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;KACpC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ProjectContext {
|
|
2
|
+
projectName: string;
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
vaultPath: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolve the current project context.
|
|
8
|
+
*
|
|
9
|
+
* Priority for project root:
|
|
10
|
+
* 1. CODEX_PROJECT_PATH env var (explicit manual override)
|
|
11
|
+
* 2. CLAUDE_PROJECT_DIR env var — set by Claude Code itself on every spawned MCP
|
|
12
|
+
* server (project-scoped or user/global-scoped alike) to the active session's
|
|
13
|
+
* project root. This is what makes a single global mcpServers entry (registered
|
|
14
|
+
* once, used across every project) resolve to the right vault per project instead
|
|
15
|
+
* of needing a CODEX_PROJECT_PATH hardcoded per project.
|
|
16
|
+
* 3. Git root detected from CWD
|
|
17
|
+
* 4. CWD as fallback (non-git directories)
|
|
18
|
+
*
|
|
19
|
+
* Vault location: $BK_HOME/vaults/{project-name}/
|
|
20
|
+
* BK_HOME defaults to ~/.bk-agent/ — the unified platform infrastructure dir.
|
|
21
|
+
* Override with BK_HOME env var (e.g. for server deployments or rename).
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveProject(): Promise<ProjectContext>;
|
|
24
|
+
/**
|
|
25
|
+
* Find a vault note by title (fuzzy filename match) or by relative path within the vault.
|
|
26
|
+
*/
|
|
27
|
+
export declare function findNote(vaultPath: string, pathOrTitle: string): Promise<string>;
|
|
28
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,CAwB9D;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBtF"}
|
package/dist/project.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { initBkHome, bkPaths } from '@backendkit-labs/infra';
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the current project context.
|
|
7
|
+
*
|
|
8
|
+
* Priority for project root:
|
|
9
|
+
* 1. CODEX_PROJECT_PATH env var (explicit manual override)
|
|
10
|
+
* 2. CLAUDE_PROJECT_DIR env var — set by Claude Code itself on every spawned MCP
|
|
11
|
+
* server (project-scoped or user/global-scoped alike) to the active session's
|
|
12
|
+
* project root. This is what makes a single global mcpServers entry (registered
|
|
13
|
+
* once, used across every project) resolve to the right vault per project instead
|
|
14
|
+
* of needing a CODEX_PROJECT_PATH hardcoded per project.
|
|
15
|
+
* 3. Git root detected from CWD
|
|
16
|
+
* 4. CWD as fallback (non-git directories)
|
|
17
|
+
*
|
|
18
|
+
* Vault location: $BK_HOME/vaults/{project-name}/
|
|
19
|
+
* BK_HOME defaults to ~/.bk-agent/ — the unified platform infrastructure dir.
|
|
20
|
+
* Override with BK_HOME env var (e.g. for server deployments or rename).
|
|
21
|
+
*/
|
|
22
|
+
export async function resolveProject() {
|
|
23
|
+
const startPath = process.env.CODEX_PROJECT_PATH ?? process.env.CLAUDE_PROJECT_DIR ?? process.cwd();
|
|
24
|
+
let projectRoot;
|
|
25
|
+
let projectName;
|
|
26
|
+
try {
|
|
27
|
+
const gitRoot = execSync('git rev-parse --show-toplevel', {
|
|
28
|
+
cwd: startPath,
|
|
29
|
+
encoding: 'utf-8',
|
|
30
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
31
|
+
}).trim();
|
|
32
|
+
projectRoot = gitRoot;
|
|
33
|
+
projectName = path.basename(gitRoot);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
projectRoot = startPath;
|
|
37
|
+
projectName = path.basename(startPath);
|
|
38
|
+
}
|
|
39
|
+
await initBkHome();
|
|
40
|
+
const vaultPath = bkPaths.vault(projectName);
|
|
41
|
+
await fs.mkdir(vaultPath, { recursive: true });
|
|
42
|
+
return { projectName, projectRoot, vaultPath };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Find a vault note by title (fuzzy filename match) or by relative path within the vault.
|
|
46
|
+
*/
|
|
47
|
+
export async function findNote(vaultPath, pathOrTitle) {
|
|
48
|
+
// Treat as path if it looks like one
|
|
49
|
+
if (pathOrTitle.includes('/') || pathOrTitle.includes('\\') || pathOrTitle.endsWith('.md')) {
|
|
50
|
+
const resolved = path.isAbsolute(pathOrTitle)
|
|
51
|
+
? pathOrTitle
|
|
52
|
+
: path.join(vaultPath, pathOrTitle);
|
|
53
|
+
return await fs.readFile(resolved, 'utf-8');
|
|
54
|
+
}
|
|
55
|
+
// Search vault by filename containing the title
|
|
56
|
+
const searchTerm = pathOrTitle.toLowerCase().replace(/\s+/g, '-');
|
|
57
|
+
const found = await scanVaultForTitle(vaultPath, searchTerm);
|
|
58
|
+
if (found.length === 0) {
|
|
59
|
+
throw new Error(`Note not found in vault: "${pathOrTitle}"`);
|
|
60
|
+
}
|
|
61
|
+
// Return best match (most recently modified)
|
|
62
|
+
const stats = await Promise.all(found.map(async (f) => ({ path: f, mtime: (await fs.stat(f)).mtime.getTime() })));
|
|
63
|
+
stats.sort((a, b) => b.mtime - a.mtime);
|
|
64
|
+
return await fs.readFile(stats[0].path, 'utf-8');
|
|
65
|
+
}
|
|
66
|
+
async function scanVaultForTitle(dir, searchTerm) {
|
|
67
|
+
const results = [];
|
|
68
|
+
let entries;
|
|
69
|
+
try {
|
|
70
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return results;
|
|
74
|
+
}
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
const fullPath = path.join(dir, entry.name);
|
|
77
|
+
if (entry.isDirectory() && !entry.name.startsWith('.')) {
|
|
78
|
+
results.push(...await scanVaultForTitle(fullPath, searchTerm));
|
|
79
|
+
}
|
|
80
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
81
|
+
if (entry.name.toLowerCase().includes(searchTerm)) {
|
|
82
|
+
results.push(fullPath);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return results;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CuratorLLMProvider } from './types.js';
|
|
1
|
+
import type { CuratorLLMProvider, CompleteOptions } from './types.js';
|
|
2
2
|
export interface AnthropicAdapterOptions {
|
|
3
3
|
apiKey: string;
|
|
4
4
|
model?: string;
|
|
@@ -9,6 +9,6 @@ export declare class AnthropicAdapter implements CuratorLLMProvider {
|
|
|
9
9
|
private readonly model;
|
|
10
10
|
private readonly maxTokens;
|
|
11
11
|
constructor(opts: AnthropicAdapterOptions);
|
|
12
|
-
complete(systemPrompt: string, userMessage: string): Promise<string>;
|
|
12
|
+
complete(systemPrompt: string, userMessage: string, opts?: CompleteOptions): Promise<string>;
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=anthropic-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-adapter.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic-adapter.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,uBAAuB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAiB,YAAW,kBAAkB;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,IAAI,EAAE,uBAAuB;IAMnC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;CAWzG"}
|
|
@@ -1,20 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.AnthropicAdapter = void 0;
|
|
7
|
-
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
8
|
-
class AnthropicAdapter {
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
export class AnthropicAdapter {
|
|
9
3
|
client;
|
|
10
4
|
model;
|
|
11
5
|
maxTokens;
|
|
12
6
|
constructor(opts) {
|
|
13
|
-
this.client = new
|
|
14
|
-
this.model = opts.model ?? 'claude-
|
|
7
|
+
this.client = new Anthropic({ apiKey: opts.apiKey });
|
|
8
|
+
this.model = opts.model ?? 'claude-sonnet-4-6';
|
|
15
9
|
this.maxTokens = opts.maxTokens ?? 16384;
|
|
16
10
|
}
|
|
17
|
-
async complete(systemPrompt, userMessage) {
|
|
11
|
+
async complete(systemPrompt, userMessage, opts = {}) {
|
|
12
|
+
const json = opts.json !== false;
|
|
18
13
|
const response = await this.client.messages.create({
|
|
19
14
|
model: this.model,
|
|
20
15
|
max_tokens: this.maxTokens,
|
|
@@ -22,8 +17,7 @@ class AnthropicAdapter {
|
|
|
22
17
|
messages: [{ role: 'user', content: userMessage }],
|
|
23
18
|
});
|
|
24
19
|
const block = response.content[0];
|
|
25
|
-
return block?.type === 'text' ? block.text : '{}';
|
|
20
|
+
return block?.type === 'text' ? block.text : (json ? '{}' : '');
|
|
26
21
|
}
|
|
27
22
|
}
|
|
28
|
-
exports.AnthropicAdapter = AnthropicAdapter;
|
|
29
23
|
//# sourceMappingURL=anthropic-adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-adapter.js","sourceRoot":"","sources":["../../src/providers/anthropic-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"anthropic-adapter.js","sourceRoot":"","sources":["../../src/providers/anthropic-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAS1C,MAAM,OAAO,gBAAgB;IACR,MAAM,CAAY;IAClB,KAAK,CAAS;IACd,SAAS,CAAS;IAEnC,YAAY,IAA6B;QACrC,IAAI,CAAC,MAAM,GAAM,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,GAAO,IAAI,CAAC,KAAK,IAAQ,mBAAmB,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,YAAoB,EAAE,WAAmB,EAAE,OAAwB,EAAE;QAChF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC/C,KAAK,EAAO,IAAI,CAAC,KAAK;YACtB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,MAAM,EAAM,YAAY;YACxB,QAAQ,EAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;SACvD,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;CACJ"}
|
|
@@ -10,5 +10,5 @@ export interface ProviderConfig {
|
|
|
10
10
|
baseUrl?: string;
|
|
11
11
|
maxTokens?: number;
|
|
12
12
|
}
|
|
13
|
-
export declare function createProvider(cfg
|
|
13
|
+
export declare function createProvider(cfg: ProviderConfig): CuratorLLMProvider;
|
|
14
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAS,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,wBAAgB,cAAc,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAS,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,kBAAkB,CAYtE"}
|
package/dist/providers/index.js
CHANGED
|
@@ -1,29 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const openai_adapter_js_1 = require("./openai-adapter.js");
|
|
6
|
-
const anthropic_adapter_js_1 = require("./anthropic-adapter.js");
|
|
7
|
-
var openai_adapter_js_2 = require("./openai-adapter.js");
|
|
8
|
-
Object.defineProperty(exports, "OpenAIAdapter", { enumerable: true, get: function () { return openai_adapter_js_2.OpenAIAdapter; } });
|
|
9
|
-
var anthropic_adapter_js_2 = require("./anthropic-adapter.js");
|
|
10
|
-
Object.defineProperty(exports, "AnthropicAdapter", { enumerable: true, get: function () { return anthropic_adapter_js_2.AnthropicAdapter; } });
|
|
1
|
+
import { OpenAIAdapter } from './openai-adapter.js';
|
|
2
|
+
import { AnthropicAdapter } from './anthropic-adapter.js';
|
|
3
|
+
export { OpenAIAdapter } from './openai-adapter.js';
|
|
4
|
+
export { AnthropicAdapter } from './anthropic-adapter.js';
|
|
11
5
|
const DEFAULTS = {
|
|
12
6
|
deepseek: { model: 'deepseek-reasoner', baseUrl: 'https://api.deepseek.com/v1' },
|
|
13
7
|
openai: { model: 'o3-mini' },
|
|
14
8
|
ollama: { model: 'qwen2.5-coder:7b', baseUrl: 'http://localhost:11434/v1' },
|
|
15
|
-
anthropic: { model: 'claude-
|
|
9
|
+
anthropic: { model: 'claude-sonnet-4-6' },
|
|
16
10
|
};
|
|
17
|
-
function createProvider(cfg) {
|
|
18
|
-
const provider =
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
throw new Error('CURATOR_API_KEY env var is required');
|
|
11
|
+
export function createProvider(cfg) {
|
|
12
|
+
const provider = cfg.provider ?? 'deepseek';
|
|
13
|
+
const model = cfg.model ?? DEFAULTS[provider].model;
|
|
14
|
+
const baseUrl = cfg.baseUrl ?? DEFAULTS[provider].baseUrl;
|
|
15
|
+
if (!cfg.apiKey)
|
|
16
|
+
throw new Error('API key is required');
|
|
24
17
|
if (provider === 'anthropic') {
|
|
25
|
-
return new
|
|
18
|
+
return new AnthropicAdapter({ apiKey: cfg.apiKey, model, maxTokens: cfg.maxTokens });
|
|
26
19
|
}
|
|
27
|
-
return new
|
|
20
|
+
return new OpenAIAdapter({ apiKey: cfg.apiKey, model, baseUrl, maxTokens: cfg.maxTokens });
|
|
28
21
|
}
|
|
29
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAS,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,MAAS,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAa1D,MAAM,QAAQ,GAA8D;IACxE,QAAQ,EAAG,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,6BAA6B,EAAE;IACjF,MAAM,EAAK,EAAE,KAAK,EAAE,SAAS,EAAE;IAC/B,MAAM,EAAK,EAAE,KAAK,EAAE,kBAAkB,EAAG,OAAO,EAAE,2BAA2B,EAAE;IAC/E,SAAS,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE;CAC5C,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,GAAmB;IAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,UAAU,CAAC;IAC5C,MAAM,KAAK,GAAM,GAAG,CAAC,KAAK,IAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAI,GAAG,CAAC,OAAO,IAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;IAE5D,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAExD,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC3B,OAAO,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;AAC/F,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CuratorLLMProvider } from './types.js';
|
|
1
|
+
import type { CuratorLLMProvider, CompleteOptions } from './types.js';
|
|
2
2
|
export interface OpenAIAdapterOptions {
|
|
3
3
|
apiKey: string;
|
|
4
4
|
model: string;
|
|
@@ -11,6 +11,6 @@ export declare class OpenAIAdapter implements CuratorLLMProvider {
|
|
|
11
11
|
private readonly maxTokens;
|
|
12
12
|
private readonly isReasoner;
|
|
13
13
|
constructor(opts: OpenAIAdapterOptions);
|
|
14
|
-
complete(systemPrompt: string, userMessage: string): Promise<string>;
|
|
14
|
+
complete(systemPrompt: string, userMessage: string, opts?: CompleteOptions): Promise<string>;
|
|
15
15
|
}
|
|
16
16
|
//# sourceMappingURL=openai-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-adapter.d.ts","sourceRoot":"","sources":["../../src/providers/openai-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-adapter.d.ts","sourceRoot":"","sources":["../../src/providers/openai-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,aAAc,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;gBAEzB,IAAI,EAAE,oBAAoB;IAUhC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;CAczG"}
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.OpenAIAdapter = void 0;
|
|
7
|
-
const openai_1 = __importDefault(require("openai"));
|
|
8
|
-
class OpenAIAdapter {
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
export class OpenAIAdapter {
|
|
9
3
|
client;
|
|
10
4
|
model;
|
|
11
5
|
maxTokens;
|
|
12
6
|
isReasoner;
|
|
13
7
|
constructor(opts) {
|
|
14
|
-
this.client = new
|
|
8
|
+
this.client = new OpenAI({
|
|
15
9
|
apiKey: opts.apiKey,
|
|
16
10
|
baseURL: opts.baseUrl ?? 'https://api.deepseek.com/v1',
|
|
17
11
|
});
|
|
@@ -19,19 +13,19 @@ class OpenAIAdapter {
|
|
|
19
13
|
this.maxTokens = opts.maxTokens ?? 16384;
|
|
20
14
|
this.isReasoner = /reasoner|^o\d/.test(opts.model);
|
|
21
15
|
}
|
|
22
|
-
async complete(systemPrompt, userMessage) {
|
|
16
|
+
async complete(systemPrompt, userMessage, opts = {}) {
|
|
17
|
+
const json = opts.json !== false;
|
|
23
18
|
const completion = await this.client.chat.completions.create({
|
|
24
19
|
model: this.model,
|
|
25
20
|
max_tokens: this.maxTokens,
|
|
26
|
-
response_format: { type: 'json_object' },
|
|
21
|
+
...(json ? { response_format: { type: 'json_object' } } : {}),
|
|
27
22
|
...(this.isReasoner ? {} : { temperature: 0.2 }),
|
|
28
23
|
messages: [
|
|
29
24
|
{ role: 'system', content: systemPrompt },
|
|
30
25
|
{ role: 'user', content: userMessage },
|
|
31
26
|
],
|
|
32
27
|
});
|
|
33
|
-
return completion.choices[0]?.message?.content ?? '{}';
|
|
28
|
+
return completion.choices[0]?.message?.content ?? (json ? '{}' : '');
|
|
34
29
|
}
|
|
35
30
|
}
|
|
36
|
-
exports.OpenAIAdapter = OpenAIAdapter;
|
|
37
31
|
//# sourceMappingURL=openai-adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-adapter.js","sourceRoot":"","sources":["../../src/providers/openai-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai-adapter.js","sourceRoot":"","sources":["../../src/providers/openai-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAU5B,MAAM,OAAO,aAAa;IACL,MAAM,CAAS;IACf,KAAK,CAAS;IACd,SAAS,CAAS;IAClB,UAAU,CAAU;IAErC,YAAY,IAA0B;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACrB,MAAM,EAAG,IAAI,CAAC,MAAM;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,6BAA6B;SACzD,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAO,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QACzC,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,YAAoB,EAAE,WAAmB,EAAE,OAAwB,EAAE;QAChF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzD,KAAK,EAAY,IAAI,CAAC,KAAK;YAC3B,UAAU,EAAO,IAAI,CAAC,SAAS;YAC/B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,aAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;YAChD,QAAQ,EAAE;gBACN,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAI,OAAO,EAAE,WAAW,EAAE;aAC3C;SACJ,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;CACJ"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
export interface CompleteOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Force structured JSON output (default: true).
|
|
4
|
+
* Set to false for free-form text/markdown responses (e.g. synthesis).
|
|
5
|
+
*/
|
|
6
|
+
json?: boolean;
|
|
7
|
+
}
|
|
1
8
|
export interface CuratorLLMProvider {
|
|
2
|
-
complete(systemPrompt: string, userMessage: string): Promise<string>;
|
|
9
|
+
complete(systemPrompt: string, userMessage: string, opts?: CompleteOptions): Promise<string>;
|
|
3
10
|
}
|
|
4
11
|
//# sourceMappingURL=types.d.ts.map
|