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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/build/admin_routes.d.ts +15 -0
  4. package/build/admin_routes.d.ts.map +1 -0
  5. package/build/admin_routes.js +183 -0
  6. package/build/admin_routes.js.map +1 -0
  7. package/build/config.d.ts +35 -0
  8. package/build/config.d.ts.map +1 -0
  9. package/build/config.js +44 -0
  10. package/build/config.js.map +1 -0
  11. package/build/db-contract-tests.d.ts +16 -0
  12. package/build/db-contract-tests.d.ts.map +1 -0
  13. package/build/db-contract-tests.js +498 -0
  14. package/build/db-contract-tests.js.map +1 -0
  15. package/build/db-interface.d.ts +34 -0
  16. package/build/db-interface.d.ts.map +1 -0
  17. package/build/db-interface.js +6 -0
  18. package/build/db-interface.js.map +1 -0
  19. package/build/index.d.ts +18 -0
  20. package/build/index.d.ts.map +1 -0
  21. package/build/index.js +20 -0
  22. package/build/index.js.map +1 -0
  23. package/build/logger.d.ts +45 -0
  24. package/build/logger.d.ts.map +1 -0
  25. package/build/logger.js +59 -0
  26. package/build/logger.js.map +1 -0
  27. package/build/mcp-types.d.ts +24 -0
  28. package/build/mcp-types.d.ts.map +1 -0
  29. package/build/mcp-types.js +9 -0
  30. package/build/mcp-types.js.map +1 -0
  31. package/build/notifications.d.ts +46 -0
  32. package/build/notifications.d.ts.map +1 -0
  33. package/build/notifications.js +125 -0
  34. package/build/notifications.js.map +1 -0
  35. package/build/result.d.ts +26 -0
  36. package/build/result.d.ts.map +1 -0
  37. package/build/result.js +37 -0
  38. package/build/result.js.map +1 -0
  39. package/build/server.d.ts +21 -0
  40. package/build/server.d.ts.map +1 -0
  41. package/build/server.js +120 -0
  42. package/build/server.js.map +1 -0
  43. package/build/tools/lock_tool.d.ts +22 -0
  44. package/build/tools/lock_tool.d.ts.map +1 -0
  45. package/build/tools/lock_tool.js +184 -0
  46. package/build/tools/lock_tool.js.map +1 -0
  47. package/build/tools/message_tool.d.ts +21 -0
  48. package/build/tools/message_tool.d.ts.map +1 -0
  49. package/build/tools/message_tool.js +141 -0
  50. package/build/tools/message_tool.js.map +1 -0
  51. package/build/tools/plan_tool.d.ts +21 -0
  52. package/build/tools/plan_tool.d.ts.map +1 -0
  53. package/build/tools/plan_tool.js +132 -0
  54. package/build/tools/plan_tool.js.map +1 -0
  55. package/build/tools/register_tool.d.ts +29 -0
  56. package/build/tools/register_tool.d.ts.map +1 -0
  57. package/build/tools/register_tool.js +137 -0
  58. package/build/tools/register_tool.js.map +1 -0
  59. package/build/tools/status_tool.d.ts +19 -0
  60. package/build/tools/status_tool.d.ts.map +1 -0
  61. package/build/tools/status_tool.js +51 -0
  62. package/build/tools/status_tool.js.map +1 -0
  63. package/build/tools/tool_utils.d.ts +18 -0
  64. package/build/tools/tool_utils.d.ts.map +1 -0
  65. package/build/tools/tool_utils.js +45 -0
  66. package/build/tools/tool_utils.js.map +1 -0
  67. package/build/types.d.ts +14 -0
  68. package/build/types.d.ts.map +1 -0
  69. package/build/types.gen.d.ts +76 -0
  70. package/build/types.gen.d.ts.map +1 -0
  71. package/build/types.gen.js +133 -0
  72. package/build/types.gen.js.map +1 -0
  73. package/build/types.js +16 -0
  74. package/build/types.js.map +1 -0
  75. package/package.json +39 -0
package/build/index.js ADDED
@@ -0,0 +1,20 @@
1
+ /// too-many-cooks-core barrel export.
2
+ ///
3
+ /// Everything shared between local (SQLite) and cloud (PostgreSQL) deployments.
4
+ export * from "./result.js";
5
+ export * from "./logger.js";
6
+ export * from "./types.gen.js";
7
+ export * from "./types.js";
8
+ export * from "./config.js";
9
+ export * from "./mcp-types.js";
10
+ export * from "./notifications.js";
11
+ export * from "./tools/register_tool.js";
12
+ export * from "./tools/lock_tool.js";
13
+ export * from "./tools/message_tool.js";
14
+ export * from "./tools/plan_tool.js";
15
+ export * from "./tools/status_tool.js";
16
+ export * from "./tools/tool_utils.js";
17
+ export * from "./admin_routes.js";
18
+ export { createMcpServerForDb, createConsoleLogger } from "./server.js";
19
+ export * from "./db-contract-tests.js";
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,GAAG;AACH,gFAAgF;AAEhF,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAqB,MAAM,aAAa,CAAC;AAC3F,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,45 @@
1
+ /** Log levels in order of severity. */
2
+ export declare const enum LogLevel {
3
+ TRACE = 0,
4
+ DEBUG = 1,
5
+ INFO = 2,
6
+ WARN = 3,
7
+ ERROR = 4,
8
+ FATAL = 5
9
+ }
10
+ /** Structured log message. */
11
+ export type LogMessage = {
12
+ readonly logLevel: LogLevel;
13
+ readonly message: string;
14
+ readonly structuredData: Record<string, unknown> | undefined;
15
+ readonly timestamp: Date;
16
+ };
17
+ /** Get display name for a log level. */
18
+ export declare const logLevelName: (level: LogLevel) => string;
19
+ /** Log transport function. */
20
+ export type LogFunction = (message: LogMessage, minimumLogLevel: LogLevel) => void;
21
+ /** Logger interface. */
22
+ export type Logger = {
23
+ readonly trace: (message: string, structuredData?: Record<string, unknown>) => void;
24
+ readonly debug: (message: string, structuredData?: Record<string, unknown>) => void;
25
+ readonly info: (message: string, structuredData?: Record<string, unknown>) => void;
26
+ readonly warn: (message: string, structuredData?: Record<string, unknown>) => void;
27
+ readonly error: (message: string, structuredData?: Record<string, unknown>) => void;
28
+ readonly fatal: (message: string, structuredData?: Record<string, unknown>) => void;
29
+ readonly child: (context: Record<string, unknown>) => Logger;
30
+ };
31
+ /** Logging context configuration. */
32
+ export type LoggingContext = {
33
+ readonly transports: readonly LogFunction[];
34
+ readonly minimumLogLevel: LogLevel;
35
+ };
36
+ /** Create a logging context. */
37
+ export declare const createLoggingContext: (options?: {
38
+ transports?: readonly LogFunction[];
39
+ minimumLogLevel?: LogLevel;
40
+ }) => LoggingContext;
41
+ /** Wrap a log function as a transport. */
42
+ export declare const logTransport: (fn: LogFunction) => LogFunction;
43
+ /** Create a logger from a context. */
44
+ export declare const createLoggerWithContext: (context: LoggingContext) => Logger;
45
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,uCAAuC;AACvC,0BAAkB,QAAQ;IACxB,KAAK,IAAI;IACT,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,KAAK,IAAI;CACV;AAED,8BAA8B;AAC9B,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7D,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B,CAAC;AAYF,wCAAwC;AACxC,eAAO,MAAM,YAAY,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,MAAqE,CAAC;AAEtH,8BAA8B;AAC9B,MAAM,MAAM,WAAW,GAAG,CACxB,OAAO,EAAE,UAAU,EACnB,eAAe,EAAE,QAAQ,KACtB,IAAI,CAAC;AAEV,wBAAwB;AACxB,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,KAAK,EAAE,CACd,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACrC,IAAI,CAAC;IACV,QAAQ,CAAC,KAAK,EAAE,CACd,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACrC,IAAI,CAAC;IACV,QAAQ,CAAC,IAAI,EAAE,CACb,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACrC,IAAI,CAAC;IACV,QAAQ,CAAC,IAAI,EAAE,CACb,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACrC,IAAI,CAAC;IACV,QAAQ,CAAC,KAAK,EAAE,CACd,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACrC,IAAI,CAAC;IACV,QAAQ,CAAC,KAAK,EAAE,CACd,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACrC,IAAI,CAAC;IACV,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;CAC9D,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,WAAW,EAAE,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;CACpC,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,oBAAoB,EAAE,CACjC,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACpC,eAAe,CAAC,EAAE,QAAQ,CAAC;CAC5B,KACE,cAQH,CAAC;AAEH,0CAA0C;AAC1C,eAAO,MAAM,YAAY,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,WAA2D,CAAC;AAE5G,sCAAsC;AACtC,eAAO,MAAM,uBAAuB,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,MAC3B,CAAC"}
@@ -0,0 +1,59 @@
1
+ /// Logger - replaces dart_logging package.
2
+ /** Log levels in order of severity. */
3
+ export var LogLevel;
4
+ (function (LogLevel) {
5
+ LogLevel[LogLevel["TRACE"] = 0] = "TRACE";
6
+ LogLevel[LogLevel["DEBUG"] = 1] = "DEBUG";
7
+ LogLevel[LogLevel["INFO"] = 2] = "INFO";
8
+ LogLevel[LogLevel["WARN"] = 3] = "WARN";
9
+ LogLevel[LogLevel["ERROR"] = 4] = "ERROR";
10
+ LogLevel[LogLevel["FATAL"] = 5] = "FATAL";
11
+ })(LogLevel || (LogLevel = {}));
12
+ /** Log level names for display. */
13
+ const LOG_LEVEL_NAMES = {
14
+ [LogLevel.TRACE]: "TRACE",
15
+ [LogLevel.DEBUG]: "DEBUG",
16
+ [LogLevel.INFO]: "INFO",
17
+ [LogLevel.WARN]: "WARN",
18
+ [LogLevel.ERROR]: "ERROR",
19
+ [LogLevel.FATAL]: "FATAL",
20
+ };
21
+ /** Get display name for a log level. */
22
+ export const logLevelName = (level) => { return LOG_LEVEL_NAMES[level]; };
23
+ /** Create a logging context. */
24
+ export const createLoggingContext = (options = {}) => {
25
+ return {
26
+ transports: options.transports ?? [],
27
+ minimumLogLevel: options.minimumLogLevel ?? LogLevel.DEBUG,
28
+ };
29
+ };
30
+ /** Wrap a log function as a transport. */
31
+ export const logTransport = (fn) => { return fn; };
32
+ /** Create a logger from a context. */
33
+ export const createLoggerWithContext = (context) => { return createLoggerImpl(context, {}); };
34
+ const createLoggerImpl = (context, parentData) => {
35
+ const emit = (level, message, structuredData) => {
36
+ const merged = Object.keys(parentData).length > 0 || structuredData !== undefined
37
+ ? { ...parentData, ...structuredData }
38
+ : undefined;
39
+ const msg = {
40
+ logLevel: level,
41
+ message,
42
+ structuredData: merged,
43
+ timestamp: new Date(),
44
+ };
45
+ for (const transport of context.transports) {
46
+ transport(msg, context.minimumLogLevel);
47
+ }
48
+ };
49
+ return {
50
+ trace: (msg, data) => { emit(LogLevel.TRACE, msg, data); },
51
+ debug: (msg, data) => { emit(LogLevel.DEBUG, msg, data); },
52
+ info: (msg, data) => { emit(LogLevel.INFO, msg, data); },
53
+ warn: (msg, data) => { emit(LogLevel.WARN, msg, data); },
54
+ error: (msg, data) => { emit(LogLevel.ERROR, msg, data); },
55
+ fatal: (msg, data) => { emit(LogLevel.FATAL, msg, data); },
56
+ child: (childData) => { return createLoggerImpl(context, { ...parentData, ...childData }); },
57
+ };
58
+ };
59
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** Text content item for MCP tool responses. */
2
+ export type TextContent = {
3
+ readonly type: "text";
4
+ readonly text: string;
5
+ };
6
+ /** Create text content for MCP tool responses. */
7
+ export declare const textContent: (text: string) => TextContent;
8
+ /** Session identity stored after registration. */
9
+ export type SessionIdentity = {
10
+ readonly agentName: string;
11
+ readonly agentKey: string;
12
+ };
13
+ /** Gets the current session identity (null if not registered). */
14
+ export type SessionGetter = () => SessionIdentity | null;
15
+ /** Sets the session identity after registration. */
16
+ export type SessionSetter = (agentName: string, agentKey: string) => void;
17
+ /** MCP tool call result. */
18
+ export type CallToolResult = {
19
+ readonly content: TextContent[];
20
+ readonly isError: boolean;
21
+ };
22
+ /** MCP tool callback. */
23
+ export type ToolCallback = (args: Record<string, unknown>, meta: unknown) => Promise<CallToolResult>;
24
+ //# sourceMappingURL=mcp-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-types.d.ts","sourceRoot":"","sources":["../src/mcp-types.ts"],"names":[],"mappings":"AAEA,gDAAgD;AAChD,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,WAG1C,CAAC;AAEH,kDAAkD;AAClD,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,aAAa,GAAG,MAAM,eAAe,GAAG,IAAI,CAAC;AAEzD,oDAAoD;AACpD,MAAM,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1E,4BAA4B;AAC5B,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,yBAAyB;AACzB,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,OAAO,KACV,OAAO,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /// MCP-specific types for Too Many Cooks server.
2
+ /** Create text content for MCP tool responses. */
3
+ export const textContent = (text) => {
4
+ return {
5
+ type: "text",
6
+ text,
7
+ };
8
+ };
9
+ //# sourceMappingURL=mcp-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-types.js","sourceRoot":"","sources":["../src/mcp-types.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAQjD,kDAAkD;AAClD,MAAM,CAAC,MAAM,WAAW,GAAkC,CAAC,IAAY,EAAe,EAAE;IAAE,OAAO;QAC/F,IAAI,EAAE,MAAM;QACZ,IAAI;KACL,CAAA;AAAA,CAAC,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Notification system for push-based updates.
3
+ *
4
+ * All events are pushed automatically to every connected client
5
+ * (agents + VSIX). There is no subscribe tool — subscriptions
6
+ * are managed entirely by the server based on connection state.
7
+ *
8
+ * Agents receive notifications via MCP logging messages on their
9
+ * Streamable HTTP session. This is CRITICAL — agents must know
10
+ * about new messages, lock changes, and agent status in
11
+ * real-time without polling.
12
+ */
13
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
+ import { type Result } from "./result.js";
15
+ export declare const EVENT_AGENT_REGISTERED: string;
16
+ export declare const EVENT_AGENT_ACTIVATED: string;
17
+ export declare const EVENT_AGENT_DEACTIVATED: string;
18
+ export declare const EVENT_LOCK_ACQUIRED: string;
19
+ export declare const EVENT_LOCK_RELEASED: string;
20
+ export declare const EVENT_LOCK_RENEWED: string;
21
+ export declare const EVENT_MESSAGE_SENT: string;
22
+ export declare const EVENT_PLAN_UPDATED: string;
23
+ export declare const AGENT_LOGGER_NAME: string;
24
+ export declare const BROADCAST_RECIPIENT: string;
25
+ export type EventPushFn = (event: string, payload: Record<string, unknown>) => void;
26
+ export type EventPushToAgentFn = (event: string, payload: Record<string, unknown>, toAgent: string) => void;
27
+ export type AgentEventHub = {
28
+ readonly servers: Map<string, McpServer>;
29
+ /** SessionId -> agentName, populated on register. */
30
+ readonly sessionAgentNames: Map<string, string>;
31
+ /** Sessions with an active Streamable HTTP GET stream. */
32
+ readonly activeStreamSessions: Set<string>;
33
+ readonly pushEvent: EventPushFn;
34
+ readonly pushToAgent: EventPushToAgentFn;
35
+ };
36
+ export declare const sendNotification: (server: McpServer, data: Record<string, unknown>) => Promise<Result<void, string>>;
37
+ export declare const createAgentEventHub: () => AgentEventHub;
38
+ export type NotificationEmitter = {
39
+ readonly emit: (event: string, payload: Record<string, unknown>) => void;
40
+ /** Push only to admin (VSIX), not to agents. */
41
+ readonly emitAdmin: (event: string, payload: Record<string, unknown>) => void;
42
+ /** Push only to a specific agent by name, or '*' for all. */
43
+ readonly emitToAgent: (event: string, payload: Record<string, unknown>, toAgent: string) => void;
44
+ };
45
+ export declare const createNotificationEmitter: (_server: McpServer, adminPush?: EventPushFn, agentPush?: EventPushFn, agentPushToAgent?: EventPushToAgentFn) => NotificationEmitter;
46
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,KAAK,MAAM,EAAkB,MAAM,aAAa,CAAC;AAM1D,eAAO,MAAM,sBAAsB,EAAE,MAA2B,CAAC;AACjE,eAAO,MAAM,qBAAqB,EAAE,MAA0B,CAAC;AAC/D,eAAO,MAAM,uBAAuB,EAAE,MAA4B,CAAC;AACnE,eAAO,MAAM,mBAAmB,EAAE,MAAwB,CAAC;AAC3D,eAAO,MAAM,mBAAmB,EAAE,MAAwB,CAAC;AAC3D,eAAO,MAAM,kBAAkB,EAAE,MAAuB,CAAC;AACzD,eAAO,MAAM,kBAAkB,EAAE,MAAuB,CAAC;AACzD,eAAO,MAAM,kBAAkB,EAAE,MAAuB,CAAC;AAEzD,eAAO,MAAM,iBAAiB,EAAE,MAAyB,CAAC;AAC1D,eAAO,MAAM,mBAAmB,EAAE,MAAY,CAAC;AAM/C,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,IAAI,CAAC;AAEV,MAAM,MAAM,kBAAkB,GAAG,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,KACZ,IAAI,CAAC;AAMV,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,qDAAqD;IACrD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,0DAA0D;IAC1D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;CAC1C,CAAC;AAMF,eAAO,MAAM,gBAAgB,EAAE,CAC7B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAchC,CAAC;AAgDF,eAAO,MAAM,mBAAmB,EAAE,MAAM,aAsCvC,CAAC;AAMF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,IAAI,EAAE,CACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,IAAI,CAAC;IACV,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,IAAI,CAAC;IACV,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,CACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,KACZ,IAAI,CAAC;CACX,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,CACtC,OAAO,EAAE,SAAS,EAClB,SAAS,CAAC,EAAE,WAAW,EACvB,SAAS,CAAC,EAAE,WAAW,EACvB,gBAAgB,CAAC,EAAE,kBAAkB,KAClC,mBAyBJ,CAAC"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Notification system for push-based updates.
3
+ *
4
+ * All events are pushed automatically to every connected client
5
+ * (agents + VSIX). There is no subscribe tool — subscriptions
6
+ * are managed entirely by the server based on connection state.
7
+ *
8
+ * Agents receive notifications via MCP logging messages on their
9
+ * Streamable HTTP session. This is CRITICAL — agents must know
10
+ * about new messages, lock changes, and agent status in
11
+ * real-time without polling.
12
+ */
13
+ import { error, success } from "./result.js";
14
+ // ---------------------------------------------------------------------------
15
+ // Event constants
16
+ // ---------------------------------------------------------------------------
17
+ export const EVENT_AGENT_REGISTERED = "agent_registered";
18
+ export const EVENT_AGENT_ACTIVATED = "agent_activated";
19
+ export const EVENT_AGENT_DEACTIVATED = "agent_deactivated";
20
+ export const EVENT_LOCK_ACQUIRED = "lock_acquired";
21
+ export const EVENT_LOCK_RELEASED = "lock_released";
22
+ export const EVENT_LOCK_RENEWED = "lock_renewed";
23
+ export const EVENT_MESSAGE_SENT = "message_sent";
24
+ export const EVENT_PLAN_UPDATED = "plan_updated";
25
+ export const AGENT_LOGGER_NAME = "too-many-cooks";
26
+ export const BROADCAST_RECIPIENT = "*";
27
+ // ---------------------------------------------------------------------------
28
+ // SendNotification
29
+ // ---------------------------------------------------------------------------
30
+ export const sendNotification = async (server, data) => {
31
+ try {
32
+ await server.sendLoggingMessage({
33
+ level: "info",
34
+ logger: AGENT_LOGGER_NAME,
35
+ data,
36
+ });
37
+ return success(undefined);
38
+ }
39
+ catch (e) {
40
+ return error(String(e));
41
+ }
42
+ };
43
+ // ---------------------------------------------------------------------------
44
+ // CreateAgentEventHub
45
+ // ---------------------------------------------------------------------------
46
+ /** Swallow promise rejection silently. */
47
+ const noop = () => { };
48
+ /** Fire-and-forget a promise. */
49
+ const fireAndForget = (promise) => {
50
+ promise.catch(noop);
51
+ };
52
+ /** Build a structured event data envelope. */
53
+ const makeEventData = (event, payload) => {
54
+ return {
55
+ event,
56
+ timestamp: Date.now(),
57
+ payload,
58
+ };
59
+ };
60
+ /** Create send function that pushes to a single agent session. */
61
+ const createSendFn = (activeStreamSessions) => {
62
+ return async (sessionId, server, data) => {
63
+ if (!activeStreamSessions.has(sessionId)) {
64
+ // No active Streamable HTTP connection — skip silently.
65
+ // Do NOT delete the session — the agent may reconnect later.
66
+ return;
67
+ }
68
+ console.error(`[TMC] [AGENT-PUSH] Sending to ${sessionId}`);
69
+ const result = await sendNotification(server, data);
70
+ if (result.ok) {
71
+ console.error(`[TMC] [AGENT-PUSH] Sent OK to ${sessionId}`);
72
+ }
73
+ else {
74
+ console.error(`[TMC] [AGENT-PUSH] Skipped ${sessionId} (send failed)`);
75
+ }
76
+ };
77
+ };
78
+ export const createAgentEventHub = () => {
79
+ const servers = new Map();
80
+ const sessionAgentNames = new Map();
81
+ const activeStreamSessions = new Set();
82
+ const send = createSendFn(activeStreamSessions);
83
+ const pushEvent = (event, payload) => {
84
+ console.error(`[TMC] [AGENT-PUSH] ${event} → ${String(servers.size)} agent(s)`);
85
+ const data = makeEventData(event, payload);
86
+ for (const [sessionId, server] of [...servers.entries()]) {
87
+ fireAndForget(send(sessionId, server, data));
88
+ }
89
+ };
90
+ const pushToAgent = (event, payload, toAgent) => {
91
+ const data = makeEventData(event, payload);
92
+ if (toAgent === BROADCAST_RECIPIENT) {
93
+ console.error(`[TMC] [AGENT-PUSH] ${event} (broadcast) → ${String(servers.size)} agent(s)`);
94
+ for (const [sessionId, server] of [...servers.entries()]) {
95
+ fireAndForget(send(sessionId, server, data));
96
+ }
97
+ }
98
+ else {
99
+ for (const [sessionId, agentName] of [...sessionAgentNames.entries()]) {
100
+ if (agentName === toAgent) {
101
+ const server = servers.get(sessionId);
102
+ if (server !== undefined) {
103
+ fireAndForget(send(sessionId, server, data));
104
+ }
105
+ }
106
+ }
107
+ }
108
+ };
109
+ return { servers, sessionAgentNames, activeStreamSessions, pushEvent, pushToAgent };
110
+ };
111
+ export const createNotificationEmitter = (_server, adminPush, agentPush, agentPushToAgent) => {
112
+ const emit = (event, payload) => {
113
+ adminPush?.(event, payload);
114
+ agentPush?.(event, payload);
115
+ };
116
+ const emitAdmin = (event, payload) => {
117
+ adminPush?.(event, payload);
118
+ };
119
+ const emitToAgent = (event, payload, toAgent) => {
120
+ adminPush?.(event, payload);
121
+ agentPushToAgent?.(event, payload, toAgent);
122
+ };
123
+ return { emit, emitAdmin, emitToAgent };
124
+ };
125
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /** Success variant of Result. */
2
+ export type Success<T> = {
3
+ readonly ok: true;
4
+ readonly value: T;
5
+ };
6
+ /** Error variant of Result. */
7
+ export type Err<E> = {
8
+ readonly ok: false;
9
+ readonly error: E;
10
+ };
11
+ /** Discriminated union Result type. */
12
+ export type Result<T, E> = Err<E> | Success<T>;
13
+ /** Create a Success result. */
14
+ export declare const success: <T, E = never>(value: T) => Result<T, E>;
15
+ /** Create an Error result. */
16
+ export declare const error: <T = never, E = string>(err: E) => Result<T, E>;
17
+ /** Retry policy configuration. */
18
+ export type RetryPolicy = {
19
+ readonly maxAttempts: number;
20
+ readonly baseDelayMs: number;
21
+ };
22
+ /** Default retry policy. */
23
+ export declare const defaultRetryPolicy: RetryPolicy;
24
+ /** Execute an operation with retry logic. */
25
+ export declare const withRetry: <T>(policy: RetryPolicy, isRetryable: (error: string) => boolean, operation: () => Result<T, string>, onRetry?: (attempt: number, error: string, delayMs: number) => void) => Result<T, string>;
26
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAEA,iCAAiC;AACjC,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAElE,+BAA+B;AAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAE/D,uCAAuC;AACvC,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE/C,+BAA+B;AAC/B,eAAO,MAAM,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAG3D,CAAC;AAEH,8BAA8B;AAC9B,eAAO,MAAM,KAAK,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAGhE,CAAC;AAEH,kCAAkC;AAClC,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,kBAAkB,EAAE,WAGhC,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,EACxB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,EACvC,SAAS,EAAE,MAAM,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,KAChE,MAAM,CAAC,CAAC,EAAE,MAAM,CAiBpB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /// Result type - replaces nadz package.
2
+ /** Create a Success result. */
3
+ export const success = (value) => {
4
+ return {
5
+ ok: true,
6
+ value,
7
+ };
8
+ };
9
+ /** Create an Error result. */
10
+ export const error = (err) => {
11
+ return {
12
+ ok: false,
13
+ error: err,
14
+ };
15
+ };
16
+ /** Default retry policy. */
17
+ export const defaultRetryPolicy = {
18
+ maxAttempts: 3,
19
+ baseDelayMs: 100,
20
+ };
21
+ /** Execute an operation with retry logic. */
22
+ export const withRetry = (policy, isRetryable, operation, onRetry) => {
23
+ for (let attempt = 1; attempt <= policy.maxAttempts; attempt++) {
24
+ const result = operation();
25
+ if (result.ok) {
26
+ return result;
27
+ }
28
+ if (attempt >= policy.maxAttempts || !isRetryable(result.error)) {
29
+ return result;
30
+ }
31
+ const delayMs = policy.baseDelayMs * attempt;
32
+ onRetry?.(attempt, result.error, delayMs);
33
+ // Synchronous retry - sleep not needed for SQLite retries
34
+ }
35
+ return error("Max retries exceeded");
36
+ };
37
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAWxC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,OAAO,GAA6C,CAAe,KAAQ,EAAgB,EAAE;IAAE,OAAO;QACjH,EAAE,EAAE,IAAI;QACR,KAAK;KACN,CAAA;AAAA,CAAC,CAAC;AAEH,8BAA8B;AAC9B,MAAM,CAAC,MAAM,KAAK,GAAoD,CAAwB,GAAM,EAAgB,EAAE;IAAE,OAAO;QAC7H,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,GAAG;KACX,CAAA;AAAA,CAAC,CAAC;AAQH,4BAA4B;AAC5B,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC7C,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,GAAG;CACjB,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,SAAS,GAKG,CACvB,MAAmB,EACnB,WAAuC,EACvC,SAAkC,EAClC,OAAmE,EAChD,EAAE;IACrB,KAAK,IAAI,OAAO,GAAW,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvE,MAAM,MAAM,GAAsB,SAAS,EAAE,CAAC;QAC9C,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YAAA,OAAO,MAAM,CAAC;QAAA,CAAC;QAC/B,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,OAAO,GAAW,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC;QACrD,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,0DAA0D;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACvC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { TooManyCooksDataConfig } from "./config.js";
3
+ import type { TooManyCooksDb } from "./db-interface.js";
4
+ import type { Logger } from "./logger.js";
5
+ import type { EventPushFn, EventPushToAgentFn } from "./notifications.js";
6
+ import type { Result } from "./result.js";
7
+ /** Result of creating the server - includes both MCP server and DB. */
8
+ export type ServerBundle = {
9
+ readonly server: McpServer;
10
+ readonly db: TooManyCooksDb;
11
+ };
12
+ /** Create an MCP server instance wired to a shared DB (any backend). */
13
+ export declare const createMcpServerForDb: (db: TooManyCooksDb, config: TooManyCooksDataConfig, log: Logger, options?: {
14
+ adminPush?: EventPushFn;
15
+ agentPush?: EventPushFn;
16
+ agentPushToAgent?: EventPushToAgentFn;
17
+ onSessionSet?: (agentName: string, agentKey: string) => void;
18
+ }) => Result<McpServer, string>;
19
+ /** Creates a logger that writes to console.error. */
20
+ export declare const createConsoleLogger: () => Logger;
21
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAc,MAAM,EAAE,MAAM,aAAa,CAAC;AAQtD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAkB1C,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;CAC7B,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,EAAE,CACjC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9D,KACE,MAAM,CAAC,SAAS,EAAE,MAAM,CAyC5B,CAAC;AA+GF,qDAAqD;AACrD,eAAO,MAAM,mBAAmB,EAAE,MAAM,MAMpC,CAAC"}
@@ -0,0 +1,120 @@
1
+ /// MCP server setup for Too Many Cooks.
2
+ ///
3
+ /// SHARED: Used by both local and cloud deployments.
4
+ /// Takes a TooManyCooksDb (any backend) and wires up all MCP tools.
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { z } from "zod";
7
+ import { LogLevel, createLoggerWithContext, createLoggingContext, logLevelName, logTransport, } from "./logger.js";
8
+ import { createNotificationEmitter } from "./notifications.js";
9
+ import { success } from "./result.js";
10
+ import { createLockHandler, LOCK_TOOL_CONFIG as lockToolConfig } from "./tools/lock_tool.js";
11
+ import { createMessageHandler, MESSAGE_TOOL_CONFIG as messageToolConfig } from "./tools/message_tool.js";
12
+ import { createPlanHandler, PLAN_TOOL_CONFIG as planToolConfig } from "./tools/plan_tool.js";
13
+ import { createRegisterHandler, REGISTER_TOOL_CONFIG as registerToolConfig } from "./tools/register_tool.js";
14
+ import { createStatusHandler, STATUS_TOOL_CONFIG as statusToolConfig } from "./tools/status_tool.js";
15
+ /** Server name constant. */
16
+ const SERVER_NAME = "too-many-cooks";
17
+ /** Server version constant. */
18
+ const SERVER_VERSION = "0.1.0";
19
+ /** Log prefix for console output. */
20
+ const LOG_PREFIX = "[TMC]";
21
+ /** Create an MCP server instance wired to a shared DB (any backend). */
22
+ export const createMcpServerForDb = (db, config, log, options) => {
23
+ const adminPush = options?.adminPush;
24
+ const agentPush = options?.agentPush;
25
+ const agentPushToAgent = options?.agentPushToAgent;
26
+ const onSessionSet = options?.onSessionSet;
27
+ const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: { listChanged: true }, logging: {} } });
28
+ log.debug("MCP server created");
29
+ const emitter = createNotificationEmitter(server, adminPush, agentPush, agentPushToAgent);
30
+ // Per-connection session state
31
+ let session = null;
32
+ const getSession = () => { return session; };
33
+ const setSession = (name, key) => {
34
+ session = { agentName: name, agentKey: key };
35
+ onSessionSet?.(name, key);
36
+ log.info(`Session established for agent: ${name}`);
37
+ };
38
+ registerTools(server, db, config, emitter, log, getSession, setSession);
39
+ log.info("Server initialized with all tools registered");
40
+ return success(server);
41
+ };
42
+ /** Zod schema for register tool input. */
43
+ const registerZodSchema = {
44
+ name: z.string().optional().describe("Your unique agent name, 1-50 chars. For FIRST registration only. Do NOT send with key."),
45
+ key: z.string().optional().describe("Your secret key from a previous registration. For RECONNECT only. Do NOT send with name."),
46
+ };
47
+ /** Zod schema for lock tool input. */
48
+ const lockZodSchema = {
49
+ action: z.enum(["acquire", "release", "force_release", "renew", "query", "list"])
50
+ .describe("Lock action to perform"),
51
+ file_path: z.string().optional()
52
+ .describe("File path to lock (required except for list)"),
53
+ reason: z.string().optional()
54
+ .describe("Why you need this lock (optional, for acquire)"),
55
+ agent_key: z.string().optional()
56
+ .describe("Agent key for authentication (optional, uses session if omitted)"),
57
+ };
58
+ /** Zod schema for message tool input. */
59
+ const messageZodSchema = {
60
+ action: z.enum(["send", "get", "mark_read"])
61
+ .describe("Message action to perform"),
62
+ to_agent: z.string().optional()
63
+ .describe("Recipient name or * for broadcast (for send)"),
64
+ content: z.string().max(200).optional()
65
+ .describe("Message content (for send). MUST be 200 chars or less."),
66
+ message_id: z.string().optional()
67
+ .describe("Message ID (for mark_read)"),
68
+ unread_only: z.boolean().optional()
69
+ .describe("Only return unread messages (default: true)"),
70
+ agent_key: z.string().optional()
71
+ .describe("Agent key for authentication (optional, uses session if omitted)"),
72
+ };
73
+ /** Zod schema for plan tool input. */
74
+ const planZodSchema = {
75
+ action: z.enum(["update", "get", "list"])
76
+ .describe("Plan action to perform"),
77
+ goal: z.string().max(100).optional()
78
+ .describe("Your goal (for update). MUST be 100 chars or less."),
79
+ current_task: z.string().max(100).optional()
80
+ .describe("What you are doing now (for update). MUST be 100 chars or less."),
81
+ agent_key: z.string().optional()
82
+ .describe("Agent key for authentication (optional, uses session if omitted)"),
83
+ };
84
+ /** Zod schema for status tool input (empty). */
85
+ const statusZodSchema = {};
86
+ /**
87
+ * Wrap a local ToolCallback so it satisfies the MCP SDK's typed callback
88
+ * signature without using type assertions.
89
+ */
90
+ const wrapHandler = (handler) => async (args, extra) => {
91
+ return await handler(args, extra);
92
+ };
93
+ /** Register all tools on the MCP server. */
94
+ const registerTools = (server, db, config, emitter, log, getSession, setSession) => {
95
+ server.registerTool("register", { description: registerToolConfig.description, inputSchema: registerZodSchema }, wrapHandler(createRegisterHandler(db, emitter, log, setSession)));
96
+ server.registerTool("lock", { description: lockToolConfig.description, inputSchema: lockZodSchema }, wrapHandler(createLockHandler(db, config, emitter, log, getSession)));
97
+ server.registerTool("message", { description: messageToolConfig.description, inputSchema: messageZodSchema }, wrapHandler(createMessageHandler(db, emitter, log, getSession)));
98
+ server.registerTool("plan", { description: planToolConfig.description, inputSchema: planZodSchema }, wrapHandler(createPlanHandler(db, emitter, log, getSession)));
99
+ server.registerTool("status", { description: statusToolConfig.description, inputSchema: statusZodSchema }, wrapHandler(createStatusHandler(db, log)));
100
+ };
101
+ /** Creates a logger that writes to console.error. */
102
+ export const createConsoleLogger = () => {
103
+ return createLoggerWithContext(createLoggingContext({
104
+ transports: [logTransport(logToConsole)],
105
+ minimumLogLevel: LogLevel.DEBUG,
106
+ }));
107
+ };
108
+ /** Log transport that writes to console.error. */
109
+ const logToConsole = (message, minimumLogLevel) => {
110
+ if (message.logLevel < minimumLogLevel) {
111
+ return;
112
+ }
113
+ const level = logLevelName(message.logLevel);
114
+ const data = message.structuredData;
115
+ const dataStr = data !== undefined && Object.keys(data).length > 0
116
+ ? ` ${JSON.stringify(data)}`
117
+ : "";
118
+ console.error(`${LOG_PREFIX} [${level}] ${message.message}${dataStr}`);
119
+ };
120
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Logger } from "../logger.js";
2
+ import type { NotificationEmitter } from "../notifications.js";
3
+ import type { TooManyCooksDataConfig } from "../config.js";
4
+ import type { TooManyCooksDb } from "../db-interface.js";
5
+ import { type SessionGetter, type ToolCallback } from "../mcp-types.js";
6
+ /** Input schema for lock tool. */
7
+ export declare const LOCK_INPUT_SCHEMA: {
8
+ readonly type: "object";
9
+ readonly properties: Record<string, unknown>;
10
+ readonly required: readonly string[];
11
+ };
12
+ /** Tool config for lock. */
13
+ export declare const LOCK_TOOL_CONFIG: {
14
+ readonly title: string;
15
+ readonly description: string;
16
+ readonly inputSchema: typeof LOCK_INPUT_SCHEMA;
17
+ readonly outputSchema: null;
18
+ readonly annotations: null;
19
+ };
20
+ /** Create lock tool handler. */
21
+ export declare const createLockHandler: (db: TooManyCooksDb, config: TooManyCooksDataConfig, emitter: NotificationEmitter, logger: Logger, getSession: SessionGetter) => ToolCallback;
22
+ //# sourceMappingURL=lock_tool.d.ts.map