billion-context-omp 0.3.2-pr.138.3 → 0.3.2-pr.139.4
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/index.js +222 -297
- package/dist/index.js.map +1 -1
- package/dist/messages.d.ts +29 -4
- package/dist/update.d.ts +10 -0
- package/dist/wire-fold.d.ts +80 -4
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -2348,144 +2348,6 @@ function countOccurrences(haystack, needle) {
|
|
|
2348
2348
|
}
|
|
2349
2349
|
return count;
|
|
2350
2350
|
}
|
|
2351
|
-
var COMPRESS_TOOL_NAME = "compress";
|
|
2352
|
-
var DECOMPRESS_TOOL_NAME = "decompress";
|
|
2353
|
-
var SEARCH_CONTEXT_TOOL_NAME = "search_context";
|
|
2354
|
-
var ACP_STATUS_TOOL_NAME = "acp_status";
|
|
2355
|
-
var COMPRESS_TOOL = {
|
|
2356
|
-
name: COMPRESS_TOOL_NAME,
|
|
2357
|
-
description: "Replace a contiguous range of older conversation with a detailed summary you write. Use when content is genuinely consumed. Batch form: content=[{startId,endId,summary,topic?}]. REQUIRED \u2014 compress without content is invalid.",
|
|
2358
|
-
input_schema: {
|
|
2359
|
-
type: "object",
|
|
2360
|
-
properties: {
|
|
2361
|
-
topic: { type: "string", description: "Optional short title for the compressed range" },
|
|
2362
|
-
content: {
|
|
2363
|
-
type: "array",
|
|
2364
|
-
description: "One or more ranges to compress into separate summary blocks",
|
|
2365
|
-
items: {
|
|
2366
|
-
type: "object",
|
|
2367
|
-
properties: {
|
|
2368
|
-
topic: { type: "string" },
|
|
2369
|
-
startId: { type: "string", description: "mNNNNN ref at the start of the range" },
|
|
2370
|
-
endId: { type: "string", description: "mNNNNN ref at the end of the range" },
|
|
2371
|
-
summary: { type: "string", description: "Self-contained summary replacing the range" }
|
|
2372
|
-
},
|
|
2373
|
-
required: ["startId", "endId", "summary"]
|
|
2374
|
-
}
|
|
2375
|
-
}
|
|
2376
|
-
},
|
|
2377
|
-
required: ["content"]
|
|
2378
|
-
}
|
|
2379
|
-
};
|
|
2380
|
-
var COMPRESS_TOOL_OPENAI = {
|
|
2381
|
-
type: "function",
|
|
2382
|
-
function: {
|
|
2383
|
-
name: COMPRESS_TOOL_NAME,
|
|
2384
|
-
description: COMPRESS_TOOL.description,
|
|
2385
|
-
parameters: {
|
|
2386
|
-
type: "object",
|
|
2387
|
-
properties: {
|
|
2388
|
-
topic: { type: "string", description: "Optional short title for the compressed range" },
|
|
2389
|
-
content: {
|
|
2390
|
-
type: "array",
|
|
2391
|
-
description: "One or more ranges to compress into separate summary blocks. REQUIRED \u2014 compress without content is invalid.",
|
|
2392
|
-
items: {
|
|
2393
|
-
type: "object",
|
|
2394
|
-
properties: {
|
|
2395
|
-
topic: { type: "string" },
|
|
2396
|
-
startId: { type: "string", description: "mNNNNN ref at the start of the range" },
|
|
2397
|
-
endId: { type: "string", description: "mNNNNN ref at the end of the range" },
|
|
2398
|
-
summary: { type: "string", description: "Self-contained summary replacing the range" }
|
|
2399
|
-
},
|
|
2400
|
-
required: ["startId", "endId", "summary"]
|
|
2401
|
-
}
|
|
2402
|
-
}
|
|
2403
|
-
},
|
|
2404
|
-
required: ["content"]
|
|
2405
|
-
}
|
|
2406
|
-
}
|
|
2407
|
-
};
|
|
2408
|
-
var DECOMPRESS_TOOL_OPENAI = {
|
|
2409
|
-
type: "function",
|
|
2410
|
-
function: {
|
|
2411
|
-
name: DECOMPRESS_TOOL_NAME,
|
|
2412
|
-
description: "Restores previously compressed content. Use when you need exact details lost in compression. By default restores one tier up. Use full:true for all the way to original messages. Use toFile to write to file instead of inflating context.",
|
|
2413
|
-
parameters: {
|
|
2414
|
-
type: "object",
|
|
2415
|
-
properties: {
|
|
2416
|
-
blockId: { type: "string", description: "Block ID to decompress (e.g. b5)" },
|
|
2417
|
-
toFile: { type: "string", description: "Optional: write content to file instead of context" },
|
|
2418
|
-
full: { type: "boolean", description: "Restore all the way to original messages" }
|
|
2419
|
-
},
|
|
2420
|
-
required: ["blockId"]
|
|
2421
|
-
}
|
|
2422
|
-
}
|
|
2423
|
-
};
|
|
2424
|
-
var SEARCH_CONTEXT_TOOL_OPENAI = {
|
|
2425
|
-
type: "function",
|
|
2426
|
-
function: {
|
|
2427
|
-
name: SEARCH_CONTEXT_TOOL_NAME,
|
|
2428
|
-
description: "Search through compressed block summaries by keyword. Use BEFORE decompressing to find the right block.",
|
|
2429
|
-
parameters: {
|
|
2430
|
-
type: "object",
|
|
2431
|
-
properties: {
|
|
2432
|
-
query: { type: "string", description: "Search query" },
|
|
2433
|
-
limit: { type: "number", description: "Max results (default 5)" }
|
|
2434
|
-
},
|
|
2435
|
-
required: ["query"]
|
|
2436
|
-
}
|
|
2437
|
-
}
|
|
2438
|
-
};
|
|
2439
|
-
var ACP_STATUS_TOOL_OPENAI = {
|
|
2440
|
-
type: "function",
|
|
2441
|
-
function: {
|
|
2442
|
-
name: ACP_STATUS_TOOL_NAME,
|
|
2443
|
-
description: "Show context usage and compressible ranges. No args = overview. Use to find what to compress next.",
|
|
2444
|
-
parameters: {
|
|
2445
|
-
type: "object",
|
|
2446
|
-
properties: {}
|
|
2447
|
-
}
|
|
2448
|
-
}
|
|
2449
|
-
};
|
|
2450
|
-
var DECOMPRESS_TOOL = {
|
|
2451
|
-
name: DECOMPRESS_TOOL_NAME,
|
|
2452
|
-
description: DECOMPRESS_TOOL_OPENAI.function.description,
|
|
2453
|
-
input_schema: DECOMPRESS_TOOL_OPENAI.function.parameters
|
|
2454
|
-
};
|
|
2455
|
-
var SEARCH_CONTEXT_TOOL = {
|
|
2456
|
-
name: SEARCH_CONTEXT_TOOL_NAME,
|
|
2457
|
-
description: SEARCH_CONTEXT_TOOL_OPENAI.function.description,
|
|
2458
|
-
input_schema: SEARCH_CONTEXT_TOOL_OPENAI.function.parameters
|
|
2459
|
-
};
|
|
2460
|
-
var ACP_STATUS_TOOL = {
|
|
2461
|
-
name: ACP_STATUS_TOOL_NAME,
|
|
2462
|
-
description: ACP_STATUS_TOOL_OPENAI.function.description,
|
|
2463
|
-
input_schema: ACP_STATUS_TOOL_OPENAI.function.parameters
|
|
2464
|
-
};
|
|
2465
|
-
var COMPRESS_TOOL_RESPONSES = {
|
|
2466
|
-
type: "function",
|
|
2467
|
-
name: COMPRESS_TOOL_NAME,
|
|
2468
|
-
description: COMPRESS_TOOL.description,
|
|
2469
|
-
parameters: COMPRESS_TOOL_OPENAI.function.parameters
|
|
2470
|
-
};
|
|
2471
|
-
var DECOMPRESS_TOOL_RESPONSES = {
|
|
2472
|
-
type: "function",
|
|
2473
|
-
name: DECOMPRESS_TOOL_OPENAI.function.name,
|
|
2474
|
-
description: DECOMPRESS_TOOL_OPENAI.function.description,
|
|
2475
|
-
parameters: DECOMPRESS_TOOL_OPENAI.function.parameters
|
|
2476
|
-
};
|
|
2477
|
-
var SEARCH_CONTEXT_TOOL_RESPONSES = {
|
|
2478
|
-
type: "function",
|
|
2479
|
-
name: SEARCH_CONTEXT_TOOL_OPENAI.function.name,
|
|
2480
|
-
description: SEARCH_CONTEXT_TOOL_OPENAI.function.description,
|
|
2481
|
-
parameters: SEARCH_CONTEXT_TOOL_OPENAI.function.parameters
|
|
2482
|
-
};
|
|
2483
|
-
var ACP_STATUS_TOOL_RESPONSES = {
|
|
2484
|
-
type: "function",
|
|
2485
|
-
name: ACP_STATUS_TOOL_OPENAI.function.name,
|
|
2486
|
-
description: ACP_STATUS_TOOL_OPENAI.function.description,
|
|
2487
|
-
parameters: ACP_STATUS_TOOL_OPENAI.function.parameters
|
|
2488
|
-
};
|
|
2489
2351
|
function parseBlockIdArg(arg) {
|
|
2490
2352
|
const normalized = arg.trim().toLowerCase();
|
|
2491
2353
|
const refMatch = /^b0*(\d+)$/.exec(normalized);
|
|
@@ -3667,7 +3529,6 @@ When context usage passes a threshold, the system appends a breakdown showing wh
|
|
|
3667
3529
|
|
|
3668
3530
|
// node_modules/acp-kernel/dist/wire/index.js
|
|
3669
3531
|
import { createHash as createHash2 } from "crypto";
|
|
3670
|
-
import { createHash as createHash22 } from "crypto";
|
|
3671
3532
|
function hashId(s) {
|
|
3672
3533
|
return createHash2("sha256").update(s, "utf8").digest("hex").slice(0, 16);
|
|
3673
3534
|
}
|
|
@@ -4498,6 +4359,12 @@ function mirrorResponsesToCore(view, systemText) {
|
|
|
4498
4359
|
});
|
|
4499
4360
|
return msgs;
|
|
4500
4361
|
}
|
|
4362
|
+
|
|
4363
|
+
// src/messages.ts
|
|
4364
|
+
import { createHash as createHash3 } from "crypto";
|
|
4365
|
+
var REF_TAG_SOURCE = "(?:<acp\\s[^>]*>m\\d+</acp>|\\[m\\d+\\])";
|
|
4366
|
+
var REF_TAG = new RegExp(`^${REF_TAG_SOURCE}\\s?\\n?`);
|
|
4367
|
+
var TRAILING_REF_TAG = new RegExp(`\\n*${REF_TAG_SOURCE}\\s*$`);
|
|
4501
4368
|
function compressToolArgs(call) {
|
|
4502
4369
|
let args = call.arguments;
|
|
4503
4370
|
if (typeof args === "string") {
|
|
@@ -4528,159 +4395,12 @@ function compressToolArgs(call) {
|
|
|
4528
4395
|
const ia = inner;
|
|
4529
4396
|
return Array.isArray(ia.content) ? { content: ia.content, topic: ia.topic, summaryMaxChars: ia.summaryMaxChars } : { content: [ia] };
|
|
4530
4397
|
}
|
|
4531
|
-
function toolCallNames(msgs) {
|
|
4532
|
-
const names = /* @__PURE__ */ new Map();
|
|
4533
|
-
for (const m of msgs) {
|
|
4534
|
-
if (m.contentType === "tool-call" && m.toolCallId && m.toolName) names.set(m.toolCallId, m.toolName);
|
|
4535
|
-
}
|
|
4536
|
-
return names;
|
|
4537
|
-
}
|
|
4538
|
-
function toolResultTextsCore(msgs) {
|
|
4539
|
-
const results = /* @__PURE__ */ new Map();
|
|
4540
|
-
for (const m of msgs) {
|
|
4541
|
-
if (m.contentType !== "tool-result" || !m.toolCallId) continue;
|
|
4542
|
-
results.set(m.toolCallId, m.text ?? "");
|
|
4543
|
-
}
|
|
4544
|
-
return results;
|
|
4545
|
-
}
|
|
4546
|
-
function findCompressCallsCore(msg) {
|
|
4547
|
-
if (msg.contentType !== "tool-call" || !msg.toolName) return [];
|
|
4548
|
-
const args = compressToolArgs({ name: msg.toolName, arguments: msg.text });
|
|
4549
|
-
if (!args) return [];
|
|
4550
|
-
const content = args.content;
|
|
4551
|
-
if (!Array.isArray(content)) return [];
|
|
4552
|
-
const ranges = [];
|
|
4553
|
-
const callTopic = typeof args.topic === "string" ? args.topic : void 0;
|
|
4554
|
-
for (const item of content) {
|
|
4555
|
-
const r = item;
|
|
4556
|
-
if (typeof r.startId !== "string" || typeof r.endId !== "string" || typeof r.summary !== "string" || r.summary.length === 0) continue;
|
|
4557
|
-
ranges.push({
|
|
4558
|
-
startRef: r.startId,
|
|
4559
|
-
endRef: r.endId,
|
|
4560
|
-
summary: r.summary,
|
|
4561
|
-
topic: typeof r.topic === "string" ? r.topic : callTopic,
|
|
4562
|
-
summaryMaxChars: typeof args.summaryMaxChars === "number" ? args.summaryMaxChars : void 0,
|
|
4563
|
-
compressCallId: msg.toolCallId ?? ""
|
|
4564
|
-
});
|
|
4565
|
-
}
|
|
4566
|
-
return ranges.length > 0 ? [{ id: msg.toolCallId ?? "", ranges }] : [];
|
|
4567
|
-
}
|
|
4568
|
-
function corePieceKey(cm) {
|
|
4569
|
-
return `${cm.role}|${cm.contentType}|${cm.toolName ?? ""}|${(cm.text ?? "").slice(0, 4096)}`;
|
|
4570
|
-
}
|
|
4571
|
-
function spanFingerprintCore(coreMessages, startId, endId) {
|
|
4572
|
-
const find = (id) => coreMessages.find((cm) => cm.id === id);
|
|
4573
|
-
const first = find(startId);
|
|
4574
|
-
const last = find(endId);
|
|
4575
|
-
if (!first || !last) return "";
|
|
4576
|
-
return createHash22("sha1").update(`${corePieceKey(first)}\0${corePieceKey(last)}`).digest("hex").slice(0, 8);
|
|
4577
|
-
}
|
|
4578
|
-
function spanFingerprintCoreIdx(coreMessages, startIdx, endIdx) {
|
|
4579
|
-
const first = coreMessages[startIdx];
|
|
4580
|
-
const last = coreMessages[endIdx];
|
|
4581
|
-
if (!first || !last) return "";
|
|
4582
|
-
return createHash22("sha1").update(`${corePieceKey(first)}\0${corePieceKey(last)}`).digest("hex").slice(0, 8);
|
|
4583
|
-
}
|
|
4584
|
-
function boundaryRawCore(ref, byRef, blocks, coreMessages, pick) {
|
|
4585
|
-
const raw = byRef[ref];
|
|
4586
|
-
if (raw) return raw;
|
|
4587
|
-
const m = /^b(\d+)$/i.exec(ref.trim());
|
|
4588
|
-
if (!m) return "";
|
|
4589
|
-
const block = blocks.find((b) => b.blockId.toLowerCase() === `b${m[1]}`);
|
|
4590
|
-
if (!block) return "";
|
|
4591
|
-
const idx = (id) => coreMessages.findIndex((cm) => cm.id === (byRef[id] ?? id));
|
|
4592
|
-
let best = -1;
|
|
4593
|
-
for (const id of block.effectiveMessageIds) {
|
|
4594
|
-
const i = idx(id);
|
|
4595
|
-
if (i < 0) continue;
|
|
4596
|
-
if (best < 0 || (pick === "min" ? i < best : i > best)) best = i;
|
|
4597
|
-
}
|
|
4598
|
-
return best < 0 ? "" : coreMessages[best]?.id ?? "";
|
|
4599
|
-
}
|
|
4600
|
-
function boundaryIndexCore(ref, byRef, blocks, coreMessages, pick, fallbackIdx = -1) {
|
|
4601
|
-
const id = boundaryRawCore(ref, byRef, blocks, coreMessages, pick);
|
|
4602
|
-
if (id) {
|
|
4603
|
-
const i = coreMessages.findIndex((cm) => cm.id === id);
|
|
4604
|
-
if (i >= 0) return i;
|
|
4605
|
-
}
|
|
4606
|
-
return fallbackIdx >= 0 && fallbackIdx < coreMessages.length ? fallbackIdx : -1;
|
|
4607
|
-
}
|
|
4608
|
-
function refOfPieceCore(coreMessages, idx, byRef) {
|
|
4609
|
-
const id = coreMessages[idx]?.id;
|
|
4610
|
-
if (!id) return "";
|
|
4611
|
-
for (const [ref, mapped] of Object.entries(byRef)) if (mapped === id) return ref;
|
|
4612
|
-
return "";
|
|
4613
|
-
}
|
|
4614
|
-
function staleRangeCore(r, rangeIndex, resultText, coreMessages, callIndex, byRef, blocks) {
|
|
4615
|
-
const pm = resultText.match(/\[pos=([0-9,-]+)\]/);
|
|
4616
|
-
const pair = pm ? pm[1].split(",")[rangeIndex] ?? "-" : "-";
|
|
4617
|
-
const hinted = pair !== "-";
|
|
4618
|
-
const [ps, pe] = pair === "-" ? ["", ""] : pair.split("-");
|
|
4619
|
-
const fbStart = ps && ps !== "" ? Number.parseInt(ps, 10) : -1;
|
|
4620
|
-
const fbEnd = pe && pe !== "" ? Number.parseInt(pe, 10) : -1;
|
|
4621
|
-
const startRaw = boundaryRawCore(r.startRef, byRef, blocks, coreMessages, "min");
|
|
4622
|
-
const endRaw = boundaryRawCore(r.endRef, byRef, blocks, coreMessages, "max");
|
|
4623
|
-
const rawStartIdx = startRaw ? coreMessages.findIndex((cm) => cm.id === startRaw) : -1;
|
|
4624
|
-
const rawEndIdx = endRaw ? coreMessages.findIndex((cm) => cm.id === endRaw) : -1;
|
|
4625
|
-
const startIdx = rawStartIdx >= 0 ? rawStartIdx : fbStart >= 0 && fbStart < coreMessages.length ? fbStart : -1;
|
|
4626
|
-
const endIdx = rawEndIdx >= 0 ? rawEndIdx : fbEnd >= 0 && fbEnd < coreMessages.length ? fbEnd : -1;
|
|
4627
|
-
if (startIdx < 0 || endIdx < 0) {
|
|
4628
|
-
if (!/^b\d+$/i.test(r.startRef.trim()) && !/^b\d+$/i.test(r.endRef.trim()))
|
|
4629
|
-
return { reject: `unresolved ${r.startRef}..${r.endRef} -> ${startIdx}..${endIdx}`, ...hinted ? { hint: true } : {} };
|
|
4630
|
-
return {};
|
|
4631
|
-
}
|
|
4632
|
-
if (endIdx > callIndex) return { reject: `end idx ${endIdx} > callIndex ${callIndex}`, ...hinted ? { hint: true } : {} };
|
|
4633
|
-
const m = resultText.match(/\[fp=([0-9a-f,-]+)\]/);
|
|
4634
|
-
if (m) {
|
|
4635
|
-
const want = m[1].split(",")[rangeIndex];
|
|
4636
|
-
if (want !== void 0 && want !== "-") {
|
|
4637
|
-
const got = spanFingerprintCoreIdx(coreMessages, startIdx, endIdx);
|
|
4638
|
-
if (want !== got) return { reject: `fp ${r.startRef}..${r.endRef} want ${want} got ${got} @${startIdx}..${endIdx}`, ...hinted ? { hint: true } : {} };
|
|
4639
|
-
}
|
|
4640
|
-
}
|
|
4641
|
-
const remap = {};
|
|
4642
|
-
if (/^m\d+$/i.test(r.startRef.trim()) && rawStartIdx < 0) {
|
|
4643
|
-
const ref = refOfPieceCore(coreMessages, startIdx, byRef);
|
|
4644
|
-
if (!ref) return { reject: `recovered ${r.startRef} @${startIdx} has no ref (protected piece)`, ...hinted ? { hint: true } : {} };
|
|
4645
|
-
remap.startRef = ref;
|
|
4646
|
-
}
|
|
4647
|
-
if (/^m\d+$/i.test(r.endRef.trim()) && rawEndIdx < 0) {
|
|
4648
|
-
const ref = refOfPieceCore(coreMessages, endIdx, byRef);
|
|
4649
|
-
if (!ref) return { reject: `recovered ${r.endRef} @${endIdx} has no ref (protected piece)`, ...hinted ? { hint: true } : {} };
|
|
4650
|
-
remap.endRef = ref;
|
|
4651
|
-
}
|
|
4652
|
-
if (!remap.startRef && !remap.endRef) return {};
|
|
4653
|
-
return { remap, recovered: { pos: pair, startIdx, endIdx } };
|
|
4654
|
-
}
|
|
4655
|
-
function rangeFingerprintsCore(ranges, coreMessages, byRef, blocks) {
|
|
4656
|
-
return ranges.map((r) => {
|
|
4657
|
-
const start = boundaryRawCore(r.startRef, byRef, blocks, coreMessages, "min");
|
|
4658
|
-
const end = start ? boundaryRawCore(r.endRef, byRef, blocks, coreMessages, "max") : "";
|
|
4659
|
-
if (start && end) {
|
|
4660
|
-
const fp = spanFingerprintCore(coreMessages, start, end);
|
|
4661
|
-
if (fp.length > 0) return fp;
|
|
4662
|
-
}
|
|
4663
|
-
return "-";
|
|
4664
|
-
});
|
|
4665
|
-
}
|
|
4666
|
-
function rangePositionsCore(ranges, coreMessages, byRef, blocks) {
|
|
4667
|
-
return ranges.map((r) => {
|
|
4668
|
-
const s = boundaryIndexCore(r.startRef, byRef, blocks, coreMessages, "min");
|
|
4669
|
-
const e = s >= 0 ? boundaryIndexCore(r.endRef, byRef, blocks, coreMessages, "max") : -1;
|
|
4670
|
-
return s >= 0 && e >= 0 ? `${s}-${e}` : "-";
|
|
4671
|
-
});
|
|
4672
|
-
}
|
|
4673
|
-
|
|
4674
|
-
// src/messages.ts
|
|
4675
|
-
import { createHash as createHash3 } from "crypto";
|
|
4676
|
-
var REF_TAG_SOURCE = "(?:<acp\\s[^>]*>m\\d+</acp>|\\[m\\d+\\])";
|
|
4677
|
-
var REF_TAG = new RegExp(`^${REF_TAG_SOURCE}\\s?\\n?`);
|
|
4678
|
-
var TRAILING_REF_TAG = new RegExp(`\\n*${REF_TAG_SOURCE}\\s*$`);
|
|
4679
4398
|
function stripRefTag(text) {
|
|
4680
4399
|
return text.replace(REF_TAG, "").replace(TRAILING_REF_TAG, "");
|
|
4681
4400
|
}
|
|
4682
4401
|
|
|
4683
4402
|
// src/wire-fold.ts
|
|
4403
|
+
import { createHash as createHash4 } from "crypto";
|
|
4684
4404
|
function detectProviderWireFormat(payload) {
|
|
4685
4405
|
const fmt2 = detectWireFormat(payload);
|
|
4686
4406
|
if (fmt2 === "anthropic" || fmt2 === "openai" || fmt2 === "responses") return fmt2;
|
|
@@ -4845,6 +4565,148 @@ function coreIdentity(msg) {
|
|
|
4845
4565
|
text: stripRefTag(msg.text ?? "")
|
|
4846
4566
|
});
|
|
4847
4567
|
}
|
|
4568
|
+
function toolCallNames(msgs) {
|
|
4569
|
+
const names = /* @__PURE__ */ new Map();
|
|
4570
|
+
for (const m of msgs) {
|
|
4571
|
+
if (m.contentType === "tool-call" && m.toolCallId && m.toolName) names.set(m.toolCallId, m.toolName);
|
|
4572
|
+
}
|
|
4573
|
+
return names;
|
|
4574
|
+
}
|
|
4575
|
+
function toolResultTextsCore(msgs) {
|
|
4576
|
+
const results = /* @__PURE__ */ new Map();
|
|
4577
|
+
for (const m of msgs) {
|
|
4578
|
+
if (m.contentType !== "tool-result" || !m.toolCallId) continue;
|
|
4579
|
+
results.set(m.toolCallId, m.text ?? "");
|
|
4580
|
+
}
|
|
4581
|
+
return results;
|
|
4582
|
+
}
|
|
4583
|
+
function findCompressCallsCore(msg) {
|
|
4584
|
+
if (msg.contentType !== "tool-call" || !msg.toolName) return [];
|
|
4585
|
+
const args = compressToolArgs({ name: msg.toolName, arguments: msg.text });
|
|
4586
|
+
if (!args) return [];
|
|
4587
|
+
const content = args.content;
|
|
4588
|
+
if (!Array.isArray(content)) return [];
|
|
4589
|
+
const ranges = [];
|
|
4590
|
+
const callTopic = typeof args.topic === "string" ? args.topic : void 0;
|
|
4591
|
+
for (const item of content) {
|
|
4592
|
+
const r = item;
|
|
4593
|
+
if (typeof r.startId !== "string" || typeof r.endId !== "string" || typeof r.summary !== "string" || r.summary.length === 0) continue;
|
|
4594
|
+
ranges.push({
|
|
4595
|
+
startRef: r.startId,
|
|
4596
|
+
endRef: r.endId,
|
|
4597
|
+
summary: r.summary,
|
|
4598
|
+
topic: typeof r.topic === "string" ? r.topic : callTopic,
|
|
4599
|
+
summaryMaxChars: typeof args.summaryMaxChars === "number" ? args.summaryMaxChars : void 0,
|
|
4600
|
+
compressCallId: msg.toolCallId ?? ""
|
|
4601
|
+
});
|
|
4602
|
+
}
|
|
4603
|
+
return ranges.length > 0 ? [{ id: msg.toolCallId ?? "", ranges }] : [];
|
|
4604
|
+
}
|
|
4605
|
+
function corePieceKey(cm) {
|
|
4606
|
+
return `${cm.role}|${cm.contentType}|${cm.toolName ?? ""}|${(cm.text ?? "").slice(0, 4096)}`;
|
|
4607
|
+
}
|
|
4608
|
+
function spanFingerprintCore(coreMessages, startId, endId) {
|
|
4609
|
+
const find = (id) => coreMessages.find((cm) => cm.id === id);
|
|
4610
|
+
const first = find(startId);
|
|
4611
|
+
const last = find(endId);
|
|
4612
|
+
if (!first || !last) return "";
|
|
4613
|
+
return createHash4("sha1").update(`${corePieceKey(first)}\0${corePieceKey(last)}`).digest("hex").slice(0, 8);
|
|
4614
|
+
}
|
|
4615
|
+
function spanFingerprintCoreIdx(coreMessages, startIdx, endIdx) {
|
|
4616
|
+
const first = coreMessages[startIdx];
|
|
4617
|
+
const last = coreMessages[endIdx];
|
|
4618
|
+
if (!first || !last) return "";
|
|
4619
|
+
return createHash4("sha1").update(`${corePieceKey(first)}\0${corePieceKey(last)}`).digest("hex").slice(0, 8);
|
|
4620
|
+
}
|
|
4621
|
+
function boundaryRawCore(ref, byRef, blocks, coreMessages, pick) {
|
|
4622
|
+
const raw = byRef[ref];
|
|
4623
|
+
if (raw) return raw;
|
|
4624
|
+
const m = /^b(\d+)$/i.exec(ref.trim());
|
|
4625
|
+
if (!m) return "";
|
|
4626
|
+
const block = blocks.find((b) => b.blockId.toLowerCase() === `b${m[1]}`);
|
|
4627
|
+
if (!block) return "";
|
|
4628
|
+
const idx = (id) => coreMessages.findIndex((cm) => cm.id === (byRef[id] ?? id));
|
|
4629
|
+
let best = -1;
|
|
4630
|
+
for (const id of block.effectiveMessageIds) {
|
|
4631
|
+
const i = idx(id);
|
|
4632
|
+
if (i < 0) continue;
|
|
4633
|
+
if (best < 0 || (pick === "min" ? i < best : i > best)) best = i;
|
|
4634
|
+
}
|
|
4635
|
+
return best < 0 ? "" : coreMessages[best]?.id ?? "";
|
|
4636
|
+
}
|
|
4637
|
+
function boundaryIndexCore(ref, byRef, blocks, coreMessages, pick, fallbackIdx = -1) {
|
|
4638
|
+
const id = boundaryRawCore(ref, byRef, blocks, coreMessages, pick);
|
|
4639
|
+
if (id) {
|
|
4640
|
+
const i = coreMessages.findIndex((cm) => cm.id === id);
|
|
4641
|
+
if (i >= 0) return i;
|
|
4642
|
+
}
|
|
4643
|
+
return fallbackIdx >= 0 && fallbackIdx < coreMessages.length ? fallbackIdx : -1;
|
|
4644
|
+
}
|
|
4645
|
+
function refOfPieceCore(coreMessages, idx, byRef) {
|
|
4646
|
+
const id = coreMessages[idx]?.id;
|
|
4647
|
+
if (!id) return "";
|
|
4648
|
+
for (const [ref, mapped] of Object.entries(byRef)) if (mapped === id) return ref;
|
|
4649
|
+
return "";
|
|
4650
|
+
}
|
|
4651
|
+
function staleRangeCore(r, rangeIndex, resultText, coreMessages, callIndex, byRef, blocks) {
|
|
4652
|
+
const pm = resultText.match(/\[pos=([0-9,-]+)\]/);
|
|
4653
|
+
const pair = pm ? pm[1].split(",")[rangeIndex] ?? "-" : "-";
|
|
4654
|
+
const hinted = pair !== "-";
|
|
4655
|
+
const [ps, pe] = pair === "-" ? ["", ""] : pair.split("-");
|
|
4656
|
+
const fbStart = ps && ps !== "" ? Number.parseInt(ps, 10) : -1;
|
|
4657
|
+
const fbEnd = pe && pe !== "" ? Number.parseInt(pe, 10) : -1;
|
|
4658
|
+
const startRaw = boundaryRawCore(r.startRef, byRef, blocks, coreMessages, "min");
|
|
4659
|
+
const endRaw = boundaryRawCore(r.endRef, byRef, blocks, coreMessages, "max");
|
|
4660
|
+
const rawStartIdx = startRaw ? coreMessages.findIndex((cm) => cm.id === startRaw) : -1;
|
|
4661
|
+
const rawEndIdx = endRaw ? coreMessages.findIndex((cm) => cm.id === endRaw) : -1;
|
|
4662
|
+
const startIdx = rawStartIdx >= 0 ? rawStartIdx : fbStart >= 0 && fbStart < coreMessages.length ? fbStart : -1;
|
|
4663
|
+
const endIdx = rawEndIdx >= 0 ? rawEndIdx : fbEnd >= 0 && fbEnd < coreMessages.length ? fbEnd : -1;
|
|
4664
|
+
if (startIdx < 0 || endIdx < 0) {
|
|
4665
|
+
if (!/^b\d+$/i.test(r.startRef.trim()) && !/^b\d+$/i.test(r.endRef.trim()))
|
|
4666
|
+
return { reject: `unresolved ${r.startRef}..${r.endRef} -> ${startIdx}..${endIdx}`, ...hinted ? { hint: true } : {} };
|
|
4667
|
+
return {};
|
|
4668
|
+
}
|
|
4669
|
+
if (endIdx > callIndex) return { reject: `end idx ${endIdx} > callIndex ${callIndex}`, ...hinted ? { hint: true } : {} };
|
|
4670
|
+
const m = resultText.match(/\[fp=([0-9a-f,-]+)\]/);
|
|
4671
|
+
if (m) {
|
|
4672
|
+
const want = m[1].split(",")[rangeIndex];
|
|
4673
|
+
if (want !== void 0 && want !== "-") {
|
|
4674
|
+
const got = spanFingerprintCoreIdx(coreMessages, startIdx, endIdx);
|
|
4675
|
+
if (want !== got) return { reject: `fp ${r.startRef}..${r.endRef} want ${want} got ${got} @${startIdx}..${endIdx}`, ...hinted ? { hint: true } : {} };
|
|
4676
|
+
}
|
|
4677
|
+
}
|
|
4678
|
+
const remap = {};
|
|
4679
|
+
if (/^m\d+$/i.test(r.startRef.trim()) && rawStartIdx < 0) {
|
|
4680
|
+
const ref = refOfPieceCore(coreMessages, startIdx, byRef);
|
|
4681
|
+
if (!ref) return { reject: `recovered ${r.startRef} @${startIdx} has no ref (protected piece)`, ...hinted ? { hint: true } : {} };
|
|
4682
|
+
remap.startRef = ref;
|
|
4683
|
+
}
|
|
4684
|
+
if (/^m\d+$/i.test(r.endRef.trim()) && rawEndIdx < 0) {
|
|
4685
|
+
const ref = refOfPieceCore(coreMessages, endIdx, byRef);
|
|
4686
|
+
if (!ref) return { reject: `recovered ${r.endRef} @${endIdx} has no ref (protected piece)`, ...hinted ? { hint: true } : {} };
|
|
4687
|
+
remap.endRef = ref;
|
|
4688
|
+
}
|
|
4689
|
+
if (!remap.startRef && !remap.endRef) return {};
|
|
4690
|
+
return { remap, recovered: { pos: pair, startIdx, endIdx } };
|
|
4691
|
+
}
|
|
4692
|
+
function rangeFingerprintsCore(ranges, coreMessages, byRef, blocks) {
|
|
4693
|
+
return ranges.map((r) => {
|
|
4694
|
+
const start = boundaryRawCore(r.startRef, byRef, blocks, coreMessages, "min");
|
|
4695
|
+
const end = start ? boundaryRawCore(r.endRef, byRef, blocks, coreMessages, "max") : "";
|
|
4696
|
+
if (start && end) {
|
|
4697
|
+
const fp = spanFingerprintCore(coreMessages, start, end);
|
|
4698
|
+
if (fp.length > 0) return fp;
|
|
4699
|
+
}
|
|
4700
|
+
return "-";
|
|
4701
|
+
});
|
|
4702
|
+
}
|
|
4703
|
+
function rangePositionsCore(ranges, coreMessages, byRef, blocks) {
|
|
4704
|
+
return ranges.map((r) => {
|
|
4705
|
+
const s = boundaryIndexCore(r.startRef, byRef, blocks, coreMessages, "min");
|
|
4706
|
+
const e = s >= 0 ? boundaryIndexCore(r.endRef, byRef, blocks, coreMessages, "max") : -1;
|
|
4707
|
+
return s >= 0 && e >= 0 ? `${s}-${e}` : "-";
|
|
4708
|
+
});
|
|
4709
|
+
}
|
|
4848
4710
|
function toMirrorView(view) {
|
|
4849
4711
|
const out = [];
|
|
4850
4712
|
for (const message of view) {
|
|
@@ -6129,23 +5991,68 @@ import { fileURLToPath } from "url";
|
|
|
6129
5991
|
import { execFile } from "child_process";
|
|
6130
5992
|
import { CONFIG_DIR_NAME as CONFIG_DIR_NAME3 } from "@oh-my-pi/pi-utils";
|
|
6131
5993
|
var PACKAGE_NAME = "billion-context-omp";
|
|
6132
|
-
var
|
|
5994
|
+
var registryUrl = (tag) => `https://registry.npmjs.org/${PACKAGE_NAME}/${encodeURIComponent(tag)}`;
|
|
6133
5995
|
var SEMVER_RE = /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/;
|
|
6134
5996
|
var CHECK_INTERVAL_MS = 3 * 60 * 1e3;
|
|
6135
5997
|
var throttleFile = () => join4(homeDir(), CONFIG_DIR_NAME3, ".billion-context-omp-update-check");
|
|
6136
5998
|
var updateInFlight = false;
|
|
6137
|
-
function
|
|
6138
|
-
|
|
5999
|
+
function isAutoUpdatableSpec(spec) {
|
|
6000
|
+
const value = spec.trim();
|
|
6001
|
+
if (!value) return false;
|
|
6002
|
+
if (value === "latest" || value === "*") return true;
|
|
6003
|
+
if (/^[~^]/.test(value)) return true;
|
|
6004
|
+
if (/^(?:>=|>|<=|<)/.test(value)) return true;
|
|
6005
|
+
if (/\s+(?:\|\||-|[<>=])\s+/.test(value)) return true;
|
|
6006
|
+
if (isDistTag(value)) return true;
|
|
6007
|
+
return false;
|
|
6139
6008
|
}
|
|
6140
|
-
function
|
|
6141
|
-
const
|
|
6142
|
-
|
|
6009
|
+
function specUpdateTag(spec) {
|
|
6010
|
+
const value = spec.trim();
|
|
6011
|
+
if (!isAutoUpdatableSpec(value)) return void 0;
|
|
6012
|
+
if (value === "*") return "latest";
|
|
6013
|
+
if (isDistTag(value)) return value;
|
|
6014
|
+
return "latest";
|
|
6015
|
+
}
|
|
6016
|
+
function isDistTag(value) {
|
|
6017
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)) return false;
|
|
6018
|
+
if (parseSemVer(value)) return false;
|
|
6019
|
+
if (/\.x(\.|$)/i.test(value)) return false;
|
|
6020
|
+
return true;
|
|
6021
|
+
}
|
|
6022
|
+
function isVersionNewer(latest, current) {
|
|
6023
|
+
const next = parseSemVer(latest);
|
|
6024
|
+
const prev = parseSemVer(current);
|
|
6025
|
+
if (!next || !prev) return false;
|
|
6143
6026
|
for (let i = 0; i < 3; i++) {
|
|
6144
|
-
|
|
6145
|
-
|
|
6027
|
+
const a = next.parts[i] ?? 0;
|
|
6028
|
+
const b = prev.parts[i] ?? 0;
|
|
6029
|
+
if (a !== b) return a > b;
|
|
6030
|
+
}
|
|
6031
|
+
if (!next.pre.length && prev.pre.length) return true;
|
|
6032
|
+
if (next.pre.length && !prev.pre.length) return false;
|
|
6033
|
+
for (let i = 0; i < Math.max(next.pre.length, prev.pre.length); i++) {
|
|
6034
|
+
const a = next.pre[i];
|
|
6035
|
+
const b = prev.pre[i];
|
|
6036
|
+
if (a === void 0) return false;
|
|
6037
|
+
if (b === void 0) return true;
|
|
6038
|
+
if (a === b) continue;
|
|
6039
|
+
const aNumber = /^\d+$/.test(a) ? Number(a) : void 0;
|
|
6040
|
+
const bNumber = /^\d+$/.test(b) ? Number(b) : void 0;
|
|
6041
|
+
if (aNumber !== void 0 && bNumber !== void 0) return aNumber > bNumber;
|
|
6042
|
+
if (aNumber !== void 0) return false;
|
|
6043
|
+
if (bNumber !== void 0) return true;
|
|
6044
|
+
return a > b;
|
|
6146
6045
|
}
|
|
6147
6046
|
return false;
|
|
6148
6047
|
}
|
|
6048
|
+
function parseSemVer(version) {
|
|
6049
|
+
const match = version.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+.+)?$/);
|
|
6050
|
+
if (!match) return void 0;
|
|
6051
|
+
return {
|
|
6052
|
+
parts: [Number(match[1]), Number(match[2]), Number(match[3])],
|
|
6053
|
+
pre: match[4]?.split(".") ?? []
|
|
6054
|
+
};
|
|
6055
|
+
}
|
|
6149
6056
|
async function readLastCheck() {
|
|
6150
6057
|
try {
|
|
6151
6058
|
const data = await readFile(throttleFile(), "utf-8");
|
|
@@ -6212,6 +6119,7 @@ var runNodeImpl = (args) => new Promise((resolve2) => {
|
|
|
6212
6119
|
);
|
|
6213
6120
|
});
|
|
6214
6121
|
var runNode = runNodeImpl;
|
|
6122
|
+
var installedSpecOverride = null;
|
|
6215
6123
|
function declaredEntries(pkg) {
|
|
6216
6124
|
const entries = /* @__PURE__ */ new Set();
|
|
6217
6125
|
for (const ext of pkg.omp?.extensions ?? []) {
|
|
@@ -6309,7 +6217,14 @@ async function checkForUpdate(autoUpdate, notify) {
|
|
|
6309
6217
|
const lastCheck = await readLastCheck();
|
|
6310
6218
|
if (now - lastCheck < CHECK_INTERVAL_MS) return;
|
|
6311
6219
|
const runtimeVersion = await getRuntimeVersion();
|
|
6312
|
-
const
|
|
6220
|
+
const spec = await getInstalledSpec();
|
|
6221
|
+
const tag = spec ? specUpdateTag(spec) : "latest";
|
|
6222
|
+
if (!tag) {
|
|
6223
|
+
await writeLastCheck(now);
|
|
6224
|
+
debug.event("update-check", { event: "skip", reason: "pinned-spec", spec });
|
|
6225
|
+
return;
|
|
6226
|
+
}
|
|
6227
|
+
const res = await fetch(registryUrl(tag), {
|
|
6313
6228
|
signal: AbortSignal.timeout(5e3),
|
|
6314
6229
|
headers: { Accept: "application/json" }
|
|
6315
6230
|
});
|
|
@@ -6322,10 +6237,11 @@ async function checkForUpdate(autoUpdate, notify) {
|
|
|
6322
6237
|
const latest = data.version;
|
|
6323
6238
|
if (!latest) return;
|
|
6324
6239
|
const current = runtimeVersion ?? "0.3.2";
|
|
6325
|
-
const hasUpdate =
|
|
6240
|
+
const hasUpdate = isVersionNewer(latest, current);
|
|
6326
6241
|
debug.event("update-check", {
|
|
6327
6242
|
current,
|
|
6328
6243
|
latest,
|
|
6244
|
+
tag,
|
|
6329
6245
|
hasUpdate
|
|
6330
6246
|
});
|
|
6331
6247
|
logInfo("update", { event: "check", current, latest, hasUpdate });
|
|
@@ -6354,6 +6270,15 @@ async function getRuntimeVersion() {
|
|
|
6354
6270
|
const pkg = await readPackageJson(join4(extDir, "package.json"));
|
|
6355
6271
|
return pkg?.version;
|
|
6356
6272
|
}
|
|
6273
|
+
async function getInstalledSpec() {
|
|
6274
|
+
if (installedSpecOverride !== null) return installedSpecOverride;
|
|
6275
|
+
const extDir = await findExtensionDir();
|
|
6276
|
+
if (!extDir) return void 0;
|
|
6277
|
+
const npmRoot = findNpmRoot(extDir);
|
|
6278
|
+
if (!npmRoot) return void 0;
|
|
6279
|
+
const hostPkg = await readPackageJson(join4(npmRoot, "package.json"));
|
|
6280
|
+
return hostPkg?.dependencies?.[PACKAGE_NAME];
|
|
6281
|
+
}
|
|
6357
6282
|
|
|
6358
6283
|
// src/dump.ts
|
|
6359
6284
|
import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2, readdirSync as readdirSync2, unlinkSync as unlinkSync2 } from "fs";
|