billion-context-omp 0.3.2-pr.139.4 → 0.3.2-pr.140.6
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 +321 -224
- package/dist/index.js.map +1 -1
- package/dist/messages.d.ts +4 -29
- package/dist/update.d.ts +0 -10
- package/dist/wire-fold.d.ts +4 -80
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -2348,6 +2348,144 @@ 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
|
+
};
|
|
2351
2489
|
function parseBlockIdArg(arg) {
|
|
2352
2490
|
const normalized = arg.trim().toLowerCase();
|
|
2353
2491
|
const refMatch = /^b0*(\d+)$/.exec(normalized);
|
|
@@ -3529,6 +3667,7 @@ When context usage passes a threshold, the system appends a breakdown showing wh
|
|
|
3529
3667
|
|
|
3530
3668
|
// node_modules/acp-kernel/dist/wire/index.js
|
|
3531
3669
|
import { createHash as createHash2 } from "crypto";
|
|
3670
|
+
import { createHash as createHash22 } from "crypto";
|
|
3532
3671
|
function hashId(s) {
|
|
3533
3672
|
return createHash2("sha256").update(s, "utf8").digest("hex").slice(0, 16);
|
|
3534
3673
|
}
|
|
@@ -4359,12 +4498,6 @@ function mirrorResponsesToCore(view, systemText) {
|
|
|
4359
4498
|
});
|
|
4360
4499
|
return msgs;
|
|
4361
4500
|
}
|
|
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*$`);
|
|
4368
4501
|
function compressToolArgs(call) {
|
|
4369
4502
|
let args = call.arguments;
|
|
4370
4503
|
if (typeof args === "string") {
|
|
@@ -4395,12 +4528,159 @@ function compressToolArgs(call) {
|
|
|
4395
4528
|
const ia = inner;
|
|
4396
4529
|
return Array.isArray(ia.content) ? { content: ia.content, topic: ia.topic, summaryMaxChars: ia.summaryMaxChars } : { content: [ia] };
|
|
4397
4530
|
}
|
|
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*$`);
|
|
4398
4679
|
function stripRefTag(text) {
|
|
4399
4680
|
return text.replace(REF_TAG, "").replace(TRAILING_REF_TAG, "");
|
|
4400
4681
|
}
|
|
4401
4682
|
|
|
4402
4683
|
// src/wire-fold.ts
|
|
4403
|
-
import { createHash as createHash4 } from "crypto";
|
|
4404
4684
|
function detectProviderWireFormat(payload) {
|
|
4405
4685
|
const fmt2 = detectWireFormat(payload);
|
|
4406
4686
|
if (fmt2 === "anthropic" || fmt2 === "openai" || fmt2 === "responses") return fmt2;
|
|
@@ -4565,148 +4845,6 @@ function coreIdentity(msg) {
|
|
|
4565
4845
|
text: stripRefTag(msg.text ?? "")
|
|
4566
4846
|
});
|
|
4567
4847
|
}
|
|
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
|
-
}
|
|
4710
4848
|
function toMirrorView(view) {
|
|
4711
4849
|
const out = [];
|
|
4712
4850
|
for (const message of view) {
|
|
@@ -4832,6 +4970,14 @@ function createRuntime(adapter) {
|
|
|
4832
4970
|
coreSlots.set(sid, slot);
|
|
4833
4971
|
lcp = 0;
|
|
4834
4972
|
}
|
|
4973
|
+
if (lcp === 0 && slot.state.blocks.length > 0) {
|
|
4974
|
+
const presentIds = new Set(ids);
|
|
4975
|
+
const surviving = slot.state.blocks.filter((b) => b.active === false || b.effectiveMessageIds.some((id) => presentIds.has(id)));
|
|
4976
|
+
if (surviving.length < slot.state.blocks.length) {
|
|
4977
|
+
debug.event("fold-purge-stale-blocks", { sid, before: slot.state.blocks.length, after: surviving.length });
|
|
4978
|
+
slot.state = { ...slot.state, blocks: surviving };
|
|
4979
|
+
}
|
|
4980
|
+
}
|
|
4835
4981
|
const coreMessages = stream;
|
|
4836
4982
|
const config = configFor(ctx);
|
|
4837
4983
|
const names = toolCallNames(stream);
|
|
@@ -4967,17 +5113,31 @@ ${acp}`);
|
|
|
4967
5113
|
logInfo("fold", { sid, event: "fold-restore-empty" });
|
|
4968
5114
|
return false;
|
|
4969
5115
|
}
|
|
5116
|
+
const byId = /* @__PURE__ */ new Map();
|
|
5117
|
+
for (const b of r.state.blocks) {
|
|
5118
|
+
const prev = byId.get(b.blockId);
|
|
5119
|
+
if (!prev || b.createdAt > prev.createdAt) byId.set(b.blockId, b);
|
|
5120
|
+
}
|
|
5121
|
+
const blocks = [...byId.values()];
|
|
5122
|
+
if (blocks.length < r.state.blocks.length) {
|
|
5123
|
+
logInfo("fold", { sid, event: "fold-restore-dedup", before: r.state.blocks.length, after: blocks.length });
|
|
5124
|
+
}
|
|
5125
|
+
const maxId = blocks.reduce((m, b) => {
|
|
5126
|
+
const n = /^b(\d+)$/i.exec(b.blockId);
|
|
5127
|
+
return n ? Math.max(m, Number.parseInt(n[1], 10)) : m;
|
|
5128
|
+
}, 0);
|
|
5129
|
+
const state = { ...r.state, blocks, nextBlockId: Math.max(r.state.nextBlockId ?? 1, maxId + 1) };
|
|
4970
5130
|
coreSlots.set(sid, {
|
|
4971
5131
|
identities: r.identities,
|
|
4972
5132
|
foldedLen: r.foldedLen,
|
|
4973
5133
|
preview: false,
|
|
4974
5134
|
live: true,
|
|
4975
|
-
state
|
|
5135
|
+
state,
|
|
4976
5136
|
coreMessages: r.coreMessages,
|
|
4977
5137
|
appliedCallIds: r.appliedCallIds,
|
|
4978
5138
|
rejectStreak: r.rejectStreak
|
|
4979
5139
|
});
|
|
4980
|
-
logInfo("fold", { sid, event: "fold-restore", blocks:
|
|
5140
|
+
logInfo("fold", { sid, event: "fold-restore", blocks: state.blocks.length, foldedLen: r.foldedLen, nextBlockId: state.nextBlockId });
|
|
4981
5141
|
return true;
|
|
4982
5142
|
}
|
|
4983
5143
|
function snapshotOf(slot) {
|
|
@@ -5991,68 +6151,23 @@ import { fileURLToPath } from "url";
|
|
|
5991
6151
|
import { execFile } from "child_process";
|
|
5992
6152
|
import { CONFIG_DIR_NAME as CONFIG_DIR_NAME3 } from "@oh-my-pi/pi-utils";
|
|
5993
6153
|
var PACKAGE_NAME = "billion-context-omp";
|
|
5994
|
-
var
|
|
6154
|
+
var REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
5995
6155
|
var SEMVER_RE = /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/;
|
|
5996
6156
|
var CHECK_INTERVAL_MS = 3 * 60 * 1e3;
|
|
5997
6157
|
var throttleFile = () => join4(homeDir(), CONFIG_DIR_NAME3, ".billion-context-omp-update-check");
|
|
5998
6158
|
var updateInFlight = false;
|
|
5999
|
-
function
|
|
6000
|
-
|
|
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;
|
|
6159
|
+
function parseVersion(v) {
|
|
6160
|
+
return v.replace(/^v/, "").split(".").map((n) => parseInt(n, 10) || 0);
|
|
6008
6161
|
}
|
|
6009
|
-
function
|
|
6010
|
-
const
|
|
6011
|
-
|
|
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;
|
|
6162
|
+
function isNewer(latest, current) {
|
|
6163
|
+
const l = parseVersion(latest);
|
|
6164
|
+
const c = parseVersion(current);
|
|
6026
6165
|
for (let i = 0; i < 3; i++) {
|
|
6027
|
-
|
|
6028
|
-
|
|
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;
|
|
6166
|
+
if ((l[i] ?? 0) > (c[i] ?? 0)) return true;
|
|
6167
|
+
if ((l[i] ?? 0) < (c[i] ?? 0)) return false;
|
|
6045
6168
|
}
|
|
6046
6169
|
return false;
|
|
6047
6170
|
}
|
|
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
|
-
}
|
|
6056
6171
|
async function readLastCheck() {
|
|
6057
6172
|
try {
|
|
6058
6173
|
const data = await readFile(throttleFile(), "utf-8");
|
|
@@ -6119,7 +6234,6 @@ var runNodeImpl = (args) => new Promise((resolve2) => {
|
|
|
6119
6234
|
);
|
|
6120
6235
|
});
|
|
6121
6236
|
var runNode = runNodeImpl;
|
|
6122
|
-
var installedSpecOverride = null;
|
|
6123
6237
|
function declaredEntries(pkg) {
|
|
6124
6238
|
const entries = /* @__PURE__ */ new Set();
|
|
6125
6239
|
for (const ext of pkg.omp?.extensions ?? []) {
|
|
@@ -6217,14 +6331,7 @@ async function checkForUpdate(autoUpdate, notify) {
|
|
|
6217
6331
|
const lastCheck = await readLastCheck();
|
|
6218
6332
|
if (now - lastCheck < CHECK_INTERVAL_MS) return;
|
|
6219
6333
|
const runtimeVersion = await getRuntimeVersion();
|
|
6220
|
-
const
|
|
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), {
|
|
6334
|
+
const res = await fetch(REGISTRY_URL, {
|
|
6228
6335
|
signal: AbortSignal.timeout(5e3),
|
|
6229
6336
|
headers: { Accept: "application/json" }
|
|
6230
6337
|
});
|
|
@@ -6237,11 +6344,10 @@ async function checkForUpdate(autoUpdate, notify) {
|
|
|
6237
6344
|
const latest = data.version;
|
|
6238
6345
|
if (!latest) return;
|
|
6239
6346
|
const current = runtimeVersion ?? "0.3.2";
|
|
6240
|
-
const hasUpdate =
|
|
6347
|
+
const hasUpdate = isNewer(latest, current);
|
|
6241
6348
|
debug.event("update-check", {
|
|
6242
6349
|
current,
|
|
6243
6350
|
latest,
|
|
6244
|
-
tag,
|
|
6245
6351
|
hasUpdate
|
|
6246
6352
|
});
|
|
6247
6353
|
logInfo("update", { event: "check", current, latest, hasUpdate });
|
|
@@ -6270,15 +6376,6 @@ async function getRuntimeVersion() {
|
|
|
6270
6376
|
const pkg = await readPackageJson(join4(extDir, "package.json"));
|
|
6271
6377
|
return pkg?.version;
|
|
6272
6378
|
}
|
|
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
|
-
}
|
|
6282
6379
|
|
|
6283
6380
|
// src/dump.ts
|
|
6284
6381
|
import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2, readdirSync as readdirSync2, unlinkSync as unlinkSync2 } from "fs";
|