@iworkforces/tracelattice 2.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.
Files changed (422) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +260 -0
  3. package/dist/CliLifecycle.d.ts +31 -0
  4. package/dist/CliLifecycle.d.ts.map +1 -0
  5. package/dist/CliLifecycle.js +90 -0
  6. package/dist/CliLifecycle.js.map +1 -0
  7. package/dist/ServerConfig.d.ts +290 -0
  8. package/dist/ServerConfig.d.ts.map +1 -0
  9. package/dist/ServerConfig.js +175 -0
  10. package/dist/ServerConfig.js.map +1 -0
  11. package/dist/cache/DiscoveryCache.d.ts +269 -0
  12. package/dist/cache/DiscoveryCache.d.ts.map +1 -0
  13. package/dist/cache/DiscoveryCache.js +104 -0
  14. package/dist/cache/DiscoveryCache.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +5177 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config/ConfigLoader.d.ts +270 -0
  20. package/dist/config/ConfigLoader.d.ts.map +1 -0
  21. package/dist/config/ConfigLoader.js +186 -0
  22. package/dist/config/ConfigLoader.js.map +1 -0
  23. package/dist/context/RequestContext.d.ts +43 -0
  24. package/dist/context/RequestContext.d.ts.map +1 -0
  25. package/dist/context/RequestContext.js +14 -0
  26. package/dist/context/RequestContext.js.map +1 -0
  27. package/dist/contracts/PersistenceBackend.d.ts +134 -0
  28. package/dist/contracts/PersistenceBackend.d.ts.map +1 -0
  29. package/dist/contracts/PersistenceBackend.js +6 -0
  30. package/dist/contracts/PersistenceBackend.js.map +1 -0
  31. package/dist/contracts/calibrator.d.ts +97 -0
  32. package/dist/contracts/calibrator.d.ts.map +1 -0
  33. package/dist/contracts/calibrator.js +1 -0
  34. package/dist/contracts/features.d.ts +35 -0
  35. package/dist/contracts/features.d.ts.map +1 -0
  36. package/dist/contracts/features.js +12 -0
  37. package/dist/contracts/features.js.map +1 -0
  38. package/dist/contracts/ids.d.ts +68 -0
  39. package/dist/contracts/ids.d.ts.map +1 -0
  40. package/dist/contracts/ids.js +40 -0
  41. package/dist/contracts/ids.js.map +1 -0
  42. package/dist/contracts/interfaces.d.ts +254 -0
  43. package/dist/contracts/interfaces.d.ts.map +1 -0
  44. package/dist/contracts/interfaces.js +1 -0
  45. package/dist/contracts/persistence-work.d.ts +96 -0
  46. package/dist/contracts/persistence-work.d.ts.map +1 -0
  47. package/dist/contracts/persistence-work.js +1 -0
  48. package/dist/contracts/reasoning-types.d.ts +21 -0
  49. package/dist/contracts/reasoning-types.d.ts.map +1 -0
  50. package/dist/contracts/reasoning-types.js +1 -0
  51. package/dist/contracts/strategy.d.ts +107 -0
  52. package/dist/contracts/strategy.d.ts.map +1 -0
  53. package/dist/contracts/strategy.js +1 -0
  54. package/dist/contracts/summary.d.ts +110 -0
  55. package/dist/contracts/summary.d.ts.map +1 -0
  56. package/dist/contracts/summary.js +1 -0
  57. package/dist/contracts/suspension.d.ts +215 -0
  58. package/dist/contracts/suspension.d.ts.map +1 -0
  59. package/dist/contracts/suspension.js +1 -0
  60. package/dist/contracts/transport.d.ts +26 -0
  61. package/dist/contracts/transport.d.ts.map +1 -0
  62. package/dist/contracts/transport.js +1 -0
  63. package/dist/core/CrossReferenceValidator.d.ts +18 -0
  64. package/dist/core/CrossReferenceValidator.d.ts.map +1 -0
  65. package/dist/core/CrossReferenceValidator.js +125 -0
  66. package/dist/core/CrossReferenceValidator.js.map +1 -0
  67. package/dist/core/HistoryManager.d.ts +215 -0
  68. package/dist/core/HistoryManager.d.ts.map +1 -0
  69. package/dist/core/HistoryManager.js +594 -0
  70. package/dist/core/HistoryManager.js.map +1 -0
  71. package/dist/core/IHistoryManager.d.ts +163 -0
  72. package/dist/core/IHistoryManager.d.ts.map +1 -0
  73. package/dist/core/IHistoryManager.js +1 -0
  74. package/dist/core/IThoughtFormatter.d.ts +51 -0
  75. package/dist/core/IThoughtFormatter.d.ts.map +1 -0
  76. package/dist/core/IThoughtFormatter.js +1 -0
  77. package/dist/core/InputNormalizer.d.ts +140 -0
  78. package/dist/core/InputNormalizer.d.ts.map +1 -0
  79. package/dist/core/InputNormalizer.js +95 -0
  80. package/dist/core/InputNormalizer.js.map +1 -0
  81. package/dist/core/PersistenceBuffer.d.ts +204 -0
  82. package/dist/core/PersistenceBuffer.d.ts.map +1 -0
  83. package/dist/core/PersistenceBuffer.js +382 -0
  84. package/dist/core/PersistenceBuffer.js.map +1 -0
  85. package/dist/core/PersistenceBufferErrors.d.ts +22 -0
  86. package/dist/core/PersistenceBufferErrors.d.ts.map +1 -0
  87. package/dist/core/PersistenceBufferErrors.js +30 -0
  88. package/dist/core/PersistenceBufferErrors.js.map +1 -0
  89. package/dist/core/PersistenceRestore.d.ts +21 -0
  90. package/dist/core/PersistenceRestore.d.ts.map +1 -0
  91. package/dist/core/PersistenceRestore.js +87 -0
  92. package/dist/core/PersistenceRestore.js.map +1 -0
  93. package/dist/core/PersistenceWorkQueue.d.ts +155 -0
  94. package/dist/core/PersistenceWorkQueue.d.ts.map +1 -0
  95. package/dist/core/PersistenceWorkQueue.js +298 -0
  96. package/dist/core/PersistenceWorkQueue.js.map +1 -0
  97. package/dist/core/PersistenceWriter.d.ts +55 -0
  98. package/dist/core/PersistenceWriter.d.ts.map +1 -0
  99. package/dist/core/PersistenceWriter.js +112 -0
  100. package/dist/core/PersistenceWriter.js.map +1 -0
  101. package/dist/core/SessionErrors.d.ts +37 -0
  102. package/dist/core/SessionErrors.d.ts.map +1 -0
  103. package/dist/core/SessionErrors.js +50 -0
  104. package/dist/core/SessionErrors.js.map +1 -0
  105. package/dist/core/SessionLifecycleCoordinator.d.ts +74 -0
  106. package/dist/core/SessionLifecycleCoordinator.d.ts.map +1 -0
  107. package/dist/core/SessionLifecycleCoordinator.js +222 -0
  108. package/dist/core/SessionLifecycleCoordinator.js.map +1 -0
  109. package/dist/core/SessionLock.d.ts +59 -0
  110. package/dist/core/SessionLock.d.ts.map +1 -0
  111. package/dist/core/SessionLock.js +39 -0
  112. package/dist/core/SessionLock.js.map +1 -0
  113. package/dist/core/SessionManager.d.ts +62 -0
  114. package/dist/core/SessionManager.d.ts.map +1 -0
  115. package/dist/core/SessionManager.js +75 -0
  116. package/dist/core/SessionManager.js.map +1 -0
  117. package/dist/core/SessionResetCoordinator.d.ts +37 -0
  118. package/dist/core/SessionResetCoordinator.d.ts.map +1 -0
  119. package/dist/core/SessionResetCoordinator.js +80 -0
  120. package/dist/core/SessionResetCoordinator.js.map +1 -0
  121. package/dist/core/ThoughtEvaluator.d.ts +48 -0
  122. package/dist/core/ThoughtEvaluator.d.ts.map +1 -0
  123. package/dist/core/ThoughtEvaluator.js +85 -0
  124. package/dist/core/ThoughtEvaluator.js.map +1 -0
  125. package/dist/core/ThoughtFormatter.d.ts +134 -0
  126. package/dist/core/ThoughtFormatter.d.ts.map +1 -0
  127. package/dist/core/ThoughtFormatter.js +118 -0
  128. package/dist/core/ThoughtFormatter.js.map +1 -0
  129. package/dist/core/ThoughtProcessor.d.ts +259 -0
  130. package/dist/core/ThoughtProcessor.d.ts.map +1 -0
  131. package/dist/core/ThoughtProcessor.js +451 -0
  132. package/dist/core/ThoughtProcessor.js.map +1 -0
  133. package/dist/core/ThoughtReferenceIndex.d.ts +23 -0
  134. package/dist/core/ThoughtReferenceIndex.d.ts.map +1 -0
  135. package/dist/core/ThoughtReferenceIndex.js +66 -0
  136. package/dist/core/ThoughtReferenceIndex.js.map +1 -0
  137. package/dist/core/VerificationOutcomeAdmission.d.ts +15 -0
  138. package/dist/core/VerificationOutcomeAdmission.d.ts.map +1 -0
  139. package/dist/core/VerificationOutcomeAdmission.js +28 -0
  140. package/dist/core/VerificationOutcomeAdmission.js.map +1 -0
  141. package/dist/core/compression/CompressionService.d.ts +76 -0
  142. package/dist/core/compression/CompressionService.d.ts.map +1 -0
  143. package/dist/core/compression/CompressionService.js +160 -0
  144. package/dist/core/compression/CompressionService.js.map +1 -0
  145. package/dist/core/compression/DehydrationPolicy.d.ts +75 -0
  146. package/dist/core/compression/DehydrationPolicy.d.ts.map +1 -0
  147. package/dist/core/compression/DehydrationPolicy.js +45 -0
  148. package/dist/core/compression/DehydrationPolicy.js.map +1 -0
  149. package/dist/core/compression/InMemorySummaryStore.d.ts +132 -0
  150. package/dist/core/compression/InMemorySummaryStore.d.ts.map +1 -0
  151. package/dist/core/compression/InMemorySummaryStore.js +69 -0
  152. package/dist/core/compression/InMemorySummaryStore.js.map +1 -0
  153. package/dist/core/compression/Summary.d.ts +74 -0
  154. package/dist/core/compression/Summary.d.ts.map +1 -0
  155. package/dist/core/compression/Summary.js +16 -0
  156. package/dist/core/compression/Summary.js.map +1 -0
  157. package/dist/core/evaluator/Aggregator.d.ts +40 -0
  158. package/dist/core/evaluator/Aggregator.d.ts.map +1 -0
  159. package/dist/core/evaluator/Aggregator.js +36 -0
  160. package/dist/core/evaluator/Aggregator.js.map +1 -0
  161. package/dist/core/evaluator/Calibrator.d.ts +52 -0
  162. package/dist/core/evaluator/Calibrator.d.ts.map +1 -0
  163. package/dist/core/evaluator/Calibrator.js +135 -0
  164. package/dist/core/evaluator/Calibrator.js.map +1 -0
  165. package/dist/core/evaluator/PatternDetector.d.ts +69 -0
  166. package/dist/core/evaluator/PatternDetector.d.ts.map +1 -0
  167. package/dist/core/evaluator/PatternDetector.js +192 -0
  168. package/dist/core/evaluator/PatternDetector.js.map +1 -0
  169. package/dist/core/evaluator/SignalComputer.d.ts +116 -0
  170. package/dist/core/evaluator/SignalComputer.d.ts.map +1 -0
  171. package/dist/core/evaluator/SignalComputer.js +110 -0
  172. package/dist/core/evaluator/SignalComputer.js.map +1 -0
  173. package/dist/core/evaluator/calibration-math.d.ts +39 -0
  174. package/dist/core/evaluator/calibration-math.d.ts.map +1 -0
  175. package/dist/core/evaluator/calibration-math.js +42 -0
  176. package/dist/core/evaluator/calibration-math.js.map +1 -0
  177. package/dist/core/evaluator/internals.d.ts +36 -0
  178. package/dist/core/evaluator/internals.d.ts.map +1 -0
  179. package/dist/core/evaluator/internals.js +43 -0
  180. package/dist/core/evaluator/internals.js.map +1 -0
  181. package/dist/core/graph/Edge.d.ts +58 -0
  182. package/dist/core/graph/Edge.d.ts.map +1 -0
  183. package/dist/core/graph/Edge.js +1 -0
  184. package/dist/core/graph/EdgeEmitter.d.ts +68 -0
  185. package/dist/core/graph/EdgeEmitter.d.ts.map +1 -0
  186. package/dist/core/graph/EdgeEmitter.js +118 -0
  187. package/dist/core/graph/EdgeEmitter.js.map +1 -0
  188. package/dist/core/graph/EdgeStore.d.ts +116 -0
  189. package/dist/core/graph/EdgeStore.d.ts.map +1 -0
  190. package/dist/core/graph/EdgeStore.js +107 -0
  191. package/dist/core/graph/EdgeStore.js.map +1 -0
  192. package/dist/core/graph/GraphView.d.ts +157 -0
  193. package/dist/core/graph/GraphView.d.ts.map +1 -0
  194. package/dist/core/graph/GraphView.js +149 -0
  195. package/dist/core/graph/GraphView.js.map +1 -0
  196. package/dist/core/ids.d.ts +33 -0
  197. package/dist/core/ids.d.ts.map +1 -0
  198. package/dist/core/ids.js +11 -0
  199. package/dist/core/ids.js.map +1 -0
  200. package/dist/core/reasoning/OutcomeRecorder.d.ts +88 -0
  201. package/dist/core/reasoning/OutcomeRecorder.d.ts.map +1 -0
  202. package/dist/core/reasoning/OutcomeRecorder.js +51 -0
  203. package/dist/core/reasoning/OutcomeRecorder.js.map +1 -0
  204. package/dist/core/reasoning/strategies/SequentialStrategy.d.ts +54 -0
  205. package/dist/core/reasoning/strategies/SequentialStrategy.d.ts.map +1 -0
  206. package/dist/core/reasoning/strategies/SequentialStrategy.js +22 -0
  207. package/dist/core/reasoning/strategies/SequentialStrategy.js.map +1 -0
  208. package/dist/core/reasoning/strategies/StrategyFactory.d.ts +25 -0
  209. package/dist/core/reasoning/strategies/StrategyFactory.d.ts.map +1 -0
  210. package/dist/core/reasoning/strategies/StrategyFactory.js +16 -0
  211. package/dist/core/reasoning/strategies/StrategyFactory.js.map +1 -0
  212. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts +58 -0
  213. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.d.ts.map +1 -0
  214. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js +103 -0
  215. package/dist/core/reasoning/strategies/TreeOfThoughtStrategy.js.map +1 -0
  216. package/dist/core/reasoning/strategies/plateau.d.ts +18 -0
  217. package/dist/core/reasoning/strategies/plateau.d.ts.map +1 -0
  218. package/dist/core/reasoning/strategies/plateau.js +12 -0
  219. package/dist/core/reasoning/strategies/plateau.js.map +1 -0
  220. package/dist/core/reasoning/strategies/totScoring.d.ts +91 -0
  221. package/dist/core/reasoning/strategies/totScoring.d.ts.map +1 -0
  222. package/dist/core/reasoning/strategies/totScoring.js +88 -0
  223. package/dist/core/reasoning/strategies/totScoring.js.map +1 -0
  224. package/dist/core/reasoning.d.ts +179 -0
  225. package/dist/core/reasoning.d.ts.map +1 -0
  226. package/dist/core/reasoning.js +1 -0
  227. package/dist/core/step.d.ts +50 -0
  228. package/dist/core/step.d.ts.map +1 -0
  229. package/dist/core/step.js +1 -0
  230. package/dist/core/thought.d.ts +113 -0
  231. package/dist/core/thought.d.ts.map +1 -0
  232. package/dist/core/thought.js +1 -0
  233. package/dist/core/tools/InMemorySuspensionStore.d.ts +66 -0
  234. package/dist/core/tools/InMemorySuspensionStore.d.ts.map +1 -0
  235. package/dist/core/tools/InMemorySuspensionStore.js +121 -0
  236. package/dist/core/tools/InMemorySuspensionStore.js.map +1 -0
  237. package/dist/di/Container.d.ts +253 -0
  238. package/dist/di/Container.d.ts.map +1 -0
  239. package/dist/di/Container.js +111 -0
  240. package/dist/di/Container.js.map +1 -0
  241. package/dist/di/ServiceRegistry.d.ts +50 -0
  242. package/dist/di/ServiceRegistry.d.ts.map +1 -0
  243. package/dist/di/ServiceRegistry.js +1 -0
  244. package/dist/errors.d.ts +663 -0
  245. package/dist/errors.d.ts.map +1 -0
  246. package/dist/errors.js +282 -0
  247. package/dist/errors.js.map +1 -0
  248. package/dist/health/HealthChecker.d.ts +73 -0
  249. package/dist/health/HealthChecker.d.ts.map +1 -0
  250. package/dist/health/HealthChecker.js +70 -0
  251. package/dist/health/HealthChecker.js.map +1 -0
  252. package/dist/lib.d.ts +273 -0
  253. package/dist/lib.d.ts.map +1 -0
  254. package/dist/lib.js +409 -0
  255. package/dist/lib.js.map +1 -0
  256. package/dist/logger/NullLogger.d.ts +154 -0
  257. package/dist/logger/NullLogger.d.ts.map +1 -0
  258. package/dist/logger/NullLogger.js +24 -0
  259. package/dist/logger/NullLogger.js.map +1 -0
  260. package/dist/logger/StructuredLogger.d.ts +327 -0
  261. package/dist/logger/StructuredLogger.d.ts.map +1 -0
  262. package/dist/logger/StructuredLogger.js +72 -0
  263. package/dist/logger/StructuredLogger.js.map +1 -0
  264. package/dist/metrics/metrics.impl.d.ts +252 -0
  265. package/dist/metrics/metrics.impl.d.ts.map +1 -0
  266. package/dist/metrics/metrics.impl.js +197 -0
  267. package/dist/metrics/metrics.impl.js.map +1 -0
  268. package/dist/persistence/FileLegacyImport.d.ts +2 -0
  269. package/dist/persistence/FileLegacyImport.d.ts.map +1 -0
  270. package/dist/persistence/FileLegacyImport.js +183 -0
  271. package/dist/persistence/FileLegacyImport.js.map +1 -0
  272. package/dist/persistence/FilePersistence.d.ts +53 -0
  273. package/dist/persistence/FilePersistence.d.ts.map +1 -0
  274. package/dist/persistence/FilePersistence.js +312 -0
  275. package/dist/persistence/FilePersistence.js.map +1 -0
  276. package/dist/persistence/FileSnapshotTypes.d.ts +29 -0
  277. package/dist/persistence/FileSnapshotTypes.d.ts.map +1 -0
  278. package/dist/persistence/FileSnapshotTypes.js +1 -0
  279. package/dist/persistence/FileSnapshotV2.d.ts +377 -0
  280. package/dist/persistence/FileSnapshotV2.d.ts.map +1 -0
  281. package/dist/persistence/FileSnapshotV2.js +124 -0
  282. package/dist/persistence/FileSnapshotV2.js.map +1 -0
  283. package/dist/persistence/FileSnapshotValidation.d.ts +15 -0
  284. package/dist/persistence/FileSnapshotValidation.d.ts.map +1 -0
  285. package/dist/persistence/FileSnapshotValidation.js +64 -0
  286. package/dist/persistence/FileSnapshotValidation.js.map +1 -0
  287. package/dist/persistence/FileWriter.d.ts +30 -0
  288. package/dist/persistence/FileWriter.d.ts.map +1 -0
  289. package/dist/persistence/FileWriter.js +155 -0
  290. package/dist/persistence/FileWriter.js.map +1 -0
  291. package/dist/persistence/MemoryPersistence.d.ts +45 -0
  292. package/dist/persistence/MemoryPersistence.d.ts.map +1 -0
  293. package/dist/persistence/MemoryPersistence.js +180 -0
  294. package/dist/persistence/MemoryPersistence.js.map +1 -0
  295. package/dist/persistence/PersistenceCodec.d.ts +7 -0
  296. package/dist/persistence/PersistenceCodec.d.ts.map +1 -0
  297. package/dist/persistence/PersistenceCodec.js +97 -0
  298. package/dist/persistence/PersistenceCodec.js.map +1 -0
  299. package/dist/persistence/PersistenceErrors.d.ts +23 -0
  300. package/dist/persistence/PersistenceErrors.d.ts.map +1 -0
  301. package/dist/persistence/PersistenceErrors.js +26 -0
  302. package/dist/persistence/PersistenceErrors.js.map +1 -0
  303. package/dist/persistence/PersistenceFactory.d.ts +21 -0
  304. package/dist/persistence/PersistenceFactory.d.ts.map +1 -0
  305. package/dist/persistence/PersistenceFactory.js +28 -0
  306. package/dist/persistence/PersistenceFactory.js.map +1 -0
  307. package/dist/persistence/PersistenceScope.d.ts +42 -0
  308. package/dist/persistence/PersistenceScope.d.ts.map +1 -0
  309. package/dist/persistence/PersistenceScope.js +93 -0
  310. package/dist/persistence/PersistenceScope.js.map +1 -0
  311. package/dist/persistence/SessionScopedPersistence.d.ts +4 -0
  312. package/dist/persistence/SessionScopedPersistence.d.ts.map +1 -0
  313. package/dist/persistence/SessionScopedPersistence.js +9 -0
  314. package/dist/persistence/SessionScopedPersistence.js.map +1 -0
  315. package/dist/persistence/SqliteDriver.d.ts +22 -0
  316. package/dist/persistence/SqliteDriver.d.ts.map +1 -0
  317. package/dist/persistence/SqliteDriver.js +29 -0
  318. package/dist/persistence/SqliteDriver.js.map +1 -0
  319. package/dist/persistence/SqliteLegacyImport.d.ts +14 -0
  320. package/dist/persistence/SqliteLegacyImport.d.ts.map +1 -0
  321. package/dist/persistence/SqliteLegacyImport.js +136 -0
  322. package/dist/persistence/SqliteLegacyImport.js.map +1 -0
  323. package/dist/persistence/SqliteLegacySchema.d.ts +15 -0
  324. package/dist/persistence/SqliteLegacySchema.d.ts.map +1 -0
  325. package/dist/persistence/SqliteLegacySchema.js +72 -0
  326. package/dist/persistence/SqliteLegacySchema.js.map +1 -0
  327. package/dist/persistence/SqlitePayload.d.ts +11 -0
  328. package/dist/persistence/SqlitePayload.d.ts.map +1 -0
  329. package/dist/persistence/SqlitePayload.js +86 -0
  330. package/dist/persistence/SqlitePayload.js.map +1 -0
  331. package/dist/persistence/SqlitePersistence.d.ts +49 -0
  332. package/dist/persistence/SqlitePersistence.d.ts.map +1 -0
  333. package/dist/persistence/SqlitePersistence.js +248 -0
  334. package/dist/persistence/SqlitePersistence.js.map +1 -0
  335. package/dist/persistence/SqliteSchemaV2.d.ts +14 -0
  336. package/dist/persistence/SqliteSchemaV2.d.ts.map +1 -0
  337. package/dist/persistence/SqliteSchemaV2.js +129 -0
  338. package/dist/persistence/SqliteSchemaV2.js.map +1 -0
  339. package/dist/persistence/SqliteSnapshotWriter.d.ts +17 -0
  340. package/dist/persistence/SqliteSnapshotWriter.d.ts.map +1 -0
  341. package/dist/persistence/SqliteSnapshotWriter.js +30 -0
  342. package/dist/persistence/SqliteSnapshotWriter.js.map +1 -0
  343. package/dist/pool/ConnectionPool.d.ts +203 -0
  344. package/dist/pool/ConnectionPool.d.ts.map +1 -0
  345. package/dist/pool/ConnectionPool.js +303 -0
  346. package/dist/pool/ConnectionPool.js.map +1 -0
  347. package/dist/pool/IConnectionPool.d.ts +143 -0
  348. package/dist/pool/IConnectionPool.d.ts.map +1 -0
  349. package/dist/pool/IConnectionPool.js +1 -0
  350. package/dist/pool/PoolErrors.d.ts +11 -0
  351. package/dist/pool/PoolErrors.d.ts.map +1 -0
  352. package/dist/pool/PoolErrors.js +16 -0
  353. package/dist/pool/PoolErrors.js.map +1 -0
  354. package/dist/registry/BaseRegistry.d.ts +219 -0
  355. package/dist/registry/BaseRegistry.d.ts.map +1 -0
  356. package/dist/registry/BaseRegistry.js +215 -0
  357. package/dist/registry/BaseRegistry.js.map +1 -0
  358. package/dist/registry/SkillRegistry.d.ts +67 -0
  359. package/dist/registry/SkillRegistry.d.ts.map +1 -0
  360. package/dist/registry/SkillRegistry.js +87 -0
  361. package/dist/registry/SkillRegistry.js.map +1 -0
  362. package/dist/registry/ToolRegistry.d.ts +70 -0
  363. package/dist/registry/ToolRegistry.d.ts.map +1 -0
  364. package/dist/registry/ToolRegistry.js +96 -0
  365. package/dist/registry/ToolRegistry.js.map +1 -0
  366. package/dist/sanitize.d.ts +164 -0
  367. package/dist/sanitize.d.ts.map +1 -0
  368. package/dist/sanitize.js +100 -0
  369. package/dist/sanitize.js.map +1 -0
  370. package/dist/schema.d.ts +562 -0
  371. package/dist/schema.d.ts.map +1 -0
  372. package/dist/schema.js +251 -0
  373. package/dist/schema.js.map +1 -0
  374. package/dist/transport/BaseTransport.d.ts +166 -0
  375. package/dist/transport/BaseTransport.d.ts.map +1 -0
  376. package/dist/transport/BaseTransport.js +199 -0
  377. package/dist/transport/BaseTransport.js.map +1 -0
  378. package/dist/transport/HttpHelpers.d.ts +53 -0
  379. package/dist/transport/HttpHelpers.d.ts.map +1 -0
  380. package/dist/transport/HttpHelpers.js +44 -0
  381. package/dist/transport/HttpHelpers.js.map +1 -0
  382. package/dist/transport/HttpRequestLifecycle.d.ts +37 -0
  383. package/dist/transport/HttpRequestLifecycle.d.ts.map +1 -0
  384. package/dist/transport/HttpRequestLifecycle.js +87 -0
  385. package/dist/transport/HttpRequestLifecycle.js.map +1 -0
  386. package/dist/transport/HttpTransport.d.ts +140 -0
  387. package/dist/transport/HttpTransport.d.ts.map +1 -0
  388. package/dist/transport/HttpTransport.js +245 -0
  389. package/dist/transport/HttpTransport.js.map +1 -0
  390. package/dist/transport/SseTransport.d.ts +149 -0
  391. package/dist/transport/SseTransport.d.ts.map +1 -0
  392. package/dist/transport/SseTransport.js +470 -0
  393. package/dist/transport/SseTransport.js.map +1 -0
  394. package/dist/transport/StreamableHttpTransport.d.ts +225 -0
  395. package/dist/transport/StreamableHttpTransport.d.ts.map +1 -0
  396. package/dist/transport/StreamableHttpTransport.js +449 -0
  397. package/dist/transport/StreamableHttpTransport.js.map +1 -0
  398. package/dist/types/disposable.d.ts +22 -0
  399. package/dist/types/disposable.d.ts.map +1 -0
  400. package/dist/types/disposable.js +1 -0
  401. package/dist/types/server-config.d.ts +32 -0
  402. package/dist/types/server-config.d.ts.map +1 -0
  403. package/dist/types/server-config.js +1 -0
  404. package/dist/types/skill.d.ts +74 -0
  405. package/dist/types/skill.d.ts.map +1 -0
  406. package/dist/types/skill.js +1 -0
  407. package/dist/types/tool.d.ts +78 -0
  408. package/dist/types/tool.d.ts.map +1 -0
  409. package/dist/types/tool.js +1 -0
  410. package/dist/utils.d.ts +27 -0
  411. package/dist/utils.d.ts.map +1 -0
  412. package/dist/utils.js +6 -0
  413. package/dist/utils.js.map +1 -0
  414. package/dist/watchers/SkillWatcher.d.ts +25 -0
  415. package/dist/watchers/SkillWatcher.d.ts.map +1 -0
  416. package/dist/watchers/SkillWatcher.js +96 -0
  417. package/dist/watchers/SkillWatcher.js.map +1 -0
  418. package/dist/watchers/ToolWatcher.d.ts +24 -0
  419. package/dist/watchers/ToolWatcher.d.ts.map +1 -0
  420. package/dist/watchers/ToolWatcher.js +92 -0
  421. package/dist/watchers/ToolWatcher.js.map +1 -0
  422. package/package.json +106 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry/BaseRegistry.js","sources":["../../src/registry/BaseRegistry.ts"],"sourcesContent":["/**\n * Base registry providing shared CRUD, caching, and discovery logic.\n *\n * This abstract generic class extracts the common patterns from `ToolRegistry`\n * and `SkillRegistry` into a single reusable base. Subclasses only need to\n * implement item-specific parsing, file filtering, and error construction.\n *\n * @template T - The registry item type (must have a `name` property)\n * @module registry\n */\n\nimport { existsSync } from 'node:fs';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport { DiscoveryCache } from '../cache/DiscoveryCache.js';\nimport { NullLogger } from '../logger/NullLogger.js';\nimport type { Logger } from '../logger/StructuredLogger.js';\nimport { getErrorMessage } from '../errors.js';\n\n/**\n * Configuration options for creating a `BaseRegistry` instance.\n */\nexport interface BaseRegistryOptions {\n\t/** Optional logger for diagnostics. */\n\tlogger?: Logger;\n\n\t/** Optional cache for lookups. */\n\tcache?: DiscoveryCache<{ name: string }>;\n\n\t/**\n\t * Directory paths to search for items.\n\t */\n\tsearchDirs?: string[];\n\n\t/**\n\t * Enable lazy discovery (discover on first access instead of startup).\n\t * @default false\n\t */\n\tlazyDiscovery?: boolean;\n}\n\n/**\n * Abstract base registry for managing named items with discovery and caching.\n *\n * Provides shared CRUD operations, filesystem discovery with deduplication,\n * and optional LRU caching. Subclasses implement item-specific parsing logic\n * and error construction.\n *\n * @template T - The registry item type (must have a `name` property)\n */\nexport abstract class BaseRegistry<T extends { name: string }> {\n\t/** Internal storage for items indexed by name. */\n\tprotected _items: Map<string, T>;\n\tprivate _manualItems: Map<string, T>;\n\tprivate _discoveredItemsByPath: Map<string, T>;\n\n\t/** Logger for diagnostics. */\n\tprotected _logger: Logger;\n\n\t/** Optional cache for lookups. */\n\tprotected _cache: DiscoveryCache<T>;\n\n\t/** Directory paths to search for items. */\n\tprotected _searchDirs: string[];\n\n\t/** Whether discovery has been performed. */\n\tprotected _discovered: boolean = false;\n\n\t/** Promise for in-progress discovery (null if not in progress). */\n\tprotected _discoveryPromise: Promise<number> | null = null;\n\tprivate _refreshRequested = false;\n\n\t/** File extensions to match during discovery. */\n\tprotected abstract readonly _fileExtensions: string[];\n\n\t/**\n\t * Creates an error for invalid item data.\n\t * @param reason - The reason for the validation failure\n\t */\n\tprotected abstract _createInvalidError(reason: string): Error;\n\n\t/**\n\t * Creates an error for duplicate items.\n\t * @param name - The name of the duplicate item\n\t */\n\tprotected abstract _createDuplicateError(name: string): Error;\n\n\t/**\n\t * Creates an error for items not found.\n\t * @param name - The name of the missing item\n\t * @param action - The action that was attempted\n\t */\n\tprotected abstract _createNotFoundError(name: string, action: string): Error;\n\n\t/**\n\t * Parses frontmatter content into a partial item.\n\t * @param content - The file content to parse\n\t * @returns A partial item, with an `_error` property if parsing failed\n\t */\n\tprotected abstract _parseFrontmatter(content: string): Partial<T> & { _error?: string };\n\n\t/**\n\t * Determines whether a file should be skipped during discovery.\n\t * @param fileName - The name of the file to check\n\t * @returns true if the file should be skipped\n\t */\n\tprotected abstract _shouldSkipFile(fileName: string): boolean;\n\n\t/**\n\t * Constructs a complete item from parsed frontmatter data.\n\t * Returns null if the parsed data is insufficient.\n\t * @param parsed - The parsed frontmatter data\n\t * @returns A complete item, or null if data is insufficient\n\t */\n\tprotected abstract _buildItem(parsed: Partial<T>): T | null;\n\n\t/**\n\t * The entity name used in log messages (e.g., 'tool', 'skill').\n\t */\n\tprotected abstract readonly _entityName: string;\n\n\tconstructor(options: BaseRegistryOptions) {\n\t\tthis._items = new Map();\n\t\tthis._manualItems = new Map();\n\t\tthis._discoveredItemsByPath = new Map();\n\t\tthis._logger = (options.logger ?? new NullLogger()) as Logger;\n\t\tthis._cache = (options.cache ||\n\t\t\tnew DiscoveryCache<T>({ maxSize: 50, ttl: 300000 })) as DiscoveryCache<T>;\n\t\tthis._searchDirs = (options.searchDirs ?? []) as string[];\n\t}\n\n\t/**\n\t * Internal logging method.\n\t * @param message - The message to log\n\t * @param meta - Optional metadata\n\t */\n\tprotected log(message: string, meta?: Record<string, unknown>): void {\n\t\tthis._logger.info(message, meta);\n\t}\n\n\t/**\n\t * Adds an item to the registry.\n\t *\n\t * @param item - The item to add\n\t * @throws If item already exists or name is invalid\n\t */\n\tpublic add(item: T): void {\n\t\tif (!item.name) {\n\t\t\tthrow this._createInvalidError(`${this._entityName} must have a valid name`);\n\t\t}\n\t\tif (this._items.has(item.name)) {\n\t\t\tthrow this._createDuplicateError(item.name);\n\t\t}\n\t\tthis._items.set(item.name, item);\n\t\tthis._manualItems.set(item.name, item);\n\t\tthis.log(`Added ${this._entityName}: ${item.name}`, { [`${this._entityName}Name`]: item.name });\n\t\t// Invalidate cache when adding a new item\n\t\tthis._cache?.invalidate('all');\n\t}\n\n\t/**\n\t * Removes an item from the registry.\n\t *\n\t * @param name - The name of the item to remove\n\t * @throws If item not found\n\t */\n\tpublic remove(name: string): void {\n\t\tif (!this._items.has(name)) {\n\t\t\tthrow this._createNotFoundError(name, 'remove');\n\t\t}\n\t\tthis._items.delete(name);\n\t\tthis._manualItems.delete(name);\n\t\tfor (const [filePath, item] of this._discoveredItemsByPath) {\n\t\t\tif (item.name === name) this._discoveredItemsByPath.delete(filePath);\n\t\t}\n\t\tthis.log(`Removed ${this._entityName}: ${name}`, { [`${this._entityName}Name`]: name });\n\t\t// Invalidate cache when removing an item\n\t\tthis._cache?.invalidate('all');\n\t\tthis._cache?.invalidate(name);\n\t}\n\n\t/**\n\t * Updates an existing item with partial data.\n\t *\n\t * @param name - The name of the item to update\n\t * @param updates - Partial item data with fields to update\n\t * @throws If item not found\n\t */\n\tpublic update(name: string, updates: Partial<T>): void {\n\t\tif (!this._items.has(name)) {\n\t\t\tthrow this._createNotFoundError(name, 'update');\n\t\t}\n\t\tconst existing = this._items.get(name)!;\n\t\tconst updated = { ...existing, ...updates };\n\t\tthis._items.set(name, updated);\n\t\tif (this._manualItems.has(name)) this._manualItems.set(name, updated);\n\t\tfor (const [filePath, item] of this._discoveredItemsByPath) {\n\t\t\tif (item.name === name) this._discoveredItemsByPath.set(filePath, updated);\n\t\t}\n\t\tthis.log(`Updated ${this._entityName}: ${name}`, { [`${this._entityName}Name`]: name });\n\t\t// Invalidate cache when updating an item\n\t\tthis._cache?.invalidate('all');\n\t\tthis._cache?.invalidate(name);\n\t}\n\n\t/**\n\t * Gets an item by name.\n\t *\n\t * @param name - The name of the item to get\n\t * @returns The item if found, undefined otherwise\n\t */\n\tpublic get(name: string): T | undefined {\n\t\treturn this._items.get(name);\n\t}\n\n\t/**\n\t * Gets all items as an array.\n\t *\n\t * Uses cache if available for performance.\n\t *\n\t * @returns An array of all registered items\n\t */\n\tpublic getAll(): T[] {\n\t\t// Check cache first\n\t\tif (this._cache) {\n\t\t\tconst cached = this._cache.get('all');\n\t\t\tif (cached) {\n\t\t\t\treturn cached;\n\t\t\t}\n\t\t}\n\t\t// Get from storage\n\t\tconst items = Array.from(this._items.values());\n\t\t// Cache the result\n\t\tthis._cache?.set('all', items);\n\t\treturn items;\n\t}\n\n\t/**\n\t * Checks if an item exists in the registry.\n\t *\n\t * @param name - The name of the item to check\n\t * @returns true if the item exists, false otherwise\n\t */\n\tpublic has(name: string): boolean {\n\t\treturn this._items.has(name);\n\t}\n\n\t/**\n\t * Gets all item names as an array.\n\t *\n\t * @returns An array of item names\n\t */\n\tpublic getNames(): string[] {\n\t\treturn Array.from(this._items.keys());\n\t}\n\n\t/**\n\t * Clears all items from the registry.\n\t */\n\tpublic clear(): void {\n\t\tthis._items.clear();\n\t\tthis._manualItems.clear();\n\t\tthis._discoveredItemsByPath.clear();\n\t\tthis.log(`Cleared all ${this._entityName}s`);\n\t\t// Invalidate cache when clearing all items\n\t\tthis._cache?.clear();\n\t}\n\n\t/**\n\t * Gets the number of items in the registry.\n\t *\n\t * @returns The count of registered items\n\t */\n\tpublic size(): number {\n\t\treturn this._items.size;\n\t}\n\n\t/**\n\t * Asynchronously discovers items from the configured directories.\n\t *\n\t * Multiple concurrent calls share the same discovery promise.\n\t * Subsequent calls return cached results if discovery has already completed.\n\t *\n\t * @returns A Promise resolving to the number of items discovered\n\t */\n\tpublic async discoverAsync(): Promise<number> {\n\t\tif (this._discoveryPromise) {\n\t\t\treturn this._discoveryPromise;\n\t\t}\n\n\t\tif (this._discovered) {\n\t\t\tconst cached = this._cache.get('all');\n\t\t\treturn cached?.length ?? 0;\n\t\t}\n\n\t\treturn this._beginDiscovery();\n\t}\n\n\t/**\n\t * Re-scans configured directories and atomically reconciles discovered items.\n\t *\n\t * Calls made during an active scan share its promise and request at most one\n\t * follow-up pass, ensuring an event that arrives mid-scan is not lost.\n\t *\n\t * @returns A Promise resolving to the number of discovered filesystem items\n\t */\n\tpublic async refreshAsync(): Promise<number> {\n\t\tthis._refreshRequested = true;\n\t\treturn this._discoveryPromise ?? this._beginDiscovery();\n\t}\n\n\tprivate _beginDiscovery(): Promise<number> {\n\t\tconst operation = this._runDiscoveryLoop();\n\t\tthis._discoveryPromise = operation;\n\t\tconst clearOperation = (): void => {\n\t\t\tif (this._discoveryPromise === operation) this._discoveryPromise = null;\n\t\t};\n\t\toperation.then(clearOperation, clearOperation);\n\t\treturn operation;\n\t}\n\n\tprivate async _runDiscoveryLoop(): Promise<number> {\n\t\tthis._refreshRequested = false;\n\t\tlet count = await this._performDiscovery();\n\t\twhile (this._refreshRequested) {\n\t\t\tthis._refreshRequested = false;\n\t\t\tcount = await this._performDiscovery();\n\t\t}\n\t\treturn count;\n\t}\n\n\t/**\n\t * Performs the actual discovery operation.\n\t *\n\t * Scans configured directories for item files, parses their frontmatter,\n\t * and adds valid items to the registry.\n\t *\n\t * @returns A Promise resolving to the number of items discovered\n\t */\n\tprotected async _performDiscovery(): Promise<number> {\n\t\tconst discoveredItems = new Map<string, T>();\n\t\tconst claimedNames = new Set(this._manualItems.keys());\n\n\t\tfor (const dir of this._searchDirs) {\n\t\t\ttry {\n\t\t\t\tif (!existsSync(dir)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tif (this._shouldSkipFile(entry.name)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (entry.isFile() && this._fileExtensions.some((ext) => entry.name.endsWith(ext))) {\n\t\t\t\t\t\tconst filePath = join(dir, entry.name);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst content = await readFile(filePath, 'utf-8');\n\t\t\t\t\t\t\tconst parsed = this._parseFrontmatter(content);\n\t\t\t\t\t\t\tif (parsed._error) {\n\t\t\t\t\t\t\t\tthis._retainLastKnownGood(filePath, parsed._error, discoveredItems, claimedNames);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (parsed.name) {\n\t\t\t\t\t\t\t\tconst item = this._buildItem(parsed);\n\t\t\t\t\t\t\t\tif (item && !claimedNames.has(item.name)) {\n\t\t\t\t\t\t\t\t\tdiscoveredItems.set(filePath, item);\n\t\t\t\t\t\t\t\t\tclaimedNames.add(item.name);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (readError) {\n\t\t\t\t\t\t\tthis._retainLastKnownGood(\n\t\t\t\t\t\t\t\tfilePath,\n\t\t\t\t\t\t\t\tgetErrorMessage(readError),\n\t\t\t\t\t\t\t\tdiscoveredItems,\n\t\t\t\t\t\t\t\tclaimedNames\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis._logger.warn(`Failed to scan ${this._entityName} directory`, {\n\t\t\t\t\tdirectory: dir,\n\t\t\t\t\terror: getErrorMessage(error),\n\t\t\t\t});\n\t\t\t\tthis._retainDirectory(dir, discoveredItems, claimedNames);\n\t\t\t}\n\t\t}\n\n\t\tthis._discoveredItemsByPath = discoveredItems;\n\t\tthis._items = new Map(this._manualItems);\n\t\tfor (const item of discoveredItems.values()) {\n\t\t\tif (!this._items.has(item.name)) this._items.set(item.name, item);\n\t\t}\n\t\tthis._discovered = true;\n\t\tthis._cache.clear();\n\t\tthis._cache.set('all', Array.from(this._items.values()));\n\t\tthis.log(`Discovery complete: found ${discoveredItems.size} ${this._entityName}s`, {\n\t\t\tdiscoveredCount: discoveredItems.size,\n\t\t});\n\t\treturn discoveredItems.size;\n\t}\n\n\tprivate _retainLastKnownGood(\n\t\tfilePath: string,\n\t\treason: string,\n\t\tdiscoveredItems: Map<string, T>,\n\t\tclaimedNames: Set<string>\n\t): void {\n\t\tconst previous = this._discoveredItemsByPath.get(filePath);\n\t\tif (previous && !claimedNames.has(previous.name)) {\n\t\t\tdiscoveredItems.set(filePath, previous);\n\t\t\tclaimedNames.add(previous.name);\n\t\t}\n\t\tthis._logger.warn(`Invalid ${this._entityName} discovery file`, {\n\t\t\tfilePath,\n\t\t\treason,\n\t\t\tretainedLastKnownGood: previous !== undefined,\n\t\t});\n\t}\n\n\tprivate _retainDirectory(\n\t\tdirectory: string,\n\t\tdiscoveredItems: Map<string, T>,\n\t\tclaimedNames: Set<string>\n\t): void {\n\t\tfor (const [filePath, item] of this._discoveredItemsByPath) {\n\t\t\tif (dirname(filePath) === directory && !claimedNames.has(item.name)) {\n\t\t\t\tdiscoveredItems.set(filePath, item);\n\t\t\t\tclaimedNames.add(item.name);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Parses YAML frontmatter from file content.\n\t *\n\t * This is a shared utility for subclasses that parse YAML frontmatter.\n\t *\n\t * @param content - The file content to parse\n\t * @returns The parsed YAML object, or null if no frontmatter found\n\t */\n\tprotected _extractFrontmatter(content: string): Record<string, unknown> | null {\n\t\tconst match = content.match(/^---\\n([\\s\\S]+?)\\n---/);\n\t\tif (!match) {\n\t\t\treturn null;\n\t\t}\n\t\treturn parseYaml(match[1]!) as Record<string, unknown>;\n\t}\n\n\t/**\n\t * Sets items from an external source.\n\t *\n\t * Clears existing items and adds new ones from the provided array.\n\t *\n\t * @param items - Array of items from an external source\n\t */\n\tpublic setAll(items: T[]): void {\n\t\tthis.clear();\n\t\tfor (const item of items) {\n\t\t\ttry {\n\t\t\t\tthis.add(item);\n\t\t\t} catch (error) {\n\t\t\t\tthis.log(`Error adding ${this._entityName} '${item.name}':`, {\n\t\t\t\t\t[`${this._entityName}Name`]: item.name,\n\t\t\t\t\terror: getErrorMessage(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis.log(`Set ${items.length} ${this._entityName}s from external source`, {\n\t\t\t[`${this._entityName}Count`]: items.length,\n\t\t});\n\t}\n}\n"],"names":["BaseRegistry","options","Map","NullLogger","DiscoveryCache","message","meta","item","name","filePath","updates","existing","updated","cached","items","Array","operation","clearOperation","count","discoveredItems","claimedNames","Set","dir","existsSync","entries","readdir","entry","ext","join","content","readFile","parsed","readError","getErrorMessage","error","reason","previous","undefined","directory","dirname","match","parseYaml"],"mappings":";;;;;;;AAmDO,MAAeA;IAEX,OAAuB;IACzB,aAA6B;IAC7B,uBAAuC;IAGrC,QAAgB;IAGhB,OAA0B;IAG1B,YAAsB;IAGtB,cAAuB,MAAM;IAG7B,oBAA4C,KAAK;IACnD,oBAAoB,MAAM;IAmDlC,YAAYC,OAA4B,CAAE;QACzC,IAAI,CAAC,MAAM,GAAG,IAAIC;QAClB,IAAI,CAAC,YAAY,GAAG,IAAIA;QACxB,IAAI,CAAC,sBAAsB,GAAG,IAAIA;QAClC,IAAI,CAAC,OAAO,GAAID,QAAQ,MAAM,IAAI,IAAIE;QACtC,IAAI,CAAC,MAAM,GAAIF,QAAQ,KAAK,IAC3B,IAAIG,eAAkB;YAAE,SAAS;YAAI,KAAK;QAAO;QAClD,IAAI,CAAC,WAAW,GAAIH,QAAQ,UAAU,IAAI,EAAE;IAC7C;IAOU,IAAII,OAAe,EAAEC,IAA8B,EAAQ;QACpE,IAAI,CAAC,OAAO,CAAC,IAAI,CAACD,SAASC;IAC5B;IAQO,IAAIC,IAAO,EAAQ;QACzB,IAAI,CAACA,KAAK,IAAI,EACb,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC;QAE5E,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAACA,KAAK,IAAI,GAC5B,MAAM,IAAI,CAAC,qBAAqB,CAACA,KAAK,IAAI;QAE3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAACA,KAAK,IAAI,EAAEA;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAACA,KAAK,IAAI,EAAEA;QACjC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAEA,KAAK,IAAI,EAAE,EAAE;YAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAEA,KAAK,IAAI;QAAC;QAE7F,IAAI,CAAC,MAAM,EAAE,WAAW;IACzB;IAQO,OAAOC,IAAY,EAAQ;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAACA,OACpB,MAAM,IAAI,CAAC,oBAAoB,CAACA,MAAM;QAEvC,IAAI,CAAC,MAAM,CAAC,MAAM,CAACA;QACnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAACA;QACzB,KAAK,MAAM,CAACC,UAAUF,KAAK,IAAI,IAAI,CAAC,sBAAsB,CACzD,IAAIA,KAAK,IAAI,KAAKC,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAACC;QAE5D,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAED,MAAM,EAAE;YAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAEA;QAAK;QAErF,IAAI,CAAC,MAAM,EAAE,WAAW;QACxB,IAAI,CAAC,MAAM,EAAE,WAAWA;IACzB;IASO,OAAOA,IAAY,EAAEE,OAAmB,EAAQ;QACtD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAACF,OACpB,MAAM,IAAI,CAAC,oBAAoB,CAACA,MAAM;QAEvC,MAAMG,WAAW,IAAI,CAAC,MAAM,CAAC,GAAG,CAACH;QACjC,MAAMI,UAAU;YAAE,GAAGD,QAAQ;YAAE,GAAGD,OAAO;QAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAACF,MAAMI;QACtB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAACJ,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAACA,MAAMI;QAC7D,KAAK,MAAM,CAACH,UAAUF,KAAK,IAAI,IAAI,CAAC,sBAAsB,CACzD,IAAIA,KAAK,IAAI,KAAKC,MAAM,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAACC,UAAUG;QAEnE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAEJ,MAAM,EAAE;YAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAEA;QAAK;QAErF,IAAI,CAAC,MAAM,EAAE,WAAW;QACxB,IAAI,CAAC,MAAM,EAAE,WAAWA;IACzB;IAQO,IAAIA,IAAY,EAAiB;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAACA;IACxB;IASO,SAAc;QAEpB,IAAI,IAAI,CAAC,MAAM,EAAE;YAChB,MAAMK,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAC/B,IAAIA,QACH,OAAOA;QAET;QAEA,MAAMC,QAAQC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;QAE3C,IAAI,CAAC,MAAM,EAAE,IAAI,OAAOD;QACxB,OAAOA;IACR;IAQO,IAAIN,IAAY,EAAW;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAACA;IACxB;IAOO,WAAqB;QAC3B,OAAOO,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;IACnC;IAKO,QAAc;QACpB,IAAI,CAAC,MAAM,CAAC,KAAK;QACjB,IAAI,CAAC,YAAY,CAAC,KAAK;QACvB,IAAI,CAAC,sBAAsB,CAAC,KAAK;QACjC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAE3C,IAAI,CAAC,MAAM,EAAE;IACd;IAOO,OAAe;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;IACxB;IAUA,MAAa,gBAAiC;QAC7C,IAAI,IAAI,CAAC,iBAAiB,EACzB,OAAO,IAAI,CAAC,iBAAiB;QAG9B,IAAI,IAAI,CAAC,WAAW,EAAE;YACrB,MAAMF,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAC/B,OAAOA,QAAQ,UAAU;QAC1B;QAEA,OAAO,IAAI,CAAC,eAAe;IAC5B;IAUA,MAAa,eAAgC;QAC5C,IAAI,CAAC,iBAAiB,GAAG;QACzB,OAAO,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,eAAe;IACtD;IAEQ,kBAAmC;QAC1C,MAAMG,YAAY,IAAI,CAAC,iBAAiB;QACxC,IAAI,CAAC,iBAAiB,GAAGA;QACzB,MAAMC,iBAAiB;YACtB,IAAI,IAAI,CAAC,iBAAiB,KAAKD,WAAW,IAAI,CAAC,iBAAiB,GAAG;QACpE;QACAA,UAAU,IAAI,CAACC,gBAAgBA;QAC/B,OAAOD;IACR;IAEA,MAAc,oBAAqC;QAClD,IAAI,CAAC,iBAAiB,GAAG;QACzB,IAAIE,QAAQ,MAAM,IAAI,CAAC,iBAAiB;QACxC,MAAO,IAAI,CAAC,iBAAiB,CAAE;YAC9B,IAAI,CAAC,iBAAiB,GAAG;YACzBA,QAAQ,MAAM,IAAI,CAAC,iBAAiB;QACrC;QACA,OAAOA;IACR;IAUA,MAAgB,oBAAqC;QACpD,MAAMC,kBAAkB,IAAIjB;QAC5B,MAAMkB,eAAe,IAAIC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI;QAEnD,KAAK,MAAMC,OAAO,IAAI,CAAC,WAAW,CACjC,IAAI;YACH,IAAI,CAACC,WAAWD,MACf;YAGD,MAAME,UAAU,MAAMC,QAAQH,KAAK;gBAAE,eAAe;YAAK;YACzD,KAAK,MAAMI,SAASF,QACnB,KAAI,IAAI,CAAC,eAAe,CAACE,MAAM,IAAI,GAInC;gBAAA,IAAIA,MAAM,MAAM,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAACC,MAAQD,MAAM,IAAI,CAAC,QAAQ,CAACC,OAAO;oBACnF,MAAMlB,WAAWmB,KAAKN,KAAKI,MAAM,IAAI;oBACrC,IAAI;wBACH,MAAMG,UAAU,MAAMC,SAASrB,UAAU;wBACzC,MAAMsB,SAAS,IAAI,CAAC,iBAAiB,CAACF;wBACtC,IAAIE,OAAO,MAAM,EAAE;4BAClB,IAAI,CAAC,oBAAoB,CAACtB,UAAUsB,OAAO,MAAM,EAAEZ,iBAAiBC;4BACpE;wBACD;wBACA,IAAIW,OAAO,IAAI,EAAE;4BAChB,MAAMxB,OAAO,IAAI,CAAC,UAAU,CAACwB;4BAC7B,IAAIxB,QAAQ,CAACa,aAAa,GAAG,CAACb,KAAK,IAAI,GAAG;gCACzCY,gBAAgB,GAAG,CAACV,UAAUF;gCAC9Ba,aAAa,GAAG,CAACb,KAAK,IAAI;4BAC3B;wBACD;oBACD,EAAE,OAAOyB,WAAW;wBACnB,IAAI,CAAC,oBAAoB,CACxBvB,UACAwB,gBAAgBD,YAChBb,iBACAC;oBAEF;gBACD;YAAA;QAEF,EAAE,OAAOc,OAAO;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;gBACjE,WAAWZ;gBACX,OAAOW,gBAAgBC;YACxB;YACA,IAAI,CAAC,gBAAgB,CAACZ,KAAKH,iBAAiBC;QAC7C;QAGD,IAAI,CAAC,sBAAsB,GAAGD;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAIjB,IAAI,IAAI,CAAC,YAAY;QACvC,KAAK,MAAMK,QAAQY,gBAAgB,MAAM,GACxC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAACZ,KAAK,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAACA,KAAK,IAAI,EAAEA;QAE7D,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK;QACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAOQ,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;QACpD,IAAI,CAAC,GAAG,CAAC,CAAC,0BAA0B,EAAEI,gBAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YAClF,iBAAiBA,gBAAgB,IAAI;QACtC;QACA,OAAOA,gBAAgB,IAAI;IAC5B;IAEQ,qBACPV,QAAgB,EAChB0B,MAAc,EACdhB,eAA+B,EAC/BC,YAAyB,EAClB;QACP,MAAMgB,WAAW,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC3B;QACjD,IAAI2B,YAAY,CAAChB,aAAa,GAAG,CAACgB,SAAS,IAAI,GAAG;YACjDjB,gBAAgB,GAAG,CAACV,UAAU2B;YAC9BhB,aAAa,GAAG,CAACgB,SAAS,IAAI;QAC/B;QACA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE;YAC/D3B;YACA0B;YACA,uBAAuBC,AAAaC,WAAbD;QACxB;IACD;IAEQ,iBACPE,SAAiB,EACjBnB,eAA+B,EAC/BC,YAAyB,EAClB;QACP,KAAK,MAAM,CAACX,UAAUF,KAAK,IAAI,IAAI,CAAC,sBAAsB,CACzD,IAAIgC,QAAQ9B,cAAc6B,aAAa,CAAClB,aAAa,GAAG,CAACb,KAAK,IAAI,GAAG;YACpEY,gBAAgB,GAAG,CAACV,UAAUF;YAC9Ba,aAAa,GAAG,CAACb,KAAK,IAAI;QAC3B;IAEF;IAUU,oBAAoBsB,OAAe,EAAkC;QAC9E,MAAMW,QAAQX,QAAQ,KAAK,CAAC;QAC5B,IAAI,CAACW,OACJ,OAAO;QAER,OAAOC,MAAUD,KAAK,CAAC,EAAE;IAC1B;IASO,OAAO1B,KAAU,EAAQ;QAC/B,IAAI,CAAC,KAAK;QACV,KAAK,MAAMP,QAAQO,MAClB,IAAI;YACH,IAAI,CAAC,GAAG,CAACP;QACV,EAAE,OAAO2B,OAAO;YACf,IAAI,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE3B,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE;gBAC5D,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAEA,KAAK,IAAI;gBACtC,OAAO0B,gBAAgBC;YACxB;QACD;QAED,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAEpB,MAAM,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,EAAE;YACzE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAEA,MAAM,MAAM;QAC3C;IACD;AACD"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Skill registry for managing and discovering Claude Code skills.
3
+ *
4
+ * This module provides the `SkillRegistry` class which manages skill registration,
5
+ * discovery from filesystem directories, and CRUD operations. Skills are higher-level
6
+ * workflows that coordinate multiple tools and operations.
7
+ *
8
+ * @module registry
9
+ */
10
+ import type { DiscoveryCache } from '../cache/DiscoveryCache.js';
11
+ import type { Logger } from '../logger/StructuredLogger.js';
12
+ import type { Skill } from '../types/skill.js';
13
+ import { BaseRegistry } from './BaseRegistry.js';
14
+ /**
15
+ * Configuration options for creating a `SkillRegistry` instance.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const options: SkillRegistryOptions = {
20
+ * logger: new StructuredLogger({ context: 'SkillRegistry' }),
21
+ * cache: new DiscoveryCache({ ttl: 300000, maxSize: 100 }),
22
+ * skillDirs: ['./custom-skills', '~/.claude/skills'],
23
+ * lazyDiscovery: true
24
+ * };
25
+ * ```
26
+ */
27
+ export interface SkillRegistryOptions {
28
+ /** Optional logger for diagnostics. */
29
+ logger?: Logger;
30
+ /** Optional cache for skill lookups. */
31
+ cache?: DiscoveryCache<Skill>;
32
+ /**
33
+ * Directory paths to search for skills.
34
+ * @default ['.claude/skills', '~/.claude/skills', '.agents/skills', '~/.agents/skills']
35
+ */
36
+ skillDirs?: string[];
37
+ /**
38
+ * Enable lazy discovery (discover on first access instead of startup).
39
+ * @default false
40
+ */
41
+ lazyDiscovery?: boolean;
42
+ }
43
+ /**
44
+ * Registry for managing Claude Code skill operations.
45
+ *
46
+ * Extends `BaseRegistry<Skill>` with skill-specific frontmatter parsing
47
+ * and backward-compatible aliases (`addSkill`, etc.).
48
+ */
49
+ export declare class SkillRegistry extends BaseRegistry<Skill> {
50
+ protected readonly _fileExtensions: string[];
51
+ protected readonly _entityName = "skill";
52
+ constructor(options?: SkillRegistryOptions);
53
+ protected _createInvalidError(reason: string): Error;
54
+ protected _createDuplicateError(name: string): Error;
55
+ protected _createNotFoundError(name: string, action: string): Error;
56
+ protected _shouldSkipFile(fileName: string): boolean;
57
+ protected _parseFrontmatter(content: string): Partial<Skill> & {
58
+ _error?: string;
59
+ };
60
+ protected _buildItem(parsed: Partial<Skill>): Skill | null;
61
+ addSkill(skill: Skill): void;
62
+ updateSkill(name: string, updates: Partial<Skill>): void;
63
+ hasSkill(name: string): boolean;
64
+ getSkill(name: string): Skill | undefined;
65
+ setSkills(skills: Skill[]): void;
66
+ }
67
+ //# sourceMappingURL=SkillRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillRegistry.d.ts","sourceRoot":"","sources":["../../src/registry/SkillRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,oBAAoB;IACpC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,wCAAwC;IACxC,KAAK,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IAE9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,YAAY,CAAC,KAAK,CAAC;IACrD,mBAA4B,eAAe,WAA4B;IACvE,mBAA4B,WAAW,WAAW;gBAEtC,OAAO,GAAE,oBAAyB;cAgB3B,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK;cAI1C,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;cAI1C,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK;cAMzD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;cAI1C,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;cA6BxE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI;IAc5D,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAI5B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAIxD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIzC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;CAGvC"}
@@ -0,0 +1,87 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ import { DuplicateSkillError, InvalidSkillError, SkillNotFoundError } from "../errors.js";
4
+ import { BaseRegistry } from "./BaseRegistry.js";
5
+ class SkillRegistry extends BaseRegistry {
6
+ _fileExtensions = [
7
+ '.md',
8
+ '.yml',
9
+ '.yaml'
10
+ ];
11
+ _entityName = 'skill';
12
+ constructor(options = {}){
13
+ super({
14
+ logger: options.logger,
15
+ cache: options.cache,
16
+ searchDirs: options.skillDirs ?? [
17
+ '.claude/skills',
18
+ join(homedir(), '.claude/skills'),
19
+ '.agents/skills',
20
+ join(homedir(), '.agents/skills')
21
+ ],
22
+ lazyDiscovery: options.lazyDiscovery
23
+ });
24
+ }
25
+ _createInvalidError(reason) {
26
+ return new InvalidSkillError(reason);
27
+ }
28
+ _createDuplicateError(name) {
29
+ return new DuplicateSkillError(name);
30
+ }
31
+ _createNotFoundError(name, action) {
32
+ return new SkillNotFoundError(name, action);
33
+ }
34
+ _shouldSkipFile(fileName) {
35
+ return '.DS_Store' === fileName;
36
+ }
37
+ _parseFrontmatter(content) {
38
+ const frontmatter = this._extractFrontmatter(content);
39
+ if (!frontmatter) return {};
40
+ try {
41
+ const result = {
42
+ name: 'string' == typeof frontmatter.name ? frontmatter.name : void 0,
43
+ description: 'string' == typeof frontmatter.description ? frontmatter.description : '',
44
+ user_invocable: true === frontmatter['user-invocable'],
45
+ allowed_tools: Array.isArray(frontmatter['allowed-tools']) ? frontmatter['allowed-tools'].map(String) : void 0
46
+ };
47
+ if (!result.name) return {
48
+ _error: 'Missing required field: name'
49
+ };
50
+ return result;
51
+ } catch (error) {
52
+ this.log('Error parsing YAML frontmatter:', {
53
+ error: error instanceof Error ? error.message : String(error)
54
+ });
55
+ return {
56
+ _error: 'YAML parse error'
57
+ };
58
+ }
59
+ }
60
+ _buildItem(parsed) {
61
+ if (!parsed.name) return null;
62
+ return {
63
+ name: parsed.name,
64
+ description: parsed.description || '',
65
+ user_invocable: parsed.user_invocable ?? false,
66
+ allowed_tools: parsed.allowed_tools
67
+ };
68
+ }
69
+ addSkill(skill) {
70
+ this.add(skill);
71
+ }
72
+ updateSkill(name, updates) {
73
+ this.update(name, updates);
74
+ }
75
+ hasSkill(name) {
76
+ return this.has(name);
77
+ }
78
+ getSkill(name) {
79
+ return this.get(name);
80
+ }
81
+ setSkills(skills) {
82
+ this.setAll(skills);
83
+ }
84
+ }
85
+ export { SkillRegistry };
86
+
87
+ //# sourceMappingURL=SkillRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry/SkillRegistry.js","sources":["../../src/registry/SkillRegistry.ts"],"sourcesContent":["/**\n * Skill registry for managing and discovering Claude Code skills.\n *\n * This module provides the `SkillRegistry` class which manages skill registration,\n * discovery from filesystem directories, and CRUD operations. Skills are higher-level\n * workflows that coordinate multiple tools and operations.\n *\n * @module registry\n */\n\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { DiscoveryCache } from '../cache/DiscoveryCache.js';\nimport { DuplicateSkillError, InvalidSkillError, SkillNotFoundError } from '../errors.js';\nimport type { Logger } from '../logger/StructuredLogger.js';\nimport type { Skill } from '../types/skill.js';\nimport { BaseRegistry } from './BaseRegistry.js';\n\n/**\n * Configuration options for creating a `SkillRegistry` instance.\n *\n * @example\n * ```typescript\n * const options: SkillRegistryOptions = {\n * logger: new StructuredLogger({ context: 'SkillRegistry' }),\n * cache: new DiscoveryCache({ ttl: 300000, maxSize: 100 }),\n * skillDirs: ['./custom-skills', '~/.claude/skills'],\n * lazyDiscovery: true\n * };\n * ```\n */\nexport interface SkillRegistryOptions {\n\t/** Optional logger for diagnostics. */\n\tlogger?: Logger;\n\n\t/** Optional cache for skill lookups. */\n\tcache?: DiscoveryCache<Skill>;\n\n\t/**\n\t * Directory paths to search for skills.\n\t * @default ['.claude/skills', '~/.claude/skills', '.agents/skills', '~/.agents/skills']\n\t */\n\tskillDirs?: string[];\n\n\t/**\n\t * Enable lazy discovery (discover on first access instead of startup).\n\t * @default false\n\t */\n\tlazyDiscovery?: boolean;\n}\n\n/**\n * Registry for managing Claude Code skill operations.\n *\n * Extends `BaseRegistry<Skill>` with skill-specific frontmatter parsing\n * and backward-compatible aliases (`addSkill`, etc.).\n */\nexport class SkillRegistry extends BaseRegistry<Skill> {\n\tprotected override readonly _fileExtensions = ['.md', '.yml', '.yaml'];\n\tprotected override readonly _entityName = 'skill';\n\n\tconstructor(options: SkillRegistryOptions = {}) {\n\t\tsuper({\n\t\t\tlogger: options.logger,\n\t\t\tcache: options.cache,\n\t\t\tsearchDirs: options.skillDirs ?? [\n\t\t\t\t'.claude/skills',\n\t\t\t\tjoin(homedir(), '.claude/skills'),\n\t\t\t\t'.agents/skills',\n\t\t\t\tjoin(homedir(), '.agents/skills'),\n\t\t\t],\n\t\t\tlazyDiscovery: options.lazyDiscovery,\n\t\t});\n\t}\n\n\t// --- Error factories ---\n\n\tprotected override _createInvalidError(reason: string): Error {\n\t\treturn new InvalidSkillError(reason);\n\t}\n\n\tprotected override _createDuplicateError(name: string): Error {\n\t\treturn new DuplicateSkillError(name);\n\t}\n\n\tprotected override _createNotFoundError(name: string, action: string): Error {\n\t\treturn new SkillNotFoundError(name, action);\n\t}\n\n\t// --- Discovery ---\n\n\tprotected override _shouldSkipFile(fileName: string): boolean {\n\t\treturn fileName === '.DS_Store';\n\t}\n\n\tprotected override _parseFrontmatter(content: string): Partial<Skill> & { _error?: string } {\n\t\tconst frontmatter = this._extractFrontmatter(content);\n\t\tif (!frontmatter) {\n\t\t\treturn {};\n\t\t}\n\n\t\ttry {\n\t\t\tconst result: Partial<Skill> = {\n\t\t\t\tname: typeof frontmatter.name === 'string' ? frontmatter.name : undefined,\n\t\t\t\tdescription: typeof frontmatter.description === 'string' ? frontmatter.description : '',\n\t\t\t\tuser_invocable: frontmatter['user-invocable'] === true,\n\t\t\t\tallowed_tools: Array.isArray(frontmatter['allowed-tools'])\n\t\t\t\t\t? frontmatter['allowed-tools'].map(String)\n\t\t\t\t\t: undefined,\n\t\t\t};\n\n\t\t\tif (!result.name) {\n\t\t\t\treturn { _error: 'Missing required field: name' };\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthis.log('Error parsing YAML frontmatter:', {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t\treturn { _error: 'YAML parse error' };\n\t\t}\n\t}\n\n\tprotected override _buildItem(parsed: Partial<Skill>): Skill | null {\n\t\tif (!parsed.name) {\n\t\t\treturn null;\n\t\t}\n\t\treturn {\n\t\t\tname: parsed.name,\n\t\t\tdescription: parsed.description || '',\n\t\t\tuser_invocable: parsed.user_invocable ?? false,\n\t\t\tallowed_tools: parsed.allowed_tools,\n\t\t};\n\t}\n\n\t// --- Backward-compatible aliases ---\n\n\tpublic addSkill(skill: Skill): void {\n\t\tthis.add(skill);\n\t}\n\n\tpublic updateSkill(name: string, updates: Partial<Skill>): void {\n\t\tthis.update(name, updates);\n\t}\n\n\tpublic hasSkill(name: string): boolean {\n\t\treturn this.has(name);\n\t}\n\n\tpublic getSkill(name: string): Skill | undefined {\n\t\treturn this.get(name);\n\t}\n\n\tpublic setSkills(skills: Skill[]): void {\n\t\tthis.setAll(skills);\n\t}\n}\n"],"names":["SkillRegistry","BaseRegistry","options","join","homedir","reason","InvalidSkillError","name","DuplicateSkillError","action","SkillNotFoundError","fileName","content","frontmatter","result","undefined","Array","String","error","Error","parsed","skill","updates","skills"],"mappings":";;;;AAyDO,MAAMA,sBAAsBC;IACN,kBAAkB;QAAC;QAAO;QAAQ;KAAQ,CAAC;IAC3C,cAAc,QAAQ;IAElD,YAAYC,UAAgC,CAAC,CAAC,CAAE;QAC/C,KAAK,CAAC;YACL,QAAQA,QAAQ,MAAM;YACtB,OAAOA,QAAQ,KAAK;YACpB,YAAYA,QAAQ,SAAS,IAAI;gBAChC;gBACAC,KAAKC,WAAW;gBAChB;gBACAD,KAAKC,WAAW;aAChB;YACD,eAAeF,QAAQ,aAAa;QACrC;IACD;IAImB,oBAAoBG,MAAc,EAAS;QAC7D,OAAO,IAAIC,kBAAkBD;IAC9B;IAEmB,sBAAsBE,IAAY,EAAS;QAC7D,OAAO,IAAIC,oBAAoBD;IAChC;IAEmB,qBAAqBA,IAAY,EAAEE,MAAc,EAAS;QAC5E,OAAO,IAAIC,mBAAmBH,MAAME;IACrC;IAImB,gBAAgBE,QAAgB,EAAW;QAC7D,OAAOA,AAAa,gBAAbA;IACR;IAEmB,kBAAkBC,OAAe,EAAwC;QAC3F,MAAMC,cAAc,IAAI,CAAC,mBAAmB,CAACD;QAC7C,IAAI,CAACC,aACJ,OAAO,CAAC;QAGT,IAAI;YACH,MAAMC,SAAyB;gBAC9B,MAAM,AAA4B,YAA5B,OAAOD,YAAY,IAAI,GAAgBA,YAAY,IAAI,GAAGE;gBAChE,aAAa,AAAmC,YAAnC,OAAOF,YAAY,WAAW,GAAgBA,YAAY,WAAW,GAAG;gBACrF,gBAAgBA,AAAkC,SAAlCA,WAAW,CAAC,iBAAiB;gBAC7C,eAAeG,MAAM,OAAO,CAACH,WAAW,CAAC,gBAAgB,IACtDA,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAACI,UACjCF;YACJ;YAEA,IAAI,CAACD,OAAO,IAAI,EACf,OAAO;gBAAE,QAAQ;YAA+B;YAGjD,OAAOA;QACR,EAAE,OAAOI,OAAO;YACf,IAAI,CAAC,GAAG,CAAC,mCAAmC;gBAC3C,OAAOA,iBAAiBC,QAAQD,MAAM,OAAO,GAAGD,OAAOC;YACxD;YACA,OAAO;gBAAE,QAAQ;YAAmB;QACrC;IACD;IAEmB,WAAWE,MAAsB,EAAgB;QACnE,IAAI,CAACA,OAAO,IAAI,EACf,OAAO;QAER,OAAO;YACN,MAAMA,OAAO,IAAI;YACjB,aAAaA,OAAO,WAAW,IAAI;YACnC,gBAAgBA,OAAO,cAAc,IAAI;YACzC,eAAeA,OAAO,aAAa;QACpC;IACD;IAIO,SAASC,KAAY,EAAQ;QACnC,IAAI,CAAC,GAAG,CAACA;IACV;IAEO,YAAYd,IAAY,EAAEe,OAAuB,EAAQ;QAC/D,IAAI,CAAC,MAAM,CAACf,MAAMe;IACnB;IAEO,SAASf,IAAY,EAAW;QACtC,OAAO,IAAI,CAAC,GAAG,CAACA;IACjB;IAEO,SAASA,IAAY,EAAqB;QAChD,OAAO,IAAI,CAAC,GAAG,CAACA;IACjB;IAEO,UAAUgB,MAAe,EAAQ;QACvC,IAAI,CAAC,MAAM,CAACA;IACb;AACD"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Tool registry for managing MCP tool CRUD operations.
3
+ *
4
+ * This module provides the `ToolRegistry` class which manages the registration,
5
+ * retrieval, update, and removal of MCP tools. It supports optional caching
6
+ * for improved performance, filesystem discovery, and integrates with the logging system.
7
+ *
8
+ * @module registry
9
+ */
10
+ import type { DiscoveryCache } from '../cache/DiscoveryCache.js';
11
+ import type { Logger } from '../logger/StructuredLogger.js';
12
+ import type { Tool } from '../types/tool.js';
13
+ import { BaseRegistry } from './BaseRegistry.js';
14
+ /**
15
+ * Configuration options for creating a `ToolRegistry` instance.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const options: ToolRegistryOptions = {
20
+ * logger: new StructuredLogger({ context: 'ToolRegistry' }),
21
+ * cache: new DiscoveryCache({ ttl: 300000, maxSize: 100 }),
22
+ * toolDirs: ['./custom-tools', '~/.claude/tools'],
23
+ * lazyDiscovery: true
24
+ * };
25
+ * ```
26
+ */
27
+ export interface ToolRegistryOptions {
28
+ /** Optional logger for diagnostics. */
29
+ logger?: Logger;
30
+ /** Optional cache for tool lookups. */
31
+ cache?: DiscoveryCache<Tool>;
32
+ /**
33
+ * Directory paths to search for tools.
34
+ * @default ['.claude/tools', '~/.claude/tools']
35
+ */
36
+ toolDirs?: string[];
37
+ /**
38
+ * Enable lazy discovery (discover on first access instead of startup).
39
+ * @default false
40
+ */
41
+ lazyDiscovery?: boolean;
42
+ }
43
+ /**
44
+ * Registry for managing MCP tool operations.
45
+ *
46
+ * Extends `BaseRegistry<Tool>` with tool-specific frontmatter parsing
47
+ * and backward-compatible aliases (`addTool`, `removeTool`, etc.).
48
+ */
49
+ export declare class ToolRegistry extends BaseRegistry<Tool> {
50
+ protected readonly _fileExtensions: string[];
51
+ protected readonly _entityName = "tool";
52
+ constructor(options?: ToolRegistryOptions);
53
+ protected _createInvalidError(reason: string): Error;
54
+ protected _createDuplicateError(name: string): Error;
55
+ protected _createNotFoundError(name: string, action: string): Error;
56
+ protected _shouldSkipFile(_fileName: string): boolean;
57
+ protected _parseFrontmatter(content: string): Partial<Tool> & {
58
+ _error?: string;
59
+ };
60
+ protected _buildItem(parsed: Partial<Tool>): Tool | null;
61
+ get(name: string): Tool | undefined;
62
+ addTool(tool: Tool): void;
63
+ removeTool(name: string): void;
64
+ updateTool(name: string, updates: Partial<Tool>): void;
65
+ hasTool(name: string): boolean;
66
+ getTool(name: string): Tool | undefined;
67
+ list(): string[];
68
+ setTools(tools: Tool[]): void;
69
+ }
70
+ //# sourceMappingURL=ToolRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolRegistry.d.ts","sourceRoot":"","sources":["../../src/registry/ToolRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,mBAAmB;IACnC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,uCAAuC;IACvC,KAAK,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,YAAY,CAAC,IAAI,CAAC;IACnD,mBAA4B,eAAe,WAAgB;IAC3D,mBAA4B,WAAW,UAAU;gBAErC,OAAO,GAAE,mBAAwB;cAW1B,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK;cAI1C,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;cAI1C,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK;cAMzD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;cAI3C,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;cA0BvE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAajD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAY5C,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIzB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAItD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIvC,IAAI,IAAI,MAAM,EAAE;IAIhB,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;CAGpC"}
@@ -0,0 +1,96 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ import { DuplicateToolError, InvalidToolError, ToolNotFoundError } from "../errors.js";
4
+ import { BaseRegistry } from "./BaseRegistry.js";
5
+ class ToolRegistry extends BaseRegistry {
6
+ _fileExtensions = [
7
+ '.tool.md'
8
+ ];
9
+ _entityName = 'tool';
10
+ constructor(options = {}){
11
+ super({
12
+ logger: options.logger,
13
+ cache: options.cache,
14
+ searchDirs: options.toolDirs ?? [
15
+ '.claude/tools',
16
+ join(homedir(), '.claude/tools')
17
+ ],
18
+ lazyDiscovery: options.lazyDiscovery
19
+ });
20
+ }
21
+ _createInvalidError(reason) {
22
+ return new InvalidToolError(reason);
23
+ }
24
+ _createDuplicateError(name) {
25
+ return new DuplicateToolError(name);
26
+ }
27
+ _createNotFoundError(name, action) {
28
+ return new ToolNotFoundError(name, action);
29
+ }
30
+ _shouldSkipFile(_fileName) {
31
+ return false;
32
+ }
33
+ _parseFrontmatter(content) {
34
+ const frontmatter = this._extractFrontmatter(content);
35
+ if (!frontmatter) return {
36
+ _error: 'No YAML frontmatter found'
37
+ };
38
+ try {
39
+ const result = {
40
+ name: 'string' == typeof frontmatter.name ? frontmatter.name : void 0,
41
+ description: 'string' == typeof frontmatter.description ? frontmatter.description : '',
42
+ inputSchema: frontmatter.inputSchema
43
+ };
44
+ if (!result.name) return {
45
+ _error: 'Missing required field: name'
46
+ };
47
+ if (!result.inputSchema) return {
48
+ _error: 'Missing required field: inputSchema'
49
+ };
50
+ return result;
51
+ } catch {
52
+ return {
53
+ _error: 'YAML parse error'
54
+ };
55
+ }
56
+ }
57
+ _buildItem(parsed) {
58
+ if (!parsed.name || !parsed.inputSchema) return null;
59
+ return {
60
+ name: parsed.name,
61
+ description: parsed.description || '',
62
+ inputSchema: parsed.inputSchema
63
+ };
64
+ }
65
+ get(name) {
66
+ if (this._cache) {
67
+ const cached = this._cache.get(`tool:${name}`);
68
+ if (cached && cached.length > 0) return cached[0];
69
+ }
70
+ return this._items.get(name);
71
+ }
72
+ addTool(tool) {
73
+ this.add(tool);
74
+ }
75
+ removeTool(name) {
76
+ this.remove(name);
77
+ }
78
+ updateTool(name, updates) {
79
+ this.update(name, updates);
80
+ }
81
+ hasTool(name) {
82
+ return this.has(name);
83
+ }
84
+ getTool(name) {
85
+ return this.get(name);
86
+ }
87
+ list() {
88
+ return this.getNames();
89
+ }
90
+ setTools(tools) {
91
+ this.setAll(tools);
92
+ }
93
+ }
94
+ export { ToolRegistry };
95
+
96
+ //# sourceMappingURL=ToolRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry/ToolRegistry.js","sources":["../../src/registry/ToolRegistry.ts"],"sourcesContent":["/**\n * Tool registry for managing MCP tool CRUD operations.\n *\n * This module provides the `ToolRegistry` class which manages the registration,\n * retrieval, update, and removal of MCP tools. It supports optional caching\n * for improved performance, filesystem discovery, and integrates with the logging system.\n *\n * @module registry\n */\n\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { DiscoveryCache } from '../cache/DiscoveryCache.js';\nimport { DuplicateToolError, InvalidToolError, ToolNotFoundError } from '../errors.js';\nimport type { Logger } from '../logger/StructuredLogger.js';\nimport type { Tool } from '../types/tool.js';\nimport { BaseRegistry } from './BaseRegistry.js';\n\n/**\n * Configuration options for creating a `ToolRegistry` instance.\n *\n * @example\n * ```typescript\n * const options: ToolRegistryOptions = {\n * logger: new StructuredLogger({ context: 'ToolRegistry' }),\n * cache: new DiscoveryCache({ ttl: 300000, maxSize: 100 }),\n * toolDirs: ['./custom-tools', '~/.claude/tools'],\n * lazyDiscovery: true\n * };\n * ```\n */\nexport interface ToolRegistryOptions {\n\t/** Optional logger for diagnostics. */\n\tlogger?: Logger;\n\n\t/** Optional cache for tool lookups. */\n\tcache?: DiscoveryCache<Tool>;\n\n\t/**\n\t * Directory paths to search for tools.\n\t * @default ['.claude/tools', '~/.claude/tools']\n\t */\n\ttoolDirs?: string[];\n\n\t/**\n\t * Enable lazy discovery (discover on first access instead of startup).\n\t * @default false\n\t */\n\tlazyDiscovery?: boolean;\n}\n\n/**\n * Registry for managing MCP tool operations.\n *\n * Extends `BaseRegistry<Tool>` with tool-specific frontmatter parsing\n * and backward-compatible aliases (`addTool`, `removeTool`, etc.).\n */\nexport class ToolRegistry extends BaseRegistry<Tool> {\n\tprotected override readonly _fileExtensions = ['.tool.md'];\n\tprotected override readonly _entityName = 'tool';\n\n\tconstructor(options: ToolRegistryOptions = {}) {\n\t\tsuper({\n\t\t\tlogger: options.logger,\n\t\t\tcache: options.cache,\n\t\t\tsearchDirs: options.toolDirs ?? ['.claude/tools', join(homedir(), '.claude/tools')],\n\t\t\tlazyDiscovery: options.lazyDiscovery,\n\t\t});\n\t}\n\n\t// --- Error factories ---\n\n\tprotected override _createInvalidError(reason: string): Error {\n\t\treturn new InvalidToolError(reason);\n\t}\n\n\tprotected override _createDuplicateError(name: string): Error {\n\t\treturn new DuplicateToolError(name);\n\t}\n\n\tprotected override _createNotFoundError(name: string, action: string): Error {\n\t\treturn new ToolNotFoundError(name, action);\n\t}\n\n\t// --- Discovery ---\n\n\tprotected override _shouldSkipFile(_fileName: string): boolean {\n\t\treturn false;\n\t}\n\n\tprotected override _parseFrontmatter(content: string): Partial<Tool> & { _error?: string } {\n\t\tconst frontmatter = this._extractFrontmatter(content);\n\t\tif (!frontmatter) {\n\t\t\treturn { _error: 'No YAML frontmatter found' };\n\t\t}\n\n\t\ttry {\n\t\t\tconst result: Partial<Tool> = {\n\t\t\t\tname: typeof frontmatter.name === 'string' ? frontmatter.name : undefined,\n\t\t\t\tdescription: typeof frontmatter.description === 'string' ? frontmatter.description : '',\n\t\t\t\tinputSchema: frontmatter.inputSchema as Tool['inputSchema'],\n\t\t\t};\n\n\t\t\tif (!result.name) {\n\t\t\t\treturn { _error: 'Missing required field: name' };\n\t\t\t}\n\t\t\tif (!result.inputSchema) {\n\t\t\t\treturn { _error: 'Missing required field: inputSchema' };\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} catch {\n\t\t\treturn { _error: 'YAML parse error' };\n\t\t}\n\t}\n\n\tprotected override _buildItem(parsed: Partial<Tool>): Tool | null {\n\t\tif (!parsed.name || !parsed.inputSchema) {\n\t\t\treturn null;\n\t\t}\n\t\treturn {\n\t\t\tname: parsed.name,\n\t\t\tdescription: parsed.description || '',\n\t\t\tinputSchema: parsed.inputSchema,\n\t\t};\n\t}\n\n\t// --- Tool-specific get with cache lookup ---\n\n\tpublic override get(name: string): Tool | undefined {\n\t\tif (this._cache) {\n\t\t\tconst cached = this._cache.get(`tool:${name}`);\n\t\t\tif (cached && cached.length > 0) {\n\t\t\t\treturn cached[0];\n\t\t\t}\n\t\t}\n\t\treturn this._items.get(name);\n\t}\n\n\t// --- Backward-compatible aliases ---\n\n\tpublic addTool(tool: Tool): void {\n\t\tthis.add(tool);\n\t}\n\n\tpublic removeTool(name: string): void {\n\t\tthis.remove(name);\n\t}\n\n\tpublic updateTool(name: string, updates: Partial<Tool>): void {\n\t\tthis.update(name, updates);\n\t}\n\n\tpublic hasTool(name: string): boolean {\n\t\treturn this.has(name);\n\t}\n\n\tpublic getTool(name: string): Tool | undefined {\n\t\treturn this.get(name);\n\t}\n\n\tpublic list(): string[] {\n\t\treturn this.getNames();\n\t}\n\n\tpublic setTools(tools: Tool[]): void {\n\t\tthis.setAll(tools);\n\t}\n}\n"],"names":["ToolRegistry","BaseRegistry","options","join","homedir","reason","InvalidToolError","name","DuplicateToolError","action","ToolNotFoundError","_fileName","content","frontmatter","result","undefined","parsed","cached","tool","updates","tools"],"mappings":";;;;AAyDO,MAAMA,qBAAqBC;IACL,kBAAkB;QAAC;KAAW,CAAC;IAC/B,cAAc,OAAO;IAEjD,YAAYC,UAA+B,CAAC,CAAC,CAAE;QAC9C,KAAK,CAAC;YACL,QAAQA,QAAQ,MAAM;YACtB,OAAOA,QAAQ,KAAK;YACpB,YAAYA,QAAQ,QAAQ,IAAI;gBAAC;gBAAiBC,KAAKC,WAAW;aAAiB;YACnF,eAAeF,QAAQ,aAAa;QACrC;IACD;IAImB,oBAAoBG,MAAc,EAAS;QAC7D,OAAO,IAAIC,iBAAiBD;IAC7B;IAEmB,sBAAsBE,IAAY,EAAS;QAC7D,OAAO,IAAIC,mBAAmBD;IAC/B;IAEmB,qBAAqBA,IAAY,EAAEE,MAAc,EAAS;QAC5E,OAAO,IAAIC,kBAAkBH,MAAME;IACpC;IAImB,gBAAgBE,SAAiB,EAAW;QAC9D,OAAO;IACR;IAEmB,kBAAkBC,OAAe,EAAuC;QAC1F,MAAMC,cAAc,IAAI,CAAC,mBAAmB,CAACD;QAC7C,IAAI,CAACC,aACJ,OAAO;YAAE,QAAQ;QAA4B;QAG9C,IAAI;YACH,MAAMC,SAAwB;gBAC7B,MAAM,AAA4B,YAA5B,OAAOD,YAAY,IAAI,GAAgBA,YAAY,IAAI,GAAGE;gBAChE,aAAa,AAAmC,YAAnC,OAAOF,YAAY,WAAW,GAAgBA,YAAY,WAAW,GAAG;gBACrF,aAAaA,YAAY,WAAW;YACrC;YAEA,IAAI,CAACC,OAAO,IAAI,EACf,OAAO;gBAAE,QAAQ;YAA+B;YAEjD,IAAI,CAACA,OAAO,WAAW,EACtB,OAAO;gBAAE,QAAQ;YAAsC;YAGxD,OAAOA;QACR,EAAE,OAAM;YACP,OAAO;gBAAE,QAAQ;YAAmB;QACrC;IACD;IAEmB,WAAWE,MAAqB,EAAe;QACjE,IAAI,CAACA,OAAO,IAAI,IAAI,CAACA,OAAO,WAAW,EACtC,OAAO;QAER,OAAO;YACN,MAAMA,OAAO,IAAI;YACjB,aAAaA,OAAO,WAAW,IAAI;YACnC,aAAaA,OAAO,WAAW;QAChC;IACD;IAIgB,IAAIT,IAAY,EAAoB;QACnD,IAAI,IAAI,CAAC,MAAM,EAAE;YAChB,MAAMU,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAEV,MAAM;YAC7C,IAAIU,UAAUA,OAAO,MAAM,GAAG,GAC7B,OAAOA,MAAM,CAAC,EAAE;QAElB;QACA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAACV;IACxB;IAIO,QAAQW,IAAU,EAAQ;QAChC,IAAI,CAAC,GAAG,CAACA;IACV;IAEO,WAAWX,IAAY,EAAQ;QACrC,IAAI,CAAC,MAAM,CAACA;IACb;IAEO,WAAWA,IAAY,EAAEY,OAAsB,EAAQ;QAC7D,IAAI,CAAC,MAAM,CAACZ,MAAMY;IACnB;IAEO,QAAQZ,IAAY,EAAW;QACrC,OAAO,IAAI,CAAC,GAAG,CAACA;IACjB;IAEO,QAAQA,IAAY,EAAoB;QAC9C,OAAO,IAAI,CAAC,GAAG,CAACA;IACjB;IAEO,OAAiB;QACvB,OAAO,IAAI,CAAC,QAAQ;IACrB;IAEO,SAASa,KAAa,EAAQ;QACpC,IAAI,CAAC,MAAM,CAACA;IACb;AACD"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Input sanitization for the sequential thinking MCP tool.
3
+ *
4
+ * Provides pure functions for stripping dangerous content from free-text fields.
5
+ * Uses a targeted blocklist approach: only removes HTML tags that can execute code,
6
+ * while preserving generic angle-bracket content like TypeScript generics (`Array<string>`),
7
+ * mathematical comparisons (`x < 5`), and markdown formatting.
8
+ *
9
+ * @module sanitize
10
+ */
11
+ /**
12
+ * Strip dangerous HTML tags that can execute JavaScript or load external resources.
13
+ *
14
+ * Uses a targeted blocklist to remove only tags known to be dangerous (script, iframe,
15
+ * img, style, svg, embed, object, link, meta, base, form) while preserving safe
16
+ * angle-bracket content like TypeScript generics and mathematical comparisons.
17
+ *
18
+ * @param input - The string to sanitize
19
+ * @returns The input with dangerous HTML tags removed
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * stripDangerousTags('<script>alert(1)</script>hello'); // 'hello'
24
+ * stripDangerousTags('Array<string>'); // 'Array<string>' (preserved)
25
+ * stripDangerousTags('x < 5 && y > 3'); // 'x < 5 && y > 3' (preserved)
26
+ * ```
27
+ */
28
+ export declare function stripDangerousTags(input: string): string;
29
+ /**
30
+ * Strip null bytes and C0 control characters from a string.
31
+ *
32
+ * Removes characters in the range U+0000–U+0008, U+000B, U+000C, U+000E–U+001F.
33
+ * Preserves tab (`\t`, U+0009), newline (`\n`, U+000A), and carriage return (`\r`, U+000D)
34
+ * as these are commonly used in thought content.
35
+ *
36
+ * @param input - The string to sanitize
37
+ * @returns The input with control characters removed
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * stripControlChars('a\x00b'); // 'ab'
42
+ * stripControlChars('a\tb\nc'); // 'a\tb\nc' (tab and newline preserved)
43
+ * ```
44
+ */
45
+ export declare function stripControlChars(input: string): string;
46
+ /**
47
+ * Sanitize a string by stripping both control characters and dangerous HTML tags.
48
+ *
49
+ * Composes {@link stripControlChars} and {@link stripDangerousTags} in sequence.
50
+ * Does not trim whitespace — thought content may depend on leading/trailing spaces.
51
+ * Always returns a string, even if the input is empty.
52
+ *
53
+ * @param input - The string to sanitize
54
+ * @returns The fully sanitized string
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * sanitizeString('<script>alert(1)</script>hello\x00world'); // 'helloworld'
59
+ * sanitizeString('Array<string>\x00'); // 'Array<string>'
60
+ * ```
61
+ */
62
+ export declare function sanitizeString(input: string): string;
63
+ export interface EnforceJsonShapeOptions {
64
+ maxDepth?: number;
65
+ maxBytes?: number;
66
+ }
67
+ export declare class JsonShapeError extends Error {
68
+ readonly reason: string;
69
+ constructor(reason: string);
70
+ }
71
+ /**
72
+ * Enforce safety constraints on a JSON-shaped value.
73
+ *
74
+ * Rejects:
75
+ * - Prototype-pollution keys (`__proto__`, `constructor`, `prototype`) at any depth
76
+ * - Nesting deeper than `maxDepth` (default 8)
77
+ * - Serialized JSON byte length exceeding `maxBytes` (default 16384)
78
+ * - Functions, symbols, and other non-JSON-safe values
79
+ *
80
+ * Used as a defense-in-depth gate for untrusted structured input such as
81
+ * `tool_arguments` from an LLM.
82
+ *
83
+ * @param value - The value to validate
84
+ * @param opts - Optional limits
85
+ * @throws {JsonShapeError} when any constraint is violated
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * enforceJsonShape({ q: 'hello' }); // ok
90
+ * enforceJsonShape({ __proto__: { polluted: true } }); // throws
91
+ * enforceJsonShape({ a: { b: { c: { d: { e: { f: { g: { h: { i: 1 } } } } } } } } }); // throws (depth)
92
+ * ```
93
+ */
94
+ export declare function enforceJsonShape(value: unknown, opts?: EnforceJsonShapeOptions): void;
95
+ /**
96
+ * Strip urgency/imperative phrases from a string.
97
+ * These phrases could be used for prompt injection when reflected to a host LLM.
98
+ *
99
+ * @param input - The string to strip urgency phrases from
100
+ * @returns The string with urgency phrases replaced by '[redacted-urgency]'
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * stripUrgencyPhrases('URGENT: do this'); // '[redacted-urgency] do this'
105
+ * stripUrgencyPhrases('Best for web search'); // 'Best for web search'
106
+ * ```
107
+ */
108
+ export declare function stripUrgencyPhrases(input: string): string;
109
+ /**
110
+ * Sanitize a rationale string by stripping urgency phrases, capping length,
111
+ * and applying standard string sanitization.
112
+ *
113
+ * Applied to `recommended_tools[].rationale` and `recommended_skills[].rationale`
114
+ * to prevent prompt-injection via urgency language.
115
+ *
116
+ * @param input - The rationale string to sanitize
117
+ * @param truncated - Optional object to receive truncation signal (sets `.value = true` if truncated)
118
+ * @returns The sanitized rationale
119
+ *
120
+ * @example
121
+ * ```ts
122
+ * sanitizeRationale('URGENT: run this now'); // '[redacted-urgency] run this now'
123
+ * sanitizeRationale('Best for web search'); // 'Best for web search' (unchanged)
124
+ * ```
125
+ */
126
+ export declare function sanitizeRationale(input: string, truncated?: {
127
+ value: boolean;
128
+ }): string;
129
+ /**
130
+ * Sanitize a step-level string field by stripping urgency phrases, capping length,
131
+ * and applying standard string sanitization.
132
+ *
133
+ * Applied to `step_description`, `expected_outcome`, `meta_observation`, and
134
+ * `next_step_conditions` items to prevent prompt injection through urgency language.
135
+ *
136
+ * @param input - The string to sanitize
137
+ * @returns The sanitized string
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * sanitizeStepField('You MUST RUN this tool'); // 'You [redacted-urgency] this tool'
142
+ * sanitizeStepField('Analyze the code'); // 'Analyze the code' (unchanged)
143
+ * ```
144
+ */
145
+ export declare function sanitizeStepField(input: string): string;
146
+ /**
147
+ * Sanitize suggested_inputs: cap string value lengths, strip control chars and dangerous tags.
148
+ *
149
+ * Only processes flat primitive values (string | number | boolean | null).
150
+ * Non-primitive values (nested objects, arrays) are silently skipped — schema validation
151
+ * is expected to reject them upstream.
152
+ *
153
+ * @param inputs - The suggested_inputs record to sanitize
154
+ * @returns The sanitized record with cleaned string values
155
+ * @throws {Error} if string value exceeds max length, or if more than 32 keys are present
156
+ *
157
+ * @example
158
+ * ```ts
159
+ * sanitizeSuggestedInputs({ url: 'x', limit: 5 }); // { url: 'x', limit: 5 }
160
+ * sanitizeSuggestedInputs({ url: '<script>alert(1)</script>' }); // { url: 'alert(1)' }
161
+ * ```
162
+ */
163
+ export declare function sanitizeSuggestedInputs(inputs: Record<string, unknown>): Record<string, string | number | boolean | null>;
164
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAgBD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,KAAK;IACxC,SAAgB,MAAM,EAAE,MAAM,CAAC;gBACnB,MAAM,EAAE,MAAM;CAK1B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,uBAA4B,GAAG,IAAI,CAoDzF;AASD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAQvF;AAOD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAYD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAuBlD"}