@agentmeshhq/agent 0.4.1 → 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.
- package/dist/__tests__/bootstrap.test.d.ts +1 -0
- package/dist/__tests__/bootstrap.test.js +39 -0
- package/dist/__tests__/bootstrap.test.js.map +1 -0
- package/dist/__tests__/claims.integration.test.d.ts +1 -0
- package/dist/__tests__/claims.integration.test.js +128 -0
- package/dist/__tests__/claims.integration.test.js.map +1 -0
- package/dist/__tests__/context-template.test.js +15 -0
- package/dist/__tests__/context-template.test.js.map +1 -1
- package/dist/__tests__/handoff-sla.test.d.ts +1 -0
- package/dist/__tests__/handoff-sla.test.js +29 -0
- package/dist/__tests__/handoff-sla.test.js.map +1 -0
- package/dist/__tests__/handoff.integration.test.d.ts +1 -0
- package/dist/__tests__/handoff.integration.test.js +77 -0
- package/dist/__tests__/handoff.integration.test.js.map +1 -0
- package/dist/__tests__/injector.test.js +31 -2
- package/dist/__tests__/injector.test.js.map +1 -1
- package/dist/__tests__/registry.claims.test.d.ts +1 -0
- package/dist/__tests__/registry.claims.test.js +70 -0
- package/dist/__tests__/registry.claims.test.js.map +1 -0
- package/dist/__tests__/registry.retry.test.d.ts +1 -0
- package/dist/__tests__/registry.retry.test.js +33 -0
- package/dist/__tests__/registry.retry.test.js.map +1 -0
- package/dist/__tests__/status.test.d.ts +1 -0
- package/dist/__tests__/status.test.js +55 -0
- package/dist/__tests__/status.test.js.map +1 -0
- package/dist/__tests__/worker.test.d.ts +1 -0
- package/dist/__tests__/worker.test.js +51 -0
- package/dist/__tests__/worker.test.js.map +1 -0
- package/dist/cli/autopilot.d.ts +17 -0
- package/dist/cli/autopilot.js +20 -0
- package/dist/cli/autopilot.js.map +1 -0
- package/dist/cli/claims.d.ts +18 -0
- package/dist/cli/claims.js +133 -0
- package/dist/cli/claims.js.map +1 -0
- package/dist/cli/handoff.d.ts +22 -0
- package/dist/cli/handoff.js +147 -0
- package/dist/cli/handoff.js.map +1 -0
- package/dist/cli/index.js +211 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/start.d.ts +2 -0
- package/dist/cli/start.js +3 -0
- package/dist/cli/start.js.map +1 -1
- package/dist/cli/status.d.ts +14 -1
- package/dist/cli/status.js +46 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/worker.d.ts +2 -0
- package/dist/cli/worker.js +52 -0
- package/dist/cli/worker.js.map +1 -0
- package/dist/config/schema.d.ts +12 -0
- package/dist/core/daemon/bootstrap.d.ts +2 -0
- package/dist/core/daemon/bootstrap.js +10 -1
- package/dist/core/daemon/bootstrap.js.map +1 -1
- package/dist/core/daemon/context-template.d.ts +7 -2
- package/dist/core/daemon/context-template.js +18 -11
- package/dist/core/daemon/context-template.js.map +1 -1
- package/dist/core/daemon/workspace.d.ts +5 -0
- package/dist/core/daemon/workspace.js +47 -7
- package/dist/core/daemon/workspace.js.map +1 -1
- package/dist/core/daemon.d.ts +19 -0
- package/dist/core/daemon.js +286 -20
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/handoff-sla.d.ts +6 -0
- package/dist/core/handoff-sla.js +29 -0
- package/dist/core/handoff-sla.js.map +1 -0
- package/dist/core/injector.js +2 -2
- package/dist/core/injector.js.map +1 -1
- package/dist/core/registry.d.ts +47 -0
- package/dist/core/registry.js +105 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/core/tmux-runtime.js +5 -2
- package/dist/core/tmux-runtime.js.map +1 -1
- package/package.json +12 -11
- 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":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACpC,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;CACnB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,UAAU,EAAE,WAAW,CAAC,UAAU;IAClC,SAAS,EAAE,WAAW,CAAC,SAAS;CACjC,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC;YACrC,MAAM,EAAE,yBAAyB;YACjC,SAAS,EAAE,WAAW;SACvB,CAAC,CAAC;QACH,WAAW,CAAC,SAAS,CAAC,eAAe,CAAC;YACpC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACtE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC1C,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;SACjC,CAAC,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElC,MAAM,mBAAmB,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAEhE,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,sEAAsE,EACtE,MAAM,CAAC,gBAAgB,CAAC;YACtB,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBAC/B,aAAa,EAAE,gBAAgB;aAChC,CAAC;SACH,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACxG,MAAM,SAAS,GAAG,EAAE;aACjB,EAAE,EAAE;aACJ,qBAAqB,CAAC;YACrB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACjB,UAAU,EAAE,SAAS;gBACrB,KAAK,EAAE,gBAAgB;gBACvB,WAAW,EAAE,aAAa;aAC3B,CAAC;SACH,CAAC;aACD,qBAAqB,CAAC;YACrB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;SAC9C,CAAC;aACD,qBAAqB,CAAC;YACrB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;SACjC,CAAC,CAAC;QACL,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElC,MAAM,eAAe,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;QAEpF,MAAM,CAAC,SAAS,CAAC,CAAC,uBAAuB,CACvC,CAAC,EACD,sEAAsE,EACtE,MAAM,CAAC,gBAAgB,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBAC/B,aAAa,EAAE,gBAAgB;aAChC,CAAC;SACH,CAAC,CACH,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,CAAC,uBAAuB,CACvC,CAAC,EACD,8DAA8D,EAC9D,MAAM,CAAC,gBAAgB,CAAC;YACtB,MAAM,EAAE,MAAM;SACf,CAAC,CACH,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,CAAC,uBAAuB,CACvC,CAAC,EACD,sEAAsE,EACtE,MAAM,CAAC,gBAAgB,CAAC;YACtB,MAAM,EAAE,OAAO;SAChB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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;
|
|
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 {};
|