@tarquinen/opencode-dcp 0.3.30 → 0.4.0

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 (149) hide show
  1. package/README.md +10 -10
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +22 -8
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/api-formats/prunable-list.d.ts +49 -0
  6. package/dist/lib/api-formats/prunable-list.d.ts.map +1 -0
  7. package/dist/lib/api-formats/prunable-list.js +112 -0
  8. package/dist/lib/api-formats/prunable-list.js.map +1 -0
  9. package/dist/lib/api-formats/synth-instruction.d.ts +29 -0
  10. package/dist/lib/api-formats/synth-instruction.d.ts.map +1 -0
  11. package/dist/lib/api-formats/synth-instruction.js +171 -0
  12. package/dist/lib/api-formats/synth-instruction.js.map +1 -0
  13. package/dist/lib/config.d.ts +1 -0
  14. package/dist/lib/config.d.ts.map +1 -1
  15. package/dist/lib/config.js +13 -7
  16. package/dist/lib/config.js.map +1 -1
  17. package/dist/lib/core/janitor.d.ts +60 -0
  18. package/dist/lib/core/janitor.d.ts.map +1 -0
  19. package/dist/lib/core/janitor.js +301 -0
  20. package/dist/lib/core/janitor.js.map +1 -0
  21. package/dist/lib/core/prompt.d.ts.map +1 -0
  22. package/dist/lib/{prompt.js → core/prompt.js} +1 -1
  23. package/dist/lib/core/prompt.js.map +1 -0
  24. package/dist/lib/core/strategies/deduplication.d.ts +7 -0
  25. package/dist/lib/core/strategies/deduplication.d.ts.map +1 -0
  26. package/dist/lib/core/strategies/deduplication.js +76 -0
  27. package/dist/lib/core/strategies/deduplication.js.map +1 -0
  28. package/dist/lib/core/strategies/index.d.ts +21 -0
  29. package/dist/lib/core/strategies/index.d.ts.map +1 -0
  30. package/dist/lib/core/strategies/index.js +48 -0
  31. package/dist/lib/core/strategies/index.js.map +1 -0
  32. package/dist/lib/core/strategies/types.d.ts +35 -0
  33. package/dist/lib/core/strategies/types.d.ts.map +1 -0
  34. package/dist/lib/core/strategies/types.js +6 -0
  35. package/dist/lib/core/strategies/types.js.map +1 -0
  36. package/dist/lib/fetch-wrapper/formats/bedrock.d.ts +14 -0
  37. package/dist/lib/fetch-wrapper/formats/bedrock.d.ts.map +1 -0
  38. package/dist/lib/fetch-wrapper/formats/bedrock.js +128 -0
  39. package/dist/lib/fetch-wrapper/formats/bedrock.js.map +1 -0
  40. package/dist/lib/fetch-wrapper/formats/gemini.d.ts +14 -0
  41. package/dist/lib/fetch-wrapper/formats/gemini.d.ts.map +1 -0
  42. package/dist/lib/fetch-wrapper/formats/gemini.js +138 -0
  43. package/dist/lib/fetch-wrapper/formats/gemini.js.map +1 -0
  44. package/dist/lib/fetch-wrapper/formats/index.d.ts +5 -0
  45. package/dist/lib/fetch-wrapper/formats/index.d.ts.map +1 -0
  46. package/dist/lib/fetch-wrapper/formats/index.js +5 -0
  47. package/dist/lib/fetch-wrapper/formats/index.js.map +1 -0
  48. package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts +14 -0
  49. package/dist/lib/fetch-wrapper/formats/openai-chat.d.ts.map +1 -0
  50. package/dist/lib/fetch-wrapper/formats/openai-chat.js +106 -0
  51. package/dist/lib/fetch-wrapper/formats/openai-chat.js.map +1 -0
  52. package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts +11 -0
  53. package/dist/lib/fetch-wrapper/formats/openai-responses.d.ts.map +1 -0
  54. package/dist/lib/fetch-wrapper/formats/openai-responses.js +69 -0
  55. package/dist/lib/fetch-wrapper/formats/openai-responses.js.map +1 -0
  56. package/dist/lib/fetch-wrapper/gc-tracker.d.ts +4 -0
  57. package/dist/lib/fetch-wrapper/gc-tracker.d.ts.map +1 -0
  58. package/dist/lib/fetch-wrapper/gc-tracker.js +61 -0
  59. package/dist/lib/fetch-wrapper/gc-tracker.js.map +1 -0
  60. package/dist/lib/fetch-wrapper/handler.d.ts +13 -0
  61. package/dist/lib/fetch-wrapper/handler.d.ts.map +1 -0
  62. package/dist/lib/fetch-wrapper/handler.js +85 -0
  63. package/dist/lib/fetch-wrapper/handler.js.map +1 -0
  64. package/dist/lib/fetch-wrapper/index.d.ts +3 -2
  65. package/dist/lib/fetch-wrapper/index.d.ts.map +1 -1
  66. package/dist/lib/fetch-wrapper/index.js +41 -15
  67. package/dist/lib/fetch-wrapper/index.js.map +1 -1
  68. package/dist/lib/fetch-wrapper/types.d.ts +36 -1
  69. package/dist/lib/fetch-wrapper/types.d.ts.map +1 -1
  70. package/dist/lib/fetch-wrapper/types.js +7 -1
  71. package/dist/lib/fetch-wrapper/types.js.map +1 -1
  72. package/dist/lib/hooks.d.ts +3 -3
  73. package/dist/lib/hooks.d.ts.map +1 -1
  74. package/dist/lib/hooks.js +25 -15
  75. package/dist/lib/hooks.js.map +1 -1
  76. package/dist/lib/prompts/tool.txt +18 -5
  77. package/dist/lib/pruning-tool.d.ts +14 -6
  78. package/dist/lib/pruning-tool.d.ts.map +1 -1
  79. package/dist/lib/pruning-tool.js +121 -19
  80. package/dist/lib/pruning-tool.js.map +1 -1
  81. package/dist/lib/state/id-mapping.d.ts +26 -0
  82. package/dist/lib/state/id-mapping.d.ts.map +1 -0
  83. package/dist/lib/state/id-mapping.js +54 -0
  84. package/dist/lib/state/id-mapping.js.map +1 -0
  85. package/dist/lib/state/index.d.ts +25 -0
  86. package/dist/lib/state/index.d.ts.map +1 -0
  87. package/dist/lib/{state.js → state/index.js} +10 -6
  88. package/dist/lib/state/index.js.map +1 -0
  89. package/dist/lib/{state-persistence.d.ts → state/persistence.d.ts} +3 -3
  90. package/dist/lib/state/persistence.d.ts.map +1 -0
  91. package/dist/lib/{state-persistence.js → state/persistence.js} +1 -1
  92. package/dist/lib/state/persistence.js.map +1 -0
  93. package/dist/lib/state/tool-cache.d.ts +22 -0
  94. package/dist/lib/state/tool-cache.d.ts.map +1 -0
  95. package/dist/lib/state/tool-cache.js +102 -0
  96. package/dist/lib/state/tool-cache.js.map +1 -0
  97. package/dist/lib/tokenizer.js +2 -2
  98. package/dist/lib/tokenizer.js.map +1 -1
  99. package/dist/lib/ui/display-utils.d.ts.map +1 -0
  100. package/dist/lib/{display-utils.js → ui/display-utils.js} +0 -3
  101. package/dist/lib/ui/display-utils.js.map +1 -0
  102. package/dist/lib/ui/notification.d.ts +32 -0
  103. package/dist/lib/ui/notification.d.ts.map +1 -0
  104. package/dist/lib/ui/notification.js +180 -0
  105. package/dist/lib/ui/notification.js.map +1 -0
  106. package/dist/lib/version-checker.d.ts +1 -1
  107. package/dist/lib/version-checker.d.ts.map +1 -1
  108. package/dist/lib/version-checker.js +4 -1
  109. package/dist/lib/version-checker.js.map +1 -1
  110. package/package.json +6 -6
  111. package/dist/lib/deduplicator.d.ts +0 -16
  112. package/dist/lib/deduplicator.d.ts.map +0 -1
  113. package/dist/lib/deduplicator.js +0 -68
  114. package/dist/lib/deduplicator.js.map +0 -1
  115. package/dist/lib/display-utils.d.ts.map +0 -1
  116. package/dist/lib/display-utils.js.map +0 -1
  117. package/dist/lib/fetch-wrapper/gemini.d.ts +0 -7
  118. package/dist/lib/fetch-wrapper/gemini.d.ts.map +0 -1
  119. package/dist/lib/fetch-wrapper/gemini.js +0 -120
  120. package/dist/lib/fetch-wrapper/gemini.js.map +0 -1
  121. package/dist/lib/fetch-wrapper/openai-chat.d.ts +0 -7
  122. package/dist/lib/fetch-wrapper/openai-chat.d.ts.map +0 -1
  123. package/dist/lib/fetch-wrapper/openai-chat.js +0 -101
  124. package/dist/lib/fetch-wrapper/openai-chat.js.map +0 -1
  125. package/dist/lib/fetch-wrapper/openai-responses.d.ts +0 -7
  126. package/dist/lib/fetch-wrapper/openai-responses.d.ts.map +0 -1
  127. package/dist/lib/fetch-wrapper/openai-responses.js +0 -74
  128. package/dist/lib/fetch-wrapper/openai-responses.js.map +0 -1
  129. package/dist/lib/janitor.d.ts +0 -57
  130. package/dist/lib/janitor.d.ts.map +0 -1
  131. package/dist/lib/janitor.js +0 -547
  132. package/dist/lib/janitor.js.map +0 -1
  133. package/dist/lib/prompt.d.ts.map +0 -1
  134. package/dist/lib/prompt.js.map +0 -1
  135. package/dist/lib/state-persistence.d.ts.map +0 -1
  136. package/dist/lib/state-persistence.js.map +0 -1
  137. package/dist/lib/state.d.ts +0 -43
  138. package/dist/lib/state.d.ts.map +0 -1
  139. package/dist/lib/state.js.map +0 -1
  140. package/dist/lib/synth-instruction.d.ts +0 -16
  141. package/dist/lib/synth-instruction.d.ts.map +0 -1
  142. package/dist/lib/synth-instruction.js +0 -209
  143. package/dist/lib/synth-instruction.js.map +0 -1
  144. package/dist/lib/tool-cache.d.ts +0 -12
  145. package/dist/lib/tool-cache.d.ts.map +0 -1
  146. package/dist/lib/tool-cache.js +0 -52
  147. package/dist/lib/tool-cache.js.map +0 -1
  148. /package/dist/lib/{prompt.d.ts → core/prompt.d.ts} +0 -0
  149. /package/dist/lib/{display-utils.d.ts → ui/display-utils.d.ts} +0 -0
@@ -1,12 +1,20 @@
1
1
  import { tool } from "@opencode-ai/plugin";
2
- import type { Janitor } from "./janitor";
2
+ import type { PluginState } from "./state";
3
3
  import type { PluginConfig } from "./config";
4
- import type { ToolTracker } from "./synth-instruction";
5
- /** Tool description for the prune tool, loaded from prompts/tool.txt */
6
- export declare const CONTEXT_PRUNING_DESCRIPTION: string;
4
+ import type { ToolTracker } from "./api-formats/synth-instruction";
5
+ import { type NotificationContext } from "./ui/notification";
6
+ import type { Logger } from "./logger";
7
+ export interface PruneToolContext {
8
+ client: any;
9
+ state: PluginState;
10
+ logger: Logger;
11
+ config: PluginConfig;
12
+ notificationCtx: NotificationContext;
13
+ workingDirectory?: string;
14
+ }
7
15
  /**
8
16
  * Creates the prune tool definition.
9
- * Returns a tool definition that can be passed to the plugin's tool registry.
17
+ * Accepts numeric IDs from the <prunable-tools> list and prunes those tool outputs.
10
18
  */
11
- export declare function createPruningTool(client: any, janitor: Janitor, config: PluginConfig, toolTracker: ToolTracker): ReturnType<typeof tool>;
19
+ export declare function createPruningTool(ctx: PruneToolContext, toolTracker: ToolTracker): ReturnType<typeof tool>;
12
20
  //# sourceMappingURL=pruning-tool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pruning-tool.d.ts","sourceRoot":"","sources":["../../lib/pruning-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAKtD,wEAAwE;AACxE,eAAO,MAAM,2BAA2B,QAAqB,CAAA;AAE7D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAsCxI"}
1
+ {"version":3,"file":"pruning-tool.d.ts","sourceRoot":"","sources":["../../lib/pruning-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAIlE,OAAO,EAAuD,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAGjH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAQtC,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,GAAG,CAAA;IACX,KAAK,EAAE,WAAW,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,eAAe,EAAE,mBAAmB,CAAA;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,GAAG,EAAE,gBAAgB,EACrB,WAAW,EAAE,WAAW,GACzB,UAAU,CAAC,OAAO,IAAI,CAAC,CA8FzB"}
@@ -1,38 +1,140 @@
1
1
  import { tool } from "@opencode-ai/plugin";
2
- import { resetToolTrackerCount } from "./synth-instruction";
3
- import { loadPrompt } from "./prompt";
2
+ import { resetToolTrackerCount } from "./api-formats/synth-instruction";
4
3
  import { isSubagentSession } from "./hooks";
5
- /** Tool description for the prune tool, loaded from prompts/tool.txt */
6
- export const CONTEXT_PRUNING_DESCRIPTION = loadPrompt("tool");
4
+ import { getActualId } from "./state/id-mapping";
5
+ import { formatPruningResultForTool, sendUnifiedNotification } from "./ui/notification";
6
+ import { ensureSessionRestored } from "./state";
7
+ import { saveSessionState } from "./state/persistence";
8
+ import { estimateTokensBatch } from "./tokenizer";
9
+ import { loadPrompt } from "./core/prompt";
10
+ /** Tool description loaded from prompts/tool.txt */
11
+ const TOOL_DESCRIPTION = loadPrompt("tool");
7
12
  /**
8
13
  * Creates the prune tool definition.
9
- * Returns a tool definition that can be passed to the plugin's tool registry.
14
+ * Accepts numeric IDs from the <prunable-tools> list and prunes those tool outputs.
10
15
  */
11
- export function createPruningTool(client, janitor, config, toolTracker) {
16
+ export function createPruningTool(ctx, toolTracker) {
12
17
  return tool({
13
- description: CONTEXT_PRUNING_DESCRIPTION,
18
+ description: TOOL_DESCRIPTION,
14
19
  args: {
15
- reason: tool.schema.string().optional().describe("Brief reason for triggering pruning (e.g., 'task complete', 'switching focus')"),
20
+ ids: tool.schema.array(tool.schema.number()).describe("Array of numeric IDs to prune from the <prunable-tools> list"),
16
21
  },
17
- async execute(args, ctx) {
18
- // Skip pruning in subagent sessions, but guide the model to continue its work
19
- // TODO: remove this workaround when PR 4913 is merged (primary_tools config)
20
- if (await isSubagentSession(client, ctx.sessionID)) {
22
+ async execute(args, toolCtx) {
23
+ const { client, state, logger, config, notificationCtx, workingDirectory } = ctx;
24
+ const sessionId = toolCtx.sessionID;
25
+ if (await isSubagentSession(client, sessionId)) {
21
26
  return "Pruning is unavailable in subagent sessions. Do not call this tool again. Continue with your current task - if you were in the middle of work, proceed with your next step. If you had just finished, provide your final summary/findings to return to the main agent.";
22
27
  }
23
- const result = await janitor.runForTool(ctx.sessionID, config.strategies.onTool, args.reason);
24
- // Skip next idle pruning since we just pruned
28
+ if (!args.ids || args.ids.length === 0) {
29
+ return "No IDs provided. Check the <prunable-tools> list for available IDs to prune.";
30
+ }
31
+ await ensureSessionRestored(state, sessionId, logger);
32
+ const prunedIds = args.ids
33
+ .map(numId => getActualId(sessionId, numId))
34
+ .filter((id) => id !== undefined);
35
+ if (prunedIds.length === 0) {
36
+ return "None of the provided IDs were valid. Check the <prunable-tools> list for available IDs.";
37
+ }
38
+ const tokensSaved = await calculateTokensSaved(client, sessionId, prunedIds);
39
+ const currentStats = state.stats.get(sessionId) ?? {
40
+ totalToolsPruned: 0,
41
+ totalTokensSaved: 0,
42
+ totalGCTokens: 0,
43
+ totalGCTools: 0
44
+ };
45
+ const sessionStats = {
46
+ ...currentStats,
47
+ totalToolsPruned: currentStats.totalToolsPruned + prunedIds.length,
48
+ totalTokensSaved: currentStats.totalTokensSaved + tokensSaved
49
+ };
50
+ state.stats.set(sessionId, sessionStats);
51
+ const alreadyPrunedIds = state.prunedIds.get(sessionId) ?? [];
52
+ const allPrunedIds = [...alreadyPrunedIds, ...prunedIds];
53
+ state.prunedIds.set(sessionId, allPrunedIds);
54
+ saveSessionState(sessionId, new Set(allPrunedIds), sessionStats, logger)
55
+ .catch(err => logger.error("prune-tool", "Failed to persist state", { error: err.message }));
56
+ const toolMetadata = new Map();
57
+ for (const id of prunedIds) {
58
+ const meta = state.toolParameters.get(id.toLowerCase());
59
+ if (meta) {
60
+ toolMetadata.set(id.toLowerCase(), meta);
61
+ }
62
+ else {
63
+ logger.debug("prune-tool", "No metadata found for ID", {
64
+ id,
65
+ idLower: id.toLowerCase(),
66
+ hasLower: state.toolParameters.has(id.toLowerCase())
67
+ });
68
+ }
69
+ }
70
+ await sendUnifiedNotification(notificationCtx, sessionId, {
71
+ aiPrunedCount: prunedIds.length,
72
+ aiTokensSaved: tokensSaved,
73
+ aiPrunedIds: prunedIds,
74
+ toolMetadata,
75
+ gcPending: null,
76
+ sessionStats
77
+ });
25
78
  toolTracker.skipNextIdle = true;
26
- // Reset nudge counter to prevent immediate re-nudging after pruning
27
79
  if (config.nudge_freq > 0) {
28
80
  resetToolTrackerCount(toolTracker);
29
81
  }
82
+ const result = {
83
+ prunedCount: prunedIds.length,
84
+ tokensSaved,
85
+ llmPrunedIds: prunedIds,
86
+ toolMetadata,
87
+ sessionStats
88
+ };
30
89
  const postPruneGuidance = "\n\nYou have already distilled relevant understanding in writing before calling this tool. Do not re-narrate; continue with your next task.";
31
- if (!result || result.prunedCount === 0) {
32
- return "No prunable tool outputs found. Context is already optimized." + postPruneGuidance;
33
- }
34
- return janitor.formatPruningResultForTool(result) + postPruneGuidance;
90
+ return formatPruningResultForTool(result, workingDirectory) + postPruneGuidance;
35
91
  },
36
92
  });
37
93
  }
94
+ /**
95
+ * Calculates approximate tokens saved by pruning the given tool call IDs.
96
+ */
97
+ async function calculateTokensSaved(client, sessionId, prunedIds) {
98
+ try {
99
+ const messagesResponse = await client.session.messages({
100
+ path: { id: sessionId },
101
+ query: { limit: 200 }
102
+ });
103
+ const messages = messagesResponse.data || messagesResponse;
104
+ const toolOutputs = new Map();
105
+ for (const msg of messages) {
106
+ if (msg.role === 'tool' && msg.tool_call_id) {
107
+ const content = typeof msg.content === 'string'
108
+ ? msg.content
109
+ : JSON.stringify(msg.content);
110
+ toolOutputs.set(msg.tool_call_id.toLowerCase(), content);
111
+ }
112
+ if (msg.role === 'user' && Array.isArray(msg.content)) {
113
+ for (const part of msg.content) {
114
+ if (part.type === 'tool_result' && part.tool_use_id) {
115
+ const content = typeof part.content === 'string'
116
+ ? part.content
117
+ : JSON.stringify(part.content);
118
+ toolOutputs.set(part.tool_use_id.toLowerCase(), content);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ const contents = [];
124
+ for (const id of prunedIds) {
125
+ const content = toolOutputs.get(id.toLowerCase());
126
+ if (content) {
127
+ contents.push(content);
128
+ }
129
+ }
130
+ if (contents.length === 0) {
131
+ return prunedIds.length * 500;
132
+ }
133
+ const tokenCounts = await estimateTokensBatch(contents);
134
+ return tokenCounts.reduce((sum, count) => sum + count, 0);
135
+ }
136
+ catch (error) {
137
+ return prunedIds.length * 500;
138
+ }
139
+ }
38
140
  //# sourceMappingURL=pruning-tool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pruning-tool.js","sourceRoot":"","sources":["../../lib/pruning-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAI1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE3C,wEAAwE;AACxE,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;AAE7D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAW,EAAE,OAAgB,EAAE,MAAoB,EAAE,WAAwB;IAC3G,OAAO,IAAI,CAAC;QACR,WAAW,EAAE,2BAA2B;QACxC,IAAI,EAAE;YACF,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC5C,gFAAgF,CACnF;SACJ;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACnB,8EAA8E;YAC9E,6EAA6E;YAC7E,IAAI,MAAM,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjD,OAAO,wQAAwQ,CAAA;YACnR,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CACnC,GAAG,CAAC,SAAS,EACb,MAAM,CAAC,UAAU,CAAC,MAAM,EACxB,IAAI,CAAC,MAAM,CACd,CAAA;YAED,8CAA8C;YAC9C,WAAW,CAAC,YAAY,GAAG,IAAI,CAAA;YAE/B,oEAAoE;YACpE,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBACxB,qBAAqB,CAAC,WAAW,CAAC,CAAA;YACtC,CAAC;YAED,MAAM,iBAAiB,GAAG,6IAA6I,CAAA;YAEvK,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtC,OAAO,+DAA+D,GAAG,iBAAiB,CAAA;YAC9F,CAAC;YAED,OAAO,OAAO,CAAC,0BAA0B,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAA;QACzE,CAAC;KACJ,CAAC,CAAA;AACN,CAAC"}
1
+ {"version":3,"file":"pruning-tool.js","sourceRoot":"","sources":["../../lib/pruning-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAI1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAA4B,MAAM,mBAAmB,CAAA;AACjH,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,oDAAoD;AACpD,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;AAW3C;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC7B,GAAqB,EACrB,WAAwB;IAExB,OAAO,IAAI,CAAC;QACR,WAAW,EAAE,gBAAgB;QAC7B,IAAI,EAAE;YACF,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CACjD,8DAA8D,CACjE;SACJ;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO;YACvB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAA;YAChF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;YAEnC,IAAI,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC7C,OAAO,wQAAwQ,CAAA;YACnR,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,OAAO,8EAA8E,CAAA;YACzF,CAAC;YAED,MAAM,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;YAErD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG;iBACrB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;iBAC3C,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;YAEnD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,yFAAyF,CAAA;YACpG,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;YAE5E,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;gBAC/C,gBAAgB,EAAE,CAAC;gBACnB,gBAAgB,EAAE,CAAC;gBACnB,aAAa,EAAE,CAAC;gBAChB,YAAY,EAAE,CAAC;aAClB,CAAA;YACD,MAAM,YAAY,GAAiB;gBAC/B,GAAG,YAAY;gBACf,gBAAgB,EAAE,YAAY,CAAC,gBAAgB,GAAG,SAAS,CAAC,MAAM;gBAClE,gBAAgB,EAAE,YAAY,CAAC,gBAAgB,GAAG,WAAW;aAChE,CAAA;YACD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;YAExC,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;YAC7D,MAAM,YAAY,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,SAAS,CAAC,CAAA;YACxD,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;YAE5C,gBAAgB,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC;iBACnE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,yBAAyB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;YAEhG,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8C,CAAA;YAC1E,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;gBACvD,IAAI,IAAI,EAAE,CAAC;oBACP,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAA;gBAC5C,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,0BAA0B,EAAE;wBACnD,EAAE;wBACF,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE;wBACzB,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;qBACvD,CAAC,CAAA;gBACN,CAAC;YACL,CAAC;YAED,MAAM,uBAAuB,CAAC,eAAe,EAAE,SAAS,EAAE;gBACtD,aAAa,EAAE,SAAS,CAAC,MAAM;gBAC/B,aAAa,EAAE,WAAW;gBAC1B,WAAW,EAAE,SAAS;gBACtB,YAAY;gBACZ,SAAS,EAAE,IAAI;gBACf,YAAY;aACf,CAAC,CAAA;YAEF,WAAW,CAAC,YAAY,GAAG,IAAI,CAAA;YAE/B,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBACxB,qBAAqB,CAAC,WAAW,CAAC,CAAA;YACtC,CAAC;YAED,MAAM,MAAM,GAAG;gBACX,WAAW,EAAE,SAAS,CAAC,MAAM;gBAC7B,WAAW;gBACX,YAAY,EAAE,SAAS;gBACvB,YAAY;gBACZ,YAAY;aACf,CAAA;YAED,MAAM,iBAAiB,GAAG,6IAA6I,CAAA;YAEvK,OAAO,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,iBAAiB,CAAA;QACnF,CAAC;KACJ,CAAC,CAAA;AACN,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CAC/B,MAAW,EACX,SAAiB,EACjB,SAAmB;IAEnB,IAAI,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnD,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;YACvB,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACxB,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,IAAI,gBAAgB,CAAA;QAE1D,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAA;QAC7C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC1C,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;oBAC3C,CAAC,CAAC,GAAG,CAAC,OAAO;oBACb,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBACjC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAA;YAC5D,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAC7B,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBAClD,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;4BAC5C,CAAC,CAAC,IAAI,CAAC,OAAO;4BACd,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;wBAClC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAA;oBAC5D,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;YACjD,IAAI,OAAO,EAAE,CAAC;gBACV,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC1B,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC,MAAM,GAAG,GAAG,CAAA;QACjC,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAA;QACvD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAA;IAC7D,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC,MAAM,GAAG,GAAG,CAAA;IACjC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Numeric ID mapping system for tool call IDs.
3
+ *
4
+ * Maps simple incrementing numbers (1, 2, 3...) to actual provider tool call IDs
5
+ * (e.g., "call_abc123xyz..."). This allows the session AI to reference tools by
6
+ * simple numbers when using the prune tool.
7
+ *
8
+ * Design decisions:
9
+ * - IDs are monotonically increasing and never reused (avoids race conditions)
10
+ * - Mappings are rebuilt from session messages on restore (single source of truth)
11
+ * - Per-session mappings to isolate sessions from each other
12
+ */
13
+ export interface IdMapping {
14
+ numericToActual: Map<number, string>;
15
+ actualToNumeric: Map<string, number>;
16
+ nextId: number;
17
+ }
18
+ /**
19
+ * Assigns a numeric ID to a tool call ID if it doesn't already have one.
20
+ * Returns the numeric ID (existing or newly assigned).
21
+ */
22
+ export declare function getOrCreateNumericId(sessionId: string, actualId: string): number;
23
+ export declare function getActualId(sessionId: string, numericId: number): string | undefined;
24
+ export declare function clearSessionMapping(sessionId: string): void;
25
+ export declare function clearAllMappings(): void;
26
+ //# sourceMappingURL=id-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-mapping.d.ts","sourceRoot":"","sources":["../../../lib/state/id-mapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,SAAS;IACtB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;CACjB;AAkBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAehF;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGpF;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE3D;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Numeric ID mapping system for tool call IDs.
3
+ *
4
+ * Maps simple incrementing numbers (1, 2, 3...) to actual provider tool call IDs
5
+ * (e.g., "call_abc123xyz..."). This allows the session AI to reference tools by
6
+ * simple numbers when using the prune tool.
7
+ *
8
+ * Design decisions:
9
+ * - IDs are monotonically increasing and never reused (avoids race conditions)
10
+ * - Mappings are rebuilt from session messages on restore (single source of truth)
11
+ * - Per-session mappings to isolate sessions from each other
12
+ */
13
+ /** Per-session ID mappings */
14
+ const sessionMappings = new Map();
15
+ function getSessionMapping(sessionId) {
16
+ let mapping = sessionMappings.get(sessionId);
17
+ if (!mapping) {
18
+ mapping = {
19
+ numericToActual: new Map(),
20
+ actualToNumeric: new Map(),
21
+ nextId: 1
22
+ };
23
+ sessionMappings.set(sessionId, mapping);
24
+ }
25
+ return mapping;
26
+ }
27
+ /**
28
+ * Assigns a numeric ID to a tool call ID if it doesn't already have one.
29
+ * Returns the numeric ID (existing or newly assigned).
30
+ */
31
+ export function getOrCreateNumericId(sessionId, actualId) {
32
+ const mapping = getSessionMapping(sessionId);
33
+ // Check if already mapped
34
+ const existing = mapping.actualToNumeric.get(actualId);
35
+ if (existing !== undefined) {
36
+ return existing;
37
+ }
38
+ // Assign new ID
39
+ const numericId = mapping.nextId++;
40
+ mapping.numericToActual.set(numericId, actualId);
41
+ mapping.actualToNumeric.set(actualId, numericId);
42
+ return numericId;
43
+ }
44
+ export function getActualId(sessionId, numericId) {
45
+ const mapping = sessionMappings.get(sessionId);
46
+ return mapping?.numericToActual.get(numericId);
47
+ }
48
+ export function clearSessionMapping(sessionId) {
49
+ sessionMappings.delete(sessionId);
50
+ }
51
+ export function clearAllMappings() {
52
+ sessionMappings.clear();
53
+ }
54
+ //# sourceMappingURL=id-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-mapping.js","sourceRoot":"","sources":["../../../lib/state/id-mapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,8BAA8B;AAC9B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAqB,CAAA;AAEpD,SAAS,iBAAiB,CAAC,SAAiB;IACxC,IAAI,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,GAAG;YACN,eAAe,EAAE,IAAI,GAAG,EAAE;YAC1B,eAAe,EAAE,IAAI,GAAG,EAAE;YAC1B,MAAM,EAAE,CAAC;SACZ,CAAA;QACD,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,OAAO,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,QAAgB;IACpE,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAA;IAE5C,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACtD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAA;IACnB,CAAC;IAED,gBAAgB;IAChB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;IAClC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAChD,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAEhD,OAAO,SAAS,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,SAAiB;IAC5D,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC9C,OAAO,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACjD,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC5B,eAAe,CAAC,KAAK,EAAE,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { SessionStats, GCStats } from "../core/janitor";
2
+ import type { Logger } from "../logger";
3
+ export interface PluginState {
4
+ prunedIds: Map<string, string[]>;
5
+ stats: Map<string, SessionStats>;
6
+ gcPending: Map<string, GCStats>;
7
+ toolParameters: Map<string, ToolParameterEntry>;
8
+ model: Map<string, ModelInfo>;
9
+ googleToolCallMapping: Map<string, Map<string, string>>;
10
+ restoredSessions: Set<string>;
11
+ checkedSessions: Set<string>;
12
+ subagentSessions: Set<string>;
13
+ lastSeenSessionId: string | null;
14
+ }
15
+ export interface ToolParameterEntry {
16
+ tool: string;
17
+ parameters: any;
18
+ }
19
+ export interface ModelInfo {
20
+ providerID: string;
21
+ modelID: string;
22
+ }
23
+ export declare function createPluginState(): PluginState;
24
+ export declare function ensureSessionRestored(state: PluginState, sessionId: string, logger?: Logger): Promise<void>;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAGvC,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAChC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IAChC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAC/C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC7B,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACvD,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACnC;AAED,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,GAAG,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAa/C;AAED,wBAAsB,qBAAqB,CACvC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -1,11 +1,9 @@
1
- import { loadSessionState } from "./state-persistence";
2
- /**
3
- * Creates a fresh plugin state instance.
4
- */
1
+ import { loadSessionState } from "./persistence";
5
2
  export function createPluginState() {
6
3
  return {
7
4
  prunedIds: new Map(),
8
5
  stats: new Map(),
6
+ gcPending: new Map(),
9
7
  toolParameters: new Map(),
10
8
  model: new Map(),
11
9
  googleToolCallMapping: new Map(),
@@ -30,8 +28,14 @@ export async function ensureSessionRestored(state, sessionId, logger) {
30
28
  });
31
29
  }
32
30
  if (!state.stats.has(sessionId)) {
33
- state.stats.set(sessionId, persisted.stats);
31
+ const stats = {
32
+ totalToolsPruned: persisted.stats.totalToolsPruned,
33
+ totalTokensSaved: persisted.stats.totalTokensSaved,
34
+ totalGCTokens: persisted.stats.totalGCTokens ?? 0,
35
+ totalGCTools: persisted.stats.totalGCTools ?? 0
36
+ };
37
+ state.stats.set(sessionId, stats);
34
38
  }
35
39
  }
36
40
  }
37
- //# sourceMappingURL=state.js.map
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/state/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAyBhD,MAAM,UAAU,iBAAiB;IAC7B,OAAO;QACH,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,cAAc,EAAE,IAAI,GAAG,EAAE;QACzB,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,qBAAqB,EAAE,IAAI,GAAG,EAAE;QAChC,gBAAgB,EAAE,IAAI,GAAG,EAAE;QAC3B,eAAe,EAAE,IAAI,GAAG,EAAE;QAC1B,gBAAgB,EAAE,IAAI,GAAG,EAAE;QAC3B,iBAAiB,EAAE,IAAI;KAC1B,CAAA;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,KAAkB,EAClB,SAAiB,EACjB,MAAe;IAEf,IAAI,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,OAAM;IACV,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAErC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAC3D,IAAI,SAAS,EAAE,CAAC;QACZ,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;YACnD,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,8BAA8B,EAAE;gBACpD,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM;aACpC,CAAC,CAAA;QACN,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAiB;gBACxB,gBAAgB,EAAE,SAAS,CAAC,KAAK,CAAC,gBAAgB;gBAClD,gBAAgB,EAAE,SAAS,CAAC,KAAK,CAAC,gBAAgB;gBAClD,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC;gBACjD,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC;aAClD,CAAA;YACD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;IACL,CAAC;AACL,CAAC"}
@@ -3,8 +3,8 @@
3
3
  * Persists pruned tool IDs across sessions so they survive OpenCode restarts.
4
4
  * Storage location: ~/.local/share/opencode/storage/plugin/dcp/{sessionId}.json
5
5
  */
6
- import type { SessionStats } from "./janitor";
7
- import type { Logger } from "./logger";
6
+ import type { SessionStats } from "../core/janitor";
7
+ import type { Logger } from "../logger";
8
8
  export interface PersistedSessionState {
9
9
  sessionName?: string;
10
10
  prunedIds: string[];
@@ -13,4 +13,4 @@ export interface PersistedSessionState {
13
13
  }
14
14
  export declare function saveSessionState(sessionId: string, prunedIds: Set<string>, stats: SessionStats, logger?: Logger, sessionName?: string): Promise<void>;
15
15
  export declare function loadSessionState(sessionId: string, logger?: Logger): Promise<PersistedSessionState | null>;
16
- //# sourceMappingURL=state-persistence.d.ts.map
16
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../lib/state/persistence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,WAAW,qBAAqB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB;AAsBD,wBAAsB,gBAAgB,CAClC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EACtB,KAAK,EAAE,YAAY,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,gBAAgB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAgCvC"}
@@ -70,4 +70,4 @@ export async function loadSessionState(sessionId, logger) {
70
70
  return null;
71
71
  }
72
72
  }
73
- //# sourceMappingURL=state-persistence.js.map
73
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../lib/state/persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { PluginState } from "./index";
2
+ import type { Logger } from "../logger";
3
+ /**
4
+ * Cache tool parameters from OpenAI Chat Completions and Anthropic style messages.
5
+ * Extracts tool call IDs and their parameters from assistant messages.
6
+ *
7
+ * Supports:
8
+ * - OpenAI format: message.tool_calls[] with id, function.name, function.arguments
9
+ * - Anthropic format: message.content[] with type='tool_use', id, name, input
10
+ */
11
+ export declare function cacheToolParametersFromMessages(messages: any[], state: PluginState, logger?: Logger): void;
12
+ /**
13
+ * Cache tool parameters from OpenAI Responses API format.
14
+ * Extracts from input array items with type='function_call'.
15
+ */
16
+ export declare function cacheToolParametersFromInput(input: any[], state: PluginState, logger?: Logger): void;
17
+ /**
18
+ * Trim the tool parameters cache to prevent unbounded memory growth.
19
+ * Uses FIFO eviction - removes oldest entries first.
20
+ */
21
+ export declare function trimToolParametersCache(state: PluginState): void;
22
+ //# sourceMappingURL=tool-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache.d.ts","sourceRoot":"","sources":["../../../lib/state/tool-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAEvC;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAC3C,QAAQ,EAAE,GAAG,EAAE,EACf,KAAK,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,MAAM,GAChB,IAAI,CAmDN;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CACxC,KAAK,EAAE,GAAG,EAAE,EACZ,KAAK,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,MAAM,GAChB,IAAI,CA2BN;AAKD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAWhE"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Cache tool parameters from OpenAI Chat Completions and Anthropic style messages.
3
+ * Extracts tool call IDs and their parameters from assistant messages.
4
+ *
5
+ * Supports:
6
+ * - OpenAI format: message.tool_calls[] with id, function.name, function.arguments
7
+ * - Anthropic format: message.content[] with type='tool_use', id, name, input
8
+ */
9
+ export function cacheToolParametersFromMessages(messages, state, logger) {
10
+ let openaiCached = 0;
11
+ let anthropicCached = 0;
12
+ for (const message of messages) {
13
+ if (message.role !== 'assistant') {
14
+ continue;
15
+ }
16
+ if (Array.isArray(message.tool_calls)) {
17
+ for (const toolCall of message.tool_calls) {
18
+ if (!toolCall.id || !toolCall.function) {
19
+ continue;
20
+ }
21
+ try {
22
+ const params = typeof toolCall.function.arguments === 'string'
23
+ ? JSON.parse(toolCall.function.arguments)
24
+ : toolCall.function.arguments;
25
+ state.toolParameters.set(toolCall.id.toLowerCase(), {
26
+ tool: toolCall.function.name,
27
+ parameters: params
28
+ });
29
+ openaiCached++;
30
+ }
31
+ catch (error) {
32
+ }
33
+ }
34
+ }
35
+ if (Array.isArray(message.content)) {
36
+ for (const part of message.content) {
37
+ if (part.type !== 'tool_use' || !part.id || !part.name) {
38
+ continue;
39
+ }
40
+ state.toolParameters.set(part.id.toLowerCase(), {
41
+ tool: part.name,
42
+ parameters: part.input ?? {}
43
+ });
44
+ anthropicCached++;
45
+ }
46
+ }
47
+ }
48
+ if (logger && (openaiCached > 0 || anthropicCached > 0)) {
49
+ logger.debug("tool-cache", "Cached tool parameters from messages", {
50
+ openaiFormat: openaiCached,
51
+ anthropicFormat: anthropicCached,
52
+ totalCached: state.toolParameters.size
53
+ });
54
+ }
55
+ }
56
+ /**
57
+ * Cache tool parameters from OpenAI Responses API format.
58
+ * Extracts from input array items with type='function_call'.
59
+ */
60
+ export function cacheToolParametersFromInput(input, state, logger) {
61
+ let cached = 0;
62
+ for (const item of input) {
63
+ if (item.type !== 'function_call' || !item.call_id || !item.name) {
64
+ continue;
65
+ }
66
+ try {
67
+ const params = typeof item.arguments === 'string'
68
+ ? JSON.parse(item.arguments)
69
+ : item.arguments;
70
+ state.toolParameters.set(item.call_id.toLowerCase(), {
71
+ tool: item.name,
72
+ parameters: params
73
+ });
74
+ cached++;
75
+ }
76
+ catch (error) {
77
+ }
78
+ }
79
+ if (logger && cached > 0) {
80
+ logger.debug("tool-cache", "Cached tool parameters from input", {
81
+ responsesApiFormat: cached,
82
+ totalCached: state.toolParameters.size
83
+ });
84
+ }
85
+ }
86
+ /** Maximum number of entries to keep in the tool parameters cache */
87
+ const MAX_TOOL_CACHE_SIZE = 500;
88
+ /**
89
+ * Trim the tool parameters cache to prevent unbounded memory growth.
90
+ * Uses FIFO eviction - removes oldest entries first.
91
+ */
92
+ export function trimToolParametersCache(state) {
93
+ if (state.toolParameters.size <= MAX_TOOL_CACHE_SIZE) {
94
+ return;
95
+ }
96
+ const keysToRemove = Array.from(state.toolParameters.keys())
97
+ .slice(0, state.toolParameters.size - MAX_TOOL_CACHE_SIZE);
98
+ for (const key of keysToRemove) {
99
+ state.toolParameters.delete(key);
100
+ }
101
+ }
102
+ //# sourceMappingURL=tool-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../../../lib/state/tool-cache.ts"],"names":[],"mappings":"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"}
@@ -9,8 +9,8 @@ export async function estimateTokensBatch(texts) {
9
9
  }
10
10
  export function formatTokenCount(tokens) {
11
11
  if (tokens >= 1000) {
12
- return `${(tokens / 1000).toFixed(1)}K`.replace('.0K', 'K');
12
+ return `${(tokens / 1000).toFixed(1)}K`.replace('.0K', 'K') + ' tokens';
13
13
  }
14
- return tokens.toString();
14
+ return tokens.toString() + ' tokens';
15
15
  }
16
16
  //# sourceMappingURL=tokenizer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../lib/tokenizer.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAe;IACrD,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAA;QAChD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IACzD,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC3C,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;AAC5B,CAAC"}
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../lib/tokenizer.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAe;IACrD,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAA;QAChD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IACzD,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC3C,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,SAAS,CAAA;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAA;AACxC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-utils.d.ts","sourceRoot":"","sources":["../../../lib/ui/display-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAoExF"}
@@ -59,9 +59,6 @@ export function extractParameterKey(metadata) {
59
59
  if (tool === "task" && parameters.description) {
60
60
  return parameters.description;
61
61
  }
62
- if (tool === "batch") {
63
- return `${parameters.tool_calls?.length || 0} parallel tools`;
64
- }
65
62
  const paramStr = JSON.stringify(parameters);
66
63
  if (paramStr === '{}' || paramStr === '[]' || paramStr === 'null') {
67
64
  return '';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-utils.js","sourceRoot":"","sources":["../../../lib/ui/display-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Logger } from "../logger";
2
+ import type { SessionStats, GCStats, PruningResult } from "../core/janitor";
3
+ export type PruningSummaryLevel = "off" | "minimal" | "detailed";
4
+ export interface NotificationConfig {
5
+ pruningSummary: PruningSummaryLevel;
6
+ workingDirectory?: string;
7
+ }
8
+ export interface NotificationContext {
9
+ client: any;
10
+ logger: Logger;
11
+ config: NotificationConfig;
12
+ }
13
+ export interface NotificationData {
14
+ aiPrunedCount: number;
15
+ aiTokensSaved: number;
16
+ aiPrunedIds: string[];
17
+ toolMetadata: Map<string, {
18
+ tool: string;
19
+ parameters?: any;
20
+ }>;
21
+ gcPending: GCStats | null;
22
+ sessionStats: SessionStats | null;
23
+ }
24
+ export declare function sendIgnoredMessage(ctx: NotificationContext, sessionID: string, text: string, agent?: string): Promise<void>;
25
+ export declare function sendUnifiedNotification(ctx: NotificationContext, sessionID: string, data: NotificationData, agent?: string): Promise<boolean>;
26
+ export declare function formatPruningResultForTool(result: PruningResult, workingDirectory?: string): string;
27
+ export declare function buildToolsSummary(prunedIds: string[], toolMetadata: Map<string, {
28
+ tool: string;
29
+ parameters?: any;
30
+ }>, workingDirectory?: string): Map<string, string[]>;
31
+ export declare function formatToolSummaryLines(toolsSummary: Map<string, string[]>, indent?: string): string[];
32
+ //# sourceMappingURL=notification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAI3E,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAA;AAEhE,MAAM,WAAW,kBAAkB;IAC/B,cAAc,EAAE,mBAAmB,CAAA;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,GAAG,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,kBAAkB,CAAA;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;IAC7D,SAAS,EAAE,OAAO,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAA;CACpC;AAED,wBAAsB,kBAAkB,CACpC,GAAG,EAAE,mBAAmB,EACxB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,uBAAuB,CACzC,GAAG,EAAE,mBAAmB,EACxB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,gBAAgB,EACtB,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAkBlB;AA2ED,wBAAgB,0BAA0B,CACtC,MAAM,EAAE,aAAa,EACrB,gBAAgB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAYR;AAED,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,MAAM,EAAE,EACnB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,EAC7D,gBAAgB,CAAC,EAAE,MAAM,GAC1B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAuBvB;AAED,wBAAgB,sBAAsB,CAClC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACnC,MAAM,GAAE,MAAa,GACtB,MAAM,EAAE,CAeV"}