@simonepri/refined-antigravity-acp 1.1.3 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +26 -17
- package/dist/src/cli.js.map +1 -1
- package/dist/src/fixes/premature-turn-stop/index.d.ts +4 -4
- package/dist/src/fixes/premature-turn-stop/index.d.ts.map +1 -1
- package/dist/src/fixes/premature-turn-stop/index.js +4 -96
- package/dist/src/fixes/premature-turn-stop/index.js.map +1 -1
- package/dist/src/setup.d.ts +6 -1
- package/dist/src/setup.d.ts.map +1 -1
- package/dist/src/setup.js +60 -1
- package/dist/src/setup.js.map +1 -1
- package/package.json +1 -1
- package/readme.md +17 -1
package/dist/src/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAyEA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB5C"}
|
package/dist/src/cli.js
CHANGED
|
@@ -1,30 +1,39 @@
|
|
|
1
1
|
import readline from "node:readline";
|
|
2
2
|
import { createAntigravityConnector } from "./index.js";
|
|
3
3
|
import { runSetup } from "./setup.js";
|
|
4
|
+
function parseSetupTarget(args) {
|
|
5
|
+
if (args.includes("paseo") || args.includes("--paseo"))
|
|
6
|
+
return "paseo";
|
|
7
|
+
if (args.includes("zed") || args.includes("--zed"))
|
|
8
|
+
return "zed";
|
|
9
|
+
return "all";
|
|
10
|
+
}
|
|
11
|
+
function printHelp() {
|
|
12
|
+
console.log(`Refined Antigravity ACP - Hardened wrapper around Google's official Antigravity ACP binary.
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
refined-antigravity-acp Start ACP server over stdio
|
|
16
|
+
refined-antigravity-acp setup Download binary & configure Paseo and Zed
|
|
17
|
+
refined-antigravity-acp setup paseo Configure Paseo (~/.paseo/config.json)
|
|
18
|
+
refined-antigravity-acp setup zed Configure Zed Editor (settings.json)
|
|
19
|
+
|
|
20
|
+
Options:
|
|
21
|
+
-y, --yes Accept Google Terms of Service non-interactively
|
|
22
|
+
`);
|
|
23
|
+
}
|
|
4
24
|
async function handleCliArgs(args) {
|
|
5
25
|
const firstArg = args[0]?.toLowerCase();
|
|
6
26
|
if (firstArg === "setup") {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
await runSetup("zed");
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
await runSetup("all");
|
|
27
|
+
const autoAccept = args.includes("--yes") || args.includes("-y");
|
|
28
|
+
const target = parseSetupTarget(args);
|
|
29
|
+
const success = await runSetup(target, { autoAccept });
|
|
30
|
+
if (!success) {
|
|
31
|
+
process.exit(1);
|
|
16
32
|
}
|
|
17
33
|
return true;
|
|
18
34
|
}
|
|
19
35
|
if (args.includes("--help") || args.includes("-h")) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Usage:
|
|
23
|
-
refined-antigravity-acp Start ACP server over stdio
|
|
24
|
-
refined-antigravity-acp setup Configure both Paseo and Zed
|
|
25
|
-
refined-antigravity-acp setup paseo Configure Paseo (~/.paseo/config.json)
|
|
26
|
-
refined-antigravity-acp setup zed Configure Zed Editor (settings.json)
|
|
27
|
-
`);
|
|
36
|
+
printHelp();
|
|
28
37
|
return true;
|
|
29
38
|
}
|
|
30
39
|
return false;
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
* transition the session to idle, leaving the user with zero explanation and an apparent hang.
|
|
7
7
|
*
|
|
8
8
|
* Solution:
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Injects explicit system prompt steering instructing the model to never end a prompt turn without
|
|
10
|
+
* emitting a clear assistant text message, eliminating premature silent stops at the model source
|
|
11
|
+
* without synthesizing synthetic conversational prose in the proxy.
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
13
|
+
import type { AcpFix } from "../../core/types.js";
|
|
14
14
|
export declare function createPrematureTurnStopFix(): AcpFix;
|
|
15
15
|
export declare const prematureTurnStopFix: AcpFix;
|
|
16
16
|
//# 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;;;;;;;;;;;GAWG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fixes/premature-turn-stop/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,wBAAgB,0BAA0B,IAAI,MAAM,CAYnD;AAED,eAAO,MAAM,oBAAoB,QAA+B,CAAC"}
|
|
@@ -6,112 +6,20 @@
|
|
|
6
6
|
* transition the session to idle, leaving the user with zero explanation and an apparent hang.
|
|
7
7
|
*
|
|
8
8
|
* Solution:
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Injects explicit system prompt steering instructing the model to never end a prompt turn without
|
|
10
|
+
* emitting a clear assistant text message, eliminating premature silent stops at the model source
|
|
11
|
+
* without synthesizing synthetic conversational prose in the proxy.
|
|
12
12
|
*/
|
|
13
|
-
import { ACP_METHODS, SESSION_UPDATES, isJsonRpcRequest, } from "../../core/types.js";
|
|
14
|
-
import { extractSessionId } from "../../core/session-cache.js";
|
|
15
|
-
function recordOutboundPrompt(msg, activeTurns, sessionTurnMap) {
|
|
16
|
-
if (!isJsonRpcRequest(msg) || !("id" in msg) || msg.id === null || msg.id === undefined) {
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
const sessionId = extractSessionId(msg);
|
|
20
|
-
if (!sessionId) {
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
const state = {
|
|
24
|
-
promptId: msg.id,
|
|
25
|
-
sessionId,
|
|
26
|
-
hasAssistantMessage: false,
|
|
27
|
-
toolActionsCount: 0,
|
|
28
|
-
};
|
|
29
|
-
activeTurns.set(msg.id, state);
|
|
30
|
-
sessionTurnMap.set(sessionId, state);
|
|
31
|
-
}
|
|
32
|
-
function processTurnUpdate(state, updateType, title) {
|
|
33
|
-
if (updateType === SESSION_UPDATES.AGENT_MESSAGE_CHUNK) {
|
|
34
|
-
state.hasAssistantMessage = true;
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
if (updateType === SESSION_UPDATES.TOOL_CALL || updateType === SESSION_UPDATES.TOOL_CALL_UPDATE) {
|
|
38
|
-
state.toolActionsCount++;
|
|
39
|
-
if (title) {
|
|
40
|
-
state.lastToolTitle = title;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function recordInboundUpdate(msg, sessionTurnMap) {
|
|
45
|
-
if (!("params" in msg) || !msg.params) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const params = msg.params;
|
|
49
|
-
const state = params.sessionId ? sessionTurnMap.get(params.sessionId) : undefined;
|
|
50
|
-
if (!state) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
processTurnUpdate(state, params.update?.sessionUpdate, params.update?.title);
|
|
54
|
-
}
|
|
55
|
-
function synthesizeExplanation(state) {
|
|
56
|
-
const toolSuffix = state.lastToolTitle ? ` (last action: ${state.lastToolTitle})` : "";
|
|
57
|
-
const text = state.toolActionsCount > 0
|
|
58
|
-
? `Completed actions (${state.toolActionsCount} operations executed)${toolSuffix}. Please let me know how you would like to proceed.`
|
|
59
|
-
: "Received your message. How can I help you proceed?";
|
|
60
|
-
return {
|
|
61
|
-
jsonrpc: "2.0",
|
|
62
|
-
method: ACP_METHODS.SESSION_UPDATE,
|
|
63
|
-
params: {
|
|
64
|
-
sessionId: state.sessionId,
|
|
65
|
-
update: {
|
|
66
|
-
sessionUpdate: SESSION_UPDATES.AGENT_MESSAGE_CHUNK,
|
|
67
|
-
content: { type: "text", text },
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
function resolveInboundResult(msg, activeTurns, sessionTurnMap) {
|
|
73
|
-
if (!("result" in msg) || !("id" in msg) || msg.id === null || msg.id === undefined) {
|
|
74
|
-
return [msg];
|
|
75
|
-
}
|
|
76
|
-
const state = activeTurns.get(msg.id);
|
|
77
|
-
if (!state) {
|
|
78
|
-
return [msg];
|
|
79
|
-
}
|
|
80
|
-
activeTurns.delete(msg.id);
|
|
81
|
-
sessionTurnMap.delete(state.sessionId);
|
|
82
|
-
if (state.hasAssistantMessage) {
|
|
83
|
-
return [msg];
|
|
84
|
-
}
|
|
85
|
-
return [synthesizeExplanation(state), msg];
|
|
86
|
-
}
|
|
87
13
|
export function createPrematureTurnStopFix() {
|
|
88
|
-
const activeTurns = new Map();
|
|
89
|
-
const sessionTurnMap = new Map();
|
|
90
14
|
return {
|
|
91
15
|
name: "premature-turn-stop",
|
|
92
|
-
description: "
|
|
16
|
+
description: "Steers model to prevent premature empty turn stops without assistant messages",
|
|
93
17
|
getSystemInstructions() {
|
|
94
18
|
return [
|
|
95
19
|
"Never end a prompt turn without emitting a clear assistant text message summarizing completed actions, current status, or next steps.",
|
|
96
20
|
"When executing commit commands, linter checks, or tests that encounter errors, explicitly explain the failures to the user before attempting further autonomous repairs.",
|
|
97
21
|
];
|
|
98
22
|
},
|
|
99
|
-
onOutbound(msg, _context) {
|
|
100
|
-
if ("method" in msg && msg.method === ACP_METHODS.SESSION_PROMPT) {
|
|
101
|
-
recordOutboundPrompt(msg, activeTurns, sessionTurnMap);
|
|
102
|
-
}
|
|
103
|
-
return msg;
|
|
104
|
-
},
|
|
105
|
-
async onInbound(msg, _context) {
|
|
106
|
-
if ("method" in msg && msg.method === ACP_METHODS.SESSION_UPDATE) {
|
|
107
|
-
recordInboundUpdate(msg, sessionTurnMap);
|
|
108
|
-
return [msg];
|
|
109
|
-
}
|
|
110
|
-
if ("result" in msg) {
|
|
111
|
-
return resolveInboundResult(msg, activeTurns, sessionTurnMap);
|
|
112
|
-
}
|
|
113
|
-
return [msg];
|
|
114
|
-
},
|
|
115
23
|
};
|
|
116
24
|
}
|
|
117
25
|
export const prematureTurnStopFix = createPrematureTurnStopFix();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/premature-turn-stop/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fixes/premature-turn-stop/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,UAAU,0BAA0B;IACxC,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,+EAA+E;QAE5F,qBAAqB;YACnB,OAAO;gBACL,uIAAuI;gBACvI,0KAA0K;aAC3K,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,EAAE,CAAC"}
|
package/dist/src/setup.d.ts
CHANGED
|
@@ -5,5 +5,10 @@ export interface ResolvedPaths {
|
|
|
5
5
|
export declare function resolvePaths(): ResolvedPaths;
|
|
6
6
|
export declare function setupPaseo(paths?: ResolvedPaths, restartDaemon?: boolean): boolean;
|
|
7
7
|
export declare function setupZed(paths?: ResolvedPaths): boolean;
|
|
8
|
-
export declare
|
|
8
|
+
export declare const GOOGLE_TERMS_URL = "https://antigravity.google/terms";
|
|
9
|
+
export interface SetupOptions {
|
|
10
|
+
autoAccept?: boolean | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare function ensureSetupBinary(options?: SetupOptions): Promise<boolean>;
|
|
13
|
+
export declare function runSetup(target?: "all" | "paseo" | "zed", options?: SetupOptions): Promise<boolean>;
|
|
9
14
|
//# sourceMappingURL=setup.d.ts.map
|
package/dist/src/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,YAAY,IAAI,aAAa,CAyB5C;AAoCD,wBAAgB,UAAU,CAAC,KAAK,GAAE,aAA8B,EAAE,aAAa,UAAO,GAAG,OAAO,CAgC/F;AAkBD,wBAAgB,QAAQ,CAAC,KAAK,GAAE,aAA8B,GAAG,OAAO,CAwBvE;AAED,eAAO,MAAM,gBAAgB,qCAAqC,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAkCD,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBhF;AAED,wBAAsB,QAAQ,CAC5B,MAAM,GAAE,KAAK,GAAG,OAAO,GAAG,KAAa,EACvC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC,CAkBlB"}
|
package/dist/src/setup.js
CHANGED
|
@@ -2,6 +2,8 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import { execFileSync, execSync } from "node:child_process";
|
|
5
|
+
import readline from "node:readline/promises";
|
|
6
|
+
import { agyCommand, ensureAntigravityBinary } from "./core/command.js";
|
|
5
7
|
export function resolvePaths() {
|
|
6
8
|
const nodePath = process.execPath;
|
|
7
9
|
let cliPath;
|
|
@@ -115,7 +117,63 @@ export function setupZed(paths = resolvePaths()) {
|
|
|
115
117
|
console.log(`✓ Configured Zed profile in ${settingsPath}`);
|
|
116
118
|
return true;
|
|
117
119
|
}
|
|
118
|
-
export
|
|
120
|
+
export const GOOGLE_TERMS_URL = "https://antigravity.google/terms";
|
|
121
|
+
function findExistingBinary() {
|
|
122
|
+
try {
|
|
123
|
+
const [cmd] = agyCommand();
|
|
124
|
+
return fs.existsSync(cmd) ? cmd : undefined;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async function promptTermsAcceptance() {
|
|
131
|
+
if (!process.stdin.isTTY) {
|
|
132
|
+
console.error(`\nGoogle Antigravity ACP binary was not found locally.\nBy downloading, you agree to the Google Antigravity Terms of Service:\n ${GOOGLE_TERMS_URL}\n\nTo accept non-interactively, pass --yes: refined-antigravity-acp setup --yes\n`);
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
const rl = readline.createInterface({
|
|
136
|
+
input: process.stdin,
|
|
137
|
+
output: process.stdout,
|
|
138
|
+
});
|
|
139
|
+
try {
|
|
140
|
+
const answer = await rl.question(`\nGoogle Antigravity ACP binary was not found locally.\nTo continue, the official binary must be downloaded from Google (dl.google.com).\n\nNotice: By downloading, you agree to the Google Antigravity Terms of Service:\n ${GOOGLE_TERMS_URL}\n\nDo you accept the Google Antigravity Terms of Service? [y/N]: `);
|
|
141
|
+
const trimmed = answer.trim().toLowerCase();
|
|
142
|
+
return trimmed === "y" || trimmed === "yes";
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
rl.close();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export async function ensureSetupBinary(options) {
|
|
149
|
+
const existingCmd = findExistingBinary();
|
|
150
|
+
if (existingCmd) {
|
|
151
|
+
console.log(`✓ Google Antigravity ACP binary found: ${existingCmd}`);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
const accepted = options?.autoAccept ?? (await promptTermsAcceptance());
|
|
155
|
+
if (!accepted) {
|
|
156
|
+
console.log("\nSetup cancelled: Google Antigravity Terms of Service were not accepted.");
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
console.log(`\nNotice: By downloading, you agree to the Google Antigravity Terms of Service:`);
|
|
160
|
+
console.log(` ${GOOGLE_TERMS_URL}`);
|
|
161
|
+
console.log("\n⬇ Downloading official Google Antigravity ACP binary...");
|
|
162
|
+
try {
|
|
163
|
+
const installed = await ensureAntigravityBinary();
|
|
164
|
+
console.log(`✓ Installed agy_acp_server to ${installed}\n`);
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
console.error(`✗ Failed to download Antigravity ACP binary:`, err);
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export async function runSetup(target = "all", options) {
|
|
173
|
+
const binaryOk = await ensureSetupBinary(options);
|
|
174
|
+
if (!binaryOk) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
119
177
|
const paths = resolvePaths();
|
|
120
178
|
if (target === "paseo") {
|
|
121
179
|
setupPaseo(paths);
|
|
@@ -127,5 +185,6 @@ export async function runSetup(target = "all") {
|
|
|
127
185
|
setupPaseo(paths);
|
|
128
186
|
setupZed(paths);
|
|
129
187
|
}
|
|
188
|
+
return true;
|
|
130
189
|
}
|
|
131
190
|
//# sourceMappingURL=setup.js.map
|
package/dist/src/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAOxE,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,OAA2B,CAAC;IAEhC,yDAAyD;IACzD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrF,IAAI,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACnF,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,qBAAqB,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,IAAa;IACpD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,eAAe,CAAC,GAA4B,EAAE,GAAW;IAChE,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAA4B,CAAC;AAChF,CAAC;AAED,SAAS,qBAAqB;IAC5B,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAuB,YAAY,EAAE,EAAE,aAAa,GAAG,IAAI;IACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAEtD,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;QAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,oCAAoC,CAAC,CAAC;IAE1D,SAAS,CAAC,yBAAyB,CAAC,GAAG;QACrC,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,aAAa;QACpB,OAAO;QACP,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAEvB,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;IAE5D,IAAI,aAAa,EAAE,CAAC;QAClB,qBAAqB,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAuB,YAAY,EAAE;IAC5D,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAE3D,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,oCAAoC,CAAC,CAAC;IAE7F,QAAQ,CAAC,WAAW,GAAG;QACrB,IAAI,EAAE,KAAK;QACX,OAAO;QACP,IAAI;KACL,CAAC;IAEF,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;IAEvB,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,+BAA+B,YAAY,EAAE,CAAC,CAAC;IAE3D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,kCAAkC,CAAC;AAMnE,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB;IAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CACX,oIAAoI,gBAAgB,oFAAoF,CACzO,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC9B,gOAAgO,gBAAgB,oEAAoE,CACrT,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,KAAK,CAAC;IAC9C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAsB;IAC5D,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;IACzC,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,0CAA0C,WAAW,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,EAAE,UAAU,IAAI,CAAC,MAAM,qBAAqB,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,gBAAgB,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iCAAiC,SAAS,IAAI,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,SAAkC,KAAK,EACvC,OAAsB;IAEtB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;SAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC5B,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -159,7 +159,7 @@ 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
|
| [**Forbidden Question Other Option**](src/fixes/missing-question-fallback/index.ts) | **Problem**: Upstream instructs the model not to provide an 'Other' option (`"Do NOT add an 'Other' option to questions"`), stranding users in multiple-choice prompts when none of the choices apply.<br>🔗 [`problem: missing other option`](src/fixes/missing-question-fallback/index.test.ts#L14) | Steers the model to always include an 'Other' choice and appends a fallback 'Other' option to inbound `ask_question` tool calls.<br>🔗 [`solution: option fallback`](src/fixes/missing-question-fallback/index.test.ts#L14) |
|
|
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#
|
|
162
|
+
| [**Premature Empty Turn Stop**](src/fixes/premature-turn-stop/index.ts) | **Problem**: Upstream binary prematurely concludes prompt turns with empty completions (`stopReason=16`) without emitting assistant message chunks, leaving editor UIs frozen in silence.<br>🔗 [`problem: premature turn termination`](src/fixes/premature-turn-stop/index.test.ts#L48) | Injects explicit system prompt steering instructing the model to always emit clear status messages and never terminate turns silently.<br>🔗 [`solution: prompt steering`](src/fixes/premature-turn-stop/index.test.ts#L79) |
|
|
163
163
|
|
|
164
164
|
## Setup
|
|
165
165
|
|
|
@@ -171,6 +171,9 @@ Run the one-line setup command to install and configure both Paseo and Zed:
|
|
|
171
171
|
pnpm add -g @simonepri/refined-antigravity-acp && refined-antigravity-acp setup
|
|
172
172
|
```
|
|
173
173
|
|
|
174
|
+
> [!NOTE]
|
|
175
|
+
> **Google Terms of Service**: The setup command checks if Google's official `agy_acp_server` binary is installed. If missing, it displays a link to the [Google Antigravity Terms of Service](https://antigravity.google/terms) and prompts you to accept them before downloading the binary from Google's CDN (`dl.google.com`). For non-interactive setups or CI, pass `-y` (or `--yes`) to accept automatically: `refined-antigravity-acp setup --yes`.
|
|
176
|
+
|
|
174
177
|
To configure a specific editor only:
|
|
175
178
|
|
|
176
179
|
```bash
|
|
@@ -366,6 +369,19 @@ Every fix pull request must follow this structure:
|
|
|
366
369
|
|
|
367
370
|
---
|
|
368
371
|
|
|
372
|
+
## Terms of Service Notice
|
|
373
|
+
|
|
374
|
+
Google's [Antigravity Additional Terms of Service](https://antigravity.google/terms) restrict using the Service in connection with unauthorized third-party software.
|
|
375
|
+
|
|
376
|
+
Refined Antigravity ACP operates as a local proxy between ACP clients (Paseo, Zed) and Google's official `agy_acp_server` binary:
|
|
377
|
+
|
|
378
|
+
- **What it does**: It supervises the local child process to recover from upstream deadlocks and crashes, repairs orphaned SQLite checkpoints, sanitizes streaming Markdown and diagrams, and injects workspace context and slash skills.
|
|
379
|
+
- **What it does not do**: It does not make direct calls to Google cloud APIs, does not touch, store, or extract OAuth credentials or API keys, and does not bypass server-side quotas or rate limits.
|
|
380
|
+
|
|
381
|
+
As with any third-party editor integration for official binaries, please review Google's Terms of Service to ensure your use complies with the policies applicable to your account.
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
369
385
|
## Disclaimer
|
|
370
386
|
|
|
371
387
|
This is an independent open-source project and is not affiliated with, authorized, or endorsed by Google LLC. "Antigravity", "Gemini", and Google are trademarks of Google LLC.
|