@cortexkit/opencode-magic-context 0.30.2 → 0.30.3
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/README.md +1 -1
- package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
- package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
- package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
- package/dist/features/magic-context/recursive-text-splitter.d.ts +36 -0
- package/dist/features/magic-context/recursive-text-splitter.d.ts.map +1 -0
- package/dist/index.js +185 -2
- package/dist/shared/data-path.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/shared/data-path.test.ts +28 -0
- package/src/shared/data-path.ts +5 -0
package/README.md
CHANGED
|
@@ -280,7 +280,7 @@ Magic Context also writes to a few other locations:
|
|
|
280
280
|
|---|---|---|
|
|
281
281
|
| `~/.local/share/cortexkit/magic-context/context.db` | SQLite database — tags, compartments, memories, all durable state (XDG-equivalent on Windows) | **Must persist.** Losing it loses your memory/history. |
|
|
282
282
|
| `~/.local/share/cortexkit/magic-context/models/` | Local embedding model cache (~90 MB `Xenova/all-MiniLM-L6-v2` ONNX), downloaded on first use when local embeddings are enabled | Should persist, else re-downloaded each run. Not used when `memory.enabled: false` or an `openai_compatible`/`ollama` embedding backend is configured. |
|
|
283
|
-
| `${TMPDIR}/opencode/magic-context/magic-context.log
|
|
283
|
+
| `$MAGIC_CONTEXT_LOG_PATH` (default: `${TMPDIR}/opencode/magic-context/magic-context.log`, `pi/` for Pi) | Diagnostic log. Set `MAGIC_CONTEXT_LOG_PATH` to redirect it (e.g. to a persistent path in a container). | Disposable. |
|
|
284
284
|
|
|
285
285
|
**Sandboxed / ephemeral environments (Docker, CI, disposable containers):** mount the `~/.local/share/cortexkit/magic-context/` directory on a persistent volume so the database and model cache survive between runs. If only the model cache is ephemeral, the model is simply re-downloaded; if the database is ephemeral, memory and history don't accumulate. To avoid the ~90 MB model download entirely, set `memory.enabled: false` or point `embedding` at a remote `openai_compatible`/`ollama` backend.
|
|
286
286
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compartment-chunk-embedding.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/compartment-chunk-embedding.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compartment-chunk-embedding.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/compartment-chunk-embedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-openai.d.ts","sourceRoot":"","sources":["../../../../src/features/magic-context/memory/embedding-openai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGhF,UAAU,wCAAwC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAiBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAc/E;AA+BD,KAAK,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAEpD,qBAAa,iCAAkC,YAAW,iBAAiB;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,WAAW,CAAS;IAI5B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B;;4EAEwE;IACxE,OAAO,CAAC,mBAAmB,CAAS;IACpC;;sDAEkD;IAClD,OAAO,CAAC,qBAAqB,CAAS;gBAE1B,OAAO,EAAE,wCAAwC;IA0BvD,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IA0BpC,OAAO,CAAC,0BAA0B;IAO5B,KAAK,CACP,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKzB,UAAU,CACZ,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"embedding-openai.d.ts","sourceRoot":"","sources":["../../../../src/features/magic-context/memory/embedding-openai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGhF,UAAU,wCAAwC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAiBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAc/E;AA+BD,KAAK,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAEpD,qBAAa,iCAAkC,YAAW,iBAAiB;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,WAAW,CAAS;IAI5B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B;;4EAEwE;IACxE,OAAO,CAAC,mBAAmB,CAAS;IACpC;;sDAEkD;IAClD,OAAO,CAAC,qBAAqB,CAAS;gBAE1B,OAAO,EAAE,wCAAwC;IA0BvD,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IA0BpC,OAAO,CAAC,0BAA0B;IAO5B,KAAK,CACP,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKzB,UAAU,CACZ,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;IAuL7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,QAAQ,IAAI,OAAO;IAInB;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAsBhC,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,aAAa;IAUrB,gBAAgB,IAAI,YAAY;IAQhC,gBAAgB,IAAI,MAAM;IAG1B,aAAa,IAAI,IAAI;CAMxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-embedding-registry.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/project-embedding-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGzE,OAAO,KAAK,EAAE,QAAQ,EAAkC,MAAM,qBAAqB,CAAC;AAgCpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AA2DvF,MAAM,WAAW,iBAAiB;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,oCAAoC;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB;6EACyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;CACpB;AAmDD,oFAAoF;AACpF,wBAAgB,wBAAwB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAEtE;AAyTD,MAAM,WAAW,yBAAyB;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,uCAAuC,CACnD,EAAE,EAAE,QAAQ,EACZ,eAAe,EAAE,MAAM,EACvB,GAAG,SAAa,GACjB,yBAAyB,CAkG3B;AAED,wBAAgB,wBAAwB,CACpC,EAAE,EAAE,QAAQ,EACZ,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,iBAAiB,EAC3B,eAAe,EAAE,MAAM,GACxB,oCAAoC,CA2CtC;AAED,wBAAgB,gCAAgC,CAC5C,EAAE,EAAE,QAAQ,EACZ,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,eAAe,EAC7B,cAAc,EAAE,MAAM,GACvB,oCAAoC,CA0BtC;AAED,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAMxE;AAED,wBAAgB,2BAA2B,CACvC,eAAe,EAAE,MAAM,GACxB,oCAAoC,GAAG,IAAI,CAG7C;AAED,wBAAgB,+BAA+B,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAG/E;AAED,wBAAgB,iCAAiC,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CASjF;AAgBD,wBAAsB,mBAAmB,CACrC,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,gBAA4B,GACtC,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAqB/E;AAED,wBAAsB,oBAAoB,CACtC,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,gBAA4B,GACtC,OAAO,CAAC;IAAE,OAAO,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA0B3F;
|
|
1
|
+
{"version":3,"file":"project-embedding-registry.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/project-embedding-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal synchronous port of LangChain's `RecursiveCharacterTextSplitter`.
|
|
3
|
+
*
|
|
4
|
+
* Vendored (not depended on) so the plugin install stays lean and free of the
|
|
5
|
+
* supply-chain surface of the full `@langchain/textsplitters` package (whose
|
|
6
|
+
* bundled dist tripped an org Socket "obfuscated code" alert — a false positive
|
|
7
|
+
* on minified output, but a policy blocker). We only need the recursive
|
|
8
|
+
* character split for one job: cutting a single oversized canonical line down
|
|
9
|
+
* to a token budget. The Document/metadata/language-preset/token machinery in
|
|
10
|
+
* the upstream package is irrelevant here, so this keeps just the core
|
|
11
|
+
* algorithm (`splitOnSeparator` + `mergeSplits` + `_splitText`) and makes it
|
|
12
|
+
* synchronous (our `lengthFunction` is a sync tokenizer).
|
|
13
|
+
*
|
|
14
|
+
* Algorithm and separator hierarchy ported faithfully from
|
|
15
|
+
* `@langchain/textsplitters` v1.0.1 (`text_splitter.ts`), MIT-licensed
|
|
16
|
+
* (LangChain, Inc.). Behavior matches upstream for `keepSeparator: false`,
|
|
17
|
+
* `chunkOverlap: 0`, which is all this call site uses.
|
|
18
|
+
*/
|
|
19
|
+
/** Length of a piece of text, in whatever unit the caller measures (tokens). */
|
|
20
|
+
export type LengthFunction = (text: string) => number;
|
|
21
|
+
export interface RecursiveCharacterSplitOptions {
|
|
22
|
+
/** Max length (in `lengthFunction` units) of an emitted chunk. */
|
|
23
|
+
chunkSize: number;
|
|
24
|
+
/** Length function; defaults to character count. */
|
|
25
|
+
lengthFunction?: LengthFunction;
|
|
26
|
+
/** Separator hierarchy, tried in order; "" means split into characters. */
|
|
27
|
+
separators?: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Recursively split `text` into chunks no larger than `chunkSize` (measured by
|
|
31
|
+
* `lengthFunction`), preferring the coarsest separator that keeps chunks under
|
|
32
|
+
* budget and falling back through the separator hierarchy down to characters.
|
|
33
|
+
* Synchronous.
|
|
34
|
+
*/
|
|
35
|
+
export declare function recursiveCharacterSplit(text: string, options: RecursiveCharacterSplitOptions): string[];
|
|
36
|
+
//# sourceMappingURL=recursive-text-splitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recursive-text-splitter.d.ts","sourceRoot":"","sources":["../../../src/features/magic-context/recursive-text-splitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,gFAAgF;AAChF,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AAEtD,MAAM,WAAW,8BAA8B;IAC3C,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAsGD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,8BAA8B,GACxC,MAAM,EAAE,CAMV"}
|
package/dist/index.js
CHANGED
|
@@ -64,6 +64,9 @@ function getMagicContextTempDir(harness = getHarness()) {
|
|
|
64
64
|
return path.join(os.tmpdir(), harness, "magic-context");
|
|
65
65
|
}
|
|
66
66
|
function getMagicContextLogPath(harness = getHarness()) {
|
|
67
|
+
const envPath = process.env.MAGIC_CONTEXT_LOG_PATH?.trim();
|
|
68
|
+
if (envPath)
|
|
69
|
+
return envPath;
|
|
67
70
|
return path.join(getMagicContextTempDir(harness), "magic-context.log");
|
|
68
71
|
}
|
|
69
72
|
function getProjectMagicContextDir(directory) {
|
|
@@ -166254,6 +166257,94 @@ function parseFields(json2) {
|
|
|
166254
166257
|
}
|
|
166255
166258
|
var init_compartment_events = () => {};
|
|
166256
166259
|
|
|
166260
|
+
// src/features/magic-context/recursive-text-splitter.ts
|
|
166261
|
+
function splitOnSeparator(text, separator) {
|
|
166262
|
+
const splits = separator ? text.split(separator) : text.split("");
|
|
166263
|
+
return splits.filter((s) => s !== "");
|
|
166264
|
+
}
|
|
166265
|
+
function mergeSplits(splits, separator, chunkSize, lengthFunction) {
|
|
166266
|
+
const docs = [];
|
|
166267
|
+
const currentDoc = [];
|
|
166268
|
+
let total = 0;
|
|
166269
|
+
const joinDocs = (docsToJoin) => {
|
|
166270
|
+
const joined = docsToJoin.join(separator).trim();
|
|
166271
|
+
return joined === "" ? null : joined;
|
|
166272
|
+
};
|
|
166273
|
+
for (const d of splits) {
|
|
166274
|
+
const len = lengthFunction(d);
|
|
166275
|
+
if (total + len + currentDoc.length * separator.length > chunkSize) {
|
|
166276
|
+
if (currentDoc.length > 0) {
|
|
166277
|
+
const doc3 = joinDocs(currentDoc);
|
|
166278
|
+
if (doc3 !== null)
|
|
166279
|
+
docs.push(doc3);
|
|
166280
|
+
while (total > 0 && currentDoc.length > 0) {
|
|
166281
|
+
total -= lengthFunction(currentDoc[0]);
|
|
166282
|
+
currentDoc.shift();
|
|
166283
|
+
}
|
|
166284
|
+
}
|
|
166285
|
+
}
|
|
166286
|
+
currentDoc.push(d);
|
|
166287
|
+
total += len;
|
|
166288
|
+
}
|
|
166289
|
+
const doc2 = joinDocs(currentDoc);
|
|
166290
|
+
if (doc2 !== null)
|
|
166291
|
+
docs.push(doc2);
|
|
166292
|
+
return docs;
|
|
166293
|
+
}
|
|
166294
|
+
function splitTextRecursive(text, separators, chunkSize, lengthFunction) {
|
|
166295
|
+
const finalChunks = [];
|
|
166296
|
+
let separator = separators[separators.length - 1];
|
|
166297
|
+
let newSeparators;
|
|
166298
|
+
for (let i = 0;i < separators.length; i += 1) {
|
|
166299
|
+
const s = separators[i];
|
|
166300
|
+
if (s === "") {
|
|
166301
|
+
separator = s;
|
|
166302
|
+
break;
|
|
166303
|
+
}
|
|
166304
|
+
if (text.includes(s)) {
|
|
166305
|
+
separator = s;
|
|
166306
|
+
newSeparators = separators.slice(i + 1);
|
|
166307
|
+
break;
|
|
166308
|
+
}
|
|
166309
|
+
}
|
|
166310
|
+
const splits = splitOnSeparator(text, separator);
|
|
166311
|
+
let goodSplits = [];
|
|
166312
|
+
for (const s of splits) {
|
|
166313
|
+
if (lengthFunction(s) < chunkSize) {
|
|
166314
|
+
goodSplits.push(s);
|
|
166315
|
+
} else {
|
|
166316
|
+
if (goodSplits.length) {
|
|
166317
|
+
finalChunks.push(...mergeSplits(goodSplits, separator, chunkSize, lengthFunction));
|
|
166318
|
+
goodSplits = [];
|
|
166319
|
+
}
|
|
166320
|
+
if (!newSeparators) {
|
|
166321
|
+
finalChunks.push(s);
|
|
166322
|
+
} else {
|
|
166323
|
+
finalChunks.push(...splitTextRecursive(s, newSeparators, chunkSize, lengthFunction));
|
|
166324
|
+
}
|
|
166325
|
+
}
|
|
166326
|
+
}
|
|
166327
|
+
if (goodSplits.length) {
|
|
166328
|
+
finalChunks.push(...mergeSplits(goodSplits, separator, chunkSize, lengthFunction));
|
|
166329
|
+
}
|
|
166330
|
+
return finalChunks;
|
|
166331
|
+
}
|
|
166332
|
+
function recursiveCharacterSplit(text, options) {
|
|
166333
|
+
const chunkSize = options.chunkSize;
|
|
166334
|
+
const lengthFunction = options.lengthFunction ?? ((t) => t.length);
|
|
166335
|
+
const separators = options.separators ?? DEFAULT_SEPARATORS;
|
|
166336
|
+
if (text.length === 0)
|
|
166337
|
+
return [];
|
|
166338
|
+
return splitTextRecursive(text, separators, chunkSize, lengthFunction);
|
|
166339
|
+
}
|
|
166340
|
+
var DEFAULT_SEPARATORS;
|
|
166341
|
+
var init_recursive_text_splitter = __esm(() => {
|
|
166342
|
+
DEFAULT_SEPARATORS = [`
|
|
166343
|
+
|
|
166344
|
+
`, `
|
|
166345
|
+
`, " ", ""];
|
|
166346
|
+
});
|
|
166347
|
+
|
|
166257
166348
|
// src/features/magic-context/compartment-chunk-embedding.ts
|
|
166258
166349
|
import { createHash as createHash6 } from "node:crypto";
|
|
166259
166350
|
function getLoadFtsRowsStatement(db) {
|
|
@@ -166521,6 +166612,19 @@ function chunkCanonicalText(canonicalText, startOrdinal, endOrdinal, maxInputTok
|
|
|
166521
166612
|
const lineStart = range?.start ?? startOrdinal;
|
|
166522
166613
|
const lineEnd = range?.end ?? lineStart;
|
|
166523
166614
|
const lineTokens = estimateTokens(line);
|
|
166615
|
+
if (lineTokens > effectiveMax) {
|
|
166616
|
+
flush2();
|
|
166617
|
+
for (const slice of splitOversizedLine(line, effectiveMax)) {
|
|
166618
|
+
windows.push({
|
|
166619
|
+
windowIndex: windows.length + 1,
|
|
166620
|
+
startOrdinal: lineStart,
|
|
166621
|
+
endOrdinal: lineEnd,
|
|
166622
|
+
text: slice,
|
|
166623
|
+
chunkHash: hashChunkText(slice)
|
|
166624
|
+
});
|
|
166625
|
+
}
|
|
166626
|
+
continue;
|
|
166627
|
+
}
|
|
166524
166628
|
if (currentLines.length > 0 && currentTokens + lineTokens > effectiveMax) {
|
|
166525
166629
|
flush2();
|
|
166526
166630
|
}
|
|
@@ -166534,6 +166638,56 @@ function chunkCanonicalText(canonicalText, startOrdinal, endOrdinal, maxInputTok
|
|
|
166534
166638
|
flush2();
|
|
166535
166639
|
return windows;
|
|
166536
166640
|
}
|
|
166641
|
+
function splitOversizedLine(line, effectiveMax) {
|
|
166642
|
+
let slices = [];
|
|
166643
|
+
try {
|
|
166644
|
+
slices = recursiveCharacterSplit(line, {
|
|
166645
|
+
chunkSize: effectiveMax,
|
|
166646
|
+
lengthFunction: estimateTokens
|
|
166647
|
+
});
|
|
166648
|
+
} catch (error51) {
|
|
166649
|
+
log("[magic-context] recursiveCharacterSplit failed; using char-budget fallback:", error51);
|
|
166650
|
+
slices = [];
|
|
166651
|
+
}
|
|
166652
|
+
if (slices.length === 0) {
|
|
166653
|
+
slices = charBudgetSplit(line, effectiveMax);
|
|
166654
|
+
}
|
|
166655
|
+
const safe = [];
|
|
166656
|
+
const pushChecked = (slice) => {
|
|
166657
|
+
if (estimateTokens(slice) > effectiveMax && slice.length > 1) {
|
|
166658
|
+
safe.push(...charBudgetSplit(slice, effectiveMax));
|
|
166659
|
+
return;
|
|
166660
|
+
}
|
|
166661
|
+
safe.push(slice);
|
|
166662
|
+
};
|
|
166663
|
+
for (const slice of slices) {
|
|
166664
|
+
if (estimateTokens(slice) <= effectiveMax) {
|
|
166665
|
+
safe.push(slice);
|
|
166666
|
+
} else {
|
|
166667
|
+
for (const sub of charBudgetSplit(slice, effectiveMax))
|
|
166668
|
+
pushChecked(sub);
|
|
166669
|
+
}
|
|
166670
|
+
}
|
|
166671
|
+
return safe.filter((s) => s.length > 0);
|
|
166672
|
+
}
|
|
166673
|
+
function charBudgetSplit(text, effectiveMax) {
|
|
166674
|
+
const totalTokens = Math.max(1, estimateTokens(text));
|
|
166675
|
+
const charsPerToken = Math.max(1, Math.floor(text.length / totalTokens));
|
|
166676
|
+
const sliceChars = Math.max(1, effectiveMax * charsPerToken);
|
|
166677
|
+
const out = [];
|
|
166678
|
+
let pos = 0;
|
|
166679
|
+
while (pos < text.length) {
|
|
166680
|
+
let end = Math.min(text.length, pos + sliceChars);
|
|
166681
|
+
let slice = text.slice(pos, end);
|
|
166682
|
+
while (slice.length > 1 && estimateTokens(slice) > effectiveMax) {
|
|
166683
|
+
end = pos + Math.max(1, Math.floor((end - pos) / 2));
|
|
166684
|
+
slice = text.slice(pos, end);
|
|
166685
|
+
}
|
|
166686
|
+
out.push(slice);
|
|
166687
|
+
pos = end;
|
|
166688
|
+
}
|
|
166689
|
+
return out;
|
|
166690
|
+
}
|
|
166537
166691
|
function getExistingChunkHashes(db, compartmentId, modelId, projectPath) {
|
|
166538
166692
|
const scoped = typeof projectPath === "string" && projectPath.length > 0;
|
|
166539
166693
|
const rows = scoped ? getExistingHashStatement(db, true).all(compartmentId, modelId, projectPath) : getExistingHashStatement(db, false).all(compartmentId, modelId);
|
|
@@ -166701,6 +166855,8 @@ function countSessionCompartmentEmbedCoverage(db, projectPath, sessionId, modelI
|
|
|
166701
166855
|
var DEFAULT_COMPARTMENT_CHUNK_MAX_INPUT_TOKENS = 512, CHUNK_WINDOW_SAFETY_RATIO = 0.9, loadFtsRowsStatements, existingHashStatements, existingHashByProjectStatements, deleteByCompartmentStatements, insertEmbeddingStatements, distinctModelStatements, clearProjectStatements, clearProjectModelStatements, searchRowsStatements, searchRowsByModelStatements, backfillCandidateStatements, sessionBackfillCandidateStatements;
|
|
166702
166856
|
var init_compartment_chunk_embedding = __esm(() => {
|
|
166703
166857
|
init_read_session_formatting();
|
|
166858
|
+
init_logger();
|
|
166859
|
+
init_recursive_text_splitter();
|
|
166704
166860
|
loadFtsRowsStatements = new WeakMap;
|
|
166705
166861
|
existingHashStatements = new WeakMap;
|
|
166706
166862
|
existingHashByProjectStatements = new WeakMap;
|
|
@@ -167285,6 +167441,7 @@ class OpenAICompatibleEmbeddingProvider {
|
|
|
167285
167441
|
if (texts.length === 0) {
|
|
167286
167442
|
return [];
|
|
167287
167443
|
}
|
|
167444
|
+
const requestTexts = texts.map((t) => t.trim().length === 0 ? " " : t);
|
|
167288
167445
|
if (!await this.initialize()) {
|
|
167289
167446
|
return Array.from({ length: texts.length }, () => null);
|
|
167290
167447
|
}
|
|
@@ -167316,7 +167473,7 @@ class OpenAICompatibleEmbeddingProvider {
|
|
|
167316
167473
|
},
|
|
167317
167474
|
body: JSON.stringify({
|
|
167318
167475
|
model: this.model,
|
|
167319
|
-
input:
|
|
167476
|
+
input: requestTexts,
|
|
167320
167477
|
...inputTypeForRequest ? { input_type: inputTypeForRequest } : {},
|
|
167321
167478
|
...this.truncate ? { truncate: this.truncate } : {}
|
|
167322
167479
|
}),
|
|
@@ -168404,6 +168561,32 @@ async function embedBatchForProject(projectIdentity, texts, signal, purpose = "p
|
|
|
168404
168561
|
}
|
|
168405
168562
|
return { vectors, modelId, generation };
|
|
168406
168563
|
}
|
|
168564
|
+
async function embedTextsWindowBounded(projectIdentity, texts, signal) {
|
|
168565
|
+
if (texts.length <= MAX_WINDOWS_PER_EMBED_CALL) {
|
|
168566
|
+
return embedBatchForProject(projectIdentity, texts, signal);
|
|
168567
|
+
}
|
|
168568
|
+
const vectors = [];
|
|
168569
|
+
let modelId = null;
|
|
168570
|
+
let generation = null;
|
|
168571
|
+
for (let start = 0;start < texts.length; start += MAX_WINDOWS_PER_EMBED_CALL) {
|
|
168572
|
+
if (signal?.aborted)
|
|
168573
|
+
return null;
|
|
168574
|
+
const sub = texts.slice(start, start + MAX_WINDOWS_PER_EMBED_CALL);
|
|
168575
|
+
const result = await embedBatchForProject(projectIdentity, sub, signal);
|
|
168576
|
+
if (!result)
|
|
168577
|
+
return null;
|
|
168578
|
+
if (modelId === null) {
|
|
168579
|
+
modelId = result.modelId;
|
|
168580
|
+
generation = result.generation;
|
|
168581
|
+
} else if (result.modelId !== modelId || result.generation !== generation) {
|
|
168582
|
+
return null;
|
|
168583
|
+
}
|
|
168584
|
+
vectors.push(...result.vectors);
|
|
168585
|
+
}
|
|
168586
|
+
if (modelId === null || generation === null)
|
|
168587
|
+
return null;
|
|
168588
|
+
return { vectors, modelId, generation };
|
|
168589
|
+
}
|
|
168407
168590
|
function isUnembeddedMemoryRow(row) {
|
|
168408
168591
|
if (row === null || typeof row !== "object")
|
|
168409
168592
|
return false;
|
|
@@ -168537,7 +168720,7 @@ async function embedCandidateChunkBatch(db, projectIdentity, modelId, candidates
|
|
|
168537
168720
|
let result = null;
|
|
168538
168721
|
const attemptStart = Date.now();
|
|
168539
168722
|
try {
|
|
168540
|
-
result = await
|
|
168723
|
+
result = await embedTextsWindowBounded(projectIdentity, texts, signal);
|
|
168541
168724
|
} catch (error51) {
|
|
168542
168725
|
log("[magic-context] failed to proactively embed compartment chunks:", error51);
|
|
168543
168726
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-path.d.ts","sourceRoot":"","sources":["../../src/shared/data-path.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEvD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,SAAwB,GAAG,MAAM,CAEhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,SAAwB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"data-path.d.ts","sourceRoot":"","sources":["../../src/shared/data-path.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEvD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,SAAwB,GAAG,MAAM,CAEhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,SAAwB,GAAG,MAAM,CAOhF;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,SAAwB,GAAG,MAAM,CAErF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAKD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAkBxE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,uCAAuC,IAAI,MAAM,CAEhE;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
|
package/package.json
CHANGED
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
getCacheDir,
|
|
8
8
|
getDataDir,
|
|
9
9
|
getLegacyOpenCodeMagicContextStorageDir,
|
|
10
|
+
getMagicContextLogPath,
|
|
10
11
|
getMagicContextStorageDir,
|
|
11
12
|
getOpenCodeCacheDir,
|
|
12
13
|
getOpenCodeStorageDir,
|
|
@@ -18,6 +19,7 @@ const savedEnv = {
|
|
|
18
19
|
XDG_CACHE_HOME: process.env.XDG_CACHE_HOME,
|
|
19
20
|
XDG_DATA_HOME: process.env.XDG_DATA_HOME,
|
|
20
21
|
LOCALAPPDATA: process.env.LOCALAPPDATA,
|
|
22
|
+
MAGIC_CONTEXT_LOG_PATH: process.env.MAGIC_CONTEXT_LOG_PATH,
|
|
21
23
|
};
|
|
22
24
|
|
|
23
25
|
describe("data-path", () => {
|
|
@@ -25,10 +27,12 @@ describe("data-path", () => {
|
|
|
25
27
|
process.env.XDG_CACHE_HOME = undefined;
|
|
26
28
|
process.env.XDG_DATA_HOME = undefined;
|
|
27
29
|
process.env.LOCALAPPDATA = undefined;
|
|
30
|
+
process.env.MAGIC_CONTEXT_LOG_PATH = undefined;
|
|
28
31
|
// Bun's env handling: explicit delete for unset
|
|
29
32
|
delete process.env.XDG_CACHE_HOME;
|
|
30
33
|
delete process.env.XDG_DATA_HOME;
|
|
31
34
|
delete process.env.LOCALAPPDATA;
|
|
35
|
+
delete process.env.MAGIC_CONTEXT_LOG_PATH;
|
|
32
36
|
});
|
|
33
37
|
|
|
34
38
|
afterEach(() => {
|
|
@@ -37,6 +41,9 @@ describe("data-path", () => {
|
|
|
37
41
|
if (savedEnv.XDG_DATA_HOME !== undefined)
|
|
38
42
|
process.env.XDG_DATA_HOME = savedEnv.XDG_DATA_HOME;
|
|
39
43
|
if (savedEnv.LOCALAPPDATA !== undefined) process.env.LOCALAPPDATA = savedEnv.LOCALAPPDATA;
|
|
44
|
+
if (savedEnv.MAGIC_CONTEXT_LOG_PATH !== undefined)
|
|
45
|
+
process.env.MAGIC_CONTEXT_LOG_PATH = savedEnv.MAGIC_CONTEXT_LOG_PATH;
|
|
46
|
+
else delete process.env.MAGIC_CONTEXT_LOG_PATH;
|
|
40
47
|
});
|
|
41
48
|
|
|
42
49
|
test("getCacheDir falls back to <homedir>/.cache when XDG_CACHE_HOME is unset (all platforms)", () => {
|
|
@@ -158,6 +165,27 @@ describe("data-path", () => {
|
|
|
158
165
|
path.join("/some/project/", ".cortexkit", "magic-context"),
|
|
159
166
|
);
|
|
160
167
|
});
|
|
168
|
+
|
|
169
|
+
test("getMagicContextLogPath falls back to the harness temp dir when the env override is unset", () => {
|
|
170
|
+
expect(getMagicContextLogPath("opencode")).toBe(
|
|
171
|
+
path.join(os.tmpdir(), "opencode", "magic-context", "magic-context.log"),
|
|
172
|
+
);
|
|
173
|
+
expect(getMagicContextLogPath("pi")).toBe(
|
|
174
|
+
path.join(os.tmpdir(), "pi", "magic-context", "magic-context.log"),
|
|
175
|
+
);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test("getMagicContextLogPath honors MAGIC_CONTEXT_LOG_PATH", () => {
|
|
179
|
+
process.env.MAGIC_CONTEXT_LOG_PATH = "/tmp/custom/magic-context.log";
|
|
180
|
+
expect(getMagicContextLogPath("pi")).toBe("/tmp/custom/magic-context.log");
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("getMagicContextLogPath ignores a blank MAGIC_CONTEXT_LOG_PATH", () => {
|
|
184
|
+
process.env.MAGIC_CONTEXT_LOG_PATH = " ";
|
|
185
|
+
expect(getMagicContextLogPath("pi")).toBe(
|
|
186
|
+
path.join(os.tmpdir(), "pi", "magic-context", "magic-context.log"),
|
|
187
|
+
);
|
|
188
|
+
});
|
|
161
189
|
});
|
|
162
190
|
|
|
163
191
|
describe("ensureCortexKitArtifactGitignore", () => {
|
package/src/shared/data-path.ts
CHANGED
|
@@ -46,6 +46,11 @@ export function getMagicContextTempDir(harness: HarnessId = getHarness()): strin
|
|
|
46
46
|
* reflected in the next flush.
|
|
47
47
|
*/
|
|
48
48
|
export function getMagicContextLogPath(harness: HarnessId = getHarness()): string {
|
|
49
|
+
// An explicit override wins over the harness temp-dir default, so users on
|
|
50
|
+
// sandboxed/ephemeral setups (Docker, CI) can point the diagnostic log at a
|
|
51
|
+
// persistent or shared path. Blank/whitespace is treated as unset.
|
|
52
|
+
const envPath = process.env.MAGIC_CONTEXT_LOG_PATH?.trim();
|
|
53
|
+
if (envPath) return envPath;
|
|
49
54
|
return path.join(getMagicContextTempDir(harness), "magic-context.log");
|
|
50
55
|
}
|
|
51
56
|
|