@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.
- package/dist/bin/cli.js +2 -51
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +44 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/{command.d.ts → core/command.d.ts} +4 -0
- package/dist/src/core/command.d.ts.map +1 -0
- package/dist/src/{command.js → core/command.js} +27 -11
- package/dist/src/core/command.js.map +1 -0
- package/dist/src/core/pipeline.d.ts +20 -0
- package/dist/src/core/pipeline.d.ts.map +1 -0
- package/dist/src/core/pipeline.js +94 -0
- package/dist/src/core/pipeline.js.map +1 -0
- package/dist/src/core/session-cache.d.ts +12 -0
- package/dist/src/core/session-cache.d.ts.map +1 -0
- package/dist/src/core/session-cache.js +85 -0
- package/dist/src/core/session-cache.js.map +1 -0
- package/dist/src/core/supervisor.d.ts +90 -0
- package/dist/src/core/supervisor.d.ts.map +1 -0
- package/dist/src/core/supervisor.js +582 -0
- package/dist/src/core/supervisor.js.map +1 -0
- package/dist/src/core/telemetry.d.ts +23 -0
- package/dist/src/core/telemetry.d.ts.map +1 -0
- package/dist/src/core/telemetry.js +75 -0
- package/dist/src/core/telemetry.js.map +1 -0
- package/dist/src/core/transport.d.ts +7 -0
- package/dist/src/core/transport.d.ts.map +1 -0
- package/dist/src/core/transport.js +37 -0
- package/dist/src/core/transport.js.map +1 -0
- package/dist/src/core/types.d.ts +293 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +78 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/fixes/active-turn-collision/index.d.ts +27 -0
- package/dist/src/fixes/active-turn-collision/index.d.ts.map +1 -0
- package/dist/src/fixes/active-turn-collision/index.js +117 -0
- package/dist/src/fixes/active-turn-collision/index.js.map +1 -0
- package/dist/src/fixes/cancellation-leak/index.d.ts +17 -0
- package/dist/src/fixes/cancellation-leak/index.d.ts.map +1 -0
- package/dist/src/fixes/cancellation-leak/index.js +57 -0
- package/dist/src/fixes/cancellation-leak/index.js.map +1 -0
- package/dist/src/fixes/dangling-tool-calls/index.d.ts +32 -0
- package/dist/src/fixes/dangling-tool-calls/index.d.ts.map +1 -0
- package/dist/src/fixes/dangling-tool-calls/index.js +188 -0
- package/dist/src/fixes/dangling-tool-calls/index.js.map +1 -0
- package/dist/src/fixes/dropped-history-chunks/index.d.ts +47 -0
- package/dist/src/fixes/dropped-history-chunks/index.d.ts.map +1 -0
- package/dist/src/fixes/dropped-history-chunks/index.js +202 -0
- package/dist/src/fixes/dropped-history-chunks/index.js.map +1 -0
- package/dist/src/fixes/flattened-model-efforts/index.d.ts +39 -0
- package/dist/src/fixes/flattened-model-efforts/index.d.ts.map +1 -0
- package/dist/src/fixes/flattened-model-efforts/index.js +306 -0
- package/dist/src/fixes/flattened-model-efforts/index.js.map +1 -0
- package/dist/src/fixes/index.d.ts +25 -0
- package/dist/src/fixes/index.d.ts.map +1 -0
- package/dist/src/fixes/index.js +61 -0
- package/dist/src/fixes/index.js.map +1 -0
- package/dist/src/fixes/malformed-stream-syntax/index.d.ts +44 -0
- package/dist/src/fixes/malformed-stream-syntax/index.d.ts.map +1 -0
- package/dist/src/fixes/malformed-stream-syntax/index.js +346 -0
- package/dist/src/fixes/malformed-stream-syntax/index.js.map +1 -0
- package/dist/src/fixes/missing-localharness/index.d.ts +20 -0
- package/dist/src/fixes/missing-localharness/index.d.ts.map +1 -0
- package/dist/src/fixes/missing-localharness/index.js +103 -0
- package/dist/src/fixes/missing-localharness/index.js.map +1 -0
- package/dist/src/fixes/missing-question-fallback/index.d.ts +30 -0
- package/dist/src/fixes/missing-question-fallback/index.d.ts.map +1 -0
- package/dist/src/fixes/missing-question-fallback/index.js +119 -0
- package/dist/src/fixes/missing-question-fallback/index.js.map +1 -0
- package/dist/src/fixes/missing-slash-skills/index.d.ts +17 -0
- package/dist/src/fixes/missing-slash-skills/index.d.ts.map +1 -0
- package/dist/src/fixes/missing-slash-skills/index.js +107 -0
- package/dist/src/fixes/missing-slash-skills/index.js.map +1 -0
- package/dist/src/{skills.d.ts → fixes/missing-slash-skills/skills.d.ts} +2 -1
- package/dist/src/fixes/missing-slash-skills/skills.d.ts.map +1 -0
- package/dist/src/fixes/missing-slash-skills/skills.js +199 -0
- package/dist/src/fixes/missing-slash-skills/skills.js.map +1 -0
- package/dist/src/fixes/missing-system-prompt/index.d.ts +19 -0
- package/dist/src/fixes/missing-system-prompt/index.d.ts.map +1 -0
- package/dist/src/fixes/missing-system-prompt/index.js +118 -0
- package/dist/src/fixes/missing-system-prompt/index.js.map +1 -0
- package/dist/src/fixes/missing-usage-metrics/index.d.ts +26 -0
- package/dist/src/fixes/missing-usage-metrics/index.d.ts.map +1 -0
- package/dist/src/fixes/missing-usage-metrics/index.js +132 -0
- package/dist/src/fixes/missing-usage-metrics/index.js.map +1 -0
- package/dist/src/fixes/noisy-stderr-logs/index.d.ts +15 -0
- package/dist/src/fixes/noisy-stderr-logs/index.d.ts.map +1 -0
- package/dist/src/fixes/noisy-stderr-logs/index.js +23 -0
- package/dist/src/fixes/noisy-stderr-logs/index.js.map +1 -0
- package/dist/src/fixes/non-canonical-mode-ids/index.d.ts +26 -0
- package/dist/src/fixes/non-canonical-mode-ids/index.d.ts.map +1 -0
- package/dist/src/fixes/non-canonical-mode-ids/index.js +47 -0
- package/dist/src/fixes/non-canonical-mode-ids/index.js.map +1 -0
- package/dist/src/fixes/orphaned-checkpoints/index.d.ts +31 -0
- package/dist/src/fixes/orphaned-checkpoints/index.d.ts.map +1 -0
- package/dist/src/fixes/orphaned-checkpoints/index.js +82 -0
- package/dist/src/fixes/orphaned-checkpoints/index.js.map +1 -0
- package/dist/src/fixes/silent-background-tasks/index.d.ts +66 -0
- package/dist/src/fixes/silent-background-tasks/index.d.ts.map +1 -0
- package/dist/src/fixes/silent-background-tasks/index.js +491 -0
- package/dist/src/fixes/silent-background-tasks/index.js.map +1 -0
- package/dist/src/{mcp-proxy.d.ts → fixes/stale-mcp-endpoints/index.d.ts} +31 -4
- package/dist/src/fixes/stale-mcp-endpoints/index.d.ts.map +1 -0
- package/dist/src/{mcp-proxy.js → fixes/stale-mcp-endpoints/index.js} +162 -14
- package/dist/src/fixes/stale-mcp-endpoints/index.js.map +1 -0
- package/dist/src/fixes/subagent-hang/index.d.ts +2 -0
- package/dist/src/fixes/subagent-hang/index.d.ts.map +1 -0
- package/dist/src/fixes/subagent-hang/index.js +2 -0
- package/dist/src/fixes/subagent-hang/index.js.map +1 -0
- package/dist/src/fixes/subagent-hang/subagent-hang.d.ts +43 -0
- package/dist/src/fixes/subagent-hang/subagent-hang.d.ts.map +1 -0
- package/dist/src/fixes/subagent-hang/subagent-hang.js +114 -0
- package/dist/src/fixes/subagent-hang/subagent-hang.js.map +1 -0
- package/dist/src/index.d.ts +27 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +43 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/protobuf.d.ts +9 -0
- package/dist/src/lib/protobuf.d.ts.map +1 -0
- package/dist/src/lib/protobuf.js +89 -0
- package/dist/src/lib/protobuf.js.map +1 -0
- package/package.json +40 -7
- package/readme.md +150 -141
- package/assets/icon.svg +0 -3
- package/build/paseo/assets/icon.svg +0 -3
- package/build/paseo/assets/logo.svg +0 -62
- package/build/paseo/index.server.ts +0 -9
- package/build/paseo/paseo-plugin.json +0 -7
- package/build/paseo/server/agy-patch.ts +0 -445
- package/build/paseo/server/auth.ts +0 -122
- package/build/paseo/server/command.ts +0 -92
- package/build/paseo/server/connector.ts +0 -1371
- package/build/paseo/server/history.ts +0 -157
- package/build/paseo/server/mcp-proxy.ts +0 -375
- package/build/paseo/server/provider.ts +0 -37
- package/build/paseo/server/sanitize.ts +0 -286
- package/build/paseo/server/skills.ts +0 -183
- package/build/paseo/server/steering.ts +0 -199
- package/dist/index.server.d.ts +0 -4
- package/dist/index.server.d.ts.map +0 -1
- package/dist/index.server.js +0 -7
- package/dist/index.server.js.map +0 -1
- package/dist/src/agy-patch.d.ts +0 -65
- package/dist/src/agy-patch.d.ts.map +0 -1
- package/dist/src/agy-patch.js +0 -351
- package/dist/src/agy-patch.js.map +0 -1
- package/dist/src/auth.d.ts +0 -27
- package/dist/src/auth.d.ts.map +0 -1
- package/dist/src/auth.js +0 -113
- package/dist/src/auth.js.map +0 -1
- package/dist/src/command.d.ts.map +0 -1
- package/dist/src/command.js.map +0 -1
- package/dist/src/connector.d.ts +0 -187
- package/dist/src/connector.d.ts.map +0 -1
- package/dist/src/connector.js +0 -1127
- package/dist/src/connector.js.map +0 -1
- package/dist/src/history.d.ts +0 -12
- package/dist/src/history.d.ts.map +0 -1
- package/dist/src/history.js +0 -152
- package/dist/src/history.js.map +0 -1
- package/dist/src/mcp-proxy.d.ts.map +0 -1
- package/dist/src/mcp-proxy.js.map +0 -1
- package/dist/src/provider.d.ts +0 -11
- package/dist/src/provider.d.ts.map +0 -1
- package/dist/src/provider.js +0 -31
- package/dist/src/provider.js.map +0 -1
- package/dist/src/sanitize.d.ts +0 -29
- package/dist/src/sanitize.d.ts.map +0 -1
- package/dist/src/sanitize.js +0 -237
- package/dist/src/sanitize.js.map +0 -1
- package/dist/src/skills.d.ts.map +0 -1
- package/dist/src/skills.js +0 -140
- package/dist/src/skills.js.map +0 -1
- package/dist/src/steering.d.ts +0 -30
- package/dist/src/steering.d.ts.map +0 -1
- package/dist/src/steering.js +0 -174
- package/dist/src/steering.js.map +0 -1
- package/paseo-plugin.json +0 -8
- package/scripts/build-paseo.js +0 -60
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Upstream `agy_acp_server` never emits ACP `session/update` notifications with `sessionUpdate: "usage_update"`,
|
|
4
|
+
* leaving editor context window usage meters blank and providing no visibility into token consumption.
|
|
5
|
+
*
|
|
6
|
+
* Solution:
|
|
7
|
+
* Reads token metadata directly from the session's SQLite database upon prompt turn completion,
|
|
8
|
+
* synthesizing standard ACP `session/update` usage updates with `used` and `size` metrics.
|
|
9
|
+
*/
|
|
10
|
+
import { type AcpFix, type AcpStreamMessage } from "../../core/types.js";
|
|
11
|
+
import { getVarintField } from "../../lib/protobuf.js";
|
|
12
|
+
export { getVarintField };
|
|
13
|
+
export interface TokenUsage {
|
|
14
|
+
usedTokens: number;
|
|
15
|
+
maxTokens: number;
|
|
16
|
+
promptTokens: number;
|
|
17
|
+
candidateTokens: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function extractUsageFromMetadata(metadata: Uint8Array): TokenUsage | null;
|
|
20
|
+
export declare function getLatestSessionUsage(sessionId: string, customDbPath?: string): TokenUsage | null;
|
|
21
|
+
export declare function createUsageUpdateMessage(sessionId: string, usage: TokenUsage): AcpStreamMessage;
|
|
22
|
+
export declare function createMissingUsageMetricsFix(customDbPathGetter?: (sessionId: string) => string): AcpFix;
|
|
23
|
+
export declare const missingUsageMetricsFix: AcpFix;
|
|
24
|
+
export declare const createUsageMetricsFix: typeof createMissingUsageMetricsFix;
|
|
25
|
+
export declare const usageMetricsFix: AcpFix;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/missing-usage-metrics/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,gBAAgB,EAGtB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAY,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAgBhF;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAmBjG;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,gBAAgB,CAa/F;AAsBD,wBAAgB,4BAA4B,CAC1C,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GACjD,MAAM,CAmDR;AAED,eAAO,MAAM,sBAAsB,QAAiC,CAAC;AACrE,eAAO,MAAM,qBAAqB,qCAA+B,CAAC;AAClE,eAAO,MAAM,eAAe,QAAyB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Upstream `agy_acp_server` never emits ACP `session/update` notifications with `sessionUpdate: "usage_update"`,
|
|
4
|
+
* leaving editor context window usage meters blank and providing no visibility into token consumption.
|
|
5
|
+
*
|
|
6
|
+
* Solution:
|
|
7
|
+
* Reads token metadata directly from the session's SQLite database upon prompt turn completion,
|
|
8
|
+
* synthesizing standard ACP `session/update` usage updates with `used` and `size` metrics.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync } from "node:fs";
|
|
11
|
+
import { DatabaseSync } from "node:sqlite";
|
|
12
|
+
import { ACP_METHODS, SESSION_UPDATES, isJsonRpcRequest, } from "../../core/types.js";
|
|
13
|
+
import { extractSessionId } from "../../core/session-cache.js";
|
|
14
|
+
import { getConversationDbPath, STEP_TYPE_AGENT } from "../orphaned-checkpoints/index.js";
|
|
15
|
+
import { getField, getVarintField } from "../../lib/protobuf.js";
|
|
16
|
+
export { getVarintField };
|
|
17
|
+
export function extractUsageFromMetadata(metadata) {
|
|
18
|
+
const f9 = getField(metadata, 9);
|
|
19
|
+
if (!f9)
|
|
20
|
+
return null;
|
|
21
|
+
const promptTokens = getVarintField(f9, 2) ?? 0;
|
|
22
|
+
const candidateTokens = getVarintField(f9, 3) ?? 0;
|
|
23
|
+
const maxTokens = getVarintField(getField(metadata, 24), 4) ?? 1_000_000;
|
|
24
|
+
const usedTokens = promptTokens + candidateTokens;
|
|
25
|
+
return {
|
|
26
|
+
usedTokens,
|
|
27
|
+
maxTokens,
|
|
28
|
+
promptTokens,
|
|
29
|
+
candidateTokens,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function getLatestSessionUsage(sessionId, customDbPath) {
|
|
33
|
+
const dbPath = customDbPath ?? getConversationDbPath(sessionId);
|
|
34
|
+
if (!existsSync(dbPath))
|
|
35
|
+
return null;
|
|
36
|
+
let db = null;
|
|
37
|
+
try {
|
|
38
|
+
db = new DatabaseSync(dbPath, { timeout: 2000, readOnly: true });
|
|
39
|
+
const row = db
|
|
40
|
+
.prepare(`SELECT metadata FROM steps WHERE step_type = ${STEP_TYPE_AGENT} AND metadata IS NOT NULL ORDER BY idx DESC LIMIT 1;`)
|
|
41
|
+
.get();
|
|
42
|
+
if (!row?.metadata)
|
|
43
|
+
return null;
|
|
44
|
+
return extractUsageFromMetadata(row.metadata);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
db?.close();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function createUsageUpdateMessage(sessionId, usage) {
|
|
54
|
+
return {
|
|
55
|
+
jsonrpc: "2.0",
|
|
56
|
+
method: ACP_METHODS.SESSION_UPDATE,
|
|
57
|
+
params: {
|
|
58
|
+
sessionId,
|
|
59
|
+
update: {
|
|
60
|
+
sessionUpdate: SESSION_UPDATES.USAGE_UPDATE,
|
|
61
|
+
used: usage.usedTokens,
|
|
62
|
+
size: usage.maxTokens,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function attachUsageToResult(msg, usage) {
|
|
68
|
+
if (!("result" in msg) || !msg.result || typeof msg.result !== "object")
|
|
69
|
+
return msg;
|
|
70
|
+
const resultObj = msg.result;
|
|
71
|
+
return {
|
|
72
|
+
...msg,
|
|
73
|
+
result: {
|
|
74
|
+
...resultObj,
|
|
75
|
+
usage: {
|
|
76
|
+
totalTokens: usage.usedTokens,
|
|
77
|
+
inputTokens: usage.promptTokens,
|
|
78
|
+
outputTokens: usage.candidateTokens,
|
|
79
|
+
contextWindowMaxTokens: usage.maxTokens,
|
|
80
|
+
contextWindowUsedTokens: usage.usedTokens,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const MAX_PENDING_PROMPTS = 500;
|
|
86
|
+
export function createMissingUsageMetricsFix(customDbPathGetter) {
|
|
87
|
+
const pendingPromptSessions = new Map();
|
|
88
|
+
return {
|
|
89
|
+
name: "missing-usage-metrics",
|
|
90
|
+
description: "Extracts token counts from SQLite step metadata and synthesizes standard ACP usage_update notifications",
|
|
91
|
+
onOutbound: (msg, _context) => {
|
|
92
|
+
if (isJsonRpcRequest(msg) &&
|
|
93
|
+
(msg.method === ACP_METHODS.SESSION_PROMPT || msg.method === ACP_METHODS.SESSION_LOAD)) {
|
|
94
|
+
const sessionId = extractSessionId(msg);
|
|
95
|
+
if (sessionId) {
|
|
96
|
+
if (pendingPromptSessions.size >= MAX_PENDING_PROMPTS) {
|
|
97
|
+
const oldest = pendingPromptSessions.keys().next().value;
|
|
98
|
+
if (oldest !== undefined)
|
|
99
|
+
pendingPromptSessions.delete(oldest);
|
|
100
|
+
}
|
|
101
|
+
pendingPromptSessions.set(msg.id, sessionId);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return msg;
|
|
105
|
+
},
|
|
106
|
+
onInbound: async (msg, context) => {
|
|
107
|
+
if (!("id" in msg) || msg.id === null || msg.id === undefined)
|
|
108
|
+
return [msg];
|
|
109
|
+
if (!pendingPromptSessions.has(msg.id))
|
|
110
|
+
return [msg];
|
|
111
|
+
const sessionId = context.session?.sessionId ?? pendingPromptSessions.get(msg.id);
|
|
112
|
+
pendingPromptSessions.delete(msg.id);
|
|
113
|
+
if (!sessionId)
|
|
114
|
+
return [msg];
|
|
115
|
+
const dbPath = customDbPathGetter ? customDbPathGetter(sessionId) : undefined;
|
|
116
|
+
const usage = getLatestSessionUsage(sessionId, dbPath);
|
|
117
|
+
if (!usage)
|
|
118
|
+
return [msg];
|
|
119
|
+
return [createUsageUpdateMessage(sessionId, usage), attachUsageToResult(msg, usage)];
|
|
120
|
+
},
|
|
121
|
+
onRecycle: () => {
|
|
122
|
+
pendingPromptSessions.clear();
|
|
123
|
+
},
|
|
124
|
+
dispose: () => {
|
|
125
|
+
pendingPromptSessions.clear();
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export const missingUsageMetricsFix = createMissingUsageMetricsFix();
|
|
130
|
+
export const createUsageMetricsFix = createMissingUsageMetricsFix;
|
|
131
|
+
export const usageMetricsFix = missingUsageMetricsFix;
|
|
132
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/missing-usage-metrics/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Upstream `agy_acp_server` logs every raw WebSocket frame (including megabytes of tool outputs)
|
|
4
|
+
* directly to stderr with `"RAW WS MSG:"`, flooding editor log buffers and stalling event loops.
|
|
5
|
+
*
|
|
6
|
+
* Solution:
|
|
7
|
+
* Intercepts stderr lines and filters out raw websocket trace lines by default, exposing them
|
|
8
|
+
* only when `REFINED_AGY_TRACE=1` is explicitly enabled.
|
|
9
|
+
*/
|
|
10
|
+
import type { AcpFix } from "../../core/types.js";
|
|
11
|
+
import { RAW_WS_MSG_MARKER } from "../../core/telemetry.js";
|
|
12
|
+
export { RAW_WS_MSG_MARKER };
|
|
13
|
+
export declare const noisyStderrLogsFix: AcpFix;
|
|
14
|
+
export declare const stderrFilteringFix: AcpFix;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/noisy-stderr-logs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,eAAO,MAAM,kBAAkB,EAAE,MAUhC,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAqB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Upstream `agy_acp_server` logs every raw WebSocket frame (including megabytes of tool outputs)
|
|
4
|
+
* directly to stderr with `"RAW WS MSG:"`, flooding editor log buffers and stalling event loops.
|
|
5
|
+
*
|
|
6
|
+
* Solution:
|
|
7
|
+
* Intercepts stderr lines and filters out raw websocket trace lines by default, exposing them
|
|
8
|
+
* only when `REFINED_AGY_TRACE=1` is explicitly enabled.
|
|
9
|
+
*/
|
|
10
|
+
import { RAW_WS_MSG_MARKER } from "../../core/telemetry.js";
|
|
11
|
+
export { RAW_WS_MSG_MARKER };
|
|
12
|
+
export const noisyStderrLogsFix = {
|
|
13
|
+
name: "noisy-stderr-logs",
|
|
14
|
+
description: "Filters verbose websocket trace payloads from stderr unless REFINED_AGY_TRACE=1",
|
|
15
|
+
onStderrLine(line, _context) {
|
|
16
|
+
if (!line.includes(RAW_WS_MSG_MARKER)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return process.env.REFINED_AGY_TRACE !== "1";
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
export const stderrFilteringFix = noisyStderrLogsFix;
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/noisy-stderr-logs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,kBAAkB,GAAW;IACxC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,iFAAiF;IAE9F,YAAY,CAAC,IAAY,EAAE,QAAuB;QAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,CAAC;IAC/C,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Standard ACP clients (like Paseo) send canonical mode identifiers such as `accept-edits`,
|
|
4
|
+
* `dangerously-skip-permissions`, and `plan`. Upstream `agy_acp_server` strictly expects internal
|
|
5
|
+
* strings (`auto_edit`, `yolo`, `default`), failing with an RPC error on unknown mode IDs.
|
|
6
|
+
*
|
|
7
|
+
* Solution:
|
|
8
|
+
* Maps standard client mode aliases to canonical internal IDs across all outbound
|
|
9
|
+
* session requests (`session/new`, `session/load`, `session/set_mode`).
|
|
10
|
+
*/
|
|
11
|
+
import type { AcpFix, AcpStreamMessage } from "../../core/types.js";
|
|
12
|
+
export declare const MODE_MAPPINGS: Readonly<Record<string, string>>;
|
|
13
|
+
/**
|
|
14
|
+
* Normalizes client mode IDs to Antigravity internal mode IDs:
|
|
15
|
+
* - "accept-edits" -> "auto_edit"
|
|
16
|
+
* - "dangerously-skip-permissions" -> "yolo"
|
|
17
|
+
* - "plan" -> "default"
|
|
18
|
+
*/
|
|
19
|
+
export declare function normalizeModeId(modeId?: string): string | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* In-place mutation of modeId in message params if present.
|
|
22
|
+
*/
|
|
23
|
+
export declare function normalizeModeIdOnMsg(msg: AcpStreamMessage): void;
|
|
24
|
+
export declare const nonCanonicalModeIdsFix: AcpFix;
|
|
25
|
+
export declare const modeNormalizationFix: AcpFix;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/non-canonical-mode-ids/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI1D,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGnE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAOhE;AAED,eAAO,MAAM,sBAAsB,EAAE,MASpC,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAyB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Standard ACP clients (like Paseo) send canonical mode identifiers such as `accept-edits`,
|
|
4
|
+
* `dangerously-skip-permissions`, and `plan`. Upstream `agy_acp_server` strictly expects internal
|
|
5
|
+
* strings (`auto_edit`, `yolo`, `default`), failing with an RPC error on unknown mode IDs.
|
|
6
|
+
*
|
|
7
|
+
* Solution:
|
|
8
|
+
* Maps standard client mode aliases to canonical internal IDs across all outbound
|
|
9
|
+
* session requests (`session/new`, `session/load`, `session/set_mode`).
|
|
10
|
+
*/
|
|
11
|
+
export const MODE_MAPPINGS = {
|
|
12
|
+
"accept-edits": "auto_edit",
|
|
13
|
+
"dangerously-skip-permissions": "yolo",
|
|
14
|
+
plan: "default",
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Normalizes client mode IDs to Antigravity internal mode IDs:
|
|
18
|
+
* - "accept-edits" -> "auto_edit"
|
|
19
|
+
* - "dangerously-skip-permissions" -> "yolo"
|
|
20
|
+
* - "plan" -> "default"
|
|
21
|
+
*/
|
|
22
|
+
export function normalizeModeId(modeId) {
|
|
23
|
+
if (!modeId)
|
|
24
|
+
return modeId;
|
|
25
|
+
return MODE_MAPPINGS[modeId] ?? modeId;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* In-place mutation of modeId in message params if present.
|
|
29
|
+
*/
|
|
30
|
+
export function normalizeModeIdOnMsg(msg) {
|
|
31
|
+
if ("params" in msg && msg.params && typeof msg.params === "object" && "modeId" in msg.params) {
|
|
32
|
+
const p = msg.params;
|
|
33
|
+
if (typeof p.modeId === "string") {
|
|
34
|
+
p.modeId = normalizeModeId(p.modeId);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export const nonCanonicalModeIdsFix = {
|
|
39
|
+
name: "non-canonical-mode-ids",
|
|
40
|
+
description: "Translates standard client mode identifiers (accept-edits, plan) to internal engine IDs",
|
|
41
|
+
onOutbound(msg) {
|
|
42
|
+
normalizeModeIdOnMsg(msg);
|
|
43
|
+
return msg;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
export const modeNormalizationFix = nonCanonicalModeIdsFix;
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/non-canonical-mode-ids/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAqC;IAC7D,cAAc,EAAE,WAAW;IAC3B,8BAA8B,EAAE,MAAM;IACtC,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAqB;IACxD,IAAI,QAAQ,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9F,MAAM,CAAC,GAAG,GAAG,CAAC,MAAyC,CAAC;QACxD,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjC,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAW;IAC5C,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,yFAAyF;IAE3F,UAAU,CAAC,GAAqB;QAC9B,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Cancelling or interrupting an in-flight turn leaves uncommitted in-progress checkpoints (status=2)
|
|
4
|
+
* in the session's SQLite database (`~/.gemini/antigravity-acp/conversations/<sessionId>.db`).
|
|
5
|
+
* Resuming or executing subsequent prompts against the session triggers a fatal panic:
|
|
6
|
+
* `"panic: could not find doneCh for checkpoint"`.
|
|
7
|
+
*
|
|
8
|
+
* Solution:
|
|
9
|
+
* Inspects the session's SQLite database on load and shutdown, repairing any orphaned
|
|
10
|
+
* in-progress checkpoints and action steps to ABORTED (status=5) with isolated session scoping.
|
|
11
|
+
*/
|
|
12
|
+
import { type AcpFix } from "../../core/types.js";
|
|
13
|
+
export declare const STEP_TYPE_USER = 14;
|
|
14
|
+
export declare const STEP_TYPE_AGENT = 15;
|
|
15
|
+
export declare const STEP_TYPE_CHECKPOINT = 23;
|
|
16
|
+
export declare const CHECKPOINT_STATUS_IN_PROGRESS = 2;
|
|
17
|
+
export declare const CHECKPOINT_STATUS_ABORTED = 5;
|
|
18
|
+
export declare const DONE_CH_PANIC_MARKER = "could not find doneCh for checkpoint";
|
|
19
|
+
export declare function getConversationDbPath(sessionId: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Automatically repairs orphaned in-progress steps (status=2), including checkpoints
|
|
22
|
+
* (step_type=23) and action/tool steps (step_type=21), left behind by cancelled, aborted,
|
|
23
|
+
* or interrupted Antigravity turns. Setting status=5 (aborted) prevents Antigravity
|
|
24
|
+
* from crashing on resumption or next prompt with "could not find doneCh for checkpoint".
|
|
25
|
+
*
|
|
26
|
+
* Returns the number of repaired steps.
|
|
27
|
+
*/
|
|
28
|
+
export declare function repairOrphanedCheckpoints(sessionId: string, customDbPath?: string): number;
|
|
29
|
+
export declare const orphanedCheckpointsFix: AcpFix;
|
|
30
|
+
export declare const checkpointRepairFix: AcpFix;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/orphaned-checkpoints/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EAGL,KAAK,MAAM,EAEZ,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,eAAO,MAAM,oBAAoB,yCAAyC,CAAC;AAE3E,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAmC1F;AAED,eAAO,MAAM,sBAAsB,EAAE,MAcpC,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAyB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Cancelling or interrupting an in-flight turn leaves uncommitted in-progress checkpoints (status=2)
|
|
4
|
+
* in the session's SQLite database (`~/.gemini/antigravity-acp/conversations/<sessionId>.db`).
|
|
5
|
+
* Resuming or executing subsequent prompts against the session triggers a fatal panic:
|
|
6
|
+
* `"panic: could not find doneCh for checkpoint"`.
|
|
7
|
+
*
|
|
8
|
+
* Solution:
|
|
9
|
+
* Inspects the session's SQLite database on load and shutdown, repairing any orphaned
|
|
10
|
+
* in-progress checkpoints and action steps to ABORTED (status=5) with isolated session scoping.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync } from "node:fs";
|
|
13
|
+
import { homedir } from "node:os";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { DatabaseSync } from "node:sqlite";
|
|
16
|
+
import { ACP_METHODS, } from "../../core/types.js";
|
|
17
|
+
import { extractSessionId } from "../../core/session-cache.js";
|
|
18
|
+
export const STEP_TYPE_USER = 14;
|
|
19
|
+
export const STEP_TYPE_AGENT = 15;
|
|
20
|
+
export const STEP_TYPE_CHECKPOINT = 23;
|
|
21
|
+
export const CHECKPOINT_STATUS_IN_PROGRESS = 2;
|
|
22
|
+
export const CHECKPOINT_STATUS_ABORTED = 5;
|
|
23
|
+
export const DONE_CH_PANIC_MARKER = "could not find doneCh for checkpoint";
|
|
24
|
+
export function getConversationDbPath(sessionId) {
|
|
25
|
+
const geminiHome = process.env.GEMINI_HOME || join(homedir(), ".gemini");
|
|
26
|
+
return join(geminiHome, "antigravity-acp", "conversations", `${sessionId}.db`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Automatically repairs orphaned in-progress steps (status=2), including checkpoints
|
|
30
|
+
* (step_type=23) and action/tool steps (step_type=21), left behind by cancelled, aborted,
|
|
31
|
+
* or interrupted Antigravity turns. Setting status=5 (aborted) prevents Antigravity
|
|
32
|
+
* from crashing on resumption or next prompt with "could not find doneCh for checkpoint".
|
|
33
|
+
*
|
|
34
|
+
* Returns the number of repaired steps.
|
|
35
|
+
*/
|
|
36
|
+
export function repairOrphanedCheckpoints(sessionId, customDbPath) {
|
|
37
|
+
const dbPath = customDbPath ?? getConversationDbPath(sessionId);
|
|
38
|
+
if (!existsSync(dbPath))
|
|
39
|
+
return 0;
|
|
40
|
+
let db = null;
|
|
41
|
+
try {
|
|
42
|
+
db = new DatabaseSync(dbPath, { timeout: 2000 });
|
|
43
|
+
const stmt = db.prepare(`
|
|
44
|
+
UPDATE steps
|
|
45
|
+
SET status = ${CHECKPOINT_STATUS_ABORTED},
|
|
46
|
+
step_payload = CASE
|
|
47
|
+
WHEN length(step_payload) >= 4 AND substr(step_payload, 3, 2) = x'2002'
|
|
48
|
+
THEN CAST(substr(step_payload, 1, 3) || x'05' || substr(step_payload, 5) AS BLOB)
|
|
49
|
+
ELSE step_payload
|
|
50
|
+
END
|
|
51
|
+
WHERE status = ${CHECKPOINT_STATUS_IN_PROGRESS} OR (length(step_payload) >= 4 AND substr(step_payload, 3, 2) = x'2002');
|
|
52
|
+
`);
|
|
53
|
+
const result = stmt.run();
|
|
54
|
+
const repairedCount = Number(result.changes);
|
|
55
|
+
if (repairedCount > 0) {
|
|
56
|
+
console.error(`[refined-antigravity-acp] Repaired ${repairedCount} orphaned checkpoint/step(s) for session ${sessionId}`);
|
|
57
|
+
}
|
|
58
|
+
return repairedCount;
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error(`[refined-antigravity-acp] Failed to repair checkpoints for session ${sessionId}:`, err);
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
db?.close();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export const orphanedCheckpointsFix = {
|
|
69
|
+
name: "orphaned-checkpoints",
|
|
70
|
+
description: "Repairs orphaned in-progress SQLite checkpoints to prevent fatal doneCh panics on resumption",
|
|
71
|
+
onOutbound(msg, _context) {
|
|
72
|
+
if ("method" in msg && msg.method === ACP_METHODS.SESSION_LOAD) {
|
|
73
|
+
const sessionId = extractSessionId(msg);
|
|
74
|
+
if (sessionId) {
|
|
75
|
+
repairOrphanedCheckpoints(sessionId);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return msg;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
export const checkpointRepairFix = orphanedCheckpointsFix;
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/orphaned-checkpoints/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,WAAW,GAIZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,oBAAoB,GAAG,sCAAsC,CAAC;AAE3E,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC;AACjF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAiB,EAAE,YAAqB;IAChF,MAAM,MAAM,GAAG,YAAY,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IAElC,IAAI,EAAE,GAAwB,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;qBAEP,yBAAyB;;;;;;uBAMvB,6BAA6B;KAC/C,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE7C,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CACX,sCAAsC,aAAa,4CAA4C,SAAS,EAAE,CAC3G,CAAC;QACJ,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,sEAAsE,SAAS,GAAG,EAClF,GAAG,CACJ,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,EAAE,EAAE,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAW;IAC5C,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EACT,8FAA8F;IAEhG,UAAU,CAAC,GAAqB,EAAE,QAAyB;QACzD,IAAI,QAAQ,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,YAAY,EAAE,CAAC;YAC/D,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,SAAS,EAAE,CAAC;gBACd,yBAAyB,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Problem:
|
|
3
|
+
* Subagents and scheduled background tasks execute silently in the background. While the agent
|
|
4
|
+
* transitions into `STATE_WAITING_FOR_TASKS`, upstream `agy_acp_server` produces no stdout updates,
|
|
5
|
+
* leaving editor UIs completely frozen with no indication of ongoing background progress.
|
|
6
|
+
*
|
|
7
|
+
* Solution:
|
|
8
|
+
* Tracks subagent invocations and background tasks via telemetry and stream events, synthesizing
|
|
9
|
+
* standard ACP `session/update` notifications with `sessionUpdate: "plan"` to expose live status.
|
|
10
|
+
*/
|
|
11
|
+
import { type AcpFix, type AcpStreamMessage, type StderrContext } from "../../core/types.js";
|
|
12
|
+
export declare const TOOL_INVOKE_SUBAGENT = "invoke_subagent";
|
|
13
|
+
export declare const TOOL_SCHEDULE = "schedule";
|
|
14
|
+
export declare const DEFAULT_WAITING_TASK_CONTENT = "Running background subagents and tasks";
|
|
15
|
+
export interface BackgroundTasksOptions {
|
|
16
|
+
dbPathResolver?: ((sessionId: string) => string) | undefined;
|
|
17
|
+
}
|
|
18
|
+
export interface PlanEntry {
|
|
19
|
+
content: string;
|
|
20
|
+
priority: "high" | "medium" | "low";
|
|
21
|
+
status: "pending" | "in_progress" | "completed";
|
|
22
|
+
}
|
|
23
|
+
export declare function createPlanUpdateMessage(sessionId: string, entries: PlanEntry[]): AcpStreamMessage;
|
|
24
|
+
export interface SubagentInfo {
|
|
25
|
+
role?: string | undefined;
|
|
26
|
+
prompt?: string | undefined;
|
|
27
|
+
typeName?: string | undefined;
|
|
28
|
+
}
|
|
29
|
+
export declare function parseSubagentsFromArgs(rawArgs: unknown): SubagentInfo[];
|
|
30
|
+
export declare function formatSubagentContent(info: SubagentInfo): string;
|
|
31
|
+
export declare class BackgroundTasksTracker {
|
|
32
|
+
private readonly sessions;
|
|
33
|
+
private readonly promptIdToSessionId;
|
|
34
|
+
private getOrCreate;
|
|
35
|
+
getEntries(sessionId: string): readonly PlanEntry[];
|
|
36
|
+
onPromptStart(sessionId: string, promptId?: string | number | undefined): void;
|
|
37
|
+
getSessionForPromptId(promptId: string | number): string | undefined;
|
|
38
|
+
isWaitingForTasks(sessionId: string): boolean;
|
|
39
|
+
setWaiting(sessionId: string, waiting: boolean): void;
|
|
40
|
+
recordToolCommand(sessionId: string, toolCallId: string, command: string): void;
|
|
41
|
+
getToolCommand(sessionId: string, toolCallId: string): string | undefined;
|
|
42
|
+
deferPromptResponse(sessionId: string, response: AcpStreamMessage): void;
|
|
43
|
+
recordSubagents(sessionId: string, subagents: SubagentInfo[], toolCallId?: string): PlanEntry[];
|
|
44
|
+
recordCustomTask(sessionId: string, content: string, priority?: "high" | "medium" | "low", toolCallId?: string): PlanEntry[];
|
|
45
|
+
onWaitingForTasks(sessionId: string): AcpStreamMessage | null;
|
|
46
|
+
onRunning(sessionId: string): AcpStreamMessage | null;
|
|
47
|
+
onIdle(sessionId: string, context?: StderrContext | undefined): AcpStreamMessage | null;
|
|
48
|
+
onCancel(sessionId: string): {
|
|
49
|
+
planMsg: AcpStreamMessage | null;
|
|
50
|
+
cancelPromptMsg: AcpStreamMessage | null;
|
|
51
|
+
};
|
|
52
|
+
onTurnEnd(sessionId: string): AcpStreamMessage | null;
|
|
53
|
+
dispose(): void;
|
|
54
|
+
}
|
|
55
|
+
export declare function inferToolName(name?: string | null, title?: string | null, rawInput?: unknown): string | null;
|
|
56
|
+
export declare function createSilentBackgroundTasksFix(_options?: BackgroundTasksOptions | undefined): AcpFix & {
|
|
57
|
+
tracker: BackgroundTasksTracker;
|
|
58
|
+
};
|
|
59
|
+
export declare const silentBackgroundTasksFix: AcpFix & {
|
|
60
|
+
tracker: BackgroundTasksTracker;
|
|
61
|
+
};
|
|
62
|
+
export declare const createBackgroundTasksFix: typeof createSilentBackgroundTasksFix;
|
|
63
|
+
export declare const backgroundTasksFix: AcpFix & {
|
|
64
|
+
tracker: BackgroundTasksTracker;
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/silent-background-tasks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAKL,KAAK,MAAM,EACX,KAAK,gBAAgB,EAGrB,KAAK,aAAa,EAGnB,MAAM,qBAAqB,CAAC;AAK7B,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AACtD,eAAO,MAAM,aAAa,aAAa,CAAC;AACxC,eAAO,MAAM,4BAA4B,2CAA2C,CAAC;AAErF,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;CAC9D;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;CACjD;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAYjG;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAYD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,EAAE,CAcvE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAahE;AAaD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAClE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsC;IAE1E,OAAO,CAAC,WAAW;IAoBnB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,SAAS,EAAE;IAInD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI;IAa9E,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpE,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAIrD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI/E,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzE,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIxE,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE;IAkB/F,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,GAAG,QAAQ,GAAG,KAAgB,EAC9C,UAAU,CAAC,EAAE,MAAM,GAClB,SAAS,EAAE;IAgBd,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAmB7D,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAoBrD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,GAAG,gBAAgB,GAAG,IAAI;IA8BvF,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG;QAC3B,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;QACjC,eAAe,EAAE,gBAAgB,GAAG,IAAI,CAAC;KAC1C;IAqBD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAoBrD,OAAO,IAAI,IAAI;CAIhB;AA8BD,wBAAgB,aAAa,CAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,QAAQ,CAAC,EAAE,OAAO,GACjB,MAAM,GAAG,IAAI,CAGf;AAsMD,wBAAgB,8BAA8B,CAC5C,QAAQ,CAAC,EAAE,sBAAsB,GAAG,SAAS,GAC5C,MAAM,GAAG;IAAE,OAAO,EAAE,sBAAsB,CAAA;CAAE,CA8C9C;AAED,eAAO,MAAM,wBAAwB;aAhDd,sBAAsB;CAgD2B,CAAC;AACzE,eAAO,MAAM,wBAAwB,uCAAiC,CAAC;AACvE,eAAO,MAAM,kBAAkB;aAlDR,sBAAsB;CAkDa,CAAC"}
|