terminal-pilot 0.0.30 → 0.0.32

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 (329) hide show
  1. package/dist/cli.js +1599 -497
  2. package/dist/cli.js.map +4 -4
  3. package/dist/commands/close-session.js +489 -6
  4. package/dist/commands/close-session.js.map +4 -4
  5. package/dist/commands/create-session.js +489 -6
  6. package/dist/commands/create-session.js.map +4 -4
  7. package/dist/commands/fill.js +489 -6
  8. package/dist/commands/fill.js.map +4 -4
  9. package/dist/commands/get-session.js +489 -6
  10. package/dist/commands/get-session.js.map +4 -4
  11. package/dist/commands/index.js +630 -44
  12. package/dist/commands/index.js.map +4 -4
  13. package/dist/commands/install.js +626 -40
  14. package/dist/commands/install.js.map +4 -4
  15. package/dist/commands/installer.js +68 -17
  16. package/dist/commands/installer.js.map +4 -4
  17. package/dist/commands/list-sessions.js +489 -6
  18. package/dist/commands/list-sessions.js.map +4 -4
  19. package/dist/commands/press-key.js +489 -6
  20. package/dist/commands/press-key.js.map +4 -4
  21. package/dist/commands/read-history.js +489 -6
  22. package/dist/commands/read-history.js.map +4 -4
  23. package/dist/commands/read-screen.js +489 -6
  24. package/dist/commands/read-screen.js.map +4 -4
  25. package/dist/commands/resize.js +489 -6
  26. package/dist/commands/resize.js.map +4 -4
  27. package/dist/commands/runtime.js.map +1 -1
  28. package/dist/commands/screenshot.js +489 -6
  29. package/dist/commands/screenshot.js.map +4 -4
  30. package/dist/commands/send-signal.js +489 -6
  31. package/dist/commands/send-signal.js.map +4 -4
  32. package/dist/commands/type.js +489 -6
  33. package/dist/commands/type.js.map +4 -4
  34. package/dist/commands/uninstall.js +554 -20
  35. package/dist/commands/uninstall.js.map +4 -4
  36. package/dist/commands/wait-for-exit.js +489 -6
  37. package/dist/commands/wait-for-exit.js.map +4 -4
  38. package/dist/commands/wait-for.js +489 -6
  39. package/dist/commands/wait-for.js.map +4 -4
  40. package/dist/testing/cli-repl.js +1599 -497
  41. package/dist/testing/cli-repl.js.map +4 -4
  42. package/dist/testing/qa-cli.js +1609 -507
  43. package/dist/testing/qa-cli.js.map +4 -4
  44. package/node_modules/@poe-code/agent-defs/README.md +35 -0
  45. package/node_modules/@poe-code/agent-defs/dist/agents/claude-code.d.ts +2 -0
  46. package/node_modules/@poe-code/agent-defs/dist/agents/claude-code.js +21 -0
  47. package/node_modules/@poe-code/agent-defs/dist/agents/claude-desktop.d.ts +2 -0
  48. package/node_modules/@poe-code/agent-defs/dist/agents/claude-desktop.js +18 -0
  49. package/node_modules/@poe-code/agent-defs/dist/agents/codex.d.ts +2 -0
  50. package/node_modules/@poe-code/agent-defs/dist/agents/codex.js +25 -0
  51. package/node_modules/@poe-code/agent-defs/dist/agents/cursor.d.ts +2 -0
  52. package/node_modules/@poe-code/agent-defs/dist/agents/cursor.js +15 -0
  53. package/node_modules/@poe-code/agent-defs/dist/agents/gemini-cli.d.ts +2 -0
  54. package/node_modules/@poe-code/agent-defs/dist/agents/gemini-cli.js +16 -0
  55. package/node_modules/@poe-code/agent-defs/dist/agents/goose.d.ts +2 -0
  56. package/node_modules/@poe-code/agent-defs/dist/agents/goose.js +16 -0
  57. package/node_modules/@poe-code/agent-defs/dist/agents/index.d.ts +9 -0
  58. package/node_modules/@poe-code/agent-defs/dist/agents/index.js +9 -0
  59. package/node_modules/@poe-code/agent-defs/dist/agents/kimi.d.ts +2 -0
  60. package/node_modules/@poe-code/agent-defs/dist/agents/kimi.js +16 -0
  61. package/node_modules/@poe-code/agent-defs/dist/agents/opencode.d.ts +2 -0
  62. package/node_modules/@poe-code/agent-defs/dist/agents/opencode.js +20 -0
  63. package/node_modules/@poe-code/agent-defs/dist/agents/poe-agent.d.ts +2 -0
  64. package/node_modules/@poe-code/agent-defs/dist/agents/poe-agent.js +14 -0
  65. package/node_modules/@poe-code/agent-defs/dist/index.d.ts +5 -0
  66. package/node_modules/@poe-code/agent-defs/dist/index.js +3 -0
  67. package/node_modules/@poe-code/agent-defs/dist/registry.d.ts +3 -0
  68. package/node_modules/@poe-code/agent-defs/dist/registry.js +45 -0
  69. package/node_modules/@poe-code/agent-defs/dist/specifier.d.ts +7 -0
  70. package/node_modules/@poe-code/agent-defs/dist/specifier.js +40 -0
  71. package/node_modules/@poe-code/agent-defs/dist/types.d.ts +28 -0
  72. package/node_modules/@poe-code/agent-defs/dist/types.js +1 -0
  73. package/node_modules/@poe-code/agent-defs/package.json +20 -0
  74. package/node_modules/@poe-code/agent-skill-config/dist/apply.js +2 -1
  75. package/node_modules/@poe-code/agent-skill-config/dist/bridge-active-skills.d.ts +1 -0
  76. package/node_modules/@poe-code/agent-skill-config/dist/bridge-active-skills.js +37 -18
  77. package/node_modules/@poe-code/agent-skill-config/dist/resolve-skill-reference.js +8 -4
  78. package/node_modules/@poe-code/agent-skill-config/package.json +1 -5
  79. package/node_modules/@poe-code/config-mutations/README.md +55 -0
  80. package/node_modules/@poe-code/config-mutations/dist/error-codes.d.ts +1 -0
  81. package/node_modules/@poe-code/config-mutations/dist/error-codes.js +6 -0
  82. package/node_modules/@poe-code/config-mutations/dist/execution/apply-mutation.d.ts +6 -0
  83. package/node_modules/@poe-code/config-mutations/dist/execution/apply-mutation.js +829 -0
  84. package/node_modules/@poe-code/config-mutations/dist/execution/path-utils.d.ts +17 -0
  85. package/node_modules/@poe-code/config-mutations/dist/execution/path-utils.js +64 -0
  86. package/node_modules/@poe-code/config-mutations/dist/execution/run-mutations.d.ts +7 -0
  87. package/node_modules/@poe-code/config-mutations/dist/execution/run-mutations.js +39 -0
  88. package/node_modules/@poe-code/config-mutations/dist/formats/index.d.ts +13 -0
  89. package/node_modules/@poe-code/config-mutations/dist/formats/index.js +49 -0
  90. package/node_modules/@poe-code/config-mutations/dist/formats/json.d.ts +32 -0
  91. package/node_modules/@poe-code/config-mutations/dist/formats/json.js +171 -0
  92. package/node_modules/@poe-code/config-mutations/dist/formats/object.d.ts +4 -0
  93. package/node_modules/@poe-code/config-mutations/dist/formats/object.js +27 -0
  94. package/node_modules/@poe-code/config-mutations/dist/formats/toml.d.ts +2 -0
  95. package/node_modules/@poe-code/config-mutations/dist/formats/toml.js +75 -0
  96. package/node_modules/@poe-code/config-mutations/dist/formats/yaml.d.ts +2 -0
  97. package/node_modules/@poe-code/config-mutations/dist/formats/yaml.js +76 -0
  98. package/node_modules/@poe-code/config-mutations/dist/fs-utils.d.ts +18 -0
  99. package/node_modules/@poe-code/config-mutations/dist/fs-utils.js +43 -0
  100. package/node_modules/@poe-code/config-mutations/dist/index.d.ts +8 -0
  101. package/node_modules/@poe-code/config-mutations/dist/index.js +8 -0
  102. package/node_modules/@poe-code/config-mutations/dist/mutations/config-mutation.d.ts +47 -0
  103. package/node_modules/@poe-code/config-mutations/dist/mutations/config-mutation.js +34 -0
  104. package/node_modules/@poe-code/config-mutations/dist/mutations/file-mutation.d.ts +62 -0
  105. package/node_modules/@poe-code/config-mutations/dist/mutations/file-mutation.js +55 -0
  106. package/node_modules/@poe-code/config-mutations/dist/mutations/template-mutation.d.ts +40 -0
  107. package/node_modules/@poe-code/config-mutations/dist/mutations/template-mutation.js +32 -0
  108. package/node_modules/@poe-code/config-mutations/dist/template/render.d.ts +6 -0
  109. package/node_modules/@poe-code/config-mutations/dist/template/render.js +8 -0
  110. package/node_modules/@poe-code/config-mutations/dist/testing/format-utils.d.ts +7 -0
  111. package/node_modules/@poe-code/config-mutations/dist/testing/format-utils.js +21 -0
  112. package/node_modules/@poe-code/config-mutations/dist/testing/index.d.ts +3 -0
  113. package/node_modules/@poe-code/config-mutations/dist/testing/index.js +2 -0
  114. package/node_modules/@poe-code/config-mutations/dist/testing/mock-fs.d.ts +25 -0
  115. package/node_modules/@poe-code/config-mutations/dist/testing/mock-fs.js +194 -0
  116. package/node_modules/@poe-code/config-mutations/dist/types.d.ts +168 -0
  117. package/node_modules/@poe-code/config-mutations/dist/types.js +6 -0
  118. package/node_modules/@poe-code/config-mutations/package.json +29 -0
  119. package/node_modules/@poe-code/frontmatter/README.md +35 -0
  120. package/node_modules/@poe-code/frontmatter/dist/fences.d.ts +25 -0
  121. package/node_modules/@poe-code/frontmatter/dist/fences.js +100 -0
  122. package/node_modules/@poe-code/frontmatter/dist/index.d.ts +3 -0
  123. package/node_modules/@poe-code/frontmatter/dist/index.js +3 -0
  124. package/node_modules/@poe-code/frontmatter/dist/parse.d.ts +20 -0
  125. package/node_modules/@poe-code/frontmatter/dist/parse.js +209 -0
  126. package/node_modules/@poe-code/frontmatter/dist/stringify.d.ts +1 -0
  127. package/node_modules/@poe-code/frontmatter/dist/stringify.js +48 -0
  128. package/node_modules/@poe-code/frontmatter/package.json +25 -0
  129. package/node_modules/toolcraft-design/README.md +160 -0
  130. package/node_modules/toolcraft-design/dist/acp/components.d.ts +12 -0
  131. package/node_modules/toolcraft-design/dist/acp/components.js +137 -0
  132. package/node_modules/toolcraft-design/dist/acp/index.d.ts +3 -0
  133. package/node_modules/toolcraft-design/dist/acp/index.js +2 -0
  134. package/node_modules/toolcraft-design/dist/acp/writer.d.ts +13 -0
  135. package/node_modules/toolcraft-design/dist/acp/writer.js +21 -0
  136. package/node_modules/toolcraft-design/dist/components/browser.d.ts +15 -0
  137. package/node_modules/toolcraft-design/dist/components/browser.js +31 -0
  138. package/node_modules/toolcraft-design/dist/components/catalog.d.ts +26 -0
  139. package/node_modules/toolcraft-design/dist/components/catalog.js +95 -0
  140. package/node_modules/toolcraft-design/dist/components/color.d.ts +31 -0
  141. package/node_modules/toolcraft-design/dist/components/color.js +102 -0
  142. package/node_modules/toolcraft-design/dist/components/command-errors.d.ts +16 -0
  143. package/node_modules/toolcraft-design/dist/components/command-errors.js +23 -0
  144. package/node_modules/toolcraft-design/dist/components/detail-card.d.ts +22 -0
  145. package/node_modules/toolcraft-design/dist/components/detail-card.js +45 -0
  146. package/node_modules/toolcraft-design/dist/components/help-formatter-plain.d.ts +5 -0
  147. package/node_modules/toolcraft-design/dist/components/help-formatter-plain.js +132 -0
  148. package/node_modules/toolcraft-design/dist/components/help-formatter.d.ts +33 -0
  149. package/node_modules/toolcraft-design/dist/components/help-formatter.js +213 -0
  150. package/node_modules/toolcraft-design/dist/components/index.d.ts +16 -0
  151. package/node_modules/toolcraft-design/dist/components/index.js +10 -0
  152. package/node_modules/toolcraft-design/dist/components/logger.d.ts +11 -0
  153. package/node_modules/toolcraft-design/dist/components/logger.js +60 -0
  154. package/node_modules/toolcraft-design/dist/components/symbols.d.ts +12 -0
  155. package/node_modules/toolcraft-design/dist/components/symbols.js +71 -0
  156. package/node_modules/toolcraft-design/dist/components/table.d.ts +15 -0
  157. package/node_modules/toolcraft-design/dist/components/table.js +302 -0
  158. package/node_modules/toolcraft-design/dist/components/template.d.ts +10 -0
  159. package/node_modules/toolcraft-design/dist/components/template.js +437 -0
  160. package/node_modules/toolcraft-design/dist/components/text.d.ts +16 -0
  161. package/node_modules/toolcraft-design/dist/components/text.js +145 -0
  162. package/node_modules/toolcraft-design/dist/dashboard/ansi.d.ts +18 -0
  163. package/node_modules/toolcraft-design/dist/dashboard/ansi.js +343 -0
  164. package/node_modules/toolcraft-design/dist/dashboard/buffer.d.ts +25 -0
  165. package/node_modules/toolcraft-design/dist/dashboard/buffer.js +219 -0
  166. package/node_modules/toolcraft-design/dist/dashboard/components/border.d.ts +9 -0
  167. package/node_modules/toolcraft-design/dist/dashboard/components/border.js +123 -0
  168. package/node_modules/toolcraft-design/dist/dashboard/components/footer.d.ts +8 -0
  169. package/node_modules/toolcraft-design/dist/dashboard/components/footer.js +56 -0
  170. package/node_modules/toolcraft-design/dist/dashboard/components/output-pane.d.ts +12 -0
  171. package/node_modules/toolcraft-design/dist/dashboard/components/output-pane.js +268 -0
  172. package/node_modules/toolcraft-design/dist/dashboard/components/stats-pane.d.ts +7 -0
  173. package/node_modules/toolcraft-design/dist/dashboard/components/stats-pane.js +107 -0
  174. package/node_modules/toolcraft-design/dist/dashboard/dashboard.d.ts +20 -0
  175. package/node_modules/toolcraft-design/dist/dashboard/dashboard.js +167 -0
  176. package/node_modules/toolcraft-design/dist/dashboard/demo.d.ts +13 -0
  177. package/node_modules/toolcraft-design/dist/dashboard/demo.js +145 -0
  178. package/node_modules/toolcraft-design/dist/dashboard/index.d.ts +8 -0
  179. package/node_modules/toolcraft-design/dist/dashboard/index.js +4 -0
  180. package/node_modules/toolcraft-design/dist/dashboard/keymap.d.ts +8 -0
  181. package/node_modules/toolcraft-design/dist/dashboard/keymap.js +233 -0
  182. package/node_modules/toolcraft-design/dist/dashboard/layout.d.ts +25 -0
  183. package/node_modules/toolcraft-design/dist/dashboard/layout.js +79 -0
  184. package/node_modules/toolcraft-design/dist/dashboard/should-use-dashboard.d.ts +10 -0
  185. package/node_modules/toolcraft-design/dist/dashboard/should-use-dashboard.js +7 -0
  186. package/node_modules/toolcraft-design/dist/dashboard/snapshot.d.ts +10 -0
  187. package/node_modules/toolcraft-design/dist/dashboard/snapshot.js +68 -0
  188. package/node_modules/toolcraft-design/dist/dashboard/store.d.ts +8 -0
  189. package/node_modules/toolcraft-design/dist/dashboard/store.js +51 -0
  190. package/node_modules/toolcraft-design/dist/dashboard/terminal-width.d.ts +4 -0
  191. package/node_modules/toolcraft-design/dist/dashboard/terminal-width.js +71 -0
  192. package/node_modules/toolcraft-design/dist/dashboard/terminal.d.ts +37 -0
  193. package/node_modules/toolcraft-design/dist/dashboard/terminal.js +264 -0
  194. package/node_modules/toolcraft-design/dist/dashboard/types.d.ts +38 -0
  195. package/node_modules/toolcraft-design/dist/dashboard/types.js +1 -0
  196. package/node_modules/toolcraft-design/dist/explorer/actions.d.ts +16 -0
  197. package/node_modules/toolcraft-design/dist/explorer/actions.js +39 -0
  198. package/node_modules/toolcraft-design/dist/explorer/demo.d.ts +13 -0
  199. package/node_modules/toolcraft-design/dist/explorer/demo.js +297 -0
  200. package/node_modules/toolcraft-design/dist/explorer/events.d.ts +67 -0
  201. package/node_modules/toolcraft-design/dist/explorer/events.js +1 -0
  202. package/node_modules/toolcraft-design/dist/explorer/filter.d.ts +10 -0
  203. package/node_modules/toolcraft-design/dist/explorer/filter.js +95 -0
  204. package/node_modules/toolcraft-design/dist/explorer/index.d.ts +8 -0
  205. package/node_modules/toolcraft-design/dist/explorer/index.js +8 -0
  206. package/node_modules/toolcraft-design/dist/explorer/jobs.d.ts +7 -0
  207. package/node_modules/toolcraft-design/dist/explorer/jobs.js +59 -0
  208. package/node_modules/toolcraft-design/dist/explorer/keymap.d.ts +21 -0
  209. package/node_modules/toolcraft-design/dist/explorer/keymap.js +376 -0
  210. package/node_modules/toolcraft-design/dist/explorer/layout.d.ts +20 -0
  211. package/node_modules/toolcraft-design/dist/explorer/layout.js +73 -0
  212. package/node_modules/toolcraft-design/dist/explorer/reducer.d.ts +9 -0
  213. package/node_modules/toolcraft-design/dist/explorer/reducer.js +782 -0
  214. package/node_modules/toolcraft-design/dist/explorer/render/detail.d.ts +4 -0
  215. package/node_modules/toolcraft-design/dist/explorer/render/detail.js +97 -0
  216. package/node_modules/toolcraft-design/dist/explorer/render/footer.d.ts +4 -0
  217. package/node_modules/toolcraft-design/dist/explorer/render/footer.js +73 -0
  218. package/node_modules/toolcraft-design/dist/explorer/render/header.d.ts +4 -0
  219. package/node_modules/toolcraft-design/dist/explorer/render/header.js +49 -0
  220. package/node_modules/toolcraft-design/dist/explorer/render/index.d.ts +8 -0
  221. package/node_modules/toolcraft-design/dist/explorer/render/index.js +53 -0
  222. package/node_modules/toolcraft-design/dist/explorer/render/list.d.ts +4 -0
  223. package/node_modules/toolcraft-design/dist/explorer/render/list.js +116 -0
  224. package/node_modules/toolcraft-design/dist/explorer/render/modal.d.ts +3 -0
  225. package/node_modules/toolcraft-design/dist/explorer/render/modal.js +87 -0
  226. package/node_modules/toolcraft-design/dist/explorer/render/test-fixtures.d.ts +8 -0
  227. package/node_modules/toolcraft-design/dist/explorer/render/test-fixtures.js +156 -0
  228. package/node_modules/toolcraft-design/dist/explorer/render/text.d.ts +12 -0
  229. package/node_modules/toolcraft-design/dist/explorer/render/text.js +81 -0
  230. package/node_modules/toolcraft-design/dist/explorer/runtime.d.ts +2 -0
  231. package/node_modules/toolcraft-design/dist/explorer/runtime.js +340 -0
  232. package/node_modules/toolcraft-design/dist/explorer/runtime.test-helpers.d.ts +50 -0
  233. package/node_modules/toolcraft-design/dist/explorer/runtime.test-helpers.js +101 -0
  234. package/node_modules/toolcraft-design/dist/explorer/state.d.ts +137 -0
  235. package/node_modules/toolcraft-design/dist/explorer/state.js +86 -0
  236. package/node_modules/toolcraft-design/dist/explorer/theme.d.ts +27 -0
  237. package/node_modules/toolcraft-design/dist/explorer/theme.js +29 -0
  238. package/node_modules/toolcraft-design/dist/index.d.ts +50 -0
  239. package/node_modules/toolcraft-design/dist/index.js +43 -0
  240. package/node_modules/toolcraft-design/dist/internal/color-support.d.ts +9 -0
  241. package/node_modules/toolcraft-design/dist/internal/color-support.js +12 -0
  242. package/node_modules/toolcraft-design/dist/internal/output-format.d.ts +6 -0
  243. package/node_modules/toolcraft-design/dist/internal/output-format.js +22 -0
  244. package/node_modules/toolcraft-design/dist/internal/strip-ansi.d.ts +1 -0
  245. package/node_modules/toolcraft-design/dist/internal/strip-ansi.js +50 -0
  246. package/node_modules/toolcraft-design/dist/internal/theme-detect.d.ts +12 -0
  247. package/node_modules/toolcraft-design/dist/internal/theme-detect.js +71 -0
  248. package/node_modules/toolcraft-design/dist/internal/theme-state.d.ts +12 -0
  249. package/node_modules/toolcraft-design/dist/internal/theme-state.js +35 -0
  250. package/node_modules/toolcraft-design/dist/prompts/index.d.ts +91 -0
  251. package/node_modules/toolcraft-design/dist/prompts/index.js +137 -0
  252. package/node_modules/toolcraft-design/dist/prompts/interactive/cancel-symbol.d.ts +2 -0
  253. package/node_modules/toolcraft-design/dist/prompts/interactive/cancel-symbol.js +4 -0
  254. package/node_modules/toolcraft-design/dist/prompts/interactive/confirm.d.ts +9 -0
  255. package/node_modules/toolcraft-design/dist/prompts/interactive/confirm.js +47 -0
  256. package/node_modules/toolcraft-design/dist/prompts/interactive/core.d.ts +55 -0
  257. package/node_modules/toolcraft-design/dist/prompts/interactive/core.js +274 -0
  258. package/node_modules/toolcraft-design/dist/prompts/interactive/glyphs.d.ts +20 -0
  259. package/node_modules/toolcraft-design/dist/prompts/interactive/glyphs.js +53 -0
  260. package/node_modules/toolcraft-design/dist/prompts/interactive/index.d.ts +6 -0
  261. package/node_modules/toolcraft-design/dist/prompts/interactive/index.js +6 -0
  262. package/node_modules/toolcraft-design/dist/prompts/interactive/keys.d.ts +2 -0
  263. package/node_modules/toolcraft-design/dist/prompts/interactive/keys.js +28 -0
  264. package/node_modules/toolcraft-design/dist/prompts/interactive/multiselect.d.ts +13 -0
  265. package/node_modules/toolcraft-design/dist/prompts/interactive/multiselect.js +131 -0
  266. package/node_modules/toolcraft-design/dist/prompts/interactive/pagination.d.ts +10 -0
  267. package/node_modules/toolcraft-design/dist/prompts/interactive/pagination.js +52 -0
  268. package/node_modules/toolcraft-design/dist/prompts/interactive/password.d.ts +10 -0
  269. package/node_modules/toolcraft-design/dist/prompts/interactive/password.js +55 -0
  270. package/node_modules/toolcraft-design/dist/prompts/interactive/select.d.ts +18 -0
  271. package/node_modules/toolcraft-design/dist/prompts/interactive/select.js +89 -0
  272. package/node_modules/toolcraft-design/dist/prompts/interactive/test-helpers.d.ts +21 -0
  273. package/node_modules/toolcraft-design/dist/prompts/interactive/test-helpers.js +32 -0
  274. package/node_modules/toolcraft-design/dist/prompts/interactive/text.d.ts +12 -0
  275. package/node_modules/toolcraft-design/dist/prompts/interactive/text.js +60 -0
  276. package/node_modules/toolcraft-design/dist/prompts/interactive/wrap.d.ts +4 -0
  277. package/node_modules/toolcraft-design/dist/prompts/interactive/wrap.js +18 -0
  278. package/node_modules/toolcraft-design/dist/prompts/primitives/cancel.d.ts +2 -0
  279. package/node_modules/toolcraft-design/dist/prompts/primitives/cancel.js +9 -0
  280. package/node_modules/toolcraft-design/dist/prompts/primitives/intro.d.ts +1 -0
  281. package/node_modules/toolcraft-design/dist/prompts/primitives/intro.js +16 -0
  282. package/node_modules/toolcraft-design/dist/prompts/primitives/log.d.ts +18 -0
  283. package/node_modules/toolcraft-design/dist/prompts/primitives/log.js +104 -0
  284. package/node_modules/toolcraft-design/dist/prompts/primitives/note.d.ts +1 -0
  285. package/node_modules/toolcraft-design/dist/prompts/primitives/note.js +39 -0
  286. package/node_modules/toolcraft-design/dist/prompts/primitives/outro.d.ts +1 -0
  287. package/node_modules/toolcraft-design/dist/prompts/primitives/outro.js +16 -0
  288. package/node_modules/toolcraft-design/dist/prompts/primitives/spinner.d.ts +6 -0
  289. package/node_modules/toolcraft-design/dist/prompts/primitives/spinner.js +74 -0
  290. package/node_modules/toolcraft-design/dist/prompts/theme.d.ts +11 -0
  291. package/node_modules/toolcraft-design/dist/prompts/theme.js +15 -0
  292. package/node_modules/toolcraft-design/dist/static/index.d.ts +4 -0
  293. package/node_modules/toolcraft-design/dist/static/index.js +2 -0
  294. package/node_modules/toolcraft-design/dist/static/menu.d.ts +11 -0
  295. package/node_modules/toolcraft-design/dist/static/menu.js +42 -0
  296. package/node_modules/toolcraft-design/dist/static/spinner.d.ts +14 -0
  297. package/node_modules/toolcraft-design/dist/static/spinner.js +52 -0
  298. package/node_modules/toolcraft-design/dist/terminal-markdown/ast.d.ts +92 -0
  299. package/node_modules/toolcraft-design/dist/terminal-markdown/ast.js +1 -0
  300. package/node_modules/toolcraft-design/dist/terminal-markdown/demo-content.d.ts +2 -0
  301. package/node_modules/toolcraft-design/dist/terminal-markdown/demo-content.js +139 -0
  302. package/node_modules/toolcraft-design/dist/terminal-markdown/index.d.ts +6 -0
  303. package/node_modules/toolcraft-design/dist/terminal-markdown/index.js +8 -0
  304. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/block.d.ts +7 -0
  305. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/block.js +1495 -0
  306. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/frontmatter.d.ts +8 -0
  307. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/frontmatter.js +36 -0
  308. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/inline.d.ts +10 -0
  309. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/inline.js +1190 -0
  310. package/node_modules/toolcraft-design/dist/terminal-markdown/parser.d.ts +5 -0
  311. package/node_modules/toolcraft-design/dist/terminal-markdown/parser.js +42 -0
  312. package/node_modules/toolcraft-design/dist/terminal-markdown/renderer.d.ts +6 -0
  313. package/node_modules/toolcraft-design/dist/terminal-markdown/renderer.js +615 -0
  314. package/node_modules/toolcraft-design/dist/terminal-markdown/testing/theme-render-fixture.d.ts +1 -0
  315. package/node_modules/toolcraft-design/dist/terminal-markdown/testing/theme-render-fixture.js +27 -0
  316. package/node_modules/toolcraft-design/dist/tokens/brand.d.ts +5 -0
  317. package/node_modules/toolcraft-design/dist/tokens/brand.js +5 -0
  318. package/node_modules/toolcraft-design/dist/tokens/colors.d.ts +37 -0
  319. package/node_modules/toolcraft-design/dist/tokens/colors.js +85 -0
  320. package/node_modules/toolcraft-design/dist/tokens/index.d.ts +6 -0
  321. package/node_modules/toolcraft-design/dist/tokens/index.js +5 -0
  322. package/node_modules/toolcraft-design/dist/tokens/spacing.d.ts +6 -0
  323. package/node_modules/toolcraft-design/dist/tokens/spacing.js +6 -0
  324. package/node_modules/toolcraft-design/dist/tokens/typography.d.ts +7 -0
  325. package/node_modules/toolcraft-design/dist/tokens/typography.js +8 -0
  326. package/node_modules/toolcraft-design/dist/tokens/widths.d.ts +5 -0
  327. package/node_modules/toolcraft-design/dist/tokens/widths.js +5 -0
  328. package/node_modules/toolcraft-design/package.json +44 -0
  329. package/package.json +15 -5
@@ -0,0 +1,156 @@
1
+ import { ScreenBuffer, cellToAnsi } from "../../dashboard/buffer.js";
2
+ import { filterRows } from "../filter.js";
3
+ import { computeExplorerLayout } from "../layout.js";
4
+ import { createInitialState, REGION_ALL } from "../state.js";
5
+ import { renderExplorer } from "./index.js";
6
+ export function renderStateSnapshot(state) {
7
+ const screen = new ScreenBuffer(state.size.cols, state.size.rows);
8
+ renderExplorer(state, screen);
9
+ return dumpScreen(screen);
10
+ }
11
+ export function dumpScreen(screen) {
12
+ const lines = [];
13
+ for (let y = 0; y < screen.height; y += 1) {
14
+ let line = "";
15
+ for (let x = 0; x < screen.width; x += 1) {
16
+ line += cellToAnsi(screen.get(x, y));
17
+ }
18
+ lines.push(line);
19
+ }
20
+ return lines.join("\n");
21
+ }
22
+ export function fixtureState(overrides = {}) {
23
+ const rows = overrides.rows ?? fixtureRows();
24
+ const filter = overrides.filter ?? "";
25
+ const size = overrides.size ?? { cols: 100, rows: 14 };
26
+ const config = {
27
+ title: overrides.title ?? "Plans",
28
+ rows: async () => rows,
29
+ detail: {
30
+ items: async () => []
31
+ },
32
+ actions: fixtureActions(),
33
+ multiSelect: true,
34
+ emptyHint: "No plans"
35
+ };
36
+ const state = createInitialState(config, size);
37
+ state.rows = rows;
38
+ state.filter = filter;
39
+ const matches = filterRows(filter, rows);
40
+ state.filtered = matches.map((match) => match.index);
41
+ state.matchPositions = new Map(matches.map((match) => [match.index, match.positions]));
42
+ state.cursor = overrides.cursor ?? 0;
43
+ state.detail = overrides.detail ?? {
44
+ rowId: rows[0]?.id ?? null,
45
+ items: [singleDetailItem()],
46
+ cursor: 0,
47
+ scroll: 0,
48
+ token: 1,
49
+ loading: false
50
+ };
51
+ state.selected = overrides.selected ?? new Set(["27", "24"]);
52
+ state.focused = overrides.focused ?? "list";
53
+ state.modal = overrides.modal ?? null;
54
+ state.toast = overrides.toast ?? null;
55
+ state.dirty = overrides.dirty ?? REGION_ALL;
56
+ state.layout = computeExplorerLayout(size).mode;
57
+ for (const [key, value] of Object.entries(overrides)) {
58
+ state[key] = value;
59
+ }
60
+ return state;
61
+ }
62
+ export function fixtureRows() {
63
+ return [
64
+ {
65
+ id: "27",
66
+ title: "Explorer TUI library",
67
+ subtitle: "2d · kjopek · design-system",
68
+ badge: { text: "active", tone: "success" },
69
+ group: "Current"
70
+ },
71
+ {
72
+ id: "26",
73
+ title: "ACP telemetry converters",
74
+ subtitle: "3d · kjopek · acp",
75
+ badge: { text: "draft", tone: "warning" },
76
+ group: "Current"
77
+ },
78
+ {
79
+ id: "25",
80
+ title: "Maestro",
81
+ subtitle: "5d · kjopek · pipeline",
82
+ group: "Backlog"
83
+ },
84
+ {
85
+ id: "24",
86
+ title: "Tasks board sync",
87
+ subtitle: "1w · kjopek · superintendent",
88
+ badge: { text: "blocked", tone: "error" },
89
+ group: "Backlog"
90
+ }
91
+ ];
92
+ }
93
+ export function singleDetailItem() {
94
+ return {
95
+ id: "body",
96
+ render: () => [
97
+ "# Explorer TUI library",
98
+ "",
99
+ "A reusable list + detail + actions explorer component.",
100
+ "",
101
+ "## What we're building",
102
+ "A generic three-region explorer TUI."
103
+ ].join("\n")
104
+ };
105
+ }
106
+ export function listDetailItems() {
107
+ return [
108
+ {
109
+ id: "thread-1",
110
+ title: "packages/auth/src/refresh.ts:42",
111
+ subtitle: "kjopek · requested changes",
112
+ badge: { text: "fix", tone: "error" },
113
+ render: () => "The lock is released before the await."
114
+ },
115
+ {
116
+ id: "thread-2",
117
+ title: "packages/auth/src/refresh.ts:88",
118
+ subtitle: "nit",
119
+ badge: { text: "nit", tone: "info" },
120
+ render: () => "Rename `t` to `token` for readability."
121
+ }
122
+ ];
123
+ }
124
+ function fixtureActions() {
125
+ return [
126
+ {
127
+ id: "edit",
128
+ label: "edit",
129
+ key: "e",
130
+ handler: () => undefined,
131
+ showInFooter: true
132
+ },
133
+ {
134
+ id: "archive",
135
+ label: "archive",
136
+ key: "a",
137
+ handler: () => undefined,
138
+ showInFooter: true
139
+ },
140
+ {
141
+ id: "delete",
142
+ label: "delete",
143
+ key: "d",
144
+ handler: () => undefined,
145
+ destructive: true,
146
+ showInFooter: true
147
+ },
148
+ {
149
+ id: "open",
150
+ label: "open",
151
+ handler: () => undefined,
152
+ primary: true,
153
+ showInFooter: true
154
+ }
155
+ ];
156
+ }
@@ -0,0 +1,12 @@
1
+ export interface GraphemeCell {
2
+ value: string;
3
+ start: number;
4
+ end: number;
5
+ width: number;
6
+ }
7
+ export declare function cellWidth(value: string, startColumn?: number): number;
8
+ export declare function fitToWidth(text: string, width: number, startColumn?: number): string;
9
+ export declare function centerCells(text: string, width: number, startColumn?: number): string;
10
+ export declare function padEndCells(text: string, width: number, fill?: string, startColumn?: number): string;
11
+ export declare function splitGraphemeCells(value: string, startColumn?: number): GraphemeCell[];
12
+ export declare function stripAnsi(value: string): string;
@@ -0,0 +1,81 @@
1
+ import { displayWidth, graphemes } from "../../dashboard/terminal-width.js";
2
+ const ELLIPSIS = "…";
3
+ export function cellWidth(value, startColumn = 0) {
4
+ return displayWidth(value, startColumn);
5
+ }
6
+ export function fitToWidth(text, width, startColumn = 0) {
7
+ if (width <= 0) {
8
+ return "";
9
+ }
10
+ if (cellWidth(text, startColumn) <= width) {
11
+ return text;
12
+ }
13
+ const ellipsisWidth = cellWidth(ELLIPSIS, startColumn);
14
+ if (ellipsisWidth > width) {
15
+ return takeCells(text, width, startColumn);
16
+ }
17
+ const prefix = takeCells(text, width - ellipsisWidth, startColumn);
18
+ return `${prefix}${ELLIPSIS}`;
19
+ }
20
+ export function centerCells(text, width, startColumn = 0) {
21
+ const fitted = fitToWidth(text, width, startColumn);
22
+ const padding = Math.max(0, Math.floor((width - cellWidth(fitted, startColumn)) / 2));
23
+ return `${" ".repeat(padding)}${fitted}`;
24
+ }
25
+ export function padEndCells(text, width, fill = " ", startColumn = 0) {
26
+ let output = takeCells(text, width, startColumn);
27
+ let used = cellWidth(output, startColumn);
28
+ let column = startColumn + used;
29
+ while (used < width) {
30
+ const fillWidth = cellWidth(fill, column);
31
+ if (fill.length === 0 || fillWidth <= 0 || used + fillWidth > width) {
32
+ const spaces = width - used;
33
+ output += " ".repeat(spaces);
34
+ used += spaces;
35
+ column += spaces;
36
+ continue;
37
+ }
38
+ output += fill;
39
+ used += fillWidth;
40
+ column += fillWidth;
41
+ }
42
+ return output;
43
+ }
44
+ export function splitGraphemeCells(value, startColumn = 0) {
45
+ const cells = [];
46
+ let offset = 0;
47
+ let column = startColumn;
48
+ for (const segment of graphemes(value)) {
49
+ const width = cellWidth(segment, column);
50
+ cells.push({
51
+ value: segment,
52
+ start: offset,
53
+ end: offset + segment.length,
54
+ width
55
+ });
56
+ offset += segment.length;
57
+ column += width;
58
+ }
59
+ return cells;
60
+ }
61
+ export function stripAnsi(value) {
62
+ return value.replace(/\u001b\[[0-9;]*m/g, "");
63
+ }
64
+ function takeCells(text, width, startColumn) {
65
+ if (width <= 0) {
66
+ return "";
67
+ }
68
+ let output = "";
69
+ let used = 0;
70
+ let column = startColumn;
71
+ for (const segment of graphemes(text)) {
72
+ const segmentWidth = cellWidth(segment, column);
73
+ if (used + segmentWidth > width) {
74
+ break;
75
+ }
76
+ output += segment;
77
+ used += segmentWidth;
78
+ column += segmentWidth;
79
+ }
80
+ return output;
81
+ }
@@ -0,0 +1,2 @@
1
+ import { type ExplorerConfig } from "./state.js";
2
+ export declare function runExplorer<R = void>(config: ExplorerConfig<R>): Promise<R | null>;
@@ -0,0 +1,340 @@
1
+ import { ScreenBuffer, cellToAnsi, diff } from "../dashboard/buffer.js";
2
+ import { createTerminalDriver } from "../dashboard/terminal.js";
3
+ import { createDetailJobs } from "./jobs.js";
4
+ import { computeExplorerLayout } from "./layout.js";
5
+ import { renderExplorer } from "./render/index.js";
6
+ import { step } from "./reducer.js";
7
+ import { createInitialState, REGION_ALL, REGION_MODAL, REGION_TOAST } from "./state.js";
8
+ const TOAST_MS = 2500;
9
+ export async function runExplorer(config) {
10
+ if (process.stdout.isTTY !== true) {
11
+ throw new Error("explorer requires a TTY");
12
+ }
13
+ const driver = createTerminalDriver();
14
+ const runtime = new ExplorerRuntime(config, driver);
15
+ return runtime.run();
16
+ }
17
+ class ExplorerRuntime {
18
+ config;
19
+ driver;
20
+ state;
21
+ previousBuffer = new ScreenBuffer(0, 0);
22
+ detailJobs;
23
+ runtimeHandles;
24
+ pendingEffects = new Set();
25
+ unsubscribeKeypress;
26
+ unsubscribeResize;
27
+ toastTimer;
28
+ rowsRequestToken = 0;
29
+ reorderToken = 0;
30
+ stopped = false;
31
+ settle;
32
+ constructor(config, driver) {
33
+ this.config = config;
34
+ this.driver = driver;
35
+ this.state = createInitialState(config, driver.getSize());
36
+ this.detailJobs = createDetailJobs((event) => {
37
+ if (event.type === "detailLoaded") {
38
+ this.loadDetailContent(event.rowId, event.token, event.items);
39
+ return;
40
+ }
41
+ this.dispatch(event);
42
+ });
43
+ this.runtimeHandles = {
44
+ refresh: async () => {
45
+ await this.refreshRowsFromSource();
46
+ },
47
+ suspendAnd: async (fn) => this.suspendAnd(fn),
48
+ toast: (msg, tone) => {
49
+ this.showToast(msg, tone);
50
+ },
51
+ confirm: async (prompt) => this.confirm(prompt),
52
+ exit: (after) => {
53
+ this.exit(null, after);
54
+ }
55
+ };
56
+ }
57
+ run() {
58
+ return new Promise((resolve, reject) => {
59
+ this.settle = { resolve, reject };
60
+ try {
61
+ this.startTerminal();
62
+ this.render();
63
+ this.loadRows().catch((error) => {
64
+ this.fail(error);
65
+ });
66
+ }
67
+ catch (error) {
68
+ this.fail(error);
69
+ }
70
+ });
71
+ }
72
+ startTerminal() {
73
+ this.driver.enterRawMode();
74
+ this.driver.enterAltScreen();
75
+ this.driver.disableLineWrap();
76
+ this.driver.hideCursor();
77
+ this.unsubscribeKeypress = this.driver.onKeypress((key) => {
78
+ this.dispatch({ type: "key", key });
79
+ });
80
+ this.unsubscribeResize = this.driver.onResize(() => {
81
+ const size = this.driver.getSize();
82
+ this.dispatch({ type: "resize", cols: size.cols, rows: size.rows });
83
+ });
84
+ }
85
+ async loadRows(requestToken = ++this.rowsRequestToken) {
86
+ const rows = await this.config.rows();
87
+ if (requestToken === this.rowsRequestToken) {
88
+ this.dispatch({ type: "rowsLoaded", rows });
89
+ }
90
+ }
91
+ async refreshRowsFromSource() {
92
+ const requestToken = ++this.rowsRequestToken;
93
+ await this.config.refresh?.();
94
+ await this.loadRows(requestToken);
95
+ }
96
+ dispatch(event) {
97
+ if (this.stopped) {
98
+ return;
99
+ }
100
+ const previousState = this.state;
101
+ const next = step(this.state, event, this.runtimeHandles);
102
+ this.state = next.state;
103
+ this.render();
104
+ this.applyEffects(next.effects, previousState);
105
+ }
106
+ applyEffects(effects, previousState) {
107
+ for (const effect of effects) {
108
+ if (effect.type === "renderDetail") {
109
+ this.renderDetail(effect.rowId);
110
+ continue;
111
+ }
112
+ if (effect.type === "persistOrder") {
113
+ this.track(this.persistOrder(effect.orderedIds, previousState.rows, ++this.reorderToken));
114
+ continue;
115
+ }
116
+ if (effect.type === "suspend") {
117
+ this.track(this.runActionEffect(effect));
118
+ continue;
119
+ }
120
+ if (effect.type === "exit") {
121
+ this.exit(effect.result, effect.after);
122
+ }
123
+ }
124
+ }
125
+ renderDetail(rowId) {
126
+ const row = this.state.rows.find((candidate) => candidate.id === rowId);
127
+ if (row === undefined) {
128
+ return;
129
+ }
130
+ const layout = computeExplorerLayout({
131
+ cols: this.state.size.cols,
132
+ rows: this.state.size.rows,
133
+ detailHidden: this.state.layout === "narrow-list-only" || this.state.layout === "too-narrow"
134
+ });
135
+ void this.detailJobs.schedule(rowId, (ctx) => this.config.detail.items(row, ctx), {
136
+ width: layout.detail.width,
137
+ height: layout.detail.height,
138
+ row,
139
+ signal: new AbortController().signal
140
+ });
141
+ }
142
+ loadDetailContent(rowId, token, items) {
143
+ const row = this.state.rows.find((candidate) => candidate.id === rowId);
144
+ if (row === undefined) {
145
+ return;
146
+ }
147
+ const layout = computeExplorerLayout({
148
+ cols: this.state.size.cols,
149
+ rows: this.state.size.rows,
150
+ detailHidden: this.state.layout === "narrow-list-only" || this.state.layout === "too-narrow"
151
+ });
152
+ const context = {
153
+ width: layout.detail.width,
154
+ height: layout.detail.height,
155
+ row,
156
+ signal: new AbortController().signal
157
+ };
158
+ const preparedItems = items.map((item, itemIndex) => {
159
+ try {
160
+ const content = item.render(context);
161
+ if (typeof content === "string") {
162
+ return { ...item, renderedContent: content };
163
+ }
164
+ this.track(content.then((resolved) => this.dispatch({ type: "detailItemRendered", rowId, token, itemIndex, content: resolved }), (error) => this.dispatch({
165
+ type: "detailItemRendered",
166
+ rowId,
167
+ token,
168
+ itemIndex,
169
+ content: error instanceof Error ? `Error: ${error.message}` : "Error: detail failed"
170
+ })));
171
+ return { ...item, renderedContent: "Loading detail..." };
172
+ }
173
+ catch (error) {
174
+ return {
175
+ ...item,
176
+ renderedContent: error instanceof Error ? `Error: ${error.message}` : "Error: detail failed"
177
+ };
178
+ }
179
+ });
180
+ this.dispatch({ type: "detailLoaded", rowId, token, items: preparedItems });
181
+ }
182
+ async persistOrder(orderedIds, previousRows, token) {
183
+ try {
184
+ await this.config.reorder?.onReorder(orderedIds, {
185
+ refresh: this.runtimeHandles.refresh,
186
+ toast: this.runtimeHandles.toast
187
+ });
188
+ }
189
+ catch (error) {
190
+ this.showToast(error instanceof Error ? error.message : "Could not persist order", "error");
191
+ if (token === this.reorderToken) {
192
+ this.dispatch({ type: "rowsLoaded", rows: previousRows });
193
+ }
194
+ }
195
+ }
196
+ async runActionEffect(effect) {
197
+ try {
198
+ const value = await effect.fn();
199
+ this.dispatch(effect.resumeWith(value));
200
+ }
201
+ catch (error) {
202
+ this.showToast(error instanceof Error ? error.message : "Action failed", "error");
203
+ this.dispatch(effect.resumeWith(error));
204
+ }
205
+ }
206
+ async suspendAnd(fn) {
207
+ this.driver.exitAltScreen();
208
+ this.driver.enableLineWrap();
209
+ this.driver.showCursor();
210
+ this.driver.exitRawMode();
211
+ try {
212
+ return await fn();
213
+ }
214
+ finally {
215
+ if (!this.stopped) {
216
+ this.driver.enterRawMode();
217
+ this.driver.enterAltScreen();
218
+ this.driver.disableLineWrap();
219
+ this.driver.hideCursor();
220
+ const size = this.driver.getSize();
221
+ this.dispatch({
222
+ type: "suspendResumed",
223
+ value: null,
224
+ emit: { type: "resize", cols: size.cols, rows: size.rows }
225
+ });
226
+ }
227
+ }
228
+ }
229
+ confirm(prompt) {
230
+ return new Promise((resolve) => {
231
+ const action = {
232
+ id: "__confirm__",
233
+ label: prompt,
234
+ handler: () => undefined
235
+ };
236
+ const row = this.currentRow();
237
+ this.state = {
238
+ ...this.state,
239
+ modal: {
240
+ kind: "confirm",
241
+ action,
242
+ rows: row === undefined ? [] : [row],
243
+ resolver: resolve
244
+ },
245
+ dirty: REGION_MODAL
246
+ };
247
+ this.render();
248
+ });
249
+ }
250
+ showToast(message, tone = "info") {
251
+ if (this.stopped) {
252
+ return;
253
+ }
254
+ if (this.toastTimer !== undefined) {
255
+ clearTimeout(this.toastTimer);
256
+ }
257
+ this.state = {
258
+ ...this.state,
259
+ toast: { message, tone, expiresAt: Date.now() + TOAST_MS },
260
+ dirty: REGION_TOAST
261
+ };
262
+ this.render();
263
+ this.toastTimer = setTimeout(() => {
264
+ this.dispatch({ type: "toastExpired" });
265
+ }, TOAST_MS);
266
+ }
267
+ currentRow() {
268
+ return this.state.rows[this.state.filtered[this.state.cursor] ?? -1];
269
+ }
270
+ render() {
271
+ if (this.stopped) {
272
+ return;
273
+ }
274
+ const size = this.driver.getSize();
275
+ if (size.cols !== this.state.size.cols || size.rows !== this.state.size.rows) {
276
+ this.state = step(this.state, { type: "resize", cols: size.cols, rows: size.rows }, this.runtimeHandles).state;
277
+ }
278
+ const nextBuffer = this.state.dirty === REGION_ALL
279
+ ? new ScreenBuffer(this.state.size.cols, this.state.size.rows)
280
+ : cloneBuffer(this.previousBuffer);
281
+ renderExplorer(this.state, nextBuffer);
282
+ this.driver.write(changesToAnsi(diff(this.previousBuffer, nextBuffer)));
283
+ this.previousBuffer = nextBuffer;
284
+ this.state = { ...this.state, dirty: 0 };
285
+ }
286
+ track(promise) {
287
+ this.pendingEffects.add(promise);
288
+ promise.finally(() => {
289
+ this.pendingEffects.delete(promise);
290
+ });
291
+ }
292
+ exit(result, after) {
293
+ if (this.stopped) {
294
+ return;
295
+ }
296
+ this.stopped = true;
297
+ this.unsubscribeKeypress?.();
298
+ this.unsubscribeResize?.();
299
+ this.detailJobs.abort();
300
+ if (this.toastTimer !== undefined) {
301
+ clearTimeout(this.toastTimer);
302
+ }
303
+ this.driver.destroy();
304
+ Promise.resolve()
305
+ .then(() => after?.())
306
+ .then(() => {
307
+ this.settle?.resolve(result);
308
+ })
309
+ .catch((error) => {
310
+ this.settle?.reject(error);
311
+ });
312
+ }
313
+ fail(error) {
314
+ if (!this.stopped) {
315
+ this.stopped = true;
316
+ this.driver.destroy();
317
+ }
318
+ this.settle?.reject(error);
319
+ }
320
+ }
321
+ function cloneBuffer(buffer) {
322
+ const next = new ScreenBuffer(buffer.width, buffer.height);
323
+ for (let y = 0; y < buffer.height; y += 1) {
324
+ for (let x = 0; x < buffer.width; x += 1) {
325
+ const cell = buffer.get(x, y);
326
+ next.put(x, y, cell.ch, cell.style);
327
+ }
328
+ }
329
+ return next;
330
+ }
331
+ function changesToAnsi(changes) {
332
+ let output = "";
333
+ for (const change of changes) {
334
+ output += `${cursorPositionAnsi(change.x, change.y)}${cellToAnsi(change.cell)}`;
335
+ }
336
+ return output;
337
+ }
338
+ function cursorPositionAnsi(x, y) {
339
+ return `\u001b[${Math.max(1, y + 1)};${Math.max(1, x + 1)}H`;
340
+ }
@@ -0,0 +1,50 @@
1
+ import type { Cell } from "../dashboard/types.js";
2
+ import type { KeypressEvent, TerminalDriver } from "../dashboard/terminal.js";
3
+ export declare class FakeTerminalDriver implements TerminalDriver {
4
+ private cols;
5
+ private rows;
6
+ readonly keyQueue: KeypressEvent[];
7
+ readonly writes: string[];
8
+ readonly flushes: Array<Array<{
9
+ x: number;
10
+ y: number;
11
+ cell: Cell;
12
+ }>>;
13
+ rawMode: boolean;
14
+ altScreen: boolean;
15
+ lineWrap: boolean;
16
+ cursorVisible: boolean;
17
+ destroyed: boolean;
18
+ enterAltScreenCount: number;
19
+ exitAltScreenCount: number;
20
+ enterRawModeCount: number;
21
+ exitRawModeCount: number;
22
+ private readonly keypressHandlers;
23
+ private readonly resizeHandlers;
24
+ constructor(cols?: number, rows?: number);
25
+ get output(): string;
26
+ enterRawMode(): void;
27
+ exitRawMode(): void;
28
+ enterAltScreen(): void;
29
+ exitAltScreen(): void;
30
+ disableLineWrap(): void;
31
+ enableLineWrap(): void;
32
+ hideCursor(): void;
33
+ showCursor(): void;
34
+ moveTo(x: number, y: number): void;
35
+ write(text: string): void;
36
+ flush(changes: Array<{
37
+ x: number;
38
+ y: number;
39
+ cell: Cell;
40
+ }>): void;
41
+ getSize(): {
42
+ cols: number;
43
+ rows: number;
44
+ };
45
+ resize(cols: number, rows: number): void;
46
+ onResize(handler: () => void): () => void;
47
+ onKeypress(handler: (key: KeypressEvent) => void): () => void;
48
+ press(key: KeypressEvent): void;
49
+ destroy(): void;
50
+ }