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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 NIMBLESITE PTY LTD
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# too-many-cooks-core
|
|
2
|
+
|
|
3
|
+
Core types, tools, and interfaces for [Too Many Cooks](https://github.com/MelbourneDeveloper/too-many-cooks) multi-agent coordination.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install too-many-cooks-core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What's Inside
|
|
12
|
+
|
|
13
|
+
- **Database interface** (`TooManyCooksDb`) - the contract every backend implements
|
|
14
|
+
- **Database contract tests** - portable test suite to verify any backend implementation
|
|
15
|
+
- **Tool definitions** - MCP tool schemas and handlers for register, lock, message, plan, status
|
|
16
|
+
- **Result type** - `Result<T, E>` for error handling without exceptions
|
|
17
|
+
- **Server utilities** - Streamable HTTP transport setup, admin routes, notification emitter
|
|
18
|
+
- **Type definitions** - `Agent`, `FileLock`, `Message`, `AgentPlan`, and more
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import type { TooManyCooksDb, Agent, Message } from "too-many-cooks-core";
|
|
24
|
+
import { success, error } from "too-many-cooks-core";
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
This package is used by:
|
|
28
|
+
- [`too-many-cooks`](https://www.npmjs.com/package/too-many-cooks) - the MCP server
|
|
29
|
+
- [`tmc-cloud`](https://github.com/MelbourneDeveloper/tmc-cloud) - the SaaS backend
|
|
30
|
+
|
|
31
|
+
## Documentation
|
|
32
|
+
|
|
33
|
+
See the [spec](https://github.com/MelbourneDeveloper/too-many-cooks/blob/main/docs/spec.md) for the full protocol specification.
|
|
34
|
+
|
|
35
|
+
[tmc-mcp.dev](https://tmc-mcp.dev)
|
|
36
|
+
|
|
37
|
+
## License
|
|
38
|
+
|
|
39
|
+
MIT
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Express } from "express";
|
|
2
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import type { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
4
|
+
import type { TooManyCooksDb } from "./db-interface.js";
|
|
5
|
+
/** Admin event hub - manages Streamable HTTP transports for pushing real-time events to the VSIX. */
|
|
6
|
+
export type AdminEventHub = {
|
|
7
|
+
readonly transports: Map<string, StreamableHTTPServerTransport>;
|
|
8
|
+
readonly servers: Map<string, McpServer>;
|
|
9
|
+
readonly pushEvent: (event: string, payload: Record<string, unknown>) => void;
|
|
10
|
+
};
|
|
11
|
+
/** Create an admin event hub for Streamable HTTP push. */
|
|
12
|
+
export declare const createAdminEventHub: () => AdminEventHub;
|
|
13
|
+
/** Register all admin routes on an Express app. */
|
|
14
|
+
export declare const registerAdminRoutes: (app: Express, db: TooManyCooksDb, hub: AdminEventHub) => void;
|
|
15
|
+
//# sourceMappingURL=admin_routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin_routes.d.ts","sourceRoot":"","sources":["../src/admin_routes.ts"],"names":[],"mappings":"AAMA,OAAgB,EAAE,KAAK,OAAO,EAA+B,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAexD,qGAAqG;AACrG,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,IAAI,CAAC;CACX,CAAC;AAkCF,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,EAAE,MAAM,aA0BvC,CAAC;AAmLF,mDAAmD;AACnD,eAAO,MAAM,mBAAmB,EAAE,CAChC,GAAG,EAAE,OAAO,EACZ,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,aAAa,KACf,IAYJ,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/// Admin REST endpoints for the VSCode extension.
|
|
2
|
+
///
|
|
3
|
+
/// The VSIX talks to these endpoints - never touches the DB directly.
|
|
4
|
+
/// Streamable HTTP endpoint pushes all state changes in real-time.
|
|
5
|
+
/// SHARED: Used by both local and cloud deployments.
|
|
6
|
+
import express from "express";
|
|
7
|
+
import { agentIdentityToJson, agentPlanToJson, agentRegistrationToJson, dbErrorToJson, fileLockToJson, messageToJson, } from "./types.gen.js";
|
|
8
|
+
/** Logger name for admin push events. */
|
|
9
|
+
const ADMIN_LOGGER_NAME = "too-many-cooks-admin";
|
|
10
|
+
/** Send a push event to all connected admin servers. */
|
|
11
|
+
const sendToServer = async (entry, data, servers, transports) => {
|
|
12
|
+
const [key, server] = entry;
|
|
13
|
+
console.error(`[TMC] [PUSH] Sending to ${key}`);
|
|
14
|
+
try {
|
|
15
|
+
await server.sendLoggingMessage({
|
|
16
|
+
level: "info",
|
|
17
|
+
logger: ADMIN_LOGGER_NAME,
|
|
18
|
+
data,
|
|
19
|
+
});
|
|
20
|
+
console.error(`[TMC] [PUSH] Sent OK to ${key}`);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
console.error(`[TMC] [PUSH] FAILED ${key}`);
|
|
24
|
+
servers.delete(key);
|
|
25
|
+
transports.delete(key);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
/** Helper to safely extract body as Record. */
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
30
|
+
const extractBody = (req) => { return req.body; };
|
|
31
|
+
/** Create an admin event hub for Streamable HTTP push. */
|
|
32
|
+
export const createAdminEventHub = () => {
|
|
33
|
+
const transports = new Map();
|
|
34
|
+
const servers = new Map();
|
|
35
|
+
const pushEvent = (event, payload) => {
|
|
36
|
+
console.error(`[TMC] [PUSH] ${event} -> ${String(servers.size)} server(s), ${String(transports.size)} transport(s)`);
|
|
37
|
+
const data = {
|
|
38
|
+
event,
|
|
39
|
+
timestamp: Date.now(),
|
|
40
|
+
payload,
|
|
41
|
+
};
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
43
|
+
Promise.all([...servers.entries()].map(
|
|
44
|
+
// eslint-disable-next-line require-await
|
|
45
|
+
async (entry) => { return sendToServer(entry, data, servers, transports); }));
|
|
46
|
+
};
|
|
47
|
+
return { transports, servers, pushEvent };
|
|
48
|
+
};
|
|
49
|
+
/** Send an error response. */
|
|
50
|
+
const sendError = (res, code, message) => {
|
|
51
|
+
res.status(code).send(message);
|
|
52
|
+
};
|
|
53
|
+
/** Extract a string field from the request body, or undefined. */
|
|
54
|
+
const stringField = (body, field) => {
|
|
55
|
+
const value = body[field];
|
|
56
|
+
return typeof value === "string" ? value : undefined;
|
|
57
|
+
};
|
|
58
|
+
/** Register GET /admin/status route. */
|
|
59
|
+
const registerStatusRoute = (app, db) => {
|
|
60
|
+
app.get("/admin/status", async (_req, res) => {
|
|
61
|
+
const agentsResult = await db.listAgents();
|
|
62
|
+
const agents = agentsResult.ok
|
|
63
|
+
? agentsResult.value.map(agentIdentityToJson)
|
|
64
|
+
: [];
|
|
65
|
+
const locksResult = await db.listLocks();
|
|
66
|
+
const locks = locksResult.ok
|
|
67
|
+
? locksResult.value.map(fileLockToJson)
|
|
68
|
+
: [];
|
|
69
|
+
const plansResult = await db.listPlans();
|
|
70
|
+
const plans = plansResult.ok
|
|
71
|
+
? plansResult.value.map(agentPlanToJson)
|
|
72
|
+
: [];
|
|
73
|
+
const messagesResult = await db.listAllMessages();
|
|
74
|
+
const messages = messagesResult.ok
|
|
75
|
+
? messagesResult.value.map(messageToJson)
|
|
76
|
+
: [];
|
|
77
|
+
res
|
|
78
|
+
.set("Content-Type", "application/json")
|
|
79
|
+
.send(JSON.stringify({ agents, locks, plans, messages }));
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
/** Register POST /admin/delete-lock route. */
|
|
83
|
+
const registerDeleteLockRoute = (app, db, hub) => {
|
|
84
|
+
app.post("/admin/delete-lock", async (req, res) => {
|
|
85
|
+
const filePath = stringField(extractBody(req), "filePath");
|
|
86
|
+
if (filePath === undefined) {
|
|
87
|
+
sendError(res, 400, "filePath required");
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const result = await db.adminDeleteLock(filePath);
|
|
91
|
+
if (result.ok) {
|
|
92
|
+
hub.pushEvent("lock_released", { file_path: filePath });
|
|
93
|
+
res.send(JSON.stringify({ deleted: true }));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
sendError(res, 400, JSON.stringify(dbErrorToJson(result.error)));
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
/** Register POST /admin/delete-agent route. */
|
|
101
|
+
const registerDeleteAgentRoute = (app, db, hub) => {
|
|
102
|
+
app.post("/admin/delete-agent", async (req, res) => {
|
|
103
|
+
const agentName = stringField(extractBody(req), "agentName");
|
|
104
|
+
if (agentName === undefined) {
|
|
105
|
+
sendError(res, 400, "agentName required");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const result = await db.adminDeleteAgent(agentName);
|
|
109
|
+
if (result.ok) {
|
|
110
|
+
hub.pushEvent("agent_deleted", { agent_name: agentName });
|
|
111
|
+
res.send(JSON.stringify({ deleted: true }));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
sendError(res, 400, JSON.stringify(dbErrorToJson(result.error)));
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
/** Register POST /admin/reset-key route. */
|
|
119
|
+
const registerResetKeyRoute = (app, db) => {
|
|
120
|
+
app.post("/admin/reset-key", async (req, res) => {
|
|
121
|
+
const agentName = stringField(extractBody(req), "agentName");
|
|
122
|
+
if (agentName === undefined) {
|
|
123
|
+
sendError(res, 400, "agentName required");
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const result = await db.adminResetKey(agentName);
|
|
127
|
+
if (result.ok) {
|
|
128
|
+
res.send(JSON.stringify(agentRegistrationToJson(result.value)));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
sendError(res, 400, JSON.stringify(dbErrorToJson(result.error)));
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
/** Register POST /admin/send-message route. */
|
|
136
|
+
const registerSendMessageRoute = (app, db, hub) => {
|
|
137
|
+
app.post("/admin/send-message", async (req, res) => {
|
|
138
|
+
const body = extractBody(req);
|
|
139
|
+
const fromAgent = stringField(body, "fromAgent");
|
|
140
|
+
const toAgent = stringField(body, "toAgent");
|
|
141
|
+
const content = stringField(body, "content");
|
|
142
|
+
if (fromAgent === undefined || toAgent === undefined || content === undefined) {
|
|
143
|
+
sendError(res, 400, "fromAgent, toAgent, content required");
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const result = await db.adminSendMessage(fromAgent, toAgent, content);
|
|
147
|
+
if (result.ok) {
|
|
148
|
+
hub.pushEvent("message_sent", {
|
|
149
|
+
from_agent: fromAgent,
|
|
150
|
+
to_agent: toAgent,
|
|
151
|
+
message_id: result.value,
|
|
152
|
+
});
|
|
153
|
+
res.send(JSON.stringify({ sent: true, message_id: result.value }));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
sendError(res, 400, JSON.stringify(dbErrorToJson(result.error)));
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
/** Register POST /admin/reset route. */
|
|
161
|
+
const registerResetRoute = (app, db, hub) => {
|
|
162
|
+
app.post("/admin/reset", async (_req, res) => {
|
|
163
|
+
const result = await db.adminReset();
|
|
164
|
+
if (result.ok) {
|
|
165
|
+
hub.pushEvent("state_reset", {});
|
|
166
|
+
res.send(JSON.stringify({ reset: true }));
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
sendError(res, 500, JSON.stringify(dbErrorToJson(result.error)));
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
/** Register all admin routes on an Express app. */
|
|
174
|
+
export const registerAdminRoutes = (app, db, hub) => {
|
|
175
|
+
app.use(express.json());
|
|
176
|
+
registerStatusRoute(app, db);
|
|
177
|
+
registerDeleteLockRoute(app, db, hub);
|
|
178
|
+
registerDeleteAgentRoute(app, db, hub);
|
|
179
|
+
registerResetKeyRoute(app, db);
|
|
180
|
+
registerSendMessageRoute(app, db, hub);
|
|
181
|
+
registerResetRoute(app, db, hub);
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=admin_routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin_routes.js","sourceRoot":"","sources":["../src/admin_routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Data layer configuration. */
|
|
2
|
+
export type TooManyCooksDataConfig = {
|
|
3
|
+
readonly dbPath: string;
|
|
4
|
+
readonly lockTimeoutMs: number;
|
|
5
|
+
readonly maxMessageLength: number;
|
|
6
|
+
readonly maxPlanLength: number;
|
|
7
|
+
};
|
|
8
|
+
/** Resolve database path for a workspace folder. */
|
|
9
|
+
export declare const resolveDbPath: (workspaceFolder: string) => string;
|
|
10
|
+
/** Default lock timeout in milliseconds (10 minutes). */
|
|
11
|
+
export declare const DEFAULT_LOCK_TIMEOUT_MS: number;
|
|
12
|
+
/** Default maximum message length in characters. */
|
|
13
|
+
export declare const DEFAULT_MAX_MESSAGE_LENGTH: number;
|
|
14
|
+
/** Default maximum plan field length in characters. */
|
|
15
|
+
export declare const DEFAULT_MAX_PLAN_LENGTH: number;
|
|
16
|
+
/** Create config with explicit dbPath. */
|
|
17
|
+
export declare const createDataConfig: (params: {
|
|
18
|
+
readonly dbPath: string;
|
|
19
|
+
readonly lockTimeoutMs?: number;
|
|
20
|
+
readonly maxMessageLength?: number;
|
|
21
|
+
readonly maxPlanLength?: number;
|
|
22
|
+
}) => TooManyCooksDataConfig;
|
|
23
|
+
/** Create config from workspace folder. */
|
|
24
|
+
export declare const createDataConfigFromWorkspace: (workspaceFolder: string) => TooManyCooksDataConfig;
|
|
25
|
+
/** Get workspace folder from TMC_WORKSPACE env var or process.cwd(). */
|
|
26
|
+
export declare const getWorkspaceFolder: () => string;
|
|
27
|
+
/** Default server port. */
|
|
28
|
+
export declare const DEFAULT_PORT: number;
|
|
29
|
+
/** Get server port from TMC_PORT env var or default (4040). */
|
|
30
|
+
export declare const getServerPort: () => number;
|
|
31
|
+
/** Default configuration using the resolved workspace folder. */
|
|
32
|
+
export declare const defaultConfig: TooManyCooksDataConfig;
|
|
33
|
+
/** Join path segments. */
|
|
34
|
+
export declare const pathJoin: (segments: readonly string[]) => string;
|
|
35
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AASA,gCAAgC;AAChC,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,aAAa,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,MACF,CAAC;AAExD,yDAAyD;AACzD,eAAO,MAAM,uBAAuB,EAAE,MAAe,CAAC;AAEtD,oDAAoD;AACpD,eAAO,MAAM,0BAA0B,EAAE,MAAY,CAAC;AAEtD,uDAAuD;AACvD,eAAO,MAAM,uBAAuB,EAAE,MAAY,CAAC;AAEnD,0CAA0C;AAC1C,eAAO,MAAM,gBAAgB,EAAE,CAAC,MAAM,EAAE;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,KAAK,sBAUJ,CAAC;AAEH,2CAA2C;AAC3C,eAAO,MAAM,6BAA6B,EAAE,CAC1C,eAAe,EAAE,MAAM,KACpB,sBAE6F,CAAC;AAEnG,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,EAAE,MAAM,MACc,CAAC;AAEtD,2BAA2B;AAC3B,eAAO,MAAM,YAAY,EAAE,MAAa,CAAC;AAEzC,+DAA+D;AAC/D,eAAO,MAAM,aAAa,EAAE,MAAM,MAKjC,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,aAAa,EAAE,sBACyB,CAAC;AAEtD,0BAA0B;AAC1B,eAAO,MAAM,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,KAAK,MACvB,CAAC"}
|
package/build/config.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/// Configuration for Too Many Cooks data layer.
|
|
2
|
+
///
|
|
3
|
+
/// SINGLE SOURCE OF TRUTH for database path resolution.
|
|
4
|
+
/// Only the MCP server uses the database. The VSCode extension
|
|
5
|
+
/// communicates exclusively via HTTP to the MCP server.
|
|
6
|
+
/// The database is ALWAYS at `${workspaceFolder}/.too_many_cooks/data.db`.
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
/** Resolve database path for a workspace folder. */
|
|
9
|
+
export const resolveDbPath = (workspaceFolder) => { return `${workspaceFolder}/.too_many_cooks/data.db`; };
|
|
10
|
+
/** Default lock timeout in milliseconds (10 minutes). */
|
|
11
|
+
export const DEFAULT_LOCK_TIMEOUT_MS = 600000;
|
|
12
|
+
/** Default maximum message length in characters. */
|
|
13
|
+
export const DEFAULT_MAX_MESSAGE_LENGTH = 200;
|
|
14
|
+
/** Default maximum plan field length in characters. */
|
|
15
|
+
export const DEFAULT_MAX_PLAN_LENGTH = 100;
|
|
16
|
+
/** Create config with explicit dbPath. */
|
|
17
|
+
export const createDataConfig = (params) => {
|
|
18
|
+
return {
|
|
19
|
+
dbPath: params.dbPath,
|
|
20
|
+
lockTimeoutMs: params.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS,
|
|
21
|
+
maxMessageLength: params.maxMessageLength ?? DEFAULT_MAX_MESSAGE_LENGTH,
|
|
22
|
+
maxPlanLength: params.maxPlanLength ?? DEFAULT_MAX_PLAN_LENGTH,
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
/** Create config from workspace folder. */
|
|
26
|
+
export const createDataConfigFromWorkspace = (workspaceFolder) => { return createDataConfig({ dbPath: resolveDbPath(workspaceFolder) }); };
|
|
27
|
+
/** Get workspace folder from TMC_WORKSPACE env var or process.cwd(). */
|
|
28
|
+
export const getWorkspaceFolder = () => { return process.env.TMC_WORKSPACE ?? process.cwd(); };
|
|
29
|
+
/** Default server port. */
|
|
30
|
+
export const DEFAULT_PORT = 4040;
|
|
31
|
+
/** Get server port from TMC_PORT env var or default (4040). */
|
|
32
|
+
export const getServerPort = () => {
|
|
33
|
+
const raw = process.env.TMC_PORT;
|
|
34
|
+
if (raw === undefined) {
|
|
35
|
+
return DEFAULT_PORT;
|
|
36
|
+
}
|
|
37
|
+
const parsed = parseInt(raw, 10);
|
|
38
|
+
return isNaN(parsed) ? DEFAULT_PORT : parsed;
|
|
39
|
+
};
|
|
40
|
+
/** Default configuration using the resolved workspace folder. */
|
|
41
|
+
export const defaultConfig = createDataConfigFromWorkspace(getWorkspaceFolder());
|
|
42
|
+
/** Join path segments. */
|
|
43
|
+
export const pathJoin = (segments) => { return path.join(...segments); };
|
|
44
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,GAAG;AACH,wDAAwD;AACxD,+DAA+D;AAC/D,wDAAwD;AACxD,2EAA2E;AAE3E,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,oDAAoD;AACpD,MAAM,CAAC,MAAM,aAAa,GAAwC,CAAC,eAAuB,EAAU,EAAE,GACnG,OAAO,GAAG,eAAe,0BAA0B,CAAA,CAAA,CAAC,CAAC;AAExD,yDAAyD;AACzD,MAAM,CAAC,MAAM,uBAAuB,GAAW,MAAM,CAAC;AAEtD,oDAAoD;AACpD,MAAM,CAAC,MAAM,0BAA0B,GAAW,GAAG,CAAC;AAEtD,uDAAuD;AACvD,MAAM,CAAC,MAAM,uBAAuB,GAAW,GAAG,CAAC;AAEnD,0CAA0C;AAC1C,MAAM,CAAC,MAAM,gBAAgB,GAKE,CAAC,MAK/B,EAA0B,EAAE;IAAE,OAAO;QACpC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,uBAAuB;QAC9D,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,0BAA0B;QACvE,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,uBAAuB;KAC/D,CAAA;AAAA,CAAC,CAAC;AAEH,2CAA2C;AAC3C,MAAM,CAAC,MAAM,6BAA6B,GAEZ,CAC5B,eAAuB,EACC,EAAE,GAAE,OAAO,gBAAgB,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA,CAAA,CAAC,CAAC;AAEnG,wEAAwE;AACxE,MAAM,CAAC,MAAM,kBAAkB,GAAiB,GAAW,EAAE,GAC1D,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA,CAAA,CAAC,CAAC;AAEtD,2BAA2B;AAC3B,MAAM,CAAC,MAAM,YAAY,GAAW,IAAI,CAAC;AAEzC,+DAA+D;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAiB,GAAW,EAAE;IACtD,MAAM,GAAG,GAAuB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAAA,OAAO,YAAY,CAAC;IAAA,CAAC;IAC7C,MAAM,MAAM,GAAW,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC,CAAC;AAEF,iEAAiE;AACjE,MAAM,CAAC,MAAM,aAAa,GACxB,6BAA6B,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAEtD,0BAA0B;AAC1B,MAAM,CAAC,MAAM,QAAQ,GAA4C,CAAC,QAA2B,EAAU,EAAE,GACtG,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA,CAAA,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TooManyCooksDb } from "./db-interface.js";
|
|
2
|
+
/** Result of creating a test db instance. */
|
|
3
|
+
type DbInstance = {
|
|
4
|
+
readonly db: TooManyCooksDb;
|
|
5
|
+
readonly cleanup: () => Promise<void>;
|
|
6
|
+
};
|
|
7
|
+
/** Factory type for creating test db instances. */
|
|
8
|
+
type DbFactory = () => Promise<DbInstance>;
|
|
9
|
+
/**
|
|
10
|
+
* Run the full TooManyCooksDb contract test suite.
|
|
11
|
+
*
|
|
12
|
+
* @param createTestDb - Factory that creates a fresh db instance per test
|
|
13
|
+
*/
|
|
14
|
+
export declare const runDbContractTests: (createTestDb: DbFactory) => void;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=db-contract-tests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-contract-tests.d.ts","sourceRoot":"","sources":["../src/db-contract-tests.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,6CAA6C;AAC7C,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,CAAC;AAEF,mDAAmD;AACnD,KAAK,SAAS,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;AA2mB3C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,CAAC,YAAY,EAAE,SAAS,KAAK,IAQ7D,CAAC"}
|