@tarquinen/opencode-dcp 1.1.2 → 1.1.3

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 (56) hide show
  1. package/README.md +2 -16
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +15 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/config.d.ts +0 -8
  6. package/dist/lib/config.d.ts.map +1 -1
  7. package/dist/lib/config.js +12 -87
  8. package/dist/lib/config.js.map +1 -1
  9. package/dist/lib/hooks.d.ts +0 -3
  10. package/dist/lib/hooks.d.ts.map +1 -1
  11. package/dist/lib/hooks.js +1 -24
  12. package/dist/lib/hooks.js.map +1 -1
  13. package/dist/lib/messages/index.d.ts +2 -1
  14. package/dist/lib/messages/index.d.ts.map +1 -1
  15. package/dist/lib/messages/index.js +2 -1
  16. package/dist/lib/messages/index.js.map +1 -1
  17. package/dist/lib/messages/inject.d.ts +5 -0
  18. package/dist/lib/messages/inject.d.ts.map +1 -0
  19. package/dist/lib/messages/inject.js +99 -0
  20. package/dist/lib/messages/inject.js.map +1 -0
  21. package/dist/lib/messages/prune.d.ts +0 -1
  22. package/dist/lib/messages/prune.d.ts.map +1 -1
  23. package/dist/lib/messages/prune.js +5 -98
  24. package/dist/lib/messages/prune.js.map +1 -1
  25. package/dist/lib/messages/utils.d.ts.map +1 -1
  26. package/dist/lib/messages/utils.js +13 -0
  27. package/dist/lib/messages/utils.js.map +1 -1
  28. package/dist/lib/prompts/index.d.ts +2 -0
  29. package/dist/lib/prompts/index.d.ts.map +1 -0
  30. package/dist/lib/prompts/index.js +13 -0
  31. package/dist/lib/prompts/index.js.map +1 -0
  32. package/dist/lib/state/state.d.ts.map +1 -1
  33. package/dist/lib/state/state.js +2 -0
  34. package/dist/lib/state/state.js.map +1 -1
  35. package/dist/lib/state/types.d.ts +1 -0
  36. package/dist/lib/state/types.d.ts.map +1 -1
  37. package/dist/lib/strategies/index.d.ts +0 -1
  38. package/dist/lib/strategies/index.d.ts.map +1 -1
  39. package/dist/lib/strategies/index.js +0 -1
  40. package/dist/lib/strategies/index.js.map +1 -1
  41. package/dist/lib/strategies/tools.js +1 -1
  42. package/dist/lib/strategies/tools.js.map +1 -1
  43. package/package.json +2 -5
  44. package/dist/lib/model-selector.d.ts +0 -17
  45. package/dist/lib/model-selector.d.ts.map +0 -1
  46. package/dist/lib/model-selector.js +0 -141
  47. package/dist/lib/model-selector.js.map +0 -1
  48. package/dist/lib/prompt.d.ts +0 -3
  49. package/dist/lib/prompt.d.ts.map +0 -1
  50. package/dist/lib/prompt.js +0 -128
  51. package/dist/lib/prompt.js.map +0 -1
  52. package/dist/lib/prompts/on-idle-analysis.txt +0 -30
  53. package/dist/lib/strategies/on-idle.d.ts +0 -14
  54. package/dist/lib/strategies/on-idle.d.ts.map +0 -1
  55. package/dist/lib/strategies/on-idle.js +0 -220
  56. package/dist/lib/strategies/on-idle.js.map +0 -1
@@ -1,128 +0,0 @@
1
- import { readFileSync } from "fs";
2
- import { join } from "path";
3
- export function loadPrompt(name, vars) {
4
- const filePath = join(__dirname, "prompts", `${name}.txt`);
5
- let content = readFileSync(filePath, "utf8").trim();
6
- if (vars) {
7
- for (const [key, value] of Object.entries(vars)) {
8
- content = content.replace(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value);
9
- }
10
- }
11
- return content;
12
- }
13
- function minimizeMessages(messages, alreadyPrunedIds, protectedToolCallIds) {
14
- const prunedIdsSet = alreadyPrunedIds
15
- ? new Set(alreadyPrunedIds.map((id) => id.toLowerCase()))
16
- : new Set();
17
- const protectedIdsSet = protectedToolCallIds
18
- ? new Set(protectedToolCallIds.map((id) => id.toLowerCase()))
19
- : new Set();
20
- return messages
21
- .map((msg) => {
22
- const minimized = {
23
- role: msg.info?.role,
24
- };
25
- if (msg.parts) {
26
- minimized.parts = msg.parts
27
- .filter((part) => {
28
- if (part.type === "step-start" || part.type === "step-finish") {
29
- return false;
30
- }
31
- return true;
32
- })
33
- .map((part) => {
34
- if (part.type === "text") {
35
- if (part.ignored) {
36
- return null;
37
- }
38
- return {
39
- type: "text",
40
- text: part.text,
41
- };
42
- }
43
- // TODO: This should use the opencode normalized system instead of per provider settings
44
- if (part.type === "reasoning") {
45
- // Calculate encrypted content size if present
46
- let encryptedContentLength = 0;
47
- if (part.metadata?.openai?.reasoningEncryptedContent) {
48
- encryptedContentLength =
49
- part.metadata.openai.reasoningEncryptedContent.length;
50
- }
51
- else if (part.metadata?.anthropic?.signature) {
52
- encryptedContentLength = part.metadata.anthropic.signature.length;
53
- }
54
- else if (part.metadata?.google?.thoughtSignature) {
55
- encryptedContentLength =
56
- part.metadata.google.thoughtSignature.length;
57
- }
58
- return {
59
- type: "reasoning",
60
- text: part.text,
61
- textLength: part.text?.length || 0,
62
- encryptedContentLength,
63
- ...(part.time && { time: part.time }),
64
- ...(part.metadata && { metadataKeys: Object.keys(part.metadata) }),
65
- };
66
- }
67
- if (part.type === "tool") {
68
- const callIDLower = part.callID?.toLowerCase();
69
- const isAlreadyPruned = prunedIdsSet.has(callIDLower);
70
- const isProtected = protectedIdsSet.has(callIDLower);
71
- let displayCallID = part.callID;
72
- if (isAlreadyPruned) {
73
- displayCallID = "<already-pruned>";
74
- }
75
- else if (isProtected) {
76
- displayCallID = "<protected>";
77
- }
78
- const toolPart = {
79
- type: "tool",
80
- toolCallID: displayCallID,
81
- tool: part.tool,
82
- };
83
- if (part.state?.output) {
84
- toolPart.output = part.state.output;
85
- }
86
- if (part.state?.input) {
87
- const input = part.state.input;
88
- if (input.filePath &&
89
- (part.tool === "write" ||
90
- part.tool === "edit" ||
91
- part.tool === "multiedit" ||
92
- part.tool === "patch")) {
93
- toolPart.input = input;
94
- }
95
- else if (input.filePath) {
96
- toolPart.input = { filePath: input.filePath };
97
- }
98
- else if (input.tool_calls && Array.isArray(input.tool_calls)) {
99
- toolPart.input = {
100
- batch_summary: `${input.tool_calls.length} tool calls`,
101
- tools: input.tool_calls.map((tc) => tc.tool),
102
- };
103
- }
104
- else {
105
- toolPart.input = input;
106
- }
107
- }
108
- return toolPart;
109
- }
110
- return null;
111
- })
112
- .filter(Boolean);
113
- }
114
- return minimized;
115
- })
116
- .filter((msg) => {
117
- return msg.parts && msg.parts.length > 0;
118
- });
119
- }
120
- export function buildAnalysisPrompt(unprunedToolCallIds, messages, alreadyPrunedIds, protectedToolCallIds) {
121
- const minimizedMessages = minimizeMessages(messages, alreadyPrunedIds, protectedToolCallIds);
122
- const messagesJson = JSON.stringify(minimizedMessages, null, 2).replace(/\\n/g, "\n");
123
- return loadPrompt("on-idle-analysis", {
124
- available_tool_call_ids: unprunedToolCallIds.join(", "),
125
- session_history: messagesJson,
126
- });
127
- }
128
- //# sourceMappingURL=prompt.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../lib/prompt.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- You are a conversation analyzer that identifies obsolete tool outputs in a coding session.
2
-
3
- Your task: Analyze the session history and identify tool call IDs whose outputs are NO LONGER RELEVANT to the current conversation context.
4
-
5
- Guidelines for identifying obsolete tool calls:
6
- 1. Exploratory reads that didn't lead to actual edits or meaningful discussion AND were not explicitly requested to be retained
7
- 2. Tool outputs from debugging/fixing an error that has now been resolved
8
- 3. Failed or incorrect tool attempts that were immediately corrected (e.g., reading a file from the wrong path, then reading from the correct path)
9
-
10
- DO NOT prune:
11
- - Tool calls whose outputs are actively being discussed
12
- - Tool calls that produced errors still being debugged
13
- - Tool calls that are the MOST RECENT activity in the conversation (these may be intended for future use)
14
-
15
- IMPORTANT: Available tool call IDs for analysis: {{available_tool_call_ids}}
16
-
17
- The session history below may contain tool calls with IDs not in the available list above, these cannot be pruned. These are either:
18
- 1. Protected tools (marked with toolCallID "<protected>")
19
- 2. Already-pruned tools (marked with toolCallID "<already-pruned>")
20
-
21
- ONLY return IDs from the available list above.
22
-
23
- Session history (each tool call has a "toolCallID" field):
24
- {{session_history}}
25
-
26
- You MUST respond with valid JSON matching this exact schema:
27
- {
28
- "pruned_tool_call_ids": ["id1", "id2", ...],
29
- "reasoning": "explanation of why these IDs were selected"
30
- }
@@ -1,14 +0,0 @@
1
- import type { SessionState } from "../state";
2
- import type { Logger } from "../logger";
3
- import type { PluginConfig } from "../config";
4
- export interface OnIdleResult {
5
- prunedCount: number;
6
- tokensSaved: number;
7
- prunedIds: string[];
8
- }
9
- /**
10
- * Run the onIdle pruning strategy.
11
- * This is called when the session transitions to idle state.
12
- */
13
- export declare function runOnIdle(client: any, state: SessionState, logger: Logger, config: PluginConfig, workingDirectory?: string): Promise<void | null>;
14
- //# sourceMappingURL=on-idle.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"on-idle.d.ts","sourceRoot":"","sources":["../../../lib/strategies/on-idle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,UAAU,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAQ7C,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,EAAE,CAAA;CACtB;AA6LD;;;GAGG;AACH,wBAAsB,SAAS,CAC3B,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,gBAAgB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAgHtB"}
@@ -1,220 +0,0 @@
1
- import { z } from "zod";
2
- import { buildAnalysisPrompt } from "../prompt";
3
- import { selectModel } from "../model-selector";
4
- import { saveSessionState } from "../state/persistence";
5
- import { sendUnifiedNotification } from "../ui/notification";
6
- import { calculateTokensSaved, getCurrentParams } from "./utils";
7
- import { isMessageCompacted } from "../shared-utils";
8
- /**
9
- * Parse messages to extract tool information.
10
- */
11
- function parseMessages(state, messages, toolParametersCache) {
12
- const toolCallIds = [];
13
- const toolMetadata = new Map();
14
- for (const msg of messages) {
15
- if (isMessageCompacted(state, msg)) {
16
- continue;
17
- }
18
- if (msg.parts) {
19
- for (const part of msg.parts) {
20
- if (part.type === "tool" && part.callID) {
21
- toolCallIds.push(part.callID);
22
- const cachedData = toolParametersCache.get(part.callID);
23
- const parameters = cachedData?.parameters ?? part.state?.input ?? {};
24
- toolMetadata.set(part.callID, {
25
- tool: part.tool,
26
- parameters: parameters,
27
- status: part.state?.status,
28
- error: part.state?.status === "error" ? part.state.error : undefined,
29
- turn: cachedData?.turn ?? 0,
30
- });
31
- }
32
- }
33
- }
34
- }
35
- return { toolCallIds, toolMetadata };
36
- }
37
- /**
38
- * Replace pruned tool outputs in messages for LLM analysis.
39
- */
40
- function replacePrunedToolOutputs(messages, prunedIds) {
41
- if (prunedIds.length === 0)
42
- return messages;
43
- const prunedIdsSet = new Set(prunedIds);
44
- return messages.map((msg) => {
45
- if (!msg.parts)
46
- return msg;
47
- return {
48
- ...msg,
49
- parts: msg.parts.map((part) => {
50
- if (part.type === "tool" &&
51
- part.callID &&
52
- prunedIdsSet.has(part.callID) &&
53
- part.state?.output) {
54
- return {
55
- ...part,
56
- state: {
57
- ...part.state,
58
- output: "[Output removed to save context - information superseded or no longer needed]",
59
- },
60
- };
61
- }
62
- return part;
63
- }),
64
- };
65
- });
66
- }
67
- /**
68
- * Run LLM analysis to determine which tool calls can be pruned.
69
- */
70
- async function runLlmAnalysis(client, state, logger, config, messages, unprunedToolCallIds, alreadyPrunedIds, toolMetadata, workingDirectory) {
71
- const protectedToolCallIds = [];
72
- const prunableToolCallIds = unprunedToolCallIds.filter((id) => {
73
- const metadata = toolMetadata.get(id);
74
- if (metadata && config.strategies.onIdle.protectedTools.includes(metadata.tool)) {
75
- protectedToolCallIds.push(id);
76
- return false;
77
- }
78
- return true;
79
- });
80
- if (prunableToolCallIds.length === 0) {
81
- return [];
82
- }
83
- // Get model info from messages
84
- let validModelInfo = undefined;
85
- if (messages.length > 0) {
86
- const lastMessage = messages[messages.length - 1];
87
- const model = lastMessage.info?.model;
88
- if (model?.providerID && model?.modelID) {
89
- validModelInfo = {
90
- providerID: model.providerID,
91
- modelID: model.modelID,
92
- };
93
- }
94
- }
95
- const modelSelection = await selectModel(validModelInfo, logger, config.strategies.onIdle.model, workingDirectory);
96
- logger.info(`OnIdle Model: ${modelSelection.modelInfo.providerID}/${modelSelection.modelInfo.modelID}`, {
97
- source: modelSelection.source,
98
- });
99
- if (modelSelection.failedModel && config.strategies.onIdle.showModelErrorToasts) {
100
- const skipAi = modelSelection.source === "fallback" && config.strategies.onIdle.strictModelSelection;
101
- try {
102
- await client.tui.showToast({
103
- body: {
104
- title: skipAi ? "DCP: AI analysis skipped" : "DCP: Model fallback",
105
- message: skipAi
106
- ? `${modelSelection.failedModel.providerID}/${modelSelection.failedModel.modelID} failed\nAI analysis skipped (strictModelSelection enabled)`
107
- : `${modelSelection.failedModel.providerID}/${modelSelection.failedModel.modelID} failed\nUsing ${modelSelection.modelInfo.providerID}/${modelSelection.modelInfo.modelID}`,
108
- variant: "info",
109
- duration: 5000,
110
- },
111
- });
112
- }
113
- catch {
114
- // Ignore toast errors
115
- }
116
- }
117
- if (modelSelection.source === "fallback" && config.strategies.onIdle.strictModelSelection) {
118
- logger.info("Skipping AI analysis (fallback model, strictModelSelection enabled)");
119
- return [];
120
- }
121
- const { generateObject } = await import("ai");
122
- const sanitizedMessages = replacePrunedToolOutputs(messages, alreadyPrunedIds);
123
- const analysisPrompt = buildAnalysisPrompt(prunableToolCallIds, sanitizedMessages, alreadyPrunedIds, protectedToolCallIds);
124
- const result = await generateObject({
125
- model: modelSelection.model,
126
- schema: z.object({
127
- pruned_tool_call_ids: z.array(z.string()),
128
- reasoning: z.string(),
129
- }),
130
- prompt: analysisPrompt,
131
- });
132
- const rawLlmPrunedIds = result.object.pruned_tool_call_ids;
133
- const llmPrunedIds = rawLlmPrunedIds.filter((id) => prunableToolCallIds.includes(id));
134
- // Always log LLM output as debug
135
- const reasoning = result.object.reasoning.replace(/\n+/g, " ").replace(/\s+/g, " ").trim();
136
- logger.debug(`OnIdle LLM output`, {
137
- pruned_tool_call_ids: rawLlmPrunedIds,
138
- reasoning: reasoning,
139
- });
140
- return llmPrunedIds;
141
- }
142
- /**
143
- * Run the onIdle pruning strategy.
144
- * This is called when the session transitions to idle state.
145
- */
146
- export async function runOnIdle(client, state, logger, config, workingDirectory) {
147
- try {
148
- if (!state.sessionId) {
149
- return null;
150
- }
151
- const sessionId = state.sessionId;
152
- // Fetch session info and messages
153
- const [sessionInfoResponse, messagesResponse] = await Promise.all([
154
- client.session.get({ path: { id: sessionId } }),
155
- client.session.messages({ path: { id: sessionId } }),
156
- ]);
157
- const sessionInfo = sessionInfoResponse.data;
158
- const messages = messagesResponse.data || messagesResponse;
159
- if (!messages || messages.length < 3) {
160
- return null;
161
- }
162
- const currentParams = getCurrentParams(messages, logger);
163
- const { toolCallIds, toolMetadata } = parseMessages(state, messages, state.toolParameters);
164
- const alreadyPrunedIds = state.prune.toolIds;
165
- const unprunedToolCallIds = toolCallIds.filter((id) => !alreadyPrunedIds.includes(id));
166
- if (unprunedToolCallIds.length === 0) {
167
- return null;
168
- }
169
- // Count prunable tools (excluding protected)
170
- const candidateCount = unprunedToolCallIds.filter((id) => {
171
- const metadata = toolMetadata.get(id);
172
- return !metadata || !config.strategies.onIdle.protectedTools.includes(metadata.tool);
173
- }).length;
174
- if (candidateCount === 0) {
175
- return null;
176
- }
177
- // Run LLM analysis
178
- const llmPrunedIds = await runLlmAnalysis(client, state, logger, config, messages, unprunedToolCallIds, alreadyPrunedIds, toolMetadata, workingDirectory);
179
- const newlyPrunedIds = llmPrunedIds.filter((id) => !alreadyPrunedIds.includes(id));
180
- if (newlyPrunedIds.length === 0) {
181
- return null;
182
- }
183
- // Log the tool IDs being pruned with their tool names
184
- for (const id of newlyPrunedIds) {
185
- const metadata = toolMetadata.get(id);
186
- const toolName = metadata?.tool || "unknown";
187
- logger.info(`OnIdle pruning tool: ${toolName}`, { callID: id });
188
- }
189
- // Update state
190
- const allPrunedIds = [...new Set([...alreadyPrunedIds, ...newlyPrunedIds])];
191
- state.prune.toolIds = allPrunedIds;
192
- state.stats.pruneTokenCounter += calculateTokensSaved(state, messages, newlyPrunedIds);
193
- // Build tool metadata map for notification
194
- const prunedToolMetadata = new Map();
195
- for (const id of newlyPrunedIds) {
196
- const metadata = toolMetadata.get(id);
197
- if (metadata) {
198
- prunedToolMetadata.set(id, metadata);
199
- }
200
- }
201
- // Send notification
202
- await sendUnifiedNotification(client, logger, config, state, sessionId, newlyPrunedIds, prunedToolMetadata, undefined, // reason
203
- currentParams, workingDirectory || "");
204
- state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
205
- state.stats.pruneTokenCounter = 0;
206
- state.nudgeCounter = 0;
207
- state.lastToolPrune = true;
208
- // Persist state
209
- const sessionName = sessionInfo?.title;
210
- saveSessionState(state, logger, sessionName).catch((err) => {
211
- logger.error("Failed to persist state", { error: err.message });
212
- });
213
- logger.info(`OnIdle: Pruned ${newlyPrunedIds.length}/${candidateCount} tools`);
214
- }
215
- catch (error) {
216
- logger.error("OnIdle analysis failed", { error: error.message });
217
- return null;
218
- }
219
- }
220
- //# sourceMappingURL=on-idle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"on-idle.js","sourceRoot":"","sources":["../../../lib/strategies/on-idle.ts"],"names":[],"mappings":"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"}