@navios/commander-tui 1.2.0 → 1.4.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 (421) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +42 -1
  3. package/{src/__tests__/mocks/scm-mock.ts → dist/base/src/__tests__/mocks/scm-mock.d.ts} +3 -1
  4. package/dist/base/src/__tests__/mocks/scm-mock.d.ts.map +1 -0
  5. package/dist/base/src/__tests__/setup.d.ts +2 -0
  6. package/dist/base/src/__tests__/setup.d.ts.map +1 -0
  7. package/dist/base/src/__tests__/utils/factories.d.ts +67 -0
  8. package/dist/base/src/__tests__/utils/factories.d.ts.map +1 -0
  9. package/dist/base/src/__tests__/utils/render-utils.d.ts +21 -0
  10. package/dist/base/src/__tests__/utils/render-utils.d.ts.map +1 -0
  11. package/dist/base/src/__tests__/utils/test-container.d.ts +20 -0
  12. package/dist/base/src/__tests__/utils/test-container.d.ts.map +1 -0
  13. package/dist/base/src/adapters/index.d.ts +2 -0
  14. package/dist/base/src/adapters/index.d.ts.map +1 -0
  15. package/dist/base/src/adapters/interface.d.ts +52 -0
  16. package/dist/base/src/adapters/interface.d.ts.map +1 -0
  17. package/dist/base/src/components/index.d.ts +2 -0
  18. package/dist/base/src/components/index.d.ts.map +1 -0
  19. package/dist/base/src/context/index.d.ts +2 -0
  20. package/dist/base/src/context/index.d.ts.map +1 -0
  21. package/dist/base/src/factories/index.d.ts +3 -0
  22. package/dist/base/src/factories/index.d.ts.map +1 -0
  23. package/dist/base/src/factories/isomorphic-logger.factory.d.ts +8 -0
  24. package/dist/base/src/factories/isomorphic-logger.factory.d.ts.map +1 -0
  25. package/dist/base/src/factories/screen.factory.d.ts +8 -0
  26. package/dist/base/src/factories/screen.factory.d.ts.map +1 -0
  27. package/dist/base/src/filter/filter_engine.d.ts +19 -0
  28. package/dist/base/src/filter/filter_engine.d.ts.map +1 -0
  29. package/dist/base/src/filter/index.d.ts +2 -0
  30. package/dist/base/src/filter/index.d.ts.map +1 -0
  31. package/dist/base/src/hooks/index.d.ts +2 -0
  32. package/dist/base/src/hooks/index.d.ts.map +1 -0
  33. package/dist/base/src/index.d.ts +16 -0
  34. package/dist/base/src/index.d.ts.map +1 -0
  35. package/dist/base/src/interfaces/index.d.ts +2 -0
  36. package/dist/base/src/interfaces/index.d.ts.map +1 -0
  37. package/dist/base/src/interfaces/isomorphic-logger.d.ts +9 -0
  38. package/dist/base/src/interfaces/isomorphic-logger.d.ts.map +1 -0
  39. package/dist/base/src/keyboard/create_bindings.d.ts +26 -0
  40. package/dist/base/src/keyboard/create_bindings.d.ts.map +1 -0
  41. package/dist/base/src/keyboard/index.d.ts +3 -0
  42. package/dist/base/src/keyboard/index.d.ts.map +1 -0
  43. package/dist/base/src/keyboard/keyboard_manager.d.ts +63 -0
  44. package/dist/base/src/keyboard/keyboard_manager.d.ts.map +1 -0
  45. package/dist/base/src/overrides/console.logger.override.d.ts +3 -0
  46. package/dist/base/src/overrides/console.logger.override.d.ts.map +1 -0
  47. package/dist/base/src/overrides/index.d.ts +3 -0
  48. package/dist/base/src/overrides/index.d.ts.map +1 -0
  49. package/dist/base/src/overrides/missing-adapter.override.d.ts +16 -0
  50. package/dist/base/src/overrides/missing-adapter.override.d.ts.map +1 -0
  51. package/dist/base/src/schemas/index.d.ts +4 -0
  52. package/dist/base/src/schemas/index.d.ts.map +1 -0
  53. package/dist/base/src/schemas/logger-options.d.ts +21 -0
  54. package/dist/base/src/schemas/logger-options.d.ts.map +1 -0
  55. package/dist/base/src/schemas/prompt-options.d.ts +12 -0
  56. package/dist/base/src/schemas/prompt-options.d.ts.map +1 -0
  57. package/dist/base/src/schemas/screen-options.d.ts +10 -0
  58. package/dist/base/src/schemas/screen-options.d.ts.map +1 -0
  59. package/dist/base/src/services/index.d.ts +6 -0
  60. package/dist/base/src/services/index.d.ts.map +1 -0
  61. package/dist/base/src/services/logger.d.ts +52 -0
  62. package/dist/base/src/services/logger.d.ts.map +1 -0
  63. package/dist/base/src/services/prompt.d.ts +31 -0
  64. package/dist/base/src/services/prompt.d.ts.map +1 -0
  65. package/dist/base/src/services/readline_prompt.d.ts +27 -0
  66. package/dist/base/src/services/readline_prompt.d.ts.map +1 -0
  67. package/dist/base/src/services/screen.d.ts +167 -0
  68. package/dist/base/src/services/screen.d.ts.map +1 -0
  69. package/dist/base/src/services/screen_manager.d.ts +180 -0
  70. package/dist/base/src/services/screen_manager.d.ts.map +1 -0
  71. package/dist/base/src/themes/dark.d.ts +7 -0
  72. package/dist/base/src/themes/dark.d.ts.map +1 -0
  73. package/dist/base/src/themes/high-contrast.d.ts +7 -0
  74. package/dist/base/src/themes/high-contrast.d.ts.map +1 -0
  75. package/dist/base/src/themes/index.d.ts +5 -0
  76. package/dist/base/src/themes/index.d.ts.map +1 -0
  77. package/dist/base/src/themes/light.d.ts +6 -0
  78. package/dist/base/src/themes/light.d.ts.map +1 -0
  79. package/dist/base/src/themes/utils.d.ts +22 -0
  80. package/dist/base/src/themes/utils.d.ts.map +1 -0
  81. package/dist/base/src/tokens/adapter.d.ts +9 -0
  82. package/dist/base/src/tokens/adapter.d.ts.map +1 -0
  83. package/dist/base/src/tokens/index.d.ts +6 -0
  84. package/dist/base/src/tokens/index.d.ts.map +1 -0
  85. package/dist/base/src/tokens/logger.d.ts +44 -0
  86. package/dist/base/src/tokens/logger.d.ts.map +1 -0
  87. package/dist/base/src/tokens/prompt.d.ts +12 -0
  88. package/dist/base/src/tokens/prompt.d.ts.map +1 -0
  89. package/dist/base/src/tokens/screen-manager.d.ts +8 -0
  90. package/dist/base/src/tokens/screen-manager.d.ts.map +1 -0
  91. package/dist/base/src/tokens/screen.d.ts +10 -0
  92. package/dist/base/src/tokens/screen.d.ts.map +1 -0
  93. package/dist/base/src/types/events.types.d.ts +40 -0
  94. package/dist/base/src/types/events.types.d.ts.map +1 -0
  95. package/dist/base/src/types/file.types.d.ts +40 -0
  96. package/dist/base/src/types/file.types.d.ts.map +1 -0
  97. package/dist/base/src/types/filter.types.d.ts +31 -0
  98. package/dist/base/src/types/filter.types.d.ts.map +1 -0
  99. package/dist/base/src/types/index.d.ts +10 -0
  100. package/dist/base/src/types/index.d.ts.map +1 -0
  101. package/dist/base/src/types/keyboard.types.d.ts +83 -0
  102. package/dist/base/src/types/keyboard.types.d.ts.map +1 -0
  103. package/dist/base/src/types/log.types.d.ts +39 -0
  104. package/dist/base/src/types/log.types.d.ts.map +1 -0
  105. package/dist/base/src/types/message.types.d.ts +82 -0
  106. package/dist/base/src/types/message.types.d.ts.map +1 -0
  107. package/dist/base/src/types/prompt.types.d.ts +85 -0
  108. package/dist/base/src/types/prompt.types.d.ts.map +1 -0
  109. package/dist/base/src/types/screen.types.d.ts +107 -0
  110. package/dist/base/src/types/screen.types.d.ts.map +1 -0
  111. package/dist/base/src/types/theme.types.d.ts +217 -0
  112. package/dist/base/src/types/theme.types.d.ts.map +1 -0
  113. package/dist/base/src/utils/colors/file-colors.d.ts +10 -0
  114. package/dist/base/src/utils/colors/file-colors.d.ts.map +1 -0
  115. package/dist/base/src/utils/colors/helpers.d.ts +10 -0
  116. package/dist/base/src/utils/colors/helpers.d.ts.map +1 -0
  117. package/dist/base/src/utils/colors/index.d.ts +8 -0
  118. package/dist/base/src/utils/colors/index.d.ts.map +1 -0
  119. package/dist/base/src/utils/colors/log-colors.d.ts +19 -0
  120. package/dist/base/src/utils/colors/log-colors.d.ts.map +1 -0
  121. package/dist/base/src/utils/colors/progress-colors.d.ts +25 -0
  122. package/dist/base/src/utils/colors/progress-colors.d.ts.map +1 -0
  123. package/dist/base/src/utils/colors/prompt-colors.d.ts +22 -0
  124. package/dist/base/src/utils/colors/prompt-colors.d.ts.map +1 -0
  125. package/dist/base/src/utils/colors/sidebar-colors.d.ts +50 -0
  126. package/dist/base/src/utils/colors/sidebar-colors.d.ts.map +1 -0
  127. package/dist/base/src/utils/colors/table-colors.d.ts +12 -0
  128. package/dist/base/src/utils/colors/table-colors.d.ts.map +1 -0
  129. package/dist/base/src/utils/filetype.d.ts +19 -0
  130. package/dist/base/src/utils/filetype.d.ts.map +1 -0
  131. package/dist/base/src/utils/format.d.ts +9 -0
  132. package/dist/base/src/utils/format.d.ts.map +1 -0
  133. package/dist/base/src/utils/index.d.ts +7 -0
  134. package/dist/base/src/utils/index.d.ts.map +1 -0
  135. package/dist/base/src/utils/prompt.d.ts +7 -0
  136. package/dist/base/src/utils/prompt.d.ts.map +1 -0
  137. package/dist/base/src/utils/runtime.d.ts +10 -0
  138. package/dist/base/src/utils/runtime.d.ts.map +1 -0
  139. package/dist/base/src/utils/stdout-printer.d.ts +11 -0
  140. package/dist/base/src/utils/stdout-printer.d.ts.map +1 -0
  141. package/dist/base/tsconfig.base.tsbuildinfo +1 -0
  142. package/dist/base/tsconfig.tsbuildinfo +1 -0
  143. package/dist/ink/src/adapters/ink/components/file/file_log.d.ts +28 -0
  144. package/dist/ink/src/adapters/ink/components/file/file_log.d.ts.map +1 -0
  145. package/dist/ink/src/adapters/ink/components/file/index.d.ts +2 -0
  146. package/dist/ink/src/adapters/ink/components/file/index.d.ts.map +1 -0
  147. package/dist/ink/src/adapters/ink/components/filter/filter_bar.d.ts +7 -0
  148. package/dist/ink/src/adapters/ink/components/filter/filter_bar.d.ts.map +1 -0
  149. package/dist/ink/src/adapters/ink/components/filter/index.d.ts +2 -0
  150. package/dist/ink/src/adapters/ink/components/filter/index.d.ts.map +1 -0
  151. package/dist/ink/src/adapters/ink/components/help/help_overlay.d.ts +6 -0
  152. package/dist/ink/src/adapters/ink/components/help/help_overlay.d.ts.map +1 -0
  153. package/dist/ink/src/adapters/ink/components/help/index.d.ts +2 -0
  154. package/dist/ink/src/adapters/ink/components/help/index.d.ts.map +1 -0
  155. package/dist/ink/src/adapters/ink/components/index.d.ts +9 -0
  156. package/dist/ink/src/adapters/ink/components/index.d.ts.map +1 -0
  157. package/dist/ink/src/adapters/ink/components/log/index.d.ts +2 -0
  158. package/dist/ink/src/adapters/ink/components/log/index.d.ts.map +1 -0
  159. package/dist/ink/src/adapters/ink/components/log/log_message.d.ts +15 -0
  160. package/dist/ink/src/adapters/ink/components/log/log_message.d.ts.map +1 -0
  161. package/dist/ink/src/adapters/ink/components/prompt/index.d.ts +2 -0
  162. package/dist/ink/src/adapters/ink/components/prompt/index.d.ts.map +1 -0
  163. package/dist/ink/src/adapters/ink/components/prompt/prompt_renderer.d.ts +6 -0
  164. package/dist/ink/src/adapters/ink/components/prompt/prompt_renderer.d.ts.map +1 -0
  165. package/dist/ink/src/adapters/ink/components/screen/group_renderer.d.ts +14 -0
  166. package/dist/ink/src/adapters/ink/components/screen/group_renderer.d.ts.map +1 -0
  167. package/dist/ink/src/adapters/ink/components/screen/index.d.ts +7 -0
  168. package/dist/ink/src/adapters/ink/components/screen/index.d.ts.map +1 -0
  169. package/dist/ink/src/adapters/ink/components/screen/loading_message.d.ts +6 -0
  170. package/dist/ink/src/adapters/ink/components/screen/loading_message.d.ts.map +1 -0
  171. package/dist/ink/src/adapters/ink/components/screen/message_renderer.d.ts +6 -0
  172. package/dist/ink/src/adapters/ink/components/screen/message_renderer.d.ts.map +1 -0
  173. package/dist/ink/src/adapters/ink/components/screen/progress_message.d.ts +6 -0
  174. package/dist/ink/src/adapters/ink/components/screen/progress_message.d.ts.map +1 -0
  175. package/dist/ink/src/adapters/ink/components/screen/screen_bridge.d.ts +14 -0
  176. package/dist/ink/src/adapters/ink/components/screen/screen_bridge.d.ts.map +1 -0
  177. package/dist/ink/src/adapters/ink/components/screen/table_message.d.ts +6 -0
  178. package/dist/ink/src/adapters/ink/components/screen/table_message.d.ts.map +1 -0
  179. package/dist/ink/src/adapters/ink/components/screen_manager_bridge.d.ts +8 -0
  180. package/dist/ink/src/adapters/ink/components/screen_manager_bridge.d.ts.map +1 -0
  181. package/dist/ink/src/adapters/ink/components/sidebar/index.d.ts +4 -0
  182. package/dist/ink/src/adapters/ink/components/sidebar/index.d.ts.map +1 -0
  183. package/dist/ink/src/adapters/ink/components/sidebar/sidebar.d.ts +11 -0
  184. package/dist/ink/src/adapters/ink/components/sidebar/sidebar.d.ts.map +1 -0
  185. package/dist/ink/src/adapters/ink/components/sidebar/sidebar_item.d.ts +9 -0
  186. package/dist/ink/src/adapters/ink/components/sidebar/sidebar_item.d.ts.map +1 -0
  187. package/dist/ink/src/adapters/ink/components/sidebar/sidebar_separator.d.ts +2 -0
  188. package/dist/ink/src/adapters/ink/components/sidebar/sidebar_separator.d.ts.map +1 -0
  189. package/dist/ink/src/adapters/ink/context/index.d.ts +2 -0
  190. package/dist/ink/src/adapters/ink/context/index.d.ts.map +1 -0
  191. package/dist/ink/src/adapters/ink/context/logger_context.d.ts +33 -0
  192. package/dist/ink/src/adapters/ink/context/logger_context.d.ts.map +1 -0
  193. package/dist/ink/src/adapters/ink/hooks/index.d.ts +2 -0
  194. package/dist/ink/src/adapters/ink/hooks/index.d.ts.map +1 -0
  195. package/dist/ink/src/adapters/ink/hooks/use_theme.d.ts +7 -0
  196. package/dist/ink/src/adapters/ink/hooks/use_theme.d.ts.map +1 -0
  197. package/dist/ink/src/adapters/ink/index.d.ts +18 -0
  198. package/dist/ink/src/adapters/ink/index.d.ts.map +1 -0
  199. package/dist/ink/src/adapters/react-shared/hooks/index.d.ts +4 -0
  200. package/dist/ink/src/adapters/react-shared/hooks/index.d.ts.map +1 -0
  201. package/dist/ink/src/adapters/react-shared/hooks/use_filter_state.d.ts +18 -0
  202. package/dist/ink/src/adapters/react-shared/hooks/use_filter_state.d.ts.map +1 -0
  203. package/dist/ink/src/adapters/react-shared/hooks/use_keyboard_manager.d.ts +26 -0
  204. package/dist/ink/src/adapters/react-shared/hooks/use_keyboard_manager.d.ts.map +1 -0
  205. package/dist/ink/src/adapters/react-shared/hooks/use_manager_subscription.d.ts +7 -0
  206. package/dist/ink/src/adapters/react-shared/hooks/use_manager_subscription.d.ts.map +1 -0
  207. package/dist/ink/src/adapters/react-shared/index.d.ts +2 -0
  208. package/dist/ink/src/adapters/react-shared/index.d.ts.map +1 -0
  209. package/dist/ink/tsconfig.ink.tsbuildinfo +1 -0
  210. package/dist/react/src/adapters/react/components/file/file_log.d.ts +35 -0
  211. package/dist/react/src/adapters/react/components/file/file_log.d.ts.map +1 -0
  212. package/dist/react/src/adapters/react/components/file/index.d.ts +2 -0
  213. package/dist/react/src/adapters/react/components/file/index.d.ts.map +1 -0
  214. package/dist/react/src/adapters/react/components/filter/filter_bar.d.ts +7 -0
  215. package/dist/react/src/adapters/react/components/filter/filter_bar.d.ts.map +1 -0
  216. package/dist/react/src/adapters/react/components/filter/index.d.ts +2 -0
  217. package/dist/react/src/adapters/react/components/filter/index.d.ts.map +1 -0
  218. package/dist/react/src/adapters/react/components/help/help_overlay.d.ts +6 -0
  219. package/dist/react/src/adapters/react/components/help/help_overlay.d.ts.map +1 -0
  220. package/dist/react/src/adapters/react/components/help/index.d.ts +2 -0
  221. package/dist/react/src/adapters/react/components/help/index.d.ts.map +1 -0
  222. package/dist/react/src/adapters/react/components/log/index.d.ts +2 -0
  223. package/dist/react/src/adapters/react/components/log/index.d.ts.map +1 -0
  224. package/dist/react/src/adapters/react/components/log/log_message.d.ts +28 -0
  225. package/dist/react/src/adapters/react/components/log/log_message.d.ts.map +1 -0
  226. package/dist/react/src/adapters/react/components/prompt/index.d.ts +3 -0
  227. package/dist/react/src/adapters/react/components/prompt/index.d.ts.map +1 -0
  228. package/dist/react/src/adapters/react/components/prompt/prompt_renderer.d.ts +6 -0
  229. package/dist/react/src/adapters/react/components/prompt/prompt_renderer.d.ts.map +1 -0
  230. package/dist/react/src/adapters/react/components/screen/group_renderer.d.ts +14 -0
  231. package/dist/react/src/adapters/react/components/screen/group_renderer.d.ts.map +1 -0
  232. package/dist/react/src/adapters/react/components/screen/index.d.ts +7 -0
  233. package/dist/react/src/adapters/react/components/screen/index.d.ts.map +1 -0
  234. package/dist/react/src/adapters/react/components/screen/loading_message.d.ts +6 -0
  235. package/dist/react/src/adapters/react/components/screen/loading_message.d.ts.map +1 -0
  236. package/dist/react/src/adapters/react/components/screen/message_renderer.d.ts +6 -0
  237. package/dist/react/src/adapters/react/components/screen/message_renderer.d.ts.map +1 -0
  238. package/dist/react/src/adapters/react/components/screen/progress_message.d.ts +6 -0
  239. package/dist/react/src/adapters/react/components/screen/progress_message.d.ts.map +1 -0
  240. package/dist/react/src/adapters/react/components/screen/screen_bridge.d.ts +14 -0
  241. package/dist/react/src/adapters/react/components/screen/screen_bridge.d.ts.map +1 -0
  242. package/dist/react/src/adapters/react/components/screen/table_message.d.ts +6 -0
  243. package/dist/react/src/adapters/react/components/screen/table_message.d.ts.map +1 -0
  244. package/dist/react/src/adapters/react/components/screen_manager_bridge.d.ts +8 -0
  245. package/dist/react/src/adapters/react/components/screen_manager_bridge.d.ts.map +1 -0
  246. package/dist/react/src/adapters/react/components/sidebar/index.d.ts +4 -0
  247. package/dist/react/src/adapters/react/components/sidebar/index.d.ts.map +1 -0
  248. package/dist/react/src/adapters/react/components/sidebar/sidebar.d.ts +11 -0
  249. package/dist/react/src/adapters/react/components/sidebar/sidebar.d.ts.map +1 -0
  250. package/dist/react/src/adapters/react/components/sidebar/sidebar_item.d.ts +9 -0
  251. package/dist/react/src/adapters/react/components/sidebar/sidebar_item.d.ts.map +1 -0
  252. package/dist/react/src/adapters/react/components/sidebar/sidebar_separator.d.ts +2 -0
  253. package/dist/react/src/adapters/react/components/sidebar/sidebar_separator.d.ts.map +1 -0
  254. package/dist/react/src/adapters/react/context/index.d.ts +2 -0
  255. package/dist/react/src/adapters/react/context/index.d.ts.map +1 -0
  256. package/dist/react/src/adapters/react/context/logger_context.d.ts +53 -0
  257. package/dist/react/src/adapters/react/context/logger_context.d.ts.map +1 -0
  258. package/dist/react/src/adapters/react/hooks/index.d.ts +2 -0
  259. package/dist/react/src/adapters/react/hooks/index.d.ts.map +1 -0
  260. package/dist/react/src/adapters/react/hooks/use_theme.d.ts +7 -0
  261. package/dist/react/src/adapters/react/hooks/use_theme.d.ts.map +1 -0
  262. package/dist/react/src/adapters/react/index.d.ts +13 -0
  263. package/dist/react/src/adapters/react/index.d.ts.map +1 -0
  264. package/dist/react/src/adapters/react-shared/hooks/index.d.ts +4 -0
  265. package/dist/react/src/adapters/react-shared/hooks/index.d.ts.map +1 -0
  266. package/dist/react/src/adapters/react-shared/hooks/use_filter_state.d.ts +18 -0
  267. package/dist/react/src/adapters/react-shared/hooks/use_filter_state.d.ts.map +1 -0
  268. package/dist/react/src/adapters/react-shared/hooks/use_keyboard_manager.d.ts +26 -0
  269. package/dist/react/src/adapters/react-shared/hooks/use_keyboard_manager.d.ts.map +1 -0
  270. package/dist/react/src/adapters/react-shared/hooks/use_manager_subscription.d.ts +7 -0
  271. package/dist/react/src/adapters/react-shared/hooks/use_manager_subscription.d.ts.map +1 -0
  272. package/dist/react/src/adapters/react-shared/index.d.ts +2 -0
  273. package/dist/react/src/adapters/react-shared/index.d.ts.map +1 -0
  274. package/dist/react/tsconfig.react.tsbuildinfo +1 -0
  275. package/dist/solid/src/adapters/solid/components/file/file_log.d.ts +35 -0
  276. package/dist/solid/src/adapters/solid/components/file/file_log.d.ts.map +1 -0
  277. package/dist/solid/src/adapters/solid/components/file/index.d.ts +2 -0
  278. package/dist/solid/src/adapters/solid/components/file/index.d.ts.map +1 -0
  279. package/dist/solid/src/adapters/solid/components/filter/filter_bar.d.ts +7 -0
  280. package/dist/solid/src/adapters/solid/components/filter/filter_bar.d.ts.map +1 -0
  281. package/dist/solid/src/adapters/solid/components/filter/index.d.ts +2 -0
  282. package/dist/solid/src/adapters/solid/components/filter/index.d.ts.map +1 -0
  283. package/dist/solid/src/adapters/solid/components/help/help_overlay.d.ts +6 -0
  284. package/dist/solid/src/adapters/solid/components/help/help_overlay.d.ts.map +1 -0
  285. package/dist/solid/src/adapters/solid/components/help/index.d.ts +2 -0
  286. package/dist/solid/src/adapters/solid/components/help/index.d.ts.map +1 -0
  287. package/dist/solid/src/adapters/solid/components/log/index.d.ts +2 -0
  288. package/dist/solid/src/adapters/solid/components/log/index.d.ts.map +1 -0
  289. package/dist/solid/src/adapters/solid/components/log/log_message.d.ts +31 -0
  290. package/dist/solid/src/adapters/solid/components/log/log_message.d.ts.map +1 -0
  291. package/dist/solid/src/adapters/solid/components/prompt/index.d.ts +3 -0
  292. package/dist/solid/src/adapters/solid/components/prompt/index.d.ts.map +1 -0
  293. package/dist/solid/src/adapters/solid/components/prompt/prompt_renderer.d.ts +6 -0
  294. package/dist/solid/src/adapters/solid/components/prompt/prompt_renderer.d.ts.map +1 -0
  295. package/dist/solid/src/adapters/solid/components/screen/group_renderer.d.ts +14 -0
  296. package/dist/solid/src/adapters/solid/components/screen/group_renderer.d.ts.map +1 -0
  297. package/dist/solid/src/adapters/solid/components/screen/index.d.ts +7 -0
  298. package/dist/solid/src/adapters/solid/components/screen/index.d.ts.map +1 -0
  299. package/dist/solid/src/adapters/solid/components/screen/loading_message.d.ts +6 -0
  300. package/dist/solid/src/adapters/solid/components/screen/loading_message.d.ts.map +1 -0
  301. package/dist/solid/src/adapters/solid/components/screen/message_renderer.d.ts +6 -0
  302. package/dist/solid/src/adapters/solid/components/screen/message_renderer.d.ts.map +1 -0
  303. package/dist/solid/src/adapters/solid/components/screen/progress_message.d.ts +6 -0
  304. package/dist/solid/src/adapters/solid/components/screen/progress_message.d.ts.map +1 -0
  305. package/dist/solid/src/adapters/solid/components/screen/screen_bridge.d.ts +14 -0
  306. package/dist/solid/src/adapters/solid/components/screen/screen_bridge.d.ts.map +1 -0
  307. package/dist/solid/src/adapters/solid/components/screen/table_message.d.ts +6 -0
  308. package/dist/solid/src/adapters/solid/components/screen/table_message.d.ts.map +1 -0
  309. package/dist/solid/src/adapters/solid/components/screen_manager_bridge.d.ts +8 -0
  310. package/dist/solid/src/adapters/solid/components/screen_manager_bridge.d.ts.map +1 -0
  311. package/dist/solid/src/adapters/solid/components/sidebar/index.d.ts +4 -0
  312. package/dist/solid/src/adapters/solid/components/sidebar/index.d.ts.map +1 -0
  313. package/dist/solid/src/adapters/solid/components/sidebar/sidebar.d.ts +11 -0
  314. package/dist/solid/src/adapters/solid/components/sidebar/sidebar.d.ts.map +1 -0
  315. package/dist/solid/src/adapters/solid/components/sidebar/sidebar_item.d.ts +9 -0
  316. package/dist/solid/src/adapters/solid/components/sidebar/sidebar_item.d.ts.map +1 -0
  317. package/dist/solid/src/adapters/solid/components/sidebar/sidebar_separator.d.ts +2 -0
  318. package/dist/solid/src/adapters/solid/components/sidebar/sidebar_separator.d.ts.map +1 -0
  319. package/dist/solid/src/adapters/solid/context/index.d.ts +3 -0
  320. package/dist/solid/src/adapters/solid/context/index.d.ts.map +1 -0
  321. package/dist/solid/src/adapters/solid/context/logger_context.d.ts +52 -0
  322. package/dist/solid/src/adapters/solid/context/logger_context.d.ts.map +1 -0
  323. package/dist/solid/src/adapters/solid/hooks/index.d.ts +2 -0
  324. package/dist/solid/src/adapters/solid/hooks/index.d.ts.map +1 -0
  325. package/dist/solid/src/adapters/solid/hooks/use_theme.d.ts +7 -0
  326. package/dist/solid/src/adapters/solid/hooks/use_theme.d.ts.map +1 -0
  327. package/dist/solid/src/adapters/solid/index.d.ts +13 -0
  328. package/dist/solid/src/adapters/solid/index.d.ts.map +1 -0
  329. package/dist/solid/tsconfig.solid.tsbuildinfo +1 -0
  330. package/dist/tsconfig.base.tsbuildinfo +1 -0
  331. package/dist/tsconfig.react.tsbuildinfo +1 -0
  332. package/dist/tsconfig.solid.tsbuildinfo +1 -0
  333. package/dist/tsconfig.tsbuildinfo +1 -1
  334. package/lib/index.cjs +3882 -1584
  335. package/lib/index.cjs.map +1 -1
  336. package/lib/index.d.cts +488 -513
  337. package/lib/index.d.cts.map +1 -1
  338. package/lib/index.d.mts +488 -513
  339. package/lib/index.d.mts.map +1 -1
  340. package/lib/index.mjs +3810 -1539
  341. package/lib/index.mjs.map +1 -1
  342. package/package.json +1 -7
  343. package/project.json +2 -2
  344. package/src/__tests__/services/logger.spec.ts +32 -0
  345. package/src/__tests__/services/screen.spec.ts +106 -95
  346. package/src/__tests__/utils/factories.ts +2 -0
  347. package/src/adapters/index.ts +2 -0
  348. package/src/adapters/interface.ts +58 -0
  349. package/src/components/index.ts +3 -15
  350. package/src/context/index.ts +3 -1
  351. package/src/factories/isomorphic-logger.factory.ts +1 -2
  352. package/src/factories/screen.factory.ts +2 -2
  353. package/src/hooks/index.ts +3 -1
  354. package/src/index.ts +5 -0
  355. package/src/keyboard/create_bindings.ts +2 -2
  356. package/src/overrides/index.ts +1 -0
  357. package/src/overrides/missing-adapter.override.ts +30 -0
  358. package/src/services/index.ts +2 -1
  359. package/src/services/logger.ts +7 -1
  360. package/src/services/readline_prompt.ts +194 -0
  361. package/src/services/screen.ts +109 -57
  362. package/src/services/screen_manager.ts +613 -0
  363. package/src/tokens/adapter.ts +10 -0
  364. package/src/tokens/index.ts +2 -0
  365. package/src/tokens/screen-manager.ts +9 -0
  366. package/src/types/events.types.ts +84 -0
  367. package/src/types/index.ts +3 -0
  368. package/src/types/screen.types.ts +34 -0
  369. package/src/utils/colors/helpers.ts +0 -25
  370. package/src/utils/index.ts +6 -0
  371. package/src/utils/prompt.ts +18 -0
  372. package/src/utils/runtime.ts +14 -0
  373. package/src/utils/stdout-printer.ts +16 -5
  374. package/tsconfig.base.json +15 -0
  375. package/tsconfig.json +1 -12
  376. package/tsdown.config.mts +2 -6
  377. package/vitest.config.mts +20 -0
  378. package/lib/screen_manager_bridge-Bk1i53h5.mjs +0 -3
  379. package/lib/screen_manager_bridge-BwPVr0bX.mjs +0 -3048
  380. package/lib/screen_manager_bridge-BwPVr0bX.mjs.map +0 -1
  381. package/lib/screen_manager_bridge-CWxLO0CK.cjs +0 -3371
  382. package/lib/screen_manager_bridge-CWxLO0CK.cjs.map +0 -1
  383. package/lib/screen_manager_bridge-DXc57iXW.cjs +0 -3
  384. package/src/__tests__/components/__snapshots__/filter_bar.spec.tsx.snap +0 -4849
  385. package/src/__tests__/components/__snapshots__/loading_message.spec.tsx.snap +0 -3003
  386. package/src/__tests__/components/__snapshots__/log_message.spec.tsx.snap +0 -6926
  387. package/src/__tests__/components/__snapshots__/progress_message.spec.tsx.snap +0 -3785
  388. package/src/__tests__/components/__snapshots__/prompt_renderer.spec.tsx.snap +0 -6787
  389. package/src/__tests__/components/__snapshots__/sidebar.spec.tsx.snap +0 -6043
  390. package/src/__tests__/components/filter_bar.spec.tsx +0 -190
  391. package/src/__tests__/components/loading_message.spec.tsx +0 -110
  392. package/src/__tests__/components/log_message.spec.tsx +0 -166
  393. package/src/__tests__/components/progress_message.spec.tsx +0 -147
  394. package/src/__tests__/components/prompt_renderer.spec.tsx +0 -274
  395. package/src/__tests__/components/sidebar.spec.tsx +0 -322
  396. package/src/__tests__/utils/render-utils.tsx +0 -39
  397. package/src/components/file/file_log.tsx +0 -241
  398. package/src/components/file/index.ts +0 -1
  399. package/src/components/filter/filter_bar.tsx +0 -79
  400. package/src/components/filter/index.ts +0 -1
  401. package/src/components/help/help_overlay.tsx +0 -100
  402. package/src/components/help/index.ts +0 -1
  403. package/src/components/log/index.ts +0 -1
  404. package/src/components/log/log_message.tsx +0 -102
  405. package/src/components/prompt/index.ts +0 -2
  406. package/src/components/prompt/prompt_renderer.tsx +0 -346
  407. package/src/components/screen/group_renderer.tsx +0 -64
  408. package/src/components/screen/index.ts +0 -6
  409. package/src/components/screen/loading_message.tsx +0 -44
  410. package/src/components/screen/message_renderer.tsx +0 -108
  411. package/src/components/screen/progress_message.tsx +0 -60
  412. package/src/components/screen/screen_bridge.tsx +0 -149
  413. package/src/components/screen/table_message.tsx +0 -57
  414. package/src/components/screen_manager_bridge.tsx +0 -245
  415. package/src/components/sidebar/index.ts +0 -3
  416. package/src/components/sidebar/sidebar.tsx +0 -102
  417. package/src/components/sidebar/sidebar_item.tsx +0 -50
  418. package/src/components/sidebar/sidebar_separator.tsx +0 -13
  419. package/src/context/logger_context.tsx +0 -109
  420. package/src/hooks/use_theme.ts +0 -12
  421. package/src/services/screen_manager.tsx +0 -394
@@ -42,6 +42,7 @@ export class ScreenLoggerInstance implements LoggerService {
42
42
  typeof options.screen === 'string'
43
43
  ? {
44
44
  name: options.screen,
45
+ static: true,
45
46
  }
46
47
  : options.screen,
47
48
  )
@@ -51,7 +52,12 @@ export class ScreenLoggerInstance implements LoggerService {
51
52
  }
52
53
 
53
54
  private isLevelEnabled(level: LogLevel): boolean {
54
- return this.enabledLevels.has(level)
55
+ // Check local logger levels first
56
+ if (!this.enabledLevels.has(level)) {
57
+ return false
58
+ }
59
+ // Then check global levels via ScreenManager
60
+ return this.screen.isLogLevelEnabled(level)
55
61
  }
56
62
 
57
63
  // ============================================
@@ -0,0 +1,194 @@
1
+ import * as readline from 'node:readline'
2
+
3
+ import type {
4
+ ChoicePromptData,
5
+ ConfirmPromptData,
6
+ InputPromptData,
7
+ MultiChoicePromptData,
8
+ PromptData,
9
+ } from '../types/index.ts'
10
+
11
+ /**
12
+ * Readline-based prompt service for stdout mode.
13
+ * Provides basic interactive prompts when TUI adapter is not available.
14
+ */
15
+ export class ReadlinePromptService {
16
+ private rl: readline.Interface | null = null
17
+ private promptQueue: Array<{
18
+ prompt: PromptData
19
+ resolve: (value: string | boolean | string[]) => void
20
+ }> = []
21
+ private isProcessing = false
22
+
23
+ private ensureInterface(): readline.Interface {
24
+ if (!this.rl) {
25
+ this.rl = readline.createInterface({
26
+ input: process.stdin,
27
+ output: process.stdout,
28
+ })
29
+ }
30
+ return this.rl
31
+ }
32
+
33
+ /**
34
+ * Handle a prompt interactively via readline.
35
+ * Prompts are queued and processed sequentially.
36
+ */
37
+ async handlePrompt(prompt: PromptData): Promise<string | boolean | string[]> {
38
+ return new Promise((resolve) => {
39
+ this.promptQueue.push({ prompt, resolve })
40
+ this.processQueue()
41
+ })
42
+ }
43
+
44
+ private async processQueue(): Promise<void> {
45
+ if (this.isProcessing || this.promptQueue.length === 0) return
46
+
47
+ this.isProcessing = true
48
+
49
+ while (this.promptQueue.length > 0) {
50
+ const { prompt, resolve } = this.promptQueue.shift()!
51
+ const result = await this.processPrompt(prompt)
52
+ resolve(result)
53
+ }
54
+
55
+ this.isProcessing = false
56
+ }
57
+
58
+ private async processPrompt(prompt: PromptData): Promise<string | boolean | string[]> {
59
+ switch (prompt.type) {
60
+ case 'choice':
61
+ return this.handleChoice(prompt)
62
+ case 'confirm':
63
+ return this.handleConfirm(prompt)
64
+ case 'input':
65
+ return this.handleInput(prompt)
66
+ case 'multiChoice':
67
+ return this.handleMultiChoice(prompt)
68
+ }
69
+ }
70
+
71
+ private async handleChoice(prompt: ChoicePromptData): Promise<string> {
72
+ const rl = this.ensureInterface()
73
+
74
+ // Display question and choices
75
+ console.log(`\n${prompt.question}`)
76
+ prompt.choices.forEach((choice, index) => {
77
+ const isDefault = choice.value === prompt.defaultChoice
78
+ const marker = isDefault ? '*' : ' '
79
+ const inputHint = choice.input ? ' (allows custom input)' : ''
80
+ console.log(` ${marker} ${index + 1}. ${choice.label}${inputHint}`)
81
+ })
82
+
83
+ return new Promise((resolve) => {
84
+ rl.question('Enter number (or press Enter for default): ', (answer) => {
85
+ const trimmed = answer.trim()
86
+ if (!trimmed) {
87
+ resolve(prompt.defaultChoice)
88
+ return
89
+ }
90
+
91
+ const num = parseInt(trimmed, 10)
92
+ if (num >= 1 && num <= prompt.choices.length) {
93
+ const choice = prompt.choices[num - 1]
94
+ if (choice.input) {
95
+ // If choice allows input, ask for it
96
+ rl.question(`Enter value for "${choice.label}": `, (inputValue) => {
97
+ resolve(inputValue.trim() || choice.value)
98
+ })
99
+ } else {
100
+ resolve(choice.value)
101
+ }
102
+ } else {
103
+ resolve(prompt.defaultChoice)
104
+ }
105
+ })
106
+ })
107
+ }
108
+
109
+ private async handleConfirm(prompt: ConfirmPromptData): Promise<boolean> {
110
+ const rl = this.ensureInterface()
111
+ const defaultText = prompt.defaultValue ? 'Y/n' : 'y/N'
112
+
113
+ return new Promise((resolve) => {
114
+ rl.question(`${prompt.question} [${defaultText}]: `, (answer) => {
115
+ const trimmed = answer.trim().toLowerCase()
116
+ if (!trimmed) {
117
+ resolve(prompt.defaultValue)
118
+ return
119
+ }
120
+ resolve(trimmed === 'y' || trimmed === 'yes')
121
+ })
122
+ })
123
+ }
124
+
125
+ private async handleInput(prompt: InputPromptData): Promise<string> {
126
+ const rl = this.ensureInterface()
127
+ const defaultHint = prompt.defaultValue ? ` (default: ${prompt.defaultValue})` : ''
128
+ const placeholderHint = prompt.placeholder ? ` [${prompt.placeholder}]` : ''
129
+
130
+ return new Promise((resolve) => {
131
+ rl.question(`${prompt.question}${placeholderHint}${defaultHint}: `, (answer) => {
132
+ resolve(answer.trim() || prompt.defaultValue)
133
+ })
134
+ })
135
+ }
136
+
137
+ private async handleMultiChoice(prompt: MultiChoicePromptData): Promise<string[]> {
138
+ const rl = this.ensureInterface()
139
+
140
+ // Display question and choices
141
+ console.log(`\n${prompt.question}`)
142
+ console.log(`(Select ${prompt.minSelect}-${prompt.maxSelect} options, enter comma-separated numbers)`)
143
+ prompt.choices.forEach((choice, index) => {
144
+ const selected = prompt.selectedIndices.has(index) ? '[x]' : '[ ]'
145
+ console.log(` ${selected} ${index + 1}. ${choice.label}`)
146
+ })
147
+
148
+ return new Promise((resolve) => {
149
+ rl.question('Enter numbers (e.g., 1,3,5): ', (answer) => {
150
+ const trimmed = answer.trim()
151
+ if (!trimmed) {
152
+ // Return default selections
153
+ resolve(
154
+ prompt.choices.filter((_, i) => prompt.selectedIndices.has(i)).map((c) => c.value),
155
+ )
156
+ return
157
+ }
158
+
159
+ const indices = trimmed
160
+ .split(',')
161
+ .map((s) => parseInt(s.trim(), 10) - 1)
162
+ .filter((n) => n >= 0 && n < prompt.choices.length)
163
+
164
+ // Validate selection count
165
+ if (indices.length < prompt.minSelect) {
166
+ console.log(`Minimum ${prompt.minSelect} selections required. Using defaults.`)
167
+ resolve(
168
+ prompt.choices.filter((_, i) => prompt.selectedIndices.has(i)).map((c) => c.value),
169
+ )
170
+ return
171
+ }
172
+
173
+ if (indices.length > prompt.maxSelect) {
174
+ console.log(`Maximum ${prompt.maxSelect} selections allowed. Taking first ${prompt.maxSelect}.`)
175
+ indices.splice(prompt.maxSelect)
176
+ }
177
+
178
+ resolve(indices.map((i) => prompt.choices[i].value))
179
+ })
180
+ })
181
+ }
182
+
183
+ /**
184
+ * Cleanup readline interface
185
+ */
186
+ destroy(): void {
187
+ if (this.rl) {
188
+ this.rl.close()
189
+ this.rl = null
190
+ }
191
+ this.promptQueue = []
192
+ this.isProcessing = false
193
+ }
194
+ }
@@ -1,4 +1,11 @@
1
+ import { EventEmitter } from 'node:events'
2
+
3
+ import type { LogLevel } from '@navios/core'
4
+
5
+ import { getPromptDefaultValue, printSingleMessage } from '../utils/index.ts'
6
+
1
7
  import type { ScreenOptions } from '../schemas/index.ts'
8
+ import { RenderMode } from '../types/index.ts'
2
9
  import type {
3
10
  ChoicePromptData,
4
11
  ConfirmPromptData,
@@ -8,10 +15,11 @@ import type {
8
15
  MultiChoicePromptData,
9
16
  ProgressMessageData,
10
17
  PromptData,
18
+ ScreenEventMap,
11
19
  ScreenStatus,
12
20
  } from '../types/index.ts'
13
21
 
14
- import type { ScreenManager } from './screen_manager.tsx'
22
+ import type { ScreenManagerInstance } from './screen_manager.ts'
15
23
 
16
24
  interface PendingPrompt {
17
25
  data: PromptData
@@ -19,7 +27,7 @@ interface PendingPrompt {
19
27
  timeoutId?: ReturnType<typeof setTimeout>
20
28
  }
21
29
 
22
- export class ScreenInstance {
30
+ export class ScreenInstance extends EventEmitter<ScreenEventMap> {
23
31
  private id: string
24
32
  private name: string
25
33
  private icon?: string
@@ -27,8 +35,7 @@ export class ScreenInstance {
27
35
  private status: ScreenStatus = 'waiting'
28
36
  private hidden: boolean = false
29
37
  private messages: MessageData[] = []
30
- private manager: ScreenManager | null = null
31
- private changeListeners: Set<() => void> = new Set()
38
+ private manager: ScreenManagerInstance | null = null
32
39
  private printFn: ((messages: MessageData[], name: string, isError: boolean) => void) | null = null
33
40
  private hasPrinted: boolean = false
34
41
  private version: number = 0
@@ -38,6 +45,7 @@ export class ScreenInstance {
38
45
  private activePrompt: PendingPrompt | null = null
39
46
 
40
47
  constructor(id: string, options: ScreenOptions) {
48
+ super()
41
49
  this.id = id
42
50
  this.name = options.name
43
51
  this.icon = options.icon
@@ -59,7 +67,7 @@ export class ScreenInstance {
59
67
  /**
60
68
  * Internal: Set the manager reference
61
69
  */
62
- _setManager(manager: ScreenManager): void {
70
+ _setManager(manager: ScreenManagerInstance): void {
63
71
  this.manager = manager
64
72
  }
65
73
 
@@ -88,7 +96,7 @@ export class ScreenInstance {
88
96
 
89
97
  setBadgeCount(count: number): this {
90
98
  this.badgeCount = count
91
- this.notifyChange()
99
+ this.emit('badge:changed', count)
92
100
  return this
93
101
  }
94
102
 
@@ -99,7 +107,7 @@ export class ScreenInstance {
99
107
  setHidden(hidden: boolean): this {
100
108
  this.hidden = hidden
101
109
  this.manager?.onScreenVisibilityChanged(this)
102
- this.notifyChange()
110
+ this.emit('visibility:changed', hidden)
103
111
  return this
104
112
  }
105
113
 
@@ -116,7 +124,18 @@ export class ScreenInstance {
116
124
  }
117
125
 
118
126
  /**
119
- * Set screen status. When success/fail and TUI is not bound, prints to stdout/stderr
127
+ * Check if a log level is enabled globally via the ScreenManager.
128
+ * Returns true if no manager is set or if the level is allowed.
129
+ */
130
+ isLogLevelEnabled(level: LogLevel): boolean {
131
+ if (!this.manager) {
132
+ return true
133
+ }
134
+ return this.manager.isLogLevelEnabled(level)
135
+ }
136
+
137
+ /**
138
+ * Set screen status. When success/fail and not in TUI mode, prints to stdout/stderr
120
139
  */
121
140
  setStatus(status: ScreenStatus): this {
122
141
  const wasComplete = this.status === 'success' || this.status === 'fail'
@@ -124,14 +143,15 @@ export class ScreenInstance {
124
143
 
125
144
  // When transitioning to complete state
126
145
  if (!wasComplete && (status === 'success' || status === 'fail')) {
127
- // Only print if TUI is NOT bound (non-interactive mode)
128
- if (!this.manager?.isTuiBound()) {
146
+ // Only print immediately if NOT in TUI mode
147
+ // In TUI mode, printing happens on unbind()
148
+ if (!this.manager?.hasTuiRenderer()) {
129
149
  this.printToConsole()
130
150
  }
131
151
  this.manager?.onScreenCompleted(this)
132
152
  }
133
153
 
134
- this.notifyChange()
154
+ this.emit('status:changed', status)
135
155
  return this
136
156
  }
137
157
 
@@ -143,10 +163,20 @@ export class ScreenInstance {
143
163
  }
144
164
 
145
165
  /**
146
- * Check if this screen has been printed to console
166
+ * Check if this screen has been printed to console.
167
+ * Static screens in non-TUI modes are considered printed as they print incrementally.
147
168
  */
148
169
  hasPrintedToConsole(): boolean {
149
- return this.hasPrinted
170
+ // If already fully printed, return true
171
+ if (this.hasPrinted) return true
172
+
173
+ // Static screens in non-TUI modes print incrementally, so they're considered "printed"
174
+ // as their messages are output immediately when added
175
+ if (this.status === 'static' && !this.manager?.hasTuiRenderer()) {
176
+ return true
177
+ }
178
+
179
+ return false
150
180
  }
151
181
 
152
182
  /**
@@ -171,7 +201,13 @@ export class ScreenInstance {
171
201
  addMessage(message: MessageData): void {
172
202
  this.messages.push(message)
173
203
  this.incrementVersion()
174
- this.notifyChange()
204
+
205
+ // In non-TUI modes, static screens print messages immediately
206
+ if (this.status === 'static' && !this.manager?.hasTuiRenderer()) {
207
+ this.printSingleMessageToConsole(message)
208
+ }
209
+
210
+ this.emit('message:added', message.id)
175
211
  }
176
212
 
177
213
  /**
@@ -180,12 +216,23 @@ export class ScreenInstance {
180
216
  updateMessage(id: string, updates: Partial<LoadingMessageData>): void {
181
217
  const index = this.messages.findIndex((m) => m.id === id)
182
218
  if (index !== -1) {
219
+ const oldMessage = this.messages[index] as LoadingMessageData
183
220
  this.messages[index] = {
184
221
  ...this.messages[index],
185
222
  ...updates,
186
223
  } as MessageData
187
224
  this.incrementVersion()
188
- this.notifyChange()
225
+
226
+ // In non-TUI modes for static screens, print when loading completes
227
+ if (this.status === 'static' && !this.manager?.hasTuiRenderer()) {
228
+ const newMessage = this.messages[index] as LoadingMessageData
229
+ // Only print when transitioning from 'loading' to 'success'/'fail'
230
+ if (newMessage.status !== 'loading' && oldMessage.status === 'loading') {
231
+ this.printSingleMessageToConsole(newMessage)
232
+ }
233
+ }
234
+
235
+ this.emit('message:updated', id)
189
236
  }
190
237
  }
191
238
 
@@ -195,12 +242,26 @@ export class ScreenInstance {
195
242
  updateProgressMessage(id: string, updates: Partial<ProgressMessageData>): void {
196
243
  const index = this.messages.findIndex((m) => m.id === id)
197
244
  if (index !== -1) {
245
+ const oldMessage = this.messages[index] as ProgressMessageData
198
246
  this.messages[index] = {
199
247
  ...this.messages[index],
200
248
  ...updates,
201
249
  } as MessageData
202
250
  this.incrementVersion()
203
- this.notifyChange()
251
+
252
+ // In non-TUI modes for static screens, print when progress completes
253
+ if (this.status === 'static' && !this.manager?.hasTuiRenderer()) {
254
+ const newMessage = this.messages[index] as ProgressMessageData
255
+ if (
256
+ (newMessage.status === 'complete' || newMessage.status === 'failed') &&
257
+ oldMessage.status !== 'complete' &&
258
+ oldMessage.status !== 'failed'
259
+ ) {
260
+ this.printSingleMessageToConsole(newMessage)
261
+ }
262
+ }
263
+
264
+ this.emit('message:updated', id)
204
265
  }
205
266
  }
206
267
 
@@ -210,7 +271,7 @@ export class ScreenInstance {
210
271
  clear(): this {
211
272
  this.messages = []
212
273
  this.incrementVersion()
213
- this.notifyChange()
274
+ this.emit('messages:cleared')
214
275
  return this
215
276
  }
216
277
 
@@ -224,14 +285,23 @@ export class ScreenInstance {
224
285
  */
225
286
  _addPrompt(prompt: PromptData): Promise<string | boolean | string[]> {
226
287
  return new Promise((resolve) => {
227
- const pending: PendingPrompt = { data: prompt, resolve }
288
+ const mode = this.manager?.getRenderMode() ?? RenderMode.UNBOUND
228
289
 
229
- // If TUI is not bound (non-interactive mode), return default immediately
230
- if (!this.manager?.isTuiBound()) {
290
+ // UNBOUND mode: return defaults immediately (no interaction possible)
291
+ if (mode === RenderMode.UNBOUND) {
231
292
  this.resolvePromptWithDefault(prompt, resolve)
232
293
  return
233
294
  }
234
295
 
296
+ // STDOUT modes (STDOUT_INTERACTIVE, STDOUT_FALLBACK): use readline for interactive prompts
297
+ if (mode === RenderMode.STDOUT_INTERACTIVE || mode === RenderMode.STDOUT_FALLBACK) {
298
+ this.manager?.handleReadlinePrompt(prompt).then(resolve)
299
+ return
300
+ }
301
+
302
+ // TUI_ACTIVE mode: use TUI prompt queue system
303
+ const pending: PendingPrompt = { data: prompt, resolve }
304
+
235
305
  // Set up timeout if specified
236
306
  if (prompt.timeout && prompt.timeoutStarted) {
237
307
  pending.timeoutId = setTimeout(() => {
@@ -240,7 +310,7 @@ export class ScreenInstance {
240
310
  this.activePrompt = null
241
311
  this.activateNextPrompt()
242
312
  this.incrementVersion()
243
- this.notifyChange()
313
+ this.emit('prompt:resolved')
244
314
  } else {
245
315
  // Remove from queue if not yet active
246
316
  const idx = this.promptQueue.indexOf(pending)
@@ -270,20 +340,7 @@ export class ScreenInstance {
270
340
  prompt: PromptData,
271
341
  resolve: (value: string | boolean | string[]) => void,
272
342
  ): void {
273
- switch (prompt.type) {
274
- case 'choice':
275
- resolve(prompt.defaultChoice)
276
- break
277
- case 'confirm':
278
- resolve(prompt.defaultValue)
279
- break
280
- case 'input':
281
- resolve(prompt.defaultValue)
282
- break
283
- case 'multiChoice':
284
- resolve(prompt.choices.filter((_, i) => prompt.selectedIndices.has(i)).map((c) => c.value))
285
- break
286
- }
343
+ resolve(getPromptDefaultValue(prompt))
287
344
  }
288
345
 
289
346
  /**
@@ -316,7 +373,7 @@ export class ScreenInstance {
316
373
  } else if (prompt.type === 'confirm') {
317
374
  ;(prompt as ConfirmPromptData).selectedValue = index === 0
318
375
  }
319
- this.notifyChange()
376
+ this.emit('prompt:updated')
320
377
  }
321
378
 
322
379
  /**
@@ -359,7 +416,7 @@ export class ScreenInstance {
359
416
  const prompt = this.activePrompt.data
360
417
  if (prompt.type === 'confirm') {
361
418
  ;(prompt as ConfirmPromptData).selectedValue = true
362
- this.notifyChange()
419
+ this.emit('prompt:updated')
363
420
  }
364
421
  }
365
422
 
@@ -368,7 +425,7 @@ export class ScreenInstance {
368
425
  const prompt = this.activePrompt.data
369
426
  if (prompt.type === 'confirm') {
370
427
  ;(prompt as ConfirmPromptData).selectedValue = false
371
- this.notifyChange()
428
+ this.emit('prompt:updated')
372
429
  }
373
430
  }
374
431
 
@@ -385,7 +442,7 @@ export class ScreenInstance {
385
442
  } else if (p.selectedIndices.size < p.maxSelect) {
386
443
  p.selectedIndices.add(p.focusedIndex)
387
444
  }
388
- this.notifyChange()
445
+ this.emit('prompt:updated')
389
446
  }
390
447
  }
391
448
 
@@ -401,7 +458,7 @@ export class ScreenInstance {
401
458
  const choice = prompt.choices[prompt.selectedIndex]
402
459
  if (choice?.input) {
403
460
  ;(prompt as ChoicePromptData).inputMode = true
404
- this.notifyChange()
461
+ this.emit('prompt:updated')
405
462
  return true
406
463
  }
407
464
  } else if (prompt.type === 'input') {
@@ -420,7 +477,7 @@ export class ScreenInstance {
420
477
  const prompt = this.activePrompt.data
421
478
  if (prompt.type === 'choice' && prompt.inputMode) {
422
479
  ;(prompt as ChoicePromptData).inputMode = false
423
- this.notifyChange()
480
+ this.emit('prompt:updated')
424
481
  }
425
482
  // Input prompts cannot exit input mode
426
483
  }
@@ -449,10 +506,10 @@ export class ScreenInstance {
449
506
  const prompt = this.activePrompt.data
450
507
  if (prompt.type === 'choice' && prompt.inputMode) {
451
508
  ;(prompt as ChoicePromptData).inputValue = value
452
- this.notifyChange()
509
+ this.emit('prompt:updated')
453
510
  } else if (prompt.type === 'input') {
454
511
  ;(prompt as InputPromptData).value = value
455
- this.notifyChange()
512
+ this.emit('prompt:updated')
456
513
  }
457
514
  }
458
515
 
@@ -465,10 +522,10 @@ export class ScreenInstance {
465
522
  const prompt = this.activePrompt.data
466
523
  if (prompt.type === 'choice' && prompt.inputMode) {
467
524
  ;(prompt as ChoicePromptData).inputValue += char
468
- this.notifyChange()
525
+ this.emit('prompt:updated')
469
526
  } else if (prompt.type === 'input') {
470
527
  ;(prompt as InputPromptData).value += char
471
- this.notifyChange()
528
+ this.emit('prompt:updated')
472
529
  }
473
530
  }
474
531
 
@@ -481,10 +538,10 @@ export class ScreenInstance {
481
538
  const prompt = this.activePrompt.data
482
539
  if (prompt.type === 'choice' && prompt.inputMode) {
483
540
  ;(prompt as ChoicePromptData).inputValue = prompt.inputValue.slice(0, -1)
484
- this.notifyChange()
541
+ this.emit('prompt:updated')
485
542
  } else if (prompt.type === 'input') {
486
543
  ;(prompt as InputPromptData).value = prompt.value.slice(0, -1)
487
- this.notifyChange()
544
+ this.emit('prompt:updated')
488
545
  }
489
546
  }
490
547
 
@@ -550,7 +607,7 @@ export class ScreenInstance {
550
607
  this.activePrompt = null
551
608
  this.activateNextPrompt()
552
609
  this.incrementVersion()
553
- this.notifyChange()
610
+ this.emit('prompt:resolved')
554
611
  }
555
612
 
556
613
  /**
@@ -562,20 +619,15 @@ export class ScreenInstance {
562
619
  // Notify manager to focus this screen
563
620
  this.manager?.onScreenPromptActivated(this)
564
621
  this.incrementVersion()
565
- this.notifyChange()
622
+ this.emit('prompt:activated')
566
623
  }
567
624
  }
568
625
 
569
626
  /**
570
- * Register a change listener for re-renders
627
+ * Print a single message immediately to stdout (for static screens in stdout mode)
571
628
  */
572
- onChange(listener: () => void): () => void {
573
- this.changeListeners.add(listener)
574
- return () => this.changeListeners.delete(listener)
575
- }
576
-
577
- private notifyChange(): void {
578
- this.changeListeners.forEach((listener) => listener())
629
+ private printSingleMessageToConsole(message: MessageData): void {
630
+ printSingleMessage(message, this.name, false)
579
631
  }
580
632
 
581
633
  /**