@nonz250/notepm-mcp-server 0.2.0 → 0.3.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 (185) hide show
  1. package/dist/index.js +13 -6
  2. package/dist/index.js.map +1 -1
  3. package/dist/mcp/__tests__/handler.test.d.ts +2 -0
  4. package/dist/mcp/__tests__/handler.test.d.ts.map +1 -0
  5. package/dist/mcp/__tests__/handler.test.js +345 -0
  6. package/dist/mcp/__tests__/handler.test.js.map +1 -0
  7. package/dist/mcp/__tests__/tools.test.d.ts +2 -0
  8. package/dist/mcp/__tests__/tools.test.d.ts.map +1 -0
  9. package/dist/mcp/__tests__/tools.test.js +43 -0
  10. package/dist/mcp/__tests__/tools.test.js.map +1 -0
  11. package/dist/mcp/handler.d.ts +20 -0
  12. package/dist/mcp/handler.d.ts.map +1 -0
  13. package/dist/mcp/handler.js +31 -0
  14. package/dist/mcp/handler.js.map +1 -0
  15. package/dist/mcp/index.d.ts +6 -0
  16. package/dist/mcp/index.d.ts.map +1 -0
  17. package/dist/mcp/index.js +6 -0
  18. package/dist/mcp/index.js.map +1 -0
  19. package/dist/mcp/tools.d.ts +11 -0
  20. package/dist/mcp/tools.d.ts.map +1 -0
  21. package/dist/mcp/tools.js +8 -0
  22. package/dist/mcp/tools.js.map +1 -0
  23. package/dist/notes/__tests__/client.test.d.ts +2 -0
  24. package/dist/notes/__tests__/client.test.d.ts.map +1 -0
  25. package/dist/notes/__tests__/client.test.js +91 -0
  26. package/dist/notes/__tests__/client.test.js.map +1 -0
  27. package/dist/notes/__tests__/schemas.test.d.ts +2 -0
  28. package/dist/notes/__tests__/schemas.test.d.ts.map +1 -0
  29. package/dist/notes/__tests__/schemas.test.js +227 -0
  30. package/dist/notes/__tests__/schemas.test.js.map +1 -0
  31. package/dist/notes/client.d.ts +45 -0
  32. package/dist/notes/client.d.ts.map +1 -0
  33. package/dist/notes/client.js +68 -0
  34. package/dist/notes/client.js.map +1 -0
  35. package/dist/notes/handlers.d.ts +15 -0
  36. package/dist/notes/handlers.d.ts.map +1 -0
  37. package/dist/notes/handlers.js +79 -0
  38. package/dist/notes/handlers.js.map +1 -0
  39. package/dist/notes/index.d.ts +9 -0
  40. package/dist/notes/index.d.ts.map +1 -0
  41. package/dist/notes/index.js +9 -0
  42. package/dist/notes/index.js.map +1 -0
  43. package/dist/notes/schemas.d.ts +57 -0
  44. package/dist/notes/schemas.d.ts.map +1 -0
  45. package/dist/notes/schemas.js +51 -0
  46. package/dist/notes/schemas.js.map +1 -0
  47. package/dist/notes/tools.d.ts +6 -0
  48. package/dist/notes/tools.d.ts.map +1 -0
  49. package/dist/notes/tools.js +41 -0
  50. package/dist/notes/tools.js.map +1 -0
  51. package/dist/notes/types.d.ts +64 -0
  52. package/dist/notes/types.d.ts.map +1 -0
  53. package/dist/notes/types.js +14 -0
  54. package/dist/notes/types.js.map +1 -0
  55. package/dist/pages/__tests__/client.test.d.ts +2 -0
  56. package/dist/pages/__tests__/client.test.d.ts.map +1 -0
  57. package/dist/pages/__tests__/client.test.js +119 -0
  58. package/dist/pages/__tests__/client.test.js.map +1 -0
  59. package/dist/pages/__tests__/schemas.test.d.ts +2 -0
  60. package/dist/pages/__tests__/schemas.test.d.ts.map +1 -0
  61. package/dist/pages/__tests__/schemas.test.js +299 -0
  62. package/dist/pages/__tests__/schemas.test.js.map +1 -0
  63. package/dist/pages/client.d.ts +35 -0
  64. package/dist/pages/client.d.ts.map +1 -0
  65. package/dist/pages/client.js +62 -0
  66. package/dist/pages/client.js.map +1 -0
  67. package/dist/pages/handlers.d.ts +15 -0
  68. package/dist/pages/handlers.d.ts.map +1 -0
  69. package/dist/pages/handlers.js +66 -0
  70. package/dist/pages/handlers.js.map +1 -0
  71. package/dist/pages/index.d.ts +9 -0
  72. package/dist/pages/index.d.ts.map +1 -0
  73. package/dist/pages/index.js +9 -0
  74. package/dist/pages/index.js.map +1 -0
  75. package/dist/pages/schemas.d.ts +44 -0
  76. package/dist/pages/schemas.d.ts.map +1 -0
  77. package/dist/pages/schemas.js +43 -0
  78. package/dist/pages/schemas.js.map +1 -0
  79. package/dist/pages/tools.d.ts +6 -0
  80. package/dist/pages/tools.d.ts.map +1 -0
  81. package/dist/pages/tools.js +31 -0
  82. package/dist/pages/tools.js.map +1 -0
  83. package/dist/pages/types.d.ts +65 -0
  84. package/dist/pages/types.d.ts.map +1 -0
  85. package/dist/pages/types.js +9 -0
  86. package/dist/pages/types.js.map +1 -0
  87. package/dist/shared/__tests__/config.test.d.ts +2 -0
  88. package/dist/shared/__tests__/config.test.d.ts.map +1 -0
  89. package/dist/shared/__tests__/config.test.js +30 -0
  90. package/dist/shared/__tests__/config.test.js.map +1 -0
  91. package/dist/shared/__tests__/fixtures.d.ts +34 -0
  92. package/dist/shared/__tests__/fixtures.d.ts.map +1 -0
  93. package/dist/shared/__tests__/fixtures.js +79 -0
  94. package/dist/shared/__tests__/fixtures.js.map +1 -0
  95. package/dist/shared/__tests__/http-client.test.d.ts +2 -0
  96. package/dist/shared/__tests__/http-client.test.d.ts.map +1 -0
  97. package/dist/shared/__tests__/http-client.test.js +120 -0
  98. package/dist/shared/__tests__/http-client.test.js.map +1 -0
  99. package/dist/shared/config.d.ts.map +1 -0
  100. package/dist/shared/config.js.map +1 -0
  101. package/dist/shared/errors.d.ts +14 -0
  102. package/dist/shared/errors.d.ts.map +1 -0
  103. package/dist/shared/errors.js +22 -0
  104. package/dist/shared/errors.js.map +1 -0
  105. package/dist/shared/http-client.d.ts +14 -0
  106. package/dist/shared/http-client.d.ts.map +1 -0
  107. package/dist/shared/http-client.js +34 -0
  108. package/dist/shared/http-client.js.map +1 -0
  109. package/dist/shared/index.d.ts +10 -0
  110. package/dist/shared/index.d.ts.map +1 -0
  111. package/dist/shared/index.js +10 -0
  112. package/dist/shared/index.js.map +1 -0
  113. package/dist/shared/result.d.ts +18 -0
  114. package/dist/shared/result.d.ts.map +1 -0
  115. package/dist/shared/result.js +24 -0
  116. package/dist/shared/result.js.map +1 -0
  117. package/dist/shared/schema-utils.d.ts +10 -0
  118. package/dist/shared/schema-utils.d.ts.map +1 -0
  119. package/dist/shared/schema-utils.js +8 -0
  120. package/dist/shared/schema-utils.js.map +1 -0
  121. package/dist/shared/types.d.ts +22 -0
  122. package/dist/shared/types.d.ts.map +1 -0
  123. package/dist/shared/types.js +5 -0
  124. package/dist/shared/types.js.map +1 -0
  125. package/dist/tags/__tests__/client.test.d.ts +2 -0
  126. package/dist/tags/__tests__/client.test.d.ts.map +1 -0
  127. package/dist/tags/__tests__/client.test.js +59 -0
  128. package/dist/tags/__tests__/client.test.js.map +1 -0
  129. package/dist/tags/__tests__/schemas.test.d.ts +2 -0
  130. package/dist/tags/__tests__/schemas.test.d.ts.map +1 -0
  131. package/dist/tags/__tests__/schemas.test.js +105 -0
  132. package/dist/tags/__tests__/schemas.test.js.map +1 -0
  133. package/dist/tags/client.d.ts +25 -0
  134. package/dist/tags/client.d.ts.map +1 -0
  135. package/dist/tags/client.js +38 -0
  136. package/dist/tags/client.js.map +1 -0
  137. package/dist/tags/handlers.d.ts +15 -0
  138. package/dist/tags/handlers.d.ts.map +1 -0
  139. package/dist/tags/handlers.js +36 -0
  140. package/dist/tags/handlers.js.map +1 -0
  141. package/dist/tags/index.d.ts +9 -0
  142. package/dist/tags/index.d.ts.map +1 -0
  143. package/dist/tags/index.js +9 -0
  144. package/dist/tags/index.js.map +1 -0
  145. package/dist/tags/schemas.d.ts +22 -0
  146. package/dist/tags/schemas.d.ts.map +1 -0
  147. package/dist/tags/schemas.js +25 -0
  148. package/dist/tags/schemas.js.map +1 -0
  149. package/dist/tags/tools.d.ts +6 -0
  150. package/dist/tags/tools.d.ts.map +1 -0
  151. package/dist/tags/tools.js +21 -0
  152. package/dist/tags/tools.js.map +1 -0
  153. package/dist/tags/types.d.ts +37 -0
  154. package/dist/tags/types.d.ts.map +1 -0
  155. package/dist/tags/types.js +7 -0
  156. package/dist/tags/types.js.map +1 -0
  157. package/package.json +1 -1
  158. package/dist/config.d.ts.map +0 -1
  159. package/dist/config.js.map +0 -1
  160. package/dist/notepm-client.d.ts +0 -223
  161. package/dist/notepm-client.d.ts.map +0 -1
  162. package/dist/notepm-client.js +0 -194
  163. package/dist/notepm-client.js.map +0 -1
  164. package/dist/tools/constants.d.ts +0 -31
  165. package/dist/tools/constants.d.ts.map +0 -1
  166. package/dist/tools/constants.js +0 -27
  167. package/dist/tools/constants.js.map +0 -1
  168. package/dist/tools/definitions.d.ts +0 -6
  169. package/dist/tools/definitions.d.ts.map +0 -1
  170. package/dist/tools/definitions.js +0 -87
  171. package/dist/tools/definitions.js.map +0 -1
  172. package/dist/tools/handlers.d.ts +0 -10
  173. package/dist/tools/handlers.d.ts.map +0 -1
  174. package/dist/tools/handlers.js +0 -191
  175. package/dist/tools/handlers.js.map +0 -1
  176. package/dist/tools/index.d.ts +0 -8
  177. package/dist/tools/index.d.ts.map +0 -1
  178. package/dist/tools/index.js +0 -8
  179. package/dist/tools/index.js.map +0 -1
  180. package/dist/tools/schemas.d.ts +0 -114
  181. package/dist/tools/schemas.d.ts.map +0 -1
  182. package/dist/tools/schemas.js +0 -104
  183. package/dist/tools/schemas.js.map +0 -1
  184. /package/dist/{config.d.ts → shared/config.d.ts} +0 -0
  185. /package/dist/{config.js → shared/config.js} +0 -0
package/dist/index.js CHANGED
@@ -13,19 +13,26 @@ import { createRequire } from "node:module";
13
13
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
14
14
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
15
15
  import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
16
- import { loadConfig } from "./config.js";
17
- import { NotePMClient } from "./notepm-client.js";
18
- import { TOOLS, handleToolCall } from "./tools/index.js";
16
+ import { handleToolCall, TOOLS } from "./mcp/index.js";
17
+ import { NoteClient } from "./notes/index.js";
18
+ import { PageClient } from "./pages/index.js";
19
+ import { HttpClient, loadConfig } from "./shared/index.js";
20
+ import { TagClient } from "./tags/index.js";
19
21
  // ============================================================
20
22
  // Load package info
21
23
  // ============================================================
22
24
  const require = createRequire(import.meta.url);
23
25
  const packageJson = require("../package.json");
24
26
  // ============================================================
25
- // Load configuration and initialize client
27
+ // Load configuration and initialize clients
26
28
  // ============================================================
27
29
  const config = loadConfig();
28
- const client = new NotePMClient(config);
30
+ const httpClient = new HttpClient(config);
31
+ const clients = {
32
+ notes: new NoteClient(httpClient),
33
+ pages: new PageClient(httpClient),
34
+ tags: new TagClient(httpClient),
35
+ };
29
36
  // ============================================================
30
37
  // Create server instance
31
38
  // ============================================================
@@ -54,7 +61,7 @@ server.setRequestHandler(ListToolsRequestSchema, () => {
54
61
  */
55
62
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
56
63
  const { name, arguments: args } = request.params;
57
- return handleToolCall(client, name, args);
64
+ return handleToolCall(clients, name, args);
58
65
  });
59
66
  // ============================================================
60
67
  // Start server
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAEnG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEzD,+DAA+D;AAC/D,oBAAoB;AACpB,+DAA+D;AAE/D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAEpF,+DAA+D;AAC/D,2CAA2C;AAC3C,+DAA+D;AAE/D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAExC,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAE/D,uDAAuD;AACvD,4EAA4E;AAC5E,4DAA4D;AAC5D,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,OAAO,EAAE,WAAW,CAAC,OAAO;CAC7B,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,+DAA+D;AAC/D,0BAA0B;AAC1B,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,8BAA8B,MAAM,CAAC,UAAU,aAAa,CAAC,CAAC;AAC9E,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAEnG,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,+DAA+D;AAC/D,oBAAoB;AACpB,+DAA+D;AAE/D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAEpF,+DAA+D;AAC/D,4CAA4C;AAC5C,+DAA+D;AAE/D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AAC1C,MAAM,OAAO,GAAG;IACd,KAAK,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC;IACjC,KAAK,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC;IACjC,IAAI,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC;CAChC,CAAC;AAEF,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAE/D,uDAAuD;AACvD,4EAA4E;AAC5E,4DAA4D;AAC5D,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,OAAO,EAAE,WAAW,CAAC,OAAO;CAC7B,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,+DAA+D;AAC/D,0BAA0B;AAC1B,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,8BAA8B,MAAM,CAAC,UAAU,aAAa,CAAC,CAAC;AAC9E,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/__tests__/handler.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,345 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { NotePMAPIError } from "../../shared/errors.js";
3
+ import { createMockNote, createMockNotesResponse, createMockPage, createMockPagesResponse, createMockTag, createMockTagsResponse, } from "../../shared/__tests__/fixtures.js";
4
+ import { handleToolCall } from "../index.js";
5
+ // ============================================================
6
+ // Helper Functions
7
+ // ============================================================
8
+ /**
9
+ * Extract text content from CallToolResult
10
+ */
11
+ function getTextContent(result) {
12
+ const content = result.content[0];
13
+ if (content.type !== "text") {
14
+ throw new Error(`Expected text content, got ${content.type}`);
15
+ }
16
+ return content.text;
17
+ }
18
+ // ============================================================
19
+ // Mock Setup
20
+ // ============================================================
21
+ const createMockNoteClient = () => ({
22
+ list: vi.fn(),
23
+ get: vi.fn(),
24
+ create: vi.fn(),
25
+ update: vi.fn(),
26
+ delete: vi.fn(),
27
+ archive: vi.fn(),
28
+ unarchive: vi.fn(),
29
+ });
30
+ const createMockPageClient = () => ({
31
+ search: vi.fn(),
32
+ get: vi.fn(),
33
+ create: vi.fn(),
34
+ update: vi.fn(),
35
+ delete: vi.fn(),
36
+ });
37
+ const createMockTagClient = () => ({
38
+ list: vi.fn(),
39
+ create: vi.fn(),
40
+ delete: vi.fn(),
41
+ });
42
+ describe("handleToolCall", () => {
43
+ let mockNoteClient;
44
+ let mockPageClient;
45
+ let mockTagClient;
46
+ let clients;
47
+ beforeEach(() => {
48
+ mockNoteClient = createMockNoteClient();
49
+ mockPageClient = createMockPageClient();
50
+ mockTagClient = createMockTagClient();
51
+ clients = {
52
+ notes: mockNoteClient,
53
+ pages: mockPageClient,
54
+ tags: mockTagClient,
55
+ };
56
+ vi.clearAllMocks();
57
+ });
58
+ // ============================================================
59
+ // Error Handling Tests
60
+ // ============================================================
61
+ describe("error handling", () => {
62
+ it("should return error for unknown tool", async () => {
63
+ const result = await handleToolCall(clients, "unknown_tool", {});
64
+ expect(result.isError).toBe(true);
65
+ expect(getTextContent(result)).toBe("Unknown tool: unknown_tool");
66
+ });
67
+ it("should return input error for invalid arguments", async () => {
68
+ const result = await handleToolCall(clients, "get_page", {});
69
+ expect(result.isError).toBe(true);
70
+ expect(getTextContent(result)).toContain("Input error:");
71
+ });
72
+ it("should return error for NotePMAPIError", async () => {
73
+ mockPageClient.get.mockRejectedValue(new NotePMAPIError(404, "Not Found", "NotePM API Error: 404 Not Found"));
74
+ const result = await handleToolCall(clients, "get_page", {
75
+ page_code: "nonexistent",
76
+ });
77
+ expect(result.isError).toBe(true);
78
+ expect(getTextContent(result)).toContain("NotePM API Error");
79
+ });
80
+ it("should throw unexpected errors", async () => {
81
+ mockPageClient.get.mockRejectedValue(new Error("Unexpected error"));
82
+ await expect(handleToolCall(clients, "get_page", { page_code: "test" })).rejects.toThrow("Unexpected error");
83
+ });
84
+ });
85
+ // ============================================================
86
+ // Page Tools Tests
87
+ // ============================================================
88
+ describe("search_pages", () => {
89
+ it("should return 'No pages found.' for empty results", async () => {
90
+ mockPageClient.search.mockResolvedValue(createMockPagesResponse([]));
91
+ const result = await handleToolCall(clients, "search_pages", {});
92
+ expect(result.isError).toBeUndefined();
93
+ expect(getTextContent(result)).toBe("No pages found.");
94
+ });
95
+ it("should format search results correctly", async () => {
96
+ const pages = [
97
+ createMockPage({ page_code: "p1", title: "First Page" }),
98
+ createMockPage({ page_code: "p2", title: "Second Page" }),
99
+ ];
100
+ mockPageClient.search.mockResolvedValue(createMockPagesResponse(pages, 2));
101
+ const result = await handleToolCall(clients, "search_pages", { query: "test" });
102
+ expect(result.isError).toBeUndefined();
103
+ expect(getTextContent(result)).toContain("showing 2 of 2 pages");
104
+ expect(getTextContent(result)).toContain("**First Page**");
105
+ expect(getTextContent(result)).toContain("**Second Page**");
106
+ });
107
+ });
108
+ describe("get_page", () => {
109
+ it("should format page with all fields", async () => {
110
+ const page = createMockPage();
111
+ mockPageClient.get.mockResolvedValue(page);
112
+ const result = await handleToolCall(clients, "get_page", { page_code: "page123" });
113
+ expect(result.isError).toBeUndefined();
114
+ expect(getTextContent(result)).toContain("## Test Page");
115
+ expect(getTextContent(result)).toContain("Page code: page123");
116
+ expect(getTextContent(result)).toContain("Tags: tag1, tag2");
117
+ expect(getTextContent(result)).toContain("Test body content");
118
+ });
119
+ it("should handle page with no tags", async () => {
120
+ const page = createMockPage({ tags: [] });
121
+ mockPageClient.get.mockResolvedValue(page);
122
+ const result = await handleToolCall(clients, "get_page", { page_code: "page123" });
123
+ expect(result.isError).toBeUndefined();
124
+ expect(getTextContent(result)).toContain("Tags: None");
125
+ });
126
+ it("should handle page with no body", async () => {
127
+ const page = createMockPage({ body: "" });
128
+ mockPageClient.get.mockResolvedValue(page);
129
+ const result = await handleToolCall(clients, "get_page", { page_code: "page123" });
130
+ expect(result.isError).toBeUndefined();
131
+ expect(getTextContent(result)).toContain("(No body)");
132
+ });
133
+ });
134
+ describe("create_page", () => {
135
+ it("should return success message with page details", async () => {
136
+ const page = createMockPage({ page_code: "new123", title: "New Page" });
137
+ mockPageClient.create.mockResolvedValue(page);
138
+ const result = await handleToolCall(clients, "create_page", {
139
+ note_code: "note123",
140
+ title: "New Page",
141
+ });
142
+ expect(result.isError).toBeUndefined();
143
+ expect(getTextContent(result)).toContain("Page created.");
144
+ expect(getTextContent(result)).toContain("## New Page");
145
+ });
146
+ });
147
+ describe("update_page", () => {
148
+ it("should return success message with updated page details", async () => {
149
+ const page = createMockPage({ page_code: "page123", title: "Updated Page" });
150
+ mockPageClient.update.mockResolvedValue(page);
151
+ const result = await handleToolCall(clients, "update_page", {
152
+ page_code: "page123",
153
+ title: "Updated Page",
154
+ });
155
+ expect(result.isError).toBeUndefined();
156
+ expect(getTextContent(result)).toContain("Page updated.");
157
+ expect(getTextContent(result)).toContain("## Updated Page");
158
+ });
159
+ });
160
+ describe("delete_page", () => {
161
+ it("should return success message", async () => {
162
+ mockPageClient.delete.mockResolvedValue(undefined);
163
+ const result = await handleToolCall(clients, "delete_page", { page_code: "page123" });
164
+ expect(result.isError).toBeUndefined();
165
+ expect(getTextContent(result)).toBe("Page deleted: page123");
166
+ });
167
+ });
168
+ // ============================================================
169
+ // Note Tools Tests
170
+ // ============================================================
171
+ describe("list_notes", () => {
172
+ it("should return 'No notes found.' for empty results", async () => {
173
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse([]));
174
+ const result = await handleToolCall(clients, "list_notes", {});
175
+ expect(result.isError).toBeUndefined();
176
+ expect(getTextContent(result)).toBe("No notes found.");
177
+ });
178
+ it("should format notes list correctly", async () => {
179
+ const notes = [
180
+ createMockNote({ note_code: "n1", name: "First Note" }),
181
+ createMockNote({ note_code: "n2", name: "Second Note" }),
182
+ ];
183
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 2));
184
+ const result = await handleToolCall(clients, "list_notes", {});
185
+ expect(result.isError).toBeUndefined();
186
+ expect(getTextContent(result)).toContain("showing 2 of 2 notes");
187
+ expect(getTextContent(result)).toContain("**First Note**");
188
+ });
189
+ it("should show archived status in list", async () => {
190
+ const notes = [createMockNote({ note_code: "n1", name: "Archived Note", archived: true })];
191
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 1));
192
+ const result = await handleToolCall(clients, "list_notes", {});
193
+ expect(result.isError).toBeUndefined();
194
+ expect(getTextContent(result)).toContain("[archived]");
195
+ });
196
+ it("should show private scope in list", async () => {
197
+ const notes = [createMockNote({ note_code: "n1", name: "Private Note", scope: "private" })];
198
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 1));
199
+ const result = await handleToolCall(clients, "list_notes", {});
200
+ expect(result.isError).toBeUndefined();
201
+ expect(getTextContent(result)).toContain("(private)");
202
+ });
203
+ it("should show no description placeholder in list", async () => {
204
+ const notes = [createMockNote({ note_code: "n1", name: "No Desc Note", description: "" })];
205
+ mockNoteClient.list.mockResolvedValue(createMockNotesResponse(notes, 1));
206
+ const result = await handleToolCall(clients, "list_notes", {});
207
+ expect(result.isError).toBeUndefined();
208
+ expect(getTextContent(result)).toContain("(No description)");
209
+ });
210
+ });
211
+ describe("get_note", () => {
212
+ it("should format note with all fields", async () => {
213
+ const note = createMockNote();
214
+ mockNoteClient.get.mockResolvedValue(note);
215
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
216
+ expect(result.isError).toBeUndefined();
217
+ expect(getTextContent(result)).toContain("## Test Note");
218
+ expect(getTextContent(result)).toContain("Note code: note123");
219
+ expect(getTextContent(result)).toContain("Scope: All members");
220
+ expect(getTextContent(result)).toContain("Archived: No");
221
+ });
222
+ it("should handle scope as number 0 (open)", async () => {
223
+ const note = createMockNote({ scope: 0 });
224
+ mockNoteClient.get.mockResolvedValue(note);
225
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
226
+ expect(result.isError).toBeUndefined();
227
+ expect(getTextContent(result)).toContain("Scope: All members");
228
+ });
229
+ it("should handle private scope", async () => {
230
+ const note = createMockNote({ scope: "private" });
231
+ mockNoteClient.get.mockResolvedValue(note);
232
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
233
+ expect(result.isError).toBeUndefined();
234
+ expect(getTextContent(result)).toContain("Scope: Participating members only");
235
+ });
236
+ it("should handle archived note", async () => {
237
+ const note = createMockNote({ archived: true });
238
+ mockNoteClient.get.mockResolvedValue(note);
239
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
240
+ expect(result.isError).toBeUndefined();
241
+ expect(getTextContent(result)).toContain("Archived: Yes");
242
+ });
243
+ it("should handle note with no description", async () => {
244
+ const note = createMockNote({ description: "" });
245
+ mockNoteClient.get.mockResolvedValue(note);
246
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
247
+ expect(result.isError).toBeUndefined();
248
+ expect(getTextContent(result)).toContain("(No description)");
249
+ });
250
+ it("should handle note with missing dates", async () => {
251
+ const note = createMockNote({ created_at: undefined, updated_at: undefined });
252
+ mockNoteClient.get.mockResolvedValue(note);
253
+ const result = await handleToolCall(clients, "get_note", { note_code: "note123" });
254
+ expect(result.isError).toBeUndefined();
255
+ expect(getTextContent(result)).toContain("Created at: N/A");
256
+ expect(getTextContent(result)).toContain("Updated at: N/A");
257
+ });
258
+ });
259
+ describe("create_note", () => {
260
+ it("should return success message with note details", async () => {
261
+ const note = createMockNote({ note_code: "new123", name: "New Note" });
262
+ mockNoteClient.create.mockResolvedValue(note);
263
+ const result = await handleToolCall(clients, "create_note", {
264
+ name: "New Note",
265
+ scope: "open",
266
+ });
267
+ expect(result.isError).toBeUndefined();
268
+ expect(getTextContent(result)).toContain("Note created.");
269
+ expect(getTextContent(result)).toContain("## New Note");
270
+ });
271
+ });
272
+ describe("update_note", () => {
273
+ it("should return success message with updated note details", async () => {
274
+ const note = createMockNote({ note_code: "note123", name: "Updated Note" });
275
+ mockNoteClient.update.mockResolvedValue(note);
276
+ const result = await handleToolCall(clients, "update_note", {
277
+ note_code: "note123",
278
+ name: "Updated Note",
279
+ });
280
+ expect(result.isError).toBeUndefined();
281
+ expect(getTextContent(result)).toContain("Note updated.");
282
+ expect(getTextContent(result)).toContain("## Updated Note");
283
+ });
284
+ });
285
+ describe("delete_note", () => {
286
+ it("should return success message", async () => {
287
+ mockNoteClient.delete.mockResolvedValue(undefined);
288
+ const result = await handleToolCall(clients, "delete_note", { note_code: "note123" });
289
+ expect(result.isError).toBeUndefined();
290
+ expect(getTextContent(result)).toBe("Note deleted: note123");
291
+ });
292
+ });
293
+ describe("archive_note", () => {
294
+ it("should return success message", async () => {
295
+ mockNoteClient.archive.mockResolvedValue(undefined);
296
+ const result = await handleToolCall(clients, "archive_note", { note_code: "note123" });
297
+ expect(result.isError).toBeUndefined();
298
+ expect(getTextContent(result)).toBe("Note archived: note123");
299
+ });
300
+ });
301
+ describe("unarchive_note", () => {
302
+ it("should return success message", async () => {
303
+ mockNoteClient.unarchive.mockResolvedValue(undefined);
304
+ const result = await handleToolCall(clients, "unarchive_note", { note_code: "note123" });
305
+ expect(result.isError).toBeUndefined();
306
+ expect(getTextContent(result)).toBe("Note unarchived: note123");
307
+ });
308
+ });
309
+ // ============================================================
310
+ // Tag Tools Tests
311
+ // ============================================================
312
+ describe("list_tags", () => {
313
+ it("should return 'No tags found.' for empty results", async () => {
314
+ mockTagClient.list.mockResolvedValue(createMockTagsResponse([]));
315
+ const result = await handleToolCall(clients, "list_tags", {});
316
+ expect(result.isError).toBeUndefined();
317
+ expect(getTextContent(result)).toBe("No tags found.");
318
+ });
319
+ it("should format tag list correctly", async () => {
320
+ const tags = [{ name: "important" }, { name: "draft" }];
321
+ mockTagClient.list.mockResolvedValue(createMockTagsResponse(tags, 2));
322
+ const result = await handleToolCall(clients, "list_tags", {});
323
+ expect(result.isError).toBeUndefined();
324
+ expect(getTextContent(result)).toContain("showing 2 of 2 tags");
325
+ expect(getTextContent(result)).toContain("1. important");
326
+ });
327
+ });
328
+ describe("create_tag", () => {
329
+ it("should return success message", async () => {
330
+ mockTagClient.create.mockResolvedValue(createMockTag({ name: "new-tag" }));
331
+ const result = await handleToolCall(clients, "create_tag", { name: "new-tag" });
332
+ expect(result.isError).toBeUndefined();
333
+ expect(getTextContent(result)).toBe("Tag created: new-tag");
334
+ });
335
+ });
336
+ describe("delete_tag", () => {
337
+ it("should return success message", async () => {
338
+ mockTagClient.delete.mockResolvedValue(undefined);
339
+ const result = await handleToolCall(clients, "delete_tag", { name: "tag-to-delete" });
340
+ expect(result.isError).toBeUndefined();
341
+ expect(getTextContent(result)).toBe("Tag deleted: tag-to-delete");
342
+ });
343
+ });
344
+ });
345
+ //# sourceMappingURL=handler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/handler.test.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAI9D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,uBAAuB,EACvB,aAAa,EACb,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D;;GAEG;AACH,SAAS,cAAc,CAAC,MAAsB;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AAE/D,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,CAAC;IAClC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;IAChB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;CACnB,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,CAAC;IAClC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;CAChB,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,CAAC;IACjC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;CAChB,CAAC,CAAC;AAMH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,cAA8B,CAAC;IACnC,IAAI,cAA8B,CAAC;IACnC,IAAI,aAA4B,CAAC;IACjC,IAAI,OAAkE,CAAC;IAEvE,UAAU,CAAC,GAAG,EAAE;QACd,cAAc,GAAG,oBAAoB,EAAE,CAAC;QACxC,cAAc,GAAG,oBAAoB,EAAE,CAAC;QACxC,aAAa,GAAG,mBAAmB,EAAE,CAAC;QACtC,OAAO,GAAG;YACR,KAAK,EAAE,cAAuC;YAC9C,KAAK,EAAE,cAAuC;YAC9C,IAAI,EAAE,aAAqC;SAC5C,CAAC;QACF,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,uBAAuB;IACvB,+DAA+D;IAE/D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;YAEjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAClC,IAAI,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,iCAAiC,CAAC,CACxE,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE;gBACvD,SAAS,EAAE,aAAa;aACzB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAEpE,MAAM,MAAM,CACV,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAC3D,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,mBAAmB;IACnB,+DAA+D;IAE/D,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC;YAErE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;YAEjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,KAAK,GAAG;gBACZ,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;gBACxD,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;aAC1D,CAAC;YACF,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAE3E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAEhF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAC3D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;YAC9B,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACzD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAC/D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YACxE,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE;gBAC1D,SAAS,EAAE,SAAS;gBACpB,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAC7E,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE;gBAC1D,SAAS,EAAE,SAAS;gBACpB,KAAK,EAAE,cAAc;aACtB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAEnD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEtF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,mBAAmB;IACnB,+DAA+D;IAE/D,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC;YAEnE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,KAAK,GAAG;gBACZ,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBACvD,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;aACzD,CAAC;YACF,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3F,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAC5F,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3F,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;YAC9B,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACzD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAC/D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAC/D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,CAAsB,EAAE,CAAC,CAAC;YAC/D,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YACjD,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;YAC9E,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC5D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACvE,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE;gBAC1D,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YAC5E,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE;gBAC1D,SAAS,EAAE,SAAS;gBACpB,IAAI,EAAE,cAAc;aACrB,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAEnD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEtF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,cAAc,CAAC,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEvF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,cAAc,CAAC,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAEtD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAEzF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,kBAAkB;IAClB,+DAA+D;IAE/D,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACxD,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEtE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAChE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAE3E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAEhF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAElD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;YAEtF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/__tests__/tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { NOTE_TOOL_NAMES } from "../../notes/types.js";
3
+ import { PAGE_TOOL_NAMES } from "../../pages/types.js";
4
+ import { TAG_TOOL_NAMES } from "../../tags/types.js";
5
+ import { TOOLS } from "../index.js";
6
+ describe("TOOLS", () => {
7
+ it("should have all expected tools defined", () => {
8
+ const toolNames = TOOLS.map((tool) => tool.name);
9
+ // Page tools
10
+ expect(toolNames).toContain(PAGE_TOOL_NAMES.SEARCH_PAGES);
11
+ expect(toolNames).toContain(PAGE_TOOL_NAMES.GET_PAGE);
12
+ expect(toolNames).toContain(PAGE_TOOL_NAMES.CREATE_PAGE);
13
+ expect(toolNames).toContain(PAGE_TOOL_NAMES.UPDATE_PAGE);
14
+ expect(toolNames).toContain(PAGE_TOOL_NAMES.DELETE_PAGE);
15
+ // Note tools
16
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.LIST_NOTES);
17
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.GET_NOTE);
18
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.CREATE_NOTE);
19
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.UPDATE_NOTE);
20
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.DELETE_NOTE);
21
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.ARCHIVE_NOTE);
22
+ expect(toolNames).toContain(NOTE_TOOL_NAMES.UNARCHIVE_NOTE);
23
+ // Tag tools
24
+ expect(toolNames).toContain(TAG_TOOL_NAMES.LIST_TAGS);
25
+ expect(toolNames).toContain(TAG_TOOL_NAMES.CREATE_TAG);
26
+ expect(toolNames).toContain(TAG_TOOL_NAMES.DELETE_TAG);
27
+ });
28
+ it("should have valid inputSchema for each tool", () => {
29
+ for (const tool of TOOLS) {
30
+ expect(tool.inputSchema).toBeDefined();
31
+ expect(tool.inputSchema.type).toBe("object");
32
+ expect(tool.inputSchema).toHaveProperty("properties");
33
+ }
34
+ });
35
+ it("should have description for each tool", () => {
36
+ for (const tool of TOOLS) {
37
+ expect(tool.description).toBeDefined();
38
+ expect(typeof tool.description).toBe("string");
39
+ expect(tool.description?.length).toBeGreaterThan(0);
40
+ }
41
+ });
42
+ });
43
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../../src/mcp/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * MCP Handler Router
3
+ *
4
+ * Routes tool calls to the appropriate domain handler.
5
+ */
6
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
7
+ import { NoteClient } from "../notes/index.js";
8
+ import { PageClient } from "../pages/index.js";
9
+ import { TagClient } from "../tags/index.js";
10
+ interface Clients {
11
+ notes: NoteClient;
12
+ pages: PageClient;
13
+ tags: TagClient;
14
+ }
15
+ /**
16
+ * Handle tool call by routing to appropriate domain handler
17
+ */
18
+ export declare function handleToolCall(clients: Clients, name: string, args: unknown): Promise<CallToolResult>;
19
+ export {};
20
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/mcp/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAsC,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAsC,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEnF,OAAO,EAAoC,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE/E,UAAU,OAAO;IACf,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,cAAc,CAAC,CAwBzB"}
@@ -0,0 +1,31 @@
1
+ import { handleNoteToolCall, isNoteToolName } from "../notes/index.js";
2
+ import { handlePageToolCall, isPageToolName } from "../pages/index.js";
3
+ import { error, InputError, NotePMAPIError } from "../shared/index.js";
4
+ import { handleTagToolCall, isTagToolName } from "../tags/index.js";
5
+ /**
6
+ * Handle tool call by routing to appropriate domain handler
7
+ */
8
+ export async function handleToolCall(clients, name, args) {
9
+ try {
10
+ if (isNoteToolName(name)) {
11
+ return await handleNoteToolCall(clients.notes, name, args);
12
+ }
13
+ if (isPageToolName(name)) {
14
+ return await handlePageToolCall(clients.pages, name, args);
15
+ }
16
+ if (isTagToolName(name)) {
17
+ return await handleTagToolCall(clients.tags, name, args);
18
+ }
19
+ return error(`Unknown tool: ${name}`);
20
+ }
21
+ catch (err) {
22
+ if (err instanceof InputError) {
23
+ return error(`Input error: ${err.message}`);
24
+ }
25
+ if (err instanceof NotePMAPIError) {
26
+ return error(err.message);
27
+ }
28
+ throw err;
29
+ }
30
+ }
31
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/mcp/handler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAa,MAAM,kBAAkB,CAAC;AAQ/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,IAAY,EACZ,IAAa;IAEb,IAAI,CAAC;QACH,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP layer exports
3
+ */
4
+ export * from "./tools.js";
5
+ export * from "./handler.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP layer exports
3
+ */
4
+ export * from "./tools.js";
5
+ export * from "./handler.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * MCP Tools Aggregator
3
+ *
4
+ * Aggregates all domain tools into a single list for the MCP server.
5
+ */
6
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
7
+ /**
8
+ * All available tools for the MCP server
9
+ */
10
+ export declare const TOOLS: Tool[];
11
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAM/D;;GAEG;AACH,eAAO,MAAM,KAAK,EAAE,IAAI,EAAiD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { NOTE_TOOLS } from "../notes/tools.js";
2
+ import { PAGE_TOOLS } from "../pages/tools.js";
3
+ import { TAG_TOOLS } from "../tags/tools.js";
4
+ /**
5
+ * All available tools for the MCP server
6
+ */
7
+ export const TOOLS = [...PAGE_TOOLS, ...NOTE_TOOLS, ...TAG_TOOLS];
8
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAW,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../../src/notes/__tests__/client.test.ts"],"names":[],"mappings":""}