@syrin/cli 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +302 -0
  3. package/dist/cli/commands/analyse.d.ts +16 -0
  4. package/dist/cli/commands/analyse.js +61 -0
  5. package/dist/cli/commands/dev.d.ts +23 -0
  6. package/dist/cli/commands/dev.js +419 -0
  7. package/dist/cli/commands/doctor.d.ts +10 -0
  8. package/dist/cli/commands/doctor.js +195 -0
  9. package/dist/cli/commands/index.d.ts +12 -0
  10. package/dist/cli/commands/index.js +12 -0
  11. package/dist/cli/commands/init.d.ts +16 -0
  12. package/dist/cli/commands/init.js +90 -0
  13. package/dist/cli/commands/list.d.ts +15 -0
  14. package/dist/cli/commands/list.js +50 -0
  15. package/dist/cli/commands/rollback.d.ts +12 -0
  16. package/dist/cli/commands/rollback.js +101 -0
  17. package/dist/cli/commands/test.d.ts +31 -0
  18. package/dist/cli/commands/test.js +88 -0
  19. package/dist/cli/commands/update.d.ts +9 -0
  20. package/dist/cli/commands/update.js +76 -0
  21. package/dist/cli/index.d.ts +13 -0
  22. package/dist/cli/index.js +342 -0
  23. package/dist/cli/prompts/index.d.ts +5 -0
  24. package/dist/cli/prompts/index.js +5 -0
  25. package/dist/cli/prompts/init-prompt.d.ts +17 -0
  26. package/dist/cli/prompts/init-prompt.js +263 -0
  27. package/dist/cli/utils/command-error-handler.d.ts +14 -0
  28. package/dist/cli/utils/command-error-handler.js +35 -0
  29. package/dist/cli/utils/common-types.d.ts +24 -0
  30. package/dist/cli/utils/common-types.js +6 -0
  31. package/dist/cli/utils/connection-handler.d.ts +37 -0
  32. package/dist/cli/utils/connection-handler.js +90 -0
  33. package/dist/cli/utils/index.d.ts +11 -0
  34. package/dist/cli/utils/index.js +11 -0
  35. package/dist/cli/utils/option-parsers.d.ts +41 -0
  36. package/dist/cli/utils/option-parsers.js +92 -0
  37. package/dist/cli/utils/output-utils.d.ts +12 -0
  38. package/dist/cli/utils/output-utils.js +21 -0
  39. package/dist/cli/utils/transport-resolver.d.ts +33 -0
  40. package/dist/cli/utils/transport-resolver.js +82 -0
  41. package/dist/cli/utils/version-banner.d.ts +10 -0
  42. package/dist/cli/utils/version-banner.js +26 -0
  43. package/dist/config/env-checker.d.ts +37 -0
  44. package/dist/config/env-checker.js +136 -0
  45. package/dist/config/generator.d.ts +19 -0
  46. package/dist/config/generator.js +196 -0
  47. package/dist/config/index.d.ts +9 -0
  48. package/dist/config/index.js +9 -0
  49. package/dist/config/loader.d.ts +19 -0
  50. package/dist/config/loader.js +57 -0
  51. package/dist/config/schema.d.ts +42 -0
  52. package/dist/config/schema.js +181 -0
  53. package/dist/config/syrin.template.yaml +127 -0
  54. package/dist/config/types.d.ts +87 -0
  55. package/dist/config/types.js +6 -0
  56. package/dist/constants/app.d.ts +9 -0
  57. package/dist/constants/app.js +9 -0
  58. package/dist/constants/commands.d.ts +43 -0
  59. package/dist/constants/commands.js +43 -0
  60. package/dist/constants/defaults.d.ts +18 -0
  61. package/dist/constants/defaults.js +18 -0
  62. package/dist/constants/env-vars.d.ts +11 -0
  63. package/dist/constants/env-vars.js +11 -0
  64. package/dist/constants/icons.d.ts +23 -0
  65. package/dist/constants/icons.js +23 -0
  66. package/dist/constants/index.d.ts +17 -0
  67. package/dist/constants/index.js +17 -0
  68. package/dist/constants/labels.d.ts +38 -0
  69. package/dist/constants/labels.js +42 -0
  70. package/dist/constants/links.d.ts +10 -0
  71. package/dist/constants/links.js +11 -0
  72. package/dist/constants/list.d.ts +10 -0
  73. package/dist/constants/list.js +9 -0
  74. package/dist/constants/llm.d.ts +26 -0
  75. package/dist/constants/llm.js +25 -0
  76. package/dist/constants/messages.d.ts +107 -0
  77. package/dist/constants/messages.js +138 -0
  78. package/dist/constants/paths.d.ts +29 -0
  79. package/dist/constants/paths.js +29 -0
  80. package/dist/constants/transport.d.ts +9 -0
  81. package/dist/constants/transport.js +8 -0
  82. package/dist/events/emitter.d.ts +64 -0
  83. package/dist/events/emitter.js +142 -0
  84. package/dist/events/event-type.d.ts +66 -0
  85. package/dist/events/event-type.js +81 -0
  86. package/dist/events/payloads/diagnostics.d.ts +24 -0
  87. package/dist/events/payloads/diagnostics.js +5 -0
  88. package/dist/events/payloads/index.d.ts +15 -0
  89. package/dist/events/payloads/index.js +6 -0
  90. package/dist/events/payloads/llm.d.ts +58 -0
  91. package/dist/events/payloads/llm.js +6 -0
  92. package/dist/events/payloads/registry.d.ts +28 -0
  93. package/dist/events/payloads/registry.js +5 -0
  94. package/dist/events/payloads/session.d.ts +32 -0
  95. package/dist/events/payloads/session.js +5 -0
  96. package/dist/events/payloads/testing.d.ts +17 -0
  97. package/dist/events/payloads/testing.js +5 -0
  98. package/dist/events/payloads/tool.d.ts +29 -0
  99. package/dist/events/payloads/tool.js +5 -0
  100. package/dist/events/payloads/transport.d.ts +30 -0
  101. package/dist/events/payloads/transport.js +5 -0
  102. package/dist/events/payloads/validation.d.ts +37 -0
  103. package/dist/events/payloads/validation.js +5 -0
  104. package/dist/events/payloads/workflow.d.ts +45 -0
  105. package/dist/events/payloads/workflow.js +5 -0
  106. package/dist/events/store/file-store.d.ts +37 -0
  107. package/dist/events/store/file-store.js +113 -0
  108. package/dist/events/store/index.d.ts +7 -0
  109. package/dist/events/store/index.js +6 -0
  110. package/dist/events/store/memory-store.d.ts +26 -0
  111. package/dist/events/store/memory-store.js +39 -0
  112. package/dist/events/store.d.ts +11 -0
  113. package/dist/events/store.js +2 -0
  114. package/dist/events/types.d.ts +14 -0
  115. package/dist/events/types.js +2 -0
  116. package/dist/index.d.ts +8 -0
  117. package/dist/index.js +30 -0
  118. package/dist/presentation/analysis-ui.d.ts +24 -0
  119. package/dist/presentation/analysis-ui.js +158 -0
  120. package/dist/presentation/dev/chat-ui-types.d.ts +68 -0
  121. package/dist/presentation/dev/chat-ui-types.js +5 -0
  122. package/dist/presentation/dev/chat-ui.d.ts +61 -0
  123. package/dist/presentation/dev/chat-ui.js +714 -0
  124. package/dist/presentation/dev/components/assistant-message.d.ts +19 -0
  125. package/dist/presentation/dev/components/assistant-message.js +36 -0
  126. package/dist/presentation/dev/components/header.d.ts +16 -0
  127. package/dist/presentation/dev/components/header.js +22 -0
  128. package/dist/presentation/dev/components/index.d.ts +13 -0
  129. package/dist/presentation/dev/components/index.js +13 -0
  130. package/dist/presentation/dev/components/input-panel.d.ts +22 -0
  131. package/dist/presentation/dev/components/input-panel.js +43 -0
  132. package/dist/presentation/dev/components/message-component.d.ts +16 -0
  133. package/dist/presentation/dev/components/message-component.js +51 -0
  134. package/dist/presentation/dev/components/messages-list.d.ts +24 -0
  135. package/dist/presentation/dev/components/messages-list.js +48 -0
  136. package/dist/presentation/dev/components/system-message.d.ts +16 -0
  137. package/dist/presentation/dev/components/system-message.js +26 -0
  138. package/dist/presentation/dev/components/user-message.d.ts +21 -0
  139. package/dist/presentation/dev/components/user-message.js +35 -0
  140. package/dist/presentation/dev/components/welcome-banner.d.ts +24 -0
  141. package/dist/presentation/dev/components/welcome-banner.js +146 -0
  142. package/dist/presentation/dev/goodbye-messages.d.ts +31 -0
  143. package/dist/presentation/dev/goodbye-messages.js +100 -0
  144. package/dist/presentation/dev/index.d.ts +5 -0
  145. package/dist/presentation/dev/index.js +5 -0
  146. package/dist/presentation/dev/text-wrapper.d.ts +30 -0
  147. package/dist/presentation/dev/text-wrapper.js +74 -0
  148. package/dist/presentation/dev-ui.d.ts +33 -0
  149. package/dist/presentation/dev-ui.js +246 -0
  150. package/dist/presentation/doctor-ui.d.ts +40 -0
  151. package/dist/presentation/doctor-ui.js +157 -0
  152. package/dist/presentation/init-ui.d.ts +14 -0
  153. package/dist/presentation/init-ui.js +41 -0
  154. package/dist/presentation/list-ui.d.ts +44 -0
  155. package/dist/presentation/list-ui.js +139 -0
  156. package/dist/presentation/test-ui.d.ts +49 -0
  157. package/dist/presentation/test-ui.js +358 -0
  158. package/dist/runtime/analysis/analyser.d.ts +14 -0
  159. package/dist/runtime/analysis/analyser.js +88 -0
  160. package/dist/runtime/analysis/dependencies.d.ts +10 -0
  161. package/dist/runtime/analysis/dependencies.js +140 -0
  162. package/dist/runtime/analysis/index.d.ts +10 -0
  163. package/dist/runtime/analysis/index.js +10 -0
  164. package/dist/runtime/analysis/indexer.d.ts +10 -0
  165. package/dist/runtime/analysis/indexer.js +62 -0
  166. package/dist/runtime/analysis/loader.d.ts +15 -0
  167. package/dist/runtime/analysis/loader.js +47 -0
  168. package/dist/runtime/analysis/normalizer.d.ts +14 -0
  169. package/dist/runtime/analysis/normalizer.js +184 -0
  170. package/dist/runtime/analysis/rules/__test-helpers__.d.ts +18 -0
  171. package/dist/runtime/analysis/rules/__test-helpers__.js +40 -0
  172. package/dist/runtime/analysis/rules/base.d.ts +38 -0
  173. package/dist/runtime/analysis/rules/base.js +23 -0
  174. package/dist/runtime/analysis/rules/error-codes.d.ts +64 -0
  175. package/dist/runtime/analysis/rules/error-codes.js +73 -0
  176. package/dist/runtime/analysis/rules/errors/e000-tool-not-found.d.ts +35 -0
  177. package/dist/runtime/analysis/rules/errors/e000-tool-not-found.js +32 -0
  178. package/dist/runtime/analysis/rules/errors/e001-missing-output-schema.d.ts +22 -0
  179. package/dist/runtime/analysis/rules/errors/e001-missing-output-schema.js +30 -0
  180. package/dist/runtime/analysis/rules/errors/e002-underspecified-input.d.ts +24 -0
  181. package/dist/runtime/analysis/rules/errors/e002-underspecified-input.js +52 -0
  182. package/dist/runtime/analysis/rules/errors/e003-type-mismatch.d.ts +23 -0
  183. package/dist/runtime/analysis/rules/errors/e003-type-mismatch.js +73 -0
  184. package/dist/runtime/analysis/rules/errors/e004-free-text-propagation.d.ts +23 -0
  185. package/dist/runtime/analysis/rules/errors/e004-free-text-propagation.js +47 -0
  186. package/dist/runtime/analysis/rules/errors/e005-tool-ambiguity.d.ts +25 -0
  187. package/dist/runtime/analysis/rules/errors/e005-tool-ambiguity.js +73 -0
  188. package/dist/runtime/analysis/rules/errors/e006-param-not-in-description.d.ts +22 -0
  189. package/dist/runtime/analysis/rules/errors/e006-param-not-in-description.js +57 -0
  190. package/dist/runtime/analysis/rules/errors/e007-output-not-guaranteed.d.ts +23 -0
  191. package/dist/runtime/analysis/rules/errors/e007-output-not-guaranteed.js +56 -0
  192. package/dist/runtime/analysis/rules/errors/e008-circular-dependency.d.ts +22 -0
  193. package/dist/runtime/analysis/rules/errors/e008-circular-dependency.js +84 -0
  194. package/dist/runtime/analysis/rules/errors/e009-implicit-user-input.d.ts +23 -0
  195. package/dist/runtime/analysis/rules/errors/e009-implicit-user-input.js +89 -0
  196. package/dist/runtime/analysis/rules/errors/e010-non-serializable.d.ts +25 -0
  197. package/dist/runtime/analysis/rules/errors/e010-non-serializable.js +46 -0
  198. package/dist/runtime/analysis/rules/errors/e011-missing-tool-description.d.ts +24 -0
  199. package/dist/runtime/analysis/rules/errors/e011-missing-tool-description.js +33 -0
  200. package/dist/runtime/analysis/rules/errors/e012-side-effect-detected.d.ts +39 -0
  201. package/dist/runtime/analysis/rules/errors/e012-side-effect-detected.js +40 -0
  202. package/dist/runtime/analysis/rules/errors/e013-non-deterministic-output.d.ts +37 -0
  203. package/dist/runtime/analysis/rules/errors/e013-non-deterministic-output.js +34 -0
  204. package/dist/runtime/analysis/rules/errors/e013-output-explosion.d.ts +39 -0
  205. package/dist/runtime/analysis/rules/errors/e013-output-explosion.js +36 -0
  206. package/dist/runtime/analysis/rules/errors/e014-hidden-dependency.d.ts +42 -0
  207. package/dist/runtime/analysis/rules/errors/e014-hidden-dependency.js +46 -0
  208. package/dist/runtime/analysis/rules/errors/e014-output-explosion.d.ts +39 -0
  209. package/dist/runtime/analysis/rules/errors/e014-output-explosion.js +36 -0
  210. package/dist/runtime/analysis/rules/errors/e015-hidden-dependency.d.ts +42 -0
  211. package/dist/runtime/analysis/rules/errors/e015-hidden-dependency.js +46 -0
  212. package/dist/runtime/analysis/rules/errors/e015-unbounded-execution.d.ts +44 -0
  213. package/dist/runtime/analysis/rules/errors/e015-unbounded-execution.js +66 -0
  214. package/dist/runtime/analysis/rules/errors/e016-output-validation-failed.d.ts +43 -0
  215. package/dist/runtime/analysis/rules/errors/e016-output-validation-failed.js +42 -0
  216. package/dist/runtime/analysis/rules/errors/e016-unbounded-execution.d.ts +44 -0
  217. package/dist/runtime/analysis/rules/errors/e016-unbounded-execution.js +66 -0
  218. package/dist/runtime/analysis/rules/errors/e017-input-validation-failed.d.ts +57 -0
  219. package/dist/runtime/analysis/rules/errors/e017-input-validation-failed.js +80 -0
  220. package/dist/runtime/analysis/rules/errors/e017-output-validation-failed.d.ts +43 -0
  221. package/dist/runtime/analysis/rules/errors/e017-output-validation-failed.js +42 -0
  222. package/dist/runtime/analysis/rules/errors/e018-input-validation-failed.d.ts +57 -0
  223. package/dist/runtime/analysis/rules/errors/e018-input-validation-failed.js +80 -0
  224. package/dist/runtime/analysis/rules/errors/e018-tool-execution-failed.d.ts +38 -0
  225. package/dist/runtime/analysis/rules/errors/e018-tool-execution-failed.js +37 -0
  226. package/dist/runtime/analysis/rules/errors/e019-tool-execution-failed.d.ts +38 -0
  227. package/dist/runtime/analysis/rules/errors/e019-tool-execution-failed.js +37 -0
  228. package/dist/runtime/analysis/rules/errors/e019-unexpected-test-result.d.ts +65 -0
  229. package/dist/runtime/analysis/rules/errors/e019-unexpected-test-result.js +109 -0
  230. package/dist/runtime/analysis/rules/errors/e020-unexpected-test-result.d.ts +65 -0
  231. package/dist/runtime/analysis/rules/errors/e020-unexpected-test-result.js +109 -0
  232. package/dist/runtime/analysis/rules/errors/e100-missing-output-schema.d.ts +22 -0
  233. package/dist/runtime/analysis/rules/errors/e100-missing-output-schema.js +30 -0
  234. package/dist/runtime/analysis/rules/errors/e101-missing-tool-description.d.ts +24 -0
  235. package/dist/runtime/analysis/rules/errors/e101-missing-tool-description.js +33 -0
  236. package/dist/runtime/analysis/rules/errors/e102-underspecified-input.d.ts +24 -0
  237. package/dist/runtime/analysis/rules/errors/e102-underspecified-input.js +52 -0
  238. package/dist/runtime/analysis/rules/errors/e103-type-mismatch.d.ts +23 -0
  239. package/dist/runtime/analysis/rules/errors/e103-type-mismatch.js +72 -0
  240. package/dist/runtime/analysis/rules/errors/e104-param-not-in-description.d.ts +22 -0
  241. package/dist/runtime/analysis/rules/errors/e104-param-not-in-description.js +57 -0
  242. package/dist/runtime/analysis/rules/errors/e105-free-text-propagation.d.ts +23 -0
  243. package/dist/runtime/analysis/rules/errors/e105-free-text-propagation.js +47 -0
  244. package/dist/runtime/analysis/rules/errors/e106-output-not-guaranteed.d.ts +23 -0
  245. package/dist/runtime/analysis/rules/errors/e106-output-not-guaranteed.js +58 -0
  246. package/dist/runtime/analysis/rules/errors/e107-circular-dependency.d.ts +22 -0
  247. package/dist/runtime/analysis/rules/errors/e107-circular-dependency.js +84 -0
  248. package/dist/runtime/analysis/rules/errors/e108-implicit-user-input.d.ts +23 -0
  249. package/dist/runtime/analysis/rules/errors/e108-implicit-user-input.js +94 -0
  250. package/dist/runtime/analysis/rules/errors/e109-non-serializable.d.ts +25 -0
  251. package/dist/runtime/analysis/rules/errors/e109-non-serializable.js +44 -0
  252. package/dist/runtime/analysis/rules/errors/e110-tool-ambiguity.d.ts +25 -0
  253. package/dist/runtime/analysis/rules/errors/e110-tool-ambiguity.js +73 -0
  254. package/dist/runtime/analysis/rules/errors/e200-input-validation-failed.d.ts +57 -0
  255. package/dist/runtime/analysis/rules/errors/e200-input-validation-failed.js +71 -0
  256. package/dist/runtime/analysis/rules/errors/e300-output-validation-failed.d.ts +43 -0
  257. package/dist/runtime/analysis/rules/errors/e300-output-validation-failed.js +44 -0
  258. package/dist/runtime/analysis/rules/errors/e301-output-explosion.d.ts +39 -0
  259. package/dist/runtime/analysis/rules/errors/e301-output-explosion.js +36 -0
  260. package/dist/runtime/analysis/rules/errors/e400-tool-execution-failed.d.ts +38 -0
  261. package/dist/runtime/analysis/rules/errors/e400-tool-execution-failed.js +37 -0
  262. package/dist/runtime/analysis/rules/errors/e403-unbounded-execution.d.ts +44 -0
  263. package/dist/runtime/analysis/rules/errors/e403-unbounded-execution.js +66 -0
  264. package/dist/runtime/analysis/rules/errors/e500-side-effect-detected.d.ts +39 -0
  265. package/dist/runtime/analysis/rules/errors/e500-side-effect-detected.js +40 -0
  266. package/dist/runtime/analysis/rules/errors/e501-hidden-dependency.d.ts +47 -0
  267. package/dist/runtime/analysis/rules/errors/e501-hidden-dependency.js +46 -0
  268. package/dist/runtime/analysis/rules/errors/e600-unexpected-test-result.d.ts +65 -0
  269. package/dist/runtime/analysis/rules/errors/e600-unexpected-test-result.js +109 -0
  270. package/dist/runtime/analysis/rules/index.d.ts +18 -0
  271. package/dist/runtime/analysis/rules/index.js +94 -0
  272. package/dist/runtime/analysis/rules/warnings/w001-implicit-dependency.d.ts +22 -0
  273. package/dist/runtime/analysis/rules/warnings/w001-implicit-dependency.js +39 -0
  274. package/dist/runtime/analysis/rules/warnings/w002-free-text-without-normalization.d.ts +24 -0
  275. package/dist/runtime/analysis/rules/warnings/w002-free-text-without-normalization.js +40 -0
  276. package/dist/runtime/analysis/rules/warnings/w003-missing-examples.d.ts +22 -0
  277. package/dist/runtime/analysis/rules/warnings/w003-missing-examples.js +84 -0
  278. package/dist/runtime/analysis/rules/warnings/w004-overloaded-responsibility.d.ts +23 -0
  279. package/dist/runtime/analysis/rules/warnings/w004-overloaded-responsibility.js +96 -0
  280. package/dist/runtime/analysis/rules/warnings/w005-generic-description.d.ts +53 -0
  281. package/dist/runtime/analysis/rules/warnings/w005-generic-description.js +108 -0
  282. package/dist/runtime/analysis/rules/warnings/w006-optional-as-required.d.ts +22 -0
  283. package/dist/runtime/analysis/rules/warnings/w006-optional-as-required.js +44 -0
  284. package/dist/runtime/analysis/rules/warnings/w007-broad-output-schema.d.ts +23 -0
  285. package/dist/runtime/analysis/rules/warnings/w007-broad-output-schema.js +37 -0
  286. package/dist/runtime/analysis/rules/warnings/w008-multiple-entry-points.d.ts +22 -0
  287. package/dist/runtime/analysis/rules/warnings/w008-multiple-entry-points.js +97 -0
  288. package/dist/runtime/analysis/rules/warnings/w009-hidden-side-effects.d.ts +23 -0
  289. package/dist/runtime/analysis/rules/warnings/w009-hidden-side-effects.js +88 -0
  290. package/dist/runtime/analysis/rules/warnings/w010-output-not-reusable.d.ts +22 -0
  291. package/dist/runtime/analysis/rules/warnings/w010-output-not-reusable.js +81 -0
  292. package/dist/runtime/analysis/rules/warnings/w021-weak-schema.d.ts +40 -0
  293. package/dist/runtime/analysis/rules/warnings/w021-weak-schema.js +32 -0
  294. package/dist/runtime/analysis/rules/warnings/w022-high-entropy-output.d.ts +39 -0
  295. package/dist/runtime/analysis/rules/warnings/w022-high-entropy-output.js +36 -0
  296. package/dist/runtime/analysis/rules/warnings/w023-unstable-defaults.d.ts +38 -0
  297. package/dist/runtime/analysis/rules/warnings/w023-unstable-defaults.js +36 -0
  298. package/dist/runtime/analysis/rules/warnings/w100-implicit-dependency.d.ts +22 -0
  299. package/dist/runtime/analysis/rules/warnings/w100-implicit-dependency.js +89 -0
  300. package/dist/runtime/analysis/rules/warnings/w101-free-text-without-normalization.d.ts +24 -0
  301. package/dist/runtime/analysis/rules/warnings/w101-free-text-without-normalization.js +40 -0
  302. package/dist/runtime/analysis/rules/warnings/w102-missing-examples.d.ts +22 -0
  303. package/dist/runtime/analysis/rules/warnings/w102-missing-examples.js +76 -0
  304. package/dist/runtime/analysis/rules/warnings/w103-overloaded-responsibility.d.ts +23 -0
  305. package/dist/runtime/analysis/rules/warnings/w103-overloaded-responsibility.js +91 -0
  306. package/dist/runtime/analysis/rules/warnings/w104-generic-description.d.ts +53 -0
  307. package/dist/runtime/analysis/rules/warnings/w104-generic-description.js +108 -0
  308. package/dist/runtime/analysis/rules/warnings/w105-optional-as-required.d.ts +22 -0
  309. package/dist/runtime/analysis/rules/warnings/w105-optional-as-required.js +45 -0
  310. package/dist/runtime/analysis/rules/warnings/w106-broad-output-schema.d.ts +23 -0
  311. package/dist/runtime/analysis/rules/warnings/w106-broad-output-schema.js +37 -0
  312. package/dist/runtime/analysis/rules/warnings/w107-multiple-entry-points.d.ts +22 -0
  313. package/dist/runtime/analysis/rules/warnings/w107-multiple-entry-points.js +97 -0
  314. package/dist/runtime/analysis/rules/warnings/w108-hidden-side-effects.d.ts +23 -0
  315. package/dist/runtime/analysis/rules/warnings/w108-hidden-side-effects.js +94 -0
  316. package/dist/runtime/analysis/rules/warnings/w109-output-not-reusable.d.ts +22 -0
  317. package/dist/runtime/analysis/rules/warnings/w109-output-not-reusable.js +63 -0
  318. package/dist/runtime/analysis/rules/warnings/w110-weak-schema.d.ts +40 -0
  319. package/dist/runtime/analysis/rules/warnings/w110-weak-schema.js +32 -0
  320. package/dist/runtime/analysis/rules/warnings/w300-high-entropy-output.d.ts +39 -0
  321. package/dist/runtime/analysis/rules/warnings/w300-high-entropy-output.js +47 -0
  322. package/dist/runtime/analysis/rules/warnings/w301-unstable-defaults.d.ts +38 -0
  323. package/dist/runtime/analysis/rules/warnings/w301-unstable-defaults.js +36 -0
  324. package/dist/runtime/analysis/strict-mode.d.ts +21 -0
  325. package/dist/runtime/analysis/strict-mode.js +44 -0
  326. package/dist/runtime/analysis/types.d.ts +133 -0
  327. package/dist/runtime/analysis/types.js +6 -0
  328. package/dist/runtime/analysis/utils.d.ts +19 -0
  329. package/dist/runtime/analysis/utils.js +21 -0
  330. package/dist/runtime/dev/data-manager.d.ts +55 -0
  331. package/dist/runtime/dev/data-manager.js +87 -0
  332. package/dist/runtime/dev/event-mapper.d.ts +100 -0
  333. package/dist/runtime/dev/event-mapper.js +400 -0
  334. package/dist/runtime/dev/formatter.d.ts +94 -0
  335. package/dist/runtime/dev/formatter.js +236 -0
  336. package/dist/runtime/dev/index.d.ts +9 -0
  337. package/dist/runtime/dev/index.js +9 -0
  338. package/dist/runtime/dev/repl.d.ts +114 -0
  339. package/dist/runtime/dev/repl.js +310 -0
  340. package/dist/runtime/dev/session.d.ts +86 -0
  341. package/dist/runtime/dev/session.js +447 -0
  342. package/dist/runtime/dev/stack-trace.d.ts +77 -0
  343. package/dist/runtime/dev/stack-trace.js +286 -0
  344. package/dist/runtime/dev/types.d.ts +54 -0
  345. package/dist/runtime/dev/types.js +5 -0
  346. package/dist/runtime/llm/claude.d.ts +27 -0
  347. package/dist/runtime/llm/claude.js +150 -0
  348. package/dist/runtime/llm/factory.d.ts +30 -0
  349. package/dist/runtime/llm/factory.js +78 -0
  350. package/dist/runtime/llm/index.d.ts +10 -0
  351. package/dist/runtime/llm/index.js +10 -0
  352. package/dist/runtime/llm/ollama.d.ts +45 -0
  353. package/dist/runtime/llm/ollama.js +449 -0
  354. package/dist/runtime/llm/openai.d.ts +27 -0
  355. package/dist/runtime/llm/openai.js +170 -0
  356. package/dist/runtime/llm/provider.d.ts +32 -0
  357. package/dist/runtime/llm/provider.js +6 -0
  358. package/dist/runtime/llm/types.d.ts +55 -0
  359. package/dist/runtime/llm/types.js +6 -0
  360. package/dist/runtime/mcp/client/base.d.ts +40 -0
  361. package/dist/runtime/mcp/client/base.js +157 -0
  362. package/dist/runtime/mcp/client/manager.d.ts +91 -0
  363. package/dist/runtime/mcp/client/manager.js +248 -0
  364. package/dist/runtime/mcp/client/process.d.ts +31 -0
  365. package/dist/runtime/mcp/client/process.js +82 -0
  366. package/dist/runtime/mcp/connection.d.ts +63 -0
  367. package/dist/runtime/mcp/connection.js +449 -0
  368. package/dist/runtime/mcp/index.d.ts +9 -0
  369. package/dist/runtime/mcp/index.js +9 -0
  370. package/dist/runtime/mcp/list.d.ts +50 -0
  371. package/dist/runtime/mcp/list.js +65 -0
  372. package/dist/runtime/mcp/stdio-transport.d.ts +23 -0
  373. package/dist/runtime/mcp/stdio-transport.js +71 -0
  374. package/dist/runtime/mcp/types.d.ts +85 -0
  375. package/dist/runtime/mcp/types.js +6 -0
  376. package/dist/runtime/sandbox/executor.d.ts +102 -0
  377. package/dist/runtime/sandbox/executor.js +537 -0
  378. package/dist/runtime/sandbox/index.d.ts +9 -0
  379. package/dist/runtime/sandbox/index.js +9 -0
  380. package/dist/runtime/sandbox/io-monitor.d.ts +78 -0
  381. package/dist/runtime/sandbox/io-monitor.js +98 -0
  382. package/dist/runtime/sandbox/time-parser.d.ts +19 -0
  383. package/dist/runtime/sandbox/time-parser.js +67 -0
  384. package/dist/runtime/sandbox/types.d.ts +58 -0
  385. package/dist/runtime/sandbox/types.js +23 -0
  386. package/dist/runtime/test/behavior-observer.d.ts +61 -0
  387. package/dist/runtime/test/behavior-observer.js +140 -0
  388. package/dist/runtime/test/contract-loader.d.ts +41 -0
  389. package/dist/runtime/test/contract-loader.js +158 -0
  390. package/dist/runtime/test/contract-schema.d.ts +46 -0
  391. package/dist/runtime/test/contract-schema.js +107 -0
  392. package/dist/runtime/test/contract-types.d.ts +106 -0
  393. package/dist/runtime/test/contract-types.js +6 -0
  394. package/dist/runtime/test/dependency-tracker.d.ts +66 -0
  395. package/dist/runtime/test/dependency-tracker.js +80 -0
  396. package/dist/runtime/test/formatters.d.ts +18 -0
  397. package/dist/runtime/test/formatters.js +172 -0
  398. package/dist/runtime/test/index.d.ts +12 -0
  399. package/dist/runtime/test/index.js +13 -0
  400. package/dist/runtime/test/input-generator.d.ts +33 -0
  401. package/dist/runtime/test/input-generator.js +498 -0
  402. package/dist/runtime/test/mcp-root-detector.d.ts +31 -0
  403. package/dist/runtime/test/mcp-root-detector.js +105 -0
  404. package/dist/runtime/test/orchestrator.d.ts +131 -0
  405. package/dist/runtime/test/orchestrator.js +738 -0
  406. package/dist/runtime/test/output-validator.d.ts +44 -0
  407. package/dist/runtime/test/output-validator.js +262 -0
  408. package/dist/runtime/test/retry-tester.d.ts +44 -0
  409. package/dist/runtime/test/retry-tester.js +103 -0
  410. package/dist/runtime/test/runner.d.ts +28 -0
  411. package/dist/runtime/test/runner.js +55 -0
  412. package/dist/runtime/test/synthetic-input-generator.d.ts +11 -0
  413. package/dist/runtime/test/synthetic-input-generator.js +154 -0
  414. package/dist/runtime/test/test-runner.d.ts +28 -0
  415. package/dist/runtime/test/test-runner.js +55 -0
  416. package/dist/types/factories.d.ts +16 -0
  417. package/dist/types/factories.js +43 -0
  418. package/dist/types/ids.d.ts +16 -0
  419. package/dist/types/ids.js +2 -0
  420. package/dist/types/opaque.d.ts +4 -0
  421. package/dist/types/opaque.js +2 -0
  422. package/dist/utils/errors.d.ts +92 -0
  423. package/dist/utils/errors.js +97 -0
  424. package/dist/utils/gitignore.d.ts +11 -0
  425. package/dist/utils/gitignore.js +59 -0
  426. package/dist/utils/json-file-saver.d.ts +17 -0
  427. package/dist/utils/json-file-saver.js +81 -0
  428. package/dist/utils/json-formatter.d.ts +63 -0
  429. package/dist/utils/json-formatter.js +344 -0
  430. package/dist/utils/logger.d.ts +184 -0
  431. package/dist/utils/logger.js +330 -0
  432. package/dist/utils/package-manager.d.ts +30 -0
  433. package/dist/utils/package-manager.js +157 -0
  434. package/dist/utils/version-checker.d.ts +47 -0
  435. package/dist/utils/version-checker.js +167 -0
  436. package/dist/utils/version-display.d.ts +10 -0
  437. package/dist/utils/version-display.js +20 -0
  438. package/package.json +106 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Base LLM provider interface.
3
+ * All LLM providers must implement this interface.
4
+ */
5
+ import type { LLMRequest, LLMResponse } from './types.js';
6
+ /**
7
+ * Base interface for all LLM providers.
8
+ */
9
+ export interface LLMProvider {
10
+ /**
11
+ * Send a chat request to the LLM.
12
+ * @param request - The LLM request with messages and tools
13
+ * @returns Promise resolving to LLM response
14
+ */
15
+ chat(request: LLMRequest): Promise<LLMResponse>;
16
+ /**
17
+ * Check if this provider supports tool/function calling.
18
+ * @returns true if tool calling is supported
19
+ */
20
+ supportsToolCalls(): boolean;
21
+ /**
22
+ * Get the name of this provider.
23
+ * @returns Provider name (e.g., "OpenAI", "Claude", "Ollama")
24
+ */
25
+ getName(): string;
26
+ /**
27
+ * Get the model name being used.
28
+ * @returns Model name
29
+ */
30
+ getModelName(): string;
31
+ }
32
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Base LLM provider interface.
3
+ * All LLM providers must implement this interface.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1,55 @@
1
+ /**
2
+ * LLM provider type definitions.
3
+ * Common types used across all LLM provider implementations.
4
+ */
5
+ /**
6
+ * Message role in a conversation.
7
+ */
8
+ export type MessageRole = 'user' | 'assistant' | 'system';
9
+ /**
10
+ * A message in the conversation.
11
+ */
12
+ export interface LLMMessage {
13
+ role: MessageRole;
14
+ content: string;
15
+ }
16
+ /**
17
+ * Tool definition for LLM function calling.
18
+ */
19
+ export interface ToolDefinition {
20
+ name: string;
21
+ description: string;
22
+ inputSchema: Record<string, unknown>;
23
+ }
24
+ /**
25
+ * A tool call proposed by the LLM.
26
+ */
27
+ export interface ToolCall {
28
+ id: string;
29
+ name: string;
30
+ arguments: Record<string, unknown>;
31
+ }
32
+ /**
33
+ * LLM response containing text and optional tool calls.
34
+ */
35
+ export interface LLMResponse {
36
+ content: string;
37
+ finishReason?: 'stop' | 'length' | 'tool_calls' | 'error';
38
+ toolCalls?: ToolCall[];
39
+ usage?: {
40
+ promptTokens: number;
41
+ completionTokens: number;
42
+ totalTokens: number;
43
+ };
44
+ }
45
+ /**
46
+ * Request to send to LLM.
47
+ */
48
+ export interface LLMRequest {
49
+ messages: LLMMessage[];
50
+ tools?: ToolDefinition[];
51
+ temperature?: number;
52
+ maxTokens?: number;
53
+ systemPrompt?: string;
54
+ }
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,6 @@
1
+ /**
2
+ * LLM provider type definitions.
3
+ * Common types used across all LLM provider implementations.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Base MCP client manager with shared functionality.
3
+ */
4
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
5
+ import type { EventEmitter } from '../../../events/emitter.js';
6
+ import type { TransportType } from '../../../config/types.js';
7
+ /**
8
+ * Base class for MCP client managers with shared functionality.
9
+ */
10
+ export declare abstract class BaseMCPClientManager {
11
+ protected readonly eventEmitter: EventEmitter;
12
+ protected client: Client | null;
13
+ protected connected: boolean;
14
+ constructor(eventEmitter: EventEmitter);
15
+ /**
16
+ * Get available tools from the MCP server.
17
+ */
18
+ getAvailableTools(): Promise<Array<{
19
+ name: string;
20
+ description: string;
21
+ inputSchema: Record<string, unknown>;
22
+ }>>;
23
+ /**
24
+ * Execute a tool call.
25
+ */
26
+ executeTool(toolName: string, toolArguments: Record<string, unknown>, executionMode: boolean): Promise<unknown>;
27
+ /**
28
+ * Check if the manager is connected.
29
+ */
30
+ isConnected(): boolean;
31
+ /**
32
+ * Get the transport type (must be implemented by subclasses).
33
+ */
34
+ abstract getTransportType(): TransportType;
35
+ /**
36
+ * Helper to emit transport error events.
37
+ */
38
+ protected emitTransportError(errorMessage: string, errorCode: string, recoverable: boolean): Promise<void>;
39
+ }
40
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Base MCP client manager with shared functionality.
3
+ */
4
+ import { TransportEventType, ToolExecutionEventType, } from '../../../events/event-type.js';
5
+ import { ConfigurationError } from '../../../utils/errors.js';
6
+ import { v4 as uuidv4 } from 'uuid';
7
+ /**
8
+ * Base class for MCP client managers with shared functionality.
9
+ */
10
+ export class BaseMCPClientManager {
11
+ eventEmitter;
12
+ client = null;
13
+ connected = false;
14
+ constructor(eventEmitter) {
15
+ this.eventEmitter = eventEmitter;
16
+ }
17
+ /**
18
+ * Get available tools from the MCP server.
19
+ */
20
+ async getAvailableTools() {
21
+ if (!this.client || !this.connected) {
22
+ throw new ConfigurationError('MCP client is not connected');
23
+ }
24
+ try {
25
+ const response = await this.client.listTools();
26
+ return (response.tools || []).map(tool => ({
27
+ name: tool.name,
28
+ description: tool.description || '',
29
+ inputSchema: tool.inputSchema || {},
30
+ }));
31
+ }
32
+ catch (error) {
33
+ const errorMessage = error instanceof Error ? error.message : String(error);
34
+ await this.emitTransportError(`Failed to list tools: ${errorMessage}`, 'LIST_TOOLS_ERROR', true);
35
+ throw new Error(`Failed to list tools: ${errorMessage}`);
36
+ }
37
+ }
38
+ /**
39
+ * Execute a tool call.
40
+ */
41
+ async executeTool(toolName, toolArguments, executionMode) {
42
+ if (!this.client || !this.connected) {
43
+ throw new ConfigurationError('MCP client is not connected');
44
+ }
45
+ const executionId = uuidv4();
46
+ const startTime = Date.now();
47
+ // Emit tool execution started event
48
+ await this.eventEmitter.emit(ToolExecutionEventType.TOOL_EXECUTION_STARTED, {
49
+ tool_name: toolName,
50
+ arguments: toolArguments,
51
+ execution_id: executionId,
52
+ });
53
+ // Emit transport message sent event
54
+ // Construct request body from source variables to ensure consistency
55
+ const requestMessage = JSON.stringify({
56
+ method: 'tools/call',
57
+ params: {
58
+ name: toolName,
59
+ arguments: toolArguments,
60
+ },
61
+ });
62
+ // Derive tool_name and tool_arguments from the same source variables
63
+ // used to construct request_body to guarantee consistency
64
+ await this.eventEmitter.emit(TransportEventType.TRANSPORT_MESSAGE_SENT, {
65
+ transport_type: this.getTransportType(),
66
+ message_type: 'tools/call',
67
+ size_bytes: Buffer.byteLength(requestMessage, 'utf8'),
68
+ tool_name: toolName,
69
+ tool_arguments: toolArguments,
70
+ request_body: requestMessage,
71
+ });
72
+ if (!executionMode) {
73
+ // Preview mode - don't actually execute
74
+ const duration = Date.now() - startTime;
75
+ await this.eventEmitter.emit(ToolExecutionEventType.TOOL_EXECUTION_COMPLETED, {
76
+ tool_name: toolName,
77
+ arguments: toolArguments,
78
+ result: {
79
+ preview: true,
80
+ message: 'Tool call preview (not executed)',
81
+ },
82
+ execution_id: executionId,
83
+ duration_ms: duration,
84
+ });
85
+ return { preview: true, message: 'Tool call preview (not executed)' };
86
+ }
87
+ try {
88
+ // Execute the tool
89
+ const result = await this.client.callTool({
90
+ name: toolName,
91
+ arguments: toolArguments,
92
+ });
93
+ const duration = Date.now() - startTime;
94
+ // Emit transport message received event
95
+ const responseMessage = JSON.stringify(result);
96
+ await this.eventEmitter.emit(TransportEventType.TRANSPORT_MESSAGE_RECEIVED, {
97
+ transport_type: this.getTransportType(),
98
+ message_type: 'tools/call_response',
99
+ size_bytes: Buffer.byteLength(responseMessage, 'utf8'),
100
+ });
101
+ // Extract result content
102
+ const resultContent = result.content || [];
103
+ const textContent = resultContent
104
+ .filter((item) => item.type === 'text')
105
+ .map((item) => item.text || '')
106
+ .join('\n');
107
+ const toolResult = textContent || result;
108
+ // Emit tool execution completed event
109
+ await this.eventEmitter.emit(ToolExecutionEventType.TOOL_EXECUTION_COMPLETED, {
110
+ tool_name: toolName,
111
+ arguments: toolArguments,
112
+ result: toolResult,
113
+ execution_id: executionId,
114
+ duration_ms: duration,
115
+ });
116
+ return toolResult;
117
+ }
118
+ catch (error) {
119
+ const duration = Date.now() - startTime;
120
+ const errorMessage = error instanceof Error ? error.message : String(error);
121
+ const errorStack = error instanceof Error ? error.stack : undefined;
122
+ // Emit tool execution failed event
123
+ await this.eventEmitter.emit(ToolExecutionEventType.TOOL_EXECUTION_FAILED, {
124
+ tool_name: toolName,
125
+ arguments: toolArguments,
126
+ execution_id: executionId,
127
+ error: {
128
+ message: errorMessage,
129
+ code: 'TOOL_EXECUTION_ERROR',
130
+ stack_trace: errorStack,
131
+ error_type: 'runtime',
132
+ },
133
+ duration_ms: duration,
134
+ });
135
+ await this.emitTransportError(errorMessage, 'TOOL_EXECUTION_ERROR', true);
136
+ throw new Error(`Tool execution failed: ${errorMessage}`);
137
+ }
138
+ }
139
+ /**
140
+ * Check if the manager is connected.
141
+ */
142
+ isConnected() {
143
+ return this.connected;
144
+ }
145
+ /**
146
+ * Helper to emit transport error events.
147
+ */
148
+ async emitTransportError(errorMessage, errorCode, recoverable) {
149
+ await this.eventEmitter.emit(TransportEventType.TRANSPORT_ERROR, {
150
+ transport_type: this.getTransportType(),
151
+ error_message: errorMessage,
152
+ error_code: errorCode,
153
+ recoverable,
154
+ });
155
+ }
156
+ }
157
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1,91 @@
1
+ /**
2
+ * MCP Client Manager.
3
+ * Manages MCP client connections and tool execution with event integration.
4
+ */
5
+ import type { EventEmitter } from '../../../events/emitter.js';
6
+ import type { TransportType } from '../../../config/types.js';
7
+ import type { MCPURL, Command } from '../../../types/ids.js';
8
+ import { BaseMCPClientManager } from './base.js';
9
+ /**
10
+ * MCP client manager interface.
11
+ */
12
+ export interface MCPClientManager {
13
+ /**
14
+ * Connect to the MCP server.
15
+ * @returns Promise that resolves when connected
16
+ */
17
+ connect(): Promise<void>;
18
+ /**
19
+ * Disconnect from the MCP server.
20
+ * @returns Promise that resolves when disconnected
21
+ */
22
+ disconnect(): Promise<void>;
23
+ /**
24
+ * Get available tools from the MCP server.
25
+ * @returns Array of tool definitions
26
+ */
27
+ getAvailableTools(): Promise<Array<{
28
+ name: string;
29
+ description: string;
30
+ inputSchema: Record<string, unknown>;
31
+ }>>;
32
+ /**
33
+ * Execute a tool call.
34
+ * @param toolName - Name of the tool to execute
35
+ * @param toolArguments - Tool arguments
36
+ * @param executionMode - Whether to actually execute (true) or just preview (false)
37
+ * @returns Tool execution result
38
+ */
39
+ executeTool(toolName: string, toolArguments: Record<string, unknown>, executionMode: boolean): Promise<unknown>;
40
+ /**
41
+ * Check if the manager is connected.
42
+ * @returns true if connected
43
+ */
44
+ isConnected(): boolean;
45
+ /**
46
+ * Get the transport type.
47
+ * @returns Transport type
48
+ */
49
+ getTransportType(): TransportType;
50
+ }
51
+ /**
52
+ * HTTP-based MCP client manager.
53
+ */
54
+ export declare class HTTPMCPClientManager extends BaseMCPClientManager implements MCPClientManager {
55
+ private readonly mcpUrl;
56
+ private readonly shouldSpawn;
57
+ private readonly serverCommand?;
58
+ private transport;
59
+ private process;
60
+ constructor(mcpUrl: string, eventEmitter: EventEmitter, shouldSpawn?: boolean, serverCommand?: string | undefined);
61
+ connect(): Promise<void>;
62
+ /**
63
+ * Spawn the HTTP server as a child process and capture logs.
64
+ */
65
+ private spawnServer;
66
+ disconnect(): Promise<void>;
67
+ getTransportType(): TransportType;
68
+ }
69
+ /**
70
+ * Stdio-based MCP client manager.
71
+ */
72
+ export declare class StdioMCPClientManager extends BaseMCPClientManager implements MCPClientManager {
73
+ private readonly command;
74
+ private transport;
75
+ private process;
76
+ constructor(command: string, eventEmitter: EventEmitter);
77
+ connect(): Promise<void>;
78
+ disconnect(): Promise<void>;
79
+ getTransportType(): TransportType;
80
+ }
81
+ /**
82
+ * Factory function to create an MCP client manager.
83
+ * @param transport - Transport type
84
+ * @param mcpUrl - MCP URL (for HTTP transport)
85
+ * @param command - Command to spawn server (optional, only if shouldSpawn is true)
86
+ * @param eventEmitter - Event emitter for emitting events
87
+ * @param shouldSpawn - Whether to spawn the server as a child process
88
+ * @returns MCP client manager instance
89
+ */
90
+ export declare function createMCPClientManager(transport: TransportType, mcpUrl: MCPURL | string | undefined, command: Command | string | undefined, eventEmitter: EventEmitter, shouldSpawn?: boolean): MCPClientManager;
91
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1,248 @@
1
+ /**
2
+ * MCP Client Manager.
3
+ * Manages MCP client connections and tool execution with event integration.
4
+ */
5
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
6
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
7
+ import { TransportEventType } from '../../../events/event-type.js';
8
+ import { getConnectedClient } from '../connection.js';
9
+ import { ConfigurationError } from '../../../utils/errors.js';
10
+ import { logger } from '../../../utils/logger.js';
11
+ import { parseCommand, setupProcessLogCapture, spawnProcess } from './process.js';
12
+ import { BaseMCPClientManager } from './base.js';
13
+ /**
14
+ * HTTP-based MCP client manager.
15
+ */
16
+ export class HTTPMCPClientManager extends BaseMCPClientManager {
17
+ mcpUrl;
18
+ shouldSpawn;
19
+ serverCommand;
20
+ transport = null;
21
+ process = null;
22
+ constructor(mcpUrl, eventEmitter, shouldSpawn = false, serverCommand) {
23
+ super(eventEmitter);
24
+ this.mcpUrl = mcpUrl;
25
+ this.shouldSpawn = shouldSpawn;
26
+ this.serverCommand = serverCommand;
27
+ }
28
+ async connect() {
29
+ if (this.connected) {
30
+ return;
31
+ }
32
+ try {
33
+ // Spawn server process if needed
34
+ if (this.shouldSpawn && this.serverCommand) {
35
+ this.spawnServer();
36
+ // Wait a bit for server to start
37
+ await new Promise(resolve => setTimeout(resolve, 2000));
38
+ }
39
+ // Emit transport initialization event
40
+ await this.eventEmitter.emit(TransportEventType.TRANSPORT_INITIALIZED, {
41
+ transport_type: 'http',
42
+ endpoint: this.mcpUrl,
43
+ ...(this.shouldSpawn && this.serverCommand
44
+ ? { command: this.serverCommand }
45
+ : {}),
46
+ });
47
+ const connection = await getConnectedClient(this.mcpUrl, undefined, 10000);
48
+ this.client = connection.client;
49
+ this.transport = connection.transport;
50
+ this.connected = true;
51
+ }
52
+ catch (error) {
53
+ const errorMessage = error instanceof Error ? error.message : String(error);
54
+ // Clean up spawned process on error
55
+ if (this.process) {
56
+ this.process.kill();
57
+ this.process = null;
58
+ }
59
+ // Emit transport error event
60
+ await this.eventEmitter.emit(TransportEventType.TRANSPORT_ERROR, {
61
+ transport_type: 'http',
62
+ error_message: errorMessage,
63
+ error_code: 'CONNECTION_FAILED',
64
+ recoverable: true,
65
+ });
66
+ throw new ConfigurationError(`Failed to connect to MCP server at ${this.mcpUrl}: ${errorMessage}`);
67
+ }
68
+ }
69
+ /**
70
+ * Spawn the HTTP server as a child process and capture logs.
71
+ */
72
+ spawnServer() {
73
+ if (!this.serverCommand) {
74
+ throw new ConfigurationError('Server command is required for spawning');
75
+ }
76
+ const command = this.serverCommand.trim();
77
+ if (!command) {
78
+ throw new ConfigurationError('Server command is empty');
79
+ }
80
+ const { executable, args } = parseCommand(command);
81
+ this.process = spawnProcess(executable, args);
82
+ setupProcessLogCapture(this.process);
83
+ // Handle process errors
84
+ this.process.on('error', (error) => {
85
+ void this.emitTransportError(`Failed to spawn server process: ${error.message}`, 'SPAWN_ERROR', false);
86
+ });
87
+ // Handle process exit
88
+ this.process.on('exit', (code, signal) => {
89
+ if (code !== null && code !== 0) {
90
+ void this.emitTransportError(`Server process exited with code ${code}${signal ? ` (signal: ${signal})` : ''}`, 'SERVER_EXIT', false);
91
+ }
92
+ });
93
+ }
94
+ async disconnect() {
95
+ if (!this.connected) {
96
+ return;
97
+ }
98
+ try {
99
+ if (this.transport) {
100
+ await this.transport.close();
101
+ }
102
+ this.connected = false;
103
+ this.client = null;
104
+ this.transport = null;
105
+ }
106
+ catch (error) {
107
+ // Log but don't throw - cleanup errors are non-critical
108
+ const err = error instanceof Error ? error : new Error(String(error));
109
+ logger.error('Error closing transport during disconnect', err);
110
+ await this.eventEmitter.emit(TransportEventType.TRANSPORT_ERROR, {
111
+ transport_type: 'http',
112
+ error_message: err.message,
113
+ error_code: 'DISCONNECT_ERROR',
114
+ recoverable: false,
115
+ });
116
+ }
117
+ }
118
+ getTransportType() {
119
+ return 'http';
120
+ }
121
+ }
122
+ /**
123
+ * Stdio-based MCP client manager.
124
+ */
125
+ export class StdioMCPClientManager extends BaseMCPClientManager {
126
+ command;
127
+ transport = null;
128
+ process = null;
129
+ constructor(command, eventEmitter) {
130
+ super(eventEmitter);
131
+ this.command = command;
132
+ }
133
+ async connect() {
134
+ if (this.connected) {
135
+ return;
136
+ }
137
+ try {
138
+ const command = this.command.trim();
139
+ if (!command) {
140
+ throw new ConfigurationError('Command is empty');
141
+ }
142
+ const { executable, args } = parseCommand(command);
143
+ // Emit transport initialization event
144
+ await this.eventEmitter.emit(TransportEventType.TRANSPORT_INITIALIZED, {
145
+ transport_type: 'stdio',
146
+ command: this.command,
147
+ });
148
+ // Create MCP client
149
+ this.client = new Client({
150
+ name: 'syrin',
151
+ version: '1.0.0',
152
+ }, {
153
+ capabilities: {},
154
+ });
155
+ // Spawn the process
156
+ this.process = spawnProcess(executable, args);
157
+ setupProcessLogCapture(this.process);
158
+ // Create stdio transport
159
+ this.transport = new StdioClientTransport({
160
+ command: executable,
161
+ args,
162
+ env: process.env,
163
+ });
164
+ // Set up error handler
165
+ this.client.onerror = () => {
166
+ // Error handler - errors are logged but we'll catch them in try-catch
167
+ };
168
+ // Set up process error handler
169
+ this.process.on('error', (error) => {
170
+ throw new Error(`Failed to start process: ${error.message}`);
171
+ });
172
+ // Connect with timeout
173
+ const connectionPromise = this.client.connect(this.transport);
174
+ const timeoutPromise = new Promise((_, reject) => {
175
+ setTimeout(() => {
176
+ if (this.process) {
177
+ this.process.kill();
178
+ }
179
+ reject(new Error(`Connection timeout after 10000ms`));
180
+ }, 10000);
181
+ });
182
+ await Promise.race([connectionPromise, timeoutPromise]);
183
+ this.connected = true;
184
+ }
185
+ catch (error) {
186
+ const errorMessage = error instanceof Error ? error.message : String(error);
187
+ // Clean up on error
188
+ if (this.process) {
189
+ this.process.kill();
190
+ this.process = null;
191
+ }
192
+ // Emit transport error event
193
+ await this.eventEmitter.emit(TransportEventType.TRANSPORT_ERROR, {
194
+ transport_type: 'stdio',
195
+ error_message: errorMessage,
196
+ error_code: 'CONNECTION_FAILED',
197
+ recoverable: true,
198
+ });
199
+ throw new ConfigurationError(`Failed to connect to MCP server via stdio: ${errorMessage}`);
200
+ }
201
+ }
202
+ async disconnect() {
203
+ if (!this.connected) {
204
+ return;
205
+ }
206
+ try {
207
+ if (this.transport) {
208
+ await this.transport.close();
209
+ }
210
+ this.connected = false;
211
+ this.client = null;
212
+ this.transport = null;
213
+ }
214
+ catch (error) {
215
+ const err = error instanceof Error ? error : new Error(String(error));
216
+ logger.error('Error closing transport during disconnect', err);
217
+ await this.emitTransportError(err.message, 'DISCONNECT_ERROR', false);
218
+ }
219
+ }
220
+ getTransportType() {
221
+ return 'stdio';
222
+ }
223
+ }
224
+ /**
225
+ * Factory function to create an MCP client manager.
226
+ * @param transport - Transport type
227
+ * @param mcpUrl - MCP URL (for HTTP transport)
228
+ * @param command - Command to spawn server (optional, only if shouldSpawn is true)
229
+ * @param eventEmitter - Event emitter for emitting events
230
+ * @param shouldSpawn - Whether to spawn the server as a child process
231
+ * @returns MCP client manager instance
232
+ */
233
+ export function createMCPClientManager(transport, mcpUrl, command, eventEmitter, shouldSpawn = false) {
234
+ if (transport === 'http') {
235
+ if (!mcpUrl) {
236
+ throw new ConfigurationError('MCP URL is required for HTTP transport');
237
+ }
238
+ return new HTTPMCPClientManager(mcpUrl, eventEmitter, shouldSpawn, command);
239
+ }
240
+ if (transport === 'stdio') {
241
+ if (!command) {
242
+ throw new ConfigurationError('Command is required for stdio transport');
243
+ }
244
+ return new StdioMCPClientManager(command, eventEmitter);
245
+ }
246
+ throw new ConfigurationError(`Unsupported transport type: ${String(transport)}`);
247
+ }
248
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Process spawning utilities for MCP servers.
3
+ */
4
+ import * as childProcess from 'child_process';
5
+ /**
6
+ * Check if a command contains shell operators that require shell execution.
7
+ * We only detect patterns that absolutely require a shell, avoiding false positives.
8
+ * Essential operators: &&, ||, |, ;, $, $(, `
9
+ */
10
+ export declare function requiresShellExecution(command: string): boolean;
11
+ /**
12
+ * Parse a command into executable and arguments.
13
+ * Handles shell operators by wrapping in shell execution.
14
+ */
15
+ export declare function parseCommand(command: string): {
16
+ executable: string;
17
+ args: string[];
18
+ };
19
+ /**
20
+ * Set up log capture for a child process.
21
+ * Captures stdout and stderr, formatting them appropriately.
22
+ */
23
+ export declare function setupProcessLogCapture(process: childProcess.ChildProcess): void;
24
+ /**
25
+ * Spawn a process with proper configuration.
26
+ */
27
+ export declare function spawnProcess(executable: string, args: string[], options?: {
28
+ cwd?: string;
29
+ env?: Record<string, string>;
30
+ }): childProcess.ChildProcess;
31
+ //# sourceMappingURL=process.d.ts.map