@tarquinen/opencode-dcp 2.1.3 → 2.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/lib/config.d.ts.map +1 -1
  2. package/dist/lib/config.js +24 -0
  3. package/dist/lib/config.js.map +1 -1
  4. package/dist/lib/hooks.d.ts.map +1 -1
  5. package/dist/lib/hooks.js +4 -1
  6. package/dist/lib/hooks.js.map +1 -1
  7. package/dist/lib/message-ids.d.ts +19 -0
  8. package/dist/lib/message-ids.d.ts.map +1 -0
  9. package/dist/lib/message-ids.js +97 -0
  10. package/dist/lib/message-ids.js.map +1 -0
  11. package/dist/lib/messages/index.d.ts +1 -0
  12. package/dist/lib/messages/index.d.ts.map +1 -1
  13. package/dist/lib/messages/index.js +1 -0
  14. package/dist/lib/messages/index.js.map +1 -1
  15. package/dist/lib/messages/inject.d.ts +1 -0
  16. package/dist/lib/messages/inject.d.ts.map +1 -1
  17. package/dist/lib/messages/inject.js +35 -7
  18. package/dist/lib/messages/inject.js.map +1 -1
  19. package/dist/lib/messages/prune.js +6 -4
  20. package/dist/lib/messages/prune.js.map +1 -1
  21. package/dist/lib/messages/utils.d.ts +10 -4
  22. package/dist/lib/messages/utils.d.ts.map +1 -1
  23. package/dist/lib/messages/utils.js +37 -11
  24. package/dist/lib/messages/utils.js.map +1 -1
  25. package/dist/lib/prompts/_codegen/compress.generated.d.ts +1 -1
  26. package/dist/lib/prompts/_codegen/compress.generated.d.ts.map +1 -1
  27. package/dist/lib/prompts/_codegen/compress.generated.js +26 -16
  28. package/dist/lib/prompts/_codegen/compress.generated.js.map +1 -1
  29. package/dist/lib/prompts/_codegen/system.generated.d.ts +1 -1
  30. package/dist/lib/prompts/_codegen/system.generated.d.ts.map +1 -1
  31. package/dist/lib/prompts/_codegen/system.generated.js +2 -2
  32. package/dist/lib/state/persistence.d.ts.map +1 -1
  33. package/dist/lib/state/persistence.js +37 -7
  34. package/dist/lib/state/persistence.js.map +1 -1
  35. package/dist/lib/state/state.d.ts.map +1 -1
  36. package/dist/lib/state/state.js +16 -1
  37. package/dist/lib/state/state.js.map +1 -1
  38. package/dist/lib/state/types.d.ts +7 -0
  39. package/dist/lib/state/types.d.ts.map +1 -1
  40. package/dist/lib/state/utils.d.ts.map +1 -1
  41. package/dist/lib/state/utils.js +5 -0
  42. package/dist/lib/state/utils.js.map +1 -1
  43. package/dist/lib/strategies/purge-errors.js +1 -1
  44. package/dist/lib/strategies/purge-errors.js.map +1 -1
  45. package/dist/lib/tools/compress-utils.d.ts +59 -0
  46. package/dist/lib/tools/compress-utils.d.ts.map +1 -0
  47. package/dist/lib/tools/compress-utils.js +405 -0
  48. package/dist/lib/tools/compress-utils.js.map +1 -0
  49. package/dist/lib/tools/compress.d.ts.map +1 -1
  50. package/dist/lib/tools/compress.js +52 -97
  51. package/dist/lib/tools/compress.js.map +1 -1
  52. package/package.json +1 -3
  53. package/dist/lib/tools/utils.d.ts +0 -14
  54. package/dist/lib/tools/utils.d.ts.map +0 -1
  55. package/dist/lib/tools/utils.js +0 -171
  56. package/dist/lib/tools/utils.js.map +0 -1
@@ -2,12 +2,11 @@ import { tool } from "@opencode-ai/plugin";
2
2
  import { ensureSessionInitialized } from "../state";
3
3
  import { saveSessionState } from "../state/persistence";
4
4
  import { loadPrompt } from "../prompts";
5
- import { getCurrentParams, getTotalToolTokens, countMessageTextTokens } from "../strategies/utils";
6
- import { findStringInMessages, collectToolIdsInRange, collectMessageIdsInRange } from "./utils";
5
+ import { getCurrentParams, getTotalToolTokens } from "../strategies/utils";
7
6
  import { sendCompressNotification } from "../ui/notification";
8
- import { prune as applyPruneTransforms } from "../messages/prune";
7
+ import { assignMessageRefs } from "../message-ids";
8
+ import { addCompressedBlockHeader, allocateBlockId, buildSearchContext, fetchSessionMessages, injectBlockPlaceholders, parseBlockPlaceholders, resolveAnchorMessageId, resolveBoundaryIds, resolveRange, upsertCompressedSummary, validateCompressArgs, validateSummaryPlaceholders, } from "./compress-utils";
9
9
  const COMPRESS_TOOL_DESCRIPTION = loadPrompt("compress-tool-spec");
10
- const COMPRESS_SUMMARY_PREFIX = "[Compressed conversation block]\n\n";
11
10
  export function createCompressTool(ctx) {
12
11
  return tool({
13
12
  description: COMPRESS_TOOL_DESCRIPTION,
@@ -17,17 +16,17 @@ export function createCompressTool(ctx) {
17
16
  .describe("Short label (3-5 words) for display - e.g., 'Auth System Exploration'"),
18
17
  content: tool.schema
19
18
  .object({
20
- startString: tool.schema
19
+ startId: tool.schema
21
20
  .string()
22
- .describe("Unique text from conversation marking the beginning of range"),
23
- endString: tool.schema
21
+ .describe("Message or block ID marking the beginning of range (e.g. m0000, b2)"),
22
+ endId: tool.schema
24
23
  .string()
25
- .describe("Unique text marking the end of range"),
24
+ .describe("Message or block ID marking the end of range (e.g. m0012, b5)"),
26
25
  summary: tool.schema
27
26
  .string()
28
27
  .describe("Complete technical summary replacing all content in range"),
29
28
  })
30
- .describe("The compression details: boundaries and replacement summary"),
29
+ .describe("Compression details: ID boundaries and replacement summary"),
31
30
  },
32
31
  async execute(args, toolCtx) {
33
32
  const { client, state, logger } = ctx;
@@ -38,84 +37,29 @@ export function createCompressTool(ctx) {
38
37
  always: ["*"],
39
38
  metadata: {},
40
39
  });
41
- const { topic, content } = args;
42
- const { startString, endString, summary } = content || {};
43
- if (!topic || typeof topic !== "string") {
44
- throw new Error("topic is required and must be a non-empty string");
45
- }
46
- if (!startString || typeof startString !== "string") {
47
- throw new Error("content.startString is required and must be a non-empty string");
48
- }
49
- if (!endString || typeof endString !== "string") {
50
- throw new Error("content.endString is required and must be a non-empty string");
51
- }
52
- if (!summary || typeof summary !== "string") {
53
- throw new Error("content.summary is required and must be a non-empty string");
54
- }
55
- // logger.info("Compress tool invoked")
56
- // logger.info(
57
- // JSON.stringify({
58
- // startString: startString?.substring(0, 50) + "...",
59
- // endString: endString?.substring(0, 50) + "...",
60
- // topic: topic,
61
- // summaryLength: summary?.length,
62
- // }),
63
- // )
64
- const messagesResponse = await client.session.messages({
65
- path: { id: sessionId },
66
- });
67
- const messages = messagesResponse.data || messagesResponse;
68
- await ensureSessionInitialized(client, state, sessionId, logger, messages, ctx.config.manualMode.enabled);
69
- const transformedMessages = structuredClone(messages);
70
- applyPruneTransforms(state, logger, ctx.config, transformedMessages);
71
- const startResult = findStringInMessages(transformedMessages, startString, logger, "startString");
72
- const endResult = findStringInMessages(transformedMessages, endString, logger, "endString");
73
- let rawStartIndex = messages.findIndex((m) => m.info.id === startResult.messageId);
74
- let rawEndIndex = messages.findIndex((m) => m.info.id === endResult.messageId);
75
- // If a boundary matched inside a synthetic compress summary message,
76
- // resolve it back to the summary's anchor message in the raw messages
77
- if (rawStartIndex === -1) {
78
- const summary = state.compressSummaries.find((s) => s.summary.includes(startString));
79
- if (summary) {
80
- rawStartIndex = messages.findIndex((m) => m.info.id === summary.anchorMessageId);
81
- }
82
- }
83
- if (rawEndIndex === -1) {
84
- const summary = state.compressSummaries.find((s) => s.summary.includes(endString));
85
- if (summary) {
86
- rawEndIndex = messages.findIndex((m) => m.info.id === summary.anchorMessageId);
87
- }
88
- }
89
- if (rawStartIndex === -1 || rawEndIndex === -1) {
90
- throw new Error(`Failed to map boundary matches back to raw messages`);
91
- }
92
- if (rawStartIndex > rawEndIndex) {
93
- throw new Error(`startString appears after endString in the conversation. Start must come before end.`);
94
- }
95
- const containedToolIds = collectToolIdsInRange(messages, rawStartIndex, rawEndIndex);
96
- const containedMessageIds = collectMessageIdsInRange(messages, rawStartIndex, rawEndIndex);
97
- // Remove any existing summaries whose anchors are now inside this range
98
- // This prevents duplicate injections when a larger compress subsumes a smaller one
99
- const removedSummaries = state.compressSummaries.filter((s) => containedMessageIds.includes(s.anchorMessageId));
100
- if (removedSummaries.length > 0) {
101
- state.compressSummaries = state.compressSummaries.filter((s) => !containedMessageIds.includes(s.anchorMessageId));
102
- }
103
- const compressSummary = {
104
- anchorMessageId: startResult.messageId,
105
- summary: COMPRESS_SUMMARY_PREFIX + summary,
106
- };
107
- state.compressSummaries.push(compressSummary);
108
- const compressedMessageIds = containedMessageIds.filter((id) => !state.prune.messages.has(id));
109
- const compressedToolIds = containedToolIds.filter((id) => !state.prune.tools.has(id));
40
+ const compressArgs = args;
41
+ validateCompressArgs(compressArgs);
42
+ const rawMessages = await fetchSessionMessages(client, sessionId);
43
+ await ensureSessionInitialized(client, state, sessionId, logger, rawMessages, ctx.config.manualMode.enabled);
44
+ assignMessageRefs(state, rawMessages);
45
+ const searchContext = buildSearchContext(state, rawMessages);
46
+ const { startReference, endReference } = resolveBoundaryIds(searchContext, state, compressArgs.content.startId, compressArgs.content.endId);
47
+ const range = resolveRange(searchContext, startReference, endReference);
48
+ const anchorMessageId = resolveAnchorMessageId(range.startReference);
49
+ const parsedPlaceholders = parseBlockPlaceholders(compressArgs.content.summary);
50
+ validateSummaryPlaceholders(parsedPlaceholders, range.requiredBlockIds, range.startReference, range.endReference, searchContext.summaryByBlockId);
51
+ const injected = injectBlockPlaceholders(compressArgs.content.summary, parsedPlaceholders, searchContext.summaryByBlockId, range.startReference, range.endReference);
52
+ const blockId = allocateBlockId(state.compressSummaries);
53
+ const storedSummary = addCompressedBlockHeader(blockId, injected.expandedSummary);
54
+ state.compressSummaries = upsertCompressedSummary(state.compressSummaries, blockId, anchorMessageId, storedSummary, injected.consumedBlockIds);
55
+ const compressedMessageIds = range.messageIds.filter((id) => !state.prune.messages.has(id));
110
56
  let textTokens = 0;
111
- for (const msgId of compressedMessageIds) {
112
- const msg = messages.find((m) => m.info.id === msgId);
113
- if (msg) {
114
- const tokens = countMessageTextTokens(msg);
115
- textTokens += tokens;
116
- state.prune.messages.set(msgId, tokens);
117
- }
57
+ for (const messageId of compressedMessageIds) {
58
+ const tokenCount = range.messageTokenById.get(messageId) || 0;
59
+ textTokens += tokenCount;
60
+ state.prune.messages.set(messageId, tokenCount);
118
61
  }
62
+ const compressedToolIds = range.toolIds.filter((id) => !state.prune.tools.has(id));
119
63
  const toolTokens = getTotalToolTokens(state, compressedToolIds);
120
64
  for (const id of compressedToolIds) {
121
65
  const entry = state.toolParameters.get(id);
@@ -123,23 +67,34 @@ export function createCompressTool(ctx) {
123
67
  }
124
68
  const estimatedCompressedTokens = textTokens + toolTokens;
125
69
  state.stats.pruneTokenCounter += estimatedCompressedTokens;
126
- const rawStartResult = { messageId: startResult.messageId, messageIndex: rawStartIndex };
127
- const rawEndResult = { messageId: endResult.messageId, messageIndex: rawEndIndex };
128
- const currentParams = getCurrentParams(state, messages, logger);
129
- await sendCompressNotification(client, logger, ctx.config, state, sessionId, compressedToolIds, compressedMessageIds, topic, summary, rawStartResult, rawEndResult, messages.length, currentParams);
70
+ const rawStartResult = {
71
+ messageId: getBoundaryMessageId(startReference),
72
+ messageIndex: startReference.rawIndex,
73
+ };
74
+ const rawEndResult = {
75
+ messageId: getBoundaryMessageId(endReference),
76
+ messageIndex: endReference.rawIndex,
77
+ };
78
+ const currentParams = getCurrentParams(state, rawMessages, logger);
79
+ await sendCompressNotification(client, logger, ctx.config, state, sessionId, compressedToolIds, compressedMessageIds, compressArgs.topic, injected.expandedSummary, rawStartResult, rawEndResult, rawMessages.length, currentParams);
130
80
  state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
131
81
  state.stats.pruneTokenCounter = 0;
132
82
  state.nudgeCounter = 0;
133
- // logger.info("Compress range created", {
134
- // startMessageId: startResult.messageId,
135
- // endMessageId: endResult.messageId,
136
- // toolIdsRemoved: containedToolIds.length,
137
- // messagesInRange: containedMessageIds.length,
138
- // estimatedTokens: estimatedCompressedTokens,
139
- // })
140
- saveSessionState(state, logger).catch((err) => logger.error("Failed to persist state", { error: err.message }));
83
+ await saveSessionState(state, logger);
141
84
  return `Compressed ${compressedMessageIds.length} messages (${compressedToolIds.length} tool calls) into summary. The content will be replaced with your summary.`;
142
85
  },
143
86
  });
144
87
  }
88
+ function getBoundaryMessageId(reference) {
89
+ if (reference.kind === "message") {
90
+ if (!reference.messageId) {
91
+ throw new Error("Failed to map boundary matches back to raw messages");
92
+ }
93
+ return reference.messageId;
94
+ }
95
+ if (!reference.anchorMessageId) {
96
+ throw new Error("Failed to map boundary matches back to raw messages");
97
+ }
98
+ return reference.anchorMessageId;
99
+ }
145
100
  //# sourceMappingURL=compress.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compress.js","sourceRoot":"","sources":["../../../lib/tools/compress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compress.js","sourceRoot":"","sources":["../../../lib/tools/compress.ts"],"names":[],"mappings":"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"}
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": "2.1.3",
4
+ "version": "2.1.4",
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",
@@ -44,9 +44,7 @@
44
44
  "dependencies": {
45
45
  "@anthropic-ai/tokenizer": "^0.0.4",
46
46
  "@opencode-ai/sdk": "^1.1.48",
47
- "fuzzball": "^2.2.3",
48
47
  "jsonc-parser": "^3.3.1",
49
- "ulid": "^3.0.2",
50
48
  "zod": "^4.3.6"
51
49
  },
52
50
  "devDependencies": {
@@ -1,14 +0,0 @@
1
- import type { WithParts } from "../state";
2
- import type { Logger } from "../logger";
3
- export interface FuzzyConfig {
4
- minScore: number;
5
- minGap: number;
6
- }
7
- export declare const DEFAULT_FUZZY_CONFIG: FuzzyConfig;
8
- export declare function findStringInMessages(messages: WithParts[], searchString: string, logger: Logger, stringType: "startString" | "endString", fuzzyConfig?: FuzzyConfig): {
9
- messageId: string;
10
- messageIndex: number;
11
- };
12
- export declare function collectToolIdsInRange(messages: WithParts[], startIndex: number, endIndex: number): string[];
13
- export declare function collectMessageIdsInRange(messages: WithParts[], startIndex: number, endIndex: number): string[];
14
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../lib/tools/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAGvC,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,oBAAoB,EAAE,WAGlC,CAAA;AAsHD,wBAAgB,oBAAoB,CAChC,QAAQ,EAAE,SAAS,EAAE,EACrB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,aAAa,GAAG,WAAW,EACvC,WAAW,GAAE,WAAkC,GAChD;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAkE7C;AAED,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,SAAS,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACjB,MAAM,EAAE,CAiBV;AAED,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,SAAS,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACjB,MAAM,EAAE,CAWV"}
@@ -1,171 +0,0 @@
1
- import { partial_ratio } from "fuzzball";
2
- import { isIgnoredUserMessage } from "../messages/utils";
3
- export const DEFAULT_FUZZY_CONFIG = {
4
- minScore: 95,
5
- minGap: 15,
6
- };
7
- function extractMessageContent(msg) {
8
- const parts = Array.isArray(msg.parts) ? msg.parts : [];
9
- let content = "";
10
- for (const part of parts) {
11
- const p = part;
12
- if (part.ignored) {
13
- continue;
14
- }
15
- switch (part.type) {
16
- case "text":
17
- case "reasoning":
18
- if (typeof p.text === "string") {
19
- content += " " + p.text;
20
- }
21
- break;
22
- case "tool": {
23
- const state = p.state;
24
- if (!state)
25
- break;
26
- // Include tool output (completed or error)
27
- if (state.status === "completed" && typeof state.output === "string") {
28
- content += " " + state.output;
29
- }
30
- else if (state.status === "error" && typeof state.error === "string") {
31
- content += " " + state.error;
32
- }
33
- // Include tool input
34
- if (state.input) {
35
- content +=
36
- " " +
37
- (typeof state.input === "string"
38
- ? state.input
39
- : JSON.stringify(state.input));
40
- }
41
- break;
42
- }
43
- case "compaction":
44
- if (typeof p.summary === "string") {
45
- content += " " + p.summary;
46
- }
47
- break;
48
- case "subtask":
49
- if (typeof p.summary === "string") {
50
- content += " " + p.summary;
51
- }
52
- if (typeof p.result === "string") {
53
- content += " " + p.result;
54
- }
55
- break;
56
- }
57
- }
58
- return content;
59
- }
60
- function findExactMatches(messages, searchString) {
61
- const matches = [];
62
- for (let i = 0; i < messages.length; i++) {
63
- const msg = messages[i];
64
- if (isIgnoredUserMessage(msg)) {
65
- continue;
66
- }
67
- const content = extractMessageContent(msg);
68
- if (content.includes(searchString)) {
69
- matches.push({
70
- messageId: msg.info.id,
71
- messageIndex: i,
72
- score: 100,
73
- matchType: "exact",
74
- });
75
- }
76
- }
77
- return matches;
78
- }
79
- function findFuzzyMatches(messages, searchString, minScore) {
80
- const matches = [];
81
- for (let i = 0; i < messages.length; i++) {
82
- const msg = messages[i];
83
- if (isIgnoredUserMessage(msg)) {
84
- continue;
85
- }
86
- const content = extractMessageContent(msg);
87
- const score = partial_ratio(searchString, content);
88
- if (score >= minScore) {
89
- matches.push({
90
- messageId: msg.info.id,
91
- messageIndex: i,
92
- score,
93
- matchType: "fuzzy",
94
- });
95
- }
96
- }
97
- return matches;
98
- }
99
- export function findStringInMessages(messages, searchString, logger, stringType, fuzzyConfig = DEFAULT_FUZZY_CONFIG) {
100
- const searchableMessages = messages.length > 1 ? messages.slice(0, -1) : messages;
101
- const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;
102
- const exactMatches = findExactMatches(searchableMessages, searchString);
103
- if (exactMatches.length === 1) {
104
- return { messageId: exactMatches[0].messageId, messageIndex: exactMatches[0].messageIndex };
105
- }
106
- if (exactMatches.length > 1) {
107
- throw new Error(`Found multiple matches for ${stringType}. ` +
108
- `Provide more surrounding context to uniquely identify the intended match.`);
109
- }
110
- const fuzzyMatches = findFuzzyMatches(searchableMessages, searchString, fuzzyConfig.minScore);
111
- if (fuzzyMatches.length === 0) {
112
- if (lastMessage && !isIgnoredUserMessage(lastMessage)) {
113
- const lastMsgContent = extractMessageContent(lastMessage);
114
- const lastMsgIndex = messages.length - 1;
115
- if (lastMsgContent.includes(searchString)) {
116
- // logger.info(
117
- // `${stringType} found in last message (last resort) at index ${lastMsgIndex}`,
118
- // )
119
- return {
120
- messageId: lastMessage.info.id,
121
- messageIndex: lastMsgIndex,
122
- };
123
- }
124
- }
125
- throw new Error(`${stringType} not found in conversation. ` +
126
- `Make sure the string exists and is spelled exactly as it appears.`);
127
- }
128
- fuzzyMatches.sort((a, b) => b.score - a.score);
129
- const best = fuzzyMatches[0];
130
- const secondBest = fuzzyMatches[1];
131
- // Log fuzzy match candidates
132
- // logger.info(
133
- // `Fuzzy match for ${stringType}: best=${best.score}% (msg ${best.messageIndex})` +
134
- // (secondBest
135
- // ? `, secondBest=${secondBest.score}% (msg ${secondBest.messageIndex})`
136
- // : ""),
137
- // )
138
- // Check confidence gap - best must be significantly better than second best
139
- if (secondBest && best.score - secondBest.score < fuzzyConfig.minGap) {
140
- throw new Error(`Found multiple matches for ${stringType}. ` +
141
- `Provide more unique surrounding context to disambiguate.`);
142
- }
143
- logger.info(`Fuzzy matched ${stringType} with ${best.score}% confidence at message index ${best.messageIndex}`);
144
- return { messageId: best.messageId, messageIndex: best.messageIndex };
145
- }
146
- export function collectToolIdsInRange(messages, startIndex, endIndex) {
147
- const toolIds = [];
148
- for (let i = startIndex; i <= endIndex; i++) {
149
- const msg = messages[i];
150
- const parts = Array.isArray(msg.parts) ? msg.parts : [];
151
- for (const part of parts) {
152
- if (part.type === "tool" && part.callID) {
153
- if (!toolIds.includes(part.callID)) {
154
- toolIds.push(part.callID);
155
- }
156
- }
157
- }
158
- }
159
- return toolIds;
160
- }
161
- export function collectMessageIdsInRange(messages, startIndex, endIndex) {
162
- const messageIds = [];
163
- for (let i = startIndex; i <= endIndex; i++) {
164
- const msgId = messages[i].info.id;
165
- if (!messageIds.includes(msgId)) {
166
- messageIds.push(msgId);
167
- }
168
- }
169
- return messageIds;
170
- }
171
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../lib/tools/utils.ts"],"names":[],"mappings":"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"}