opencode-acp 1.14.8-dev.2 → 1.14.8-dev.3

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/README.md CHANGED
@@ -492,6 +492,15 @@ For the complete list with root cause analysis, see the [bug tracker](https://gi
492
492
 
493
493
  ## Changelog
494
494
 
495
+ ### v1.14.8-dev.3 — Dev Prerelease (1 PR since v1.14.8-dev.2)
496
+
497
+ Dev prerelease covering PR #248. Published to `dev` npm tag for early testing.
498
+
499
+ **PRs included**:
500
+ - **#248** — Fix: auto-extend compression ranges to prevent splitting tool_use/tool_result pairs. When the model selects a compression boundary that falls between a tool call and its result, the orphaned tool_result references a non-existent tool_use_id → API rejection. New `adjustBoundariesForToolPairs` in `compress/search.ts` scans forward/backward (up to 20 messages) to include the matching pair. Excludes `compress` tool (force-protected) and only extends message boundaries (never block boundaries) to avoid tier misclassification. 11 tests.
501
+
502
+ **Install**: `opencode plugin opencode-acp@dev --global`
503
+
495
504
  ### v1.14.8-dev.2 — Dev Prerelease (2 PRs since v1.14.8-dev.1)
496
505
 
497
506
  Dev prerelease covering PRs #244–#245. Published to `dev` npm tag for early testing.
package/README.zh-CN.md CHANGED
@@ -446,6 +446,15 @@ ACP 是 DCP 的直接替代品。迁移步骤:
446
446
 
447
447
  ## 更新日志
448
448
 
449
+ ### v1.14.8-dev.3 — Dev 预发布(v1.14.8-dev.2 以来 1 个 PR)
450
+
451
+ Dev 预发布,涵盖 PR #248。发布到 `dev` npm tag 供早期测试。
452
+
453
+ **包含的 PR**:
454
+ - **#248** — 修复:自动扩展压缩范围以防止拆分 tool_use/tool_result 配对。当模型选择的压缩边界落在 tool 调用与其结果之间时,孤立的 tool_result 引用不存在的 tool_use_id → API 拒绝。新增 `adjustBoundariesForToolPairs`(`compress/search.ts`)向前/向后扫描(最多 20 条消息)以包含匹配的配对。排除 `compress` 工具(强制保护)并仅扩展消息边界(从不扩展 block 边界)以避免层级错误分类。11 个测试。
455
+
456
+ **安装**:`opencode plugin opencode-acp@dev --global`
457
+
449
458
  ### v1.14.8-dev.2 — Dev 预发布(v1.14.8-dev.1 以来 2 个 PR)
450
459
 
451
460
  Dev 预发布,涵盖 PR #244–#245。发布到 `dev` npm tag 供早期测试。
package/dist/index.js CHANGED
@@ -3040,8 +3040,79 @@ ${hint}` : body);
3040
3040
  if (startReference.rawIndex > endReference.rawIndex) {
3041
3041
  [startReference, endReference] = [endReference, startReference];
3042
3042
  }
3043
+ const adjusted = adjustBoundariesForToolPairs(
3044
+ context,
3045
+ startReference.rawIndex,
3046
+ endReference.rawIndex
3047
+ );
3048
+ if (adjusted.startIndex < startReference.rawIndex && startReference.kind === "message") {
3049
+ const msg = context.rawMessages[adjusted.startIndex];
3050
+ if (msg) {
3051
+ startReference = {
3052
+ kind: "message",
3053
+ rawIndex: adjusted.startIndex,
3054
+ messageId: msg.info.id
3055
+ };
3056
+ }
3057
+ }
3058
+ if (adjusted.endIndex > endReference.rawIndex && endReference.kind === "message") {
3059
+ const msg = context.rawMessages[adjusted.endIndex];
3060
+ if (msg) {
3061
+ endReference = {
3062
+ kind: "message",
3063
+ rawIndex: adjusted.endIndex,
3064
+ messageId: msg.info.id
3065
+ };
3066
+ }
3067
+ }
3043
3068
  return { startReference, endReference };
3044
3069
  }
3070
+ function adjustBoundariesForToolPairs(context, startIdx, endIdx) {
3071
+ const messages = context.rawMessages;
3072
+ const callIdsInRange = /* @__PURE__ */ new Set();
3073
+ for (let i = startIdx; i <= endIdx; i++) {
3074
+ const msg = messages[i];
3075
+ if (!msg) continue;
3076
+ const parts = Array.isArray(msg.parts) ? msg.parts : [];
3077
+ for (const part of parts) {
3078
+ if (part.type !== "tool" || !part.callID) continue;
3079
+ if (part.tool === "compress") continue;
3080
+ callIdsInRange.add(part.callID);
3081
+ }
3082
+ }
3083
+ if (callIdsInRange.size === 0) {
3084
+ return { startIndex: startIdx, endIndex: endIdx };
3085
+ }
3086
+ let newEndIdx = endIdx;
3087
+ for (let i = endIdx + 1; i < messages.length && i <= endIdx + 20; i++) {
3088
+ const msg = messages[i];
3089
+ if (!msg) break;
3090
+ const parts = Array.isArray(msg.parts) ? msg.parts : [];
3091
+ const hasMatch = parts.some(
3092
+ (part) => part.type === "tool" && part.callID && callIdsInRange.has(part.callID)
3093
+ );
3094
+ if (hasMatch) {
3095
+ newEndIdx = i;
3096
+ } else if (newEndIdx > endIdx) {
3097
+ break;
3098
+ }
3099
+ }
3100
+ let newStartIdx = startIdx;
3101
+ for (let i = startIdx - 1; i >= 0 && i >= startIdx - 20; i--) {
3102
+ const msg = messages[i];
3103
+ if (!msg) break;
3104
+ const parts = Array.isArray(msg.parts) ? msg.parts : [];
3105
+ const hasMatch = parts.some(
3106
+ (part) => part.type === "tool" && part.callID && callIdsInRange.has(part.callID)
3107
+ );
3108
+ if (hasMatch) {
3109
+ newStartIdx = i;
3110
+ } else if (newStartIdx < startIdx) {
3111
+ break;
3112
+ }
3113
+ }
3114
+ return { startIndex: newStartIdx, endIndex: newEndIdx };
3115
+ }
3045
3116
  function buildBoundaryRecoveryHint(context, state) {
3046
3117
  const visibleRefs = [];
3047
3118
  for (const [messageRef, messageId] of state.messageIds.byRef) {
@@ -8821,7 +8892,7 @@ import { writeFile as writeFile2, mkdir as mkdir2 } from "fs/promises";
8821
8892
  import { join as join3 } from "path";
8822
8893
  import { existsSync as existsSync3 } from "fs";
8823
8894
  import { homedir as homedir3 } from "os";
8824
- var LOG_VERSION = true ? "1.14.8-dev.2" : "dev";
8895
+ var LOG_VERSION = true ? "1.14.8-dev.3" : "dev";
8825
8896
  var Logger = class {
8826
8897
  logDir;
8827
8898
  enabled;