@agentrq/acp-gateway 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -1
- package/dist/__tests__/agentInstall.test.js +342 -0
- package/dist/__tests__/agentInstall.test.js.map +1 -0
- package/dist/__tests__/auth.test.js +283 -0
- package/dist/__tests__/auth.test.js.map +1 -0
- package/dist/__tests__/index.test.js +401 -8
- package/dist/__tests__/index.test.js.map +1 -1
- package/dist/__tests__/registry.test.js +175 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/agentInstall.js +241 -0
- package/dist/agentInstall.js.map +1 -0
- package/dist/auth.js +189 -0
- package/dist/auth.js.map +1 -0
- package/dist/index.js +375 -32
- package/dist/index.js.map +1 -1
- package/dist/mcpClient.js +1 -1
- package/dist/registry.js +118 -0
- package/dist/registry.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { EventEmitter } from "node:events";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { createInterface } from "node:readline/promises";
|
|
5
|
+
import { AUTH_REQUIRED_CODE, authMethodType, describeAuthMethods, isAuthRequiredError, login, logout, pickAuthMethod, promptForAuthMethod, runAuthMethod, runTerminalAuth, supportsLogout, } from "../auth.js";
|
|
6
|
+
vi.mock("node:child_process", () => ({ spawn: vi.fn() }));
|
|
7
|
+
vi.mock("node:readline/promises", () => ({ createInterface: vi.fn() }));
|
|
8
|
+
const spawnMock = vi.mocked(spawn);
|
|
9
|
+
const createInterfaceMock = vi.mocked(createInterface);
|
|
10
|
+
const agentMethod = {
|
|
11
|
+
id: "agent-login",
|
|
12
|
+
name: "Agent login",
|
|
13
|
+
description: "Sign in through the agent",
|
|
14
|
+
};
|
|
15
|
+
const terminalMethod = {
|
|
16
|
+
type: "terminal",
|
|
17
|
+
id: "cli-login",
|
|
18
|
+
name: "CLI login",
|
|
19
|
+
args: ["auth", "login"],
|
|
20
|
+
env: { AUTH_MODE: "interactive" },
|
|
21
|
+
};
|
|
22
|
+
const launch = { command: "gemini", args: ["--acp"], env: { FROM_CONFIG: "1" } };
|
|
23
|
+
/** An `auth_required` refusal as the SDK surfaces it to the caller. */
|
|
24
|
+
function authRequiredError() {
|
|
25
|
+
return Object.assign(new Error("Authentication required: run login first"), {
|
|
26
|
+
code: AUTH_REQUIRED_CODE,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
describe("auth", () => {
|
|
30
|
+
let errorSpy;
|
|
31
|
+
let logSpy;
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
vi.clearAllMocks();
|
|
34
|
+
errorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
35
|
+
logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
36
|
+
});
|
|
37
|
+
afterEach(() => {
|
|
38
|
+
errorSpy.mockRestore();
|
|
39
|
+
logSpy.mockRestore();
|
|
40
|
+
});
|
|
41
|
+
describe("authMethodType", () => {
|
|
42
|
+
it("treats a missing type as the agent-driven default", () => {
|
|
43
|
+
expect(authMethodType(agentMethod)).toBe("agent");
|
|
44
|
+
expect(authMethodType({ ...agentMethod, type: "agent" })).toBe("agent");
|
|
45
|
+
});
|
|
46
|
+
it("recognises terminal methods", () => {
|
|
47
|
+
expect(authMethodType(terminalMethod)).toBe("terminal");
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe("describeAuthMethods", () => {
|
|
51
|
+
it("says so when the agent needs no login", () => {
|
|
52
|
+
expect(describeAuthMethods([])).toMatch(/no authentication methods/);
|
|
53
|
+
expect(describeAuthMethods(undefined)).toMatch(/no authentication methods/);
|
|
54
|
+
expect(describeAuthMethods(null)).toMatch(/no authentication methods/);
|
|
55
|
+
});
|
|
56
|
+
it("numbers the methods and marks terminal ones", () => {
|
|
57
|
+
const text = describeAuthMethods([agentMethod, terminalMethod]);
|
|
58
|
+
expect(text).toContain("1. Agent login (agent-login) — Sign in through the agent");
|
|
59
|
+
expect(text).toContain("2. CLI login (cli-login) [terminal login]");
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe("isAuthRequiredError", () => {
|
|
63
|
+
it("recognises the protocol's auth_required refusal", () => {
|
|
64
|
+
expect(isAuthRequiredError(authRequiredError())).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
it("reads the error out of a nested JSON-RPC envelope", () => {
|
|
67
|
+
expect(isAuthRequiredError({
|
|
68
|
+
error: { code: AUTH_REQUIRED_CODE, message: "auth_required" },
|
|
69
|
+
})).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
it("reads the top level when `error` is not an envelope", () => {
|
|
72
|
+
expect(isAuthRequiredError({
|
|
73
|
+
error: "auth_required",
|
|
74
|
+
code: AUTH_REQUIRED_CODE,
|
|
75
|
+
message: "Authentication required",
|
|
76
|
+
})).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
it("ignores other failures that share the -32000 code", () => {
|
|
79
|
+
expect(isAuthRequiredError(Object.assign(new Error("permission failed"), { code: AUTH_REQUIRED_CODE }))).toBe(false);
|
|
80
|
+
});
|
|
81
|
+
it("ignores errors with a different code or no shape at all", () => {
|
|
82
|
+
expect(isAuthRequiredError(Object.assign(new Error("Authentication required"), { code: -32603 }))).toBe(false);
|
|
83
|
+
expect(isAuthRequiredError({ code: AUTH_REQUIRED_CODE })).toBe(false);
|
|
84
|
+
expect(isAuthRequiredError(new Error("Authentication required"))).toBe(false);
|
|
85
|
+
expect(isAuthRequiredError("nope")).toBe(false);
|
|
86
|
+
expect(isAuthRequiredError(null)).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("pickAuthMethod", () => {
|
|
90
|
+
it("returns nothing when the agent advertises no methods", () => {
|
|
91
|
+
expect(pickAuthMethod([])).toBeUndefined();
|
|
92
|
+
expect(pickAuthMethod(undefined)).toBeUndefined();
|
|
93
|
+
});
|
|
94
|
+
it("honours an explicitly named method, terminal included", () => {
|
|
95
|
+
expect(pickAuthMethod([agentMethod, terminalMethod], { preferredId: "cli-login" })).toBe(terminalMethod);
|
|
96
|
+
});
|
|
97
|
+
it("returns nothing when the named method is not advertised", () => {
|
|
98
|
+
expect(pickAuthMethod([agentMethod], { preferredId: "missing" })).toBeUndefined();
|
|
99
|
+
});
|
|
100
|
+
it("prefers agent-driven methods, which need no human", () => {
|
|
101
|
+
expect(pickAuthMethod([terminalMethod, agentMethod])).toBe(agentMethod);
|
|
102
|
+
});
|
|
103
|
+
it("falls back to a terminal method only when a terminal is available", () => {
|
|
104
|
+
expect(pickAuthMethod([terminalMethod])).toBeUndefined();
|
|
105
|
+
expect(pickAuthMethod([terminalMethod], { allowTerminal: true })).toBe(terminalMethod);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe("promptForAuthMethod", () => {
|
|
109
|
+
it("returns nothing when there is nothing to choose from", async () => {
|
|
110
|
+
expect(await promptForAuthMethod([], vi.fn())).toBeUndefined();
|
|
111
|
+
});
|
|
112
|
+
it("does not ask when the agent offers a single method", async () => {
|
|
113
|
+
const ask = vi.fn();
|
|
114
|
+
expect(await promptForAuthMethod([agentMethod], ask)).toBe(agentMethod);
|
|
115
|
+
expect(ask).not.toHaveBeenCalled();
|
|
116
|
+
});
|
|
117
|
+
it("takes the first method when the user just hits enter", async () => {
|
|
118
|
+
const ask = vi.fn().mockResolvedValue(" ");
|
|
119
|
+
expect(await promptForAuthMethod([agentMethod, terminalMethod], ask)).toBe(agentMethod);
|
|
120
|
+
});
|
|
121
|
+
it("accepts a selection by number", async () => {
|
|
122
|
+
const ask = vi.fn().mockResolvedValue("2");
|
|
123
|
+
expect(await promptForAuthMethod([agentMethod, terminalMethod], ask)).toBe(terminalMethod);
|
|
124
|
+
});
|
|
125
|
+
it("accepts a selection by method id", async () => {
|
|
126
|
+
const ask = vi.fn().mockResolvedValue("cli-login");
|
|
127
|
+
expect(await promptForAuthMethod([agentMethod, terminalMethod], ask)).toBe(terminalMethod);
|
|
128
|
+
});
|
|
129
|
+
it("re-asks after an answer that matches nothing", async () => {
|
|
130
|
+
const ask = vi.fn().mockResolvedValueOnce("99").mockResolvedValueOnce("1");
|
|
131
|
+
expect(await promptForAuthMethod([agentMethod, terminalMethod], ask)).toBe(agentMethod);
|
|
132
|
+
expect(ask).toHaveBeenCalledTimes(2);
|
|
133
|
+
expect(errorSpy).toHaveBeenCalledWith('[auth] "99" is not one of the listed methods.');
|
|
134
|
+
});
|
|
135
|
+
it("gives up after three unusable answers", async () => {
|
|
136
|
+
const ask = vi.fn().mockResolvedValue("nonsense");
|
|
137
|
+
expect(await promptForAuthMethod([agentMethod, terminalMethod], ask)).toBeUndefined();
|
|
138
|
+
expect(ask).toHaveBeenCalledTimes(3);
|
|
139
|
+
});
|
|
140
|
+
it("asks on the terminal when no asker is supplied", async () => {
|
|
141
|
+
const close = vi.fn();
|
|
142
|
+
createInterfaceMock.mockReturnValue({
|
|
143
|
+
question: vi.fn().mockResolvedValue("2"),
|
|
144
|
+
close,
|
|
145
|
+
});
|
|
146
|
+
expect(await promptForAuthMethod([agentMethod, terminalMethod])).toBe(terminalMethod);
|
|
147
|
+
expect(createInterfaceMock).toHaveBeenCalledWith({
|
|
148
|
+
input: process.stdin,
|
|
149
|
+
output: process.stderr,
|
|
150
|
+
});
|
|
151
|
+
expect(close).toHaveBeenCalled();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe("runTerminalAuth", () => {
|
|
155
|
+
it("re-runs the agent invocation with the method's args and env", async () => {
|
|
156
|
+
const child = new EventEmitter();
|
|
157
|
+
spawnMock.mockReturnValue(child);
|
|
158
|
+
const pending = runTerminalAuth(terminalMethod, launch);
|
|
159
|
+
child.emit("exit", 0, null);
|
|
160
|
+
await expect(pending).resolves.toBeUndefined();
|
|
161
|
+
expect(spawnMock).toHaveBeenCalledWith("gemini", ["--acp", "auth", "login"], expect.objectContaining({
|
|
162
|
+
stdio: "inherit",
|
|
163
|
+
env: expect.objectContaining({ FROM_CONFIG: "1", AUTH_MODE: "interactive" }),
|
|
164
|
+
}));
|
|
165
|
+
});
|
|
166
|
+
it("passes no extra args or env when the method declares none", async () => {
|
|
167
|
+
const child = new EventEmitter();
|
|
168
|
+
spawnMock.mockReturnValue(child);
|
|
169
|
+
const pending = runTerminalAuth({ ...agentMethod, type: "terminal" }, {
|
|
170
|
+
command: "gemini",
|
|
171
|
+
args: ["--acp"],
|
|
172
|
+
});
|
|
173
|
+
child.emit("exit", 0, null);
|
|
174
|
+
await pending;
|
|
175
|
+
expect(spawnMock).toHaveBeenCalledWith("gemini", ["--acp"], expect.anything());
|
|
176
|
+
});
|
|
177
|
+
it("fails when the login process exits non-zero", async () => {
|
|
178
|
+
const child = new EventEmitter();
|
|
179
|
+
spawnMock.mockReturnValue(child);
|
|
180
|
+
const pending = runTerminalAuth(terminalMethod, launch);
|
|
181
|
+
child.emit("exit", 1, null);
|
|
182
|
+
await expect(pending).rejects.toThrow(/Terminal login "cli-login" failed \(code=1/);
|
|
183
|
+
});
|
|
184
|
+
it("fails when the login process cannot start", async () => {
|
|
185
|
+
const child = new EventEmitter();
|
|
186
|
+
spawnMock.mockReturnValue(child);
|
|
187
|
+
const pending = runTerminalAuth(terminalMethod, launch);
|
|
188
|
+
child.emit("error", new Error("ENOENT"));
|
|
189
|
+
await expect(pending).rejects.toThrow(/failed to start: ENOENT/);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
describe("runAuthMethod", () => {
|
|
193
|
+
it("asks the agent to authenticate for agent-driven methods", async () => {
|
|
194
|
+
const connection = { authenticate: vi.fn().mockResolvedValue({}), logout: vi.fn() };
|
|
195
|
+
await runAuthMethod(connection, agentMethod, launch);
|
|
196
|
+
expect(connection.authenticate).toHaveBeenCalledWith({ methodId: "agent-login" });
|
|
197
|
+
});
|
|
198
|
+
it("never sends a terminal method to authenticate", async () => {
|
|
199
|
+
const child = new EventEmitter();
|
|
200
|
+
spawnMock.mockReturnValue(child);
|
|
201
|
+
const connection = { authenticate: vi.fn(), logout: vi.fn() };
|
|
202
|
+
const pending = runAuthMethod(connection, terminalMethod, launch);
|
|
203
|
+
child.emit("exit", 0, null);
|
|
204
|
+
await pending;
|
|
205
|
+
expect(connection.authenticate).not.toHaveBeenCalled();
|
|
206
|
+
expect(spawnMock).toHaveBeenCalled();
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
describe("login", () => {
|
|
210
|
+
const connection = () => ({ authenticate: vi.fn().mockResolvedValue({}), logout: vi.fn() });
|
|
211
|
+
it("does nothing when the agent advertises no login", async () => {
|
|
212
|
+
const conn = connection();
|
|
213
|
+
expect(await login({ connection: conn, methods: [], launch })).toBeUndefined();
|
|
214
|
+
expect(conn.authenticate).not.toHaveBeenCalled();
|
|
215
|
+
});
|
|
216
|
+
it("logs in with the method the user named", async () => {
|
|
217
|
+
const conn = connection();
|
|
218
|
+
const used = await login({
|
|
219
|
+
connection: conn,
|
|
220
|
+
methods: [agentMethod, { ...agentMethod, id: "other", name: "Other" }],
|
|
221
|
+
launch,
|
|
222
|
+
preferredId: "other",
|
|
223
|
+
});
|
|
224
|
+
expect(used?.id).toBe("other");
|
|
225
|
+
expect(conn.authenticate).toHaveBeenCalledWith({ methodId: "other" });
|
|
226
|
+
});
|
|
227
|
+
it("rejects a method the agent does not advertise", async () => {
|
|
228
|
+
await expect(login({ connection: connection(), methods: [agentMethod], launch, preferredId: "nope" })).rejects.toThrow(/Unknown authentication method "nope"/);
|
|
229
|
+
});
|
|
230
|
+
it("picks an agent-driven method when running unattended", async () => {
|
|
231
|
+
const conn = connection();
|
|
232
|
+
const used = await login({ connection: conn, methods: [terminalMethod, agentMethod], launch });
|
|
233
|
+
expect(used).toBe(agentMethod);
|
|
234
|
+
});
|
|
235
|
+
it("asks the user which method to use when a terminal is available", async () => {
|
|
236
|
+
const conn = connection();
|
|
237
|
+
const ask = vi.fn().mockResolvedValue("1");
|
|
238
|
+
const used = await login({
|
|
239
|
+
connection: conn,
|
|
240
|
+
methods: [agentMethod, terminalMethod],
|
|
241
|
+
launch,
|
|
242
|
+
interactive: true,
|
|
243
|
+
ask,
|
|
244
|
+
});
|
|
245
|
+
expect(used).toBe(agentMethod);
|
|
246
|
+
expect(ask).toHaveBeenCalled();
|
|
247
|
+
});
|
|
248
|
+
it("fails when only a terminal login is offered and no terminal is available", async () => {
|
|
249
|
+
await expect(login({ connection: connection(), methods: [terminalMethod], launch })).rejects.toThrow(/No usable authentication method/);
|
|
250
|
+
});
|
|
251
|
+
it("fails when the user does not choose a method", async () => {
|
|
252
|
+
await expect(login({
|
|
253
|
+
connection: connection(),
|
|
254
|
+
methods: [agentMethod, terminalMethod],
|
|
255
|
+
launch,
|
|
256
|
+
interactive: true,
|
|
257
|
+
ask: vi.fn().mockResolvedValue("nonsense"),
|
|
258
|
+
})).rejects.toThrow(/No usable authentication method/);
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
describe("supportsLogout", () => {
|
|
262
|
+
it("is true only when the agent advertises the capability", () => {
|
|
263
|
+
expect(supportsLogout({ auth: { logout: {} } })).toBe(true);
|
|
264
|
+
expect(supportsLogout({ auth: { logout: null } })).toBe(false);
|
|
265
|
+
expect(supportsLogout({ auth: {} })).toBe(false);
|
|
266
|
+
expect(supportsLogout({})).toBe(false);
|
|
267
|
+
expect(supportsLogout(undefined)).toBe(false);
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
describe("logout", () => {
|
|
271
|
+
it("skips agents that do not implement logout", async () => {
|
|
272
|
+
const conn = { authenticate: vi.fn(), logout: vi.fn() };
|
|
273
|
+
expect(await logout(conn, {})).toBe(false);
|
|
274
|
+
expect(conn.logout).not.toHaveBeenCalled();
|
|
275
|
+
});
|
|
276
|
+
it("ends the authenticated state when supported", async () => {
|
|
277
|
+
const conn = { authenticate: vi.fn(), logout: vi.fn().mockResolvedValue({}) };
|
|
278
|
+
expect(await logout(conn, { auth: { logout: {} } })).toBe(true);
|
|
279
|
+
expect(conn.logout).toHaveBeenCalledWith({});
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
//# sourceMappingURL=auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/__tests__/auth.test.ts"],"names":[],"mappings":"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"}
|