@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,109 @@
1
+ /**
2
+ * Unit tests for registerAgent() — verifies team_id is correctly
3
+ * included/excluded in the registration payload sent to the hub.
4
+ *
5
+ * This guards against the hub/CLI contract drift where team_id was
6
+ * required by the hub for worker agents but never sent by the CLI.
7
+ */
8
+ import { afterEach, describe, expect, it, vi } from "vitest";
9
+ import { registerAgent } from "../core/registry.js";
10
+ const BASE_OPTIONS = {
11
+ url: "https://agentmeshhq.dev",
12
+ apiKey: "test-secret",
13
+ workspace: "agentmesh",
14
+ agentName: "test-agent",
15
+ model: "claude-sonnet-4-5",
16
+ };
17
+ function mockFetch(overrides = {}) {
18
+ const mock = vi.fn().mockResolvedValue({
19
+ ok: overrides.ok ?? true,
20
+ json: async () => ({
21
+ token: "eyJhbGciOiJIUzI1NiJ9.test.token",
22
+ agent_id: "agt_test123",
23
+ status: "registered",
24
+ ...(overrides.body ?? {}),
25
+ }),
26
+ text: async () => JSON.stringify(overrides.body ?? {}),
27
+ });
28
+ vi.stubGlobal("fetch", mock);
29
+ return mock;
30
+ }
31
+ describe("registerAgent — team_id contract", () => {
32
+ afterEach(() => {
33
+ vi.restoreAllMocks();
34
+ vi.unstubAllGlobals();
35
+ });
36
+ it("includes team_id in payload when provided", async () => {
37
+ const fetchMock = mockFetch();
38
+ await registerAgent({ ...BASE_OPTIONS, teamId: "team_abc123" });
39
+ expect(fetchMock).toHaveBeenCalledOnce();
40
+ const [, init] = fetchMock.mock.calls[0];
41
+ const body = JSON.parse(init.body);
42
+ expect(body.team_id).toBe("team_abc123");
43
+ });
44
+ it("omits team_id from payload when not provided", async () => {
45
+ const fetchMock = mockFetch();
46
+ await registerAgent({ ...BASE_OPTIONS });
47
+ const [, init] = fetchMock.mock.calls[0];
48
+ const body = JSON.parse(init.body);
49
+ expect(body).not.toHaveProperty("team_id");
50
+ });
51
+ it("omits team_id when explicitly undefined", async () => {
52
+ const fetchMock = mockFetch();
53
+ await registerAgent({ ...BASE_OPTIONS, teamId: undefined });
54
+ const [, init] = fetchMock.mock.calls[0];
55
+ const body = JSON.parse(init.body);
56
+ expect(body).not.toHaveProperty("team_id");
57
+ });
58
+ it("sends correct agent_type for worker agents", async () => {
59
+ const fetchMock = mockFetch();
60
+ await registerAgent({ ...BASE_OPTIONS, agentType: "worker", teamId: "team_abc123" });
61
+ const [, init] = fetchMock.mock.calls[0];
62
+ const body = JSON.parse(init.body);
63
+ expect(body.agent_type).toBe("worker");
64
+ expect(body.team_id).toBe("team_abc123");
65
+ });
66
+ it("does NOT send team_id for system agents even if teamId is set", async () => {
67
+ const fetchMock = mockFetch();
68
+ await registerAgent({ ...BASE_OPTIONS, agentType: "system", teamId: "team_abc123" });
69
+ const [, init] = fetchMock.mock.calls[0];
70
+ const body = JSON.parse(init.body);
71
+ expect(body.agent_type).toBe("system");
72
+ expect(body).not.toHaveProperty("team_id");
73
+ });
74
+ it("does NOT send team_id for autonomous agents even if teamId is set", async () => {
75
+ const fetchMock = mockFetch();
76
+ await registerAgent({ ...BASE_OPTIONS, agentType: "autonomous", teamId: "team_abc123" });
77
+ const [, init] = fetchMock.mock.calls[0];
78
+ const body = JSON.parse(init.body);
79
+ expect(body.agent_type).toBe("autonomous");
80
+ expect(body).not.toHaveProperty("team_id");
81
+ });
82
+ it("hits the correct endpoint", async () => {
83
+ const fetchMock = mockFetch();
84
+ await registerAgent({ ...BASE_OPTIONS, teamId: "team_abc123" });
85
+ const [url] = fetchMock.mock.calls[0];
86
+ expect(url).toBe("https://agentmeshhq.dev/api/v1/agents/register");
87
+ });
88
+ it("uses x-agentmesh-secret header for auth", async () => {
89
+ const fetchMock = mockFetch();
90
+ await registerAgent({ ...BASE_OPTIONS, apiKey: "my-secret-key", teamId: "team_abc123" });
91
+ const [, init] = fetchMock.mock.calls[0];
92
+ expect(init.headers["x-agentmesh-secret"]).toBe("my-secret-key");
93
+ });
94
+ it("throws when hub returns non-ok response", async () => {
95
+ vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
96
+ ok: false,
97
+ text: async () => JSON.stringify({ error: "team_id is required for worker agent registration" }),
98
+ }));
99
+ await expect(registerAgent({ ...BASE_OPTIONS })).rejects.toThrow("Failed to register agent");
100
+ });
101
+ it("returns agentId and token from response", async () => {
102
+ mockFetch({ body: { token: "tok_abc", agent_id: "agt_xyz", status: "registered" } });
103
+ const result = await registerAgent({ ...BASE_OPTIONS, teamId: "team_abc123" });
104
+ expect(result.token).toBe("tok_abc");
105
+ expect(result.agentId).toBeDefined();
106
+ expect(result.status).toBe("registered");
107
+ });
108
+ });
109
+ //# sourceMappingURL=registry.register.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.register.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.register.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tests for --team-id CLI option wiring:
3
+ * 1. CLI help exposes --team-id flag
4
+ * 2. buildSpawnArgs() includes/excludes --team-id correctly (pure, no spawn mocking needed)
5
+ * 3. Config persistence via upsertAgentConfig
6
+ * 4. Client-side validation: --worker without --team-id exits 1
7
+ * 5. system/autonomous agents do NOT get team_id in registration payload
8
+ */
9
+ export {};
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Tests for --team-id CLI option wiring:
3
+ * 1. CLI help exposes --team-id flag
4
+ * 2. buildSpawnArgs() includes/excludes --team-id correctly (pure, no spawn mocking needed)
5
+ * 3. Config persistence via upsertAgentConfig
6
+ * 4. Client-side validation: --worker without --team-id exits 1
7
+ * 5. system/autonomous agents do NOT get team_id in registration payload
8
+ */
9
+ import { execSync } from "node:child_process";
10
+ import { resolve } from "node:path";
11
+ import { afterEach, describe, expect, it, vi } from "vitest";
12
+ import { buildSpawnArgs } from "../cli/start.js";
13
+ const DIST_CLI = resolve(__dirname, "../../dist/cli/index.js");
14
+ // ---------------------------------------------------------------------------
15
+ // Spawn arg building — pure function, no mocking needed
16
+ // ---------------------------------------------------------------------------
17
+ describe("buildSpawnArgs — --team-id forwarding", () => {
18
+ it("includes --team-id when resolvedTeamId is provided", () => {
19
+ const args = buildSpawnArgs({ name: "forge-dev-1", worker: true }, { resolvedTeamId: "team_fd7i8ii2zjm2" });
20
+ expect(args).toContain("--team-id");
21
+ expect(args).toContain("team_fd7i8ii2zjm2");
22
+ const idx = args.indexOf("--team-id");
23
+ expect(args[idx + 1]).toBe("team_fd7i8ii2zjm2");
24
+ });
25
+ it("omits --team-id when resolvedTeamId is absent", () => {
26
+ const args = buildSpawnArgs({ name: "forge-dev-1", worker: true }, {});
27
+ expect(args).not.toContain("--team-id");
28
+ });
29
+ it("omits --team-id when resolvedTeamId is empty string", () => {
30
+ const args = buildSpawnArgs({ name: "forge-dev-1" }, { resolvedTeamId: "" });
31
+ expect(args).not.toContain("--team-id");
32
+ });
33
+ it("always includes --foreground and --name in spawn args", () => {
34
+ const args = buildSpawnArgs({ name: "my-agent" }, { resolvedTeamId: "team_abc" });
35
+ expect(args).toContain("start");
36
+ expect(args).toContain("--foreground");
37
+ expect(args).toContain("--name");
38
+ expect(args).toContain("my-agent");
39
+ });
40
+ it("includes --worker in spawn args when worker=true", () => {
41
+ const args = buildSpawnArgs({ name: "my-agent", worker: true }, { resolvedTeamId: "team_abc" });
42
+ expect(args).toContain("--worker");
43
+ });
44
+ it("preserves other options alongside --team-id", () => {
45
+ const args = buildSpawnArgs({ name: "my-agent", worker: true, autonomous: true, project: "PROJ" }, { resolvedTeamId: "team_abc", resolvedModel: "claude-sonnet-4-6" });
46
+ expect(args).toContain("--team-id");
47
+ expect(args).toContain("--autonomous");
48
+ expect(args).toContain("--project");
49
+ expect(args).toContain("--model");
50
+ });
51
+ });
52
+ // ---------------------------------------------------------------------------
53
+ // CLI binary — help text and client-side validation
54
+ // ---------------------------------------------------------------------------
55
+ describe("CLI binary — --team-id option", () => {
56
+ it("start --help exposes --team-id flag", () => {
57
+ let output = "";
58
+ try {
59
+ output = execSync(`node "${DIST_CLI}" start --help`, { encoding: "utf-8" });
60
+ }
61
+ catch (err) {
62
+ output = err.stdout ?? "";
63
+ }
64
+ expect(output).toMatch(/--team-id/);
65
+ });
66
+ it("start --worker without --team-id exits with code 1", () => {
67
+ // Provide a minimal config via env so the CLI can load it
68
+ // The validation should fire before any network call
69
+ let exitCode = 0;
70
+ try {
71
+ execSync(`node "${DIST_CLI}" start --name ci-test-agent --worker --foreground`, {
72
+ encoding: "utf-8",
73
+ env: {
74
+ ...process.env,
75
+ HOME: "/tmp/agentmesh-test-no-config",
76
+ },
77
+ });
78
+ }
79
+ catch (err) {
80
+ exitCode = err.status ?? 1;
81
+ }
82
+ // Should exit non-zero (either 1 from our validation or from missing config)
83
+ expect(exitCode).toBeGreaterThan(0);
84
+ });
85
+ });
86
+ // ---------------------------------------------------------------------------
87
+ // Config persistence
88
+ // ---------------------------------------------------------------------------
89
+ describe("start() — teamId config persistence", () => {
90
+ afterEach(() => {
91
+ vi.restoreAllMocks();
92
+ vi.unstubAllGlobals();
93
+ vi.resetModules();
94
+ });
95
+ it("persists teamId to agent config when provided", async () => {
96
+ const loader = await import("../config/loader.js");
97
+ const tmux = await import("../core/tmux.js");
98
+ vi.spyOn(loader, "loadConfig").mockReturnValue({
99
+ apiKey: "key",
100
+ workspace: "agentmesh",
101
+ hubUrl: "https://agentmeshhq.dev",
102
+ defaults: { command: "opencode", model: "claude-sonnet-4-5" },
103
+ agents: [],
104
+ });
105
+ vi.spyOn(loader, "getAgentState").mockReturnValue(undefined);
106
+ vi.spyOn(loader, "upsertAgentConfig").mockImplementation(() => { });
107
+ vi.spyOn(tmux, "getSessionName").mockReturnValue("agentmesh-test-agent");
108
+ vi.spyOn(tmux, "sessionExists").mockReturnValue(false);
109
+ const upsertSpy = vi.spyOn(loader, "upsertAgentConfig");
110
+ const { start } = await import("../cli/start.js");
111
+ await start({ name: "test-agent", worker: true, teamId: "team_fd7i8ii2zjm2" }).catch(() => { });
112
+ expect(upsertSpy).toHaveBeenCalledWith(expect.objectContaining({ teamId: "team_fd7i8ii2zjm2" }));
113
+ });
114
+ it("does not persist teamId when not provided and not in config", async () => {
115
+ vi.resetModules();
116
+ const loader = await import("../config/loader.js");
117
+ const tmux = await import("../core/tmux.js");
118
+ vi.spyOn(loader, "loadConfig").mockReturnValue({
119
+ apiKey: "key",
120
+ workspace: "agentmesh",
121
+ hubUrl: "https://agentmeshhq.dev",
122
+ defaults: { command: "opencode", model: "claude-sonnet-4-5" },
123
+ agents: [],
124
+ });
125
+ vi.spyOn(loader, "getAgentState").mockReturnValue(undefined);
126
+ vi.spyOn(loader, "upsertAgentConfig").mockImplementation(() => { });
127
+ vi.spyOn(tmux, "getSessionName").mockReturnValue("agentmesh-test-agent");
128
+ vi.spyOn(tmux, "sessionExists").mockReturnValue(false);
129
+ const upsertSpy = vi.spyOn(loader, "upsertAgentConfig");
130
+ const { start } = await import("../cli/start.js");
131
+ // Worker without team-id will hit client-side validation and exit(1), so catch
132
+ await start({ name: "test-agent", worker: true }).catch(() => { });
133
+ const call = upsertSpy.mock.calls[0]?.[0];
134
+ if (call) {
135
+ expect(call).not.toHaveProperty("teamId");
136
+ }
137
+ // If upsert wasn't called (exited before), that's also valid — validation fired first
138
+ });
139
+ it("resolves teamId from persisted config when not on CLI", async () => {
140
+ vi.resetModules();
141
+ const loader = await import("../config/loader.js");
142
+ const tmux = await import("../core/tmux.js");
143
+ vi.spyOn(loader, "loadConfig").mockReturnValue({
144
+ apiKey: "key",
145
+ workspace: "agentmesh",
146
+ hubUrl: "https://agentmeshhq.dev",
147
+ defaults: { command: "opencode", model: "claude-sonnet-4-5" },
148
+ agents: [{ name: "test-agent", command: "opencode", teamId: "team_from_config" }],
149
+ });
150
+ vi.spyOn(loader, "getAgentState").mockReturnValue(undefined);
151
+ vi.spyOn(loader, "upsertAgentConfig").mockImplementation(() => { });
152
+ vi.spyOn(tmux, "getSessionName").mockReturnValue("agentmesh-test-agent");
153
+ vi.spyOn(tmux, "sessionExists").mockReturnValue(false);
154
+ const upsertSpy = vi.spyOn(loader, "upsertAgentConfig");
155
+ const { start } = await import("../cli/start.js");
156
+ await start({ name: "test-agent", worker: true }).catch(() => { });
157
+ expect(upsertSpy).toHaveBeenCalledWith(expect.objectContaining({ teamId: "team_from_config" }));
158
+ });
159
+ });
160
+ //# sourceMappingURL=start-team-id.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-team-id.test.js","sourceRoot":"","sources":["../../src/__tests__/start-team-id.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,113 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildInteractiveCommand } from "../core/tmux-runtime.js";
3
+ describe("buildInteractiveCommand", () => {
4
+ // ─── Codex supervised (no --autonomous) ────────────────────────────────────
5
+ it("codex supervised: injects --full-auto", () => {
6
+ const cmd = buildInteractiveCommand("codex", {}, undefined, false);
7
+ expect(cmd).toBe("codex --full-auto");
8
+ });
9
+ it("codex supervised: injects --full-auto when autonomous is omitted", () => {
10
+ const cmd = buildInteractiveCommand("codex", {});
11
+ expect(cmd).toContain("--full-auto");
12
+ });
13
+ // ─── Codex autonomous ───────────────────────────────────────────────────────
14
+ it("codex autonomous: injects --ask-for-approval never --sandbox workspace-write", () => {
15
+ const cmd = buildInteractiveCommand("codex", {}, undefined, true);
16
+ expect(cmd).toContain("--ask-for-approval never");
17
+ expect(cmd).toContain("--sandbox workspace-write");
18
+ expect(cmd).not.toContain("--full-auto");
19
+ });
20
+ // ─── Codex: explicit flags respected (not overwritten) ────────────────────
21
+ it("codex: skips injection if --full-auto already in command", () => {
22
+ const cmd = buildInteractiveCommand("codex --full-auto", {}, undefined, true);
23
+ expect(cmd).not.toContain("--ask-for-approval never");
24
+ });
25
+ it("codex: skips injection if --yolo already in command", () => {
26
+ const cmd = buildInteractiveCommand("codex --yolo", {}, undefined, false);
27
+ expect(cmd).not.toContain("--full-auto");
28
+ });
29
+ it("codex: skips injection if --ask-for-approval already in command", () => {
30
+ const cmd = buildInteractiveCommand("codex --ask-for-approval on-request", {}, undefined, true);
31
+ // existing flag preserved, never not appended
32
+ expect(cmd.split("--ask-for-approval").length - 1).toBe(1);
33
+ });
34
+ it("codex: skips injection if --dangerously-bypass-approvals-and-sandbox already in command", () => {
35
+ const cmd = buildInteractiveCommand("codex --dangerously-bypass-approvals-and-sandbox", {}, undefined, true);
36
+ expect(cmd).not.toContain("--ask-for-approval");
37
+ });
38
+ // ─── Claude supervised ──────────────────────────────────────────────────────
39
+ it("claude supervised: no approval flags injected", () => {
40
+ const cmd = buildInteractiveCommand("claude", {}, undefined, false);
41
+ expect(cmd).toBe("claude");
42
+ expect(cmd).not.toContain("--dangerously-skip-permissions");
43
+ });
44
+ // ─── Claude autonomous ──────────────────────────────────────────────────────
45
+ it("claude autonomous: injects --dangerously-skip-permissions", () => {
46
+ const cmd = buildInteractiveCommand("claude", {}, undefined, true);
47
+ expect(cmd).toContain("--dangerously-skip-permissions");
48
+ });
49
+ // ─── Claude: explicit flags respected ───────────────────────────────────────
50
+ it("claude autonomous: does not duplicate --dangerously-skip-permissions", () => {
51
+ const cmd = buildInteractiveCommand("claude --dangerously-skip-permissions", {}, undefined, true);
52
+ expect((cmd.match(/--dangerously-skip-permissions/g) ?? []).length).toBe(1);
53
+ });
54
+ it("claude autonomous: skips injection if --permission-mode already present", () => {
55
+ const cmd = buildInteractiveCommand("claude --permission-mode plan", {}, undefined, true);
56
+ expect(cmd).not.toContain("--dangerously-skip-permissions");
57
+ });
58
+ it("claude autonomous: skips injection if --allowedTools already present", () => {
59
+ const cmd = buildInteractiveCommand('claude --allowedTools "Bash,Edit"', {}, undefined, true);
60
+ expect(cmd).not.toContain("--dangerously-skip-permissions");
61
+ });
62
+ // ─── OpenCode: never gets approval flags ────────────────────────────────────
63
+ it("opencode supervised: no approval flags injected", () => {
64
+ const cmd = buildInteractiveCommand("opencode", {}, undefined, false);
65
+ expect(cmd).not.toContain("--full-auto");
66
+ expect(cmd).not.toContain("--dangerously-skip-permissions");
67
+ });
68
+ it("opencode autonomous: no approval flags (handles own permissions)", () => {
69
+ const cmd = buildInteractiveCommand("opencode", {}, undefined, true);
70
+ expect(cmd).not.toContain("--full-auto");
71
+ expect(cmd).not.toContain("--dangerously-skip-permissions");
72
+ });
73
+ // ─── Model injection ────────────────────────────────────────────────────────
74
+ it("injects OPENCODE_MODEL when not already in command", () => {
75
+ const cmd = buildInteractiveCommand("opencode", { OPENCODE_MODEL: "claude-opus-4-6" });
76
+ expect(cmd).toContain("--model claude-opus-4-6");
77
+ });
78
+ it("injects CLAUDE_MODEL for claude runner", () => {
79
+ const cmd = buildInteractiveCommand("claude", { CLAUDE_MODEL: "claude-sonnet-4-6" });
80
+ expect(cmd).toContain("--model claude-sonnet-4-6");
81
+ });
82
+ it("injects CODEX_MODEL for codex runner", () => {
83
+ const cmd = buildInteractiveCommand("codex", { CODEX_MODEL: "o3" });
84
+ expect(cmd).toContain("--model o3");
85
+ });
86
+ it("does not inject model if --model already present in command", () => {
87
+ const cmd = buildInteractiveCommand("codex --model o1", { CODEX_MODEL: "o3" });
88
+ expect(cmd).not.toContain("o3");
89
+ expect(cmd).toContain("o1");
90
+ });
91
+ it("does not inject model if -m shorthand already present", () => {
92
+ const cmd = buildInteractiveCommand("opencode -m sonnet", { OPENCODE_MODEL: "opus" });
93
+ expect(cmd).not.toContain("opus");
94
+ });
95
+ // ─── Session resume (OpenCode only) ────────────────────────────────────────
96
+ it("injects --session and --continue for opencode with saved session ID", () => {
97
+ const cmd = buildInteractiveCommand("opencode", {}, "abc-123");
98
+ expect(cmd).toContain("--session abc-123 --continue");
99
+ });
100
+ it("does not inject session flags if --session already in command", () => {
101
+ const cmd = buildInteractiveCommand("opencode --session existing-id", {}, "abc-123");
102
+ expect(cmd).not.toContain("abc-123");
103
+ });
104
+ it("does not inject session flags for claude runner", () => {
105
+ const cmd = buildInteractiveCommand("claude", {}, "abc-123");
106
+ expect(cmd).not.toContain("--session");
107
+ });
108
+ it("does not inject session flags for codex runner", () => {
109
+ const cmd = buildInteractiveCommand("codex", {}, "abc-123");
110
+ expect(cmd).not.toContain("--session");
111
+ });
112
+ });
113
+ //# sourceMappingURL=tmux-runtime.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-runtime.test.js","sourceRoot":"","sources":["../../src/__tests__/tmux-runtime.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * agentmesh auth doctor — Epic #470
3
+ *
4
+ * Diagnoses and optionally repairs per-agent OpenCode auth symlinks.
5
+ * Ensures all agent profiles point to the canonical auth store.
6
+ */
7
+ export interface AuthDoctorOptions {
8
+ repair?: boolean;
9
+ agents?: string[];
10
+ }
11
+ export declare function authDoctor(options?: AuthDoctorOptions): Promise<void>;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * agentmesh auth doctor — Epic #470
3
+ *
4
+ * Diagnoses and optionally repairs per-agent OpenCode auth symlinks.
5
+ * Ensures all agent profiles point to the canonical auth store.
6
+ */
7
+ import pc from "picocolors";
8
+ import { runAuthDoctor } from "../core/auth-guard.js";
9
+ function statusIcon(report) {
10
+ if (report.isValid)
11
+ return pc.green("✓");
12
+ if (report.status === "repaired")
13
+ return pc.yellow("~");
14
+ return pc.red("✗");
15
+ }
16
+ function statusLabel(report) {
17
+ if (report.isValid && report.status !== "repaired")
18
+ return pc.green("ok");
19
+ if (report.status === "repaired")
20
+ return pc.yellow("repaired");
21
+ if (report.status === "no-canonical")
22
+ return pc.red("no-canonical");
23
+ return pc.red("degraded");
24
+ }
25
+ export async function authDoctor(options = {}) {
26
+ const result = runAuthDoctor({
27
+ agentNames: options.agents,
28
+ repair: options.repair,
29
+ });
30
+ console.log("");
31
+ console.log(pc.bold("AgentMesh Auth Doctor"));
32
+ console.log(pc.dim("━".repeat(50)));
33
+ console.log("");
34
+ // Canonical store status
35
+ const canonIcon = result.canonicalValid ? pc.green("✓") : pc.red("✗");
36
+ const canonLabel = result.canonicalValid ? pc.green("valid") : pc.red("missing/invalid");
37
+ console.log(`${canonIcon} Canonical auth: ${pc.dim(result.canonicalAuthPath)} [${canonLabel}]`);
38
+ console.log("");
39
+ if (!result.canonicalValid) {
40
+ console.log(pc.yellow(" Canonical auth.json not found. Run `opencode` interactively to authenticate first."));
41
+ console.log("");
42
+ }
43
+ // Per-agent reports
44
+ if (result.agents.length === 0) {
45
+ console.log(pc.dim(" No agent profiles found under ~/.agentmesh/opencode-data/"));
46
+ }
47
+ else {
48
+ console.log(pc.bold("Per-agent auth:"));
49
+ console.log("");
50
+ for (const agent of result.agents) {
51
+ const icon = statusIcon(agent);
52
+ const label = statusLabel(agent);
53
+ console.log(` ${icon} ${pc.bold(agent.agentName.padEnd(24))} [${label}]`);
54
+ console.log(` ${pc.dim(agent.authPath)}`);
55
+ if (agent.symlinkTarget) {
56
+ console.log(` -> ${pc.dim(agent.symlinkTarget)}`);
57
+ }
58
+ if (!agent.isValid) {
59
+ console.log(` ${pc.red(agent.message)}`);
60
+ }
61
+ console.log("");
62
+ }
63
+ }
64
+ console.log(pc.dim("━".repeat(50)));
65
+ if (result.overallOk) {
66
+ console.log(pc.green("✓ All auth links healthy."));
67
+ }
68
+ else {
69
+ const broken = result.agents.filter((a) => !a.isValid).length;
70
+ const repaired = result.agents.filter((a) => a.status === "repaired").length;
71
+ if (options.repair) {
72
+ if (repaired > 0 && broken - repaired <= 0) {
73
+ console.log(pc.yellow(`~ Repaired ${repaired} agent(s). Auth links now healthy.`));
74
+ }
75
+ else if (broken > 0) {
76
+ console.log(pc.red(`✗ ${broken} agent(s) still degraded after repair attempt.`));
77
+ console.log(pc.dim(" Ensure ~/.local/share/opencode/auth.json exists and is valid JSON."));
78
+ }
79
+ }
80
+ else {
81
+ console.log(pc.yellow(`⚠ ${broken} agent(s) with broken auth links. Run with --repair to fix:`));
82
+ console.log(pc.dim(" agentmesh auth doctor --repair"));
83
+ }
84
+ }
85
+ console.log("");
86
+ // Exit 1 if any agents remain degraded after repair (for scripting)
87
+ const stillBroken = result.agents.filter((a) => !a.isValid && a.status !== "repaired").length;
88
+ if (!result.canonicalValid || stillBroken > 0) {
89
+ process.exitCode = 1;
90
+ }
91
+ }
92
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAA+C,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAOnG,SAAS,UAAU,CAAC,MAAyB;IAC3C,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,MAAyB;IAC5C,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1E,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc;QAAE,OAAO,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACpE,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA6B,EAAE;IAC9D,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,UAAU,EAAE,OAAO,CAAC,MAAM;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,yBAAyB;IACzB,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,oBAAoB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,UAAU,GAAG,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,MAAM,CACP,sFAAsF,CACvF,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACrF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEpC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QAE7E,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,QAAQ,GAAG,CAAC,IAAI,MAAM,GAAG,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,QAAQ,oCAAoC,CAAC,CAAC,CAAC;YACrF,CAAC;iBAAM,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,MAAM,gDAAgD,CAAC,CAAC,CAAC;gBACjF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,MAAM,CAAC,KAAK,MAAM,6DAA6D,CAAC,CACpF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,oEAAoE;IACpE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IAC9F,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}