acp-kernel 0.0.28 → 0.0.29

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.d.ts CHANGED
@@ -29,6 +29,7 @@ export type { RenderStrategy } from "./render-refs.js";
29
29
  export { resolveTransformChannel } from "./transform-channel.js";
30
30
  export type { TransformChannel } from "./transform-channel.js";
31
31
  export { searchBlocks, searchBlocksAsync, blockDocs, messageDocs } from "./search.js";
32
+ export { clearDocFeatures, docCacheInfo, docFeatures, setDocCacheCap } from "./search.js";
32
33
  export type { SearchResult, SearchOptions, SearchAlgorithm, AsyncSearchAlgorithm, AnySearchAlgorithm, SearchDoc, SearchDocKind, ScoredBlock, MessageRole, RoleWeights, MessageInput } from "./search.js";
33
34
  export { DEFAULT_ALGORITHM, DEFAULT_ROLE_WEIGHTS, registerSearchAlgorithm, getSearchAlgorithm, listSearchAlgorithms } from "./search.js";
34
35
  export { isMessageProtected, matchToolPattern } from "./protected.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2705,26 +2705,6 @@ function resolveTransformChannel(explicit, wireViable) {
2705
2705
  return explicit ?? (wireViable ? "wire" : "message");
2706
2706
  }
2707
2707
 
2708
- // src/search/algorithms/substring.ts
2709
- var substringAlgorithm = {
2710
- name: "substring",
2711
- description: "Exact substring counting (original baseline). Predictable, no normalization.",
2712
- score(docs, query) {
2713
- const terms = query.toLowerCase().trim().split(/\s+/).filter((t) => t.length > 0);
2714
- if (terms.length === 0) return docs.map((d) => ({ ref: d.ref, score: 0 }));
2715
- return docs.map((d) => {
2716
- const haystack = d.text.toLowerCase();
2717
- let score = 0;
2718
- for (const term of terms) score += countOccurrences2(haystack, term);
2719
- return { ref: d.ref, score };
2720
- });
2721
- }
2722
- };
2723
- function countOccurrences2(haystack, needle) {
2724
- if (!needle) return 0;
2725
- return haystack.split(needle).length - 1;
2726
- }
2727
-
2728
2708
  // src/search/stemmer.ts
2729
2709
  function stem(word) {
2730
2710
  let w = word;
@@ -2746,8 +2726,17 @@ function stem(word) {
2746
2726
 
2747
2727
  // src/search/tokenizer.ts
2748
2728
  var CJK = /[\u3400-\u9fff\uf900-\ufaff\u3040-\u30ff\uac00-\ud7af]/;
2749
- var CJK_RUN = new RegExp(`${CJK.source}+`, "g");
2750
2729
  var LATIN_WORD = /[a-z][a-z0-9_]*[a-z0-9]|[a-z0-9]/g;
2730
+ var cjkSegmenter = new Intl.Segmenter("zh", { granularity: "word" });
2731
+ function cjkRunTokens(segs) {
2732
+ const words = segs.filter((w) => w.length >= 2);
2733
+ if (words.length > 0) return words;
2734
+ const run = segs.join("");
2735
+ const out = [];
2736
+ for (let i = 0; i < run.length - 1; i++) out.push(run.slice(i, i + 2));
2737
+ for (const ch of run) out.push(ch);
2738
+ return out;
2739
+ }
2751
2740
  function tokenize(text, opts = {}) {
2752
2741
  const lower = text.toLowerCase();
2753
2742
  const tokens = [];
@@ -2758,15 +2747,23 @@ function tokenize(text, opts = {}) {
2758
2747
  tokens.push(w);
2759
2748
  }
2760
2749
  }
2761
- const cjkRuns = lower.match(CJK_RUN) ?? [];
2762
- for (const run of cjkRuns) {
2763
- if (run.length === 1) {
2764
- tokens.push(run);
2765
- } else {
2766
- for (let i = 0; i < run.length - 1; i++) tokens.push(run.slice(i, i + 2));
2767
- for (const ch of run) tokens.push(ch);
2750
+ if (!CJK.test(lower)) return tokens;
2751
+ const runSegs = [];
2752
+ let cur = null;
2753
+ for (const s of cjkSegmenter.segment(lower)) {
2754
+ const t = s.segment;
2755
+ if (t.length === 0) continue;
2756
+ if (CJK.test(t)) {
2757
+ (cur ??= []).push(t);
2758
+ } else if (cur) {
2759
+ runSegs.push(cur);
2760
+ cur = null;
2768
2761
  }
2769
2762
  }
2763
+ if (cur) runSegs.push(cur);
2764
+ for (const segs of runSegs) {
2765
+ tokens.push(...cjkRunTokens(segs));
2766
+ }
2770
2767
  return tokens;
2771
2768
  }
2772
2769
  function charBigrams(text) {
@@ -2783,6 +2780,69 @@ function tfMap(text, stem2) {
2783
2780
  return m;
2784
2781
  }
2785
2782
 
2783
+ // src/search/doc-cache.ts
2784
+ var DEFAULT_CAP_CHARS = 8 * 1024 * 1024;
2785
+ var capChars = DEFAULT_CAP_CHARS;
2786
+ var cache = /* @__PURE__ */ new Map();
2787
+ var cachedChars = 0;
2788
+ function build(text) {
2789
+ const tf = tfMap(text, true);
2790
+ let len = 0;
2791
+ for (const v of tf.values()) len += v;
2792
+ const lower = text.toLowerCase();
2793
+ return { tf, len, lower, grams: new Set(charBigrams(lower)) };
2794
+ }
2795
+ function docFeatures(text) {
2796
+ const hit = cache.get(text);
2797
+ if (hit) return hit;
2798
+ const f = build(text);
2799
+ if (text.length > 0 && text.length <= capChars) {
2800
+ while (cachedChars + text.length > capChars && cache.size > 0) {
2801
+ const k = cache.keys().next().value;
2802
+ cachedChars -= k.length;
2803
+ cache.delete(k);
2804
+ }
2805
+ cache.set(text, f);
2806
+ cachedChars += text.length;
2807
+ }
2808
+ return f;
2809
+ }
2810
+ function clearDocFeatures() {
2811
+ cache.clear();
2812
+ cachedChars = 0;
2813
+ }
2814
+ function setDocCacheCap(chars) {
2815
+ capChars = Math.max(1, chars);
2816
+ while (cachedChars > capChars && cache.size > 0) {
2817
+ const k = cache.keys().next().value;
2818
+ cachedChars -= k.length;
2819
+ cache.delete(k);
2820
+ }
2821
+ }
2822
+ function docCacheInfo() {
2823
+ return { entries: cache.size, chars: cachedChars };
2824
+ }
2825
+
2826
+ // src/search/algorithms/substring.ts
2827
+ var substringAlgorithm = {
2828
+ name: "substring",
2829
+ description: "Exact substring counting (original baseline). Predictable, no normalization.",
2830
+ score(docs, query) {
2831
+ const terms = query.toLowerCase().trim().split(/\s+/).filter((t) => t.length > 0);
2832
+ if (terms.length === 0) return docs.map((d) => ({ ref: d.ref, score: 0 }));
2833
+ return docs.map((d) => {
2834
+ const haystack = docFeatures(d.text).lower;
2835
+ let score = 0;
2836
+ for (const term of terms) score += countOccurrences2(haystack, term);
2837
+ return { ref: d.ref, score };
2838
+ });
2839
+ }
2840
+ };
2841
+ function countOccurrences2(haystack, needle) {
2842
+ if (!needle) return 0;
2843
+ return haystack.split(needle).length - 1;
2844
+ }
2845
+
2786
2846
  // src/search/algorithms/bm25.ts
2787
2847
  var bm25Algorithm = {
2788
2848
  name: "bm25",
@@ -2792,11 +2852,8 @@ var bm25Algorithm = {
2792
2852
  const k1 = 1.2;
2793
2853
  const b = 0.75;
2794
2854
  const parsed = docs.map((d) => {
2795
- const text = d.text;
2796
- const tf = tfMap(text, true);
2797
- let len = 0;
2798
- for (const v of tf.values()) len += v;
2799
- return { id: d.ref, tf, len };
2855
+ const f = docFeatures(d.text);
2856
+ return { id: d.ref, tf: f.tf, len: f.len };
2800
2857
  });
2801
2858
  const avgdl = parsed.reduce((s, d) => s + d.len, 0) / (N || 1);
2802
2859
  const qTerms = tokenize(query, { stem: true });
@@ -2825,14 +2882,13 @@ var fuzzyAlgorithm = {
2825
2882
  name: "fuzzy",
2826
2883
  description: "Character bigram overlap. Typo-tolerant, script-agnostic, high recall.",
2827
2884
  score(docs, query) {
2828
- const qTokens = query.toLowerCase().split(/[\s,]+/).filter((t) => t.length >= 4);
2885
+ const qTokens = query.toLowerCase().split(/[\s,]+/).filter((t) => t.length >= 4 || t.length >= 2 && CJK.test(t));
2829
2886
  if (qTokens.length === 0) return docs.map((d) => ({ ref: d.ref, score: 0 }));
2830
2887
  const qGrams = /* @__PURE__ */ new Set();
2831
2888
  for (const t of qTokens) for (const g of charBigrams(t)) qGrams.add(g);
2832
2889
  if (qGrams.size === 0) return docs.map((d) => ({ ref: d.ref, score: 0 }));
2833
2890
  return docs.map((d) => {
2834
- const haystack = d.text.toLowerCase();
2835
- const docGrams = new Set(charBigrams(haystack));
2891
+ const docGrams = docFeatures(d.text).grams;
2836
2892
  let hits = 0;
2837
2893
  for (const g of qGrams) if (docGrams.has(g)) hits++;
2838
2894
  return { ref: d.ref, score: hits / qGrams.size };
@@ -3006,6 +3062,7 @@ export {
3006
3062
  buildRecap,
3007
3063
  buildRestoredContentPreview,
3008
3064
  buildStatusReport,
3065
+ clearDocFeatures,
3009
3066
  clearMessageFilters,
3010
3067
  collectBlockContent,
3011
3068
  coveredMessageIds,
@@ -3017,6 +3074,8 @@ export {
3017
3074
  defaultConfig,
3018
3075
  defaultCountTokens,
3019
3076
  defaultPrompts,
3077
+ docCacheInfo,
3078
+ docFeatures,
3020
3079
  emptyRefMap,
3021
3080
  estimateTokensFast,
3022
3081
  findActiveAncestor,
@@ -3052,6 +3111,7 @@ export {
3052
3111
  runPipeline,
3053
3112
  searchBlocks,
3054
3113
  searchBlocksAsync,
3114
+ setDocCacheCap,
3055
3115
  syncBlocks,
3056
3116
  truncateLargeToolOutputs,
3057
3117
  validateConfig