@lexwdex-org/opencode-dcp 3.2.3 → 3.3.1

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
@@ -117,11 +117,11 @@ Each level overrides the previous, so project settings take priority over global
117
117
  // Soft upper threshold: above this, DCP keeps injecting strong
118
118
  // compression nudges (based on nudgeFrequency), so compression is
119
119
  // much more likely. Accepts: number or "X%" of model context window.
120
- "maxContextLimit": 100000,
120
+ "maxContextLimit": "85%",
121
121
  // Soft lower threshold for reminder nudges: below this, turn/iteration
122
122
  // reminders are off (compression less likely). At/above this, reminders
123
123
  // are on. Accepts: number or "X%" of model context window.
124
- "minContextLimit": 50000,
124
+ "minContextLimit": "50%",
125
125
  // Optional per-model override for maxContextLimit by providerID/modelID.
126
126
  // If present, this wins over the global maxContextLimit.
127
127
  // Accepts: number or "X%".
@@ -143,7 +143,7 @@ Each level overrides the previous, so project settings take priority over global
143
143
  "iterationNudgeThreshold": 15,
144
144
  // Controls how likely compression is after user messages
145
145
  // ("strong" = more likely, "soft" = less likely)
146
- "nudgeForce": "soft",
146
+ "nudgeForce": "strong",
147
147
  // Tool names whose completed outputs are appended to the compression
148
148
  "protectedTools": [],
149
149
  // Preserve text wrapped in <protect>...</protect> when compressed
package/dist/index.js CHANGED
@@ -1335,11 +1335,11 @@ var defaultConfig = {
1335
1335
  permission: "allow",
1336
1336
  showCompression: false,
1337
1337
  summaryBuffer: true,
1338
- maxContextLimit: 1e5,
1339
- minContextLimit: 5e4,
1338
+ maxContextLimit: "85%",
1339
+ minContextLimit: "50%",
1340
1340
  nudgeFrequency: 2,
1341
1341
  iterationNudgeThreshold: 15,
1342
- nudgeForce: "soft",
1342
+ nudgeForce: "strong",
1343
1343
  protectedTools: [...COMPRESS_DEFAULT_PROTECTED_TOOLS],
1344
1344
  protectTags: false,
1345
1345
  protectUserMessages: false
@@ -4903,6 +4903,12 @@ var COMPRESS_RANGE = `\u5C06\u5BF9\u8BDD\u4E2D\u7684\u4E00\u4E2A\u8303\u56F4\u62
4903
4903
  \u5F53\u538B\u7F29\u8303\u56F4\u5305\u542B\u7528\u6237\u6D88\u606F\u65F6\uFF0C\u683C\u5916\u5C0F\u5FC3\u5730\u4FDD\u7559\u7528\u6237\u610F\u56FE\u3002\u4E0D\u8981\u6539\u53D8\u8303\u56F4\u3001\u7EA6\u675F\u3001\u4F18\u5148\u7EA7\u3001\u9A8C\u6536\u6807\u51C6\u6216\u8BF7\u6C42\u7684\u7ED3\u679C\u3002
4904
4904
  \u5F53\u7528\u6237\u6D88\u606F\u8DB3\u591F\u77ED\u65F6\u76F4\u63A5\u5F15\u7528\u3002\u76F4\u63A5\u5F15\u7528\u5728\u6700\u80FD\u4FDD\u7559\u7CBE\u786E\u542B\u4E49\u65F6\u4F18\u5148\u4F7F\u7528\u3002
4905
4905
 
4906
+ \u5386\u53F2\u5BA1\u6279\u5904\u7406
4907
+ \u5F53\u538B\u7F29\u8303\u56F4\u5305\u542B\u7528\u6237\u7684\u5BA1\u6279/\u6279\u51C6\u77ED\u8BED\uFF08\u5982"\u5C31\u6267\u884C\u5427"\u3001"\u6309\u7167\u8FD9\u4E2A\u6267\u884C"\u3001"\u597D\u7684\uFF0C\u7EE7\u7EED"\u7B49\uFF09\u65F6\uFF0C\u5FC5\u987B\u5C06\u5176\u6807\u8BB0\u4E3A\u5386\u53F2\u4E8B\u4EF6\u800C\u975E\u5F53\u524D\u6709\u6548\u6307\u4EE4\u3002
4908
+ - \u9519\u8BEF\uFF1A\u4FDD\u7559"\u7528\u6237\u8BF4\uFF1A\u5C31\u6267\u884C\u5427"\uFF08\u53EF\u80FD\u88AB\u8BEF\u89E3\u4E3A\u5F53\u524D\u6307\u4EE4\uFF09
4909
+ - \u6B63\u786E\uFF1A\u6807\u8BB0\u4E3A"\u7528\u6237\u66FE\u6279\u51C6\u4E86\u5148\u524D\u7684\u65B9\u6848\uFF08\u8BE5\u6279\u51C6\u4EC5\u9002\u7528\u4E8E\u5F53\u65F6\u7684\u4E0A\u4E0B\u6587\uFF0C\u4E0D\u6784\u6210\u5BF9\u540E\u7EED\u64CD\u4F5C\u7684\u6388\u6743\uFF09"
4910
+ \u8FD9\u786E\u4FDD\u538B\u7F29\u540E\u7684\u4E0A\u4E0B\u6587\u4E0D\u4F1A\u88AB\u8BEF\u89E3\u4E3A\u65B0\u7684\u6267\u884C\u6388\u6743\u3002
4911
+
4906
4912
  \u540C\u65F6\u4FDD\u6301\u7CBE\u7B80\u3002\u53BB\u9664\u566A\u97F3\uFF1A\u65E0\u679C\u7684\u5931\u8D25\u5C1D\u8BD5\u3001\u5197\u957F\u7684\u5DE5\u5177\u8F93\u51FA\u3001\u53CD\u590D\u63A2\u7D22\u3002\u7559\u4E0B\u7684\u5E94\u8BE5\u662F\u7EAF\u4FE1\u53F7\u2014\u2014\u4FDD\u7559\u5B8C\u6574\u7406\u89E3\u3001\u96F6\u6B67\u4E49\u7684\u7CBE\u534E\u7EC6\u8282\u3002
4907
4913
 
4908
4914
  \u538B\u7F29\u5757\u5360\u4F4D\u7B26
@@ -4965,6 +4971,12 @@ var COMPRESS_MESSAGE = `\u5C06\u5BF9\u8BDD\u4E2D\u9009\u5B9A\u7684\u5355\u6761\u
4965
4971
  \u5F53\u9009\u5B9A\u6D88\u606F\u5305\u542B\u7528\u6237\u610F\u56FE\u65F6\uFF0C\u683C\u5916\u5C0F\u5FC3\u5730\u4FDD\u7559\u8BE5\u610F\u56FE\u3002\u4E0D\u8981\u6539\u53D8\u8303\u56F4\u3001\u7EA6\u675F\u3001\u4F18\u5148\u7EA7\u3001\u9A8C\u6536\u6807\u51C6\u6216\u8BF7\u6C42\u7684\u7ED3\u679C\u3002
4966
4972
  \u5F53\u76F4\u63A5\u5F15\u7528\u7B80\u77ED\u7528\u6237\u6307\u4EE4\u6700\u80FD\u4FDD\u7559\u7CBE\u786E\u542B\u4E49\u65F6\uFF0C\u76F4\u63A5\u5F15\u7528\u3002
4967
4973
 
4974
+ \u5386\u53F2\u5BA1\u6279\u5904\u7406
4975
+ \u5F53\u538B\u7F29\u5305\u542B\u7528\u6237\u7684\u5BA1\u6279/\u6279\u51C6\u77ED\u8BED\uFF08\u5982"\u5C31\u6267\u884C\u5427"\u3001"\u6309\u7167\u8FD9\u4E2A\u6267\u884C"\u3001"\u597D\u7684\uFF0C\u7EE7\u7EED"\u7B49\uFF09\u65F6\uFF0C\u5FC5\u987B\u5C06\u5176\u6807\u8BB0\u4E3A\u5386\u53F2\u4E8B\u4EF6\u800C\u975E\u5F53\u524D\u6709\u6548\u6307\u4EE4\u3002
4976
+ - \u9519\u8BEF\uFF1A\u4FDD\u7559"\u7528\u6237\u8BF4\uFF1A\u5C31\u6267\u884C\u5427"\uFF08\u53EF\u80FD\u88AB\u8BEF\u89E3\u4E3A\u5F53\u524D\u6307\u4EE4\uFF09
4977
+ - \u6B63\u786E\uFF1A\u6807\u8BB0\u4E3A"\u7528\u6237\u66FE\u6279\u51C6\u4E86\u5148\u524D\u7684\u65B9\u6848\uFF08\u8BE5\u6279\u51C6\u4EC5\u9002\u7528\u4E8E\u5F53\u65F6\u7684\u4E0A\u4E0B\u6587\uFF0C\u4E0D\u6784\u6210\u5BF9\u540E\u7EED\u64CD\u4F5C\u7684\u6388\u6743\uFF09"
4978
+ \u8FD9\u786E\u4FDD\u538B\u7F29\u540E\u7684\u4E0A\u4E0B\u6587\u4E0D\u4F1A\u88AB\u8BEF\u89E3\u4E3A\u65B0\u7684\u6267\u884C\u6388\u6743\u3002
4979
+
4968
4980
  \u540C\u65F6\u4FDD\u6301\u7CBE\u7B80\u3002\u53BB\u9664\u566A\u97F3\uFF1A\u65E0\u679C\u7684\u5931\u8D25\u5C1D\u8BD5\u3001\u5197\u957F\u7684\u5DE5\u5177\u8F93\u51FA\u548C\u91CD\u590D\u3002\u7559\u4E0B\u7684\u5E94\u8BE5\u662F\u7EAF\u4FE1\u53F7\u2014\u2014\u4FDD\u7559\u5B8C\u6574\u7406\u89E3\u3001\u96F6\u6B67\u4E49\u7684\u7CBE\u534E\u7EC6\u8282\u3002
4969
4981
  \u5982\u679C\u6D88\u606F\u4E0D\u5305\u542B\u91CD\u8981\u7684\u6280\u672F\u51B3\u7B56\u3001\u4EE3\u7801\u53D8\u66F4\u6216\u7528\u6237\u9700\u6C42\uFF0C\u751F\u6210\u6700\u5C0F\u5316\u7684\u4E00\u884C\u6458\u8981\u800C\u975E\u8BE6\u7EC6\u6458\u8981\u3002
4970
4982
 
@@ -5002,21 +5014,21 @@ var COMPRESS_MESSAGE = `\u5C06\u5BF9\u8BDD\u4E2D\u9009\u5B9A\u7684\u5355\u6761\u
5002
5014
 
5003
5015
  // lib/prompts/context-limit-nudge.ts
5004
5016
  var CONTEXT_LIMIT_NUDGE = `<dcp-system-reminder>
5005
- CRITICAL WARNING: MAX CONTEXT LIMIT REACHED
5017
+ \u4E25\u91CD\u8B66\u544A\uFF1A\u5DF2\u8FBE\u5230\u6700\u5927\u4E0A\u4E0B\u6587\u9650\u5236
5006
5018
 
5007
- You are at or beyond the configured max context threshold. This is an emergency context-recovery moment.
5019
+ \u4F60\u5F53\u524D\u5904\u4E8E\u6216\u5DF2\u8D85\u8FC7\u914D\u7F6E\u7684\u6700\u5927\u4E0A\u4E0B\u6587\u9608\u503C\u3002\u8FD9\u662F\u7D27\u6025\u7684\u4E0A\u4E0B\u6587\u6062\u590D\u65F6\u523B\u3002
5008
5020
 
5009
- You MUST use the \`compress\` tool now. Do not continue normal exploration until compression is handled.
5021
+ \u4F60\u5FC5\u987B\u7ACB\u5373\u4F7F\u7528 \`compress\` \u5DE5\u5177\u3002\u5728\u5B8C\u6210\u538B\u7F29\u4E4B\u524D\uFF0C\u4E0D\u8981\u7EE7\u7EED\u6B63\u5E38\u63A2\u7D22\u3002
5010
5022
 
5011
- If you are in the middle of a critical atomic operation, finish that atomic step first, then compress immediately.
5023
+ \u5982\u679C\u4F60\u6B63\u5728\u8FDB\u884C\u5173\u952E\u7684\u539F\u5B50\u64CD\u4F5C\uFF0C\u5148\u5B8C\u6210\u8BE5\u539F\u5B50\u6B65\u9AA4\uFF0C\u7136\u540E\u7ACB\u5373\u538B\u7F29\u3002
5012
5024
 
5013
- SELECTION PROCESS
5014
- Start from older, resolved history and capture as much stale context as safely possible in one pass.
5015
- Avoid the newest active working messages unless it is clearly closed.
5025
+ \u9009\u62E9\u8FC7\u7A0B
5026
+ \u4ECE\u8F83\u65E9\u7684\u3001\u5DF2\u5B8C\u6210\u7684\u5386\u53F2\u5F00\u59CB\uFF0C\u5728\u4E00\u6B21\u64CD\u4F5C\u4E2D\u6355\u83B7\u5C3D\u53EF\u80FD\u591A\u7684\u8FC7\u65F6\u4E0A\u4E0B\u6587\u3002
5027
+ \u9664\u975E\u6700\u65B0\u7684\u5DE5\u4F5C\u6D88\u606F\u5DF2\u660E\u663E\u7ED3\u675F\uFF0C\u5426\u5219\u4E0D\u8981\u9009\u62E9\u5B83\u4EEC\u3002
5016
5028
 
5017
- SUMMARY REQUIREMENTS
5018
- Your summary MUST cover all essential details from the selected messages so work can continue.
5019
- If the compressed range includes user messages, preserve user intent exactly. Prefer direct quotes for short user messages to avoid semantic drift.
5029
+ \u6458\u8981\u8981\u6C42
5030
+ \u4F60\u7684\u6458\u8981\u5FC5\u987B\u8986\u76D6\u6240\u9009\u6D88\u606F\u4E2D\u7684\u6240\u6709\u5173\u952E\u7EC6\u8282\uFF0C\u4EE5\u786E\u4FDD\u5DE5\u4F5C\u53EF\u4EE5\u7EE7\u7EED\u3002
5031
+ \u5982\u679C\u538B\u7F29\u8303\u56F4\u5305\u542B\u7528\u6237\u6D88\u606F\uFF0C\u5B8C\u6574\u4FDD\u7559\u7528\u6237\u610F\u56FE\u3002\u5BF9\u4E8E\u8F83\u77ED\u7684\u7528\u6237\u6D88\u606F\uFF0C\u4F18\u5148\u4F7F\u7528\u76F4\u63A5\u5F15\u7528\u4EE5\u907F\u514D\u8BED\u4E49\u6F02\u79FB\u3002
5020
5032
  </dcp-system-reminder>
5021
5033
  `;
5022
5034
 
@@ -5390,6 +5402,8 @@ var SUMMARY_ID_HASH_LENGTH = 16;
5390
5402
  var DCP_BLOCK_ID_TAG_REGEX = /(<dcp-message-id(?=[\s>])[^>]*>)b\d+(<\/dcp-message-id>)/g;
5391
5403
  var DCP_PAIRED_TAG_REGEX = /<dcp[^>]*>[\s\S]*?<\/dcp[^>]*>/gi;
5392
5404
  var DCP_UNPAIRED_TAG_REGEX = /<\/?dcp[^>]*>/gi;
5405
+ var INJECTED_TAG_SUFFIX_REGEX = /\n<dcp-message-id(?:\s[^>]*)?>m\d+<\/dcp-message-id>\s*$/;
5406
+ var TRAILING_MESSAGE_REF_REGEX = /\nm\d{4}\s*$/;
5393
5407
  var generateStableId = (prefix, seed) => {
5394
5408
  const hash = createHash("sha256").update(seed).digest("hex").slice(0, SUMMARY_ID_HASH_LENGTH);
5395
5409
  return `${prefix}_${hash}`;
@@ -5511,7 +5525,8 @@ var replaceBlockIdsWithBlocked = (text) => {
5511
5525
  return text.replace(DCP_BLOCK_ID_TAG_REGEX, "$1BLOCKED$2");
5512
5526
  };
5513
5527
  var stripHallucinationsFromString = (text) => {
5514
- return text.replace(DCP_PAIRED_TAG_REGEX, "").replace(DCP_UNPAIRED_TAG_REGEX, "");
5528
+ const safe = text.replace(INJECTED_TAG_SUFFIX_REGEX, "");
5529
+ return safe.replace(DCP_PAIRED_TAG_REGEX, "").replace(DCP_UNPAIRED_TAG_REGEX, "").replace(TRAILING_MESSAGE_REF_REGEX, "");
5515
5530
  };
5516
5531
  var stripHallucinations = (messages) => {
5517
5532
  for (const message of messages) {