agent-tool-hub 1.0.1 → 1.0.3
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.
- package/README.md +17 -198
- package/dist/chunk-57LVNNHL.js +19 -0
- package/dist/chunk-57LVNNHL.js.map +1 -0
- package/dist/chunk-6QTWECRD.cjs +23 -0
- package/dist/chunk-6QTWECRD.cjs.map +1 -0
- package/dist/{chunk-2CEY2WAM.js → chunk-HPDQEW2P.js} +214 -233
- package/dist/chunk-HPDQEW2P.js.map +1 -0
- package/dist/{chunk-GD4JXJHB.cjs → chunk-TIKHPRMB.cjs} +216 -238
- package/dist/chunk-TIKHPRMB.cjs.map +1 -0
- package/dist/cli.cjs +194 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +10 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.js +186 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +62 -61
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/toolhub-runtime.cjs +12 -11
- package/dist/toolhub-runtime.js +2 -1
- package/package.json +4 -1
- package/dist/chunk-2CEY2WAM.js.map +0 -1
- package/dist/chunk-GD4JXJHB.cjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk6QTWECRD_cjs = require('./chunk-6QTWECRD.cjs');
|
|
4
|
+
var chunkTIKHPRMB_cjs = require('./chunk-TIKHPRMB.cjs');
|
|
4
5
|
var chunkX53WXBKX_cjs = require('./chunk-X53WXBKX.cjs');
|
|
5
6
|
var chunkNTTBDQUF_cjs = require('./chunk-NTTBDQUF.cjs');
|
|
6
7
|
var uuid = require('uuid');
|
|
@@ -280,7 +281,7 @@ var DirectoryToolAdapter = class {
|
|
|
280
281
|
// Required by ToolAdapter but not used for routing
|
|
281
282
|
scanner;
|
|
282
283
|
constructor(options) {
|
|
283
|
-
this.scanner = new
|
|
284
|
+
this.scanner = new chunkTIKHPRMB_cjs.DirectoryScanner(options);
|
|
284
285
|
}
|
|
285
286
|
/**
|
|
286
287
|
* Scan directories and return discovered tool specs.
|
|
@@ -353,217 +354,217 @@ var MCPProcessManager = class {
|
|
|
353
354
|
}
|
|
354
355
|
};
|
|
355
356
|
|
|
357
|
+
Object.defineProperty(exports, "createAgentToolHub", {
|
|
358
|
+
enumerable: true,
|
|
359
|
+
get: function () { return chunk6QTWECRD_cjs.createAgentToolHub; }
|
|
360
|
+
});
|
|
361
|
+
Object.defineProperty(exports, "createToolHubAndInitFromConfig", {
|
|
362
|
+
enumerable: true,
|
|
363
|
+
get: function () { return chunk6QTWECRD_cjs.createToolHubAndInitFromConfig; }
|
|
364
|
+
});
|
|
356
365
|
Object.defineProperty(exports, "BudgetManager", {
|
|
357
366
|
enumerable: true,
|
|
358
|
-
get: function () { return
|
|
367
|
+
get: function () { return chunkTIKHPRMB_cjs.BudgetManager; }
|
|
359
368
|
});
|
|
360
369
|
Object.defineProperty(exports, "ComfyUIAdapter", {
|
|
361
370
|
enumerable: true,
|
|
362
|
-
get: function () { return
|
|
371
|
+
get: function () { return chunkTIKHPRMB_cjs.ComfyUIAdapter; }
|
|
363
372
|
});
|
|
364
373
|
Object.defineProperty(exports, "CoreAdapter", {
|
|
365
374
|
enumerable: true,
|
|
366
|
-
get: function () { return
|
|
375
|
+
get: function () { return chunkTIKHPRMB_cjs.CoreAdapter; }
|
|
367
376
|
});
|
|
368
377
|
Object.defineProperty(exports, "DEFAULT_CORE_TOOLS_CONFIG", {
|
|
369
378
|
enumerable: true,
|
|
370
|
-
get: function () { return
|
|
379
|
+
get: function () { return chunkTIKHPRMB_cjs.DEFAULT_CORE_TOOLS_CONFIG; }
|
|
371
380
|
});
|
|
372
381
|
Object.defineProperty(exports, "DirectoryScanner", {
|
|
373
382
|
enumerable: true,
|
|
374
|
-
get: function () { return
|
|
383
|
+
get: function () { return chunkTIKHPRMB_cjs.DirectoryScanner; }
|
|
375
384
|
});
|
|
376
385
|
Object.defineProperty(exports, "DiscoveryError", {
|
|
377
386
|
enumerable: true,
|
|
378
|
-
get: function () { return
|
|
387
|
+
get: function () { return chunkTIKHPRMB_cjs.DiscoveryError; }
|
|
379
388
|
});
|
|
380
389
|
Object.defineProperty(exports, "EventLog", {
|
|
381
390
|
enumerable: true,
|
|
382
|
-
get: function () { return
|
|
391
|
+
get: function () { return chunkTIKHPRMB_cjs.EventLog; }
|
|
383
392
|
});
|
|
384
393
|
Object.defineProperty(exports, "LangChainAdapter", {
|
|
385
394
|
enumerable: true,
|
|
386
|
-
get: function () { return
|
|
395
|
+
get: function () { return chunkTIKHPRMB_cjs.LangChainAdapter; }
|
|
387
396
|
});
|
|
388
397
|
Object.defineProperty(exports, "MCPAdapter", {
|
|
389
398
|
enumerable: true,
|
|
390
|
-
get: function () { return
|
|
399
|
+
get: function () { return chunkTIKHPRMB_cjs.MCPAdapter; }
|
|
391
400
|
});
|
|
392
401
|
Object.defineProperty(exports, "Metrics", {
|
|
393
402
|
enumerable: true,
|
|
394
|
-
get: function () { return
|
|
403
|
+
get: function () { return chunkTIKHPRMB_cjs.Metrics; }
|
|
395
404
|
});
|
|
396
405
|
Object.defineProperty(exports, "N8nAdapter", {
|
|
397
406
|
enumerable: true,
|
|
398
|
-
get: function () { return
|
|
407
|
+
get: function () { return chunkTIKHPRMB_cjs.N8nAdapter; }
|
|
399
408
|
});
|
|
400
409
|
Object.defineProperty(exports, "PTCRuntime", {
|
|
401
410
|
enumerable: true,
|
|
402
|
-
get: function () { return
|
|
411
|
+
get: function () { return chunkTIKHPRMB_cjs.PTCRuntime; }
|
|
403
412
|
});
|
|
404
413
|
Object.defineProperty(exports, "PolicyDeniedError", {
|
|
405
414
|
enumerable: true,
|
|
406
|
-
get: function () { return
|
|
415
|
+
get: function () { return chunkTIKHPRMB_cjs.PolicyDeniedError; }
|
|
407
416
|
});
|
|
408
417
|
Object.defineProperty(exports, "PolicyEngine", {
|
|
409
418
|
enumerable: true,
|
|
410
|
-
get: function () { return
|
|
419
|
+
get: function () { return chunkTIKHPRMB_cjs.PolicyEngine; }
|
|
411
420
|
});
|
|
412
421
|
Object.defineProperty(exports, "SchemaValidationError", {
|
|
413
422
|
enumerable: true,
|
|
414
|
-
get: function () { return
|
|
423
|
+
get: function () { return chunkTIKHPRMB_cjs.SchemaValidationError; }
|
|
415
424
|
});
|
|
416
425
|
Object.defineProperty(exports, "SchemaValidator", {
|
|
417
426
|
enumerable: true,
|
|
418
|
-
get: function () { return
|
|
427
|
+
get: function () { return chunkTIKHPRMB_cjs.SchemaValidator; }
|
|
419
428
|
});
|
|
420
429
|
Object.defineProperty(exports, "SkillAdapter", {
|
|
421
430
|
enumerable: true,
|
|
422
|
-
get: function () { return
|
|
431
|
+
get: function () { return chunkTIKHPRMB_cjs.SkillAdapter; }
|
|
423
432
|
});
|
|
424
433
|
Object.defineProperty(exports, "SkillManifestError", {
|
|
425
434
|
enumerable: true,
|
|
426
|
-
get: function () { return
|
|
435
|
+
get: function () { return chunkTIKHPRMB_cjs.SkillManifestError; }
|
|
427
436
|
});
|
|
428
437
|
Object.defineProperty(exports, "ToolHub", {
|
|
429
438
|
enumerable: true,
|
|
430
|
-
get: function () { return
|
|
439
|
+
get: function () { return chunkTIKHPRMB_cjs.ToolHub; }
|
|
431
440
|
});
|
|
432
441
|
Object.defineProperty(exports, "ToolRegistry", {
|
|
433
442
|
enumerable: true,
|
|
434
|
-
get: function () { return
|
|
443
|
+
get: function () { return chunkTIKHPRMB_cjs.ToolRegistry; }
|
|
435
444
|
});
|
|
436
445
|
Object.defineProperty(exports, "Tracing", {
|
|
437
446
|
enumerable: true,
|
|
438
|
-
get: function () { return
|
|
447
|
+
get: function () { return chunkTIKHPRMB_cjs.Tracing; }
|
|
439
448
|
});
|
|
440
449
|
Object.defineProperty(exports, "buildEvidence", {
|
|
441
450
|
enumerable: true,
|
|
442
|
-
get: function () { return
|
|
443
|
-
});
|
|
444
|
-
Object.defineProperty(exports, "createAgentToolHub", {
|
|
445
|
-
enumerable: true,
|
|
446
|
-
get: function () { return chunkGD4JXJHB_cjs.createAgentToolHub; }
|
|
451
|
+
get: function () { return chunkTIKHPRMB_cjs.buildEvidence; }
|
|
447
452
|
});
|
|
448
453
|
Object.defineProperty(exports, "createTaggedError", {
|
|
449
454
|
enumerable: true,
|
|
450
|
-
get: function () { return
|
|
455
|
+
get: function () { return chunkTIKHPRMB_cjs.createTaggedError; }
|
|
451
456
|
});
|
|
452
457
|
Object.defineProperty(exports, "createToolHub", {
|
|
453
458
|
enumerable: true,
|
|
454
|
-
get: function () { return
|
|
455
|
-
});
|
|
456
|
-
Object.defineProperty(exports, "createToolHubAndInitFromConfig", {
|
|
457
|
-
enumerable: true,
|
|
458
|
-
get: function () { return chunkGD4JXJHB_cjs.createToolHubAndInitFromConfig; }
|
|
459
|
+
get: function () { return chunkTIKHPRMB_cjs.createToolHub; }
|
|
459
460
|
});
|
|
460
461
|
Object.defineProperty(exports, "deletePathSpec", {
|
|
461
462
|
enumerable: true,
|
|
462
|
-
get: function () { return
|
|
463
|
+
get: function () { return chunkTIKHPRMB_cjs.deletePathSpec; }
|
|
463
464
|
});
|
|
464
465
|
Object.defineProperty(exports, "downloadFileSpec", {
|
|
465
466
|
enumerable: true,
|
|
466
|
-
get: function () { return
|
|
467
|
+
get: function () { return chunkTIKHPRMB_cjs.downloadFileSpec; }
|
|
467
468
|
});
|
|
468
469
|
Object.defineProperty(exports, "fetchJsonSpec", {
|
|
469
470
|
enumerable: true,
|
|
470
|
-
get: function () { return
|
|
471
|
+
get: function () { return chunkTIKHPRMB_cjs.fetchJsonSpec; }
|
|
471
472
|
});
|
|
472
473
|
Object.defineProperty(exports, "fetchTextSpec", {
|
|
473
474
|
enumerable: true,
|
|
474
|
-
get: function () { return
|
|
475
|
+
get: function () { return chunkTIKHPRMB_cjs.fetchTextSpec; }
|
|
475
476
|
});
|
|
476
477
|
Object.defineProperty(exports, "hashTextSpec", {
|
|
477
478
|
enumerable: true,
|
|
478
|
-
get: function () { return
|
|
479
|
+
get: function () { return chunkTIKHPRMB_cjs.hashTextSpec; }
|
|
479
480
|
});
|
|
480
481
|
Object.defineProperty(exports, "headSpec", {
|
|
481
482
|
enumerable: true,
|
|
482
|
-
get: function () { return
|
|
483
|
+
get: function () { return chunkTIKHPRMB_cjs.headSpec; }
|
|
483
484
|
});
|
|
484
485
|
Object.defineProperty(exports, "isIpInBlockedCidrs", {
|
|
485
486
|
enumerable: true,
|
|
486
|
-
get: function () { return
|
|
487
|
+
get: function () { return chunkTIKHPRMB_cjs.isIpInBlockedCidrs; }
|
|
487
488
|
});
|
|
488
489
|
Object.defineProperty(exports, "isRetryable", {
|
|
489
490
|
enumerable: true,
|
|
490
|
-
get: function () { return
|
|
491
|
+
get: function () { return chunkTIKHPRMB_cjs.isRetryable; }
|
|
491
492
|
});
|
|
492
493
|
Object.defineProperty(exports, "jsonSelectSpec", {
|
|
493
494
|
enumerable: true,
|
|
494
|
-
get: function () { return
|
|
495
|
+
get: function () { return chunkTIKHPRMB_cjs.jsonSelectSpec; }
|
|
495
496
|
});
|
|
496
497
|
Object.defineProperty(exports, "listDirSpec", {
|
|
497
498
|
enumerable: true,
|
|
498
|
-
get: function () { return
|
|
499
|
+
get: function () { return chunkTIKHPRMB_cjs.listDirSpec; }
|
|
499
500
|
});
|
|
500
501
|
Object.defineProperty(exports, "loadSkillDefinition", {
|
|
501
502
|
enumerable: true,
|
|
502
|
-
get: function () { return
|
|
503
|
+
get: function () { return chunkTIKHPRMB_cjs.loadSkillDefinition; }
|
|
503
504
|
});
|
|
504
505
|
Object.defineProperty(exports, "loadToolHubConfig", {
|
|
505
506
|
enumerable: true,
|
|
506
|
-
get: function () { return
|
|
507
|
+
get: function () { return chunkTIKHPRMB_cjs.loadToolHubConfig; }
|
|
507
508
|
});
|
|
508
509
|
Object.defineProperty(exports, "mapToolHubConfig", {
|
|
509
510
|
enumerable: true,
|
|
510
|
-
get: function () { return
|
|
511
|
+
get: function () { return chunkTIKHPRMB_cjs.mapToolHubConfig; }
|
|
511
512
|
});
|
|
512
513
|
Object.defineProperty(exports, "nowSpec", {
|
|
513
514
|
enumerable: true,
|
|
514
|
-
get: function () { return
|
|
515
|
+
get: function () { return chunkTIKHPRMB_cjs.nowSpec; }
|
|
515
516
|
});
|
|
516
517
|
Object.defineProperty(exports, "parseSkillMd", {
|
|
517
518
|
enumerable: true,
|
|
518
|
-
get: function () { return
|
|
519
|
+
get: function () { return chunkTIKHPRMB_cjs.parseSkillMd; }
|
|
519
520
|
});
|
|
520
521
|
Object.defineProperty(exports, "readTextSpec", {
|
|
521
522
|
enumerable: true,
|
|
522
|
-
get: function () { return
|
|
523
|
+
get: function () { return chunkTIKHPRMB_cjs.readTextSpec; }
|
|
523
524
|
});
|
|
524
525
|
Object.defineProperty(exports, "registerCoreTools", {
|
|
525
526
|
enumerable: true,
|
|
526
|
-
get: function () { return
|
|
527
|
+
get: function () { return chunkTIKHPRMB_cjs.registerCoreTools; }
|
|
527
528
|
});
|
|
528
529
|
Object.defineProperty(exports, "resolveSandboxedPath", {
|
|
529
530
|
enumerable: true,
|
|
530
|
-
get: function () { return
|
|
531
|
+
get: function () { return chunkTIKHPRMB_cjs.resolveSandboxedPath; }
|
|
531
532
|
});
|
|
532
533
|
Object.defineProperty(exports, "scanSkillResources", {
|
|
533
534
|
enumerable: true,
|
|
534
|
-
get: function () { return
|
|
535
|
+
get: function () { return chunkTIKHPRMB_cjs.scanSkillResources; }
|
|
535
536
|
});
|
|
536
537
|
Object.defineProperty(exports, "searchTextSpec", {
|
|
537
538
|
enumerable: true,
|
|
538
|
-
get: function () { return
|
|
539
|
+
get: function () { return chunkTIKHPRMB_cjs.searchTextSpec; }
|
|
539
540
|
});
|
|
540
541
|
Object.defineProperty(exports, "sha256Spec", {
|
|
541
542
|
enumerable: true,
|
|
542
|
-
get: function () { return
|
|
543
|
+
get: function () { return chunkTIKHPRMB_cjs.sha256Spec; }
|
|
543
544
|
});
|
|
544
545
|
Object.defineProperty(exports, "templateRenderSpec", {
|
|
545
546
|
enumerable: true,
|
|
546
|
-
get: function () { return
|
|
547
|
+
get: function () { return chunkTIKHPRMB_cjs.templateRenderSpec; }
|
|
547
548
|
});
|
|
548
549
|
Object.defineProperty(exports, "truncateSpec", {
|
|
549
550
|
enumerable: true,
|
|
550
|
-
get: function () { return
|
|
551
|
+
get: function () { return chunkTIKHPRMB_cjs.truncateSpec; }
|
|
551
552
|
});
|
|
552
553
|
Object.defineProperty(exports, "validateFrontmatter", {
|
|
553
554
|
enumerable: true,
|
|
554
|
-
get: function () { return
|
|
555
|
+
get: function () { return chunkTIKHPRMB_cjs.validateFrontmatter; }
|
|
555
556
|
});
|
|
556
557
|
Object.defineProperty(exports, "validateUrl", {
|
|
557
558
|
enumerable: true,
|
|
558
|
-
get: function () { return
|
|
559
|
+
get: function () { return chunkTIKHPRMB_cjs.validateUrl; }
|
|
559
560
|
});
|
|
560
561
|
Object.defineProperty(exports, "withRetry", {
|
|
561
562
|
enumerable: true,
|
|
562
|
-
get: function () { return
|
|
563
|
+
get: function () { return chunkTIKHPRMB_cjs.withRetry; }
|
|
563
564
|
});
|
|
564
565
|
Object.defineProperty(exports, "writeTextSpec", {
|
|
565
566
|
enumerable: true,
|
|
566
|
-
get: function () { return
|
|
567
|
+
get: function () { return chunkTIKHPRMB_cjs.writeTextSpec; }
|
|
567
568
|
});
|
|
568
569
|
Object.defineProperty(exports, "N8nLocalAdapter", {
|
|
569
570
|
enumerable: true,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry/Discovery.ts","../src/jobs/AsyncJobManager.ts","../src/discovery/DirectoryDiscoverySource.ts","../src/discovery/MCPProcessManager.ts"],"names":["EventEmitter","uuidv4","DirectoryScanner"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ToolRegistry } from \"./ToolRegistry.js\";\n\n/**\n * Discovery source configuration.\n */\nexport interface DiscoverySource {\n /** Unique identifier for this source */\n id: string;\n /** The adapter that supports listTools() */\n adapter: ToolAdapter;\n /** Refresh interval in ms (0 = manual only) */\n refreshIntervalMs?: number;\n /** Whether to auto-discover on startup */\n autoDiscover?: boolean;\n}\n\n/**\n * Discovery manager that pulls tool specs from adapters\n * and registers them into the ToolRegistry.\n */\nexport class Discovery {\n private readonly sources = new Map<string, DiscoverySource>();\n private readonly timers = new Map<string, ReturnType<typeof setInterval>>();\n private readonly registry: ToolRegistry;\n private readonly lastRefresh = new Map<string, number>();\n private readonly discoveredTools = new Map<string, Set<string>>(); // sourceId → tool names\n\n constructor(registry: ToolRegistry) {\n this.registry = registry;\n }\n\n /**\n * Add a discovery source.\n */\n addSource(source: DiscoverySource): void {\n this.sources.set(source.id, source);\n this.discoveredTools.set(source.id, new Set());\n\n // Start auto-refresh if configured\n if (source.refreshIntervalMs && source.refreshIntervalMs > 0) {\n const timer = setInterval(\n () => void this.refresh(source.id),\n source.refreshIntervalMs,\n );\n // Unref so it doesn't prevent process exit\n if (typeof timer === \"object\" && \"unref\" in timer) {\n timer.unref();\n }\n this.timers.set(source.id, timer);\n }\n\n // Auto-discover on add if configured\n if (source.autoDiscover) {\n void this.refresh(source.id);\n }\n }\n\n /**\n * Remove a discovery source and its registered tools.\n */\n removeSource(id: string): void {\n const timer = this.timers.get(id);\n if (timer) {\n clearInterval(timer);\n this.timers.delete(id);\n }\n\n // Unregister tools from this source\n const tools = this.discoveredTools.get(id);\n if (tools) {\n for (const name of tools) {\n this.registry.unregister(name);\n }\n }\n\n this.sources.delete(id);\n this.discoveredTools.delete(id);\n this.lastRefresh.delete(id);\n }\n\n /**\n * Refresh tools from a specific source (or all sources).\n */\n async refresh(sourceId?: string): Promise<ToolSpec[]> {\n if (sourceId) {\n return this.refreshSource(sourceId);\n }\n\n const allSpecs: ToolSpec[] = [];\n for (const id of this.sources.keys()) {\n const specs = await this.refreshSource(id);\n allSpecs.push(...specs);\n }\n return allSpecs;\n }\n\n /**\n * Get the last refresh timestamp for a source.\n */\n getLastRefresh(sourceId: string): number | undefined {\n return this.lastRefresh.get(sourceId);\n }\n\n /**\n * Get all registered source IDs.\n */\n getSources(): string[] {\n return [...this.sources.keys()];\n }\n\n /**\n * Stop all refresh timers.\n */\n dispose(): void {\n for (const timer of this.timers.values()) {\n clearInterval(timer);\n }\n this.timers.clear();\n }\n\n private async refreshSource(sourceId: string): Promise<ToolSpec[]> {\n const source = this.sources.get(sourceId);\n if (!source) return [];\n\n if (!source.adapter.listTools) {\n return [];\n }\n\n try {\n const specs = await source.adapter.listTools();\n const currentTools = this.discoveredTools.get(sourceId) ?? new Set();\n const newToolNames = new Set(specs.map((s) => s.name));\n\n // Unregister tools that are no longer present\n for (const name of currentTools) {\n if (!newToolNames.has(name)) {\n this.registry.unregister(name);\n }\n }\n\n // Register/update tools\n for (const spec of specs) {\n this.registry.register(spec);\n }\n\n this.discoveredTools.set(sourceId, newToolNames);\n this.lastRefresh.set(sourceId, Date.now());\n\n return specs;\n } catch (error) {\n // Log but don't throw - discovery failures shouldn't crash the system\n console.error(`Discovery refresh failed for source ${sourceId}:`, error);\n return [];\n }\n }\n}\n","import { v4 as uuidv4 } from \"uuid\";\nimport { EventEmitter } from \"eventemitter3\";\n\n/**\n * Job status in the lifecycle.\n */\nexport type JobStatus = \"queued\" | \"running\" | \"completed\" | \"failed\";\n\n/**\n * A job record representing an async tool invocation.\n */\nexport interface Job {\n jobId: string;\n toolName: string;\n requestId: string;\n taskId: string;\n status: JobStatus;\n createdAt: number; // epoch ms\n updatedAt: number;\n result?: unknown;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for submitting a job.\n */\nexport interface SubmitJobOptions {\n toolName: string;\n requestId: string;\n taskId: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Job store interface for pluggable backends.\n */\nexport interface JobStore {\n set(jobId: string, job: Job): Promise<void>;\n get(jobId: string): Promise<Job | undefined>;\n list(filter?: { toolName?: string; status?: JobStatus }): Promise<Job[]>;\n delete(jobId: string): Promise<void>;\n}\n\n/**\n * In-memory job store (default, for PoC and testing).\n */\nexport class InMemoryJobStore implements JobStore {\n private readonly jobs = new Map<string, Job>();\n\n async set(jobId: string, job: Job): Promise<void> {\n this.jobs.set(jobId, job);\n }\n\n async get(jobId: string): Promise<Job | undefined> {\n return this.jobs.get(jobId);\n }\n\n async list(filter?: { toolName?: string; status?: JobStatus }): Promise<Job[]> {\n let results = [...this.jobs.values()];\n if (filter?.toolName) {\n results = results.filter((j) => j.toolName === filter.toolName);\n }\n if (filter?.status) {\n results = results.filter((j) => j.status === filter.status);\n }\n return results;\n }\n\n async delete(jobId: string): Promise<void> {\n this.jobs.delete(jobId);\n }\n\n get size(): number {\n return this.jobs.size;\n }\n\n clear(): void {\n this.jobs.clear();\n }\n}\n\n/**\n * Async Job Manager: unified async task handling for tools.\n * Provides submit/poll/getResult pattern.\n */\nexport class AsyncJobManager {\n private readonly store: JobStore;\n private readonly emitter = new EventEmitter();\n private readonly ttlMs: number;\n private cleanupTimer?: ReturnType<typeof setInterval>;\n\n constructor(options: { store?: JobStore; ttlMs?: number } = {}) {\n this.store = options.store ?? new InMemoryJobStore();\n this.ttlMs = options.ttlMs ?? 3600_000; // 1 hour default TTL\n this.startCleanup();\n }\n\n /**\n * Submit a new async job.\n */\n async submit(options: SubmitJobOptions): Promise<Job> {\n const now = Date.now();\n const job: Job = {\n jobId: uuidv4(),\n toolName: options.toolName,\n requestId: options.requestId,\n taskId: options.taskId,\n status: \"queued\",\n createdAt: now,\n updatedAt: now,\n metadata: options.metadata,\n };\n\n await this.store.set(job.jobId, job);\n this.emitter.emit(\"submitted\", job);\n return job;\n }\n\n /**\n * Update job status to running.\n */\n async markRunning(jobId: string): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"running\";\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"running\", job);\n return job;\n }\n\n /**\n * Complete a job with a result.\n */\n async complete(jobId: string, result: unknown): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"completed\";\n job.result = result;\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"completed\", job);\n return job;\n }\n\n /**\n * Fail a job with an error message.\n */\n async fail(jobId: string, error: string): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"failed\";\n job.error = error;\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"failed\", job);\n return job;\n }\n\n /**\n * Get current job status.\n */\n async getStatus(jobId: string): Promise<JobStatus | undefined> {\n const job = await this.store.get(jobId);\n return job?.status;\n }\n\n /**\n * Get the full job record.\n */\n async getJob(jobId: string): Promise<Job | undefined> {\n return this.store.get(jobId);\n }\n\n /**\n * Get the result of a completed job.\n */\n async getResult(jobId: string): Promise<unknown | undefined> {\n const job = await this.store.get(jobId);\n if (!job || job.status !== \"completed\") return undefined;\n return job.result;\n }\n\n /**\n * List jobs with optional filter.\n */\n async list(filter?: {\n toolName?: string;\n status?: JobStatus;\n }): Promise<Job[]> {\n return this.store.list(filter);\n }\n\n /**\n * Subscribe to job events.\n */\n on(\n event: \"submitted\" | \"running\" | \"completed\" | \"failed\",\n listener: (job: Job) => void,\n ): () => void {\n this.emitter.on(event, listener);\n return () => this.emitter.off(event, listener);\n }\n\n /**\n * Stop cleanup timer.\n */\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n }\n\n private startCleanup(): void {\n // Run cleanup every TTL/2 interval\n const interval = Math.max(this.ttlMs / 2, 60_000);\n this.cleanupTimer = setInterval(() => void this.cleanup(), interval);\n if (typeof this.cleanupTimer === \"object\" && \"unref\" in this.cleanupTimer) {\n this.cleanupTimer.unref();\n }\n }\n\n private async cleanup(): Promise<void> {\n const now = Date.now();\n const all = await this.store.list();\n for (const job of all) {\n if (\n (job.status === \"completed\" || job.status === \"failed\") &&\n now - job.updatedAt > this.ttlMs\n ) {\n await this.store.delete(job.jobId);\n }\n }\n }\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { DirectoryScannerOptions } from \"./types.js\";\nimport type { DiscoverySource } from \"../registry/Discovery.js\";\nimport { DirectoryScanner } from \"./DirectoryScanner.js\";\n\n/**\n * A ToolAdapter that discovers tools from filesystem directories.\n * Used as the adapter within a DiscoverySource for the Discovery system.\n *\n * Note: This adapter's invoke() is not called directly. Discovered tools\n * retain their original kind (mcp/langchain/skill/n8n) and are invoked\n * by the kind-specific adapter registered on PTCRuntime.\n */\nexport class DirectoryToolAdapter implements ToolAdapter {\n readonly kind = \"mcp\" as const; // Required by ToolAdapter but not used for routing\n private readonly scanner: DirectoryScanner;\n\n constructor(options: DirectoryScannerOptions) {\n this.scanner = new DirectoryScanner(options);\n }\n\n /**\n * Scan directories and return discovered tool specs.\n * Called by Discovery.refresh().\n */\n async listTools(): Promise<ToolSpec[]> {\n return this.scanner.scan();\n }\n\n /**\n * Not used — actual invocation routes through kind-specific adapters.\n */\n async invoke(\n _spec: ToolSpec,\n _args: unknown,\n _ctx: ExecContext,\n ): Promise<{ result: unknown }> {\n throw new Error(\n \"DirectoryToolAdapter.invoke() should not be called directly. \" +\n \"Tool execution is handled by the kind-specific adapter (MCPAdapter, LangChainAdapter, etc.).\",\n );\n }\n\n /**\n * Get the underlying scanner for direct usage.\n */\n getScanner(): DirectoryScanner {\n return this.scanner;\n }\n}\n\n/**\n * Options for creating a directory discovery source.\n */\nexport interface DirectoryDiscoveryOptions extends DirectoryScannerOptions {\n /** Refresh interval in ms (0 = manual only, default: 0) */\n refreshIntervalMs?: number;\n /** Whether to auto-discover on startup (default: true) */\n autoDiscover?: boolean;\n}\n\n/**\n * Factory: create a DiscoverySource for directory-based tool discovery.\n *\n * Usage:\n * ```ts\n * const discovery = new Discovery(registry);\n * discovery.addSource(\n * createDirectoryDiscoverySource(\"local-tools\", {\n * roots: [\"/path/to/tools\"],\n * namespace: \"local\",\n * refreshIntervalMs: 60_000,\n * autoDiscover: true,\n * })\n * );\n * ```\n */\nexport function createDirectoryDiscoverySource(\n id: string,\n options: DirectoryDiscoveryOptions,\n): DiscoverySource {\n const { refreshIntervalMs, autoDiscover, ...scannerOptions } = options;\n\n return {\n id,\n adapter: new DirectoryToolAdapter(scannerOptions),\n refreshIntervalMs: refreshIntervalMs ?? 0,\n autoDiscover: autoDiscover ?? true,\n };\n}\n","import type { MCPServerConfig } from \"./types.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n *\n * This class provides connection configuration for MCP servers discovered\n * from mcp.json files. The actual MCP client creation and lifecycle management\n * is the consumer's responsibility (using @modelcontextprotocol/sdk or similar).\n *\n * Usage:\n * ```ts\n * const manager = new MCPProcessManager();\n * const info = manager.getConnectionInfo(\"my-tool\", mcpConfig);\n * if (info.type === \"stdio\") {\n * // Spawn process with info.command, info.args, info.env\n * } else {\n * // Connect SSE client to info.url\n * }\n * ```\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n /**\n * Get connection info for an MCP tool based on its config.\n * Caches the result by tool name.\n */\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n };\n\n this.connections.set(toolName, info);\n return info;\n }\n\n /**\n * Remove cached connection info for a tool.\n */\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n /**\n * Get all registered tool names.\n */\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n /**\n * Clear all cached connection info.\n */\n dispose(): void {\n this.connections.clear();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/registry/Discovery.ts","../src/jobs/AsyncJobManager.ts","../src/discovery/DirectoryDiscoverySource.ts","../src/discovery/MCPProcessManager.ts"],"names":["EventEmitter","uuidv4","DirectoryScanner"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ToolRegistry } from \"./ToolRegistry.js\";\n\n/**\n * Discovery source configuration.\n */\nexport interface DiscoverySource {\n /** Unique identifier for this source */\n id: string;\n /** The adapter that supports listTools() */\n adapter: ToolAdapter;\n /** Refresh interval in ms (0 = manual only) */\n refreshIntervalMs?: number;\n /** Whether to auto-discover on startup */\n autoDiscover?: boolean;\n}\n\n/**\n * Discovery manager that pulls tool specs from adapters\n * and registers them into the ToolRegistry.\n */\nexport class Discovery {\n private readonly sources = new Map<string, DiscoverySource>();\n private readonly timers = new Map<string, ReturnType<typeof setInterval>>();\n private readonly registry: ToolRegistry;\n private readonly lastRefresh = new Map<string, number>();\n private readonly discoveredTools = new Map<string, Set<string>>(); // sourceId → tool names\n\n constructor(registry: ToolRegistry) {\n this.registry = registry;\n }\n\n /**\n * Add a discovery source.\n */\n addSource(source: DiscoverySource): void {\n this.sources.set(source.id, source);\n this.discoveredTools.set(source.id, new Set());\n\n // Start auto-refresh if configured\n if (source.refreshIntervalMs && source.refreshIntervalMs > 0) {\n const timer = setInterval(\n () => void this.refresh(source.id),\n source.refreshIntervalMs,\n );\n // Unref so it doesn't prevent process exit\n if (typeof timer === \"object\" && \"unref\" in timer) {\n timer.unref();\n }\n this.timers.set(source.id, timer);\n }\n\n // Auto-discover on add if configured\n if (source.autoDiscover) {\n void this.refresh(source.id);\n }\n }\n\n /**\n * Remove a discovery source and its registered tools.\n */\n removeSource(id: string): void {\n const timer = this.timers.get(id);\n if (timer) {\n clearInterval(timer);\n this.timers.delete(id);\n }\n\n // Unregister tools from this source\n const tools = this.discoveredTools.get(id);\n if (tools) {\n for (const name of tools) {\n this.registry.unregister(name);\n }\n }\n\n this.sources.delete(id);\n this.discoveredTools.delete(id);\n this.lastRefresh.delete(id);\n }\n\n /**\n * Refresh tools from a specific source (or all sources).\n */\n async refresh(sourceId?: string): Promise<ToolSpec[]> {\n if (sourceId) {\n return this.refreshSource(sourceId);\n }\n\n const allSpecs: ToolSpec[] = [];\n for (const id of this.sources.keys()) {\n const specs = await this.refreshSource(id);\n allSpecs.push(...specs);\n }\n return allSpecs;\n }\n\n /**\n * Get the last refresh timestamp for a source.\n */\n getLastRefresh(sourceId: string): number | undefined {\n return this.lastRefresh.get(sourceId);\n }\n\n /**\n * Get all registered source IDs.\n */\n getSources(): string[] {\n return [...this.sources.keys()];\n }\n\n /**\n * Stop all refresh timers.\n */\n dispose(): void {\n for (const timer of this.timers.values()) {\n clearInterval(timer);\n }\n this.timers.clear();\n }\n\n private async refreshSource(sourceId: string): Promise<ToolSpec[]> {\n const source = this.sources.get(sourceId);\n if (!source) return [];\n\n if (!source.adapter.listTools) {\n return [];\n }\n\n try {\n const specs = await source.adapter.listTools();\n const currentTools = this.discoveredTools.get(sourceId) ?? new Set();\n const newToolNames = new Set(specs.map((s) => s.name));\n\n // Unregister tools that are no longer present\n for (const name of currentTools) {\n if (!newToolNames.has(name)) {\n this.registry.unregister(name);\n }\n }\n\n // Register/update tools\n for (const spec of specs) {\n this.registry.register(spec);\n }\n\n this.discoveredTools.set(sourceId, newToolNames);\n this.lastRefresh.set(sourceId, Date.now());\n\n return specs;\n } catch (error) {\n // Log but don't throw - discovery failures shouldn't crash the system\n console.error(`Discovery refresh failed for source ${sourceId}:`, error);\n return [];\n }\n }\n}\n","import { v4 as uuidv4 } from \"uuid\";\nimport { EventEmitter } from \"eventemitter3\";\n\n/**\n * Job status in the lifecycle.\n */\nexport type JobStatus = \"queued\" | \"running\" | \"completed\" | \"failed\";\n\n/**\n * A job record representing an async tool invocation.\n */\nexport interface Job {\n jobId: string;\n toolName: string;\n requestId: string;\n taskId: string;\n status: JobStatus;\n createdAt: number; // epoch ms\n updatedAt: number;\n result?: unknown;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for submitting a job.\n */\nexport interface SubmitJobOptions {\n toolName: string;\n requestId: string;\n taskId: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Job store interface for pluggable backends.\n */\nexport interface JobStore {\n set(jobId: string, job: Job): Promise<void>;\n get(jobId: string): Promise<Job | undefined>;\n list(filter?: { toolName?: string; status?: JobStatus }): Promise<Job[]>;\n delete(jobId: string): Promise<void>;\n}\n\n/**\n * In-memory job store (default, for PoC and testing).\n */\nexport class InMemoryJobStore implements JobStore {\n private readonly jobs = new Map<string, Job>();\n\n async set(jobId: string, job: Job): Promise<void> {\n this.jobs.set(jobId, job);\n }\n\n async get(jobId: string): Promise<Job | undefined> {\n return this.jobs.get(jobId);\n }\n\n async list(filter?: { toolName?: string; status?: JobStatus }): Promise<Job[]> {\n let results = [...this.jobs.values()];\n if (filter?.toolName) {\n results = results.filter((j) => j.toolName === filter.toolName);\n }\n if (filter?.status) {\n results = results.filter((j) => j.status === filter.status);\n }\n return results;\n }\n\n async delete(jobId: string): Promise<void> {\n this.jobs.delete(jobId);\n }\n\n get size(): number {\n return this.jobs.size;\n }\n\n clear(): void {\n this.jobs.clear();\n }\n}\n\n/**\n * Async Job Manager: unified async task handling for tools.\n * Provides submit/poll/getResult pattern.\n */\nexport class AsyncJobManager {\n private readonly store: JobStore;\n private readonly emitter = new EventEmitter();\n private readonly ttlMs: number;\n private cleanupTimer?: ReturnType<typeof setInterval>;\n\n constructor(options: { store?: JobStore; ttlMs?: number } = {}) {\n this.store = options.store ?? new InMemoryJobStore();\n this.ttlMs = options.ttlMs ?? 3600_000; // 1 hour default TTL\n this.startCleanup();\n }\n\n /**\n * Submit a new async job.\n */\n async submit(options: SubmitJobOptions): Promise<Job> {\n const now = Date.now();\n const job: Job = {\n jobId: uuidv4(),\n toolName: options.toolName,\n requestId: options.requestId,\n taskId: options.taskId,\n status: \"queued\",\n createdAt: now,\n updatedAt: now,\n metadata: options.metadata,\n };\n\n await this.store.set(job.jobId, job);\n this.emitter.emit(\"submitted\", job);\n return job;\n }\n\n /**\n * Update job status to running.\n */\n async markRunning(jobId: string): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"running\";\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"running\", job);\n return job;\n }\n\n /**\n * Complete a job with a result.\n */\n async complete(jobId: string, result: unknown): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"completed\";\n job.result = result;\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"completed\", job);\n return job;\n }\n\n /**\n * Fail a job with an error message.\n */\n async fail(jobId: string, error: string): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"failed\";\n job.error = error;\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"failed\", job);\n return job;\n }\n\n /**\n * Get current job status.\n */\n async getStatus(jobId: string): Promise<JobStatus | undefined> {\n const job = await this.store.get(jobId);\n return job?.status;\n }\n\n /**\n * Get the full job record.\n */\n async getJob(jobId: string): Promise<Job | undefined> {\n return this.store.get(jobId);\n }\n\n /**\n * Get the result of a completed job.\n */\n async getResult(jobId: string): Promise<unknown | undefined> {\n const job = await this.store.get(jobId);\n if (!job || job.status !== \"completed\") return undefined;\n return job.result;\n }\n\n /**\n * List jobs with optional filter.\n */\n async list(filter?: {\n toolName?: string;\n status?: JobStatus;\n }): Promise<Job[]> {\n return this.store.list(filter);\n }\n\n /**\n * Subscribe to job events.\n */\n on(\n event: \"submitted\" | \"running\" | \"completed\" | \"failed\",\n listener: (job: Job) => void,\n ): () => void {\n this.emitter.on(event, listener);\n return () => this.emitter.off(event, listener);\n }\n\n /**\n * Stop cleanup timer.\n */\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n }\n\n private startCleanup(): void {\n // Run cleanup every TTL/2 interval\n const interval = Math.max(this.ttlMs / 2, 60_000);\n this.cleanupTimer = setInterval(() => void this.cleanup(), interval);\n if (typeof this.cleanupTimer === \"object\" && \"unref\" in this.cleanupTimer) {\n this.cleanupTimer.unref();\n }\n }\n\n private async cleanup(): Promise<void> {\n const now = Date.now();\n const all = await this.store.list();\n for (const job of all) {\n if (\n (job.status === \"completed\" || job.status === \"failed\") &&\n now - job.updatedAt > this.ttlMs\n ) {\n await this.store.delete(job.jobId);\n }\n }\n }\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { DirectoryScannerOptions } from \"./types.js\";\nimport type { DiscoverySource } from \"../registry/Discovery.js\";\nimport { DirectoryScanner } from \"./DirectoryScanner.js\";\n\n/**\n * A ToolAdapter that discovers tools from filesystem directories.\n * Used as the adapter within a DiscoverySource for the Discovery system.\n *\n * Note: This adapter's invoke() is not called directly. Discovered tools\n * retain their original kind (mcp/langchain/skill/n8n) and are invoked\n * by the kind-specific adapter registered on PTCRuntime.\n */\nexport class DirectoryToolAdapter implements ToolAdapter {\n readonly kind = \"mcp\" as const; // Required by ToolAdapter but not used for routing\n private readonly scanner: DirectoryScanner;\n\n constructor(options: DirectoryScannerOptions) {\n this.scanner = new DirectoryScanner(options);\n }\n\n /**\n * Scan directories and return discovered tool specs.\n * Called by Discovery.refresh().\n */\n async listTools(): Promise<ToolSpec[]> {\n return this.scanner.scan();\n }\n\n /**\n * Not used — actual invocation routes through kind-specific adapters.\n */\n async invoke(\n _spec: ToolSpec,\n _args: unknown,\n _ctx: ExecContext,\n ): Promise<{ result: unknown }> {\n throw new Error(\n \"DirectoryToolAdapter.invoke() should not be called directly. \" +\n \"Tool execution is handled by the kind-specific adapter (MCPAdapter, LangChainAdapter, etc.).\",\n );\n }\n\n /**\n * Get the underlying scanner for direct usage.\n */\n getScanner(): DirectoryScanner {\n return this.scanner;\n }\n}\n\n/**\n * Options for creating a directory discovery source.\n */\nexport interface DirectoryDiscoveryOptions extends DirectoryScannerOptions {\n /** Refresh interval in ms (0 = manual only, default: 0) */\n refreshIntervalMs?: number;\n /** Whether to auto-discover on startup (default: true) */\n autoDiscover?: boolean;\n}\n\n/**\n * Factory: create a DiscoverySource for directory-based tool discovery.\n *\n * Usage:\n * ```ts\n * const discovery = new Discovery(registry);\n * discovery.addSource(\n * createDirectoryDiscoverySource(\"local-tools\", {\n * roots: [\"/path/to/tools\"],\n * namespace: \"local\",\n * refreshIntervalMs: 60_000,\n * autoDiscover: true,\n * })\n * );\n * ```\n */\nexport function createDirectoryDiscoverySource(\n id: string,\n options: DirectoryDiscoveryOptions,\n): DiscoverySource {\n const { refreshIntervalMs, autoDiscover, ...scannerOptions } = options;\n\n return {\n id,\n adapter: new DirectoryToolAdapter(scannerOptions),\n refreshIntervalMs: refreshIntervalMs ?? 0,\n autoDiscover: autoDiscover ?? true,\n };\n}\n","import type { MCPServerConfig } from \"./types.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n *\n * This class provides connection configuration for MCP servers discovered\n * from mcp.json files. The actual MCP client creation and lifecycle management\n * is the consumer's responsibility (using @modelcontextprotocol/sdk or similar).\n *\n * Usage:\n * ```ts\n * const manager = new MCPProcessManager();\n * const info = manager.getConnectionInfo(\"my-tool\", mcpConfig);\n * if (info.type === \"stdio\") {\n * // Spawn process with info.command, info.args, info.env\n * } else {\n * // Connect SSE client to info.url\n * }\n * ```\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n /**\n * Get connection info for an MCP tool based on its config.\n * Caches the result by tool name.\n */\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n };\n\n this.connections.set(toolName, info);\n return info;\n }\n\n /**\n * Remove cached connection info for a tool.\n */\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n /**\n * Get all registered tool names.\n */\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n /**\n * Clear all cached connection info.\n */\n dispose(): void {\n this.connections.clear();\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export { createAgentToolHub, createToolHubAndInitFromConfig } from './chunk-57LVNNHL.js';
|
|
2
|
+
import { DirectoryScanner } from './chunk-HPDQEW2P.js';
|
|
3
|
+
export { BudgetManager, ComfyUIAdapter, CoreAdapter, DEFAULT_CORE_TOOLS_CONFIG, DirectoryScanner, DiscoveryError, EventLog, LangChainAdapter, MCPAdapter, Metrics, N8nAdapter, PTCRuntime, PolicyDeniedError, PolicyEngine, SchemaValidationError, SchemaValidator, SkillAdapter, SkillManifestError, ToolHub, ToolRegistry, Tracing, buildEvidence, createTaggedError, createToolHub, deletePathSpec, downloadFileSpec, fetchJsonSpec, fetchTextSpec, hashTextSpec, headSpec, isIpInBlockedCidrs, isRetryable, jsonSelectSpec, listDirSpec, loadSkillDefinition, loadToolHubConfig, mapToolHubConfig, nowSpec, parseSkillMd, readTextSpec, registerCoreTools, resolveSandboxedPath, scanSkillResources, searchTextSpec, sha256Spec, templateRenderSpec, truncateSpec, validateFrontmatter, validateUrl, withRetry, writeTextSpec } from './chunk-HPDQEW2P.js';
|
|
3
4
|
export { N8nLocalAdapter } from './chunk-MHEFFZBB.js';
|
|
4
5
|
export { createLogger, sanitizeForLog, summarizeForLog } from './chunk-YSYEED4K.js';
|
|
5
6
|
import { v4 } from 'uuid';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry/Discovery.ts","../src/jobs/AsyncJobManager.ts","../src/discovery/DirectoryDiscoverySource.ts","../src/discovery/MCPProcessManager.ts"],"names":["uuidv4"],"mappings":"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","file":"index.js","sourcesContent":["import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ToolRegistry } from \"./ToolRegistry.js\";\n\n/**\n * Discovery source configuration.\n */\nexport interface DiscoverySource {\n /** Unique identifier for this source */\n id: string;\n /** The adapter that supports listTools() */\n adapter: ToolAdapter;\n /** Refresh interval in ms (0 = manual only) */\n refreshIntervalMs?: number;\n /** Whether to auto-discover on startup */\n autoDiscover?: boolean;\n}\n\n/**\n * Discovery manager that pulls tool specs from adapters\n * and registers them into the ToolRegistry.\n */\nexport class Discovery {\n private readonly sources = new Map<string, DiscoverySource>();\n private readonly timers = new Map<string, ReturnType<typeof setInterval>>();\n private readonly registry: ToolRegistry;\n private readonly lastRefresh = new Map<string, number>();\n private readonly discoveredTools = new Map<string, Set<string>>(); // sourceId → tool names\n\n constructor(registry: ToolRegistry) {\n this.registry = registry;\n }\n\n /**\n * Add a discovery source.\n */\n addSource(source: DiscoverySource): void {\n this.sources.set(source.id, source);\n this.discoveredTools.set(source.id, new Set());\n\n // Start auto-refresh if configured\n if (source.refreshIntervalMs && source.refreshIntervalMs > 0) {\n const timer = setInterval(\n () => void this.refresh(source.id),\n source.refreshIntervalMs,\n );\n // Unref so it doesn't prevent process exit\n if (typeof timer === \"object\" && \"unref\" in timer) {\n timer.unref();\n }\n this.timers.set(source.id, timer);\n }\n\n // Auto-discover on add if configured\n if (source.autoDiscover) {\n void this.refresh(source.id);\n }\n }\n\n /**\n * Remove a discovery source and its registered tools.\n */\n removeSource(id: string): void {\n const timer = this.timers.get(id);\n if (timer) {\n clearInterval(timer);\n this.timers.delete(id);\n }\n\n // Unregister tools from this source\n const tools = this.discoveredTools.get(id);\n if (tools) {\n for (const name of tools) {\n this.registry.unregister(name);\n }\n }\n\n this.sources.delete(id);\n this.discoveredTools.delete(id);\n this.lastRefresh.delete(id);\n }\n\n /**\n * Refresh tools from a specific source (or all sources).\n */\n async refresh(sourceId?: string): Promise<ToolSpec[]> {\n if (sourceId) {\n return this.refreshSource(sourceId);\n }\n\n const allSpecs: ToolSpec[] = [];\n for (const id of this.sources.keys()) {\n const specs = await this.refreshSource(id);\n allSpecs.push(...specs);\n }\n return allSpecs;\n }\n\n /**\n * Get the last refresh timestamp for a source.\n */\n getLastRefresh(sourceId: string): number | undefined {\n return this.lastRefresh.get(sourceId);\n }\n\n /**\n * Get all registered source IDs.\n */\n getSources(): string[] {\n return [...this.sources.keys()];\n }\n\n /**\n * Stop all refresh timers.\n */\n dispose(): void {\n for (const timer of this.timers.values()) {\n clearInterval(timer);\n }\n this.timers.clear();\n }\n\n private async refreshSource(sourceId: string): Promise<ToolSpec[]> {\n const source = this.sources.get(sourceId);\n if (!source) return [];\n\n if (!source.adapter.listTools) {\n return [];\n }\n\n try {\n const specs = await source.adapter.listTools();\n const currentTools = this.discoveredTools.get(sourceId) ?? new Set();\n const newToolNames = new Set(specs.map((s) => s.name));\n\n // Unregister tools that are no longer present\n for (const name of currentTools) {\n if (!newToolNames.has(name)) {\n this.registry.unregister(name);\n }\n }\n\n // Register/update tools\n for (const spec of specs) {\n this.registry.register(spec);\n }\n\n this.discoveredTools.set(sourceId, newToolNames);\n this.lastRefresh.set(sourceId, Date.now());\n\n return specs;\n } catch (error) {\n // Log but don't throw - discovery failures shouldn't crash the system\n console.error(`Discovery refresh failed for source ${sourceId}:`, error);\n return [];\n }\n }\n}\n","import { v4 as uuidv4 } from \"uuid\";\nimport { EventEmitter } from \"eventemitter3\";\n\n/**\n * Job status in the lifecycle.\n */\nexport type JobStatus = \"queued\" | \"running\" | \"completed\" | \"failed\";\n\n/**\n * A job record representing an async tool invocation.\n */\nexport interface Job {\n jobId: string;\n toolName: string;\n requestId: string;\n taskId: string;\n status: JobStatus;\n createdAt: number; // epoch ms\n updatedAt: number;\n result?: unknown;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for submitting a job.\n */\nexport interface SubmitJobOptions {\n toolName: string;\n requestId: string;\n taskId: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Job store interface for pluggable backends.\n */\nexport interface JobStore {\n set(jobId: string, job: Job): Promise<void>;\n get(jobId: string): Promise<Job | undefined>;\n list(filter?: { toolName?: string; status?: JobStatus }): Promise<Job[]>;\n delete(jobId: string): Promise<void>;\n}\n\n/**\n * In-memory job store (default, for PoC and testing).\n */\nexport class InMemoryJobStore implements JobStore {\n private readonly jobs = new Map<string, Job>();\n\n async set(jobId: string, job: Job): Promise<void> {\n this.jobs.set(jobId, job);\n }\n\n async get(jobId: string): Promise<Job | undefined> {\n return this.jobs.get(jobId);\n }\n\n async list(filter?: { toolName?: string; status?: JobStatus }): Promise<Job[]> {\n let results = [...this.jobs.values()];\n if (filter?.toolName) {\n results = results.filter((j) => j.toolName === filter.toolName);\n }\n if (filter?.status) {\n results = results.filter((j) => j.status === filter.status);\n }\n return results;\n }\n\n async delete(jobId: string): Promise<void> {\n this.jobs.delete(jobId);\n }\n\n get size(): number {\n return this.jobs.size;\n }\n\n clear(): void {\n this.jobs.clear();\n }\n}\n\n/**\n * Async Job Manager: unified async task handling for tools.\n * Provides submit/poll/getResult pattern.\n */\nexport class AsyncJobManager {\n private readonly store: JobStore;\n private readonly emitter = new EventEmitter();\n private readonly ttlMs: number;\n private cleanupTimer?: ReturnType<typeof setInterval>;\n\n constructor(options: { store?: JobStore; ttlMs?: number } = {}) {\n this.store = options.store ?? new InMemoryJobStore();\n this.ttlMs = options.ttlMs ?? 3600_000; // 1 hour default TTL\n this.startCleanup();\n }\n\n /**\n * Submit a new async job.\n */\n async submit(options: SubmitJobOptions): Promise<Job> {\n const now = Date.now();\n const job: Job = {\n jobId: uuidv4(),\n toolName: options.toolName,\n requestId: options.requestId,\n taskId: options.taskId,\n status: \"queued\",\n createdAt: now,\n updatedAt: now,\n metadata: options.metadata,\n };\n\n await this.store.set(job.jobId, job);\n this.emitter.emit(\"submitted\", job);\n return job;\n }\n\n /**\n * Update job status to running.\n */\n async markRunning(jobId: string): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"running\";\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"running\", job);\n return job;\n }\n\n /**\n * Complete a job with a result.\n */\n async complete(jobId: string, result: unknown): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"completed\";\n job.result = result;\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"completed\", job);\n return job;\n }\n\n /**\n * Fail a job with an error message.\n */\n async fail(jobId: string, error: string): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"failed\";\n job.error = error;\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"failed\", job);\n return job;\n }\n\n /**\n * Get current job status.\n */\n async getStatus(jobId: string): Promise<JobStatus | undefined> {\n const job = await this.store.get(jobId);\n return job?.status;\n }\n\n /**\n * Get the full job record.\n */\n async getJob(jobId: string): Promise<Job | undefined> {\n return this.store.get(jobId);\n }\n\n /**\n * Get the result of a completed job.\n */\n async getResult(jobId: string): Promise<unknown | undefined> {\n const job = await this.store.get(jobId);\n if (!job || job.status !== \"completed\") return undefined;\n return job.result;\n }\n\n /**\n * List jobs with optional filter.\n */\n async list(filter?: {\n toolName?: string;\n status?: JobStatus;\n }): Promise<Job[]> {\n return this.store.list(filter);\n }\n\n /**\n * Subscribe to job events.\n */\n on(\n event: \"submitted\" | \"running\" | \"completed\" | \"failed\",\n listener: (job: Job) => void,\n ): () => void {\n this.emitter.on(event, listener);\n return () => this.emitter.off(event, listener);\n }\n\n /**\n * Stop cleanup timer.\n */\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n }\n\n private startCleanup(): void {\n // Run cleanup every TTL/2 interval\n const interval = Math.max(this.ttlMs / 2, 60_000);\n this.cleanupTimer = setInterval(() => void this.cleanup(), interval);\n if (typeof this.cleanupTimer === \"object\" && \"unref\" in this.cleanupTimer) {\n this.cleanupTimer.unref();\n }\n }\n\n private async cleanup(): Promise<void> {\n const now = Date.now();\n const all = await this.store.list();\n for (const job of all) {\n if (\n (job.status === \"completed\" || job.status === \"failed\") &&\n now - job.updatedAt > this.ttlMs\n ) {\n await this.store.delete(job.jobId);\n }\n }\n }\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { DirectoryScannerOptions } from \"./types.js\";\nimport type { DiscoverySource } from \"../registry/Discovery.js\";\nimport { DirectoryScanner } from \"./DirectoryScanner.js\";\n\n/**\n * A ToolAdapter that discovers tools from filesystem directories.\n * Used as the adapter within a DiscoverySource for the Discovery system.\n *\n * Note: This adapter's invoke() is not called directly. Discovered tools\n * retain their original kind (mcp/langchain/skill/n8n) and are invoked\n * by the kind-specific adapter registered on PTCRuntime.\n */\nexport class DirectoryToolAdapter implements ToolAdapter {\n readonly kind = \"mcp\" as const; // Required by ToolAdapter but not used for routing\n private readonly scanner: DirectoryScanner;\n\n constructor(options: DirectoryScannerOptions) {\n this.scanner = new DirectoryScanner(options);\n }\n\n /**\n * Scan directories and return discovered tool specs.\n * Called by Discovery.refresh().\n */\n async listTools(): Promise<ToolSpec[]> {\n return this.scanner.scan();\n }\n\n /**\n * Not used — actual invocation routes through kind-specific adapters.\n */\n async invoke(\n _spec: ToolSpec,\n _args: unknown,\n _ctx: ExecContext,\n ): Promise<{ result: unknown }> {\n throw new Error(\n \"DirectoryToolAdapter.invoke() should not be called directly. \" +\n \"Tool execution is handled by the kind-specific adapter (MCPAdapter, LangChainAdapter, etc.).\",\n );\n }\n\n /**\n * Get the underlying scanner for direct usage.\n */\n getScanner(): DirectoryScanner {\n return this.scanner;\n }\n}\n\n/**\n * Options for creating a directory discovery source.\n */\nexport interface DirectoryDiscoveryOptions extends DirectoryScannerOptions {\n /** Refresh interval in ms (0 = manual only, default: 0) */\n refreshIntervalMs?: number;\n /** Whether to auto-discover on startup (default: true) */\n autoDiscover?: boolean;\n}\n\n/**\n * Factory: create a DiscoverySource for directory-based tool discovery.\n *\n * Usage:\n * ```ts\n * const discovery = new Discovery(registry);\n * discovery.addSource(\n * createDirectoryDiscoverySource(\"local-tools\", {\n * roots: [\"/path/to/tools\"],\n * namespace: \"local\",\n * refreshIntervalMs: 60_000,\n * autoDiscover: true,\n * })\n * );\n * ```\n */\nexport function createDirectoryDiscoverySource(\n id: string,\n options: DirectoryDiscoveryOptions,\n): DiscoverySource {\n const { refreshIntervalMs, autoDiscover, ...scannerOptions } = options;\n\n return {\n id,\n adapter: new DirectoryToolAdapter(scannerOptions),\n refreshIntervalMs: refreshIntervalMs ?? 0,\n autoDiscover: autoDiscover ?? true,\n };\n}\n","import type { MCPServerConfig } from \"./types.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n *\n * This class provides connection configuration for MCP servers discovered\n * from mcp.json files. The actual MCP client creation and lifecycle management\n * is the consumer's responsibility (using @modelcontextprotocol/sdk or similar).\n *\n * Usage:\n * ```ts\n * const manager = new MCPProcessManager();\n * const info = manager.getConnectionInfo(\"my-tool\", mcpConfig);\n * if (info.type === \"stdio\") {\n * // Spawn process with info.command, info.args, info.env\n * } else {\n * // Connect SSE client to info.url\n * }\n * ```\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n /**\n * Get connection info for an MCP tool based on its config.\n * Caches the result by tool name.\n */\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n };\n\n this.connections.set(toolName, info);\n return info;\n }\n\n /**\n * Remove cached connection info for a tool.\n */\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n /**\n * Get all registered tool names.\n */\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n /**\n * Clear all cached connection info.\n */\n dispose(): void {\n this.connections.clear();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/registry/Discovery.ts","../src/jobs/AsyncJobManager.ts","../src/discovery/DirectoryDiscoverySource.ts","../src/discovery/MCPProcessManager.ts"],"names":["uuidv4"],"mappings":"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","file":"index.js","sourcesContent":["import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ToolRegistry } from \"./ToolRegistry.js\";\n\n/**\n * Discovery source configuration.\n */\nexport interface DiscoverySource {\n /** Unique identifier for this source */\n id: string;\n /** The adapter that supports listTools() */\n adapter: ToolAdapter;\n /** Refresh interval in ms (0 = manual only) */\n refreshIntervalMs?: number;\n /** Whether to auto-discover on startup */\n autoDiscover?: boolean;\n}\n\n/**\n * Discovery manager that pulls tool specs from adapters\n * and registers them into the ToolRegistry.\n */\nexport class Discovery {\n private readonly sources = new Map<string, DiscoverySource>();\n private readonly timers = new Map<string, ReturnType<typeof setInterval>>();\n private readonly registry: ToolRegistry;\n private readonly lastRefresh = new Map<string, number>();\n private readonly discoveredTools = new Map<string, Set<string>>(); // sourceId → tool names\n\n constructor(registry: ToolRegistry) {\n this.registry = registry;\n }\n\n /**\n * Add a discovery source.\n */\n addSource(source: DiscoverySource): void {\n this.sources.set(source.id, source);\n this.discoveredTools.set(source.id, new Set());\n\n // Start auto-refresh if configured\n if (source.refreshIntervalMs && source.refreshIntervalMs > 0) {\n const timer = setInterval(\n () => void this.refresh(source.id),\n source.refreshIntervalMs,\n );\n // Unref so it doesn't prevent process exit\n if (typeof timer === \"object\" && \"unref\" in timer) {\n timer.unref();\n }\n this.timers.set(source.id, timer);\n }\n\n // Auto-discover on add if configured\n if (source.autoDiscover) {\n void this.refresh(source.id);\n }\n }\n\n /**\n * Remove a discovery source and its registered tools.\n */\n removeSource(id: string): void {\n const timer = this.timers.get(id);\n if (timer) {\n clearInterval(timer);\n this.timers.delete(id);\n }\n\n // Unregister tools from this source\n const tools = this.discoveredTools.get(id);\n if (tools) {\n for (const name of tools) {\n this.registry.unregister(name);\n }\n }\n\n this.sources.delete(id);\n this.discoveredTools.delete(id);\n this.lastRefresh.delete(id);\n }\n\n /**\n * Refresh tools from a specific source (or all sources).\n */\n async refresh(sourceId?: string): Promise<ToolSpec[]> {\n if (sourceId) {\n return this.refreshSource(sourceId);\n }\n\n const allSpecs: ToolSpec[] = [];\n for (const id of this.sources.keys()) {\n const specs = await this.refreshSource(id);\n allSpecs.push(...specs);\n }\n return allSpecs;\n }\n\n /**\n * Get the last refresh timestamp for a source.\n */\n getLastRefresh(sourceId: string): number | undefined {\n return this.lastRefresh.get(sourceId);\n }\n\n /**\n * Get all registered source IDs.\n */\n getSources(): string[] {\n return [...this.sources.keys()];\n }\n\n /**\n * Stop all refresh timers.\n */\n dispose(): void {\n for (const timer of this.timers.values()) {\n clearInterval(timer);\n }\n this.timers.clear();\n }\n\n private async refreshSource(sourceId: string): Promise<ToolSpec[]> {\n const source = this.sources.get(sourceId);\n if (!source) return [];\n\n if (!source.adapter.listTools) {\n return [];\n }\n\n try {\n const specs = await source.adapter.listTools();\n const currentTools = this.discoveredTools.get(sourceId) ?? new Set();\n const newToolNames = new Set(specs.map((s) => s.name));\n\n // Unregister tools that are no longer present\n for (const name of currentTools) {\n if (!newToolNames.has(name)) {\n this.registry.unregister(name);\n }\n }\n\n // Register/update tools\n for (const spec of specs) {\n this.registry.register(spec);\n }\n\n this.discoveredTools.set(sourceId, newToolNames);\n this.lastRefresh.set(sourceId, Date.now());\n\n return specs;\n } catch (error) {\n // Log but don't throw - discovery failures shouldn't crash the system\n console.error(`Discovery refresh failed for source ${sourceId}:`, error);\n return [];\n }\n }\n}\n","import { v4 as uuidv4 } from \"uuid\";\nimport { EventEmitter } from \"eventemitter3\";\n\n/**\n * Job status in the lifecycle.\n */\nexport type JobStatus = \"queued\" | \"running\" | \"completed\" | \"failed\";\n\n/**\n * A job record representing an async tool invocation.\n */\nexport interface Job {\n jobId: string;\n toolName: string;\n requestId: string;\n taskId: string;\n status: JobStatus;\n createdAt: number; // epoch ms\n updatedAt: number;\n result?: unknown;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for submitting a job.\n */\nexport interface SubmitJobOptions {\n toolName: string;\n requestId: string;\n taskId: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Job store interface for pluggable backends.\n */\nexport interface JobStore {\n set(jobId: string, job: Job): Promise<void>;\n get(jobId: string): Promise<Job | undefined>;\n list(filter?: { toolName?: string; status?: JobStatus }): Promise<Job[]>;\n delete(jobId: string): Promise<void>;\n}\n\n/**\n * In-memory job store (default, for PoC and testing).\n */\nexport class InMemoryJobStore implements JobStore {\n private readonly jobs = new Map<string, Job>();\n\n async set(jobId: string, job: Job): Promise<void> {\n this.jobs.set(jobId, job);\n }\n\n async get(jobId: string): Promise<Job | undefined> {\n return this.jobs.get(jobId);\n }\n\n async list(filter?: { toolName?: string; status?: JobStatus }): Promise<Job[]> {\n let results = [...this.jobs.values()];\n if (filter?.toolName) {\n results = results.filter((j) => j.toolName === filter.toolName);\n }\n if (filter?.status) {\n results = results.filter((j) => j.status === filter.status);\n }\n return results;\n }\n\n async delete(jobId: string): Promise<void> {\n this.jobs.delete(jobId);\n }\n\n get size(): number {\n return this.jobs.size;\n }\n\n clear(): void {\n this.jobs.clear();\n }\n}\n\n/**\n * Async Job Manager: unified async task handling for tools.\n * Provides submit/poll/getResult pattern.\n */\nexport class AsyncJobManager {\n private readonly store: JobStore;\n private readonly emitter = new EventEmitter();\n private readonly ttlMs: number;\n private cleanupTimer?: ReturnType<typeof setInterval>;\n\n constructor(options: { store?: JobStore; ttlMs?: number } = {}) {\n this.store = options.store ?? new InMemoryJobStore();\n this.ttlMs = options.ttlMs ?? 3600_000; // 1 hour default TTL\n this.startCleanup();\n }\n\n /**\n * Submit a new async job.\n */\n async submit(options: SubmitJobOptions): Promise<Job> {\n const now = Date.now();\n const job: Job = {\n jobId: uuidv4(),\n toolName: options.toolName,\n requestId: options.requestId,\n taskId: options.taskId,\n status: \"queued\",\n createdAt: now,\n updatedAt: now,\n metadata: options.metadata,\n };\n\n await this.store.set(job.jobId, job);\n this.emitter.emit(\"submitted\", job);\n return job;\n }\n\n /**\n * Update job status to running.\n */\n async markRunning(jobId: string): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"running\";\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"running\", job);\n return job;\n }\n\n /**\n * Complete a job with a result.\n */\n async complete(jobId: string, result: unknown): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"completed\";\n job.result = result;\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"completed\", job);\n return job;\n }\n\n /**\n * Fail a job with an error message.\n */\n async fail(jobId: string, error: string): Promise<Job | undefined> {\n const job = await this.store.get(jobId);\n if (!job) return undefined;\n\n job.status = \"failed\";\n job.error = error;\n job.updatedAt = Date.now();\n await this.store.set(jobId, job);\n this.emitter.emit(\"failed\", job);\n return job;\n }\n\n /**\n * Get current job status.\n */\n async getStatus(jobId: string): Promise<JobStatus | undefined> {\n const job = await this.store.get(jobId);\n return job?.status;\n }\n\n /**\n * Get the full job record.\n */\n async getJob(jobId: string): Promise<Job | undefined> {\n return this.store.get(jobId);\n }\n\n /**\n * Get the result of a completed job.\n */\n async getResult(jobId: string): Promise<unknown | undefined> {\n const job = await this.store.get(jobId);\n if (!job || job.status !== \"completed\") return undefined;\n return job.result;\n }\n\n /**\n * List jobs with optional filter.\n */\n async list(filter?: {\n toolName?: string;\n status?: JobStatus;\n }): Promise<Job[]> {\n return this.store.list(filter);\n }\n\n /**\n * Subscribe to job events.\n */\n on(\n event: \"submitted\" | \"running\" | \"completed\" | \"failed\",\n listener: (job: Job) => void,\n ): () => void {\n this.emitter.on(event, listener);\n return () => this.emitter.off(event, listener);\n }\n\n /**\n * Stop cleanup timer.\n */\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n }\n\n private startCleanup(): void {\n // Run cleanup every TTL/2 interval\n const interval = Math.max(this.ttlMs / 2, 60_000);\n this.cleanupTimer = setInterval(() => void this.cleanup(), interval);\n if (typeof this.cleanupTimer === \"object\" && \"unref\" in this.cleanupTimer) {\n this.cleanupTimer.unref();\n }\n }\n\n private async cleanup(): Promise<void> {\n const now = Date.now();\n const all = await this.store.list();\n for (const job of all) {\n if (\n (job.status === \"completed\" || job.status === \"failed\") &&\n now - job.updatedAt > this.ttlMs\n ) {\n await this.store.delete(job.jobId);\n }\n }\n }\n}\n","import type { ToolAdapter, ToolSpec } from \"../types/ToolSpec.js\";\nimport type { ExecContext } from \"../types/ToolIntent.js\";\nimport type { DirectoryScannerOptions } from \"./types.js\";\nimport type { DiscoverySource } from \"../registry/Discovery.js\";\nimport { DirectoryScanner } from \"./DirectoryScanner.js\";\n\n/**\n * A ToolAdapter that discovers tools from filesystem directories.\n * Used as the adapter within a DiscoverySource for the Discovery system.\n *\n * Note: This adapter's invoke() is not called directly. Discovered tools\n * retain their original kind (mcp/langchain/skill/n8n) and are invoked\n * by the kind-specific adapter registered on PTCRuntime.\n */\nexport class DirectoryToolAdapter implements ToolAdapter {\n readonly kind = \"mcp\" as const; // Required by ToolAdapter but not used for routing\n private readonly scanner: DirectoryScanner;\n\n constructor(options: DirectoryScannerOptions) {\n this.scanner = new DirectoryScanner(options);\n }\n\n /**\n * Scan directories and return discovered tool specs.\n * Called by Discovery.refresh().\n */\n async listTools(): Promise<ToolSpec[]> {\n return this.scanner.scan();\n }\n\n /**\n * Not used — actual invocation routes through kind-specific adapters.\n */\n async invoke(\n _spec: ToolSpec,\n _args: unknown,\n _ctx: ExecContext,\n ): Promise<{ result: unknown }> {\n throw new Error(\n \"DirectoryToolAdapter.invoke() should not be called directly. \" +\n \"Tool execution is handled by the kind-specific adapter (MCPAdapter, LangChainAdapter, etc.).\",\n );\n }\n\n /**\n * Get the underlying scanner for direct usage.\n */\n getScanner(): DirectoryScanner {\n return this.scanner;\n }\n}\n\n/**\n * Options for creating a directory discovery source.\n */\nexport interface DirectoryDiscoveryOptions extends DirectoryScannerOptions {\n /** Refresh interval in ms (0 = manual only, default: 0) */\n refreshIntervalMs?: number;\n /** Whether to auto-discover on startup (default: true) */\n autoDiscover?: boolean;\n}\n\n/**\n * Factory: create a DiscoverySource for directory-based tool discovery.\n *\n * Usage:\n * ```ts\n * const discovery = new Discovery(registry);\n * discovery.addSource(\n * createDirectoryDiscoverySource(\"local-tools\", {\n * roots: [\"/path/to/tools\"],\n * namespace: \"local\",\n * refreshIntervalMs: 60_000,\n * autoDiscover: true,\n * })\n * );\n * ```\n */\nexport function createDirectoryDiscoverySource(\n id: string,\n options: DirectoryDiscoveryOptions,\n): DiscoverySource {\n const { refreshIntervalMs, autoDiscover, ...scannerOptions } = options;\n\n return {\n id,\n adapter: new DirectoryToolAdapter(scannerOptions),\n refreshIntervalMs: refreshIntervalMs ?? 0,\n autoDiscover: autoDiscover ?? true,\n };\n}\n","import type { MCPServerConfig } from \"./types.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n *\n * This class provides connection configuration for MCP servers discovered\n * from mcp.json files. The actual MCP client creation and lifecycle management\n * is the consumer's responsibility (using @modelcontextprotocol/sdk or similar).\n *\n * Usage:\n * ```ts\n * const manager = new MCPProcessManager();\n * const info = manager.getConnectionInfo(\"my-tool\", mcpConfig);\n * if (info.type === \"stdio\") {\n * // Spawn process with info.command, info.args, info.env\n * } else {\n * // Connect SSE client to info.url\n * }\n * ```\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n /**\n * Get connection info for an MCP tool based on its config.\n * Caches the result by tool name.\n */\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n };\n\n this.connections.set(toolName, info);\n return info;\n }\n\n /**\n * Remove cached connection info for a tool.\n */\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n /**\n * Get all registered tool names.\n */\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n /**\n * Clear all cached connection info.\n */\n dispose(): void {\n this.connections.clear();\n }\n}\n"]}
|
package/dist/toolhub-runtime.cjs
CHANGED
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk6QTWECRD_cjs = require('./chunk-6QTWECRD.cjs');
|
|
4
|
+
var chunkTIKHPRMB_cjs = require('./chunk-TIKHPRMB.cjs');
|
|
4
5
|
require('./chunk-NTTBDQUF.cjs');
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
|
|
8
|
-
Object.defineProperty(exports, "
|
|
9
|
+
Object.defineProperty(exports, "createAgentToolHub", {
|
|
9
10
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
11
|
+
get: function () { return chunk6QTWECRD_cjs.createAgentToolHub; }
|
|
11
12
|
});
|
|
12
|
-
Object.defineProperty(exports, "
|
|
13
|
+
Object.defineProperty(exports, "createToolHubAndInit", {
|
|
13
14
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
15
|
+
get: function () { return chunk6QTWECRD_cjs.createToolHubAndInit; }
|
|
15
16
|
});
|
|
16
|
-
Object.defineProperty(exports, "
|
|
17
|
+
Object.defineProperty(exports, "createToolHubAndInitFromConfig", {
|
|
17
18
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
19
|
+
get: function () { return chunk6QTWECRD_cjs.createToolHubAndInitFromConfig; }
|
|
19
20
|
});
|
|
20
|
-
Object.defineProperty(exports, "
|
|
21
|
+
Object.defineProperty(exports, "ToolHub", {
|
|
21
22
|
enumerable: true,
|
|
22
|
-
get: function () { return
|
|
23
|
+
get: function () { return chunkTIKHPRMB_cjs.ToolHub; }
|
|
23
24
|
});
|
|
24
|
-
Object.defineProperty(exports, "
|
|
25
|
+
Object.defineProperty(exports, "createToolHub", {
|
|
25
26
|
enumerable: true,
|
|
26
|
-
get: function () { return
|
|
27
|
+
get: function () { return chunkTIKHPRMB_cjs.createToolHub; }
|
|
27
28
|
});
|
|
28
29
|
//# sourceMappingURL=toolhub-runtime.cjs.map
|
|
29
30
|
//# sourceMappingURL=toolhub-runtime.cjs.map
|
package/dist/toolhub-runtime.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createAgentToolHub, createToolHubAndInit, createToolHubAndInitFromConfig } from './chunk-57LVNNHL.js';
|
|
2
|
+
export { ToolHub, createToolHub } from './chunk-HPDQEW2P.js';
|
|
2
3
|
import './chunk-YSYEED4K.js';
|
|
3
4
|
//# sourceMappingURL=toolhub-runtime.js.map
|
|
4
5
|
//# sourceMappingURL=toolhub-runtime.js.map
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-tool-hub",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Agent Tool Hub: multi-protocol tool registry, PTC runtime, and adapter layer for MCP/LangChain/n8n/ComfyUI/SKILL",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
7
7
|
"module": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"agent-tool-hub": "./dist/cli.js"
|
|
11
|
+
},
|
|
9
12
|
"exports": {
|
|
10
13
|
".": {
|
|
11
14
|
"types": "./dist/index.d.ts",
|