@simonepri/refined-antigravity-acp 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/fixes/dropped-history-chunks/index.d.ts +1 -0
- package/dist/src/fixes/dropped-history-chunks/index.d.ts.map +1 -1
- package/dist/src/fixes/dropped-history-chunks/index.js +42 -32
- package/dist/src/fixes/dropped-history-chunks/index.js.map +1 -1
- package/dist/src/fixes/premature-turn-stop/index.d.ts +34 -9
- package/dist/src/fixes/premature-turn-stop/index.d.ts.map +1 -1
- package/dist/src/fixes/premature-turn-stop/index.js +212 -9
- package/dist/src/fixes/premature-turn-stop/index.js.map +1 -1
- package/dist/src/fixes/repetitive-tool-loop/index.d.ts +28 -6
- package/dist/src/fixes/repetitive-tool-loop/index.d.ts.map +1 -1
- package/dist/src/fixes/repetitive-tool-loop/index.js +289 -46
- package/dist/src/fixes/repetitive-tool-loop/index.js.map +1 -1
- package/package.json +1 -1
- package/readme.md +2 -2
|
@@ -27,6 +27,7 @@ export type ConversationStep = {
|
|
|
27
27
|
};
|
|
28
28
|
export { STEP_TYPE_USER, STEP_TYPE_AGENT };
|
|
29
29
|
export declare function utf8(bytes: Uint8Array | null): string;
|
|
30
|
+
export declare function isInternalProxyPrompt(text: string): boolean;
|
|
30
31
|
export declare function decodeStep(stepType: number, payload: Uint8Array, idx: number, timestamp?: string): ConversationStep[];
|
|
31
32
|
export declare function conversationDbPath(sessionId: string, customDbPath?: string): string;
|
|
32
33
|
export declare function readConversationSteps(sessionId: string, customDbPath?: string): ConversationStep[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/dropped-history-chunks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAEL,eAAe,EAGf,KAAK,gBAAgB,EACrB,KAAK,MAAM,EAGZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,cAAc,EACd,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAK1C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAQlC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAgBxE;AAED,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC,CAAC;AAEN,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAE3C,wBAAgB,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,CAErD;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,UAAU,EACnB,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/dropped-history-chunks/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,39 +41,49 @@ export { STEP_TYPE_USER, STEP_TYPE_AGENT };
|
|
|
41
41
|
export function utf8(bytes) {
|
|
42
42
|
return bytes && bytes.length > 0 ? Buffer.from(bytes).toString("utf-8") : "";
|
|
43
43
|
}
|
|
44
|
-
export function
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return
|
|
51
|
-
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
44
|
+
export function isInternalProxyPrompt(text) {
|
|
45
|
+
return /^\s*\[Automated\s+[^\]]+\]:/i.test(text);
|
|
46
|
+
}
|
|
47
|
+
function decodeUserStep(payload, idx, timestamp) {
|
|
48
|
+
const f19 = getField(payload, 19);
|
|
49
|
+
if (!f19)
|
|
50
|
+
return [];
|
|
51
|
+
const raw = utf8(getField(f19, 2));
|
|
52
|
+
if (isInternalProxyPrompt(raw))
|
|
53
|
+
return [];
|
|
54
|
+
const text = stripSystemContext(stripSteeringPrefix(raw)).trim();
|
|
55
|
+
return text ? [{ kind: "user", idx, text, timestamp }] : [];
|
|
56
|
+
}
|
|
57
|
+
function decodeAgentStep(payload, idx, timestamp) {
|
|
58
|
+
const f20 = getField(payload, 20);
|
|
59
|
+
if (!f20)
|
|
60
|
+
return [];
|
|
61
|
+
const steps = [];
|
|
62
|
+
const thought = utf8(getField(f20, 3)).trim();
|
|
63
|
+
if (thought)
|
|
64
|
+
steps.push({ kind: "thought", idx, text: thought, timestamp });
|
|
65
|
+
const text = sanitizeText(utf8(getField(f20, 1)));
|
|
66
|
+
if (text)
|
|
67
|
+
steps.push({ kind: "assistant", idx, text, timestamp });
|
|
68
|
+
const call = getField(f20, 7);
|
|
69
|
+
const callId = call ? utf8(getField(call, 1)) : "";
|
|
70
|
+
if (callId) {
|
|
71
|
+
steps.push({
|
|
72
|
+
kind: "tool_call",
|
|
73
|
+
idx,
|
|
74
|
+
callId,
|
|
75
|
+
name: utf8(getField(call, 2)),
|
|
76
|
+
rawInputJson: utf8(getField(call, 3)),
|
|
77
|
+
timestamp,
|
|
78
|
+
});
|
|
76
79
|
}
|
|
80
|
+
return steps;
|
|
81
|
+
}
|
|
82
|
+
export function decodeStep(stepType, payload, idx, timestamp) {
|
|
83
|
+
if (stepType === STEP_TYPE_USER)
|
|
84
|
+
return decodeUserStep(payload, idx, timestamp);
|
|
85
|
+
if (stepType === STEP_TYPE_AGENT)
|
|
86
|
+
return decodeAgentStep(payload, idx, timestamp);
|
|
77
87
|
return [];
|
|
78
88
|
}
|
|
79
89
|
export function conversationDbPath(sessionId, customDbPath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/dropped-history-chunks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,QAAQ,GAKT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAQlC,MAAM,UAAU,gBAAgB,CAAC,OAAmB;IAClD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,IAAI,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,GAAG,QAAQ,CAAC;QAClB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,GAAG,CAAC;aAC7B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YAAE,KAAK,GAAG,GAAG,CAAC;IACvC,CAAC;IACD,OAAO,OAAO;QACZ,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE;QACxE,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAkBD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAE3C,MAAM,UAAU,IAAI,CAAC,KAAwB;IAC3C,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/dropped-history-chunks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,QAAQ,GAKT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAQlC,MAAM,UAAU,gBAAgB,CAAC,OAAmB;IAClD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,IAAI,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,GAAG,QAAQ,CAAC;QAClB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,GAAG,CAAC;aAC7B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YAAE,KAAK,GAAG,GAAG,CAAC;IACvC,CAAC;IACD,OAAO,OAAO;QACZ,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE;QACxE,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAkBD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAE3C,MAAM,UAAU,IAAI,CAAC,KAAwB;IAC3C,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,cAAc,CAAC,OAAmB,EAAE,GAAW,EAAE,SAAkB;IAC1E,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,qBAAqB,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CAAC,OAAmB,EAAE,GAAW,EAAE,SAAkB;IAC3E,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,WAAW;YACjB,GAAG;YACH,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAK,EAAE,CAAC,CAAC,CAAC;YAC9B,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAK,EAAE,CAAC,CAAC,CAAC;YACtC,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,OAAmB,EACnB,GAAW,EACX,SAAkB;IAElB,IAAI,QAAQ,KAAK,cAAc;QAAE,OAAO,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAChF,IAAI,QAAQ,KAAK,eAAe;QAAE,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAClF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,YAAqB;IACzE,OAAO,YAAY,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,YAAqB;IAErB,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,EAAE,GAAwB,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN,8FAA8F,CAC/F;aACA,GAAG,EAA0B,CAAC;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1B,GAAG,CAAC,YAAY;YACd,CAAC,CAAC,UAAU,CACR,GAAG,CAAC,SAAS,EACb,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAChC,GAAG,CAAC,GAAG,EACP,gBAAgB,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CACnD;YACH,CAAC,CAAC,EAAE,CACP,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,mEAAmE,SAAS,GAAG,EAC/E,GAAG,CACJ,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,EAAE,EAAE,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,YAAoB;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACjD,IACE,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YAC1B,OAAQ,MAAoC,CAAC,WAAW,KAAK,QAAQ,EACrE,CAAC;YACD,OAAQ,MAAkC,CAAC,WAAW,CAAC;QACzD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,IAAI,IAAI,WAAW,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,MAA+B;IAE/B,OAAO;QACL,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,WAAW,CAAC,cAAc;QAClC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;KACC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,aAG8C,EAC9C,IAAY;IAEZ,OAAO,oBAAoB,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,IAAsD;IAEtD,OAAO;QACL,oBAAoB,CAAC,SAAS,EAAE;YAC9B,aAAa,EAAE,eAAe,CAAC,SAAS;YACxC,UAAU,EAAE,IAAI,CAAC,MAAM;YACvB,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC;YACpD,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,IAAI,CAAC,YAAY;SAC5B,CAAC;QACF,oBAAoB,CAAC,SAAS,EAAE;YAC9B,aAAa,EAAE,eAAe,CAAC,gBAAgB;YAC/C,UAAU,EAAE,IAAI,CAAC,MAAM;YACvB,MAAM,EAAE,WAAW;SACpB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,IAAsB;IAEtB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QACtB,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACrF,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAC3B,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QACzB,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtF,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACvE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,KAAkC;IAElC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAA2B,CAAC;AAE9D,SAAS,yBAAyB,CAAC,GAAqB;IACtD,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChF,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAMD,MAAM,CAAC,MAAM,uBAAuB,GAA4B;IAC9D,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,uGAAuG;IACzG,qBAAqB;IAErB,UAAU,CAAC,GAAqB,EAAE,QAAyB;QACzD,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,YAAY,EAAE,CAAC;YACrE,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,SAAS,EAAE,CAAC;gBACd,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,CAEP,GAAqB,EACrB,QAAwB;QAExB,IAAI,kBAAkB,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,cAAc,CAAC;YAAE,OAAO,EAAE,CAAC;QAEzD,MAAM,SAAS,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,SAAS,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;YACjC,MAAM,EAAE,GACN,IAAI,EAAE,qBAAqB;gBAC3B,uBAAuB,CAAC,qBAAqB;gBAC7C,qBAAqB,CAAC;YACxB,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,uBAAuB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,OAAO;QACL,kBAAkB,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF,CAAC;AAGF,MAAM,CAAC,MAAM,wBAAwB,GAAG,uBAAuB,CAAC"}
|
|
@@ -1,16 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Problem:
|
|
3
|
-
* When upstream Antigravity executes tool calls
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* When upstream Antigravity executes tool calls and halts with an empty completion (stopReason=16,
|
|
4
|
+
* no text and no tool call), upstream completes the prompt turn with a successful result without
|
|
5
|
+
* emitting any `agent_message_chunk`. Editor clients (Paseo, Zed) transition the session to idle,
|
|
6
|
+
* leaving the user with zero explanation and an apparent hang, forcing the user to manually ask
|
|
7
|
+
* "You stopped, status report and next steps?".
|
|
7
8
|
*
|
|
8
9
|
* Solution:
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* In addition to baseline system prompt steering, intercepts empty `endTurn` completions following
|
|
11
|
+
* tool execution at runtime. Automatically dispatches an automated continuation prompt upstream
|
|
12
|
+
* directing the model to summarize its progress and continue executing the task to completion,
|
|
13
|
+
* without synthesizing artificial assistant prose in the proxy.
|
|
12
14
|
*/
|
|
13
|
-
import type
|
|
14
|
-
export
|
|
15
|
+
import { type AcpFix } from "../../core/types.js";
|
|
16
|
+
export interface PrematureTurnStopOptions {
|
|
17
|
+
maxContinuations?: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class PrematureTurnStopTracker {
|
|
20
|
+
private readonly sessions;
|
|
21
|
+
private readonly promptIdToSessionId;
|
|
22
|
+
private getOrCreate;
|
|
23
|
+
startTurn(sessionId: string, promptId?: string | number | null): void;
|
|
24
|
+
getSessionIdForPrompt(promptId: string | number): string | undefined;
|
|
25
|
+
recordToolCall(sessionId: string): void;
|
|
26
|
+
recordAssistantText(sessionId: string, length: number): void;
|
|
27
|
+
isPrematureStop(sessionId: string, promptId: string | number | null | undefined, maxContinuations: number): boolean;
|
|
28
|
+
getToolCallCount(sessionId: string): number;
|
|
29
|
+
getContinuationCount(sessionId: string): number;
|
|
30
|
+
incrementContinuationCount(sessionId: string): void;
|
|
31
|
+
getContinuationPromptId(sessionId: string): string | number | undefined;
|
|
32
|
+
setContinuationPromptId(sessionId: string, promptId: string | number): void;
|
|
33
|
+
clearContinuationPrompt(sessionId: string): void;
|
|
34
|
+
getActivePromptId(sessionId: string): string | number | null | undefined;
|
|
35
|
+
clearSession(sessionId: string): void;
|
|
36
|
+
clear(): void;
|
|
37
|
+
}
|
|
38
|
+
export declare function buildContinuationText(toolCallCount: number): string;
|
|
39
|
+
export declare function createPrematureTurnStopFix(options?: PrematureTurnStopOptions): AcpFix;
|
|
15
40
|
export declare const prematureTurnStopFix: AcpFix;
|
|
16
41
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/premature-turn-stop/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/premature-turn-stop/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAKL,KAAK,MAAM,EAKZ,MAAM,qBAAqB,CAAC;AAG7B,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAUD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;IAChE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsC;IAE1E,OAAO,CAAC,WAAW;IAanB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI;IAYrE,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKvC,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5D,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAC5C,gBAAgB,EAAE,MAAM,GACvB,OAAO;IAaV,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI3C,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI/C,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKnD,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvE,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ3E,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAUhD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS;IAIxE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAarC,KAAK,IAAI,IAAI;CAId;AAED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAKnE;AAyGD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM,CA2CzF;AAED,eAAO,MAAM,oBAAoB,QAA+B,CAAC"}
|
|
@@ -1,25 +1,228 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Problem:
|
|
3
|
-
* When upstream Antigravity executes tool calls
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* When upstream Antigravity executes tool calls and halts with an empty completion (stopReason=16,
|
|
4
|
+
* no text and no tool call), upstream completes the prompt turn with a successful result without
|
|
5
|
+
* emitting any `agent_message_chunk`. Editor clients (Paseo, Zed) transition the session to idle,
|
|
6
|
+
* leaving the user with zero explanation and an apparent hang, forcing the user to manually ask
|
|
7
|
+
* "You stopped, status report and next steps?".
|
|
7
8
|
*
|
|
8
9
|
* Solution:
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* In addition to baseline system prompt steering, intercepts empty `endTurn` completions following
|
|
11
|
+
* tool execution at runtime. Automatically dispatches an automated continuation prompt upstream
|
|
12
|
+
* directing the model to summarize its progress and continue executing the task to completion,
|
|
13
|
+
* without synthesizing artificial assistant prose in the proxy.
|
|
12
14
|
*/
|
|
13
|
-
|
|
15
|
+
import { ACP_METHODS, SESSION_UPDATES, STOP_REASONS, isMethod, } from "../../core/types.js";
|
|
16
|
+
import { extractSessionId } from "../../core/session-cache.js";
|
|
17
|
+
export class PrematureTurnStopTracker {
|
|
18
|
+
sessions = new Map();
|
|
19
|
+
promptIdToSessionId = new Map();
|
|
20
|
+
getOrCreate(sessionId) {
|
|
21
|
+
let state = this.sessions.get(sessionId);
|
|
22
|
+
if (!state) {
|
|
23
|
+
state = {
|
|
24
|
+
toolCallCount: 0,
|
|
25
|
+
assistantTextLength: 0,
|
|
26
|
+
continuationCount: 0,
|
|
27
|
+
};
|
|
28
|
+
this.sessions.set(sessionId, state);
|
|
29
|
+
}
|
|
30
|
+
return state;
|
|
31
|
+
}
|
|
32
|
+
startTurn(sessionId, promptId) {
|
|
33
|
+
const state = this.getOrCreate(sessionId);
|
|
34
|
+
state.activePromptId = promptId;
|
|
35
|
+
state.toolCallCount = 0;
|
|
36
|
+
state.assistantTextLength = 0;
|
|
37
|
+
state.continuationCount = 0;
|
|
38
|
+
state.continuationPromptId = undefined;
|
|
39
|
+
if (promptId !== undefined && promptId !== null) {
|
|
40
|
+
this.promptIdToSessionId.set(promptId, sessionId);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
getSessionIdForPrompt(promptId) {
|
|
44
|
+
return this.promptIdToSessionId.get(promptId);
|
|
45
|
+
}
|
|
46
|
+
recordToolCall(sessionId) {
|
|
47
|
+
const state = this.getOrCreate(sessionId);
|
|
48
|
+
state.toolCallCount++;
|
|
49
|
+
}
|
|
50
|
+
recordAssistantText(sessionId, length) {
|
|
51
|
+
const state = this.getOrCreate(sessionId);
|
|
52
|
+
state.assistantTextLength += length;
|
|
53
|
+
}
|
|
54
|
+
isPrematureStop(sessionId, promptId, maxContinuations) {
|
|
55
|
+
const state = this.sessions.get(sessionId);
|
|
56
|
+
if (!state)
|
|
57
|
+
return false;
|
|
58
|
+
const isMatchingPrompt = state.activePromptId === promptId || state.continuationPromptId === promptId;
|
|
59
|
+
return (isMatchingPrompt &&
|
|
60
|
+
state.toolCallCount > 0 &&
|
|
61
|
+
state.assistantTextLength === 0 &&
|
|
62
|
+
state.continuationCount < maxContinuations);
|
|
63
|
+
}
|
|
64
|
+
getToolCallCount(sessionId) {
|
|
65
|
+
return this.sessions.get(sessionId)?.toolCallCount ?? 0;
|
|
66
|
+
}
|
|
67
|
+
getContinuationCount(sessionId) {
|
|
68
|
+
return this.sessions.get(sessionId)?.continuationCount ?? 0;
|
|
69
|
+
}
|
|
70
|
+
incrementContinuationCount(sessionId) {
|
|
71
|
+
const s = this.sessions.get(sessionId);
|
|
72
|
+
if (s)
|
|
73
|
+
s.continuationCount++;
|
|
74
|
+
}
|
|
75
|
+
getContinuationPromptId(sessionId) {
|
|
76
|
+
return this.sessions.get(sessionId)?.continuationPromptId;
|
|
77
|
+
}
|
|
78
|
+
setContinuationPromptId(sessionId, promptId) {
|
|
79
|
+
const s = this.sessions.get(sessionId);
|
|
80
|
+
if (s) {
|
|
81
|
+
s.continuationPromptId = promptId;
|
|
82
|
+
this.promptIdToSessionId.set(promptId, sessionId);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
clearContinuationPrompt(sessionId) {
|
|
86
|
+
const s = this.sessions.get(sessionId);
|
|
87
|
+
if (s) {
|
|
88
|
+
if (s.continuationPromptId !== undefined) {
|
|
89
|
+
this.promptIdToSessionId.delete(s.continuationPromptId);
|
|
90
|
+
}
|
|
91
|
+
s.continuationPromptId = undefined;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
getActivePromptId(sessionId) {
|
|
95
|
+
return this.sessions.get(sessionId)?.activePromptId;
|
|
96
|
+
}
|
|
97
|
+
clearSession(sessionId) {
|
|
98
|
+
const s = this.sessions.get(sessionId);
|
|
99
|
+
if (s) {
|
|
100
|
+
if (s.activePromptId !== undefined && s.activePromptId !== null) {
|
|
101
|
+
this.promptIdToSessionId.delete(s.activePromptId);
|
|
102
|
+
}
|
|
103
|
+
if (s.continuationPromptId !== undefined) {
|
|
104
|
+
this.promptIdToSessionId.delete(s.continuationPromptId);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
this.sessions.delete(sessionId);
|
|
108
|
+
}
|
|
109
|
+
clear() {
|
|
110
|
+
this.sessions.clear();
|
|
111
|
+
this.promptIdToSessionId.clear();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export function buildContinuationText(toolCallCount) {
|
|
115
|
+
return (`[Automated Continuation]: You executed ${toolCallCount} tool calls but stopped without providing a status report or proceeding with the task. ` +
|
|
116
|
+
`Please summarize what you have accomplished, evaluate the current state, and continue executing the next steps to complete the task.`);
|
|
117
|
+
}
|
|
118
|
+
async function dispatchContinuationPrompt(sessionId, tracker, context) {
|
|
119
|
+
tracker.incrementContinuationCount(sessionId);
|
|
120
|
+
const toolCallCount = tracker.getToolCallCount(sessionId);
|
|
121
|
+
const continuationText = buildContinuationText(toolCallCount);
|
|
122
|
+
const continuationPromptId = `continue_${sessionId}_${Date.now()}`;
|
|
123
|
+
tracker.setContinuationPromptId(sessionId, continuationPromptId);
|
|
124
|
+
try {
|
|
125
|
+
await context.writeToChild({
|
|
126
|
+
jsonrpc: "2.0",
|
|
127
|
+
id: continuationPromptId,
|
|
128
|
+
method: ACP_METHODS.SESSION_PROMPT,
|
|
129
|
+
params: {
|
|
130
|
+
sessionId,
|
|
131
|
+
prompt: [{ type: "text", text: continuationText }],
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
console.error(`[refined-antigravity-acp] Failed to send automated continuation prompt:`, err);
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function resolveSessionId(msg, tracker) {
|
|
142
|
+
const fromMsg = extractSessionId(msg);
|
|
143
|
+
if (fromMsg)
|
|
144
|
+
return fromMsg;
|
|
145
|
+
const id = msg.id;
|
|
146
|
+
return id !== null && id !== undefined ? tracker.getSessionIdForPrompt(id) : undefined;
|
|
147
|
+
}
|
|
148
|
+
function handleInboundUpdate(msg, sessionId, tracker) {
|
|
149
|
+
const update = "params" in msg ? msg.params?.update : undefined;
|
|
150
|
+
if (!update)
|
|
151
|
+
return;
|
|
152
|
+
if (update.sessionUpdate === SESSION_UPDATES.TOOL_CALL) {
|
|
153
|
+
tracker.recordToolCall(sessionId);
|
|
154
|
+
}
|
|
155
|
+
else if (update.sessionUpdate === SESSION_UPDATES.AGENT_MESSAGE_CHUNK) {
|
|
156
|
+
const text = update?.content?.text;
|
|
157
|
+
if (typeof text === "string" && text.length > 0) {
|
|
158
|
+
tracker.recordAssistantText(sessionId, text.length);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function handleContinuationResponse(msg, promptId, sessionId, tracker) {
|
|
163
|
+
const continuationPromptId = tracker.getContinuationPromptId(sessionId);
|
|
164
|
+
if (continuationPromptId !== undefined && promptId === continuationPromptId) {
|
|
165
|
+
const originalPromptId = tracker.getActivePromptId(sessionId);
|
|
166
|
+
tracker.clearContinuationPrompt(sessionId);
|
|
167
|
+
return [{ ...msg, id: originalPromptId ?? null }];
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
async function handlePromptResult(msg, sessionId, tracker, context, options) {
|
|
172
|
+
if (!("result" in msg))
|
|
173
|
+
return null;
|
|
174
|
+
const promptId = msg.id;
|
|
175
|
+
const res = msg.result;
|
|
176
|
+
const stopReason = res?.stopReason;
|
|
177
|
+
if (stopReason === STOP_REASONS.CANCELLED) {
|
|
178
|
+
tracker.clearSession(sessionId);
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
const maxContinuations = options.maxContinuations ?? 2;
|
|
182
|
+
if (stopReason === STOP_REASONS.END_TURN &&
|
|
183
|
+
tracker.isPrematureStop(sessionId, promptId, maxContinuations)) {
|
|
184
|
+
const dispatched = await dispatchContinuationPrompt(sessionId, tracker, context);
|
|
185
|
+
if (dispatched)
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
return handleContinuationResponse(msg, promptId, sessionId, tracker);
|
|
189
|
+
}
|
|
190
|
+
export function createPrematureTurnStopFix(options = {}) {
|
|
191
|
+
const tracker = new PrematureTurnStopTracker();
|
|
14
192
|
return {
|
|
15
193
|
name: "premature-turn-stop",
|
|
16
|
-
description: "Steers model
|
|
194
|
+
description: "Steers model and intercepts premature empty turn stops without assistant messages to continue e2e execution",
|
|
17
195
|
getSystemInstructions() {
|
|
18
196
|
return [
|
|
19
197
|
"Never end a prompt turn without emitting a clear assistant text message summarizing completed actions, current status, or next steps.",
|
|
20
198
|
"When executing commit commands, linter checks, or tests that encounter errors, explicitly explain the failures to the user before attempting further autonomous repairs.",
|
|
21
199
|
];
|
|
22
200
|
},
|
|
201
|
+
onOutbound(msg, _context) {
|
|
202
|
+
const sessionId = extractSessionId(msg);
|
|
203
|
+
if (!sessionId)
|
|
204
|
+
return msg;
|
|
205
|
+
if (isMethod(msg, ACP_METHODS.SESSION_PROMPT)) {
|
|
206
|
+
const promptId = msg.id;
|
|
207
|
+
tracker.startTurn(sessionId, promptId);
|
|
208
|
+
}
|
|
209
|
+
else if (isMethod(msg, ACP_METHODS.SESSION_CANCEL)) {
|
|
210
|
+
tracker.clearSession(sessionId);
|
|
211
|
+
}
|
|
212
|
+
return msg;
|
|
213
|
+
},
|
|
214
|
+
async onInbound(msg, context) {
|
|
215
|
+
const sessionId = resolveSessionId(msg, tracker);
|
|
216
|
+
if (!sessionId)
|
|
217
|
+
return [msg];
|
|
218
|
+
if (isMethod(msg, ACP_METHODS.SESSION_UPDATE)) {
|
|
219
|
+
handleInboundUpdate(msg, sessionId, tracker);
|
|
220
|
+
}
|
|
221
|
+
const promptHandled = await handlePromptResult(msg, sessionId, tracker, context, options);
|
|
222
|
+
if (promptHandled)
|
|
223
|
+
return promptHandled;
|
|
224
|
+
return [msg];
|
|
225
|
+
},
|
|
23
226
|
};
|
|
24
227
|
}
|
|
25
228
|
export const prematureTurnStopFix = createPrematureTurnStopFix();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/premature-turn-stop/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/premature-turn-stop/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,26 +3,35 @@
|
|
|
3
3
|
* Upstream `agy_acp_server` does not detect repetitive tool calling loops or autoregressive attractor cycles.
|
|
4
4
|
* When a model degenerates into repeating the same tool call or cycling through the same set of file slices,
|
|
5
5
|
* raw agy blindly executes tool calls indefinitely, burning thousands of tokens and freezing editor sessions.
|
|
6
|
+
* Furthermore, blindly halting every repeated tool breaks legitimate user polling (e.g. polling a port or waiting for builds).
|
|
6
7
|
*
|
|
7
8
|
* Solution:
|
|
8
9
|
* Tracks canonicalized tool call signatures per prompt turn using suffix cycle matching.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* Recognizes user polling intent (e.g. "until", "poll", "retry", "wait for", "N times") to allow legitimate polling.
|
|
11
|
+
* When an unintentional runaway loop is detected, interrupts the repetitive execution and sends automated steering
|
|
12
|
+
* ("You have repeatedly executed X, is that expected?") directly to the upstream model so it self-corrects without
|
|
13
|
+
* ending the turn or polluting the user's chat.
|
|
12
14
|
*/
|
|
13
|
-
import { type AcpFix } from "../../core/types.js";
|
|
15
|
+
import { type AcpFix, type AcpStreamMessage } from "../../core/types.js";
|
|
14
16
|
export declare const IGNORED_METADATA_KEYS: Set<string>;
|
|
15
17
|
export declare const READ_ONLY_TOOLS: Set<string>;
|
|
18
|
+
export declare const POLLING_INTENT_PATTERN: RegExp;
|
|
19
|
+
export declare function extractPromptText(msg: AcpStreamMessage): string;
|
|
20
|
+
export declare function hasPollingIntent(promptText: string): boolean;
|
|
21
|
+
export declare function extractRequestedIterations(promptText: string): number | undefined;
|
|
16
22
|
export interface RepetitiveToolLoopOptions {
|
|
17
23
|
maxPeriod?: number;
|
|
18
24
|
readOnlySingleThreshold?: number;
|
|
19
25
|
mutatingSingleThreshold?: number;
|
|
26
|
+
pollingSingleThreshold?: number;
|
|
20
27
|
cycleThreshold?: number;
|
|
28
|
+
maxSteersPerTurn?: number;
|
|
21
29
|
}
|
|
22
30
|
export declare function normalizeKey(key: string): string;
|
|
23
31
|
export declare function canonicalizeValue(val: unknown): unknown;
|
|
24
32
|
export declare function inferToolNameFromUpdate(title?: string | null, kind?: string | null, rawInput?: unknown): string;
|
|
25
33
|
export declare function computeToolCallSignature(toolName: string, rawInput: unknown): string;
|
|
34
|
+
export declare function extractTargetResource(rawInput: unknown): string | undefined;
|
|
26
35
|
export interface CycleDetectionResult {
|
|
27
36
|
isLoop: boolean;
|
|
28
37
|
cycleLength: number;
|
|
@@ -38,14 +47,27 @@ export declare class RepetitiveToolLoopTracker {
|
|
|
38
47
|
private readonly sessions;
|
|
39
48
|
private readonly promptIdToSessionId;
|
|
40
49
|
private getOrCreate;
|
|
41
|
-
startTurn(sessionId: string, promptId?: string | number): void;
|
|
50
|
+
startTurn(sessionId: string, promptId?: string | number, promptText?: string): void;
|
|
42
51
|
getSessionIdForPrompt(promptId: string | number): string | undefined;
|
|
43
52
|
recordToolCall(sessionId: string, toolName: string, rawInput: unknown, options?: RepetitiveToolLoopOptions): CycleDetectionResult;
|
|
44
53
|
isLoopInterrupted(sessionId: string): boolean;
|
|
45
|
-
|
|
54
|
+
isSteerPending(sessionId: string): boolean;
|
|
55
|
+
setSteerPending(sessionId: string, pending: boolean): void;
|
|
56
|
+
getSteerPromptId(sessionId: string): string | number | undefined;
|
|
57
|
+
setSteerPromptId(sessionId: string, promptId: string | number): void;
|
|
58
|
+
clearSteerPrompt(sessionId: string): void;
|
|
59
|
+
getSteerCount(sessionId: string): number;
|
|
60
|
+
incrementSteerCount(sessionId: string): void;
|
|
61
|
+
getLastToolName(sessionId: string): string | undefined;
|
|
62
|
+
getLastLoopResult(sessionId: string): CycleDetectionResult | undefined;
|
|
63
|
+
getLastTargetResource(sessionId: string): string | undefined;
|
|
64
|
+
resetSignaturesForSteering(sessionId: string): void;
|
|
65
|
+
getActivePromptId(sessionId: string): string | number | null | undefined;
|
|
66
|
+
hasPollingIntent(sessionId: string): boolean;
|
|
46
67
|
clearSession(sessionId: string): void;
|
|
47
68
|
clear(): void;
|
|
48
69
|
}
|
|
70
|
+
export declare function buildSteeringText(toolName: string, targetResource: string | undefined, repetitions: number, steerCount: number): string;
|
|
49
71
|
export declare function createRepetitiveToolLoopFix(options?: RepetitiveToolLoopOptions): AcpFix;
|
|
50
72
|
export declare const repetitiveToolLoopFix: AcpFix;
|
|
51
73
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/repetitive-tool-loop/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/repetitive-tool-loop/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
* Upstream `agy_acp_server` does not detect repetitive tool calling loops or autoregressive attractor cycles.
|
|
4
4
|
* When a model degenerates into repeating the same tool call or cycling through the same set of file slices,
|
|
5
5
|
* raw agy blindly executes tool calls indefinitely, burning thousands of tokens and freezing editor sessions.
|
|
6
|
+
* Furthermore, blindly halting every repeated tool breaks legitimate user polling (e.g. polling a port or waiting for builds).
|
|
6
7
|
*
|
|
7
8
|
* Solution:
|
|
8
9
|
* Tracks canonicalized tool call signatures per prompt turn using suffix cycle matching.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* Recognizes user polling intent (e.g. "until", "poll", "retry", "wait for", "N times") to allow legitimate polling.
|
|
11
|
+
* When an unintentional runaway loop is detected, interrupts the repetitive execution and sends automated steering
|
|
12
|
+
* ("You have repeatedly executed X, is that expected?") directly to the upstream model so it self-corrects without
|
|
13
|
+
* ending the turn or polluting the user's chat.
|
|
12
14
|
*/
|
|
13
15
|
import { ACP_METHODS, SESSION_UPDATES, STOP_REASONS, isMethod, } from "../../core/types.js";
|
|
14
16
|
import { extractSessionId } from "../../core/session-cache.js";
|
|
@@ -21,6 +23,30 @@ export const READ_ONLY_TOOLS = new Set([
|
|
|
21
23
|
"search_web",
|
|
22
24
|
"read_file",
|
|
23
25
|
]);
|
|
26
|
+
export const POLLING_INTENT_PATTERN = /\b(?:until|poll|polling|wait\s+for|retry|retrying|keep\s+checking|repeat|repeatedly|loop|while|monitor|status\s+code\s+200|\d+\s*times)\b/i;
|
|
27
|
+
export function extractPromptText(msg) {
|
|
28
|
+
const prompt = msg?.params?.prompt;
|
|
29
|
+
if (typeof prompt === "string")
|
|
30
|
+
return prompt;
|
|
31
|
+
if (!Array.isArray(prompt))
|
|
32
|
+
return "";
|
|
33
|
+
return prompt
|
|
34
|
+
.filter((b) => b && typeof b.text === "string")
|
|
35
|
+
.map((b) => b.text)
|
|
36
|
+
.join(" ");
|
|
37
|
+
}
|
|
38
|
+
export function hasPollingIntent(promptText) {
|
|
39
|
+
return POLLING_INTENT_PATTERN.test(promptText);
|
|
40
|
+
}
|
|
41
|
+
export function extractRequestedIterations(promptText) {
|
|
42
|
+
const match = promptText.match(/(\d+)\s*times\b/i);
|
|
43
|
+
if (match && match[1]) {
|
|
44
|
+
const num = Math.trunc(Number(match[1]));
|
|
45
|
+
if (!Number.isNaN(num) && num > 0)
|
|
46
|
+
return num;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
24
50
|
export function normalizeKey(key) {
|
|
25
51
|
return key.toLowerCase().replace(/_/g, "");
|
|
26
52
|
}
|
|
@@ -73,6 +99,42 @@ export function computeToolCallSignature(toolName, rawInput) {
|
|
|
73
99
|
const canonical = canonicalizeValue(parsedInput);
|
|
74
100
|
return `${toolName}:${JSON.stringify(canonical)}`;
|
|
75
101
|
}
|
|
102
|
+
const RESOURCE_PATH_KEYS = [
|
|
103
|
+
"AbsolutePath",
|
|
104
|
+
"TargetFile",
|
|
105
|
+
"targetFile",
|
|
106
|
+
"target_file",
|
|
107
|
+
"filePath",
|
|
108
|
+
"file_path",
|
|
109
|
+
"path",
|
|
110
|
+
];
|
|
111
|
+
function parseRawObject(raw) {
|
|
112
|
+
if (!raw)
|
|
113
|
+
return null;
|
|
114
|
+
if (typeof raw === "string") {
|
|
115
|
+
try {
|
|
116
|
+
const parsed = JSON.parse(raw);
|
|
117
|
+
return typeof parsed === "object" && parsed !== null
|
|
118
|
+
? parsed
|
|
119
|
+
: null;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return typeof raw === "object" ? raw : null;
|
|
126
|
+
}
|
|
127
|
+
export function extractTargetResource(rawInput) {
|
|
128
|
+
const obj = parseRawObject(rawInput);
|
|
129
|
+
if (!obj)
|
|
130
|
+
return undefined;
|
|
131
|
+
for (const key of RESOURCE_PATH_KEYS) {
|
|
132
|
+
const val = obj[key];
|
|
133
|
+
if (typeof val === "string")
|
|
134
|
+
return val;
|
|
135
|
+
}
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
76
138
|
function isSuffixCycleMatch(signatures, n, k, repetitions) {
|
|
77
139
|
for (let r = 1; r < repetitions; r++) {
|
|
78
140
|
for (let i = 0; i < k; i++) {
|
|
@@ -83,6 +145,16 @@ function isSuffixCycleMatch(signatures, n, k, repetitions) {
|
|
|
83
145
|
}
|
|
84
146
|
return true;
|
|
85
147
|
}
|
|
148
|
+
function isDegenerateSingleItem(signatures, n, k) {
|
|
149
|
+
if (k <= 1)
|
|
150
|
+
return false;
|
|
151
|
+
for (let i = 1; i < k; i++) {
|
|
152
|
+
if (signatures[n - k + i] !== signatures[n - k]) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
86
158
|
export function detectCycle(signatures, options = {}) {
|
|
87
159
|
const maxPeriod = options.maxPeriod ?? 4;
|
|
88
160
|
const singleToolThreshold = options.singleToolThreshold ?? 3;
|
|
@@ -91,8 +163,9 @@ export function detectCycle(signatures, options = {}) {
|
|
|
91
163
|
for (let k = 1; k <= maxPeriod; k++) {
|
|
92
164
|
const requiredRepetitions = k === 1 ? singleToolThreshold : cycleThreshold;
|
|
93
165
|
const requiredLength = k * requiredRepetitions;
|
|
94
|
-
if (n < requiredLength)
|
|
166
|
+
if (n < requiredLength || isDegenerateSingleItem(signatures, n, k)) {
|
|
95
167
|
continue;
|
|
168
|
+
}
|
|
96
169
|
if (isSuffixCycleMatch(signatures, n, k, requiredRepetitions)) {
|
|
97
170
|
return {
|
|
98
171
|
isLoop: true,
|
|
@@ -109,22 +182,69 @@ export function detectCycle(signatures, options = {}) {
|
|
|
109
182
|
pattern: [],
|
|
110
183
|
};
|
|
111
184
|
}
|
|
185
|
+
function resolveSingleThreshold(isReadOnly, hasPolling, requestedIterations, options) {
|
|
186
|
+
if (isReadOnly)
|
|
187
|
+
return options.readOnlySingleThreshold ?? 3;
|
|
188
|
+
if (!hasPolling)
|
|
189
|
+
return options.mutatingSingleThreshold ?? 5;
|
|
190
|
+
const basePolling = options.pollingSingleThreshold ?? 30;
|
|
191
|
+
return requestedIterations ? Math.max(requestedIterations + 2, basePolling) : basePolling;
|
|
192
|
+
}
|
|
193
|
+
function detectResourceLoop(state, toolName, rawInput, singleThreshold, options) {
|
|
194
|
+
if (!READ_ONLY_TOOLS.has(toolName))
|
|
195
|
+
return null;
|
|
196
|
+
const resource = extractTargetResource(rawInput);
|
|
197
|
+
if (!resource)
|
|
198
|
+
return null;
|
|
199
|
+
state.resourceSignatures.push(`${toolName}:${resource}`);
|
|
200
|
+
const resourceThreshold = state.hasPollingIntent
|
|
201
|
+
? singleThreshold
|
|
202
|
+
: Math.max((options.readOnlySingleThreshold ?? 3) * 2, 6);
|
|
203
|
+
const resCycle = detectCycle(state.resourceSignatures, {
|
|
204
|
+
maxPeriod: options.maxPeriod ?? 4,
|
|
205
|
+
singleToolThreshold: resourceThreshold,
|
|
206
|
+
cycleThreshold: options.cycleThreshold ?? 3,
|
|
207
|
+
});
|
|
208
|
+
if (resCycle.isLoop) {
|
|
209
|
+
state.lastTargetResource = resource;
|
|
210
|
+
return resCycle;
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
112
214
|
export class RepetitiveToolLoopTracker {
|
|
113
215
|
sessions = new Map();
|
|
114
216
|
promptIdToSessionId = new Map();
|
|
115
217
|
getOrCreate(sessionId) {
|
|
116
218
|
let state = this.sessions.get(sessionId);
|
|
117
219
|
if (!state) {
|
|
118
|
-
state = {
|
|
220
|
+
state = {
|
|
221
|
+
signatures: [],
|
|
222
|
+
resourceSignatures: [],
|
|
223
|
+
loopInterrupted: false,
|
|
224
|
+
userPromptText: "",
|
|
225
|
+
hasPollingIntent: false,
|
|
226
|
+
steerPending: false,
|
|
227
|
+
steerCount: 0,
|
|
228
|
+
};
|
|
119
229
|
this.sessions.set(sessionId, state);
|
|
120
230
|
}
|
|
121
231
|
return state;
|
|
122
232
|
}
|
|
123
|
-
startTurn(sessionId, promptId) {
|
|
233
|
+
startTurn(sessionId, promptId, promptText = "") {
|
|
124
234
|
const state = this.getOrCreate(sessionId);
|
|
125
235
|
state.activePromptId = promptId;
|
|
236
|
+
state.userPromptText = promptText;
|
|
237
|
+
state.hasPollingIntent = hasPollingIntent(promptText);
|
|
238
|
+
state.requestedIterations = extractRequestedIterations(promptText);
|
|
126
239
|
state.signatures = [];
|
|
240
|
+
state.resourceSignatures = [];
|
|
127
241
|
state.loopInterrupted = false;
|
|
242
|
+
state.steerPending = false;
|
|
243
|
+
state.steerPromptId = undefined;
|
|
244
|
+
state.steerCount = 0;
|
|
245
|
+
state.lastLoopResult = undefined;
|
|
246
|
+
state.lastToolName = undefined;
|
|
247
|
+
state.lastTargetResource = undefined;
|
|
128
248
|
if (promptId !== undefined && promptId !== null) {
|
|
129
249
|
this.promptIdToSessionId.set(promptId, sessionId);
|
|
130
250
|
}
|
|
@@ -140,26 +260,97 @@ export class RepetitiveToolLoopTracker {
|
|
|
140
260
|
const signature = computeToolCallSignature(toolName, rawInput);
|
|
141
261
|
state.signatures.push(signature);
|
|
142
262
|
const isReadOnly = READ_ONLY_TOOLS.has(toolName);
|
|
143
|
-
const singleThreshold = isReadOnly
|
|
144
|
-
? (options.readOnlySingleThreshold ?? 3)
|
|
145
|
-
: (options.mutatingSingleThreshold ?? 5);
|
|
263
|
+
const singleThreshold = resolveSingleThreshold(isReadOnly, state.hasPollingIntent, state.requestedIterations, options);
|
|
146
264
|
const result = detectCycle(state.signatures, {
|
|
147
265
|
maxPeriod: options.maxPeriod ?? 4,
|
|
148
266
|
singleToolThreshold: singleThreshold,
|
|
149
267
|
cycleThreshold: options.cycleThreshold ?? 3,
|
|
150
268
|
});
|
|
151
|
-
|
|
269
|
+
const loopResult = result.isLoop
|
|
270
|
+
? result
|
|
271
|
+
: detectResourceLoop(state, toolName, rawInput, singleThreshold, options);
|
|
272
|
+
if (loopResult && loopResult.isLoop) {
|
|
152
273
|
state.loopInterrupted = true;
|
|
274
|
+
state.lastLoopResult = loopResult;
|
|
275
|
+
state.lastToolName = toolName;
|
|
276
|
+
if (!state.lastTargetResource) {
|
|
277
|
+
state.lastTargetResource = extractTargetResource(rawInput);
|
|
278
|
+
}
|
|
279
|
+
return loopResult;
|
|
153
280
|
}
|
|
154
281
|
return result;
|
|
155
282
|
}
|
|
156
283
|
isLoopInterrupted(sessionId) {
|
|
157
284
|
return this.sessions.get(sessionId)?.loopInterrupted ?? false;
|
|
158
285
|
}
|
|
286
|
+
isSteerPending(sessionId) {
|
|
287
|
+
return this.sessions.get(sessionId)?.steerPending ?? false;
|
|
288
|
+
}
|
|
289
|
+
setSteerPending(sessionId, pending) {
|
|
290
|
+
const s = this.sessions.get(sessionId);
|
|
291
|
+
if (s)
|
|
292
|
+
s.steerPending = pending;
|
|
293
|
+
}
|
|
294
|
+
getSteerPromptId(sessionId) {
|
|
295
|
+
return this.sessions.get(sessionId)?.steerPromptId;
|
|
296
|
+
}
|
|
297
|
+
setSteerPromptId(sessionId, promptId) {
|
|
298
|
+
const s = this.sessions.get(sessionId);
|
|
299
|
+
if (s) {
|
|
300
|
+
s.steerPromptId = promptId;
|
|
301
|
+
this.promptIdToSessionId.set(promptId, sessionId);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
clearSteerPrompt(sessionId) {
|
|
305
|
+
const s = this.sessions.get(sessionId);
|
|
306
|
+
if (s) {
|
|
307
|
+
if (s.steerPromptId !== undefined) {
|
|
308
|
+
this.promptIdToSessionId.delete(s.steerPromptId);
|
|
309
|
+
}
|
|
310
|
+
s.steerPromptId = undefined;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
getSteerCount(sessionId) {
|
|
314
|
+
return this.sessions.get(sessionId)?.steerCount ?? 0;
|
|
315
|
+
}
|
|
316
|
+
incrementSteerCount(sessionId) {
|
|
317
|
+
const s = this.sessions.get(sessionId);
|
|
318
|
+
if (s)
|
|
319
|
+
s.steerCount++;
|
|
320
|
+
}
|
|
321
|
+
getLastToolName(sessionId) {
|
|
322
|
+
return this.sessions.get(sessionId)?.lastToolName;
|
|
323
|
+
}
|
|
324
|
+
getLastLoopResult(sessionId) {
|
|
325
|
+
return this.sessions.get(sessionId)?.lastLoopResult;
|
|
326
|
+
}
|
|
327
|
+
getLastTargetResource(sessionId) {
|
|
328
|
+
return this.sessions.get(sessionId)?.lastTargetResource;
|
|
329
|
+
}
|
|
330
|
+
resetSignaturesForSteering(sessionId) {
|
|
331
|
+
const s = this.sessions.get(sessionId);
|
|
332
|
+
if (s) {
|
|
333
|
+
s.signatures = [];
|
|
334
|
+
s.resourceSignatures = [];
|
|
335
|
+
s.loopInterrupted = false;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
159
338
|
getActivePromptId(sessionId) {
|
|
160
339
|
return this.sessions.get(sessionId)?.activePromptId;
|
|
161
340
|
}
|
|
341
|
+
hasPollingIntent(sessionId) {
|
|
342
|
+
return this.sessions.get(sessionId)?.hasPollingIntent ?? false;
|
|
343
|
+
}
|
|
162
344
|
clearSession(sessionId) {
|
|
345
|
+
const s = this.sessions.get(sessionId);
|
|
346
|
+
if (s) {
|
|
347
|
+
if (s.activePromptId !== undefined && s.activePromptId !== null) {
|
|
348
|
+
this.promptIdToSessionId.delete(s.activePromptId);
|
|
349
|
+
}
|
|
350
|
+
if (s.steerPromptId !== undefined) {
|
|
351
|
+
this.promptIdToSessionId.delete(s.steerPromptId);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
163
354
|
this.sessions.delete(sessionId);
|
|
164
355
|
}
|
|
165
356
|
clear() {
|
|
@@ -167,7 +358,8 @@ export class RepetitiveToolLoopTracker {
|
|
|
167
358
|
this.promptIdToSessionId.clear();
|
|
168
359
|
}
|
|
169
360
|
}
|
|
170
|
-
async function interruptLoopExecution(sessionId, toolCallId,
|
|
361
|
+
async function interruptLoopExecution(sessionId, toolCallId, _toolName, _loopResult, tracker, context) {
|
|
362
|
+
// Cancel upstream execution so the model stops repeating the tool
|
|
171
363
|
await context
|
|
172
364
|
.writeToChild({
|
|
173
365
|
jsonrpc: "2.0",
|
|
@@ -175,6 +367,7 @@ async function interruptLoopExecution(sessionId, toolCallId, toolName, loopResul
|
|
|
175
367
|
params: { sessionId },
|
|
176
368
|
})
|
|
177
369
|
.catch(() => { });
|
|
370
|
+
// Mark the pending tool call as completed in the client UI so it doesn't spin
|
|
178
371
|
context.forwardInbound?.({
|
|
179
372
|
jsonrpc: "2.0",
|
|
180
373
|
method: ACP_METHODS.SESSION_UPDATE,
|
|
@@ -187,42 +380,88 @@ async function interruptLoopExecution(sessionId, toolCallId, toolName, loopResul
|
|
|
187
380
|
},
|
|
188
381
|
},
|
|
189
382
|
});
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
383
|
+
// Mark that this session should receive automated steering when upstream finishes cancellation
|
|
384
|
+
tracker.setSteerPending(sessionId, true);
|
|
385
|
+
}
|
|
386
|
+
function handleSteerPromptCompletion(msg, sessionId, tracker) {
|
|
387
|
+
const promptId = msg.id;
|
|
388
|
+
const steerPromptId = tracker.getSteerPromptId(sessionId);
|
|
389
|
+
if (steerPromptId !== undefined && promptId === steerPromptId) {
|
|
390
|
+
const originalPromptId = tracker.getActivePromptId(sessionId);
|
|
391
|
+
tracker.clearSteerPrompt(sessionId);
|
|
392
|
+
return [{ ...msg, id: originalPromptId ?? null }];
|
|
393
|
+
}
|
|
394
|
+
return null;
|
|
395
|
+
}
|
|
396
|
+
export function buildSteeringText(toolName, targetResource, repetitions, steerCount) {
|
|
397
|
+
if (steerCount > 0) {
|
|
398
|
+
return (`[Automated Steering]: You are still repeatedly executing '${toolName}'. Repetition is halted. ` +
|
|
399
|
+
`Summarize what you have accomplished so far, explain what is blocking you or what you found, and report your status to the user immediately.`);
|
|
400
|
+
}
|
|
401
|
+
if (READ_ONLY_TOOLS.has(toolName)) {
|
|
402
|
+
const targetDesc = targetResource ? ` on '${targetResource}'` : "";
|
|
403
|
+
return (`[Automated Steering]: You have repeatedly executed '${toolName}'${targetDesc} without making progress. ` +
|
|
404
|
+
`Do not re-read or inspect this file again. You already have the code context you need. ` +
|
|
405
|
+
`Analyze your findings, decide on the required code modifications or commands, and proceed immediately with making changes to bring the task to completion.`);
|
|
406
|
+
}
|
|
407
|
+
return (`[Automated Steering]: You have repeatedly executed '${toolName}' (${repetitions} times) without progress. ` +
|
|
408
|
+
`Stop repeating this action. Evaluate your current results, decide on the required next steps or changes, and proceed immediately to complete the user's task.`);
|
|
409
|
+
}
|
|
410
|
+
async function dispatchSteeringPrompt(sessionId, tracker, context) {
|
|
411
|
+
tracker.setSteerPending(sessionId, false);
|
|
412
|
+
const currentSteerCount = tracker.getSteerCount(sessionId);
|
|
413
|
+
tracker.incrementSteerCount(sessionId);
|
|
414
|
+
tracker.resetSignaturesForSteering(sessionId);
|
|
415
|
+
const toolName = tracker.getLastToolName(sessionId) ?? "tool";
|
|
416
|
+
const targetResource = tracker.getLastTargetResource(sessionId);
|
|
417
|
+
const loopResult = tracker.getLastLoopResult(sessionId);
|
|
418
|
+
const repetitions = loopResult?.repetitions ?? 3;
|
|
419
|
+
const steeringText = buildSteeringText(toolName, targetResource, repetitions, currentSteerCount);
|
|
420
|
+
const newSteerPromptId = `steer_${sessionId}_${Date.now()}`;
|
|
421
|
+
tracker.setSteerPromptId(sessionId, newSteerPromptId);
|
|
422
|
+
try {
|
|
423
|
+
await context.writeToChild({
|
|
424
|
+
jsonrpc: "2.0",
|
|
425
|
+
id: newSteerPromptId,
|
|
426
|
+
method: ACP_METHODS.SESSION_PROMPT,
|
|
427
|
+
params: {
|
|
428
|
+
sessionId,
|
|
429
|
+
prompt: [{ type: "text", text: steeringText }],
|
|
204
430
|
},
|
|
205
|
-
}
|
|
206
|
-
|
|
431
|
+
});
|
|
432
|
+
return true;
|
|
433
|
+
}
|
|
434
|
+
catch (err) {
|
|
435
|
+
console.error(`[refined-antigravity-acp] Failed to send automated steering prompt:`, err);
|
|
436
|
+
return false;
|
|
437
|
+
}
|
|
207
438
|
}
|
|
208
|
-
function
|
|
209
|
-
if (!("result" in msg)
|
|
439
|
+
function extractCancelledResult(msg, sessionId, tracker) {
|
|
440
|
+
if (!tracker.isLoopInterrupted(sessionId) || !("result" in msg))
|
|
210
441
|
return null;
|
|
211
|
-
}
|
|
212
442
|
const res = msg.result;
|
|
213
|
-
if (
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
443
|
+
if (!res)
|
|
444
|
+
return null;
|
|
445
|
+
if (res.stopReason && res.stopReason !== STOP_REASONS.CANCELLED)
|
|
446
|
+
return null;
|
|
447
|
+
return res;
|
|
448
|
+
}
|
|
449
|
+
async function settleInterruptedPromptResponse(msg, sessionId, tracker, context, options) {
|
|
450
|
+
if (!("result" in msg))
|
|
451
|
+
return null;
|
|
452
|
+
const maxSteers = options.maxSteersPerTurn ?? 2;
|
|
453
|
+
const canSteer = tracker.isSteerPending(sessionId) && tracker.getSteerCount(sessionId) < maxSteers;
|
|
454
|
+
if (canSteer && (await dispatchSteeringPrompt(sessionId, tracker, context))) {
|
|
455
|
+
return [];
|
|
224
456
|
}
|
|
225
|
-
|
|
457
|
+
const steerResult = handleSteerPromptCompletion(msg, sessionId, tracker);
|
|
458
|
+
if (steerResult)
|
|
459
|
+
return steerResult;
|
|
460
|
+
const res = extractCancelledResult(msg, sessionId, tracker);
|
|
461
|
+
if (!res)
|
|
462
|
+
return null;
|
|
463
|
+
tracker.startTurn(sessionId);
|
|
464
|
+
return [{ ...msg, result: { ...res, stopReason: STOP_REASONS.END_TURN } }];
|
|
226
465
|
}
|
|
227
466
|
function resolveSessionId(msg, tracker) {
|
|
228
467
|
const fromMsg = extractSessionId(msg);
|
|
@@ -240,7 +479,7 @@ async function handleInboundSessionUpdate(msg, sessionId, tracker, options, cont
|
|
|
240
479
|
const toolName = inferToolNameFromUpdate(update.title, update.kind, update.rawInput);
|
|
241
480
|
const loopResult = tracker.recordToolCall(sessionId, toolName, update.rawInput, options);
|
|
242
481
|
if (loopResult.isLoop) {
|
|
243
|
-
await interruptLoopExecution(sessionId, toolCallId, toolName, loopResult, context);
|
|
482
|
+
await interruptLoopExecution(sessionId, toolCallId, toolName, loopResult, tracker, context);
|
|
244
483
|
return [];
|
|
245
484
|
}
|
|
246
485
|
return null;
|
|
@@ -249,14 +488,18 @@ export function createRepetitiveToolLoopFix(options = {}) {
|
|
|
249
488
|
const tracker = new RepetitiveToolLoopTracker();
|
|
250
489
|
return {
|
|
251
490
|
name: "repetitive-tool-loop",
|
|
252
|
-
description: "Detects and
|
|
491
|
+
description: "Detects and steers repetitive tool calling cycles and autoregressive attractor loops without breaking polling",
|
|
253
492
|
onOutbound(msg, _context) {
|
|
254
493
|
const sessionId = extractSessionId(msg);
|
|
255
494
|
if (!sessionId)
|
|
256
495
|
return msg;
|
|
257
496
|
if (isMethod(msg, ACP_METHODS.SESSION_PROMPT)) {
|
|
258
497
|
const promptId = msg.id;
|
|
259
|
-
|
|
498
|
+
const promptText = extractPromptText(msg);
|
|
499
|
+
tracker.startTurn(sessionId, promptId, promptText);
|
|
500
|
+
}
|
|
501
|
+
else if (isMethod(msg, ACP_METHODS.SESSION_CANCEL)) {
|
|
502
|
+
tracker.clearSteerPrompt(sessionId);
|
|
260
503
|
}
|
|
261
504
|
return msg;
|
|
262
505
|
},
|
|
@@ -264,7 +507,7 @@ export function createRepetitiveToolLoopFix(options = {}) {
|
|
|
264
507
|
const sessionId = resolveSessionId(msg, tracker);
|
|
265
508
|
if (!sessionId)
|
|
266
509
|
return [msg];
|
|
267
|
-
const settled = settleInterruptedPromptResponse(msg, sessionId, tracker);
|
|
510
|
+
const settled = await settleInterruptedPromptResponse(msg, sessionId, tracker, context, options);
|
|
268
511
|
if (settled)
|
|
269
512
|
return settled;
|
|
270
513
|
if (isMethod(msg, ACP_METHODS.SESSION_UPDATE)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/repetitive-tool-loop/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/repetitive-tool-loop/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -159,8 +159,8 @@ The matrix below documents upstream defects across process startup, turn executi
|
|
|
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
|
-
| [**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#
|
|
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
|
|
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#L88) | Injects system prompt steering and intercepts empty prompt turn completions to autonomously dispatch self-healing continuation directives without proxy text synthesis.<br>🔗 [`solution: self-healing continuation`](src/fixes/premature-turn-stop/index.test.ts#L131) |
|
|
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 and resource paths per turn using suffix cycle matching, sending `session/cancel` upstream, auto-completing tools, and steering the model to proceed e2e without polluting chat.<br>🔗 [`solution: loop circuit breaker`](src/fixes/repetitive-tool-loop/index.e2e.test.ts#L81) |
|
|
164
164
|
|
|
165
165
|
## Setup
|
|
166
166
|
|