@p4r4d0xb0x/opencode-dcp 3.0.5

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.
Files changed (203) hide show
  1. package/LICENSE +619 -0
  2. package/README.md +229 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +88 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/auth.d.ts +4 -0
  8. package/dist/lib/auth.d.ts.map +1 -0
  9. package/dist/lib/auth.js +32 -0
  10. package/dist/lib/auth.js.map +1 -0
  11. package/dist/lib/commands/context.d.ts +52 -0
  12. package/dist/lib/commands/context.d.ts.map +1 -0
  13. package/dist/lib/commands/context.js +241 -0
  14. package/dist/lib/commands/context.js.map +1 -0
  15. package/dist/lib/commands/decompress.d.ts +12 -0
  16. package/dist/lib/commands/decompress.d.ts.map +1 -0
  17. package/dist/lib/commands/decompress.js +159 -0
  18. package/dist/lib/commands/decompress.js.map +1 -0
  19. package/dist/lib/commands/help.d.ts +17 -0
  20. package/dist/lib/commands/help.d.ts.map +1 -0
  21. package/dist/lib/commands/help.js +52 -0
  22. package/dist/lib/commands/help.js.map +1 -0
  23. package/dist/lib/commands/manual.d.ts +22 -0
  24. package/dist/lib/commands/manual.d.ts.map +1 -0
  25. package/dist/lib/commands/manual.js +48 -0
  26. package/dist/lib/commands/manual.js.map +1 -0
  27. package/dist/lib/commands/recompress.d.ts +12 -0
  28. package/dist/lib/commands/recompress.d.ts.map +1 -0
  29. package/dist/lib/commands/recompress.js +137 -0
  30. package/dist/lib/commands/recompress.js.map +1 -0
  31. package/dist/lib/commands/stats.d.ts +15 -0
  32. package/dist/lib/commands/stats.d.ts.map +1 -0
  33. package/dist/lib/commands/stats.js +62 -0
  34. package/dist/lib/commands/stats.js.map +1 -0
  35. package/dist/lib/commands/sweep.d.ts +23 -0
  36. package/dist/lib/commands/sweep.d.ts.map +1 -0
  37. package/dist/lib/commands/sweep.js +194 -0
  38. package/dist/lib/commands/sweep.js.map +1 -0
  39. package/dist/lib/config.d.ts +72 -0
  40. package/dist/lib/config.d.ts.map +1 -0
  41. package/dist/lib/config.js +766 -0
  42. package/dist/lib/config.js.map +1 -0
  43. package/dist/lib/hooks.d.ts +33 -0
  44. package/dist/lib/hooks.d.ts.map +1 -0
  45. package/dist/lib/hooks.js +195 -0
  46. package/dist/lib/hooks.js.map +1 -0
  47. package/dist/lib/host-permissions.d.ts +11 -0
  48. package/dist/lib/host-permissions.d.ts.map +1 -0
  49. package/dist/lib/host-permissions.js +58 -0
  50. package/dist/lib/host-permissions.js.map +1 -0
  51. package/dist/lib/logger.d.ts +31 -0
  52. package/dist/lib/logger.d.ts.map +1 -0
  53. package/dist/lib/logger.js +204 -0
  54. package/dist/lib/logger.js.map +1 -0
  55. package/dist/lib/message-ids.d.ts +19 -0
  56. package/dist/lib/message-ids.d.ts.map +1 -0
  57. package/dist/lib/message-ids.js +112 -0
  58. package/dist/lib/message-ids.js.map +1 -0
  59. package/dist/lib/messages/index.d.ts +7 -0
  60. package/dist/lib/messages/index.d.ts.map +1 -0
  61. package/dist/lib/messages/index.js +7 -0
  62. package/dist/lib/messages/index.js.map +1 -0
  63. package/dist/lib/messages/inject/inject.d.ts +7 -0
  64. package/dist/lib/messages/inject/inject.d.ts.map +1 -0
  65. package/dist/lib/messages/inject/inject.js +131 -0
  66. package/dist/lib/messages/inject/inject.js.map +1 -0
  67. package/dist/lib/messages/inject/subagent-results.d.ts +4 -0
  68. package/dist/lib/messages/inject/subagent-results.d.ts.map +1 -0
  69. package/dist/lib/messages/inject/subagent-results.js +58 -0
  70. package/dist/lib/messages/inject/subagent-results.js.map +1 -0
  71. package/dist/lib/messages/inject/utils.d.ts +25 -0
  72. package/dist/lib/messages/inject/utils.d.ts.map +1 -0
  73. package/dist/lib/messages/inject/utils.js +198 -0
  74. package/dist/lib/messages/inject/utils.js.map +1 -0
  75. package/dist/lib/messages/prune.d.ts +5 -0
  76. package/dist/lib/messages/prune.d.ts.map +1 -0
  77. package/dist/lib/messages/prune.js +177 -0
  78. package/dist/lib/messages/prune.js.map +1 -0
  79. package/dist/lib/messages/reasoning-strip.d.ts +8 -0
  80. package/dist/lib/messages/reasoning-strip.d.ts.map +1 -0
  81. package/dist/lib/messages/reasoning-strip.js +33 -0
  82. package/dist/lib/messages/reasoning-strip.js.map +1 -0
  83. package/dist/lib/messages/sync.d.ts +4 -0
  84. package/dist/lib/messages/sync.d.ts.map +1 -0
  85. package/dist/lib/messages/sync.js +93 -0
  86. package/dist/lib/messages/sync.js.map +1 -0
  87. package/dist/lib/messages/utils.d.ts +21 -0
  88. package/dist/lib/messages/utils.d.ts.map +1 -0
  89. package/dist/lib/messages/utils.js +118 -0
  90. package/dist/lib/messages/utils.js.map +1 -0
  91. package/dist/lib/prompts/compress.d.ts +2 -0
  92. package/dist/lib/prompts/compress.d.ts.map +1 -0
  93. package/dist/lib/prompts/compress.js +85 -0
  94. package/dist/lib/prompts/compress.js.map +1 -0
  95. package/dist/lib/prompts/context-limit-nudge.d.ts +2 -0
  96. package/dist/lib/prompts/context-limit-nudge.d.ts.map +1 -0
  97. package/dist/lib/prompts/context-limit-nudge.js +25 -0
  98. package/dist/lib/prompts/context-limit-nudge.js.map +1 -0
  99. package/dist/lib/prompts/index.d.ts +3 -0
  100. package/dist/lib/prompts/index.d.ts.map +1 -0
  101. package/dist/lib/prompts/index.js +19 -0
  102. package/dist/lib/prompts/index.js.map +1 -0
  103. package/dist/lib/prompts/internal-overlays.d.ts +5 -0
  104. package/dist/lib/prompts/internal-overlays.d.ts.map +1 -0
  105. package/dist/lib/prompts/internal-overlays.js +43 -0
  106. package/dist/lib/prompts/internal-overlays.js.map +1 -0
  107. package/dist/lib/prompts/iteration-nudge.d.ts +2 -0
  108. package/dist/lib/prompts/iteration-nudge.d.ts.map +1 -0
  109. package/dist/lib/prompts/iteration-nudge.js +9 -0
  110. package/dist/lib/prompts/iteration-nudge.js.map +1 -0
  111. package/dist/lib/prompts/store.d.ts +24 -0
  112. package/dist/lib/prompts/store.d.ts.map +1 -0
  113. package/dist/lib/prompts/store.js +346 -0
  114. package/dist/lib/prompts/store.js.map +1 -0
  115. package/dist/lib/prompts/system.d.ts +2 -0
  116. package/dist/lib/prompts/system.d.ts.map +1 -0
  117. package/dist/lib/prompts/system.js +30 -0
  118. package/dist/lib/prompts/system.js.map +1 -0
  119. package/dist/lib/prompts/turn-nudge.d.ts +2 -0
  120. package/dist/lib/prompts/turn-nudge.d.ts.map +1 -0
  121. package/dist/lib/prompts/turn-nudge.js +12 -0
  122. package/dist/lib/prompts/turn-nudge.js.map +1 -0
  123. package/dist/lib/protected-patterns.d.ts +5 -0
  124. package/dist/lib/protected-patterns.d.ts.map +1 -0
  125. package/dist/lib/protected-patterns.js +107 -0
  126. package/dist/lib/protected-patterns.js.map +1 -0
  127. package/dist/lib/shared-utils.d.ts +8 -0
  128. package/dist/lib/shared-utils.d.ts.map +1 -0
  129. package/dist/lib/shared-utils.js +30 -0
  130. package/dist/lib/shared-utils.js.map +1 -0
  131. package/dist/lib/state/index.d.ts +4 -0
  132. package/dist/lib/state/index.d.ts.map +1 -0
  133. package/dist/lib/state/index.js +4 -0
  134. package/dist/lib/state/index.js.map +1 -0
  135. package/dist/lib/state/persistence.d.ts +41 -0
  136. package/dist/lib/state/persistence.d.ts.map +1 -0
  137. package/dist/lib/state/persistence.js +174 -0
  138. package/dist/lib/state/persistence.js.map +1 -0
  139. package/dist/lib/state/state.d.ts +7 -0
  140. package/dist/lib/state/state.d.ts.map +1 -0
  141. package/dist/lib/state/state.js +134 -0
  142. package/dist/lib/state/state.js.map +1 -0
  143. package/dist/lib/state/tool-cache.d.ts +13 -0
  144. package/dist/lib/state/tool-cache.d.ts.map +1 -0
  145. package/dist/lib/state/tool-cache.js +69 -0
  146. package/dist/lib/state/tool-cache.js.map +1 -0
  147. package/dist/lib/state/types.d.ts +90 -0
  148. package/dist/lib/state/types.d.ts.map +1 -0
  149. package/dist/lib/state/types.js +2 -0
  150. package/dist/lib/state/types.js.map +1 -0
  151. package/dist/lib/state/utils.d.ts +18 -0
  152. package/dist/lib/state/utils.d.ts.map +1 -0
  153. package/dist/lib/state/utils.js +196 -0
  154. package/dist/lib/state/utils.js.map +1 -0
  155. package/dist/lib/strategies/deduplication.d.ts +10 -0
  156. package/dist/lib/strategies/deduplication.d.ts.map +1 -0
  157. package/dist/lib/strategies/deduplication.js +100 -0
  158. package/dist/lib/strategies/deduplication.js.map +1 -0
  159. package/dist/lib/strategies/index.d.ts +4 -0
  160. package/dist/lib/strategies/index.d.ts.map +1 -0
  161. package/dist/lib/strategies/index.js +4 -0
  162. package/dist/lib/strategies/index.js.map +1 -0
  163. package/dist/lib/strategies/purge-errors.d.ts +13 -0
  164. package/dist/lib/strategies/purge-errors.d.ts.map +1 -0
  165. package/dist/lib/strategies/purge-errors.js +62 -0
  166. package/dist/lib/strategies/purge-errors.js.map +1 -0
  167. package/dist/lib/strategies/supersede-writes.d.ts +13 -0
  168. package/dist/lib/strategies/supersede-writes.d.ts.map +1 -0
  169. package/dist/lib/strategies/supersede-writes.js +94 -0
  170. package/dist/lib/strategies/supersede-writes.js.map +1 -0
  171. package/dist/lib/strategies/utils.d.ts +21 -0
  172. package/dist/lib/strategies/utils.d.ts.map +1 -0
  173. package/dist/lib/strategies/utils.js +128 -0
  174. package/dist/lib/strategies/utils.js.map +1 -0
  175. package/dist/lib/subagents/subagent-results.d.ts +5 -0
  176. package/dist/lib/subagents/subagent-results.d.ts.map +1 -0
  177. package/dist/lib/subagents/subagent-results.js +52 -0
  178. package/dist/lib/subagents/subagent-results.js.map +1 -0
  179. package/dist/lib/tools/compress.d.ts +4 -0
  180. package/dist/lib/tools/compress.d.ts.map +1 -0
  181. package/dist/lib/tools/compress.js +110 -0
  182. package/dist/lib/tools/compress.js.map +1 -0
  183. package/dist/lib/tools/index.d.ts +3 -0
  184. package/dist/lib/tools/index.d.ts.map +1 -0
  185. package/dist/lib/tools/index.js +2 -0
  186. package/dist/lib/tools/index.js.map +1 -0
  187. package/dist/lib/tools/types.d.ts +13 -0
  188. package/dist/lib/tools/types.d.ts.map +1 -0
  189. package/dist/lib/tools/types.js +2 -0
  190. package/dist/lib/tools/types.js.map +1 -0
  191. package/dist/lib/tools/utils.d.ts +80 -0
  192. package/dist/lib/tools/utils.d.ts.map +1 -0
  193. package/dist/lib/tools/utils.js +675 -0
  194. package/dist/lib/tools/utils.js.map +1 -0
  195. package/dist/lib/ui/notification.d.ts +10 -0
  196. package/dist/lib/ui/notification.d.ts.map +1 -0
  197. package/dist/lib/ui/notification.js +182 -0
  198. package/dist/lib/ui/notification.js.map +1 -0
  199. package/dist/lib/ui/utils.d.ts +10 -0
  200. package/dist/lib/ui/utils.d.ts.map +1 -0
  201. package/dist/lib/ui/utils.js +255 -0
  202. package/dist/lib/ui/utils.js.map +1 -0
  203. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/messages/inject/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { SessionState, WithParts } from "../state";
2
+ import type { Logger } from "../logger";
3
+ import type { PluginConfig } from "../config";
4
+ export declare const prune: (state: SessionState, logger: Logger, config: PluginConfig, messages: WithParts[]) => void;
5
+ //# sourceMappingURL=prune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../../lib/messages/prune.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAU7C,eAAO,MAAM,KAAK,GACd,OAAO,YAAY,EACnB,QAAQ,MAAM,EACd,QAAQ,YAAY,EACpB,UAAU,SAAS,EAAE,KACtB,IAMF,CAAA"}
@@ -0,0 +1,177 @@
1
+ import { isMessageCompacted, getLastUserMessage } from "../shared-utils";
2
+ import { createSyntheticUserMessage } from "./utils";
3
+ const PRUNED_TOOL_OUTPUT_REPLACEMENT = "[Output removed to save context - information superseded or no longer needed]";
4
+ const PRUNED_TOOL_ERROR_INPUT_REPLACEMENT = "[input removed due to failed tool call]";
5
+ const PRUNED_QUESTION_INPUT_REPLACEMENT = "[questions removed - see output for user's answers]";
6
+ export const prune = (state, logger, config, messages) => {
7
+ filterCompressedRanges(state, logger, messages);
8
+ // pruneFullTool(state, logger, messages)
9
+ pruneToolOutputs(state, logger, messages);
10
+ pruneToolInputs(state, logger, messages);
11
+ pruneToolErrors(state, logger, messages);
12
+ };
13
+ const pruneFullTool = (state, logger, messages) => {
14
+ const messagesToRemove = [];
15
+ for (const msg of messages) {
16
+ if (isMessageCompacted(state, msg)) {
17
+ continue;
18
+ }
19
+ const parts = Array.isArray(msg.parts) ? msg.parts : [];
20
+ const partsToRemove = [];
21
+ for (const part of parts) {
22
+ if (part.type !== "tool") {
23
+ continue;
24
+ }
25
+ if (!state.prune.tools.has(part.callID)) {
26
+ continue;
27
+ }
28
+ if (part.tool !== "edit" && part.tool !== "write") {
29
+ continue;
30
+ }
31
+ partsToRemove.push(part.callID);
32
+ }
33
+ if (partsToRemove.length === 0) {
34
+ continue;
35
+ }
36
+ msg.parts = parts.filter((part) => part.type !== "tool" || !partsToRemove.includes(part.callID));
37
+ if (msg.parts.length === 0) {
38
+ messagesToRemove.push(msg.info.id);
39
+ }
40
+ }
41
+ if (messagesToRemove.length > 0) {
42
+ const result = messages.filter((msg) => !messagesToRemove.includes(msg.info.id));
43
+ messages.length = 0;
44
+ messages.push(...result);
45
+ }
46
+ };
47
+ const pruneToolOutputs = (state, logger, messages) => {
48
+ for (const msg of messages) {
49
+ if (isMessageCompacted(state, msg)) {
50
+ continue;
51
+ }
52
+ const parts = Array.isArray(msg.parts) ? msg.parts : [];
53
+ for (const part of parts) {
54
+ if (part.type !== "tool") {
55
+ continue;
56
+ }
57
+ if (!state.prune.tools.has(part.callID)) {
58
+ continue;
59
+ }
60
+ if (part.state.status !== "completed") {
61
+ continue;
62
+ }
63
+ if (part.tool === "question" || part.tool === "edit" || part.tool === "write") {
64
+ continue;
65
+ }
66
+ part.state.output = PRUNED_TOOL_OUTPUT_REPLACEMENT;
67
+ }
68
+ }
69
+ };
70
+ const pruneToolInputs = (state, logger, messages) => {
71
+ for (const msg of messages) {
72
+ if (isMessageCompacted(state, msg)) {
73
+ continue;
74
+ }
75
+ const parts = Array.isArray(msg.parts) ? msg.parts : [];
76
+ for (const part of parts) {
77
+ if (part.type !== "tool") {
78
+ continue;
79
+ }
80
+ if (!state.prune.tools.has(part.callID)) {
81
+ continue;
82
+ }
83
+ if (part.state.status !== "completed") {
84
+ continue;
85
+ }
86
+ if (part.tool !== "question") {
87
+ continue;
88
+ }
89
+ if (part.state.input?.questions !== undefined) {
90
+ part.state.input.questions = PRUNED_QUESTION_INPUT_REPLACEMENT;
91
+ }
92
+ }
93
+ }
94
+ };
95
+ const pruneToolErrors = (state, logger, messages) => {
96
+ for (const msg of messages) {
97
+ if (isMessageCompacted(state, msg)) {
98
+ continue;
99
+ }
100
+ const parts = Array.isArray(msg.parts) ? msg.parts : [];
101
+ for (const part of parts) {
102
+ if (part.type !== "tool") {
103
+ continue;
104
+ }
105
+ if (!state.prune.tools.has(part.callID)) {
106
+ continue;
107
+ }
108
+ if (part.state.status !== "error") {
109
+ continue;
110
+ }
111
+ // Prune all string inputs for errored tools
112
+ const input = part.state.input;
113
+ if (input && typeof input === "object") {
114
+ for (const key of Object.keys(input)) {
115
+ if (typeof input[key] === "string") {
116
+ input[key] = PRUNED_TOOL_ERROR_INPUT_REPLACEMENT;
117
+ }
118
+ }
119
+ }
120
+ }
121
+ }
122
+ };
123
+ const filterCompressedRanges = (state, logger, messages) => {
124
+ if (state.prune.messages.byMessageId.size === 0 &&
125
+ state.prune.messages.activeByAnchorMessageId.size === 0) {
126
+ return;
127
+ }
128
+ const result = [];
129
+ for (const msg of messages) {
130
+ const msgId = msg.info.id;
131
+ // Check if there's a summary to inject at this anchor point
132
+ const blockId = state.prune.messages.activeByAnchorMessageId.get(msgId);
133
+ const summary = blockId !== undefined ? state.prune.messages.blocksById.get(blockId) : undefined;
134
+ if (summary) {
135
+ const rawSummaryContent = summary.summary;
136
+ if (summary.active !== true ||
137
+ typeof rawSummaryContent !== "string" ||
138
+ rawSummaryContent.length === 0) {
139
+ logger.warn("Skipping malformed compress summary", {
140
+ anchorMessageId: msgId,
141
+ blockId: summary.blockId,
142
+ });
143
+ }
144
+ else {
145
+ // Find user message for variant and as base for synthetic message
146
+ const msgIndex = messages.indexOf(msg);
147
+ const userMessage = getLastUserMessage(messages, msgIndex);
148
+ if (userMessage) {
149
+ const userInfo = userMessage.info;
150
+ const summaryContent = rawSummaryContent;
151
+ const summarySeed = `${summary.blockId}:${summary.anchorMessageId}`;
152
+ result.push(createSyntheticUserMessage(userMessage, summaryContent, userInfo.variant, summarySeed));
153
+ logger.info("Injected compress summary", {
154
+ anchorMessageId: msgId,
155
+ summaryLength: summaryContent.length,
156
+ });
157
+ }
158
+ else {
159
+ logger.warn("No user message found for compress summary", {
160
+ anchorMessageId: msgId,
161
+ });
162
+ }
163
+ }
164
+ }
165
+ // Skip messages that are in the prune list
166
+ const pruneEntry = state.prune.messages.byMessageId.get(msgId);
167
+ if (pruneEntry && pruneEntry.activeBlockIds.length > 0) {
168
+ continue;
169
+ }
170
+ // Normal message, include it
171
+ result.push(msg);
172
+ }
173
+ // Replace messages array contents
174
+ messages.length = 0;
175
+ messages.push(...result);
176
+ };
177
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../lib/messages/prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { WithParts } from "../state";
2
+ /**
3
+ * Mirrors opencode's differentModel handling by preserving part content while
4
+ * dropping provider metadata on assistant parts that came from a different
5
+ * model/provider than the current turn's user message.
6
+ */
7
+ export declare function stripStaleMetadata(messages: WithParts[]): void;
8
+ //# sourceMappingURL=reasoning-strip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-strip.d.ts","sourceRoot":"","sources":["../../../lib/messages/reasoning-strip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGzC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CA+B9D"}
@@ -0,0 +1,33 @@
1
+ import { getLastUserMessage } from "../shared-utils";
2
+ /**
3
+ * Mirrors opencode's differentModel handling by preserving part content while
4
+ * dropping provider metadata on assistant parts that came from a different
5
+ * model/provider than the current turn's user message.
6
+ */
7
+ export function stripStaleMetadata(messages) {
8
+ const lastUserMessage = getLastUserMessage(messages);
9
+ if (lastUserMessage?.info.role !== "user") {
10
+ return;
11
+ }
12
+ const modelID = lastUserMessage.info.model.modelID;
13
+ const providerID = lastUserMessage.info.model.providerID;
14
+ messages.forEach((message) => {
15
+ if (message.info.role !== "assistant") {
16
+ return;
17
+ }
18
+ if (message.info.modelID === modelID && message.info.providerID === providerID) {
19
+ return;
20
+ }
21
+ message.parts = message.parts.map((part) => {
22
+ if (part.type !== "text" && part.type !== "tool" && part.type !== "reasoning") {
23
+ return part;
24
+ }
25
+ if (!("metadata" in part)) {
26
+ return part;
27
+ }
28
+ const { metadata: _metadata, ...rest } = part;
29
+ return rest;
30
+ });
31
+ });
32
+ }
33
+ //# sourceMappingURL=reasoning-strip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-strip.js","sourceRoot":"","sources":["../../../lib/messages/reasoning-strip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAqB;IACpD,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACpD,IAAI,eAAe,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxC,OAAM;IACV,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAA;IAClD,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAA;IAExD,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACzB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpC,OAAM;QACV,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YAC7E,OAAM;QACV,CAAC;QAED,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACvC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC5E,OAAO,IAAI,CAAA;YACf,CAAC;YAED,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAA;YACf,CAAC;YAED,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;YAC7C,OAAO,IAAI,CAAA;QACf,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SessionState, WithParts } from "../state";
2
+ import type { Logger } from "../logger";
3
+ export declare const syncCompressionBlocks: (state: SessionState, logger: Logger, messages: WithParts[]) => void;
4
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../lib/messages/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAavC,eAAO,MAAM,qBAAqB,GAC9B,OAAO,YAAY,EACnB,QAAQ,MAAM,EACd,UAAU,SAAS,EAAE,KACtB,IAyGF,CAAA"}
@@ -0,0 +1,93 @@
1
+ function sortBlocksByCreation(a, b) {
2
+ const createdAtDiff = a.createdAt - b.createdAt;
3
+ if (createdAtDiff !== 0) {
4
+ return createdAtDiff;
5
+ }
6
+ return a.blockId - b.blockId;
7
+ }
8
+ export const syncCompressionBlocks = (state, logger, messages) => {
9
+ const messagesState = state.prune.messages;
10
+ if (!messagesState?.blocksById?.size) {
11
+ return;
12
+ }
13
+ const messageIds = new Set(messages.map((msg) => msg.info.id));
14
+ const previousActiveBlockIds = new Set(Array.from(messagesState.blocksById.values())
15
+ .filter((block) => block.active)
16
+ .map((block) => block.blockId));
17
+ messagesState.activeBlockIds.clear();
18
+ messagesState.activeByAnchorMessageId.clear();
19
+ const now = Date.now();
20
+ const missingOriginBlockIds = [];
21
+ const orderedBlocks = Array.from(messagesState.blocksById.values()).sort(sortBlocksByCreation);
22
+ for (const block of orderedBlocks) {
23
+ const hasOriginMessage = typeof block.compressMessageId === "string" &&
24
+ block.compressMessageId.length > 0 &&
25
+ messageIds.has(block.compressMessageId);
26
+ if (!hasOriginMessage) {
27
+ block.active = false;
28
+ block.deactivatedAt = now;
29
+ block.deactivatedByBlockId = undefined;
30
+ missingOriginBlockIds.push(block.blockId);
31
+ continue;
32
+ }
33
+ if (block.deactivatedByUser) {
34
+ block.active = false;
35
+ if (block.deactivatedAt === undefined) {
36
+ block.deactivatedAt = now;
37
+ }
38
+ block.deactivatedByBlockId = undefined;
39
+ continue;
40
+ }
41
+ for (const consumedBlockId of block.consumedBlockIds) {
42
+ if (!messagesState.activeBlockIds.has(consumedBlockId)) {
43
+ continue;
44
+ }
45
+ const consumedBlock = messagesState.blocksById.get(consumedBlockId);
46
+ if (consumedBlock) {
47
+ consumedBlock.active = false;
48
+ consumedBlock.deactivatedAt = now;
49
+ consumedBlock.deactivatedByBlockId = block.blockId;
50
+ const mappedBlockId = messagesState.activeByAnchorMessageId.get(consumedBlock.anchorMessageId);
51
+ if (mappedBlockId === consumedBlock.blockId) {
52
+ messagesState.activeByAnchorMessageId.delete(consumedBlock.anchorMessageId);
53
+ }
54
+ }
55
+ messagesState.activeBlockIds.delete(consumedBlockId);
56
+ }
57
+ block.active = true;
58
+ block.deactivatedAt = undefined;
59
+ block.deactivatedByBlockId = undefined;
60
+ messagesState.activeBlockIds.add(block.blockId);
61
+ if (messageIds.has(block.anchorMessageId)) {
62
+ messagesState.activeByAnchorMessageId.set(block.anchorMessageId, block.blockId);
63
+ }
64
+ }
65
+ for (const entry of messagesState.byMessageId.values()) {
66
+ const allBlockIds = Array.isArray(entry.allBlockIds)
67
+ ? [...new Set(entry.allBlockIds.filter((id) => Number.isInteger(id) && id > 0))]
68
+ : [];
69
+ entry.allBlockIds = allBlockIds;
70
+ entry.activeBlockIds = allBlockIds.filter((id) => messagesState.activeBlockIds.has(id));
71
+ }
72
+ const nextActiveBlockIds = messagesState.activeBlockIds;
73
+ let deactivatedCount = 0;
74
+ let reactivatedCount = 0;
75
+ for (const blockId of previousActiveBlockIds) {
76
+ if (!nextActiveBlockIds.has(blockId)) {
77
+ deactivatedCount++;
78
+ }
79
+ }
80
+ for (const blockId of nextActiveBlockIds) {
81
+ if (!previousActiveBlockIds.has(blockId)) {
82
+ reactivatedCount++;
83
+ }
84
+ }
85
+ if (missingOriginBlockIds.length > 0 || deactivatedCount > 0 || reactivatedCount > 0) {
86
+ logger.info("Synced compress block state", {
87
+ missingOriginCount: missingOriginBlockIds.length,
88
+ deactivatedCount,
89
+ reactivatedCount,
90
+ });
91
+ }
92
+ };
93
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../lib/messages/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { SessionState, WithParts } from "../state";
2
+ export declare const createSyntheticUserMessage: (baseMessage: WithParts, content: string, variant?: string, stableSeed?: string) => WithParts;
3
+ export declare const createSyntheticTextPart: (baseMessage: WithParts, content: string, stableSeed?: string) => {
4
+ id: string;
5
+ sessionID: string;
6
+ messageID: string;
7
+ type: "text";
8
+ text: string;
9
+ };
10
+ type MessagePart = WithParts["parts"][number];
11
+ type ToolPart = Extract<MessagePart, {
12
+ type: "tool";
13
+ }>;
14
+ export declare const appendIdToTool: (part: ToolPart, tag: string) => boolean;
15
+ export declare const findLastToolPart: (message: WithParts) => ToolPart | null;
16
+ export declare function buildToolIdList(state: SessionState, messages: WithParts[]): string[];
17
+ export declare const isIgnoredUserMessage: (message: WithParts) => boolean;
18
+ export declare const stripHallucinationsFromString: (text: string) => string;
19
+ export declare const stripHallucinations: (messages: WithParts[]) => void;
20
+ export {};
21
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/messages/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAYvD,eAAO,MAAM,0BAA0B,GACnC,aAAa,SAAS,EACtB,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,aAAa,MAAM,KACpB,SA2BF,CAAA;AAED,eAAO,MAAM,uBAAuB,GAChC,aAAa,SAAS,EACtB,SAAS,MAAM,EACf,aAAa,MAAM;;;;;;CAatB,CAAA;AAED,KAAK,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AAC7C,KAAK,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAEtD,eAAO,MAAM,cAAc,GAAI,MAAM,QAAQ,EAAE,KAAK,MAAM,KAAG,OAa5D,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,SAAS,SAAS,KAAG,QAAQ,GAAG,IAShE,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAiBpF;AAED,eAAO,MAAM,oBAAoB,GAAI,SAAS,SAAS,KAAG,OAazD,CAAA;AAED,eAAO,MAAM,6BAA6B,GAAI,MAAM,MAAM,KAAG,MAE5D,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,UAAU,SAAS,EAAE,KAAG,IAgB3D,CAAA"}
@@ -0,0 +1,118 @@
1
+ import { createHash } from "node:crypto";
2
+ import { isMessageCompacted } from "../shared-utils";
3
+ const SUMMARY_ID_HASH_LENGTH = 16;
4
+ const DCP_MESSAGE_ID_TAG_REGEX = /<dcp-message-id>(?:m\d+|b\d+)<\/dcp-message-id>/g;
5
+ const DCP_SYSTEM_REMINDER_REGEX = /<dcp-system-reminder\b[^>]*>[\s\S]*?<\/dcp-system-reminder>/g;
6
+ const generateStableId = (prefix, seed) => {
7
+ const hash = createHash("sha256").update(seed).digest("hex").slice(0, SUMMARY_ID_HASH_LENGTH);
8
+ return `${prefix}_${hash}`;
9
+ };
10
+ export const createSyntheticUserMessage = (baseMessage, content, variant, stableSeed) => {
11
+ const userInfo = baseMessage.info;
12
+ const now = Date.now();
13
+ const deterministicSeed = stableSeed?.trim() || userInfo.id;
14
+ const messageId = generateStableId("msg_dcp_summary", deterministicSeed);
15
+ const partId = generateStableId("prt_dcp_summary", deterministicSeed);
16
+ return {
17
+ info: {
18
+ id: messageId,
19
+ sessionID: userInfo.sessionID,
20
+ role: "user",
21
+ agent: userInfo.agent,
22
+ model: userInfo.model,
23
+ time: { created: now },
24
+ ...(variant !== undefined && { variant }),
25
+ },
26
+ parts: [
27
+ {
28
+ id: partId,
29
+ sessionID: userInfo.sessionID,
30
+ messageID: messageId,
31
+ type: "text",
32
+ text: content,
33
+ },
34
+ ],
35
+ };
36
+ };
37
+ export const createSyntheticTextPart = (baseMessage, content, stableSeed) => {
38
+ const userInfo = baseMessage.info;
39
+ const deterministicSeed = stableSeed?.trim() || userInfo.id;
40
+ const partId = generateStableId("prt_dcp_text", deterministicSeed);
41
+ return {
42
+ id: partId,
43
+ sessionID: userInfo.sessionID,
44
+ messageID: userInfo.id,
45
+ type: "text",
46
+ text: content,
47
+ };
48
+ };
49
+ export const appendIdToTool = (part, tag) => {
50
+ if (part.type !== "tool") {
51
+ return false;
52
+ }
53
+ if (part.state?.status !== "completed" || typeof part.state.output !== "string") {
54
+ return false;
55
+ }
56
+ if (part.state.output.includes(tag)) {
57
+ return true;
58
+ }
59
+ part.state.output = `${part.state.output}${tag}`;
60
+ return true;
61
+ };
62
+ export const findLastToolPart = (message) => {
63
+ for (let i = message.parts.length - 1; i >= 0; i--) {
64
+ const part = message.parts[i];
65
+ if (part.type === "tool") {
66
+ return part;
67
+ }
68
+ }
69
+ return null;
70
+ };
71
+ export function buildToolIdList(state, messages) {
72
+ const toolIds = [];
73
+ for (const msg of messages) {
74
+ if (isMessageCompacted(state, msg)) {
75
+ continue;
76
+ }
77
+ const parts = Array.isArray(msg.parts) ? msg.parts : [];
78
+ if (parts.length > 0) {
79
+ for (const part of parts) {
80
+ if (part.type === "tool" && part.callID && part.tool) {
81
+ toolIds.push(part.callID);
82
+ }
83
+ }
84
+ }
85
+ }
86
+ state.toolIdList = toolIds;
87
+ return toolIds;
88
+ }
89
+ export const isIgnoredUserMessage = (message) => {
90
+ const parts = Array.isArray(message.parts) ? message.parts : [];
91
+ if (parts.length === 0) {
92
+ return true;
93
+ }
94
+ for (const part of parts) {
95
+ if (!part.ignored) {
96
+ return false;
97
+ }
98
+ }
99
+ return true;
100
+ };
101
+ export const stripHallucinationsFromString = (text) => {
102
+ return text.replace(DCP_SYSTEM_REMINDER_REGEX, "").replace(DCP_MESSAGE_ID_TAG_REGEX, "");
103
+ };
104
+ export const stripHallucinations = (messages) => {
105
+ for (const message of messages) {
106
+ for (const part of message.parts) {
107
+ if (part.type === "text" && typeof part.text === "string") {
108
+ part.text = stripHallucinationsFromString(part.text);
109
+ }
110
+ if (part.type === "tool" &&
111
+ part.state?.status === "completed" &&
112
+ typeof part.state.output === "string") {
113
+ part.state.output = stripHallucinationsFromString(part.state.output);
114
+ }
115
+ }
116
+ }
117
+ };
118
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../lib/messages/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const COMPRESS = "Collapse a range in the conversation into a detailed summary.\n\nTHE PHILOSOPHY OF COMPRESS\n`compress` transforms verbose conversation sequences into dense, high-fidelity summaries. This is not cleanup - it is crystallization. Your summary becomes the authoritative record of what transpired.\n\nThink of compression as phase transitions: raw exploration becomes refined understanding. The original context served its purpose; your summary now carries that understanding forward.\n\nTHE SUMMARY\nYour summary must be EXHAUSTIVE. Capture file paths, function signatures, decisions made, constraints discovered, key findings... EVERYTHING that maintains context integrity. This is not a brief note - it is an authoritative record so faithful that the original conversation adds no value.\n\nUSER INTENT FIDELITY\nWhen the compressed range includes user messages, preserve the user's intent with extra care. Do not change scope, constraints, priorities, acceptance criteria, or requested outcomes.\nDirectly quote user messages when they are short enough to include safely. Direct quotes are preferred when they best preserve exact meaning.\n\nYet be LEAN. Strip away the noise: failed attempts that led nowhere, verbose tool outputs, back-and-forth exploration. What remains should be pure signal - golden nuggets of detail that preserve full understanding with zero ambiguity.\n\nCOMPRESSED BLOCK PLACEHOLDERS\nWhen the selected range includes previously compressed blocks, use this exact placeholder format when referencing one:\n\n- `(bN)`\n\nCompressed block sections in context are clearly marked with a header:\n\n- `[Compressed conversation section]`\n\nCompressed block IDs always use the `bN` form (never `mNNNN`) and are represented in the same XML metadata tag format.\n\nRules:\n\n- Include every required block placeholder exactly once.\n- Do not invent placeholders for blocks outside the selected range.\n- Treat `(bN)` placeholders as RESERVED TOKENS. Do not emit `(bN)` text anywhere except intentional placeholders.\n- If you need to mention a block in prose, use plain text like `compressed bN` (not as a placeholder).\n- Preflight check before finalizing: the set of `(bN)` placeholders in your summary must exactly match the required set, with no duplicates.\n\nThese placeholders are semantic references. They will be replaced with the full stored compressed block content when the tool processes your output.\n\nFLOW PRESERVATION WITH PLACEHOLDERS\nWhen you use compressed block placeholders, write the surrounding summary text so it still reads correctly AFTER placeholder expansion.\n\n- Treat each placeholder as a stand-in for a full conversation segment, not as a short label.\n- Ensure transitions before and after each placeholder preserve chronology and causality.\n- Do not write text that depends on the placeholder staying literal (for example, \"as noted in `(b2)`\").\n- Your final meaning must be coherent once each placeholder is replaced with its full compressed block content.\n\nTHE WAYS OF COMPRESS\nCompress when a range is genuinely closed and the raw conversation has served its purpose:\n\nResearch concluded and findings are clear\nImplementation finished and verified\nExploration exhausted and patterns understood\n\nCompress smaller ranges when:\nYou need to discard dead-end noise without waiting for a whole chapter to close\nYou need to preserve key findings from a narrow slice while freeing context quickly\nYou can bound a stale range cleanly with injected IDs\n\nDo NOT compress when:\nYou may need exact code, error messages, or file contents from the range in the immediate next steps\nWork in that area is still active or likely to resume immediately\nYou cannot identify reliable boundaries yet\n\nBefore compressing, ask: _\"Is this range closed enough to become summary-only right now?\"_ Compression is irreversible. The summary replaces everything in the range.\n\nBOUNDARY IDS\nYou specify boundaries by ID using the injected IDs visible in the conversation:\n\n- `mNNNN` IDs identify raw messages\n- `bN` IDs identify previously compressed blocks\n\nEach message has an ID inside XML metadata tags like `<dcp-message-id>...</dcp-message-id>`.\nTreat these tags as boundary metadata only, not as tool result content.\n\nRules:\n\n- Pick `startId` and `endId` directly from injected IDs in context.\n- IDs must exist in the current visible context.\n- `startId` must appear before `endId`.\n- Prefer boundaries that produce short, closed ranges.\n- Do not invent IDs. Use only IDs that are present in context.\n\nPARALLEL COMPRESS EXECUTION\nWhen multiple independent ranges are ready and their boundaries do not overlap, launch MULTIPLE `compress` calls in parallel in a single response. This is the PREFERRED pattern over a single large-range compression when the work can be safely split. Run compression sequentially only when ranges overlap or when a later range depends on the result of an earlier compression.\n";
2
+ //# sourceMappingURL=compress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress.d.ts","sourceRoot":"","sources":["../../../lib/prompts/compress.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,23JAmFpB,CAAA"}
@@ -0,0 +1,85 @@
1
+ export const COMPRESS = `Collapse a range in the conversation into a detailed summary.
2
+
3
+ THE PHILOSOPHY OF COMPRESS
4
+ \`compress\` transforms verbose conversation sequences into dense, high-fidelity summaries. This is not cleanup - it is crystallization. Your summary becomes the authoritative record of what transpired.
5
+
6
+ Think of compression as phase transitions: raw exploration becomes refined understanding. The original context served its purpose; your summary now carries that understanding forward.
7
+
8
+ THE SUMMARY
9
+ Your summary must be EXHAUSTIVE. Capture file paths, function signatures, decisions made, constraints discovered, key findings... EVERYTHING that maintains context integrity. This is not a brief note - it is an authoritative record so faithful that the original conversation adds no value.
10
+
11
+ USER INTENT FIDELITY
12
+ When the compressed range includes user messages, preserve the user's intent with extra care. Do not change scope, constraints, priorities, acceptance criteria, or requested outcomes.
13
+ Directly quote user messages when they are short enough to include safely. Direct quotes are preferred when they best preserve exact meaning.
14
+
15
+ Yet be LEAN. Strip away the noise: failed attempts that led nowhere, verbose tool outputs, back-and-forth exploration. What remains should be pure signal - golden nuggets of detail that preserve full understanding with zero ambiguity.
16
+
17
+ COMPRESSED BLOCK PLACEHOLDERS
18
+ When the selected range includes previously compressed blocks, use this exact placeholder format when referencing one:
19
+
20
+ - \`(bN)\`
21
+
22
+ Compressed block sections in context are clearly marked with a header:
23
+
24
+ - \`[Compressed conversation section]\`
25
+
26
+ Compressed block IDs always use the \`bN\` form (never \`mNNNN\`) and are represented in the same XML metadata tag format.
27
+
28
+ Rules:
29
+
30
+ - Include every required block placeholder exactly once.
31
+ - Do not invent placeholders for blocks outside the selected range.
32
+ - Treat \`(bN)\` placeholders as RESERVED TOKENS. Do not emit \`(bN)\` text anywhere except intentional placeholders.
33
+ - If you need to mention a block in prose, use plain text like \`compressed bN\` (not as a placeholder).
34
+ - Preflight check before finalizing: the set of \`(bN)\` placeholders in your summary must exactly match the required set, with no duplicates.
35
+
36
+ These placeholders are semantic references. They will be replaced with the full stored compressed block content when the tool processes your output.
37
+
38
+ FLOW PRESERVATION WITH PLACEHOLDERS
39
+ When you use compressed block placeholders, write the surrounding summary text so it still reads correctly AFTER placeholder expansion.
40
+
41
+ - Treat each placeholder as a stand-in for a full conversation segment, not as a short label.
42
+ - Ensure transitions before and after each placeholder preserve chronology and causality.
43
+ - Do not write text that depends on the placeholder staying literal (for example, "as noted in \`(b2)\`").
44
+ - Your final meaning must be coherent once each placeholder is replaced with its full compressed block content.
45
+
46
+ THE WAYS OF COMPRESS
47
+ Compress when a range is genuinely closed and the raw conversation has served its purpose:
48
+
49
+ Research concluded and findings are clear
50
+ Implementation finished and verified
51
+ Exploration exhausted and patterns understood
52
+
53
+ Compress smaller ranges when:
54
+ You need to discard dead-end noise without waiting for a whole chapter to close
55
+ You need to preserve key findings from a narrow slice while freeing context quickly
56
+ You can bound a stale range cleanly with injected IDs
57
+
58
+ Do NOT compress when:
59
+ You may need exact code, error messages, or file contents from the range in the immediate next steps
60
+ Work in that area is still active or likely to resume immediately
61
+ You cannot identify reliable boundaries yet
62
+
63
+ Before compressing, ask: _"Is this range closed enough to become summary-only right now?"_ Compression is irreversible. The summary replaces everything in the range.
64
+
65
+ BOUNDARY IDS
66
+ You specify boundaries by ID using the injected IDs visible in the conversation:
67
+
68
+ - \`mNNNN\` IDs identify raw messages
69
+ - \`bN\` IDs identify previously compressed blocks
70
+
71
+ Each message has an ID inside XML metadata tags like \`<dcp-message-id>...</dcp-message-id>\`.
72
+ Treat these tags as boundary metadata only, not as tool result content.
73
+
74
+ Rules:
75
+
76
+ - Pick \`startId\` and \`endId\` directly from injected IDs in context.
77
+ - IDs must exist in the current visible context.
78
+ - \`startId\` must appear before \`endId\`.
79
+ - Prefer boundaries that produce short, closed ranges.
80
+ - Do not invent IDs. Use only IDs that are present in context.
81
+
82
+ PARALLEL COMPRESS EXECUTION
83
+ When multiple independent ranges are ready and their boundaries do not overlap, launch MULTIPLE \`compress\` calls in parallel in a single response. This is the PREFERRED pattern over a single large-range compression when the work can be safely split. Run compression sequentially only when ranges overlap or when a later range depends on the result of an earlier compression.
84
+ `;
85
+ //# sourceMappingURL=compress.js.map