acp-kernel 0.0.5 → 0.0.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"compress.d.ts","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAepB,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAEhB,MAAM,EAEN,WAAW,EAGX,iBAAiB,EAEjB,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,KAAK;IACpB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;IACxD,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,sBAAsB,CAAC;IACvE,YAAY,IAAI,YAAY,EAAE,CAAC;IAC/B,UAAU,CACR,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,gBAAgB,GACtB,gBAAgB,GAAG,SAAS,CAAC;IAChC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CAAC;IACnE,MAAM,CACJ,KAAK,EAAE,gBAAgB,EACvB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,YAAY,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;IACJ,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,wBAAgB,UAAU,CAAC,KAAK,GAAE,KAAU,GAAG,eAAe,CA0M7D;AAkmBD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"compress.d.ts","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAcpB,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAEhB,MAAM,EAEN,WAAW,EAGX,iBAAiB,EAEjB,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,KAAK;IACpB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;IACxD,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,sBAAsB,CAAC;IACvE,YAAY,IAAI,YAAY,EAAE,CAAC;IAC/B,UAAU,CACR,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,gBAAgB,GACtB,gBAAgB,GAAG,SAAS,CAAC;IAChC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CAAC;IACnE,MAAM,CACJ,KAAK,EAAE,gBAAgB,EACvB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,YAAY,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;IACJ,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,wBAAgB,UAAU,CAAC,KAAK,GAAE,KAAU,GAAG,eAAe,CAyM7D;AA0kBD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,wBAAgB,aAAa,CAC3B,iBAAiB,EAAE,MAAM,EACzB,SAAS,GAAE,OAAO,CAAC,MAAM,CAAM,GAC9B,MAAM,CAsCR;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAgCvD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,wBAAgB,aAAa,CAC3B,iBAAiB,EAAE,MAAM,EACzB,SAAS,GAAE,OAAO,CAAC,MAAM,CAAM,GAC9B,MAAM,CAoCR;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BvD"}
package/dist/index.d.ts CHANGED
@@ -22,11 +22,11 @@ export { buildStatusReport, buildRecap } from "./report.js";
22
22
  export type { StatusReportOptions } from "./report.js";
23
23
  export { hideConsumedCompressCalls } from "./hide-consumed.js";
24
24
  export type { HideConsumedResult } from "./hide-consumed.js";
25
- export { mergeMarkedBlocks, collectOldGenBlocks } from "./merge.js";
26
- export type { MergeResult } from "./merge.js";
27
25
  export { rebuildCompressionState } from "./rebuild.js";
28
26
  export type { RebuildResult, RebuildPorts } from "./rebuild.js";
29
27
  export { renderVisibleRefs, renderRefsNode } from "./render-refs.js";
28
+ export { searchBlocks } from "./search.js";
29
+ export type { SearchResult, SearchOptions } from "./search.js";
30
30
  export { isMessageProtected, matchToolPattern } from "./protected.js";
31
31
  export { runPipeline, makeIO, type PipelineNode, type PipelineContext, type NodeIO, type NodeEffects, } from "./pipeline.js";
32
32
  export * from "./filter/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EACV,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC3F,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC/H,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EACH,eAAe,EACf,6BAA6B,EAC7B,kBAAkB,EAClB,eAAe,EACf,2BAA2B,GAC9B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,WAAW,EACX,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC;AACvB,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EACV,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC3F,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC/H,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EACH,eAAe,EACf,6BAA6B,EAC7B,kBAAkB,EAClB,eAAe,EACf,2BAA2B,GAC9B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,WAAW,EACX,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC;AACvB,cAAc,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -313,7 +313,6 @@ function defaultConfig(modelContextLimit, overrides = {}) {
313
313
  },
314
314
  promotionThreshold: 5,
315
315
  truncate: { threshold: 1 },
316
- merge: { maxSummaryLength: 3e3, minOldGenBlocks: 3 },
317
316
  compress: {
318
317
  minCompressRange: 5e3,
319
318
  maxSummaryLength: 2e4,
@@ -330,7 +329,6 @@ function defaultConfig(modelContextLimit, overrides = {}) {
330
329
  tiers: { ...base.tiers, ...overrides.tiers },
331
330
  nudge: { ...base.nudge, ...overrides.nudge },
332
331
  truncate: { ...base.truncate, ...overrides.truncate },
333
- merge: { ...base.merge, ...overrides.merge },
334
332
  compress: { ...base.compress, ...overrides.compress }
335
333
  };
336
334
  }
@@ -350,12 +348,6 @@ function validateConfig(config) {
350
348
  if (config.truncate.threshold <= 0 || config.truncate.threshold > 1) {
351
349
  errors.push("truncate.threshold must be in (0, 1]");
352
350
  }
353
- if (config.merge.maxSummaryLength < 1) {
354
- errors.push("merge.maxSummaryLength must be >= 1");
355
- }
356
- if (config.merge.minOldGenBlocks < 1) {
357
- errors.push("merge.minOldGenBlocks must be >= 1");
358
- }
359
351
  for (const tier of [config.tiers.tier2Trigger, config.tiers.tier3Trigger]) {
360
352
  if (tier < 1) errors.push("tier triggers must be >= 1");
361
353
  }
@@ -554,74 +546,6 @@ function hideConsumedCompressCalls(state, messages) {
554
546
  return { messages: result, hidden };
555
547
  }
556
548
 
557
- // src/merge.ts
558
- function numericPart(blockId) {
559
- const match = /^b(\d+)$/.exec(blockId);
560
- return match && match[1] !== void 0 ? Number(match[1]) : 0;
561
- }
562
- function truncateMergedSummary(merged, maxLength) {
563
- if (merged.length <= maxLength) return merged;
564
- const blocks = merged.split("\n---\n");
565
- const headers = blocks.map((b) => b.split("\n")[0] ?? "").filter((h) => h.trim().length > 0);
566
- const marker = "\n...\n[merged and truncated by batch cleanup]";
567
- const budget = Math.max(0, maxLength - marker.length);
568
- const headerJoin = headers.join("\n");
569
- return headerJoin.length <= budget ? headerJoin + marker : headerJoin.slice(0, budget) + marker;
570
- }
571
- function mergeMarkedBlocks(state, markedIds, maxMergedLength, countTokens) {
572
- const sortedIds = [...new Set(markedIds)].sort((a, b) => numericPart(a) - numericPart(b));
573
- const sourceBlocks = sortedIds.map((id) => state.blocks.find((b) => b.blockId === id && b.active)).filter((b) => b !== void 0);
574
- if (sourceBlocks.length < 2) {
575
- return { state, mergedCount: 0, savedTokens: 0 };
576
- }
577
- const next = {
578
- ...state,
579
- blocks: state.blocks.map((b) => ({ ...b }))
580
- };
581
- const newBlockId = allocateBlockId(next);
582
- const newRunId = allocateRunId(next);
583
- const bodies = sourceBlocks.map((block) => block.summary.trim());
584
- const mergedSummary = truncateMergedSummary(bodies.join("\n---\n"), maxMergedLength);
585
- const newSummaryTokens = countTokens(mergedSummary);
586
- const effectiveMessageIds = /* @__PURE__ */ new Set();
587
- const directMessageIds = /* @__PURE__ */ new Set();
588
- for (const block of sourceBlocks) {
589
- for (const id of block.effectiveMessageIds) effectiveMessageIds.add(id);
590
- for (const id of block.directMessageIds) directMessageIds.add(id);
591
- }
592
- const sourceIds = sourceBlocks.map((b) => b.blockId);
593
- const mergedBlock = {
594
- blockId: newBlockId,
595
- runId: newRunId,
596
- tier: sourceBlocks.reduce((min, b) => b.tier < min ? b.tier : min, 3),
597
- topic: "Batch merge cleanup",
598
- summary: mergedSummary,
599
- directMessageIds: [...directMessageIds],
600
- effectiveMessageIds: [...effectiveMessageIds],
601
- directBlockIds: [...sourceIds],
602
- compressedTokens: sourceBlocks.reduce((sum, b) => sum + b.compressedTokens, 0),
603
- createdAt: Date.now(),
604
- survivedCount: 0,
605
- generation: "old",
606
- active: true
607
- };
608
- for (const block of next.blocks) {
609
- if (sourceIds.includes(block.blockId)) block.active = false;
610
- }
611
- next.blocks.push(mergedBlock);
612
- const sourceTokens = sourceBlocks.reduce(
613
- (sum, block) => sum + countTokens(block.summary),
614
- 0
615
- );
616
- const savedTokens = Math.max(0, sourceTokens - newSummaryTokens);
617
- return { state: next, mergedCount: sourceBlocks.length, savedTokens };
618
- }
619
- function collectOldGenBlocks(state, maxOldGenSummaryLength) {
620
- return state.blocks.filter(
621
- (b) => b.active && (b.generation === "old" || b.summary.length > maxOldGenSummaryLength)
622
- ).sort((a, b) => numericPart(a.blockId) - numericPart(b.blockId));
623
- }
624
-
625
549
  // src/filter/registry.ts
626
550
  var registry = /* @__PURE__ */ new Map();
627
551
  function registerMessageFilter(filter) {
@@ -1148,7 +1072,6 @@ function createCore(ports = {}) {
1148
1072
  return [
1149
1073
  assignRefsNode,
1150
1074
  syncBlocksNode,
1151
- mergeBlocksNode,
1152
1075
  pruneNode,
1153
1076
  filterNode,
1154
1077
  hideCompressCallsNode,
@@ -1181,29 +1104,6 @@ var syncBlocksNode = {
1181
1104
  return { ...io, state: synced.state };
1182
1105
  }
1183
1106
  };
1184
- var mergeBlocksNode = {
1185
- name: "merge-blocks",
1186
- run(io, ctx) {
1187
- const oldGen = collectOldGenBlocks(
1188
- io.state,
1189
- ctx.config.merge.maxSummaryLength
1190
- );
1191
- if (oldGen.length < ctx.config.merge.minOldGenBlocks) return io;
1192
- const ids = oldGen.map((b) => b.blockId);
1193
- const merged = mergeMarkedBlocks(
1194
- io.state,
1195
- ids,
1196
- ctx.config.merge.maxSummaryLength,
1197
- ctx.countTokens
1198
- );
1199
- if (merged.mergedCount === 0) return io;
1200
- return {
1201
- ...io,
1202
- state: merged.state,
1203
- effects: { ...io.effects, mergedCount: merged.mergedCount }
1204
- };
1205
- }
1206
- };
1207
1107
  var pruneNode = {
1208
1108
  name: "prune",
1209
1109
  run(io) {
@@ -1984,7 +1884,7 @@ function findBlocksOverlappingMessages(state, messageIds) {
1984
1884
  matched.push(block);
1985
1885
  }
1986
1886
  }
1987
- return matched.sort((a, b) => numericPart2(a.blockId) - numericPart2(b.blockId));
1887
+ return matched.sort((a, b) => numericPart(a.blockId) - numericPart(b.blockId));
1988
1888
  }
1989
1889
  function findActiveAncestor(state, blockId) {
1990
1890
  const start = state.blocks.find((b) => b.blockId === blockId);
@@ -2060,7 +1960,7 @@ function buildRestoredContentPreview(messages, beforeActiveMessageIds, state) {
2060
1960
  }
2061
1961
  return { preview: lines.join("\n"), restoredCount: restored.length };
2062
1962
  }
2063
- function numericPart2(blockId) {
1963
+ function numericPart(blockId) {
2064
1964
  const match = /^b(\d+)$/.exec(blockId);
2065
1965
  return match && match[1] !== void 0 ? Number(match[1]) : 0;
2066
1966
  }
@@ -2074,7 +1974,7 @@ function pct(n, total) {
2074
1974
  if (n <= 0 || total <= 0) return 0;
2075
1975
  return Math.max(1, Math.round(n / total * 100));
2076
1976
  }
2077
- function numericPart3(blockId) {
1977
+ function numericPart2(blockId) {
2078
1978
  const match = /^b(\d+)$/.exec(blockId);
2079
1979
  return match && match[1] !== void 0 ? Number(match[1]) : 0;
2080
1980
  }
@@ -2134,7 +2034,7 @@ function buildStatusReport(state, messages, countTokens, options = {}) {
2134
2034
  const toolFilter = options.tool;
2135
2035
  const sort = options.sort ?? "size";
2136
2036
  const limit = options.limit ?? 30;
2137
- const activeBlocks2 = state.blocks.filter((b) => b.active).sort((a, b) => numericPart3(a.blockId) - numericPart3(b.blockId));
2037
+ const activeBlocks2 = state.blocks.filter((b) => b.active).sort((a, b) => numericPart2(a.blockId) - numericPart2(b.blockId));
2138
2038
  if (scope === "compressed") {
2139
2039
  return renderCompressedDrilldown(activeBlocks2, state, sort, limit, countTokens);
2140
2040
  }
@@ -2268,7 +2168,7 @@ function renderCompressedDrilldown(blocks, state, sort, limit, countTokens) {
2268
2168
  return lines.join("\n");
2269
2169
  }
2270
2170
  function buildRecap(state, blockId) {
2271
- const activeBlocks2 = state.blocks.filter((b) => b.active).sort((a, b) => numericPart3(a.blockId) - numericPart3(b.blockId));
2171
+ const activeBlocks2 = state.blocks.filter((b) => b.active).sort((a, b) => numericPart2(a.blockId) - numericPart2(b.blockId));
2272
2172
  if (blockId !== void 0) {
2273
2173
  const block = state.blocks.find((b) => b.blockId === blockId);
2274
2174
  if (!block) {
@@ -2352,6 +2252,42 @@ function extractRanges(input, callId) {
2352
2252
  }
2353
2253
  return ranges;
2354
2254
  }
2255
+
2256
+ // src/search.ts
2257
+ function searchBlocks(state, query, options = {}) {
2258
+ const limit = options.limit ?? 10;
2259
+ const previewLength = options.previewLength ?? 200;
2260
+ const minScore = options.minScore ?? 1;
2261
+ const terms = query.toLowerCase().trim().split(/\s+/).filter((t) => t.length > 0);
2262
+ if (terms.length === 0) return [];
2263
+ const active = state.blocks.filter((b) => b.active);
2264
+ const scored = [];
2265
+ for (const block of active) {
2266
+ const text = (block.summary || "").toLowerCase();
2267
+ const topic = (block.topic || "").toLowerCase();
2268
+ const haystack = topic + " " + text;
2269
+ let score = 0;
2270
+ for (const term of terms) {
2271
+ score += countOccurrences2(haystack, term);
2272
+ }
2273
+ if (score >= minScore) {
2274
+ scored.push({
2275
+ blockId: block.blockId,
2276
+ tier: block.tier ?? 1,
2277
+ score,
2278
+ topic: block.topic ?? "(no topic)",
2279
+ preview: (block.summary || "").slice(0, previewLength),
2280
+ block
2281
+ });
2282
+ }
2283
+ }
2284
+ scored.sort((a, b) => b.score - a.score);
2285
+ return scored.slice(0, limit);
2286
+ }
2287
+ function countOccurrences2(haystack, needle) {
2288
+ if (needle.length === 0) return 0;
2289
+ return haystack.split(needle).length - 1;
2290
+ }
2355
2291
  export {
2356
2292
  BLOCKED_REF,
2357
2293
  COMPRESS_PHILOSOPHY,
@@ -2370,7 +2306,6 @@ export {
2370
2306
  buildRestoredContentPreview,
2371
2307
  buildStatusReport,
2372
2308
  clearMessageFilters,
2373
- collectOldGenBlocks,
2374
2309
  coveredMessageIds,
2375
2310
  createBpeTokenizer,
2376
2311
  createCore,
@@ -2391,7 +2326,6 @@ export {
2391
2326
  listMessageFilters,
2392
2327
  makeIO,
2393
2328
  matchToolPattern,
2394
- mergeMarkedBlocks,
2395
2329
  parseBlockIdArg,
2396
2330
  parseBoundary,
2397
2331
  prune,
@@ -2406,6 +2340,7 @@ export {
2406
2340
  resolveBoundaries,
2407
2341
  resolveKeepMarkers,
2408
2342
  runPipeline,
2343
+ searchBlocks,
2409
2344
  syncBlocks,
2410
2345
  truncateLargeToolOutputs,
2411
2346
  validateConfig