@lexwdex-org/opencode-dcp 3.4.4 → 3.4.6

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.js CHANGED
@@ -2929,8 +2929,18 @@ function getActiveSummaryTokenUsage(state) {
2929
2929
  }
2930
2930
  return total;
2931
2931
  }
2932
- function resetOnCompaction(state) {
2932
+ function resetOnCompaction(state, messages = []) {
2933
2933
  state.toolParameters.clear();
2934
+ if (messages.length === 0) {
2935
+ return;
2936
+ }
2937
+ const liveMessageIds = new Set(messages.map((msg) => msg.info.id));
2938
+ for (const [ref, rawId] of state.messageIds.byRef) {
2939
+ if (!liveMessageIds.has(rawId)) {
2940
+ state.messageIds.byRef.delete(ref);
2941
+ state.messageIds.byRawId.delete(rawId);
2942
+ }
2943
+ }
2934
2944
  }
2935
2945
 
2936
2946
  // lib/state/persistence.ts
@@ -2966,6 +2976,7 @@ async function saveSessionState(sessionState, logger, sessionName) {
2966
2976
  }
2967
2977
  const state = {
2968
2978
  sessionName,
2979
+ manualMode: !!sessionState.manualMode,
2969
2980
  prune: {
2970
2981
  tools: Object.fromEntries(sessionState.prune.tools),
2971
2982
  messages: serializePruneMessagesState(sessionState.prune.messages)
@@ -3157,7 +3168,7 @@ var checkSession = async (client, state, logger, messages, manualModeDefault) =>
3157
3168
  const lastCompactionTimestamp = findLastCompactionTimestamp(messages);
3158
3169
  if (lastCompactionTimestamp > state.lastCompaction) {
3159
3170
  state.lastCompaction = lastCompactionTimestamp;
3160
- resetOnCompaction(state);
3171
+ resetOnCompaction(state, messages);
3161
3172
  logger.info("Detected compaction - reset stale state", {
3162
3173
  timestamp: lastCompactionTimestamp
3163
3174
  });
@@ -3255,6 +3266,9 @@ async function ensureSessionInitialized(client, state, sessionId, logger, messag
3255
3266
  if (persisted === null) {
3256
3267
  return;
3257
3268
  }
3269
+ if (typeof persisted.manualMode === "boolean") {
3270
+ state.manualMode = persisted.manualMode ? "active" : false;
3271
+ }
3258
3272
  state.prune.tools = loadPruneMap(persisted.prune.tools);
3259
3273
  state.prune.messages = loadPruneMessagesState(persisted.prune.messages);
3260
3274
  state.nudges.contextLimitAnchors = new Set(persisted.nudges.contextLimitAnchors || []);
@@ -5149,7 +5163,7 @@ Hard constraints
5149
5163
  - If context needs compression, call \`compress\`. Do not write summaries inline.
5150
5164
  - Use Markdown headings (e.g. \`## Analysis\`, \`## Summary\`) to organize information. Never use XML tags.
5151
5165
 
5152
- \`\` and \`\` are environment-injected metadata. Do not output them.
5166
+ \`<dcp-message-id>\` and \`<dcp-system-reminder>\` are environment-injected metadata. Do not output them.
5153
5167
 
5154
5168
  When to compress
5155
5169
 
@@ -6107,6 +6121,31 @@ function buildCompressedBlockGuidance(state) {
6107
6121
  "- \u5982\u679C\u4F60\u9009\u62E9\u7684\u538B\u7F29\u8303\u56F4\u5305\u542B\u4EFB\u4F55\u5217\u51FA\u7684\u5757\uFF0C\u5728\u6458\u8981\u4E2D\u4F7F\u7528 `(bN)` \u6070\u597D\u5305\u542B\u6BCF\u4E2A\u5FC5\u9700\u7684\u5360\u4F4D\u7B26\u4E00\u6B21\u3002"
6108
6122
  ].join("\n");
6109
6123
  }
6124
+ function buildAvailableMessageIdGuidance(state, messages) {
6125
+ const visibleIds = new Set(
6126
+ messages.filter((msg) => !isIgnoredUserMessage(msg) && !isMessageCompacted(state, msg)).map((msg) => msg.info.id)
6127
+ );
6128
+ const refs = [];
6129
+ for (const [ref, rawId] of state.messageIds.byRef) {
6130
+ if (visibleIds.has(rawId)) {
6131
+ refs.push(ref);
6132
+ }
6133
+ }
6134
+ refs.sort((a, b) => {
6135
+ const numA = Number.parseInt(a.slice(1), 10);
6136
+ const numB = Number.parseInt(b.slice(1), 10);
6137
+ return numA - numB;
6138
+ });
6139
+ if (refs.length === 0) {
6140
+ return "";
6141
+ }
6142
+ const refList = refs.length <= 15 ? refs.join(", ") : `${refs[0]} \u5230 ${refs[refs.length - 1]}\uFF08\u5171 ${refs.length} \u4E2A\uFF09`;
6143
+ return [
6144
+ "\u53EF\u7528\u6D88\u606F\u8FB9\u754C ID\uFF1A",
6145
+ `- \u5F53\u524D\u4E0A\u4E0B\u6587\u4E2D\u53EF\u4F5C\u4E3A compress \u8FB9\u754C\u7684\u5408\u6CD5\u6D88\u606F ID\uFF1A${refList}`,
6146
+ "- \u53EA\u4ECE\u4EE5\u4E0A\u5217\u8868\u4E2D\u9009\u53D6 startId \u548C endId\u3002\u4E0D\u8981\u53D1\u660E\u3001\u5916\u63A8\u6216\u4F7F\u7528\u4E0D\u5728\u5217\u8868\u4E2D\u7684 ID\u3002"
6147
+ ].join("\n");
6148
+ }
6110
6149
  function renderMessagePriorityGuidance(priorityLabel, refs) {
6111
6150
  const refList = refs.length > 0 ? refs.join(", ") : "\u65E0";
6112
6151
  const normalized = priorityLabel.toLowerCase();
@@ -6373,8 +6412,9 @@ function collectTurnNudgeAnchors2(state, config, messages) {
6373
6412
  }
6374
6413
  return turnNudgeAnchors;
6375
6414
  }
6376
- function applyRangeModeAnchoredNudge(anchorMessageIds, messages, baseNudgeText, compressedBlockGuidance) {
6377
- const nudgeText = appendGuidanceToDcpTag(baseNudgeText, compressedBlockGuidance);
6415
+ function applyRangeModeAnchoredNudge(anchorMessageIds, messages, baseNudgeText, compressedBlockGuidance, availableMessageIdGuidance) {
6416
+ const combinedGuidance = [availableMessageIdGuidance, compressedBlockGuidance].filter((g) => g.trim().length > 0).join("\n\n");
6417
+ const nudgeText = appendGuidanceToDcpTag(baseNudgeText, combinedGuidance);
6378
6418
  if (!nudgeText.trim()) {
6379
6419
  return;
6380
6420
  }
@@ -6382,7 +6422,7 @@ function applyRangeModeAnchoredNudge(anchorMessageIds, messages, baseNudgeText,
6382
6422
  injectAnchoredNudge(message, nudgeText);
6383
6423
  }
6384
6424
  }
6385
- function applyMessageModeAnchoredNudge(anchorMessageIds, messages, baseNudgeText, compressionPriorities) {
6425
+ function applyMessageModeAnchoredNudge(anchorMessageIds, messages, baseNudgeText, availableMessageIdGuidance, compressionPriorities) {
6386
6426
  for (const { message, index } of collectAnchoredMessages(anchorMessageIds, messages)) {
6387
6427
  const priorityGuidance = buildMessagePriorityGuidance(
6388
6428
  messages,
@@ -6390,51 +6430,60 @@ function applyMessageModeAnchoredNudge(anchorMessageIds, messages, baseNudgeText
6390
6430
  index,
6391
6431
  MESSAGE_MODE_NUDGE_PRIORITY
6392
6432
  );
6393
- const nudgeText = appendGuidanceToDcpTag(baseNudgeText, priorityGuidance);
6433
+ const combinedGuidance = [availableMessageIdGuidance, priorityGuidance].filter((g) => g.trim().length > 0).join("\n\n");
6434
+ const nudgeText = appendGuidanceToDcpTag(baseNudgeText, combinedGuidance);
6394
6435
  injectAnchoredNudge(message, nudgeText);
6395
6436
  }
6396
6437
  }
6397
6438
  function applyAnchoredNudges(state, config, messages, prompts, compressionPriorities) {
6398
6439
  const turnNudgeAnchors = collectTurnNudgeAnchors2(state, config, messages);
6399
6440
  if (config.compress.mode === "message") {
6441
+ const availableMessageIdGuidance2 = buildAvailableMessageIdGuidance(state, messages);
6400
6442
  applyMessageModeAnchoredNudge(
6401
6443
  state.nudges.contextLimitAnchors,
6402
6444
  messages,
6403
6445
  prompts.contextLimitNudge,
6446
+ availableMessageIdGuidance2,
6404
6447
  compressionPriorities
6405
6448
  );
6406
6449
  applyMessageModeAnchoredNudge(
6407
6450
  turnNudgeAnchors,
6408
6451
  messages,
6409
6452
  prompts.turnNudge,
6453
+ availableMessageIdGuidance2,
6410
6454
  compressionPriorities
6411
6455
  );
6412
6456
  applyMessageModeAnchoredNudge(
6413
6457
  state.nudges.iterationNudgeAnchors,
6414
6458
  messages,
6415
6459
  prompts.iterationNudge,
6460
+ availableMessageIdGuidance2,
6416
6461
  compressionPriorities
6417
6462
  );
6418
6463
  return;
6419
6464
  }
6420
6465
  const compressedBlockGuidance = buildCompressedBlockGuidance(state);
6466
+ const availableMessageIdGuidance = buildAvailableMessageIdGuidance(state, messages);
6421
6467
  applyRangeModeAnchoredNudge(
6422
6468
  state.nudges.contextLimitAnchors,
6423
6469
  messages,
6424
6470
  prompts.contextLimitNudge,
6425
- compressedBlockGuidance
6471
+ compressedBlockGuidance,
6472
+ availableMessageIdGuidance
6426
6473
  );
6427
6474
  applyRangeModeAnchoredNudge(
6428
6475
  turnNudgeAnchors,
6429
6476
  messages,
6430
6477
  prompts.turnNudge,
6431
- compressedBlockGuidance
6478
+ compressedBlockGuidance,
6479
+ availableMessageIdGuidance
6432
6480
  );
6433
6481
  applyRangeModeAnchoredNudge(
6434
6482
  state.nudges.iterationNudgeAnchors,
6435
6483
  messages,
6436
6484
  prompts.iterationNudge,
6437
- compressedBlockGuidance
6485
+ compressedBlockGuidance,
6486
+ availableMessageIdGuidance
6438
6487
  );
6439
6488
  }
6440
6489
 
@@ -7256,6 +7305,7 @@ async function handleManualToggleCommand(ctx, modeArg) {
7256
7305
  } else {
7257
7306
  state.manualMode = state.manualMode ? false : "active";
7258
7307
  }
7308
+ await saveSessionState(state, logger);
7259
7309
  const params = getCurrentParams(state, messages, logger);
7260
7310
  await sendIgnoredMessage(
7261
7311
  client,