@tarquinen/opencode-dcp 1.1.2 → 1.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.
- package/README.md +2 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +0 -8
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +12 -87
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/hooks.d.ts +0 -3
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +0 -23
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/messages/index.d.ts +2 -1
- package/dist/lib/messages/index.d.ts.map +1 -1
- package/dist/lib/messages/index.js +2 -1
- package/dist/lib/messages/index.js.map +1 -1
- package/dist/lib/messages/inject.d.ts +5 -0
- package/dist/lib/messages/inject.d.ts.map +1 -0
- package/dist/lib/messages/inject.js +100 -0
- package/dist/lib/messages/inject.js.map +1 -0
- package/dist/lib/messages/prune.d.ts +0 -1
- package/dist/lib/messages/prune.d.ts.map +1 -1
- package/dist/lib/messages/prune.js +5 -98
- package/dist/lib/messages/prune.js.map +1 -1
- package/dist/lib/messages/utils.d.ts +1 -1
- package/dist/lib/messages/utils.d.ts.map +1 -1
- package/dist/lib/messages/utils.js +15 -1
- package/dist/lib/messages/utils.js.map +1 -1
- package/dist/lib/prompts/index.d.ts +2 -0
- package/dist/lib/prompts/index.d.ts.map +1 -0
- package/dist/lib/prompts/index.js +13 -0
- package/dist/lib/prompts/index.js.map +1 -0
- package/dist/lib/state/state.d.ts.map +1 -1
- package/dist/lib/state/state.js +2 -0
- package/dist/lib/state/state.js.map +1 -1
- package/dist/lib/state/types.d.ts +2 -1
- package/dist/lib/state/types.d.ts.map +1 -1
- package/dist/lib/strategies/index.d.ts +0 -1
- package/dist/lib/strategies/index.d.ts.map +1 -1
- package/dist/lib/strategies/index.js +0 -1
- package/dist/lib/strategies/index.js.map +1 -1
- package/dist/lib/strategies/tools.js +2 -2
- package/dist/lib/strategies/tools.js.map +1 -1
- package/dist/lib/strategies/utils.d.ts +2 -1
- package/dist/lib/strategies/utils.d.ts.map +1 -1
- package/dist/lib/strategies/utils.js +13 -6
- package/dist/lib/strategies/utils.js.map +1 -1
- package/dist/lib/ui/notification.d.ts.map +1 -1
- package/dist/lib/ui/notification.js +2 -0
- package/dist/lib/ui/notification.js.map +1 -1
- package/package.json +3 -6
- package/dist/lib/model-selector.d.ts +0 -17
- package/dist/lib/model-selector.d.ts.map +0 -1
- package/dist/lib/model-selector.js +0 -141
- package/dist/lib/model-selector.js.map +0 -1
- package/dist/lib/prompt.d.ts +0 -3
- package/dist/lib/prompt.d.ts.map +0 -1
- package/dist/lib/prompt.js +0 -128
- package/dist/lib/prompt.js.map +0 -1
- package/dist/lib/prompts/on-idle-analysis.txt +0 -30
- package/dist/lib/strategies/on-idle.d.ts +0 -14
- package/dist/lib/strategies/on-idle.d.ts.map +0 -1
- package/dist/lib/strategies/on-idle.js +0 -220
- package/dist/lib/strategies/on-idle.js.map +0 -1
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
export const FALLBACK_MODELS = {
|
|
2
|
-
openai: "gpt-5-mini",
|
|
3
|
-
anthropic: "claude-haiku-4-5", //This model isn't broken in opencode-auth-provider
|
|
4
|
-
google: "gemini-2.5-flash",
|
|
5
|
-
deepseek: "deepseek-chat",
|
|
6
|
-
xai: "grok-4-fast",
|
|
7
|
-
alibaba: "qwen3-coder-flash",
|
|
8
|
-
zai: "glm-4.5-flash",
|
|
9
|
-
opencode: "big-pickle",
|
|
10
|
-
};
|
|
11
|
-
const PROVIDER_PRIORITY = [
|
|
12
|
-
"openai",
|
|
13
|
-
"anthropic",
|
|
14
|
-
"google",
|
|
15
|
-
"deepseek",
|
|
16
|
-
"xai",
|
|
17
|
-
"alibaba",
|
|
18
|
-
"zai",
|
|
19
|
-
"opencode",
|
|
20
|
-
];
|
|
21
|
-
// TODO: some anthropic provided models aren't supported by the opencode-auth-provider package, so this provides a temporary workaround
|
|
22
|
-
const SKIP_PROVIDERS = ["github-copilot", "anthropic"];
|
|
23
|
-
function shouldSkipProvider(providerID) {
|
|
24
|
-
const normalized = providerID.toLowerCase().trim();
|
|
25
|
-
return SKIP_PROVIDERS.some((skip) => normalized.includes(skip.toLowerCase()));
|
|
26
|
-
}
|
|
27
|
-
async function importOpencodeAI(logger, maxRetries = 3, delayMs = 100, workspaceDir) {
|
|
28
|
-
let lastError;
|
|
29
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
30
|
-
try {
|
|
31
|
-
const { OpencodeAI } = await import("@tarquinen/opencode-auth-provider");
|
|
32
|
-
return new OpencodeAI({ workspaceDir });
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
lastError = error;
|
|
36
|
-
if (error.message?.includes("before initialization")) {
|
|
37
|
-
logger?.debug(`Import attempt ${attempt}/${maxRetries} failed, will retry`, {
|
|
38
|
-
error: error.message,
|
|
39
|
-
});
|
|
40
|
-
if (attempt < maxRetries) {
|
|
41
|
-
await new Promise((resolve) => setTimeout(resolve, delayMs * attempt));
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
throw error;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
throw lastError;
|
|
49
|
-
}
|
|
50
|
-
export async function selectModel(currentModel, logger, configModel, workspaceDir) {
|
|
51
|
-
const opencodeAI = await importOpencodeAI(logger, 3, 100, workspaceDir);
|
|
52
|
-
let failedModelInfo;
|
|
53
|
-
if (configModel) {
|
|
54
|
-
const parts = configModel.split("/");
|
|
55
|
-
if (parts.length !== 2) {
|
|
56
|
-
logger?.warn("Invalid config model format", { configModel });
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
const [providerID, modelID] = parts;
|
|
60
|
-
try {
|
|
61
|
-
const model = await opencodeAI.getLanguageModel(providerID, modelID);
|
|
62
|
-
return {
|
|
63
|
-
model,
|
|
64
|
-
modelInfo: { providerID, modelID },
|
|
65
|
-
source: "config",
|
|
66
|
-
reason: "Using model specified in dcp.jsonc config",
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
logger?.warn(`Config model failed: ${providerID}/${modelID}`, {
|
|
71
|
-
error: error.message,
|
|
72
|
-
});
|
|
73
|
-
failedModelInfo = { providerID, modelID };
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (currentModel) {
|
|
78
|
-
if (shouldSkipProvider(currentModel.providerID)) {
|
|
79
|
-
if (!failedModelInfo) {
|
|
80
|
-
failedModelInfo = currentModel;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
try {
|
|
85
|
-
const model = await opencodeAI.getLanguageModel(currentModel.providerID, currentModel.modelID);
|
|
86
|
-
return {
|
|
87
|
-
model,
|
|
88
|
-
modelInfo: currentModel,
|
|
89
|
-
source: "user-model",
|
|
90
|
-
reason: "Using current session model",
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
if (!failedModelInfo) {
|
|
95
|
-
failedModelInfo = currentModel;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
const providers = await opencodeAI.listProviders();
|
|
101
|
-
for (const providerID of PROVIDER_PRIORITY) {
|
|
102
|
-
if (!providers[providerID])
|
|
103
|
-
continue;
|
|
104
|
-
const fallbackModelID = FALLBACK_MODELS[providerID];
|
|
105
|
-
if (!fallbackModelID)
|
|
106
|
-
continue;
|
|
107
|
-
try {
|
|
108
|
-
const model = await opencodeAI.getLanguageModel(providerID, fallbackModelID);
|
|
109
|
-
return {
|
|
110
|
-
model,
|
|
111
|
-
modelInfo: { providerID, modelID: fallbackModelID },
|
|
112
|
-
source: "fallback",
|
|
113
|
-
reason: `Using ${providerID}/${fallbackModelID}`,
|
|
114
|
-
failedModel: failedModelInfo,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
catch (error) {
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
throw new Error("No available models for analysis. Please authenticate with at least one provider.");
|
|
122
|
-
}
|
|
123
|
-
export function extractModelFromSession(sessionState, logger) {
|
|
124
|
-
if (sessionState?.model?.providerID && sessionState?.model?.modelID) {
|
|
125
|
-
return {
|
|
126
|
-
providerID: sessionState.model.providerID,
|
|
127
|
-
modelID: sessionState.model.modelID,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
if (sessionState?.messages && Array.isArray(sessionState.messages)) {
|
|
131
|
-
const lastMessage = sessionState.messages[sessionState.messages.length - 1];
|
|
132
|
-
if (lastMessage?.model?.providerID && lastMessage?.model?.modelID) {
|
|
133
|
-
return {
|
|
134
|
-
providerID: lastMessage.model.providerID,
|
|
135
|
-
modelID: lastMessage.model.modelID,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return undefined;
|
|
140
|
-
}
|
|
141
|
-
//# sourceMappingURL=model-selector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model-selector.js","sourceRoot":"","sources":["../../lib/model-selector.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/prompt.d.ts
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export declare function loadPrompt(name: string, vars?: Record<string, string>): string;
|
|
2
|
-
export declare function buildAnalysisPrompt(unprunedToolCallIds: string[], messages: any[], alreadyPrunedIds?: string[], protectedToolCallIds?: string[]): string;
|
|
3
|
-
//# sourceMappingURL=prompt.d.ts.map
|
package/dist/lib/prompt.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../lib/prompt.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAS9E;AA2HD,wBAAgB,mBAAmB,CAC/B,mBAAmB,EAAE,MAAM,EAAE,EAC7B,QAAQ,EAAE,GAAG,EAAE,EACf,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,GAChC,MAAM,CAQR"}
|
package/dist/lib/prompt.js
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "fs";
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
export function loadPrompt(name, vars) {
|
|
4
|
-
const filePath = join(__dirname, "prompts", `${name}.txt`);
|
|
5
|
-
let content = readFileSync(filePath, "utf8").trim();
|
|
6
|
-
if (vars) {
|
|
7
|
-
for (const [key, value] of Object.entries(vars)) {
|
|
8
|
-
content = content.replace(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
return content;
|
|
12
|
-
}
|
|
13
|
-
function minimizeMessages(messages, alreadyPrunedIds, protectedToolCallIds) {
|
|
14
|
-
const prunedIdsSet = alreadyPrunedIds
|
|
15
|
-
? new Set(alreadyPrunedIds.map((id) => id.toLowerCase()))
|
|
16
|
-
: new Set();
|
|
17
|
-
const protectedIdsSet = protectedToolCallIds
|
|
18
|
-
? new Set(protectedToolCallIds.map((id) => id.toLowerCase()))
|
|
19
|
-
: new Set();
|
|
20
|
-
return messages
|
|
21
|
-
.map((msg) => {
|
|
22
|
-
const minimized = {
|
|
23
|
-
role: msg.info?.role,
|
|
24
|
-
};
|
|
25
|
-
if (msg.parts) {
|
|
26
|
-
minimized.parts = msg.parts
|
|
27
|
-
.filter((part) => {
|
|
28
|
-
if (part.type === "step-start" || part.type === "step-finish") {
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
return true;
|
|
32
|
-
})
|
|
33
|
-
.map((part) => {
|
|
34
|
-
if (part.type === "text") {
|
|
35
|
-
if (part.ignored) {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
return {
|
|
39
|
-
type: "text",
|
|
40
|
-
text: part.text,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
// TODO: This should use the opencode normalized system instead of per provider settings
|
|
44
|
-
if (part.type === "reasoning") {
|
|
45
|
-
// Calculate encrypted content size if present
|
|
46
|
-
let encryptedContentLength = 0;
|
|
47
|
-
if (part.metadata?.openai?.reasoningEncryptedContent) {
|
|
48
|
-
encryptedContentLength =
|
|
49
|
-
part.metadata.openai.reasoningEncryptedContent.length;
|
|
50
|
-
}
|
|
51
|
-
else if (part.metadata?.anthropic?.signature) {
|
|
52
|
-
encryptedContentLength = part.metadata.anthropic.signature.length;
|
|
53
|
-
}
|
|
54
|
-
else if (part.metadata?.google?.thoughtSignature) {
|
|
55
|
-
encryptedContentLength =
|
|
56
|
-
part.metadata.google.thoughtSignature.length;
|
|
57
|
-
}
|
|
58
|
-
return {
|
|
59
|
-
type: "reasoning",
|
|
60
|
-
text: part.text,
|
|
61
|
-
textLength: part.text?.length || 0,
|
|
62
|
-
encryptedContentLength,
|
|
63
|
-
...(part.time && { time: part.time }),
|
|
64
|
-
...(part.metadata && { metadataKeys: Object.keys(part.metadata) }),
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
if (part.type === "tool") {
|
|
68
|
-
const callIDLower = part.callID?.toLowerCase();
|
|
69
|
-
const isAlreadyPruned = prunedIdsSet.has(callIDLower);
|
|
70
|
-
const isProtected = protectedIdsSet.has(callIDLower);
|
|
71
|
-
let displayCallID = part.callID;
|
|
72
|
-
if (isAlreadyPruned) {
|
|
73
|
-
displayCallID = "<already-pruned>";
|
|
74
|
-
}
|
|
75
|
-
else if (isProtected) {
|
|
76
|
-
displayCallID = "<protected>";
|
|
77
|
-
}
|
|
78
|
-
const toolPart = {
|
|
79
|
-
type: "tool",
|
|
80
|
-
toolCallID: displayCallID,
|
|
81
|
-
tool: part.tool,
|
|
82
|
-
};
|
|
83
|
-
if (part.state?.output) {
|
|
84
|
-
toolPart.output = part.state.output;
|
|
85
|
-
}
|
|
86
|
-
if (part.state?.input) {
|
|
87
|
-
const input = part.state.input;
|
|
88
|
-
if (input.filePath &&
|
|
89
|
-
(part.tool === "write" ||
|
|
90
|
-
part.tool === "edit" ||
|
|
91
|
-
part.tool === "multiedit" ||
|
|
92
|
-
part.tool === "patch")) {
|
|
93
|
-
toolPart.input = input;
|
|
94
|
-
}
|
|
95
|
-
else if (input.filePath) {
|
|
96
|
-
toolPart.input = { filePath: input.filePath };
|
|
97
|
-
}
|
|
98
|
-
else if (input.tool_calls && Array.isArray(input.tool_calls)) {
|
|
99
|
-
toolPart.input = {
|
|
100
|
-
batch_summary: `${input.tool_calls.length} tool calls`,
|
|
101
|
-
tools: input.tool_calls.map((tc) => tc.tool),
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
toolPart.input = input;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return toolPart;
|
|
109
|
-
}
|
|
110
|
-
return null;
|
|
111
|
-
})
|
|
112
|
-
.filter(Boolean);
|
|
113
|
-
}
|
|
114
|
-
return minimized;
|
|
115
|
-
})
|
|
116
|
-
.filter((msg) => {
|
|
117
|
-
return msg.parts && msg.parts.length > 0;
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
export function buildAnalysisPrompt(unprunedToolCallIds, messages, alreadyPrunedIds, protectedToolCallIds) {
|
|
121
|
-
const minimizedMessages = minimizeMessages(messages, alreadyPrunedIds, protectedToolCallIds);
|
|
122
|
-
const messagesJson = JSON.stringify(minimizedMessages, null, 2).replace(/\\n/g, "\n");
|
|
123
|
-
return loadPrompt("on-idle-analysis", {
|
|
124
|
-
available_tool_call_ids: unprunedToolCallIds.join(", "),
|
|
125
|
-
session_history: messagesJson,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=prompt.js.map
|
package/dist/lib/prompt.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../lib/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
You are a conversation analyzer that identifies obsolete tool outputs in a coding session.
|
|
2
|
-
|
|
3
|
-
Your task: Analyze the session history and identify tool call IDs whose outputs are NO LONGER RELEVANT to the current conversation context.
|
|
4
|
-
|
|
5
|
-
Guidelines for identifying obsolete tool calls:
|
|
6
|
-
1. Exploratory reads that didn't lead to actual edits or meaningful discussion AND were not explicitly requested to be retained
|
|
7
|
-
2. Tool outputs from debugging/fixing an error that has now been resolved
|
|
8
|
-
3. Failed or incorrect tool attempts that were immediately corrected (e.g., reading a file from the wrong path, then reading from the correct path)
|
|
9
|
-
|
|
10
|
-
DO NOT prune:
|
|
11
|
-
- Tool calls whose outputs are actively being discussed
|
|
12
|
-
- Tool calls that produced errors still being debugged
|
|
13
|
-
- Tool calls that are the MOST RECENT activity in the conversation (these may be intended for future use)
|
|
14
|
-
|
|
15
|
-
IMPORTANT: Available tool call IDs for analysis: {{available_tool_call_ids}}
|
|
16
|
-
|
|
17
|
-
The session history below may contain tool calls with IDs not in the available list above, these cannot be pruned. These are either:
|
|
18
|
-
1. Protected tools (marked with toolCallID "<protected>")
|
|
19
|
-
2. Already-pruned tools (marked with toolCallID "<already-pruned>")
|
|
20
|
-
|
|
21
|
-
ONLY return IDs from the available list above.
|
|
22
|
-
|
|
23
|
-
Session history (each tool call has a "toolCallID" field):
|
|
24
|
-
{{session_history}}
|
|
25
|
-
|
|
26
|
-
You MUST respond with valid JSON matching this exact schema:
|
|
27
|
-
{
|
|
28
|
-
"pruned_tool_call_ids": ["id1", "id2", ...],
|
|
29
|
-
"reasoning": "explanation of why these IDs were selected"
|
|
30
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { SessionState } from "../state";
|
|
2
|
-
import type { Logger } from "../logger";
|
|
3
|
-
import type { PluginConfig } from "../config";
|
|
4
|
-
export interface OnIdleResult {
|
|
5
|
-
prunedCount: number;
|
|
6
|
-
tokensSaved: number;
|
|
7
|
-
prunedIds: string[];
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Run the onIdle pruning strategy.
|
|
11
|
-
* This is called when the session transitions to idle state.
|
|
12
|
-
*/
|
|
13
|
-
export declare function runOnIdle(client: any, state: SessionState, logger: Logger, config: PluginConfig, workingDirectory?: string): Promise<void | null>;
|
|
14
|
-
//# sourceMappingURL=on-idle.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"on-idle.d.ts","sourceRoot":"","sources":["../../../lib/strategies/on-idle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,UAAU,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAQ7C,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,EAAE,CAAA;CACtB;AA6LD;;;GAGG;AACH,wBAAsB,SAAS,CAC3B,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,gBAAgB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAgHtB"}
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { buildAnalysisPrompt } from "../prompt";
|
|
3
|
-
import { selectModel } from "../model-selector";
|
|
4
|
-
import { saveSessionState } from "../state/persistence";
|
|
5
|
-
import { sendUnifiedNotification } from "../ui/notification";
|
|
6
|
-
import { calculateTokensSaved, getCurrentParams } from "./utils";
|
|
7
|
-
import { isMessageCompacted } from "../shared-utils";
|
|
8
|
-
/**
|
|
9
|
-
* Parse messages to extract tool information.
|
|
10
|
-
*/
|
|
11
|
-
function parseMessages(state, messages, toolParametersCache) {
|
|
12
|
-
const toolCallIds = [];
|
|
13
|
-
const toolMetadata = new Map();
|
|
14
|
-
for (const msg of messages) {
|
|
15
|
-
if (isMessageCompacted(state, msg)) {
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
if (msg.parts) {
|
|
19
|
-
for (const part of msg.parts) {
|
|
20
|
-
if (part.type === "tool" && part.callID) {
|
|
21
|
-
toolCallIds.push(part.callID);
|
|
22
|
-
const cachedData = toolParametersCache.get(part.callID);
|
|
23
|
-
const parameters = cachedData?.parameters ?? part.state?.input ?? {};
|
|
24
|
-
toolMetadata.set(part.callID, {
|
|
25
|
-
tool: part.tool,
|
|
26
|
-
parameters: parameters,
|
|
27
|
-
status: part.state?.status,
|
|
28
|
-
error: part.state?.status === "error" ? part.state.error : undefined,
|
|
29
|
-
turn: cachedData?.turn ?? 0,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return { toolCallIds, toolMetadata };
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Replace pruned tool outputs in messages for LLM analysis.
|
|
39
|
-
*/
|
|
40
|
-
function replacePrunedToolOutputs(messages, prunedIds) {
|
|
41
|
-
if (prunedIds.length === 0)
|
|
42
|
-
return messages;
|
|
43
|
-
const prunedIdsSet = new Set(prunedIds);
|
|
44
|
-
return messages.map((msg) => {
|
|
45
|
-
if (!msg.parts)
|
|
46
|
-
return msg;
|
|
47
|
-
return {
|
|
48
|
-
...msg,
|
|
49
|
-
parts: msg.parts.map((part) => {
|
|
50
|
-
if (part.type === "tool" &&
|
|
51
|
-
part.callID &&
|
|
52
|
-
prunedIdsSet.has(part.callID) &&
|
|
53
|
-
part.state?.output) {
|
|
54
|
-
return {
|
|
55
|
-
...part,
|
|
56
|
-
state: {
|
|
57
|
-
...part.state,
|
|
58
|
-
output: "[Output removed to save context - information superseded or no longer needed]",
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
return part;
|
|
63
|
-
}),
|
|
64
|
-
};
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Run LLM analysis to determine which tool calls can be pruned.
|
|
69
|
-
*/
|
|
70
|
-
async function runLlmAnalysis(client, state, logger, config, messages, unprunedToolCallIds, alreadyPrunedIds, toolMetadata, workingDirectory) {
|
|
71
|
-
const protectedToolCallIds = [];
|
|
72
|
-
const prunableToolCallIds = unprunedToolCallIds.filter((id) => {
|
|
73
|
-
const metadata = toolMetadata.get(id);
|
|
74
|
-
if (metadata && config.strategies.onIdle.protectedTools.includes(metadata.tool)) {
|
|
75
|
-
protectedToolCallIds.push(id);
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
return true;
|
|
79
|
-
});
|
|
80
|
-
if (prunableToolCallIds.length === 0) {
|
|
81
|
-
return [];
|
|
82
|
-
}
|
|
83
|
-
// Get model info from messages
|
|
84
|
-
let validModelInfo = undefined;
|
|
85
|
-
if (messages.length > 0) {
|
|
86
|
-
const lastMessage = messages[messages.length - 1];
|
|
87
|
-
const model = lastMessage.info?.model;
|
|
88
|
-
if (model?.providerID && model?.modelID) {
|
|
89
|
-
validModelInfo = {
|
|
90
|
-
providerID: model.providerID,
|
|
91
|
-
modelID: model.modelID,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
const modelSelection = await selectModel(validModelInfo, logger, config.strategies.onIdle.model, workingDirectory);
|
|
96
|
-
logger.info(`OnIdle Model: ${modelSelection.modelInfo.providerID}/${modelSelection.modelInfo.modelID}`, {
|
|
97
|
-
source: modelSelection.source,
|
|
98
|
-
});
|
|
99
|
-
if (modelSelection.failedModel && config.strategies.onIdle.showModelErrorToasts) {
|
|
100
|
-
const skipAi = modelSelection.source === "fallback" && config.strategies.onIdle.strictModelSelection;
|
|
101
|
-
try {
|
|
102
|
-
await client.tui.showToast({
|
|
103
|
-
body: {
|
|
104
|
-
title: skipAi ? "DCP: AI analysis skipped" : "DCP: Model fallback",
|
|
105
|
-
message: skipAi
|
|
106
|
-
? `${modelSelection.failedModel.providerID}/${modelSelection.failedModel.modelID} failed\nAI analysis skipped (strictModelSelection enabled)`
|
|
107
|
-
: `${modelSelection.failedModel.providerID}/${modelSelection.failedModel.modelID} failed\nUsing ${modelSelection.modelInfo.providerID}/${modelSelection.modelInfo.modelID}`,
|
|
108
|
-
variant: "info",
|
|
109
|
-
duration: 5000,
|
|
110
|
-
},
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
// Ignore toast errors
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (modelSelection.source === "fallback" && config.strategies.onIdle.strictModelSelection) {
|
|
118
|
-
logger.info("Skipping AI analysis (fallback model, strictModelSelection enabled)");
|
|
119
|
-
return [];
|
|
120
|
-
}
|
|
121
|
-
const { generateObject } = await import("ai");
|
|
122
|
-
const sanitizedMessages = replacePrunedToolOutputs(messages, alreadyPrunedIds);
|
|
123
|
-
const analysisPrompt = buildAnalysisPrompt(prunableToolCallIds, sanitizedMessages, alreadyPrunedIds, protectedToolCallIds);
|
|
124
|
-
const result = await generateObject({
|
|
125
|
-
model: modelSelection.model,
|
|
126
|
-
schema: z.object({
|
|
127
|
-
pruned_tool_call_ids: z.array(z.string()),
|
|
128
|
-
reasoning: z.string(),
|
|
129
|
-
}),
|
|
130
|
-
prompt: analysisPrompt,
|
|
131
|
-
});
|
|
132
|
-
const rawLlmPrunedIds = result.object.pruned_tool_call_ids;
|
|
133
|
-
const llmPrunedIds = rawLlmPrunedIds.filter((id) => prunableToolCallIds.includes(id));
|
|
134
|
-
// Always log LLM output as debug
|
|
135
|
-
const reasoning = result.object.reasoning.replace(/\n+/g, " ").replace(/\s+/g, " ").trim();
|
|
136
|
-
logger.debug(`OnIdle LLM output`, {
|
|
137
|
-
pruned_tool_call_ids: rawLlmPrunedIds,
|
|
138
|
-
reasoning: reasoning,
|
|
139
|
-
});
|
|
140
|
-
return llmPrunedIds;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Run the onIdle pruning strategy.
|
|
144
|
-
* This is called when the session transitions to idle state.
|
|
145
|
-
*/
|
|
146
|
-
export async function runOnIdle(client, state, logger, config, workingDirectory) {
|
|
147
|
-
try {
|
|
148
|
-
if (!state.sessionId) {
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
const sessionId = state.sessionId;
|
|
152
|
-
// Fetch session info and messages
|
|
153
|
-
const [sessionInfoResponse, messagesResponse] = await Promise.all([
|
|
154
|
-
client.session.get({ path: { id: sessionId } }),
|
|
155
|
-
client.session.messages({ path: { id: sessionId } }),
|
|
156
|
-
]);
|
|
157
|
-
const sessionInfo = sessionInfoResponse.data;
|
|
158
|
-
const messages = messagesResponse.data || messagesResponse;
|
|
159
|
-
if (!messages || messages.length < 3) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
const currentParams = getCurrentParams(messages, logger);
|
|
163
|
-
const { toolCallIds, toolMetadata } = parseMessages(state, messages, state.toolParameters);
|
|
164
|
-
const alreadyPrunedIds = state.prune.toolIds;
|
|
165
|
-
const unprunedToolCallIds = toolCallIds.filter((id) => !alreadyPrunedIds.includes(id));
|
|
166
|
-
if (unprunedToolCallIds.length === 0) {
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
// Count prunable tools (excluding protected)
|
|
170
|
-
const candidateCount = unprunedToolCallIds.filter((id) => {
|
|
171
|
-
const metadata = toolMetadata.get(id);
|
|
172
|
-
return !metadata || !config.strategies.onIdle.protectedTools.includes(metadata.tool);
|
|
173
|
-
}).length;
|
|
174
|
-
if (candidateCount === 0) {
|
|
175
|
-
return null;
|
|
176
|
-
}
|
|
177
|
-
// Run LLM analysis
|
|
178
|
-
const llmPrunedIds = await runLlmAnalysis(client, state, logger, config, messages, unprunedToolCallIds, alreadyPrunedIds, toolMetadata, workingDirectory);
|
|
179
|
-
const newlyPrunedIds = llmPrunedIds.filter((id) => !alreadyPrunedIds.includes(id));
|
|
180
|
-
if (newlyPrunedIds.length === 0) {
|
|
181
|
-
return null;
|
|
182
|
-
}
|
|
183
|
-
// Log the tool IDs being pruned with their tool names
|
|
184
|
-
for (const id of newlyPrunedIds) {
|
|
185
|
-
const metadata = toolMetadata.get(id);
|
|
186
|
-
const toolName = metadata?.tool || "unknown";
|
|
187
|
-
logger.info(`OnIdle pruning tool: ${toolName}`, { callID: id });
|
|
188
|
-
}
|
|
189
|
-
// Update state
|
|
190
|
-
const allPrunedIds = [...new Set([...alreadyPrunedIds, ...newlyPrunedIds])];
|
|
191
|
-
state.prune.toolIds = allPrunedIds;
|
|
192
|
-
state.stats.pruneTokenCounter += calculateTokensSaved(state, messages, newlyPrunedIds);
|
|
193
|
-
// Build tool metadata map for notification
|
|
194
|
-
const prunedToolMetadata = new Map();
|
|
195
|
-
for (const id of newlyPrunedIds) {
|
|
196
|
-
const metadata = toolMetadata.get(id);
|
|
197
|
-
if (metadata) {
|
|
198
|
-
prunedToolMetadata.set(id, metadata);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
// Send notification
|
|
202
|
-
await sendUnifiedNotification(client, logger, config, state, sessionId, newlyPrunedIds, prunedToolMetadata, undefined, // reason
|
|
203
|
-
currentParams, workingDirectory || "");
|
|
204
|
-
state.stats.totalPruneTokens += state.stats.pruneTokenCounter;
|
|
205
|
-
state.stats.pruneTokenCounter = 0;
|
|
206
|
-
state.nudgeCounter = 0;
|
|
207
|
-
state.lastToolPrune = true;
|
|
208
|
-
// Persist state
|
|
209
|
-
const sessionName = sessionInfo?.title;
|
|
210
|
-
saveSessionState(state, logger, sessionName).catch((err) => {
|
|
211
|
-
logger.error("Failed to persist state", { error: err.message });
|
|
212
|
-
});
|
|
213
|
-
logger.info(`OnIdle: Pruned ${newlyPrunedIds.length}/${candidateCount} tools`);
|
|
214
|
-
}
|
|
215
|
-
catch (error) {
|
|
216
|
-
logger.error("OnIdle analysis failed", { error: error.message });
|
|
217
|
-
return null;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
//# sourceMappingURL=on-idle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"on-idle.js","sourceRoot":"","sources":["../../../lib/strategies/on-idle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAa,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAQpD;;GAEG;AACH,SAAS,aAAa,CAClB,KAAmB,EACnB,QAAqB,EACrB,mBAAoD;IAKpD,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8B,CAAA;IAE1D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YACjC,SAAQ;QACZ,CAAC;QACD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACtC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBAE7B,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBACvD,MAAM,UAAU,GAAG,UAAU,EAAE,UAAU,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAA;oBAEpE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE;wBAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,UAAU,EAAE,UAAU;wBACtB,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM;wBAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;wBACpE,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC;qBAC9B,CAAC,CAAA;gBACN,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAA;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,QAAqB,EAAE,SAAmB;IACxE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAA;IAE3C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;IAEvC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACxB,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO,GAAG,CAAA;QAE1B,OAAO;YACH,GAAG,GAAG;YACN,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;gBAC/B,IACI,IAAI,CAAC,IAAI,KAAK,MAAM;oBACpB,IAAI,CAAC,MAAM;oBACX,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;oBAC7B,IAAI,CAAC,KAAK,EAAE,MAAM,EACpB,CAAC;oBACC,OAAO;wBACH,GAAG,IAAI;wBACP,KAAK,EAAE;4BACH,GAAG,IAAI,CAAC,KAAK;4BACb,MAAM,EAAE,+EAA+E;yBAC1F;qBACJ,CAAA;gBACL,CAAC;gBACD,OAAO,IAAI,CAAA;YACf,CAAC,CAAC;SACL,CAAA;IACL,CAAC,CAAgB,CAAA;AACrB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CACzB,MAAW,EACX,KAAmB,EACnB,MAAc,EACd,MAAoB,EACpB,QAAqB,EACrB,mBAA6B,EAC7B,gBAA0B,EAC1B,YAA6C,EAC7C,gBAAyB;IAEzB,MAAM,oBAAoB,GAAa,EAAE,CAAA;IACzC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACrC,IAAI,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9E,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC7B,OAAO,KAAK,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAA;IACb,CAAC;IAED,+BAA+B;IAC/B,IAAI,cAAc,GAA0B,SAAS,CAAA;IACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACjD,MAAM,KAAK,GAAI,WAAW,CAAC,IAAY,EAAE,KAAK,CAAA;QAC9C,IAAI,KAAK,EAAE,UAAU,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;YACtC,cAAc,GAAG;gBACb,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;aACzB,CAAA;QACL,CAAC;IACL,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,WAAW,CACpC,cAAc,EACd,MAAM,EACN,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAC9B,gBAAgB,CACnB,CAAA;IAED,MAAM,CAAC,IAAI,CACP,iBAAiB,cAAc,CAAC,SAAS,CAAC,UAAU,IAAI,cAAc,CAAC,SAAS,CAAC,OAAO,EAAE,EAC1F;QACI,MAAM,EAAE,cAAc,CAAC,MAAM;KAChC,CACJ,CAAA;IAED,IAAI,cAAc,CAAC,WAAW,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAC9E,MAAM,MAAM,GACR,cAAc,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAA;QACzF,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;gBACvB,IAAI,EAAE;oBACF,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,qBAAqB;oBAClE,OAAO,EAAE,MAAM;wBACX,CAAC,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC,UAAU,IAAI,cAAc,CAAC,WAAW,CAAC,OAAO,6DAA6D;wBAC7I,CAAC,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC,UAAU,IAAI,cAAc,CAAC,WAAW,CAAC,OAAO,kBAAkB,cAAc,CAAC,SAAS,CAAC,UAAU,IAAI,cAAc,CAAC,SAAS,CAAC,OAAO,EAAE;oBAC/K,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,IAAI;iBACjB;aACJ,CAAC,CAAA;QACN,CAAC;QAAC,MAAM,CAAC;YACL,sBAAsB;QAC1B,CAAC;IACL,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;QACxF,MAAM,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAA;QAClF,OAAO,EAAE,CAAA;IACb,CAAC;IAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;IAE7C,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;IAE9E,MAAM,cAAc,GAAG,mBAAmB,CACtC,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,CACvB,CAAA;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QAChC,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACb,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;SACxB,CAAC;QACF,MAAM,EAAE,cAAc;KACzB,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAA;IAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;IAErF,iCAAiC;IACjC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1F,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE;QAC9B,oBAAoB,EAAE,eAAe;QACrC,SAAS,EAAE,SAAS;KACvB,CAAC,CAAA;IAEF,OAAO,YAAY,CAAA;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,MAAW,EACX,KAAmB,EACnB,MAAc,EACd,MAAoB,EACpB,gBAAyB;IAEzB,IAAI,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAA;QACf,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;QAEjC,kCAAkC;QAClC,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC;SACvD,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAA;QAC5C,MAAM,QAAQ,GAAgB,gBAAgB,CAAC,IAAI,IAAI,gBAAgB,CAAA;QAEvE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAA;QACf,CAAC;QAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACxD,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAA;QAE1F,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAA;QAC5C,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;QAEtF,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAA;QACf,CAAC;QAED,6CAA6C;QAC7C,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;YACrD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACrC,OAAO,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACxF,CAAC,CAAC,CAAC,MAAM,CAAA;QAET,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAA;QACf,CAAC;QAED,mBAAmB;QACnB,MAAM,YAAY,GAAG,MAAM,cAAc,CACrC,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,CACnB,CAAA;QAED,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;QAElF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACf,CAAC;QAED,sDAAsD;QACtD,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACrC,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAAI,IAAI,SAAS,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,wBAAwB,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;QACnE,CAAC;QAED,eAAe;QACf,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,gBAAgB,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;QAC3E,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,YAAY,CAAA;QAElC,KAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAA;QAEtF,2CAA2C;QAC3C,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAA8B,CAAA;QAChE,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACrC,IAAI,QAAQ,EAAE,CAAC;gBACX,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;YACxC,CAAC;QACL,CAAC;QAED,oBAAoB;QACpB,MAAM,uBAAuB,CACzB,MAAM,EACN,MAAM,EACN,MAAM,EACN,KAAK,EACL,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,SAAS,EAAE,SAAS;QACpB,aAAa,EACb,gBAAgB,IAAI,EAAE,CACzB,CAAA;QAED,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAA;QAC7D,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAA;QACjC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAA;QACtB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAA;QAE1B,gBAAgB;QAChB,MAAM,WAAW,GAAG,WAAW,EAAE,KAAK,CAAA;QACtC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACvD,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QACnE,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,kBAAkB,cAAc,CAAC,MAAM,IAAI,cAAc,QAAQ,CAAC,CAAA;IAClF,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAChE,OAAO,IAAI,CAAA;IACf,CAAC;AACL,CAAC"}
|