@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,137 @@
1
+ import { syncCompressionBlocks } from "../messages";
2
+ import { parseBlockRef } from "../message-ids";
3
+ import { getCurrentParams } from "../strategies/utils";
4
+ import { saveSessionState } from "../state/persistence";
5
+ import { sendIgnoredMessage } from "../ui/notification";
6
+ import { formatTokenCount } from "../ui/utils";
7
+ function parseBlockIdArg(arg) {
8
+ const normalized = arg.trim().toLowerCase();
9
+ const blockRef = parseBlockRef(normalized);
10
+ if (blockRef !== null) {
11
+ return blockRef;
12
+ }
13
+ if (!/^[1-9]\d*$/.test(normalized)) {
14
+ return null;
15
+ }
16
+ const parsed = Number.parseInt(normalized, 10);
17
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
18
+ }
19
+ function getRecompressibleBlocks(messagesState, availableMessageIds) {
20
+ return Array.from(messagesState.blocksById.values())
21
+ .filter((block) => block.deactivatedByUser &&
22
+ !block.active &&
23
+ availableMessageIds.has(block.compressMessageId))
24
+ .sort((a, b) => a.blockId - b.blockId);
25
+ }
26
+ function snapshotActiveMessages(messagesState) {
27
+ const activeMessages = new Set();
28
+ for (const [messageId, entry] of messagesState.byMessageId) {
29
+ if (entry.activeBlockIds.length > 0) {
30
+ activeMessages.add(messageId);
31
+ }
32
+ }
33
+ return activeMessages;
34
+ }
35
+ function formatRecompressMessage(targetBlockId, recompressedMessageCount, recompressedTokens, deactivatedBlockIds) {
36
+ const lines = [];
37
+ lines.push(`Re-applied compression ${targetBlockId}.`);
38
+ if (deactivatedBlockIds.length > 0) {
39
+ const refs = deactivatedBlockIds.map((id) => String(id)).join(", ");
40
+ lines.push(`Also re-compressed nested compression(s): ${refs}.`);
41
+ }
42
+ if (recompressedMessageCount > 0) {
43
+ lines.push(`Re-compressed ${recompressedMessageCount} message(s) (~${formatTokenCount(recompressedTokens)}).`);
44
+ }
45
+ else {
46
+ lines.push("No messages were re-compressed.");
47
+ }
48
+ return lines.join("\n");
49
+ }
50
+ function formatAvailableBlocksMessage(availableBlocks) {
51
+ const lines = [];
52
+ lines.push("Usage: /dcp recompress <n>");
53
+ lines.push("");
54
+ if (availableBlocks.length === 0) {
55
+ lines.push("No user-decompressed blocks are available to re-compress.");
56
+ return lines.join("\n");
57
+ }
58
+ lines.push("Available user-decompressed blocks:");
59
+ const entries = availableBlocks.map((block) => {
60
+ const topic = block.topic.replace(/\s+/g, " ").trim() || "(no topic)";
61
+ const label = `${block.blockId} (${formatTokenCount(block.compressedTokens)})`;
62
+ return { label, topic };
63
+ });
64
+ const labelWidth = Math.max(...entries.map((entry) => entry.label.length)) + 4;
65
+ for (const entry of entries) {
66
+ lines.push(` ${entry.label.padEnd(labelWidth)}${entry.topic}`);
67
+ }
68
+ return lines.join("\n");
69
+ }
70
+ export async function handleRecompressCommand(ctx) {
71
+ const { client, state, logger, sessionId, messages, args } = ctx;
72
+ const params = getCurrentParams(state, messages, logger);
73
+ const targetArg = args[0];
74
+ if (args.length > 1) {
75
+ await sendIgnoredMessage(client, sessionId, "Invalid arguments. Usage: /dcp recompress <n>", params, logger);
76
+ return;
77
+ }
78
+ syncCompressionBlocks(state, logger, messages);
79
+ const messagesState = state.prune.messages;
80
+ const availableMessageIds = new Set(messages.map((msg) => msg.info.id));
81
+ if (!targetArg) {
82
+ const availableBlocks = getRecompressibleBlocks(messagesState, availableMessageIds);
83
+ const message = formatAvailableBlocksMessage(availableBlocks);
84
+ await sendIgnoredMessage(client, sessionId, message, params, logger);
85
+ return;
86
+ }
87
+ const targetBlockId = parseBlockIdArg(targetArg);
88
+ if (targetBlockId === null) {
89
+ await sendIgnoredMessage(client, sessionId, `Please enter a compression number. Example: /dcp recompress 2`, params, logger);
90
+ return;
91
+ }
92
+ const targetBlock = messagesState.blocksById.get(targetBlockId);
93
+ if (!targetBlock) {
94
+ await sendIgnoredMessage(client, sessionId, `Compression ${targetBlockId} does not exist.`, params, logger);
95
+ return;
96
+ }
97
+ if (!availableMessageIds.has(targetBlock.compressMessageId)) {
98
+ await sendIgnoredMessage(client, sessionId, `Compression ${targetBlockId} can no longer be re-applied because its origin message is no longer in this session.`, params, logger);
99
+ return;
100
+ }
101
+ if (!targetBlock.deactivatedByUser) {
102
+ const message = targetBlock.active
103
+ ? `Compression ${targetBlockId} is already active.`
104
+ : `Compression ${targetBlockId} is not user-decompressed.`;
105
+ await sendIgnoredMessage(client, sessionId, message, params, logger);
106
+ return;
107
+ }
108
+ const activeMessagesBefore = snapshotActiveMessages(messagesState);
109
+ const activeBlockIdsBefore = new Set(messagesState.activeBlockIds);
110
+ targetBlock.deactivatedByUser = false;
111
+ targetBlock.deactivatedAt = undefined;
112
+ targetBlock.deactivatedByBlockId = undefined;
113
+ syncCompressionBlocks(state, logger, messages);
114
+ let recompressedMessageCount = 0;
115
+ let recompressedTokens = 0;
116
+ for (const [messageId, entry] of messagesState.byMessageId) {
117
+ const isActiveNow = entry.activeBlockIds.length > 0;
118
+ if (isActiveNow && !activeMessagesBefore.has(messageId)) {
119
+ recompressedMessageCount++;
120
+ recompressedTokens += entry.tokenCount;
121
+ }
122
+ }
123
+ state.stats.totalPruneTokens += recompressedTokens;
124
+ const deactivatedBlockIds = Array.from(activeBlockIdsBefore)
125
+ .filter((blockId) => !messagesState.activeBlockIds.has(blockId))
126
+ .sort((a, b) => a - b);
127
+ await saveSessionState(state, logger);
128
+ const message = formatRecompressMessage(targetBlockId, recompressedMessageCount, recompressedTokens, deactivatedBlockIds);
129
+ await sendIgnoredMessage(client, sessionId, message, params, logger);
130
+ logger.info("Recompress command completed", {
131
+ targetBlockId,
132
+ recompressedMessageCount,
133
+ recompressedTokens,
134
+ deactivatedBlockIds,
135
+ });
136
+ }
137
+ //# sourceMappingURL=recompress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recompress.js","sourceRoot":"","sources":["../../../lib/commands/recompress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * DCP Stats command handler.
3
+ * Shows pruning statistics for the current session and all-time totals.
4
+ */
5
+ import type { Logger } from "../logger";
6
+ import type { SessionState, WithParts } from "../state";
7
+ export interface StatsCommandContext {
8
+ client: any;
9
+ state: SessionState;
10
+ logger: Logger;
11
+ sessionId: string;
12
+ messages: WithParts[];
13
+ }
14
+ export declare function handleStatsCommand(ctx: StatsCommandContext): Promise<void>;
15
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../lib/commands/stats.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAMvD,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,SAAS,EAAE,CAAA;CACxB;AA8BD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuChF"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * DCP Stats command handler.
3
+ * Shows pruning statistics for the current session and all-time totals.
4
+ */
5
+ import { sendIgnoredMessage } from "../ui/notification";
6
+ import { formatTokenCount } from "../ui/utils";
7
+ import { loadAllSessionStats } from "../state/persistence";
8
+ import { getCurrentParams } from "../strategies/utils";
9
+ function formatStatsMessage(sessionTokens, sessionTools, sessionMessages, allTime) {
10
+ const lines = [];
11
+ lines.push("╭───────────────────────────────────────────────────────────╮");
12
+ lines.push("│ DCP Statistics │");
13
+ lines.push("╰───────────────────────────────────────────────────────────╯");
14
+ lines.push("");
15
+ lines.push("Session:");
16
+ lines.push("─".repeat(60));
17
+ lines.push(` Tokens pruned: ~${formatTokenCount(sessionTokens)}`);
18
+ lines.push(` Tools pruned: ${sessionTools}`);
19
+ lines.push(` Messages pruned: ${sessionMessages}`);
20
+ lines.push("");
21
+ lines.push("All-time:");
22
+ lines.push("─".repeat(60));
23
+ lines.push(` Tokens saved: ~${formatTokenCount(allTime.totalTokens)}`);
24
+ lines.push(` Tools pruned: ${allTime.totalTools}`);
25
+ lines.push(` Messages pruned: ${allTime.totalMessages}`);
26
+ lines.push(` Sessions: ${allTime.sessionCount}`);
27
+ return lines.join("\n");
28
+ }
29
+ export async function handleStatsCommand(ctx) {
30
+ const { client, state, logger, sessionId, messages } = ctx;
31
+ // Session stats from in-memory state
32
+ const sessionTokens = state.stats.totalPruneTokens;
33
+ const prunedToolIds = new Set(state.prune.tools.keys());
34
+ for (const block of state.prune.messages.blocksById.values()) {
35
+ if (block.active) {
36
+ for (const toolId of block.effectiveToolIds) {
37
+ prunedToolIds.add(toolId);
38
+ }
39
+ }
40
+ }
41
+ const sessionTools = prunedToolIds.size;
42
+ let sessionMessages = 0;
43
+ for (const entry of state.prune.messages.byMessageId.values()) {
44
+ if (entry.activeBlockIds.length > 0) {
45
+ sessionMessages++;
46
+ }
47
+ }
48
+ // All-time stats from storage files
49
+ const allTime = await loadAllSessionStats(logger);
50
+ const message = formatStatsMessage(sessionTokens, sessionTools, sessionMessages, allTime);
51
+ const params = getCurrentParams(state, messages, logger);
52
+ await sendIgnoredMessage(client, sessionId, message, params, logger);
53
+ logger.info("Stats command executed", {
54
+ sessionTokens,
55
+ sessionTools,
56
+ sessionMessages,
57
+ allTimeTokens: allTime.totalTokens,
58
+ allTimeTools: allTime.totalTools,
59
+ allTimeMessages: allTime.totalMessages,
60
+ });
61
+ }
62
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../lib/commands/stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * DCP Sweep command handler.
3
+ * Prunes tool outputs since the last user message, or the last N tools.
4
+ *
5
+ * Usage:
6
+ * /dcp sweep - Prune all tools since the previous user message
7
+ * /dcp sweep 10 - Prune the last 10 tools
8
+ */
9
+ import type { Logger } from "../logger";
10
+ import type { SessionState, WithParts } from "../state";
11
+ import type { PluginConfig } from "../config";
12
+ export interface SweepCommandContext {
13
+ client: any;
14
+ state: SessionState;
15
+ config: PluginConfig;
16
+ logger: Logger;
17
+ sessionId: string;
18
+ messages: WithParts[];
19
+ args: string[];
20
+ workingDirectory: string;
21
+ }
22
+ export declare function handleSweepCommand(ctx: SweepCommandContext): Promise<void>;
23
+ //# sourceMappingURL=sweep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sweep.d.ts","sourceRoot":"","sources":["../../../lib/commands/sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAsB,MAAM,UAAU,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAc7C,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;CAC3B;AA6FD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2IhF"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * DCP Sweep command handler.
3
+ * Prunes tool outputs since the last user message, or the last N tools.
4
+ *
5
+ * Usage:
6
+ * /dcp sweep - Prune all tools since the previous user message
7
+ * /dcp sweep 10 - Prune the last 10 tools
8
+ */
9
+ import { sendIgnoredMessage } from "../ui/notification";
10
+ import { formatPrunedItemsList } from "../ui/utils";
11
+ import { getCurrentParams, getTotalToolTokens } from "../strategies/utils";
12
+ import { buildToolIdList, isIgnoredUserMessage } from "../messages/utils";
13
+ import { saveSessionState } from "../state/persistence";
14
+ import { isMessageCompacted } from "../shared-utils";
15
+ import { getFilePathsFromParameters, isFilePathProtected, isToolNameProtected, } from "../protected-patterns";
16
+ import { syncToolCache } from "../state/tool-cache";
17
+ function findLastUserMessageIndex(messages) {
18
+ for (let i = messages.length - 1; i >= 0; i--) {
19
+ const msg = messages[i];
20
+ if (msg.info.role === "user" && !isIgnoredUserMessage(msg)) {
21
+ return i;
22
+ }
23
+ }
24
+ return -1;
25
+ }
26
+ function collectToolIdsAfterIndex(state, messages, afterIndex) {
27
+ const toolIds = [];
28
+ for (let i = afterIndex + 1; i < messages.length; i++) {
29
+ const msg = messages[i];
30
+ if (isMessageCompacted(state, msg)) {
31
+ continue;
32
+ }
33
+ const parts = Array.isArray(msg.parts) ? msg.parts : [];
34
+ if (parts.length > 0) {
35
+ for (const part of parts) {
36
+ if (part.type === "tool" && part.callID && part.tool) {
37
+ toolIds.push(part.callID);
38
+ }
39
+ }
40
+ }
41
+ }
42
+ return toolIds;
43
+ }
44
+ function formatNoUserMessage() {
45
+ const lines = [];
46
+ lines.push("╭───────────────────────────────────────────────────────────╮");
47
+ lines.push("│ DCP Sweep │");
48
+ lines.push("╰───────────────────────────────────────────────────────────╯");
49
+ lines.push("");
50
+ lines.push("Nothing swept: no user message found.");
51
+ return lines.join("\n");
52
+ }
53
+ function formatSweepMessage(toolCount, tokensSaved, mode, toolIds, toolMetadata, workingDirectory, skippedProtected) {
54
+ const lines = [];
55
+ lines.push("╭───────────────────────────────────────────────────────────╮");
56
+ lines.push("│ DCP Sweep │");
57
+ lines.push("╰───────────────────────────────────────────────────────────╯");
58
+ lines.push("");
59
+ if (toolCount === 0) {
60
+ if (mode === "since-user") {
61
+ lines.push("No tools found since the previous user message.");
62
+ }
63
+ else {
64
+ lines.push(`No tools found to sweep.`);
65
+ }
66
+ if (skippedProtected && skippedProtected > 0) {
67
+ lines.push(`(${skippedProtected} protected tool(s) skipped)`);
68
+ }
69
+ }
70
+ else {
71
+ if (mode === "since-user") {
72
+ lines.push(`Swept ${toolCount} tool(s) since the previous user message.`);
73
+ }
74
+ else {
75
+ lines.push(`Swept the last ${toolCount} tool(s).`);
76
+ }
77
+ lines.push(`Tokens saved: ~${tokensSaved.toLocaleString()}`);
78
+ if (skippedProtected && skippedProtected > 0) {
79
+ lines.push(`(${skippedProtected} protected tool(s) skipped)`);
80
+ }
81
+ lines.push("");
82
+ const itemLines = formatPrunedItemsList(toolIds, toolMetadata, workingDirectory);
83
+ lines.push(...itemLines);
84
+ }
85
+ return lines.join("\n");
86
+ }
87
+ export async function handleSweepCommand(ctx) {
88
+ const { client, state, config, logger, sessionId, messages, args, workingDirectory } = ctx;
89
+ const params = getCurrentParams(state, messages, logger);
90
+ const protectedTools = config.commands.protectedTools;
91
+ syncToolCache(state, config, logger, messages);
92
+ buildToolIdList(state, messages);
93
+ // Parse optional numeric argument
94
+ const numArg = args[0] ? parseInt(args[0], 10) : null;
95
+ const isLastNMode = numArg !== null && !isNaN(numArg) && numArg > 0;
96
+ let toolIdsToSweep;
97
+ let mode;
98
+ if (isLastNMode) {
99
+ // Mode: Sweep last N tools
100
+ mode = "last-n";
101
+ const startIndex = Math.max(0, state.toolIdList.length - numArg);
102
+ toolIdsToSweep = state.toolIdList.slice(startIndex);
103
+ logger.info(`Sweep command: last ${numArg} mode, found ${toolIdsToSweep.length} tools`);
104
+ }
105
+ else {
106
+ // Mode: Sweep since last user message
107
+ mode = "since-user";
108
+ const lastUserMsgIndex = findLastUserMessageIndex(messages);
109
+ if (lastUserMsgIndex === -1) {
110
+ // No user message found - show message and return
111
+ const message = formatNoUserMessage();
112
+ await sendIgnoredMessage(client, sessionId, message, params, logger);
113
+ logger.info("Sweep command: no user message found");
114
+ return;
115
+ }
116
+ else {
117
+ toolIdsToSweep = collectToolIdsAfterIndex(state, messages, lastUserMsgIndex);
118
+ logger.info(`Sweep command: found last user at index ${lastUserMsgIndex}, sweeping ${toolIdsToSweep.length} tools`);
119
+ }
120
+ }
121
+ // Filter out already-pruned tools, protected tools, and protected file paths
122
+ const newToolIds = toolIdsToSweep.filter((id) => {
123
+ if (state.prune.tools.has(id)) {
124
+ return false;
125
+ }
126
+ const entry = state.toolParameters.get(id);
127
+ if (!entry) {
128
+ return true;
129
+ }
130
+ if (isToolNameProtected(entry.tool, protectedTools)) {
131
+ logger.debug(`Sweep: skipping protected tool ${entry.tool} (${id})`);
132
+ return false;
133
+ }
134
+ const filePaths = getFilePathsFromParameters(entry.tool, entry.parameters);
135
+ if (isFilePathProtected(filePaths, config.protectedFilePatterns)) {
136
+ logger.debug(`Sweep: skipping protected file path(s) ${filePaths.join(", ")} (${id})`);
137
+ return false;
138
+ }
139
+ return true;
140
+ });
141
+ // Count how many were skipped due to protection
142
+ const skippedProtected = toolIdsToSweep.filter((id) => {
143
+ const entry = state.toolParameters.get(id);
144
+ if (!entry) {
145
+ return false;
146
+ }
147
+ if (isToolNameProtected(entry.tool, protectedTools)) {
148
+ return true;
149
+ }
150
+ const filePaths = getFilePathsFromParameters(entry.tool, entry.parameters);
151
+ if (isFilePathProtected(filePaths, config.protectedFilePatterns)) {
152
+ return true;
153
+ }
154
+ return false;
155
+ }).length;
156
+ if (newToolIds.length === 0) {
157
+ const message = formatSweepMessage(0, 0, mode, [], new Map(), workingDirectory, skippedProtected);
158
+ await sendIgnoredMessage(client, sessionId, message, params, logger);
159
+ logger.info("Sweep command: no new tools to sweep", { skippedProtected });
160
+ return;
161
+ }
162
+ const tokensSaved = getTotalToolTokens(state, newToolIds);
163
+ // Add to prune list
164
+ for (const id of newToolIds) {
165
+ const entry = state.toolParameters.get(id);
166
+ state.prune.tools.set(id, entry?.tokenCount ?? 0);
167
+ }
168
+ state.stats.pruneTokenCounter += tokensSaved;
169
+ state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
170
+ state.stats.pruneTokenCounter = 0;
171
+ // Collect metadata for logging
172
+ const toolMetadata = new Map();
173
+ for (const id of newToolIds) {
174
+ const entry = state.toolParameters.get(id);
175
+ if (entry) {
176
+ toolMetadata.set(id, entry);
177
+ }
178
+ }
179
+ // Persist state
180
+ saveSessionState(state, logger).catch((err) => logger.error("Failed to persist state after sweep", { error: err.message }));
181
+ const message = formatSweepMessage(newToolIds.length, tokensSaved, mode, newToolIds, toolMetadata, workingDirectory, skippedProtected);
182
+ await sendIgnoredMessage(client, sessionId, message, params, logger);
183
+ logger.info("Sweep command completed", {
184
+ toolsSwept: newToolIds.length,
185
+ tokensSaved,
186
+ skippedProtected,
187
+ mode,
188
+ tools: Array.from(toolMetadata.entries()).map(([id, entry]) => ({
189
+ id,
190
+ tool: entry.tool,
191
+ })),
192
+ });
193
+ }
194
+ //# sourceMappingURL=sweep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../../lib/commands/sweep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type { PluginInput } from "@opencode-ai/plugin";
2
+ type Permission = "ask" | "allow" | "deny";
3
+ export interface Deduplication {
4
+ enabled: boolean;
5
+ protectedTools: string[];
6
+ }
7
+ export interface CompressTool {
8
+ permission: Permission;
9
+ showCompression: boolean;
10
+ maxContextLimit: number | `${number}%`;
11
+ minContextLimit: number | `${number}%`;
12
+ modelMaxLimits?: Record<string, number | `${number}%`>;
13
+ modelMinLimits?: Record<string, number | `${number}%`>;
14
+ nudgeFrequency: number;
15
+ iterationNudgeThreshold: number;
16
+ nudgeForce: "strong" | "soft";
17
+ flatSchema: boolean;
18
+ protectedTools: string[];
19
+ protectUserMessages: boolean;
20
+ }
21
+ export interface Commands {
22
+ enabled: boolean;
23
+ protectedTools: string[];
24
+ }
25
+ export interface ManualModeConfig {
26
+ enabled: boolean;
27
+ automaticStrategies: boolean;
28
+ }
29
+ export interface SupersedeWrites {
30
+ enabled: boolean;
31
+ }
32
+ export interface PurgeErrors {
33
+ enabled: boolean;
34
+ turns: number;
35
+ protectedTools: string[];
36
+ }
37
+ export interface TurnProtection {
38
+ enabled: boolean;
39
+ turns: number;
40
+ }
41
+ export interface ExperimentalConfig {
42
+ allowSubAgents: boolean;
43
+ customPrompts: boolean;
44
+ }
45
+ export interface PluginConfig {
46
+ enabled: boolean;
47
+ debug: boolean;
48
+ pruneNotification: "off" | "minimal" | "detailed";
49
+ pruneNotificationType: "chat" | "toast";
50
+ commands: Commands;
51
+ manualMode: ManualModeConfig;
52
+ turnProtection: TurnProtection;
53
+ experimental: ExperimentalConfig;
54
+ protectedFilePatterns: string[];
55
+ compress: CompressTool;
56
+ strategies: {
57
+ deduplication: Deduplication;
58
+ supersedeWrites: SupersedeWrites;
59
+ purgeErrors: PurgeErrors;
60
+ };
61
+ }
62
+ export declare const VALID_CONFIG_KEYS: Set<string>;
63
+ export declare function getInvalidConfigKeys(userConfig: Record<string, any>): string[];
64
+ interface ValidationError {
65
+ key: string;
66
+ expected: string;
67
+ actual: string;
68
+ }
69
+ export declare function validateConfigTypes(config: Record<string, any>): ValidationError[];
70
+ export declare function getConfig(ctx: PluginInput): PluginConfig;
71
+ export {};
72
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,KAAK,UAAU,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAA;AAE1C,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,YAAY;IACzB,UAAU,EAAE,UAAU,CAAA;IACtB,eAAe,EAAE,OAAO,CAAA;IACxB,eAAe,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAA;IACtC,eAAe,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAA;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAA;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAA;IACtD,cAAc,EAAE,MAAM,CAAA;IACtB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAA;IAC7B,UAAU,EAAE,OAAO,CAAA;IACnB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,mBAAmB,EAAE,OAAO,CAAA;CAC/B;AAED,MAAM,WAAW,QAAQ;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,mBAAmB,EAAE,OAAO,CAAA;CAC/B;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IAC/B,cAAc,EAAE,OAAO,CAAA;IACvB,aAAa,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,iBAAiB,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAA;IACjD,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAA;IACvC,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,YAAY,EAAE,kBAAkB,CAAA;IAChC,qBAAqB,EAAE,MAAM,EAAE,CAAA;IAC/B,QAAQ,EAAE,YAAY,CAAA;IACtB,UAAU,EAAE;QACR,aAAa,EAAE,aAAa,CAAA;QAC5B,eAAe,EAAE,eAAe,CAAA;QAChC,WAAW,EAAE,WAAW,CAAA;KAC3B,CAAA;CACJ;AAmBD,eAAO,MAAM,iBAAiB,aA2C5B,CAAA;AAoBF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CAG9E;AAED,UAAU,eAAe;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,eAAe,EAAE,CA2alF;AAyWD,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,CAsCxD"}