@enactprotocol/shared 1.2.13 → 2.0.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 (134) hide show
  1. package/README.md +44 -0
  2. package/package.json +16 -58
  3. package/src/config.ts +476 -0
  4. package/src/constants.ts +36 -0
  5. package/src/execution/command.ts +314 -0
  6. package/src/execution/index.ts +73 -0
  7. package/src/execution/runtime.ts +308 -0
  8. package/src/execution/types.ts +379 -0
  9. package/src/execution/validation.ts +508 -0
  10. package/src/index.ts +237 -30
  11. package/src/manifest/index.ts +36 -0
  12. package/src/manifest/loader.ts +187 -0
  13. package/src/manifest/parser.ts +173 -0
  14. package/src/manifest/validator.ts +309 -0
  15. package/src/paths.ts +108 -0
  16. package/src/registry.ts +219 -0
  17. package/src/resolver.ts +345 -0
  18. package/src/types/index.ts +30 -0
  19. package/src/types/manifest.ts +255 -0
  20. package/src/types.ts +5 -188
  21. package/src/utils/fs.ts +281 -0
  22. package/src/utils/logger.ts +270 -59
  23. package/src/utils/version.ts +304 -36
  24. package/tests/config.test.ts +515 -0
  25. package/tests/execution/command.test.ts +317 -0
  26. package/tests/execution/validation.test.ts +384 -0
  27. package/tests/fixtures/invalid-tool.yaml +4 -0
  28. package/tests/fixtures/valid-tool.md +62 -0
  29. package/tests/fixtures/valid-tool.yaml +40 -0
  30. package/tests/index.test.ts +8 -0
  31. package/tests/manifest/loader.test.ts +291 -0
  32. package/tests/manifest/parser.test.ts +345 -0
  33. package/tests/manifest/validator.test.ts +394 -0
  34. package/tests/manifest-types.test.ts +358 -0
  35. package/tests/paths.test.ts +153 -0
  36. package/tests/registry.test.ts +231 -0
  37. package/tests/resolver.test.ts +272 -0
  38. package/tests/utils/fs.test.ts +388 -0
  39. package/tests/utils/logger.test.ts +480 -0
  40. package/tests/utils/version.test.ts +390 -0
  41. package/tsconfig.json +12 -0
  42. package/tsconfig.tsbuildinfo +1 -0
  43. package/dist/LocalToolResolver.d.ts +0 -84
  44. package/dist/LocalToolResolver.js +0 -353
  45. package/dist/api/enact-api.d.ts +0 -130
  46. package/dist/api/enact-api.js +0 -428
  47. package/dist/api/index.d.ts +0 -2
  48. package/dist/api/index.js +0 -2
  49. package/dist/api/types.d.ts +0 -103
  50. package/dist/api/types.js +0 -1
  51. package/dist/constants.d.ts +0 -7
  52. package/dist/constants.js +0 -10
  53. package/dist/core/DaggerExecutionProvider.d.ts +0 -169
  54. package/dist/core/DaggerExecutionProvider.js +0 -1029
  55. package/dist/core/DirectExecutionProvider.d.ts +0 -23
  56. package/dist/core/DirectExecutionProvider.js +0 -406
  57. package/dist/core/EnactCore.d.ts +0 -162
  58. package/dist/core/EnactCore.js +0 -597
  59. package/dist/core/NativeExecutionProvider.d.ts +0 -9
  60. package/dist/core/NativeExecutionProvider.js +0 -16
  61. package/dist/core/index.d.ts +0 -3
  62. package/dist/core/index.js +0 -3
  63. package/dist/exec/index.d.ts +0 -3
  64. package/dist/exec/index.js +0 -3
  65. package/dist/exec/logger.d.ts +0 -11
  66. package/dist/exec/logger.js +0 -57
  67. package/dist/exec/validate.d.ts +0 -5
  68. package/dist/exec/validate.js +0 -167
  69. package/dist/index.d.ts +0 -21
  70. package/dist/index.js +0 -25
  71. package/dist/lib/enact-direct.d.ts +0 -150
  72. package/dist/lib/enact-direct.js +0 -159
  73. package/dist/lib/index.d.ts +0 -1
  74. package/dist/lib/index.js +0 -1
  75. package/dist/security/index.d.ts +0 -3
  76. package/dist/security/index.js +0 -3
  77. package/dist/security/security.d.ts +0 -23
  78. package/dist/security/security.js +0 -137
  79. package/dist/security/sign.d.ts +0 -103
  80. package/dist/security/sign.js +0 -666
  81. package/dist/security/verification-enforcer.d.ts +0 -53
  82. package/dist/security/verification-enforcer.js +0 -204
  83. package/dist/services/McpCoreService.d.ts +0 -98
  84. package/dist/services/McpCoreService.js +0 -124
  85. package/dist/services/index.d.ts +0 -1
  86. package/dist/services/index.js +0 -1
  87. package/dist/types.d.ts +0 -132
  88. package/dist/types.js +0 -3
  89. package/dist/utils/config.d.ts +0 -111
  90. package/dist/utils/config.js +0 -342
  91. package/dist/utils/env-loader.d.ts +0 -54
  92. package/dist/utils/env-loader.js +0 -270
  93. package/dist/utils/help.d.ts +0 -36
  94. package/dist/utils/help.js +0 -248
  95. package/dist/utils/index.d.ts +0 -7
  96. package/dist/utils/index.js +0 -7
  97. package/dist/utils/logger.d.ts +0 -35
  98. package/dist/utils/logger.js +0 -75
  99. package/dist/utils/silent-monitor.d.ts +0 -67
  100. package/dist/utils/silent-monitor.js +0 -242
  101. package/dist/utils/timeout.d.ts +0 -5
  102. package/dist/utils/timeout.js +0 -23
  103. package/dist/utils/version.d.ts +0 -4
  104. package/dist/utils/version.js +0 -35
  105. package/dist/web/env-manager-server.d.ts +0 -29
  106. package/dist/web/env-manager-server.js +0 -367
  107. package/dist/web/index.d.ts +0 -1
  108. package/dist/web/index.js +0 -1
  109. package/src/LocalToolResolver.ts +0 -424
  110. package/src/api/enact-api.ts +0 -604
  111. package/src/api/index.ts +0 -2
  112. package/src/api/types.ts +0 -114
  113. package/src/core/DaggerExecutionProvider.ts +0 -1357
  114. package/src/core/DirectExecutionProvider.ts +0 -484
  115. package/src/core/EnactCore.ts +0 -847
  116. package/src/core/index.ts +0 -3
  117. package/src/exec/index.ts +0 -3
  118. package/src/exec/logger.ts +0 -63
  119. package/src/exec/validate.ts +0 -238
  120. package/src/lib/enact-direct.ts +0 -254
  121. package/src/lib/index.ts +0 -1
  122. package/src/services/McpCoreService.ts +0 -201
  123. package/src/services/index.ts +0 -1
  124. package/src/utils/config.ts +0 -438
  125. package/src/utils/env-loader.ts +0 -370
  126. package/src/utils/help.ts +0 -257
  127. package/src/utils/index.ts +0 -7
  128. package/src/utils/silent-monitor.ts +0 -328
  129. package/src/utils/timeout.ts +0 -26
  130. package/src/web/env-manager-server.ts +0 -465
  131. package/src/web/index.ts +0 -1
  132. package/src/web/static/app.js +0 -663
  133. package/src/web/static/index.html +0 -117
  134. package/src/web/static/style.css +0 -291
@@ -1,597 +0,0 @@
1
- import { EnactApiClient } from "../api/enact-api.js";
2
- import { validateToolStructure, validateInputs, } from "../exec/validate.js";
3
- import { DirectExecutionProvider } from "./DirectExecutionProvider.js";
4
- import { DaggerExecutionProvider } from "./DaggerExecutionProvider.js";
5
- import { resolveToolEnvironmentVariables } from "../utils/env-loader.js";
6
- import logger from "../exec/logger.js";
7
- import yaml from "yaml";
8
- import { SecurityConfigManager, SigningService } from "@enactprotocol/security";
9
- import { getFrontendUrl, getApiUrl } from "../utils/config";
10
- export class EnactCore {
11
- constructor(options = {}) {
12
- this.options = {
13
- apiUrl: "https://enact.tools", // Default, will be overridden by factory
14
- supabaseUrl: "https://xjnhhxwxovjifdxdwzih.supabase.co", // Default, will be overridden by factory
15
- executionProvider: "dagger",
16
- defaultTimeout: "30s",
17
- ...options,
18
- };
19
- this.apiClient = new EnactApiClient(this.options.apiUrl, this.options.supabaseUrl);
20
- // Initialize the appropriate execution provider
21
- this.executionProvider = this.createExecutionProvider();
22
- }
23
- /**
24
- * Create EnactCore with config-based URLs
25
- */
26
- static async create(options = {}) {
27
- const frontendUrl = options.apiUrl || await getFrontendUrl();
28
- const apiUrl = options.supabaseUrl || await getApiUrl();
29
- return new EnactCore({
30
- ...options,
31
- apiUrl: frontendUrl,
32
- supabaseUrl: apiUrl,
33
- });
34
- }
35
- /**
36
- * Set authentication token for API operations
37
- */
38
- setAuthToken(token) {
39
- this.options.authToken = token;
40
- }
41
- /**
42
- * Static method to search for tools (no execution provider needed)
43
- */
44
- static async searchTools(options, coreOptions = {}) {
45
- const apiClient = new EnactApiClient(coreOptions.apiUrl || "https://enact.tools", coreOptions.supabaseUrl || "https://xjnhhxwxovjifdxdwzih.supabase.co");
46
- try {
47
- logger.info(`Searching for tools with query: "${options.query}"`);
48
- const searchParams = {
49
- query: options.query,
50
- limit: options.limit,
51
- tags: options.tags,
52
- };
53
- const results = await apiClient.searchTools(searchParams);
54
- // Parse and validate results
55
- const tools = [];
56
- for (const result of results) {
57
- if (result.name) {
58
- try {
59
- const tool = await EnactCore.getToolByName(result.name, undefined, coreOptions);
60
- if (tool) {
61
- tools.push(tool);
62
- }
63
- }
64
- catch (error) {
65
- logger.warn(`Failed to fetch tool ${result.name}:`, error);
66
- }
67
- }
68
- }
69
- logger.info(`Found ${tools.length} tools`);
70
- return tools;
71
- }
72
- catch (error) {
73
- logger.error("Error searching tools:", error);
74
- // If it's a 502 error (API server issue), try fallback to local filtering
75
- if (error instanceof Error && error.message.includes("502")) {
76
- logger.info("Search API unavailable, trying fallback to local filtering...");
77
- return EnactCore.searchToolsFallback(options, coreOptions);
78
- }
79
- throw new Error(`Search failed: ${error instanceof Error ? error.message : String(error)}`);
80
- }
81
- }
82
- /**
83
- * Instance method wrapper for backward compatibility
84
- */
85
- async searchTools(options) {
86
- return EnactCore.searchTools(options, this.options);
87
- }
88
- /**
89
- * Static fallback search method that gets all tools and filters locally
90
- */
91
- static async searchToolsFallback(options, coreOptions = {}) {
92
- const apiClient = new EnactApiClient(coreOptions.apiUrl || "https://enact.tools", coreOptions.supabaseUrl || "https://xjnhhxwxovjifdxdwzih.supabase.co");
93
- try {
94
- logger.info("Using fallback search method...");
95
- // Get all tools (limited to avoid overwhelming the API)
96
- const allTools = await apiClient.getTools({
97
- limit: options.limit || 100,
98
- });
99
- // Filter tools locally based on search criteria
100
- const filteredTools = [];
101
- const query = options.query.toLowerCase();
102
- for (const result of allTools) {
103
- if (result.name) {
104
- try {
105
- const tool = await EnactCore.getToolByName(result.name, undefined, coreOptions);
106
- if (tool) {
107
- // Check if tool matches search criteria
108
- const matchesQuery = tool.name.toLowerCase().includes(query) ||
109
- (tool.description &&
110
- tool.description.toLowerCase().includes(query)) ||
111
- (tool.tags &&
112
- tool.tags.some((tag) => tag.toLowerCase().includes(query)));
113
- const matchesTags = !options.tags ||
114
- !options.tags.length ||
115
- (tool.tags &&
116
- options.tags.some((searchTag) => tool.tags.some((toolTag) => toolTag.toLowerCase().includes(searchTag.toLowerCase()))));
117
- const matchesAuthor = !options.author ||
118
- (tool.authors &&
119
- tool.authors.some((author) => author.name &&
120
- author.name
121
- .toLowerCase()
122
- .includes(options.author.toLowerCase())));
123
- if (matchesQuery && matchesTags && matchesAuthor) {
124
- filteredTools.push(tool);
125
- // Apply limit if specified
126
- if (options.limit && filteredTools.length >= options.limit) {
127
- break;
128
- }
129
- }
130
- }
131
- }
132
- catch (error) {
133
- logger.warn(`Failed to fetch tool ${result.name} in fallback search:`, error);
134
- }
135
- }
136
- }
137
- logger.info(`Fallback search found ${filteredTools.length} tools`);
138
- return filteredTools;
139
- }
140
- catch (fallbackError) {
141
- logger.error("Fallback search also failed:", fallbackError);
142
- throw new Error(`Search failed (including fallback): ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`);
143
- }
144
- }
145
- /**
146
- * Static method to get a specific tool by name
147
- */
148
- static async getToolByName(name, version, coreOptions = {}) {
149
- const apiClient = new EnactApiClient(coreOptions.apiUrl || "https://enact.tools", coreOptions.supabaseUrl || "https://xjnhhxwxovjifdxdwzih.supabase.co");
150
- try {
151
- logger.info(`Fetching tool: ${name}${version ? `@${version}` : ""}`);
152
- const response = await apiClient.getTool(name);
153
- if (!response) {
154
- logger.info(`Tool not found: ${name}`);
155
- return null;
156
- }
157
- // Parse tool from response - prefer raw_content for signature compatibility
158
- let tool;
159
- // Try raw_content first (contains original tool definition with correct field names for signatures)
160
- if (response.raw_content && typeof response.raw_content === "string") {
161
- try {
162
- tool = JSON.parse(response.raw_content);
163
- }
164
- catch {
165
- tool = yaml.parse(response.raw_content);
166
- }
167
- // Merge signature information from response if not already in raw content
168
- if (!tool.signature && response.signature) {
169
- tool.signature = response.signature;
170
- }
171
- if (!tool.signatures && response.signatures) {
172
- // Convert object format to array format
173
- if (Array.isArray(response.signatures)) {
174
- tool.signatures = response.signatures;
175
- }
176
- else {
177
- // Convert object format {keyId: signatureData} to array format
178
- tool.signatures = Object.values(response.signatures);
179
- }
180
- }
181
- }
182
- else if (response.content && typeof response.content === "string") {
183
- tool = yaml.parse(response.content);
184
- // Merge signature information
185
- if (!tool.signature && response.signature) {
186
- tool.signature = response.signature;
187
- }
188
- if (!tool.signatures && response.signatures) {
189
- // Convert object format to array format
190
- if (Array.isArray(response.signatures)) {
191
- tool.signatures = response.signatures;
192
- }
193
- else {
194
- // Convert object format {keyId: signatureData} to array format
195
- tool.signatures = Object.values(response.signatures);
196
- }
197
- }
198
- }
199
- else {
200
- // Fallback: map database fields to tool format (may cause signature verification issues)
201
- tool = {
202
- name: response.name,
203
- description: response.description,
204
- command: response.command,
205
- timeout: response.timeout || "30s",
206
- tags: response.tags || [],
207
- license: response.license || response.spdx_license,
208
- outputSchema: response.output_schema || response.outputSchema,
209
- enact: response.protocol_version || response.enact || "1.0.0",
210
- version: response.version,
211
- inputSchema: response.input_schema || response.inputSchema,
212
- examples: response.examples,
213
- annotations: response.annotations,
214
- env: response.env_vars || response.env,
215
- resources: response.resources,
216
- signature: response.signature,
217
- signatures: response.signatures ? (Array.isArray(response.signatures) ? response.signatures : Object.values(response.signatures)) : undefined,
218
- namespace: response.namespace,
219
- };
220
- }
221
- logger.info(`Successfully fetched tool: ${tool.name}`);
222
- return tool;
223
- }
224
- catch (error) {
225
- if (error instanceof Error && error.message.includes("404")) {
226
- logger.info(`Tool not found: ${name}`);
227
- return null;
228
- }
229
- logger.error(`Error fetching tool: ${error instanceof Error ? error.message : String(error)}`);
230
- throw error;
231
- }
232
- }
233
- /**
234
- * Instance method wrapper for backward compatibility
235
- */
236
- async getToolByName(name, version) {
237
- return EnactCore.getToolByName(name, version, this.options);
238
- }
239
- /**
240
- * Execute a tool by name
241
- */
242
- async executeToolByName(name, inputs = {}, options = {}) {
243
- const executionId = this.generateExecutionId();
244
- try {
245
- // Fetch the tool
246
- const tool = await this.getToolByName(name);
247
- if (!tool) {
248
- return {
249
- success: false,
250
- error: {
251
- message: `Tool not found: ${name}`,
252
- code: "NOT_FOUND",
253
- },
254
- metadata: {
255
- executionId,
256
- toolName: name,
257
- executedAt: new Date().toISOString(),
258
- environment: "direct",
259
- },
260
- };
261
- }
262
- // Execute the tool
263
- return await this.executeTool(tool, inputs, options);
264
- }
265
- catch (error) {
266
- return {
267
- success: false,
268
- error: {
269
- message: error.message,
270
- code: "EXECUTION_ERROR",
271
- },
272
- metadata: {
273
- executionId,
274
- toolName: name,
275
- executedAt: new Date().toISOString(),
276
- environment: "direct",
277
- },
278
- };
279
- }
280
- }
281
- static async checkToolVerificationStatus(tool) {
282
- const documentForVerification = {
283
- command: tool.command,
284
- description: tool.description,
285
- from: tool.from,
286
- name: tool.name,
287
- signatures: tool.signatures?.map(sig => ({
288
- signature: sig.value,
289
- publicKey: "", // TODO: Look up the correct public key
290
- algorithm: sig.algorithm,
291
- timestamp: new Date(sig.created).getTime(),
292
- })),
293
- };
294
- let isValid = false;
295
- if (tool.signatures && tool.signatures.length > 0) {
296
- isValid = tool.signatures.some(sig => {
297
- const referenceSignature = {
298
- signature: sig.value,
299
- publicKey: "", // TODO: Lookup correct public key based on signature UUID
300
- algorithm: sig.algorithm,
301
- timestamp: new Date(sig.created).getTime()
302
- };
303
- return SigningService.verifyDocument(documentForVerification, referenceSignature, { includeFields: ['command', 'description', 'from', 'name'] });
304
- });
305
- }
306
- return isValid;
307
- }
308
- async verifyTool(tool, dangerouslySkipVerification = false) {
309
- if (dangerouslySkipVerification) {
310
- logger.warn(`Skipping signature verification for tool: ${tool.name}`);
311
- return;
312
- }
313
- try {
314
- if (!tool.signatures || tool.signatures.length === 0) {
315
- throw new Error(`Tool ${tool.name} does not have any signatures`);
316
- }
317
- // const documentForVerification = {
318
- // command: tool.command,
319
- // description: tool.description,
320
- // from: tool.from,
321
- // name: tool.name,
322
- // };
323
- // const referenceSignature = {
324
- // signature: tool.signatures[0].value,
325
- // publicKey: "", // Correct public key for UUID 71e02e2c-148c-4534-9900-bd9646e99333
326
- // algorithm: tool.signatures[0].algorithm,
327
- // timestamp: new Date(tool.signatures[0].created).getTime()
328
- // };
329
- // // Check what canonical document looks like
330
- // const canonicalDoc = SigningService.getCanonicalDocument(documentForVerification, { includeFields: ['command', 'description', 'from', 'name'] }
331
- // );
332
- // const docString = JSON.stringify(canonicalDoc);
333
- // const messageHash = CryptoUtils.hash(docString);
334
- // // Test direct crypto verification
335
- // const directVerify = CryptoUtils.verify(
336
- // referenceSignature.publicKey,
337
- // messageHash,
338
- // referenceSignature.signature
339
- // );
340
- // Check trusted keys
341
- // const trustedKeys = KeyManager.getAllTrustedPublicKeys();
342
- const isValid = await EnactCore.checkToolVerificationStatus(tool);
343
- console.log("Final verification result:", isValid);
344
- if (!isValid) {
345
- throw new Error(`Tool ${tool.name} has invalid signatures`);
346
- }
347
- logger.info(`Tool ${tool.name} signature verification passed`);
348
- }
349
- catch (error) {
350
- logger.error(`Signature verification failed for tool ${tool.name}:`, error);
351
- throw new Error(`Signature verification failed: ${error instanceof Error ? error.message : String(error)}`);
352
- }
353
- }
354
- /**
355
- * Execute a tool directly
356
- */
357
- async executeTool(tool, inputs = {}, options = {}) {
358
- const executionId = this.generateExecutionId();
359
- try {
360
- logger.info(`Executing tool: ${tool.name}`);
361
- // Validate tool structure
362
- validateToolStructure(tool);
363
- // Validate inputs
364
- const validatedInputs = validateInputs(tool, inputs);
365
- const config = SecurityConfigManager.loadConfig();
366
- if (options.isLocalFile && config.allowLocalUnsigned) {
367
- logger.warn(`Executing local file without signature verification: ${tool.name} (you can disallow in your security config)`);
368
- }
369
- if (options.dangerouslySkipVerification) {
370
- logger.warn(`Skipping signature verification for tool: ${tool.name} because of dangerouslySkipVerification option`);
371
- }
372
- const skipVerification = (options.isLocalFile && config.allowLocalUnsigned) || Boolean(options.dangerouslySkipVerification);
373
- // Verify tool signatures (unless explicitly skipped)
374
- await this.verifyTool(tool, skipVerification);
375
- // Resolve environment variables
376
- const { resolved: envVars } = await resolveToolEnvironmentVariables(tool.name, tool.env || {});
377
- // Execute the tool via the execution provider
378
- return await this.executionProvider.execute(tool, { ...validatedInputs, ...envVars }, {
379
- vars: { ...envVars, ...validatedInputs },
380
- resources: {
381
- timeout: options.timeout || tool.timeout || this.options.defaultTimeout,
382
- },
383
- mount: options.mount,
384
- });
385
- }
386
- catch (error) {
387
- return {
388
- success: false,
389
- error: {
390
- message: error.message,
391
- code: "EXECUTION_ERROR",
392
- },
393
- metadata: {
394
- executionId,
395
- toolName: tool.name,
396
- executedAt: new Date().toISOString(),
397
- environment: "direct",
398
- },
399
- };
400
- }
401
- }
402
- /**
403
- * Execute a tool from raw YAML definition
404
- */
405
- async executeRawTool(toolYaml, inputs = {}, options = {}) {
406
- try {
407
- // Parse the YAML
408
- const tool = yaml.parse(toolYaml);
409
- // Validate that it's a proper tool definition
410
- if (!tool || typeof tool !== "object") {
411
- throw new Error("Invalid tool definition: YAML must contain a tool object");
412
- }
413
- // Check for required fields
414
- if (!tool.name || !tool.description || !tool.command) {
415
- throw new Error("Invalid tool definition: missing required fields (name, description, command)");
416
- }
417
- // Execute the tool
418
- return await this.executeTool(tool, inputs, options);
419
- }
420
- catch (error) {
421
- const executionId = this.generateExecutionId();
422
- return {
423
- success: false,
424
- error: {
425
- message: error.message,
426
- code: "PARSE_ERROR",
427
- },
428
- metadata: {
429
- executionId,
430
- toolName: "unknown",
431
- executedAt: new Date().toISOString(),
432
- environment: "direct",
433
- },
434
- };
435
- }
436
- }
437
- /**
438
- * Static method to check if a tool exists
439
- */
440
- static async toolExists(name, coreOptions = {}) {
441
- try {
442
- const tool = await EnactCore.getToolByName(name, undefined, coreOptions);
443
- return tool !== null;
444
- }
445
- catch (error) {
446
- return false;
447
- }
448
- }
449
- /**
450
- * Instance method wrapper for backward compatibility
451
- */
452
- async toolExists(name) {
453
- return EnactCore.toolExists(name, this.options);
454
- }
455
- /**
456
- * Get tools by tags
457
- */
458
- async getToolsByTags(tags, limit = 20) {
459
- return EnactCore.searchTools({
460
- query: tags.join(" "),
461
- tags,
462
- limit,
463
- }, this.options);
464
- }
465
- /**
466
- * Get tools by author
467
- */
468
- async getToolsByAuthor(author, limit = 20) {
469
- return EnactCore.searchTools({
470
- query: `author:${author}`,
471
- author,
472
- limit,
473
- }, this.options);
474
- }
475
- /**
476
- * Static method to get all tools with filters
477
- */
478
- static async getTools(options = {}, coreOptions = {}) {
479
- const apiClient = new EnactApiClient(coreOptions.apiUrl || "https://enact.tools", coreOptions.supabaseUrl || "https://xjnhhxwxovjifdxdwzih.supabase.co");
480
- try {
481
- const apiResults = await apiClient.getTools(options);
482
- // Parse and validate results
483
- const tools = [];
484
- for (const result of apiResults) {
485
- if (result.name) {
486
- try {
487
- const tool = await EnactCore.getToolByName(result.name, undefined, coreOptions);
488
- if (tool) {
489
- tools.push(tool);
490
- }
491
- }
492
- catch (error) {
493
- logger.warn(`Failed to fetch tool ${result.name}:`, error);
494
- }
495
- }
496
- }
497
- return tools;
498
- }
499
- catch (error) {
500
- logger.error("Error getting tools:", error);
501
- throw new Error(`Failed to get tools: ${error instanceof Error ? error.message : String(error)}`);
502
- }
503
- }
504
- /**
505
- * Instance method wrapper for backward compatibility
506
- */
507
- async getTools(options = {}) {
508
- return EnactCore.getTools(options, this.options);
509
- }
510
- /**
511
- * Get authentication status (placeholder - would need actual auth implementation)
512
- */
513
- async getAuthStatus() {
514
- // This would need to check actual auth state
515
- // For now, return based on whether we have a token
516
- return {
517
- authenticated: !!this.options.authToken,
518
- server: this.options.apiUrl,
519
- };
520
- }
521
- /**
522
- * Static method to publish a tool
523
- */
524
- static async publishTool(tool, authToken, coreOptions = {}) {
525
- const apiClient = new EnactApiClient(coreOptions.apiUrl || "https://enact.tools", coreOptions.supabaseUrl || "https://xjnhhxwxovjifdxdwzih.supabase.co");
526
- try {
527
- validateToolStructure(tool);
528
- await apiClient.publishTool(tool, authToken);
529
- return {
530
- success: true,
531
- message: `Successfully published tool: ${tool.name}`,
532
- };
533
- }
534
- catch (error) {
535
- return {
536
- success: false,
537
- message: `Failed to publish tool: ${error instanceof Error ? error.message : String(error)}`,
538
- };
539
- }
540
- }
541
- /**
542
- * Instance method wrapper for backward compatibility
543
- */
544
- async publishTool(tool) {
545
- if (!this.options.authToken) {
546
- return {
547
- success: false,
548
- message: "Authentication required to publish tools",
549
- };
550
- }
551
- return EnactCore.publishTool(tool, this.options.authToken, this.options);
552
- }
553
- /**
554
- * Get tool information (alias for getToolByName for consistency)
555
- */
556
- async getToolInfo(name, version) {
557
- return EnactCore.getToolByName(name, version, this.options);
558
- }
559
- /**
560
- * Get core library status
561
- */
562
- async getStatus() {
563
- const authStatus = await this.getAuthStatus();
564
- return {
565
- executionProvider: this.options.executionProvider || "direct",
566
- apiUrl: this.options.apiUrl || "https://enact.tools",
567
- defaultTimeout: this.options.defaultTimeout || "30s",
568
- authenticated: authStatus.authenticated,
569
- };
570
- }
571
- /**
572
- * Create the appropriate execution provider based on options
573
- */
574
- createExecutionProvider() {
575
- switch (this.options.executionProvider) {
576
- case "direct":
577
- return new DirectExecutionProvider();
578
- case "dagger":
579
- default:
580
- return new DaggerExecutionProvider(this.options.daggerOptions);
581
- }
582
- }
583
- /**
584
- * Switch execution provider at runtime
585
- */
586
- switchExecutionProvider(provider, options) {
587
- this.options.executionProvider = provider;
588
- this.executionProvider = this.createExecutionProvider();
589
- }
590
- /**
591
- * Generate execution ID
592
- */
593
- generateExecutionId() {
594
- return `exec_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
595
- }
596
- }
597
- // No default instance to avoid eager initialization of Dagger
@@ -1,9 +0,0 @@
1
- import { ExecutionProvider, type EnactTool, type ExecutionEnvironment, type ExecutionResult } from "../types.js";
2
- /**
3
- * Native execution provider that throws an error if used for actual execution.
4
- * This is for CLI commands that use Core for API operations only.
5
- */
6
- export declare class NativeExecutionProvider extends ExecutionProvider {
7
- resolveEnvironmentVariables(envConfig: Record<string, any>, namespace?: string): Promise<Record<string, any>>;
8
- execute(tool: EnactTool, input: Record<string, any>, environment: ExecutionEnvironment): Promise<ExecutionResult>;
9
- }
@@ -1,16 +0,0 @@
1
- // src/core/NativeExecutionProvider.ts - No-op execution provider for CLI commands
2
- import { ExecutionProvider, } from "../types.js";
3
- /**
4
- * Native execution provider that throws an error if used for actual execution.
5
- * This is for CLI commands that use Core for API operations only.
6
- */
7
- export class NativeExecutionProvider extends ExecutionProvider {
8
- async resolveEnvironmentVariables(envConfig, namespace) {
9
- // This should never be called for native CLI commands
10
- throw new Error("Native execution provider cannot resolve environment variables");
11
- }
12
- async execute(tool, input, environment) {
13
- // This should never be called for native CLI commands
14
- throw new Error(`Native execution provider cannot execute tools. Tool "${tool.name}" should be executed via direct or dagger provider.`);
15
- }
16
- }
@@ -1,3 +0,0 @@
1
- export * from './EnactCore';
2
- export * from './DirectExecutionProvider';
3
- export * from './DaggerExecutionProvider';
@@ -1,3 +0,0 @@
1
- export * from './EnactCore';
2
- export * from './DirectExecutionProvider';
3
- export * from './DaggerExecutionProvider';
@@ -1,3 +0,0 @@
1
- export { default } from './logger';
2
- export { default as logger } from './logger';
3
- export * from './validate';
@@ -1,3 +0,0 @@
1
- export { default } from './logger';
2
- export { default as logger } from './logger';
3
- export * from './validate';
@@ -1,11 +0,0 @@
1
- declare const logger: import("pino").Logger<never, boolean>;
2
- declare const wrappedLogger: {
3
- info: (msg: string, ...args: any[]) => void;
4
- warn: (msg: string, ...args: any[]) => void;
5
- error: (msg: string, ...args: any[]) => void;
6
- debug: (msg: string, ...args: any[]) => void;
7
- clientLoggingEnabled: () => boolean;
8
- isLevelEnabled: (level: string) => boolean;
9
- pino: import("pino").Logger<never, boolean>;
10
- };
11
- export default wrappedLogger;