@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,100 @@
1
+ /**
2
+ * Goodbye message generator for dev mode.
3
+ * Generates funny, shareable goodbye messages when users exit.
4
+ */
5
+ /**
6
+ * Pre-written goodbye messages for users who didn't test anything.
7
+ */
8
+ const DEFAULT_GOODBYE_MESSAGES = [
9
+ "👋 Thanks for dropping by! Hope you'll come back to test some tools soon!",
10
+ "🚀 See you later! Don't forget to test those MCP tools when you're ready!",
11
+ '✨ Until next time! Your tools are waiting for you!',
12
+ '🎯 Catch you later! Ready to test when you are!',
13
+ '💫 Farewell! Come back when you want to see those tools in action!',
14
+ '🌟 Goodbye! Your MCP server is ready whenever you are!',
15
+ '🎉 See you soon! Time to make those tools shine!',
16
+ '🔥 Later! The tools are ready when you are!',
17
+ ];
18
+ /**
19
+ * Generate a funny, shareable goodbye message using LLM.
20
+ */
21
+ async function generateLLMGoodbyeMessage(llmProvider, sessionState) {
22
+ const toolCallsCount = sessionState.totalToolCalls;
23
+ const toolNames = sessionState.toolCalls
24
+ .map(tc => tc.name)
25
+ .filter((name, index, self) => self.indexOf(name) === index)
26
+ .slice(0, 5); // Limit to first 5 unique tool names
27
+ const sessionDuration = Math.round((Date.now() - sessionState.startTime.getTime()) / 1000);
28
+ const prompt = `You are a witty, humorous AI assistant. A developer just finished testing their MCP (Model Context Protocol) tools using Syrin, a debugging/testing tool.
29
+
30
+ Context:
31
+ - They tested ${toolCallsCount} tool${toolCallsCount !== 1 ? 's' : ''} in total
32
+ - Tool names tested: ${toolNames.length > 0 ? toolNames.join(', ') : 'various tools'}
33
+ - Session duration: ${sessionDuration} second${sessionDuration !== 1 ? 's' : ''}
34
+
35
+ Generate a funny, witty, and shareable goodbye message (2-3 sentences max). The message should:
36
+ 1. Be humorous and natural
37
+ 2. Reference what they tested in a clever way
38
+ 3. Be something they'd want to share on social media (like "look what Syrin told me!")
39
+ 4. Feel personal and engaging
40
+ 5. Be cool and memorable
41
+
42
+ Keep it concise, funny, and make it feel like a natural conversation ending. Don't be overly technical - be witty and relatable.
43
+
44
+ Respond with ONLY the goodbye message, no quotes, no prefixes, just the message text.`;
45
+ try {
46
+ const response = await llmProvider.chat({
47
+ messages: [
48
+ {
49
+ role: 'user',
50
+ content: prompt,
51
+ },
52
+ ],
53
+ temperature: 0.9, // Higher temperature for more creativity
54
+ maxTokens: 150,
55
+ });
56
+ // Extract text content from response
57
+ const content = response.content;
58
+ if (typeof content === 'string' && content.trim()) {
59
+ return content.trim();
60
+ }
61
+ // Fallback if response format is unexpected
62
+ return getRandomDefaultMessage();
63
+ }
64
+ catch (error) {
65
+ // If LLM call fails, fall back to default message
66
+ const errorMessage = error instanceof Error ? error.message : String(error);
67
+ console.error('Failed to generate LLM goodbye message:', errorMessage);
68
+ return getRandomDefaultMessage();
69
+ }
70
+ }
71
+ /**
72
+ * Get a random default goodbye message.
73
+ */
74
+ function getRandomDefaultMessage() {
75
+ const randomIndex = Math.floor(Math.random() * DEFAULT_GOODBYE_MESSAGES.length);
76
+ return DEFAULT_GOODBYE_MESSAGES[randomIndex];
77
+ }
78
+ /**
79
+ * Generate an appropriate goodbye message based on session activity.
80
+ *
81
+ * @param llmProvider - LLM provider to use for generating funny messages (can be minimal interface)
82
+ * @param sessionState - Current session state
83
+ * @returns Promise resolving to goodbye message string
84
+ */
85
+ export async function generateGoodbyeMessage(llmProvider, sessionState) {
86
+ // If user tested tools, try to generate a funny LLM message
87
+ if (sessionState.totalToolCalls > 0 && llmProvider) {
88
+ try {
89
+ return await generateLLMGoodbyeMessage(llmProvider, sessionState);
90
+ }
91
+ catch (error) {
92
+ // Fallback to default if LLM generation fails
93
+ console.error('Error generating LLM goodbye message:', error);
94
+ return getRandomDefaultMessage();
95
+ }
96
+ }
97
+ // If no tools tested or no LLM provider, use default messages
98
+ return getRandomDefaultMessage();
99
+ }
100
+ //# sourceMappingURL=goodbye-messages.js.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Dev Mode presentation layer exports.
3
+ */
4
+ export * from './chat-ui.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Dev Mode presentation layer exports.
3
+ */
4
+ export * from './chat-ui.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Text wrapping utility for user messages.
3
+ */
4
+ /**
5
+ * Wrap text to fit within a specified width.
6
+ *
7
+ * This function guarantees at least one line in the result. When the input is empty
8
+ * or contains only whitespace, it returns `['']` (a single empty string) rather than an empty array.
9
+ * This behavior ensures consistent handling in UI components that expect at least one line
10
+ * to render, preventing layout issues when displaying wrapped text.
11
+ *
12
+ * @param text - The text to wrap
13
+ * @param width - Maximum width per line
14
+ * @returns Array of wrapped lines. Always contains at least one element; returns `['']` for empty or whitespace-only input.
15
+ *
16
+ * @example
17
+ * // Normal text wrapping
18
+ * wrapText('Hello world', 5) // Returns ['Hello', 'world']
19
+ *
20
+ * @example
21
+ * // Empty input returns single empty line
22
+ * wrapText('', 10) // Returns ['']
23
+ * wrapText(' ', 10) // Returns [''] (whitespace-only)
24
+ *
25
+ * @example
26
+ * // Long words are split across lines
27
+ * wrapText('supercalifragilistic', 5) // Returns ['super', 'calif', 'ragil', 'istic']
28
+ */
29
+ export declare function wrapText(text: string, width: number): string[];
30
+ //# sourceMappingURL=text-wrapper.d.ts.map
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Text wrapping utility for user messages.
3
+ */
4
+ /**
5
+ * Wrap text to fit within a specified width.
6
+ *
7
+ * This function guarantees at least one line in the result. When the input is empty
8
+ * or contains only whitespace, it returns `['']` (a single empty string) rather than an empty array.
9
+ * This behavior ensures consistent handling in UI components that expect at least one line
10
+ * to render, preventing layout issues when displaying wrapped text.
11
+ *
12
+ * @param text - The text to wrap
13
+ * @param width - Maximum width per line
14
+ * @returns Array of wrapped lines. Always contains at least one element; returns `['']` for empty or whitespace-only input.
15
+ *
16
+ * @example
17
+ * // Normal text wrapping
18
+ * wrapText('Hello world', 5) // Returns ['Hello', 'world']
19
+ *
20
+ * @example
21
+ * // Empty input returns single empty line
22
+ * wrapText('', 10) // Returns ['']
23
+ * wrapText(' ', 10) // Returns [''] (whitespace-only)
24
+ *
25
+ * @example
26
+ * // Long words are split across lines
27
+ * wrapText('supercalifragilistic', 5) // Returns ['super', 'calif', 'ragil', 'istic']
28
+ */
29
+ export function wrapText(text, width) {
30
+ const words = text.split(/\s+/);
31
+ const lines = [];
32
+ let currentLine = '';
33
+ for (const word of words) {
34
+ // Skip empty tokens
35
+ if (word === '') {
36
+ continue;
37
+ }
38
+ // Handle words longer than width
39
+ if (word.length > width) {
40
+ // Push current line if non-empty before inserting chunks
41
+ if (currentLine) {
42
+ lines.push(currentLine);
43
+ currentLine = '';
44
+ }
45
+ // Split word into chunks of size <= width
46
+ for (let i = 0; i < word.length; i += width) {
47
+ const chunk = word.substring(i, i + width);
48
+ if (chunk.length === width) {
49
+ // Full chunk - append as its own line
50
+ lines.push(chunk);
51
+ }
52
+ else {
53
+ // Remaining partial chunk - start new currentLine
54
+ currentLine = chunk;
55
+ }
56
+ }
57
+ }
58
+ else {
59
+ // Normal word handling
60
+ if (currentLine.length + word.length + 1 <= width) {
61
+ currentLine += (currentLine ? ' ' : '') + word;
62
+ }
63
+ else {
64
+ if (currentLine)
65
+ lines.push(currentLine);
66
+ currentLine = word;
67
+ }
68
+ }
69
+ }
70
+ if (currentLine)
71
+ lines.push(currentLine);
72
+ return lines.length > 0 ? lines : [''];
73
+ }
74
+ //# sourceMappingURL=text-wrapper.js.map
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Presentation utilities for dev command.
3
+ * Separates UI/logic concerns by providing functions for displaying messages.
4
+ */
5
+ /**
6
+ * Build initial welcome messages for dev mode.
7
+ * Returns empty array - welcome banner now handles all welcome info.
8
+ */
9
+ export declare function buildDevWelcomeMessages(): Array<{
10
+ role: 'system';
11
+ content: string;
12
+ }>;
13
+ /**
14
+ * Format tools list for display.
15
+ */
16
+ export declare function formatToolsList(tools: Array<{
17
+ name: string;
18
+ description?: string;
19
+ }>): string;
20
+ /**
21
+ * Format command history for display.
22
+ */
23
+ export declare function formatCommandHistory(historyLines: string[]): string;
24
+ /**
25
+ * Format tool call info for display.
26
+ */
27
+ export declare function formatToolCallInfo(name: string, arguments_: unknown): string;
28
+ /**
29
+ * Format tool result for display.
30
+ * Handles large JSON efficiently with size-based formatting.
31
+ */
32
+ export declare function formatToolResult(name: string, result: unknown, duration?: number): string;
33
+ //# sourceMappingURL=dev-ui.d.ts.map
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Presentation utilities for dev command.
3
+ * Separates UI/logic concerns by providing functions for displaying messages.
4
+ */
5
+ import { Messages } from '../constants/index.js';
6
+ import { estimateObjectSize, formatJSONWithPagination, getJSONSummary, } from '../utils/json-formatter.js';
7
+ /**
8
+ * Build initial welcome messages for dev mode.
9
+ * Returns empty array - welcome banner now handles all welcome info.
10
+ */
11
+ export function buildDevWelcomeMessages() {
12
+ // Return empty array - welcome banner now handles all welcome info
13
+ // Old welcome messages are no longer needed as they're displayed in the persistent banner
14
+ return [];
15
+ }
16
+ /**
17
+ * Format tools list for display.
18
+ */
19
+ export function formatToolsList(tools) {
20
+ let toolsList = `${Messages.DEV_TOOLS_HEADER}\n`;
21
+ if (tools.length === 0) {
22
+ toolsList += `${Messages.DEV_NO_TOOLS}`;
23
+ }
24
+ else {
25
+ for (const tool of tools) {
26
+ toolsList += ` • ${tool.name}`;
27
+ if (tool.description) {
28
+ toolsList += `: ${tool.description}`;
29
+ }
30
+ toolsList += '\n';
31
+ }
32
+ }
33
+ return toolsList.trim();
34
+ }
35
+ /**
36
+ * Format command history for display.
37
+ */
38
+ export function formatCommandHistory(historyLines) {
39
+ if (historyLines.length === 0) {
40
+ return Messages.DEV_NO_HISTORY;
41
+ }
42
+ let historyList = `${Messages.DEV_HISTORY_HEADER}\n`;
43
+ historyLines.forEach((line, index) => {
44
+ historyList += ` ${index + 1}. ${line}\n`;
45
+ });
46
+ return historyList.trim();
47
+ }
48
+ /**
49
+ * Format tool call info for display.
50
+ */
51
+ export function formatToolCallInfo(name, arguments_) {
52
+ return `${Messages.DEV_TOOL_CALLING(name)}\nArguments: ${JSON.stringify(arguments_, null, 2)}`;
53
+ }
54
+ /**
55
+ * Format tool result for display.
56
+ * Handles large JSON efficiently with size-based formatting.
57
+ */
58
+ export function formatToolResult(name, result, duration) {
59
+ const completed = Messages.DEV_TOOL_COMPLETED(name, duration);
60
+ // Fast size estimation without full stringification for very large data
61
+ // Use a lightweight size check first
62
+ let sizeBytes;
63
+ let resultText;
64
+ let parsedData = result;
65
+ try {
66
+ // Try lightweight size estimation first
67
+ if (typeof result === 'string') {
68
+ resultText = result;
69
+ sizeBytes = Buffer.byteLength(result, 'utf8');
70
+ try {
71
+ parsedData = JSON.parse(result);
72
+ }
73
+ catch {
74
+ // Not JSON, treat as string
75
+ parsedData = result;
76
+ }
77
+ }
78
+ else {
79
+ // For objects, estimate size without full stringification
80
+ // This is much faster for large objects
81
+ // Create a small sample by taking a slice/portion of the data
82
+ let sample;
83
+ if (Array.isArray(result)) {
84
+ // Sample first 10 items
85
+ sample = result.slice(0, 10);
86
+ }
87
+ else if (typeof result === 'object' &&
88
+ result !== null &&
89
+ !Array.isArray(result)) {
90
+ // Sample first 10 keys
91
+ const keys = Object.keys(result).slice(0, 10);
92
+ sample = Object.fromEntries(keys.map(key => [key, result[key]]));
93
+ }
94
+ else {
95
+ sample = result;
96
+ }
97
+ const sampleString = JSON.stringify(sample);
98
+ const estimatedSizePerChar = sampleString.length === 0
99
+ ? 1 // Default to 1 byte per char for empty string (UTF-8 average)
100
+ : Buffer.byteLength(sampleString, 'utf8') / sampleString.length;
101
+ const estimatedTotalChars = estimateObjectSize(result);
102
+ sizeBytes = Math.floor(estimatedTotalChars * estimatedSizePerChar);
103
+ // Only stringify if we need to (for small/medium sizes)
104
+ if (sizeBytes < 500 * 1024) {
105
+ resultText = JSON.stringify(result, null, 2);
106
+ }
107
+ else {
108
+ // For large data, skip stringification - we'll just show summary
109
+ resultText = '';
110
+ }
111
+ }
112
+ }
113
+ catch {
114
+ // Fallback: treat as string
115
+ resultText = String(result);
116
+ sizeBytes = Buffer.byteLength(resultText, 'utf8');
117
+ parsedData = result;
118
+ }
119
+ const sizeKB = sizeBytes / 1024;
120
+ const sizeMB = sizeKB / 1024;
121
+ const sizeDisplay = sizeMB >= 1 ? `${sizeMB.toFixed(2)}MB` : `${sizeKB.toFixed(2)}KB`;
122
+ // For very large JSON (> 500KB), skip all expensive operations
123
+ // Just show a simple summary to avoid blocking the UI
124
+ if (sizeBytes > 500 * 1024) {
125
+ // Very large: Skip all formatting, just show summary
126
+ let structureInfo = '';
127
+ try {
128
+ if (Array.isArray(parsedData)) {
129
+ structureInfo = `Array with ${parsedData.length} items`;
130
+ }
131
+ else if (typeof parsedData === 'object' &&
132
+ parsedData !== null &&
133
+ !Array.isArray(parsedData)) {
134
+ const keys = Object.keys(parsedData);
135
+ structureInfo = `Object with ${keys.length} keys: ${keys.slice(0, 10).join(', ')}${keys.length > 10 ? '...' : ''}`;
136
+ }
137
+ }
138
+ catch {
139
+ // Ignore errors in structure detection
140
+ }
141
+ return `${completed}\nResult (${sizeDisplay}${structureInfo ? ` | ${structureInfo}` : ''}):\n\n⚠️ Very large result - formatting skipped to maintain UI responsiveness.\n💡 Use /save-json to export the full data to a file for analysis.\n💡 Full JSON data is available in conversation history for LLM processing.`;
142
+ }
143
+ // For smaller data, we can do formatting (but still optimized)
144
+ // Get JSON summary for structure info (only for data we'll format)
145
+ let summary;
146
+ try {
147
+ summary = getJSONSummary(parsedData);
148
+ }
149
+ catch {
150
+ // If summary fails, use basic info
151
+ summary = {
152
+ type: Array.isArray(parsedData)
153
+ ? 'array'
154
+ : typeof parsedData === 'object' && parsedData !== null
155
+ ? 'object'
156
+ : typeof parsedData,
157
+ size: sizeBytes,
158
+ depth: 0,
159
+ hasLargeArrays: Array.isArray(parsedData) && parsedData.length > 100,
160
+ };
161
+ }
162
+ // Size-based formatting strategy (only for < 500KB)
163
+ // Show collapsed summary by default for better performance
164
+ if (sizeBytes < 100 * 1024) {
165
+ // Small JSON (< 100KB): Show collapsed summary with option to expand
166
+ try {
167
+ // Get a quick summary without full formatting
168
+ let summaryText = '';
169
+ if (Array.isArray(parsedData)) {
170
+ summaryText = `Array with ${parsedData.length} items`;
171
+ if (parsedData.length > 0) {
172
+ summaryText += ` (showing first 3)`;
173
+ const preview = parsedData.slice(0, 3);
174
+ const previewStr = JSON.stringify(preview, null, 2).substring(0, 500);
175
+ summaryText += `:\n${previewStr}${parsedData.length > 3 ? '\n... (use /save-json to see full data)' : ''}`;
176
+ }
177
+ }
178
+ else if (typeof parsedData === 'object' &&
179
+ parsedData !== null &&
180
+ !Array.isArray(parsedData)) {
181
+ const keys = Object.keys(parsedData);
182
+ summaryText = `Object with ${keys.length} keys`;
183
+ if (keys.length > 0) {
184
+ summaryText += ` (showing first 5)`;
185
+ const previewKeys = keys.slice(0, 5);
186
+ const preview = Object.fromEntries(previewKeys.map(k => [
187
+ k,
188
+ parsedData[k],
189
+ ]));
190
+ const previewStr = JSON.stringify(preview, null, 2).substring(0, 500);
191
+ summaryText += `:\n${previewStr}${keys.length > 5 ? '\n... (use /save-json to see full data)' : ''}`;
192
+ }
193
+ }
194
+ else {
195
+ // Primitive or small value: show directly
196
+ summaryText = JSON.stringify(parsedData, null, 2).substring(0, 1000);
197
+ }
198
+ return `${completed}\nResult (${sizeDisplay}):\n${summaryText}\n\n💡 Use /save-json to export the full data to a file.`;
199
+ }
200
+ catch {
201
+ // Fallback to plain JSON if formatting fails
202
+ const fallbackText = typeof parsedData === 'string'
203
+ ? parsedData.substring(0, 1000)
204
+ : JSON.stringify(parsedData, null, 2).substring(0, 1000);
205
+ return `${completed}\nResult (${sizeDisplay}):\n${fallbackText}${sizeBytes > 1000 ? '\n... (use /save-json to see full data)' : ''}`;
206
+ }
207
+ }
208
+ else {
209
+ // Medium JSON (100KB - 500KB): Show tree with pagination
210
+ try {
211
+ const treeFormatted = formatJSONWithPagination(parsedData, {
212
+ maxDepth: 3,
213
+ maxArrayItems: 50,
214
+ itemsPerPage: 20,
215
+ currentPage: 0,
216
+ });
217
+ let structureInfo = '';
218
+ if (summary.itemCount !== undefined) {
219
+ structureInfo = ` | ${summary.itemCount} items`;
220
+ }
221
+ else if (summary.keyCount !== undefined) {
222
+ structureInfo = ` | ${summary.keyCount} keys`;
223
+ }
224
+ return `${completed}\nResult (${sizeDisplay}${structureInfo}):\n${treeFormatted}\n\n💡 Tip: Large arrays are paginated. Use /save-json to export full data.`;
225
+ }
226
+ catch {
227
+ // Fallback to summary if tree formatting fails
228
+ if (!resultText) {
229
+ resultText = JSON.stringify(parsedData, null, 2).substring(0, 5000);
230
+ }
231
+ const lines = resultText.split('\n');
232
+ const previewLines = 30;
233
+ const preview = lines.slice(0, previewLines).join('\n');
234
+ const remaining = lines.length - previewLines;
235
+ let structureInfo = '';
236
+ if (summary.itemCount !== undefined) {
237
+ structureInfo = ` | ${summary.itemCount} items`;
238
+ }
239
+ else if (summary.keyCount !== undefined) {
240
+ structureInfo = ` | ${summary.keyCount} keys`;
241
+ }
242
+ return `${completed}\nResult (${sizeDisplay}${structureInfo}):\n\nPreview (first ${previewLines} lines, ${remaining} more):\n${preview}\n\n[... ${remaining} more lines ...]`;
243
+ }
244
+ }
245
+ }
246
+ //# sourceMappingURL=dev-ui.js.map
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Presentation layer for doctor command UI.
3
+ * Provides modern, minimalistic display for configuration validation results.
4
+ */
5
+ interface CheckResult {
6
+ isValid: boolean;
7
+ message: string;
8
+ fix?: string;
9
+ value?: string;
10
+ }
11
+ interface DoctorReport {
12
+ config: {
13
+ version: unknown;
14
+ project_name: unknown;
15
+ agent_name: unknown;
16
+ transport: string;
17
+ mcp_url?: unknown;
18
+ script?: unknown;
19
+ };
20
+ transportCheck: CheckResult;
21
+ scriptCheck: CheckResult | null;
22
+ llmChecks: Array<{
23
+ provider: string;
24
+ apiKeyCheck: CheckResult;
25
+ modelCheck: CheckResult;
26
+ isDefault: boolean;
27
+ }>;
28
+ localLlmChecks?: Array<{
29
+ provider: string;
30
+ check: CheckResult;
31
+ modelName?: string;
32
+ }>;
33
+ }
34
+ /**
35
+ * Display doctor report using plain console output.
36
+ * This avoids Ink taking control of stdin, which disables terminal history.
37
+ */
38
+ export declare function displayDoctorReport(report: DoctorReport): Promise<void>;
39
+ export {};
40
+ //# sourceMappingURL=doctor-ui.d.ts.map