@simonepri/refined-antigravity-acp 0.2.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cli.js +2 -51
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +44 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/{command.d.ts → core/command.d.ts} +4 -0
- package/dist/src/core/command.d.ts.map +1 -0
- package/dist/src/{command.js → core/command.js} +27 -11
- package/dist/src/core/command.js.map +1 -0
- package/dist/src/core/pipeline.d.ts +20 -0
- package/dist/src/core/pipeline.d.ts.map +1 -0
- package/dist/src/core/pipeline.js +94 -0
- package/dist/src/core/pipeline.js.map +1 -0
- package/dist/src/core/session-cache.d.ts +12 -0
- package/dist/src/core/session-cache.d.ts.map +1 -0
- package/dist/src/core/session-cache.js +85 -0
- package/dist/src/core/session-cache.js.map +1 -0
- package/dist/src/core/supervisor.d.ts +90 -0
- package/dist/src/core/supervisor.d.ts.map +1 -0
- package/dist/src/core/supervisor.js +582 -0
- package/dist/src/core/supervisor.js.map +1 -0
- package/dist/src/core/telemetry.d.ts +23 -0
- package/dist/src/core/telemetry.d.ts.map +1 -0
- package/dist/src/core/telemetry.js +75 -0
- package/dist/src/core/telemetry.js.map +1 -0
- package/dist/src/core/transport.d.ts +7 -0
- package/dist/src/core/transport.d.ts.map +1 -0
- package/dist/src/core/transport.js +37 -0
- package/dist/src/core/transport.js.map +1 -0
- package/dist/src/core/types.d.ts +293 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +78 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/fixes/active-turn-collision/index.d.ts +27 -0
- package/dist/src/fixes/active-turn-collision/index.d.ts.map +1 -0
- package/dist/src/fixes/active-turn-collision/index.js +117 -0
- package/dist/src/fixes/active-turn-collision/index.js.map +1 -0
- package/dist/src/fixes/cancellation-leak/index.d.ts +17 -0
- package/dist/src/fixes/cancellation-leak/index.d.ts.map +1 -0
- package/dist/src/fixes/cancellation-leak/index.js +57 -0
- package/dist/src/fixes/cancellation-leak/index.js.map +1 -0
- package/dist/src/fixes/dangling-tool-calls/index.d.ts +32 -0
- package/dist/src/fixes/dangling-tool-calls/index.d.ts.map +1 -0
- package/dist/src/fixes/dangling-tool-calls/index.js +188 -0
- package/dist/src/fixes/dangling-tool-calls/index.js.map +1 -0
- package/dist/src/fixes/dropped-history-chunks/index.d.ts +47 -0
- package/dist/src/fixes/dropped-history-chunks/index.d.ts.map +1 -0
- package/dist/src/fixes/dropped-history-chunks/index.js +202 -0
- package/dist/src/fixes/dropped-history-chunks/index.js.map +1 -0
- package/dist/src/fixes/flattened-model-efforts/index.d.ts +39 -0
- package/dist/src/fixes/flattened-model-efforts/index.d.ts.map +1 -0
- package/dist/src/fixes/flattened-model-efforts/index.js +306 -0
- package/dist/src/fixes/flattened-model-efforts/index.js.map +1 -0
- package/dist/src/fixes/index.d.ts +25 -0
- package/dist/src/fixes/index.d.ts.map +1 -0
- package/dist/src/fixes/index.js +61 -0
- package/dist/src/fixes/index.js.map +1 -0
- package/dist/src/fixes/malformed-stream-syntax/index.d.ts +44 -0
- package/dist/src/fixes/malformed-stream-syntax/index.d.ts.map +1 -0
- package/dist/src/fixes/malformed-stream-syntax/index.js +346 -0
- package/dist/src/fixes/malformed-stream-syntax/index.js.map +1 -0
- package/dist/src/fixes/missing-localharness/index.d.ts +20 -0
- package/dist/src/fixes/missing-localharness/index.d.ts.map +1 -0
- package/dist/src/fixes/missing-localharness/index.js +103 -0
- package/dist/src/fixes/missing-localharness/index.js.map +1 -0
- package/dist/src/fixes/missing-question-fallback/index.d.ts +30 -0
- package/dist/src/fixes/missing-question-fallback/index.d.ts.map +1 -0
- package/dist/src/fixes/missing-question-fallback/index.js +119 -0
- package/dist/src/fixes/missing-question-fallback/index.js.map +1 -0
- package/dist/src/fixes/missing-slash-skills/index.d.ts +17 -0
- package/dist/src/fixes/missing-slash-skills/index.d.ts.map +1 -0
- package/dist/src/fixes/missing-slash-skills/index.js +107 -0
- package/dist/src/fixes/missing-slash-skills/index.js.map +1 -0
- package/dist/src/{skills.d.ts → fixes/missing-slash-skills/skills.d.ts} +2 -1
- package/dist/src/fixes/missing-slash-skills/skills.d.ts.map +1 -0
- package/dist/src/fixes/missing-slash-skills/skills.js +199 -0
- package/dist/src/fixes/missing-slash-skills/skills.js.map +1 -0
- package/dist/src/fixes/missing-system-prompt/index.d.ts +19 -0
- package/dist/src/fixes/missing-system-prompt/index.d.ts.map +1 -0
- package/dist/src/fixes/missing-system-prompt/index.js +118 -0
- package/dist/src/fixes/missing-system-prompt/index.js.map +1 -0
- package/dist/src/fixes/missing-usage-metrics/index.d.ts +26 -0
- package/dist/src/fixes/missing-usage-metrics/index.d.ts.map +1 -0
- package/dist/src/fixes/missing-usage-metrics/index.js +132 -0
- package/dist/src/fixes/missing-usage-metrics/index.js.map +1 -0
- package/dist/src/fixes/noisy-stderr-logs/index.d.ts +15 -0
- package/dist/src/fixes/noisy-stderr-logs/index.d.ts.map +1 -0
- package/dist/src/fixes/noisy-stderr-logs/index.js +23 -0
- package/dist/src/fixes/noisy-stderr-logs/index.js.map +1 -0
- package/dist/src/fixes/non-canonical-mode-ids/index.d.ts +26 -0
- package/dist/src/fixes/non-canonical-mode-ids/index.d.ts.map +1 -0
- package/dist/src/fixes/non-canonical-mode-ids/index.js +47 -0
- package/dist/src/fixes/non-canonical-mode-ids/index.js.map +1 -0
- package/dist/src/fixes/orphaned-checkpoints/index.d.ts +31 -0
- package/dist/src/fixes/orphaned-checkpoints/index.d.ts.map +1 -0
- package/dist/src/fixes/orphaned-checkpoints/index.js +82 -0
- package/dist/src/fixes/orphaned-checkpoints/index.js.map +1 -0
- package/dist/src/fixes/silent-background-tasks/index.d.ts +66 -0
- package/dist/src/fixes/silent-background-tasks/index.d.ts.map +1 -0
- package/dist/src/fixes/silent-background-tasks/index.js +491 -0
- package/dist/src/fixes/silent-background-tasks/index.js.map +1 -0
- package/dist/src/{mcp-proxy.d.ts → fixes/stale-mcp-endpoints/index.d.ts} +31 -4
- package/dist/src/fixes/stale-mcp-endpoints/index.d.ts.map +1 -0
- package/dist/src/{mcp-proxy.js → fixes/stale-mcp-endpoints/index.js} +162 -14
- package/dist/src/fixes/stale-mcp-endpoints/index.js.map +1 -0
- package/dist/src/fixes/subagent-hang/index.d.ts +2 -0
- package/dist/src/fixes/subagent-hang/index.d.ts.map +1 -0
- package/dist/src/fixes/subagent-hang/index.js +2 -0
- package/dist/src/fixes/subagent-hang/index.js.map +1 -0
- package/dist/src/fixes/subagent-hang/subagent-hang.d.ts +43 -0
- package/dist/src/fixes/subagent-hang/subagent-hang.d.ts.map +1 -0
- package/dist/src/fixes/subagent-hang/subagent-hang.js +114 -0
- package/dist/src/fixes/subagent-hang/subagent-hang.js.map +1 -0
- package/dist/src/index.d.ts +27 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +43 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/protobuf.d.ts +9 -0
- package/dist/src/lib/protobuf.d.ts.map +1 -0
- package/dist/src/lib/protobuf.js +89 -0
- package/dist/src/lib/protobuf.js.map +1 -0
- package/package.json +22 -7
- package/readme.md +147 -141
- package/assets/icon.svg +0 -3
- package/build/paseo/assets/icon.svg +0 -3
- package/build/paseo/assets/logo.svg +0 -62
- package/build/paseo/index.server.ts +0 -9
- package/build/paseo/paseo-plugin.json +0 -7
- package/build/paseo/server/agy-patch.ts +0 -445
- package/build/paseo/server/auth.ts +0 -122
- package/build/paseo/server/command.ts +0 -92
- package/build/paseo/server/connector.ts +0 -1371
- package/build/paseo/server/history.ts +0 -157
- package/build/paseo/server/mcp-proxy.ts +0 -375
- package/build/paseo/server/provider.ts +0 -37
- package/build/paseo/server/sanitize.ts +0 -286
- package/build/paseo/server/skills.ts +0 -183
- package/build/paseo/server/steering.ts +0 -199
- package/dist/index.server.d.ts +0 -4
- package/dist/index.server.d.ts.map +0 -1
- package/dist/index.server.js +0 -7
- package/dist/index.server.js.map +0 -1
- package/dist/src/agy-patch.d.ts +0 -65
- package/dist/src/agy-patch.d.ts.map +0 -1
- package/dist/src/agy-patch.js +0 -351
- package/dist/src/agy-patch.js.map +0 -1
- package/dist/src/auth.d.ts +0 -27
- package/dist/src/auth.d.ts.map +0 -1
- package/dist/src/auth.js +0 -113
- package/dist/src/auth.js.map +0 -1
- package/dist/src/command.d.ts.map +0 -1
- package/dist/src/command.js.map +0 -1
- package/dist/src/connector.d.ts +0 -187
- package/dist/src/connector.d.ts.map +0 -1
- package/dist/src/connector.js +0 -1127
- package/dist/src/connector.js.map +0 -1
- package/dist/src/history.d.ts +0 -12
- package/dist/src/history.d.ts.map +0 -1
- package/dist/src/history.js +0 -152
- package/dist/src/history.js.map +0 -1
- package/dist/src/mcp-proxy.d.ts.map +0 -1
- package/dist/src/mcp-proxy.js.map +0 -1
- package/dist/src/provider.d.ts +0 -11
- package/dist/src/provider.d.ts.map +0 -1
- package/dist/src/provider.js +0 -31
- package/dist/src/provider.js.map +0 -1
- package/dist/src/sanitize.d.ts +0 -29
- package/dist/src/sanitize.d.ts.map +0 -1
- package/dist/src/sanitize.js +0 -237
- package/dist/src/sanitize.js.map +0 -1
- package/dist/src/skills.d.ts.map +0 -1
- package/dist/src/skills.js +0 -140
- package/dist/src/skills.js.map +0 -1
- package/dist/src/steering.d.ts +0 -30
- package/dist/src/steering.d.ts.map +0 -1
- package/dist/src/steering.js +0 -174
- package/dist/src/steering.js.map +0 -1
- package/paseo-plugin.json +0 -8
- package/scripts/build-paseo.js +0 -60
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Subagents and scheduled background tasks execute silently in the background. While the agent
|
|
4
|
+
* transitions into `STATE_WAITING_FOR_TASKS`, upstream `agy_acp_server` produces no stdout updates,
|
|
5
|
+
* leaving editor UIs completely frozen with no indication of ongoing background progress.
|
|
6
|
+
*
|
|
7
|
+
* Solution:
|
|
8
|
+
* Tracks subagent invocations and background tasks via telemetry and stream events, synthesizing
|
|
9
|
+
* standard ACP `session/update` notifications with `sessionUpdate: "plan"` to expose live status.
|
|
10
|
+
*/
|
|
11
|
+
import { ACP_METHODS, SESSION_UPDATES, STOP_REASONS, isMethod, } from "../../core/types.js";
|
|
12
|
+
import { extractSessionId } from "../../core/session-cache.js";
|
|
13
|
+
import { TELEMETRY_STATES, parseTrajectoryStateUpdate } from "../../core/telemetry.js";
|
|
14
|
+
export const TOOL_INVOKE_SUBAGENT = "invoke_subagent";
|
|
15
|
+
export const TOOL_SCHEDULE = "schedule";
|
|
16
|
+
export const DEFAULT_WAITING_TASK_CONTENT = "Running background subagents and tasks";
|
|
17
|
+
export function createPlanUpdateMessage(sessionId, entries) {
|
|
18
|
+
return {
|
|
19
|
+
jsonrpc: "2.0",
|
|
20
|
+
method: ACP_METHODS.SESSION_UPDATE,
|
|
21
|
+
params: {
|
|
22
|
+
sessionId,
|
|
23
|
+
update: {
|
|
24
|
+
sessionUpdate: SESSION_UPDATES.PLAN,
|
|
25
|
+
entries,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function parseSubagentItem(item) {
|
|
31
|
+
if (!item || typeof item !== "object")
|
|
32
|
+
return null;
|
|
33
|
+
const s = item;
|
|
34
|
+
return {
|
|
35
|
+
role: typeof s.Role === "string" ? s.Role : undefined,
|
|
36
|
+
prompt: typeof s.Prompt === "string" ? s.Prompt : undefined,
|
|
37
|
+
typeName: typeof s.TypeName === "string" ? s.TypeName : undefined,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function parseSubagentsFromArgs(rawArgs) {
|
|
41
|
+
if (!rawArgs)
|
|
42
|
+
return [];
|
|
43
|
+
let obj = rawArgs;
|
|
44
|
+
if (typeof rawArgs === "string") {
|
|
45
|
+
try {
|
|
46
|
+
obj = JSON.parse(rawArgs);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (!obj || typeof obj !== "object")
|
|
53
|
+
return [];
|
|
54
|
+
const subs = obj.Subagents;
|
|
55
|
+
if (!Array.isArray(subs))
|
|
56
|
+
return [];
|
|
57
|
+
return subs.map(parseSubagentItem).filter((s) => s !== null);
|
|
58
|
+
}
|
|
59
|
+
export function formatSubagentContent(info) {
|
|
60
|
+
if (info.role) {
|
|
61
|
+
return `Subagent: ${info.role}`;
|
|
62
|
+
}
|
|
63
|
+
if (info.typeName) {
|
|
64
|
+
return `Subagent: ${info.typeName}`;
|
|
65
|
+
}
|
|
66
|
+
if (info.prompt) {
|
|
67
|
+
const trimmed = info.prompt.trim();
|
|
68
|
+
const shortPrompt = trimmed.length > 50 ? `${trimmed.slice(0, 47)}...` : trimmed;
|
|
69
|
+
return `Subagent: ${shortPrompt}`;
|
|
70
|
+
}
|
|
71
|
+
return "Subagent: Background Task";
|
|
72
|
+
}
|
|
73
|
+
const MAX_TRACKED_SESSIONS = 100;
|
|
74
|
+
export class BackgroundTasksTracker {
|
|
75
|
+
sessions = new Map();
|
|
76
|
+
promptIdToSessionId = new Map();
|
|
77
|
+
getOrCreate(sessionId) {
|
|
78
|
+
let tracker = this.sessions.get(sessionId);
|
|
79
|
+
if (!tracker) {
|
|
80
|
+
if (this.sessions.size >= MAX_TRACKED_SESSIONS) {
|
|
81
|
+
const oldest = this.sessions.keys().next().value;
|
|
82
|
+
if (oldest !== undefined)
|
|
83
|
+
this.sessions.delete(oldest);
|
|
84
|
+
}
|
|
85
|
+
tracker = {
|
|
86
|
+
entries: [],
|
|
87
|
+
hasEmittedWaitingPlan: false,
|
|
88
|
+
isWaiting: false,
|
|
89
|
+
seenToolCallIds: new Set(),
|
|
90
|
+
activeToolCalls: new Map(),
|
|
91
|
+
deferredPromptResponse: null,
|
|
92
|
+
};
|
|
93
|
+
this.sessions.set(sessionId, tracker);
|
|
94
|
+
}
|
|
95
|
+
return tracker;
|
|
96
|
+
}
|
|
97
|
+
getEntries(sessionId) {
|
|
98
|
+
return this.sessions.get(sessionId)?.entries ?? [];
|
|
99
|
+
}
|
|
100
|
+
onPromptStart(sessionId, promptId) {
|
|
101
|
+
if (promptId !== undefined) {
|
|
102
|
+
this.promptIdToSessionId.set(promptId, sessionId);
|
|
103
|
+
}
|
|
104
|
+
const tracker = this.getOrCreate(sessionId);
|
|
105
|
+
tracker.entries = [];
|
|
106
|
+
tracker.hasEmittedWaitingPlan = false;
|
|
107
|
+
tracker.isWaiting = false;
|
|
108
|
+
tracker.deferredPromptResponse = null;
|
|
109
|
+
tracker.seenToolCallIds.clear();
|
|
110
|
+
tracker.activeToolCalls.clear();
|
|
111
|
+
}
|
|
112
|
+
getSessionForPromptId(promptId) {
|
|
113
|
+
return this.promptIdToSessionId.get(promptId);
|
|
114
|
+
}
|
|
115
|
+
isWaitingForTasks(sessionId) {
|
|
116
|
+
return this.sessions.get(sessionId)?.isWaiting ?? false;
|
|
117
|
+
}
|
|
118
|
+
setWaiting(sessionId, waiting) {
|
|
119
|
+
this.getOrCreate(sessionId).isWaiting = waiting;
|
|
120
|
+
}
|
|
121
|
+
recordToolCommand(sessionId, toolCallId, command) {
|
|
122
|
+
this.getOrCreate(sessionId).activeToolCalls.set(toolCallId, command);
|
|
123
|
+
}
|
|
124
|
+
getToolCommand(sessionId, toolCallId) {
|
|
125
|
+
return this.sessions.get(sessionId)?.activeToolCalls.get(toolCallId);
|
|
126
|
+
}
|
|
127
|
+
deferPromptResponse(sessionId, response) {
|
|
128
|
+
this.getOrCreate(sessionId).deferredPromptResponse = response;
|
|
129
|
+
}
|
|
130
|
+
recordSubagents(sessionId, subagents, toolCallId) {
|
|
131
|
+
if (subagents.length === 0)
|
|
132
|
+
return [];
|
|
133
|
+
const tracker = this.getOrCreate(sessionId);
|
|
134
|
+
if (toolCallId && tracker.seenToolCallIds.has(toolCallId)) {
|
|
135
|
+
return tracker.entries;
|
|
136
|
+
}
|
|
137
|
+
if (toolCallId) {
|
|
138
|
+
tracker.seenToolCallIds.add(toolCallId);
|
|
139
|
+
}
|
|
140
|
+
const newEntries = subagents.map((s) => ({
|
|
141
|
+
content: formatSubagentContent(s),
|
|
142
|
+
priority: "high",
|
|
143
|
+
status: "in_progress",
|
|
144
|
+
}));
|
|
145
|
+
tracker.entries.push(...newEntries);
|
|
146
|
+
return tracker.entries;
|
|
147
|
+
}
|
|
148
|
+
recordCustomTask(sessionId, content, priority = "medium", toolCallId) {
|
|
149
|
+
const tracker = this.getOrCreate(sessionId);
|
|
150
|
+
if (toolCallId && tracker.seenToolCallIds.has(toolCallId)) {
|
|
151
|
+
return tracker.entries;
|
|
152
|
+
}
|
|
153
|
+
if (toolCallId) {
|
|
154
|
+
tracker.seenToolCallIds.add(toolCallId);
|
|
155
|
+
}
|
|
156
|
+
tracker.entries.push({
|
|
157
|
+
content,
|
|
158
|
+
priority,
|
|
159
|
+
status: "in_progress",
|
|
160
|
+
});
|
|
161
|
+
return tracker.entries;
|
|
162
|
+
}
|
|
163
|
+
onWaitingForTasks(sessionId) {
|
|
164
|
+
const tracker = this.getOrCreate(sessionId);
|
|
165
|
+
tracker.isWaiting = true;
|
|
166
|
+
if (tracker.entries.length === 0) {
|
|
167
|
+
tracker.entries.push({
|
|
168
|
+
content: DEFAULT_WAITING_TASK_CONTENT,
|
|
169
|
+
priority: "high",
|
|
170
|
+
status: "in_progress",
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
for (const entry of tracker.entries) {
|
|
175
|
+
entry.status = "in_progress";
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
tracker.hasEmittedWaitingPlan = true;
|
|
179
|
+
return createPlanUpdateMessage(sessionId, tracker.entries);
|
|
180
|
+
}
|
|
181
|
+
onRunning(sessionId) {
|
|
182
|
+
const tracker = this.sessions.get(sessionId);
|
|
183
|
+
if (!tracker || tracker.entries.length === 0) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const hasIncomplete = tracker.entries.some((e) => e.status !== "completed");
|
|
187
|
+
if (!hasIncomplete && !tracker.hasEmittedWaitingPlan) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
tracker.isWaiting = false;
|
|
191
|
+
tracker.hasEmittedWaitingPlan = false;
|
|
192
|
+
for (const entry of tracker.entries) {
|
|
193
|
+
entry.status = "completed";
|
|
194
|
+
}
|
|
195
|
+
return createPlanUpdateMessage(sessionId, tracker.entries);
|
|
196
|
+
}
|
|
197
|
+
onIdle(sessionId, context) {
|
|
198
|
+
const tracker = this.sessions.get(sessionId);
|
|
199
|
+
if (!tracker || tracker.entries.length === 0) {
|
|
200
|
+
if (tracker?.deferredPromptResponse && context) {
|
|
201
|
+
const deferred = tracker.deferredPromptResponse;
|
|
202
|
+
tracker.deferredPromptResponse = null;
|
|
203
|
+
tracker.isWaiting = false;
|
|
204
|
+
context.forwardInbound(deferred);
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
tracker.isWaiting = false;
|
|
209
|
+
tracker.hasEmittedWaitingPlan = false;
|
|
210
|
+
for (const entry of tracker.entries) {
|
|
211
|
+
entry.status = "completed";
|
|
212
|
+
}
|
|
213
|
+
const planMsg = createPlanUpdateMessage(sessionId, tracker.entries);
|
|
214
|
+
if (tracker.deferredPromptResponse && context) {
|
|
215
|
+
const deferred = tracker.deferredPromptResponse;
|
|
216
|
+
tracker.deferredPromptResponse = null;
|
|
217
|
+
context.forwardInbound(planMsg);
|
|
218
|
+
context.forwardInbound(deferred);
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
return planMsg;
|
|
222
|
+
}
|
|
223
|
+
onCancel(sessionId) {
|
|
224
|
+
const tracker = this.sessions.get(sessionId);
|
|
225
|
+
if (!tracker)
|
|
226
|
+
return { planMsg: null, cancelPromptMsg: null };
|
|
227
|
+
tracker.isWaiting = false;
|
|
228
|
+
let cancelPromptMsg = null;
|
|
229
|
+
if (tracker.deferredPromptResponse && "id" in tracker.deferredPromptResponse) {
|
|
230
|
+
cancelPromptMsg = {
|
|
231
|
+
jsonrpc: "2.0",
|
|
232
|
+
id: tracker.deferredPromptResponse.id,
|
|
233
|
+
result: { stopReason: STOP_REASONS.CANCELLED },
|
|
234
|
+
};
|
|
235
|
+
tracker.deferredPromptResponse = null;
|
|
236
|
+
}
|
|
237
|
+
for (const entry of tracker.entries) {
|
|
238
|
+
entry.status = "completed";
|
|
239
|
+
}
|
|
240
|
+
const planMsg = tracker.entries.length > 0 ? createPlanUpdateMessage(sessionId, tracker.entries) : null;
|
|
241
|
+
return { planMsg, cancelPromptMsg };
|
|
242
|
+
}
|
|
243
|
+
onTurnEnd(sessionId) {
|
|
244
|
+
const tracker = this.sessions.get(sessionId);
|
|
245
|
+
if (!tracker || tracker.entries.length === 0 || tracker.isWaiting) {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
const hasIncomplete = tracker.entries.some((e) => e.status !== "completed");
|
|
249
|
+
if (!hasIncomplete && !tracker.hasEmittedWaitingPlan) {
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
tracker.isWaiting = false;
|
|
253
|
+
tracker.hasEmittedWaitingPlan = false;
|
|
254
|
+
for (const entry of tracker.entries) {
|
|
255
|
+
entry.status = "completed";
|
|
256
|
+
}
|
|
257
|
+
return createPlanUpdateMessage(sessionId, tracker.entries);
|
|
258
|
+
}
|
|
259
|
+
dispose() {
|
|
260
|
+
this.sessions.clear();
|
|
261
|
+
this.promptIdToSessionId.clear();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function inferFromTitle(title) {
|
|
265
|
+
if (!title)
|
|
266
|
+
return null;
|
|
267
|
+
const lower = title.toLowerCase();
|
|
268
|
+
if (lower.includes(TOOL_INVOKE_SUBAGENT))
|
|
269
|
+
return TOOL_INVOKE_SUBAGENT;
|
|
270
|
+
if (lower.includes(TOOL_SCHEDULE))
|
|
271
|
+
return TOOL_SCHEDULE;
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
function parseRawInputObject(rawInput) {
|
|
275
|
+
if (rawInput && typeof rawInput === "object")
|
|
276
|
+
return rawInput;
|
|
277
|
+
if (typeof rawInput === "string") {
|
|
278
|
+
try {
|
|
279
|
+
const parsed = JSON.parse(rawInput);
|
|
280
|
+
if (parsed && typeof parsed === "object")
|
|
281
|
+
return parsed;
|
|
282
|
+
}
|
|
283
|
+
catch { }
|
|
284
|
+
}
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
function inferFromRawInput(rawInput) {
|
|
288
|
+
const obj = parseRawInputObject(rawInput);
|
|
289
|
+
if (!obj)
|
|
290
|
+
return null;
|
|
291
|
+
if ("Subagents" in obj)
|
|
292
|
+
return TOOL_INVOKE_SUBAGENT;
|
|
293
|
+
if ("Schedule" in obj || "DurationSeconds" in obj || "CronExpression" in obj)
|
|
294
|
+
return TOOL_SCHEDULE;
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
export function inferToolName(name, title, rawInput) {
|
|
298
|
+
if (name === TOOL_INVOKE_SUBAGENT || name === TOOL_SCHEDULE)
|
|
299
|
+
return name;
|
|
300
|
+
return inferFromTitle(title ?? undefined) ?? inferFromRawInput(rawInput);
|
|
301
|
+
}
|
|
302
|
+
function extractSchedulePrompt(rawArgs) {
|
|
303
|
+
if (rawArgs && typeof rawArgs === "object") {
|
|
304
|
+
const p = rawArgs.Prompt;
|
|
305
|
+
if (typeof p === "string" && p.trim())
|
|
306
|
+
return p.trim();
|
|
307
|
+
}
|
|
308
|
+
return "Timer";
|
|
309
|
+
}
|
|
310
|
+
function extractCommandLine(rawArgs) {
|
|
311
|
+
if (!rawArgs)
|
|
312
|
+
return null;
|
|
313
|
+
let obj = rawArgs;
|
|
314
|
+
if (typeof rawArgs === "string") {
|
|
315
|
+
try {
|
|
316
|
+
obj = JSON.parse(rawArgs);
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (obj && typeof obj === "object" && "CommandLine" in obj) {
|
|
323
|
+
const cmd = obj.CommandLine;
|
|
324
|
+
if (typeof cmd === "string" && cmd.trim())
|
|
325
|
+
return cmd.trim();
|
|
326
|
+
}
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
function extractBackgroundTaskDescription(rawOutput, _toolCallId, storedCommand) {
|
|
330
|
+
if (typeof rawOutput !== "string")
|
|
331
|
+
return null;
|
|
332
|
+
if (!rawOutput.includes("Tool is running as a background task") &&
|
|
333
|
+
!rawOutput.includes("task id:")) {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
const match = rawOutput.match(/Task Description:\s*([^\n\r]+)/i);
|
|
337
|
+
let desc = match?.[1]?.trim() || storedCommand || "command";
|
|
338
|
+
if (desc.startsWith('"') && desc.endsWith('"')) {
|
|
339
|
+
desc = desc.slice(1, -1);
|
|
340
|
+
}
|
|
341
|
+
return desc;
|
|
342
|
+
}
|
|
343
|
+
function handleInboundToolCall(sessionId, toolName, toolArgs, tracker, toolCallId) {
|
|
344
|
+
if (toolName === TOOL_INVOKE_SUBAGENT) {
|
|
345
|
+
const subagents = parseSubagentsFromArgs(toolArgs);
|
|
346
|
+
const prevCount = tracker.getEntries(sessionId).length;
|
|
347
|
+
const entries = tracker.recordSubagents(sessionId, subagents, toolCallId);
|
|
348
|
+
tracker.setWaiting(sessionId, true);
|
|
349
|
+
return entries.length > prevCount ? entries : null;
|
|
350
|
+
}
|
|
351
|
+
if (toolName === TOOL_SCHEDULE) {
|
|
352
|
+
const prompt = extractSchedulePrompt(toolArgs);
|
|
353
|
+
const prevCount = tracker.getEntries(sessionId).length;
|
|
354
|
+
const entries = tracker.recordCustomTask(sessionId, `Scheduled task: ${prompt}`, "medium", toolCallId);
|
|
355
|
+
tracker.setWaiting(sessionId, true);
|
|
356
|
+
return entries.length > prevCount ? entries : null;
|
|
357
|
+
}
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
function extractToolCallUpdate(msg) {
|
|
361
|
+
if (!isMethod(msg, ACP_METHODS.SESSION_UPDATE))
|
|
362
|
+
return null;
|
|
363
|
+
const sessionId = extractSessionId(msg);
|
|
364
|
+
if (!sessionId)
|
|
365
|
+
return null;
|
|
366
|
+
const u = msg.params?.update;
|
|
367
|
+
if (u?.sessionUpdate !== SESSION_UPDATES.TOOL_CALL &&
|
|
368
|
+
u?.sessionUpdate !== SESSION_UPDATES.TOOL_CALL_UPDATE)
|
|
369
|
+
return null;
|
|
370
|
+
return { sessionId, update: u };
|
|
371
|
+
}
|
|
372
|
+
function extractResponseSessionId(msg, tracker, context) {
|
|
373
|
+
if (!("id" in msg) || msg.id === null || msg.id === undefined)
|
|
374
|
+
return undefined;
|
|
375
|
+
return context?.session?.sessionId ?? tracker.getSessionForPromptId(msg.id);
|
|
376
|
+
}
|
|
377
|
+
function tryInterceptWaitingPromptResponse(msg, tracker, context) {
|
|
378
|
+
const result = msg.result;
|
|
379
|
+
if (result?.stopReason !== STOP_REASONS.END_TURN)
|
|
380
|
+
return false;
|
|
381
|
+
const sessionId = extractResponseSessionId(msg, tracker, context);
|
|
382
|
+
if (!sessionId || !tracker.isWaitingForTasks(sessionId))
|
|
383
|
+
return false;
|
|
384
|
+
tracker.deferPromptResponse(sessionId, msg);
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
387
|
+
function handleToolCallState(sessionId, u, tracker) {
|
|
388
|
+
if (u.sessionUpdate === SESSION_UPDATES.TOOL_CALL) {
|
|
389
|
+
const cmd = extractCommandLine(u.rawInput ?? u.arguments);
|
|
390
|
+
if (cmd && u.toolCallId) {
|
|
391
|
+
tracker.recordToolCommand(sessionId, u.toolCallId, cmd);
|
|
392
|
+
}
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
if (u.sessionUpdate === SESSION_UPDATES.TOOL_CALL_UPDATE) {
|
|
396
|
+
const storedCmd = u.toolCallId ? tracker.getToolCommand(sessionId, u.toolCallId) : undefined;
|
|
397
|
+
const bgDesc = extractBackgroundTaskDescription(u.rawOutput, u.toolCallId, storedCmd);
|
|
398
|
+
if (bgDesc) {
|
|
399
|
+
const entries = tracker.recordCustomTask(sessionId, `Background task: ${bgDesc}`, "high", u.toolCallId);
|
|
400
|
+
tracker.setWaiting(sessionId, true);
|
|
401
|
+
return entries;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
return null;
|
|
405
|
+
}
|
|
406
|
+
function processInbound(msg, tracker, context) {
|
|
407
|
+
if (tryInterceptWaitingPromptResponse(msg, tracker, context)) {
|
|
408
|
+
return [];
|
|
409
|
+
}
|
|
410
|
+
const extracted = extractToolCallUpdate(msg);
|
|
411
|
+
if (!extracted)
|
|
412
|
+
return [msg];
|
|
413
|
+
const { sessionId, update: u } = extracted;
|
|
414
|
+
const bgEntries = handleToolCallState(sessionId, u, tracker);
|
|
415
|
+
if (bgEntries) {
|
|
416
|
+
return [msg, createPlanUpdateMessage(sessionId, bgEntries)];
|
|
417
|
+
}
|
|
418
|
+
const toolArgs = u.rawInput ?? u.arguments;
|
|
419
|
+
const toolName = inferToolName(u.name ?? undefined, u.title ?? undefined, toolArgs);
|
|
420
|
+
if (!toolName)
|
|
421
|
+
return [msg];
|
|
422
|
+
const entries = handleInboundToolCall(sessionId, toolName, toolArgs, tracker, u.toolCallId);
|
|
423
|
+
return entries ? [msg, createPlanUpdateMessage(sessionId, entries)] : [msg];
|
|
424
|
+
}
|
|
425
|
+
function processStderrLine(line, tracker, context) {
|
|
426
|
+
const tsu = parseTrajectoryStateUpdate(line);
|
|
427
|
+
if (!tsu)
|
|
428
|
+
return false;
|
|
429
|
+
let planMsg = null;
|
|
430
|
+
if (tsu.state === TELEMETRY_STATES.WAITING_FOR_TASKS) {
|
|
431
|
+
planMsg = tracker.onWaitingForTasks(tsu.trajectoryId);
|
|
432
|
+
}
|
|
433
|
+
else if (tsu.state === TELEMETRY_STATES.RUNNING) {
|
|
434
|
+
planMsg = tracker.onRunning(tsu.trajectoryId);
|
|
435
|
+
}
|
|
436
|
+
else if (tsu.state === TELEMETRY_STATES.FULLY_IDLE ||
|
|
437
|
+
tsu.state === TELEMETRY_STATES.COMPLETE ||
|
|
438
|
+
tsu.state === TELEMETRY_STATES.IDLE) {
|
|
439
|
+
planMsg = tracker.onIdle(tsu.trajectoryId, context);
|
|
440
|
+
}
|
|
441
|
+
if (planMsg) {
|
|
442
|
+
context.forwardInbound(planMsg);
|
|
443
|
+
}
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
export function createSilentBackgroundTasksFix(_options) {
|
|
447
|
+
const tracker = new BackgroundTasksTracker();
|
|
448
|
+
return {
|
|
449
|
+
name: "silent-background-tasks",
|
|
450
|
+
description: "Exposes background subagents and scheduled tasks via synthesized ACP session/update plan notifications",
|
|
451
|
+
tracker,
|
|
452
|
+
onOutbound(msg, context) {
|
|
453
|
+
if (isMethod(msg, ACP_METHODS.SESSION_PROMPT)) {
|
|
454
|
+
const sessionId = extractSessionId(msg);
|
|
455
|
+
const promptId = msg.id;
|
|
456
|
+
if (sessionId)
|
|
457
|
+
tracker.onPromptStart(sessionId, promptId);
|
|
458
|
+
}
|
|
459
|
+
else if (isMethod(msg, ACP_METHODS.SESSION_CANCEL)) {
|
|
460
|
+
const sessionId = extractSessionId(msg);
|
|
461
|
+
if (sessionId) {
|
|
462
|
+
const { planMsg, cancelPromptMsg } = tracker.onCancel(sessionId);
|
|
463
|
+
if (planMsg) {
|
|
464
|
+
context.forwardInbound?.(planMsg);
|
|
465
|
+
}
|
|
466
|
+
if (cancelPromptMsg) {
|
|
467
|
+
context.forwardInbound?.(cancelPromptMsg);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return msg;
|
|
472
|
+
},
|
|
473
|
+
onInbound(msg, context) {
|
|
474
|
+
return processInbound(msg, tracker, context);
|
|
475
|
+
},
|
|
476
|
+
onStderrLine(line, context) {
|
|
477
|
+
return processStderrLine(line, tracker, context);
|
|
478
|
+
},
|
|
479
|
+
onTurnEnd(sessionId, _context) {
|
|
480
|
+
const planMsg = tracker.onTurnEnd(sessionId);
|
|
481
|
+
return planMsg ? [planMsg] : [];
|
|
482
|
+
},
|
|
483
|
+
dispose() {
|
|
484
|
+
tracker.dispose();
|
|
485
|
+
},
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
export const silentBackgroundTasksFix = createSilentBackgroundTasksFix();
|
|
489
|
+
export const createBackgroundTasksFix = createSilentBackgroundTasksFix;
|
|
490
|
+
export const backgroundTasksFix = silentBackgroundTasksFix;
|
|
491
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/silent-background-tasks/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Problem:
|
|
3
|
+
* When an upstream process hangs or panics and is recycled, resending client `mcpServers`
|
|
4
|
+
* with stale ephemeral localhost ports fails because proxy endpoints have moved or closed.
|
|
5
|
+
*
|
|
6
|
+
* Solution:
|
|
7
|
+
* Establishes a dynamic loopback MCP proxy pool that intercepts outbound `mcpServers` URLs,
|
|
8
|
+
* remaps ephemeral ports to stable virtual endpoints, and rewrites headers across process restarts.
|
|
9
|
+
*/
|
|
10
|
+
import { type AcpFix, type CachedSessionMetadata, type UrlRewriter } from "../../core/types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Protocol versions the target MCP server understands. Standard MCP servers embed
|
|
3
13
|
* `@modelcontextprotocol/sdk`, whose streamable-HTTP transport rejects any request
|
|
4
14
|
* carrying an `MCP-Protocol-Version` header outside this list with HTTP 400.
|
|
5
15
|
*/
|
|
@@ -20,8 +30,9 @@ export interface McpProxyOptions {
|
|
|
20
30
|
* A loopback reverse proxy for a single upstream MCP origin.
|
|
21
31
|
*
|
|
22
32
|
* Google's `agy_acp_server` ships an MCP client that advertises protocol version
|
|
23
|
-
* `2026-07-28`, which
|
|
33
|
+
* `2026-07-28`, which standard MCP daemons reject with HTTP 400 on every request after
|
|
24
34
|
* `initialize`. This proxy normalizes that header down to a version the upstream
|
|
35
|
+
|
|
25
36
|
* accepts, turning a hard transport failure into ordinary version negotiation.
|
|
26
37
|
*
|
|
27
38
|
* It is origin-bound and forwards the request path and query verbatim, so
|
|
@@ -29,7 +40,7 @@ export interface McpProxyOptions {
|
|
|
29
40
|
* (`/.well-known/oauth-protected-resource/...`) reach the real upstream path
|
|
30
41
|
* instead of being collapsed onto the MCP endpoint.
|
|
31
42
|
*/
|
|
32
|
-
export declare class
|
|
43
|
+
export declare class McpProxyServer {
|
|
33
44
|
private server;
|
|
34
45
|
private port;
|
|
35
46
|
private readonly origin;
|
|
@@ -64,6 +75,8 @@ export declare class McpProxy {
|
|
|
64
75
|
rewriteUrl(originalUrl: string): string;
|
|
65
76
|
stop(): Promise<void>;
|
|
66
77
|
}
|
|
78
|
+
/** Backward compatibility alias */
|
|
79
|
+
export { McpProxyServer as McpProxy };
|
|
67
80
|
/**
|
|
68
81
|
* Process-wide pool of proxies keyed by upstream origin.
|
|
69
82
|
*
|
|
@@ -80,4 +93,18 @@ export declare class McpProxyPool {
|
|
|
80
93
|
}
|
|
81
94
|
/** Shared pool. One proxy per upstream origin for the lifetime of the daemon process. */
|
|
82
95
|
export declare const sharedMcpProxyPool: McpProxyPool;
|
|
83
|
-
|
|
96
|
+
export interface McpHeader {
|
|
97
|
+
name: string;
|
|
98
|
+
value: string;
|
|
99
|
+
}
|
|
100
|
+
export declare function normalizeMcpHeaders(headers: unknown): McpHeader[] | undefined;
|
|
101
|
+
export declare const MCP_SERVERS_KEY = "mcpServers";
|
|
102
|
+
export declare const MCP_SERVERS_ORIGINAL_KEY = "mcpServersOriginal";
|
|
103
|
+
export declare function getSessionMcpServers(session: CachedSessionMetadata): unknown[] | undefined;
|
|
104
|
+
export declare function setSessionMcpServers(session: CachedSessionMetadata, servers: unknown[]): void;
|
|
105
|
+
export declare function getSessionMcpServersOriginal(session: CachedSessionMetadata): unknown[] | undefined;
|
|
106
|
+
export declare function setSessionMcpServersOriginal(session: CachedSessionMetadata, servers: unknown[]): void;
|
|
107
|
+
export declare function rewriteMcpServers(servers: unknown[], proxies?: UrlRewriter): Promise<void>;
|
|
108
|
+
export declare const staleMcpEndpointsFix: AcpFix;
|
|
109
|
+
export declare const mcpPortRemappingFix: AcpFix;
|
|
110
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/stale-mcp-endpoints/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,EAKL,KAAK,MAAM,EACX,KAAK,qBAAqB,EAG1B,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAG7B;;;;GAIG;AAEH,eAAO,MAAM,mCAAmC,iFAMtC,CAAC;AAcX,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,yBAAyB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,sFAAsF;IACtF,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AA4FD;;;;;;;;;;;;;GAaG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAM;IAC7B,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAsB;IAChE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAE7B,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;IAUzD,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,cAAc;IA4BtB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,MAAM;IAqBd;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAiB9B,OAAO,IAAI,MAAM,GAAG,IAAI;IAIxB;;;;;;OAMG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAUjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAO5B;AAED,mCAAmC;AACnC,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,CAAC;AAEtC;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8C;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;gBAE9B,OAAO,GAAE,eAAoB;IAInC,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAehD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAY/B;AAED,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,cAAqB,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAuBD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,GAAG,SAAS,CAO7E;AAED,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,EAAE,GAAG,SAAS,CAE1F;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAE7F;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,qBAAqB,GAC7B,OAAO,EAAE,GAAG,SAAS,CAEvB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,OAAO,EAAE,GACjB,IAAI,CAEN;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhG;AAoDD,eAAO,MAAM,oBAAoB,EAAE,MAoClC,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAuB,CAAC"}
|