@agentmeshhq/agent 0.4.0 → 0.4.2

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__/bootstrap.test.d.ts +1 -0
  2. package/dist/__tests__/bootstrap.test.js +39 -0
  3. package/dist/__tests__/bootstrap.test.js.map +1 -0
  4. package/dist/__tests__/claims.integration.test.d.ts +1 -0
  5. package/dist/__tests__/claims.integration.test.js +128 -0
  6. package/dist/__tests__/claims.integration.test.js.map +1 -0
  7. package/dist/__tests__/context-template.test.js +15 -0
  8. package/dist/__tests__/context-template.test.js.map +1 -1
  9. package/dist/__tests__/handoff-sla.test.d.ts +1 -0
  10. package/dist/__tests__/handoff-sla.test.js +29 -0
  11. package/dist/__tests__/handoff-sla.test.js.map +1 -0
  12. package/dist/__tests__/handoff.integration.test.d.ts +1 -0
  13. package/dist/__tests__/handoff.integration.test.js +77 -0
  14. package/dist/__tests__/handoff.integration.test.js.map +1 -0
  15. package/dist/__tests__/injector.test.js +31 -2
  16. package/dist/__tests__/injector.test.js.map +1 -1
  17. package/dist/__tests__/registry.claims.test.d.ts +1 -0
  18. package/dist/__tests__/registry.claims.test.js +70 -0
  19. package/dist/__tests__/registry.claims.test.js.map +1 -0
  20. package/dist/__tests__/registry.retry.test.d.ts +1 -0
  21. package/dist/__tests__/registry.retry.test.js +33 -0
  22. package/dist/__tests__/registry.retry.test.js.map +1 -0
  23. package/dist/__tests__/status.test.d.ts +1 -0
  24. package/dist/__tests__/status.test.js +55 -0
  25. package/dist/__tests__/status.test.js.map +1 -0
  26. package/dist/__tests__/worker.test.d.ts +1 -0
  27. package/dist/__tests__/worker.test.js +51 -0
  28. package/dist/__tests__/worker.test.js.map +1 -0
  29. package/dist/cli/autopilot.d.ts +17 -0
  30. package/dist/cli/autopilot.js +20 -0
  31. package/dist/cli/autopilot.js.map +1 -0
  32. package/dist/cli/claims.d.ts +18 -0
  33. package/dist/cli/claims.js +133 -0
  34. package/dist/cli/claims.js.map +1 -0
  35. package/dist/cli/handoff.d.ts +22 -0
  36. package/dist/cli/handoff.js +147 -0
  37. package/dist/cli/handoff.js.map +1 -0
  38. package/dist/cli/index.js +211 -2
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/cli/start.d.ts +2 -0
  41. package/dist/cli/start.js +3 -0
  42. package/dist/cli/start.js.map +1 -1
  43. package/dist/cli/status.d.ts +14 -1
  44. package/dist/cli/status.js +46 -1
  45. package/dist/cli/status.js.map +1 -1
  46. package/dist/cli/worker.d.ts +2 -0
  47. package/dist/cli/worker.js +52 -0
  48. package/dist/cli/worker.js.map +1 -0
  49. package/dist/config/schema.d.ts +12 -0
  50. package/dist/core/daemon/bootstrap.d.ts +2 -0
  51. package/dist/core/daemon/bootstrap.js +10 -1
  52. package/dist/core/daemon/bootstrap.js.map +1 -1
  53. package/dist/core/daemon/context-template.d.ts +7 -2
  54. package/dist/core/daemon/context-template.js +18 -11
  55. package/dist/core/daemon/context-template.js.map +1 -1
  56. package/dist/core/daemon/workspace.d.ts +5 -0
  57. package/dist/core/daemon/workspace.js +47 -7
  58. package/dist/core/daemon/workspace.js.map +1 -1
  59. package/dist/core/daemon.d.ts +19 -0
  60. package/dist/core/daemon.js +286 -20
  61. package/dist/core/daemon.js.map +1 -1
  62. package/dist/core/handoff-sla.d.ts +6 -0
  63. package/dist/core/handoff-sla.js +29 -0
  64. package/dist/core/handoff-sla.js.map +1 -0
  65. package/dist/core/injector.js +2 -2
  66. package/dist/core/injector.js.map +1 -1
  67. package/dist/core/registry.d.ts +47 -0
  68. package/dist/core/registry.js +105 -0
  69. package/dist/core/registry.js.map +1 -1
  70. package/dist/core/tmux-runtime.js +5 -2
  71. package/dist/core/tmux-runtime.js.map +1 -1
  72. package/package.json +12 -11
  73. package/LICENSE +0 -21
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,39 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import * as loader from "../config/loader.js";
3
+ import { bootstrapDaemon } from "../core/daemon/bootstrap.js";
4
+ describe("daemon bootstrap worker mode inference", () => {
5
+ afterEach(() => {
6
+ vi.restoreAllMocks();
7
+ });
8
+ it("enables worker mode for explicit dev role even without --worker", () => {
9
+ vi.spyOn(loader, "loadConfig").mockReturnValue({
10
+ apiKey: "key",
11
+ workspace: "agentmesh",
12
+ hubUrl: "https://agentmeshhq.dev",
13
+ defaults: { command: "opencode", model: "claude-sonnet-4-5-20250929" },
14
+ agents: [],
15
+ });
16
+ const boot = bootstrapDaemon({
17
+ name: "forge-dev-1",
18
+ role: "dev",
19
+ });
20
+ expect(boot.isWorkerAgent).toBe(true);
21
+ expect(boot.autoAcceptHandoffs).toBe(true);
22
+ });
23
+ it("does not infer worker mode for product-owner role", () => {
24
+ vi.spyOn(loader, "loadConfig").mockReturnValue({
25
+ apiKey: "key",
26
+ workspace: "agentmesh",
27
+ hubUrl: "https://agentmeshhq.dev",
28
+ defaults: { command: "opencode", model: "claude-sonnet-4-5-20250929" },
29
+ agents: [],
30
+ });
31
+ const boot = bootstrapDaemon({
32
+ name: "forge-po",
33
+ role: "product-owner",
34
+ });
35
+ expect(boot.isWorkerAgent).toBe(false);
36
+ expect(boot.autoAcceptHandoffs).toBe(false);
37
+ });
38
+ });
39
+ //# sourceMappingURL=bootstrap.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.test.js","sourceRoot":"","sources":["../../src/__tests__/bootstrap.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC;YAC7C,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,WAAW;YACtB,MAAM,EAAE,yBAAyB;YACjC,QAAQ,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,4BAA4B,EAAE;YACtE,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,eAAe,CAAC;YAC3B,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC;YAC7C,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,WAAW;YACtB,MAAM,EAAE,yBAAyB;YACjC,QAAQ,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,4BAA4B,EAAE;YACtE,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,eAAe,CAAC;YAC3B,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,128 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { createClaim, listClaims, releaseClaim } from "../cli/claims.js";
3
+ const loaderMocks = vi.hoisted(() => ({
4
+ loadConfig: vi.fn(),
5
+ loadState: vi.fn(),
6
+ }));
7
+ vi.mock("../config/loader.js", () => ({
8
+ loadConfig: loaderMocks.loadConfig,
9
+ loadState: loaderMocks.loadState,
10
+ }));
11
+ describe("claims cli integration", () => {
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ loaderMocks.loadConfig.mockReturnValue({
15
+ hubUrl: "https://agentmeshhq.dev",
16
+ workspace: "agentmesh",
17
+ });
18
+ loaderMocks.loadState.mockReturnValue({
19
+ agents: [{ name: "forge-dev-1", agentId: "agt_1", token: "token-1" }],
20
+ });
21
+ });
22
+ afterEach(() => {
23
+ vi.unstubAllGlobals();
24
+ });
25
+ it("creates a claim through workspace-scoped endpoint", async () => {
26
+ const fetchMock = vi.fn().mockResolvedValue({
27
+ ok: true,
28
+ status: 201,
29
+ json: async () => ({ claim_id: "clm_123" }),
30
+ });
31
+ vi.stubGlobal("fetch", fetchMock);
32
+ await createClaim({
33
+ name: "forge-dev-1",
34
+ scope: "Implement feature",
35
+ paths: ["packages/agent/**", "docs/**"],
36
+ ttlSeconds: 600,
37
+ });
38
+ expect(fetchMock).toHaveBeenCalledWith("https://agentmeshhq.dev/api/v1/workspaces/agentmesh/claims", expect.objectContaining({
39
+ method: "POST",
40
+ headers: expect.objectContaining({
41
+ Authorization: "Bearer token-1",
42
+ "Content-Type": "application/json",
43
+ }),
44
+ body: JSON.stringify({
45
+ scope: "Implement feature",
46
+ paths: ["packages/agent/**", "docs/**"],
47
+ ttl_seconds: 600,
48
+ }),
49
+ }));
50
+ });
51
+ it("splits comma-separated paths for claim creation", async () => {
52
+ const fetchMock = vi.fn().mockResolvedValue({
53
+ ok: true,
54
+ status: 201,
55
+ json: async () => ({ claim_id: "clm_123" }),
56
+ });
57
+ vi.stubGlobal("fetch", fetchMock);
58
+ await createClaim({
59
+ name: "forge-dev-1",
60
+ scope: "Implement feature",
61
+ paths: ["packages/agent/**,docs/**", "scripts/**"],
62
+ });
63
+ expect(fetchMock).toHaveBeenCalledWith("https://agentmeshhq.dev/api/v1/workspaces/agentmesh/claims", expect.objectContaining({
64
+ method: "POST",
65
+ body: JSON.stringify({
66
+ scope: "Implement feature",
67
+ paths: ["packages/agent/**", "docs/**", "scripts/**"],
68
+ ttl_seconds: undefined,
69
+ }),
70
+ }));
71
+ });
72
+ it("validates ttl bounds before calling hub", async () => {
73
+ const fetchMock = vi.fn();
74
+ vi.stubGlobal("fetch", fetchMock);
75
+ await expect(createClaim({
76
+ name: "forge-dev-1",
77
+ scope: "Implement feature",
78
+ paths: ["packages/agent/**"],
79
+ ttlSeconds: 10,
80
+ })).rejects.toThrow("ttl-seconds must be an integer between 30 and 86400.");
81
+ expect(fetchMock).not.toHaveBeenCalled();
82
+ });
83
+ it("lists claims from workspace-scoped endpoint", async () => {
84
+ const fetchMock = vi.fn().mockResolvedValue({
85
+ ok: true,
86
+ status: 200,
87
+ json: async () => ({
88
+ data: [
89
+ {
90
+ claim_id: "clm_123",
91
+ workspace_id: "agentmesh",
92
+ agent_id: "agt_1",
93
+ scope: "Implement feature",
94
+ status: "active",
95
+ ttl_seconds: 600,
96
+ expires_at: "2026-03-06T12:00:00.000Z",
97
+ created_at: "2026-03-06T11:00:00.000Z",
98
+ released_at: null,
99
+ paths: ["packages/agent/**"],
100
+ },
101
+ ],
102
+ }),
103
+ });
104
+ vi.stubGlobal("fetch", fetchMock);
105
+ await listClaims({ name: "forge-dev-1", json: true });
106
+ expect(fetchMock).toHaveBeenCalledWith("https://agentmeshhq.dev/api/v1/workspaces/agentmesh/claims", expect.objectContaining({
107
+ headers: expect.objectContaining({
108
+ Authorization: "Bearer token-1",
109
+ }),
110
+ }));
111
+ });
112
+ it("releases a claim through claim-scoped endpoint", async () => {
113
+ const fetchMock = vi.fn().mockResolvedValue({
114
+ ok: true,
115
+ status: 200,
116
+ json: async () => ({ ok: true }),
117
+ });
118
+ vi.stubGlobal("fetch", fetchMock);
119
+ await releaseClaim("clm_123", { name: "forge-dev-1" });
120
+ expect(fetchMock).toHaveBeenCalledWith("https://agentmeshhq.dev/api/v1/claims/clm_123/release", expect.objectContaining({
121
+ method: "POST",
122
+ headers: expect.objectContaining({
123
+ Authorization: "Bearer token-1",
124
+ }),
125
+ }));
126
+ });
127
+ });
128
+ //# sourceMappingURL=claims.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claims.integration.test.js","sourceRoot":"","sources":["../../src/__tests__/claims.integration.test.ts"],"names":[],"mappings":"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"}
@@ -137,6 +137,21 @@ describe("generateClaudeMd", () => {
137
137
  const md = generateClaudeMd(noInstructions);
138
138
  expect(md).not.toContain("Project Instructions");
139
139
  });
140
+ it("renders full hub URLs when options provided", () => {
141
+ const md = generateClaudeMd(baseOnboard, {
142
+ hubUrl: "https://agentmeshhq.dev",
143
+ token: "test-token-123",
144
+ });
145
+ expect(md).toContain("**Hub URL**: `https://agentmeshhq.dev`");
146
+ expect(md).toContain("Authorization: Bearer test-token-123");
147
+ expect(md).toContain("POST https://agentmeshhq.dev/api/v1/workspaces/:workspace/handoffs");
148
+ expect(md).toContain("GET https://agentmeshhq.dev/api/v1/workspaces/:workspace/inbox");
149
+ });
150
+ it("renders relative paths when no options", () => {
151
+ const md = generateClaudeMd(baseOnboard);
152
+ expect(md).not.toContain("Hub URL");
153
+ expect(md).toContain("POST /api/v1/workspaces/:workspace/handoffs");
154
+ });
140
155
  it("handles custom rules", () => {
141
156
  const multiRules = {
142
157
  ...baseOnboard,
@@ -1 +1 @@
1
- {"version":3,"file":"context-template.test.js","sourceRoot":"","sources":["../../src/__tests__/context-template.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-template.test.js","sourceRoot":"","sources":["../../src/__tests__/context-template.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { findPendingHandoffBreaches } from "../core/handoff-sla.js";
3
+ describe("handoff SLA breach detection", () => {
4
+ it("returns pending handoff breaches above SLA sorted by age", () => {
5
+ const now = Date.UTC(2026, 2, 5, 12, 0, 0);
6
+ const result = findPendingHandoffBreaches([
7
+ {
8
+ id: "hnd_old",
9
+ type: "handoff",
10
+ status: "pending",
11
+ from_agent_id: "po",
12
+ scope: "A",
13
+ reason: "A",
14
+ created_at: new Date(now - 20 * 60 * 1000).toISOString(),
15
+ },
16
+ {
17
+ id: "hnd_new",
18
+ type: "handoff",
19
+ status: "pending",
20
+ from_agent_id: "po",
21
+ scope: "B",
22
+ reason: "B",
23
+ created_at: new Date(now - 3 * 60 * 1000).toISOString(),
24
+ },
25
+ ], 5, now);
26
+ expect(result).toEqual([{ handoffId: "hnd_old", ageMinutes: 20 }]);
27
+ });
28
+ });
29
+ //# sourceMappingURL=handoff-sla.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff-sla.test.js","sourceRoot":"","sources":["../../src/__tests__/handoff-sla.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,0BAA0B,CACvC;YACE;gBACE,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;gBACjB,aAAa,EAAE,IAAI;gBACnB,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;aACzD;YACD;gBACE,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;gBACjB,aAAa,EAAE,IAAI;gBACnB,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;aACxD;SACF,EACD,CAAC,EACD,GAAG,CACJ,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,77 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { reassignHandoff, updateHandoffStatus } from "../cli/handoff.js";
3
+ const loaderMocks = vi.hoisted(() => ({
4
+ loadConfig: vi.fn(),
5
+ loadState: vi.fn(),
6
+ }));
7
+ vi.mock("../config/loader.js", () => ({
8
+ loadConfig: loaderMocks.loadConfig,
9
+ loadState: loaderMocks.loadState,
10
+ }));
11
+ describe("handoff cli integration", () => {
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ loaderMocks.loadConfig.mockReturnValue({
15
+ hubUrl: "https://agentmeshhq.dev",
16
+ workspace: "agentmesh",
17
+ });
18
+ loaderMocks.loadState.mockReturnValue({
19
+ agents: [{ name: "forge-dev-1", agentId: "agt_1", token: "token-1" }],
20
+ });
21
+ });
22
+ afterEach(() => {
23
+ vi.unstubAllGlobals();
24
+ });
25
+ it("updates handoff status through workspace-scoped endpoint", async () => {
26
+ const fetchMock = vi.fn().mockResolvedValue({
27
+ ok: true,
28
+ status: 200,
29
+ json: async () => ({ ok: true }),
30
+ });
31
+ vi.stubGlobal("fetch", fetchMock);
32
+ await updateHandoffStatus("hnd_123", "accepted", "forge-dev-1");
33
+ expect(fetchMock).toHaveBeenCalledWith("https://agentmeshhq.dev/api/v1/workspaces/agentmesh/handoffs/hnd_123", expect.objectContaining({
34
+ method: "PATCH",
35
+ headers: expect.objectContaining({
36
+ Authorization: "Bearer token-1",
37
+ }),
38
+ }));
39
+ });
40
+ it("reassigns handoff by reading current details, creating replacement, and rejecting source", async () => {
41
+ const fetchMock = vi
42
+ .fn()
43
+ .mockResolvedValueOnce({
44
+ ok: true,
45
+ status: 200,
46
+ json: async () => ({
47
+ handoff_id: "hnd_123",
48
+ scope: "Original scope",
49
+ to_agent_id: "forge-dev-1",
50
+ }),
51
+ })
52
+ .mockResolvedValueOnce({
53
+ ok: true,
54
+ status: 201,
55
+ json: async () => ({ handoff_id: "hnd_456" }),
56
+ })
57
+ .mockResolvedValueOnce({
58
+ ok: true,
59
+ status: 200,
60
+ json: async () => ({ ok: true }),
61
+ });
62
+ vi.stubGlobal("fetch", fetchMock);
63
+ await reassignHandoff("hnd_123", { name: "forge-dev-1", toAgentId: "forge-dev-2" });
64
+ expect(fetchMock).toHaveBeenNthCalledWith(1, "https://agentmeshhq.dev/api/v1/workspaces/agentmesh/handoffs/hnd_123", expect.objectContaining({
65
+ headers: expect.objectContaining({
66
+ Authorization: "Bearer token-1",
67
+ }),
68
+ }));
69
+ expect(fetchMock).toHaveBeenNthCalledWith(2, "https://agentmeshhq.dev/api/v1/workspaces/agentmesh/handoffs", expect.objectContaining({
70
+ method: "POST",
71
+ }));
72
+ expect(fetchMock).toHaveBeenNthCalledWith(3, "https://agentmeshhq.dev/api/v1/workspaces/agentmesh/handoffs/hnd_123", expect.objectContaining({
73
+ method: "PATCH",
74
+ }));
75
+ });
76
+ });
77
+ //# sourceMappingURL=handoff.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.integration.test.js","sourceRoot":"","sources":["../../src/__tests__/handoff.integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { handleWebSocketEvent } from "../core/injector.js";
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { handleWebSocketEvent, injectInboxItems, injectStartupMessage } from "../core/injector.js";
3
3
  const { sendKeysMock } = vi.hoisted(() => ({
4
4
  sendKeysMock: vi.fn(),
5
5
  }));
@@ -7,6 +7,9 @@ vi.mock("../core/tmux.js", () => ({
7
7
  sendKeys: sendKeysMock,
8
8
  }));
9
9
  describe("injector slack message handling", () => {
10
+ beforeEach(() => {
11
+ sendKeysMock.mockClear();
12
+ });
10
13
  it("injects Slack message event into agent terminal", () => {
11
14
  handleWebSocketEvent("concierge", {
12
15
  type: "slack.message",
@@ -23,4 +26,30 @@ describe("injector slack message handling", () => {
23
26
  expect(injected).toContain("Can you check deployment status?");
24
27
  });
25
28
  });
29
+ describe("injector handoff guidance", () => {
30
+ beforeEach(() => {
31
+ sendKeysMock.mockClear();
32
+ });
33
+ it("startup fallback message points to native inbox command", () => {
34
+ injectStartupMessage("worker-1", 1);
35
+ expect(sendKeysMock).toHaveBeenCalledTimes(1);
36
+ const injected = String(sendKeysMock.mock.calls[0]?.[1] ?? "");
37
+ expect(injected).toContain("agentmesh inbox --type handoff");
38
+ });
39
+ it("inbox items message points to native handoff accept command", () => {
40
+ injectInboxItems("worker-1", [
41
+ {
42
+ id: "hnd_123",
43
+ from_agent_id: "forge-po",
44
+ scope: "Implement CLI command",
45
+ reason: "MVP unblock",
46
+ status: "pending",
47
+ created_at: new Date().toISOString(),
48
+ },
49
+ ]);
50
+ expect(sendKeysMock).toHaveBeenCalledTimes(1);
51
+ const injected = String(sendKeysMock.mock.calls[0]?.[1] ?? "");
52
+ expect(injected).toContain("agentmesh handoff accept <ID>");
53
+ });
54
+ });
26
55
  //# sourceMappingURL=injector.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"injector.test.js","sourceRoot":"","sources":["../../src/__tests__/injector.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,QAAQ,EAAE,YAAY;CACvB,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,oBAAoB,CAAC,WAAW,EAAE;YAChC,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,kCAAkC;YACxC,EAAE,EAAE,iBAAiB;SACtB,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,mEAAmE;QACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"injector.test.js","sourceRoot":"","sources":["../../src/__tests__/injector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,70 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import { createClaim, listClaims, releaseClaim } from "../core/registry.js";
3
+ describe("registry claim APIs", () => {
4
+ afterEach(() => {
5
+ vi.restoreAllMocks();
6
+ });
7
+ it("creates claim with workspace-scoped endpoint", async () => {
8
+ const fetchMock = vi.fn().mockResolvedValue({
9
+ ok: true,
10
+ json: async () => ({ claim_id: "clm_123" }),
11
+ });
12
+ vi.stubGlobal("fetch", fetchMock);
13
+ const result = await createClaim("https://agentmeshhq.dev", "agentmesh", "token", {
14
+ scope: "handoff:hnd_123",
15
+ paths: ["agent/forge-dev-1/workdir/handoff/hnd_123/**"],
16
+ ttlSeconds: 1200,
17
+ });
18
+ expect(result).toEqual({ claimId: "clm_123" });
19
+ expect(fetchMock).toHaveBeenCalledWith("https://agentmeshhq.dev/api/v1/workspaces/agentmesh/claims", expect.objectContaining({
20
+ method: "POST",
21
+ headers: expect.objectContaining({
22
+ Authorization: "Bearer token",
23
+ "Content-Type": "application/json",
24
+ }),
25
+ }));
26
+ });
27
+ it("returns conflict metadata when claim creation conflicts", async () => {
28
+ vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
29
+ status: 409,
30
+ ok: false,
31
+ json: async () => ({ conflict: { claimId: "clm_existing" } }),
32
+ }));
33
+ const result = await createClaim("https://agentmeshhq.dev", "agentmesh", "token", {
34
+ scope: "handoff:hnd_456",
35
+ paths: ["agent/forge-dev-1/workdir/handoff/hnd_456/**"],
36
+ });
37
+ expect(result).toEqual({ conflict: { claimId: "clm_existing" } });
38
+ });
39
+ it("lists claims from workspace endpoint", async () => {
40
+ vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
41
+ ok: true,
42
+ json: async () => ({
43
+ data: [
44
+ {
45
+ claim_id: "clm_1",
46
+ workspace_id: "agentmesh",
47
+ agent_id: "agent-1",
48
+ scope: "handoff:hnd_1",
49
+ status: "active",
50
+ ttl_seconds: 1800,
51
+ expires_at: "2026-03-06 00:00:00",
52
+ created_at: "2026-03-06 00:00:00",
53
+ paths: ["agent/a/**"],
54
+ },
55
+ ],
56
+ }),
57
+ }));
58
+ const claims = await listClaims("https://agentmeshhq.dev", "agentmesh", "token");
59
+ expect(claims).toHaveLength(1);
60
+ expect(claims[0]?.claim_id).toBe("clm_1");
61
+ });
62
+ it("releases claim through release endpoint", async () => {
63
+ vi.stubGlobal("fetch", vi.fn().mockResolvedValue({
64
+ ok: true,
65
+ }));
66
+ const ok = await releaseClaim("https://agentmeshhq.dev", "clm_1", "token");
67
+ expect(ok).toBe(true);
68
+ });
69
+ });
70
+ //# sourceMappingURL=registry.claims.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.claims.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.claims.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import { updateHandoffStatusWithRetry } from "../core/registry.js";
3
+ describe("registry handoff retry", () => {
4
+ afterEach(() => {
5
+ vi.restoreAllMocks();
6
+ vi.unstubAllGlobals();
7
+ });
8
+ it("retries transient failures and eventually succeeds", async () => {
9
+ const fetchMock = vi
10
+ .fn()
11
+ .mockRejectedValueOnce(new Error("network"))
12
+ .mockResolvedValueOnce({ ok: true });
13
+ vi.stubGlobal("fetch", fetchMock);
14
+ const sleep = vi.fn().mockResolvedValue(undefined);
15
+ const ok = await updateHandoffStatusWithRetry("https://agentmeshhq.dev", "agentmesh", "hnd_123", "accepted", "token", { maxRetries: 3, baseBackoffMs: 10, sleep });
16
+ expect(ok).toBe(true);
17
+ expect(fetchMock).toHaveBeenCalledTimes(2);
18
+ expect(sleep).toHaveBeenCalledTimes(1);
19
+ expect(sleep).toHaveBeenCalledWith(10);
20
+ });
21
+ it("returns false when all retries fail", async () => {
22
+ const fetchMock = vi.fn().mockResolvedValue({ ok: false });
23
+ vi.stubGlobal("fetch", fetchMock);
24
+ const sleep = vi.fn().mockResolvedValue(undefined);
25
+ const ok = await updateHandoffStatusWithRetry("https://agentmeshhq.dev", "agentmesh", "hnd_123", "accepted", "token", { maxRetries: 3, baseBackoffMs: 10, sleep });
26
+ expect(ok).toBe(false);
27
+ expect(fetchMock).toHaveBeenCalledTimes(3);
28
+ expect(sleep).toHaveBeenCalledTimes(2);
29
+ expect(sleep).toHaveBeenNthCalledWith(1, 10);
30
+ expect(sleep).toHaveBeenNthCalledWith(2, 20);
31
+ });
32
+ });
33
+ //# sourceMappingURL=registry.retry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.retry.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.retry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEnE,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,SAAS,GAAG,EAAE;aACjB,EAAE,EAAE;aACJ,qBAAqB,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;aAC3C,qBAAqB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElC,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEnD,MAAM,EAAE,GAAG,MAAM,4BAA4B,CAC3C,yBAAyB,EACzB,WAAW,EACX,SAAS,EACT,UAAU,EACV,OAAO,EACP,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,CAC5C,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElC,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEnD,MAAM,EAAE,GAAG,MAAM,4BAA4B,CAC3C,yBAAyB,EACzB,WAAW,EACX,SAAS,EACT,UAAU,EACV,OAAO,EACP,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,CAC5C,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,55 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import { collectPendingHandoffBreaches } from "../cli/status.js";
3
+ describe("status pending handoff SLA detection", () => {
4
+ afterEach(() => {
5
+ vi.unstubAllGlobals();
6
+ });
7
+ it("returns breaches sorted by age descending", async () => {
8
+ const now = Date.now();
9
+ const fetchMock = vi
10
+ .fn()
11
+ .mockResolvedValueOnce({
12
+ ok: true,
13
+ json: async () => ({
14
+ data: [
15
+ {
16
+ id: "hnd_new",
17
+ type: "handoff",
18
+ status: "pending",
19
+ created_at: new Date(now - 2 * 60 * 1000).toISOString(),
20
+ },
21
+ {
22
+ id: "hnd_old",
23
+ type: "handoff",
24
+ status: "pending",
25
+ created_at: new Date(now - 15 * 60 * 1000).toISOString(),
26
+ },
27
+ ],
28
+ }),
29
+ })
30
+ .mockResolvedValueOnce({
31
+ ok: true,
32
+ json: async () => ({
33
+ data: [
34
+ {
35
+ id: "hnd_mid",
36
+ type: "handoff",
37
+ status: "pending",
38
+ created_at: new Date(now - 8 * 60 * 1000).toISOString(),
39
+ },
40
+ ],
41
+ }),
42
+ });
43
+ vi.stubGlobal("fetch", fetchMock);
44
+ const result = await collectPendingHandoffBreaches("https://agentmeshhq.dev", "agentmesh", [
45
+ { name: "worker-1", token: "token-1" },
46
+ { name: "worker-2", token: "token-2" },
47
+ ], 5);
48
+ expect(result).toHaveLength(2);
49
+ expect(result[0]?.handoffId).toBe("hnd_old");
50
+ expect(result[1]?.handoffId).toBe("hnd_mid");
51
+ expect(result[0]?.agentName).toBe("worker-1");
52
+ expect(result[1]?.agentName).toBe("worker-2");
53
+ });
54
+ });
55
+ //# sourceMappingURL=status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../src/__tests__/status.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEjE,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,EAAE;aACjB,EAAE,EAAE;aACJ,qBAAqB,CAAC;YACrB,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACjB,IAAI,EAAE;oBACJ;wBACE,EAAE,EAAE,SAAS;wBACb,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,SAAS;wBACjB,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;qBACxD;oBACD;wBACE,EAAE,EAAE,SAAS;wBACb,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,SAAS;wBACjB,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;qBACzD;iBACF;aACF,CAAC;SACH,CAAC;aACD,qBAAqB,CAAC;YACrB,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACjB,IAAI,EAAE;oBACJ;wBACE,EAAE,EAAE,SAAS;wBACb,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,SAAS;wBACjB,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;qBACxD;iBACF;aACF,CAAC;SACH,CAAC,CAAC;QAEL,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAChD,yBAAyB,EACzB,WAAW,EACX;YACE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE;YACtC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE;SACvC,EACD,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};