@tuanhung303/opencode-acp 0.0.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.
Files changed (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +79 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/commands/budget.d.ts +15 -0
  8. package/dist/lib/commands/budget.d.ts.map +1 -0
  9. package/dist/lib/commands/budget.js +120 -0
  10. package/dist/lib/commands/budget.js.map +1 -0
  11. package/dist/lib/commands/context.d.ts +49 -0
  12. package/dist/lib/commands/context.d.ts.map +1 -0
  13. package/dist/lib/commands/context.js +191 -0
  14. package/dist/lib/commands/context.js.map +1 -0
  15. package/dist/lib/commands/help.d.ts +15 -0
  16. package/dist/lib/commands/help.d.ts.map +1 -0
  17. package/dist/lib/commands/help.js +28 -0
  18. package/dist/lib/commands/help.js.map +1 -0
  19. package/dist/lib/commands/protected.d.ts +17 -0
  20. package/dist/lib/commands/protected.d.ts.map +1 -0
  21. package/dist/lib/commands/protected.js +50 -0
  22. package/dist/lib/commands/protected.js.map +1 -0
  23. package/dist/lib/commands/stats.d.ts +15 -0
  24. package/dist/lib/commands/stats.d.ts.map +1 -0
  25. package/dist/lib/commands/stats.js +64 -0
  26. package/dist/lib/commands/stats.js.map +1 -0
  27. package/dist/lib/commands/sweep.d.ts +23 -0
  28. package/dist/lib/commands/sweep.d.ts.map +1 -0
  29. package/dist/lib/commands/sweep.js +194 -0
  30. package/dist/lib/commands/sweep.js.map +1 -0
  31. package/dist/lib/config-schema.d.ts +119 -0
  32. package/dist/lib/config-schema.d.ts.map +1 -0
  33. package/dist/lib/config-schema.js +97 -0
  34. package/dist/lib/config-schema.js.map +1 -0
  35. package/dist/lib/config.d.ts +59 -0
  36. package/dist/lib/config.d.ts.map +1 -0
  37. package/dist/lib/config.js +426 -0
  38. package/dist/lib/config.js.map +1 -0
  39. package/dist/lib/hooks.d.ts +31 -0
  40. package/dist/lib/hooks.d.ts.map +1 -0
  41. package/dist/lib/hooks.js +230 -0
  42. package/dist/lib/hooks.js.map +1 -0
  43. package/dist/lib/logger.d.ts +55 -0
  44. package/dist/lib/logger.d.ts.map +1 -0
  45. package/dist/lib/logger.js +230 -0
  46. package/dist/lib/logger.js.map +1 -0
  47. package/dist/lib/messages/index.d.ts +3 -0
  48. package/dist/lib/messages/index.d.ts.map +1 -0
  49. package/dist/lib/messages/index.js +3 -0
  50. package/dist/lib/messages/index.js.map +1 -0
  51. package/dist/lib/messages/inject.d.ts +10 -0
  52. package/dist/lib/messages/inject.d.ts.map +1 -0
  53. package/dist/lib/messages/inject.js +10 -0
  54. package/dist/lib/messages/inject.js.map +1 -0
  55. package/dist/lib/messages/prune.d.ts +13 -0
  56. package/dist/lib/messages/prune.d.ts.map +1 -0
  57. package/dist/lib/messages/prune.js +173 -0
  58. package/dist/lib/messages/prune.js.map +1 -0
  59. package/dist/lib/messages/utils.d.ts +43 -0
  60. package/dist/lib/messages/utils.d.ts.map +1 -0
  61. package/dist/lib/messages/utils.js +262 -0
  62. package/dist/lib/messages/utils.js.map +1 -0
  63. package/dist/lib/prompts/discard-tool-spec.d.ts +2 -0
  64. package/dist/lib/prompts/discard-tool-spec.d.ts.map +1 -0
  65. package/dist/lib/prompts/discard-tool-spec.js +54 -0
  66. package/dist/lib/prompts/discard-tool-spec.js.map +1 -0
  67. package/dist/lib/prompts/extract-tool-spec.d.ts +2 -0
  68. package/dist/lib/prompts/extract-tool-spec.d.ts.map +1 -0
  69. package/dist/lib/prompts/extract-tool-spec.js +56 -0
  70. package/dist/lib/prompts/extract-tool-spec.js.map +1 -0
  71. package/dist/lib/prompts/index.d.ts +2 -0
  72. package/dist/lib/prompts/index.d.ts.map +1 -0
  73. package/dist/lib/prompts/index.js +29 -0
  74. package/dist/lib/prompts/index.js.map +1 -0
  75. package/dist/lib/prompts/restore-tool-spec.d.ts +2 -0
  76. package/dist/lib/prompts/restore-tool-spec.d.ts.map +1 -0
  77. package/dist/lib/prompts/restore-tool-spec.js +37 -0
  78. package/dist/lib/prompts/restore-tool-spec.js.map +1 -0
  79. package/dist/lib/prompts/system/both.d.ts +2 -0
  80. package/dist/lib/prompts/system/both.d.ts.map +1 -0
  81. package/dist/lib/prompts/system/both.js +65 -0
  82. package/dist/lib/prompts/system/both.js.map +1 -0
  83. package/dist/lib/prompts/system/discard.d.ts +2 -0
  84. package/dist/lib/prompts/system/discard.d.ts.map +1 -0
  85. package/dist/lib/prompts/system/discard.js +55 -0
  86. package/dist/lib/prompts/system/discard.js.map +1 -0
  87. package/dist/lib/prompts/system/extract.d.ts +2 -0
  88. package/dist/lib/prompts/system/extract.d.ts.map +1 -0
  89. package/dist/lib/prompts/system/extract.js +55 -0
  90. package/dist/lib/prompts/system/extract.js.map +1 -0
  91. package/dist/lib/protected-file-patterns.d.ts +12 -0
  92. package/dist/lib/protected-file-patterns.d.ts.map +1 -0
  93. package/dist/lib/protected-file-patterns.js +69 -0
  94. package/dist/lib/protected-file-patterns.js.map +1 -0
  95. package/dist/lib/safe-execute.d.ts +20 -0
  96. package/dist/lib/safe-execute.d.ts.map +1 -0
  97. package/dist/lib/safe-execute.js +38 -0
  98. package/dist/lib/safe-execute.js.map +1 -0
  99. package/dist/lib/shared-utils.d.ts +4 -0
  100. package/dist/lib/shared-utils.d.ts.map +1 -0
  101. package/dist/lib/shared-utils.js +14 -0
  102. package/dist/lib/shared-utils.js.map +1 -0
  103. package/dist/lib/state/index.d.ts +4 -0
  104. package/dist/lib/state/index.d.ts.map +1 -0
  105. package/dist/lib/state/index.js +4 -0
  106. package/dist/lib/state/index.js.map +1 -0
  107. package/dist/lib/state/persistence.d.ts +27 -0
  108. package/dist/lib/state/persistence.d.ts.map +1 -0
  109. package/dist/lib/state/persistence.js +165 -0
  110. package/dist/lib/state/persistence.js.map +1 -0
  111. package/dist/lib/state/state.d.ts +8 -0
  112. package/dist/lib/state/state.d.ts.map +1 -0
  113. package/dist/lib/state/state.js +166 -0
  114. package/dist/lib/state/state.js.map +1 -0
  115. package/dist/lib/state/tool-cache.d.ts +15 -0
  116. package/dist/lib/state/tool-cache.d.ts.map +1 -0
  117. package/dist/lib/state/tool-cache.js +99 -0
  118. package/dist/lib/state/tool-cache.js.map +1 -0
  119. package/dist/lib/state/types.d.ts +83 -0
  120. package/dist/lib/state/types.d.ts.map +1 -0
  121. package/dist/lib/state/types.js +2 -0
  122. package/dist/lib/state/types.js.map +1 -0
  123. package/dist/lib/state/utils.d.ts +2 -0
  124. package/dist/lib/state/utils.d.ts.map +1 -0
  125. package/dist/lib/state/utils.js +10 -0
  126. package/dist/lib/state/utils.js.map +1 -0
  127. package/dist/lib/strategies/deduplication.d.ts +11 -0
  128. package/dist/lib/strategies/deduplication.d.ts.map +1 -0
  129. package/dist/lib/strategies/deduplication.js +178 -0
  130. package/dist/lib/strategies/deduplication.js.map +1 -0
  131. package/dist/lib/strategies/index.d.ts +5 -0
  132. package/dist/lib/strategies/index.d.ts.map +1 -0
  133. package/dist/lib/strategies/index.js +5 -0
  134. package/dist/lib/strategies/index.js.map +1 -0
  135. package/dist/lib/strategies/purge-errors.d.ts +13 -0
  136. package/dist/lib/strategies/purge-errors.d.ts.map +1 -0
  137. package/dist/lib/strategies/purge-errors.js +62 -0
  138. package/dist/lib/strategies/purge-errors.js.map +1 -0
  139. package/dist/lib/strategies/supersede-writes.d.ts +13 -0
  140. package/dist/lib/strategies/supersede-writes.d.ts.map +1 -0
  141. package/dist/lib/strategies/supersede-writes.js +90 -0
  142. package/dist/lib/strategies/supersede-writes.js.map +1 -0
  143. package/dist/lib/strategies/tools.d.ts +15 -0
  144. package/dist/lib/strategies/tools.d.ts.map +1 -0
  145. package/dist/lib/strategies/tools.js +288 -0
  146. package/dist/lib/strategies/tools.js.map +1 -0
  147. package/dist/lib/strategies/utils.d.ts +11 -0
  148. package/dist/lib/strategies/utils.d.ts.map +1 -0
  149. package/dist/lib/strategies/utils.js +75 -0
  150. package/dist/lib/strategies/utils.js.map +1 -0
  151. package/dist/lib/ui/notification.d.ts +12 -0
  152. package/dist/lib/ui/notification.d.ts.map +1 -0
  153. package/dist/lib/ui/notification.js +81 -0
  154. package/dist/lib/ui/notification.js.map +1 -0
  155. package/dist/lib/ui/utils.d.ts +10 -0
  156. package/dist/lib/ui/utils.d.ts.map +1 -0
  157. package/dist/lib/ui/utils.js +113 -0
  158. package/dist/lib/ui/utils.js.map +1 -0
  159. package/package.json +62 -0
@@ -0,0 +1,194 @@
1
+ /**
2
+ * ACP Sweep command handler.
3
+ * Prunes tool outputs since the last user message, or the last N tools.
4
+ *
5
+ * Usage:
6
+ * /acp sweep - Prune all tools since the previous user message
7
+ * /acp sweep 10 - Prune the last 10 tools
8
+ */
9
+ import { sendIgnoredMessage } from "../ui/notification";
10
+ import { formatPrunedItemsList } from "../ui/utils";
11
+ import { getCurrentParams, calculateTokensSaved } from "../strategies/utils";
12
+ import { buildToolIdList, isIgnoredUserMessage } from "../messages/utils";
13
+ import { saveSessionState } from "../state/persistence";
14
+ import { isMessageCompacted } from "../shared-utils";
15
+ import { getFilePathFromParameters, isProtectedFilePath } from "../protected-file-patterns";
16
+ function findLastUserMessageIndex(messages) {
17
+ for (let i = messages.length - 1; i >= 0; i--) {
18
+ const msg = messages[i];
19
+ if (msg && msg.info.role === "user" && !isIgnoredUserMessage(msg)) {
20
+ return i;
21
+ }
22
+ }
23
+ return -1;
24
+ }
25
+ function collectToolIdsAfterIndex(state, messages, afterIndex) {
26
+ const toolIds = [];
27
+ for (let i = afterIndex + 1; i < messages.length; i++) {
28
+ const msg = messages[i];
29
+ if (!msg || isMessageCompacted(state, msg)) {
30
+ continue;
31
+ }
32
+ const parts = Array.isArray(msg.parts) ? msg.parts : [];
33
+ if (parts.length > 0) {
34
+ for (const part of parts) {
35
+ if (part.type === "tool" && part.callID && part.tool) {
36
+ toolIds.push(part.callID);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ return toolIds;
42
+ }
43
+ function formatNoUserMessage() {
44
+ const lines = [];
45
+ lines.push("╭───────────────────────────────────────────────────────────╮");
46
+ lines.push("│ ACP Sweep │");
47
+ lines.push("╰───────────────────────────────────────────────────────────╯");
48
+ lines.push("");
49
+ lines.push("Nothing swept: no user message found.");
50
+ return lines.join("\n");
51
+ }
52
+ function formatSweepMessage(toolCount, tokensSaved, mode, toolIds, toolMetadata, workingDirectory, skippedProtected) {
53
+ const lines = [];
54
+ lines.push("╭───────────────────────────────────────────────────────────╮");
55
+ lines.push("│ ACP Sweep │");
56
+ lines.push("╰───────────────────────────────────────────────────────────╯");
57
+ lines.push("");
58
+ if (toolCount === 0) {
59
+ if (mode === "since-user") {
60
+ lines.push("No tools found since the previous user message.");
61
+ }
62
+ else {
63
+ lines.push(`No tools found to sweep.`);
64
+ }
65
+ if (skippedProtected && skippedProtected > 0) {
66
+ lines.push(`(${skippedProtected} protected tool(s) skipped)`);
67
+ }
68
+ }
69
+ else {
70
+ if (mode === "since-user") {
71
+ lines.push(`Swept ${toolCount} tool(s) since the previous user message.`);
72
+ }
73
+ else {
74
+ lines.push(`Swept the last ${toolCount} tool(s).`);
75
+ }
76
+ lines.push(`Tokens saved: ~${tokensSaved.toLocaleString()}`);
77
+ if (skippedProtected && skippedProtected > 0) {
78
+ lines.push(`(${skippedProtected} protected tool(s) skipped)`);
79
+ }
80
+ lines.push("");
81
+ const itemLines = formatPrunedItemsList(toolIds, toolMetadata, workingDirectory);
82
+ lines.push(...itemLines);
83
+ }
84
+ return lines.join("\n");
85
+ }
86
+ export async function handleSweepCommand(ctx) {
87
+ const { client, state, config, logger, sessionId, messages, args, workingDirectory } = ctx;
88
+ const params = getCurrentParams(state, messages, logger);
89
+ const protectedTools = config.commands.protectedTools;
90
+ // Parse optional numeric argument
91
+ const numArg = args[0] ? parseInt(args[0], 10) : null;
92
+ const isLastNMode = numArg !== null && !isNaN(numArg) && numArg > 0;
93
+ let toolIdsToSweep;
94
+ let mode;
95
+ if (isLastNMode) {
96
+ // Mode: Sweep last N tools
97
+ mode = "last-n";
98
+ const allToolIds = buildToolIdList(state, messages, logger);
99
+ const startIndex = Math.max(0, allToolIds.length - numArg);
100
+ toolIdsToSweep = allToolIds.slice(startIndex);
101
+ logger.info(`Sweep command: last ${numArg} mode, found ${toolIdsToSweep.length} tools`);
102
+ }
103
+ else {
104
+ // Mode: Sweep since last user message
105
+ mode = "since-user";
106
+ const lastUserMsgIndex = findLastUserMessageIndex(messages);
107
+ if (lastUserMsgIndex === -1) {
108
+ // No user message found - show message and return
109
+ const message = formatNoUserMessage();
110
+ await sendIgnoredMessage(client, sessionId, message, params, logger);
111
+ logger.info("Sweep command: no user message found");
112
+ return;
113
+ }
114
+ else {
115
+ toolIdsToSweep = collectToolIdsAfterIndex(state, messages, lastUserMsgIndex);
116
+ logger.info(`Sweep command: found last user at index ${lastUserMsgIndex}, sweeping ${toolIdsToSweep.length} tools`);
117
+ }
118
+ }
119
+ // Filter out already-pruned tools, protected tools, and protected file paths
120
+ const existingPrunedSet = new Set(state.prune.toolIds);
121
+ const newToolIds = toolIdsToSweep.filter((id) => {
122
+ if (existingPrunedSet.has(id)) {
123
+ return false;
124
+ }
125
+ const entry = state.toolParameters.get(id);
126
+ if (!entry) {
127
+ return true;
128
+ }
129
+ if (protectedTools.includes(entry.tool)) {
130
+ logger.debug(`Sweep: skipping protected tool ${entry.tool} (${id})`);
131
+ return false;
132
+ }
133
+ const filePath = getFilePathFromParameters(entry.parameters);
134
+ if (isProtectedFilePath(filePath, config.protectedFilePatterns)) {
135
+ logger.debug(`Sweep: skipping protected file path ${filePath} (${id})`);
136
+ return false;
137
+ }
138
+ return true;
139
+ });
140
+ // Count how many were skipped due to protection
141
+ const skippedProtected = toolIdsToSweep.filter((id) => {
142
+ const entry = state.toolParameters.get(id);
143
+ if (!entry) {
144
+ return false;
145
+ }
146
+ if (protectedTools.includes(entry.tool)) {
147
+ return true;
148
+ }
149
+ const filePath = getFilePathFromParameters(entry.parameters);
150
+ if (isProtectedFilePath(filePath, config.protectedFilePatterns)) {
151
+ return true;
152
+ }
153
+ return false;
154
+ }).length;
155
+ if (newToolIds.length === 0) {
156
+ const message = formatSweepMessage(0, 0, mode, [], new Map(), workingDirectory, skippedProtected);
157
+ await sendIgnoredMessage(client, sessionId, message, params, logger);
158
+ logger.info("Sweep command: no new tools to sweep", { skippedProtected });
159
+ return;
160
+ }
161
+ // Add to prune list
162
+ state.prune.toolIds.push(...newToolIds);
163
+ // Calculate tokens saved
164
+ const tokensSaved = calculateTokensSaved(state, messages, newToolIds);
165
+ state.stats.pruneTokenCounter += tokensSaved;
166
+ state.stats.pruneMessageCounter += newToolIds.length;
167
+ state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
168
+ state.stats.pruneTokenCounter = 0;
169
+ state.stats.totalPruneMessages += state.stats.pruneMessageCounter;
170
+ state.stats.pruneMessageCounter = 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,119 @@
1
+ /**
2
+ * Zod schema for ACP plugin configuration.
3
+ * Provides runtime validation with clear error messages.
4
+ */
5
+ import { z } from "zod";
6
+ export declare const DeduplicationSchema: z.ZodObject<{
7
+ enabled: z.ZodOptional<z.ZodBoolean>;
8
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
9
+ }, z.core.$strip>;
10
+ export declare const DiscardToolSchema: z.ZodObject<{
11
+ enabled: z.ZodOptional<z.ZodBoolean>;
12
+ }, z.core.$strip>;
13
+ export declare const ExtractToolSchema: z.ZodObject<{
14
+ enabled: z.ZodOptional<z.ZodBoolean>;
15
+ showDistillation: z.ZodOptional<z.ZodBoolean>;
16
+ }, z.core.$strip>;
17
+ export declare const ToolSettingsSchema: z.ZodObject<{
18
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
19
+ }, z.core.$strip>;
20
+ export declare const ToolsSchema: z.ZodObject<{
21
+ settings: z.ZodOptional<z.ZodObject<{
22
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
23
+ }, z.core.$strip>>;
24
+ discard: z.ZodOptional<z.ZodObject<{
25
+ enabled: z.ZodOptional<z.ZodBoolean>;
26
+ }, z.core.$strip>>;
27
+ extract: z.ZodOptional<z.ZodObject<{
28
+ enabled: z.ZodOptional<z.ZodBoolean>;
29
+ showDistillation: z.ZodOptional<z.ZodBoolean>;
30
+ }, z.core.$strip>>;
31
+ }, z.core.$strip>;
32
+ export declare const CommandsSchema: z.ZodObject<{
33
+ enabled: z.ZodOptional<z.ZodBoolean>;
34
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
+ }, z.core.$strip>;
36
+ export declare const SupersedeWritesSchema: z.ZodObject<{
37
+ enabled: z.ZodOptional<z.ZodBoolean>;
38
+ }, z.core.$strip>;
39
+ export declare const PurgeErrorsSchema: z.ZodObject<{
40
+ enabled: z.ZodOptional<z.ZodBoolean>;
41
+ turns: z.ZodOptional<z.ZodNumber>;
42
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
43
+ }, z.core.$strip>;
44
+ export declare const TurnProtectionSchema: z.ZodObject<{
45
+ enabled: z.ZodOptional<z.ZodBoolean>;
46
+ turns: z.ZodOptional<z.ZodNumber>;
47
+ }, z.core.$strip>;
48
+ export declare const StrategiesSchema: z.ZodObject<{
49
+ deduplication: z.ZodOptional<z.ZodObject<{
50
+ enabled: z.ZodOptional<z.ZodBoolean>;
51
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
52
+ }, z.core.$strip>>;
53
+ supersedeWrites: z.ZodOptional<z.ZodObject<{
54
+ enabled: z.ZodOptional<z.ZodBoolean>;
55
+ }, z.core.$strip>>;
56
+ purgeErrors: z.ZodOptional<z.ZodObject<{
57
+ enabled: z.ZodOptional<z.ZodBoolean>;
58
+ turns: z.ZodOptional<z.ZodNumber>;
59
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
60
+ }, z.core.$strip>>;
61
+ }, z.core.$strip>;
62
+ export declare const PluginConfigSchema: z.ZodObject<{
63
+ $schema: z.ZodOptional<z.ZodString>;
64
+ enabled: z.ZodOptional<z.ZodBoolean>;
65
+ debug: z.ZodOptional<z.ZodBoolean>;
66
+ showUpdateToasts: z.ZodOptional<z.ZodBoolean>;
67
+ pruneNotification: z.ZodOptional<z.ZodEnum<{
68
+ off: "off";
69
+ minimal: "minimal";
70
+ detailed: "detailed";
71
+ }>>;
72
+ commands: z.ZodOptional<z.ZodObject<{
73
+ enabled: z.ZodOptional<z.ZodBoolean>;
74
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
75
+ }, z.core.$strip>>;
76
+ turnProtection: z.ZodOptional<z.ZodObject<{
77
+ enabled: z.ZodOptional<z.ZodBoolean>;
78
+ turns: z.ZodOptional<z.ZodNumber>;
79
+ }, z.core.$strip>>;
80
+ protectedFilePatterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
81
+ tools: z.ZodOptional<z.ZodObject<{
82
+ settings: z.ZodOptional<z.ZodObject<{
83
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
84
+ }, z.core.$strip>>;
85
+ discard: z.ZodOptional<z.ZodObject<{
86
+ enabled: z.ZodOptional<z.ZodBoolean>;
87
+ }, z.core.$strip>>;
88
+ extract: z.ZodOptional<z.ZodObject<{
89
+ enabled: z.ZodOptional<z.ZodBoolean>;
90
+ showDistillation: z.ZodOptional<z.ZodBoolean>;
91
+ }, z.core.$strip>>;
92
+ }, z.core.$strip>>;
93
+ strategies: z.ZodOptional<z.ZodObject<{
94
+ deduplication: z.ZodOptional<z.ZodObject<{
95
+ enabled: z.ZodOptional<z.ZodBoolean>;
96
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
97
+ }, z.core.$strip>>;
98
+ supersedeWrites: z.ZodOptional<z.ZodObject<{
99
+ enabled: z.ZodOptional<z.ZodBoolean>;
100
+ }, z.core.$strip>>;
101
+ purgeErrors: z.ZodOptional<z.ZodObject<{
102
+ enabled: z.ZodOptional<z.ZodBoolean>;
103
+ turns: z.ZodOptional<z.ZodNumber>;
104
+ protectedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
105
+ }, z.core.$strip>>;
106
+ }, z.core.$strip>>;
107
+ }, z.core.$strip>;
108
+ export type PluginConfigInput = z.infer<typeof PluginConfigSchema>;
109
+ /**
110
+ * Validate a config object and return formatted error messages.
111
+ * Returns empty array if valid.
112
+ */
113
+ export declare function validateConfig(config: unknown): string[];
114
+ /**
115
+ * Get unknown keys that aren't in the schema.
116
+ * Useful for warning about typos in config files.
117
+ */
118
+ export declare function getUnknownKeys(config: Record<string, unknown>): string[];
119
+ //# sourceMappingURL=config-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../lib/config-schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAA;AAEF,eAAO,MAAM,iBAAiB;;iBAE5B,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;iBAE7B,CAAA;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;iBAItB,CAAA;AAEF,eAAO,MAAM,cAAc;;;iBAGzB,CAAA;AAEF,eAAO,MAAM,qBAAqB;;iBAEhC,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;iBAI5B,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;iBAG/B,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;iBAI3B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW7B,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAElE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAWxD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAuBxE"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Zod schema for ACP plugin configuration.
3
+ * Provides runtime validation with clear error messages.
4
+ */
5
+ import { z } from "zod";
6
+ export const DeduplicationSchema = z.object({
7
+ enabled: z.boolean().optional(),
8
+ protectedTools: z.array(z.string()).optional(),
9
+ });
10
+ export const DiscardToolSchema = z.object({
11
+ enabled: z.boolean().optional(),
12
+ });
13
+ export const ExtractToolSchema = z.object({
14
+ enabled: z.boolean().optional(),
15
+ showDistillation: z.boolean().optional(),
16
+ });
17
+ export const ToolSettingsSchema = z.object({
18
+ protectedTools: z.array(z.string()).optional(),
19
+ });
20
+ export const ToolsSchema = z.object({
21
+ settings: ToolSettingsSchema.optional(),
22
+ discard: DiscardToolSchema.optional(),
23
+ extract: ExtractToolSchema.optional(),
24
+ });
25
+ export const CommandsSchema = z.object({
26
+ enabled: z.boolean().optional(),
27
+ protectedTools: z.array(z.string()).optional(),
28
+ });
29
+ export const SupersedeWritesSchema = z.object({
30
+ enabled: z.boolean().optional(),
31
+ });
32
+ export const PurgeErrorsSchema = z.object({
33
+ enabled: z.boolean().optional(),
34
+ turns: z.number().int().positive().optional(),
35
+ protectedTools: z.array(z.string()).optional(),
36
+ });
37
+ export const TurnProtectionSchema = z.object({
38
+ enabled: z.boolean().optional(),
39
+ turns: z.number().int().positive().optional(),
40
+ });
41
+ export const StrategiesSchema = z.object({
42
+ deduplication: DeduplicationSchema.optional(),
43
+ supersedeWrites: SupersedeWritesSchema.optional(),
44
+ purgeErrors: PurgeErrorsSchema.optional(),
45
+ });
46
+ export const PluginConfigSchema = z.object({
47
+ $schema: z.string().optional(),
48
+ enabled: z.boolean().optional(),
49
+ debug: z.boolean().optional(),
50
+ showUpdateToasts: z.boolean().optional(), // Deprecated but kept for backwards compatibility
51
+ pruneNotification: z.enum(["off", "minimal", "detailed"]).optional(),
52
+ commands: CommandsSchema.optional(),
53
+ turnProtection: TurnProtectionSchema.optional(),
54
+ protectedFilePatterns: z.array(z.string()).optional(),
55
+ tools: ToolsSchema.optional(),
56
+ strategies: StrategiesSchema.optional(),
57
+ });
58
+ /**
59
+ * Validate a config object and return formatted error messages.
60
+ * Returns empty array if valid.
61
+ */
62
+ export function validateConfig(config) {
63
+ const result = PluginConfigSchema.safeParse(config);
64
+ if (result.success) {
65
+ return [];
66
+ }
67
+ return result.error.issues.map((issue) => {
68
+ const path = issue.path.join(".");
69
+ return `${path || "root"}: ${issue.message}`;
70
+ });
71
+ }
72
+ /**
73
+ * Get unknown keys that aren't in the schema.
74
+ * Useful for warning about typos in config files.
75
+ */
76
+ export function getUnknownKeys(config) {
77
+ const knownKeys = new Set([
78
+ "$schema",
79
+ "enabled",
80
+ "debug",
81
+ "showUpdateToasts",
82
+ "pruneNotification",
83
+ "commands",
84
+ "turnProtection",
85
+ "protectedFilePatterns",
86
+ "tools",
87
+ "strategies",
88
+ ]);
89
+ const unknownKeys = [];
90
+ for (const key of Object.keys(config)) {
91
+ if (!knownKeys.has(key)) {
92
+ unknownKeys.push(key);
93
+ }
94
+ }
95
+ return unknownKeys;
96
+ }
97
+ //# sourceMappingURL=config-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../lib/config-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { PluginInput } from "@opencode-ai/plugin";
2
+ export interface Deduplication {
3
+ enabled: boolean;
4
+ protectedTools: string[];
5
+ }
6
+ export interface DiscardTool {
7
+ enabled: boolean;
8
+ }
9
+ export interface ExtractTool {
10
+ enabled: boolean;
11
+ showDistillation: boolean;
12
+ }
13
+ export interface ToolSettings {
14
+ protectedTools: string[];
15
+ }
16
+ export interface Tools {
17
+ settings: ToolSettings;
18
+ discard: DiscardTool;
19
+ extract: ExtractTool;
20
+ }
21
+ export interface Commands {
22
+ enabled: boolean;
23
+ protectedTools: string[];
24
+ }
25
+ export interface SupersedeWrites {
26
+ enabled: boolean;
27
+ }
28
+ export interface PurgeErrors {
29
+ enabled: boolean;
30
+ turns: number;
31
+ protectedTools: string[];
32
+ }
33
+ export interface TurnProtection {
34
+ enabled: boolean;
35
+ turns: number;
36
+ }
37
+ export interface PluginConfig {
38
+ enabled: boolean;
39
+ debug: boolean;
40
+ pruneNotification: "off" | "minimal" | "detailed";
41
+ /**
42
+ * Enable auto-pruning after each tool execution.
43
+ * Lightweight strategies run immediately after tools complete,
44
+ * keeping context clean throughout the conversation.
45
+ * @default true
46
+ */
47
+ autoPruneAfterTool: boolean;
48
+ commands: Commands;
49
+ turnProtection: TurnProtection;
50
+ protectedFilePatterns: string[];
51
+ tools: Tools;
52
+ strategies: {
53
+ deduplication: Deduplication;
54
+ supersedeWrites: SupersedeWrites;
55
+ purgeErrors: PurgeErrors;
56
+ };
57
+ }
58
+ export declare function getConfig(ctx: PluginInput): PluginConfig;
59
+ //# 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;AAGtD,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,gBAAgB,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,YAAY;IACzB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,KAAK;IAClB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,WAAW,CAAA;IACpB,OAAO,EAAE,WAAW,CAAA;CACvB;AAED,MAAM,WAAW,QAAQ;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;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,YAAY;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,iBAAiB,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAA;IACjD;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAA;IAC3B,QAAQ,EAAE,QAAQ,CAAA;IAClB,cAAc,EAAE,cAAc,CAAA;IAC9B,qBAAqB,EAAE,MAAM,EAAE,CAAA;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,UAAU,EAAE;QACR,aAAa,EAAE,aAAa,CAAA;QAC5B,eAAe,EAAE,eAAe,CAAA;QAChC,WAAW,EAAE,WAAW,CAAA;KAC3B,CAAA;CACJ;AAqUD,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,CAmIxD"}