@simonepri/refined-antigravity-acp 0.2.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/dist/bin/cli.js +2 -51
  2. package/dist/bin/cli.js.map +1 -1
  3. package/dist/src/cli.d.ts +2 -0
  4. package/dist/src/cli.d.ts.map +1 -0
  5. package/dist/src/cli.js +44 -0
  6. package/dist/src/cli.js.map +1 -0
  7. package/dist/src/{command.d.ts → core/command.d.ts} +4 -0
  8. package/dist/src/core/command.d.ts.map +1 -0
  9. package/dist/src/{command.js → core/command.js} +27 -11
  10. package/dist/src/core/command.js.map +1 -0
  11. package/dist/src/core/pipeline.d.ts +20 -0
  12. package/dist/src/core/pipeline.d.ts.map +1 -0
  13. package/dist/src/core/pipeline.js +94 -0
  14. package/dist/src/core/pipeline.js.map +1 -0
  15. package/dist/src/core/session-cache.d.ts +12 -0
  16. package/dist/src/core/session-cache.d.ts.map +1 -0
  17. package/dist/src/core/session-cache.js +85 -0
  18. package/dist/src/core/session-cache.js.map +1 -0
  19. package/dist/src/core/supervisor.d.ts +90 -0
  20. package/dist/src/core/supervisor.d.ts.map +1 -0
  21. package/dist/src/core/supervisor.js +582 -0
  22. package/dist/src/core/supervisor.js.map +1 -0
  23. package/dist/src/core/telemetry.d.ts +23 -0
  24. package/dist/src/core/telemetry.d.ts.map +1 -0
  25. package/dist/src/core/telemetry.js +75 -0
  26. package/dist/src/core/telemetry.js.map +1 -0
  27. package/dist/src/core/transport.d.ts +7 -0
  28. package/dist/src/core/transport.d.ts.map +1 -0
  29. package/dist/src/core/transport.js +37 -0
  30. package/dist/src/core/transport.js.map +1 -0
  31. package/dist/src/core/types.d.ts +293 -0
  32. package/dist/src/core/types.d.ts.map +1 -0
  33. package/dist/src/core/types.js +78 -0
  34. package/dist/src/core/types.js.map +1 -0
  35. package/dist/src/fixes/active-turn-collision/index.d.ts +27 -0
  36. package/dist/src/fixes/active-turn-collision/index.d.ts.map +1 -0
  37. package/dist/src/fixes/active-turn-collision/index.js +117 -0
  38. package/dist/src/fixes/active-turn-collision/index.js.map +1 -0
  39. package/dist/src/fixes/cancellation-leak/index.d.ts +17 -0
  40. package/dist/src/fixes/cancellation-leak/index.d.ts.map +1 -0
  41. package/dist/src/fixes/cancellation-leak/index.js +57 -0
  42. package/dist/src/fixes/cancellation-leak/index.js.map +1 -0
  43. package/dist/src/fixes/dangling-tool-calls/index.d.ts +32 -0
  44. package/dist/src/fixes/dangling-tool-calls/index.d.ts.map +1 -0
  45. package/dist/src/fixes/dangling-tool-calls/index.js +188 -0
  46. package/dist/src/fixes/dangling-tool-calls/index.js.map +1 -0
  47. package/dist/src/fixes/dropped-history-chunks/index.d.ts +47 -0
  48. package/dist/src/fixes/dropped-history-chunks/index.d.ts.map +1 -0
  49. package/dist/src/fixes/dropped-history-chunks/index.js +202 -0
  50. package/dist/src/fixes/dropped-history-chunks/index.js.map +1 -0
  51. package/dist/src/fixes/flattened-model-efforts/index.d.ts +39 -0
  52. package/dist/src/fixes/flattened-model-efforts/index.d.ts.map +1 -0
  53. package/dist/src/fixes/flattened-model-efforts/index.js +306 -0
  54. package/dist/src/fixes/flattened-model-efforts/index.js.map +1 -0
  55. package/dist/src/fixes/index.d.ts +25 -0
  56. package/dist/src/fixes/index.d.ts.map +1 -0
  57. package/dist/src/fixes/index.js +61 -0
  58. package/dist/src/fixes/index.js.map +1 -0
  59. package/dist/src/fixes/malformed-stream-syntax/index.d.ts +44 -0
  60. package/dist/src/fixes/malformed-stream-syntax/index.d.ts.map +1 -0
  61. package/dist/src/fixes/malformed-stream-syntax/index.js +346 -0
  62. package/dist/src/fixes/malformed-stream-syntax/index.js.map +1 -0
  63. package/dist/src/fixes/missing-localharness/index.d.ts +20 -0
  64. package/dist/src/fixes/missing-localharness/index.d.ts.map +1 -0
  65. package/dist/src/fixes/missing-localharness/index.js +103 -0
  66. package/dist/src/fixes/missing-localharness/index.js.map +1 -0
  67. package/dist/src/fixes/missing-question-fallback/index.d.ts +30 -0
  68. package/dist/src/fixes/missing-question-fallback/index.d.ts.map +1 -0
  69. package/dist/src/fixes/missing-question-fallback/index.js +119 -0
  70. package/dist/src/fixes/missing-question-fallback/index.js.map +1 -0
  71. package/dist/src/fixes/missing-slash-skills/index.d.ts +17 -0
  72. package/dist/src/fixes/missing-slash-skills/index.d.ts.map +1 -0
  73. package/dist/src/fixes/missing-slash-skills/index.js +107 -0
  74. package/dist/src/fixes/missing-slash-skills/index.js.map +1 -0
  75. package/dist/src/{skills.d.ts → fixes/missing-slash-skills/skills.d.ts} +2 -1
  76. package/dist/src/fixes/missing-slash-skills/skills.d.ts.map +1 -0
  77. package/dist/src/fixes/missing-slash-skills/skills.js +199 -0
  78. package/dist/src/fixes/missing-slash-skills/skills.js.map +1 -0
  79. package/dist/src/fixes/missing-system-prompt/index.d.ts +19 -0
  80. package/dist/src/fixes/missing-system-prompt/index.d.ts.map +1 -0
  81. package/dist/src/fixes/missing-system-prompt/index.js +118 -0
  82. package/dist/src/fixes/missing-system-prompt/index.js.map +1 -0
  83. package/dist/src/fixes/missing-usage-metrics/index.d.ts +26 -0
  84. package/dist/src/fixes/missing-usage-metrics/index.d.ts.map +1 -0
  85. package/dist/src/fixes/missing-usage-metrics/index.js +132 -0
  86. package/dist/src/fixes/missing-usage-metrics/index.js.map +1 -0
  87. package/dist/src/fixes/noisy-stderr-logs/index.d.ts +15 -0
  88. package/dist/src/fixes/noisy-stderr-logs/index.d.ts.map +1 -0
  89. package/dist/src/fixes/noisy-stderr-logs/index.js +23 -0
  90. package/dist/src/fixes/noisy-stderr-logs/index.js.map +1 -0
  91. package/dist/src/fixes/non-canonical-mode-ids/index.d.ts +26 -0
  92. package/dist/src/fixes/non-canonical-mode-ids/index.d.ts.map +1 -0
  93. package/dist/src/fixes/non-canonical-mode-ids/index.js +47 -0
  94. package/dist/src/fixes/non-canonical-mode-ids/index.js.map +1 -0
  95. package/dist/src/fixes/orphaned-checkpoints/index.d.ts +31 -0
  96. package/dist/src/fixes/orphaned-checkpoints/index.d.ts.map +1 -0
  97. package/dist/src/fixes/orphaned-checkpoints/index.js +82 -0
  98. package/dist/src/fixes/orphaned-checkpoints/index.js.map +1 -0
  99. package/dist/src/fixes/silent-background-tasks/index.d.ts +66 -0
  100. package/dist/src/fixes/silent-background-tasks/index.d.ts.map +1 -0
  101. package/dist/src/fixes/silent-background-tasks/index.js +491 -0
  102. package/dist/src/fixes/silent-background-tasks/index.js.map +1 -0
  103. package/dist/src/{mcp-proxy.d.ts → fixes/stale-mcp-endpoints/index.d.ts} +31 -4
  104. package/dist/src/fixes/stale-mcp-endpoints/index.d.ts.map +1 -0
  105. package/dist/src/{mcp-proxy.js → fixes/stale-mcp-endpoints/index.js} +162 -14
  106. package/dist/src/fixes/stale-mcp-endpoints/index.js.map +1 -0
  107. package/dist/src/fixes/subagent-hang/index.d.ts +2 -0
  108. package/dist/src/fixes/subagent-hang/index.d.ts.map +1 -0
  109. package/dist/src/fixes/subagent-hang/index.js +2 -0
  110. package/dist/src/fixes/subagent-hang/index.js.map +1 -0
  111. package/dist/src/fixes/subagent-hang/subagent-hang.d.ts +43 -0
  112. package/dist/src/fixes/subagent-hang/subagent-hang.d.ts.map +1 -0
  113. package/dist/src/fixes/subagent-hang/subagent-hang.js +114 -0
  114. package/dist/src/fixes/subagent-hang/subagent-hang.js.map +1 -0
  115. package/dist/src/index.d.ts +27 -0
  116. package/dist/src/index.d.ts.map +1 -0
  117. package/dist/src/index.js +43 -0
  118. package/dist/src/index.js.map +1 -0
  119. package/dist/src/lib/protobuf.d.ts +9 -0
  120. package/dist/src/lib/protobuf.d.ts.map +1 -0
  121. package/dist/src/lib/protobuf.js +89 -0
  122. package/dist/src/lib/protobuf.js.map +1 -0
  123. package/package.json +40 -7
  124. package/readme.md +150 -141
  125. package/assets/icon.svg +0 -3
  126. package/build/paseo/assets/icon.svg +0 -3
  127. package/build/paseo/assets/logo.svg +0 -62
  128. package/build/paseo/index.server.ts +0 -9
  129. package/build/paseo/paseo-plugin.json +0 -7
  130. package/build/paseo/server/agy-patch.ts +0 -445
  131. package/build/paseo/server/auth.ts +0 -122
  132. package/build/paseo/server/command.ts +0 -92
  133. package/build/paseo/server/connector.ts +0 -1371
  134. package/build/paseo/server/history.ts +0 -157
  135. package/build/paseo/server/mcp-proxy.ts +0 -375
  136. package/build/paseo/server/provider.ts +0 -37
  137. package/build/paseo/server/sanitize.ts +0 -286
  138. package/build/paseo/server/skills.ts +0 -183
  139. package/build/paseo/server/steering.ts +0 -199
  140. package/dist/index.server.d.ts +0 -4
  141. package/dist/index.server.d.ts.map +0 -1
  142. package/dist/index.server.js +0 -7
  143. package/dist/index.server.js.map +0 -1
  144. package/dist/src/agy-patch.d.ts +0 -65
  145. package/dist/src/agy-patch.d.ts.map +0 -1
  146. package/dist/src/agy-patch.js +0 -351
  147. package/dist/src/agy-patch.js.map +0 -1
  148. package/dist/src/auth.d.ts +0 -27
  149. package/dist/src/auth.d.ts.map +0 -1
  150. package/dist/src/auth.js +0 -113
  151. package/dist/src/auth.js.map +0 -1
  152. package/dist/src/command.d.ts.map +0 -1
  153. package/dist/src/command.js.map +0 -1
  154. package/dist/src/connector.d.ts +0 -187
  155. package/dist/src/connector.d.ts.map +0 -1
  156. package/dist/src/connector.js +0 -1127
  157. package/dist/src/connector.js.map +0 -1
  158. package/dist/src/history.d.ts +0 -12
  159. package/dist/src/history.d.ts.map +0 -1
  160. package/dist/src/history.js +0 -152
  161. package/dist/src/history.js.map +0 -1
  162. package/dist/src/mcp-proxy.d.ts.map +0 -1
  163. package/dist/src/mcp-proxy.js.map +0 -1
  164. package/dist/src/provider.d.ts +0 -11
  165. package/dist/src/provider.d.ts.map +0 -1
  166. package/dist/src/provider.js +0 -31
  167. package/dist/src/provider.js.map +0 -1
  168. package/dist/src/sanitize.d.ts +0 -29
  169. package/dist/src/sanitize.d.ts.map +0 -1
  170. package/dist/src/sanitize.js +0 -237
  171. package/dist/src/sanitize.js.map +0 -1
  172. package/dist/src/skills.d.ts.map +0 -1
  173. package/dist/src/skills.js +0 -140
  174. package/dist/src/skills.js.map +0 -1
  175. package/dist/src/steering.d.ts +0 -30
  176. package/dist/src/steering.d.ts.map +0 -1
  177. package/dist/src/steering.js +0 -174
  178. package/dist/src/steering.js.map +0 -1
  179. package/paseo-plugin.json +0 -8
  180. package/scripts/build-paseo.js +0 -60
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Problem:
3
+ * Sending a prompt request while an upstream agent turn is in progress (e.g. executing tool calls)
4
+ * is rejected with a fatal error: `"A foreground turn is already active"`.
5
+ *
6
+ * Solution:
7
+ * Queues in-flight user steering directives, classifies mid-turn inputs, and retries
8
+ * rejected prompt requests once the active turn transitions to idle.
9
+ */
10
+ import { ACP_METHODS, isJsonRpcRequest, } from "../../core/types.js";
11
+ import { repairOrphanedCheckpoints, DONE_CH_PANIC_MARKER } from "../orphaned-checkpoints/index.js";
12
+ import { extractSessionId, getSession, getOrCreateSession, trackPendingRequestSession, } from "../../core/session-cache.js";
13
+ export function stripSteeringPrefix(text) {
14
+ return text
15
+ .replace(/(?:^|\n)\s*\[Mid-turn update\]:\s*/gi, "")
16
+ .replace(/(?:\n*\(Important: [^)]+\)\.?)/gi, "");
17
+ }
18
+ export const FOREGROUND_TURN_ERROR_PATTERN = /foreground turn is already active/i;
19
+ export const DONE_CH_ERROR_PATTERN = new RegExp(DONE_CH_PANIC_MARKER, "i");
20
+ export const MAX_PROMPT_RETRIES = 5;
21
+ export const DEFAULT_PROMPT_RETRY_DELAY_MS = 500;
22
+ function parsePromptError(msg) {
23
+ if (!("error" in msg) || !msg.error || typeof msg.error.message !== "string")
24
+ return null;
25
+ const text = msg.error.message;
26
+ if (DONE_CH_ERROR_PATTERN.test(text))
27
+ return { isDoneCh: true };
28
+ if (FOREGROUND_TURN_ERROR_PATTERN.test(text))
29
+ return { isDoneCh: false };
30
+ return null;
31
+ }
32
+ async function handleDoneChRecovery(pendingMsg, context) {
33
+ const targetSessionId = extractSessionId(pendingMsg);
34
+ if (!targetSessionId)
35
+ return;
36
+ repairOrphanedCheckpoints(targetSessionId);
37
+ const session = getOrCreateSession(context.sessionCache, targetSessionId);
38
+ session.needsRecycle = true;
39
+ await context.triggerRecycle(session);
40
+ }
41
+ function schedulePromptRetry(msgId, pending, delayMs, context) {
42
+ const retryTimer = setTimeout(async () => {
43
+ try {
44
+ const sessionId = extractSessionId(pending.msg);
45
+ const session = getSession(context.sessionCache, sessionId);
46
+ if (session?.needsRecycle) {
47
+ await context.triggerRecycle(session);
48
+ }
49
+ if (sessionId &&
50
+ "id" in pending.msg &&
51
+ pending.msg.id !== undefined &&
52
+ pending.msg.id !== null) {
53
+ trackPendingRequestSession(context.sessionCache, pending.msg.id, sessionId);
54
+ }
55
+ await context.writeToChild(pending.msg);
56
+ }
57
+ catch (err) {
58
+ console.error(`[refined-antigravity-acp] Failed to resend prompt ${msgId}:`, err);
59
+ }
60
+ }, delayMs);
61
+ retryTimer.unref?.();
62
+ }
63
+ export const USER_STEERING_INSTRUCTIONS = [
64
+ "When receiving a mid-turn update, question, or redirection, acknowledge and address it directly in your response before proceeding or stopping.",
65
+ ];
66
+ export function createActiveTurnCollisionFix(options) {
67
+ const pendingPromptRetries = new Map();
68
+ const delayMs = options?.delayMs ?? DEFAULT_PROMPT_RETRY_DELAY_MS;
69
+ const maxRetries = options?.maxRetries ?? MAX_PROMPT_RETRIES;
70
+ return {
71
+ name: "active-turn-collision",
72
+ description: "Handles mid-turn steering and retries prompts rejected due to active foreground turns",
73
+ getSystemInstructions() {
74
+ return USER_STEERING_INSTRUCTIONS;
75
+ },
76
+ onOutbound: (msg) => {
77
+ if (isJsonRpcRequest(msg) && msg.method === ACP_METHODS.SESSION_PROMPT) {
78
+ pendingPromptRetries.set(msg.id, {
79
+ msg: structuredClone(msg),
80
+ attempts: 0,
81
+ });
82
+ }
83
+ return msg;
84
+ },
85
+ onInbound: async (msg, context) => {
86
+ if (!("id" in msg) || msg.id === null || msg.id === undefined)
87
+ return [msg];
88
+ const pending = pendingPromptRetries.get(msg.id);
89
+ if (!pending)
90
+ return [msg];
91
+ const parsed = parsePromptError(msg);
92
+ if (!parsed) {
93
+ pendingPromptRetries.delete(msg.id);
94
+ return [msg];
95
+ }
96
+ if (parsed.isDoneCh) {
97
+ await handleDoneChRecovery(pending.msg, context);
98
+ }
99
+ if (pending.attempts >= maxRetries) {
100
+ pendingPromptRetries.delete(msg.id);
101
+ return [msg];
102
+ }
103
+ pending.attempts += 1;
104
+ schedulePromptRetry(msg.id, pending, parsed.isDoneCh ? 0 : delayMs, context);
105
+ return [];
106
+ },
107
+ dispose: () => {
108
+ pendingPromptRetries.clear();
109
+ },
110
+ };
111
+ }
112
+ export const activeTurnCollisionFix = createActiveTurnCollisionFix();
113
+ export const createUserSteeringFix = createActiveTurnCollisionFix;
114
+ export const userSteeringFix = activeTurnCollisionFix;
115
+ export const createPromptRetryFix = createActiveTurnCollisionFix;
116
+ export const promptRetryFix = activeTurnCollisionFix;
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/active-turn-collision/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Problem:
3
+ * When a user cancels an in-flight turn via `session/cancel`, upstream `agy_acp_server`
4
+ * leaks internal Go/Python cancellation error strings (`"context canceledThe request was cancelled by the client."`)
5
+ * directly into assistant message stream chunks before terminating the turn.
6
+ *
7
+ * Solution:
8
+ * Intercepts inbound `session/update` chunks matching upstream cancellation error strings
9
+ * and silently drops them, ensuring the editor message feed remains clean.
10
+ */
11
+ import { type AcpFix, type AcpStreamMessage } from "../../core/types.js";
12
+ export declare const CANCELLATION_ERROR_REGEX: RegExp;
13
+ export declare function isCancellationText(text: string): boolean;
14
+ export declare function extractMessageChunkText(msg: AcpStreamMessage): string | null;
15
+ export declare const cancellationLeakFix: AcpFix;
16
+ export declare const interruptionCleanupFix: AcpFix;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/cancellation-leak/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,gBAAgB,EAEtB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,wBAAwB,QACkD,CAAC;AAExF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQxD;AAiBD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAK5E;AAED,eAAO,MAAM,mBAAmB,EAAE,MAYjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAAsB,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Problem:
3
+ * When a user cancels an in-flight turn via `session/cancel`, upstream `agy_acp_server`
4
+ * leaks internal Go/Python cancellation error strings (`"context canceledThe request was cancelled by the client."`)
5
+ * directly into assistant message stream chunks before terminating the turn.
6
+ *
7
+ * Solution:
8
+ * Intercepts inbound `session/update` chunks matching upstream cancellation error strings
9
+ * and silently drops them, ensuring the editor message feed remains clean.
10
+ */
11
+ import { ACP_METHODS, SESSION_UPDATES, isMethod, } from "../../core/types.js";
12
+ export const CANCELLATION_ERROR_REGEX = /^(?:context\s+canceled)?\s*The\s+request\s+was\s+cancelled\s+by\s+the\s+client\.?$/i;
13
+ export function isCancellationText(text) {
14
+ const trimmed = text.trim();
15
+ if (!trimmed)
16
+ return false;
17
+ return (trimmed === "context canceled" ||
18
+ trimmed === "The request was cancelled by the client." ||
19
+ CANCELLATION_ERROR_REGEX.test(trimmed));
20
+ }
21
+ function extractContentText(content) {
22
+ if (Array.isArray(content)) {
23
+ let result = "";
24
+ for (const b of content) {
25
+ if (typeof b?.text === "string")
26
+ result += b.text;
27
+ }
28
+ return result.length > 0 ? result : null;
29
+ }
30
+ if (content && typeof content === "object" && "text" in content) {
31
+ const text = content.text;
32
+ if (typeof text === "string")
33
+ return text;
34
+ }
35
+ return null;
36
+ }
37
+ export function extractMessageChunkText(msg) {
38
+ if (!isMethod(msg, ACP_METHODS.SESSION_UPDATE))
39
+ return null;
40
+ const update = msg.params?.update;
41
+ if (update?.sessionUpdate !== SESSION_UPDATES.AGENT_MESSAGE_CHUNK || !update.content)
42
+ return null;
43
+ return extractContentText(update.content);
44
+ }
45
+ export const cancellationLeakFix = {
46
+ name: "cancellation-leak",
47
+ description: "Suppresses raw upstream Go/Python cancellation error chunks during client interruptions",
48
+ onInbound(msg) {
49
+ const text = extractMessageChunkText(msg);
50
+ if (text && isCancellationText(text)) {
51
+ return [];
52
+ }
53
+ return [msg];
54
+ },
55
+ };
56
+ export const interruptionCleanupFix = cancellationLeakFix;
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/cancellation-leak/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,WAAW,EACX,eAAe,EACf,QAAQ,GAIT,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,wBAAwB,GACnC,qFAAqF,CAAC;AAExF,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,CACvC,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;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAW;IACzC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,yFAAyF;IAE3F,SAAS,CAAC,GAAqB;QAC7B,MAAM,IAAI,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Problem:
3
+ * When tool execution is backgrounded or turns complete without an explicit terminal tool update,
4
+ * upstream `agy_acp_server` never emits a `tool_call_update` with `status: "completed"`,
5
+ * causing editor client interfaces to display an infinite active running spinner.
6
+ *
7
+ * Solution:
8
+ * Tracks active in-flight tool calls, auto-completing backgrounded commands and flushing any
9
+ * remaining dangling tool calls immediately upon assistant text streaming or turn completion.
10
+ */
11
+ import { type AcpFix, type AcpStreamMessage } from "../../core/types.js";
12
+ export declare class ToolCallTracker {
13
+ private readonly activeToolCalls;
14
+ recordToolCall(sessionId: string, toolCallId: string): void;
15
+ resolveToolCall(sessionId: string, toolCallId: string): void;
16
+ hasActiveToolCalls(sessionId: string): boolean;
17
+ getActiveToolCalls(sessionId: string): string[];
18
+ clearSession(sessionId: string): void;
19
+ flushDangling(sessionId: string, exceptToolCallId?: string): AcpStreamMessage[];
20
+ dispose(): void;
21
+ }
22
+ export declare function createDanglingToolCallsFix(): AcpFix & {
23
+ tracker: ToolCallTracker;
24
+ };
25
+ export declare const danglingToolCallsFix: AcpFix & {
26
+ tracker: ToolCallTracker;
27
+ };
28
+ export declare const createToolCallCleanupFix: typeof createDanglingToolCallsFix;
29
+ export declare const toolCallCleanupFix: AcpFix & {
30
+ tracker: ToolCallTracker;
31
+ };
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/dangling-tool-calls/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,gBAAgB,EAKtB,MAAM,qBAAqB,CAAC;AAgC7B,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkC;IAElE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAS3D,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAU5D,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAK9C,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAK/C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAoB/E,OAAO,IAAI,IAAI;CAGhB;AAsFD,wBAAgB,0BAA0B,IAAI,MAAM,GAAG;IAAE,OAAO,EAAE,eAAe,CAAA;CAAE,CA6BlF;AAED,eAAO,MAAM,oBAAoB;aA/BiC,eAAe;CA+BjB,CAAC;AACjE,eAAO,MAAM,wBAAwB,mCAA6B,CAAC;AACnE,eAAO,MAAM,kBAAkB;aAjCmC,eAAe;CAiC3B,CAAC"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Problem:
3
+ * When tool execution is backgrounded or turns complete without an explicit terminal tool update,
4
+ * upstream `agy_acp_server` never emits a `tool_call_update` with `status: "completed"`,
5
+ * causing editor client interfaces to display an infinite active running spinner.
6
+ *
7
+ * Solution:
8
+ * Tracks active in-flight tool calls, auto-completing backgrounded commands and flushing any
9
+ * remaining dangling tool calls immediately upon assistant text streaming or turn completion.
10
+ */
11
+ import { ACP_METHODS, SESSION_UPDATES, isMethod, } from "../../core/types.js";
12
+ import { extractSessionId } from "../../core/session-cache.js";
13
+ function isBackgroundedOutput(output) {
14
+ if (typeof output === "string") {
15
+ return output.includes("is running as a background task");
16
+ }
17
+ if (output && typeof output === "object") {
18
+ try {
19
+ return JSON.stringify(output).includes("is running as a background task");
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ return false;
26
+ }
27
+ function createToolCompletionMessage(sessionId, toolCallId) {
28
+ return {
29
+ jsonrpc: "2.0",
30
+ method: ACP_METHODS.SESSION_UPDATE,
31
+ params: {
32
+ sessionId,
33
+ update: {
34
+ sessionUpdate: SESSION_UPDATES.TOOL_CALL_UPDATE,
35
+ toolCallId,
36
+ status: "completed",
37
+ },
38
+ },
39
+ };
40
+ }
41
+ export class ToolCallTracker {
42
+ activeToolCalls = new Map();
43
+ recordToolCall(sessionId, toolCallId) {
44
+ let set = this.activeToolCalls.get(sessionId);
45
+ if (!set) {
46
+ set = new Set();
47
+ this.activeToolCalls.set(sessionId, set);
48
+ }
49
+ set.add(toolCallId);
50
+ }
51
+ resolveToolCall(sessionId, toolCallId) {
52
+ const set = this.activeToolCalls.get(sessionId);
53
+ if (set) {
54
+ set.delete(toolCallId);
55
+ if (set.size === 0) {
56
+ this.activeToolCalls.delete(sessionId);
57
+ }
58
+ }
59
+ }
60
+ hasActiveToolCalls(sessionId) {
61
+ const set = this.activeToolCalls.get(sessionId);
62
+ return (set?.size ?? 0) > 0;
63
+ }
64
+ getActiveToolCalls(sessionId) {
65
+ const set = this.activeToolCalls.get(sessionId);
66
+ return set ? Array.from(set) : [];
67
+ }
68
+ clearSession(sessionId) {
69
+ this.activeToolCalls.delete(sessionId);
70
+ }
71
+ flushDangling(sessionId, exceptToolCallId) {
72
+ const set = this.activeToolCalls.get(sessionId);
73
+ if (!set || set.size === 0)
74
+ return [];
75
+ const messages = [];
76
+ for (const toolCallId of set) {
77
+ if (exceptToolCallId && toolCallId === exceptToolCallId)
78
+ continue;
79
+ messages.push(createToolCompletionMessage(sessionId, toolCallId));
80
+ }
81
+ if (exceptToolCallId && set.has(exceptToolCallId)) {
82
+ set.clear();
83
+ set.add(exceptToolCallId);
84
+ }
85
+ else {
86
+ this.activeToolCalls.delete(sessionId);
87
+ }
88
+ return messages;
89
+ }
90
+ dispose() {
91
+ this.activeToolCalls.clear();
92
+ }
93
+ }
94
+ function handleToolCall(update, sessionId, tracker) {
95
+ const toolCallId = update.toolCallId;
96
+ const flushMessages = tracker.flushDangling(sessionId, toolCallId);
97
+ if (toolCallId) {
98
+ if (update.status === "completed" || update.status === "failed") {
99
+ tracker.resolveToolCall(sessionId, toolCallId);
100
+ }
101
+ else if (isBackgroundedOutput(update.rawOutput) || isBackgroundedOutput(update.content)) {
102
+ update.status = "completed";
103
+ tracker.resolveToolCall(sessionId, toolCallId);
104
+ }
105
+ else {
106
+ tracker.recordToolCall(sessionId, toolCallId);
107
+ }
108
+ }
109
+ return flushMessages;
110
+ }
111
+ function handleToolCallUpdate(update, sessionId, tracker) {
112
+ const toolCallId = update.toolCallId;
113
+ if (!toolCallId)
114
+ return;
115
+ if (update.status === "completed" || update.status === "failed") {
116
+ tracker.resolveToolCall(sessionId, toolCallId);
117
+ }
118
+ else if (isBackgroundedOutput(update.rawOutput) || isBackgroundedOutput(update.content)) {
119
+ update.status = "completed";
120
+ tracker.resolveToolCall(sessionId, toolCallId);
121
+ }
122
+ }
123
+ function handleMessageChunk(sessionId, tracker, msg) {
124
+ if (tracker.hasActiveToolCalls(sessionId)) {
125
+ const completions = tracker.flushDangling(sessionId);
126
+ return [...completions, msg];
127
+ }
128
+ return [msg];
129
+ }
130
+ function processInbound(msg, tracker) {
131
+ if (!isMethod(msg, ACP_METHODS.SESSION_UPDATE))
132
+ return [msg];
133
+ const sessionId = extractSessionId(msg);
134
+ if (!sessionId)
135
+ return [msg];
136
+ const update = msg.params?.update;
137
+ if (!update)
138
+ return [msg];
139
+ const kind = update.sessionUpdate;
140
+ if (kind === SESSION_UPDATES.TOOL_CALL) {
141
+ const flushMessages = handleToolCall(update, sessionId, tracker);
142
+ return [...flushMessages, msg];
143
+ }
144
+ if (kind === SESSION_UPDATES.TOOL_CALL_UPDATE) {
145
+ handleToolCallUpdate(update, sessionId, tracker);
146
+ return [msg];
147
+ }
148
+ if (kind === SESSION_UPDATES.AGENT_MESSAGE_CHUNK ||
149
+ kind === SESSION_UPDATES.AGENT_THOUGHT_CHUNK) {
150
+ return handleMessageChunk(sessionId, tracker, msg);
151
+ }
152
+ return [msg];
153
+ }
154
+ function processOutbound(msg, tracker) {
155
+ if (isMethod(msg, ACP_METHODS.SESSION_PROMPT) || isMethod(msg, ACP_METHODS.SESSION_CANCEL)) {
156
+ const sessionId = extractSessionId(msg);
157
+ if (sessionId)
158
+ tracker.clearSession(sessionId);
159
+ }
160
+ return msg;
161
+ }
162
+ export function createDanglingToolCallsFix() {
163
+ const tracker = new ToolCallTracker();
164
+ return {
165
+ name: "dangling-tool-calls",
166
+ description: "Auto-completes dangling and backgrounded tool calls on turn boundaries to stop infinite spinners",
167
+ tracker,
168
+ onOutbound(msg, _context) {
169
+ return processOutbound(msg, tracker);
170
+ },
171
+ onInbound(msg, _context) {
172
+ return processInbound(msg, tracker);
173
+ },
174
+ onTurnEnd(sessionId, _context) {
175
+ return tracker.flushDangling(sessionId);
176
+ },
177
+ onRecycle() {
178
+ tracker.dispose();
179
+ },
180
+ dispose() {
181
+ tracker.dispose();
182
+ },
183
+ };
184
+ }
185
+ export const danglingToolCallsFix = createDanglingToolCallsFix();
186
+ export const createToolCallCleanupFix = createDanglingToolCallsFix;
187
+ export const toolCallCleanupFix = danglingToolCallsFix;
188
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/dangling-tool-calls/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Problem:
3
+ * When reconnecting or reloading a session via `session/load`, upstream `agy_acp_server`
4
+ * drops thought chains, intermediate reasoning steps, and agent message chunks, loading an incomplete history.
5
+ *
6
+ * Solution:
7
+ * Reads raw protobuf-encoded conversation steps directly from the session's SQLite database,
8
+ * reconstructing thought and message update events for session replay.
9
+ */
10
+ import { SESSION_UPDATES, type AcpStreamMessage, type AcpFix } from "../../core/types.js";
11
+ import { STEP_TYPE_USER, STEP_TYPE_AGENT } from "../orphaned-checkpoints/index.js";
12
+ import { decodeVarint, getField } from "../../lib/protobuf.js";
13
+ export { decodeVarint, getField };
14
+ export declare function extractTimestamp(payload: Uint8Array): string | undefined;
15
+ export type ConversationStep = {
16
+ readonly kind: "user" | "assistant" | "thought";
17
+ readonly idx: number;
18
+ readonly text: string;
19
+ readonly timestamp?: string | undefined;
20
+ } | {
21
+ readonly kind: "tool_call";
22
+ readonly idx: number;
23
+ readonly callId: string;
24
+ readonly name: string;
25
+ readonly rawInputJson: string;
26
+ readonly timestamp?: string | undefined;
27
+ };
28
+ export { STEP_TYPE_USER, STEP_TYPE_AGENT };
29
+ export declare function utf8(bytes: Uint8Array | null): string;
30
+ export declare function decodeStep(stepType: number, payload: Uint8Array, idx: number, timestamp?: string): ConversationStep[];
31
+ export declare function conversationDbPath(sessionId: string, customDbPath?: string): string;
32
+ export declare function readConversationSteps(sessionId: string, customDbPath?: string): ConversationStep[];
33
+ export declare function deriveToolTitle(name: string, rawInputJson: string): string;
34
+ export declare function sessionUpdateMessage(sessionId: string, update: Record<string, unknown>): AcpStreamMessage;
35
+ export declare function textChunkUpdate(sessionId: string, sessionUpdate: typeof SESSION_UPDATES.USER_MESSAGE_CHUNK | typeof SESSION_UPDATES.AGENT_MESSAGE_CHUNK | typeof SESSION_UPDATES.AGENT_THOUGHT_CHUNK, text: string): AcpStreamMessage;
36
+ export declare function toolCallUpdates(sessionId: string, step: Extract<ConversationStep, {
37
+ kind: "tool_call";
38
+ }>): AcpStreamMessage[];
39
+ export declare function synthesizeStepUpdates(sessionId: string, step: ConversationStep): AcpStreamMessage[];
40
+ export declare function synthesizeReplayUpdates(sessionId: string, steps: readonly ConversationStep[]): AcpStreamMessage[];
41
+ export interface DroppedHistoryChunksFix extends AcpFix {
42
+ readConversationSteps?: (sessionId: string, customDbPath?: string) => ConversationStep[];
43
+ }
44
+ export declare const droppedHistoryChunksFix: DroppedHistoryChunksFix;
45
+ export type HistoryReconstructionFix = DroppedHistoryChunksFix;
46
+ export declare const historyReconstructionFix: DroppedHistoryChunksFix;
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/dropped-history-chunks/index.ts"],"names":[],"mappings":"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"}