acp-kernel 0.0.73-pr.302.168 → 0.0.73-pr.305.170

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":"hide-consumed.d.ts","sourceRoot":"","sources":["../src/hide-consumed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAYhE,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAClB;AA8FD,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,WAAW,EAAE,GACxB,kBAAkB,CAwFpB"}
1
+ {"version":3,"file":"hide-consumed.d.ts","sourceRoot":"","sources":["../src/hide-consumed.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAYhE,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAClB;AA8FD,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,WAAW,EAAE,GACxB,kBAAkB,CAwFpB"}
package/dist/index.js CHANGED
@@ -723,6 +723,26 @@ ${suffix}`;
723
723
  };
724
724
  }
725
725
 
726
+ // src/truncate.ts
727
+ function isHighSurrogate(c) {
728
+ return c >= 55296 && c <= 56319;
729
+ }
730
+ function isLowSurrogate(c) {
731
+ return c >= 56320 && c <= 57343;
732
+ }
733
+ function clampPrefix(text, maxUnits) {
734
+ const cut = Math.min(maxUnits, text.length);
735
+ if (cut > 0 && isHighSurrogate(text.charCodeAt(cut - 1))) return text.slice(0, cut - 1);
736
+ return text.slice(0, cut);
737
+ }
738
+ function clampWindow(text, start, end) {
739
+ let s = Math.max(0, Math.min(start, text.length));
740
+ let e = Math.min(text.length, Math.max(s, end));
741
+ if (s > 0 && isLowSurrogate(text.charCodeAt(s))) s += 1;
742
+ if (e > s && isHighSurrogate(text.charCodeAt(e - 1))) e -= 1;
743
+ return text.slice(s, Math.max(s, e));
744
+ }
745
+
726
746
  // src/hide-consumed.ts
727
747
  var KEEP_LAST_ORPHANED = 2;
728
748
  function rangeKey(startRef, endRef) {
@@ -775,7 +795,7 @@ function compactEntry(entry) {
775
795
  if (!entry || typeof entry !== "object") return entry;
776
796
  const e = entry;
777
797
  if (typeof e.summary !== "string" || e.summary.length <= SUMMARY_STUB_CHARS) return entry;
778
- return { ...e, summary: `${e.summary.slice(0, SUMMARY_STUB_CHARS - 1)}\u2026` };
798
+ return { ...e, summary: `${clampPrefix(e.summary, SUMMARY_STUB_CHARS - 1)}\u2026` };
779
799
  }
780
800
  function serializeCompacted(obj, content, contentWasString) {
781
801
  let changed = false;
@@ -3825,7 +3845,7 @@ ${block.summary}
3825
3845
  const lines = [`Active compression blocks (${activeBlocks2.length}):`];
3826
3846
  for (const block of activeBlocks2) {
3827
3847
  const range = `${block.effectiveMessageIds.length} messages`;
3828
- const preview = block.summary.slice(0, 200);
3848
+ const preview = clampPrefix(block.summary, 200);
3829
3849
  lines.push(`
3830
3850
  ${block.blockId} | ${range} | "${block.topic ?? "(none)"}"`);
3831
3851
  lines.push(` ${preview}${block.summary.length > 200 ? "..." : ""}`);
@@ -4107,7 +4127,7 @@ function deriveTopicFromSummary(summary) {
4107
4127
  const source = heading !== null ? heading[1] : summary.split("\n").find((l) => l.trim().length > 0) ?? "";
4108
4128
  const text = source.trim().replace(/^[\u2022\-*]\s+/, "");
4109
4129
  if (text.length === 0) return void 0;
4110
- return text.length > 60 ? text.slice(0, 60).trimEnd() : text;
4130
+ return text.length > 60 ? clampPrefix(text, 60).trimEnd() : text;
4111
4131
  }
4112
4132
  function splitLineEntries(content) {
4113
4133
  const parts = content.split(/\n(?=\s*(?:["']\s*,\s*)?["']?\s*[mb]\d{1,7}\s*(?:[-\u2013\u2014\u2026~]|\.\.\.|to)\s*[mb]\d{1,7}\b)/i).map((p) => p.trim().replace(/^(?:["']\s*,?\s*)+/, "").replace(/["']\s*$/, "")).filter((p) => p.length > 0);
@@ -4691,7 +4711,7 @@ function messageDocs(msgs) {
4691
4711
  kind: "message",
4692
4712
  ref: m.ref,
4693
4713
  text: m.text,
4694
- title: `${m.role}: ${m.text.slice(0, 60)}`,
4714
+ title: `${m.role}: ${clampPrefix(m.text, 60)}`,
4695
4715
  role: m.role,
4696
4716
  blockId: m.blockId,
4697
4717
  tier: m.tier,
@@ -4756,7 +4776,7 @@ async function searchBlocksAsync(docs, query, options = {}) {
4756
4776
  function makePreview(text, query, len) {
4757
4777
  if (!text) return "";
4758
4778
  const terms = query.toLowerCase().trim().split(/\s+/).filter((t) => t.length > 1);
4759
- if (terms.length === 0) return text.slice(0, len);
4779
+ if (terms.length === 0) return clampPrefix(text, len);
4760
4780
  const lower = text.toLowerCase();
4761
4781
  let hitIdx = -1;
4762
4782
  for (const term of terms) {
@@ -4766,13 +4786,13 @@ function makePreview(text, query, len) {
4766
4786
  break;
4767
4787
  }
4768
4788
  }
4769
- if (hitIdx < 0) return text.slice(0, len);
4789
+ if (hitIdx < 0) return clampPrefix(text, len);
4770
4790
  const half = Math.max(0, Math.floor(len / 2) - 10);
4771
4791
  const start = Math.max(0, hitIdx - half);
4772
4792
  const end = Math.min(text.length, start + len);
4773
4793
  const prefix = start > 0 ? "\u2026" : "";
4774
4794
  const suffix = end < text.length ? "\u2026" : "";
4775
- return prefix + text.slice(start, end).trim() + suffix;
4795
+ return prefix + clampWindow(text, start, end).trim() + suffix;
4776
4796
  }
4777
4797
  export {
4778
4798
  ABSORB_PROMPT_MARKER,