@edwardlee5423/magi 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/dist/agent/headless-agent.d.ts +15 -0
  4. package/dist/agent/headless-agent.js +105 -0
  5. package/dist/agent/headless-agent.js.map +1 -0
  6. package/dist/agent/local-plan.d.ts +20 -0
  7. package/dist/agent/local-plan.js +30 -0
  8. package/dist/agent/local-plan.js.map +1 -0
  9. package/dist/agent/query-engine.d.ts +71 -0
  10. package/dist/agent/query-engine.js +938 -0
  11. package/dist/agent/query-engine.js.map +1 -0
  12. package/dist/agent/query.d.ts +128 -0
  13. package/dist/agent/query.js +674 -0
  14. package/dist/agent/query.js.map +1 -0
  15. package/dist/agent/system-prompt.d.ts +12 -0
  16. package/dist/agent/system-prompt.js +104 -0
  17. package/dist/agent/system-prompt.js.map +1 -0
  18. package/dist/agent/tools.d.ts +71 -0
  19. package/dist/agent/tools.js +37 -0
  20. package/dist/agent/tools.js.map +1 -0
  21. package/dist/agents/roles.d.ts +9 -0
  22. package/dist/agents/roles.js +18 -0
  23. package/dist/agents/roles.js.map +1 -0
  24. package/dist/agents/task-queue.d.ts +13 -0
  25. package/dist/agents/task-queue.js +50 -0
  26. package/dist/agents/task-queue.js.map +1 -0
  27. package/dist/cli.d.ts +7 -0
  28. package/dist/cli.js +1540 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/colors.d.ts +20 -0
  31. package/dist/colors.js +92 -0
  32. package/dist/colors.js.map +1 -0
  33. package/dist/commands/agents.d.ts +9 -0
  34. package/dist/commands/agents.js +37 -0
  35. package/dist/commands/agents.js.map +1 -0
  36. package/dist/commands/clear.d.ts +9 -0
  37. package/dist/commands/clear.js +20 -0
  38. package/dist/commands/clear.js.map +1 -0
  39. package/dist/commands/commit.d.ts +8 -0
  40. package/dist/commands/commit.js +35 -0
  41. package/dist/commands/commit.js.map +1 -0
  42. package/dist/commands/compact.d.ts +8 -0
  43. package/dist/commands/compact.js +29 -0
  44. package/dist/commands/compact.js.map +1 -0
  45. package/dist/commands/copy.d.ts +8 -0
  46. package/dist/commands/copy.js +49 -0
  47. package/dist/commands/copy.js.map +1 -0
  48. package/dist/commands/cost.d.ts +8 -0
  49. package/dist/commands/cost.js +94 -0
  50. package/dist/commands/cost.js.map +1 -0
  51. package/dist/commands/diff.d.ts +8 -0
  52. package/dist/commands/diff.js +38 -0
  53. package/dist/commands/diff.js.map +1 -0
  54. package/dist/commands/doctor.d.ts +8 -0
  55. package/dist/commands/doctor.js +23 -0
  56. package/dist/commands/doctor.js.map +1 -0
  57. package/dist/commands/export.d.ts +8 -0
  58. package/dist/commands/export.js +42 -0
  59. package/dist/commands/export.js.map +1 -0
  60. package/dist/commands/fork.d.ts +8 -0
  61. package/dist/commands/fork.js +20 -0
  62. package/dist/commands/fork.js.map +1 -0
  63. package/dist/commands/goal.d.ts +9 -0
  64. package/dist/commands/goal.js +54 -0
  65. package/dist/commands/goal.js.map +1 -0
  66. package/dist/commands/help.d.ts +8 -0
  67. package/dist/commands/help.js +65 -0
  68. package/dist/commands/help.js.map +1 -0
  69. package/dist/commands/hooks.d.ts +8 -0
  70. package/dist/commands/hooks.js +56 -0
  71. package/dist/commands/hooks.js.map +1 -0
  72. package/dist/commands/image.d.ts +17 -0
  73. package/dist/commands/image.js +74 -0
  74. package/dist/commands/image.js.map +1 -0
  75. package/dist/commands/init.d.ts +26 -0
  76. package/dist/commands/init.js +214 -0
  77. package/dist/commands/init.js.map +1 -0
  78. package/dist/commands/mcp.d.ts +8 -0
  79. package/dist/commands/mcp.js +217 -0
  80. package/dist/commands/mcp.js.map +1 -0
  81. package/dist/commands/memory.d.ts +8 -0
  82. package/dist/commands/memory.js +79 -0
  83. package/dist/commands/memory.js.map +1 -0
  84. package/dist/commands/model.d.ts +8 -0
  85. package/dist/commands/model.js +21 -0
  86. package/dist/commands/model.js.map +1 -0
  87. package/dist/commands/permissions.d.ts +9 -0
  88. package/dist/commands/permissions.js +30 -0
  89. package/dist/commands/permissions.js.map +1 -0
  90. package/dist/commands/proactive.d.ts +9 -0
  91. package/dist/commands/proactive.js +24 -0
  92. package/dist/commands/proactive.js.map +1 -0
  93. package/dist/commands/register-all.d.ts +1 -0
  94. package/dist/commands/register-all.js +68 -0
  95. package/dist/commands/register-all.js.map +1 -0
  96. package/dist/commands/registry.d.ts +64 -0
  97. package/dist/commands/registry.js +235 -0
  98. package/dist/commands/registry.js.map +1 -0
  99. package/dist/commands/rename.d.ts +8 -0
  100. package/dist/commands/rename.js +16 -0
  101. package/dist/commands/rename.js.map +1 -0
  102. package/dist/commands/review.d.ts +8 -0
  103. package/dist/commands/review.js +13 -0
  104. package/dist/commands/review.js.map +1 -0
  105. package/dist/commands/rewind.d.ts +8 -0
  106. package/dist/commands/rewind.js +45 -0
  107. package/dist/commands/rewind.js.map +1 -0
  108. package/dist/commands/route.d.ts +9 -0
  109. package/dist/commands/route.js +83 -0
  110. package/dist/commands/route.js.map +1 -0
  111. package/dist/commands/sessions.d.ts +9 -0
  112. package/dist/commands/sessions.js +25 -0
  113. package/dist/commands/sessions.js.map +1 -0
  114. package/dist/commands/skill.d.ts +9 -0
  115. package/dist/commands/skill.js +46 -0
  116. package/dist/commands/skill.js.map +1 -0
  117. package/dist/commands/status.d.ts +8 -0
  118. package/dist/commands/status.js +41 -0
  119. package/dist/commands/status.js.map +1 -0
  120. package/dist/commands/summary.d.ts +8 -0
  121. package/dist/commands/summary.js +39 -0
  122. package/dist/commands/summary.js.map +1 -0
  123. package/dist/commands/tasks.d.ts +9 -0
  124. package/dist/commands/tasks.js +70 -0
  125. package/dist/commands/tasks.js.map +1 -0
  126. package/dist/commands/todos.d.ts +9 -0
  127. package/dist/commands/todos.js +27 -0
  128. package/dist/commands/todos.js.map +1 -0
  129. package/dist/commands/tutorial.d.ts +8 -0
  130. package/dist/commands/tutorial.js +159 -0
  131. package/dist/commands/tutorial.js.map +1 -0
  132. package/dist/commands/upgrade.d.ts +9 -0
  133. package/dist/commands/upgrade.js +73 -0
  134. package/dist/commands/upgrade.js.map +1 -0
  135. package/dist/commands/usage.d.ts +8 -0
  136. package/dist/commands/usage.js +54 -0
  137. package/dist/commands/usage.js.map +1 -0
  138. package/dist/commands/vim.d.ts +10 -0
  139. package/dist/commands/vim.js +34 -0
  140. package/dist/commands/vim.js.map +1 -0
  141. package/dist/config.d.ts +104 -0
  142. package/dist/config.js +533 -0
  143. package/dist/config.js.map +1 -0
  144. package/dist/context/compaction.d.ts +66 -0
  145. package/dist/context/compaction.js +353 -0
  146. package/dist/context/compaction.js.map +1 -0
  147. package/dist/context/layers.d.ts +32 -0
  148. package/dist/context/layers.js +114 -0
  149. package/dist/context/layers.js.map +1 -0
  150. package/dist/context/token-budget.d.ts +21 -0
  151. package/dist/context/token-budget.js +70 -0
  152. package/dist/context/token-budget.js.map +1 -0
  153. package/dist/control/auth.d.ts +17 -0
  154. package/dist/control/auth.js +31 -0
  155. package/dist/control/auth.js.map +1 -0
  156. package/dist/control/daemon.d.ts +38 -0
  157. package/dist/control/daemon.js +135 -0
  158. package/dist/control/daemon.js.map +1 -0
  159. package/dist/control/mdns.d.ts +51 -0
  160. package/dist/control/mdns.js +344 -0
  161. package/dist/control/mdns.js.map +1 -0
  162. package/dist/control/peer-client.d.ts +49 -0
  163. package/dist/control/peer-client.js +170 -0
  164. package/dist/control/peer-client.js.map +1 -0
  165. package/dist/control/server.d.ts +30 -0
  166. package/dist/control/server.js +887 -0
  167. package/dist/control/server.js.map +1 -0
  168. package/dist/cost.d.ts +23 -0
  169. package/dist/cost.js +80 -0
  170. package/dist/cost.js.map +1 -0
  171. package/dist/doctor.d.ts +8 -0
  172. package/dist/doctor.js +22 -0
  173. package/dist/doctor.js.map +1 -0
  174. package/dist/env.d.ts +7 -0
  175. package/dist/env.js +70 -0
  176. package/dist/env.js.map +1 -0
  177. package/dist/errors.d.ts +6 -0
  178. package/dist/errors.js +13 -0
  179. package/dist/errors.js.map +1 -0
  180. package/dist/events.d.ts +19 -0
  181. package/dist/events.js +236 -0
  182. package/dist/events.js.map +1 -0
  183. package/dist/fs-utils.d.ts +21 -0
  184. package/dist/fs-utils.js +48 -0
  185. package/dist/fs-utils.js.map +1 -0
  186. package/dist/goal.d.ts +32 -0
  187. package/dist/goal.js +172 -0
  188. package/dist/goal.js.map +1 -0
  189. package/dist/headless.d.ts +38 -0
  190. package/dist/headless.js +547 -0
  191. package/dist/headless.js.map +1 -0
  192. package/dist/history.d.ts +8 -0
  193. package/dist/history.js +77 -0
  194. package/dist/history.js.map +1 -0
  195. package/dist/hooks/events.d.ts +14 -0
  196. package/dist/hooks/events.js +37 -0
  197. package/dist/hooks/events.js.map +1 -0
  198. package/dist/hooks/runner.d.ts +73 -0
  199. package/dist/hooks/runner.js +256 -0
  200. package/dist/hooks/runner.js.map +1 -0
  201. package/dist/hooks/trigger.d.ts +9 -0
  202. package/dist/hooks/trigger.js +18 -0
  203. package/dist/hooks/trigger.js.map +1 -0
  204. package/dist/index.d.ts +61 -0
  205. package/dist/index.js +62 -0
  206. package/dist/index.js.map +1 -0
  207. package/dist/interactions.d.ts +102 -0
  208. package/dist/interactions.js +250 -0
  209. package/dist/interactions.js.map +1 -0
  210. package/dist/logger.d.ts +32 -0
  211. package/dist/logger.js +115 -0
  212. package/dist/logger.js.map +1 -0
  213. package/dist/markdown.d.ts +18 -0
  214. package/dist/markdown.js +293 -0
  215. package/dist/markdown.js.map +1 -0
  216. package/dist/mcp/approval.d.ts +9 -0
  217. package/dist/mcp/approval.js +27 -0
  218. package/dist/mcp/approval.js.map +1 -0
  219. package/dist/mcp/client.d.ts +61 -0
  220. package/dist/mcp/client.js +276 -0
  221. package/dist/mcp/client.js.map +1 -0
  222. package/dist/mcp/connection-manager.d.ts +30 -0
  223. package/dist/mcp/connection-manager.js +126 -0
  224. package/dist/mcp/connection-manager.js.map +1 -0
  225. package/dist/mcp/oauth-callback.d.ts +23 -0
  226. package/dist/mcp/oauth-callback.js +108 -0
  227. package/dist/mcp/oauth-callback.js.map +1 -0
  228. package/dist/mcp/oauth-flow.d.ts +45 -0
  229. package/dist/mcp/oauth-flow.js +145 -0
  230. package/dist/mcp/oauth-flow.js.map +1 -0
  231. package/dist/mcp/oauth.d.ts +82 -0
  232. package/dist/mcp/oauth.js +169 -0
  233. package/dist/mcp/oauth.js.map +1 -0
  234. package/dist/mcp/tool-registry.d.ts +29 -0
  235. package/dist/mcp/tool-registry.js +207 -0
  236. package/dist/mcp/tool-registry.js.map +1 -0
  237. package/dist/mcp/transport.d.ts +33 -0
  238. package/dist/mcp/transport.js +493 -0
  239. package/dist/mcp/transport.js.map +1 -0
  240. package/dist/mcp/types.d.ts +57 -0
  241. package/dist/mcp/types.js +2 -0
  242. package/dist/mcp/types.js.map +1 -0
  243. package/dist/memdir.d.ts +58 -0
  244. package/dist/memdir.js +219 -0
  245. package/dist/memdir.js.map +1 -0
  246. package/dist/memory-selection.d.ts +30 -0
  247. package/dist/memory-selection.js +102 -0
  248. package/dist/memory-selection.js.map +1 -0
  249. package/dist/memory.d.ts +85 -0
  250. package/dist/memory.js +259 -0
  251. package/dist/memory.js.map +1 -0
  252. package/dist/paths.d.ts +25 -0
  253. package/dist/paths.js +99 -0
  254. package/dist/paths.js.map +1 -0
  255. package/dist/permissions.d.ts +17 -0
  256. package/dist/permissions.js +72 -0
  257. package/dist/permissions.js.map +1 -0
  258. package/dist/plugins/manifest.d.ts +17 -0
  259. package/dist/plugins/manifest.js +98 -0
  260. package/dist/plugins/manifest.js.map +1 -0
  261. package/dist/plugins/marketplace.d.ts +22 -0
  262. package/dist/plugins/marketplace.js +98 -0
  263. package/dist/plugins/marketplace.js.map +1 -0
  264. package/dist/proactive.d.ts +15 -0
  265. package/dist/proactive.js +49 -0
  266. package/dist/proactive.js.map +1 -0
  267. package/dist/providers/errors.d.ts +14 -0
  268. package/dist/providers/errors.js +66 -0
  269. package/dist/providers/errors.js.map +1 -0
  270. package/dist/providers/format-proxy.d.ts +100 -0
  271. package/dist/providers/format-proxy.js +235 -0
  272. package/dist/providers/format-proxy.js.map +1 -0
  273. package/dist/providers/http.d.ts +4 -0
  274. package/dist/providers/http.js +21 -0
  275. package/dist/providers/http.js.map +1 -0
  276. package/dist/providers/ir.d.ts +84 -0
  277. package/dist/providers/ir.js +76 -0
  278. package/dist/providers/ir.js.map +1 -0
  279. package/dist/providers/messages-compatible.d.ts +19 -0
  280. package/dist/providers/messages-compatible.js +592 -0
  281. package/dist/providers/messages-compatible.js.map +1 -0
  282. package/dist/providers/openai.d.ts +18 -0
  283. package/dist/providers/openai.js +430 -0
  284. package/dist/providers/openai.js.map +1 -0
  285. package/dist/providers/registry.d.ts +10 -0
  286. package/dist/providers/registry.js +16 -0
  287. package/dist/providers/registry.js.map +1 -0
  288. package/dist/providers/sse.d.ts +6 -0
  289. package/dist/providers/sse.js +104 -0
  290. package/dist/providers/sse.js.map +1 -0
  291. package/dist/routing/model-alias.d.ts +8 -0
  292. package/dist/routing/model-alias.js +23 -0
  293. package/dist/routing/model-alias.js.map +1 -0
  294. package/dist/routing/model-router.d.ts +55 -0
  295. package/dist/routing/model-router.js +233 -0
  296. package/dist/routing/model-router.js.map +1 -0
  297. package/dist/routing/router.d.ts +26 -0
  298. package/dist/routing/router.js +63 -0
  299. package/dist/routing/router.js.map +1 -0
  300. package/dist/rules/agents-loader.d.ts +12 -0
  301. package/dist/rules/agents-loader.js +61 -0
  302. package/dist/rules/agents-loader.js.map +1 -0
  303. package/dist/runner/client.d.ts +67 -0
  304. package/dist/runner/client.js +175 -0
  305. package/dist/runner/client.js.map +1 -0
  306. package/dist/session-store.d.ts +250 -0
  307. package/dist/session-store.js +629 -0
  308. package/dist/session-store.js.map +1 -0
  309. package/dist/skills/bundled.d.ts +14 -0
  310. package/dist/skills/bundled.js +148 -0
  311. package/dist/skills/bundled.js.map +1 -0
  312. package/dist/skills/loader.d.ts +11 -0
  313. package/dist/skills/loader.js +73 -0
  314. package/dist/skills/loader.js.map +1 -0
  315. package/dist/slash-menu.d.ts +14 -0
  316. package/dist/slash-menu.js +166 -0
  317. package/dist/slash-menu.js.map +1 -0
  318. package/dist/slash.d.ts +75 -0
  319. package/dist/slash.js +126 -0
  320. package/dist/slash.js.map +1 -0
  321. package/dist/spinner.d.ts +27 -0
  322. package/dist/spinner.js +68 -0
  323. package/dist/spinner.js.map +1 -0
  324. package/dist/ssh/exec.d.ts +20 -0
  325. package/dist/ssh/exec.js +39 -0
  326. package/dist/ssh/exec.js.map +1 -0
  327. package/dist/ssh/file.d.ts +32 -0
  328. package/dist/ssh/file.js +60 -0
  329. package/dist/ssh/file.js.map +1 -0
  330. package/dist/syntax-highlight.d.ts +19 -0
  331. package/dist/syntax-highlight.js +181 -0
  332. package/dist/syntax-highlight.js.map +1 -0
  333. package/dist/tools/agent-tool.d.ts +53 -0
  334. package/dist/tools/agent-tool.js +62 -0
  335. package/dist/tools/agent-tool.js.map +1 -0
  336. package/dist/tools/archive-create.d.ts +35 -0
  337. package/dist/tools/archive-create.js +37 -0
  338. package/dist/tools/archive-create.js.map +1 -0
  339. package/dist/tools/archive-extract.d.ts +28 -0
  340. package/dist/tools/archive-extract.js +36 -0
  341. package/dist/tools/archive-extract.js.map +1 -0
  342. package/dist/tools/base64.d.ts +27 -0
  343. package/dist/tools/base64.js +19 -0
  344. package/dist/tools/base64.js.map +1 -0
  345. package/dist/tools/browser.d.ts +125 -0
  346. package/dist/tools/browser.js +241 -0
  347. package/dist/tools/browser.js.map +1 -0
  348. package/dist/tools/config-tool.d.ts +31 -0
  349. package/dist/tools/config-tool.js +167 -0
  350. package/dist/tools/config-tool.js.map +1 -0
  351. package/dist/tools/cron.d.ts +110 -0
  352. package/dist/tools/cron.js +299 -0
  353. package/dist/tools/cron.js.map +1 -0
  354. package/dist/tools/date.d.ts +24 -0
  355. package/dist/tools/date.js +26 -0
  356. package/dist/tools/date.js.map +1 -0
  357. package/dist/tools/dir-create.d.ts +21 -0
  358. package/dist/tools/dir-create.js +19 -0
  359. package/dist/tools/dir-create.js.map +1 -0
  360. package/dist/tools/dir-list.d.ts +36 -0
  361. package/dist/tools/dir-list.js +47 -0
  362. package/dist/tools/dir-list.js.map +1 -0
  363. package/dist/tools/disk-usage.d.ts +30 -0
  364. package/dist/tools/disk-usage.js +22 -0
  365. package/dist/tools/disk-usage.js.map +1 -0
  366. package/dist/tools/download-file.d.ts +28 -0
  367. package/dist/tools/download-file.js +42 -0
  368. package/dist/tools/download-file.js.map +1 -0
  369. package/dist/tools/environment.d.ts +31 -0
  370. package/dist/tools/environment.js +33 -0
  371. package/dist/tools/environment.js.map +1 -0
  372. package/dist/tools/errors.d.ts +5 -0
  373. package/dist/tools/errors.js +9 -0
  374. package/dist/tools/errors.js.map +1 -0
  375. package/dist/tools/file-copy.d.ts +34 -0
  376. package/dist/tools/file-copy.js +45 -0
  377. package/dist/tools/file-copy.js.map +1 -0
  378. package/dist/tools/file-delete.d.ts +34 -0
  379. package/dist/tools/file-delete.js +42 -0
  380. package/dist/tools/file-delete.js.map +1 -0
  381. package/dist/tools/file-find.d.ts +46 -0
  382. package/dist/tools/file-find.js +33 -0
  383. package/dist/tools/file-find.js.map +1 -0
  384. package/dist/tools/file-move.d.ts +33 -0
  385. package/dist/tools/file-move.js +32 -0
  386. package/dist/tools/file-move.js.map +1 -0
  387. package/dist/tools/files.d.ts +38 -0
  388. package/dist/tools/files.js +123 -0
  389. package/dist/tools/files.js.map +1 -0
  390. package/dist/tools/git-branch-delete.d.ts +27 -0
  391. package/dist/tools/git-branch-delete.js +25 -0
  392. package/dist/tools/git-branch-delete.js.map +1 -0
  393. package/dist/tools/git-reset.d.ts +30 -0
  394. package/dist/tools/git-reset.js +28 -0
  395. package/dist/tools/git-reset.js.map +1 -0
  396. package/dist/tools/git-stash.d.ts +28 -0
  397. package/dist/tools/git-stash.js +24 -0
  398. package/dist/tools/git-stash.js.map +1 -0
  399. package/dist/tools/git.d.ts +77 -0
  400. package/dist/tools/git.js +300 -0
  401. package/dist/tools/git.js.map +1 -0
  402. package/dist/tools/github.d.ts +68 -0
  403. package/dist/tools/github.js +77 -0
  404. package/dist/tools/github.js.map +1 -0
  405. package/dist/tools/head-tail.d.ts +34 -0
  406. package/dist/tools/head-tail.js +23 -0
  407. package/dist/tools/head-tail.js.map +1 -0
  408. package/dist/tools/http-request.d.ts +44 -0
  409. package/dist/tools/http-request.js +57 -0
  410. package/dist/tools/http-request.js.map +1 -0
  411. package/dist/tools/json-query.d.ts +27 -0
  412. package/dist/tools/json-query.js +90 -0
  413. package/dist/tools/json-query.js.map +1 -0
  414. package/dist/tools/kill-process.d.ts +32 -0
  415. package/dist/tools/kill-process.js +51 -0
  416. package/dist/tools/kill-process.js.map +1 -0
  417. package/dist/tools/lsp.d.ts +98 -0
  418. package/dist/tools/lsp.js +398 -0
  419. package/dist/tools/lsp.js.map +1 -0
  420. package/dist/tools/monitor.d.ts +29 -0
  421. package/dist/tools/monitor.js +78 -0
  422. package/dist/tools/monitor.js.map +1 -0
  423. package/dist/tools/network-check.d.ts +34 -0
  424. package/dist/tools/network-check.js +57 -0
  425. package/dist/tools/network-check.js.map +1 -0
  426. package/dist/tools/notebook.d.ts +63 -0
  427. package/dist/tools/notebook.js +158 -0
  428. package/dist/tools/notebook.js.map +1 -0
  429. package/dist/tools/plan-mode.d.ts +48 -0
  430. package/dist/tools/plan-mode.js +57 -0
  431. package/dist/tools/plan-mode.js.map +1 -0
  432. package/dist/tools/process-list.d.ts +35 -0
  433. package/dist/tools/process-list.js +42 -0
  434. package/dist/tools/process-list.js.map +1 -0
  435. package/dist/tools/registry.d.ts +132 -0
  436. package/dist/tools/registry.js +2262 -0
  437. package/dist/tools/registry.js.map +1 -0
  438. package/dist/tools/search.d.ts +38 -0
  439. package/dist/tools/search.js +327 -0
  440. package/dist/tools/search.js.map +1 -0
  441. package/dist/tools/shell.d.ts +18 -0
  442. package/dist/tools/shell.js +249 -0
  443. package/dist/tools/shell.js.map +1 -0
  444. package/dist/tools/skill-tool.d.ts +22 -0
  445. package/dist/tools/skill-tool.js +66 -0
  446. package/dist/tools/skill-tool.js.map +1 -0
  447. package/dist/tools/sleep.d.ts +16 -0
  448. package/dist/tools/sleep.js +24 -0
  449. package/dist/tools/sleep.js.map +1 -0
  450. package/dist/tools/snip.d.ts +26 -0
  451. package/dist/tools/snip.js +95 -0
  452. package/dist/tools/snip.js.map +1 -0
  453. package/dist/tools/system-info.d.ts +17 -0
  454. package/dist/tools/system-info.js +33 -0
  455. package/dist/tools/system-info.js.map +1 -0
  456. package/dist/tools/tasks.d.ts +191 -0
  457. package/dist/tools/tasks.js +348 -0
  458. package/dist/tools/tasks.js.map +1 -0
  459. package/dist/tools/text-stats.d.ts +25 -0
  460. package/dist/tools/text-stats.js +25 -0
  461. package/dist/tools/text-stats.js.map +1 -0
  462. package/dist/tools/todo.d.ts +69 -0
  463. package/dist/tools/todo.js +197 -0
  464. package/dist/tools/todo.js.map +1 -0
  465. package/dist/tools/tool-search.d.ts +29 -0
  466. package/dist/tools/tool-search.js +114 -0
  467. package/dist/tools/tool-search.js.map +1 -0
  468. package/dist/tools/tree-view.d.ts +34 -0
  469. package/dist/tools/tree-view.js +39 -0
  470. package/dist/tools/tree-view.js.map +1 -0
  471. package/dist/tools/user-message.d.ts +39 -0
  472. package/dist/tools/user-message.js +70 -0
  473. package/dist/tools/user-message.js.map +1 -0
  474. package/dist/tools/user-question.d.ts +88 -0
  475. package/dist/tools/user-question.js +236 -0
  476. package/dist/tools/user-question.js.map +1 -0
  477. package/dist/tools/web-browser.d.ts +53 -0
  478. package/dist/tools/web-browser.js +373 -0
  479. package/dist/tools/web-browser.js.map +1 -0
  480. package/dist/tools/web-fetch.d.ts +22 -0
  481. package/dist/tools/web-fetch.js +146 -0
  482. package/dist/tools/web-fetch.js.map +1 -0
  483. package/dist/tools/web-search.d.ts +51 -0
  484. package/dist/tools/web-search.js +198 -0
  485. package/dist/tools/web-search.js.map +1 -0
  486. package/dist/tools/which.d.ts +22 -0
  487. package/dist/tools/which.js +21 -0
  488. package/dist/tools/which.js.map +1 -0
  489. package/dist/tools/whoami.d.ts +17 -0
  490. package/dist/tools/whoami.js +24 -0
  491. package/dist/tools/whoami.js.map +1 -0
  492. package/dist/tools/workspace-diagnostics.d.ts +62 -0
  493. package/dist/tools/workspace-diagnostics.js +421 -0
  494. package/dist/tools/workspace-diagnostics.js.map +1 -0
  495. package/dist/tools/workspace.d.ts +14 -0
  496. package/dist/tools/workspace.js +65 -0
  497. package/dist/tools/workspace.js.map +1 -0
  498. package/dist/tools/worktree.d.ts +70 -0
  499. package/dist/tools/worktree.js +150 -0
  500. package/dist/tools/worktree.js.map +1 -0
  501. package/dist/tui/interactions.d.ts +25 -0
  502. package/dist/tui/interactions.js +232 -0
  503. package/dist/tui/interactions.js.map +1 -0
  504. package/dist/tui/multiline-input.d.ts +14 -0
  505. package/dist/tui/multiline-input.js +550 -0
  506. package/dist/tui/multiline-input.js.map +1 -0
  507. package/dist/tui/paste.d.ts +40 -0
  508. package/dist/tui/paste.js +113 -0
  509. package/dist/tui/paste.js.map +1 -0
  510. package/dist/tui/prompt-reader.d.ts +26 -0
  511. package/dist/tui/prompt-reader.js +553 -0
  512. package/dist/tui/prompt-reader.js.map +1 -0
  513. package/dist/tui/transcript.d.ts +34 -0
  514. package/dist/tui/transcript.js +275 -0
  515. package/dist/tui/transcript.js.map +1 -0
  516. package/dist/tui.d.ts +53 -0
  517. package/dist/tui.js +669 -0
  518. package/dist/tui.js.map +1 -0
  519. package/dist/version.d.ts +1 -0
  520. package/dist/version.js +2 -0
  521. package/dist/version.js.map +1 -0
  522. package/dist/vim/lineEditor.d.ts +18 -0
  523. package/dist/vim/lineEditor.js +420 -0
  524. package/dist/vim/lineEditor.js.map +1 -0
  525. package/dist/web/panel-html.d.ts +1 -0
  526. package/dist/web/panel-html.js +532 -0
  527. package/dist/web/panel-html.js.map +1 -0
  528. package/dist/web/panel.d.ts +4 -0
  529. package/dist/web/panel.js +121 -0
  530. package/dist/web/panel.js.map +1 -0
  531. package/package.json +42 -0
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Bracketed paste handling for the TUI.
3
+ *
4
+ * Modern terminals send ESC[200~ ... ESC[201~ around pasted content. This
5
+ * lets us reliably tell typing apart from pasting:
6
+ * - short single-line pastes are inserted directly into the line buffer
7
+ * - long or multi-line pastes are replaced with a `[paste #N: ...]`
8
+ * placeholder and the real content is stashed; on submit the caller
9
+ * calls `restorePastes()` to swap the placeholder back to the real text
10
+ *
11
+ * We also intercept stdin's `data` listeners before readline sees them so
12
+ * we can split out paste markers without confusing readline's editor state.
13
+ *
14
+ * The TUI is the only consumer; this module is intentionally tied to the
15
+ * Node `readline/promises` Interface and `process.stdin`-shaped streams.
16
+ */
17
+ const PASTE_START = Buffer.from("\x1b[200~");
18
+ const PASTE_END = Buffer.from("\x1b[201~");
19
+ export function installPasteHandler(input) {
20
+ const { rl, stdin, stdout } = input;
21
+ // Get readline's internal symbols so we can feed paste content into the
22
+ // line buffer (rather than submit it).
23
+ const rlProto = Object.getPrototypeOf(Object.getPrototypeOf(rl));
24
+ const kInsertString = Object.getOwnPropertySymbols(rlProto).find((s) => s.toString() === "Symbol(_insertString)");
25
+ // Enable bracketed paste mode.
26
+ stdout.write("\x1b[?2004h");
27
+ // Stash for paste content: the visible buffer shows "[paste #N: M lines]"
28
+ // but the actual content is restored when the user presses Enter.
29
+ const pasteStash = new Map();
30
+ let pasteCounter = 0;
31
+ let pasteBuffer = null;
32
+ // Intercept the data stream BEFORE readline sees it.
33
+ const origDataListeners = stdin.listeners("data");
34
+ for (const l of origDataListeners)
35
+ stdin.removeListener("data", l);
36
+ let leftover = Buffer.alloc(0);
37
+ const onData = (buf) => {
38
+ leftover = Buffer.concat([leftover, buf]);
39
+ while (leftover.length > 0) {
40
+ if (pasteBuffer !== null) {
41
+ const endIdx = leftover.indexOf(PASTE_END);
42
+ if (endIdx === -1) {
43
+ pasteBuffer += leftover.toString("utf8");
44
+ leftover = Buffer.alloc(0);
45
+ return;
46
+ }
47
+ pasteBuffer += leftover.slice(0, endIdx).toString("utf8");
48
+ const completed = pasteBuffer.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
49
+ pasteBuffer = null;
50
+ leftover = leftover.slice(endIdx + PASTE_END.length);
51
+ if (completed.length > 0) {
52
+ const lineCount = completed.split("\n").length;
53
+ if (lineCount === 1 && completed.length < 200) {
54
+ // Short single-line paste — insert directly.
55
+ if (kInsertString && rl[kInsertString]) {
56
+ rl[kInsertString](completed);
57
+ }
58
+ }
59
+ else {
60
+ // Multi-line or long paste — show placeholder, stash real content.
61
+ pasteCounter += 1;
62
+ const placeholder = `[paste #${pasteCounter}: ${completed.length} chars, ${lineCount} lines]`;
63
+ pasteStash.set(placeholder, completed);
64
+ if (kInsertString && rl[kInsertString]) {
65
+ rl[kInsertString](placeholder);
66
+ }
67
+ }
68
+ }
69
+ continue;
70
+ }
71
+ const startIdx = leftover.indexOf(PASTE_START);
72
+ if (startIdx === -1) {
73
+ // No paste start — pass everything to readline.
74
+ for (const listener of origDataListeners)
75
+ listener(leftover);
76
+ leftover = Buffer.alloc(0);
77
+ return;
78
+ }
79
+ if (startIdx > 0) {
80
+ const before = leftover.slice(0, startIdx);
81
+ for (const listener of origDataListeners)
82
+ listener(before);
83
+ }
84
+ pasteBuffer = "";
85
+ leftover = leftover.slice(startIdx + PASTE_START.length);
86
+ }
87
+ };
88
+ stdin.on("data", onData);
89
+ let disposed = false;
90
+ const dispose = () => {
91
+ if (disposed)
92
+ return;
93
+ disposed = true;
94
+ stdout.write("\x1b[?2004l");
95
+ };
96
+ process.on("exit", dispose);
97
+ return {
98
+ restorePastes(line) {
99
+ if (pasteStash.size === 0 || !line.includes("[paste #"))
100
+ return line;
101
+ let result = line;
102
+ for (const [placeholder, content] of pasteStash) {
103
+ if (placeholder.startsWith("[paste #")) {
104
+ result = result.split(placeholder).join(content);
105
+ }
106
+ }
107
+ pasteStash.clear();
108
+ return result;
109
+ },
110
+ dispose
111
+ };
112
+ }
113
+ //# sourceMappingURL=paste.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste.js","sourceRoot":"","sources":["../../src/tui/paste.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export type TuiPromptAbortReason = "SIGINT" | "EOF";
2
+ export declare class TuiPromptAbortError extends Error {
3
+ readonly reason: TuiPromptAbortReason;
4
+ constructor(reason: TuiPromptAbortReason);
5
+ }
6
+ export interface TuiPromptOptions {
7
+ input: NodeJS.ReadStream;
8
+ output: NodeJS.WriteStream;
9
+ prompt: string;
10
+ history?: string[];
11
+ initialValue?: string;
12
+ maxVisibleLines?: number;
13
+ }
14
+ export declare function readTuiPrompt(options: TuiPromptOptions): Promise<string>;
15
+ export declare function buildPromptDisplayForTest(input: {
16
+ prompt: string;
17
+ text: string;
18
+ cursor: number;
19
+ safeColumns: number;
20
+ maxVisibleLines: number;
21
+ final?: boolean;
22
+ }): {
23
+ lines: string[];
24
+ cursorLine: number;
25
+ cursorColumn: number;
26
+ };
@@ -0,0 +1,553 @@
1
+ import { once } from "node:events";
2
+ export class TuiPromptAbortError extends Error {
3
+ reason;
4
+ constructor(reason) {
5
+ super(reason);
6
+ this.reason = reason;
7
+ }
8
+ }
9
+ const PASTE_START = "\x1b[200~";
10
+ const PASTE_END = "\x1b[201~";
11
+ const DIM = "\x1b[90m";
12
+ const RESET = "\x1b[0m";
13
+ let graphemeSegmenter;
14
+ export async function readTuiPrompt(options) {
15
+ const { input, output, prompt } = options;
16
+ const history = options.history ?? [];
17
+ const maxVisibleLines = Math.max(1, options.maxVisibleLines ?? 6);
18
+ let text = options.initialValue ?? "";
19
+ let cursor = text.length;
20
+ let renderedLines = 0;
21
+ let renderedCursorLine = 0;
22
+ let pending = "";
23
+ let pasteBuffer;
24
+ let pasteCounter = 0;
25
+ let historyIndex = history.length;
26
+ let draft = text;
27
+ const pasteStash = new Map();
28
+ const readlineListeners = input.rawListeners("data").slice();
29
+ for (const listener of readlineListeners) {
30
+ input.removeListener("data", listener);
31
+ }
32
+ const wasRaw = input.isRaw;
33
+ if (input.isTTY) {
34
+ input.setRawMode(true);
35
+ }
36
+ input.resume();
37
+ output.write("\x1b[?2004h");
38
+ let settled = false;
39
+ let resolvePrompt;
40
+ let rejectPrompt;
41
+ const cleanup = () => {
42
+ input.removeListener("data", onData);
43
+ output.write("\x1b[?2004l");
44
+ if (input.isTTY) {
45
+ input.setRawMode(Boolean(wasRaw));
46
+ }
47
+ for (const listener of readlineListeners) {
48
+ input.on("data", listener);
49
+ }
50
+ };
51
+ const finish = (value) => {
52
+ if (settled)
53
+ return;
54
+ settled = true;
55
+ render(true);
56
+ output.write("\n");
57
+ cleanup();
58
+ resolvePrompt(restorePastes(value, pasteStash));
59
+ };
60
+ const abort = (reason) => {
61
+ if (settled)
62
+ return;
63
+ settled = true;
64
+ render(true);
65
+ output.write("\n");
66
+ cleanup();
67
+ rejectPrompt(new TuiPromptAbortError(reason));
68
+ };
69
+ const insert = (value) => {
70
+ if (!value)
71
+ return;
72
+ text = text.slice(0, cursor) + value + text.slice(cursor);
73
+ cursor += value.length;
74
+ historyIndex = history.length;
75
+ };
76
+ const backspace = () => {
77
+ if (cursor <= 0)
78
+ return;
79
+ const prev = previousOffset(text, cursor);
80
+ text = text.slice(0, prev) + text.slice(cursor);
81
+ cursor = prev;
82
+ historyIndex = history.length;
83
+ };
84
+ const del = () => {
85
+ if (cursor >= text.length)
86
+ return;
87
+ const next = nextOffset(text, cursor);
88
+ text = text.slice(0, cursor) + text.slice(next);
89
+ historyIndex = history.length;
90
+ };
91
+ const moveHistory = (direction) => {
92
+ if (history.length === 0)
93
+ return;
94
+ if (historyIndex === history.length) {
95
+ draft = text;
96
+ }
97
+ const next = historyIndex + direction;
98
+ if (next < 0)
99
+ return;
100
+ if (next >= history.length) {
101
+ historyIndex = history.length;
102
+ text = draft;
103
+ cursor = text.length;
104
+ return;
105
+ }
106
+ historyIndex = next;
107
+ text = history[historyIndex] ?? "";
108
+ cursor = text.length;
109
+ };
110
+ const moveVerticalOrHistory = (direction) => {
111
+ const lines = splitLogicalLines(text);
112
+ const pos = positionForOffset(lines, cursor);
113
+ const targetLine = pos.line + direction;
114
+ if (targetLine >= 0 && targetLine < lines.length) {
115
+ const target = lines[targetLine];
116
+ cursor = Math.min(target.start + pos.column, target.end);
117
+ return;
118
+ }
119
+ moveHistory(direction);
120
+ };
121
+ const submitOrNewline = () => {
122
+ if (cursor > 0 && text[cursor - 1] === "\\") {
123
+ text = text.slice(0, cursor - 1) + "\n" + text.slice(cursor);
124
+ return;
125
+ }
126
+ finish(text);
127
+ };
128
+ const insertPaste = (raw) => {
129
+ const normalized = raw.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
130
+ if (!normalized)
131
+ return;
132
+ const lineCount = normalized.split("\n").length;
133
+ if (lineCount === 1 && normalized.length < 200) {
134
+ insert(normalized);
135
+ return;
136
+ }
137
+ pasteCounter += 1;
138
+ const placeholder = `[paste #${pasteCounter}: ${normalized.length} chars, ${lineCount} lines]`;
139
+ pasteStash.set(placeholder, normalized);
140
+ insert(placeholder);
141
+ };
142
+ const processText = (chunk) => {
143
+ let i = 0;
144
+ while (i < chunk.length) {
145
+ if (chunk.startsWith("\x1b[13;2u", i) || chunk.startsWith("\x1b[13;3u", i)) {
146
+ insert("\n");
147
+ i += 7;
148
+ continue;
149
+ }
150
+ if (chunk.startsWith("\x1b\r", i) || chunk.startsWith("\x1b\n", i)) {
151
+ insert("\n");
152
+ i += 2;
153
+ continue;
154
+ }
155
+ if (chunk.startsWith("\x1b[A", i)) {
156
+ moveVerticalOrHistory(-1);
157
+ i += 3;
158
+ continue;
159
+ }
160
+ if (chunk.startsWith("\x1b[B", i)) {
161
+ moveVerticalOrHistory(1);
162
+ i += 3;
163
+ continue;
164
+ }
165
+ if (chunk.startsWith("\x1b[C", i)) {
166
+ cursor = nextOffset(text, cursor);
167
+ i += 3;
168
+ continue;
169
+ }
170
+ if (chunk.startsWith("\x1b[D", i)) {
171
+ cursor = previousOffset(text, cursor);
172
+ i += 3;
173
+ continue;
174
+ }
175
+ if (chunk.startsWith("\x1b[H", i) || chunk.startsWith("\x1b[1~", i)) {
176
+ cursor = lineStartForOffset(text, cursor);
177
+ i += chunk.startsWith("\x1b[H", i) ? 3 : 4;
178
+ continue;
179
+ }
180
+ if (chunk.startsWith("\x1b[F", i) || chunk.startsWith("\x1b[4~", i)) {
181
+ cursor = lineEndForOffset(text, cursor);
182
+ i += chunk.startsWith("\x1b[F", i) ? 3 : 4;
183
+ continue;
184
+ }
185
+ if (chunk.startsWith("\x1b[3~", i)) {
186
+ del();
187
+ i += 4;
188
+ continue;
189
+ }
190
+ if (chunk[i] === "\x1b") {
191
+ const match = chunk.slice(i).match(/^\x1b\[[0-9;?]*[~A-Za-z]/);
192
+ i += match ? match[0].length : 1;
193
+ continue;
194
+ }
195
+ const ch = chunk[i];
196
+ if (ch === "\x03") {
197
+ if (text.length > 0) {
198
+ text = "";
199
+ cursor = 0;
200
+ }
201
+ else {
202
+ abort("SIGINT");
203
+ return;
204
+ }
205
+ }
206
+ else if (ch === "\x04") {
207
+ if (text.length === 0) {
208
+ abort("EOF");
209
+ return;
210
+ }
211
+ }
212
+ else if (ch === "\r" || ch === "\n") {
213
+ submitOrNewline();
214
+ return;
215
+ }
216
+ else if (ch === "\x7f" || ch === "\b") {
217
+ backspace();
218
+ }
219
+ else if (ch >= " " || ch === "\t") {
220
+ const grapheme = firstGrapheme(chunk.slice(i));
221
+ insert(grapheme.segment);
222
+ i += grapheme.segment.length - 1;
223
+ }
224
+ i += 1;
225
+ }
226
+ };
227
+ const processPending = () => {
228
+ while (pending.length > 0 && !settled) {
229
+ if (pasteBuffer !== undefined) {
230
+ const end = pending.indexOf(PASTE_END);
231
+ if (end === -1) {
232
+ pasteBuffer += pending;
233
+ pending = "";
234
+ break;
235
+ }
236
+ pasteBuffer += pending.slice(0, end);
237
+ pending = pending.slice(end + PASTE_END.length);
238
+ insertPaste(pasteBuffer);
239
+ pasteBuffer = undefined;
240
+ continue;
241
+ }
242
+ const start = pending.indexOf(PASTE_START);
243
+ if (start === -1) {
244
+ const chunk = pending;
245
+ pending = "";
246
+ processText(chunk);
247
+ break;
248
+ }
249
+ if (start > 0) {
250
+ const before = pending.slice(0, start);
251
+ pending = pending.slice(start);
252
+ processText(before);
253
+ continue;
254
+ }
255
+ pasteBuffer = "";
256
+ pending = pending.slice(PASTE_START.length);
257
+ }
258
+ };
259
+ function onData(buffer) {
260
+ pending += buffer.toString("utf8");
261
+ processPending();
262
+ if (!settled)
263
+ render(false);
264
+ }
265
+ function render(final) {
266
+ const terminalColumns = output.columns || 80;
267
+ const safeColumns = safePromptColumns(terminalColumns);
268
+ const display = buildDisplay({
269
+ prompt,
270
+ text,
271
+ cursor,
272
+ safeColumns,
273
+ maxVisibleLines,
274
+ final
275
+ });
276
+ if (renderedLines > 0) {
277
+ if (renderedCursorLine > 0) {
278
+ output.write(`\x1b[${renderedCursorLine}A`);
279
+ }
280
+ output.write("\r\x1b[J");
281
+ }
282
+ output.write(display.lines.join("\n"));
283
+ renderedLines = display.lines.length;
284
+ if (final) {
285
+ renderedCursorLine = renderedLines - 1;
286
+ return;
287
+ }
288
+ const up = display.lines.length - 1 - display.cursorLine;
289
+ if (up > 0)
290
+ output.write(`\x1b[${up}A`);
291
+ output.write("\r");
292
+ if (display.cursorColumn > 0)
293
+ output.write(`\x1b[${display.cursorColumn}C`);
294
+ renderedCursorLine = display.cursorLine;
295
+ }
296
+ const result = new Promise((resolve, reject) => {
297
+ resolvePrompt = resolve;
298
+ rejectPrompt = reject;
299
+ });
300
+ input.on("data", onData);
301
+ render(false);
302
+ await Promise.race([result, once(input, "error").then(([error]) => Promise.reject(error))]);
303
+ return result;
304
+ }
305
+ function restorePastes(value, pasteStash) {
306
+ let result = value;
307
+ for (const [placeholder, content] of pasteStash) {
308
+ result = result.split(placeholder).join(content);
309
+ }
310
+ return result;
311
+ }
312
+ export function buildPromptDisplayForTest(input) {
313
+ return buildDisplay({ ...input, final: input.final ?? false });
314
+ }
315
+ function buildDisplay(input) {
316
+ const logical = splitLogicalLines(input.text);
317
+ const pos = positionForOffset(logical, input.cursor);
318
+ const half = Math.floor(input.maxVisibleLines / 2);
319
+ let first = Math.max(0, pos.line - half);
320
+ const last = Math.min(logical.length, first + input.maxVisibleLines);
321
+ first = Math.max(0, last - input.maxVisibleLines);
322
+ const visible = logical.slice(first, last);
323
+ const lines = [];
324
+ let cursorLine = 0;
325
+ let cursorColumn = 0;
326
+ for (let index = 0; index < visible.length; index++) {
327
+ const sourceLine = first + index;
328
+ const logicalLine = visible[index];
329
+ const prefix = sourceLine === 0 ? input.prompt : `${DIM}... ${RESET}`;
330
+ const contentWidth = Math.max(8, input.safeColumns - visibleWidth(prefix));
331
+ const isCursorLine = sourceLine === pos.line;
332
+ const cursorCell = visibleWidth(logicalLine.text.slice(0, pos.column));
333
+ const windowStart = isCursorLine
334
+ ? windowStartForCursor(cursorCell, contentWidth, visibleWidth(logicalLine.text))
335
+ : 0;
336
+ const leftMarker = windowStart > 0 ? "…" : "";
337
+ const rightMarker = windowStart + contentWidth < visibleWidth(logicalLine.text) ? "…" : "";
338
+ const markerWidth = visibleWidth(leftMarker) + visibleWidth(rightMarker);
339
+ const shown = `${leftMarker}${sliceCells(logicalLine.text, windowStart, Math.max(0, contentWidth - markerWidth))}${rightMarker}`;
340
+ const line = clipToColumns(prefix + shown, input.safeColumns);
341
+ lines.push(line);
342
+ if (isCursorLine) {
343
+ cursorLine = index;
344
+ cursorColumn = Math.min(Math.max(0, input.safeColumns - 2), visibleWidth(prefix) + Math.max(0, cursorCell - windowStart) + visibleWidth(leftMarker));
345
+ }
346
+ }
347
+ if (lines.length === 0) {
348
+ lines.push(input.prompt);
349
+ }
350
+ if (logical.length > input.maxVisibleLines && !input.final) {
351
+ lines.push(`${DIM}[${logical.length} lines, use Option+Enter or backslash+Enter for newline]${RESET}`);
352
+ }
353
+ return { lines, cursorLine, cursorColumn };
354
+ }
355
+ function splitLogicalLines(text) {
356
+ const lines = [];
357
+ let start = 0;
358
+ for (let index = 0; index <= text.length; index++) {
359
+ if (index === text.length || text[index] === "\n") {
360
+ lines.push({ text: text.slice(start, index), start, end: index });
361
+ start = index + 1;
362
+ }
363
+ }
364
+ return lines.length > 0 ? lines : [{ text: "", start: 0, end: 0 }];
365
+ }
366
+ function positionForOffset(lines, offset) {
367
+ for (let index = 0; index < lines.length; index++) {
368
+ const line = lines[index];
369
+ if (offset >= line.start && offset <= line.end) {
370
+ return { line: index, column: offset - line.start };
371
+ }
372
+ }
373
+ const last = lines[lines.length - 1];
374
+ return { line: lines.length - 1, column: last.text.length };
375
+ }
376
+ function windowStartForCursor(column, width, lineLength) {
377
+ if (lineLength <= width)
378
+ return 0;
379
+ const margin = Math.max(2, Math.floor(width / 4));
380
+ if (column < width - margin)
381
+ return 0;
382
+ return Math.min(lineLength - width, column - width + margin);
383
+ }
384
+ function previousOffset(text, offset) {
385
+ if (offset <= 0)
386
+ return 0;
387
+ let previous = 0;
388
+ for (const grapheme of segmentGraphemes(text)) {
389
+ if (grapheme.index >= offset) {
390
+ return previous;
391
+ }
392
+ previous = grapheme.index;
393
+ }
394
+ return previous;
395
+ }
396
+ function nextOffset(text, offset) {
397
+ if (offset >= text.length)
398
+ return text.length;
399
+ for (const grapheme of segmentGraphemes(text)) {
400
+ if (grapheme.index > offset) {
401
+ return grapheme.index;
402
+ }
403
+ }
404
+ return text.length;
405
+ }
406
+ function lineStartForOffset(text, offset) {
407
+ const prev = text.lastIndexOf("\n", Math.max(0, offset - 1));
408
+ return prev === -1 ? 0 : prev + 1;
409
+ }
410
+ function lineEndForOffset(text, offset) {
411
+ const next = text.indexOf("\n", offset);
412
+ return next === -1 ? text.length : next;
413
+ }
414
+ function clipToColumns(text, columns) {
415
+ let result = "";
416
+ let width = 0;
417
+ let ansi = false;
418
+ for (const ch of Array.from(text)) {
419
+ if (ch === "\x1b")
420
+ ansi = true;
421
+ result += ch;
422
+ if (ansi) {
423
+ if (ch === "m")
424
+ ansi = false;
425
+ continue;
426
+ }
427
+ const next = width + charWidth(ch);
428
+ if (next > columns) {
429
+ return result.slice(0, -ch.length) + RESET;
430
+ }
431
+ width = next;
432
+ if (width >= columns) {
433
+ return result + RESET;
434
+ }
435
+ }
436
+ return result;
437
+ }
438
+ function visibleWidth(text) {
439
+ return segmentGraphemes(stripAnsi(text)).reduce((sum, grapheme) => sum + grapheme.width, 0);
440
+ }
441
+ function stripAnsi(text) {
442
+ return text.replace(/\x1b\[[0-9;?]*m/g, "");
443
+ }
444
+ function charWidth(ch) {
445
+ if (!ch)
446
+ return 0;
447
+ let width = 0;
448
+ for (const grapheme of segmentGraphemes(ch)) {
449
+ width += grapheme.width;
450
+ }
451
+ return width;
452
+ }
453
+ function sliceCells(text, startCell, width) {
454
+ let result = "";
455
+ let cell = 0;
456
+ for (const grapheme of segmentGraphemes(text)) {
457
+ const next = cell + grapheme.width;
458
+ if (next > startCell && cell < startCell + width) {
459
+ result += grapheme.segment;
460
+ }
461
+ cell = next;
462
+ if (cell >= startCell + width)
463
+ break;
464
+ }
465
+ return result;
466
+ }
467
+ function firstGrapheme(text) {
468
+ return segmentGraphemes(text)[0] ?? { segment: text[0] ?? "", index: 0, width: text[0] ? 1 : 0 };
469
+ }
470
+ function segmentGraphemes(text) {
471
+ const segmenter = getGraphemeSegmenter();
472
+ const segments = segmenter
473
+ ? [...segmenter.segment(text)].map(({ segment, index }) => ({ segment, index, width: graphemeWidth(segment) }))
474
+ : Array.from(text).map((segment, index) => ({ segment, index, width: graphemeWidth(segment) }));
475
+ return segments;
476
+ }
477
+ function getGraphemeSegmenter() {
478
+ if (graphemeSegmenter) {
479
+ return graphemeSegmenter;
480
+ }
481
+ if (typeof Intl.Segmenter !== "function") {
482
+ return undefined;
483
+ }
484
+ graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
485
+ return graphemeSegmenter;
486
+ }
487
+ function graphemeWidth(grapheme) {
488
+ if (!grapheme)
489
+ return 0;
490
+ if (isEmojiGrapheme(grapheme)) {
491
+ return isSingleRegionalIndicator(grapheme) ? 1 : 2;
492
+ }
493
+ for (const char of grapheme) {
494
+ const codePoint = char.codePointAt(0);
495
+ if (codePoint !== undefined && !isZeroWidth(codePoint)) {
496
+ return codePointWidth(codePoint);
497
+ }
498
+ }
499
+ return 0;
500
+ }
501
+ function codePointWidth(codePoint) {
502
+ return isWideCodePoint(codePoint) ? 2 : 1;
503
+ }
504
+ function isWideCodePoint(codePoint) {
505
+ return codePoint >= 0x1100 && (codePoint <= 0x115f ||
506
+ codePoint === 0x2329 ||
507
+ codePoint === 0x232a ||
508
+ (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||
509
+ (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||
510
+ (codePoint >= 0xf900 && codePoint <= 0xfaff) ||
511
+ (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||
512
+ (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||
513
+ (codePoint >= 0xff00 && codePoint <= 0xff60) ||
514
+ (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||
515
+ (codePoint >= 0x1f300 && codePoint <= 0x1faff));
516
+ }
517
+ function isEmojiGrapheme(grapheme) {
518
+ for (const char of grapheme) {
519
+ const codePoint = char.codePointAt(0);
520
+ if (codePoint === undefined)
521
+ continue;
522
+ if ((codePoint >= 0x1f000 && codePoint <= 0x1faff)
523
+ || (codePoint >= 0x2600 && codePoint <= 0x27bf)
524
+ || codePoint === 0xfe0f
525
+ || codePoint === 0x200d) {
526
+ return true;
527
+ }
528
+ }
529
+ return false;
530
+ }
531
+ function isSingleRegionalIndicator(grapheme) {
532
+ const chars = Array.from(grapheme);
533
+ const codePoint = chars[0]?.codePointAt(0);
534
+ return chars.length === 1 && codePoint !== undefined && codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff;
535
+ }
536
+ function isZeroWidth(codePoint) {
537
+ return codePoint <= 0x1f
538
+ || (codePoint >= 0x7f && codePoint <= 0x9f)
539
+ || (codePoint >= 0x0300 && codePoint <= 0x036f)
540
+ || (codePoint >= 0x1ab0 && codePoint <= 0x1aff)
541
+ || (codePoint >= 0x1dc0 && codePoint <= 0x1dff)
542
+ || (codePoint >= 0x200b && codePoint <= 0x200f)
543
+ || (codePoint >= 0x202a && codePoint <= 0x202e)
544
+ || (codePoint >= 0x2060 && codePoint <= 0x206f)
545
+ || (codePoint >= 0xfe00 && codePoint <= 0xfe0f)
546
+ || (codePoint >= 0xfe20 && codePoint <= 0xfe2f)
547
+ || codePoint === 0xfeff
548
+ || codePoint === 0x00ad;
549
+ }
550
+ function safePromptColumns(terminalColumns) {
551
+ return Math.max(20, terminalColumns - 6);
552
+ }
553
+ //# sourceMappingURL=prompt-reader.js.map