@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,98 @@
1
+ /**
2
+ * I/O monitor for sandboxed tool execution.
3
+ * Monitors filesystem and network operations (does not block).
4
+ */
5
+ import * as path from 'path';
6
+ /**
7
+ * I/O monitor for tracking operations during tool execution.
8
+ */
9
+ export class IOMonitor {
10
+ fsOperations = [];
11
+ networkOperations = [];
12
+ tempDir;
13
+ projectRoot;
14
+ constructor(tempDir, projectRoot) {
15
+ this.tempDir = path.resolve(tempDir);
16
+ this.projectRoot = path.resolve(projectRoot);
17
+ }
18
+ /**
19
+ * Record a filesystem operation.
20
+ */
21
+ recordFSOperation(operation, filePath) {
22
+ const resolvedPath = path.resolve(filePath);
23
+ this.fsOperations.push({
24
+ operation,
25
+ path: resolvedPath,
26
+ timestamp: Date.now(),
27
+ });
28
+ }
29
+ /**
30
+ * Record a network operation.
31
+ */
32
+ recordNetworkOperation(url, method) {
33
+ this.networkOperations.push({
34
+ url,
35
+ method,
36
+ timestamp: Date.now(),
37
+ });
38
+ }
39
+ /**
40
+ * Get all filesystem operations.
41
+ */
42
+ getFSOperations() {
43
+ return this.fsOperations;
44
+ }
45
+ /**
46
+ * Get all network operations.
47
+ */
48
+ getNetworkOperations() {
49
+ return this.networkOperations;
50
+ }
51
+ /**
52
+ * Get filesystem operations that are side effects (writes to project files).
53
+ * Writes to temp directory are NOT considered side effects.
54
+ */
55
+ getSideEffects() {
56
+ return this.fsOperations.filter(op => {
57
+ // Only writes and deletes to project files are side effects
58
+ if (op.operation !== 'write' && op.operation !== 'delete') {
59
+ return false;
60
+ }
61
+ const resolvedPath = path.resolve(op.path);
62
+ // Check if path is within temp directory (tempDir is already resolved in constructor)
63
+ if (resolvedPath.startsWith(this.tempDir)) {
64
+ return false; // Not a side effect (within temp dir)
65
+ }
66
+ // Check if path is within project root (projectRoot is already resolved in constructor)
67
+ if (resolvedPath.startsWith(this.projectRoot)) {
68
+ return true; // Side effect (write/delete to project file)
69
+ }
70
+ // Writes outside project root are also side effects
71
+ return true;
72
+ });
73
+ }
74
+ /**
75
+ * Get filesystem operations filtered by operation type.
76
+ */
77
+ getFSOperationsByType(operation) {
78
+ return this.fsOperations.filter(op => op.operation === operation);
79
+ }
80
+ /**
81
+ * Clear all recorded operations.
82
+ */
83
+ clear() {
84
+ this.fsOperations = [];
85
+ this.networkOperations = [];
86
+ }
87
+ /**
88
+ * Get summary of I/O operations.
89
+ */
90
+ getSummary() {
91
+ return {
92
+ totalFSOperations: this.fsOperations.length,
93
+ sideEffects: this.getSideEffects().length,
94
+ networkOperations: this.networkOperations.length,
95
+ };
96
+ }
97
+ }
98
+ //# sourceMappingURL=io-monitor.js.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Utility functions for parsing time strings.
3
+ * Supports formats like "30s", "5m", "2h", "1d"
4
+ */
5
+ /**
6
+ * Parse a time string to milliseconds.
7
+ * @param timeString - Time string in format: <number><unit> (e.g., "30s", "5m", "2h", "1d")
8
+ * @returns Time in milliseconds, or undefined if invalid
9
+ * @throws {Error} If format is invalid
10
+ */
11
+ export declare function parseTimeString(timeString: string): number;
12
+ /**
13
+ * Format milliseconds to human-readable time string.
14
+ * @param milliseconds - Time in milliseconds
15
+ * @returns Human-readable time string (e.g., "5m", "2h")
16
+ * @throws {RangeError} If milliseconds is negative
17
+ */
18
+ export declare function formatTimeString(milliseconds: number): string;
19
+ //# sourceMappingURL=time-parser.d.ts.map
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Utility functions for parsing time strings.
3
+ * Supports formats like "30s", "5m", "2h", "1d"
4
+ */
5
+ /**
6
+ * Parse a time string to milliseconds.
7
+ * @param timeString - Time string in format: <number><unit> (e.g., "30s", "5m", "2h", "1d")
8
+ * @returns Time in milliseconds, or undefined if invalid
9
+ * @throws {Error} If format is invalid
10
+ */
11
+ export function parseTimeString(timeString) {
12
+ const match = timeString.match(/^(\d+)([smhd])$/i);
13
+ if (!match) {
14
+ throw new Error(`Invalid time format: "${timeString}". Expected format: <number><unit> (e.g., "30s", "5m", "2h")`);
15
+ }
16
+ const value = parseInt(match[1], 10);
17
+ const unit = match[2].toLowerCase();
18
+ if (value <= 0) {
19
+ throw new Error(`Time value must be positive: ${value}`);
20
+ }
21
+ const multipliers = {
22
+ s: 1000, // seconds to milliseconds
23
+ m: 60 * 1000, // minutes to milliseconds
24
+ h: 60 * 60 * 1000, // hours to milliseconds
25
+ d: 24 * 60 * 60 * 1000, // days to milliseconds
26
+ };
27
+ const multiplier = multipliers[unit];
28
+ if (!multiplier) {
29
+ throw new Error(`Unknown time unit: "${unit}". Supported units: s, m, h, d`);
30
+ }
31
+ const milliseconds = value * multiplier;
32
+ // Check for overflow: ensure the result doesn't exceed Number.MAX_SAFE_INTEGER
33
+ // Also check for Infinity (which can occur when multiplying very large numbers)
34
+ if (!isFinite(milliseconds) || milliseconds > Number.MAX_SAFE_INTEGER) {
35
+ throw new Error(`Time value "${timeString}" exceeds maximum safe integer (${Number.MAX_SAFE_INTEGER}ms). Use a smaller value.`);
36
+ }
37
+ return milliseconds;
38
+ }
39
+ /**
40
+ * Format milliseconds to human-readable time string.
41
+ * @param milliseconds - Time in milliseconds
42
+ * @returns Human-readable time string (e.g., "5m", "2h")
43
+ * @throws {RangeError} If milliseconds is negative
44
+ */
45
+ export function formatTimeString(milliseconds) {
46
+ if (milliseconds < 0) {
47
+ throw new RangeError(`Cannot format negative milliseconds: ${milliseconds}. Time must be non-negative.`);
48
+ }
49
+ if (milliseconds < 1000) {
50
+ return `${milliseconds}ms`;
51
+ }
52
+ const seconds = Math.floor(milliseconds / 1000);
53
+ if (seconds < 60) {
54
+ return `${seconds}s`;
55
+ }
56
+ const minutes = Math.floor(seconds / 60);
57
+ if (minutes < 60) {
58
+ return `${minutes}m`;
59
+ }
60
+ const hours = Math.floor(minutes / 60);
61
+ if (hours < 24) {
62
+ return `${hours}h`;
63
+ }
64
+ const days = Math.floor(hours / 24);
65
+ return `${days}d`;
66
+ }
67
+ //# sourceMappingURL=time-parser.js.map
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Sandbox types and interfaces.
3
+ * Shared types for sandbox execution functionality.
4
+ */
5
+ /**
6
+ * Error types for tool execution.
7
+ */
8
+ export declare enum ToolExecutionErrorType {
9
+ /** Input validation error (e.g., wrong type, missing required field) */
10
+ INPUT_VALIDATION = "INPUT_VALIDATION",
11
+ /** Output validation error (output doesn't match schema) */
12
+ OUTPUT_VALIDATION = "OUTPUT_VALIDATION",
13
+ /** Tool execution error (runtime error in tool) */
14
+ EXECUTION_ERROR = "EXECUTION_ERROR",
15
+ /** Timeout error */
16
+ TIMEOUT = "TIMEOUT",
17
+ /** Network/connection error */
18
+ CONNECTION_ERROR = "CONNECTION_ERROR",
19
+ /** Unknown error */
20
+ UNKNOWN = "UNKNOWN"
21
+ }
22
+ /**
23
+ * Enhanced error with classification.
24
+ */
25
+ export interface ToolExecutionError extends Error {
26
+ /** Error type classification */
27
+ errorType: ToolExecutionErrorType;
28
+ /** Original error code from MCP (if available) */
29
+ errorCode?: number;
30
+ /** Additional error context */
31
+ context?: Record<string, unknown>;
32
+ }
33
+ /**
34
+ * Result of a single tool execution.
35
+ * Discriminated union: successful executions have output, failed executions have error.
36
+ */
37
+ export type ToolExecutionResult = {
38
+ /** Discriminator: true for successful executions */
39
+ success: true;
40
+ /** Tool output */
41
+ output: unknown;
42
+ /** Execution time in milliseconds */
43
+ executionTime: number;
44
+ /** Memory used in MB (if available) */
45
+ memoryUsed?: number;
46
+ } | {
47
+ /** Discriminator: false for failed executions */
48
+ success: false;
49
+ /** Error that occurred during execution */
50
+ error: ToolExecutionError;
51
+ /** Execution time in milliseconds */
52
+ executionTime: number;
53
+ /** Memory used in MB (if available) */
54
+ memoryUsed?: number;
55
+ /** Whether execution timed out */
56
+ timedOut?: boolean;
57
+ };
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Sandbox types and interfaces.
3
+ * Shared types for sandbox execution functionality.
4
+ */
5
+ /**
6
+ * Error types for tool execution.
7
+ */
8
+ export var ToolExecutionErrorType;
9
+ (function (ToolExecutionErrorType) {
10
+ /** Input validation error (e.g., wrong type, missing required field) */
11
+ ToolExecutionErrorType["INPUT_VALIDATION"] = "INPUT_VALIDATION";
12
+ /** Output validation error (output doesn't match schema) */
13
+ ToolExecutionErrorType["OUTPUT_VALIDATION"] = "OUTPUT_VALIDATION";
14
+ /** Tool execution error (runtime error in tool) */
15
+ ToolExecutionErrorType["EXECUTION_ERROR"] = "EXECUTION_ERROR";
16
+ /** Timeout error */
17
+ ToolExecutionErrorType["TIMEOUT"] = "TIMEOUT";
18
+ /** Network/connection error */
19
+ ToolExecutionErrorType["CONNECTION_ERROR"] = "CONNECTION_ERROR";
20
+ /** Unknown error */
21
+ ToolExecutionErrorType["UNKNOWN"] = "UNKNOWN";
22
+ })(ToolExecutionErrorType || (ToolExecutionErrorType = {}));
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Behavioral observer for tool execution.
3
+ * Observes and detects unsafe tool behaviors.
4
+ */
5
+ import type { IOMonitor, FSOperationRecord } from '../../runtime/sandbox/index.js';
6
+ import type { ToolExecutionResult } from '../../runtime/sandbox/index.js';
7
+ import type { ToolContract } from './contract-types.js';
8
+ /**
9
+ * Side effect detection result.
10
+ */
11
+ export interface SideEffectResult {
12
+ /** Whether side effects violate the contract (detected when contract requires none) */
13
+ detected: boolean;
14
+ /** List of observed side effect operations */
15
+ sideEffects: FSOperationRecord[];
16
+ /** Whether any side effects were observed (regardless of contract) */
17
+ observed: boolean;
18
+ }
19
+ /**
20
+ * Output size validation result.
21
+ */
22
+ export interface OutputSizeResult {
23
+ /** Whether output size exceeds limit */
24
+ exceedsLimit: boolean;
25
+ /** Actual output size in bytes */
26
+ actualSize: number;
27
+ /** Maximum allowed size in bytes */
28
+ maxSize: number;
29
+ /** Size limit from contract (e.g., "50kb") */
30
+ limitString: string;
31
+ }
32
+ /**
33
+ * Behavioral observer for tool execution.
34
+ */
35
+ export declare class BehaviorObserver {
36
+ /**
37
+ * Detect side effects from I/O monitor.
38
+ */
39
+ detectSideEffects(ioMonitor: IOMonitor, contract: ToolContract): SideEffectResult;
40
+ /**
41
+ * Check output size against contract limits.
42
+ */
43
+ checkOutputSize(results: ToolExecutionResult[], contract: ToolContract, defaultMaxSizeKB?: number): OutputSizeResult[];
44
+ /**
45
+ * Detect if tool execution timed out or failed.
46
+ * E016 should only trigger for timeouts and connection errors, NOT execution errors (E019).
47
+ */
48
+ detectUnboundedExecution(results: ToolExecutionResult[]): {
49
+ detected: boolean;
50
+ timedOut: boolean;
51
+ errors: Error[];
52
+ };
53
+ /**
54
+ * Detect execution errors (E019) - separate from unbounded execution (E016).
55
+ */
56
+ detectExecutionErrors(results: ToolExecutionResult[]): {
57
+ detected: boolean;
58
+ errors: Error[];
59
+ };
60
+ }
61
+ //# sourceMappingURL=behavior-observer.d.ts.map
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Behavioral observer for tool execution.
3
+ * Observes and detects unsafe tool behaviors.
4
+ */
5
+ import { ToolExecutionErrorType } from '../../runtime/sandbox/index.js';
6
+ /**
7
+ * Parse size string (e.g., "50kb", "1mb") to bytes.
8
+ */
9
+ function parseSize(sizeStr) {
10
+ const match = sizeStr.match(/^(\d+)(kb|mb|gb|b)?$/i);
11
+ if (!match) {
12
+ throw new Error(`Invalid size format: ${sizeStr}`);
13
+ }
14
+ const value = parseInt(match[1], 10);
15
+ const unit = (match[2] || 'b').toLowerCase();
16
+ switch (unit) {
17
+ case 'kb':
18
+ return value * 1024;
19
+ case 'mb':
20
+ return value * 1024 * 1024;
21
+ case 'gb':
22
+ return value * 1024 * 1024 * 1024;
23
+ case 'b':
24
+ default:
25
+ return value;
26
+ }
27
+ }
28
+ /**
29
+ * Calculate size of a value in bytes (JSON stringified).
30
+ */
31
+ function calculateSize(value) {
32
+ try {
33
+ return Buffer.byteLength(JSON.stringify(value), 'utf8');
34
+ }
35
+ catch {
36
+ // If value can't be stringified, estimate
37
+ return String(value).length;
38
+ }
39
+ }
40
+ /**
41
+ * Behavioral observer for tool execution.
42
+ */
43
+ export class BehaviorObserver {
44
+ /**
45
+ * Detect side effects from I/O monitor.
46
+ */
47
+ detectSideEffects(ioMonitor, contract) {
48
+ const sideEffects = ioMonitor.getSideEffects();
49
+ const observed = sideEffects.length > 0;
50
+ // Check if side effects violate contract
51
+ const guarantees = contract.guarantees;
52
+ const requiresNoSideEffects = guarantees?.side_effects === 'none';
53
+ const violatesContract = observed && requiresNoSideEffects;
54
+ return {
55
+ detected: violatesContract,
56
+ sideEffects,
57
+ observed,
58
+ };
59
+ }
60
+ /**
61
+ * Check output size against contract limits.
62
+ */
63
+ checkOutputSize(results, contract, defaultMaxSizeKB = 50) {
64
+ const guarantees = contract.guarantees;
65
+ const maxSizeStr = guarantees?.max_output_size;
66
+ // Determine max size
67
+ let maxSizeBytes;
68
+ if (maxSizeStr) {
69
+ maxSizeBytes = parseSize(maxSizeStr);
70
+ }
71
+ else {
72
+ maxSizeBytes = defaultMaxSizeKB * 1024;
73
+ }
74
+ // Check each result
75
+ return results.map(result => {
76
+ if (!result.success) {
77
+ // Failed executions don't have output, so they can't exceed size limit
78
+ return {
79
+ exceedsLimit: false,
80
+ actualSize: 0,
81
+ maxSize: maxSizeBytes,
82
+ limitString: maxSizeStr || `${defaultMaxSizeKB}kb`,
83
+ };
84
+ }
85
+ const actualSize = calculateSize(result.output);
86
+ return {
87
+ exceedsLimit: actualSize > maxSizeBytes,
88
+ actualSize,
89
+ maxSize: maxSizeBytes,
90
+ limitString: maxSizeStr || `${defaultMaxSizeKB}kb`,
91
+ };
92
+ });
93
+ }
94
+ /**
95
+ * Detect if tool execution timed out or failed.
96
+ * E016 should only trigger for timeouts and connection errors, NOT execution errors (E019).
97
+ */
98
+ detectUnboundedExecution(results) {
99
+ const failedResults = results.filter((r) => !r.success);
100
+ const timedOut = failedResults.some(r => r.timedOut === true);
101
+ // Filter out input validation errors (E018) and execution errors (E019)
102
+ // E016 should only detect timeouts and connection errors (unbounded execution)
103
+ const errors = failedResults
104
+ .filter(r => {
105
+ const errorType = r.error.errorType;
106
+ // Exclude input validation errors (handled by E018)
107
+ // Exclude execution errors (handled by E019)
108
+ // Only include timeouts and connection errors for E016
109
+ return (errorType !== ToolExecutionErrorType.INPUT_VALIDATION &&
110
+ errorType !== ToolExecutionErrorType.EXECUTION_ERROR &&
111
+ (r.timedOut === true ||
112
+ errorType === ToolExecutionErrorType.CONNECTION_ERROR ||
113
+ errorType === ToolExecutionErrorType.TIMEOUT));
114
+ })
115
+ .map(r => r.error);
116
+ return {
117
+ detected: timedOut || errors.length > 0,
118
+ timedOut,
119
+ errors,
120
+ };
121
+ }
122
+ /**
123
+ * Detect execution errors (E019) - separate from unbounded execution (E016).
124
+ */
125
+ detectExecutionErrors(results) {
126
+ const failedResults = results.filter((r) => !r.success);
127
+ const errors = failedResults
128
+ .filter(r => {
129
+ const errorType = r.error.errorType;
130
+ // Only include execution errors (not input validation, not timeouts)
131
+ return errorType === ToolExecutionErrorType.EXECUTION_ERROR;
132
+ })
133
+ .map(r => r.error);
134
+ return {
135
+ detected: errors.length > 0,
136
+ errors,
137
+ };
138
+ }
139
+ }
140
+ //# sourceMappingURL=behavior-observer.js.map
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Contract file loader.
3
+ * Loads and parses tool contract YAML files.
4
+ */
5
+ import type { ParsedContract } from './contract-types.js';
6
+ /**
7
+ * Load a contract from a YAML file.
8
+ * @param filePath - Path to the contract YAML file
9
+ * @returns Parsed contract with metadata
10
+ * @throws {ConfigurationError} If file is missing or invalid
11
+ */
12
+ export declare function loadContract(filePath: string): ParsedContract;
13
+ /**
14
+ * Discover all contract files in a directory (recursively).
15
+ * @param toolsDir - Directory containing contract files
16
+ * @returns Array of contract file paths
17
+ * @throws {ConfigurationError} If directory doesn't exist
18
+ */
19
+ export declare function discoverContractFiles(toolsDir: string): string[];
20
+ /**
21
+ * Load all contracts from a tools directory.
22
+ * @param toolsDir - Directory containing contract files
23
+ * @returns Array of parsed contracts
24
+ * @throws {ConfigurationError} If directory doesn't exist or contracts are invalid
25
+ */
26
+ export declare function loadAllContracts(toolsDir: string): ParsedContract[];
27
+ /**
28
+ * Match tool name to contract file.
29
+ * Extracts tool name from filename regardless of directory depth.
30
+ * @param filePath - Path to contract file
31
+ * @returns Tool name extracted from filename
32
+ */
33
+ export declare function extractToolNameFromPath(filePath: string): string;
34
+ /**
35
+ * Find contract for a specific tool name.
36
+ * @param contracts - Array of parsed contracts
37
+ * @param toolName - Tool name to find
38
+ * @returns Contract for the tool, or undefined if not found
39
+ */
40
+ export declare function findContractForTool(contracts: ParsedContract[], toolName: string): ParsedContract | undefined;
41
+ //# sourceMappingURL=contract-loader.d.ts.map
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Contract file loader.
3
+ * Loads and parses tool contract YAML files.
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import { load } from 'js-yaml';
8
+ import { ZodError } from 'zod';
9
+ import { validateContract } from './contract-schema.js';
10
+ import { ConfigurationError } from '../../utils/errors.js';
11
+ /**
12
+ * Load a contract from a YAML file.
13
+ * @param filePath - Path to the contract YAML file
14
+ * @returns Parsed contract with metadata
15
+ * @throws {ConfigurationError} If file is missing or invalid
16
+ */
17
+ export function loadContract(filePath) {
18
+ try {
19
+ // Read and parse YAML file (removes TOCTOU risk by combining read + parse in try-catch)
20
+ const fileContent = fs.readFileSync(filePath, 'utf-8');
21
+ const contractData = load(fileContent);
22
+ if (!contractData || typeof contractData !== 'object') {
23
+ throw new ConfigurationError(`Contract file is empty or invalid: ${filePath}`, {
24
+ context: { filePath },
25
+ });
26
+ }
27
+ // Validate contract schema
28
+ const validatedContract = validateContract(contractData);
29
+ // Extract metadata
30
+ const directory = path.dirname(filePath);
31
+ const toolName = validatedContract.tool;
32
+ return {
33
+ ...validatedContract,
34
+ filePath,
35
+ directory,
36
+ toolName,
37
+ };
38
+ }
39
+ catch (error) {
40
+ if (error instanceof ConfigurationError) {
41
+ throw error;
42
+ }
43
+ // Handle file system errors (file not found, permission denied, etc.)
44
+ if (error && typeof error === 'object' && 'code' in error) {
45
+ const err = error;
46
+ if (err.code === 'ENOENT') {
47
+ throw new ConfigurationError(`Contract file not found: ${filePath}`, {
48
+ context: { filePath },
49
+ cause: error instanceof Error ? error : undefined,
50
+ });
51
+ }
52
+ }
53
+ // Handle Zod validation errors
54
+ if (error instanceof ZodError) {
55
+ throw new ConfigurationError(`Invalid contract schema in ${filePath}: ${error.message}`, {
56
+ cause: error,
57
+ context: { filePath },
58
+ });
59
+ }
60
+ throw new ConfigurationError(`Failed to load contract from ${filePath}: ${error instanceof Error ? error.message : String(error)}`, {
61
+ cause: error instanceof Error ? error : new Error(String(error)),
62
+ context: { filePath },
63
+ });
64
+ }
65
+ }
66
+ /**
67
+ * Discover all contract files in a directory (recursively).
68
+ * @param toolsDir - Directory containing contract files
69
+ * @returns Array of contract file paths
70
+ * @throws {ConfigurationError} If directory doesn't exist
71
+ */
72
+ export function discoverContractFiles(toolsDir) {
73
+ // Check if directory exists
74
+ if (!fs.existsSync(toolsDir)) {
75
+ throw new ConfigurationError(`Tools directory not found: ${toolsDir}. Create it and add tool contract files (tools/<tool-name>.yaml)`, {
76
+ context: { toolsDir },
77
+ });
78
+ }
79
+ if (!fs.statSync(toolsDir).isDirectory()) {
80
+ throw new ConfigurationError(`Path is not a directory: ${toolsDir}`, {
81
+ context: { toolsDir },
82
+ });
83
+ }
84
+ const contractFiles = [];
85
+ /**
86
+ * Recursively find all .yaml files in directory.
87
+ */
88
+ function findYamlFiles(dir) {
89
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
90
+ for (const entry of entries) {
91
+ const fullPath = path.join(dir, entry.name);
92
+ if (entry.isDirectory()) {
93
+ // Recursively search subdirectories
94
+ findYamlFiles(fullPath);
95
+ }
96
+ else if (entry.isFile() && entry.name.endsWith('.yaml')) {
97
+ contractFiles.push(fullPath);
98
+ }
99
+ }
100
+ }
101
+ findYamlFiles(toolsDir);
102
+ return contractFiles.sort(); // Sort for consistent ordering
103
+ }
104
+ /**
105
+ * Load all contracts from a tools directory.
106
+ * @param toolsDir - Directory containing contract files
107
+ * @returns Array of parsed contracts
108
+ * @throws {ConfigurationError} If directory doesn't exist or contracts are invalid
109
+ */
110
+ export function loadAllContracts(toolsDir) {
111
+ const contractFiles = discoverContractFiles(toolsDir);
112
+ if (contractFiles.length === 0) {
113
+ throw new ConfigurationError(`No contract files found in ${toolsDir}. Add tool contract files (tools/<tool-name>.yaml)`, {
114
+ context: { toolsDir },
115
+ });
116
+ }
117
+ const contracts = [];
118
+ const errors = [];
119
+ for (const filePath of contractFiles) {
120
+ try {
121
+ const contract = loadContract(filePath);
122
+ contracts.push(contract);
123
+ }
124
+ catch (error) {
125
+ const errorMessage = error instanceof Error ? error.message : String(error);
126
+ errors.push({ file: filePath, error: errorMessage });
127
+ }
128
+ }
129
+ if (errors.length > 0) {
130
+ const errorMessages = errors
131
+ .map(e => ` - ${e.file}: ${e.error}`)
132
+ .join('\n');
133
+ throw new ConfigurationError(`Failed to load ${errors.length} contract file(s):\n${errorMessages}`, {
134
+ context: { toolsDir, errors },
135
+ });
136
+ }
137
+ return contracts;
138
+ }
139
+ /**
140
+ * Match tool name to contract file.
141
+ * Extracts tool name from filename regardless of directory depth.
142
+ * @param filePath - Path to contract file
143
+ * @returns Tool name extracted from filename
144
+ */
145
+ export function extractToolNameFromPath(filePath) {
146
+ const filename = path.basename(filePath, '.yaml');
147
+ return filename;
148
+ }
149
+ /**
150
+ * Find contract for a specific tool name.
151
+ * @param contracts - Array of parsed contracts
152
+ * @param toolName - Tool name to find
153
+ * @returns Contract for the tool, or undefined if not found
154
+ */
155
+ export function findContractForTool(contracts, toolName) {
156
+ return contracts.find(contract => contract.tool === toolName);
157
+ }
158
+ //# sourceMappingURL=contract-loader.js.map