@tarquinen/opencode-dcp 0.3.29 → 0.3.31

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 (98) hide show
  1. package/README.md +10 -10
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +13 -6
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/api-formats/synth-instruction.d.ts.map +1 -0
  6. package/dist/lib/api-formats/synth-instruction.js.map +1 -0
  7. package/dist/lib/config.js +7 -7
  8. package/dist/lib/config.js.map +1 -1
  9. package/dist/lib/core/janitor.d.ts +47 -0
  10. package/dist/lib/core/janitor.d.ts.map +1 -0
  11. package/dist/lib/core/janitor.js +301 -0
  12. package/dist/lib/core/janitor.js.map +1 -0
  13. package/dist/lib/core/prompt.d.ts.map +1 -0
  14. package/dist/lib/{prompt.js → core/prompt.js} +1 -1
  15. package/dist/lib/core/prompt.js.map +1 -0
  16. package/dist/lib/core/strategies/deduplication.d.ts +7 -0
  17. package/dist/lib/core/strategies/deduplication.d.ts.map +1 -0
  18. package/dist/lib/core/strategies/deduplication.js +76 -0
  19. package/dist/lib/core/strategies/deduplication.js.map +1 -0
  20. package/dist/lib/core/strategies/index.d.ts +21 -0
  21. package/dist/lib/core/strategies/index.d.ts.map +1 -0
  22. package/dist/lib/core/strategies/index.js +48 -0
  23. package/dist/lib/core/strategies/index.js.map +1 -0
  24. package/dist/lib/core/strategies/types.d.ts +35 -0
  25. package/dist/lib/core/strategies/types.d.ts.map +1 -0
  26. package/dist/lib/core/strategies/types.js +6 -0
  27. package/dist/lib/core/strategies/types.js.map +1 -0
  28. package/dist/lib/fetch-wrapper/gc-tracker.d.ts +4 -0
  29. package/dist/lib/fetch-wrapper/gc-tracker.d.ts.map +1 -0
  30. package/dist/lib/fetch-wrapper/gc-tracker.js +61 -0
  31. package/dist/lib/fetch-wrapper/gc-tracker.js.map +1 -0
  32. package/dist/lib/fetch-wrapper/gemini.js +1 -1
  33. package/dist/lib/fetch-wrapper/gemini.js.map +1 -1
  34. package/dist/lib/fetch-wrapper/index.d.ts +1 -1
  35. package/dist/lib/fetch-wrapper/index.d.ts.map +1 -1
  36. package/dist/lib/fetch-wrapper/index.js +23 -1
  37. package/dist/lib/fetch-wrapper/index.js.map +1 -1
  38. package/dist/lib/fetch-wrapper/openai-chat.js +2 -2
  39. package/dist/lib/fetch-wrapper/openai-chat.js.map +1 -1
  40. package/dist/lib/fetch-wrapper/openai-responses.js +2 -2
  41. package/dist/lib/fetch-wrapper/openai-responses.js.map +1 -1
  42. package/dist/lib/fetch-wrapper/types.d.ts +1 -1
  43. package/dist/lib/fetch-wrapper/types.d.ts.map +1 -1
  44. package/dist/lib/hooks.d.ts +3 -3
  45. package/dist/lib/hooks.d.ts.map +1 -1
  46. package/dist/lib/hooks.js +4 -3
  47. package/dist/lib/hooks.js.map +1 -1
  48. package/dist/lib/pruning-tool.d.ts +3 -3
  49. package/dist/lib/pruning-tool.d.ts.map +1 -1
  50. package/dist/lib/pruning-tool.js +7 -5
  51. package/dist/lib/pruning-tool.js.map +1 -1
  52. package/dist/lib/state/index.d.ts +25 -0
  53. package/dist/lib/state/index.d.ts.map +1 -0
  54. package/dist/lib/{state.js → state/index.js} +10 -6
  55. package/dist/lib/state/index.js.map +1 -0
  56. package/dist/lib/{state-persistence.d.ts → state/persistence.d.ts} +3 -3
  57. package/dist/lib/state/persistence.d.ts.map +1 -0
  58. package/dist/lib/{state-persistence.js → state/persistence.js} +1 -1
  59. package/dist/lib/state/persistence.js.map +1 -0
  60. package/dist/lib/{tool-cache.d.ts → state/tool-cache.d.ts} +6 -1
  61. package/dist/lib/state/tool-cache.d.ts.map +1 -0
  62. package/dist/lib/{tool-cache.js → state/tool-cache.js} +16 -0
  63. package/dist/lib/state/tool-cache.js.map +1 -0
  64. package/dist/lib/tokenizer.js +2 -2
  65. package/dist/lib/tokenizer.js.map +1 -1
  66. package/dist/lib/ui/display-utils.d.ts.map +1 -0
  67. package/dist/lib/{display-utils.js → ui/display-utils.js} +0 -3
  68. package/dist/lib/ui/display-utils.js.map +1 -0
  69. package/dist/lib/ui/notification.d.ts +32 -0
  70. package/dist/lib/ui/notification.d.ts.map +1 -0
  71. package/dist/lib/ui/notification.js +180 -0
  72. package/dist/lib/ui/notification.js.map +1 -0
  73. package/package.json +6 -6
  74. package/dist/lib/deduplicator.d.ts +0 -16
  75. package/dist/lib/deduplicator.d.ts.map +0 -1
  76. package/dist/lib/deduplicator.js +0 -68
  77. package/dist/lib/deduplicator.js.map +0 -1
  78. package/dist/lib/display-utils.d.ts.map +0 -1
  79. package/dist/lib/display-utils.js.map +0 -1
  80. package/dist/lib/janitor.d.ts +0 -57
  81. package/dist/lib/janitor.d.ts.map +0 -1
  82. package/dist/lib/janitor.js +0 -547
  83. package/dist/lib/janitor.js.map +0 -1
  84. package/dist/lib/prompt.d.ts.map +0 -1
  85. package/dist/lib/prompt.js.map +0 -1
  86. package/dist/lib/state-persistence.d.ts.map +0 -1
  87. package/dist/lib/state-persistence.js.map +0 -1
  88. package/dist/lib/state.d.ts +0 -43
  89. package/dist/lib/state.d.ts.map +0 -1
  90. package/dist/lib/state.js.map +0 -1
  91. package/dist/lib/synth-instruction.d.ts.map +0 -1
  92. package/dist/lib/synth-instruction.js.map +0 -1
  93. package/dist/lib/tool-cache.d.ts.map +0 -1
  94. package/dist/lib/tool-cache.js.map +0 -1
  95. /package/dist/lib/{synth-instruction.d.ts → api-formats/synth-instruction.d.ts} +0 -0
  96. /package/dist/lib/{synth-instruction.js → api-formats/synth-instruction.js} +0 -0
  97. /package/dist/lib/{prompt.d.ts → core/prompt.d.ts} +0 -0
  98. /package/dist/lib/{display-utils.d.ts → ui/display-utils.d.ts} +0 -0
@@ -1,6 +1,8 @@
1
1
  import { tool } from "@opencode-ai/plugin";
2
- import { resetToolTrackerCount } from "./synth-instruction";
3
- import { loadPrompt } from "./prompt";
2
+ import { runOnTool } from "./core/janitor";
3
+ import { formatPruningResultForTool } from "./ui/notification";
4
+ import { resetToolTrackerCount } from "./api-formats/synth-instruction";
5
+ import { loadPrompt } from "./core/prompt";
4
6
  import { isSubagentSession } from "./hooks";
5
7
  /** Tool description for the prune tool, loaded from prompts/tool.txt */
6
8
  export const CONTEXT_PRUNING_DESCRIPTION = loadPrompt("tool");
@@ -8,7 +10,7 @@ export const CONTEXT_PRUNING_DESCRIPTION = loadPrompt("tool");
8
10
  * Creates the prune tool definition.
9
11
  * Returns a tool definition that can be passed to the plugin's tool registry.
10
12
  */
11
- export function createPruningTool(client, janitor, config, toolTracker) {
13
+ export function createPruningTool(client, janitorCtx, config, toolTracker) {
12
14
  return tool({
13
15
  description: CONTEXT_PRUNING_DESCRIPTION,
14
16
  args: {
@@ -20,7 +22,7 @@ export function createPruningTool(client, janitor, config, toolTracker) {
20
22
  if (await isSubagentSession(client, ctx.sessionID)) {
21
23
  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
24
  }
23
- const result = await janitor.runForTool(ctx.sessionID, config.strategies.onTool, args.reason);
25
+ const result = await runOnTool(janitorCtx, ctx.sessionID, config.strategies.onTool, args.reason);
24
26
  // Skip next idle pruning since we just pruned
25
27
  toolTracker.skipNextIdle = true;
26
28
  // Reset nudge counter to prevent immediate re-nudging after pruning
@@ -31,7 +33,7 @@ export function createPruningTool(client, janitor, config, toolTracker) {
31
33
  if (!result || result.prunedCount === 0) {
32
34
  return "No prunable tool outputs found. Context is already optimized." + postPruneGuidance;
33
35
  }
34
- return janitor.formatPruningResultForTool(result) + postPruneGuidance;
36
+ return formatPruningResultForTool(result, janitorCtx.config.workingDirectory) + postPruneGuidance;
35
37
  },
36
38
  });
37
39
  }
@@ -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;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAG9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,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,UAA0B,EAAE,MAAoB,EAAE,WAAwB;IACrH,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,SAAS,CAC1B,UAAU,EACV,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,0BAA0B,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,iBAAiB,CAAA;QACrG,CAAC;KACJ,CAAC,CAAA;AACN,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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"}
@@ -1,4 +1,4 @@
1
- import type { PluginState } from "./state";
1
+ import type { PluginState } from "./index";
2
2
  /**
3
3
  * Cache tool parameters from OpenAI Chat Completions style messages.
4
4
  * Extracts tool call IDs and their parameters from assistant messages with tool_calls.
@@ -9,4 +9,9 @@ export declare function cacheToolParametersFromMessages(messages: any[], state:
9
9
  * Extracts from input array items with type='function_call'.
10
10
  */
11
11
  export declare function cacheToolParametersFromInput(input: any[], state: PluginState): void;
12
+ /**
13
+ * Trim the tool parameters cache to prevent unbounded memory growth.
14
+ * Uses FIFO eviction - removes oldest entries first.
15
+ */
16
+ export declare function trimToolParametersCache(state: PluginState): void;
12
17
  //# 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;AAE1C;;;GAGG;AACH,wBAAgB,+BAA+B,CAC3C,QAAQ,EAAE,GAAG,EAAE,EACf,KAAK,EAAE,WAAW,GACnB,IAAI,CAwBN;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CACxC,KAAK,EAAE,GAAG,EAAE,EACZ,KAAK,EAAE,WAAW,GACnB,IAAI,CAkBN;AAKD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAWhE"}
@@ -49,4 +49,20 @@ export function cacheToolParametersFromInput(input, state) {
49
49
  }
50
50
  }
51
51
  }
52
+ /** Maximum number of entries to keep in the tool parameters cache */
53
+ const MAX_TOOL_CACHE_SIZE = 500;
54
+ /**
55
+ * Trim the tool parameters cache to prevent unbounded memory growth.
56
+ * Uses FIFO eviction - removes oldest entries first.
57
+ */
58
+ export function trimToolParametersCache(state) {
59
+ if (state.toolParameters.size <= MAX_TOOL_CACHE_SIZE) {
60
+ return;
61
+ }
62
+ const keysToRemove = Array.from(state.toolParameters.keys())
63
+ .slice(0, state.toolParameters.size - MAX_TOOL_CACHE_SIZE);
64
+ for (const key of keysToRemove) {
65
+ state.toolParameters.delete(key);
66
+ }
67
+ }
52
68
  //# sourceMappingURL=tool-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../../../lib/state/tool-cache.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAC3C,QAAe,EACf,KAAkB;IAElB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACrE,SAAQ;QACZ,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACrC,SAAQ;YACZ,CAAC;YAED,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,OAAO,QAAQ,CAAC,QAAQ,CAAC,SAAS,KAAK,QAAQ;oBAC1D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;oBACzC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAA;gBACjC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE;oBAClC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;oBAC5B,UAAU,EAAE,MAAM;iBACrB,CAAC,CAAA;YACN,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,+BAA+B;YACnC,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CACxC,KAAY,EACZ,KAAkB;IAElB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/D,SAAQ;QACZ,CAAC;QAED,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;gBAC7C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC5B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAA;YACpB,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;gBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU,EAAE,MAAM;aACrB,CAAC,CAAA;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,+BAA+B;QACnC,CAAC;IACL,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAE/B;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAkB;IACtD,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACnD,OAAM;IACV,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;SACvD,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,mBAAmB,CAAC,CAAA;IAE9D,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC7B,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;AACL,CAAC"}
@@ -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"}
@@ -0,0 +1,180 @@
1
+ import { formatTokenCount } from "../tokenizer";
2
+ import { extractParameterKey } from "./display-utils";
3
+ export async function sendIgnoredMessage(ctx, sessionID, text, agent) {
4
+ try {
5
+ await ctx.client.session.prompt({
6
+ path: { id: sessionID },
7
+ body: {
8
+ noReply: true,
9
+ agent: agent,
10
+ parts: [{
11
+ type: 'text',
12
+ text: text,
13
+ ignored: true
14
+ }]
15
+ }
16
+ });
17
+ }
18
+ catch (error) {
19
+ ctx.logger.error("notification", "Failed to send notification", { error: error.message });
20
+ }
21
+ }
22
+ export async function sendUnifiedNotification(ctx, sessionID, data, agent) {
23
+ const hasAiPruning = data.aiPrunedCount > 0;
24
+ const hasGcActivity = data.gcPending && data.gcPending.toolsDeduped > 0;
25
+ if (!hasAiPruning && !hasGcActivity) {
26
+ return false;
27
+ }
28
+ if (ctx.config.pruningSummary === 'off') {
29
+ return false;
30
+ }
31
+ const message = ctx.config.pruningSummary === 'minimal'
32
+ ? buildMinimalMessage(data)
33
+ : buildDetailedMessage(data, ctx.config.workingDirectory);
34
+ await sendIgnoredMessage(ctx, sessionID, message, agent);
35
+ return true;
36
+ }
37
+ function buildMinimalMessage(data) {
38
+ const { justNowTokens, totalTokens } = calculateStats(data);
39
+ return formatStatsHeader(totalTokens, justNowTokens);
40
+ }
41
+ function calculateStats(data) {
42
+ const justNowTokens = data.aiTokensSaved + (data.gcPending?.tokensCollected ?? 0);
43
+ const totalTokens = data.sessionStats
44
+ ? data.sessionStats.totalTokensSaved + data.sessionStats.totalGCTokens
45
+ : justNowTokens;
46
+ return { justNowTokens, totalTokens };
47
+ }
48
+ function formatStatsHeader(totalTokens, justNowTokens) {
49
+ const totalTokensStr = `~${formatTokenCount(totalTokens)}`;
50
+ const justNowTokensStr = `~${formatTokenCount(justNowTokens)}`;
51
+ const maxTokenLen = Math.max(totalTokensStr.length, justNowTokensStr.length);
52
+ const totalTokensPadded = totalTokensStr.padStart(maxTokenLen);
53
+ const justNowTokensPadded = justNowTokensStr.padStart(maxTokenLen);
54
+ return [
55
+ `▣ DCP Stats`,
56
+ ` Total saved │ ${totalTokensPadded}`,
57
+ ` Just now │ ${justNowTokensPadded}`,
58
+ ].join('\n');
59
+ }
60
+ function buildDetailedMessage(data, workingDirectory) {
61
+ const { justNowTokens, totalTokens } = calculateStats(data);
62
+ let message = formatStatsHeader(totalTokens, justNowTokens);
63
+ if (data.aiPrunedCount > 0) {
64
+ message += '\n\n▣ Pruned tools:';
65
+ for (const prunedId of data.aiPrunedIds) {
66
+ const normalizedId = prunedId.toLowerCase();
67
+ const metadata = data.toolMetadata.get(normalizedId);
68
+ if (metadata) {
69
+ const paramKey = extractParameterKey(metadata);
70
+ if (paramKey) {
71
+ const displayKey = truncate(shortenPath(paramKey, workingDirectory), 60);
72
+ message += `\n→ ${metadata.tool}: ${displayKey}`;
73
+ }
74
+ else {
75
+ message += `\n→ ${metadata.tool}`;
76
+ }
77
+ }
78
+ }
79
+ const knownCount = data.aiPrunedIds.filter(id => data.toolMetadata.has(id.toLowerCase())).length;
80
+ const unknownCount = data.aiPrunedIds.length - knownCount;
81
+ if (unknownCount > 0) {
82
+ message += `\n→ (${unknownCount} tool${unknownCount > 1 ? 's' : ''} with unknown metadata)`;
83
+ }
84
+ }
85
+ return message.trim();
86
+ }
87
+ export function formatPruningResultForTool(result, workingDirectory) {
88
+ const lines = [];
89
+ lines.push(`Context pruning complete. Pruned ${result.prunedCount} tool outputs.`);
90
+ lines.push('');
91
+ if (result.llmPrunedIds.length > 0) {
92
+ lines.push(`Semantically pruned (${result.llmPrunedIds.length}):`);
93
+ const toolsSummary = buildToolsSummary(result.llmPrunedIds, result.toolMetadata, workingDirectory);
94
+ lines.push(...formatToolSummaryLines(toolsSummary));
95
+ }
96
+ return lines.join('\n').trim();
97
+ }
98
+ export function buildToolsSummary(prunedIds, toolMetadata, workingDirectory) {
99
+ const toolsSummary = new Map();
100
+ for (const prunedId of prunedIds) {
101
+ const normalizedId = prunedId.toLowerCase();
102
+ const metadata = toolMetadata.get(normalizedId);
103
+ if (metadata) {
104
+ const toolName = metadata.tool;
105
+ if (!toolsSummary.has(toolName)) {
106
+ toolsSummary.set(toolName, []);
107
+ }
108
+ const paramKey = extractParameterKey(metadata);
109
+ if (paramKey) {
110
+ const displayKey = truncate(shortenPath(paramKey, workingDirectory), 80);
111
+ toolsSummary.get(toolName).push(displayKey);
112
+ }
113
+ else {
114
+ toolsSummary.get(toolName).push('(default)');
115
+ }
116
+ }
117
+ }
118
+ return toolsSummary;
119
+ }
120
+ export function formatToolSummaryLines(toolsSummary, indent = ' ') {
121
+ const lines = [];
122
+ for (const [toolName, params] of toolsSummary.entries()) {
123
+ if (params.length === 1) {
124
+ lines.push(`${indent}${toolName}: ${params[0]}`);
125
+ }
126
+ else if (params.length > 1) {
127
+ lines.push(`${indent}${toolName} (${params.length}):`);
128
+ for (const param of params) {
129
+ lines.push(`${indent} ${param}`);
130
+ }
131
+ }
132
+ }
133
+ return lines;
134
+ }
135
+ function truncate(str, maxLen = 60) {
136
+ if (str.length <= maxLen)
137
+ return str;
138
+ return str.slice(0, maxLen - 3) + '...';
139
+ }
140
+ function shortenPath(input, workingDirectory) {
141
+ const inPathMatch = input.match(/^(.+) in (.+)$/);
142
+ if (inPathMatch) {
143
+ const prefix = inPathMatch[1];
144
+ const pathPart = inPathMatch[2];
145
+ const shortenedPath = shortenSinglePath(pathPart, workingDirectory);
146
+ return `${prefix} in ${shortenedPath}`;
147
+ }
148
+ return shortenSinglePath(input, workingDirectory);
149
+ }
150
+ function shortenSinglePath(path, workingDirectory) {
151
+ const homeDir = require('os').homedir();
152
+ if (workingDirectory) {
153
+ if (path.startsWith(workingDirectory + '/')) {
154
+ return path.slice(workingDirectory.length + 1);
155
+ }
156
+ if (path === workingDirectory) {
157
+ return '.';
158
+ }
159
+ }
160
+ if (path.startsWith(homeDir)) {
161
+ path = '~' + path.slice(homeDir.length);
162
+ }
163
+ const nodeModulesMatch = path.match(/node_modules\/(@[^\/]+\/[^\/]+|[^\/]+)\/(.*)/);
164
+ if (nodeModulesMatch) {
165
+ return `${nodeModulesMatch[1]}/${nodeModulesMatch[2]}`;
166
+ }
167
+ if (workingDirectory) {
168
+ const workingDirWithTilde = workingDirectory.startsWith(homeDir)
169
+ ? '~' + workingDirectory.slice(homeDir.length)
170
+ : null;
171
+ if (workingDirWithTilde && path.startsWith(workingDirWithTilde + '/')) {
172
+ return path.slice(workingDirWithTilde.length + 1);
173
+ }
174
+ if (workingDirWithTilde && path === workingDirWithTilde) {
175
+ return '.';
176
+ }
177
+ }
178
+ return path;
179
+ }
180
+ //# sourceMappingURL=notification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.js","sourceRoot":"","sources":["../../../lib/ui/notification.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAwBrD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,GAAwB,EACxB,SAAiB,EACjB,IAAY,EACZ,KAAc;IAEd,IAAI,CAAC;QACD,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5B,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;YACvB,IAAI,EAAE;gBACF,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,CAAC;wBACJ,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI;wBACV,OAAO,EAAE,IAAI;qBAChB,CAAC;aACL;SACJ,CAAC,CAAA;IACN,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,6BAA6B,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAC7F,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CACzC,GAAwB,EACxB,SAAiB,EACjB,IAAsB,EACtB,KAAc;IAEd,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA;IAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,CAAA;IAEvE,IAAI,CAAC,YAAY,IAAI,CAAC,aAAa,EAAE,CAAC;QAClC,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QACtC,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,cAAc,KAAK,SAAS;QACnD,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAC3B,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;IAE7D,MAAM,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;IACxD,OAAO,IAAI,CAAA;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAsB;IAC/C,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IAE3D,OAAO,iBAAiB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,IAAsB;IAI1C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,IAAI,CAAC,CAAC,CAAA;IAEjF,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY;QACjC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa;QACtE,CAAC,CAAC,aAAa,CAAA;IAEnB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAA;AACzC,CAAC;AAED,SAAS,iBAAiB,CACtB,WAAmB,EACnB,aAAqB;IAErB,MAAM,cAAc,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAA;IAC1D,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC,EAAE,CAAA;IAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC5E,MAAM,iBAAiB,GAAG,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IAC9D,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IAElE,OAAO;QACH,aAAa;QACb,mBAAmB,iBAAiB,EAAE;QACtC,mBAAmB,mBAAmB,EAAE;KAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAsB,EAAE,gBAAyB;IAC3E,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IAE3D,IAAI,OAAO,GAAG,iBAAiB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;IAE3D,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,qBAAqB,CAAA;QAEhC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YAEpD,IAAI,QAAQ,EAAE,CAAC;gBACX,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;gBAC9C,IAAI,QAAQ,EAAE,CAAC;oBACX,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAA;oBACxE,OAAO,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAA;gBACpD,CAAC;qBAAM,CAAC;oBACJ,OAAO,IAAI,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;gBACrC,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAC1C,CAAC,MAAM,CAAA;QACR,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,UAAU,CAAA;QAEzD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,IAAI,QAAQ,YAAY,QAAQ,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,yBAAyB,CAAA;QAC/F,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,EAAE,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACtC,MAAqB,EACrB,gBAAyB;IAEzB,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,oCAAoC,MAAM,CAAC,WAAW,gBAAgB,CAAC,CAAA;IAClF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,CAAA;QAClE,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAA;QAClG,KAAK,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC7B,SAAmB,EACnB,YAA6D,EAC7D,gBAAyB;IAEzB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAA;IAEhD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;QAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAC/C,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAA;YAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;YAClC,CAAC;YAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;YAC9C,IAAI,QAAQ,EAAE,CAAC;gBACX,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAA;gBACxE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAChD,CAAC;iBAAM,CAAC;gBACJ,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACjD,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,YAAY,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAClC,YAAmC,EACnC,SAAiB,IAAI;IAErB,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACpD,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,QAAQ,KAAK,MAAM,CAAC,MAAM,IAAI,CAAC,CAAA;YACtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,KAAK,EAAE,CAAC,CAAA;YACrC,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,SAAiB,EAAE;IAC9C,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,GAAG,CAAA;IACpC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,gBAAyB;IACzD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACjD,IAAI,WAAW,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC/B,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;QACnE,OAAO,GAAG,MAAM,OAAO,aAAa,EAAE,CAAA;IAC1C,CAAC;IAED,OAAO,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAA;AACrD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,gBAAyB;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;IAEvC,IAAI,gBAAgB,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,GAAG,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClD,CAAC;QACD,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAA;QACd,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACnF,IAAI,gBAAgB,EAAE,CAAC;QACnB,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1D,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACnB,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC;YAC5D,CAAC,CAAC,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAA;QAEV,IAAI,mBAAmB,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,GAAG,GAAG,CAAC,EAAE,CAAC;YACpE,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACrD,CAAC;QACD,IAAI,mBAAmB,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACtD,OAAO,GAAG,CAAA;QACd,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAA;AACf,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@tarquinen/opencode-dcp",
4
- "version": "0.3.29",
4
+ "version": "0.3.31",
5
5
  "type": "module",
6
6
  "description": "OpenCode plugin that optimizes token usage by pruning obsolete tool outputs from conversation context",
7
7
  "main": "./dist/index.js",
@@ -38,18 +38,18 @@
38
38
  "@opencode-ai/plugin": ">=0.13.7"
39
39
  },
40
40
  "dependencies": {
41
- "@ai-sdk/openai-compatible": "^1.0.27",
41
+ "@ai-sdk/openai-compatible": "^1.0.28",
42
42
  "@opencode-ai/sdk": "latest",
43
- "@tarquinen/opencode-auth-provider": "^0.1.5",
44
- "ai": "^5.0.98",
43
+ "@tarquinen/opencode-auth-provider": "^0.1.7",
44
+ "ai": "^5.0.106",
45
45
  "gpt-tokenizer": "^3.4.0",
46
46
  "jsonc-parser": "^3.3.1",
47
- "zod": "^4.1.12"
47
+ "zod": "^4.1.13"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@opencode-ai/plugin": ">=0.13.7",
51
51
  "@types/node": "^24.10.1",
52
- "tsx": "^4.20.6",
52
+ "tsx": "^4.21.0",
53
53
  "typescript": "^5.9.3"
54
54
  },
55
55
  "files": [
@@ -1,16 +0,0 @@
1
- export interface DuplicateDetectionResult {
2
- duplicateIds: string[];
3
- deduplicationDetails: Map<string, {
4
- toolName: string;
5
- parameterKey: string;
6
- duplicateCount: number;
7
- prunedIds: string[];
8
- keptId: string;
9
- }>;
10
- }
11
- export declare function detectDuplicates(toolMetadata: Map<string, {
12
- tool: string;
13
- parameters?: any;
14
- }>, unprunedToolCallIds: string[], // In chronological order
15
- protectedTools: string[]): DuplicateDetectionResult;
16
- //# sourceMappingURL=deduplicator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deduplicator.d.ts","sourceRoot":"","sources":["../../lib/deduplicator.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACrC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE;QAC9B,QAAQ,EAAE,MAAM,CAAA;QAChB,YAAY,EAAE,MAAM,CAAA;QACpB,cAAc,EAAE,MAAM,CAAA;QACtB,SAAS,EAAE,MAAM,EAAE,CAAA;QACnB,MAAM,EAAE,MAAM,CAAA;KACjB,CAAC,CAAA;CACL;AAED,wBAAgB,gBAAgB,CAC5B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,EAC7D,mBAAmB,EAAE,MAAM,EAAE,EAAG,yBAAyB;AACzD,cAAc,EAAE,MAAM,EAAE,GACzB,wBAAwB,CAuC1B"}
@@ -1,68 +0,0 @@
1
- import { extractParameterKey } from "./display-utils";
2
- export function detectDuplicates(toolMetadata, unprunedToolCallIds, // In chronological order
3
- protectedTools) {
4
- const signatureMap = new Map();
5
- const deduplicatableIds = unprunedToolCallIds.filter(id => {
6
- const metadata = toolMetadata.get(id);
7
- return !metadata || !protectedTools.includes(metadata.tool);
8
- });
9
- for (const id of deduplicatableIds) {
10
- const metadata = toolMetadata.get(id);
11
- if (!metadata)
12
- continue;
13
- const signature = createToolSignature(metadata.tool, metadata.parameters);
14
- if (!signatureMap.has(signature)) {
15
- signatureMap.set(signature, []);
16
- }
17
- signatureMap.get(signature).push(id);
18
- }
19
- const duplicateIds = [];
20
- const deduplicationDetails = new Map();
21
- for (const [signature, ids] of signatureMap.entries()) {
22
- if (ids.length > 1) {
23
- const metadata = toolMetadata.get(ids[0]);
24
- const idsToRemove = ids.slice(0, -1); // All except last
25
- duplicateIds.push(...idsToRemove);
26
- deduplicationDetails.set(signature, {
27
- toolName: metadata.tool,
28
- parameterKey: extractParameterKey(metadata),
29
- duplicateCount: ids.length,
30
- prunedIds: idsToRemove,
31
- keptId: ids[ids.length - 1]
32
- });
33
- }
34
- }
35
- return { duplicateIds, deduplicationDetails };
36
- }
37
- function createToolSignature(tool, parameters) {
38
- if (!parameters)
39
- return tool;
40
- const normalized = normalizeParameters(parameters);
41
- const sorted = sortObjectKeys(normalized);
42
- return `${tool}::${JSON.stringify(sorted)}`;
43
- }
44
- function normalizeParameters(params) {
45
- if (typeof params !== 'object' || params === null)
46
- return params;
47
- if (Array.isArray(params))
48
- return params;
49
- const normalized = {};
50
- for (const [key, value] of Object.entries(params)) {
51
- if (value !== undefined && value !== null) {
52
- normalized[key] = value;
53
- }
54
- }
55
- return normalized;
56
- }
57
- function sortObjectKeys(obj) {
58
- if (typeof obj !== 'object' || obj === null)
59
- return obj;
60
- if (Array.isArray(obj))
61
- return obj.map(sortObjectKeys);
62
- const sorted = {};
63
- for (const key of Object.keys(obj).sort()) {
64
- sorted[key] = sortObjectKeys(obj[key]);
65
- }
66
- return sorted;
67
- }
68
- //# sourceMappingURL=deduplicator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deduplicator.js","sourceRoot":"","sources":["../../lib/deduplicator.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"display-utils.d.ts","sourceRoot":"","sources":["../../lib/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,CAuExF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"display-utils.js","sourceRoot":"","sources":["../../lib/display-utils.ts"],"names":[],"mappings":"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"}