@arvoretech/agent-teams-teammate-mcp 0.1.0
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/README.md +38 -0
- package/dist/filelock.js +77 -0
- package/dist/filelock.js.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/server.js +268 -0
- package/dist/server.js.map +1 -0
- package/dist/store.js +195 -0
- package/dist/store.js.map +1 -0
- package/package.json +35 -0
- package/src/filelock.ts +83 -0
- package/src/index.ts +19 -0
- package/src/server.ts +314 -0
- package/src/store.ts +299 -0
- package/tsconfig.json +23 -0
- package/vitest.config.ts +14 -0
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# @arvoretech/agent-teams-teammate-mcp
|
|
2
|
+
|
|
3
|
+
MCP server for **teammates** — claim tasks, communicate with other agents, and publish artifacts.
|
|
4
|
+
|
|
5
|
+
This MCP is injected automatically into each teammate session when spawned by the lead. You don't need to configure it manually.
|
|
6
|
+
|
|
7
|
+
## Tools
|
|
8
|
+
|
|
9
|
+
| Tool | Description |
|
|
10
|
+
|------|-------------|
|
|
11
|
+
| `whoami` | Get identity, role, team objective, and list of other teammates |
|
|
12
|
+
| `list_tasks` | List available tasks, optionally filtered by status |
|
|
13
|
+
| `claim_task` | Claim a pending task (with dependency and lock validation) |
|
|
14
|
+
| `update_task` | Update status or add notes to an owned task |
|
|
15
|
+
| `complete_task` | Mark a task as completed with a summary and touched paths |
|
|
16
|
+
| `send_message` | Message another teammate or the lead |
|
|
17
|
+
| `fetch_messages` | Check for messages (with unread filter) |
|
|
18
|
+
| `ack_messages` | Mark messages as read |
|
|
19
|
+
| `write_artifact` | Publish an artifact (markdown, JSON, or code) linked to a task |
|
|
20
|
+
| `read_artifact` | Read an artifact by ID |
|
|
21
|
+
|
|
22
|
+
## How It Works
|
|
23
|
+
|
|
24
|
+
Each teammate runs as an independent CLI process with its own context window. The teammate MCP provides access to the shared coordination layer:
|
|
25
|
+
|
|
26
|
+
- **Task claiming** uses `mkdir`-based atomic file locking to prevent race conditions
|
|
27
|
+
- **Messaging** supports typed messages: `info`, `question`, `answer`, `blocker`, `decision`
|
|
28
|
+
- **Artifacts** are outputs linked to tasks that the lead or other teammates can read
|
|
29
|
+
|
|
30
|
+
### Environment Variables
|
|
31
|
+
|
|
32
|
+
| Variable | Required | Description |
|
|
33
|
+
|----------|----------|-------------|
|
|
34
|
+
| `TEAMMATE_ID` | Yes | Unique identifier for this teammate (set by the lead) |
|
|
35
|
+
| `TEAMMATE_NAME` | Yes | Display name for this teammate (set by the lead) |
|
|
36
|
+
| `WORKSPACE_PATH` | Yes | Absolute path to the workspace root |
|
|
37
|
+
|
|
38
|
+
All three are set automatically by the lead MCP when spawning a teammate.
|
package/dist/filelock.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { mkdir, rmdir, stat } from "node:fs/promises";
|
|
2
|
+
const STALE_LOCK_MS = 10_000;
|
|
3
|
+
const RETRY_INTERVAL_MS = 50;
|
|
4
|
+
const MAX_WAIT_MS = 5_000;
|
|
5
|
+
async function isLockStale(lockPath) {
|
|
6
|
+
try {
|
|
7
|
+
const info = await stat(lockPath);
|
|
8
|
+
return Date.now() - info.mtimeMs > STALE_LOCK_MS;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async function acquireLock(lockPath) {
|
|
15
|
+
const deadline = Date.now() + MAX_WAIT_MS;
|
|
16
|
+
while (Date.now() < deadline) {
|
|
17
|
+
try {
|
|
18
|
+
await mkdir(lockPath);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
const code = err.code;
|
|
23
|
+
if (code === "EEXIST") {
|
|
24
|
+
if (await isLockStale(lockPath)) {
|
|
25
|
+
try {
|
|
26
|
+
await rmdir(lockPath);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// noop
|
|
30
|
+
}
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
await new Promise((r) => setTimeout(r, RETRY_INTERVAL_MS + Math.random() * 30));
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (!(await isLockStale(lockPath))) {
|
|
40
|
+
throw new Error(`Failed to acquire lock: ${lockPath} (timeout)`);
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
await rmdir(lockPath);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// noop
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
await mkdir(lockPath);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
const code = err.code;
|
|
53
|
+
if (code === "EEXIST") {
|
|
54
|
+
throw new Error(`Failed to acquire lock: ${lockPath} (contention)`);
|
|
55
|
+
}
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function releaseLock(lockPath) {
|
|
60
|
+
try {
|
|
61
|
+
await rmdir(lockPath);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// noop
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function withFileLock(filePath, fn) {
|
|
68
|
+
const lockPath = `${filePath}.lock`;
|
|
69
|
+
await acquireLock(lockPath);
|
|
70
|
+
try {
|
|
71
|
+
return await fn();
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
await releaseLock(lockPath);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=filelock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filelock.js","sourceRoot":"","sources":["../src/filelock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,WAAW,GAAG,KAAK,CAAC;AAE1B,KAAK,UAAU,WAAW,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,QAAgB;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;IAE1C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,CAAC;YAC7C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,IAAI,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC;wBACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACxB,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO;oBACT,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACtB,UAAU,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CACtD,CAAC;gBACF,SAAS;YACX,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,YAAY,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,CAAC;QAC7C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,eAAe,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,EAAoB;IAEpB,MAAM,QAAQ,GAAG,GAAG,QAAQ,OAAO,CAAC;IACpC,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { TeammateMCPServer } from "./server.js";
|
|
3
|
+
const teammateId = process.env.TEAMMATE_ID;
|
|
4
|
+
const teammateName = process.env.TEAMMATE_NAME;
|
|
5
|
+
const workspacePath = process.env.WORKSPACE_PATH || process.cwd();
|
|
6
|
+
if (!teammateId || !teammateName) {
|
|
7
|
+
console.error("Missing required env vars: TEAMMATE_ID, TEAMMATE_NAME");
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
const server = new TeammateMCPServer(workspacePath, teammateId, teammateName);
|
|
11
|
+
server.setupGracefulShutdown();
|
|
12
|
+
server.start().catch((error) => {
|
|
13
|
+
console.error("Failed to start teammate MCP server:", error);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAElE,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,aAAa,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAC9E,MAAM,CAAC,qBAAqB,EAAE,CAAC;AAC/B,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC7B,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { TeammateStore } from "./store.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
export class TeammateMCPServer {
|
|
6
|
+
server;
|
|
7
|
+
store;
|
|
8
|
+
teammateId;
|
|
9
|
+
teammateName;
|
|
10
|
+
constructor(workspacePath, teammateId, teammateName) {
|
|
11
|
+
this.server = new McpServer({
|
|
12
|
+
name: "agent-teams-teammate",
|
|
13
|
+
version: "0.1.0",
|
|
14
|
+
});
|
|
15
|
+
this.store = new TeammateStore(workspacePath);
|
|
16
|
+
this.teammateId = teammateId;
|
|
17
|
+
this.teammateName = teammateName;
|
|
18
|
+
this.setupTools();
|
|
19
|
+
}
|
|
20
|
+
ok(data) {
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
err(error) {
|
|
26
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: "text", text: JSON.stringify({ error: message }, null, 2) }],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
setupTools() {
|
|
32
|
+
this.server.registerTool("whoami", {
|
|
33
|
+
title: "Who Am I",
|
|
34
|
+
description: "Returns your identity: name, role, team objective.",
|
|
35
|
+
inputSchema: z.object({}).shape,
|
|
36
|
+
}, async () => {
|
|
37
|
+
try {
|
|
38
|
+
await this.store.load();
|
|
39
|
+
const team = this.store.getTeam();
|
|
40
|
+
const teammate = this.store.getTeammate(this.teammateId);
|
|
41
|
+
return this.ok({
|
|
42
|
+
id: this.teammateId,
|
|
43
|
+
name: this.teammateName,
|
|
44
|
+
role: teammate?.role || "unknown",
|
|
45
|
+
team_objective: team?.objective || "unknown",
|
|
46
|
+
teammates: team?.teammates
|
|
47
|
+
.filter((t) => t.id !== this.teammateId && t.status === "active")
|
|
48
|
+
.map((t) => ({ id: t.id, name: t.name, role: t.role })) || [],
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return this.err(error);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
this.server.registerTool("list_tasks", {
|
|
56
|
+
title: "List Tasks",
|
|
57
|
+
description: "List available tasks. Filter by status (pending, in_progress, completed, blocked).",
|
|
58
|
+
inputSchema: z.object({
|
|
59
|
+
status: z.string().optional(),
|
|
60
|
+
}).shape,
|
|
61
|
+
}, async (params) => {
|
|
62
|
+
try {
|
|
63
|
+
await this.store.load();
|
|
64
|
+
const tasks = this.store.listTasks(params.status ? { status: params.status } : undefined);
|
|
65
|
+
return this.ok({
|
|
66
|
+
count: tasks.length,
|
|
67
|
+
tasks: tasks.map((t) => ({
|
|
68
|
+
id: t.id,
|
|
69
|
+
title: t.title,
|
|
70
|
+
description: t.description,
|
|
71
|
+
status: t.status,
|
|
72
|
+
assigned_to: t.assigned_to,
|
|
73
|
+
depends_on: t.depends_on,
|
|
74
|
+
acceptance_criteria: t.acceptance_criteria,
|
|
75
|
+
})),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
return this.err(error);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
this.server.registerTool("claim_task", {
|
|
83
|
+
title: "Claim Task",
|
|
84
|
+
description: "Claim a pending task to work on it. The task must be pending and have no unresolved dependencies.",
|
|
85
|
+
inputSchema: z.object({
|
|
86
|
+
task_id: z.string().min(1),
|
|
87
|
+
}).shape,
|
|
88
|
+
}, async (params) => {
|
|
89
|
+
try {
|
|
90
|
+
const task = await this.store.claimTask(params.task_id, this.teammateId);
|
|
91
|
+
return this.ok({ claimed: true, task_id: task.id, title: task.title });
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return this.err(error);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
this.server.registerTool("update_task", {
|
|
98
|
+
title: "Update Task",
|
|
99
|
+
description: "Update a task you own. Change status or add a note.",
|
|
100
|
+
inputSchema: z.object({
|
|
101
|
+
task_id: z.string().min(1),
|
|
102
|
+
status: z.enum(["in_progress", "blocked"]).optional(),
|
|
103
|
+
note: z.string().optional(),
|
|
104
|
+
}).shape,
|
|
105
|
+
}, async (params) => {
|
|
106
|
+
try {
|
|
107
|
+
const task = await this.store.updateTask(params.task_id, this.teammateId, {
|
|
108
|
+
status: params.status,
|
|
109
|
+
note: params.note,
|
|
110
|
+
});
|
|
111
|
+
return this.ok({ updated: true, task_id: task.id, status: task.status });
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
return this.err(error);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
this.server.registerTool("complete_task", {
|
|
118
|
+
title: "Complete Task",
|
|
119
|
+
description: "Mark a task as completed with a summary of what was done.",
|
|
120
|
+
inputSchema: z.object({
|
|
121
|
+
task_id: z.string().min(1),
|
|
122
|
+
summary: z.string().min(1),
|
|
123
|
+
touched_paths: z.array(z.string()).optional().default([]),
|
|
124
|
+
}).shape,
|
|
125
|
+
}, async (params) => {
|
|
126
|
+
try {
|
|
127
|
+
const task = await this.store.completeTask(params.task_id, this.teammateId, {
|
|
128
|
+
summary: params.summary,
|
|
129
|
+
touched_paths: params.touched_paths,
|
|
130
|
+
});
|
|
131
|
+
return this.ok({ completed: true, task_id: task.id, title: task.title });
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
return this.err(error);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
this.server.registerTool("send_message", {
|
|
138
|
+
title: "Send Message",
|
|
139
|
+
description: "Send a message to another teammate or to the lead.",
|
|
140
|
+
inputSchema: z.object({
|
|
141
|
+
to: z.string().optional(),
|
|
142
|
+
to_lead: z.boolean().optional().default(false),
|
|
143
|
+
subject: z.string().min(1),
|
|
144
|
+
body: z.string().min(1),
|
|
145
|
+
kind: z.enum(["info", "question", "answer", "blocker", "decision"]).optional().default("info"),
|
|
146
|
+
}).shape,
|
|
147
|
+
}, async (params) => {
|
|
148
|
+
try {
|
|
149
|
+
const message = await this.store.sendMessage({
|
|
150
|
+
from: this.teammateId,
|
|
151
|
+
from_name: this.teammateName,
|
|
152
|
+
to: params.to,
|
|
153
|
+
to_lead: params.to_lead,
|
|
154
|
+
subject: params.subject,
|
|
155
|
+
body: params.body,
|
|
156
|
+
kind: params.kind,
|
|
157
|
+
});
|
|
158
|
+
return this.ok({ message_id: message.id, sent: true });
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
return this.err(error);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
this.server.registerTool("fetch_messages", {
|
|
165
|
+
title: "Fetch Messages",
|
|
166
|
+
description: "Fetch messages sent to you. Optionally filter by unread only.",
|
|
167
|
+
inputSchema: z.object({
|
|
168
|
+
unread_only: z.boolean().optional().default(true),
|
|
169
|
+
thread: z.string().optional(),
|
|
170
|
+
}).shape,
|
|
171
|
+
}, async (params) => {
|
|
172
|
+
try {
|
|
173
|
+
await this.store.load();
|
|
174
|
+
const messages = this.store.fetchMessages(this.teammateId, {
|
|
175
|
+
unread_only: params.unread_only,
|
|
176
|
+
thread: params.thread,
|
|
177
|
+
});
|
|
178
|
+
return this.ok({
|
|
179
|
+
count: messages.length,
|
|
180
|
+
messages: messages.map((m) => ({
|
|
181
|
+
id: m.id,
|
|
182
|
+
from_name: m.from_name,
|
|
183
|
+
kind: m.kind,
|
|
184
|
+
subject: m.subject,
|
|
185
|
+
body: m.body,
|
|
186
|
+
created_at: m.created_at,
|
|
187
|
+
})),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
return this.err(error);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
this.server.registerTool("ack_messages", {
|
|
195
|
+
title: "Acknowledge Messages",
|
|
196
|
+
description: "Mark messages as read.",
|
|
197
|
+
inputSchema: z.object({
|
|
198
|
+
message_ids: z.array(z.string().min(1)),
|
|
199
|
+
}).shape,
|
|
200
|
+
}, async (params) => {
|
|
201
|
+
try {
|
|
202
|
+
const count = await this.store.ackMessages(this.teammateId, params.message_ids);
|
|
203
|
+
return this.ok({ acknowledged: count });
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
return this.err(error);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
this.server.registerTool("write_artifact", {
|
|
210
|
+
title: "Write Artifact",
|
|
211
|
+
description: "Publish an artifact (output of your work) linked to a task.",
|
|
212
|
+
inputSchema: z.object({
|
|
213
|
+
task_id: z.string().min(1),
|
|
214
|
+
name: z.string().min(1),
|
|
215
|
+
content: z.string().min(1),
|
|
216
|
+
type: z.enum(["markdown", "json", "code"]).optional().default("markdown"),
|
|
217
|
+
}).shape,
|
|
218
|
+
}, async (params) => {
|
|
219
|
+
try {
|
|
220
|
+
const artifact = await this.store.writeArtifact({
|
|
221
|
+
task_id: params.task_id,
|
|
222
|
+
agent_id: this.teammateId,
|
|
223
|
+
agent_name: this.teammateName,
|
|
224
|
+
name: params.name,
|
|
225
|
+
content: params.content,
|
|
226
|
+
type: params.type,
|
|
227
|
+
});
|
|
228
|
+
return this.ok({ artifact_id: artifact.id, name: artifact.name });
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
return this.err(error);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
this.server.registerTool("read_artifact", {
|
|
235
|
+
title: "Read Artifact",
|
|
236
|
+
description: "Read an artifact by ID.",
|
|
237
|
+
inputSchema: z.object({
|
|
238
|
+
artifact_id: z.string().min(1),
|
|
239
|
+
}).shape,
|
|
240
|
+
}, async (params) => {
|
|
241
|
+
try {
|
|
242
|
+
await this.store.load();
|
|
243
|
+
const artifact = this.store.getArtifact(params.artifact_id);
|
|
244
|
+
if (!artifact)
|
|
245
|
+
return this.ok({ error: `Artifact ${params.artifact_id} not found` });
|
|
246
|
+
return this.ok(artifact);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
return this.err(error);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
async start() {
|
|
254
|
+
await this.store.load();
|
|
255
|
+
const transport = new StdioServerTransport();
|
|
256
|
+
await this.server.connect(transport);
|
|
257
|
+
console.error(`Teammate MCP Server started for ${this.teammateName} (${this.teammateId})`);
|
|
258
|
+
}
|
|
259
|
+
setupGracefulShutdown() {
|
|
260
|
+
const shutdown = async (signal) => {
|
|
261
|
+
console.error(`[${this.teammateName}] Received ${signal}, shutting down...`);
|
|
262
|
+
process.exit(0);
|
|
263
|
+
};
|
|
264
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
265
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { withFileLock } from "./filelock.js";
|
|
5
|
+
export class TeammateStore {
|
|
6
|
+
basePath;
|
|
7
|
+
team = null;
|
|
8
|
+
tasks = [];
|
|
9
|
+
messages = [];
|
|
10
|
+
artifacts = [];
|
|
11
|
+
constructor(workspacePath) {
|
|
12
|
+
this.basePath = join(workspacePath, ".agent-teams");
|
|
13
|
+
}
|
|
14
|
+
generateId() {
|
|
15
|
+
return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
16
|
+
}
|
|
17
|
+
async ensureDir() {
|
|
18
|
+
if (!existsSync(this.basePath)) {
|
|
19
|
+
await mkdir(this.basePath, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
const artifactsDir = join(this.basePath, "artifacts");
|
|
22
|
+
if (!existsSync(artifactsDir)) {
|
|
23
|
+
await mkdir(artifactsDir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
teamPath() {
|
|
27
|
+
return join(this.basePath, "team.json");
|
|
28
|
+
}
|
|
29
|
+
tasksPath() {
|
|
30
|
+
return join(this.basePath, "tasks.json");
|
|
31
|
+
}
|
|
32
|
+
messagesPath() {
|
|
33
|
+
return join(this.basePath, "messages.json");
|
|
34
|
+
}
|
|
35
|
+
artifactsPath() {
|
|
36
|
+
return join(this.basePath, "artifacts.json");
|
|
37
|
+
}
|
|
38
|
+
async readJson(filePath, fallback) {
|
|
39
|
+
if (!existsSync(filePath))
|
|
40
|
+
return fallback;
|
|
41
|
+
try {
|
|
42
|
+
const raw = await readFile(filePath, "utf-8");
|
|
43
|
+
return JSON.parse(raw);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return fallback;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async writeJson(filePath, data) {
|
|
50
|
+
await writeFile(filePath, JSON.stringify(data, null, 2));
|
|
51
|
+
}
|
|
52
|
+
async load() {
|
|
53
|
+
await this.ensureDir();
|
|
54
|
+
this.team = await this.readJson(this.teamPath(), null);
|
|
55
|
+
this.tasks = await this.readJson(this.tasksPath(), []);
|
|
56
|
+
this.messages = await this.readJson(this.messagesPath(), []);
|
|
57
|
+
this.artifacts = await this.readJson(this.artifactsPath(), []);
|
|
58
|
+
}
|
|
59
|
+
getTeam() {
|
|
60
|
+
return this.team;
|
|
61
|
+
}
|
|
62
|
+
getTeammate(teammateId) {
|
|
63
|
+
return this.team?.teammates.find((t) => t.id === teammateId) || null;
|
|
64
|
+
}
|
|
65
|
+
listTasks(filter) {
|
|
66
|
+
let result = [...this.tasks];
|
|
67
|
+
if (filter?.status) {
|
|
68
|
+
result = result.filter((t) => t.status === filter.status);
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
async claimTask(taskId, agentId) {
|
|
73
|
+
return withFileLock(this.tasksPath(), async () => {
|
|
74
|
+
this.tasks = await this.readJson(this.tasksPath(), []);
|
|
75
|
+
const task = this.tasks.find((t) => t.id === taskId);
|
|
76
|
+
if (!task)
|
|
77
|
+
throw new Error(`Task ${taskId} not found`);
|
|
78
|
+
if (task.status !== "pending")
|
|
79
|
+
throw new Error(`Task ${taskId} is not pending (status: ${task.status})`);
|
|
80
|
+
if (task.assigned_to)
|
|
81
|
+
throw new Error(`Task ${taskId} already assigned to ${task.assigned_to}`);
|
|
82
|
+
const unblockedDeps = task.depends_on.every((depId) => {
|
|
83
|
+
const dep = this.tasks.find((t) => t.id === depId);
|
|
84
|
+
return dep && dep.status === "completed";
|
|
85
|
+
});
|
|
86
|
+
if (!unblockedDeps)
|
|
87
|
+
throw new Error(`Task ${taskId} has unresolved dependencies`);
|
|
88
|
+
task.status = "in_progress";
|
|
89
|
+
task.assigned_to = agentId;
|
|
90
|
+
await this.writeJson(this.tasksPath(), this.tasks);
|
|
91
|
+
return task;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async updateTask(taskId, agentId, updates) {
|
|
95
|
+
return withFileLock(this.tasksPath(), async () => {
|
|
96
|
+
this.tasks = await this.readJson(this.tasksPath(), []);
|
|
97
|
+
const task = this.tasks.find((t) => t.id === taskId);
|
|
98
|
+
if (!task)
|
|
99
|
+
throw new Error(`Task ${taskId} not found`);
|
|
100
|
+
if (task.assigned_to !== agentId)
|
|
101
|
+
throw new Error(`Task ${taskId} not assigned to you`);
|
|
102
|
+
if (updates.status)
|
|
103
|
+
task.status = updates.status;
|
|
104
|
+
if (updates.note)
|
|
105
|
+
task.notes.push(updates.note);
|
|
106
|
+
await this.writeJson(this.tasksPath(), this.tasks);
|
|
107
|
+
return task;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
async completeTask(taskId, agentId, params) {
|
|
111
|
+
return withFileLock(this.tasksPath(), async () => {
|
|
112
|
+
this.tasks = await this.readJson(this.tasksPath(), []);
|
|
113
|
+
const task = this.tasks.find((t) => t.id === taskId);
|
|
114
|
+
if (!task)
|
|
115
|
+
throw new Error(`Task ${taskId} not found`);
|
|
116
|
+
if (task.assigned_to !== agentId)
|
|
117
|
+
throw new Error(`Task ${taskId} not assigned to you`);
|
|
118
|
+
task.status = "completed";
|
|
119
|
+
task.completed_at = new Date().toISOString();
|
|
120
|
+
task.summary = params.summary;
|
|
121
|
+
if (params.artifacts)
|
|
122
|
+
task.artifacts.push(...params.artifacts);
|
|
123
|
+
if (params.touched_paths)
|
|
124
|
+
task.touched_paths.push(...params.touched_paths);
|
|
125
|
+
await this.writeJson(this.tasksPath(), this.tasks);
|
|
126
|
+
return task;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async sendMessage(params) {
|
|
130
|
+
return withFileLock(this.messagesPath(), async () => {
|
|
131
|
+
this.messages = await this.readJson(this.messagesPath(), []);
|
|
132
|
+
const message = {
|
|
133
|
+
id: this.generateId(),
|
|
134
|
+
from: params.from,
|
|
135
|
+
from_name: params.from_name,
|
|
136
|
+
to: params.to_lead ? "lead" : params.to || "broadcast",
|
|
137
|
+
thread: params.thread,
|
|
138
|
+
kind: params.kind,
|
|
139
|
+
subject: params.subject,
|
|
140
|
+
body: params.body,
|
|
141
|
+
read_by: [params.from],
|
|
142
|
+
created_at: new Date().toISOString(),
|
|
143
|
+
};
|
|
144
|
+
this.messages.push(message);
|
|
145
|
+
await this.writeJson(this.messagesPath(), this.messages);
|
|
146
|
+
return message;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
fetchMessages(agentId, filter) {
|
|
150
|
+
let result = this.messages.filter((m) => m.to === agentId || m.to === "broadcast");
|
|
151
|
+
if (filter?.unread_only) {
|
|
152
|
+
result = result.filter((m) => !m.read_by.includes(agentId));
|
|
153
|
+
}
|
|
154
|
+
if (filter?.thread) {
|
|
155
|
+
result = result.filter((m) => m.thread === filter.thread);
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
async ackMessages(agentId, messageIds) {
|
|
160
|
+
return withFileLock(this.messagesPath(), async () => {
|
|
161
|
+
this.messages = await this.readJson(this.messagesPath(), []);
|
|
162
|
+
let count = 0;
|
|
163
|
+
for (const msg of this.messages) {
|
|
164
|
+
if (messageIds.includes(msg.id) && !msg.read_by.includes(agentId)) {
|
|
165
|
+
msg.read_by.push(agentId);
|
|
166
|
+
count++;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
await this.writeJson(this.messagesPath(), this.messages);
|
|
170
|
+
return count;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
async writeArtifact(params) {
|
|
174
|
+
return withFileLock(this.artifactsPath(), async () => {
|
|
175
|
+
this.artifacts = await this.readJson(this.artifactsPath(), []);
|
|
176
|
+
const artifact = {
|
|
177
|
+
id: this.generateId(),
|
|
178
|
+
task_id: params.task_id,
|
|
179
|
+
agent_id: params.agent_id,
|
|
180
|
+
agent_name: params.agent_name,
|
|
181
|
+
name: params.name,
|
|
182
|
+
content: params.content,
|
|
183
|
+
type: params.type,
|
|
184
|
+
created_at: new Date().toISOString(),
|
|
185
|
+
};
|
|
186
|
+
this.artifacts.push(artifact);
|
|
187
|
+
await this.writeJson(this.artifactsPath(), this.artifacts);
|
|
188
|
+
return artifact;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
getArtifact(artifactId) {
|
|
192
|
+
return this.artifacts.find((a) => a.id === artifactId);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|