synapse-mcp 1.0.0 → 1.0.2

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 (413) hide show
  1. package/README.md +1820 -147
  2. package/dist/constants.d.ts +10 -4
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +18 -8
  5. package/dist/constants.js.map +1 -1
  6. package/dist/events/emitter.d.ts +63 -0
  7. package/dist/events/emitter.d.ts.map +1 -0
  8. package/dist/events/emitter.js +112 -0
  9. package/dist/events/emitter.js.map +1 -0
  10. package/dist/events/index.d.ts +3 -0
  11. package/dist/events/index.d.ts.map +1 -0
  12. package/dist/events/index.js +3 -0
  13. package/dist/events/index.js.map +1 -0
  14. package/dist/events/types.d.ts +51 -0
  15. package/dist/events/types.d.ts.map +1 -0
  16. package/dist/events/types.js +3 -0
  17. package/dist/events/types.js.map +1 -0
  18. package/dist/formatters/compose.d.ts +185 -0
  19. package/dist/formatters/compose.d.ts.map +1 -0
  20. package/dist/formatters/compose.js +397 -0
  21. package/dist/formatters/compose.js.map +1 -0
  22. package/dist/formatters/container.d.ts +84 -0
  23. package/dist/formatters/container.d.ts.map +1 -0
  24. package/dist/formatters/container.js +323 -0
  25. package/dist/formatters/container.js.map +1 -0
  26. package/dist/formatters/diagnostics.d.ts +20 -0
  27. package/dist/formatters/diagnostics.d.ts.map +1 -0
  28. package/dist/formatters/diagnostics.js +73 -0
  29. package/dist/formatters/diagnostics.js.map +1 -0
  30. package/dist/formatters/docker.d.ts +139 -0
  31. package/dist/formatters/docker.d.ts.map +1 -0
  32. package/dist/formatters/docker.js +216 -0
  33. package/dist/formatters/docker.js.map +1 -0
  34. package/dist/formatters/host.d.ts +137 -0
  35. package/dist/formatters/host.d.ts.map +1 -0
  36. package/dist/formatters/host.js +198 -0
  37. package/dist/formatters/host.js.map +1 -0
  38. package/dist/formatters/index.d.ts +17 -270
  39. package/dist/formatters/index.d.ts.map +1 -1
  40. package/dist/formatters/index.js +21 -456
  41. package/dist/formatters/index.js.map +1 -1
  42. package/dist/formatters/scout.d.ts +424 -0
  43. package/dist/formatters/scout.d.ts.map +1 -0
  44. package/dist/formatters/scout.js +687 -0
  45. package/dist/formatters/scout.js.map +1 -0
  46. package/dist/formatters/strategy.d.ts +105 -0
  47. package/dist/formatters/strategy.d.ts.map +1 -0
  48. package/dist/formatters/strategy.js +120 -0
  49. package/dist/formatters/strategy.js.map +1 -0
  50. package/dist/formatters/utils.d.ts +84 -0
  51. package/dist/formatters/utils.d.ts.map +1 -0
  52. package/dist/formatters/utils.js +129 -0
  53. package/dist/formatters/utils.js.map +1 -0
  54. package/dist/health-rate-limiter.d.ts +59 -0
  55. package/dist/health-rate-limiter.d.ts.map +1 -0
  56. package/dist/health-rate-limiter.js +159 -0
  57. package/dist/health-rate-limiter.js.map +1 -0
  58. package/dist/index.js +61 -100
  59. package/dist/index.js.map +1 -1
  60. package/dist/middleware/async-handler.d.ts +62 -0
  61. package/dist/middleware/async-handler.d.ts.map +1 -0
  62. package/dist/middleware/async-handler.js +58 -0
  63. package/dist/middleware/async-handler.js.map +1 -0
  64. package/dist/middleware/auth.d.ts +32 -0
  65. package/dist/middleware/auth.d.ts.map +1 -0
  66. package/dist/middleware/auth.js +63 -0
  67. package/dist/middleware/auth.js.map +1 -0
  68. package/dist/middleware/csrf-protection.d.ts +58 -0
  69. package/dist/middleware/csrf-protection.d.ts.map +1 -0
  70. package/dist/middleware/csrf-protection.js +123 -0
  71. package/dist/middleware/csrf-protection.js.map +1 -0
  72. package/dist/middleware/error-handler.d.ts +49 -0
  73. package/dist/middleware/error-handler.d.ts.map +1 -0
  74. package/dist/middleware/error-handler.js +90 -0
  75. package/dist/middleware/error-handler.js.map +1 -0
  76. package/dist/middleware/error-mapper.d.ts +44 -0
  77. package/dist/middleware/error-mapper.d.ts.map +1 -0
  78. package/dist/middleware/error-mapper.js +127 -0
  79. package/dist/middleware/error-mapper.js.map +1 -0
  80. package/dist/middleware/index.d.ts +13 -0
  81. package/dist/middleware/index.d.ts.map +1 -0
  82. package/dist/middleware/index.js +13 -0
  83. package/dist/middleware/index.js.map +1 -0
  84. package/dist/middleware/request-id.d.ts +22 -0
  85. package/dist/middleware/request-id.d.ts.map +1 -0
  86. package/dist/middleware/request-id.js +31 -0
  87. package/dist/middleware/request-id.js.map +1 -0
  88. package/dist/middleware/types.d.ts +33 -0
  89. package/dist/middleware/types.d.ts.map +1 -0
  90. package/dist/middleware/types.js +2 -0
  91. package/dist/middleware/types.js.map +1 -0
  92. package/dist/schemas/common.d.ts +205 -8
  93. package/dist/schemas/common.d.ts.map +1 -1
  94. package/dist/schemas/common.js +290 -17
  95. package/dist/schemas/common.js.map +1 -1
  96. package/dist/schemas/flux/compose.d.ts +307 -44
  97. package/dist/schemas/flux/compose.d.ts.map +1 -1
  98. package/dist/schemas/flux/compose.js +74 -48
  99. package/dist/schemas/flux/compose.js.map +1 -1
  100. package/dist/schemas/flux/container.d.ts +423 -56
  101. package/dist/schemas/flux/container.d.ts.map +1 -1
  102. package/dist/schemas/flux/container.js +83 -61
  103. package/dist/schemas/flux/container.js.map +1 -1
  104. package/dist/schemas/flux/docker.d.ts +254 -37
  105. package/dist/schemas/flux/docker.d.ts.map +1 -1
  106. package/dist/schemas/flux/docker.js +69 -39
  107. package/dist/schemas/flux/docker.js.map +1 -1
  108. package/dist/schemas/flux/host.d.ts +312 -29
  109. package/dist/schemas/flux/host.d.ts.map +1 -1
  110. package/dist/schemas/flux/host.js +74 -31
  111. package/dist/schemas/flux/host.js.map +1 -1
  112. package/dist/schemas/flux/index.d.ts +503 -11
  113. package/dist/schemas/flux/index.d.ts.map +1 -1
  114. package/dist/schemas/flux/index.js +34 -70
  115. package/dist/schemas/flux/index.js.map +1 -1
  116. package/dist/schemas/host-config.d.ts +76 -0
  117. package/dist/schemas/host-config.d.ts.map +1 -0
  118. package/dist/schemas/host-config.js +105 -0
  119. package/dist/schemas/host-config.js.map +1 -0
  120. package/dist/schemas/scout/index.d.ts +80 -23
  121. package/dist/schemas/scout/index.d.ts.map +1 -1
  122. package/dist/schemas/scout/index.js +26 -11
  123. package/dist/schemas/scout/index.js.map +1 -1
  124. package/dist/schemas/scout/logs.d.ts +17 -5
  125. package/dist/schemas/scout/logs.d.ts.map +1 -1
  126. package/dist/schemas/scout/logs.js +41 -31
  127. package/dist/schemas/scout/logs.js.map +1 -1
  128. package/dist/schemas/scout/simple.d.ts +126 -11
  129. package/dist/schemas/scout/simple.d.ts.map +1 -1
  130. package/dist/schemas/scout/simple.js +112 -57
  131. package/dist/schemas/scout/simple.js.map +1 -1
  132. package/dist/schemas/scout/zfs.d.ts +17 -5
  133. package/dist/schemas/scout/zfs.d.ts.map +1 -1
  134. package/dist/schemas/scout/zfs.js +34 -25
  135. package/dist/schemas/scout/zfs.js.map +1 -1
  136. package/dist/services/cache-layer.d.ts +160 -0
  137. package/dist/services/cache-layer.d.ts.map +1 -0
  138. package/dist/services/cache-layer.js +138 -0
  139. package/dist/services/cache-layer.js.map +1 -0
  140. package/dist/services/compose-cache.d.ts +75 -0
  141. package/dist/services/compose-cache.d.ts.map +1 -0
  142. package/dist/services/compose-cache.js +178 -0
  143. package/dist/services/compose-cache.js.map +1 -0
  144. package/dist/services/compose-discovery.d.ts +46 -0
  145. package/dist/services/compose-discovery.d.ts.map +1 -0
  146. package/dist/services/compose-discovery.js +219 -0
  147. package/dist/services/compose-discovery.js.map +1 -0
  148. package/dist/services/compose-project-lister.d.ts +27 -0
  149. package/dist/services/compose-project-lister.d.ts.map +1 -0
  150. package/dist/services/compose-project-lister.js +71 -0
  151. package/dist/services/compose-project-lister.js.map +1 -0
  152. package/dist/services/compose-scanner.d.ts +63 -0
  153. package/dist/services/compose-scanner.d.ts.map +1 -0
  154. package/dist/services/compose-scanner.js +253 -0
  155. package/dist/services/compose-scanner.js.map +1 -0
  156. package/dist/services/compose.d.ts +64 -28
  157. package/dist/services/compose.d.ts.map +1 -1
  158. package/dist/services/compose.js +220 -98
  159. package/dist/services/compose.js.map +1 -1
  160. package/dist/services/config-loader.d.ts +23 -0
  161. package/dist/services/config-loader.d.ts.map +1 -0
  162. package/dist/services/config-loader.js +124 -0
  163. package/dist/services/config-loader.js.map +1 -0
  164. package/dist/services/config-service.d.ts +38 -0
  165. package/dist/services/config-service.d.ts.map +1 -0
  166. package/dist/services/config-service.js +225 -0
  167. package/dist/services/config-service.js.map +1 -0
  168. package/dist/services/container-host-map-cache.d.ts +121 -0
  169. package/dist/services/container-host-map-cache.d.ts.map +1 -0
  170. package/dist/services/container-host-map-cache.js +188 -0
  171. package/dist/services/container-host-map-cache.js.map +1 -0
  172. package/dist/services/container.d.ts +194 -6
  173. package/dist/services/container.d.ts.map +1 -1
  174. package/dist/services/container.js +386 -11
  175. package/dist/services/container.js.map +1 -1
  176. package/dist/services/diagnostics.d.ts +57 -0
  177. package/dist/services/diagnostics.d.ts.map +1 -0
  178. package/dist/services/diagnostics.js +271 -0
  179. package/dist/services/diagnostics.js.map +1 -0
  180. package/dist/services/docker/container-service.d.ts +123 -0
  181. package/dist/services/docker/container-service.d.ts.map +1 -0
  182. package/dist/services/docker/container-service.js +347 -0
  183. package/dist/services/docker/container-service.js.map +1 -0
  184. package/dist/services/docker/image-service.d.ts +82 -0
  185. package/dist/services/docker/image-service.d.ts.map +1 -0
  186. package/dist/services/docker/image-service.js +193 -0
  187. package/dist/services/docker/image-service.js.map +1 -0
  188. package/dist/services/docker/index.d.ts +80 -0
  189. package/dist/services/docker/index.d.ts.map +1 -0
  190. package/dist/services/docker/index.js +103 -0
  191. package/dist/services/docker/index.js.map +1 -0
  192. package/dist/services/docker/network-service.d.ts +22 -0
  193. package/dist/services/docker/network-service.d.ts.map +1 -0
  194. package/dist/services/docker/network-service.js +43 -0
  195. package/dist/services/docker/network-service.js.map +1 -0
  196. package/dist/services/docker/system-service.d.ts +49 -0
  197. package/dist/services/docker/system-service.d.ts.map +1 -0
  198. package/dist/services/docker/system-service.js +215 -0
  199. package/dist/services/docker/system-service.js.map +1 -0
  200. package/dist/services/docker/utils/client-factory.d.ts +56 -0
  201. package/dist/services/docker/utils/client-factory.d.ts.map +1 -0
  202. package/dist/services/docker/utils/client-factory.js +139 -0
  203. package/dist/services/docker/utils/client-factory.js.map +1 -0
  204. package/dist/services/docker/utils/client-manager.d.ts +88 -0
  205. package/dist/services/docker/utils/client-manager.d.ts.map +1 -0
  206. package/dist/services/docker/utils/client-manager.js +124 -0
  207. package/dist/services/docker/utils/client-manager.js.map +1 -0
  208. package/dist/services/docker/utils/exec-handler.d.ts +94 -0
  209. package/dist/services/docker/utils/exec-handler.d.ts.map +1 -0
  210. package/dist/services/docker/utils/exec-handler.js +197 -0
  211. package/dist/services/docker/utils/exec-handler.js.map +1 -0
  212. package/dist/services/docker/utils/formatters.d.ts +13 -0
  213. package/dist/services/docker/utils/formatters.d.ts.map +1 -0
  214. package/dist/services/docker/utils/formatters.js +33 -0
  215. package/dist/services/docker/utils/formatters.js.map +1 -0
  216. package/dist/services/docker/utils/log-parser.d.ts +10 -0
  217. package/dist/services/docker/utils/log-parser.d.ts.map +1 -0
  218. package/dist/services/docker/utils/log-parser.js +48 -0
  219. package/dist/services/docker/utils/log-parser.js.map +1 -0
  220. package/dist/services/docker/utils/stats-calculator.d.ts +68 -0
  221. package/dist/services/docker/utils/stats-calculator.d.ts.map +1 -0
  222. package/dist/services/docker/utils/stats-calculator.js +61 -0
  223. package/dist/services/docker/utils/stats-calculator.js.map +1 -0
  224. package/dist/services/docker/volume-service.d.ts +22 -0
  225. package/dist/services/docker/volume-service.d.ts.map +1 -0
  226. package/dist/services/docker/volume-service.js +48 -0
  227. package/dist/services/docker/volume-service.js.map +1 -0
  228. package/dist/services/docker-interfaces.d.ts +283 -0
  229. package/dist/services/docker-interfaces.d.ts.map +1 -0
  230. package/dist/services/docker-interfaces.js +13 -0
  231. package/dist/services/docker-interfaces.js.map +1 -0
  232. package/dist/services/docker.d.ts +42 -5
  233. package/dist/services/docker.d.ts.map +1 -1
  234. package/dist/services/docker.js +335 -127
  235. package/dist/services/docker.js.map +1 -1
  236. package/dist/services/file-service.d.ts +6 -2
  237. package/dist/services/file-service.d.ts.map +1 -1
  238. package/dist/services/file-service.js +156 -52
  239. package/dist/services/file-service.js.map +1 -1
  240. package/dist/services/host-config-repository.d.ts +133 -0
  241. package/dist/services/host-config-repository.d.ts.map +1 -0
  242. package/dist/services/host-config-repository.js +323 -0
  243. package/dist/services/host-config-repository.js.map +1 -0
  244. package/dist/services/host-resolver.d.ts +49 -0
  245. package/dist/services/host-resolver.d.ts.map +1 -0
  246. package/dist/services/host-resolver.js +176 -0
  247. package/dist/services/host-resolver.js.map +1 -0
  248. package/dist/services/interfaces.d.ts +61 -194
  249. package/dist/services/interfaces.d.ts.map +1 -1
  250. package/dist/services/local-executor.d.ts +31 -0
  251. package/dist/services/local-executor.d.ts.map +1 -0
  252. package/dist/services/local-executor.js +71 -0
  253. package/dist/services/local-executor.js.map +1 -0
  254. package/dist/services/ssh-config-loader.d.ts +35 -0
  255. package/dist/services/ssh-config-loader.d.ts.map +1 -0
  256. package/dist/services/ssh-config-loader.js +218 -0
  257. package/dist/services/ssh-config-loader.js.map +1 -0
  258. package/dist/services/ssh-pool.d.ts +26 -1
  259. package/dist/services/ssh-pool.d.ts.map +1 -1
  260. package/dist/services/ssh-pool.js +166 -25
  261. package/dist/services/ssh-pool.js.map +1 -1
  262. package/dist/services/ssh-service.d.ts +3 -0
  263. package/dist/services/ssh-service.d.ts.map +1 -1
  264. package/dist/services/ssh-service.js +53 -31
  265. package/dist/services/ssh-service.js.map +1 -1
  266. package/dist/services/ssh.d.ts +2 -6
  267. package/dist/services/ssh.d.ts.map +1 -1
  268. package/dist/services/ssh.js +9 -40
  269. package/dist/services/ssh.js.map +1 -1
  270. package/dist/tools/definitions/flux.d.ts +13 -0
  271. package/dist/tools/definitions/flux.d.ts.map +1 -0
  272. package/dist/tools/definitions/flux.js +101 -0
  273. package/dist/tools/definitions/flux.js.map +1 -0
  274. package/dist/tools/definitions/index.d.ts +8 -0
  275. package/dist/tools/definitions/index.d.ts.map +1 -0
  276. package/dist/tools/definitions/index.js +8 -0
  277. package/dist/tools/definitions/index.js.map +1 -0
  278. package/dist/tools/definitions/scout.d.ts +13 -0
  279. package/dist/tools/definitions/scout.d.ts.map +1 -0
  280. package/dist/tools/definitions/scout.js +78 -0
  281. package/dist/tools/definitions/scout.js.map +1 -0
  282. package/dist/tools/flux.d.ts +16 -8
  283. package/dist/tools/flux.d.ts.map +1 -1
  284. package/dist/tools/flux.js +27 -66
  285. package/dist/tools/flux.js.map +1 -1
  286. package/dist/tools/handlers/base-handler.d.ts +172 -0
  287. package/dist/tools/handlers/base-handler.d.ts.map +1 -0
  288. package/dist/tools/handlers/base-handler.js +234 -0
  289. package/dist/tools/handlers/base-handler.js.map +1 -0
  290. package/dist/tools/handlers/compose-handlers.d.ts +108 -0
  291. package/dist/tools/handlers/compose-handlers.d.ts.map +1 -0
  292. package/dist/tools/handlers/compose-handlers.js +293 -0
  293. package/dist/tools/handlers/compose-handlers.js.map +1 -0
  294. package/dist/tools/handlers/compose-utils.d.ts +35 -0
  295. package/dist/tools/handlers/compose-utils.d.ts.map +1 -0
  296. package/dist/tools/handlers/compose-utils.js +76 -0
  297. package/dist/tools/handlers/compose-utils.js.map +1 -0
  298. package/dist/tools/handlers/compose.d.ts +23 -0
  299. package/dist/tools/handlers/compose.d.ts.map +1 -0
  300. package/dist/tools/handlers/compose.js +125 -0
  301. package/dist/tools/handlers/compose.js.map +1 -0
  302. package/dist/tools/handlers/container.d.ts +23 -0
  303. package/dist/tools/handlers/container.d.ts.map +1 -0
  304. package/dist/tools/handlers/container.js +333 -0
  305. package/dist/tools/handlers/container.js.map +1 -0
  306. package/dist/tools/handlers/docker.d.ts +24 -0
  307. package/dist/tools/handlers/docker.d.ts.map +1 -0
  308. package/dist/tools/handlers/docker.js +155 -0
  309. package/dist/tools/handlers/docker.js.map +1 -0
  310. package/dist/tools/handlers/host.d.ts +23 -0
  311. package/dist/tools/handlers/host.d.ts.map +1 -0
  312. package/dist/tools/handlers/host.js +196 -0
  313. package/dist/tools/handlers/host.js.map +1 -0
  314. package/dist/tools/handlers/scout-logs.d.ts +24 -0
  315. package/dist/tools/handlers/scout-logs.d.ts.map +1 -0
  316. package/dist/tools/handlers/scout-logs.js +119 -0
  317. package/dist/tools/handlers/scout-logs.js.map +1 -0
  318. package/dist/tools/handlers/scout-simple.d.ts +23 -0
  319. package/dist/tools/handlers/scout-simple.d.ts.map +1 -0
  320. package/dist/tools/handlers/scout-simple.js +286 -0
  321. package/dist/tools/handlers/scout-simple.js.map +1 -0
  322. package/dist/tools/handlers/scout-zfs.d.ts +23 -0
  323. package/dist/tools/handlers/scout-zfs.d.ts.map +1 -0
  324. package/dist/tools/handlers/scout-zfs.js +82 -0
  325. package/dist/tools/handlers/scout-zfs.js.map +1 -0
  326. package/dist/tools/index.d.ts +32 -2
  327. package/dist/tools/index.d.ts.map +1 -1
  328. package/dist/tools/index.js +41 -35
  329. package/dist/tools/index.js.map +1 -1
  330. package/dist/tools/registry.d.ts +135 -0
  331. package/dist/tools/registry.d.ts.map +1 -0
  332. package/dist/tools/registry.js +151 -0
  333. package/dist/tools/registry.js.map +1 -0
  334. package/dist/tools/scout.d.ts +16 -8
  335. package/dist/tools/scout.d.ts.map +1 -1
  336. package/dist/tools/scout.js +36 -78
  337. package/dist/tools/scout.js.map +1 -1
  338. package/dist/types.d.ts +629 -1
  339. package/dist/types.d.ts.map +1 -1
  340. package/dist/types.js.map +1 -1
  341. package/dist/utils/command-security.d.ts +82 -0
  342. package/dist/utils/command-security.d.ts.map +1 -0
  343. package/dist/utils/command-security.js +122 -0
  344. package/dist/utils/command-security.js.map +1 -0
  345. package/dist/utils/error-sanitization.d.ts +77 -0
  346. package/dist/utils/error-sanitization.d.ts.map +1 -0
  347. package/dist/utils/error-sanitization.js +107 -0
  348. package/dist/utils/error-sanitization.js.map +1 -0
  349. package/dist/utils/errors.d.ts +30 -6
  350. package/dist/utils/errors.d.ts.map +1 -1
  351. package/dist/utils/errors.js +91 -12
  352. package/dist/utils/errors.js.map +1 -1
  353. package/dist/utils/help-handler.d.ts +23 -0
  354. package/dist/utils/help-handler.d.ts.map +1 -0
  355. package/dist/utils/help-handler.js +21 -0
  356. package/dist/utils/help-handler.js.map +1 -0
  357. package/dist/utils/help.d.ts +1 -1
  358. package/dist/utils/help.d.ts.map +1 -1
  359. package/dist/utils/help.js +57 -16
  360. package/dist/utils/help.js.map +1 -1
  361. package/dist/utils/host-utils.d.ts +31 -0
  362. package/dist/utils/host-utils.d.ts.map +1 -0
  363. package/dist/utils/host-utils.js +80 -0
  364. package/dist/utils/host-utils.js.map +1 -0
  365. package/dist/utils/index.d.ts +8 -2
  366. package/dist/utils/index.d.ts.map +1 -1
  367. package/dist/utils/index.js +8 -2
  368. package/dist/utils/index.js.map +1 -1
  369. package/dist/utils/init-detection.d.ts +36 -0
  370. package/dist/utils/init-detection.d.ts.map +1 -0
  371. package/dist/utils/init-detection.js +79 -0
  372. package/dist/utils/init-detection.js.map +1 -0
  373. package/dist/utils/logger.d.ts +11 -0
  374. package/dist/utils/logger.d.ts.map +1 -0
  375. package/dist/utils/logger.js +32 -0
  376. package/dist/utils/logger.js.map +1 -0
  377. package/dist/utils/pagination.d.ts +20 -0
  378. package/dist/utils/pagination.d.ts.map +1 -0
  379. package/dist/utils/pagination.js +29 -0
  380. package/dist/utils/pagination.js.map +1 -0
  381. package/dist/utils/path-security.d.ts +132 -18
  382. package/dist/utils/path-security.d.ts.map +1 -1
  383. package/dist/utils/path-security.js +164 -35
  384. package/dist/utils/path-security.js.map +1 -1
  385. package/dist/utils/sorting.d.ts +33 -0
  386. package/dist/utils/sorting.d.ts.map +1 -0
  387. package/dist/utils/sorting.js +57 -0
  388. package/dist/utils/sorting.js.map +1 -0
  389. package/dist/utils/text-filters.d.ts +13 -0
  390. package/dist/utils/text-filters.d.ts.map +1 -0
  391. package/dist/utils/text-filters.js +18 -0
  392. package/dist/utils/text-filters.js.map +1 -0
  393. package/dist/utils/time.d.ts +11 -0
  394. package/dist/utils/time.d.ts.map +1 -0
  395. package/dist/utils/time.js +13 -0
  396. package/dist/utils/time.js.map +1 -0
  397. package/dist/utils/validation.d.ts +25 -0
  398. package/dist/utils/validation.d.ts.map +1 -0
  399. package/dist/utils/validation.js +56 -0
  400. package/dist/utils/validation.js.map +1 -0
  401. package/package.json +45 -19
  402. package/dist/schemas/discriminator.d.ts +0 -20
  403. package/dist/schemas/discriminator.d.ts.map +0 -1
  404. package/dist/schemas/discriminator.js +0 -25
  405. package/dist/schemas/discriminator.js.map +0 -1
  406. package/dist/schemas/unified.d.ts +0 -674
  407. package/dist/schemas/unified.d.ts.map +0 -1
  408. package/dist/schemas/unified.js +0 -453
  409. package/dist/schemas/unified.js.map +0 -1
  410. package/dist/tools/unified.d.ts +0 -7
  411. package/dist/tools/unified.d.ts.map +0 -1
  412. package/dist/tools/unified.js +0 -827
  413. package/dist/tools/unified.js.map +0 -1
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Docker system formatting utilities
3
+ *
4
+ * Provides consistent markdown formatting for Docker system info,
5
+ * disk usage, prune operations, images, networks, and volumes.
6
+ */
7
+ import { formatBytes } from "../services/docker/utils/formatters.js";
8
+ /**
9
+ * Format Docker info as markdown
10
+ *
11
+ * Output structure per STYLE.md:
12
+ * 1. Title (Section 3.1): "Docker System Info on {host}" or "(all)"
13
+ * 2. Summary (Section 3.2): "Hosts: N | OK: N | Fail: N"
14
+ * 3. Per-host details with canonical symbols (Section 4.1)
15
+ *
16
+ * Title format:
17
+ * - Single host: "Docker System Info on {host}"
18
+ * - Multiple hosts: "Docker System Info (all)"
19
+ * - No markdown ## prefix (plain text titles)
20
+ *
21
+ * Symbols:
22
+ * - ✗ for errors (never ❌ emoji)
23
+ *
24
+ * @param results - Array of host Docker info results (success or error)
25
+ * @returns Formatted markdown string with system information
26
+ */
27
+ export function formatDockerInfoMarkdown(results) {
28
+ // STYLE.md 3.1: Title format varies by result count
29
+ const title = results.length === 1 ? `Docker System Info on ${results[0].host}` : "Docker System Info (all)";
30
+ // STYLE.md 3.2: Rollup summary with success/error counts
31
+ const totalHosts = results.length;
32
+ const okHosts = results.filter((r) => r.info.status === "success").length;
33
+ const failHosts = results.filter((r) => r.info.status === "error").length;
34
+ const summary = `Hosts: ${totalHosts} | OK: ${okHosts} | Fail: ${failHosts}`;
35
+ const lines = [title, summary, ""];
36
+ for (const { host, info } of results) {
37
+ lines.push(`### ${host}`);
38
+ if (info.status === "error") {
39
+ // Use canonical ✗ symbol per STYLE.md 4.1 (never emoji)
40
+ lines.push(`✗ Error: ${info.errorMessage}`);
41
+ }
42
+ else {
43
+ lines.push(`- Docker: ${info.dockerVersion} (API ${info.apiVersion})`);
44
+ lines.push(`- OS: ${info.os} (${info.arch})`);
45
+ lines.push(`- Kernel: ${info.kernelVersion}`);
46
+ lines.push(`- CPUs: ${info.cpus} | Memory: ${formatBytes(info.memoryBytes)}`);
47
+ lines.push(`- Storage: ${info.storageDriver} @ ${info.rootDir}`);
48
+ lines.push(`- Containers: ${info.containersRunning} running / ${info.containersTotal} total`);
49
+ lines.push(`- Images: ${info.images}`);
50
+ }
51
+ lines.push("");
52
+ }
53
+ return lines.join("\n");
54
+ }
55
+ /**
56
+ * Format Docker disk usage as markdown
57
+ *
58
+ * Output structure per STYLE.md:
59
+ * 1. Title (Section 3.1): "Docker Disk Usage on {host}" or "(all)"
60
+ * 2. Summary (Section 3.2): Aggregate totals across all hosts
61
+ * 3. Per-host usage breakdown tables
62
+ *
63
+ * @param results - Array of host disk usage statistics
64
+ * @returns Formatted markdown string with disk usage by category
65
+ */
66
+ export function formatDockerDfMarkdown(results) {
67
+ // STYLE.md 3.1: Title format varies by result count
68
+ const title = results.length === 1 ? `Docker Disk Usage on ${results[0].host}` : "Docker Disk Usage (all)";
69
+ // STYLE.md 3.2: Rollup summary aggregates size and reclaimable across all hosts
70
+ const totalSize = results.reduce((sum, r) => sum + r.usage.totalSize, 0);
71
+ const totalReclaimable = results.reduce((sum, r) => sum + r.usage.totalReclaimable, 0);
72
+ const summary = `Total: ${formatBytes(totalSize)} | Reclaimable: ${formatBytes(totalReclaimable)}`;
73
+ const lines = [title, summary, ""];
74
+ for (const { host, usage } of results) {
75
+ lines.push(`### ${host}`, "", "| Type | Count | Size | Reclaimable |", "|------|-------|------|-------------|");
76
+ lines.push(`| Images | ${usage.images.total} (${usage.images.active} active) | ${formatBytes(usage.images.size)} | ${formatBytes(usage.images.reclaimable)} |`);
77
+ lines.push(`| Containers | ${usage.containers.total} (${usage.containers.running} running) | ${formatBytes(usage.containers.size)} | ${formatBytes(usage.containers.reclaimable)} |`);
78
+ lines.push(`| Volumes | ${usage.volumes.total} (${usage.volumes.active} active) | ${formatBytes(usage.volumes.size)} | ${formatBytes(usage.volumes.reclaimable)} |`);
79
+ lines.push(`| Build Cache | ${usage.buildCache.total} | ${formatBytes(usage.buildCache.size)} | ${formatBytes(usage.buildCache.reclaimable)} |`);
80
+ lines.push(`| **Total** | | **${formatBytes(usage.totalSize)}** | **${formatBytes(usage.totalReclaimable)}** |`);
81
+ lines.push("");
82
+ }
83
+ return lines.join("\n");
84
+ }
85
+ /**
86
+ * Format prune results as markdown
87
+ *
88
+ * Output structure per STYLE.md:
89
+ * 1. Title (Section 3.1): "Docker Prune on {host}" or "(all)"
90
+ * 2. Per-host RECLAIMED sections (Section 7.8)
91
+ *
92
+ * RECLAIMED format:
93
+ * - Section header: "RECLAIMED:"
94
+ * - Indented list: " type: size"
95
+ * - Not a table (differs from previous implementation)
96
+ *
97
+ * @param allResults - Array of host prune results
98
+ * @returns Formatted markdown string with RECLAIMED sections
99
+ */
100
+ export function formatPruneMarkdown(allResults) {
101
+ // STYLE.md 3.1: Title format varies by result count
102
+ const title = allResults.length === 1 ? `Docker Prune on ${allResults[0].host}` : "Docker Prune (all)";
103
+ const lines = [title, ""];
104
+ // STYLE.md 7.8: Use RECLAIMED section format (indented list, not table)
105
+ for (const { host, results } of allResults) {
106
+ lines.push(`### ${host}`, "", "RECLAIMED:");
107
+ for (const r of results) {
108
+ lines.push(` ${r.type}: ${formatBytes(r.spaceReclaimed)}`);
109
+ }
110
+ lines.push("");
111
+ }
112
+ return lines.join("\n");
113
+ }
114
+ /**
115
+ * Format images list as markdown table
116
+ *
117
+ * Title format per STYLE.md 3.1:
118
+ * - With host: "Docker Images on {host}"
119
+ * - Without host: "Docker Images"
120
+ * - No markdown ## prefix
121
+ *
122
+ * @param images - Array of image information
123
+ * @param total - Total count of images (for pagination)
124
+ * @param offset - Current pagination offset
125
+ * @param host - Optional host name for single-host queries
126
+ * @returns Formatted markdown string with image table
127
+ */
128
+ export function formatImagesMarkdown(images, total, offset, host) {
129
+ if (images.length === 0)
130
+ return "No images found.";
131
+ const title = host ? `Docker Images on ${host}` : "Docker Images";
132
+ const lines = [
133
+ title,
134
+ "",
135
+ `Showing ${images.length} of ${total} images (offset: ${offset})`,
136
+ "",
137
+ "| ID | Tags | Size | Host | Containers |",
138
+ "|-----|------|------|------|------------|",
139
+ ];
140
+ for (const img of images) {
141
+ const tags = img.tags.slice(0, 2).join(", ") + (img.tags.length > 2 ? "..." : "");
142
+ lines.push(`| ${img.id} | ${tags} | ${formatBytes(img.size)} | ${img.hostName} | ${img.containers} |`);
143
+ }
144
+ return lines.join("\n");
145
+ }
146
+ /**
147
+ * Format Docker networks list as markdown
148
+ *
149
+ * Title format per STYLE.MD 3.1:
150
+ * - With host: "Docker Networks on {host}"
151
+ * - Without host: "Docker Networks"
152
+ * - No markdown ## prefix
153
+ *
154
+ * @param networks - Array of network information
155
+ * @param total - Total count of networks (for pagination)
156
+ * @param offset - Current pagination offset
157
+ * @param host - Optional host name for single-host queries
158
+ * @returns Formatted markdown string with networks list
159
+ */
160
+ export function formatNetworksMarkdown(networks, total, offset, host) {
161
+ const title = host ? `Docker Networks on ${host}` : "Docker Networks";
162
+ if (networks.length === 0) {
163
+ return `${title}\n\nNo networks found.`;
164
+ }
165
+ const lines = [
166
+ title,
167
+ "",
168
+ `Showing ${networks.length} of ${total} networks (offset: ${offset})`,
169
+ "",
170
+ ];
171
+ let currentHost = "";
172
+ for (const network of networks) {
173
+ if (network.hostName !== currentHost) {
174
+ currentHost = network.hostName;
175
+ lines.push(`### ${currentHost}`);
176
+ }
177
+ lines.push(`- ${network.name} (${network.driver}, ${network.scope})`);
178
+ }
179
+ return lines.join("\n");
180
+ }
181
+ /**
182
+ * Format Docker volumes list as markdown
183
+ *
184
+ * Title format per STYLE.md 3.1:
185
+ * - With host: "Docker Volumes on {host}"
186
+ * - Without host: "Docker Volumes"
187
+ * - No markdown ## prefix
188
+ *
189
+ * @param volumes - Array of volume information
190
+ * @param total - Total count of volumes (for pagination)
191
+ * @param offset - Current pagination offset
192
+ * @param host - Optional host name for single-host queries
193
+ * @returns Formatted markdown string with volumes list
194
+ */
195
+ export function formatVolumesMarkdown(volumes, total, offset, host) {
196
+ const title = host ? `Docker Volumes on ${host}` : "Docker Volumes";
197
+ if (volumes.length === 0) {
198
+ return `${title}\n\nNo volumes found.`;
199
+ }
200
+ const lines = [
201
+ title,
202
+ "",
203
+ `Showing ${volumes.length} of ${total} volumes (offset: ${offset})`,
204
+ "",
205
+ ];
206
+ let currentHost = "";
207
+ for (const volume of volumes) {
208
+ if (volume.hostName !== currentHost) {
209
+ currentHost = volume.hostName;
210
+ lines.push(`### ${currentHost}`);
211
+ }
212
+ lines.push(`- ${volume.name} (${volume.driver}, ${volume.scope})`);
213
+ }
214
+ return lines.join("\n");
215
+ }
216
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/formatters/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Host and system formatting utilities
3
+ *
4
+ * Provides consistent markdown formatting for host status,
5
+ * resources, and port mappings.
6
+ */
7
+ import type { HostResources } from "../services/ssh.js";
8
+ export type { HostResources } from "../services/ssh.js";
9
+ /**
10
+ * Host status entry type
11
+ */
12
+ export interface HostStatusEntry {
13
+ name: string;
14
+ connected: boolean;
15
+ containerCount: number;
16
+ runningCount: number;
17
+ error?: string;
18
+ }
19
+ /**
20
+ * Format host status as markdown table
21
+ *
22
+ * Title format per STYLE.md 3.1: Plain text, no markdown ## prefix
23
+ * Summary per STYLE.md 3.2: Pipe-separated host counts
24
+ * Legend per STYLE.md 3.3: Shows symbols for mixed states
25
+ * Symbols per STYLE.md 4.1: ● for online, ○ for offline
26
+ * Sorting per STYLE.md Section 12: Severity-first (offline → online)
27
+ *
28
+ * @param status - Array of host status entries
29
+ * @returns Formatted markdown string with status table
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const output = formatHostStatusMarkdown([
34
+ * { name: "squirts", connected: true, containerCount: 10, runningCount: 8 },
35
+ * { name: "boops", connected: false, containerCount: 0, runningCount: 0, error: "Timeout" }
36
+ * ]);
37
+ * // Homelab Host Status
38
+ * // Hosts: 2 | Online: 1 | Offline: 1
39
+ * // Legend: ● online ○ offline
40
+ * //
41
+ * // | Host | Status | Containers | Running |
42
+ * // |--------|-----------------------|------------|---------|
43
+ * // | boops | ○ Offline (Timeout) | 0 | 0 |
44
+ * // | squirts| ● Online | 10 | 8 |
45
+ * ```
46
+ */
47
+ export declare function formatHostStatusMarkdown(status: HostStatusEntry[]): string;
48
+ /**
49
+ * Format host resources as markdown
50
+ *
51
+ * Title format per STYLE.md 3.1: Plain text, no markdown ## prefix
52
+ * Symbols per STYLE.md 4.1: ✗ for errors (no ❌ emoji)
53
+ * Freshness per STYLE.md 3.6: Resources are volatile (CPU, memory, disk)
54
+ * Warning per STYLE.md 10.2: MANDATORY thresholds - CPU>90%, MEM>90%, DISK>85%
55
+ *
56
+ * @param results - Array of host resource results (success or error)
57
+ * @returns Formatted markdown string with resource details
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * const output = formatHostResourcesMarkdown([
62
+ * {
63
+ * host: "squirts",
64
+ * resources: {
65
+ * hostname: "squirts.local",
66
+ * uptime: "10 days",
67
+ * loadAverage: [1.0, 1.5, 2.0],
68
+ * cpu: { cores: 8, usagePercent: 95 },
69
+ * memory: { totalMB: 16384, usedMB: 15360, usagePercent: 94 },
70
+ * disk: [{ mount: "/", totalGB: 100, usedGB: 90, usagePercent: 90 }]
71
+ * }
72
+ * }
73
+ * ]);
74
+ * // Host Resources
75
+ * // As of (EST): 11:45:30 | 02/13/2026
76
+ * //
77
+ * // ### squirts
78
+ * // - **Hostname:** squirts.local
79
+ * // - **Uptime:** 10 days
80
+ * // - **Load:** 1.0, 1.5, 2.0
81
+ * // - **CPU:** 8 cores @ 95% ⚠
82
+ * // - **Memory:** 15360 MB / 16384 MB (94% ⚠)
83
+ * //
84
+ * // **Disks:**
85
+ * // - /: 90G / 100G (90% ⚠)
86
+ * ```
87
+ */
88
+ export declare function formatHostResourcesMarkdown(results: Array<{
89
+ host: string;
90
+ resources: HostResources | null;
91
+ error?: string;
92
+ }>): string;
93
+ /**
94
+ * Port mapping info type for formatting
95
+ */
96
+ export interface HostPortMapping {
97
+ port: number;
98
+ protocol: "tcp" | "udp";
99
+ state: "listening" | "bound" | "reserved";
100
+ source: "host" | "docker" | "compose";
101
+ containerName?: string;
102
+ containerPort?: number;
103
+ }
104
+ /**
105
+ * Format host port mappings as markdown
106
+ *
107
+ * Title format per STYLE.md 3.1: Plain text, no markdown ## prefix
108
+ * Symbols per STYLE.md 4.1: Canonical → for port mapping notation (no emoji)
109
+ * Pagination per STYLE.md Section 12: Standard footer format
110
+ *
111
+ * @param ports - Array of port mapping information
112
+ * @param host - Host name
113
+ * @param total - Total count of ports (for pagination)
114
+ * @param offset - Current pagination offset
115
+ * @param hasMore - Whether more results are available
116
+ * @returns Formatted markdown string with port mappings
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * const output = formatHostPortsMarkdown(
121
+ * [{ port: 8080, protocol: "tcp", state: "listening", source: "docker", containerName: "nginx", containerPort: 80 }],
122
+ * "squirts",
123
+ * 10,
124
+ * 0,
125
+ * true
126
+ * );
127
+ * // Port Mappings - squirts
128
+ * //
129
+ * // | Port | Protocol | State | Source | Container | Mapping |
130
+ * // |------|----------|-----------|--------|-----------|------------|
131
+ * // | 8080 | tcp | listening | docker | nginx | 8080 → 80 |
132
+ * //
133
+ * // Showing 1–1 of 10 | next_offset: 1
134
+ * ```
135
+ */
136
+ export declare function formatHostPortsMarkdown(ports: HostPortMapping[], host: string, total: number, offset: number, hasMore: boolean): string;
137
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/formatters/host.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CA0C1E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAChF,MAAM,CA2CR;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,GAAG,KAAK,CAAC;IACxB,KAAK,EAAE,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;IAC1C,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EAAE,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACf,MAAM,CA+BR"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Host and system formatting utilities
3
+ *
4
+ * Provides consistent markdown formatting for host status,
5
+ * resources, and port mappings.
6
+ */
7
+ import { getTimestamp } from "./utils.js";
8
+ /**
9
+ * Format host status as markdown table
10
+ *
11
+ * Title format per STYLE.md 3.1: Plain text, no markdown ## prefix
12
+ * Summary per STYLE.md 3.2: Pipe-separated host counts
13
+ * Legend per STYLE.md 3.3: Shows symbols for mixed states
14
+ * Symbols per STYLE.md 4.1: ● for online, ○ for offline
15
+ * Sorting per STYLE.md Section 12: Severity-first (offline → online)
16
+ *
17
+ * @param status - Array of host status entries
18
+ * @returns Formatted markdown string with status table
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const output = formatHostStatusMarkdown([
23
+ * { name: "squirts", connected: true, containerCount: 10, runningCount: 8 },
24
+ * { name: "boops", connected: false, containerCount: 0, runningCount: 0, error: "Timeout" }
25
+ * ]);
26
+ * // Homelab Host Status
27
+ * // Hosts: 2 | Online: 1 | Offline: 1
28
+ * // Legend: ● online ○ offline
29
+ * //
30
+ * // | Host | Status | Containers | Running |
31
+ * // |--------|-----------------------|------------|---------|
32
+ * // | boops | ○ Offline (Timeout) | 0 | 0 |
33
+ * // | squirts| ● Online | 10 | 8 |
34
+ * ```
35
+ */
36
+ export function formatHostStatusMarkdown(status) {
37
+ // STYLE.md Section 12: Severity-first sorting (offline → online)
38
+ const sorted = [...status].sort((a, b) => {
39
+ if (!a.connected && b.connected)
40
+ return -1;
41
+ if (a.connected && !b.connected)
42
+ return 1;
43
+ return 0;
44
+ });
45
+ // STYLE.md 3.2: Summary line with counts
46
+ const totalHosts = sorted.length;
47
+ const onlineCount = sorted.filter((h) => h.connected).length;
48
+ const offlineCount = sorted.filter((h) => !h.connected).length;
49
+ // STYLE.md 3.3: Legend for mixed states
50
+ const hasMixedStates = onlineCount > 0 && offlineCount > 0;
51
+ const lines = [
52
+ // STYLE.md 3.1: Plain text title (no markdown ##)
53
+ "Homelab Host Status",
54
+ `Hosts: ${totalHosts} | Online: ${onlineCount} | Offline: ${offlineCount}`,
55
+ ];
56
+ if (hasMixedStates) {
57
+ lines.push("Legend: ● online ○ offline");
58
+ }
59
+ lines.push("", "| Host | Status | Containers | Running |", "|------|--------|------------|---------|");
60
+ for (const h of sorted) {
61
+ // STYLE.md 4.1: Canonical symbols (● for online, ○ for offline)
62
+ const statusSymbol = h.connected ? "●" : "○";
63
+ const statusText = h.connected ? "Online" : `Offline (${h.error || "Unknown"})`;
64
+ lines.push(`| ${h.name} | ${statusSymbol} ${statusText} | ${h.containerCount} | ${h.runningCount} |`);
65
+ }
66
+ return lines.join("\n");
67
+ }
68
+ /**
69
+ * Format host resources as markdown
70
+ *
71
+ * Title format per STYLE.md 3.1: Plain text, no markdown ## prefix
72
+ * Symbols per STYLE.md 4.1: ✗ for errors (no ❌ emoji)
73
+ * Freshness per STYLE.md 3.6: Resources are volatile (CPU, memory, disk)
74
+ * Warning per STYLE.md 10.2: MANDATORY thresholds - CPU>90%, MEM>90%, DISK>85%
75
+ *
76
+ * @param results - Array of host resource results (success or error)
77
+ * @returns Formatted markdown string with resource details
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const output = formatHostResourcesMarkdown([
82
+ * {
83
+ * host: "squirts",
84
+ * resources: {
85
+ * hostname: "squirts.local",
86
+ * uptime: "10 days",
87
+ * loadAverage: [1.0, 1.5, 2.0],
88
+ * cpu: { cores: 8, usagePercent: 95 },
89
+ * memory: { totalMB: 16384, usedMB: 15360, usagePercent: 94 },
90
+ * disk: [{ mount: "/", totalGB: 100, usedGB: 90, usagePercent: 90 }]
91
+ * }
92
+ * }
93
+ * ]);
94
+ * // Host Resources
95
+ * // As of (EST): 11:45:30 | 02/13/2026
96
+ * //
97
+ * // ### squirts
98
+ * // - **Hostname:** squirts.local
99
+ * // - **Uptime:** 10 days
100
+ * // - **Load:** 1.0, 1.5, 2.0
101
+ * // - **CPU:** 8 cores @ 95% ⚠
102
+ * // - **Memory:** 15360 MB / 16384 MB (94% ⚠)
103
+ * //
104
+ * // **Disks:**
105
+ * // - /: 90G / 100G (90% ⚠)
106
+ * ```
107
+ */
108
+ export function formatHostResourcesMarkdown(results) {
109
+ // STYLE.md 3.1: Plain text title (no markdown ##)
110
+ // STYLE.md 3.6: Freshness timestamp for volatile resource data
111
+ const lines = ["Host Resources", getTimestamp(), ""];
112
+ for (const { host, resources, error } of results) {
113
+ lines.push(`### ${host}`);
114
+ if (error || !resources) {
115
+ // STYLE.md 4.1: Canonical ✗ symbol (no ❌ emoji)
116
+ lines.push(`✗ ${error || "Unknown error"}`);
117
+ lines.push("");
118
+ continue;
119
+ }
120
+ lines.push(`- **Hostname:** ${resources.hostname}`);
121
+ lines.push(`- **Uptime:** ${resources.uptime}`);
122
+ lines.push(`- **Load:** ${resources.loadAverage.join(", ")}`);
123
+ // STYLE.md 10.2: CPU warning threshold >90%
124
+ const cpuWarning = resources.cpu.usagePercent > 90 ? " ⚠" : "";
125
+ lines.push(`- **CPU:** ${resources.cpu.cores} cores @ ${resources.cpu.usagePercent}%${cpuWarning}`);
126
+ // STYLE.md 10.2: Memory warning threshold >90%
127
+ const memWarning = resources.memory.usagePercent > 90 ? " ⚠" : "";
128
+ lines.push(`- **Memory:** ${resources.memory.usedMB} MB / ${resources.memory.totalMB} MB (${resources.memory.usagePercent}%${memWarning})`);
129
+ if (resources.disk.length > 0) {
130
+ lines.push("", "**Disks:**");
131
+ for (const d of resources.disk) {
132
+ // STYLE.md 10.2: Disk warning threshold >85%
133
+ const diskWarning = d.usagePercent > 85 ? " ⚠" : "";
134
+ lines.push(`- ${d.mount}: ${d.usedGB}G / ${d.totalGB}G (${d.usagePercent}%${diskWarning})`);
135
+ }
136
+ }
137
+ lines.push("");
138
+ }
139
+ return lines.join("\n");
140
+ }
141
+ /**
142
+ * Format host port mappings as markdown
143
+ *
144
+ * Title format per STYLE.md 3.1: Plain text, no markdown ## prefix
145
+ * Symbols per STYLE.md 4.1: Canonical → for port mapping notation (no emoji)
146
+ * Pagination per STYLE.md Section 12: Standard footer format
147
+ *
148
+ * @param ports - Array of port mapping information
149
+ * @param host - Host name
150
+ * @param total - Total count of ports (for pagination)
151
+ * @param offset - Current pagination offset
152
+ * @param hasMore - Whether more results are available
153
+ * @returns Formatted markdown string with port mappings
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * const output = formatHostPortsMarkdown(
158
+ * [{ port: 8080, protocol: "tcp", state: "listening", source: "docker", containerName: "nginx", containerPort: 80 }],
159
+ * "squirts",
160
+ * 10,
161
+ * 0,
162
+ * true
163
+ * );
164
+ * // Port Mappings - squirts
165
+ * //
166
+ * // | Port | Protocol | State | Source | Container | Mapping |
167
+ * // |------|----------|-----------|--------|-----------|------------|
168
+ * // | 8080 | tcp | listening | docker | nginx | 8080 → 80 |
169
+ * //
170
+ * // Showing 1–1 of 10 | next_offset: 1
171
+ * ```
172
+ */
173
+ export function formatHostPortsMarkdown(ports, host, total, offset, hasMore) {
174
+ // STYLE.md 3.1: Plain text title (no markdown ##)
175
+ if (ports.length === 0) {
176
+ return `Port Mappings - ${host}\n\nNo ports found matching the specified criteria.`;
177
+ }
178
+ const lines = [
179
+ `Port Mappings - ${host}`,
180
+ "",
181
+ "| Port | Protocol | State | Source | Container | Mapping |",
182
+ "|------|----------|-------|--------|-----------|---------|",
183
+ ];
184
+ for (const p of ports) {
185
+ const container = p.containerName || "—";
186
+ // STYLE.md 4.1: Use canonical → for port mapping notation
187
+ const mapping = p.containerPort ? `${p.port} → ${p.containerPort}` : "—";
188
+ // No emoji per STYLE.md 4.1 - just text
189
+ lines.push(`| ${p.port} | ${p.protocol} | ${p.state} | ${p.source} | ${container} | ${mapping} |`);
190
+ }
191
+ // STYLE.md Section 12: Standard pagination footer format
192
+ if (hasMore) {
193
+ const endOffset = offset + ports.length;
194
+ lines.push("", `Showing ${offset + 1}–${endOffset} of ${total} | next_offset: ${endOffset}`);
195
+ }
196
+ return lines.join("\n");
197
+ }
198
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/formatters/host.ts"],"names":[],"mappings":"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"}