@enactprotocol/shared 1.2.13 → 2.0.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 (207) hide show
  1. package/README.md +44 -0
  2. package/dist/config.d.ts +164 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +386 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/constants.d.ts +15 -5
  7. package/dist/constants.d.ts.map +1 -0
  8. package/dist/constants.js +24 -8
  9. package/dist/constants.js.map +1 -0
  10. package/dist/execution/command.d.ts +102 -0
  11. package/dist/execution/command.d.ts.map +1 -0
  12. package/dist/execution/command.js +262 -0
  13. package/dist/execution/command.js.map +1 -0
  14. package/dist/execution/index.d.ts +12 -0
  15. package/dist/execution/index.d.ts.map +1 -0
  16. package/dist/execution/index.js +17 -0
  17. package/dist/execution/index.js.map +1 -0
  18. package/dist/execution/runtime.d.ts +82 -0
  19. package/dist/execution/runtime.d.ts.map +1 -0
  20. package/dist/execution/runtime.js +273 -0
  21. package/dist/execution/runtime.js.map +1 -0
  22. package/dist/execution/types.d.ts +306 -0
  23. package/dist/execution/types.d.ts.map +1 -0
  24. package/dist/execution/types.js +14 -0
  25. package/dist/execution/types.js.map +1 -0
  26. package/dist/execution/validation.d.ts +43 -0
  27. package/dist/execution/validation.d.ts.map +1 -0
  28. package/dist/execution/validation.js +430 -0
  29. package/dist/execution/validation.js.map +1 -0
  30. package/dist/index.d.ts +21 -21
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +49 -25
  33. package/dist/index.js.map +1 -0
  34. package/dist/manifest/index.d.ts +7 -0
  35. package/dist/manifest/index.d.ts.map +1 -0
  36. package/dist/manifest/index.js +10 -0
  37. package/dist/manifest/index.js.map +1 -0
  38. package/dist/manifest/loader.d.ts +76 -0
  39. package/dist/manifest/loader.d.ts.map +1 -0
  40. package/dist/manifest/loader.js +146 -0
  41. package/dist/manifest/loader.js.map +1 -0
  42. package/dist/manifest/parser.d.ts +64 -0
  43. package/dist/manifest/parser.d.ts.map +1 -0
  44. package/dist/manifest/parser.js +135 -0
  45. package/dist/manifest/parser.js.map +1 -0
  46. package/dist/manifest/validator.d.ts +95 -0
  47. package/dist/manifest/validator.d.ts.map +1 -0
  48. package/dist/manifest/validator.js +258 -0
  49. package/dist/manifest/validator.js.map +1 -0
  50. package/dist/paths.d.ts +57 -0
  51. package/dist/paths.d.ts.map +1 -0
  52. package/dist/paths.js +93 -0
  53. package/dist/paths.js.map +1 -0
  54. package/dist/registry.d.ts +73 -0
  55. package/dist/registry.d.ts.map +1 -0
  56. package/dist/registry.js +147 -0
  57. package/dist/registry.js.map +1 -0
  58. package/dist/resolver.d.ts +89 -0
  59. package/dist/resolver.d.ts.map +1 -0
  60. package/dist/resolver.js +282 -0
  61. package/dist/resolver.js.map +1 -0
  62. package/dist/types/index.d.ts +6 -0
  63. package/dist/types/index.d.ts.map +1 -0
  64. package/dist/types/index.js +5 -0
  65. package/dist/types/index.js.map +1 -0
  66. package/dist/types/manifest.d.ts +201 -0
  67. package/dist/types/manifest.d.ts.map +1 -0
  68. package/dist/types/manifest.js +13 -0
  69. package/dist/types/manifest.js.map +1 -0
  70. package/dist/types.d.ts +5 -132
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +5 -3
  73. package/dist/types.js.map +1 -0
  74. package/dist/utils/fs.d.ts +105 -0
  75. package/dist/utils/fs.d.ts.map +1 -0
  76. package/dist/utils/fs.js +233 -0
  77. package/dist/utils/fs.js.map +1 -0
  78. package/dist/utils/logger.d.ts +102 -25
  79. package/dist/utils/logger.d.ts.map +1 -0
  80. package/dist/utils/logger.js +214 -57
  81. package/dist/utils/logger.js.map +1 -0
  82. package/dist/utils/version.d.ts +60 -2
  83. package/dist/utils/version.d.ts.map +1 -0
  84. package/dist/utils/version.js +255 -31
  85. package/dist/utils/version.js.map +1 -0
  86. package/package.json +16 -58
  87. package/src/config.ts +510 -0
  88. package/src/constants.ts +36 -0
  89. package/src/execution/command.ts +314 -0
  90. package/src/execution/index.ts +73 -0
  91. package/src/execution/runtime.ts +308 -0
  92. package/src/execution/types.ts +379 -0
  93. package/src/execution/validation.ts +508 -0
  94. package/src/index.ts +238 -30
  95. package/src/manifest/index.ts +36 -0
  96. package/src/manifest/loader.ts +187 -0
  97. package/src/manifest/parser.ts +173 -0
  98. package/src/manifest/validator.ts +309 -0
  99. package/src/paths.ts +108 -0
  100. package/src/registry.ts +219 -0
  101. package/src/resolver.ts +345 -0
  102. package/src/types/index.ts +30 -0
  103. package/src/types/manifest.ts +255 -0
  104. package/src/types.ts +5 -188
  105. package/src/utils/fs.ts +281 -0
  106. package/src/utils/logger.ts +270 -59
  107. package/src/utils/version.ts +304 -36
  108. package/tests/config.test.ts +515 -0
  109. package/tests/execution/command.test.ts +317 -0
  110. package/tests/execution/validation.test.ts +384 -0
  111. package/tests/fixtures/invalid-tool.yaml +4 -0
  112. package/tests/fixtures/valid-tool.md +62 -0
  113. package/tests/fixtures/valid-tool.yaml +40 -0
  114. package/tests/index.test.ts +8 -0
  115. package/tests/manifest/loader.test.ts +291 -0
  116. package/tests/manifest/parser.test.ts +345 -0
  117. package/tests/manifest/validator.test.ts +394 -0
  118. package/tests/manifest-types.test.ts +358 -0
  119. package/tests/paths.test.ts +153 -0
  120. package/tests/registry.test.ts +231 -0
  121. package/tests/resolver.test.ts +272 -0
  122. package/tests/utils/fs.test.ts +388 -0
  123. package/tests/utils/logger.test.ts +480 -0
  124. package/tests/utils/version.test.ts +390 -0
  125. package/tsconfig.json +12 -0
  126. package/dist/LocalToolResolver.d.ts +0 -84
  127. package/dist/LocalToolResolver.js +0 -353
  128. package/dist/api/enact-api.d.ts +0 -130
  129. package/dist/api/enact-api.js +0 -428
  130. package/dist/api/index.d.ts +0 -2
  131. package/dist/api/index.js +0 -2
  132. package/dist/api/types.d.ts +0 -103
  133. package/dist/api/types.js +0 -1
  134. package/dist/core/DaggerExecutionProvider.d.ts +0 -169
  135. package/dist/core/DaggerExecutionProvider.js +0 -1029
  136. package/dist/core/DirectExecutionProvider.d.ts +0 -23
  137. package/dist/core/DirectExecutionProvider.js +0 -406
  138. package/dist/core/EnactCore.d.ts +0 -162
  139. package/dist/core/EnactCore.js +0 -597
  140. package/dist/core/NativeExecutionProvider.d.ts +0 -9
  141. package/dist/core/NativeExecutionProvider.js +0 -16
  142. package/dist/core/index.d.ts +0 -3
  143. package/dist/core/index.js +0 -3
  144. package/dist/exec/index.d.ts +0 -3
  145. package/dist/exec/index.js +0 -3
  146. package/dist/exec/logger.d.ts +0 -11
  147. package/dist/exec/logger.js +0 -57
  148. package/dist/exec/validate.d.ts +0 -5
  149. package/dist/exec/validate.js +0 -167
  150. package/dist/lib/enact-direct.d.ts +0 -150
  151. package/dist/lib/enact-direct.js +0 -159
  152. package/dist/lib/index.d.ts +0 -1
  153. package/dist/lib/index.js +0 -1
  154. package/dist/security/index.d.ts +0 -3
  155. package/dist/security/index.js +0 -3
  156. package/dist/security/security.d.ts +0 -23
  157. package/dist/security/security.js +0 -137
  158. package/dist/security/sign.d.ts +0 -103
  159. package/dist/security/sign.js +0 -666
  160. package/dist/security/verification-enforcer.d.ts +0 -53
  161. package/dist/security/verification-enforcer.js +0 -204
  162. package/dist/services/McpCoreService.d.ts +0 -98
  163. package/dist/services/McpCoreService.js +0 -124
  164. package/dist/services/index.d.ts +0 -1
  165. package/dist/services/index.js +0 -1
  166. package/dist/utils/config.d.ts +0 -111
  167. package/dist/utils/config.js +0 -342
  168. package/dist/utils/env-loader.d.ts +0 -54
  169. package/dist/utils/env-loader.js +0 -270
  170. package/dist/utils/help.d.ts +0 -36
  171. package/dist/utils/help.js +0 -248
  172. package/dist/utils/index.d.ts +0 -7
  173. package/dist/utils/index.js +0 -7
  174. package/dist/utils/silent-monitor.d.ts +0 -67
  175. package/dist/utils/silent-monitor.js +0 -242
  176. package/dist/utils/timeout.d.ts +0 -5
  177. package/dist/utils/timeout.js +0 -23
  178. package/dist/web/env-manager-server.d.ts +0 -29
  179. package/dist/web/env-manager-server.js +0 -367
  180. package/dist/web/index.d.ts +0 -1
  181. package/dist/web/index.js +0 -1
  182. package/src/LocalToolResolver.ts +0 -424
  183. package/src/api/enact-api.ts +0 -604
  184. package/src/api/index.ts +0 -2
  185. package/src/api/types.ts +0 -114
  186. package/src/core/DaggerExecutionProvider.ts +0 -1357
  187. package/src/core/DirectExecutionProvider.ts +0 -484
  188. package/src/core/EnactCore.ts +0 -847
  189. package/src/core/index.ts +0 -3
  190. package/src/exec/index.ts +0 -3
  191. package/src/exec/logger.ts +0 -63
  192. package/src/exec/validate.ts +0 -238
  193. package/src/lib/enact-direct.ts +0 -254
  194. package/src/lib/index.ts +0 -1
  195. package/src/services/McpCoreService.ts +0 -201
  196. package/src/services/index.ts +0 -1
  197. package/src/utils/config.ts +0 -438
  198. package/src/utils/env-loader.ts +0 -370
  199. package/src/utils/help.ts +0 -257
  200. package/src/utils/index.ts +0 -7
  201. package/src/utils/silent-monitor.ts +0 -328
  202. package/src/utils/timeout.ts +0 -26
  203. package/src/web/env-manager-server.ts +0 -465
  204. package/src/web/index.ts +0 -1
  205. package/src/web/static/app.js +0 -663
  206. package/src/web/static/index.html +0 -117
  207. package/src/web/static/style.css +0 -291
@@ -1,424 +0,0 @@
1
- import { EnactCore } from "./core/EnactCore";
2
- import { promises as fs, readFileSync, writeFileSync, existsSync } from "fs";
3
- import { join, resolve, basename } from "path";
4
- import * as yaml from "yaml";
5
- import logger from "./exec/logger";
6
-
7
- export interface LocalTool {
8
- name: string;
9
- path: string;
10
- definition: any;
11
- lastModified: Date;
12
- cached: boolean;
13
- }
14
-
15
- export interface ToolResolutionResult {
16
- tool: LocalTool | any;
17
- source: "local" | "registry" | "cache";
18
- metadata?: any;
19
- }
20
-
21
- export class LocalToolResolver {
22
- private localToolsDir: string;
23
- private cacheDir: string;
24
- private toolCache = new Map<string, LocalTool>();
25
- private aliases = new Map<string, string>();
26
- private favorites = new Set<string>();
27
-
28
- constructor(
29
- private enactCore: EnactCore,
30
- localToolsDir: string = "./tools",
31
- cacheDir: string = "./.tool-cache",
32
- ) {
33
- this.localToolsDir = resolve(localToolsDir);
34
- this.cacheDir = resolve(cacheDir);
35
- this.loadConfiguration();
36
- }
37
-
38
- /**
39
- * Main resolution method - checks local first, then registry
40
- */
41
- async resolveTool(toolName: string): Promise<ToolResolutionResult | null> {
42
- // Check aliases first
43
- const resolvedName = this.aliases.get(toolName) || toolName;
44
-
45
- // 1. Check local directory first
46
- const localTool = await this.getLocalTool(resolvedName);
47
- if (localTool) {
48
- return {
49
- tool: localTool,
50
- source: "local",
51
- metadata: { path: localTool.path },
52
- };
53
- }
54
-
55
- // 2. Check cache for registry tools
56
- const cachedTool = this.toolCache.get(resolvedName);
57
- if (cachedTool && !this.isCacheExpired(cachedTool)) {
58
- return {
59
- tool: cachedTool,
60
- source: "cache",
61
- metadata: { cachedAt: cachedTool.lastModified },
62
- };
63
- }
64
-
65
- // 3. Fall back to registry
66
- try {
67
- const registryTool = await this.enactCore.getToolByName(resolvedName);
68
- if (registryTool) {
69
- // Cache the registry tool locally
70
- await this.cacheRegistryTool(resolvedName, registryTool);
71
-
72
- return {
73
- tool: registryTool,
74
- source: "registry",
75
- metadata: { cached: true },
76
- };
77
- }
78
- } catch (error) {
79
- logger.debug(`Registry lookup failed for ${resolvedName}:`, error);
80
- }
81
-
82
- return null;
83
- }
84
-
85
- /**
86
- * Get tool from local directory
87
- */
88
- private async getLocalTool(toolName: string): Promise<LocalTool | null> {
89
- const possiblePaths = [
90
- join(this.localToolsDir, `${toolName}.yaml`),
91
- join(this.localToolsDir, `${toolName}.yml`),
92
- join(this.localToolsDir, toolName, "tool.yaml"),
93
- join(this.localToolsDir, toolName, "tool.yml"),
94
- join(this.localToolsDir, toolName, `${toolName}.yaml`),
95
- join(this.localToolsDir, toolName, `${toolName}.yml`),
96
- ];
97
-
98
- for (const toolPath of possiblePaths) {
99
- try {
100
- const stats = await fs.stat(toolPath);
101
- const content = await fs.readFile(toolPath, "utf-8");
102
- const definition = yaml.parse(content);
103
-
104
- if (
105
- definition &&
106
- (definition.name === toolName || definition.name === undefined)
107
- ) {
108
- return {
109
- name: definition.name || toolName,
110
- path: toolPath,
111
- definition,
112
- lastModified: stats.mtime,
113
- cached: false,
114
- };
115
- }
116
- } catch (error) {
117
- // File doesn't exist or can't be read, continue to next path
118
- continue;
119
- }
120
- }
121
-
122
- return null;
123
- }
124
-
125
- /**
126
- * Cache a registry tool locally for faster access
127
- */
128
- private async cacheRegistryTool(toolName: string, tool: any): Promise<void> {
129
- try {
130
- await fs.mkdir(this.cacheDir, { recursive: true });
131
-
132
- const cachePath = join(this.cacheDir, `${toolName}.yaml`);
133
- const cacheData = {
134
- ...tool,
135
- _cached: true,
136
- _cachedAt: new Date().toISOString(),
137
- _source: "registry",
138
- };
139
-
140
- await fs.writeFile(cachePath, yaml.stringify(cacheData));
141
-
142
- this.toolCache.set(toolName, {
143
- name: toolName,
144
- path: cachePath,
145
- definition: tool,
146
- lastModified: new Date(),
147
- cached: true,
148
- });
149
-
150
- logger.debug(`Cached registry tool: ${toolName}`);
151
- } catch (error) {
152
- logger.warn(`Failed to cache tool ${toolName}:`, error);
153
- }
154
- }
155
-
156
- /**
157
- * Check if cached tool is expired (24 hours by default)
158
- */
159
- private isCacheExpired(
160
- tool: LocalTool,
161
- maxAge: number = 24 * 60 * 60 * 1000,
162
- ): boolean {
163
- return Date.now() - tool.lastModified.getTime() > maxAge;
164
- }
165
-
166
- /**
167
- * List all available tools from all sources
168
- */
169
- async listAllTools(): Promise<{
170
- local: LocalTool[];
171
- cached: LocalTool[];
172
- favorites: string[];
173
- aliases: Record<string, string>;
174
- }> {
175
- const localTools = await this.scanLocalTools();
176
- const cachedTools = Array.from(this.toolCache.values());
177
-
178
- return {
179
- local: localTools,
180
- cached: cachedTools,
181
- favorites: Array.from(this.favorites),
182
- aliases: Object.fromEntries(this.aliases),
183
- };
184
- }
185
-
186
- /**
187
- * Scan local tools directory
188
- */
189
- private async scanLocalTools(): Promise<LocalTool[]> {
190
- const tools: LocalTool[] = [];
191
-
192
- try {
193
- await fs.mkdir(this.localToolsDir, { recursive: true });
194
- const entries = await this.scanDirectory(this.localToolsDir);
195
-
196
- for (const entry of entries) {
197
- if (entry.endsWith(".yaml") || entry.endsWith(".yml")) {
198
- try {
199
- const content = await fs.readFile(entry, "utf-8");
200
- const definition = yaml.parse(content);
201
-
202
- if (definition && (definition.name || definition.command)) {
203
- const stats = await fs.stat(entry);
204
- tools.push({
205
- name:
206
- definition.name ||
207
- basename(entry, ".yaml").replace(".yml", ""),
208
- path: entry,
209
- definition,
210
- lastModified: stats.mtime,
211
- cached: false,
212
- });
213
- }
214
- } catch (error) {
215
- logger.debug(`Skipping invalid tool file ${entry}:`, error);
216
- }
217
- }
218
- }
219
- } catch (error) {
220
- logger.warn(`Failed to scan local tools directory:`, error);
221
- }
222
-
223
- return tools;
224
- }
225
-
226
- /**
227
- * Recursively scan directory for tool files
228
- */
229
- private async scanDirectory(dir: string): Promise<string[]> {
230
- const files: string[] = [];
231
-
232
- try {
233
- const entries = await fs.readdir(dir, { withFileTypes: true });
234
-
235
- for (const entry of entries) {
236
- const fullPath = join(dir, entry.name);
237
-
238
- if (entry.isDirectory()) {
239
- const subFiles = await this.scanDirectory(fullPath);
240
- files.push(...subFiles);
241
- } else if (entry.isFile()) {
242
- files.push(fullPath);
243
- }
244
- }
245
- } catch (error) {
246
- logger.debug(`Cannot scan directory ${dir}:`, error);
247
- }
248
-
249
- return files;
250
- }
251
-
252
- /**
253
- * Add a tool to favorites for priority resolution
254
- */
255
- addToFavorites(toolName: string): void {
256
- this.favorites.add(toolName);
257
- this.saveConfiguration();
258
- }
259
-
260
- /**
261
- * Add an alias for a tool
262
- */
263
- addAlias(alias: string, toolName: string): void {
264
- this.aliases.set(alias, toolName);
265
- this.saveConfiguration();
266
- }
267
-
268
- /**
269
- * Get suggestions based on partial tool name
270
- */
271
- async getSuggestions(partial: string): Promise<string[]> {
272
- const allTools = await this.listAllTools();
273
- const suggestions = new Set<string>();
274
-
275
- // Add local tools
276
- allTools.local.forEach((tool) => {
277
- if (tool.name.includes(partial)) {
278
- suggestions.add(tool.name);
279
- }
280
- });
281
-
282
- // Add favorites first
283
- this.favorites.forEach((fav) => {
284
- if (fav.includes(partial)) {
285
- suggestions.add(fav);
286
- }
287
- });
288
-
289
- // Add aliases
290
- this.aliases.forEach((toolName, alias) => {
291
- if (alias.includes(partial) || toolName.includes(partial)) {
292
- suggestions.add(alias);
293
- }
294
- });
295
-
296
- return Array.from(suggestions).slice(0, 10); // Limit suggestions
297
- }
298
-
299
- /**
300
- * Clear expired cache entries
301
- */
302
- async cleanupCache(): Promise<number> {
303
- let cleaned = 0;
304
-
305
- for (const [toolName, tool] of this.toolCache.entries()) {
306
- if (this.isCacheExpired(tool)) {
307
- try {
308
- await fs.unlink(tool.path);
309
- this.toolCache.delete(toolName);
310
- cleaned++;
311
- } catch (error) {
312
- logger.debug(`Failed to clean cache for ${toolName}:`, error);
313
- }
314
- }
315
- }
316
-
317
- logger.info(`Cleaned ${cleaned} expired cache entries`);
318
- return cleaned;
319
- }
320
-
321
- /**
322
- * Load configuration from file
323
- */
324
- private loadConfiguration(): void {
325
- try {
326
- const configPath = join(this.localToolsDir, "config.json");
327
- const config = JSON.parse(readFileSync(configPath, "utf-8"));
328
-
329
- if (config.aliases) {
330
- this.aliases = new Map(Object.entries(config.aliases));
331
- }
332
-
333
- if (config.favorites) {
334
- this.favorites = new Set(config.favorites);
335
- }
336
- } catch (error) {
337
- // Config file doesn't exist or is invalid, use defaults
338
- logger.debug("No tool configuration found, using defaults");
339
- }
340
- }
341
-
342
- /**
343
- * Save configuration to file
344
- */
345
- private saveConfiguration(): void {
346
- try {
347
- const configPath = join(this.localToolsDir, "config.json");
348
- const config = {
349
- aliases: Object.fromEntries(this.aliases),
350
- favorites: Array.from(this.favorites),
351
- lastUpdated: new Date().toISOString(),
352
- };
353
-
354
- writeFileSync(configPath, JSON.stringify(config, null, 2));
355
- } catch (error) {
356
- logger.warn("Failed to save tool configuration:", error);
357
- }
358
- }
359
-
360
- /**
361
- * Initialize local tools directory with examples
362
- */
363
- async initialize(): Promise<void> {
364
- await fs.mkdir(this.localToolsDir, { recursive: true });
365
- await fs.mkdir(this.cacheDir, { recursive: true });
366
-
367
- // Create a sample local tool if directory is empty
368
- const tools = await this.scanLocalTools();
369
- if (tools.length === 0) {
370
- const sampleTool = {
371
- name: "hello-world",
372
- description: "A simple hello world tool",
373
- version: "1.0.0",
374
- command: 'echo "Hello, World!"',
375
- inputSchema: {
376
- properties: {
377
- message: {
378
- type: "string",
379
- description: "Custom message to display",
380
- },
381
- },
382
- },
383
- };
384
-
385
- const samplePath = join(this.localToolsDir, "hello-world.yaml");
386
- await fs.writeFile(samplePath, yaml.stringify(sampleTool));
387
- logger.info(`Created sample tool at ${samplePath}`);
388
- }
389
-
390
- // Create README
391
- const readmePath = join(this.localToolsDir, "README.md");
392
- const readme = `# Local Tools Directory
393
-
394
- This directory contains your local Enact tools. Tools can be organized as:
395
-
396
- ## File Structure
397
- - \`tool-name.yaml\` - Single tool file
398
- - \`tool-name/tool.yaml\` - Tool in subdirectory
399
- - \`tool-name/tool-name.yaml\` - Named tool in subdirectory
400
-
401
- ## Configuration
402
- - \`config.json\` - Aliases and favorites configuration
403
-
404
- ## Cache
405
- Registry tools are cached in \`.tool-cache/\` for faster access.
406
-
407
- ## Priority Order
408
- 1. Favorites (if name matches)
409
- 2. Local tools
410
- 3. Cached registry tools
411
- 4. Registry lookup
412
-
413
- Use the MCP tools to manage this directory programmatically.
414
- `;
415
-
416
- try {
417
- await fs.access(readmePath);
418
- } catch {
419
- await fs.writeFile(readmePath, readme);
420
- }
421
- }
422
- }
423
-
424
- export default LocalToolResolver;