@ebowwa/coder 0.7.63 → 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 (341) hide show
  1. package/dist/core/__tests__/permissions.test.d.ts +12 -0
  2. package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
  3. package/dist/core/__tests__/permissions.test.js +851 -0
  4. package/dist/core/agent-loop/__tests__/compaction.test.d.ts +5 -0
  5. package/dist/core/agent-loop/__tests__/compaction.test.d.ts.map +1 -0
  6. package/dist/core/agent-loop/__tests__/compaction.test.js +209 -0
  7. package/dist/core/agent-loop/__tests__/formatters.test.d.ts +5 -0
  8. package/dist/core/agent-loop/__tests__/formatters.test.d.ts.map +1 -0
  9. package/dist/core/agent-loop/__tests__/formatters.test.js +195 -0
  10. package/dist/core/agent-loop/__tests__/index.test.d.ts +5 -0
  11. package/dist/core/agent-loop/__tests__/index.test.d.ts.map +1 -0
  12. package/dist/core/agent-loop/__tests__/index.test.js +121 -0
  13. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts +5 -0
  14. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts.map +1 -0
  15. package/dist/core/agent-loop/__tests__/loop-state.test.js +340 -0
  16. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts +5 -0
  17. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts.map +1 -0
  18. package/dist/core/agent-loop/__tests__/message-builder.test.js +178 -0
  19. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts +5 -0
  20. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts.map +1 -0
  21. package/dist/core/agent-loop/__tests__/tool-executor.test.js +331 -0
  22. package/dist/core/agent-loop/compaction.d.ts +39 -0
  23. package/dist/core/agent-loop/compaction.d.ts.map +1 -0
  24. package/dist/core/agent-loop/compaction.js +51 -0
  25. package/dist/core/agent-loop/formatters.d.ts +21 -0
  26. package/dist/core/agent-loop/formatters.d.ts.map +1 -0
  27. package/dist/core/agent-loop/formatters.js +42 -0
  28. package/dist/core/agent-loop/index.d.ts +25 -0
  29. package/dist/core/agent-loop/index.d.ts.map +1 -0
  30. package/dist/core/agent-loop/index.js +83 -0
  31. package/dist/core/agent-loop/loop-state.d.ts +74 -0
  32. package/dist/core/agent-loop/loop-state.d.ts.map +1 -0
  33. package/dist/core/agent-loop/loop-state.js +147 -0
  34. package/dist/core/agent-loop/message-builder.d.ts +13 -0
  35. package/dist/core/agent-loop/message-builder.d.ts.map +1 -0
  36. package/dist/core/agent-loop/message-builder.js +49 -0
  37. package/dist/core/agent-loop/tool-executor.d.ts +23 -0
  38. package/dist/core/agent-loop/tool-executor.d.ts.map +1 -0
  39. package/dist/core/agent-loop/tool-executor.js +152 -0
  40. package/dist/core/agent-loop/turn-executor.d.ts +57 -0
  41. package/dist/core/agent-loop/turn-executor.d.ts.map +1 -0
  42. package/dist/core/agent-loop/turn-executor.js +124 -0
  43. package/dist/core/agent-loop/types.d.ts +141 -0
  44. package/dist/core/agent-loop/types.d.ts.map +1 -0
  45. package/dist/core/agent-loop/types.js +4 -0
  46. package/dist/core/agent-loop.d.ts +17 -0
  47. package/dist/core/agent-loop.d.ts.map +1 -0
  48. package/dist/core/agent-loop.js +16 -0
  49. package/dist/core/api-client-impl.d.ts +62 -0
  50. package/dist/core/api-client-impl.d.ts.map +1 -0
  51. package/dist/core/api-client-impl.js +479 -0
  52. package/dist/core/api-client.d.ts +6 -0
  53. package/dist/core/api-client.d.ts.map +1 -0
  54. package/dist/core/api-client.js +5 -0
  55. package/dist/core/checkpoints.d.ts +128 -0
  56. package/dist/core/checkpoints.d.ts.map +1 -0
  57. package/dist/core/checkpoints.js +438 -0
  58. package/dist/core/claude-md.d.ts +71 -0
  59. package/dist/core/claude-md.d.ts.map +1 -0
  60. package/dist/core/claude-md.js +198 -0
  61. package/dist/core/cognitive-security/hooks.d.ts +138 -0
  62. package/dist/core/cognitive-security/hooks.d.ts.map +1 -0
  63. package/dist/core/cognitive-security/hooks.js +389 -0
  64. package/dist/core/cognitive-security/index.d.ts +751 -0
  65. package/dist/core/cognitive-security/index.d.ts.map +1 -0
  66. package/dist/core/cognitive-security/index.js +1123 -0
  67. package/dist/core/cognitive-security/middleware.d.ts +136 -0
  68. package/dist/core/cognitive-security/middleware.d.ts.map +1 -0
  69. package/dist/core/cognitive-security/middleware.js +376 -0
  70. package/dist/core/config-loader.d.ts +127 -0
  71. package/dist/core/config-loader.d.ts.map +1 -0
  72. package/dist/core/config-loader.js +219 -0
  73. package/dist/core/context-compaction.d.ts +87 -0
  74. package/dist/core/context-compaction.d.ts.map +1 -0
  75. package/dist/core/context-compaction.js +428 -0
  76. package/dist/core/git-status.d.ts +25 -0
  77. package/dist/core/git-status.d.ts.map +1 -0
  78. package/dist/core/git-status.js +204 -0
  79. package/dist/core/image.d.ts +69 -0
  80. package/dist/core/image.d.ts.map +1 -0
  81. package/dist/core/image.js +290 -0
  82. package/dist/core/image.test.d.ts +2 -0
  83. package/dist/core/image.test.d.ts.map +1 -0
  84. package/dist/core/image.test.js +149 -0
  85. package/dist/core/models.d.ts +123 -0
  86. package/dist/core/models.d.ts.map +1 -0
  87. package/dist/core/models.js +325 -0
  88. package/dist/core/permissions.d.ts +81 -0
  89. package/dist/core/permissions.d.ts.map +1 -0
  90. package/dist/core/permissions.js +327 -0
  91. package/dist/core/retry.d.ts +25 -0
  92. package/dist/core/retry.d.ts.map +1 -0
  93. package/dist/core/retry.js +121 -0
  94. package/dist/core/session-store.d.ts +9 -0
  95. package/dist/core/session-store.d.ts.map +1 -0
  96. package/dist/core/session-store.js +10 -0
  97. package/dist/core/sessions/export.d.ts +47 -0
  98. package/dist/core/sessions/export.d.ts.map +1 -0
  99. package/dist/core/sessions/export.js +256 -0
  100. package/dist/core/sessions/index.d.ts +132 -0
  101. package/dist/core/sessions/index.d.ts.map +1 -0
  102. package/dist/core/sessions/index.js +442 -0
  103. package/dist/core/sessions/metadata.d.ts +77 -0
  104. package/dist/core/sessions/metadata.d.ts.map +1 -0
  105. package/dist/core/sessions/metadata.js +233 -0
  106. package/dist/core/sessions/persistence.d.ts +72 -0
  107. package/dist/core/sessions/persistence.d.ts.map +1 -0
  108. package/dist/core/sessions/persistence.js +201 -0
  109. package/dist/core/sessions/types.d.ts +110 -0
  110. package/dist/core/sessions/types.d.ts.map +1 -0
  111. package/dist/core/sessions/types.js +4 -0
  112. package/dist/core/stream-highlighter.d.ts +18 -0
  113. package/dist/core/stream-highlighter.d.ts.map +1 -0
  114. package/dist/core/stream-highlighter.js +916 -0
  115. package/dist/core/system-reminders.d.ts +89 -0
  116. package/dist/core/system-reminders.d.ts.map +1 -0
  117. package/dist/core/system-reminders.js +285 -0
  118. package/dist/ecosystem/hooks/__tests__/index.test.d.ts +5 -0
  119. package/dist/ecosystem/hooks/__tests__/index.test.d.ts.map +1 -0
  120. package/dist/ecosystem/hooks/__tests__/index.test.js +458 -0
  121. package/dist/ecosystem/hooks/index.d.ts +59 -0
  122. package/dist/ecosystem/hooks/index.d.ts.map +1 -0
  123. package/dist/ecosystem/hooks/index.js +294 -0
  124. package/dist/ecosystem/hooks/prompt-evaluator.d.ts +32 -0
  125. package/dist/ecosystem/hooks/prompt-evaluator.d.ts.map +1 -0
  126. package/dist/ecosystem/hooks/prompt-evaluator.js +229 -0
  127. package/dist/ecosystem/skills/index.d.ts +55 -0
  128. package/dist/ecosystem/skills/index.d.ts.map +1 -0
  129. package/dist/ecosystem/skills/index.js +258 -0
  130. package/dist/ecosystem/tools/__tests__/index.test.d.ts +7 -0
  131. package/dist/ecosystem/tools/__tests__/index.test.d.ts.map +1 -0
  132. package/dist/ecosystem/tools/__tests__/index.test.js +856 -0
  133. package/dist/ecosystem/tools/index.d.ts +24 -0
  134. package/dist/ecosystem/tools/index.d.ts.map +1 -0
  135. package/dist/ecosystem/tools/index.js +1709 -0
  136. package/dist/index.d.ts +24 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +32 -52192
  139. package/dist/interfaces/mcp/client.d.ts +40 -0
  140. package/dist/interfaces/mcp/client.d.ts.map +1 -0
  141. package/dist/interfaces/mcp/client.js +309 -0
  142. package/dist/interfaces/ui/index.d.ts +36 -0
  143. package/dist/interfaces/ui/index.d.ts.map +1 -0
  144. package/dist/interfaces/ui/index.js +61 -0
  145. package/dist/interfaces/ui/spinner.d.ts +140 -0
  146. package/dist/interfaces/ui/spinner.d.ts.map +1 -0
  147. package/dist/interfaces/ui/spinner.js +342 -0
  148. package/dist/interfaces/ui/terminal/cli/index.d.ts +12 -0
  149. package/dist/interfaces/ui/terminal/cli/index.d.ts.map +1 -0
  150. package/dist/interfaces/ui/terminal/cli/index.js +159 -52768
  151. package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
  152. package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
  153. package/dist/interfaces/ui/terminal/shared/args.js +176 -0
  154. package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
  155. package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
  156. package/dist/interfaces/ui/terminal/shared/index.js +16 -0
  157. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
  158. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
  159. package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
  160. package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
  161. package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
  162. package/dist/interfaces/ui/terminal/shared/query.js +100 -0
  163. package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
  164. package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
  165. package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
  166. package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
  167. package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
  168. package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
  169. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
  170. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
  171. package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
  172. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
  173. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
  174. package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
  175. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
  176. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
  177. package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
  178. package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
  179. package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
  180. package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
  181. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
  182. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
  183. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
  184. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
  185. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
  186. package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
  187. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
  188. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
  189. package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
  190. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
  191. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
  192. package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
  193. package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
  194. package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
  195. package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
  196. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
  197. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
  198. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
  199. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
  200. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
  201. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
  202. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
  203. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
  204. package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
  205. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
  206. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
  207. package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
  208. package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
  209. package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
  210. package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
  211. package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
  212. package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
  213. package/dist/interfaces/ui/terminal/tui/console.js +46 -0
  214. package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
  215. package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
  216. package/dist/interfaces/ui/terminal/tui/index.js +28 -0
  217. package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
  218. package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
  219. package/dist/interfaces/ui/terminal/tui/run.js +31 -0
  220. package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
  221. package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
  222. package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
  223. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
  224. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
  225. package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
  226. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
  227. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
  228. package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
  229. package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
  230. package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
  231. package/dist/interfaces/ui/terminal/tui/types.js +5 -0
  232. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
  233. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
  234. package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
  235. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
  236. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
  237. package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
  238. package/dist/native/index.d.ts +480 -0
  239. package/dist/native/index.d.ts.map +1 -0
  240. package/dist/native/index.js +1625 -0
  241. package/dist/teammates/index.d.ts +161 -0
  242. package/dist/teammates/index.d.ts.map +1 -0
  243. package/dist/teammates/index.js +827 -0
  244. package/dist/types/index.d.ts +482 -0
  245. package/dist/types/index.d.ts.map +1 -0
  246. package/dist/types/index.js +52 -0
  247. package/package.json +4 -2
  248. package/packages/src/core/__tests__/permissions.test.ts +1091 -0
  249. package/packages/src/core/agent-loop/__tests__/compaction.test.ts +280 -0
  250. package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
  251. package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
  252. package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
  253. package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
  254. package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
  255. package/packages/src/core/agent-loop/compaction.ts +88 -0
  256. package/packages/src/core/agent-loop/formatters.ts +50 -0
  257. package/packages/src/core/agent-loop/index.ts +135 -0
  258. package/packages/src/core/agent-loop/loop-state.ts +187 -0
  259. package/packages/src/core/agent-loop/message-builder.ts +62 -0
  260. package/packages/src/core/agent-loop/tool-executor.ts +211 -0
  261. package/packages/src/core/agent-loop/turn-executor.ts +222 -0
  262. package/packages/src/core/agent-loop/types.ts +148 -0
  263. package/packages/src/core/agent-loop.ts +18 -0
  264. package/packages/src/core/api-client-impl.ts +619 -0
  265. package/packages/src/core/api-client.ts +6 -0
  266. package/packages/src/core/checkpoints.ts +606 -0
  267. package/packages/src/core/claude-md.ts +272 -0
  268. package/packages/src/core/cognitive-security/hooks.ts +590 -0
  269. package/packages/src/core/cognitive-security/index.ts +2041 -0
  270. package/packages/src/core/cognitive-security/middleware.ts +536 -0
  271. package/packages/src/core/config-loader.ts +324 -0
  272. package/packages/src/core/context-compaction.ts +578 -0
  273. package/packages/src/core/git-status.ts +262 -0
  274. package/packages/src/core/image.test.ts +180 -0
  275. package/packages/src/core/image.ts +350 -0
  276. package/packages/src/core/lmdb.db +0 -0
  277. package/packages/src/core/lmdb.db-lock +0 -0
  278. package/packages/src/core/models.ts +430 -0
  279. package/packages/src/core/normalizers/todo +4 -0
  280. package/packages/src/core/permissions.ts +431 -0
  281. package/packages/src/core/retry.ts +170 -0
  282. package/packages/src/core/session-store.ts +36 -0
  283. package/packages/src/core/sessions/export.ts +329 -0
  284. package/packages/src/core/sessions/index.ts +587 -0
  285. package/packages/src/core/sessions/metadata.ts +309 -0
  286. package/packages/src/core/sessions/persistence.ts +244 -0
  287. package/packages/src/core/sessions/types.ts +169 -0
  288. package/packages/src/core/stream-highlighter.ts +1123 -0
  289. package/packages/src/core/system-reminders.ts +402 -0
  290. package/packages/src/core/todo +8 -0
  291. package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
  292. package/packages/src/ecosystem/hooks/index.ts +341 -0
  293. package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
  294. package/packages/src/ecosystem/skills/index.ts +295 -0
  295. package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
  296. package/packages/src/ecosystem/tools/index.ts +1877 -0
  297. package/packages/src/index.ts +120 -0
  298. package/packages/src/interfaces/mcp/client.ts +389 -0
  299. package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
  300. package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
  301. package/packages/src/interfaces/ui/index.ts +161 -0
  302. package/packages/src/interfaces/ui/lmdb.db +0 -0
  303. package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
  304. package/packages/src/interfaces/ui/spinner.ts +451 -0
  305. package/packages/src/interfaces/ui/terminal/cli/index.ts +228 -0
  306. package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
  307. package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
  308. package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
  309. package/packages/src/interfaces/ui/terminal/shared/index.ts +71 -0
  310. package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
  311. package/packages/src/interfaces/ui/terminal/shared/query.ts +146 -0
  312. package/packages/src/interfaces/ui/terminal/shared/setup.ts +295 -0
  313. package/packages/src/interfaces/ui/terminal/shared/status-line.ts +358 -0
  314. package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
  315. package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +262 -0
  316. package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +232 -0
  317. package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +62 -0
  318. package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +537 -0
  319. package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +107 -0
  320. package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +240 -0
  321. package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +54 -0
  322. package/packages/src/interfaces/ui/terminal/tui/commands.ts +438 -0
  323. package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +584 -0
  324. package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +614 -0
  325. package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +333 -0
  326. package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +604 -0
  327. package/packages/src/interfaces/ui/terminal/tui/components/index.ts +118 -0
  328. package/packages/src/interfaces/ui/terminal/tui/console.ts +49 -0
  329. package/packages/src/interfaces/ui/terminal/tui/index.ts +90 -0
  330. package/packages/src/interfaces/ui/terminal/tui/run.tsx +42 -0
  331. package/packages/src/interfaces/ui/terminal/tui/spinner.ts +69 -0
  332. package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +390 -0
  333. package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +422 -0
  334. package/packages/src/interfaces/ui/terminal/tui/types.ts +186 -0
  335. package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +104 -0
  336. package/packages/src/interfaces/ui/terminal/tui/useNativeInput.ts +239 -0
  337. package/packages/src/lmdb.db +0 -0
  338. package/packages/src/lmdb.db-lock +0 -0
  339. package/packages/src/native/index.ts +2345 -0
  340. package/packages/src/teammates/index.ts +982 -0
  341. package/packages/src/types/index.ts +722 -0
@@ -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":"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"}
@@ -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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"}