@simonepri/refined-antigravity-acp 1.2.0 → 1.2.2
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/src/fixes/cancellation-leak/index.d.ts +11 -4
- package/dist/src/fixes/cancellation-leak/index.d.ts.map +1 -1
- package/dist/src/fixes/cancellation-leak/index.js +86 -48
- package/dist/src/fixes/cancellation-leak/index.js.map +1 -1
- package/dist/src/fixes/index.d.ts +1 -0
- package/dist/src/fixes/index.d.ts.map +1 -1
- package/dist/src/fixes/index.js +3 -0
- package/dist/src/fixes/index.js.map +1 -1
- package/dist/src/fixes/missing-question-fallback/index.d.ts +8 -6
- package/dist/src/fixes/missing-question-fallback/index.d.ts.map +1 -1
- package/dist/src/fixes/missing-question-fallback/index.js +135 -27
- package/dist/src/fixes/missing-question-fallback/index.js.map +1 -1
- package/dist/src/fixes/repetitive-tool-loop/index.d.ts +51 -0
- package/dist/src/fixes/repetitive-tool-loop/index.d.ts.map +1 -0
- package/dist/src/fixes/repetitive-tool-loop/index.js +280 -0
- package/dist/src/fixes/repetitive-tool-loop/index.js.map +1 -0
- package/dist/src/setup.d.ts +1 -0
- package/dist/src/setup.d.ts.map +1 -1
- package/dist/src/setup.js +8 -5
- package/dist/src/setup.js.map +1 -1
- package/package.json +1 -1
- package/readme.md +2 -1
|
@@ -3,18 +3,25 @@
|
|
|
3
3
|
* When a user cancels an in-flight turn via `session/cancel`, upstream `agy_acp_server`
|
|
4
4
|
* leaks internal Go/Python cancellation error strings (`"context canceledThe request was cancelled by the client."`)
|
|
5
5
|
* directly into assistant message stream chunks before terminating the turn.
|
|
6
|
+
* Additionally, if a subsequent prompt is sent immediately after cancellation before upstream has finished
|
|
7
|
+
* unwinding, raw agy fails or crashes with concurrent receive_steps errors.
|
|
6
8
|
*
|
|
7
9
|
* Solution:
|
|
8
|
-
* Intercepts inbound `session/update` chunks matching upstream cancellation error strings
|
|
9
|
-
*
|
|
10
|
+
* Intercepts inbound `session/update` chunks matching upstream cancellation error strings and drops them,
|
|
11
|
+
* preserves terminal `tool_call_update` status notifications so client UIs complete running tools,
|
|
12
|
+
* waits for upstream's natural cancellation response with a safety timeout fallback, and queues any
|
|
13
|
+
* subsequent outbound prompt until the previous cancellation has completely unwound.
|
|
10
14
|
*/
|
|
11
15
|
import { type AcpFix, type AcpStreamMessage } from "../../core/types.js";
|
|
12
16
|
export declare const CANCELLATION_ERROR_REGEX: RegExp;
|
|
13
17
|
export declare const CONCURRENT_RECEIVE_STEPS_REGEX: RegExp;
|
|
14
|
-
export declare const
|
|
18
|
+
export declare const DEFAULT_CANCELLATION_TIMEOUT_MS = 2500;
|
|
15
19
|
export declare function isCancellationText(text: string): boolean;
|
|
16
20
|
export declare function extractMessageChunkText(msg: AcpStreamMessage): string | null;
|
|
17
|
-
export
|
|
21
|
+
export interface CancellationOptions {
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function createCancellationLeakFix(options?: CancellationOptions): AcpFix;
|
|
18
25
|
export declare const cancellationLeakFix: AcpFix;
|
|
19
26
|
export declare const interruptionCleanupFix: AcpFix;
|
|
20
27
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/cancellation-leak/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/cancellation-leak/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAKL,KAAK,MAAM,EACX,KAAK,gBAAgB,EAItB,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,wBAAwB,QACkD,CAAC;AAExF,eAAO,MAAM,8BAA8B,QACmG,CAAC;AAE/I,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CASxD;AAiBD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAK5E;AAeD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6GD,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAkD/E;AAED,eAAO,MAAM,mBAAmB,QAA8B,CAAC;AAC/D,eAAO,MAAM,sBAAsB,QAAsB,CAAC"}
|
|
@@ -3,16 +3,20 @@
|
|
|
3
3
|
* When a user cancels an in-flight turn via `session/cancel`, upstream `agy_acp_server`
|
|
4
4
|
* leaks internal Go/Python cancellation error strings (`"context canceledThe request was cancelled by the client."`)
|
|
5
5
|
* directly into assistant message stream chunks before terminating the turn.
|
|
6
|
+
* Additionally, if a subsequent prompt is sent immediately after cancellation before upstream has finished
|
|
7
|
+
* unwinding, raw agy fails or crashes with concurrent receive_steps errors.
|
|
6
8
|
*
|
|
7
9
|
* Solution:
|
|
8
|
-
* Intercepts inbound `session/update` chunks matching upstream cancellation error strings
|
|
9
|
-
*
|
|
10
|
+
* Intercepts inbound `session/update` chunks matching upstream cancellation error strings and drops them,
|
|
11
|
+
* preserves terminal `tool_call_update` status notifications so client UIs complete running tools,
|
|
12
|
+
* waits for upstream's natural cancellation response with a safety timeout fallback, and queues any
|
|
13
|
+
* subsequent outbound prompt until the previous cancellation has completely unwound.
|
|
10
14
|
*/
|
|
11
15
|
import { ACP_METHODS, SESSION_UPDATES, STOP_REASONS, isMethod, } from "../../core/types.js";
|
|
12
|
-
import { extractSessionId
|
|
16
|
+
import { extractSessionId } from "../../core/session-cache.js";
|
|
13
17
|
export const CANCELLATION_ERROR_REGEX = /^(?:context\s+canceled)?\s*The\s+request\s+was\s+cancelled\s+by\s+the\s+client\.?$/i;
|
|
14
18
|
export const CONCURRENT_RECEIVE_STEPS_REGEX = /^Agent connection was lost and could not be re-established:\s*Concurrent receive_steps\(\) calls are not supported on this connection\.?$/i;
|
|
15
|
-
export const
|
|
19
|
+
export const DEFAULT_CANCELLATION_TIMEOUT_MS = 2500;
|
|
16
20
|
export function isCancellationText(text) {
|
|
17
21
|
const trimmed = text.trim();
|
|
18
22
|
if (!trimmed)
|
|
@@ -46,15 +50,20 @@ export function extractMessageChunkText(msg) {
|
|
|
46
50
|
return null;
|
|
47
51
|
return extractContentText(update.content);
|
|
48
52
|
}
|
|
49
|
-
function handleOutboundPrompt(msg, state) {
|
|
53
|
+
async function handleOutboundPrompt(msg, state) {
|
|
50
54
|
const sessionId = extractSessionId(msg);
|
|
51
55
|
const id = msg.id;
|
|
52
|
-
if (sessionId
|
|
53
|
-
state.
|
|
54
|
-
|
|
56
|
+
if (sessionId) {
|
|
57
|
+
const cancelling = state.cancellingSessions.get(sessionId);
|
|
58
|
+
if (cancelling) {
|
|
59
|
+
await cancelling.promise;
|
|
60
|
+
}
|
|
61
|
+
if (id !== undefined && id !== null) {
|
|
62
|
+
state.activePrompts.set(sessionId, id);
|
|
63
|
+
}
|
|
55
64
|
}
|
|
56
65
|
}
|
|
57
|
-
function handleOutboundCancel(msg, context, state) {
|
|
66
|
+
function handleOutboundCancel(msg, context, state, timeoutMs) {
|
|
58
67
|
const sessionId = extractSessionId(msg);
|
|
59
68
|
if (!sessionId)
|
|
60
69
|
return;
|
|
@@ -62,58 +71,85 @@ function handleOutboundCancel(msg, context, state) {
|
|
|
62
71
|
if (promptId === undefined)
|
|
63
72
|
return;
|
|
64
73
|
state.activePrompts.delete(sessionId);
|
|
65
|
-
state.
|
|
66
|
-
state.cancelledPromptIds.add(promptId);
|
|
67
|
-
const alreadySettled = context.session &&
|
|
68
|
-
getFixData(context.session, CANCEL_PROMPT_SETTLED_KEY) === promptId;
|
|
69
|
-
if (alreadySettled)
|
|
74
|
+
if (state.cancellingSessions.has(sessionId))
|
|
70
75
|
return;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
76
|
+
let resolveFn;
|
|
77
|
+
const promise = new Promise((resolve) => {
|
|
78
|
+
resolveFn = resolve;
|
|
79
|
+
});
|
|
80
|
+
const timer = setTimeout(() => {
|
|
81
|
+
const current = state.cancellingSessions.get(sessionId);
|
|
82
|
+
if (current && current.promptId === promptId) {
|
|
83
|
+
state.cancellingSessions.delete(sessionId);
|
|
84
|
+
state.suppressedLateResponseIds.add(promptId);
|
|
85
|
+
if (context.session) {
|
|
86
|
+
context.session.needsRecycle = true;
|
|
87
|
+
}
|
|
88
|
+
const cancelResponse = {
|
|
89
|
+
jsonrpc: "2.0",
|
|
90
|
+
id: promptId,
|
|
91
|
+
result: { stopReason: STOP_REASONS.CANCELLED },
|
|
92
|
+
};
|
|
93
|
+
context.forwardInbound?.(cancelResponse);
|
|
94
|
+
resolveFn();
|
|
95
|
+
}
|
|
96
|
+
}, timeoutMs);
|
|
97
|
+
timer.unref?.();
|
|
98
|
+
state.cancellingSessions.set(sessionId, {
|
|
99
|
+
promptId,
|
|
100
|
+
timer,
|
|
101
|
+
promise,
|
|
102
|
+
resolve: resolveFn,
|
|
103
|
+
});
|
|
88
104
|
}
|
|
89
|
-
function handleInboundPromptId(msg,
|
|
105
|
+
function handleInboundPromptId(msg, _context, state) {
|
|
90
106
|
const id = msg.id;
|
|
91
107
|
if (id === null || id === undefined)
|
|
92
108
|
return false;
|
|
93
|
-
|
|
94
|
-
|
|
109
|
+
if (state.suppressedLateResponseIds.has(id)) {
|
|
110
|
+
state.suppressedLateResponseIds.delete(id);
|
|
95
111
|
return true;
|
|
96
112
|
}
|
|
97
|
-
|
|
98
|
-
|
|
113
|
+
for (const [sessId, cancelling] of state.cancellingSessions.entries()) {
|
|
114
|
+
if (cancelling.promptId === id) {
|
|
115
|
+
clearTimeout(cancelling.timer);
|
|
116
|
+
state.cancellingSessions.delete(sessId);
|
|
117
|
+
cancelling.resolve();
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
for (const [sessId, promptId] of state.activePrompts.entries()) {
|
|
122
|
+
if (promptId === id) {
|
|
123
|
+
state.activePrompts.delete(sessId);
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
99
126
|
}
|
|
100
127
|
return false;
|
|
101
128
|
}
|
|
102
|
-
|
|
129
|
+
function isSuppressedDuringCancellation(msg, sessionId, state) {
|
|
130
|
+
if (!sessionId || !state.cancellingSessions.has(sessionId))
|
|
131
|
+
return false;
|
|
132
|
+
if (!isMethod(msg, ACP_METHODS.SESSION_UPDATE))
|
|
133
|
+
return false;
|
|
134
|
+
const update = msg.params?.update;
|
|
135
|
+
return update?.sessionUpdate !== SESSION_UPDATES.TOOL_CALL_UPDATE;
|
|
136
|
+
}
|
|
137
|
+
export function createCancellationLeakFix(options) {
|
|
138
|
+
const timeoutMs = options?.timeoutMs ?? DEFAULT_CANCELLATION_TIMEOUT_MS;
|
|
103
139
|
const state = {
|
|
104
140
|
activePrompts: new Map(),
|
|
105
|
-
|
|
106
|
-
|
|
141
|
+
cancellingSessions: new Map(),
|
|
142
|
+
suppressedLateResponseIds: new Set(),
|
|
107
143
|
};
|
|
108
144
|
return {
|
|
109
145
|
name: "cancellation-leak",
|
|
110
146
|
description: "Suppresses raw upstream Go/Python cancellation error chunks and ensures prompt settlement during client interruptions",
|
|
111
|
-
onOutbound(msg, context) {
|
|
147
|
+
async onOutbound(msg, context) {
|
|
112
148
|
if (isMethod(msg, ACP_METHODS.SESSION_PROMPT)) {
|
|
113
|
-
handleOutboundPrompt(msg, state);
|
|
149
|
+
await handleOutboundPrompt(msg, state);
|
|
114
150
|
}
|
|
115
151
|
else if (isMethod(msg, ACP_METHODS.SESSION_CANCEL)) {
|
|
116
|
-
handleOutboundCancel(msg, context, state);
|
|
152
|
+
handleOutboundCancel(msg, context, state, timeoutMs);
|
|
117
153
|
}
|
|
118
154
|
return msg;
|
|
119
155
|
},
|
|
@@ -122,10 +158,8 @@ export function createCancellationLeakFix() {
|
|
|
122
158
|
return [];
|
|
123
159
|
}
|
|
124
160
|
const sessionId = extractSessionId(msg) ?? context.session?.sessionId;
|
|
125
|
-
if (sessionId
|
|
126
|
-
|
|
127
|
-
return [];
|
|
128
|
-
}
|
|
161
|
+
if (isSuppressedDuringCancellation(msg, sessionId, state)) {
|
|
162
|
+
return [];
|
|
129
163
|
}
|
|
130
164
|
const text = extractMessageChunkText(msg);
|
|
131
165
|
if (text && isCancellationText(text)) {
|
|
@@ -134,9 +168,13 @@ export function createCancellationLeakFix() {
|
|
|
134
168
|
return [msg];
|
|
135
169
|
},
|
|
136
170
|
dispose() {
|
|
171
|
+
for (const cancelling of state.cancellingSessions.values()) {
|
|
172
|
+
clearTimeout(cancelling.timer);
|
|
173
|
+
cancelling.resolve();
|
|
174
|
+
}
|
|
137
175
|
state.activePrompts.clear();
|
|
138
|
-
state.
|
|
139
|
-
state.
|
|
176
|
+
state.cancellingSessions.clear();
|
|
177
|
+
state.suppressedLateResponseIds.clear();
|
|
140
178
|
},
|
|
141
179
|
};
|
|
142
180
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/cancellation-leak/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/cancellation-leak/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,QAAQ,GAMT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,CAAC,MAAM,wBAAwB,GACnC,qFAAqF,CAAC;AAExF,MAAM,CAAC,MAAM,8BAA8B,GACzC,4IAA4I,CAAC;AAE/I,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,CAAC;AAEpD,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,CACL,OAAO,KAAK,kBAAkB;QAC9B,OAAO,KAAK,0CAA0C;QACtD,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC;QACtC,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,CAC7C,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgB;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QAChE,MAAM,IAAI,GAAI,OAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAqB;IAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5D,MAAM,MAAM,GAAI,GAAG,CAAC,MAA0C,EAAE,MAAM,CAAC;IACvE,IAAI,MAAM,EAAE,aAAa,KAAK,eAAe,CAAC,mBAAmB,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAClG,OAAO,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAmBD,KAAK,UAAU,oBAAoB,CACjC,GAAqB,EACrB,KAAwB;IAExB,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,EAAE,GAAI,GAAgC,CAAC,EAAE,CAAC;IAChD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,UAAU,GAAG,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,OAAO,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACpC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,GAAqB,EACrB,OAAwB,EACxB,KAAwB,EACxB,SAAiB;IAEjB,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IAEnC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO;IAEpD,IAAI,SAAsB,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,SAAS,GAAG,OAAO,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7C,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3C,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;YACtC,CAAC;YACD,MAAM,cAAc,GAAqB;gBACvC,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,QAAQ;gBACZ,MAAM,EAAE,EAAE,UAAU,EAAE,YAAY,CAAC,SAAS,EAAE;aAC/C,CAAC;YACF,OAAO,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAC;YACzC,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC,EAAE,SAAS,CAAC,CAAC;IACd,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAEhB,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE;QACtC,QAAQ;QACR,KAAK;QACL,OAAO;QACP,OAAO,EAAE,SAAS;KACnB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAC5B,GAAqB,EACrB,QAAwB,EACxB,KAAwB;IAExB,MAAM,EAAE,GAAI,GAAuC,CAAC,EAAE,CAAC;IACvD,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAElD,IAAI,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC;QACtE,IAAI,UAAU,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;YAC/B,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxC,UAAU,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/D,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YACpB,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,8BAA8B,CACrC,GAAqB,EACrB,SAA6B,EAC7B,KAAwB;IAExB,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,cAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,MAAM,GAAI,GAAG,CAAC,MAA0C,EAAE,MAAM,CAAC;IACvE,OAAO,MAAM,EAAE,aAAa,KAAK,eAAe,CAAC,gBAAgB,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAA6B;IACrE,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,+BAA+B,CAAC;IACxE,MAAM,KAAK,GAAsB;QAC/B,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,kBAAkB,EAAE,IAAI,GAAG,EAAE;QAC7B,yBAAyB,EAAE,IAAI,GAAG,EAAE;KACrC,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,uHAAuH;QAEzH,KAAK,CAAC,UAAU,CAAC,GAAqB,EAAE,OAAwB;YAC9D,IAAI,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC9C,MAAM,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;iBAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrD,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YACvD,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAED,SAAS,CAAC,GAAqB,EAAE,OAAuB;YACtD,IAAI,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC/C,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;YACtE,IAAI,8BAA8B,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC1D,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,IAAI,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QAED,OAAO;YACL,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC3D,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAC/B,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC;YACD,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YAC5B,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,yBAAyB,EAAE,CAAC;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAC"}
|
|
@@ -17,6 +17,7 @@ export * from "./missing-usage-metrics/index.js";
|
|
|
17
17
|
export * from "./dangling-tool-calls/index.js";
|
|
18
18
|
export * from "./missing-question-fallback/index.js";
|
|
19
19
|
export * from "./premature-turn-stop/index.js";
|
|
20
|
+
export * from "./repetitive-tool-loop/index.js";
|
|
20
21
|
/**
|
|
21
22
|
* Returns a list of all active fixes addressing the upstream issues documented in readme.md.
|
|
22
23
|
* As upstream releases fix these defects, retirement is as simple as removing the fix here
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fixes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fixes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAqB/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAsB7C"}
|
package/dist/src/fixes/index.js
CHANGED
|
@@ -16,6 +16,7 @@ import { missingUsageMetricsFix } from "./missing-usage-metrics/index.js";
|
|
|
16
16
|
import { danglingToolCallsFix } from "./dangling-tool-calls/index.js";
|
|
17
17
|
import { missingQuestionFallbackFix } from "./missing-question-fallback/index.js";
|
|
18
18
|
import { prematureTurnStopFix } from "./premature-turn-stop/index.js";
|
|
19
|
+
import { repetitiveToolLoopFix } from "./repetitive-tool-loop/index.js";
|
|
19
20
|
export * from "./missing-localharness/index.js";
|
|
20
21
|
export * from "./missing-system-prompt/index.js";
|
|
21
22
|
export * from "./missing-slash-skills/index.js";
|
|
@@ -34,6 +35,7 @@ export * from "./missing-usage-metrics/index.js";
|
|
|
34
35
|
export * from "./dangling-tool-calls/index.js";
|
|
35
36
|
export * from "./missing-question-fallback/index.js";
|
|
36
37
|
export * from "./premature-turn-stop/index.js";
|
|
38
|
+
export * from "./repetitive-tool-loop/index.js";
|
|
37
39
|
/**
|
|
38
40
|
* Returns a list of all active fixes addressing the upstream issues documented in readme.md.
|
|
39
41
|
* As upstream releases fix these defects, retirement is as simple as removing the fix here
|
|
@@ -49,6 +51,7 @@ export function createDefaultFixes() {
|
|
|
49
51
|
malformedStreamSyntaxFix,
|
|
50
52
|
activeTurnCollisionFix,
|
|
51
53
|
cancellationLeakFix,
|
|
54
|
+
repetitiveToolLoopFix,
|
|
52
55
|
danglingToolCallsFix,
|
|
53
56
|
staleMcpEndpointsFix,
|
|
54
57
|
orphanedCheckpointsFix,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fixes/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fixes/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAExE,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC;AACzC,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAEhD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,sBAAsB;QACtB,sBAAsB;QACtB,qBAAqB;QACrB,eAAe;QACf,wBAAwB;QACxB,wBAAwB;QACxB,sBAAsB;QACtB,mBAAmB;QACnB,qBAAqB;QACrB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,uBAAuB;QACvB,kBAAkB;QAClB,wBAAwB;QACxB,sBAAsB;QACtB,sBAAsB;QACtB,0BAA0B;QAC1B,oBAAoB;KACrB,CAAC;AACJ,CAAC"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Problem:
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* When the model invokes `ask_question`, upstream `agy_acp_server` presents a `session/request_permission`
|
|
4
|
+
* modal choice and pauses execution awaiting user input. If the user types a new message into the chat
|
|
5
|
+
* or cancels instead of picking a pre-defined choice, upstream rejects the prompt with
|
|
6
|
+
* `"A foreground turn is already active"`, causing the turn to deadlock indefinitely.
|
|
6
7
|
*
|
|
7
8
|
* Solution:
|
|
8
|
-
*
|
|
9
|
-
*
|
|
9
|
+
* Tracks in-flight `ask_question` requests and unblocks upstream by auto-cancelling the pending
|
|
10
|
+
* permission question when a new user chat prompt arrives, dismissing the UI question spinner and
|
|
11
|
+
* allowing the user's message to execute immediately.
|
|
10
12
|
*/
|
|
11
13
|
import { type AcpFix } from "../../core/types.js";
|
|
12
|
-
export declare const QUESTION_OPTIONS_INSTRUCTIONS: readonly string[];
|
|
13
14
|
export declare const OTHER_OPTION_REGEX: RegExp;
|
|
14
15
|
export interface QuestionItem {
|
|
15
16
|
question?: string;
|
|
@@ -25,6 +26,7 @@ export declare function ensureOtherOption(raw: unknown): {
|
|
|
25
26
|
modified: boolean;
|
|
26
27
|
result: unknown;
|
|
27
28
|
};
|
|
29
|
+
export declare function createQuestionOptionsFix(): AcpFix;
|
|
28
30
|
export declare const missingQuestionFallbackFix: AcpFix;
|
|
29
31
|
export declare const questionOptionsFix: AcpFix;
|
|
30
32
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/missing-question-fallback/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/missing-question-fallback/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAIL,KAAK,MAAM,EAMZ,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,kBAAkB,QAA4D,CAAC;AAE5F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAqCD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAkBtF;AAuJD,wBAAgB,wBAAwB,IAAI,MAAM,CAwDjD;AAED,eAAO,MAAM,0BAA0B,EAAE,MAAmC,CAAC;AAC7E,eAAO,MAAM,kBAAkB,QAA6B,CAAC"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Problem:
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* When the model invokes `ask_question`, upstream `agy_acp_server` presents a `session/request_permission`
|
|
4
|
+
* modal choice and pauses execution awaiting user input. If the user types a new message into the chat
|
|
5
|
+
* or cancels instead of picking a pre-defined choice, upstream rejects the prompt with
|
|
6
|
+
* `"A foreground turn is already active"`, causing the turn to deadlock indefinitely.
|
|
6
7
|
*
|
|
7
8
|
* Solution:
|
|
8
|
-
*
|
|
9
|
-
*
|
|
9
|
+
* Tracks in-flight `ask_question` requests and unblocks upstream by auto-cancelling the pending
|
|
10
|
+
* permission question when a new user chat prompt arrives, dismissing the UI question spinner and
|
|
11
|
+
* allowing the user's message to execute immediately.
|
|
10
12
|
*/
|
|
11
13
|
import { ACP_METHODS, SESSION_UPDATES, isMethod, } from "../../core/types.js";
|
|
12
|
-
|
|
13
|
-
"Ignore the ask_question 'no other' rule: always include an 'Other' option for free-text responses.",
|
|
14
|
-
];
|
|
14
|
+
import { extractSessionId } from "../../core/session-cache.js";
|
|
15
15
|
export const OTHER_OPTION_REGEX = /\b(?:other|none\s+of\s+the\s+above|something\s+else)\b/i;
|
|
16
16
|
function parsePayload(raw) {
|
|
17
17
|
if (typeof raw === "string") {
|
|
@@ -84,7 +84,9 @@ function handleSessionUpdate(update) {
|
|
|
84
84
|
function handleRpcRequest(msg) {
|
|
85
85
|
if (!("method" in msg) || typeof msg.method !== "string")
|
|
86
86
|
return;
|
|
87
|
-
const isToolInvocation = msg.method === "tools/call" ||
|
|
87
|
+
const isToolInvocation = msg.method === "tools/call" ||
|
|
88
|
+
msg.method === ACP_METHODS.SESSION_REQUEST_PERMISSION ||
|
|
89
|
+
msg.method === "session/requestPermission";
|
|
88
90
|
if (!isToolInvocation || !msg.params || typeof msg.params !== "object")
|
|
89
91
|
return;
|
|
90
92
|
const p = msg.params;
|
|
@@ -94,26 +96,132 @@ function handleRpcRequest(msg) {
|
|
|
94
96
|
patchFieldIfAskQuestion(p, "rawInput");
|
|
95
97
|
}
|
|
96
98
|
}
|
|
97
|
-
function
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
function clearPendingByRequestId(pendingQuestions, id) {
|
|
100
|
+
for (const [sessionId, pending] of pendingQuestions.entries()) {
|
|
101
|
+
if (pending.requestId === id) {
|
|
102
|
+
pendingQuestions.delete(sessionId);
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function unblockPendingQuestion(pending, sessionId, context) {
|
|
108
|
+
await context.writeToChild?.({
|
|
109
|
+
jsonrpc: "2.0",
|
|
110
|
+
id: pending.requestId,
|
|
111
|
+
result: { outcome: { outcome: "cancelled" } },
|
|
112
|
+
});
|
|
113
|
+
if (!pending.toolCallId)
|
|
114
|
+
return;
|
|
115
|
+
context.forwardInbound?.({
|
|
116
|
+
jsonrpc: "2.0",
|
|
117
|
+
method: ACP_METHODS.SESSION_UPDATE,
|
|
118
|
+
params: {
|
|
119
|
+
sessionId,
|
|
120
|
+
update: {
|
|
121
|
+
sessionUpdate: SESSION_UPDATES.TOOL_CALL_UPDATE,
|
|
122
|
+
toolCallId: pending.toolCallId,
|
|
123
|
+
status: "completed",
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
function isPermissionMethod(method) {
|
|
129
|
+
return (method === ACP_METHODS.SESSION_REQUEST_PERMISSION || method === "session/requestPermission");
|
|
130
|
+
}
|
|
131
|
+
function extractToolCallId(params) {
|
|
132
|
+
if (!params || typeof params !== "object")
|
|
133
|
+
return undefined;
|
|
134
|
+
const toolCall = params.toolCall;
|
|
135
|
+
if (!toolCall || typeof toolCall !== "object")
|
|
136
|
+
return undefined;
|
|
137
|
+
const id = toolCall.toolCallId;
|
|
138
|
+
return typeof id === "string" ? id : undefined;
|
|
139
|
+
}
|
|
140
|
+
function extractPermissionDetails(msg) {
|
|
141
|
+
const sessionId = extractSessionId(msg);
|
|
142
|
+
const toolCallId = "params" in msg ? extractToolCallId(msg.params) : undefined;
|
|
143
|
+
const details = {};
|
|
144
|
+
if (sessionId)
|
|
145
|
+
details.sessionId = sessionId;
|
|
146
|
+
if (toolCallId)
|
|
147
|
+
details.toolCallId = toolCallId;
|
|
148
|
+
return details;
|
|
149
|
+
}
|
|
150
|
+
function recordInboundPermission(msg, pendingQuestions) {
|
|
151
|
+
const method = "method" in msg ? String(msg.method) : undefined;
|
|
152
|
+
if (!isPermissionMethod(method) || !("id" in msg))
|
|
153
|
+
return;
|
|
154
|
+
const id = msg.id;
|
|
155
|
+
if (id === undefined || id === null)
|
|
156
|
+
return;
|
|
157
|
+
const { sessionId, toolCallId } = extractPermissionDetails(msg);
|
|
158
|
+
if (sessionId) {
|
|
159
|
+
const pending = { requestId: id, sessionId };
|
|
160
|
+
if (toolCallId)
|
|
161
|
+
pending.toolCallId = toolCallId;
|
|
162
|
+
pendingQuestions.set(sessionId, pending);
|
|
102
163
|
}
|
|
103
|
-
|
|
104
|
-
|
|
164
|
+
}
|
|
165
|
+
function trackInboundToolCallId(msg, pendingQuestions) {
|
|
166
|
+
if (!isMethod(msg, ACP_METHODS.SESSION_UPDATE))
|
|
167
|
+
return;
|
|
168
|
+
const update = msg.params?.update;
|
|
169
|
+
if (!update)
|
|
170
|
+
return;
|
|
171
|
+
handleSessionUpdate(update);
|
|
172
|
+
const sessionId = extractSessionId(msg);
|
|
173
|
+
if (!sessionId || update.sessionUpdate !== SESSION_UPDATES.TOOL_CALL)
|
|
174
|
+
return;
|
|
175
|
+
if (isAskQuestionName(update.name, update.title) && update.toolCallId) {
|
|
176
|
+
const existing = pendingQuestions.get(sessionId);
|
|
177
|
+
if (existing && !existing.toolCallId) {
|
|
178
|
+
existing.toolCallId = update.toolCallId;
|
|
179
|
+
}
|
|
105
180
|
}
|
|
106
|
-
return msg;
|
|
107
181
|
}
|
|
108
|
-
export
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
182
|
+
export function createQuestionOptionsFix() {
|
|
183
|
+
const pendingQuestions = new Map();
|
|
184
|
+
return {
|
|
185
|
+
name: "missing-question-fallback",
|
|
186
|
+
description: "Unblocks interactive questions when user sends a chat message and provides question fallback handling",
|
|
187
|
+
onOutbound: async (msg, context) => {
|
|
188
|
+
if ("id" in msg && msg.id !== undefined && msg.id !== null) {
|
|
189
|
+
clearPendingByRequestId(pendingQuestions, msg.id);
|
|
190
|
+
}
|
|
191
|
+
const isPromptOrCancel = isMethod(msg, ACP_METHODS.SESSION_PROMPT) || isMethod(msg, ACP_METHODS.SESSION_CANCEL);
|
|
192
|
+
if (isPromptOrCancel) {
|
|
193
|
+
const sessionId = extractSessionId(msg);
|
|
194
|
+
if (sessionId) {
|
|
195
|
+
const pending = pendingQuestions.get(sessionId);
|
|
196
|
+
if (pending) {
|
|
197
|
+
pendingQuestions.delete(sessionId);
|
|
198
|
+
await unblockPendingQuestion(pending, sessionId, context);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return msg;
|
|
203
|
+
},
|
|
204
|
+
onInbound: (msg, _context) => {
|
|
205
|
+
recordInboundPermission(msg, pendingQuestions);
|
|
206
|
+
if (isMethod(msg, ACP_METHODS.SESSION_UPDATE)) {
|
|
207
|
+
trackInboundToolCallId(msg, pendingQuestions);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
handleRpcRequest(msg);
|
|
211
|
+
}
|
|
212
|
+
if ("result" in msg || "error" in msg) {
|
|
213
|
+
const id = msg.id;
|
|
214
|
+
if (id !== undefined && id !== null) {
|
|
215
|
+
clearPendingByRequestId(pendingQuestions, id);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return [msg];
|
|
219
|
+
},
|
|
220
|
+
dispose: () => {
|
|
221
|
+
pendingQuestions.clear();
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
export const missingQuestionFallbackFix = createQuestionOptionsFix();
|
|
118
226
|
export const questionOptionsFix = missingQuestionFallbackFix;
|
|
119
227
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/missing-question-fallback/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/missing-question-fallback/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Upstream `agy_acp_server` does not detect repetitive tool calling loops or autoregressive attractor cycles.
|
|
4
|
+
* When a model degenerates into repeating the same tool call or cycling through the same set of file slices,
|
|
5
|
+
* raw agy blindly executes tool calls indefinitely, burning thousands of tokens and freezing editor sessions.
|
|
6
|
+
*
|
|
7
|
+
* Solution:
|
|
8
|
+
* Tracks canonicalized tool call signatures per prompt turn using suffix cycle matching.
|
|
9
|
+
* When identical tool calls or periodic cycles repeat beyond safety thresholds, the wrapper sends
|
|
10
|
+
* `session/cancel` upstream to halt runaway execution, auto-completes pending tool updates, emits an
|
|
11
|
+
* explanatory message chunk to the editor chat, and cleanly settles the turn.
|
|
12
|
+
*/
|
|
13
|
+
import { type AcpFix } from "../../core/types.js";
|
|
14
|
+
export declare const IGNORED_METADATA_KEYS: Set<string>;
|
|
15
|
+
export declare const READ_ONLY_TOOLS: Set<string>;
|
|
16
|
+
export interface RepetitiveToolLoopOptions {
|
|
17
|
+
maxPeriod?: number;
|
|
18
|
+
readOnlySingleThreshold?: number;
|
|
19
|
+
mutatingSingleThreshold?: number;
|
|
20
|
+
cycleThreshold?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function normalizeKey(key: string): string;
|
|
23
|
+
export declare function canonicalizeValue(val: unknown): unknown;
|
|
24
|
+
export declare function inferToolNameFromUpdate(title?: string | null, kind?: string | null, rawInput?: unknown): string;
|
|
25
|
+
export declare function computeToolCallSignature(toolName: string, rawInput: unknown): string;
|
|
26
|
+
export interface CycleDetectionResult {
|
|
27
|
+
isLoop: boolean;
|
|
28
|
+
cycleLength: number;
|
|
29
|
+
repetitions: number;
|
|
30
|
+
pattern: string[];
|
|
31
|
+
}
|
|
32
|
+
export declare function detectCycle(signatures: readonly string[], options?: {
|
|
33
|
+
maxPeriod?: number;
|
|
34
|
+
singleToolThreshold?: number;
|
|
35
|
+
cycleThreshold?: number;
|
|
36
|
+
}): CycleDetectionResult;
|
|
37
|
+
export declare class RepetitiveToolLoopTracker {
|
|
38
|
+
private readonly sessions;
|
|
39
|
+
private readonly promptIdToSessionId;
|
|
40
|
+
private getOrCreate;
|
|
41
|
+
startTurn(sessionId: string, promptId?: string | number): void;
|
|
42
|
+
getSessionIdForPrompt(promptId: string | number): string | undefined;
|
|
43
|
+
recordToolCall(sessionId: string, toolName: string, rawInput: unknown, options?: RepetitiveToolLoopOptions): CycleDetectionResult;
|
|
44
|
+
isLoopInterrupted(sessionId: string): boolean;
|
|
45
|
+
getActivePromptId(sessionId: string): string | number | undefined;
|
|
46
|
+
clearSession(sessionId: string): void;
|
|
47
|
+
clear(): void;
|
|
48
|
+
}
|
|
49
|
+
export declare function createRepetitiveToolLoopFix(options?: RepetitiveToolLoopOptions): AcpFix;
|
|
50
|
+
export declare const repetitiveToolLoopFix: AcpFix;
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/repetitive-tool-loop/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAKL,KAAK,MAAM,EAKZ,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,qBAAqB,aAAwD,CAAC;AAE3F,eAAO,MAAM,eAAe,aAO1B,CAAC;AAEH,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAcvD;AAED,wBAAgB,uBAAuB,CACrC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EACpB,QAAQ,CAAC,EAAE,OAAO,GACjB,MAAM,CAcR;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAWpF;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAkBD,wBAAgB,WAAW,CACzB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,GACL,oBAAoB,CA2BtB;AAQD,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;IAChE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsC;IAE1E,OAAO,CAAC,WAAW;IASnB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAU9D,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpE,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,yBAA8B,GACtC,oBAAoB;IA2BvB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;IAIjE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC,KAAK,IAAI,IAAI;CAId;AA2GD,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,yBAA8B,GAAG,MAAM,CAmC3F;AAED,eAAO,MAAM,qBAAqB,QAAgC,CAAC"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Upstream `agy_acp_server` does not detect repetitive tool calling loops or autoregressive attractor cycles.
|
|
4
|
+
* When a model degenerates into repeating the same tool call or cycling through the same set of file slices,
|
|
5
|
+
* raw agy blindly executes tool calls indefinitely, burning thousands of tokens and freezing editor sessions.
|
|
6
|
+
*
|
|
7
|
+
* Solution:
|
|
8
|
+
* Tracks canonicalized tool call signatures per prompt turn using suffix cycle matching.
|
|
9
|
+
* When identical tool calls or periodic cycles repeat beyond safety thresholds, the wrapper sends
|
|
10
|
+
* `session/cancel` upstream to halt runaway execution, auto-completes pending tool updates, emits an
|
|
11
|
+
* explanatory message chunk to the editor chat, and cleanly settles the turn.
|
|
12
|
+
*/
|
|
13
|
+
import { ACP_METHODS, SESSION_UPDATES, STOP_REASONS, isMethod, } from "../../core/types.js";
|
|
14
|
+
import { extractSessionId } from "../../core/session-cache.js";
|
|
15
|
+
export const IGNORED_METADATA_KEYS = new Set(["toolaction", "toolsummary", "description"]);
|
|
16
|
+
export const READ_ONLY_TOOLS = new Set([
|
|
17
|
+
"view_file",
|
|
18
|
+
"list_directory",
|
|
19
|
+
"find_file",
|
|
20
|
+
"read_url_content",
|
|
21
|
+
"search_web",
|
|
22
|
+
"read_file",
|
|
23
|
+
]);
|
|
24
|
+
export function normalizeKey(key) {
|
|
25
|
+
return key.toLowerCase().replace(/_/g, "");
|
|
26
|
+
}
|
|
27
|
+
export function canonicalizeValue(val) {
|
|
28
|
+
if (val === null || val === undefined)
|
|
29
|
+
return null;
|
|
30
|
+
if (typeof val !== "object")
|
|
31
|
+
return val;
|
|
32
|
+
if (Array.isArray(val)) {
|
|
33
|
+
return val.map(canonicalizeValue);
|
|
34
|
+
}
|
|
35
|
+
const sortedObj = {};
|
|
36
|
+
const entries = Object.entries(val);
|
|
37
|
+
const filteredEntries = entries.filter(([k]) => !IGNORED_METADATA_KEYS.has(normalizeKey(k)));
|
|
38
|
+
filteredEntries.sort(([a], [b]) => normalizeKey(a).localeCompare(normalizeKey(b)));
|
|
39
|
+
for (const [k, v] of filteredEntries) {
|
|
40
|
+
sortedObj[normalizeKey(k)] = canonicalizeValue(v);
|
|
41
|
+
}
|
|
42
|
+
return sortedObj;
|
|
43
|
+
}
|
|
44
|
+
export function inferToolNameFromUpdate(title, kind, rawInput) {
|
|
45
|
+
if (title) {
|
|
46
|
+
const cleaned = title.replace(/^Running:?\s+/i, "").trim();
|
|
47
|
+
if (cleaned.length > 0)
|
|
48
|
+
return cleaned;
|
|
49
|
+
}
|
|
50
|
+
if (kind && kind !== "other") {
|
|
51
|
+
return kind;
|
|
52
|
+
}
|
|
53
|
+
if (rawInput && typeof rawInput === "object") {
|
|
54
|
+
if ("CommandLine" in rawInput)
|
|
55
|
+
return "run_command";
|
|
56
|
+
if ("AbsolutePath" in rawInput)
|
|
57
|
+
return "view_file";
|
|
58
|
+
if ("Subagents" in rawInput)
|
|
59
|
+
return "invoke_subagent";
|
|
60
|
+
}
|
|
61
|
+
return "tool";
|
|
62
|
+
}
|
|
63
|
+
export function computeToolCallSignature(toolName, rawInput) {
|
|
64
|
+
let parsedInput = rawInput;
|
|
65
|
+
if (typeof rawInput === "string") {
|
|
66
|
+
try {
|
|
67
|
+
parsedInput = JSON.parse(rawInput);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
parsedInput = rawInput;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const canonical = canonicalizeValue(parsedInput);
|
|
74
|
+
return `${toolName}:${JSON.stringify(canonical)}`;
|
|
75
|
+
}
|
|
76
|
+
function isSuffixCycleMatch(signatures, n, k, repetitions) {
|
|
77
|
+
for (let r = 1; r < repetitions; r++) {
|
|
78
|
+
for (let i = 0; i < k; i++) {
|
|
79
|
+
if (signatures[n - k + i] !== signatures[n - (r + 1) * k + i]) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
export function detectCycle(signatures, options = {}) {
|
|
87
|
+
const maxPeriod = options.maxPeriod ?? 4;
|
|
88
|
+
const singleToolThreshold = options.singleToolThreshold ?? 3;
|
|
89
|
+
const cycleThreshold = options.cycleThreshold ?? 3;
|
|
90
|
+
const n = signatures.length;
|
|
91
|
+
for (let k = 1; k <= maxPeriod; k++) {
|
|
92
|
+
const requiredRepetitions = k === 1 ? singleToolThreshold : cycleThreshold;
|
|
93
|
+
const requiredLength = k * requiredRepetitions;
|
|
94
|
+
if (n < requiredLength)
|
|
95
|
+
continue;
|
|
96
|
+
if (isSuffixCycleMatch(signatures, n, k, requiredRepetitions)) {
|
|
97
|
+
return {
|
|
98
|
+
isLoop: true,
|
|
99
|
+
cycleLength: k,
|
|
100
|
+
repetitions: requiredRepetitions,
|
|
101
|
+
pattern: signatures.slice(n - k),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
isLoop: false,
|
|
107
|
+
cycleLength: 0,
|
|
108
|
+
repetitions: 0,
|
|
109
|
+
pattern: [],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export class RepetitiveToolLoopTracker {
|
|
113
|
+
sessions = new Map();
|
|
114
|
+
promptIdToSessionId = new Map();
|
|
115
|
+
getOrCreate(sessionId) {
|
|
116
|
+
let state = this.sessions.get(sessionId);
|
|
117
|
+
if (!state) {
|
|
118
|
+
state = { signatures: [], loopInterrupted: false };
|
|
119
|
+
this.sessions.set(sessionId, state);
|
|
120
|
+
}
|
|
121
|
+
return state;
|
|
122
|
+
}
|
|
123
|
+
startTurn(sessionId, promptId) {
|
|
124
|
+
const state = this.getOrCreate(sessionId);
|
|
125
|
+
state.activePromptId = promptId;
|
|
126
|
+
state.signatures = [];
|
|
127
|
+
state.loopInterrupted = false;
|
|
128
|
+
if (promptId !== undefined && promptId !== null) {
|
|
129
|
+
this.promptIdToSessionId.set(promptId, sessionId);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
getSessionIdForPrompt(promptId) {
|
|
133
|
+
return this.promptIdToSessionId.get(promptId);
|
|
134
|
+
}
|
|
135
|
+
recordToolCall(sessionId, toolName, rawInput, options = {}) {
|
|
136
|
+
const state = this.getOrCreate(sessionId);
|
|
137
|
+
if (state.loopInterrupted) {
|
|
138
|
+
return { isLoop: true, cycleLength: 0, repetitions: 0, pattern: [] };
|
|
139
|
+
}
|
|
140
|
+
const signature = computeToolCallSignature(toolName, rawInput);
|
|
141
|
+
state.signatures.push(signature);
|
|
142
|
+
const isReadOnly = READ_ONLY_TOOLS.has(toolName);
|
|
143
|
+
const singleThreshold = isReadOnly
|
|
144
|
+
? (options.readOnlySingleThreshold ?? 3)
|
|
145
|
+
: (options.mutatingSingleThreshold ?? 5);
|
|
146
|
+
const result = detectCycle(state.signatures, {
|
|
147
|
+
maxPeriod: options.maxPeriod ?? 4,
|
|
148
|
+
singleToolThreshold: singleThreshold,
|
|
149
|
+
cycleThreshold: options.cycleThreshold ?? 3,
|
|
150
|
+
});
|
|
151
|
+
if (result.isLoop) {
|
|
152
|
+
state.loopInterrupted = true;
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
isLoopInterrupted(sessionId) {
|
|
157
|
+
return this.sessions.get(sessionId)?.loopInterrupted ?? false;
|
|
158
|
+
}
|
|
159
|
+
getActivePromptId(sessionId) {
|
|
160
|
+
return this.sessions.get(sessionId)?.activePromptId;
|
|
161
|
+
}
|
|
162
|
+
clearSession(sessionId) {
|
|
163
|
+
this.sessions.delete(sessionId);
|
|
164
|
+
}
|
|
165
|
+
clear() {
|
|
166
|
+
this.sessions.clear();
|
|
167
|
+
this.promptIdToSessionId.clear();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async function interruptLoopExecution(sessionId, toolCallId, toolName, loopResult, context) {
|
|
171
|
+
await context
|
|
172
|
+
.writeToChild({
|
|
173
|
+
jsonrpc: "2.0",
|
|
174
|
+
method: ACP_METHODS.SESSION_CANCEL,
|
|
175
|
+
params: { sessionId },
|
|
176
|
+
})
|
|
177
|
+
.catch(() => { });
|
|
178
|
+
context.forwardInbound?.({
|
|
179
|
+
jsonrpc: "2.0",
|
|
180
|
+
method: ACP_METHODS.SESSION_UPDATE,
|
|
181
|
+
params: {
|
|
182
|
+
sessionId,
|
|
183
|
+
update: {
|
|
184
|
+
sessionUpdate: SESSION_UPDATES.TOOL_CALL_UPDATE,
|
|
185
|
+
toolCallId,
|
|
186
|
+
status: "completed",
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
const cycleDesc = loopResult.cycleLength > 1
|
|
191
|
+
? `a cycle of ${loopResult.cycleLength} alternating tool calls`
|
|
192
|
+
: `identical tool call (${toolName})`;
|
|
193
|
+
context.forwardInbound?.({
|
|
194
|
+
jsonrpc: "2.0",
|
|
195
|
+
method: ACP_METHODS.SESSION_UPDATE,
|
|
196
|
+
params: {
|
|
197
|
+
sessionId,
|
|
198
|
+
update: {
|
|
199
|
+
sessionUpdate: SESSION_UPDATES.AGENT_MESSAGE_CHUNK,
|
|
200
|
+
content: {
|
|
201
|
+
type: "text",
|
|
202
|
+
text: `\n\n⚠️ Interrupted repetitive tool calling loop: detected ${cycleDesc} repeating without progress. Stopping turn to prevent runaway token usage.`,
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
function settleInterruptedPromptResponse(msg, sessionId, tracker) {
|
|
209
|
+
if (!("result" in msg) || !tracker.isLoopInterrupted(sessionId)) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
const res = msg.result;
|
|
213
|
+
if (res && (res.stopReason === STOP_REASONS.CANCELLED || !res.stopReason)) {
|
|
214
|
+
tracker.startTurn(sessionId);
|
|
215
|
+
return [
|
|
216
|
+
{
|
|
217
|
+
...msg,
|
|
218
|
+
result: {
|
|
219
|
+
...res,
|
|
220
|
+
stopReason: STOP_REASONS.END_TURN,
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
];
|
|
224
|
+
}
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
function resolveSessionId(msg, tracker) {
|
|
228
|
+
const fromMsg = extractSessionId(msg);
|
|
229
|
+
if (fromMsg)
|
|
230
|
+
return fromMsg;
|
|
231
|
+
const id = msg.id;
|
|
232
|
+
return id !== null && id !== undefined ? tracker.getSessionIdForPrompt(id) : undefined;
|
|
233
|
+
}
|
|
234
|
+
async function handleInboundSessionUpdate(msg, sessionId, tracker, options, context) {
|
|
235
|
+
const update = "params" in msg ? msg.params?.update : undefined;
|
|
236
|
+
if (update?.sessionUpdate !== SESSION_UPDATES.TOOL_CALL) {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
const toolCallId = update.toolCallId ?? "unknown";
|
|
240
|
+
const toolName = inferToolNameFromUpdate(update.title, update.kind, update.rawInput);
|
|
241
|
+
const loopResult = tracker.recordToolCall(sessionId, toolName, update.rawInput, options);
|
|
242
|
+
if (loopResult.isLoop) {
|
|
243
|
+
await interruptLoopExecution(sessionId, toolCallId, toolName, loopResult, context);
|
|
244
|
+
return [];
|
|
245
|
+
}
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
export function createRepetitiveToolLoopFix(options = {}) {
|
|
249
|
+
const tracker = new RepetitiveToolLoopTracker();
|
|
250
|
+
return {
|
|
251
|
+
name: "repetitive-tool-loop",
|
|
252
|
+
description: "Detects and interrupts repetitive tool calling cycles and autoregressive attractor loops",
|
|
253
|
+
onOutbound(msg, _context) {
|
|
254
|
+
const sessionId = extractSessionId(msg);
|
|
255
|
+
if (!sessionId)
|
|
256
|
+
return msg;
|
|
257
|
+
if (isMethod(msg, ACP_METHODS.SESSION_PROMPT)) {
|
|
258
|
+
const promptId = msg.id;
|
|
259
|
+
tracker.startTurn(sessionId, promptId);
|
|
260
|
+
}
|
|
261
|
+
return msg;
|
|
262
|
+
},
|
|
263
|
+
async onInbound(msg, context) {
|
|
264
|
+
const sessionId = resolveSessionId(msg, tracker);
|
|
265
|
+
if (!sessionId)
|
|
266
|
+
return [msg];
|
|
267
|
+
const settled = settleInterruptedPromptResponse(msg, sessionId, tracker);
|
|
268
|
+
if (settled)
|
|
269
|
+
return settled;
|
|
270
|
+
if (isMethod(msg, ACP_METHODS.SESSION_UPDATE)) {
|
|
271
|
+
const handled = await handleInboundSessionUpdate(msg, sessionId, tracker, options, context);
|
|
272
|
+
if (handled)
|
|
273
|
+
return handled;
|
|
274
|
+
}
|
|
275
|
+
return [msg];
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
export const repetitiveToolLoopFix = createRepetitiveToolLoopFix();
|
|
280
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/repetitive-tool-loop/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/setup.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export declare function setupZed(paths?: ResolvedPaths): boolean;
|
|
|
8
8
|
export declare const GOOGLE_TERMS_URL = "https://antigravity.google/terms";
|
|
9
9
|
export interface SetupOptions {
|
|
10
10
|
autoAccept?: boolean | undefined;
|
|
11
|
+
restartDaemon?: boolean | undefined;
|
|
11
12
|
}
|
|
12
13
|
export declare function ensureSetupBinary(options?: SetupOptions): Promise<boolean>;
|
|
13
14
|
export declare function runSetup(target?: "all" | "paseo" | "zed", options?: SetupOptions): Promise<boolean>;
|
package/dist/src/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,YAAY,IAAI,aAAa,
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,YAAY,IAAI,aAAa,CA2B5C;AAoCD,wBAAgB,UAAU,CAAC,KAAK,GAAE,aAA8B,EAAE,aAAa,UAAO,GAAG,OAAO,CAgC/F;AAkBD,wBAAgB,QAAQ,CAAC,KAAK,GAAE,aAA8B,GAAG,OAAO,CAwBvE;AAED,eAAO,MAAM,gBAAgB,qCAAqC,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACrC;AAkCD,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBhF;AAED,wBAAsB,QAAQ,CAC5B,MAAM,GAAE,KAAK,GAAG,OAAO,GAAG,KAAa,EACvC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
|
package/dist/src/setup.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import os from "node:os";
|
|
4
|
-
import
|
|
4
|
+
import childProcess from "node:child_process";
|
|
5
5
|
import readline from "node:readline/promises";
|
|
6
6
|
import { agyCommand, ensureAntigravityBinary } from "./core/command.js";
|
|
7
7
|
export function resolvePaths() {
|
|
@@ -20,7 +20,9 @@ export function resolvePaths() {
|
|
|
20
20
|
// 2. Check which refined-antigravity-acp
|
|
21
21
|
if (!cliPath) {
|
|
22
22
|
try {
|
|
23
|
-
const found =
|
|
23
|
+
const found = childProcess
|
|
24
|
+
.execSync("which refined-antigravity-acp", { encoding: "utf8" })
|
|
25
|
+
.trim();
|
|
24
26
|
if (found && fs.existsSync(found)) {
|
|
25
27
|
cliPath = fs.realpathSync(found);
|
|
26
28
|
}
|
|
@@ -53,7 +55,7 @@ function getNestedRecord(obj, key) {
|
|
|
53
55
|
}
|
|
54
56
|
function tryRestartPaseoDaemon() {
|
|
55
57
|
try {
|
|
56
|
-
execFileSync("paseo", ["daemon", "restart"], { stdio: "ignore" });
|
|
58
|
+
childProcess.execFileSync("paseo", ["daemon", "restart"], { stdio: "ignore" });
|
|
57
59
|
console.log("✓ Restarted Paseo daemon");
|
|
58
60
|
}
|
|
59
61
|
catch {
|
|
@@ -175,14 +177,15 @@ export async function runSetup(target = "all", options) {
|
|
|
175
177
|
return false;
|
|
176
178
|
}
|
|
177
179
|
const paths = resolvePaths();
|
|
180
|
+
const restartDaemon = options?.restartDaemon ?? true;
|
|
178
181
|
if (target === "paseo") {
|
|
179
|
-
setupPaseo(paths);
|
|
182
|
+
setupPaseo(paths, restartDaemon);
|
|
180
183
|
}
|
|
181
184
|
else if (target === "zed") {
|
|
182
185
|
setupZed(paths);
|
|
183
186
|
}
|
|
184
187
|
else {
|
|
185
|
-
setupPaseo(paths);
|
|
188
|
+
setupPaseo(paths, restartDaemon);
|
|
186
189
|
setupZed(paths);
|
|
187
190
|
}
|
|
188
191
|
return true;
|
package/dist/src/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -158,8 +158,9 @@ The matrix below documents upstream defects across process startup, turn executi
|
|
|
158
158
|
| [**Silent Background Task Execution**](src/fixes/silent-background-tasks/index.ts) | **Problem**: Subagents and background tasks execute silently; upstream binary produces no stdout chunks during `STATE_WAITING_FOR_TASKS`, leaving editor UIs frozen.<br>🔗 [`problem: silent background tasks`](src/fixes/silent-background-tasks/index.e2e.test.ts#L6) | Synthesizes standard ACP `session/update` plan notifications (`sessionUpdate: "plan"`) tracking active subagent roles and background tasks with live progress and completion.<br>🔗 [`solution: plan synthesis`](src/fixes/silent-background-tasks/index.e2e.test.ts#L12) |
|
|
159
159
|
| [**Missing Usage & Token Metrics**](src/fixes/missing-usage-metrics/index.ts) | **Problem**: Upstream binary never emits ACP `usage_update` notifications, leaving editor context window meters blank.<br>🔗 [`problem: missing usage metrics`](src/fixes/missing-usage-metrics/index.e2e.test.ts#L14) | Intercepts SQLite step metadata to extract token counts and emits standard ACP `sessionUpdate: "usage_update"` with `usedTokens` and `maxTokens`.<br>🔗 [`solution: token usage synthesis`](src/fixes/missing-usage-metrics/index.e2e.test.ts#L35) |
|
|
160
160
|
| [**Dangling Running Tool Calls**](src/fixes/dangling-tool-calls/index.ts) | **Problem**: When commands are backgrounded, upstream never emits terminal `tool_call_update` with `status: "completed"`, leaving editor UIs with an infinite active running animation.<br>🔗 [`problem: dangling running tool call`](src/fixes/dangling-tool-calls/index.test.ts#L67) | Tracks active tool calls and marks backgrounded tools completed immediately, before assistant text streams, and upon turn completion.<br>🔗 [`solution: tool call auto-completion`](src/fixes/dangling-tool-calls/index.test.ts#L79) |
|
|
161
|
-
| [**
|
|
161
|
+
| [**Interactive Question Deadlock**](src/fixes/missing-question-fallback/index.ts) | **Problem**: When `ask_question` is active, sending a chat prompt or cancel causes upstream to reject the message with _"A foreground turn is already active"_, deadlocking sessions indefinitely.<br>🔗 [`problem: question collision`](src/fixes/missing-question-fallback/index.e2e.test.ts#L16) | Intercepts user chat prompts and cancellations to auto-unblock pending question permission requests to the child process and complete UI tool states.<br>🔗 [`solution: question unblocking`](src/fixes/missing-question-fallback/index.e2e.test.ts#L53) |
|
|
162
162
|
| [**Premature Empty Turn Stop**](src/fixes/premature-turn-stop/index.ts) | **Problem**: Upstream binary prematurely concludes prompt turns with empty completions (`stopReason=16`) without emitting assistant message chunks, leaving editor UIs frozen in silence.<br>🔗 [`problem: premature turn termination`](src/fixes/premature-turn-stop/index.test.ts#L48) | Injects explicit system prompt steering instructing the model to always emit clear status messages and never terminate turns silently.<br>🔗 [`solution: prompt steering`](src/fixes/premature-turn-stop/index.test.ts#L79) |
|
|
163
|
+
| [**Repetitive Tool Calling Loop**](src/fixes/repetitive-tool-loop/index.ts) | **Problem**: Upstream binary has no loop detector and will execute cyclic or identical tool calls indefinitely, burning thousands of tokens and freezing sessions.<br>🔗 [`problem: repetitive tool loop`](src/fixes/repetitive-tool-loop/index.e2e.test.ts#L25) | Tracks tool signatures per turn using suffix cycle matching, sending `session/cancel` upstream, auto-completing tools, and notifying the user when cycles repeat.<br>🔗 [`solution: loop circuit breaker`](src/fixes/repetitive-tool-loop/index.e2e.test.ts#L81) |
|
|
163
164
|
|
|
164
165
|
## Setup
|
|
165
166
|
|