@ebowwa/coder 0.2.1 → 0.7.64

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 (401) hide show
  1. package/README.md +31 -32
  2. package/dist/core/__tests__/permissions.test.d.ts +12 -0
  3. package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
  4. package/dist/core/__tests__/permissions.test.js +851 -0
  5. package/dist/core/agent-loop/__tests__/compaction.test.d.ts +5 -0
  6. package/dist/core/agent-loop/__tests__/compaction.test.d.ts.map +1 -0
  7. package/dist/core/agent-loop/__tests__/compaction.test.js +209 -0
  8. package/dist/core/agent-loop/__tests__/formatters.test.d.ts +5 -0
  9. package/dist/core/agent-loop/__tests__/formatters.test.d.ts.map +1 -0
  10. package/dist/core/agent-loop/__tests__/formatters.test.js +195 -0
  11. package/dist/core/agent-loop/__tests__/index.test.d.ts +5 -0
  12. package/dist/core/agent-loop/__tests__/index.test.d.ts.map +1 -0
  13. package/dist/core/agent-loop/__tests__/index.test.js +121 -0
  14. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts +5 -0
  15. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts.map +1 -0
  16. package/dist/core/agent-loop/__tests__/loop-state.test.js +340 -0
  17. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts +5 -0
  18. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts.map +1 -0
  19. package/dist/core/agent-loop/__tests__/message-builder.test.js +178 -0
  20. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts +5 -0
  21. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts.map +1 -0
  22. package/dist/core/agent-loop/__tests__/tool-executor.test.js +331 -0
  23. package/dist/core/agent-loop/compaction.d.ts +39 -0
  24. package/dist/core/agent-loop/compaction.d.ts.map +1 -0
  25. package/dist/core/agent-loop/compaction.js +51 -0
  26. package/dist/core/agent-loop/formatters.d.ts +21 -0
  27. package/dist/core/agent-loop/formatters.d.ts.map +1 -0
  28. package/dist/core/agent-loop/formatters.js +42 -0
  29. package/dist/core/agent-loop/index.d.ts +25 -0
  30. package/dist/core/agent-loop/index.d.ts.map +1 -0
  31. package/dist/core/agent-loop/index.js +83 -0
  32. package/dist/core/agent-loop/loop-state.d.ts +74 -0
  33. package/dist/core/agent-loop/loop-state.d.ts.map +1 -0
  34. package/dist/core/agent-loop/loop-state.js +147 -0
  35. package/dist/core/agent-loop/message-builder.d.ts +13 -0
  36. package/dist/core/agent-loop/message-builder.d.ts.map +1 -0
  37. package/dist/core/agent-loop/message-builder.js +49 -0
  38. package/dist/core/agent-loop/tool-executor.d.ts +23 -0
  39. package/dist/core/agent-loop/tool-executor.d.ts.map +1 -0
  40. package/dist/core/agent-loop/tool-executor.js +152 -0
  41. package/dist/core/agent-loop/turn-executor.d.ts +57 -0
  42. package/dist/core/agent-loop/turn-executor.d.ts.map +1 -0
  43. package/dist/core/agent-loop/turn-executor.js +124 -0
  44. package/dist/core/agent-loop/types.d.ts +141 -0
  45. package/dist/core/agent-loop/types.d.ts.map +1 -0
  46. package/dist/core/agent-loop/types.js +4 -0
  47. package/dist/core/agent-loop.d.ts +17 -0
  48. package/dist/core/agent-loop.d.ts.map +1 -0
  49. package/dist/core/agent-loop.js +16 -0
  50. package/dist/core/api-client-impl.d.ts +62 -0
  51. package/dist/core/api-client-impl.d.ts.map +1 -0
  52. package/dist/core/api-client-impl.js +479 -0
  53. package/dist/core/api-client.d.ts +6 -0
  54. package/dist/core/api-client.d.ts.map +1 -0
  55. package/dist/core/api-client.js +5 -0
  56. package/dist/core/checkpoints.d.ts +128 -0
  57. package/dist/core/checkpoints.d.ts.map +1 -0
  58. package/dist/core/checkpoints.js +438 -0
  59. package/dist/core/claude-md.d.ts +71 -0
  60. package/dist/core/claude-md.d.ts.map +1 -0
  61. package/dist/core/claude-md.js +198 -0
  62. package/dist/core/cognitive-security/hooks.d.ts +138 -0
  63. package/dist/core/cognitive-security/hooks.d.ts.map +1 -0
  64. package/dist/core/cognitive-security/hooks.js +389 -0
  65. package/dist/core/cognitive-security/index.d.ts +751 -0
  66. package/dist/core/cognitive-security/index.d.ts.map +1 -0
  67. package/dist/core/cognitive-security/index.js +1123 -0
  68. package/dist/core/cognitive-security/middleware.d.ts +136 -0
  69. package/dist/core/cognitive-security/middleware.d.ts.map +1 -0
  70. package/dist/core/cognitive-security/middleware.js +376 -0
  71. package/dist/core/config-loader.d.ts +127 -0
  72. package/dist/core/config-loader.d.ts.map +1 -0
  73. package/dist/core/config-loader.js +219 -0
  74. package/dist/core/context-compaction.d.ts +87 -0
  75. package/dist/core/context-compaction.d.ts.map +1 -0
  76. package/dist/core/context-compaction.js +428 -0
  77. package/dist/core/git-status.d.ts +25 -0
  78. package/dist/core/git-status.d.ts.map +1 -0
  79. package/dist/core/git-status.js +204 -0
  80. package/dist/core/image.d.ts +69 -0
  81. package/dist/core/image.d.ts.map +1 -0
  82. package/dist/core/image.js +290 -0
  83. package/dist/core/image.test.d.ts +2 -0
  84. package/dist/core/image.test.d.ts.map +1 -0
  85. package/dist/core/image.test.js +149 -0
  86. package/dist/core/models.d.ts +123 -0
  87. package/dist/core/models.d.ts.map +1 -0
  88. package/dist/core/models.js +325 -0
  89. package/dist/core/permissions.d.ts +81 -0
  90. package/dist/core/permissions.d.ts.map +1 -0
  91. package/dist/core/permissions.js +327 -0
  92. package/dist/core/retry.d.ts +25 -0
  93. package/dist/core/retry.d.ts.map +1 -0
  94. package/dist/core/retry.js +121 -0
  95. package/dist/core/session-store.d.ts +9 -0
  96. package/dist/core/session-store.d.ts.map +1 -0
  97. package/dist/core/session-store.js +10 -0
  98. package/dist/core/sessions/export.d.ts +47 -0
  99. package/dist/core/sessions/export.d.ts.map +1 -0
  100. package/dist/core/sessions/export.js +256 -0
  101. package/dist/core/sessions/index.d.ts +132 -0
  102. package/dist/core/sessions/index.d.ts.map +1 -0
  103. package/dist/core/sessions/index.js +442 -0
  104. package/dist/core/sessions/metadata.d.ts +77 -0
  105. package/dist/core/sessions/metadata.d.ts.map +1 -0
  106. package/dist/core/sessions/metadata.js +233 -0
  107. package/dist/core/sessions/persistence.d.ts +72 -0
  108. package/dist/core/sessions/persistence.d.ts.map +1 -0
  109. package/dist/core/sessions/persistence.js +201 -0
  110. package/dist/core/sessions/types.d.ts +110 -0
  111. package/dist/core/sessions/types.d.ts.map +1 -0
  112. package/dist/core/sessions/types.js +4 -0
  113. package/dist/core/stream-highlighter.d.ts +18 -0
  114. package/dist/core/stream-highlighter.d.ts.map +1 -0
  115. package/dist/core/stream-highlighter.js +916 -0
  116. package/dist/core/system-reminders.d.ts +89 -0
  117. package/dist/core/system-reminders.d.ts.map +1 -0
  118. package/dist/core/system-reminders.js +285 -0
  119. package/dist/ecosystem/hooks/__tests__/index.test.d.ts +5 -0
  120. package/dist/ecosystem/hooks/__tests__/index.test.d.ts.map +1 -0
  121. package/dist/ecosystem/hooks/__tests__/index.test.js +458 -0
  122. package/dist/ecosystem/hooks/index.d.ts +59 -0
  123. package/dist/ecosystem/hooks/index.d.ts.map +1 -0
  124. package/dist/ecosystem/hooks/index.js +294 -0
  125. package/dist/ecosystem/hooks/prompt-evaluator.d.ts +32 -0
  126. package/dist/ecosystem/hooks/prompt-evaluator.d.ts.map +1 -0
  127. package/dist/ecosystem/hooks/prompt-evaluator.js +229 -0
  128. package/dist/ecosystem/skills/index.d.ts +55 -0
  129. package/dist/ecosystem/skills/index.d.ts.map +1 -0
  130. package/dist/ecosystem/skills/index.js +258 -0
  131. package/dist/ecosystem/tools/__tests__/index.test.d.ts +7 -0
  132. package/dist/ecosystem/tools/__tests__/index.test.d.ts.map +1 -0
  133. package/dist/ecosystem/tools/__tests__/index.test.js +856 -0
  134. package/dist/ecosystem/tools/index.d.ts +24 -0
  135. package/dist/ecosystem/tools/index.d.ts.map +1 -0
  136. package/dist/ecosystem/tools/index.js +1709 -0
  137. package/dist/index.d.ts +24 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +32 -2
  140. package/dist/interfaces/mcp/client.d.ts +40 -0
  141. package/dist/interfaces/mcp/client.d.ts.map +1 -0
  142. package/dist/interfaces/mcp/client.js +309 -0
  143. package/dist/interfaces/ui/index.d.ts +36 -0
  144. package/dist/interfaces/ui/index.d.ts.map +1 -0
  145. package/dist/interfaces/ui/index.js +61 -0
  146. package/dist/interfaces/ui/spinner.d.ts +140 -0
  147. package/dist/interfaces/ui/spinner.d.ts.map +1 -0
  148. package/dist/interfaces/ui/spinner.js +342 -0
  149. package/dist/interfaces/ui/terminal/cli/index.d.ts +12 -0
  150. package/dist/interfaces/ui/terminal/cli/index.d.ts.map +1 -0
  151. package/dist/interfaces/ui/terminal/cli/index.js +167 -0
  152. package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
  153. package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
  154. package/dist/interfaces/ui/terminal/shared/args.js +176 -0
  155. package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
  156. package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
  157. package/dist/interfaces/ui/terminal/shared/index.js +16 -0
  158. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
  159. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
  160. package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
  161. package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
  162. package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
  163. package/dist/interfaces/ui/terminal/shared/query.js +100 -0
  164. package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
  165. package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
  166. package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
  167. package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
  168. package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
  169. package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
  170. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
  171. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
  172. package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
  173. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
  174. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
  175. package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
  176. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
  177. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
  178. package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
  179. package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
  180. package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
  181. package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
  182. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
  183. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
  184. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
  185. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
  186. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
  187. package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
  188. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
  189. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
  190. package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
  191. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
  192. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
  193. package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
  194. package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
  195. package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
  196. package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
  197. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
  198. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
  199. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
  200. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
  201. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
  202. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
  203. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
  204. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
  205. package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
  206. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
  207. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
  208. package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
  209. package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
  210. package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
  211. package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
  212. package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
  213. package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
  214. package/dist/interfaces/ui/terminal/tui/console.js +46 -0
  215. package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
  216. package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
  217. package/dist/interfaces/ui/terminal/tui/index.js +28 -0
  218. package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
  219. package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
  220. package/dist/interfaces/ui/terminal/tui/run.js +31 -0
  221. package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
  222. package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
  223. package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
  224. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
  225. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
  226. package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
  227. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
  228. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
  229. package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
  230. package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
  231. package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
  232. package/dist/interfaces/ui/terminal/tui/types.js +5 -0
  233. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
  234. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
  235. package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
  236. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
  237. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
  238. package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
  239. package/dist/native/index.d.ts +480 -0
  240. package/dist/native/index.d.ts.map +1 -0
  241. package/dist/native/index.js +1625 -0
  242. package/dist/teammates/index.d.ts +161 -0
  243. package/dist/teammates/index.d.ts.map +1 -0
  244. package/dist/teammates/index.js +827 -0
  245. package/dist/types/index.d.ts +482 -0
  246. package/dist/types/index.d.ts.map +1 -0
  247. package/dist/types/index.js +52 -0
  248. package/native/README.md +5 -5
  249. package/native/index.darwin-arm64.node +0 -0
  250. package/native/index.node +0 -0
  251. package/native/package.json +4 -4
  252. package/package.json +33 -16
  253. package/packages/src/core/__tests__/permissions.test.ts +1091 -0
  254. package/packages/src/core/agent-loop/__tests__/compaction.test.ts +280 -0
  255. package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
  256. package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
  257. package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
  258. package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
  259. package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
  260. package/packages/src/core/agent-loop/compaction.ts +88 -0
  261. package/packages/src/core/agent-loop/formatters.ts +50 -0
  262. package/packages/src/core/agent-loop/index.ts +135 -0
  263. package/packages/src/core/agent-loop/loop-state.ts +187 -0
  264. package/packages/src/core/agent-loop/message-builder.ts +62 -0
  265. package/packages/src/core/agent-loop/tool-executor.ts +211 -0
  266. package/packages/src/core/agent-loop/turn-executor.ts +222 -0
  267. package/packages/src/core/agent-loop/types.ts +148 -0
  268. package/packages/src/core/agent-loop.ts +18 -0
  269. package/packages/src/core/api-client-impl.ts +619 -0
  270. package/packages/src/core/api-client.ts +6 -0
  271. package/packages/src/core/checkpoints.ts +606 -0
  272. package/packages/src/core/claude-md.ts +272 -0
  273. package/packages/src/core/cognitive-security/hooks.ts +590 -0
  274. package/packages/src/core/cognitive-security/index.ts +2041 -0
  275. package/packages/src/core/cognitive-security/middleware.ts +536 -0
  276. package/packages/src/core/config-loader.ts +324 -0
  277. package/packages/src/core/context-compaction.ts +578 -0
  278. package/packages/src/core/git-status.ts +262 -0
  279. package/packages/src/core/image.test.ts +180 -0
  280. package/packages/src/core/image.ts +350 -0
  281. package/packages/src/core/lmdb.db +0 -0
  282. package/packages/src/core/lmdb.db-lock +0 -0
  283. package/packages/src/core/models.ts +430 -0
  284. package/packages/src/core/normalizers/todo +4 -0
  285. package/packages/src/core/permissions.ts +431 -0
  286. package/packages/src/core/retry.ts +170 -0
  287. package/packages/src/core/session-store.ts +36 -0
  288. package/packages/src/core/sessions/export.ts +329 -0
  289. package/packages/src/core/sessions/index.ts +587 -0
  290. package/packages/src/core/sessions/metadata.ts +309 -0
  291. package/packages/src/core/sessions/persistence.ts +244 -0
  292. package/packages/src/core/sessions/types.ts +169 -0
  293. package/packages/src/core/stream-highlighter.ts +1123 -0
  294. package/packages/src/core/system-reminders.ts +402 -0
  295. package/packages/src/core/todo +8 -0
  296. package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
  297. package/packages/src/ecosystem/hooks/index.ts +341 -0
  298. package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
  299. package/packages/src/ecosystem/skills/index.ts +295 -0
  300. package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
  301. package/packages/src/ecosystem/tools/index.ts +1877 -0
  302. package/packages/src/index.ts +120 -0
  303. package/packages/src/interfaces/mcp/client.ts +389 -0
  304. package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
  305. package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
  306. package/packages/src/interfaces/ui/index.ts +161 -0
  307. package/packages/src/interfaces/ui/lmdb.db +0 -0
  308. package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
  309. package/packages/src/interfaces/ui/spinner.ts +451 -0
  310. package/packages/src/interfaces/ui/terminal/cli/index.ts +228 -0
  311. package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
  312. package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
  313. package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
  314. package/packages/src/interfaces/ui/terminal/shared/index.ts +71 -0
  315. package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
  316. package/packages/src/interfaces/ui/terminal/shared/query.ts +146 -0
  317. package/packages/src/interfaces/ui/terminal/shared/setup.ts +295 -0
  318. package/packages/src/interfaces/ui/terminal/shared/status-line.ts +358 -0
  319. package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
  320. package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +262 -0
  321. package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +232 -0
  322. package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +62 -0
  323. package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +537 -0
  324. package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +107 -0
  325. package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +240 -0
  326. package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +54 -0
  327. package/packages/src/interfaces/ui/terminal/tui/commands.ts +438 -0
  328. package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +584 -0
  329. package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +614 -0
  330. package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +333 -0
  331. package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +604 -0
  332. package/packages/src/interfaces/ui/terminal/tui/components/index.ts +118 -0
  333. package/packages/src/interfaces/ui/terminal/tui/console.ts +49 -0
  334. package/packages/src/interfaces/ui/terminal/tui/index.ts +90 -0
  335. package/packages/src/interfaces/ui/terminal/tui/run.tsx +42 -0
  336. package/packages/src/interfaces/ui/terminal/tui/spinner.ts +69 -0
  337. package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +390 -0
  338. package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +422 -0
  339. package/packages/src/interfaces/ui/terminal/tui/types.ts +186 -0
  340. package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +104 -0
  341. package/packages/src/interfaces/ui/terminal/tui/useNativeInput.ts +239 -0
  342. package/packages/src/lmdb.db +0 -0
  343. package/packages/src/lmdb.db-lock +0 -0
  344. package/packages/src/native/index.ts +2345 -0
  345. package/packages/src/teammates/index.ts +982 -0
  346. package/packages/src/types/index.ts +722 -0
  347. package/dist/cli.js +0 -148
  348. package/dist/index-0pkak453.js +0 -136
  349. package/dist/index-0qd0x8b4.js +0 -110
  350. package/dist/index-0x3kprq6.js +0 -240
  351. package/dist/index-1eawy937.js +0 -308
  352. package/dist/index-24m2aygy.js +0 -240
  353. package/dist/index-29xcjnne.js +0 -280
  354. package/dist/index-2avyytn5.js +0 -349
  355. package/dist/index-4ms367ey.js +0 -136
  356. package/dist/index-4w2t3b0m.js +0 -240
  357. package/dist/index-4xfgd8nz.js +0 -261
  358. package/dist/index-5acjp9gc.js +0 -157
  359. package/dist/index-5s15hr56.js +0 -136
  360. package/dist/index-6e4wf341.js +0 -349
  361. package/dist/index-6fvnkedw.js +0 -240
  362. package/dist/index-6rqpmd4g.js +0 -128
  363. package/dist/index-77ckwnbm.js +0 -280
  364. package/dist/index-9knxy49k.js +0 -128
  365. package/dist/index-9zrnw4zx.js +0 -128
  366. package/dist/index-bk21w99v.js +0 -280
  367. package/dist/index-c41n76fv.js +0 -240
  368. package/dist/index-cb4ppjdt.js +0 -255
  369. package/dist/index-cfb2edt6.js +0 -240
  370. package/dist/index-cmfa38hh.js +0 -308
  371. package/dist/index-datjz8q1.js +0 -257
  372. package/dist/index-eadf4wvn.js +0 -240
  373. package/dist/index-em5k0m3z.js +0 -345
  374. package/dist/index-gh8r333a.js +0 -110
  375. package/dist/index-gkx6k2tr.js +0 -261
  376. package/dist/index-h5cabfks.js +0 -155
  377. package/dist/index-hcrpwyy3.js +0 -261
  378. package/dist/index-hk7fwwa8.js +0 -257
  379. package/dist/index-jb8cw7f8.js +0 -136
  380. package/dist/index-kbyw4th1.js +0 -347
  381. package/dist/index-kgj5gqnm.js +0 -345
  382. package/dist/index-mdf6xp1z.js +0 -255
  383. package/dist/index-mrhv8kvc.js +0 -280
  384. package/dist/index-mt4743dd.js +0 -161
  385. package/dist/index-qnwsg97q.js +0 -240
  386. package/dist/index-qwdy6x44.js +0 -261
  387. package/dist/index-rmj77261.js +0 -157
  388. package/dist/index-sbbw1a61.js +0 -349
  389. package/dist/index-svy5bcpn.js +0 -345
  390. package/dist/index-tvmy7tm9.js +0 -261
  391. package/dist/index-tzz4vzkj.js +0 -312
  392. package/dist/index-vz80zmhe.js +0 -110
  393. package/dist/index-wed2fk67.js +0 -240
  394. package/dist/index-wksgzz8e.js +0 -280
  395. package/dist/index-wn2m4wma.js +0 -240
  396. package/dist/index-xha05vjc.js +0 -257
  397. package/dist/index-yc6eh8p8.js +0 -136
  398. package/dist/index-ycjxx9ft.js +0 -240
  399. package/dist/index-z0gzd0fc.js +0 -110
  400. package/dist/index-z8cwtf8j.js +0 -240
  401. package/dist/index-zy5mtt00.js +0 -128
@@ -0,0 +1,115 @@
1
+ /** @jsx React.createElement */
2
+ /**
3
+ * Interactive Elements for TUI
4
+ *
5
+ * Components:
6
+ * - Toast: Notification messages that auto-dismiss
7
+ * - Modal: Dialog overlay for confirmations
8
+ * - SelectableList: Keyboard-navigable list with selection
9
+ * - Link: Clickable OSC 8 hyperlinks
10
+ *
11
+ * NOTE: All components use InputContext for keyboard input.
12
+ * Do NOT use process.stdin directly - it conflicts with the main input loop.
13
+ */
14
+ import React from "react";
15
+ export type ToastType = "info" | "success" | "warning" | "error";
16
+ export interface ToastMessage {
17
+ id: string;
18
+ type: ToastType;
19
+ message: string;
20
+ duration?: number;
21
+ timestamp: number;
22
+ }
23
+ export interface ToastProps {
24
+ toasts: ToastMessage[];
25
+ position?: "top" | "bottom";
26
+ maxVisible?: number;
27
+ onDismiss?: (id: string) => void;
28
+ }
29
+ export declare function Toast({ toasts, position, maxVisible, onDismiss }: ToastProps): React.JSX.Element | null;
30
+ export interface ToastManager {
31
+ toasts: ToastMessage[];
32
+ showToast: (type: ToastType, message: string, duration?: number) => string;
33
+ dismissToast: (id: string) => void;
34
+ clearAllToasts: () => void;
35
+ }
36
+ export declare function useToast(defaultDuration?: number): ToastManager;
37
+ export interface ModalAction {
38
+ id: string;
39
+ label: string;
40
+ style?: "primary" | "secondary" | "danger";
41
+ onActivate?: () => void | Promise<void>;
42
+ }
43
+ export interface ModalProps {
44
+ isOpen: boolean;
45
+ title?: string;
46
+ message: string;
47
+ actions: ModalAction[];
48
+ defaultAction?: string;
49
+ onDismiss?: () => void;
50
+ width?: number;
51
+ }
52
+ export declare function Modal({ isOpen, title, message, actions, defaultAction, onDismiss, width, }: ModalProps): React.JSX.Element | null;
53
+ export interface ConfirmModalProps {
54
+ isOpen: boolean;
55
+ title?: string;
56
+ message: string;
57
+ onConfirm: () => void | Promise<void>;
58
+ onCancel: () => void;
59
+ confirmLabel?: string;
60
+ cancelLabel?: string;
61
+ }
62
+ export declare function ConfirmModal({ isOpen, title, message, onConfirm, onCancel, confirmLabel, cancelLabel, }: ConfirmModalProps): React.JSX.Element;
63
+ export interface SelectableItem {
64
+ id: string;
65
+ label: string;
66
+ description?: string;
67
+ icon?: string;
68
+ metadata?: Record<string, unknown>;
69
+ }
70
+ export interface SelectableListProps {
71
+ items: SelectableItem[];
72
+ selectedIndex?: number;
73
+ onSelect?: (item: SelectableItem, index: number) => void;
74
+ onActivate?: (item: SelectableItem, index: number) => void;
75
+ showIndices?: boolean;
76
+ showDescriptions?: boolean;
77
+ maxHeight?: number;
78
+ emptyMessage?: string;
79
+ /** Whether this list is focused (receives input) */
80
+ isFocused?: boolean;
81
+ /** Unique ID for input handling */
82
+ inputId?: string;
83
+ }
84
+ export declare function SelectableList({ items, selectedIndex, onSelect, onActivate, showIndices, showDescriptions, maxHeight, emptyMessage, isFocused, inputId, }: SelectableListProps): React.JSX.Element;
85
+ export interface LinkProps {
86
+ url: string;
87
+ text?: string;
88
+ fallback?: string;
89
+ }
90
+ /**
91
+ * Create an OSC 8 hyperlink
92
+ * OSC 8 format: ESC ] 8 ;; <url> BEL <text> ESC ] 8 ;; BEL
93
+ */
94
+ export declare function createOsc8Link(url: string, text: string): string;
95
+ export declare function Link({ url, text, fallback }: LinkProps): React.JSX.Element;
96
+ interface InteractiveContextValue {
97
+ toast: ToastManager;
98
+ }
99
+ export declare function InteractiveProvider({ children }: {
100
+ children: React.ReactNode;
101
+ }): React.JSX.Element;
102
+ export declare function useInteractive(): InteractiveContextValue;
103
+ declare const _default: {
104
+ Toast: typeof Toast;
105
+ useToast: typeof useToast;
106
+ Modal: typeof Modal;
107
+ ConfirmModal: typeof ConfirmModal;
108
+ SelectableList: typeof SelectableList;
109
+ Link: typeof Link;
110
+ createOsc8Link: typeof createOsc8Link;
111
+ InteractiveProvider: typeof InteractiveProvider;
112
+ useInteractive: typeof useInteractive;
113
+ };
114
+ export default _default;
115
+ //# sourceMappingURL=InteractiveElements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractiveElements.d.ts","sourceRoot":"","sources":["../../../../../../packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;;;;;;;;;;GAWG;AAEH,OAAO,KAA8E,MAAM,OAAO,CAAC;AAQnG,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAgBD,wBAAgB,KAAK,CAAC,EAAE,MAAM,EAAE,QAAgB,EAAE,UAAc,EAAE,SAAS,EAAE,EAAE,UAAU,4BA2BxF;AAGD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3E,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,wBAAgB,QAAQ,CAAC,eAAe,SAAO,GAAG,YAAY,CAmD7D;AAMD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,wBAAgB,KAAK,CAAC,EACpB,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,aAAa,EACb,SAAS,EACT,KAAU,GACX,EAAE,UAAU,4BAoHZ;AAGD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,KAAiB,EACjB,OAAO,EACP,SAAS,EACT,QAAQ,EACR,YAAwB,EACxB,WAAsB,GACvB,EAAE,iBAAiB,qBAwBnB;AAMD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,aAAiB,EACjB,QAAQ,EACR,UAAU,EACV,WAAkB,EAClB,gBAAuB,EACvB,SAAc,EACd,YAAyB,EACzB,SAAgB,EAChB,OAA2B,GAC5B,EAAE,mBAAmB,qBAgHrB;AAMD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,qBA2BtD;AAMD,UAAU,uBAAuB;IAC/B,KAAK,EAAE,YAAY,CAAC;CACrB;AAID,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAQ9E;AAED,wBAAgB,cAAc,IAAI,uBAAuB,CAMxD;;;;;;;;;;;;AAMD,wBAUE"}
@@ -0,0 +1,306 @@
1
+ /** @jsx React.createElement */
2
+ /**
3
+ * Interactive Elements for TUI
4
+ *
5
+ * Components:
6
+ * - Toast: Notification messages that auto-dismiss
7
+ * - Modal: Dialog overlay for confirmations
8
+ * - SelectableList: Keyboard-navigable list with selection
9
+ * - Link: Clickable OSC 8 hyperlinks
10
+ *
11
+ * NOTE: All components use InputContext for keyboard input.
12
+ * Do NOT use process.stdin directly - it conflicts with the main input loop.
13
+ */
14
+ import React, { useState, useEffect, useCallback, useRef, createContext, useContext } from "react";
15
+ import { Box, Text, useStdout } from "ink";
16
+ import { useInputHandler, InputPriority } from "../InputContext.js";
17
+ const TOAST_ICONS = {
18
+ info: "i",
19
+ success: "+",
20
+ warning: "!",
21
+ error: "x",
22
+ };
23
+ const TOAST_COLORS = {
24
+ info: "blue",
25
+ success: "green",
26
+ warning: "yellow",
27
+ error: "red",
28
+ };
29
+ export function Toast({ toasts, position = "top", maxVisible = 3, onDismiss }) {
30
+ const visibleToasts = toasts.slice(0, maxVisible);
31
+ if (visibleToasts.length === 0)
32
+ return null;
33
+ return (React.createElement(Box, { flexDirection: "column", width: "100%", paddingX: 1 }, visibleToasts.map((toast) => (React.createElement(Box, { key: toast.id, borderStyle: "round", borderColor: TOAST_COLORS[toast.type], paddingX: 1, marginBottom: 1 },
34
+ React.createElement(Text, { color: TOAST_COLORS[toast.type], bold: true },
35
+ "[",
36
+ TOAST_ICONS[toast.type],
37
+ "]"),
38
+ React.createElement(Text, null,
39
+ " ",
40
+ toast.message))))));
41
+ }
42
+ export function useToast(defaultDuration = 5000) {
43
+ const [toasts, setToasts] = useState([]);
44
+ const timersRef = useRef(new Map());
45
+ const showToast = useCallback((type, message, duration = defaultDuration) => {
46
+ const id = `toast-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
47
+ const toast = {
48
+ id,
49
+ type,
50
+ message,
51
+ duration,
52
+ timestamp: Date.now(),
53
+ };
54
+ setToasts((prev) => [...prev, toast]);
55
+ // Auto-dismiss
56
+ if (duration > 0) {
57
+ const timer = setTimeout(() => {
58
+ setToasts((prev) => prev.filter((t) => t.id !== id));
59
+ timersRef.current.delete(id);
60
+ }, duration);
61
+ timersRef.current.set(id, timer);
62
+ }
63
+ return id;
64
+ }, [defaultDuration]);
65
+ const dismissToast = useCallback((id) => {
66
+ const timer = timersRef.current.get(id);
67
+ if (timer) {
68
+ clearTimeout(timer);
69
+ timersRef.current.delete(id);
70
+ }
71
+ setToasts((prev) => prev.filter((t) => t.id !== id));
72
+ }, []);
73
+ const clearAllToasts = useCallback(() => {
74
+ timersRef.current.forEach((timer) => clearTimeout(timer));
75
+ timersRef.current.clear();
76
+ setToasts([]);
77
+ }, []);
78
+ // Cleanup on unmount
79
+ useEffect(() => {
80
+ return () => {
81
+ timersRef.current.forEach((timer) => clearTimeout(timer));
82
+ };
83
+ }, []);
84
+ return { toasts, showToast, dismissToast, clearAllToasts };
85
+ }
86
+ const ACTION_COLORS = {
87
+ primary: "cyan",
88
+ secondary: "gray",
89
+ danger: "red",
90
+ };
91
+ export function Modal({ isOpen, title, message, actions, defaultAction, onDismiss, width = 60, }) {
92
+ const [selectedIndex, setSelectedIndex] = useState(0);
93
+ const { stdout } = useStdout();
94
+ useEffect(() => {
95
+ // Reset selection when modal opens
96
+ if (isOpen) {
97
+ const defaultIndex = defaultAction
98
+ ? actions.findIndex((a) => a.id === defaultAction)
99
+ : 0;
100
+ setSelectedIndex(defaultIndex >= 0 ? defaultIndex : 0);
101
+ }
102
+ }, [isOpen, defaultAction, actions]);
103
+ // Handle keyboard input via centralized InputContext
104
+ const handleKey = useCallback((event) => {
105
+ if (!isOpen)
106
+ return false;
107
+ // Escape or q to dismiss
108
+ if ((event.code === "escape" && event.kind === "press") ||
109
+ (event.code === "q" && !event.ctrl && event.kind === "press")) {
110
+ onDismiss?.();
111
+ return true;
112
+ }
113
+ // Enter to select
114
+ if (event.code === "enter" && event.kind === "press") {
115
+ const action = actions[selectedIndex];
116
+ if (action?.onActivate) {
117
+ action.onActivate();
118
+ }
119
+ return true;
120
+ }
121
+ // Left arrow or h
122
+ if ((event.code === "left" && event.kind === "press") ||
123
+ (event.code === "h" && !event.ctrl && event.kind === "press")) {
124
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
125
+ return true;
126
+ }
127
+ // Right arrow or l
128
+ if ((event.code === "right" && event.kind === "press") ||
129
+ (event.code === "l" && !event.ctrl && event.kind === "press")) {
130
+ setSelectedIndex((prev) => Math.min(actions.length - 1, prev + 1));
131
+ return true;
132
+ }
133
+ return false;
134
+ }, [isOpen, actions, selectedIndex, onDismiss]);
135
+ // Register with input system - modals have high priority
136
+ useInputHandler("modal", handleKey, {
137
+ priority: InputPriority.MODAL,
138
+ isActive: isOpen,
139
+ });
140
+ if (!isOpen)
141
+ return null;
142
+ const modalWidth = Math.min(width, stdout.columns || 80);
143
+ return (React.createElement(Box, { flexDirection: "column", borderStyle: "double", borderColor: "cyan", width: modalWidth, paddingX: 2, paddingY: 1 },
144
+ title && (React.createElement(Box, null,
145
+ React.createElement(Text, { bold: true, color: "cyan" }, title))),
146
+ React.createElement(Box, { marginBottom: 1 },
147
+ React.createElement(Text, null, message)),
148
+ React.createElement(Box, { justifyContent: "center" }, actions.map((action, index) => {
149
+ const isSelected = index === selectedIndex;
150
+ const color = ACTION_COLORS[action.style || "secondary"];
151
+ return (React.createElement(Box, { key: action.id, borderStyle: isSelected ? "single" : undefined, borderColor: isSelected ? color : undefined, paddingX: 1, marginRight: 1 },
152
+ React.createElement(Text, { color: color, bold: isSelected, inverse: isSelected }, action.label)));
153
+ })),
154
+ React.createElement(Box, { marginTop: 1 },
155
+ React.createElement(Text, { dimColor: true },
156
+ "<-",
157
+ "/",
158
+ "->",
159
+ " or h/l to select | Enter to confirm | Esc to cancel"))));
160
+ }
161
+ export function ConfirmModal({ isOpen, title = "Confirm", message, onConfirm, onCancel, confirmLabel = "Confirm", cancelLabel = "Cancel", }) {
162
+ return (React.createElement(Modal, { isOpen: isOpen, title: title, message: message, actions: [
163
+ {
164
+ id: "cancel",
165
+ label: cancelLabel,
166
+ style: "secondary",
167
+ onActivate: onCancel,
168
+ },
169
+ {
170
+ id: "confirm",
171
+ label: confirmLabel,
172
+ style: "primary",
173
+ onActivate: onConfirm,
174
+ },
175
+ ], defaultAction: "confirm", onDismiss: onCancel }));
176
+ }
177
+ export function SelectableList({ items, selectedIndex = 0, onSelect, onActivate, showIndices = true, showDescriptions = true, maxHeight = 10, emptyMessage = "No items", isFocused = true, inputId = "selectable-list", }) {
178
+ const [internalIndex, setInternalIndex] = useState(selectedIndex);
179
+ useEffect(() => {
180
+ setInternalIndex(selectedIndex);
181
+ }, [selectedIndex]);
182
+ // Handle keyboard input via centralized InputContext
183
+ const handleKey = useCallback((event) => {
184
+ if (!isFocused || items.length === 0)
185
+ return false;
186
+ // Up arrow or k
187
+ if ((event.code === "up" && event.kind === "press") ||
188
+ (event.code === "k" && !event.ctrl && event.kind === "press")) {
189
+ const newIndex = Math.max(0, internalIndex - 1);
190
+ setInternalIndex(newIndex);
191
+ const item = items[newIndex];
192
+ if (item)
193
+ onSelect?.(item, newIndex);
194
+ return true;
195
+ }
196
+ // Down arrow or j
197
+ if ((event.code === "down" && event.kind === "press") ||
198
+ (event.code === "j" && !event.ctrl && event.kind === "press")) {
199
+ const newIndex = Math.min(items.length - 1, internalIndex + 1);
200
+ setInternalIndex(newIndex);
201
+ const item = items[newIndex];
202
+ if (item)
203
+ onSelect?.(item, newIndex);
204
+ return true;
205
+ }
206
+ // Enter or l to activate
207
+ if ((event.code === "enter" && event.kind === "press") ||
208
+ (event.code === "l" && !event.ctrl && event.kind === "press")) {
209
+ const item = items[internalIndex];
210
+ if (item) {
211
+ onActivate?.(item, internalIndex);
212
+ }
213
+ return true;
214
+ }
215
+ return false;
216
+ }, [isFocused, items, internalIndex, onSelect, onActivate]);
217
+ // Register with input system
218
+ useInputHandler(inputId, handleKey, {
219
+ priority: InputPriority.LIST,
220
+ isActive: isFocused && items.length > 0,
221
+ });
222
+ if (items.length === 0) {
223
+ return (React.createElement(Box, null,
224
+ React.createElement(Text, { dimColor: true }, emptyMessage)));
225
+ }
226
+ const visibleItems = items.slice(0, maxHeight);
227
+ return (React.createElement(Box, { flexDirection: "column" },
228
+ visibleItems.map((item, index) => {
229
+ const isSelected = index === internalIndex;
230
+ const prefix = showIndices
231
+ ? `${String(index + 1).padStart(2, " ")}. `
232
+ : "";
233
+ return (React.createElement(Box, { key: item.id, flexDirection: "column", marginBottom: 1 },
234
+ React.createElement(Box, null,
235
+ isSelected && (React.createElement(Text, { color: "cyan", bold: true },
236
+ "->",
237
+ " ")),
238
+ !isSelected && React.createElement(Text, null, " "),
239
+ React.createElement(Text, { dimColor: true }, prefix),
240
+ item.icon && React.createElement(Text, null,
241
+ " ",
242
+ item.icon,
243
+ " "),
244
+ React.createElement(Text, { color: isSelected ? "cyan" : "white", bold: isSelected }, item.label)),
245
+ showDescriptions && item.description && (React.createElement(Box, { marginLeft: 4 },
246
+ React.createElement(Text, { dimColor: true }, item.description)))));
247
+ }),
248
+ items.length > maxHeight && (React.createElement(Box, null,
249
+ React.createElement(Text, { dimColor: true },
250
+ "... and ",
251
+ items.length - maxHeight,
252
+ " more (j to scroll)"))),
253
+ React.createElement(Box, { marginTop: 1 },
254
+ React.createElement(Text, { dimColor: true }, "up/down or j/k to navigate | Enter or l to select"))));
255
+ }
256
+ /**
257
+ * Create an OSC 8 hyperlink
258
+ * OSC 8 format: ESC ] 8 ;; <url> BEL <text> ESC ] 8 ;; BEL
259
+ */
260
+ export function createOsc8Link(url, text) {
261
+ // OSC 8 hyperlink format: \x1b]8;;URL\x07TEXT\x1b]8;;\x07
262
+ return `\x1b]8;;${url}\x07${text}\x1b]8;;\x07`;
263
+ }
264
+ export function Link({ url, text, fallback }) {
265
+ const displayText = text || url;
266
+ const fallbackText = fallback || displayText;
267
+ // Check if terminal likely supports OSC 8
268
+ // Most modern terminals do, but we provide fallback
269
+ const supportsOsc8 = process.env.TERM_PROGRAM === "iTerm.app" ||
270
+ process.env.TERM_PROGRAM === "Terminal.app" ||
271
+ process.env.TERM?.includes("xterm") ||
272
+ process.env.WT_SESSION_ID !== undefined; // Windows Terminal
273
+ if (supportsOsc8) {
274
+ // Render with OSC 8 hyperlink
275
+ // Note: Ink may escape this, so we use the raw text
276
+ return (React.createElement(Text, { color: "blue" }, createOsc8Link(url, displayText)));
277
+ }
278
+ // Fallback for terminals without OSC 8 support
279
+ return (React.createElement(Text, { color: "blue", underline: true }, fallbackText));
280
+ }
281
+ const InteractiveContext = createContext(null);
282
+ export function InteractiveProvider({ children }) {
283
+ const toast = useToast();
284
+ return (React.createElement(InteractiveContext.Provider, { value: { toast } }, children));
285
+ }
286
+ export function useInteractive() {
287
+ const context = useContext(InteractiveContext);
288
+ if (!context) {
289
+ throw new Error("useInteractive must be used within InteractiveProvider");
290
+ }
291
+ return context;
292
+ }
293
+ // ============================================
294
+ // EXPORTS
295
+ // ============================================
296
+ export default {
297
+ Toast,
298
+ useToast,
299
+ Modal,
300
+ ConfirmModal,
301
+ SelectableList,
302
+ Link,
303
+ createOsc8Link,
304
+ InteractiveProvider,
305
+ useInteractive,
306
+ };
@@ -0,0 +1,92 @@
1
+ /** @jsx React.createElement */
2
+ /**
3
+ * Multiline Input Component
4
+ * Enhanced text input with:
5
+ * - Multi-line support (Ctrl+Enter for newline)
6
+ * - Command autocomplete
7
+ * - Input history navigation
8
+ * - Syntax highlighting for input
9
+ */
10
+ import React from "react";
11
+ export interface AutocompleteSuggestion {
12
+ id: string;
13
+ label: string;
14
+ description?: string;
15
+ category?: string;
16
+ }
17
+ export interface MultilineInputProps {
18
+ /** Current input value */
19
+ value: string;
20
+ /** Cursor position (0 = start) */
21
+ cursorPos: number;
22
+ /** Current line for multiline (0-based) */
23
+ currentLine?: number;
24
+ /** Placeholder text */
25
+ placeholder?: string;
26
+ /** Whether input is active */
27
+ isActive?: boolean;
28
+ /** Whether to show autocomplete */
29
+ showAutocomplete?: boolean;
30
+ /** Autocomplete suggestions */
31
+ autocompleteSuggestions?: AutocompleteSuggestion[];
32
+ /** Selected autocomplete index */
33
+ autocompleteIndex?: number;
34
+ /** Input history for navigation */
35
+ inputHistory?: string[];
36
+ /** History index (-1 = none) */
37
+ historyIndex?: number;
38
+ /** Called when input changes */
39
+ onChange?: (value: string, cursorPos: number, currentLine: number) => void;
40
+ /** Called when submit (Enter on single line, Ctrl+Enter on multiline) */
41
+ onSubmit?: (value: string) => void;
42
+ /** Called when requesting autocomplete */
43
+ onRequestAutocomplete?: (prefix: string) => AutocompleteSuggestion[];
44
+ /** Max lines before scrolling */
45
+ maxLines?: number;
46
+ /** Show line numbers */
47
+ showLineNumbers?: boolean;
48
+ /** Width override */
49
+ width?: number;
50
+ }
51
+ export interface MultilineInputState {
52
+ value: string;
53
+ cursorPos: number;
54
+ currentLine: number;
55
+ historyIndex: number;
56
+ savedInput: string;
57
+ showAutocomplete: boolean;
58
+ autocompleteSuggestions: AutocompleteSuggestion[];
59
+ autocompleteIndex: number;
60
+ }
61
+ export interface UseMultilineInputOptions {
62
+ isActive?: boolean;
63
+ onSubmit?: (value: string) => void;
64
+ onRequestAutocomplete?: (prefix: string) => AutocompleteSuggestion[];
65
+ inputHistory?: string[];
66
+ initialHistory?: string[];
67
+ }
68
+ /**
69
+ * Filter autocomplete suggestions based on prefix
70
+ */
71
+ export declare function filterSuggestions(prefix: string): AutocompleteSuggestion[];
72
+ /**
73
+ * Syntax highlight code block
74
+ * Returns highlighted segments for display
75
+ */
76
+ export declare function highlightSyntax(text: string): Array<{
77
+ text: string;
78
+ color: string;
79
+ }>;
80
+ export declare function MultilineInput({ value, cursorPos, currentLine, placeholder, isActive, showAutocomplete, autocompleteSuggestions, autocompleteIndex, inputHistory, historyIndex, onChange, onSubmit, maxLines, showLineNumbers, width: propWidth, }: MultilineInputProps): React.JSX.Element;
81
+ export declare function useMultilineInputHandler({ isActive, onSubmit, onRequestAutocomplete, inputHistory, }: UseMultilineInputOptions): {
82
+ state: MultilineInputState;
83
+ handleKeyEvent: (event: {
84
+ code: string;
85
+ ctrl?: boolean;
86
+ shift?: boolean;
87
+ }) => "unhandled" | "handled";
88
+ setValue: (value: string) => void;
89
+ reset: () => void;
90
+ };
91
+ export default MultilineInput;
92
+ //# sourceMappingURL=MultilineInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultilineInput.d.ts","sourceRoot":"","sources":["../../../../../../packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx"],"names":[],"mappings":"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"}