acp-kernel 0.0.26 → 0.0.27

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;AAapB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASvD,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;IACnB;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;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;AAsBD,wBAAgB,UAAU,CAAC,KAAK,GAAE,KAAU,GAAG,eAAe,CAwQ7D;AAixBD,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;AAapB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASvD,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;IACnB;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;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;AAsBD,wBAAgB,UAAU,CAAC,KAAK,GAAE,KAAU,GAAG,eAAe,CAwQ7D;AAkxBD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -77,6 +77,7 @@ function createInitialState() {
77
77
  return {
78
78
  blocks: [],
79
79
  messageRefs: { byRaw: {}, byRef: {} },
80
+ tokenSnapshot: {},
80
81
  nudge: {
81
82
  lastPerMessageNudgeTokens: 0,
82
83
  lastNudgeShownTokens: 0,
@@ -257,11 +258,23 @@ function syncBlocks(messages, state) {
257
258
  byRaw: { ...state.messageRefs.byRaw },
258
259
  byRef: { ...state.messageRefs.byRef }
259
260
  },
261
+ // Snapshot is keyed by ref with primitive values — shallow copy suffices.
262
+ tokenSnapshot: { ...state.tokenSnapshot ?? {} },
260
263
  nudge: { ...state.nudge, anchors: { ...state.nudge.anchors } },
261
264
  stats: { ...state.stats },
262
265
  nextBlockId: state.nextBlockId,
263
266
  nextRunId: state.nextRunId
264
267
  };
268
+ const liveRefs = new Set(
269
+ messages.map((m) => result.messageRefs.byRaw[m.id]).filter((r) => typeof r === "string")
270
+ );
271
+ if (Object.keys(result.tokenSnapshot).length !== liveRefs.size) {
272
+ const pruned = {};
273
+ for (const [ref, n] of Object.entries(result.tokenSnapshot)) {
274
+ if (liveRefs.has(ref)) pruned[ref] = n;
275
+ }
276
+ result.tokenSnapshot = pruned;
277
+ }
265
278
  const consumedBlockIds = /* @__PURE__ */ new Set();
266
279
  for (const block of result.blocks) {
267
280
  for (const consumedId of block.directBlockIds) {
@@ -298,12 +311,14 @@ function estimateTokensFast(text) {
298
311
  if (!text) return 0;
299
312
  return Math.ceil(text.length / 4);
300
313
  }
314
+ var BPE_SIZE_GUARD = 1e5;
301
315
  function createBpeTokenizer() {
302
316
  try {
303
317
  const mod = require2("@anthropic-ai/tokenizer");
304
318
  const bpeCount = mod.countTokens ?? mod.default?.countTokens;
305
319
  if (typeof bpeCount !== "function") return defaultCountTokens;
306
320
  return (text) => {
321
+ if (text.length > BPE_SIZE_GUARD) return defaultCountTokens(text);
307
322
  try {
308
323
  return bpeCount(text);
309
324
  } catch {
@@ -788,7 +803,7 @@ var TAG_CLOSE = LT + "/acp" + GT;
788
803
  function acpTag(ref, tokens, type) {
789
804
  return TAG_OPEN + 'tokens="' + formatTokens(tokens) + '" type="' + type + '"' + GT + ref + TAG_CLOSE;
790
805
  }
791
- function renderMessage(message, map, countTokens, strategy) {
806
+ function renderMessage(message, map, countTokens, strategy, snapshot = null) {
792
807
  const ref = refForRaw(map, message.id);
793
808
  if (!ref || ref === BLOCKED_REF) return message;
794
809
  if (strategy === "none") return message;
@@ -799,7 +814,7 @@ function renderMessage(message, map, countTokens, strategy) {
799
814
  "^" + escapeRegex(TAG_OPEN) + "[^>]*" + GT + escapeRegex(ref) + escapeRegex(TAG_CLOSE) + "\\n?"
800
815
  );
801
816
  const cleanText = (message.text || "").replace(ownTagRe, "");
802
- const tokens = countTokens(cleanText);
817
+ const tokens = snapshot ? snapshot[ref] ?? (snapshot[ref] = countTokens(cleanText)) : countTokens(cleanText);
803
818
  const type = classifyType(message);
804
819
  const prefix = acpTag(ref, tokens, type) + "\n";
805
820
  if (!cleanText) return { ...message, text: prefix };
@@ -811,14 +826,27 @@ function renderVisibleRefs(messages, state, countTokens = (text) => Math.ceil(te
811
826
  (message) => renderMessage(message, map, countTokens, strategy)
812
827
  );
813
828
  }
829
+ function renderWithSnapshot(messages, state, countTokens = (text) => Math.ceil(text.length / 4), strategy = "all") {
830
+ const map = state.messageRefs;
831
+ const snapshot = { ...state.tokenSnapshot ?? {} };
832
+ const rendered = messages.map(
833
+ (message) => renderMessage(message, map, countTokens, strategy, snapshot)
834
+ );
835
+ return { messages: rendered, tokenSnapshot: snapshot };
836
+ }
814
837
  function createRenderRefsNode(strategy) {
815
838
  return {
816
839
  name: "render-refs",
817
840
  run(io, ctx) {
818
- return {
819
- ...io,
820
- messages: renderVisibleRefs(io.messages, io.state, ctx.countTokens, strategy)
821
- };
841
+ const { messages, tokenSnapshot } = renderWithSnapshot(
842
+ io.messages,
843
+ io.state,
844
+ ctx.countTokens,
845
+ strategy
846
+ );
847
+ const prev = io.state.tokenSnapshot;
848
+ const changed = !prev || Object.keys(tokenSnapshot).length !== Object.keys(prev).length;
849
+ return changed ? { ...io, messages, state: { ...io.state, tokenSnapshot } } : { ...io, messages };
822
850
  }
823
851
  };
824
852
  }
@@ -1878,6 +1906,7 @@ function cloneState(state) {
1878
1906
  byRaw: { ...state.messageRefs.byRaw },
1879
1907
  byRef: { ...state.messageRefs.byRef }
1880
1908
  },
1909
+ tokenSnapshot: { ...state.tokenSnapshot ?? {} },
1881
1910
  nudge: { ...state.nudge, anchors: { ...state.nudge.anchors } },
1882
1911
  stats: { ...state.stats },
1883
1912
  nextBlockId: state.nextBlockId,