@eamonboyle/mssql-mcp 1.2.0 → 1.3.1

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 (124) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +43 -7
  3. package/dist/config.d.ts +8 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +40 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/db.d.ts +1 -0
  8. package/dist/db.d.ts.map +1 -1
  9. package/dist/db.js +1 -1
  10. package/dist/db.js.map +1 -1
  11. package/dist/index.js +356 -44
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcpResults.d.ts +49 -0
  14. package/dist/mcpResults.d.ts.map +1 -0
  15. package/dist/mcpResults.js +246 -0
  16. package/dist/mcpResults.js.map +1 -0
  17. package/dist/promptRegistry.d.ts.map +1 -1
  18. package/dist/promptRegistry.js +6 -1
  19. package/dist/promptRegistry.js.map +1 -1
  20. package/dist/resourceRegistry.d.ts +2 -0
  21. package/dist/resourceRegistry.d.ts.map +1 -1
  22. package/dist/resourceRegistry.js +149 -10
  23. package/dist/resourceRegistry.js.map +1 -1
  24. package/dist/schema.d.ts +16 -0
  25. package/dist/schema.d.ts.map +1 -1
  26. package/dist/schema.js +180 -1
  27. package/dist/schema.js.map +1 -1
  28. package/dist/serverState.d.ts +28 -0
  29. package/dist/serverState.d.ts.map +1 -0
  30. package/dist/serverState.js +99 -0
  31. package/dist/serverState.js.map +1 -0
  32. package/dist/sql.js +0 -0
  33. package/dist/toolRegistry.d.ts +4 -0
  34. package/dist/toolRegistry.d.ts.map +1 -1
  35. package/dist/toolRegistry.js +210 -64
  36. package/dist/toolRegistry.js.map +1 -1
  37. package/dist/tools/AnalyzeTableTool.d.ts +37 -0
  38. package/dist/tools/AnalyzeTableTool.d.ts.map +1 -0
  39. package/dist/tools/AnalyzeTableTool.js +81 -0
  40. package/dist/tools/AnalyzeTableTool.js.map +1 -0
  41. package/dist/tools/DeleteDataTool.d.ts.map +1 -1
  42. package/dist/tools/DeleteDataTool.js +4 -1
  43. package/dist/tools/DeleteDataTool.js.map +1 -1
  44. package/dist/tools/DescribeRelationshipsTool.d.ts +20 -0
  45. package/dist/tools/DescribeRelationshipsTool.d.ts.map +1 -0
  46. package/dist/tools/DescribeRelationshipsTool.js +24 -0
  47. package/dist/tools/DescribeRelationshipsTool.js.map +1 -0
  48. package/dist/tools/ListDatabasesTool.d.ts +16 -0
  49. package/dist/tools/ListDatabasesTool.d.ts.map +1 -0
  50. package/dist/tools/ListDatabasesTool.js +26 -0
  51. package/dist/tools/ListDatabasesTool.js.map +1 -0
  52. package/dist/tools/ListForeignKeysTool.d.ts +19 -0
  53. package/dist/tools/ListForeignKeysTool.d.ts.map +1 -0
  54. package/dist/tools/ListForeignKeysTool.js +24 -0
  55. package/dist/tools/ListForeignKeysTool.js.map +1 -0
  56. package/dist/tools/PreviewDeleteTool.d.ts +28 -0
  57. package/dist/tools/PreviewDeleteTool.d.ts.map +1 -0
  58. package/dist/tools/PreviewDeleteTool.js +31 -0
  59. package/dist/tools/PreviewDeleteTool.js.map +1 -0
  60. package/dist/tools/PreviewUpdateTool.d.ts +30 -0
  61. package/dist/tools/PreviewUpdateTool.d.ts.map +1 -0
  62. package/dist/tools/PreviewUpdateTool.js +34 -0
  63. package/dist/tools/PreviewUpdateTool.js.map +1 -0
  64. package/dist/tools/ReadDataTool.js +2 -2
  65. package/dist/tools/ReadDataTool.js.map +1 -1
  66. package/dist/tools/UpdateDataTool.d.ts +1 -0
  67. package/dist/tools/UpdateDataTool.d.ts.map +1 -1
  68. package/dist/tools/UpdateDataTool.js +6 -3
  69. package/dist/tools/UpdateDataTool.js.map +1 -1
  70. package/dist/validation.js +0 -0
  71. package/dist/writePreview.d.ts +20 -0
  72. package/dist/writePreview.d.ts.map +1 -0
  73. package/dist/writePreview.js +27 -0
  74. package/dist/writePreview.js.map +1 -0
  75. package/dist/writePreviewGrant.d.ts +18 -0
  76. package/dist/writePreviewGrant.d.ts.map +1 -0
  77. package/dist/writePreviewGrant.js +71 -0
  78. package/dist/writePreviewGrant.js.map +1 -0
  79. package/dist/writePreviewGrantStore.d.ts +10 -0
  80. package/dist/writePreviewGrantStore.d.ts.map +1 -0
  81. package/dist/writePreviewGrantStore.js +47 -0
  82. package/dist/writePreviewGrantStore.js.map +1 -0
  83. package/dist/writeSafety.js +0 -0
  84. package/package.json +6 -2
  85. package/dist/__tests__/ExplainQueryTool.test.d.ts +0 -2
  86. package/dist/__tests__/ExplainQueryTool.test.d.ts.map +0 -1
  87. package/dist/__tests__/ExplainQueryTool.test.js +0 -96
  88. package/dist/__tests__/ExplainQueryTool.test.js.map +0 -1
  89. package/dist/__tests__/config.test.d.ts +0 -2
  90. package/dist/__tests__/config.test.d.ts.map +0 -1
  91. package/dist/__tests__/config.test.js +0 -29
  92. package/dist/__tests__/config.test.js.map +0 -1
  93. package/dist/__tests__/db.test.d.ts +0 -2
  94. package/dist/__tests__/db.test.d.ts.map +0 -1
  95. package/dist/__tests__/db.test.js +0 -204
  96. package/dist/__tests__/db.test.js.map +0 -1
  97. package/dist/__tests__/promptRegistry.test.d.ts +0 -2
  98. package/dist/__tests__/promptRegistry.test.d.ts.map +0 -1
  99. package/dist/__tests__/promptRegistry.test.js +0 -40
  100. package/dist/__tests__/promptRegistry.test.js.map +0 -1
  101. package/dist/__tests__/resourceRegistry.test.d.ts +0 -2
  102. package/dist/__tests__/resourceRegistry.test.d.ts.map +0 -1
  103. package/dist/__tests__/resourceRegistry.test.js +0 -40
  104. package/dist/__tests__/resourceRegistry.test.js.map +0 -1
  105. package/dist/__tests__/schema.test.d.ts +0 -2
  106. package/dist/__tests__/schema.test.d.ts.map +0 -1
  107. package/dist/__tests__/schema.test.js +0 -130
  108. package/dist/__tests__/schema.test.js.map +0 -1
  109. package/dist/__tests__/sql.test.d.ts +0 -2
  110. package/dist/__tests__/sql.test.d.ts.map +0 -1
  111. package/dist/__tests__/sql.test.js +0 -35
  112. package/dist/__tests__/sql.test.js.map +0 -1
  113. package/dist/__tests__/toolRegistry.test.d.ts +0 -2
  114. package/dist/__tests__/toolRegistry.test.d.ts.map +0 -1
  115. package/dist/__tests__/toolRegistry.test.js +0 -47
  116. package/dist/__tests__/toolRegistry.test.js.map +0 -1
  117. package/dist/__tests__/validation.test.d.ts +0 -2
  118. package/dist/__tests__/validation.test.d.ts.map +0 -1
  119. package/dist/__tests__/validation.test.js +0 -111
  120. package/dist/__tests__/validation.test.js.map +0 -1
  121. package/dist/__tests__/writeTools.test.d.ts +0 -2
  122. package/dist/__tests__/writeTools.test.d.ts.map +0 -1
  123. package/dist/__tests__/writeTools.test.js +0 -115
  124. package/dist/__tests__/writeTools.test.js.map +0 -1
@@ -0,0 +1,71 @@
1
+ import { createHash } from "node:crypto";
2
+ function stableStringify(value) {
3
+ return JSON.stringify(value, (_key, v) => {
4
+ if (v instanceof Date) {
5
+ return v.toISOString();
6
+ }
7
+ return v;
8
+ });
9
+ }
10
+ function normalizeFilters(filters) {
11
+ return [...filters]
12
+ .map((f) => ({
13
+ column: f.column,
14
+ operator: f.operator,
15
+ value: f.value,
16
+ values: f.values ? [...f.values] : undefined,
17
+ }))
18
+ .sort((a, b) => {
19
+ const byCol = a.column.localeCompare(b.column);
20
+ if (byCol !== 0) {
21
+ return byCol;
22
+ }
23
+ return a.operator.localeCompare(b.operator);
24
+ });
25
+ }
26
+ function normalizeUpdates(updates) {
27
+ const keys = Object.keys(updates).sort((a, b) => a.localeCompare(b));
28
+ const out = {};
29
+ for (const key of keys) {
30
+ out[key] = updates[key];
31
+ }
32
+ return out;
33
+ }
34
+ export function fingerprintForUpdateOp(params) {
35
+ const payload = {
36
+ kind: "update",
37
+ database: params.databaseName ?? "",
38
+ schema: params.schemaName ?? "",
39
+ table: params.tableName,
40
+ filters: normalizeFilters(params.filters),
41
+ updates: normalizeUpdates(params.updates),
42
+ };
43
+ return createHash("sha256").update(stableStringify(payload)).digest("hex");
44
+ }
45
+ export function fingerprintForDeleteOp(params) {
46
+ const payload = {
47
+ kind: "delete",
48
+ database: params.databaseName ?? "",
49
+ schema: params.schemaName ?? "",
50
+ table: params.tableName,
51
+ filters: normalizeFilters(params.filters),
52
+ };
53
+ return createHash("sha256").update(stableStringify(payload)).digest("hex");
54
+ }
55
+ export function fingerprintForWriteTool(toolName, requestArgs) {
56
+ const filters = requestArgs.filters ?? [];
57
+ const databaseName = typeof requestArgs.databaseName === "string" ? requestArgs.databaseName : undefined;
58
+ const schemaName = typeof requestArgs.schemaName === "string" ? requestArgs.schemaName : undefined;
59
+ const tableName = String(requestArgs.tableName ?? "");
60
+ if (toolName === "preview_delete" || toolName === "delete_data") {
61
+ return fingerprintForDeleteOp({ databaseName, schemaName, tableName, filters });
62
+ }
63
+ return fingerprintForUpdateOp({
64
+ databaseName,
65
+ schemaName,
66
+ tableName,
67
+ filters,
68
+ updates: requestArgs.updates ?? {},
69
+ });
70
+ }
71
+ //# sourceMappingURL=writePreviewGrant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writePreviewGrant.js","sourceRoot":"","sources":["../src/writePreviewGrant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACvC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAoB;IAC5C,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;KAC7C,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgC;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAMtC;IACC,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,QAAiB;QACvB,QAAQ,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;QACnC,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;QAC/B,KAAK,EAAE,MAAM,CAAC,SAAS;QACvB,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;QACzC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;KAC1C,CAAC;IACF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAKtC;IACC,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,QAAiB;QACvB,QAAQ,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;QACnC,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;QAC/B,KAAK,EAAE,MAAM,CAAC,SAAS;QACvB,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;KAC1C,CAAC;IACF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAQD,MAAM,UAAU,uBAAuB,CACrC,QAA4B,EAC5B,WAAoC;IAEpC,MAAM,OAAO,GAAI,WAAW,CAAC,OAAuB,IAAI,EAAE,CAAC;IAC3D,MAAM,YAAY,GAChB,OAAO,WAAW,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IACtF,MAAM,UAAU,GACd,OAAO,WAAW,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACtD,IAAI,QAAQ,KAAK,gBAAgB,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAChE,OAAO,sBAAsB,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,sBAAsB,CAAC;QAC5B,YAAY;QACZ,UAAU;QACV,SAAS;QACT,OAAO;QACP,OAAO,EAAG,WAAW,CAAC,OAAmC,IAAI,EAAE;KAChE,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { WriteDataToolName } from "./writePreviewGrant.js";
2
+ /**
3
+ * Process-global store so preview tokens remain valid across HTTP round-trips
4
+ * (each request uses a fresh ServerState for query plans / results).
5
+ */
6
+ export declare const writePreviewGrantStore: {
7
+ issue(fingerprint: string, writeToolName: WriteDataToolName): string;
8
+ consume(token: string, fingerprint: string, writeToolName: WriteDataToolName): boolean;
9
+ };
10
+ //# sourceMappingURL=writePreviewGrantStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writePreviewGrantStore.d.ts","sourceRoot":"","sources":["../src/writePreviewGrantStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAoBhE;;;GAGG;AACH,eAAO,MAAM,sBAAsB;uBACd,MAAM,iBAAiB,iBAAiB,GAAG,MAAM;mBAa3D,MAAM,eACA,MAAM,iBACJ,iBAAiB,GAC/B,OAAO;CAqBX,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { randomBytes } from "node:crypto";
2
+ const WRITE_PREVIEW_GRANT_TTL_MS = 10 * 60 * 1000;
3
+ const grants = new Map();
4
+ function purgeExpiredGrants(now) {
5
+ for (const [token, grant] of grants) {
6
+ if (grant.expiresAt < now) {
7
+ grants.delete(token);
8
+ }
9
+ }
10
+ }
11
+ /**
12
+ * Process-global store so preview tokens remain valid across HTTP round-trips
13
+ * (each request uses a fresh ServerState for query plans / results).
14
+ */
15
+ export const writePreviewGrantStore = {
16
+ issue(fingerprint, writeToolName) {
17
+ const now = Date.now();
18
+ purgeExpiredGrants(now);
19
+ const token = randomBytes(24).toString("base64url");
20
+ grants.set(token, {
21
+ fingerprint,
22
+ writeToolName,
23
+ expiresAt: now + WRITE_PREVIEW_GRANT_TTL_MS,
24
+ });
25
+ return token;
26
+ },
27
+ consume(token, fingerprint, writeToolName) {
28
+ const now = Date.now();
29
+ purgeExpiredGrants(now);
30
+ if (!token) {
31
+ return false;
32
+ }
33
+ const grant = grants.get(token);
34
+ if (!grant) {
35
+ return false;
36
+ }
37
+ if (grant.expiresAt < now ||
38
+ grant.fingerprint !== fingerprint ||
39
+ grant.writeToolName !== writeToolName) {
40
+ grants.delete(token);
41
+ return false;
42
+ }
43
+ grants.delete(token);
44
+ return true;
45
+ },
46
+ };
47
+ //# sourceMappingURL=writePreviewGrantStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writePreviewGrantStore.js","sourceRoot":"","sources":["../src/writePreviewGrantStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS1C,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAElD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEpD,SAAS,kBAAkB,CAAC,GAAW;IACrC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,KAAK,CAAC,WAAmB,EAAE,aAAgC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;YAChB,WAAW;YACX,aAAa;YACb,SAAS,EAAE,GAAG,GAAG,0BAA0B;SAC5C,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CACL,KAAa,EACb,WAAmB,EACnB,aAAgC;QAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IACE,KAAK,CAAC,SAAS,GAAG,GAAG;YACrB,KAAK,CAAC,WAAW,KAAK,WAAW;YACjC,KAAK,CAAC,aAAa,KAAK,aAAa,EACrC,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eamonboyle/mssql-mcp",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "MCP server for Microsoft SQL Server - query and manage your database with natural language in Cursor, Claude, and VS Code",
5
5
  "keywords": [
6
6
  "mcp",
@@ -21,12 +21,16 @@
21
21
  "bugs": {
22
22
  "url": "https://github.com/eamonboyle/mssql-mcp/issues"
23
23
  },
24
+ "publishConfig": {
25
+ "access": "public",
26
+ "registry": "https://registry.npmjs.org/"
27
+ },
24
28
  "main": "dist/index.js",
25
29
  "bin": {
26
30
  "mssql-mcp": "dist/index.js"
27
31
  },
28
32
  "scripts": {
29
- "build": "tsc && shx chmod +x dist/*.js",
33
+ "build": "shx rm -rf dist && tsc && shx chmod +x dist/*.js",
30
34
  "prepare": "npm run build",
31
35
  "watch": "tsc --watch",
32
36
  "start": "node dist/index.js",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ExplainQueryTool.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExplainQueryTool.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ExplainQueryTool.test.ts"],"names":[],"mappings":""}
@@ -1,96 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
- const explainMockState = vi.hoisted(() => ({
3
- closeCalls: 0,
4
- statements: [],
5
- failOnQuery: false,
6
- }));
7
- const mockRequestModule = vi.hoisted(() => {
8
- class MockRequest {
9
- async query(statement) {
10
- return this.run(statement);
11
- }
12
- async batch(statement) {
13
- return this.run(statement);
14
- }
15
- async run(statement) {
16
- explainMockState.statements.push(statement);
17
- if (statement === "SET SHOWPLAN_XML ON") {
18
- return { recordsets: [] };
19
- }
20
- if (statement === "SET SHOWPLAN_XML OFF") {
21
- return { recordsets: [] };
22
- }
23
- if (explainMockState.failOnQuery) {
24
- throw new Error("query failed");
25
- }
26
- return {
27
- recordsets: [[{ planXml: "<ShowPlanXML />" }]],
28
- };
29
- }
30
- }
31
- function mockPool() {
32
- return {
33
- request() {
34
- return new MockRequest();
35
- },
36
- async close() {
37
- explainMockState.closeCalls += 1;
38
- },
39
- };
40
- }
41
- return { MockRequest, mockPool };
42
- });
43
- vi.mock("mssql", () => ({
44
- default: {
45
- Request: mockRequestModule.MockRequest,
46
- },
47
- }));
48
- vi.mock("../db.js", () => ({
49
- getDedicatedSqlPool: vi.fn(async () => ({
50
- pool: mockRequestModule.mockPool(),
51
- })),
52
- }));
53
- import { ExplainQueryTool } from "../tools/ExplainQueryTool.js";
54
- describe("ExplainQueryTool", () => {
55
- beforeEach(() => {
56
- vi.spyOn(console, "error").mockImplementation(() => { });
57
- explainMockState.closeCalls = 0;
58
- explainMockState.statements.length = 0;
59
- explainMockState.failOnQuery = false;
60
- });
61
- afterEach(() => {
62
- vi.restoreAllMocks();
63
- });
64
- it("uses a dedicated pool and always disables SHOWPLAN_XML", async () => {
65
- const tool = new ExplainQueryTool();
66
- const result = await tool.run({
67
- query: "SELECT * FROM movies",
68
- });
69
- expect(result).toMatchObject({
70
- success: true,
71
- planXml: "<ShowPlanXML />",
72
- recordsets: undefined,
73
- });
74
- expect(explainMockState.statements).toEqual([
75
- "SET SHOWPLAN_XML ON",
76
- "SELECT * FROM movies",
77
- "SET SHOWPLAN_XML OFF",
78
- ]);
79
- expect(explainMockState.closeCalls).toBe(1);
80
- });
81
- it("cleans up SHOWPLAN state after failures", async () => {
82
- explainMockState.failOnQuery = true;
83
- const tool = new ExplainQueryTool();
84
- const result = await tool.run({
85
- query: "SELECT * FROM movies",
86
- });
87
- expect(result).toMatchObject({ success: false });
88
- expect(explainMockState.statements).toEqual([
89
- "SET SHOWPLAN_XML ON",
90
- "SELECT * FROM movies",
91
- "SET SHOWPLAN_XML OFF",
92
- ]);
93
- expect(explainMockState.closeCalls).toBe(1);
94
- });
95
- });
96
- //# sourceMappingURL=ExplainQueryTool.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExplainQueryTool.test.js","sourceRoot":"","sources":["../../src/__tests__/ExplainQueryTool.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":""}
@@ -1,29 +0,0 @@
1
- import { afterEach, describe, expect, it } from "vitest";
2
- import { clampRowLimit, getDefaultSearchLimit, getMaxRows, getQueryTimeoutMs, } from "../config.js";
3
- const originalEnv = process.env;
4
- afterEach(() => {
5
- process.env = { ...originalEnv };
6
- });
7
- describe("config helpers", () => {
8
- it("uses defaults when env vars are absent", () => {
9
- delete process.env.MAX_ROWS;
10
- delete process.env.QUERY_TIMEOUT_MS;
11
- expect(getMaxRows()).toBe(10000);
12
- expect(getQueryTimeoutMs()).toBe(30000);
13
- expect(getDefaultSearchLimit()).toBe(100);
14
- });
15
- it("reads env-based limits", () => {
16
- process.env.MAX_ROWS = "250";
17
- process.env.QUERY_TIMEOUT_MS = "45000";
18
- expect(getMaxRows()).toBe(250);
19
- expect(getQueryTimeoutMs()).toBe(45000);
20
- expect(getDefaultSearchLimit()).toBe(100);
21
- });
22
- it("clamps row limits to the configured maximum", () => {
23
- process.env.MAX_ROWS = "50";
24
- expect(clampRowLimit(200)).toBe(50);
25
- expect(clampRowLimit("5")).toBe(5);
26
- expect(clampRowLimit(undefined)).toBe(50);
27
- });
28
- });
29
- //# sourceMappingURL=config.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,UAAU,EACV,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;AAEhC,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAEpC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC;QAEvC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;QAE5B,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=db.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/db.test.ts"],"names":[],"mappings":""}
@@ -1,204 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
- const mssqlMockState = vi.hoisted(() => ({
3
- poolConfigs: [],
4
- requestObject: { kind: "mock-request" },
5
- connectCalls: vi.fn(),
6
- closeCalls: vi.fn(),
7
- requestCalls: vi.fn(),
8
- }));
9
- // Mock mssql to avoid loading native deps and transitive issues in test env
10
- vi.mock("mssql", () => {
11
- class MockConnectionPool {
12
- constructor(config) {
13
- this.config = config;
14
- this.connected = false;
15
- mssqlMockState.poolConfigs.push(config);
16
- }
17
- async connect() {
18
- this.connected = true;
19
- mssqlMockState.connectCalls(this.config);
20
- return this;
21
- }
22
- async close() {
23
- this.connected = false;
24
- mssqlMockState.closeCalls(this.config);
25
- }
26
- request() {
27
- mssqlMockState.requestCalls(this.config);
28
- return mssqlMockState.requestObject;
29
- }
30
- }
31
- return {
32
- default: {
33
- ConnectionPool: MockConnectionPool,
34
- },
35
- };
36
- });
37
- import { getAllowedDatabases, getSqlRequest, resolveDatabaseName } from "../db.js";
38
- describe("getAllowedDatabases", () => {
39
- const originalEnv = process.env;
40
- beforeEach(() => {
41
- process.env = { ...originalEnv };
42
- mssqlMockState.poolConfigs.length = 0;
43
- mssqlMockState.connectCalls.mockClear();
44
- mssqlMockState.closeCalls.mockClear();
45
- mssqlMockState.requestCalls.mockClear();
46
- });
47
- afterEach(() => {
48
- process.env = originalEnv;
49
- });
50
- it("returns DATABASE_NAME when DATABASES is not set", () => {
51
- delete process.env.DATABASES;
52
- process.env.DATABASE_NAME = "MyDb";
53
- expect(getAllowedDatabases()).toEqual(["MyDb"]);
54
- });
55
- it("returns empty array when neither DATABASES nor DATABASE_NAME is set", () => {
56
- delete process.env.DATABASES;
57
- delete process.env.DATABASE_NAME;
58
- expect(getAllowedDatabases()).toEqual([]);
59
- });
60
- it("returns empty array when DATABASE_NAME is empty string", () => {
61
- delete process.env.DATABASES;
62
- process.env.DATABASE_NAME = "";
63
- expect(getAllowedDatabases()).toEqual([]);
64
- });
65
- it("returns DATABASES split by comma when set", () => {
66
- process.env.DATABASES = "ProdDB,StagingDB,AnalyticsDB";
67
- expect(getAllowedDatabases()).toEqual([
68
- "ProdDB",
69
- "StagingDB",
70
- "AnalyticsDB",
71
- ]);
72
- });
73
- it("trims whitespace from DATABASES entries", () => {
74
- process.env.DATABASES = " ProdDB , StagingDB , AnalyticsDB ";
75
- expect(getAllowedDatabases()).toEqual([
76
- "ProdDB",
77
- "StagingDB",
78
- "AnalyticsDB",
79
- ]);
80
- });
81
- it("filters out empty entries from DATABASES", () => {
82
- process.env.DATABASES = "ProdDB,,StagingDB,";
83
- expect(getAllowedDatabases()).toEqual(["ProdDB", "StagingDB"]);
84
- });
85
- it("prefers DATABASES over DATABASE_NAME when both set", () => {
86
- process.env.DATABASES = "ProdDB,StagingDB";
87
- process.env.DATABASE_NAME = "OtherDb";
88
- expect(getAllowedDatabases()).toEqual(["ProdDB", "StagingDB"]);
89
- });
90
- });
91
- describe("resolveDatabaseName", () => {
92
- const originalEnv = process.env;
93
- beforeEach(() => {
94
- process.env = { ...originalEnv };
95
- mssqlMockState.poolConfigs.length = 0;
96
- mssqlMockState.connectCalls.mockClear();
97
- mssqlMockState.closeCalls.mockClear();
98
- mssqlMockState.requestCalls.mockClear();
99
- });
100
- afterEach(() => {
101
- process.env = originalEnv;
102
- });
103
- it("returns param when valid and in allowed list", () => {
104
- process.env.DATABASES = "ProdDB,StagingDB";
105
- expect(resolveDatabaseName("ProdDB")).toBe("ProdDB");
106
- expect(resolveDatabaseName("StagingDB")).toBe("StagingDB");
107
- });
108
- it("returns DATABASE_NAME when param omitted and DATABASES not set", () => {
109
- process.env.DATABASE_NAME = "DefaultDb";
110
- delete process.env.DATABASES;
111
- expect(resolveDatabaseName()).toBe("DefaultDb");
112
- });
113
- it("returns DATABASE_NAME when it is in DATABASES", () => {
114
- process.env.DATABASES = "ProdDB,StagingDB";
115
- process.env.DATABASE_NAME = "StagingDB";
116
- expect(resolveDatabaseName()).toBe("StagingDB");
117
- });
118
- it("returns the first DATABASES entry when DATABASE_NAME is omitted", () => {
119
- process.env.DATABASES = "ProdDB,StagingDB";
120
- delete process.env.DATABASE_NAME;
121
- expect(resolveDatabaseName()).toBe("ProdDB");
122
- });
123
- it("returns param when param provided and in allowed list", () => {
124
- process.env.DATABASES = "ProdDB,StagingDB";
125
- process.env.DATABASE_NAME = "ProdDB";
126
- expect(resolveDatabaseName("StagingDB")).toBe("StagingDB");
127
- });
128
- it("falls back to the first DATABASES entry when DATABASE_NAME is not included in DATABASES", () => {
129
- process.env.DATABASES = "ProdDB,StagingDB";
130
- process.env.DATABASE_NAME = "OtherDb";
131
- expect(resolveDatabaseName()).toBe("ProdDB");
132
- });
133
- it("returns null when param not in allowed list", () => {
134
- process.env.DATABASES = "ProdDB,StagingDB";
135
- expect(resolveDatabaseName("OtherDb")).toBeNull();
136
- });
137
- it("returns null when param is empty and DATABASE_NAME not set", () => {
138
- delete process.env.DATABASE_NAME;
139
- delete process.env.DATABASES;
140
- expect(resolveDatabaseName()).toBeNull();
141
- expect(resolveDatabaseName("")).toBeNull();
142
- });
143
- it("returns resolved name when no DATABASES set (only DATABASE_NAME allowed)", () => {
144
- delete process.env.DATABASES;
145
- process.env.DATABASE_NAME = "MyDb";
146
- expect(resolveDatabaseName()).toBe("MyDb");
147
- expect(resolveDatabaseName("MyDb")).toBe("MyDb");
148
- expect(resolveDatabaseName("AnyDb")).toBeNull();
149
- });
150
- it("trims whitespace from param", () => {
151
- process.env.DATABASES = "ProdDB";
152
- expect(resolveDatabaseName(" ProdDB ")).toBe("ProdDB");
153
- });
154
- it("returns null when neither DATABASE_NAME nor DATABASES is configured", () => {
155
- delete process.env.DATABASE_NAME;
156
- delete process.env.DATABASES;
157
- expect(resolveDatabaseName()).toBeNull();
158
- });
159
- });
160
- describe("getSqlRequest", () => {
161
- const originalEnv = process.env;
162
- beforeEach(() => {
163
- process.env = { ...originalEnv };
164
- mssqlMockState.poolConfigs.length = 0;
165
- mssqlMockState.connectCalls.mockClear();
166
- mssqlMockState.closeCalls.mockClear();
167
- mssqlMockState.requestCalls.mockClear();
168
- });
169
- afterEach(() => {
170
- process.env = originalEnv;
171
- });
172
- it("returns a helpful error when no database access is configured", async () => {
173
- delete process.env.DATABASE_NAME;
174
- delete process.env.DATABASES;
175
- const result = await getSqlRequest();
176
- expect(result.error).toBe("Invalid or disallowed database. Set DATABASE_NAME or DATABASES to configure database access. Use the databaseName parameter to target a specific configured database.");
177
- });
178
- it("returns allowed databases in the error when a disallowed database is requested", async () => {
179
- process.env.DATABASES = "ProdDB,StagingDB";
180
- const result = await getSqlRequest("OtherDb");
181
- expect(result.error).toBe("Invalid or disallowed database. Allowed: ProdDB, StagingDB. Use the databaseName parameter to target a specific configured database.");
182
- });
183
- it("returns a request using the resolved default database", async () => {
184
- process.env.DATABASES = "ProdDBDefault,StagingDB";
185
- delete process.env.DATABASE_NAME;
186
- const result = await getSqlRequest();
187
- expect(result.error).toBeUndefined();
188
- expect(result.request).toBe(mssqlMockState.requestObject);
189
- expect(mssqlMockState.poolConfigs).toContainEqual(expect.objectContaining({ database: "ProdDBDefault" }));
190
- expect(mssqlMockState.connectCalls).toHaveBeenCalledWith(expect.objectContaining({ database: "ProdDBDefault" }));
191
- expect(mssqlMockState.requestCalls).toHaveBeenCalledWith(expect.objectContaining({ database: "ProdDBDefault" }));
192
- });
193
- it("falls back to the first allowed database when DATABASE_NAME is disallowed", async () => {
194
- process.env.DATABASES = "ProdDB,StagingDB";
195
- process.env.DATABASE_NAME = "OtherDb";
196
- const result = await getSqlRequest();
197
- expect(result.error).toBeUndefined();
198
- expect(result.request).toBe(mssqlMockState.requestObject);
199
- expect(mssqlMockState.poolConfigs).toContainEqual(expect.objectContaining({ database: "ProdDB" }));
200
- expect(mssqlMockState.connectCalls).toHaveBeenCalledWith(expect.objectContaining({ database: "ProdDB" }));
201
- expect(mssqlMockState.requestCalls).toHaveBeenCalledWith(expect.objectContaining({ database: "ProdDB" }));
202
- });
203
- });
204
- //# sourceMappingURL=db.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db.test.js","sourceRoot":"","sources":["../../src/__tests__/db.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvC,WAAW,EAAE,EAAkC;IAC/C,aAAa,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;IACvC,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;IACrB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,4EAA4E;AAC5E,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;IACpB,MAAM,kBAAkB;QAGtB,YAA6B,MAA6B;YAA7B,WAAM,GAAN,MAAM,CAAuB;YAF1D,cAAS,GAAG,KAAK,CAAC;YAGhB,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,CAAC,OAAO;YACX,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,KAAK;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAED,OAAO;YACL,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,cAAc,CAAC,aAAa,CAAC;QACtC,CAAC;KACF;IAED,OAAO;QACL,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEnF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAEhC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QACjC,cAAc,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QACxC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACtC,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC;QACnC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACjC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,EAAE,CAAC;QAC/B,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,8BAA8B,CAAC;QACvD,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC;YACpC,QAAQ;YACR,WAAW;YACX,aAAa;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,sCAAsC,CAAC;QAC/D,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC;YACpC,QAAQ;YACR,WAAW;YACX,aAAa;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,oBAAoB,CAAC;QAC7C,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,SAAS,CAAC;QACtC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAEhC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QACjC,cAAc,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QACxC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACtC,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC;QAC3C,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,WAAW,CAAC;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC7B,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,WAAW,CAAC;QACxC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC;QAC3C,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACjC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC;QACrC,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yFAAyF,EAAE,GAAG,EAAE;QACjG,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,SAAS,CAAC;QACtC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC;QAC3C,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC7B,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC;QACnC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;QACjC,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC7B,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAEhC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QACjC,cAAc,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QACxC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACtC,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAE7B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QAErC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CACvB,uKAAuK,CACxK,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC9F,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CACvB,sIAAsI,CACvI,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,yBAAyB,CAAC;QAClD,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAEjC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QAErC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC1D,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,cAAc,CAC/C,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CACvD,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,oBAAoB,CACtD,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CACvD,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,oBAAoB,CACtD,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CACvD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,SAAS,CAAC;QAEtC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QAErC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC1D,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,cAAc,CAC/C,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAChD,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,oBAAoB,CACtD,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAChD,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,oBAAoB,CACtD,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAChD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=promptRegistry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"promptRegistry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/promptRegistry.test.ts"],"names":[],"mappings":""}
@@ -1,40 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { registerPrompts } from "../promptRegistry.js";
3
- describe("promptRegistry", () => {
4
- it("registers prompt callbacks without a fallback branch", () => {
5
- const callbacks = new Map();
6
- const server = {
7
- registerPrompt(name, _meta, callback) {
8
- callbacks.set(name, callback);
9
- },
10
- };
11
- registerPrompts(server, { isReadOnly: false });
12
- const callback = callbacks.get("review_write_operation");
13
- expect(callback).toBeDefined();
14
- expect(callback?.({
15
- operation: "delete inactive users",
16
- databaseName: "AppDb",
17
- })).toMatchObject({
18
- description: "Review a proposed change and identify safety checks before running it.",
19
- });
20
- });
21
- it("review_write_operation tells the assistant not to bypass when read-only", () => {
22
- const callbacks = new Map();
23
- const server = {
24
- registerPrompt(name, _meta, callback) {
25
- callbacks.set(name, callback);
26
- },
27
- };
28
- registerPrompts(server, { isReadOnly: true });
29
- const callback = callbacks.get("review_write_operation");
30
- const result = callback({
31
- operation: "DELETE FROM dbo.Users WHERE id = 1",
32
- databaseName: "AppDb",
33
- });
34
- const text = result.messages[0].content.text;
35
- expect(text).toContain("read-only");
36
- expect(text).toMatch(/sqlcmd|SSMS/i);
37
- expect(text).toMatch(/STOP|Do not execute/i);
38
- });
39
- });
40
- //# sourceMappingURL=promptRegistry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"promptRegistry.test.js","sourceRoot":"","sources":["../../src/__tests__/promptRegistry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqD,CAAC;QAC/E,MAAM,MAAM,GAAG;YACb,cAAc,CACZ,IAAY,EACZ,KAAc,EACd,QAAmD;gBAEnD,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChC,CAAC;SACF,CAAC;QAEF,eAAe,CAAC,MAAe,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CACJ,QAAQ,EAAE,CAAC;YACT,SAAS,EAAE,uBAAuB;YAClC,YAAY,EAAE,OAAO;SACtB,CAAC,CACH,CAAC,aAAa,CAAC;YACd,WAAW,EACT,wEAAwE;SAC3E,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqD,CAAC;QAC/E,MAAM,MAAM,GAAG;YACb,cAAc,CACZ,IAAY,EACZ,KAAc,EACd,QAAmD;gBAEnD,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChC,CAAC;SACF,CAAC;QAEF,eAAe,CAAC,MAAe,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC;YACtB,SAAS,EAAE,oCAAoC;YAC/C,YAAY,EAAE,OAAO;SACtB,CAAkD,CAAC;QAEpD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=resourceRegistry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resourceRegistry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resourceRegistry.test.ts"],"names":[],"mappings":""}