@toolplex/client 0.1.18 → 0.1.19

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 (38) hide show
  1. package/dist/mcp-server/index.js +10 -0
  2. package/dist/mcp-server/registry.d.ts +17 -0
  3. package/dist/mcp-server/registry.js +23 -0
  4. package/dist/mcp-server/toolHandlers/initHandler.d.ts +9 -0
  5. package/dist/mcp-server/toolHandlers/initHandler.js +46 -1
  6. package/dist/mcp-server/toolplexServer.js +5 -0
  7. package/dist/mcp-server/utils/runtimeCheck.d.ts +18 -0
  8. package/dist/mcp-server/utils/runtimeCheck.js +70 -6
  9. package/dist/server-manager/serverManager.js +3 -9
  10. package/dist/shared/enhancedPath.js +3 -3
  11. package/dist/shared/mcpServerTypes.d.ts +12 -0
  12. package/dist/src/mcp-server/clientContext.js +118 -0
  13. package/dist/src/mcp-server/logging/telemetryLogger.js +54 -0
  14. package/dist/src/mcp-server/policy/callToolObserver.js +27 -0
  15. package/dist/src/mcp-server/policy/feedbackPolicy.js +39 -0
  16. package/dist/src/mcp-server/policy/installObserver.js +35 -0
  17. package/dist/src/mcp-server/policy/playbookPolicy.js +81 -0
  18. package/dist/src/mcp-server/policy/policyEnforcer.js +105 -0
  19. package/dist/src/mcp-server/policy/serverPolicy.js +63 -0
  20. package/dist/src/mcp-server/promptsCache.js +51 -0
  21. package/dist/src/mcp-server/registry.js +134 -0
  22. package/dist/src/mcp-server/serversCache.js +100 -0
  23. package/dist/src/mcp-server/toolDefinitionsCache.js +67 -0
  24. package/dist/src/mcp-server/toolHandlers/initHandler.js +185 -0
  25. package/dist/src/mcp-server/toolplexApi/service.js +221 -0
  26. package/dist/src/mcp-server/toolplexApi/types.js +1 -0
  27. package/dist/src/mcp-server/utils/initServerManagers.js +31 -0
  28. package/dist/src/mcp-server/utils/runtimeCheck.js +94 -0
  29. package/dist/src/shared/enhancedPath.js +52 -0
  30. package/dist/src/shared/fileLogger.js +66 -0
  31. package/dist/src/shared/mcpServerTypes.js +158 -0
  32. package/dist/src/shared/serverManagerTypes.js +73 -0
  33. package/dist/src/shared/stdioServerManagerClient.js +98 -0
  34. package/dist/tests/unit/bundledDependencies.test.js +152 -0
  35. package/dist/tests/unit/registry.test.js +216 -0
  36. package/dist/version.d.ts +1 -1
  37. package/dist/version.js +1 -1
  38. package/package.json +8 -3
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Unit tests for Registry - Bundled Dependencies Storage
3
+ */
4
+ import { describe, it, beforeEach } from "node:test";
5
+ import assert from "node:assert";
6
+ import Registry from "../../src/mcp-server/registry.js";
7
+ describe("Registry - Bundled Dependencies", () => {
8
+ beforeEach(() => {
9
+ // Reset Registry before each test
10
+ Registry.reset();
11
+ });
12
+ describe("setBundledDependencies", () => {
13
+ it("should store bundled dependencies", () => {
14
+ const deps = {
15
+ node: "/bundled/node",
16
+ python: "/bundled/python3",
17
+ git: "/bundled/git",
18
+ };
19
+ Registry.setBundledDependencies(deps);
20
+ const stored = Registry.getBundledDependencies();
21
+ assert.deepStrictEqual(stored, deps);
22
+ });
23
+ it("should handle empty dependencies object", () => {
24
+ const deps = {};
25
+ Registry.setBundledDependencies(deps);
26
+ const stored = Registry.getBundledDependencies();
27
+ assert.deepStrictEqual(stored, {});
28
+ });
29
+ it("should handle partial dependencies", () => {
30
+ const deps = {
31
+ node: "/bundled/node",
32
+ // python, git, etc. not provided
33
+ };
34
+ Registry.setBundledDependencies(deps);
35
+ const stored = Registry.getBundledDependencies();
36
+ assert.strictEqual(stored.node, "/bundled/node");
37
+ assert.strictEqual(stored.python, undefined);
38
+ assert.strictEqual(stored.git, undefined);
39
+ });
40
+ it("should overwrite existing dependencies", () => {
41
+ // Set initial deps
42
+ Registry.setBundledDependencies({
43
+ node: "/bundled/node",
44
+ });
45
+ // Overwrite with new deps
46
+ Registry.setBundledDependencies({
47
+ node: "/new/bundled/node",
48
+ python: "/bundled/python",
49
+ });
50
+ const stored = Registry.getBundledDependencies();
51
+ assert.strictEqual(stored.node, "/new/bundled/node");
52
+ assert.strictEqual(stored.python, "/bundled/python");
53
+ });
54
+ it("should handle all dependency types", () => {
55
+ const deps = {
56
+ node: "/bundled/node",
57
+ python: "/bundled/python3",
58
+ git: "/bundled/git",
59
+ npx: "/bundled/npx",
60
+ uvx: "/bundled/uvx",
61
+ };
62
+ Registry.setBundledDependencies(deps);
63
+ const stored = Registry.getBundledDependencies();
64
+ assert.strictEqual(stored.node, "/bundled/node");
65
+ assert.strictEqual(stored.python, "/bundled/python3");
66
+ assert.strictEqual(stored.git, "/bundled/git");
67
+ assert.strictEqual(stored.npx, "/bundled/npx");
68
+ assert.strictEqual(stored.uvx, "/bundled/uvx");
69
+ });
70
+ });
71
+ describe("getBundledDependencies", () => {
72
+ it("should return empty object when no dependencies set", () => {
73
+ const deps = Registry.getBundledDependencies();
74
+ assert.deepStrictEqual(deps, {});
75
+ });
76
+ it("should return all stored dependencies", () => {
77
+ const originalDeps = {
78
+ node: "/bundled/node",
79
+ python: "/bundled/python3",
80
+ git: "/bundled/git",
81
+ };
82
+ Registry.setBundledDependencies(originalDeps);
83
+ const retrieved = Registry.getBundledDependencies();
84
+ assert.deepStrictEqual(retrieved, originalDeps);
85
+ });
86
+ it("should return a copy, not reference", () => {
87
+ const originalDeps = {
88
+ node: "/bundled/node",
89
+ };
90
+ Registry.setBundledDependencies(originalDeps);
91
+ const retrieved = Registry.getBundledDependencies();
92
+ // Mutate retrieved object
93
+ retrieved.node = "/modified/node";
94
+ // Original in Registry should be unchanged
95
+ const again = Registry.getBundledDependencies();
96
+ assert.strictEqual(again.node, "/bundled/node");
97
+ });
98
+ });
99
+ describe("getBundledDependencyPath", () => {
100
+ beforeEach(() => {
101
+ Registry.setBundledDependencies({
102
+ node: "/bundled/node",
103
+ python: "/bundled/python3",
104
+ git: "/bundled/git",
105
+ npx: "/bundled/npx",
106
+ uvx: "/bundled/uvx",
107
+ });
108
+ });
109
+ it("should retrieve individual dependency paths", () => {
110
+ assert.strictEqual(Registry.getBundledDependencyPath("node"), "/bundled/node");
111
+ assert.strictEqual(Registry.getBundledDependencyPath("python"), "/bundled/python3");
112
+ assert.strictEqual(Registry.getBundledDependencyPath("git"), "/bundled/git");
113
+ assert.strictEqual(Registry.getBundledDependencyPath("npx"), "/bundled/npx");
114
+ assert.strictEqual(Registry.getBundledDependencyPath("uvx"), "/bundled/uvx");
115
+ });
116
+ it("should return undefined for unset dependencies", () => {
117
+ Registry.setBundledDependencies({
118
+ node: "/bundled/node",
119
+ });
120
+ assert.strictEqual(Registry.getBundledDependencyPath("python"), undefined);
121
+ assert.strictEqual(Registry.getBundledDependencyPath("git"), undefined);
122
+ });
123
+ it("should return undefined when no dependencies set", () => {
124
+ Registry.setBundledDependencies({});
125
+ assert.strictEqual(Registry.getBundledDependencyPath("node"), undefined);
126
+ });
127
+ });
128
+ describe("reset", () => {
129
+ it("should clear bundled dependencies", () => {
130
+ Registry.setBundledDependencies({
131
+ node: "/bundled/node",
132
+ python: "/bundled/python3",
133
+ });
134
+ Registry.reset();
135
+ const deps = Registry.getBundledDependencies();
136
+ assert.deepStrictEqual(deps, {});
137
+ });
138
+ it("should allow setting new dependencies after reset", () => {
139
+ // Set initial
140
+ Registry.setBundledDependencies({
141
+ node: "/bundled/node",
142
+ });
143
+ // Reset
144
+ Registry.reset();
145
+ // Set new
146
+ Registry.setBundledDependencies({
147
+ python: "/new/python",
148
+ });
149
+ const deps = Registry.getBundledDependencies();
150
+ assert.strictEqual(deps.node, undefined);
151
+ assert.strictEqual(deps.python, "/new/python");
152
+ });
153
+ });
154
+ describe("Edge Cases", () => {
155
+ it("should handle undefined values in dependencies", () => {
156
+ const deps = {
157
+ node: "/bundled/node",
158
+ python: undefined,
159
+ };
160
+ Registry.setBundledDependencies(deps);
161
+ assert.strictEqual(Registry.getBundledDependencyPath("node"), "/bundled/node");
162
+ assert.strictEqual(Registry.getBundledDependencyPath("python"), undefined);
163
+ });
164
+ it("should handle empty string paths", () => {
165
+ const deps = {
166
+ node: "",
167
+ };
168
+ Registry.setBundledDependencies(deps);
169
+ assert.strictEqual(Registry.getBundledDependencyPath("node"), "");
170
+ });
171
+ it("should handle Windows-style paths", () => {
172
+ const deps = {
173
+ node: "C:\\Program Files\\Node\\node.exe",
174
+ python: "C:\\Python39\\python.exe",
175
+ };
176
+ Registry.setBundledDependencies(deps);
177
+ assert.strictEqual(Registry.getBundledDependencyPath("node"), "C:\\Program Files\\Node\\node.exe");
178
+ assert.strictEqual(Registry.getBundledDependencyPath("python"), "C:\\Python39\\python.exe");
179
+ });
180
+ it("should handle Unix-style paths", () => {
181
+ const deps = {
182
+ node: "/usr/local/bin/node",
183
+ python: "/usr/bin/python3",
184
+ };
185
+ Registry.setBundledDependencies(deps);
186
+ assert.strictEqual(Registry.getBundledDependencyPath("node"), "/usr/local/bin/node");
187
+ assert.strictEqual(Registry.getBundledDependencyPath("python"), "/usr/bin/python3");
188
+ });
189
+ });
190
+ describe("Integration with other Registry methods", () => {
191
+ it("should persist bundled deps through reset", () => {
192
+ Registry.setBundledDependencies({
193
+ node: "/bundled/node",
194
+ });
195
+ // Reset should clear bundled deps
196
+ Registry.reset();
197
+ const deps = Registry.getBundledDependencies();
198
+ assert.deepStrictEqual(deps, {});
199
+ });
200
+ it("should not affect bundled deps when accessing other Registry methods", () => {
201
+ Registry.setBundledDependencies({
202
+ node: "/bundled/node",
203
+ });
204
+ // Access other methods (these would throw if Registry not initialized, but shouldn't affect bundled deps)
205
+ try {
206
+ Registry.getClientContext();
207
+ }
208
+ catch (e) {
209
+ // Expected to throw since Registry not fully initialized
210
+ }
211
+ // Bundled deps should still be accessible
212
+ const deps = Registry.getBundledDependencies();
213
+ assert.strictEqual(deps.node, "/bundled/node");
214
+ });
215
+ });
216
+ });
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "0.1.18";
1
+ export declare const version = "0.1.19";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const version = '0.1.18';
1
+ export const version = '0.1.19';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toolplex/client",
3
- "version": "0.1.18",
3
+ "version": "0.1.19",
4
4
  "author": "ToolPlex LLC",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "description": "The official ToolPlex client for AI agent tool discovery and execution",
@@ -16,12 +16,17 @@
16
16
  "access": "public"
17
17
  },
18
18
  "scripts": {
19
- "build": "node scripts/generate-version-file.js && rm -rf dist && tsc && node scripts/add-shebang.js",
19
+ "build": "node scripts/generate-version-file.js && rm -rf dist && tsc && tsc -p tsconfig.test.json && node scripts/add-shebang.js",
20
20
  "start": "node ./dist/mcp-server/index.js",
21
21
  "watch": "tsc --watch",
22
22
  "lint": "eslint 'src/**/*.{ts,js}'",
23
23
  "lint:fix": "eslint 'src/**/*.{ts,js}' --fix",
24
- "format": "prettier --write 'src/**/*.{ts,js,json,md}'"
24
+ "format": "prettier --write 'src/**/*.{ts,js,json,md}'",
25
+ "test": "npm run build && node --test dist/tests/unit/**/*.test.js",
26
+ "test:full": "npm run build && node --test dist/tests/**/*.test.js",
27
+ "test:unit": "npm run build && node --test dist/tests/unit/**/*.test.js",
28
+ "test:watch": "npm run build && node --test --watch dist/tests/**/*.test.js",
29
+ "test:coverage": "npm run build && node --experimental-test-coverage --test dist/tests/**/*.test.js"
25
30
  },
26
31
  "keywords": [
27
32
  "mcp",