@ibm/ibmi-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 (197) hide show
  1. package/README.md +140 -0
  2. package/dist/config/index.d.ts +2 -0
  3. package/dist/config/index.d.ts.map +1 -1
  4. package/dist/config/index.js +14 -0
  5. package/dist/config/index.js.map +1 -1
  6. package/dist/config/resolver.d.ts.map +1 -1
  7. package/dist/config/resolver.js.map +1 -1
  8. package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts +80 -0
  9. package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts.map +1 -0
  10. package/dist/ibmi-mcp-server/tools/executeSql.tool.js +356 -0
  11. package/dist/ibmi-mcp-server/tools/executeSql.tool.js.map +1 -0
  12. package/dist/ibmi-mcp-server/tools/generateSql.tool.d.ts +36 -0
  13. package/dist/ibmi-mcp-server/tools/generateSql.tool.d.ts.map +1 -0
  14. package/dist/ibmi-mcp-server/tools/generateSql.tool.js +281 -0
  15. package/dist/ibmi-mcp-server/tools/generateSql.tool.js.map +1 -0
  16. package/dist/ibmi-mcp-server/tools/index.d.ts +85 -0
  17. package/dist/ibmi-mcp-server/tools/index.d.ts.map +1 -0
  18. package/dist/ibmi-mcp-server/tools/index.js +21 -0
  19. package/dist/ibmi-mcp-server/tools/index.js.map +1 -0
  20. package/dist/ibmi-mcp-server/utils/config/configParser.d.ts +9 -0
  21. package/dist/ibmi-mcp-server/utils/config/configParser.d.ts.map +1 -1
  22. package/dist/ibmi-mcp-server/utils/config/configParser.js +58 -0
  23. package/dist/ibmi-mcp-server/utils/config/configParser.js.map +1 -1
  24. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts +4 -4
  25. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts.map +1 -1
  26. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js +7 -8
  27. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js.map +1 -1
  28. package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts +0 -8
  29. package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts.map +1 -1
  30. package/dist/ibmi-mcp-server/utils/config/toolFactory.js +0 -31
  31. package/dist/ibmi-mcp-server/utils/config/toolFactory.js.map +1 -1
  32. package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts +1 -1
  33. package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts.map +1 -1
  34. package/dist/ibmi-mcp-server/utils/config/toolsetManager.js +2 -2
  35. package/dist/ibmi-mcp-server/utils/config/toolsetManager.js.map +1 -1
  36. package/dist/ibmi-mcp-server/utils/language/document.d.ts +26 -0
  37. package/dist/ibmi-mcp-server/utils/language/document.d.ts.map +1 -0
  38. package/dist/ibmi-mcp-server/utils/language/document.js +318 -0
  39. package/dist/ibmi-mcp-server/utils/language/document.js.map +1 -0
  40. package/dist/ibmi-mcp-server/utils/language/statement.d.ts +43 -0
  41. package/dist/ibmi-mcp-server/utils/language/statement.d.ts.map +1 -0
  42. package/dist/ibmi-mcp-server/utils/language/statement.js +796 -0
  43. package/dist/ibmi-mcp-server/utils/language/statement.js.map +1 -0
  44. package/dist/ibmi-mcp-server/utils/language/tokens.d.ts +32 -0
  45. package/dist/ibmi-mcp-server/utils/language/tokens.d.ts.map +1 -0
  46. package/dist/ibmi-mcp-server/utils/language/tokens.js +532 -0
  47. package/dist/ibmi-mcp-server/utils/language/tokens.js.map +1 -0
  48. package/dist/ibmi-mcp-server/utils/language/types.d.ts +138 -0
  49. package/dist/ibmi-mcp-server/utils/language/types.d.ts.map +1 -0
  50. package/dist/ibmi-mcp-server/utils/language/types.js +93 -0
  51. package/dist/ibmi-mcp-server/utils/language/types.js.map +1 -0
  52. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.d.ts +48 -0
  53. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.d.ts.map +1 -0
  54. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.js +93 -0
  55. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.js.map +1 -0
  56. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts +35 -59
  57. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts.map +1 -1
  58. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js +108 -288
  59. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js.map +1 -1
  60. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.d.ts +54 -0
  61. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.d.ts.map +1 -0
  62. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.js +91 -0
  63. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.js.map +1 -0
  64. package/dist/mcp-server/tools/index.d.ts +13 -2
  65. package/dist/mcp-server/tools/index.d.ts.map +1 -1
  66. package/dist/mcp-server/tools/index.js +29 -9
  67. package/dist/mcp-server/tools/index.js.map +1 -1
  68. package/dist/mcp-server/tools/utils/index.d.ts +7 -0
  69. package/dist/mcp-server/tools/utils/index.d.ts.map +1 -0
  70. package/dist/mcp-server/tools/utils/index.js +7 -0
  71. package/dist/mcp-server/tools/utils/index.js.map +1 -0
  72. package/dist/mcp-server/tools/utils/tool-factory.d.ts +129 -0
  73. package/dist/mcp-server/tools/utils/tool-factory.d.ts.map +1 -0
  74. package/dist/mcp-server/tools/utils/tool-factory.js +179 -0
  75. package/dist/mcp-server/tools/utils/tool-factory.js.map +1 -0
  76. package/dist/mcp-server/tools/utils/types.d.ts +117 -0
  77. package/dist/mcp-server/tools/utils/types.d.ts.map +1 -0
  78. package/dist/mcp-server/tools/utils/types.js +11 -0
  79. package/dist/mcp-server/tools/utils/types.js.map +1 -0
  80. package/dist/mcp-server/transports/core/cleanupTransformStream.d.ts +26 -0
  81. package/dist/mcp-server/transports/core/cleanupTransformStream.d.ts.map +1 -0
  82. package/dist/mcp-server/transports/core/cleanupTransformStream.js +60 -0
  83. package/dist/mcp-server/transports/core/cleanupTransformStream.js.map +1 -0
  84. package/dist/mcp-server/transports/core/statefulTransportManager.d.ts +1 -1
  85. package/dist/mcp-server/transports/core/statefulTransportManager.d.ts.map +1 -1
  86. package/dist/mcp-server/transports/core/statefulTransportManager.js +50 -40
  87. package/dist/mcp-server/transports/core/statefulTransportManager.js.map +1 -1
  88. package/dist/mcp-server/transports/core/statelessTransportManager.d.ts +2 -13
  89. package/dist/mcp-server/transports/core/statelessTransportManager.d.ts.map +1 -1
  90. package/dist/mcp-server/transports/core/statelessTransportManager.js +35 -62
  91. package/dist/mcp-server/transports/core/statelessTransportManager.js.map +1 -1
  92. package/dist/mcp-server/transports/core/transportRequest.d.ts +1 -2
  93. package/dist/mcp-server/transports/core/transportRequest.d.ts.map +1 -1
  94. package/dist/mcp-server/transports/http/mcpTransportMiddleware.d.ts.map +1 -1
  95. package/dist/mcp-server/transports/http/mcpTransportMiddleware.js +1 -3
  96. package/dist/mcp-server/transports/http/mcpTransportMiddleware.js.map +1 -1
  97. package/package.json +21 -22
  98. package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts +0 -9
  99. package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts.map +0 -1
  100. package/dist/ibmi-mcp-server/tools/executeSql/index.js +0 -9
  101. package/dist/ibmi-mcp-server/tools/executeSql/index.js.map +0 -1
  102. package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts +0 -51
  103. package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts.map +0 -1
  104. package/dist/ibmi-mcp-server/tools/executeSql/logic.js +0 -179
  105. package/dist/ibmi-mcp-server/tools/executeSql/logic.js.map +0 -1
  106. package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts +0 -52
  107. package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts.map +0 -1
  108. package/dist/ibmi-mcp-server/tools/executeSql/registration.js +0 -161
  109. package/dist/ibmi-mcp-server/tools/executeSql/registration.js.map +0 -1
  110. package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts +0 -13
  111. package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts.map +0 -1
  112. package/dist/ibmi-mcp-server/tools/generateSql/index.js +0 -13
  113. package/dist/ibmi-mcp-server/tools/generateSql/index.js.map +0 -1
  114. package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts +0 -64
  115. package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts.map +0 -1
  116. package/dist/ibmi-mcp-server/tools/generateSql/logic.js +0 -190
  117. package/dist/ibmi-mcp-server/tools/generateSql/logic.js.map +0 -1
  118. package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts +0 -18
  119. package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts.map +0 -1
  120. package/dist/ibmi-mcp-server/tools/generateSql/registration.js +0 -64
  121. package/dist/ibmi-mcp-server/tools/generateSql/registration.js.map +0 -1
  122. package/dist/mcp-server/tools/catFactFetcher/index.d.ts +0 -8
  123. package/dist/mcp-server/tools/catFactFetcher/index.d.ts.map +0 -1
  124. package/dist/mcp-server/tools/catFactFetcher/index.js +0 -8
  125. package/dist/mcp-server/tools/catFactFetcher/index.js.map +0 -1
  126. package/dist/mcp-server/tools/catFactFetcher/logic.d.ts +0 -52
  127. package/dist/mcp-server/tools/catFactFetcher/logic.d.ts.map +0 -1
  128. package/dist/mcp-server/tools/catFactFetcher/logic.js +0 -95
  129. package/dist/mcp-server/tools/catFactFetcher/logic.js.map +0 -1
  130. package/dist/mcp-server/tools/catFactFetcher/registration.d.ts +0 -9
  131. package/dist/mcp-server/tools/catFactFetcher/registration.d.ts.map +0 -1
  132. package/dist/mcp-server/tools/catFactFetcher/registration.js +0 -43
  133. package/dist/mcp-server/tools/catFactFetcher/registration.js.map +0 -1
  134. package/dist/mcp-server/tools/echoTool/index.d.ts +0 -13
  135. package/dist/mcp-server/tools/echoTool/index.d.ts.map +0 -1
  136. package/dist/mcp-server/tools/echoTool/index.js +0 -13
  137. package/dist/mcp-server/tools/echoTool/index.js.map +0 -1
  138. package/dist/mcp-server/tools/echoTool/logic.d.ts +0 -69
  139. package/dist/mcp-server/tools/echoTool/logic.d.ts.map +0 -1
  140. package/dist/mcp-server/tools/echoTool/logic.js +0 -119
  141. package/dist/mcp-server/tools/echoTool/logic.js.map +0 -1
  142. package/dist/mcp-server/tools/echoTool/registration.d.ts +0 -9
  143. package/dist/mcp-server/tools/echoTool/registration.d.ts.map +0 -1
  144. package/dist/mcp-server/tools/echoTool/registration.js +0 -45
  145. package/dist/mcp-server/tools/echoTool/registration.js.map +0 -1
  146. package/dist/mcp-server/tools/imageTest/index.d.ts +0 -7
  147. package/dist/mcp-server/tools/imageTest/index.d.ts.map +0 -1
  148. package/dist/mcp-server/tools/imageTest/index.js +0 -7
  149. package/dist/mcp-server/tools/imageTest/index.js.map +0 -1
  150. package/dist/mcp-server/tools/imageTest/logic.d.ts +0 -27
  151. package/dist/mcp-server/tools/imageTest/logic.d.ts.map +0 -1
  152. package/dist/mcp-server/tools/imageTest/logic.js +0 -44
  153. package/dist/mcp-server/tools/imageTest/logic.js.map +0 -1
  154. package/dist/mcp-server/tools/imageTest/registration.d.ts +0 -9
  155. package/dist/mcp-server/tools/imageTest/registration.d.ts.map +0 -1
  156. package/dist/mcp-server/tools/imageTest/registration.js +0 -49
  157. package/dist/mcp-server/tools/imageTest/registration.js.map +0 -1
  158. package/dist/mcp-server/tools/utils/tool-utils.d.ts +0 -43
  159. package/dist/mcp-server/tools/utils/tool-utils.d.ts.map +0 -1
  160. package/dist/mcp-server/tools/utils/tool-utils.js +0 -44
  161. package/dist/mcp-server/tools/utils/tool-utils.js.map +0 -1
  162. package/dist/mcp-server/transports/core/headerUtils.d.ts +0 -27
  163. package/dist/mcp-server/transports/core/headerUtils.d.ts.map +0 -1
  164. package/dist/mcp-server/transports/core/headerUtils.js +0 -53
  165. package/dist/mcp-server/transports/core/headerUtils.js.map +0 -1
  166. package/dist/mcp-server/transports/core/honoNodeBridge.d.ts +0 -77
  167. package/dist/mcp-server/transports/core/honoNodeBridge.d.ts.map +0 -1
  168. package/dist/mcp-server/transports/core/honoNodeBridge.js +0 -150
  169. package/dist/mcp-server/transports/core/honoNodeBridge.js.map +0 -1
  170. package/dist/services/duck-db/duckDBConnectionManager.d.ts +0 -55
  171. package/dist/services/duck-db/duckDBConnectionManager.d.ts.map +0 -1
  172. package/dist/services/duck-db/duckDBConnectionManager.js +0 -184
  173. package/dist/services/duck-db/duckDBConnectionManager.js.map +0 -1
  174. package/dist/services/duck-db/duckDBQueryExecutor.d.ts +0 -18
  175. package/dist/services/duck-db/duckDBQueryExecutor.d.ts.map +0 -1
  176. package/dist/services/duck-db/duckDBQueryExecutor.js +0 -115
  177. package/dist/services/duck-db/duckDBQueryExecutor.js.map +0 -1
  178. package/dist/services/duck-db/duckDBService.d.ts +0 -27
  179. package/dist/services/duck-db/duckDBService.d.ts.map +0 -1
  180. package/dist/services/duck-db/duckDBService.js +0 -151
  181. package/dist/services/duck-db/duckDBService.js.map +0 -1
  182. package/dist/services/duck-db/types.d.ts +0 -135
  183. package/dist/services/duck-db/types.d.ts.map +0 -1
  184. package/dist/services/duck-db/types.js +0 -6
  185. package/dist/services/duck-db/types.js.map +0 -1
  186. package/dist/services/llm-providers/openRouterProvider.d.ts +0 -36
  187. package/dist/services/llm-providers/openRouterProvider.d.ts.map +0 -1
  188. package/dist/services/llm-providers/openRouterProvider.js +0 -235
  189. package/dist/services/llm-providers/openRouterProvider.js.map +0 -1
  190. package/dist/services/supabase/supabaseClient.d.ts +0 -25
  191. package/dist/services/supabase/supabaseClient.d.ts.map +0 -1
  192. package/dist/services/supabase/supabaseClient.js +0 -68
  193. package/dist/services/supabase/supabaseClient.js.map +0 -1
  194. package/dist/storage/duckdbExample.d.ts +0 -8
  195. package/dist/storage/duckdbExample.d.ts.map +0 -1
  196. package/dist/storage/duckdbExample.js +0 -197
  197. package/dist/storage/duckdbExample.js.map +0 -1
@@ -1,25 +0,0 @@
1
- /**
2
- * @fileoverview Initializes and exports a singleton Supabase client instance.
3
- * This module ensures that the Supabase client is initialized once and shared
4
- * across the application, using credentials from the central configuration.
5
- * It handles both the standard client and the admin client (using the service role key).
6
- *
7
- * @module src/services/supabase/supabaseClient
8
- */
9
- import { SupabaseClient } from "@supabase/supabase-js";
10
- type Database = Record<string, unknown>;
11
- /**
12
- * Returns the singleton Supabase client instance.
13
- * Throws an McpError if the client is not initialized.
14
- * @returns The Supabase client.
15
- */
16
- export declare const getSupabaseClient: () => SupabaseClient<Database>;
17
- /**
18
- * Returns the singleton Supabase admin client instance.
19
- * This client uses the service role key and bypasses RLS.
20
- * Throws an McpError if the admin client is not initialized.
21
- * @returns The Supabase admin client.
22
- */
23
- export declare const getSupabaseAdminClient: () => SupabaseClient<Database>;
24
- export {};
25
- //# sourceMappingURL=supabaseClient.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"supabaseClient.d.ts","sourceRoot":"","sources":["../../../src/services/supabase/supabaseClient.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAOrE,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAiDxC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAAO,cAAc,CAAC,QAAQ,CAQ3D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,QAAO,cAAc,CAAC,QAAQ,CAQhE,CAAC"}
@@ -1,68 +0,0 @@
1
- /**
2
- * @fileoverview Initializes and exports a singleton Supabase client instance.
3
- * This module ensures that the Supabase client is initialized once and shared
4
- * across the application, using credentials from the central configuration.
5
- * It handles both the standard client and the admin client (using the service role key).
6
- *
7
- * @module src/services/supabase/supabaseClient
8
- */
9
- import { createClient } from "@supabase/supabase-js";
10
- import { config } from "../../config/index.js";
11
- import { JsonRpcErrorCode, McpError } from "../../types-global/errors.js";
12
- import { logger, requestContextService } from "../../utils/index.js";
13
- let supabase = null;
14
- let supabaseAdmin = null;
15
- const initializeSupabase = () => {
16
- const context = requestContextService.createRequestContext({
17
- operation: "initializeSupabase",
18
- });
19
- if (config.supabase?.url && config.supabase?.anonKey) {
20
- if (!supabase) {
21
- supabase = createClient(config.supabase.url, config.supabase.anonKey, {
22
- auth: {
23
- persistSession: false,
24
- autoRefreshToken: false,
25
- },
26
- });
27
- logger.info(context, "Supabase client initialized.");
28
- }
29
- if (!supabaseAdmin && config.supabase.serviceRoleKey) {
30
- supabaseAdmin = createClient(config.supabase.url, config.supabase.serviceRoleKey, {
31
- auth: {
32
- persistSession: false,
33
- autoRefreshToken: false,
34
- },
35
- });
36
- logger.info(context, "Supabase admin client initialized.");
37
- }
38
- }
39
- else {
40
- logger.warning(context, "Supabase URL or anon key is missing. Supabase clients not initialized.");
41
- }
42
- };
43
- // Initialize on load
44
- initializeSupabase();
45
- /**
46
- * Returns the singleton Supabase client instance.
47
- * Throws an McpError if the client is not initialized.
48
- * @returns The Supabase client.
49
- */
50
- export const getSupabaseClient = () => {
51
- if (!supabase) {
52
- throw new McpError(JsonRpcErrorCode.ServiceUnavailable, "Supabase client has not been initialized. Please check your SUPABASE_URL and SUPABASE_ANON_KEY environment variables.");
53
- }
54
- return supabase;
55
- };
56
- /**
57
- * Returns the singleton Supabase admin client instance.
58
- * This client uses the service role key and bypasses RLS.
59
- * Throws an McpError if the admin client is not initialized.
60
- * @returns The Supabase admin client.
61
- */
62
- export const getSupabaseAdminClient = () => {
63
- if (!supabaseAdmin) {
64
- throw new McpError(JsonRpcErrorCode.ServiceUnavailable, "Supabase admin client has not been initialized. Please check your SUPABASE_SERVICE_ROLE_KEY environment variable.");
65
- }
66
- return supabaseAdmin;
67
- };
68
- //# sourceMappingURL=supabaseClient.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"supabaseClient.js","sourceRoot":"","sources":["../../../src/services/supabase/supabaseClient.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAMjE,IAAI,QAAQ,GAAoC,IAAI,CAAC;AACrD,IAAI,aAAa,GAAoC,IAAI,CAAC;AAE1D,MAAM,kBAAkB,GAAG,GAAG,EAAE;IAC9B,MAAM,OAAO,GAAG,qBAAqB,CAAC,oBAAoB,CAAC;QACzD,SAAS,EAAE,oBAAoB;KAChC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,YAAY,CACrB,MAAM,CAAC,QAAQ,CAAC,GAAG,EACnB,MAAM,CAAC,QAAQ,CAAC,OAAO,EACvB;gBACE,IAAI,EAAE;oBACJ,cAAc,EAAE,KAAK;oBACrB,gBAAgB,EAAE,KAAK;iBACxB;aACF,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YACrD,aAAa,GAAG,YAAY,CAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,EACnB,MAAM,CAAC,QAAQ,CAAC,cAAc,EAC9B;gBACE,IAAI,EAAE;oBACJ,cAAc,EAAE,KAAK;oBACrB,gBAAgB,EAAE,KAAK;iBACxB;aACF,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,oCAAoC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CACZ,OAAO,EACP,wEAAwE,CACzE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,qBAAqB;AACrB,kBAAkB,EAAE,CAAC;AAErB;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAA6B,EAAE;IAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,kBAAkB,EACnC,uHAAuH,CACxH,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAA6B,EAAE;IACnE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,kBAAkB,EACnC,mHAAmH,CACpH,CAAC;IACJ,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * @fileoverview Example script to demonstrate usage of the DuckDBService.
3
- * Creates a sample database, table, inserts data, queries it, and logs results.
4
- * Database files will be stored in the './duckdata/' directory.
5
- * @module storage/duckdbExample
6
- */
7
- export {};
8
- //# sourceMappingURL=duckdbExample.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"duckdbExample.d.ts","sourceRoot":"","sources":["../../src/storage/duckdbExample.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,197 +0,0 @@
1
- /**
2
- * @fileoverview Example script to demonstrate usage of the DuckDBService.
3
- * Creates a sample database, table, inserts data, queries it, and logs results.
4
- * Database files will be stored in the './duckdata/' directory.
5
- * @module storage/duckdbExample
6
- */
7
- import * as fs from "fs";
8
- import * as path from "path";
9
- import { DuckDBService } from "../services/duck-db/duckDBService.js";
10
- import { JsonRpcErrorCode } from "../types-global/errors.js";
11
- import { ErrorHandler, idGenerator, // Added idGenerator import
12
- logger, requestContextService, } from "../utils/index.js";
13
- const DUCKDB_DATA_DIR = path.resolve(process.cwd(), "duckdata");
14
- const DUCKDB_FILE_PATH = path.join(DUCKDB_DATA_DIR, "example.db");
15
- /**
16
- * Ensures that the directory for storing DuckDB files exists.
17
- * @param {RequestContext} context - The request context for logging.
18
- */
19
- function ensureDataDirectoryExists(context) {
20
- if (!fs.existsSync(DUCKDB_DATA_DIR)) {
21
- logger.info(context, `Data directory ${DUCKDB_DATA_DIR} does not exist. Creating...`);
22
- try {
23
- fs.mkdirSync(DUCKDB_DATA_DIR, { recursive: true });
24
- logger.info(context, `Data directory ${DUCKDB_DATA_DIR} created.`);
25
- }
26
- catch (error) {
27
- logger.error({
28
- error: error,
29
- ...context,
30
- }, `Failed to create data directory ${DUCKDB_DATA_DIR}`);
31
- // Re-throw as a critical error if directory creation fails
32
- throw new Error(`Could not create DuckDB data directory: ${error instanceof Error ? error.message : String(error)}`);
33
- }
34
- }
35
- else {
36
- logger.debug(context, `Data directory ${DUCKDB_DATA_DIR} already exists.`);
37
- }
38
- // Ensure a fresh database file for the example by deleting it if it exists.
39
- // This allows launchConfig settings like custom_user_agent to be applied on each run.
40
- if (fs.existsSync(DUCKDB_FILE_PATH)) {
41
- logger.info(context, `Existing DuckDB file ${DUCKDB_FILE_PATH} found. Deleting for a fresh example run...`);
42
- try {
43
- fs.unlinkSync(DUCKDB_FILE_PATH);
44
- logger.info(context, `Successfully deleted ${DUCKDB_FILE_PATH}.`);
45
- }
46
- catch (error) {
47
- logger.error({ error: error, ...context }, `Failed to delete existing DuckDB file ${DUCKDB_FILE_PATH}`);
48
- // Re-throw as a critical error if deletion fails, as it will likely cause subsequent errors
49
- throw new Error(`Could not delete existing DuckDB file: ${error instanceof Error ? error.message : String(error)}`);
50
- }
51
- }
52
- }
53
- async function runDuckDBExample() {
54
- const operation = "runDuckDBExample";
55
- const context = requestContextService.createRequestContext({ operation });
56
- logger.notice(context, "Starting DuckDB example script...");
57
- ensureDataDirectoryExists(context);
58
- const service = new DuckDBService();
59
- const config = {
60
- dbPath: DUCKDB_FILE_PATH,
61
- extensions: ["json"], // Example: include an extension
62
- launchConfig: { custom_user_agent: "DuckDBExampleScript/1.0" },
63
- };
64
- try {
65
- logger.info(context, `Initializing DuckDBService with path: ${config.dbPath}`);
66
- await service.initialize(config);
67
- logger.info(context, "DuckDBService initialized.");
68
- // Create a table
69
- const createTableSql = `
70
- CREATE TABLE IF NOT EXISTS users (
71
- id VARCHAR(6) PRIMARY KEY,
72
- name VARCHAR NOT NULL,
73
- email VARCHAR,
74
- createdAt TIMESTAMP DEFAULT current_timestamp
75
- );
76
- `;
77
- logger.info({
78
- ...context,
79
- sql: createTableSql,
80
- }, "Creating 'users' table...");
81
- await service.run(createTableSql);
82
- logger.info(context, "'users' table created or already exists.");
83
- // Insert data
84
- const usersToInsert = [
85
- { name: "Alice Wonderland", email: "alice@example.com" },
86
- { name: "Bob The Builder", email: "bob@example.com" },
87
- { name: "Charlie Chaplin", email: "charlie@example.com" },
88
- ].map((user) => ({
89
- id: idGenerator.generateRandomString(6), // Generate 6-digit alphanumeric ID directly
90
- ...user,
91
- }));
92
- logger.info({
93
- ...context,
94
- users: usersToInsert.length,
95
- }, "Inserting data into 'users' table...");
96
- for (const user of usersToInsert) {
97
- // Check if user already exists to prevent primary key constraint errors on re-runs
98
- const existingUser = await service.query("SELECT id FROM users WHERE id = ?", [user.id]);
99
- if (existingUser.rowCount === 0) {
100
- await service.run("INSERT INTO users (id, name, email) VALUES (?, ?, ?)", [user.id, user.name, user.email]);
101
- logger.debug(context, `Inserted user with ID: ${user.id}`);
102
- }
103
- else {
104
- logger.debug(context, `User with ID: ${user.id} already exists. Skipping insertion.`);
105
- }
106
- }
107
- logger.info(context, "Data insertion complete.");
108
- // Query data
109
- const querySql = "SELECT id, name, email, createdAt FROM users ORDER BY id;";
110
- logger.info({ ...context, sql: querySql }, "Querying 'users' table...");
111
- const result = await service.query(querySql);
112
- logger.notice({
113
- ...context,
114
- rowCount: result.rowCount,
115
- columnNames: result.columnNames,
116
- }, "Query Results:");
117
- result.rows.forEach((row, index) => {
118
- logger.info({ ...context, rowData: row }, `Row ${index + 1}:`);
119
- });
120
- // Example of using an extension function (json)
121
- // Use the ID of the first inserted user for the query
122
- if (usersToInsert.length > 0) {
123
- const firstUser = usersToInsert[0];
124
- if (!firstUser) {
125
- logger.warning(context, "Could not get the first user for JSON query example.");
126
- return;
127
- }
128
- const firstUserId = firstUser.id;
129
- const jsonQuerySql = "SELECT json_object('id', id, 'name', name, 'email', email) AS user_json FROM users WHERE id = ?;"; // Added email to json_object
130
- logger.info({
131
- ...context,
132
- sql: jsonQuerySql,
133
- userId: firstUserId,
134
- }, "Querying with JSON extension function for a specific user...");
135
- const jsonResult = await service.query(jsonQuerySql, [firstUserId]);
136
- if (jsonResult.rowCount > 0) {
137
- logger.info({
138
- ...context,
139
- jsonData: jsonResult.rows[0],
140
- }, "JSON Query Result:");
141
- }
142
- else {
143
- logger.warning(context, `Could not find user with ID ${firstUserId} for JSON query example.`); // Changed warn to warning
144
- }
145
- }
146
- else {
147
- logger.info(context, "Skipping JSON query example as no users were inserted.");
148
- }
149
- }
150
- catch (error) {
151
- // ErrorHandler.tryCatch is used within the service, so errors should be McpError
152
- // If an error occurs outside service calls (e.g. directory creation), it might be a standard Error
153
- logger.error({
154
- error: error,
155
- ...context,
156
- isMcpError: error instanceof Object && "errorCode" in error, // Basic check
157
- }, "An error occurred in the DuckDB example script");
158
- }
159
- finally {
160
- logger.info(context, "Closing DuckDBService...");
161
- // Wrap close in its own tryCatch as it might also throw
162
- try {
163
- await service.close();
164
- logger.info(context, "DuckDBService closed.");
165
- }
166
- catch (closeError) {
167
- logger.error({
168
- error: closeError,
169
- ...context,
170
- }, "Failed to close DuckDBService");
171
- }
172
- }
173
- logger.notice(context, "DuckDB example script finished.");
174
- }
175
- // Self-executing async function
176
- (async () => {
177
- // Setup a global error handler for unhandled rejections or exceptions
178
- // specific to this script's execution context.
179
- const scriptContext = requestContextService.createRequestContext({
180
- operation: "DuckDBExampleScript.main",
181
- });
182
- try {
183
- await ErrorHandler.tryCatch(runDuckDBExample, {
184
- operation: "runDuckDBExample.mainExecution",
185
- context: scriptContext,
186
- errorCode: JsonRpcErrorCode.InternalError, // Changed from SCRIPT_EXECUTION_ERROR
187
- critical: true, // If the main example fails, it's critical for the script
188
- });
189
- }
190
- catch (e) {
191
- // This catch is for errors that ErrorHandler.tryCatch itself might rethrow
192
- // or if ErrorHandler is bypassed.
193
- logger.crit({ error: e, ...scriptContext }, "Unhandled critical error in DuckDB example script execution.");
194
- process.exit(1); // Exit with error code
195
- }
196
- })();
197
- //# sourceMappingURL=duckdbExample.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"duckdbExample.js","sourceRoot":"","sources":["../../src/storage/duckdbExample.ts"],"names":[],"mappings":"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"}