@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.
Files changed (73) hide show
  1. package/dist/__tests__/auth-doctor-integration.test.d.ts +14 -0
  2. package/dist/__tests__/auth-doctor-integration.test.js +130 -0
  3. package/dist/__tests__/auth-doctor-integration.test.js.map +1 -0
  4. package/dist/__tests__/auth-guard.integration.test.d.ts +12 -0
  5. package/dist/__tests__/auth-guard.integration.test.js +132 -0
  6. package/dist/__tests__/auth-guard.integration.test.js.map +1 -0
  7. package/dist/__tests__/auth-guard.test.d.ts +17 -0
  8. package/dist/__tests__/auth-guard.test.js +483 -0
  9. package/dist/__tests__/auth-guard.test.js.map +1 -0
  10. package/dist/__tests__/done-state-guard.integration.test.d.ts +1 -0
  11. package/dist/__tests__/done-state-guard.integration.test.js +281 -0
  12. package/dist/__tests__/done-state-guard.integration.test.js.map +1 -0
  13. package/dist/__tests__/done-state-guard.test.d.ts +1 -0
  14. package/dist/__tests__/done-state-guard.test.js +327 -0
  15. package/dist/__tests__/done-state-guard.test.js.map +1 -0
  16. package/dist/__tests__/registry.register.test.d.ts +8 -0
  17. package/dist/__tests__/registry.register.test.js +109 -0
  18. package/dist/__tests__/registry.register.test.js.map +1 -0
  19. package/dist/__tests__/start-team-id.test.d.ts +9 -0
  20. package/dist/__tests__/start-team-id.test.js +160 -0
  21. package/dist/__tests__/start-team-id.test.js.map +1 -0
  22. package/dist/__tests__/tmux-runtime.test.d.ts +1 -0
  23. package/dist/__tests__/tmux-runtime.test.js +113 -0
  24. package/dist/__tests__/tmux-runtime.test.js.map +1 -0
  25. package/dist/cli/auth.d.ts +11 -0
  26. package/dist/cli/auth.js +92 -0
  27. package/dist/cli/auth.js.map +1 -0
  28. package/dist/cli/index.js +132 -1
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/local.d.ts +4 -2
  31. package/dist/cli/local.js +257 -108
  32. package/dist/cli/local.js.map +1 -1
  33. package/dist/cli/migrate.d.ts +1 -0
  34. package/dist/cli/migrate.js +14 -10
  35. package/dist/cli/migrate.js.map +1 -1
  36. package/dist/cli/start.d.ts +11 -0
  37. package/dist/cli/start.js +46 -24
  38. package/dist/cli/start.js.map +1 -1
  39. package/dist/cli/test.d.ts +1 -0
  40. package/dist/cli/test.js +21 -10
  41. package/dist/cli/test.js.map +1 -1
  42. package/dist/cli/watcher.d.ts +27 -0
  43. package/dist/cli/watcher.js +365 -0
  44. package/dist/cli/watcher.js.map +1 -0
  45. package/dist/config/schema.d.ts +13 -0
  46. package/dist/config/schema.js.map +1 -1
  47. package/dist/core/auth-guard.d.ts +155 -0
  48. package/dist/core/auth-guard.js +498 -0
  49. package/dist/core/auth-guard.js.map +1 -0
  50. package/dist/core/auth-sync.d.ts +105 -0
  51. package/dist/core/auth-sync.js +263 -0
  52. package/dist/core/auth-sync.js.map +1 -0
  53. package/dist/core/daemon/context-template.js +65 -0
  54. package/dist/core/daemon/context-template.js.map +1 -1
  55. package/dist/core/daemon/done-state-guard.d.ts +63 -0
  56. package/dist/core/daemon/done-state-guard.js +102 -0
  57. package/dist/core/daemon/done-state-guard.js.map +1 -0
  58. package/dist/core/daemon/tmux-session.d.ts +1 -0
  59. package/dist/core/daemon/tmux-session.js +1 -1
  60. package/dist/core/daemon/tmux-session.js.map +1 -1
  61. package/dist/core/daemon.d.ts +18 -1
  62. package/dist/core/daemon.js +158 -37
  63. package/dist/core/daemon.js.map +1 -1
  64. package/dist/core/registry.d.ts +11 -1
  65. package/dist/core/registry.js +32 -1
  66. package/dist/core/registry.js.map +1 -1
  67. package/dist/core/tmux-runtime.d.ts +11 -2
  68. package/dist/core/tmux-runtime.js +45 -19
  69. package/dist/core/tmux-runtime.js.map +1 -1
  70. package/dist/core/tmux.d.ts +1 -1
  71. package/dist/core/tmux.js +7 -3
  72. package/dist/core/tmux.js.map +1 -1
  73. package/package.json +1 -1
@@ -0,0 +1,498 @@
1
+ /**
2
+ * OpenCode Auth Guard — Epics #470 + #490
3
+ *
4
+ * Implements symlink-first auth linking, startup preflight, schema validation,
5
+ * temp-path rejection, and periodic healthcheck to eliminate per-agent auth
6
+ * drift permanently and guard against runtime auth.type errors.
7
+ *
8
+ * Strategy:
9
+ * 1. Canonical store: ~/.local/share/opencode/auth.json
10
+ * 2. Per-agent auth: ~/.agentmesh/opencode-data/<agent>/opencode/auth.json
11
+ * -> Always a symlink pointing to canonical store (never a temp-path).
12
+ * -> If a stale regular file or temp-path symlink exists, replace safely.
13
+ * -> If canonical missing: write a validated real-file copy as fallback.
14
+ * 3. Schema validation: auth.json must contain a valid `type` field.
15
+ * 4. Startup preflight: validate before runner boot; one auto-repair attempt.
16
+ * 5. Periodic healthcheck: re-validate on interval + exponential backoff.
17
+ */
18
+ import fs from "node:fs";
19
+ import os from "node:os";
20
+ import path from "node:path";
21
+ // ─── Constants ───────────────────────────────────────────────────────────────
22
+ export const CANONICAL_AUTH_PATH = path.join(os.homedir(), ".local", "share", "opencode", "auth.json");
23
+ export const AGENTMESH_OPENCODE_DATA_ROOT = path.join(os.homedir(), ".agentmesh", "opencode-data");
24
+ // Healthcheck interval: 5 minutes
25
+ const HEALTH_CHECK_INTERVAL_MS = 5 * 60 * 1000;
26
+ // Minimum re-check interval on repeated failures (exponential backoff ceiling)
27
+ const MAX_BACKOFF_INTERVAL_MS = 30 * 60 * 1000; // 30 minutes
28
+ // Temp-path prefixes that must never be used as symlink targets (#490)
29
+ const TEMP_PATH_PREFIXES = ["/tmp/", "/var/folders/", os.tmpdir()];
30
+ // ─── Core helpers ────────────────────────────────────────────────────────────
31
+ /**
32
+ * Returns the per-agent auth.json path.
33
+ */
34
+ export function agentAuthPath(agentName) {
35
+ return path.join(AGENTMESH_OPENCODE_DATA_ROOT, agentName, "opencode", "auth.json");
36
+ }
37
+ /**
38
+ * Returns the per-agent opencode dir.
39
+ */
40
+ export function agentOpencodeDir(agentName) {
41
+ return path.join(AGENTMESH_OPENCODE_DATA_ROOT, agentName, "opencode");
42
+ }
43
+ /**
44
+ * Validates that canonical auth.json exists and can be parsed as JSON.
45
+ */
46
+ export function validateCanonicalAuth(canonicalPath = CANONICAL_AUTH_PATH) {
47
+ try {
48
+ if (!fs.existsSync(canonicalPath))
49
+ return false;
50
+ const stat = fs.statSync(canonicalPath);
51
+ if (!stat.isFile())
52
+ return false;
53
+ JSON.parse(fs.readFileSync(canonicalPath, "utf-8"));
54
+ return true;
55
+ }
56
+ catch {
57
+ return false;
58
+ }
59
+ }
60
+ /**
61
+ * Checks whether agentAuthPath is already a valid symlink to a readable target.
62
+ */
63
+ export function isValidAuthSymlink(authPath) {
64
+ try {
65
+ const lstats = fs.lstatSync(authPath);
66
+ if (!lstats.isSymbolicLink())
67
+ return false;
68
+ // Verify the target is readable
69
+ const target = fs.realpathSync(authPath);
70
+ const content = fs.readFileSync(target, "utf-8");
71
+ JSON.parse(content);
72
+ return true;
73
+ }
74
+ catch {
75
+ return false;
76
+ }
77
+ }
78
+ /**
79
+ * Returns true if the given path is a temp/ephemeral path that must not be
80
+ * used as an auth symlink target. (#490)
81
+ */
82
+ export function isTempPath(p) {
83
+ const resolved = path.resolve(p);
84
+ return TEMP_PATH_PREFIXES.some((prefix) => resolved.startsWith(prefix) || resolved === prefix.replace(/\/$/, ""));
85
+ }
86
+ /**
87
+ * Validates that an auth.json file has the minimum required schema:
88
+ * - Parseable JSON
89
+ * - Contains a `type` field (string) — prevents `auth.type undefined` crash (#490)
90
+ *
91
+ * Reads from `authPath` (follows symlinks via readFileSync).
92
+ */
93
+ export function validateAuthSchema(authPath) {
94
+ try {
95
+ const content = fs.readFileSync(authPath, "utf-8");
96
+ const parsed = JSON.parse(content);
97
+ if (typeof parsed !== "object" || parsed === null) {
98
+ return { valid: false, error: "auth.json is not a JSON object" };
99
+ }
100
+ if (!("type" in parsed) || typeof parsed["type"] !== "string" || parsed["type"] === "") {
101
+ return {
102
+ valid: false,
103
+ parsed,
104
+ error: 'auth.json missing required field "type" (string) — agent will crash on auth.type access',
105
+ };
106
+ }
107
+ return { valid: true, parsed };
108
+ }
109
+ catch (err) {
110
+ return { valid: false, error: `Cannot read/parse auth.json: ${err.message}` };
111
+ }
112
+ }
113
+ /**
114
+ * Checks if the symlink at authPath points to a temp path.
115
+ * Returns the target path if it's a temp path, null otherwise. (#490)
116
+ */
117
+ export function getSymlinkTempTarget(authPath) {
118
+ try {
119
+ const lstat = fs.lstatSync(authPath);
120
+ if (!lstat.isSymbolicLink())
121
+ return null;
122
+ const target = fs.readlinkSync(authPath);
123
+ return isTempPath(target) ? target : null;
124
+ }
125
+ catch {
126
+ return null;
127
+ }
128
+ }
129
+ /**
130
+ * Writes a real validated auth file copy from canonical source. (#490)
131
+ *
132
+ * Used as fallback when canonical auth is present but symlinking fails,
133
+ * or as a recovery path when no persistent canonical exists yet.
134
+ * Strips non-Anthropic provider keys (e.g., xai) to keep agent minimal.
135
+ * Sets file permissions to 0o600.
136
+ *
137
+ * Returns true if written successfully.
138
+ */
139
+ export function writeRealAuthFile(authPath, canonicalPath = CANONICAL_AUTH_PATH) {
140
+ try {
141
+ if (!validateCanonicalAuth(canonicalPath)) {
142
+ return { written: false, error: `Canonical auth not valid: ${canonicalPath}` };
143
+ }
144
+ const schema = validateAuthSchema(canonicalPath);
145
+ if (!schema.valid) {
146
+ return { written: false, error: `Canonical auth schema invalid: ${schema.error}` };
147
+ }
148
+ fs.mkdirSync(path.dirname(authPath), { recursive: true });
149
+ let backedUp;
150
+ let existingLstat = null;
151
+ try {
152
+ existingLstat = fs.lstatSync(authPath);
153
+ }
154
+ catch {
155
+ // nothing to back up
156
+ }
157
+ if (existingLstat !== null) {
158
+ if (existingLstat.isSymbolicLink() || existingLstat.isFile()) {
159
+ backedUp = `${authPath}.bak.${Date.now()}`;
160
+ // Can't rename a symlink's target — unlink then skip backup for symlinks
161
+ if (existingLstat.isFile()) {
162
+ fs.renameSync(authPath, backedUp);
163
+ }
164
+ else {
165
+ fs.unlinkSync(authPath);
166
+ backedUp = undefined;
167
+ }
168
+ }
169
+ else {
170
+ fs.rmSync(authPath, { force: true, recursive: true });
171
+ }
172
+ }
173
+ const auth = JSON.parse(fs.readFileSync(canonicalPath, "utf-8"));
174
+ delete auth["xai"]; // strip non-Anthropic keys
175
+ const content = JSON.stringify(auth, null, 2);
176
+ fs.writeFileSync(authPath, content, { mode: 0o600 });
177
+ return { written: true, backedUp };
178
+ }
179
+ catch (err) {
180
+ return { written: false, error: err.message };
181
+ }
182
+ }
183
+ /**
184
+ * Safely replaces agentAuthPath with a symlink to canonicalPath.
185
+ * If a regular file already exists it is backed up first.
186
+ */
187
+ export function linkAgentAuth(authPath, canonicalPath = CANONICAL_AUTH_PATH) {
188
+ try {
189
+ // Ensure parent directory exists
190
+ fs.mkdirSync(path.dirname(authPath), { recursive: true });
191
+ let backedUp;
192
+ // Use lstatSync (not existsSync) so we detect broken symlinks
193
+ let existingLstat = null;
194
+ try {
195
+ existingLstat = fs.lstatSync(authPath);
196
+ }
197
+ catch {
198
+ // File does not exist — nothing to remove
199
+ }
200
+ if (existingLstat !== null) {
201
+ if (existingLstat.isSymbolicLink()) {
202
+ // Remove stale or broken symlink
203
+ fs.unlinkSync(authPath);
204
+ }
205
+ else if (existingLstat.isFile()) {
206
+ // Back up the existing regular file
207
+ backedUp = `${authPath}.bak.${Date.now()}`;
208
+ fs.renameSync(authPath, backedUp);
209
+ }
210
+ else {
211
+ // Unknown type — remove
212
+ fs.rmSync(authPath, { force: true, recursive: true });
213
+ }
214
+ }
215
+ fs.symlinkSync(canonicalPath, authPath);
216
+ return { linked: true, backedUp };
217
+ }
218
+ catch (err) {
219
+ return { linked: false, error: err.message };
220
+ }
221
+ }
222
+ // ─── Primary API ─────────────────────────────────────────────────────────────
223
+ /**
224
+ * Ensures the per-agent auth file is a valid symlink to canonical auth.
225
+ *
226
+ * Epics #470 + #490 hardening:
227
+ * - Rejects temp-path symlink targets (e.g., /tmp/...) and replaces them.
228
+ * - Validates auth schema (auth.type must be present) after linking.
229
+ * - Falls back to writeRealAuthFile() if symlinking fails but canonical is valid.
230
+ *
231
+ * Called from prepareOpenCodeRuntime() on every startup.
232
+ */
233
+ export function ensureAgentAuthLink(agentName) {
234
+ const authPath = agentAuthPath(agentName);
235
+ const canonicalPath = CANONICAL_AUTH_PATH;
236
+ // Fast path: already a valid symlink — but also check for temp-path target (#490)
237
+ if (isValidAuthSymlink(authPath)) {
238
+ const tempTarget = getSymlinkTempTarget(authPath);
239
+ if (tempTarget) {
240
+ // Reject temp-path symlink — fall through to repair
241
+ console.warn(`[AUTH] Rejecting temp-path symlink target: ${tempTarget}`);
242
+ }
243
+ else {
244
+ // Also validate schema to catch auth.type undefined (#490)
245
+ const schema = validateAuthSchema(authPath);
246
+ if (!schema.valid) {
247
+ console.warn(`[AUTH] Schema validation failed: ${schema.error}`);
248
+ // Fall through to repair
249
+ }
250
+ else {
251
+ return {
252
+ status: "ok",
253
+ agentAuthPath: authPath,
254
+ canonicalAuthPath: canonicalPath,
255
+ message: "Auth symlink is valid",
256
+ };
257
+ }
258
+ }
259
+ }
260
+ // Canonical auth must exist for us to link
261
+ if (!validateCanonicalAuth(canonicalPath)) {
262
+ return {
263
+ status: "no-canonical",
264
+ agentAuthPath: authPath,
265
+ canonicalAuthPath: canonicalPath,
266
+ message: `Canonical auth not found or invalid: ${canonicalPath}`,
267
+ };
268
+ }
269
+ // Attempt to create/repair symlink
270
+ const result = linkAgentAuth(authPath, canonicalPath);
271
+ if (result.linked) {
272
+ // Validate schema after linking (#490)
273
+ const schema = validateAuthSchema(authPath);
274
+ if (!schema.valid) {
275
+ return {
276
+ status: "degraded",
277
+ agentAuthPath: authPath,
278
+ canonicalAuthPath: canonicalPath,
279
+ message: `Symlink created but canonical auth schema invalid: ${schema.error}`,
280
+ };
281
+ }
282
+ const backupNote = result.backedUp ? ` (backed up previous file to ${result.backedUp})` : "";
283
+ return {
284
+ status: "repaired",
285
+ agentAuthPath: authPath,
286
+ canonicalAuthPath: canonicalPath,
287
+ message: `Auth symlink created${backupNote}`,
288
+ };
289
+ }
290
+ // Symlinking failed — fall back to writing a real file copy (#490)
291
+ const fallback = writeRealAuthFile(authPath, canonicalPath);
292
+ if (fallback.written) {
293
+ return {
294
+ status: "repaired",
295
+ agentAuthPath: authPath,
296
+ canonicalAuthPath: canonicalPath,
297
+ message: `Auth written as real file (symlink failed): ${result.error}`,
298
+ };
299
+ }
300
+ return {
301
+ status: "degraded",
302
+ agentAuthPath: authPath,
303
+ canonicalAuthPath: canonicalPath,
304
+ message: `Failed to create auth symlink: ${result.error}`,
305
+ };
306
+ }
307
+ /**
308
+ * Startup preflight: ensure auth link and validate once more.
309
+ *
310
+ * Returns true if auth is ready, false if agent should be marked degraded.
311
+ * Performs one auto-repair attempt on failure.
312
+ */
313
+ export function preflightAgentAuth(agentName) {
314
+ const first = ensureAgentAuthLink(agentName);
315
+ // Good states
316
+ if (first.status === "ok" || first.status === "repaired") {
317
+ // Final validation: confirm symlink is readable post-repair
318
+ if (isValidAuthSymlink(first.agentAuthPath)) {
319
+ return { ok: true, result: first };
320
+ }
321
+ // Repaired but symlink still not readable — degrade
322
+ return {
323
+ ok: false,
324
+ result: {
325
+ ...first,
326
+ status: "degraded",
327
+ message: `Symlink created but target is unreadable: ${first.agentAuthPath}`,
328
+ },
329
+ };
330
+ }
331
+ if (first.status === "no-canonical") {
332
+ // Cannot do anything without canonical auth
333
+ return { ok: false, result: first };
334
+ }
335
+ // status === "degraded": one more attempt after a short wait
336
+ const retry = ensureAgentAuthLink(agentName);
337
+ if (retry.status === "repaired" && isValidAuthSymlink(retry.agentAuthPath)) {
338
+ return { ok: true, result: retry };
339
+ }
340
+ return { ok: false, result: retry };
341
+ }
342
+ /**
343
+ * Starts a periodic auth healthcheck for an agent.
344
+ *
345
+ * On failure: emits a structured event and attempts repair.
346
+ * Uses exponential backoff up to MAX_BACKOFF_INTERVAL_MS on repeated failures.
347
+ *
348
+ * @param agentName Agent name
349
+ * @param onEvent Callback for health events (for structured logging/alerting)
350
+ */
351
+ export function startAuthHealthWatcher(agentName, onEvent) {
352
+ let consecutiveFailures = 0;
353
+ let currentInterval = HEALTH_CHECK_INTERVAL_MS;
354
+ let timer = null;
355
+ function schedule() {
356
+ timer = setTimeout(check, currentInterval);
357
+ }
358
+ function check() {
359
+ const authPath = agentAuthPath(agentName);
360
+ if (isValidAuthSymlink(authPath)) {
361
+ // Healthy: reset backoff
362
+ if (consecutiveFailures > 0) {
363
+ consecutiveFailures = 0;
364
+ currentInterval = HEALTH_CHECK_INTERVAL_MS;
365
+ onEvent({
366
+ type: "auth-health-repaired",
367
+ agentName,
368
+ agentAuthPath: authPath,
369
+ message: "Auth symlink healthy again after previous failure",
370
+ timestamp: new Date().toISOString(),
371
+ });
372
+ }
373
+ else {
374
+ onEvent({
375
+ type: "auth-health-ok",
376
+ agentName,
377
+ agentAuthPath: authPath,
378
+ message: "Auth symlink healthy",
379
+ timestamp: new Date().toISOString(),
380
+ });
381
+ }
382
+ }
383
+ else {
384
+ // Unhealthy: attempt repair
385
+ const repairResult = ensureAgentAuthLink(agentName);
386
+ const repaired = (repairResult.status === "ok" || repairResult.status === "repaired") &&
387
+ isValidAuthSymlink(authPath);
388
+ consecutiveFailures++;
389
+ // Exponential backoff: double interval each failure up to ceiling
390
+ currentInterval = Math.min(HEALTH_CHECK_INTERVAL_MS * 2 ** (consecutiveFailures - 1), MAX_BACKOFF_INTERVAL_MS);
391
+ onEvent({
392
+ type: repaired ? "auth-health-repaired" : "auth-health-degraded",
393
+ agentName,
394
+ agentAuthPath: authPath,
395
+ message: repaired
396
+ ? `Auth repaired (consecutive failures before: ${consecutiveFailures - 1})`
397
+ : `Auth degraded (${consecutiveFailures} consecutive failures): ${repairResult.message}`,
398
+ timestamp: new Date().toISOString(),
399
+ });
400
+ }
401
+ schedule();
402
+ }
403
+ schedule();
404
+ return {
405
+ stop() {
406
+ if (timer !== null) {
407
+ clearTimeout(timer);
408
+ timer = null;
409
+ }
410
+ },
411
+ };
412
+ }
413
+ /**
414
+ * Generates a diagnostic report for all agents (or a specific one).
415
+ * If `repair` is true, attempts to fix any broken links.
416
+ */
417
+ export function runAuthDoctor(options) {
418
+ const canonicalValid = validateCanonicalAuth();
419
+ const agents = [];
420
+ // Discover agent names if not specified
421
+ let names = options.agentNames ?? [];
422
+ if (names.length === 0) {
423
+ try {
424
+ if (fs.existsSync(AGENTMESH_OPENCODE_DATA_ROOT)) {
425
+ names = fs.readdirSync(AGENTMESH_OPENCODE_DATA_ROOT).filter((entry) => {
426
+ const p = path.join(AGENTMESH_OPENCODE_DATA_ROOT, entry);
427
+ return fs.statSync(p).isDirectory();
428
+ });
429
+ }
430
+ }
431
+ catch {
432
+ // No agents discovered
433
+ }
434
+ }
435
+ for (const name of names) {
436
+ const authPath = agentAuthPath(name);
437
+ let isSymlink = false;
438
+ let symlinkTarget = null;
439
+ let isValid = false;
440
+ try {
441
+ const lstat = fs.lstatSync(authPath);
442
+ isSymlink = lstat.isSymbolicLink();
443
+ if (isSymlink) {
444
+ try {
445
+ symlinkTarget = fs.readlinkSync(authPath);
446
+ isValid = isValidAuthSymlink(authPath);
447
+ }
448
+ catch {
449
+ symlinkTarget = null;
450
+ }
451
+ }
452
+ else {
453
+ // Regular file — not using symlink model
454
+ isValid = false;
455
+ }
456
+ }
457
+ catch {
458
+ // auth.json doesn't exist at all
459
+ }
460
+ let status = isValid ? "ok" : "degraded";
461
+ let message = isValid
462
+ ? `Symlink -> ${symlinkTarget}`
463
+ : isSymlink
464
+ ? `Broken symlink -> ${symlinkTarget}`
465
+ : "No symlink (regular file or missing)";
466
+ if (options.repair && !isValid && canonicalValid) {
467
+ const repairResult = ensureAgentAuthLink(name);
468
+ if (repairResult.status === "repaired" || repairResult.status === "ok") {
469
+ status = "repaired";
470
+ isValid = true;
471
+ const target = fs.readlinkSync(authPath);
472
+ symlinkTarget = target;
473
+ isSymlink = true;
474
+ message = repairResult.message;
475
+ }
476
+ else {
477
+ status = "degraded";
478
+ message = repairResult.message;
479
+ }
480
+ }
481
+ agents.push({
482
+ agentName: name,
483
+ authPath,
484
+ isSymlink,
485
+ symlinkTarget,
486
+ isValid,
487
+ status,
488
+ message,
489
+ });
490
+ }
491
+ return {
492
+ canonicalAuthPath: CANONICAL_AUTH_PATH,
493
+ canonicalValid,
494
+ agents,
495
+ overallOk: canonicalValid && agents.every((a) => a.isValid),
496
+ };
497
+ }
498
+ //# sourceMappingURL=auth-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../../src/core/auth-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * OpenCode auth sync — symlink-first strategy.
3
+ *
4
+ * Canonical source: ~/.local/share/opencode/auth.json
5
+ * Per-agent target: ~/.agentmesh/opencode-data/<agent>/opencode/auth.json
6
+ *
7
+ * Strategy (in order):
8
+ * 1. If target is already a correct symlink → no-op.
9
+ * 2. If target is a regular file (stale copy) → backup + replace with symlink.
10
+ * 3. If target does not exist → create symlink.
11
+ * 4. If canonical does not exist → no-op (agent must auth manually).
12
+ *
13
+ * On any symlink creation failure (e.g. cross-device) → fall back to copy.
14
+ */
15
+ export declare const CANONICAL_AUTH_PATH: string;
16
+ export interface AuthLinkResult {
17
+ /** What action was taken */
18
+ action: "symlink-ok" | "symlink-created" | "symlink-replaced-file" | "copy-fallback" | "no-op";
19
+ /** Human-readable description */
20
+ message: string;
21
+ /** Whether the agent auth file is now in a good state */
22
+ ok: boolean;
23
+ }
24
+ /**
25
+ * Returns the per-agent auth.json path for the given agent name.
26
+ * Pass `homeDir` to override os.homedir() — useful for testing.
27
+ */
28
+ export declare function agentAuthPath(agentName: string, homeDir?: string): string;
29
+ /**
30
+ * Ensures the per-agent auth.json is a symlink to the canonical source.
31
+ * Safe to call at every agent startup — idempotent.
32
+ *
33
+ * @param agentName - Agent identifier (used to compute per-agent path)
34
+ * @param canonicalPath - Override canonical auth path (default: ~/.local/share/opencode/auth.json)
35
+ * @param homeDir - Override home directory base (default: os.homedir()); useful for tests
36
+ */
37
+ export declare function ensureAuthLink(agentName: string, canonicalPath?: string, homeDir?: string): AuthLinkResult;
38
+ export interface AuthLinkStatus {
39
+ agentName: string;
40
+ authPath: string;
41
+ /** Does the auth file exist (symlink target resolves or copy present)? */
42
+ exists: boolean;
43
+ /** Is it a symlink? */
44
+ isSymlink: boolean;
45
+ /** Does the symlink point to the canonical path? */
46
+ pointsToCanonical: boolean;
47
+ /** Is the canonical auth file present? */
48
+ canonicalExists: boolean;
49
+ /** If symlink, what does it point to? */
50
+ symlinkTarget?: string;
51
+ /** Auth file mtime (for drift detection) */
52
+ mtime?: Date;
53
+ }
54
+ /**
55
+ * Returns diagnostic status for a single agent's auth link.
56
+ *
57
+ * @param agentName - Agent identifier
58
+ * @param canonicalPath - Override canonical auth path (default: ~/.local/share/opencode/auth.json)
59
+ * @param homeDir - Override home directory base (default: os.homedir()); useful for tests
60
+ */
61
+ export declare function getAuthLinkStatus(agentName: string, canonicalPath?: string, homeDir?: string): AuthLinkStatus;
62
+ /**
63
+ * Returns the list of agent names that have opencode-data directories.
64
+ *
65
+ * @param homeDir - Override home directory base (default: os.homedir()); useful for tests
66
+ */
67
+ export declare function listManagedAgents(homeDir?: string): string[];
68
+ /**
69
+ * Repairs ALL managed agents' auth links.
70
+ * Returns per-agent results.
71
+ *
72
+ * @param canonicalPath - Override canonical auth path (default: ~/.local/share/opencode/auth.json)
73
+ * @param homeDir - Override home directory base (default: os.homedir()); useful for tests
74
+ */
75
+ export declare function repairAllAuthLinks(canonicalPath?: string, homeDir?: string): AuthLinkResult[];
76
+ export interface AuthPreflightResult {
77
+ /** Overall pass/fail */
78
+ passed: boolean;
79
+ /** Whether auth link is in good state */
80
+ linkOk: boolean;
81
+ /** Whether canonical auth file is present and readable */
82
+ canonicalOk: boolean;
83
+ /** Whether the auth content looks structurally valid (has at least one provider) */
84
+ contentOk: boolean;
85
+ /** If repair was attempted, the result */
86
+ repairResult?: AuthLinkResult;
87
+ /** Human-readable message */
88
+ message: string;
89
+ }
90
+ /**
91
+ * Startup preflight: verify auth is in good shape, auto-repair if not.
92
+ *
93
+ * Does NOT make a live provider API call (that would slow down every startup).
94
+ * It validates:
95
+ * 1. Canonical auth file exists and is readable
96
+ * 2. Per-agent auth link is correct (symlink → canonical or readable copy)
97
+ * 3. Auth JSON has at least one provider entry
98
+ *
99
+ * If link is bad → auto-repair via ensureAuthLink.
100
+ *
101
+ * @param agentName - Agent identifier
102
+ * @param canonicalPath - Override canonical auth path (default: ~/.local/share/opencode/auth.json)
103
+ * @param homeDir - Override home directory base (default: os.homedir()); useful for tests
104
+ */
105
+ export declare function preflightAuth(agentName: string, canonicalPath?: string, homeDir?: string): AuthPreflightResult;