{"_id":"@buckeyestudio/toh-compaction-tool-result-pruner","name":"@buckeyestudio/toh-compaction-tool-result-pruner","dist-tags":{"next":"0.1.1-rc.2","latest":"0.1.1-rc.2"},"versions":{"0.1.1-rc.2":{"name":"@buckeyestudio/toh-compaction-tool-result-pruner","description":"Replay-safe model-free head/middle/tail pruning for tool-result surface nodes","version":"0.1.1-rc.2","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/dustinwloring1988/theopen-harness.git","directory":"packages/compaction/compaction-tool-result-pruner"},"type":"module","main":"lib/index.js","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./src/*":"./src/*","./package.json":"./package.json"},"license":"MIT","author":{"name":"buckeyestudio"},"peerDependencies":{"@buckeyestudio/toh-invariants":"^0.1.1-rc.2","@buckeyestudio/toh-compaction":"^0.1.1-rc.2","@buckeyestudio/toh-session":"^0.1.1-rc.2","@buckeyestudio/toh-token-meter":"^0.1.1-rc.2","@buckeyestudio/toh-llm":"^0.1.1-rc.2","@buckeyestudio/cordis":"^4.0.1"},"dependencies":{"@buckeyestudio/schemastery":"^3.18.1"},"devDependencies":{"@buckeyestudio/cordis-plugin-include":"^1.0.6","@buckeyestudio/cordis-plugin-loader":"^1.0.2","@buckeyestudio/toh-invariants":"^0.1.1-rc.2","@buckeyestudio/toh-llm":"^0.1.1-rc.2","@buckeyestudio/toh-compaction":"^0.1.1-rc.2","@buckeyestudio/toh-token-meter":"^0.1.1-rc.2","@buckeyestudio/cordis":"^4.0.1","@buckeyestudio/toh-session":"^0.1.1-rc.2"},"_id":"@buckeyestudio/toh-compaction-tool-result-pruner@0.1.1-rc.2","bugs":{"url":"https://github.com/dustinwloring1988/theopen-harness/issues"},"homepage":"https://github.com/dustinwloring1988/theopen-harness#readme","_integrity":"sha512-kAbzRTUQyHNcFMd47VkNWD2W2Uv+GwgNQRA/6o+ENvxINc/sSwuXkfsB5dNOvC34rPxDzraEKbYsH4ZBmOhpYg==","_resolved":"/home/runner/work/theopen-harness/theopen-harness/dist/npm/buckeyestudio-toh-compaction-tool-result-pruner-0.1.1-rc.2.tgz","_from":"file:/home/runner/work/theopen-harness/theopen-harness/dist/npm/buckeyestudio-toh-compaction-tool-result-pruner-0.1.1-rc.2.tgz","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-kAbzRTUQyHNcFMd47VkNWD2W2Uv+GwgNQRA/6o+ENvxINc/sSwuXkfsB5dNOvC34rPxDzraEKbYsH4ZBmOhpYg==","shasum":"3bf9cf2664b44666ed09005c5442dfdeb6cba459","tarball":"https://registry.npmjs.org/@buckeyestudio/toh-compaction-tool-result-pruner/-/toh-compaction-tool-result-pruner-0.1.1-rc.2.tgz","fileCount":11,"unpackedSize":25636,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIH3mQlp3tGhL9TyNYrC3S+Xm77/tnAImYot6nWyuCrd2AiBhlkSLQPrEkqvZKTukpjtTgDyn2vx8oQ9DBAYAo9B/Dg=="}]},"_npmUser":{"name":"buckeyestudio","email":"dustinwloring1988@gmail.com"},"directories":{},"maintainers":[{"name":"buckeyestudio","email":"dustinwloring1988@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/toh-compaction-tool-result-pruner_0.1.1-rc.2_1787489203443_0.5175581927540993"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-23T12:46:43.271Z","0.1.1-rc.2":"2026-08-23T12:46:43.567Z","modified":"2026-08-23T12:46:43.819Z"},"maintainers":[{"name":"buckeyestudio","email":"dustinwloring1988@gmail.com"}],"description":"Replay-safe model-free head/middle/tail pruning for tool-result surface nodes","homepage":"https://github.com/dustinwloring1988/theopen-harness#readme","repository":{"type":"git","url":"git+https://github.com/dustinwloring1988/theopen-harness.git","directory":"packages/compaction/compaction-tool-result-pruner"},"author":{"name":"buckeyestudio"},"bugs":{"url":"https://github.com/dustinwloring1988/theopen-harness/issues"},"license":"MIT","readme":"# @buckeyestudio/toh-compaction-tool-result-pruner\n\n[English](README.md) | 中文\n\n可安全回放、不依赖模型的剪枝服务（`ctx.toolResultPruner`）。它会将超出预算的 `tool/result` 表层节点改写为长度受限的头部、固定省略标记和长度受限的尾部，同时在仅追加会话日志中保留完整原始事件。\n\n这是 [`toh-compaction-basic`](../compaction-basic/README.zh.md) 的具体配套服务，不是压缩（compaction）后端或面向模型的工具。Compact-basic 通过可选的 `ctx.get('toolResultPruner')` 读取它，因此这两个包仍可各自独立组合。\n\n## 服务 API\n\n`pruneSession(session)` 会扫描当前表层的一个稳定快照。每个超出预算的工具结果都会被一个新追加的 `tool/result` 替换，其携带 `{ surfaceOp: { op: 'replace', start: originalSeq, end: originalSeq }, sourceEventSeqs: [originalSeq] }`。替换会展开完整原始数据，只更改 `content`，保留 `turn`、`step`、`callId`、错误字段、`meta` 以及以后新增的数据字段。原始事件仍可用于持久化、回放和精确日志检查。\n\n当会话拒绝替换时，该方法会同步抛出异常。本次扫描中先前已提交的替换仍会保留。\n\n`measureContent(blocks)` 会统计 `text` 块中的 Unicode 码点。`pruneContent(blocks)` 会返回长度受限的替换；如果内容已在阈值内，则返回 `null`。非文本块保持原始相对位置；文本切片绝不会拆分 UTF-16 代理项对，但可能拆分由多个码点组成的字素簇。\n\n每个发出的结果在文本码点上都精确包含已配置的头部预算、固定标记和尾部预算，不大于 `thresholdChars`，且严格小于触发输入。因此第二次扫描不会发出替换。\n\n## 配置\n\n无法识别的配置键会使插件在构造时失败。已解析配置与输入脱离，并且深度不可变。\n\n| 配置键 | 必填 | 含义 |\n|---|---|---|\n| `thresholdChars` | 否（默认 `8192`） | 合并文本超过此 Unicode 码点数时剪枝。 |\n| `headChars` | 否（默认 `4096`） | 保留的开头 Unicode 码点数。 |\n| `tailChars` | 否（默认 `1024`） | 保留的末尾 Unicode 码点数。 |\n\n所有值都必须是整数；阈值必须为正数，头部／尾部必须为非负数。`headChars + marker + tailChars` 之和不得超过 `thresholdChars`，因此有效配置可以剪枝每个超出预算的结果，不会增长或重复改写。\n\n## 用法\n\n```ts\nimport type { Context } from '@buckeyestudio/cordis'\nimport ToolResultPruner from '@buckeyestudio/toh-compaction-tool-result-pruner'\n\nexport function apply(ctx: Context): void {\n  ctx.plugin(ToolResultPruner)\n}\n```\n\n## 模型体验\n\n### 已剪枝的工具结果\n\n#### 模型看到的内容\n\n一旦满足压缩触发条件，后续请求看到的将是保留的头部、`\\n\\n[... tool result middle pruned ...]\\n\\n` 和保留的尾部，而非被移除的文本。非文本块保持原有顺序。模型不会看到原文的第二份副本。\n\n#### Token 影响\n\n每个已改写工具结果最多包含 `thresholdChars` 个文本码点。剪枝本身不会发起模型调用；重新测量的请求低于压力阈值时，compaction-basic 会跳过摘要，否则摘要器会读取已剪枝的表层。\n\n#### KV Cache 影响\n\n替换较早的结果会使从第一个改变的 token 起的复用失效。当其路由、envelope 与之前的历史保持一致时，已剪枝前缀可以复用。\n\n## 已知限制与暂缓事项\n\n- **字符预算不是 token 预算**：不同提供方的 token 密度各异，因此 `ctx.tokenMeter` 仍负责判定剪枝是否缓解了请求压力。\n- **剪枝只基于语法**：它保留开头与结尾，不解释中间哪些行在语义上重要。\n- **字素簇可能被拆分**：按码点切片可保护代理项对，但不会执行感知区域设置的字素簇分割。\n","readmeFilename":"README.zh.md","_rev":"1-54c8de7527f912c4b970ed58eeac3c5b"}