@agentmeshhq/agent 0.4.6 → 0.4.11
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/__tests__/auth-doctor-integration.test.d.ts +14 -0
- package/dist/__tests__/auth-doctor-integration.test.js +130 -0
- package/dist/__tests__/auth-doctor-integration.test.js.map +1 -0
- package/dist/__tests__/auth-guard.integration.test.d.ts +12 -0
- package/dist/__tests__/auth-guard.integration.test.js +132 -0
- package/dist/__tests__/auth-guard.integration.test.js.map +1 -0
- package/dist/__tests__/auth-guard.test.d.ts +17 -0
- package/dist/__tests__/auth-guard.test.js +483 -0
- package/dist/__tests__/auth-guard.test.js.map +1 -0
- package/dist/__tests__/done-state-guard.integration.test.d.ts +1 -0
- package/dist/__tests__/done-state-guard.integration.test.js +281 -0
- package/dist/__tests__/done-state-guard.integration.test.js.map +1 -0
- package/dist/__tests__/done-state-guard.test.d.ts +1 -0
- package/dist/__tests__/done-state-guard.test.js +327 -0
- package/dist/__tests__/done-state-guard.test.js.map +1 -0
- package/dist/__tests__/registry.register.test.d.ts +8 -0
- package/dist/__tests__/registry.register.test.js +109 -0
- package/dist/__tests__/registry.register.test.js.map +1 -0
- package/dist/__tests__/start-team-id.test.d.ts +9 -0
- package/dist/__tests__/start-team-id.test.js +160 -0
- package/dist/__tests__/start-team-id.test.js.map +1 -0
- package/dist/__tests__/tmux-runtime.test.d.ts +1 -0
- package/dist/__tests__/tmux-runtime.test.js +113 -0
- package/dist/__tests__/tmux-runtime.test.js.map +1 -0
- package/dist/cli/auth.d.ts +11 -0
- package/dist/cli/auth.js +92 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/index.js +132 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/local.d.ts +4 -2
- package/dist/cli/local.js +257 -108
- package/dist/cli/local.js.map +1 -1
- package/dist/cli/migrate.d.ts +1 -0
- package/dist/cli/migrate.js +14 -10
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/start.d.ts +11 -0
- package/dist/cli/start.js +46 -24
- package/dist/cli/start.js.map +1 -1
- package/dist/cli/test.d.ts +1 -0
- package/dist/cli/test.js +21 -10
- package/dist/cli/test.js.map +1 -1
- package/dist/cli/watcher.d.ts +27 -0
- package/dist/cli/watcher.js +365 -0
- package/dist/cli/watcher.js.map +1 -0
- package/dist/config/schema.d.ts +13 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/auth-guard.d.ts +155 -0
- package/dist/core/auth-guard.js +498 -0
- package/dist/core/auth-guard.js.map +1 -0
- package/dist/core/auth-sync.d.ts +105 -0
- package/dist/core/auth-sync.js +263 -0
- package/dist/core/auth-sync.js.map +1 -0
- package/dist/core/daemon/context-template.js +65 -0
- package/dist/core/daemon/context-template.js.map +1 -1
- package/dist/core/daemon/done-state-guard.d.ts +63 -0
- package/dist/core/daemon/done-state-guard.js +102 -0
- package/dist/core/daemon/done-state-guard.js.map +1 -0
- package/dist/core/daemon/tmux-session.d.ts +1 -0
- package/dist/core/daemon/tmux-session.js +1 -1
- package/dist/core/daemon/tmux-session.js.map +1 -1
- package/dist/core/daemon.d.ts +18 -1
- package/dist/core/daemon.js +158 -37
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/registry.d.ts +11 -1
- package/dist/core/registry.js +32 -1
- package/dist/core/registry.js.map +1 -1
- package/dist/core/tmux-runtime.d.ts +11 -2
- package/dist/core/tmux-runtime.js +45 -19
- package/dist/core/tmux-runtime.js.map +1 -1
- package/dist/core/tmux.d.ts +1 -1
- package/dist/core/tmux.js +7 -3
- package/dist/core/tmux.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for auth-guard.ts — Epics #470 + #490
|
|
3
|
+
*
|
|
4
|
+
* Tests:
|
|
5
|
+
* 1. validateCanonicalAuth — detects valid/invalid/missing canonical auth
|
|
6
|
+
* 2. isValidAuthSymlink — detects valid/broken/missing/regular-file symlinks
|
|
7
|
+
* 3. linkAgentAuth — creates symlink, backs up regular files, removes stale symlinks
|
|
8
|
+
* 4. ensureAgentAuthLink — full link-or-repair flow
|
|
9
|
+
* 5. preflightAgentAuth — preflight with retry semantics
|
|
10
|
+
* 6. startAuthHealthWatcher — periodic check, backoff, event emission
|
|
11
|
+
* 7. runAuthDoctor — discovery + optional repair
|
|
12
|
+
* 8. isTempPath — temp path detection (#490)
|
|
13
|
+
* 9. validateAuthSchema — schema validation incl. auth.type field (#490)
|
|
14
|
+
* 10. writeRealAuthFile — real-file fallback when symlinking fails (#490)
|
|
15
|
+
* 11. getSymlinkTempTarget — detects temp-path symlink targets (#490)
|
|
16
|
+
*/
|
|
17
|
+
import fs from "node:fs";
|
|
18
|
+
import os from "node:os";
|
|
19
|
+
import path from "node:path";
|
|
20
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
21
|
+
import { getSymlinkTempTarget, isTempPath, isValidAuthSymlink, linkAgentAuth, preflightAgentAuth, runAuthDoctor, startAuthHealthWatcher, validateAuthSchema, validateCanonicalAuth, writeRealAuthFile, } from "../core/auth-guard.js";
|
|
22
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
23
|
+
function makeTmpDir() {
|
|
24
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), "am-auth-test-"));
|
|
25
|
+
}
|
|
26
|
+
function writeJson(filePath, data) {
|
|
27
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
28
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
|
|
29
|
+
}
|
|
30
|
+
// ─── Tests ────────────────────────────────────────────────────────────────────
|
|
31
|
+
describe("validateCanonicalAuth", () => {
|
|
32
|
+
let tmp;
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
tmp = makeTmpDir();
|
|
35
|
+
});
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
38
|
+
});
|
|
39
|
+
it("returns true for a valid JSON auth file", () => {
|
|
40
|
+
const p = path.join(tmp, "auth.json");
|
|
41
|
+
writeJson(p, { provider: "anthropic", token: "tok_abc" });
|
|
42
|
+
expect(validateCanonicalAuth(p)).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it("returns false when file does not exist", () => {
|
|
45
|
+
expect(validateCanonicalAuth(path.join(tmp, "nonexistent.json"))).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
it("returns false for malformed JSON", () => {
|
|
48
|
+
const p = path.join(tmp, "auth.json");
|
|
49
|
+
fs.writeFileSync(p, "{ invalid json }");
|
|
50
|
+
expect(validateCanonicalAuth(p)).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
it("returns false when path is a directory", () => {
|
|
53
|
+
const d = path.join(tmp, "auth.json");
|
|
54
|
+
fs.mkdirSync(d);
|
|
55
|
+
expect(validateCanonicalAuth(d)).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
59
|
+
describe("isValidAuthSymlink", () => {
|
|
60
|
+
let tmp;
|
|
61
|
+
let canonical;
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
tmp = makeTmpDir();
|
|
64
|
+
canonical = path.join(tmp, "canonical", "auth.json");
|
|
65
|
+
writeJson(canonical, { provider: "anthropic" });
|
|
66
|
+
});
|
|
67
|
+
afterEach(() => {
|
|
68
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
69
|
+
});
|
|
70
|
+
it("returns true for a valid symlink pointing to readable JSON", () => {
|
|
71
|
+
const link = path.join(tmp, "agent", "auth.json");
|
|
72
|
+
fs.mkdirSync(path.dirname(link), { recursive: true });
|
|
73
|
+
fs.symlinkSync(canonical, link);
|
|
74
|
+
expect(isValidAuthSymlink(link)).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
it("returns false when path does not exist", () => {
|
|
77
|
+
expect(isValidAuthSymlink(path.join(tmp, "missing.json"))).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
it("returns false for a regular file (not a symlink)", () => {
|
|
80
|
+
const p = path.join(tmp, "auth.json");
|
|
81
|
+
writeJson(p, { provider: "anthropic" });
|
|
82
|
+
expect(isValidAuthSymlink(p)).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
it("returns false for a broken symlink (target missing)", () => {
|
|
85
|
+
const link = path.join(tmp, "broken.json");
|
|
86
|
+
fs.symlinkSync(path.join(tmp, "ghost.json"), link);
|
|
87
|
+
expect(isValidAuthSymlink(link)).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
it("returns false for a symlink to malformed JSON", () => {
|
|
90
|
+
const bad = path.join(tmp, "bad.json");
|
|
91
|
+
fs.writeFileSync(bad, "not-json");
|
|
92
|
+
const link = path.join(tmp, "link.json");
|
|
93
|
+
fs.symlinkSync(bad, link);
|
|
94
|
+
expect(isValidAuthSymlink(link)).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
98
|
+
describe("linkAgentAuth", () => {
|
|
99
|
+
let tmp;
|
|
100
|
+
let canonical;
|
|
101
|
+
beforeEach(() => {
|
|
102
|
+
tmp = makeTmpDir();
|
|
103
|
+
canonical = path.join(tmp, "canonical", "auth.json");
|
|
104
|
+
writeJson(canonical, { provider: "anthropic" });
|
|
105
|
+
});
|
|
106
|
+
afterEach(() => {
|
|
107
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
108
|
+
});
|
|
109
|
+
it("creates symlink when nothing exists", () => {
|
|
110
|
+
const link = path.join(tmp, "agent", "opencode", "auth.json");
|
|
111
|
+
const result = linkAgentAuth(link, canonical);
|
|
112
|
+
expect(result.linked).toBe(true);
|
|
113
|
+
expect(result.backedUp).toBeUndefined();
|
|
114
|
+
expect(fs.lstatSync(link).isSymbolicLink()).toBe(true);
|
|
115
|
+
expect(fs.readlinkSync(link)).toBe(canonical);
|
|
116
|
+
});
|
|
117
|
+
it("backs up existing regular file before creating symlink", () => {
|
|
118
|
+
const link = path.join(tmp, "agent", "opencode", "auth.json");
|
|
119
|
+
fs.mkdirSync(path.dirname(link), { recursive: true });
|
|
120
|
+
writeJson(link, { stale: true });
|
|
121
|
+
const result = linkAgentAuth(link, canonical);
|
|
122
|
+
expect(result.linked).toBe(true);
|
|
123
|
+
expect(result.backedUp).toBeDefined();
|
|
124
|
+
expect(fs.existsSync(result.backedUp)).toBe(true);
|
|
125
|
+
// Backup should contain the original stale content
|
|
126
|
+
const backed = JSON.parse(fs.readFileSync(result.backedUp, "utf-8"));
|
|
127
|
+
expect(backed.stale).toBe(true);
|
|
128
|
+
// Link now points to canonical
|
|
129
|
+
expect(fs.lstatSync(link).isSymbolicLink()).toBe(true);
|
|
130
|
+
});
|
|
131
|
+
it("replaces a stale symlink pointing to missing target", () => {
|
|
132
|
+
const link = path.join(tmp, "agent", "opencode", "auth.json");
|
|
133
|
+
fs.mkdirSync(path.dirname(link), { recursive: true });
|
|
134
|
+
fs.symlinkSync(path.join(tmp, "ghost.json"), link); // broken symlink
|
|
135
|
+
const result = linkAgentAuth(link, canonical);
|
|
136
|
+
expect(result.linked).toBe(true);
|
|
137
|
+
expect(fs.readlinkSync(link)).toBe(canonical);
|
|
138
|
+
});
|
|
139
|
+
it("returns linked:false when canonical dir does not exist and cannot create", () => {
|
|
140
|
+
// Pass a canonical path under a read-only root that won't be auto-created
|
|
141
|
+
const badCanonical = "/nonexistent/deep/path/auth.json";
|
|
142
|
+
const link = path.join(tmp, "agent", "opencode", "auth.json");
|
|
143
|
+
// The symlink creation itself should work, but we're testing the error path
|
|
144
|
+
// by making the agent dir non-writable
|
|
145
|
+
fs.mkdirSync(path.dirname(link), { recursive: true });
|
|
146
|
+
fs.chmodSync(path.dirname(link), 0o444); // read-only
|
|
147
|
+
const result = linkAgentAuth(link, badCanonical);
|
|
148
|
+
// Restore perms for cleanup
|
|
149
|
+
fs.chmodSync(path.dirname(link), 0o755);
|
|
150
|
+
expect(result.linked).toBe(false);
|
|
151
|
+
expect(result.error).toBeDefined();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
155
|
+
describe("ensureAgentAuthLink", () => {
|
|
156
|
+
let tmp;
|
|
157
|
+
let canonical;
|
|
158
|
+
beforeEach(() => {
|
|
159
|
+
tmp = makeTmpDir();
|
|
160
|
+
canonical = path.join(tmp, "canonical", "auth.json");
|
|
161
|
+
writeJson(canonical, { provider: "anthropic", accessToken: "fresh_token" });
|
|
162
|
+
});
|
|
163
|
+
afterEach(() => {
|
|
164
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
165
|
+
});
|
|
166
|
+
it("returns no-canonical when canonical auth is missing (tested via validateCanonicalAuth)", () => {
|
|
167
|
+
// We can't override CANONICAL_AUTH_PATH constant at runtime without vi.mock,
|
|
168
|
+
// so we test the underlying validator directly — if canonical is missing, validate returns false
|
|
169
|
+
const missingPath = path.join(tmp, "nonexistent", "auth.json");
|
|
170
|
+
expect(validateCanonicalAuth(missingPath)).toBe(false);
|
|
171
|
+
});
|
|
172
|
+
it("returns ok when symlink already valid (idempotent)", () => {
|
|
173
|
+
// Build a valid link manually then call ensure
|
|
174
|
+
const authPath = path.join(tmp, "opencode-data", "agent1", "opencode", "auth.json");
|
|
175
|
+
fs.mkdirSync(path.dirname(authPath), { recursive: true });
|
|
176
|
+
fs.symlinkSync(canonical, authPath);
|
|
177
|
+
// We can't test ensureAgentAuthLink directly without mocking the module constants,
|
|
178
|
+
// so test the primitives that compose it
|
|
179
|
+
expect(isValidAuthSymlink(authPath)).toBe(true);
|
|
180
|
+
const linkResult = linkAgentAuth(authPath, canonical);
|
|
181
|
+
// Calling link again replaces the existing symlink
|
|
182
|
+
expect(linkResult.linked).toBe(true);
|
|
183
|
+
expect(fs.lstatSync(authPath).isSymbolicLink()).toBe(true);
|
|
184
|
+
});
|
|
185
|
+
it("returns repaired when regular file replaced with symlink", () => {
|
|
186
|
+
const authPath = path.join(tmp, "opencode-data", "agent2", "opencode", "auth.json");
|
|
187
|
+
fs.mkdirSync(path.dirname(authPath), { recursive: true });
|
|
188
|
+
writeJson(authPath, { stale: true }); // regular file
|
|
189
|
+
const result = linkAgentAuth(authPath, canonical);
|
|
190
|
+
expect(result.linked).toBe(true);
|
|
191
|
+
expect(result.backedUp).toBeDefined();
|
|
192
|
+
expect(isValidAuthSymlink(authPath)).toBe(true);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
196
|
+
describe("preflightAgentAuth", () => {
|
|
197
|
+
it("returns ok:false with no-canonical when global auth missing", () => {
|
|
198
|
+
// Agent name that won't have a data dir — canonical won't exist either
|
|
199
|
+
const { ok, result } = preflightAgentAuth("__test_agent_no_canonical__");
|
|
200
|
+
// Canonical ~/.local/share/opencode/auth.json is unlikely to be missing in CI,
|
|
201
|
+
// but the agent data dir won't be a valid symlink
|
|
202
|
+
// So either ok or degraded — we mainly confirm it doesn't throw.
|
|
203
|
+
expect(typeof ok).toBe("boolean");
|
|
204
|
+
expect(result.status).toMatch(/ok|repaired|degraded|no-canonical/);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
208
|
+
describe("startAuthHealthWatcher", () => {
|
|
209
|
+
let tmp;
|
|
210
|
+
let canonical;
|
|
211
|
+
beforeEach(() => {
|
|
212
|
+
tmp = makeTmpDir();
|
|
213
|
+
canonical = path.join(tmp, "canonical", "auth.json");
|
|
214
|
+
writeJson(canonical, { provider: "anthropic" });
|
|
215
|
+
vi.useFakeTimers();
|
|
216
|
+
});
|
|
217
|
+
afterEach(() => {
|
|
218
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
219
|
+
vi.useRealTimers();
|
|
220
|
+
});
|
|
221
|
+
it("emits auth-health-ok when symlink is valid on first tick", () => {
|
|
222
|
+
// Build a valid symlink manually for a fake agent
|
|
223
|
+
const authPath = path.join(tmp, "opencode-data", "watcher-agent", "opencode", "auth.json");
|
|
224
|
+
fs.mkdirSync(path.dirname(authPath), { recursive: true });
|
|
225
|
+
fs.symlinkSync(canonical, authPath);
|
|
226
|
+
const events = [];
|
|
227
|
+
// We can't override AGENTMESH_OPENCODE_DATA_ROOT, so we test the watcher
|
|
228
|
+
// by verifying its event model using a dummy agent name that has no data dir
|
|
229
|
+
const watcher = startAuthHealthWatcher("__nonexistent_watcher__", (ev) => {
|
|
230
|
+
events.push(ev.type);
|
|
231
|
+
});
|
|
232
|
+
// Advance past the first healthcheck interval (5 min)
|
|
233
|
+
vi.advanceTimersByTime(5 * 60 * 1000 + 100);
|
|
234
|
+
watcher.stop();
|
|
235
|
+
// Should have fired once — either ok or degraded (no data dir = degraded)
|
|
236
|
+
expect(events.length).toBe(1);
|
|
237
|
+
expect(events[0]).toMatch(/auth-health-ok|auth-health-degraded|auth-health-repaired/);
|
|
238
|
+
});
|
|
239
|
+
it("stops emitting events after stop() is called", () => {
|
|
240
|
+
const events = [];
|
|
241
|
+
const watcher = startAuthHealthWatcher("__stop_test__", (ev) => {
|
|
242
|
+
events.push(ev.type);
|
|
243
|
+
});
|
|
244
|
+
vi.advanceTimersByTime(5 * 60 * 1000 + 100);
|
|
245
|
+
const countAfterFirst = events.length;
|
|
246
|
+
watcher.stop();
|
|
247
|
+
vi.advanceTimersByTime(30 * 60 * 1000);
|
|
248
|
+
// No new events after stop
|
|
249
|
+
expect(events.length).toBe(countAfterFirst);
|
|
250
|
+
});
|
|
251
|
+
it("emits exactly one event per interval tick, not more", () => {
|
|
252
|
+
// Verifies the watcher only fires once per scheduled interval regardless of agent state
|
|
253
|
+
const events = [];
|
|
254
|
+
const watcher = startAuthHealthWatcher("__tick_rate_test__", (ev) => {
|
|
255
|
+
events.push(ev.type);
|
|
256
|
+
});
|
|
257
|
+
// Before first interval: no events
|
|
258
|
+
vi.advanceTimersByTime(4 * 60 * 1000); // 4 min — below 5-min initial interval
|
|
259
|
+
// Events may be 0 or 1 depending on system state (repair may happen immediately at first tick)
|
|
260
|
+
// Key property: advance to just past 5 min and record count
|
|
261
|
+
vi.advanceTimersByTime(1 * 60 * 1000 + 100); // cross 5-min mark
|
|
262
|
+
const afterFirstTick = events.length;
|
|
263
|
+
expect(afterFirstTick).toBeGreaterThanOrEqual(1); // at least 1 event fired
|
|
264
|
+
// Record count now; advance less than the minimum possible next interval (5 min)
|
|
265
|
+
// No new events should fire in a sub-interval window
|
|
266
|
+
const countBefore = events.length;
|
|
267
|
+
vi.advanceTimersByTime(4 * 60 * 1000); // 4 min: less than 5-min minimum
|
|
268
|
+
// If last event was a repair (reset to 5min interval), we haven't crossed 5min yet
|
|
269
|
+
// If last event was degraded (backoff to 10min), we definitely haven't crossed 10min
|
|
270
|
+
// Either way: no new event should have fired in 4 min
|
|
271
|
+
expect(events.length).toBe(countBefore);
|
|
272
|
+
watcher.stop();
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
276
|
+
describe("runAuthDoctor", () => {
|
|
277
|
+
let tmp;
|
|
278
|
+
let canonical;
|
|
279
|
+
beforeEach(() => {
|
|
280
|
+
tmp = makeTmpDir();
|
|
281
|
+
canonical = path.join(tmp, "canonical", "auth.json");
|
|
282
|
+
writeJson(canonical, { provider: "anthropic", accessToken: "tok_fresh" });
|
|
283
|
+
});
|
|
284
|
+
afterEach(() => {
|
|
285
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
286
|
+
});
|
|
287
|
+
it("returns empty agents list when explicit empty agentNames array passed as undefined", () => {
|
|
288
|
+
// runAuthDoctor with explicit agentNames=undefined triggers discovery from real data root,
|
|
289
|
+
// but passing a sentinel list with no matching dirs returns zero agents.
|
|
290
|
+
const report = runAuthDoctor({ agentNames: ["__nonexistent_agent_xyz_123__"] });
|
|
291
|
+
// This agent dir won't exist so auth is degraded/missing, but exactly 1 entry
|
|
292
|
+
expect(report.agents).toHaveLength(1);
|
|
293
|
+
expect(report.agents[0]?.agentName).toBe("__nonexistent_agent_xyz_123__");
|
|
294
|
+
expect(report.agents[0]?.isValid).toBe(false);
|
|
295
|
+
// canonical may or may not be valid depending on the real system
|
|
296
|
+
expect(typeof report.canonicalValid).toBe("boolean");
|
|
297
|
+
});
|
|
298
|
+
it("reports degraded for agent with regular file auth (not symlink)", () => {
|
|
299
|
+
// Build agent data dir with regular file
|
|
300
|
+
const agentDir = path.join(tmp, "opencode-data", "agent-regular");
|
|
301
|
+
const authPath = path.join(agentDir, "opencode", "auth.json");
|
|
302
|
+
fs.mkdirSync(path.dirname(authPath), { recursive: true });
|
|
303
|
+
writeJson(authPath, { stale: true });
|
|
304
|
+
// We can't pass a custom data root to runAuthDoctor without refactoring,
|
|
305
|
+
// so we test the underlying linkAgentAuth that doctor uses internally
|
|
306
|
+
const lstat = fs.lstatSync(authPath);
|
|
307
|
+
expect(lstat.isSymbolicLink()).toBe(false);
|
|
308
|
+
expect(lstat.isFile()).toBe(true);
|
|
309
|
+
});
|
|
310
|
+
it("repair=true replaces regular file with symlink", () => {
|
|
311
|
+
const authPath = path.join(tmp, "opencode-data", "repair-agent", "opencode", "auth.json");
|
|
312
|
+
fs.mkdirSync(path.dirname(authPath), { recursive: true });
|
|
313
|
+
writeJson(authPath, { stale: true });
|
|
314
|
+
// Test the repair primitive directly
|
|
315
|
+
const result = linkAgentAuth(authPath, canonical);
|
|
316
|
+
expect(result.linked).toBe(true);
|
|
317
|
+
expect(result.backedUp).toBeDefined();
|
|
318
|
+
expect(fs.lstatSync(authPath).isSymbolicLink()).toBe(true);
|
|
319
|
+
expect(isValidAuthSymlink(authPath)).toBe(true);
|
|
320
|
+
// Backup file must exist and preserve original content
|
|
321
|
+
const backupContent = JSON.parse(fs.readFileSync(result.backedUp, "utf-8"));
|
|
322
|
+
expect(backupContent.stale).toBe(true);
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
// ─── Epic #490 tests ──────────────────────────────────────────────────────────
|
|
326
|
+
describe("isTempPath (#490)", () => {
|
|
327
|
+
it("returns true for /tmp/ paths", () => {
|
|
328
|
+
expect(isTempPath("/tmp/opencode-auth-12345")).toBe(true);
|
|
329
|
+
expect(isTempPath("/tmp/")).toBe(true);
|
|
330
|
+
});
|
|
331
|
+
it("returns true for os.tmpdir() paths", () => {
|
|
332
|
+
const tmpPath = path.join(os.tmpdir(), "some-auth.json");
|
|
333
|
+
expect(isTempPath(tmpPath)).toBe(true);
|
|
334
|
+
});
|
|
335
|
+
it("returns false for persistent home paths", () => {
|
|
336
|
+
expect(isTempPath(path.join(os.homedir(), ".local", "share", "opencode", "auth.json"))).toBe(false);
|
|
337
|
+
expect(isTempPath(path.join(os.homedir(), ".agentmesh", "opencode-data", "agent", "auth.json"))).toBe(false);
|
|
338
|
+
});
|
|
339
|
+
it("returns false for /var/log (non-temp var path)", () => {
|
|
340
|
+
// /var/log is not a temp folder
|
|
341
|
+
expect(isTempPath("/var/log/somefile")).toBe(false);
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
345
|
+
describe("validateAuthSchema (#490)", () => {
|
|
346
|
+
let tmp;
|
|
347
|
+
beforeEach(() => {
|
|
348
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "am-schema-test-"));
|
|
349
|
+
});
|
|
350
|
+
afterEach(() => {
|
|
351
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
352
|
+
});
|
|
353
|
+
it("returns valid:true for auth with type field", () => {
|
|
354
|
+
const p = path.join(tmp, "auth.json");
|
|
355
|
+
fs.writeFileSync(p, JSON.stringify({ type: "oauth2", accessToken: "tok_abc" }));
|
|
356
|
+
const result = validateAuthSchema(p);
|
|
357
|
+
expect(result.valid).toBe(true);
|
|
358
|
+
expect(result.parsed?.["type"]).toBe("oauth2");
|
|
359
|
+
});
|
|
360
|
+
it("returns valid:false when type field is missing", () => {
|
|
361
|
+
const p = path.join(tmp, "auth.json");
|
|
362
|
+
fs.writeFileSync(p, JSON.stringify({ accessToken: "tok_abc" }));
|
|
363
|
+
const result = validateAuthSchema(p);
|
|
364
|
+
expect(result.valid).toBe(false);
|
|
365
|
+
expect(result.error).toMatch(/type/);
|
|
366
|
+
});
|
|
367
|
+
it("returns valid:false when type field is empty string", () => {
|
|
368
|
+
const p = path.join(tmp, "auth.json");
|
|
369
|
+
fs.writeFileSync(p, JSON.stringify({ type: "", accessToken: "tok" }));
|
|
370
|
+
const result = validateAuthSchema(p);
|
|
371
|
+
expect(result.valid).toBe(false);
|
|
372
|
+
});
|
|
373
|
+
it("returns valid:false when type field is not a string", () => {
|
|
374
|
+
const p = path.join(tmp, "auth.json");
|
|
375
|
+
fs.writeFileSync(p, JSON.stringify({ type: 42 }));
|
|
376
|
+
const result = validateAuthSchema(p);
|
|
377
|
+
expect(result.valid).toBe(false);
|
|
378
|
+
});
|
|
379
|
+
it("returns valid:false for malformed JSON", () => {
|
|
380
|
+
const p = path.join(tmp, "auth.json");
|
|
381
|
+
fs.writeFileSync(p, "{ broken json");
|
|
382
|
+
const result = validateAuthSchema(p);
|
|
383
|
+
expect(result.valid).toBe(false);
|
|
384
|
+
expect(result.error).toMatch(/parse/i);
|
|
385
|
+
});
|
|
386
|
+
it("returns valid:false for non-object JSON", () => {
|
|
387
|
+
const p = path.join(tmp, "auth.json");
|
|
388
|
+
fs.writeFileSync(p, JSON.stringify([1, 2, 3]));
|
|
389
|
+
const result = validateAuthSchema(p);
|
|
390
|
+
expect(result.valid).toBe(false);
|
|
391
|
+
});
|
|
392
|
+
it("returns valid:false when file does not exist", () => {
|
|
393
|
+
const result = validateAuthSchema(path.join(tmp, "nonexistent.json"));
|
|
394
|
+
expect(result.valid).toBe(false);
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
398
|
+
describe("getSymlinkTempTarget (#490)", () => {
|
|
399
|
+
let tmp;
|
|
400
|
+
beforeEach(() => {
|
|
401
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "am-templink-test-"));
|
|
402
|
+
});
|
|
403
|
+
afterEach(() => {
|
|
404
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
405
|
+
});
|
|
406
|
+
it("returns the target when symlink points to a temp path", () => {
|
|
407
|
+
const tempTarget = path.join(os.tmpdir(), "ephemeral-auth.json");
|
|
408
|
+
const link = path.join(tmp, "auth.json");
|
|
409
|
+
fs.symlinkSync(tempTarget, link);
|
|
410
|
+
const result = getSymlinkTempTarget(link);
|
|
411
|
+
expect(result).toBe(tempTarget);
|
|
412
|
+
});
|
|
413
|
+
it("returns null when symlink points to a persistent path", () => {
|
|
414
|
+
const persistentTarget = path.join(os.homedir(), ".local", "share", "opencode", "auth.json");
|
|
415
|
+
const link = path.join(tmp, "auth.json");
|
|
416
|
+
fs.symlinkSync(persistentTarget, link);
|
|
417
|
+
const result = getSymlinkTempTarget(link);
|
|
418
|
+
expect(result).toBeNull();
|
|
419
|
+
});
|
|
420
|
+
it("returns null for a regular file (not a symlink)", () => {
|
|
421
|
+
const p = path.join(tmp, "auth.json");
|
|
422
|
+
fs.writeFileSync(p, "{}");
|
|
423
|
+
expect(getSymlinkTempTarget(p)).toBeNull();
|
|
424
|
+
});
|
|
425
|
+
it("returns null when path does not exist", () => {
|
|
426
|
+
expect(getSymlinkTempTarget(path.join(tmp, "missing.json"))).toBeNull();
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
430
|
+
describe("writeRealAuthFile (#490)", () => {
|
|
431
|
+
let tmp;
|
|
432
|
+
let canonical;
|
|
433
|
+
beforeEach(() => {
|
|
434
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), "am-realfile-test-"));
|
|
435
|
+
canonical = path.join(tmp, "canonical", "auth.json");
|
|
436
|
+
fs.mkdirSync(path.dirname(canonical), { recursive: true });
|
|
437
|
+
fs.writeFileSync(canonical, JSON.stringify({ type: "oauth2", accessToken: "tok_fresh", xai: "strip_me" }));
|
|
438
|
+
});
|
|
439
|
+
afterEach(() => {
|
|
440
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
441
|
+
});
|
|
442
|
+
it("writes a real file from canonical, stripping xai key", () => {
|
|
443
|
+
const dest = path.join(tmp, "agent", "opencode", "auth.json");
|
|
444
|
+
const result = writeRealAuthFile(dest, canonical);
|
|
445
|
+
expect(result.written).toBe(true);
|
|
446
|
+
expect(fs.lstatSync(dest).isFile()).toBe(true);
|
|
447
|
+
expect(fs.lstatSync(dest).isSymbolicLink()).toBe(false);
|
|
448
|
+
const content = JSON.parse(fs.readFileSync(dest, "utf-8"));
|
|
449
|
+
expect(content["type"]).toBe("oauth2");
|
|
450
|
+
expect(content["xai"]).toBeUndefined();
|
|
451
|
+
});
|
|
452
|
+
it("sets file permissions to 0o600", () => {
|
|
453
|
+
const dest = path.join(tmp, "agent2", "opencode", "auth.json");
|
|
454
|
+
writeRealAuthFile(dest, canonical);
|
|
455
|
+
const mode = fs.statSync(dest).mode & 0o777;
|
|
456
|
+
expect(mode).toBe(0o600);
|
|
457
|
+
});
|
|
458
|
+
it("backs up existing regular file before overwriting", () => {
|
|
459
|
+
const dest = path.join(tmp, "agent3", "opencode", "auth.json");
|
|
460
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
461
|
+
fs.writeFileSync(dest, JSON.stringify({ type: "old", stale: true }));
|
|
462
|
+
const result = writeRealAuthFile(dest, canonical);
|
|
463
|
+
expect(result.written).toBe(true);
|
|
464
|
+
expect(result.backedUp).toBeDefined();
|
|
465
|
+
const backed = JSON.parse(fs.readFileSync(result.backedUp, "utf-8"));
|
|
466
|
+
expect(backed.stale).toBe(true);
|
|
467
|
+
});
|
|
468
|
+
it("returns written:false when canonical is missing", () => {
|
|
469
|
+
const dest = path.join(tmp, "agent4", "opencode", "auth.json");
|
|
470
|
+
const result = writeRealAuthFile(dest, path.join(tmp, "nonexistent.json"));
|
|
471
|
+
expect(result.written).toBe(false);
|
|
472
|
+
expect(result.error).toBeDefined();
|
|
473
|
+
});
|
|
474
|
+
it("returns written:false when canonical fails schema validation", () => {
|
|
475
|
+
const badCanonical = path.join(tmp, "bad-canonical.json");
|
|
476
|
+
fs.writeFileSync(badCanonical, JSON.stringify({ accessToken: "no-type-field" }));
|
|
477
|
+
const dest = path.join(tmp, "agent5", "opencode", "auth.json");
|
|
478
|
+
const result = writeRealAuthFile(dest, badCanonical);
|
|
479
|
+
expect(result.written).toBe(false);
|
|
480
|
+
expect(result.error).toMatch(/schema/i);
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
//# sourceMappingURL=auth-guard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-guard.test.js","sourceRoot":"","sources":["../../src/__tests__/auth-guard.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|