too-many-cooks-core 0.7.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/LICENSE +21 -0
- package/README.md +39 -0
- package/build/admin_routes.d.ts +15 -0
- package/build/admin_routes.d.ts.map +1 -0
- package/build/admin_routes.js +183 -0
- package/build/admin_routes.js.map +1 -0
- package/build/config.d.ts +35 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +44 -0
- package/build/config.js.map +1 -0
- package/build/db-contract-tests.d.ts +16 -0
- package/build/db-contract-tests.d.ts.map +1 -0
- package/build/db-contract-tests.js +498 -0
- package/build/db-contract-tests.js.map +1 -0
- package/build/db-interface.d.ts +34 -0
- package/build/db-interface.d.ts.map +1 -0
- package/build/db-interface.js +6 -0
- package/build/db-interface.js.map +1 -0
- package/build/index.d.ts +18 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +20 -0
- package/build/index.js.map +1 -0
- package/build/logger.d.ts +45 -0
- package/build/logger.d.ts.map +1 -0
- package/build/logger.js +59 -0
- package/build/logger.js.map +1 -0
- package/build/mcp-types.d.ts +24 -0
- package/build/mcp-types.d.ts.map +1 -0
- package/build/mcp-types.js +9 -0
- package/build/mcp-types.js.map +1 -0
- package/build/notifications.d.ts +46 -0
- package/build/notifications.d.ts.map +1 -0
- package/build/notifications.js +125 -0
- package/build/notifications.js.map +1 -0
- package/build/result.d.ts +26 -0
- package/build/result.d.ts.map +1 -0
- package/build/result.js +37 -0
- package/build/result.js.map +1 -0
- package/build/server.d.ts +21 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +120 -0
- package/build/server.js.map +1 -0
- package/build/tools/lock_tool.d.ts +22 -0
- package/build/tools/lock_tool.d.ts.map +1 -0
- package/build/tools/lock_tool.js +184 -0
- package/build/tools/lock_tool.js.map +1 -0
- package/build/tools/message_tool.d.ts +21 -0
- package/build/tools/message_tool.d.ts.map +1 -0
- package/build/tools/message_tool.js +141 -0
- package/build/tools/message_tool.js.map +1 -0
- package/build/tools/plan_tool.d.ts +21 -0
- package/build/tools/plan_tool.d.ts.map +1 -0
- package/build/tools/plan_tool.js +132 -0
- package/build/tools/plan_tool.js.map +1 -0
- package/build/tools/register_tool.d.ts +29 -0
- package/build/tools/register_tool.d.ts.map +1 -0
- package/build/tools/register_tool.js +137 -0
- package/build/tools/register_tool.js.map +1 -0
- package/build/tools/status_tool.d.ts +19 -0
- package/build/tools/status_tool.d.ts.map +1 -0
- package/build/tools/status_tool.js +51 -0
- package/build/tools/status_tool.js.map +1 -0
- package/build/tools/tool_utils.d.ts +18 -0
- package/build/tools/tool_utils.d.ts.map +1 -0
- package/build/tools/tool_utils.js +45 -0
- package/build/tools/tool_utils.js.map +1 -0
- package/build/types.d.ts +14 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.gen.d.ts +76 -0
- package/build/types.gen.d.ts.map +1 -0
- package/build/types.gen.js +133 -0
- package/build/types.gen.js.map +1 -0
- package/build/types.js +16 -0
- package/build/types.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock_tool.d.ts","sourceRoot":"","sources":["../../src/tools/lock_tool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAM/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD,OAAO,EAAuB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAG1G,kCAAkC;AAClC,eAAO,MAAM,iBAAiB,EAAE;IAC9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAmB7B,CAAC;AAEX,4BAA4B;AAC5B,eAAO,MAAM,gBAAgB,EAAE;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;CAYnB,CAAC;AAEX,gCAAgC;AAChC,eAAO,MAAM,iBAAiB,EAAE,CAC9B,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,aAAa,KACtB,YA+BD,CAAC"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/// Lock tool - file lock management.
|
|
2
|
+
import { EVENT_LOCK_ACQUIRED, EVENT_LOCK_RELEASED, EVENT_LOCK_RENEWED, } from "../notifications.js";
|
|
3
|
+
import { fileLockToJson, lockResultToJson } from "../types.js";
|
|
4
|
+
import { textContent } from "../mcp-types.js";
|
|
5
|
+
import { errorContent, makeErrorResult, resolveIdentity } from "./tool_utils.js";
|
|
6
|
+
/** Input schema for lock tool. */
|
|
7
|
+
export const LOCK_INPUT_SCHEMA = {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
action: {
|
|
11
|
+
type: "string",
|
|
12
|
+
enum: ["acquire", "release", "force_release", "renew", "query", "list"],
|
|
13
|
+
description: "Lock action to perform",
|
|
14
|
+
},
|
|
15
|
+
file_path: {
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "File path to lock (required except for list)",
|
|
18
|
+
},
|
|
19
|
+
reason: {
|
|
20
|
+
type: "string",
|
|
21
|
+
description: "Why you need this lock (optional, for acquire)",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
required: ["action"],
|
|
25
|
+
};
|
|
26
|
+
/** Tool config for lock. */
|
|
27
|
+
export const LOCK_TOOL_CONFIG = {
|
|
28
|
+
title: "File Lock",
|
|
29
|
+
description: "Manage file locks. You must register first. " +
|
|
30
|
+
"REQUIRED: action (acquire|release|force_release|renew|query|list). " +
|
|
31
|
+
"For acquire/release/renew: file_path. For query: file_path. " +
|
|
32
|
+
'Example: {"action":"acquire","file_path":"/path/file.dart",' +
|
|
33
|
+
' "reason":"editing"}',
|
|
34
|
+
inputSchema: LOCK_INPUT_SCHEMA,
|
|
35
|
+
outputSchema: null,
|
|
36
|
+
annotations: null,
|
|
37
|
+
};
|
|
38
|
+
/** Create lock tool handler. */
|
|
39
|
+
export const createLockHandler = (db, config, emitter, logger, getSession) => {
|
|
40
|
+
return async (args) => {
|
|
41
|
+
const actionArg = args.action;
|
|
42
|
+
if (typeof actionArg !== "string") {
|
|
43
|
+
return errorContent("missing_parameter: action is required");
|
|
44
|
+
}
|
|
45
|
+
const action = actionArg;
|
|
46
|
+
const filePath = typeof args.file_path === "string" ? args.file_path : null;
|
|
47
|
+
const reason = typeof args.reason === "string" ? args.reason : null;
|
|
48
|
+
const log = logger.child({
|
|
49
|
+
tool: "lock",
|
|
50
|
+
action,
|
|
51
|
+
...(filePath === null ? {} : { filePath }),
|
|
52
|
+
});
|
|
53
|
+
if (action === "query") {
|
|
54
|
+
return await handleQuery(db, filePath);
|
|
55
|
+
}
|
|
56
|
+
if (action === "list") {
|
|
57
|
+
return await handleList(db);
|
|
58
|
+
}
|
|
59
|
+
const identity = await resolveIdentity(db, args, getSession);
|
|
60
|
+
if (identity.isError) {
|
|
61
|
+
return identity.result;
|
|
62
|
+
}
|
|
63
|
+
const { agentName, agentKey } = identity;
|
|
64
|
+
return await dispatchAction({
|
|
65
|
+
action, db, emitter, log, filePath, agentName, agentKey, reason, lockTimeoutMs: config.lockTimeoutMs,
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
const dispatchAction = async (params) => {
|
|
70
|
+
const { action, db, emitter, log, filePath, agentName, agentKey, reason, lockTimeoutMs } = params;
|
|
71
|
+
switch (action) {
|
|
72
|
+
case "acquire":
|
|
73
|
+
return await handleAcquire({ db, emitter, log, filePath, agentName, agentKey, reason, timeoutMs: lockTimeoutMs });
|
|
74
|
+
case "release":
|
|
75
|
+
return await handleRelease(db, emitter, log, filePath, agentName, agentKey);
|
|
76
|
+
case "force_release":
|
|
77
|
+
return await handleForceRelease(db, emitter, log, filePath, agentName, agentKey);
|
|
78
|
+
case "renew":
|
|
79
|
+
return await handleRenew(db, emitter, log, filePath, agentName, agentKey, lockTimeoutMs);
|
|
80
|
+
default:
|
|
81
|
+
return { content: [textContent(JSON.stringify({ error: `Unknown action: ${action}` }))], isError: true };
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const handleAcquire = async (params) => {
|
|
85
|
+
const { db, emitter, log, filePath, agentName, agentKey, reason, timeoutMs } = params;
|
|
86
|
+
if (filePath === null) {
|
|
87
|
+
return { content: [textContent(JSON.stringify({ error: "acquire requires file_path" }))], isError: true };
|
|
88
|
+
}
|
|
89
|
+
const result = await db.acquireLock(filePath, agentName, agentKey, reason, timeoutMs);
|
|
90
|
+
if (!result.ok) {
|
|
91
|
+
return makeErrorResult(result.error);
|
|
92
|
+
}
|
|
93
|
+
if (result.value.acquired) {
|
|
94
|
+
emitter.emit(EVENT_LOCK_ACQUIRED, {
|
|
95
|
+
file_path: filePath,
|
|
96
|
+
agent_name: agentName,
|
|
97
|
+
expires_at: result.value.lock?.expiresAt,
|
|
98
|
+
reason,
|
|
99
|
+
});
|
|
100
|
+
log.info(`Lock acquired on ${filePath} by ${agentName}`);
|
|
101
|
+
return { content: [textContent(JSON.stringify(lockResultToJson(result.value)))], isError: false };
|
|
102
|
+
}
|
|
103
|
+
return { content: [textContent(JSON.stringify(lockResultToJson(result.value)))], isError: true };
|
|
104
|
+
};
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// Release
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
const handleRelease = async (db, emitter, log, filePath, agentName, agentKey) => {
|
|
109
|
+
if (filePath === null) {
|
|
110
|
+
return { content: [textContent(JSON.stringify({ error: "release requires file_path" }))], isError: true };
|
|
111
|
+
}
|
|
112
|
+
const result = await db.releaseLock(filePath, agentName, agentKey);
|
|
113
|
+
if (!result.ok) {
|
|
114
|
+
return makeErrorResult(result.error);
|
|
115
|
+
}
|
|
116
|
+
emitter.emit(EVENT_LOCK_RELEASED, { file_path: filePath, agent_name: agentName });
|
|
117
|
+
log.info(`Lock released on ${filePath} by ${agentName}`);
|
|
118
|
+
return { content: [textContent(JSON.stringify({ released: true }))], isError: false };
|
|
119
|
+
};
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// Force release
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
const handleForceRelease = async (db, emitter, log, filePath, agentName, agentKey) => {
|
|
124
|
+
if (filePath === null) {
|
|
125
|
+
return { content: [textContent(JSON.stringify({ error: "force_release requires file_path" }))], isError: true };
|
|
126
|
+
}
|
|
127
|
+
const result = await db.forceReleaseLock(filePath, agentName, agentKey);
|
|
128
|
+
if (!result.ok) {
|
|
129
|
+
return { content: [textContent(JSON.stringify({ error: result.error.message }))], isError: true };
|
|
130
|
+
}
|
|
131
|
+
emitter.emit(EVENT_LOCK_RELEASED, { file_path: filePath, agent_name: agentName, force: true });
|
|
132
|
+
log.warn(`Lock force-released on ${filePath} by ${agentName}`);
|
|
133
|
+
return { content: [textContent(JSON.stringify({ released: true }))], isError: false };
|
|
134
|
+
};
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
// Renew
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
const handleRenew = async (db, emitter, log, filePath, agentName, agentKey, timeoutMs) => {
|
|
139
|
+
if (filePath === null) {
|
|
140
|
+
return { content: [textContent(JSON.stringify({ error: "renew requires file_path" }))], isError: true };
|
|
141
|
+
}
|
|
142
|
+
const result = await db.renewLock(filePath, agentName, agentKey, timeoutMs);
|
|
143
|
+
if (!result.ok) {
|
|
144
|
+
return makeErrorResult(result.error);
|
|
145
|
+
}
|
|
146
|
+
const newExpiresAt = Date.now() + timeoutMs;
|
|
147
|
+
emitter.emit(EVENT_LOCK_RENEWED, {
|
|
148
|
+
file_path: filePath,
|
|
149
|
+
agent_name: agentName,
|
|
150
|
+
expires_at: newExpiresAt,
|
|
151
|
+
});
|
|
152
|
+
log.debug(`Lock renewed on ${filePath} by ${agentName}`);
|
|
153
|
+
return { content: [textContent(JSON.stringify({ renewed: true }))], isError: false };
|
|
154
|
+
};
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
// Query
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
const handleQuery = async (db, filePath) => {
|
|
159
|
+
if (filePath === null) {
|
|
160
|
+
return { content: [textContent(JSON.stringify({ error: "query requires file_path" }))], isError: true };
|
|
161
|
+
}
|
|
162
|
+
const result = await db.queryLock(filePath);
|
|
163
|
+
if (!result.ok) {
|
|
164
|
+
return makeErrorResult(result.error);
|
|
165
|
+
}
|
|
166
|
+
if (result.value !== null) {
|
|
167
|
+
return { content: [textContent(JSON.stringify({ locked: true, lock: fileLockToJson(result.value) }))], isError: false };
|
|
168
|
+
}
|
|
169
|
+
return { content: [textContent(JSON.stringify({ locked: false }))], isError: false };
|
|
170
|
+
};
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
// List
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
const handleList = async (db) => {
|
|
175
|
+
const result = await db.listLocks();
|
|
176
|
+
if (!result.ok) {
|
|
177
|
+
return makeErrorResult(result.error);
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
content: [textContent(JSON.stringify({ locks: result.value.map(fileLockToJson) }))],
|
|
181
|
+
isError: false,
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
//# sourceMappingURL=lock_tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock_tool.js","sourceRoot":"","sources":["../../src/tools/lock_tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Logger } from "../logger.js";
|
|
2
|
+
import type { NotificationEmitter } from "../notifications.js";
|
|
3
|
+
import type { TooManyCooksDb } from "../db-interface.js";
|
|
4
|
+
import { type SessionGetter, type ToolCallback } from "../mcp-types.js";
|
|
5
|
+
/** Input schema for message tool. */
|
|
6
|
+
export declare const MESSAGE_INPUT_SCHEMA: {
|
|
7
|
+
readonly type: "object";
|
|
8
|
+
readonly properties: Record<string, unknown>;
|
|
9
|
+
readonly required: readonly string[];
|
|
10
|
+
};
|
|
11
|
+
/** Tool config for message. */
|
|
12
|
+
export declare const MESSAGE_TOOL_CONFIG: {
|
|
13
|
+
readonly title: string;
|
|
14
|
+
readonly description: string;
|
|
15
|
+
readonly inputSchema: typeof MESSAGE_INPUT_SCHEMA;
|
|
16
|
+
readonly outputSchema: null;
|
|
17
|
+
readonly annotations: null;
|
|
18
|
+
};
|
|
19
|
+
/** Create message tool handler. */
|
|
20
|
+
export declare const createMessageHandler: (db: TooManyCooksDb, emitter: NotificationEmitter, logger: Logger, getSession: SessionGetter) => ToolCallback;
|
|
21
|
+
//# sourceMappingURL=message_tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message_tool.d.ts","sourceRoot":"","sources":["../../src/tools/message_tool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,iBAAiB,CAAC;AAGzB,qCAAqC;AACrC,eAAO,MAAM,oBAAoB,EAAE;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CA4B7B,CAAC;AAEX,+BAA+B;AAC/B,eAAO,MAAM,mBAAmB,EAAE;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,oBAAoB,CAAC;IAClD,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;CAWnB,CAAC;AA8DX,mCAAmC;AACnC,eAAO,MAAM,oBAAoB,EAAE,CACjC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,aAAa,KACtB,YAmBD,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/// Message tool - inter-agent messaging.
|
|
2
|
+
import { EVENT_MESSAGE_SENT } from "../notifications.js";
|
|
3
|
+
import { messageToJson } from "../types.js";
|
|
4
|
+
import { textContent, } from "../mcp-types.js";
|
|
5
|
+
import { errorContent, makeErrorResult, resolveIdentity } from "./tool_utils.js";
|
|
6
|
+
/** Input schema for message tool. */
|
|
7
|
+
export const MESSAGE_INPUT_SCHEMA = {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
action: {
|
|
11
|
+
type: "string",
|
|
12
|
+
enum: ["send", "get", "mark_read"],
|
|
13
|
+
description: "Message action to perform",
|
|
14
|
+
},
|
|
15
|
+
to_agent: {
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "Recipient name or * for broadcast (for send)",
|
|
18
|
+
},
|
|
19
|
+
content: {
|
|
20
|
+
type: "string",
|
|
21
|
+
maxLength: 200,
|
|
22
|
+
description: "Message content (for send). MUST be 200 chars or less.",
|
|
23
|
+
},
|
|
24
|
+
message_id: {
|
|
25
|
+
type: "string",
|
|
26
|
+
description: "Message ID (for mark_read)",
|
|
27
|
+
},
|
|
28
|
+
unread_only: {
|
|
29
|
+
type: "boolean",
|
|
30
|
+
description: "Only return unread messages (default: true)",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
required: ["action"],
|
|
34
|
+
};
|
|
35
|
+
/** Tool config for message. */
|
|
36
|
+
export const MESSAGE_TOOL_CONFIG = {
|
|
37
|
+
title: "Message",
|
|
38
|
+
description: "Send/receive messages. You must register first. " +
|
|
39
|
+
"REQUIRED: action (send|get|mark_read). " +
|
|
40
|
+
"For send: to_agent, content. For mark_read: message_id. " +
|
|
41
|
+
'Example send: {"action":"send","to_agent":"other","content":"hello"}',
|
|
42
|
+
inputSchema: MESSAGE_INPUT_SCHEMA,
|
|
43
|
+
outputSchema: null,
|
|
44
|
+
annotations: null,
|
|
45
|
+
};
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Action dispatch
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
const dispatchAction = async (action, db, emitter, log, agentName, agentKey, args) => {
|
|
50
|
+
switch (action) {
|
|
51
|
+
case "send":
|
|
52
|
+
return await handleSend(db, emitter, log, agentName, agentKey, typeof args.to_agent === "string" ? args.to_agent : null, typeof args.content === "string" ? args.content : null);
|
|
53
|
+
case "get":
|
|
54
|
+
return await handleGet(db, agentName, agentKey, typeof args.unread_only === "boolean"
|
|
55
|
+
? args.unread_only
|
|
56
|
+
: true);
|
|
57
|
+
case "mark_read":
|
|
58
|
+
return await handleMarkRead(db, agentName, agentKey, typeof args.message_id === "string" ? args.message_id : null);
|
|
59
|
+
default:
|
|
60
|
+
return {
|
|
61
|
+
content: [
|
|
62
|
+
textContent(JSON.stringify({ error: `Unknown action: ${action}` })),
|
|
63
|
+
],
|
|
64
|
+
isError: true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
/** Create message tool handler. */
|
|
69
|
+
export const createMessageHandler = (db, emitter, logger, getSession) => {
|
|
70
|
+
return async (args) => {
|
|
71
|
+
const actionArg = args.action;
|
|
72
|
+
if (typeof actionArg !== "string") {
|
|
73
|
+
return errorContent("missing_parameter: action is required");
|
|
74
|
+
}
|
|
75
|
+
const action = actionArg;
|
|
76
|
+
const identity = await resolveIdentity(db, args, getSession);
|
|
77
|
+
if (identity.isError) {
|
|
78
|
+
return identity.result;
|
|
79
|
+
}
|
|
80
|
+
const { agentName, agentKey } = identity;
|
|
81
|
+
const log = logger.child({ tool: "message", action });
|
|
82
|
+
return await dispatchAction(action, db, emitter, log, agentName, agentKey, args);
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Send
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
const handleSend = async (db, emitter, log, agentName, agentKey, toAgent, content) => {
|
|
89
|
+
if (toAgent === null || content === null) {
|
|
90
|
+
return errorContent("send requires to_agent and content");
|
|
91
|
+
}
|
|
92
|
+
const result = await db.sendMessage(agentName, agentKey, toAgent, content);
|
|
93
|
+
if (!result.ok) {
|
|
94
|
+
return makeErrorResult(result.error);
|
|
95
|
+
}
|
|
96
|
+
emitter.emitToAgent(EVENT_MESSAGE_SENT, {
|
|
97
|
+
message_id: result.value,
|
|
98
|
+
from_agent: agentName,
|
|
99
|
+
to_agent: toAgent,
|
|
100
|
+
content,
|
|
101
|
+
}, toAgent);
|
|
102
|
+
log.info(`Message sent from ${agentName} to ${toAgent}`);
|
|
103
|
+
return {
|
|
104
|
+
content: [
|
|
105
|
+
textContent(JSON.stringify({ sent: true, message_id: result.value })),
|
|
106
|
+
],
|
|
107
|
+
isError: false,
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Get
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
const handleGet = async (db, agentName, agentKey, unreadOnly) => {
|
|
114
|
+
const result = await db.getMessages(agentName, agentKey, { unreadOnly });
|
|
115
|
+
if (!result.ok) {
|
|
116
|
+
return makeErrorResult(result.error);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
content: [
|
|
120
|
+
textContent(JSON.stringify({ messages: result.value.map(messageToJson) })),
|
|
121
|
+
],
|
|
122
|
+
isError: false,
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Mark read
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
const handleMarkRead = async (db, agentName, agentKey, messageId) => {
|
|
129
|
+
if (messageId === null) {
|
|
130
|
+
return errorContent("mark_read requires message_id");
|
|
131
|
+
}
|
|
132
|
+
const result = await db.markRead(messageId, agentName, agentKey);
|
|
133
|
+
if (!result.ok) {
|
|
134
|
+
return makeErrorResult(result.error);
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
content: [textContent(JSON.stringify({ marked: true }))],
|
|
138
|
+
isError: false,
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=message_tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message_tool.js","sourceRoot":"","sources":["../../src/tools/message_tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Logger } from "../logger.js";
|
|
2
|
+
import type { NotificationEmitter } from "../notifications.js";
|
|
3
|
+
import type { TooManyCooksDb } from "../db-interface.js";
|
|
4
|
+
import { type SessionGetter, type ToolCallback } from "../mcp-types.js";
|
|
5
|
+
/** Input schema for plan tool. */
|
|
6
|
+
export declare const PLAN_INPUT_SCHEMA: {
|
|
7
|
+
readonly type: "object";
|
|
8
|
+
readonly properties: Record<string, unknown>;
|
|
9
|
+
readonly required: readonly string[];
|
|
10
|
+
};
|
|
11
|
+
/** Tool config for plan. */
|
|
12
|
+
export declare const PLAN_TOOL_CONFIG: {
|
|
13
|
+
readonly title: string;
|
|
14
|
+
readonly description: string;
|
|
15
|
+
readonly inputSchema: typeof PLAN_INPUT_SCHEMA;
|
|
16
|
+
readonly outputSchema: null;
|
|
17
|
+
readonly annotations: null;
|
|
18
|
+
};
|
|
19
|
+
/** Create plan tool handler. */
|
|
20
|
+
export declare const createPlanHandler: (db: TooManyCooksDb, emitter: NotificationEmitter, logger: Logger, getSession: SessionGetter) => ToolCallback;
|
|
21
|
+
//# sourceMappingURL=plan_tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan_tool.d.ts","sourceRoot":"","sources":["../../src/tools/plan_tool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,iBAAiB,CAAC;AAGzB,kCAAkC;AAClC,eAAO,MAAM,iBAAiB,EAAE;IAC9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAsB7B,CAAC;AAEX,4BAA4B;AAC5B,eAAO,MAAM,gBAAgB,EAAE;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;CAYnB,CAAC;AAEX,gCAAgC;AAChC,eAAO,MAAM,iBAAiB,EAAE,CAC9B,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,aAAa,KACtB,YA6CD,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/// Plan tool - agent plan management.
|
|
2
|
+
import { EVENT_PLAN_UPDATED } from "../notifications.js";
|
|
3
|
+
import { agentPlanToJson } from "../types.js";
|
|
4
|
+
import { textContent, } from "../mcp-types.js";
|
|
5
|
+
import { errorContent, makeErrorResult, resolveIdentity } from "./tool_utils.js";
|
|
6
|
+
/** Input schema for plan tool. */
|
|
7
|
+
export const PLAN_INPUT_SCHEMA = {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
action: {
|
|
11
|
+
type: "string",
|
|
12
|
+
enum: ["update", "get", "list"],
|
|
13
|
+
description: "Plan action to perform",
|
|
14
|
+
},
|
|
15
|
+
goal: {
|
|
16
|
+
type: "string",
|
|
17
|
+
maxLength: 100,
|
|
18
|
+
description: "Your goal (for update). MUST be 100 chars or less.",
|
|
19
|
+
},
|
|
20
|
+
current_task: {
|
|
21
|
+
type: "string",
|
|
22
|
+
maxLength: 100,
|
|
23
|
+
description: "What you are doing now (for update). MUST be 100 chars or less.",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
required: ["action"],
|
|
27
|
+
};
|
|
28
|
+
/** Tool config for plan. */
|
|
29
|
+
export const PLAN_TOOL_CONFIG = {
|
|
30
|
+
title: "Plan",
|
|
31
|
+
description: "Manage your plan. You must register first (except list). " +
|
|
32
|
+
"REQUIRED: action (update|get|list). " +
|
|
33
|
+
"For update: goal, current_task. " +
|
|
34
|
+
'Example: {"action":"update","goal":"Fix bug",' +
|
|
35
|
+
' "current_task":"Reading code"}',
|
|
36
|
+
inputSchema: PLAN_INPUT_SCHEMA,
|
|
37
|
+
outputSchema: null,
|
|
38
|
+
annotations: null,
|
|
39
|
+
};
|
|
40
|
+
/** Create plan tool handler. */
|
|
41
|
+
export const createPlanHandler = (db, emitter, logger, getSession) => {
|
|
42
|
+
return async (args) => {
|
|
43
|
+
const actionArg = args.action;
|
|
44
|
+
if (typeof actionArg !== "string") {
|
|
45
|
+
return errorContent("missing_parameter: action is required");
|
|
46
|
+
}
|
|
47
|
+
const action = actionArg;
|
|
48
|
+
const log = logger.child({ tool: "plan", action });
|
|
49
|
+
if (action === "list") {
|
|
50
|
+
return await handleList(db);
|
|
51
|
+
}
|
|
52
|
+
const identity = await resolveIdentity(db, args, getSession);
|
|
53
|
+
if (identity.isError) {
|
|
54
|
+
return identity.result;
|
|
55
|
+
}
|
|
56
|
+
const { agentName, agentKey } = identity;
|
|
57
|
+
switch (action) {
|
|
58
|
+
case "update":
|
|
59
|
+
return await handleUpdate(db, emitter, log, agentName, agentKey, typeof args.goal === "string" ? args.goal : null, typeof args.current_task === "string"
|
|
60
|
+
? args.current_task
|
|
61
|
+
: null);
|
|
62
|
+
case "get":
|
|
63
|
+
return await handleGet(db, agentName);
|
|
64
|
+
default:
|
|
65
|
+
return {
|
|
66
|
+
content: [
|
|
67
|
+
textContent(JSON.stringify({ error: `Unknown action: ${action}` })),
|
|
68
|
+
],
|
|
69
|
+
isError: true,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// Update
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
const handleUpdate = async (db, emitter, log, agentName, agentKey, goal, currentTask) => {
|
|
78
|
+
if (goal === null || currentTask === null) {
|
|
79
|
+
return errorContent("update requires goal, current_task");
|
|
80
|
+
}
|
|
81
|
+
const result = await db.updatePlan(agentName, agentKey, goal, currentTask);
|
|
82
|
+
if (!result.ok) {
|
|
83
|
+
return makeErrorResult(result.error);
|
|
84
|
+
}
|
|
85
|
+
emitter.emit(EVENT_PLAN_UPDATED, {
|
|
86
|
+
agent_name: agentName,
|
|
87
|
+
goal,
|
|
88
|
+
current_task: currentTask,
|
|
89
|
+
});
|
|
90
|
+
log.info(`Plan updated for ${agentName}: ${currentTask}`);
|
|
91
|
+
return {
|
|
92
|
+
content: [textContent(JSON.stringify({ updated: true }))],
|
|
93
|
+
isError: false,
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Get
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
const handleGet = async (db, agentName) => {
|
|
100
|
+
const result = await db.getPlan(agentName);
|
|
101
|
+
if (!result.ok) {
|
|
102
|
+
return makeErrorResult(result.error);
|
|
103
|
+
}
|
|
104
|
+
if (result.value !== null) {
|
|
105
|
+
return {
|
|
106
|
+
content: [
|
|
107
|
+
textContent(JSON.stringify({ plan: agentPlanToJson(result.value) })),
|
|
108
|
+
],
|
|
109
|
+
isError: false,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
content: [textContent(JSON.stringify({ plan: null }))],
|
|
114
|
+
isError: false,
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// List
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
const handleList = async (db) => {
|
|
121
|
+
const result = await db.listPlans();
|
|
122
|
+
if (!result.ok) {
|
|
123
|
+
return makeErrorResult(result.error);
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
content: [
|
|
127
|
+
textContent(JSON.stringify({ plans: result.value.map(agentPlanToJson) })),
|
|
128
|
+
],
|
|
129
|
+
isError: false,
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=plan_tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan_tool.js","sourceRoot":"","sources":["../../src/tools/plan_tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Logger } from "../logger.js";
|
|
2
|
+
import type { NotificationEmitter } from "../notifications.js";
|
|
3
|
+
import type { TooManyCooksDb } from "../db-interface.js";
|
|
4
|
+
import { type SessionSetter, type ToolCallback } from "../mcp-types.js";
|
|
5
|
+
/** Input schema for register tool. */
|
|
6
|
+
export declare const REGISTER_INPUT_SCHEMA: {
|
|
7
|
+
readonly type: "object";
|
|
8
|
+
readonly properties: {
|
|
9
|
+
readonly name: {
|
|
10
|
+
readonly type: "string";
|
|
11
|
+
readonly description: string;
|
|
12
|
+
};
|
|
13
|
+
readonly key: {
|
|
14
|
+
readonly type: "string";
|
|
15
|
+
readonly description: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
/** Tool config for register. */
|
|
20
|
+
export declare const REGISTER_TOOL_CONFIG: {
|
|
21
|
+
readonly title: string;
|
|
22
|
+
readonly description: string;
|
|
23
|
+
readonly inputSchema: typeof REGISTER_INPUT_SCHEMA;
|
|
24
|
+
readonly outputSchema: null;
|
|
25
|
+
readonly annotations: null;
|
|
26
|
+
};
|
|
27
|
+
/** Create register tool handler. */
|
|
28
|
+
export declare const createRegisterHandler: (db: TooManyCooksDb, emitter: NotificationEmitter, logger: Logger, setSession: SessionSetter) => ToolCallback;
|
|
29
|
+
//# sourceMappingURL=register_tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register_tool.d.ts","sourceRoot":"","sources":["../../src/tools/register_tool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAK/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,iBAAiB,CAAC;AAGzB,sCAAsC;AACtC,eAAO,MAAM,qBAAqB,EAAE;IAClC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,IAAI,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;YAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC;QACzE,QAAQ,CAAC,GAAG,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;YAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC;KACzE,CAAC;CAiBM,CAAC;AAEX,gCAAgC;AAChC,eAAO,MAAM,oBAAoB,EAAE;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,qBAAqB,CAAC;IACnD,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;CAanB,CAAC;AA0IX,oCAAoC;AACpC,eAAO,MAAM,qBAAqB,EAAE,CAClC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,aAAa,KACtB,YAmBD,CAAC"}
|