indusagi 0.12.19 → 0.12.21

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 (518) hide show
  1. package/README.md +16 -36
  2. package/dist/agent/agent-loop.d.ts +3 -9
  3. package/dist/agent/agent-loop.d.ts.map +1 -1
  4. package/dist/agent/agent-loop.js +19 -58
  5. package/dist/agent/agent-loop.js.map +1 -1
  6. package/dist/agent/agent.d.ts +9 -10
  7. package/dist/agent/agent.d.ts.map +1 -1
  8. package/dist/agent/agent.js +182 -129
  9. package/dist/agent/agent.js.map +1 -1
  10. package/dist/agent/error-handler.d.ts.map +1 -1
  11. package/dist/agent/error-handler.js.map +1 -1
  12. package/dist/agent/event-bus.d.ts.map +1 -1
  13. package/dist/agent/event-bus.js +1 -3
  14. package/dist/agent/event-bus.js.map +1 -1
  15. package/dist/agent/index.d.ts.map +1 -1
  16. package/dist/agent/index.js +0 -6
  17. package/dist/agent/index.js.map +1 -1
  18. package/dist/agent/messages.d.ts +1 -1
  19. package/dist/agent/messages.d.ts.map +1 -1
  20. package/dist/agent/proxy.d.ts +1 -14
  21. package/dist/agent/proxy.d.ts.map +1 -1
  22. package/dist/agent/proxy.js +67 -148
  23. package/dist/agent/proxy.js.map +1 -1
  24. package/dist/agent/session-manager.d.ts +10 -10
  25. package/dist/agent/session-manager.d.ts.map +1 -1
  26. package/dist/agent/session-manager.js +20 -16
  27. package/dist/agent/session-manager.js.map +1 -1
  28. package/dist/agent/state-manager.d.ts +1 -1
  29. package/dist/agent/state-manager.d.ts.map +1 -1
  30. package/dist/agent/state-manager.js +1 -0
  31. package/dist/agent/state-manager.js.map +1 -1
  32. package/dist/agent/telemetry.d.ts.map +1 -1
  33. package/dist/agent/telemetry.js +1 -3
  34. package/dist/agent/telemetry.js.map +1 -1
  35. package/dist/agent/tools/bash.d.ts.map +1 -1
  36. package/dist/agent/tools/bash.js +143 -118
  37. package/dist/agent/tools/bash.js.map +1 -1
  38. package/dist/agent/tools/edit-diff.d.ts +1 -1
  39. package/dist/agent/tools/edit-diff.d.ts.map +1 -1
  40. package/dist/agent/tools/edit-diff.js +189 -175
  41. package/dist/agent/tools/edit-diff.js.map +1 -1
  42. package/dist/agent/tools/edit.d.ts.map +1 -1
  43. package/dist/agent/tools/edit.js +137 -121
  44. package/dist/agent/tools/edit.js.map +1 -1
  45. package/dist/agent/tools/find.d.ts.map +1 -1
  46. package/dist/agent/tools/find.js +100 -65
  47. package/dist/agent/tools/find.js.map +1 -1
  48. package/dist/agent/tools/grep.d.ts.map +1 -1
  49. package/dist/agent/tools/grep.js +126 -97
  50. package/dist/agent/tools/grep.js.map +1 -1
  51. package/dist/agent/tools/index.d.ts +53 -40
  52. package/dist/agent/tools/index.d.ts.map +1 -1
  53. package/dist/agent/tools/index.js +19 -12
  54. package/dist/agent/tools/index.js.map +1 -1
  55. package/dist/agent/tools/ls.d.ts +2 -1
  56. package/dist/agent/tools/ls.d.ts.map +1 -1
  57. package/dist/agent/tools/ls.js +145 -94
  58. package/dist/agent/tools/ls.js.map +1 -1
  59. package/dist/agent/tools/path-utils.d.ts.map +1 -1
  60. package/dist/agent/tools/path-utils.js +48 -29
  61. package/dist/agent/tools/path-utils.js.map +1 -1
  62. package/dist/agent/tools/process-controller.d.ts +15 -0
  63. package/dist/agent/tools/process-controller.d.ts.map +1 -0
  64. package/dist/agent/tools/process-controller.js +39 -0
  65. package/dist/agent/tools/process-controller.js.map +1 -0
  66. package/dist/agent/tools/process-manager.d.ts +60 -0
  67. package/dist/agent/tools/process-manager.d.ts.map +1 -0
  68. package/dist/agent/tools/process-manager.js +485 -0
  69. package/dist/agent/tools/process-manager.js.map +1 -0
  70. package/dist/agent/tools/process-types.d.ts +74 -0
  71. package/dist/agent/tools/process-types.d.ts.map +1 -0
  72. package/dist/agent/tools/process-types.js +7 -0
  73. package/dist/agent/tools/process-types.js.map +1 -0
  74. package/dist/agent/tools/process.d.ts +38 -0
  75. package/dist/agent/tools/process.d.ts.map +1 -0
  76. package/dist/agent/tools/process.js +360 -0
  77. package/dist/agent/tools/process.js.map +1 -0
  78. package/dist/agent/tools/read.d.ts.map +1 -1
  79. package/dist/agent/tools/read.js +157 -135
  80. package/dist/agent/tools/read.js.map +1 -1
  81. package/dist/agent/tools/registry.js +2 -4
  82. package/dist/agent/tools/registry.js.map +1 -1
  83. package/dist/agent/tools/teams/activity-tracker.d.ts +66 -0
  84. package/dist/agent/tools/teams/activity-tracker.d.ts.map +1 -0
  85. package/dist/agent/tools/teams/activity-tracker.js +480 -0
  86. package/dist/agent/tools/teams/activity-tracker.js.map +1 -0
  87. package/dist/agent/tools/teams/cleanup.d.ts +51 -0
  88. package/dist/agent/tools/teams/cleanup.d.ts.map +1 -0
  89. package/dist/agent/tools/teams/cleanup.js +219 -0
  90. package/dist/agent/tools/teams/cleanup.js.map +1 -0
  91. package/dist/agent/tools/teams/fs-lock.d.ts +12 -0
  92. package/dist/agent/tools/teams/fs-lock.d.ts.map +1 -0
  93. package/dist/agent/tools/teams/fs-lock.js +74 -0
  94. package/dist/agent/tools/teams/fs-lock.js.map +1 -0
  95. package/dist/agent/tools/teams/index.d.ts +12 -0
  96. package/dist/agent/tools/teams/index.d.ts.map +1 -0
  97. package/dist/agent/tools/teams/index.js +12 -0
  98. package/dist/agent/tools/teams/index.js.map +1 -0
  99. package/dist/agent/tools/teams/mailbox.d.ts +21 -0
  100. package/dist/agent/tools/teams/mailbox.d.ts.map +1 -0
  101. package/dist/agent/tools/teams/mailbox.js +106 -0
  102. package/dist/agent/tools/teams/mailbox.js.map +1 -0
  103. package/dist/agent/tools/teams/model-policy.d.ts +23 -0
  104. package/dist/agent/tools/teams/model-policy.d.ts.map +1 -0
  105. package/dist/agent/tools/teams/model-policy.js +113 -0
  106. package/dist/agent/tools/teams/model-policy.js.map +1 -0
  107. package/dist/agent/tools/teams/names.d.ts +28 -0
  108. package/dist/agent/tools/teams/names.d.ts.map +1 -0
  109. package/dist/agent/tools/teams/names.js +109 -0
  110. package/dist/agent/tools/teams/names.js.map +1 -0
  111. package/dist/agent/tools/teams/protocol.d.ts +75 -0
  112. package/dist/agent/tools/teams/protocol.d.ts.map +1 -0
  113. package/dist/agent/tools/teams/protocol.js +205 -0
  114. package/dist/agent/tools/teams/protocol.js.map +1 -0
  115. package/dist/agent/tools/teams/task-store.d.ts +89 -0
  116. package/dist/agent/tools/teams/task-store.d.ts.map +1 -0
  117. package/dist/agent/tools/teams/task-store.js +445 -0
  118. package/dist/agent/tools/teams/task-store.js.map +1 -0
  119. package/dist/agent/tools/teams/team-attach-claim.d.ts +36 -0
  120. package/dist/agent/tools/teams/team-attach-claim.d.ts.map +1 -0
  121. package/dist/agent/tools/teams/team-attach-claim.js +144 -0
  122. package/dist/agent/tools/teams/team-attach-claim.js.map +1 -0
  123. package/dist/agent/tools/teams/team-config.d.ts +55 -0
  124. package/dist/agent/tools/teams/team-config.d.ts.map +1 -0
  125. package/dist/agent/tools/teams/team-config.js +252 -0
  126. package/dist/agent/tools/teams/team-config.js.map +1 -0
  127. package/dist/agent/tools/teams/worktree.d.ts +40 -0
  128. package/dist/agent/tools/teams/worktree.d.ts.map +1 -0
  129. package/dist/agent/tools/teams/worktree.js +213 -0
  130. package/dist/agent/tools/teams/worktree.js.map +1 -0
  131. package/dist/agent/tools/todo-store.js +2 -1
  132. package/dist/agent/tools/todo-store.js.map +1 -1
  133. package/dist/agent/tools/todo.d.ts +2 -2
  134. package/dist/agent/tools/todo.js +2 -2
  135. package/dist/agent/tools/truncate.d.ts.map +1 -1
  136. package/dist/agent/tools/truncate.js +150 -134
  137. package/dist/agent/tools/truncate.js.map +1 -1
  138. package/dist/agent/tools/utils/hook-runner.d.ts +9 -10
  139. package/dist/agent/tools/utils/hook-runner.d.ts.map +1 -1
  140. package/dist/agent/tools/utils/hook-runner.js +18 -16
  141. package/dist/agent/tools/utils/hook-runner.js.map +1 -1
  142. package/dist/agent/tools/utils/image-resize.d.ts +1 -14
  143. package/dist/agent/tools/utils/image-resize.d.ts.map +1 -1
  144. package/dist/agent/tools/utils/image-resize.js +80 -34
  145. package/dist/agent/tools/utils/image-resize.js.map +1 -1
  146. package/dist/agent/tools/utils/mime.d.ts +0 -8
  147. package/dist/agent/tools/utils/mime.d.ts.map +1 -1
  148. package/dist/agent/tools/utils/mime.js +43 -32
  149. package/dist/agent/tools/utils/mime.js.map +1 -1
  150. package/dist/agent/tools/utils/shell.d.ts +1 -23
  151. package/dist/agent/tools/utils/shell.d.ts.map +1 -1
  152. package/dist/agent/tools/utils/shell.js +43 -86
  153. package/dist/agent/tools/utils/shell.js.map +1 -1
  154. package/dist/agent/tools/write.d.ts.map +1 -1
  155. package/dist/agent/tools/write.js +105 -62
  156. package/dist/agent/tools/write.js.map +1 -1
  157. package/dist/agent/types.d.ts +69 -64
  158. package/dist/agent/types.d.ts.map +1 -1
  159. package/dist/agent/types.js +38 -23
  160. package/dist/agent/types.js.map +1 -1
  161. package/dist/agent.d.ts +4 -0
  162. package/dist/agent.d.ts.map +1 -1
  163. package/dist/agent.js +4 -0
  164. package/dist/agent.js.map +1 -1
  165. package/dist/ai/api-registry.d.ts.map +1 -1
  166. package/dist/ai/api-registry.js +3 -4
  167. package/dist/ai/api-registry.js.map +1 -1
  168. package/dist/ai/cli.js +62 -82
  169. package/dist/ai/cli.js.map +1 -1
  170. package/dist/ai/env-api-keys.d.ts.map +1 -1
  171. package/dist/ai/env-api-keys.js +78 -81
  172. package/dist/ai/env-api-keys.js.map +1 -1
  173. package/dist/ai/index.d.ts +6 -0
  174. package/dist/ai/index.d.ts.map +1 -1
  175. package/dist/ai/index.js +6 -0
  176. package/dist/ai/index.js.map +1 -1
  177. package/dist/ai/models.d.ts +7 -17
  178. package/dist/ai/models.d.ts.map +1 -1
  179. package/dist/ai/models.generated.d.ts +19 -0
  180. package/dist/ai/models.generated.d.ts.map +1 -1
  181. package/dist/ai/models.generated.js +14 -2
  182. package/dist/ai/models.generated.js.map +1 -1
  183. package/dist/ai/models.js +17 -11
  184. package/dist/ai/models.js.map +1 -1
  185. package/dist/ai/providers/amazon-bedrock.d.ts.map +1 -1
  186. package/dist/ai/providers/amazon-bedrock.js +319 -248
  187. package/dist/ai/providers/amazon-bedrock.js.map +1 -1
  188. package/dist/ai/providers/anthropic.d.ts.map +1 -1
  189. package/dist/ai/providers/anthropic.js +378 -324
  190. package/dist/ai/providers/anthropic.js.map +1 -1
  191. package/dist/ai/providers/azure-openai-responses.d.ts.map +1 -1
  192. package/dist/ai/providers/azure-openai-responses.js +164 -123
  193. package/dist/ai/providers/azure-openai-responses.js.map +1 -1
  194. package/dist/ai/providers/google-shared.d.ts +0 -18
  195. package/dist/ai/providers/google-shared.d.ts.map +1 -1
  196. package/dist/ai/providers/google-shared.js +224 -225
  197. package/dist/ai/providers/google-shared.js.map +1 -1
  198. package/dist/ai/providers/google-vertex.d.ts.map +1 -1
  199. package/dist/ai/providers/google-vertex.js +244 -226
  200. package/dist/ai/providers/google-vertex.js.map +1 -1
  201. package/dist/ai/providers/google.d.ts +3 -0
  202. package/dist/ai/providers/google.d.ts.map +1 -1
  203. package/dist/ai/providers/google.js +232 -210
  204. package/dist/ai/providers/google.js.map +1 -1
  205. package/dist/ai/providers/kimi.js +1 -0
  206. package/dist/ai/providers/kimi.js.map +1 -1
  207. package/dist/ai/providers/mock.d.ts +10 -0
  208. package/dist/ai/providers/mock.d.ts.map +1 -0
  209. package/dist/ai/providers/mock.js +64 -0
  210. package/dist/ai/providers/mock.js.map +1 -0
  211. package/dist/ai/providers/openai-codex-responses.d.ts.map +1 -1
  212. package/dist/ai/providers/openai-codex-responses.js +178 -133
  213. package/dist/ai/providers/openai-codex-responses.js.map +1 -1
  214. package/dist/ai/providers/openai-completions.d.ts.map +1 -1
  215. package/dist/ai/providers/openai-completions.js +468 -387
  216. package/dist/ai/providers/openai-completions.js.map +1 -1
  217. package/dist/ai/providers/openai-responses-shared.d.ts.map +1 -1
  218. package/dist/ai/providers/openai-responses-shared.js +187 -166
  219. package/dist/ai/providers/openai-responses-shared.js.map +1 -1
  220. package/dist/ai/providers/openai-responses.d.ts.map +1 -1
  221. package/dist/ai/providers/openai-responses.js +108 -85
  222. package/dist/ai/providers/openai-responses.js.map +1 -1
  223. package/dist/ai/providers/openai-scaffold.d.ts +4 -0
  224. package/dist/ai/providers/openai-scaffold.d.ts.map +1 -0
  225. package/dist/ai/providers/openai-scaffold.js +33 -0
  226. package/dist/ai/providers/openai-scaffold.js.map +1 -0
  227. package/dist/ai/providers/register-builtins.d.ts.map +1 -1
  228. package/dist/ai/providers/register-builtins.js +109 -42
  229. package/dist/ai/providers/register-builtins.js.map +1 -1
  230. package/dist/ai/providers/simple-options.js +2 -0
  231. package/dist/ai/providers/simple-options.js.map +1 -1
  232. package/dist/ai/providers/transform-messages.js +3 -9
  233. package/dist/ai/providers/transform-messages.js.map +1 -1
  234. package/dist/ai/stream.d.ts +4 -14
  235. package/dist/ai/stream.d.ts.map +1 -1
  236. package/dist/ai/stream.js +0 -36
  237. package/dist/ai/stream.js.map +1 -1
  238. package/dist/ai/types.d.ts +22 -3
  239. package/dist/ai/types.d.ts.map +1 -1
  240. package/dist/ai/types.js +154 -77
  241. package/dist/ai/types.js.map +1 -1
  242. package/dist/ai/utils/base-stream-handler.js +1 -0
  243. package/dist/ai/utils/base-stream-handler.js.map +1 -1
  244. package/dist/ai/utils/event-stream.d.ts +2 -0
  245. package/dist/ai/utils/event-stream.d.ts.map +1 -1
  246. package/dist/ai/utils/event-stream.js +22 -5
  247. package/dist/ai/utils/event-stream.js.map +1 -1
  248. package/dist/ai/utils/json-parse.d.ts +3 -0
  249. package/dist/ai/utils/json-parse.d.ts.map +1 -1
  250. package/dist/ai/utils/json-parse.js +8 -5
  251. package/dist/ai/utils/json-parse.js.map +1 -1
  252. package/dist/ai/utils/oauth/anthropic.d.ts.map +1 -1
  253. package/dist/ai/utils/oauth/anthropic.js +110 -65
  254. package/dist/ai/utils/oauth/anthropic.js.map +1 -1
  255. package/dist/ai/utils/oauth/github-copilot.d.ts +8 -16
  256. package/dist/ai/utils/oauth/github-copilot.d.ts.map +1 -1
  257. package/dist/ai/utils/oauth/github-copilot.js +218 -227
  258. package/dist/ai/utils/oauth/github-copilot.js.map +1 -1
  259. package/dist/ai/utils/oauth/openai-codex.d.ts +4 -2
  260. package/dist/ai/utils/oauth/openai-codex.d.ts.map +1 -1
  261. package/dist/ai/utils/oauth/openai-codex.js +221 -236
  262. package/dist/ai/utils/oauth/openai-codex.js.map +1 -1
  263. package/dist/ai/utils/oauth/pkce.d.ts +6 -5
  264. package/dist/ai/utils/oauth/pkce.d.ts.map +1 -1
  265. package/dist/ai/utils/oauth/pkce.js +24 -21
  266. package/dist/ai/utils/oauth/pkce.js.map +1 -1
  267. package/dist/ai/utils/oauth/types.d.ts +31 -12
  268. package/dist/ai/utils/oauth/types.d.ts.map +1 -1
  269. package/dist/ai/utils/oauth/types.js +10 -1
  270. package/dist/ai/utils/oauth/types.js.map +1 -1
  271. package/dist/ai/utils/overflow.d.ts.map +1 -1
  272. package/dist/ai/utils/overflow.js +49 -21
  273. package/dist/ai/utils/overflow.js.map +1 -1
  274. package/dist/ai/utils/provider-adapter.js +9 -0
  275. package/dist/ai/utils/provider-adapter.js.map +1 -1
  276. package/dist/ai/utils/provider-client-builder.js +1 -1
  277. package/dist/ai/utils/provider-client-builder.js.map +1 -1
  278. package/dist/ai/utils/provider-errors.js +2 -0
  279. package/dist/ai/utils/provider-errors.js.map +1 -1
  280. package/dist/ai/utils/sanitize-unicode.d.ts +0 -20
  281. package/dist/ai/utils/sanitize-unicode.d.ts.map +1 -1
  282. package/dist/ai/utils/sanitize-unicode.js +35 -17
  283. package/dist/ai/utils/sanitize-unicode.js.map +1 -1
  284. package/dist/ai/utils/stream-event-helper.js +3 -0
  285. package/dist/ai/utils/stream-event-helper.js.map +1 -1
  286. package/dist/ai/utils/stream-handler-types.js +5 -0
  287. package/dist/ai/utils/stream-handler-types.js.map +1 -1
  288. package/dist/ai/utils/streaming-state-manager.js +4 -2
  289. package/dist/ai/utils/streaming-state-manager.js.map +1 -1
  290. package/dist/ai/utils/typebox-helpers.d.ts +6 -4
  291. package/dist/ai/utils/typebox-helpers.d.ts.map +1 -1
  292. package/dist/ai/utils/typebox-helpers.js +25 -7
  293. package/dist/ai/utils/typebox-helpers.js.map +1 -1
  294. package/dist/ai/utils/validation.d.ts.map +1 -1
  295. package/dist/ai/utils/validation.js +67 -34
  296. package/dist/ai/utils/validation.js.map +1 -1
  297. package/dist/ai.d.ts +4 -0
  298. package/dist/ai.d.ts.map +1 -1
  299. package/dist/ai.js +4 -0
  300. package/dist/ai.js.map +1 -1
  301. package/dist/cli.d.ts +3 -0
  302. package/dist/cli.d.ts.map +1 -0
  303. package/dist/cli.js +3 -0
  304. package/dist/cli.js.map +1 -0
  305. package/dist/index.d.ts +1 -0
  306. package/dist/index.d.ts.map +1 -1
  307. package/dist/index.js +1 -0
  308. package/dist/index.js.map +1 -1
  309. package/dist/mcp/client-pool.js +3 -2
  310. package/dist/mcp/client-pool.js.map +1 -1
  311. package/dist/mcp/client.js +19 -6
  312. package/dist/mcp/client.js.map +1 -1
  313. package/dist/mcp/config.d.ts +6 -6
  314. package/dist/mcp/config.js +17 -17
  315. package/dist/mcp/config.js.map +1 -1
  316. package/dist/mcp/errors.js +8 -0
  317. package/dist/mcp/errors.js.map +1 -1
  318. package/dist/mcp/index.d.ts +5 -5
  319. package/dist/mcp/index.js +5 -5
  320. package/dist/mcp/schema-converter.d.ts +1 -1
  321. package/dist/mcp/schema-converter.js +1 -1
  322. package/dist/mcp/server.d.ts +4 -4
  323. package/dist/mcp/server.js +12 -7
  324. package/dist/mcp/server.js.map +1 -1
  325. package/dist/mcp/tool-factory.d.ts +2 -2
  326. package/dist/mcp/tool-factory.js +2 -2
  327. package/dist/mcp.d.ts +0 -4
  328. package/dist/mcp.d.ts.map +1 -1
  329. package/dist/mcp.js +0 -4
  330. package/dist/mcp.js.map +1 -1
  331. package/dist/observability.d.ts +2 -0
  332. package/dist/observability.d.ts.map +1 -0
  333. package/dist/observability.js +2 -0
  334. package/dist/observability.js.map +1 -0
  335. package/dist/tui/autocomplete.d.ts +14 -18
  336. package/dist/tui/autocomplete.d.ts.map +1 -1
  337. package/dist/tui/autocomplete.js +290 -402
  338. package/dist/tui/autocomplete.js.map +1 -1
  339. package/dist/tui/components/box.d.ts +1 -6
  340. package/dist/tui/components/box.d.ts.map +1 -1
  341. package/dist/tui/components/box.js +98 -67
  342. package/dist/tui/components/box.js.map +1 -1
  343. package/dist/tui/components/cancellable-loader.d.ts +6 -3
  344. package/dist/tui/components/cancellable-loader.d.ts.map +1 -1
  345. package/dist/tui/components/cancellable-loader.js +8 -9
  346. package/dist/tui/components/cancellable-loader.js.map +1 -1
  347. package/dist/tui/components/editor.d.ts +18 -0
  348. package/dist/tui/components/editor.d.ts.map +1 -1
  349. package/dist/tui/components/editor.js +356 -354
  350. package/dist/tui/components/editor.js.map +1 -1
  351. package/dist/tui/components/image.d.ts +2 -0
  352. package/dist/tui/components/image.d.ts.map +1 -1
  353. package/dist/tui/components/image.js +79 -37
  354. package/dist/tui/components/image.js.map +1 -1
  355. package/dist/tui/components/input.d.ts +4 -8
  356. package/dist/tui/components/input.d.ts.map +1 -1
  357. package/dist/tui/components/input.js +236 -232
  358. package/dist/tui/components/input.js.map +1 -1
  359. package/dist/tui/components/loader.d.ts +5 -5
  360. package/dist/tui/components/loader.d.ts.map +1 -1
  361. package/dist/tui/components/loader.js +22 -19
  362. package/dist/tui/components/loader.js.map +1 -1
  363. package/dist/tui/components/markdown.d.ts +2 -32
  364. package/dist/tui/components/markdown.d.ts.map +1 -1
  365. package/dist/tui/components/markdown.js +338 -357
  366. package/dist/tui/components/markdown.js.map +1 -1
  367. package/dist/tui/components/select-list.d.ts +1 -0
  368. package/dist/tui/components/select-list.d.ts.map +1 -1
  369. package/dist/tui/components/select-list.js +83 -82
  370. package/dist/tui/components/select-list.js.map +1 -1
  371. package/dist/tui/components/settings-list.d.ts +10 -10
  372. package/dist/tui/components/settings-list.d.ts.map +1 -1
  373. package/dist/tui/components/settings-list.js +48 -40
  374. package/dist/tui/components/settings-list.js.map +1 -1
  375. package/dist/tui/components/spacer.d.ts +1 -0
  376. package/dist/tui/components/spacer.d.ts.map +1 -1
  377. package/dist/tui/components/spacer.js +20 -5
  378. package/dist/tui/components/spacer.js.map +1 -1
  379. package/dist/tui/components/text.d.ts.map +1 -1
  380. package/dist/tui/components/text.js +47 -20
  381. package/dist/tui/components/text.js.map +1 -1
  382. package/dist/tui/components/truncated-text.d.ts +8 -4
  383. package/dist/tui/components/truncated-text.d.ts.map +1 -1
  384. package/dist/tui/components/truncated-text.js +15 -12
  385. package/dist/tui/components/truncated-text.js.map +1 -1
  386. package/dist/tui/editor-component.d.ts +87 -23
  387. package/dist/tui/editor-component.d.ts.map +1 -1
  388. package/dist/tui/fuzzy.d.ts.map +1 -1
  389. package/dist/tui/fuzzy.js +101 -50
  390. package/dist/tui/fuzzy.js.map +1 -1
  391. package/dist/tui/keybindings.d.ts +3 -3
  392. package/dist/tui/keybindings.d.ts.map +1 -1
  393. package/dist/tui/keybindings.js +137 -111
  394. package/dist/tui/keybindings.js.map +1 -1
  395. package/dist/tui/keys.d.ts +46 -43
  396. package/dist/tui/keys.d.ts.map +1 -1
  397. package/dist/tui/keys.js +493 -411
  398. package/dist/tui/keys.js.map +1 -1
  399. package/dist/tui/stdin-buffer.d.ts.map +1 -1
  400. package/dist/tui/stdin-buffer.js +162 -159
  401. package/dist/tui/stdin-buffer.js.map +1 -1
  402. package/dist/tui/terminal-image.d.ts +10 -5
  403. package/dist/tui/terminal-image.d.ts.map +1 -1
  404. package/dist/tui/terminal-image.js +53 -51
  405. package/dist/tui/terminal-image.js.map +1 -1
  406. package/dist/tui/terminal.d.ts +4 -27
  407. package/dist/tui/terminal.d.ts.map +1 -1
  408. package/dist/tui/terminal.js +123 -121
  409. package/dist/tui/terminal.js.map +1 -1
  410. package/dist/tui/tui.d.ts +14 -1
  411. package/dist/tui/tui.d.ts.map +1 -1
  412. package/dist/tui/tui.js +185 -145
  413. package/dist/tui/tui.js.map +1 -1
  414. package/dist/tui/utils.d.ts.map +1 -1
  415. package/dist/tui/utils.js +235 -216
  416. package/dist/tui/utils.js.map +1 -1
  417. package/dist/tui.d.ts +4 -0
  418. package/dist/tui.d.ts.map +1 -1
  419. package/dist/tui.js +4 -0
  420. package/dist/tui.js.map +1 -1
  421. package/package.json +23 -43
  422. package/LICENSE.md +0 -22
  423. package/dist/agent/tools/task-types.d.ts +0 -74
  424. package/dist/agent/tools/task-types.d.ts.map +0 -1
  425. package/dist/agent/tools/task-types.js +0 -8
  426. package/dist/agent/tools/task-types.js.map +0 -1
  427. package/dist/agent/tools/task.d.ts +0 -84
  428. package/dist/agent/tools/task.d.ts.map +0 -1
  429. package/dist/agent/tools/task.js +0 -184
  430. package/dist/agent/tools/task.js.map +0 -1
  431. package/dist/memory/embedder/base.d.ts +0 -41
  432. package/dist/memory/embedder/base.d.ts.map +0 -1
  433. package/dist/memory/embedder/base.js +0 -10
  434. package/dist/memory/embedder/base.js.map +0 -1
  435. package/dist/memory/embedder/index.d.ts +0 -8
  436. package/dist/memory/embedder/index.d.ts.map +0 -1
  437. package/dist/memory/embedder/index.js +0 -6
  438. package/dist/memory/embedder/index.js.map +0 -1
  439. package/dist/memory/embedder/openai.d.ts +0 -35
  440. package/dist/memory/embedder/openai.d.ts.map +0 -1
  441. package/dist/memory/embedder/openai.js +0 -103
  442. package/dist/memory/embedder/openai.js.map +0 -1
  443. package/dist/memory/index.d.ts +0 -33
  444. package/dist/memory/index.d.ts.map +0 -1
  445. package/dist/memory/index.js +0 -31
  446. package/dist/memory/index.js.map +0 -1
  447. package/dist/memory/memory.d.ts +0 -126
  448. package/dist/memory/memory.d.ts.map +0 -1
  449. package/dist/memory/memory.js +0 -280
  450. package/dist/memory/memory.js.map +0 -1
  451. package/dist/memory/processors/base.d.ts +0 -42
  452. package/dist/memory/processors/base.d.ts.map +0 -1
  453. package/dist/memory/processors/base.js +0 -6
  454. package/dist/memory/processors/base.js.map +0 -1
  455. package/dist/memory/processors/index.d.ts +0 -16
  456. package/dist/memory/processors/index.d.ts.map +0 -1
  457. package/dist/memory/processors/index.js +0 -18
  458. package/dist/memory/processors/index.js.map +0 -1
  459. package/dist/memory/processors/message-history.d.ts +0 -35
  460. package/dist/memory/processors/message-history.d.ts.map +0 -1
  461. package/dist/memory/processors/message-history.js +0 -51
  462. package/dist/memory/processors/message-history.js.map +0 -1
  463. package/dist/memory/processors/observational-memory/index.d.ts +0 -82
  464. package/dist/memory/processors/observational-memory/index.d.ts.map +0 -1
  465. package/dist/memory/processors/observational-memory/index.js +0 -234
  466. package/dist/memory/processors/observational-memory/index.js.map +0 -1
  467. package/dist/memory/processors/observational-memory/observer-agent.d.ts +0 -64
  468. package/dist/memory/processors/observational-memory/observer-agent.d.ts.map +0 -1
  469. package/dist/memory/processors/observational-memory/observer-agent.js +0 -362
  470. package/dist/memory/processors/observational-memory/observer-agent.js.map +0 -1
  471. package/dist/memory/processors/observational-memory/reflector-agent.d.ts +0 -38
  472. package/dist/memory/processors/observational-memory/reflector-agent.d.ts.map +0 -1
  473. package/dist/memory/processors/observational-memory/reflector-agent.js +0 -213
  474. package/dist/memory/processors/observational-memory/reflector-agent.js.map +0 -1
  475. package/dist/memory/processors/observational-memory/token-counter.d.ts +0 -35
  476. package/dist/memory/processors/observational-memory/token-counter.d.ts.map +0 -1
  477. package/dist/memory/processors/observational-memory/token-counter.js +0 -90
  478. package/dist/memory/processors/observational-memory/token-counter.js.map +0 -1
  479. package/dist/memory/processors/semantic-recall.d.ts +0 -55
  480. package/dist/memory/processors/semantic-recall.d.ts.map +0 -1
  481. package/dist/memory/processors/semantic-recall.js +0 -143
  482. package/dist/memory/processors/semantic-recall.js.map +0 -1
  483. package/dist/memory/processors/working-memory.d.ts +0 -41
  484. package/dist/memory/processors/working-memory.d.ts.map +0 -1
  485. package/dist/memory/processors/working-memory.js +0 -82
  486. package/dist/memory/processors/working-memory.js.map +0 -1
  487. package/dist/memory/storage/base.d.ts +0 -288
  488. package/dist/memory/storage/base.d.ts.map +0 -1
  489. package/dist/memory/storage/base.js +0 -211
  490. package/dist/memory/storage/base.js.map +0 -1
  491. package/dist/memory/storage/index.d.ts +0 -9
  492. package/dist/memory/storage/index.d.ts.map +0 -1
  493. package/dist/memory/storage/index.js +0 -7
  494. package/dist/memory/storage/index.js.map +0 -1
  495. package/dist/memory/storage/inmemory.d.ts +0 -93
  496. package/dist/memory/storage/inmemory.d.ts.map +0 -1
  497. package/dist/memory/storage/inmemory.js +0 -646
  498. package/dist/memory/storage/inmemory.js.map +0 -1
  499. package/dist/memory/tools/working-memory.d.ts +0 -100
  500. package/dist/memory/tools/working-memory.d.ts.map +0 -1
  501. package/dist/memory/tools/working-memory.js +0 -237
  502. package/dist/memory/tools/working-memory.js.map +0 -1
  503. package/dist/memory/types.d.ts +0 -386
  504. package/dist/memory/types.d.ts.map +0 -1
  505. package/dist/memory/types.js +0 -58
  506. package/dist/memory/types.js.map +0 -1
  507. package/dist/memory/vector/base.d.ts +0 -145
  508. package/dist/memory/vector/base.d.ts.map +0 -1
  509. package/dist/memory/vector/base.js +0 -83
  510. package/dist/memory/vector/base.js.map +0 -1
  511. package/dist/memory/vector/index.d.ts +0 -8
  512. package/dist/memory/vector/index.d.ts.map +0 -1
  513. package/dist/memory/vector/index.js +0 -7
  514. package/dist/memory/vector/index.js.map +0 -1
  515. package/dist/memory/vector/inmemory.d.ts +0 -47
  516. package/dist/memory/vector/inmemory.d.ts.map +0 -1
  517. package/dist/memory/vector/inmemory.js +0 -234
  518. package/dist/memory/vector/inmemory.js.map +0 -1
package/dist/tui/utils.js CHANGED
@@ -32,7 +32,7 @@ export const textWidthCalculator = new TextWidthCalculator();
32
32
  * The tested Unicode blocks are deliberately broad to account for future
33
33
  * Unicode additions.
34
34
  */
35
- function couldBeEmoji(segment) {
35
+ function looksLikeEmojiCandidate(segment) {
36
36
  const cp = segment.codePointAt(0);
37
37
  return ((cp >= 0x1f000 && cp <= 0x1fbff) || // Emoji and Pictograph
38
38
  (cp >= 0x2300 && cp <= 0x23ff) || // Misc technical
@@ -43,9 +43,34 @@ function couldBeEmoji(segment) {
43
43
  );
44
44
  }
45
45
  // Regexes for character classification (same as string-width library)
46
- const zeroWidthRegex = /^(?:\p{Default_Ignorable_Code_Point}|\p{Control}|\p{Mark}|\p{Surrogate})+$/v;
47
- const leadingNonPrintingRegex = /^[\p{Default_Ignorable_Code_Point}\p{Control}\p{Format}\p{Mark}\p{Surrogate}]+/v;
48
- const rgiEmojiRegex = /^\p{RGI_Emoji}$/v;
46
+ // Use dynamic construction to keep compatibility with ts target < es2024 while
47
+ // still preferring Unicode Sets (v-flag) when available at runtime.
48
+ function createUnicodeRegex(vPattern, uFallback) {
49
+ try {
50
+ return new RegExp(vPattern, "v");
51
+ }
52
+ catch {
53
+ return new RegExp(uFallback, "u");
54
+ }
55
+ }
56
+ const zeroWidthRegex = createUnicodeRegex("^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$", "^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$");
57
+ const leadingNonPrintingRegex = createUnicodeRegex("^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+", "^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+");
58
+ const rgiEmojiRegex = createUnicodeRegex("^\\p{RGI_Emoji}$", "^\\p{Extended_Pictographic}$");
59
+ const AnsiStripper = {
60
+ strip(text) {
61
+ if (!text.includes("\x1b")) {
62
+ return text;
63
+ }
64
+ let cleaned = text;
65
+ // Strip SGR codes (\x1b[...m) and cursor codes (\x1b[...G/K/H/J)
66
+ cleaned = cleaned.replace(/\x1b\[[0-9;]*[mGKHJ]/g, "");
67
+ // Strip OSC 8 hyperlinks: \x1b]8;;URL\x07 and \x1b]8;;\x07
68
+ cleaned = cleaned.replace(/\x1b\]8;;[^\x07]*\x07/g, "");
69
+ // Strip APC sequences: \x1b_...\x07 or \x1b_...\x1b\\ (cursor marker)
70
+ cleaned = cleaned.replace(/\x1b_[^\x07\x1b]*(?:\x07|\x1b\\)/g, "");
71
+ return cleaned;
72
+ },
73
+ };
49
74
  // Cache for non-ASCII strings
50
75
  const WIDTH_CACHE_SIZE = 512;
51
76
  const widthCache = new Map();
@@ -54,13 +79,13 @@ const widthCache = new Map();
54
79
  * Based on code from the string-width library, but includes a possible-emoji
55
80
  * check to avoid running the RGI_Emoji regex unnecessarily.
56
81
  */
57
- function graphemeWidth(segment) {
82
+ function measureClusterWidth(segment) {
58
83
  // Zero-width clusters
59
84
  if (zeroWidthRegex.test(segment)) {
60
85
  return 0;
61
86
  }
62
87
  // Emoji check with pre-filter
63
- if (couldBeEmoji(segment) && rgiEmojiRegex.test(segment)) {
88
+ if (looksLikeEmojiCandidate(segment) && rgiEmojiRegex.test(segment)) {
64
89
  return 2;
65
90
  }
66
91
  // Get base visible codepoint
@@ -110,18 +135,11 @@ export function visibleWidth(str) {
110
135
  if (str.includes("\t")) {
111
136
  clean = clean.replace(/\t/g, " ");
112
137
  }
113
- if (clean.includes("\x1b")) {
114
- // Strip SGR codes (\x1b[...m) and cursor codes (\x1b[...G/K/H/J)
115
- clean = clean.replace(/\x1b\[[0-9;]*[mGKHJ]/g, "");
116
- // Strip OSC 8 hyperlinks: \x1b]8;;URL\x07 and \x1b]8;;\x07
117
- clean = clean.replace(/\x1b\]8;;[^\x07]*\x07/g, "");
118
- // Strip APC sequences: \x1b_...\x07 or \x1b_...\x1b\\ (used for cursor marker)
119
- clean = clean.replace(/\x1b_[^\x07\x1b]*(?:\x07|\x1b\\)/g, "");
120
- }
138
+ clean = AnsiStripper.strip(clean);
121
139
  // Calculate width
122
140
  let width = 0;
123
141
  for (const { segment } of segmenter.segment(clean)) {
124
- width += graphemeWidth(segment);
142
+ width += measureClusterWidth(segment);
125
143
  }
126
144
  // Cache result
127
145
  if (widthCache.size >= WIDTH_CACHE_SIZE) {
@@ -180,20 +198,17 @@ export function extractAnsiCode(str, pos) {
180
198
  /**
181
199
  * Track active ANSI SGR codes to preserve styling across line breaks.
182
200
  */
183
- class AnsiCodeTracker {
184
- constructor() {
185
- // Track individual attributes separately so we can reset them specifically
186
- this.bold = false;
187
- this.dim = false;
188
- this.italic = false;
189
- this.underline = false;
190
- this.blink = false;
191
- this.inverse = false;
192
- this.hidden = false;
193
- this.strikethrough = false;
194
- this.fgColor = null; // Stores the full code like "31" or "38;5;240"
195
- this.bgColor = null; // Stores the full code like "41" or "48;5;240"
196
- }
201
+ class AnsiStateTracker {
202
+ // Track individual attributes separately so we can reset them specifically
203
+ _bold = false;
204
+ _dim = false;
205
+ italic = false;
206
+ underline = false;
207
+ blink = false;
208
+ inverse = false;
209
+ hidden = false;
210
+ strikethrough = false;
211
+ _colors = { fg: null, bg: null };
197
212
  process(ansiCode) {
198
213
  if (!ansiCode.endsWith("m")) {
199
214
  return;
@@ -212,121 +227,127 @@ class AnsiCodeTracker {
212
227
  const parts = params.split(";");
213
228
  let i = 0;
214
229
  while (i < parts.length) {
215
- const code = Number.parseInt(parts[i], 10);
216
- // Handle 256-color and RGB codes which consume multiple parameters
217
- if (code === 38 || code === 48) {
218
- // 38;5;N (256 color fg) or 38;2;R;G;B (RGB fg)
219
- // 48;5;N (256 color bg) or 48;2;R;G;B (RGB bg)
220
- if (parts[i + 1] === "5" && parts[i + 2] !== undefined) {
221
- // 256 color: 38;5;N or 48;5;N
222
- const colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]}`;
223
- if (code === 38) {
224
- this.fgColor = colorCode;
225
- }
226
- else {
227
- this.bgColor = colorCode;
228
- }
229
- i += 3;
230
- continue;
231
- }
232
- else if (parts[i + 1] === "2" && parts[i + 4] !== undefined) {
233
- // RGB color: 38;2;R;G;B or 48;2;R;G;B
234
- const colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]};${parts[i + 3]};${parts[i + 4]}`;
235
- if (code === 38) {
236
- this.fgColor = colorCode;
237
- }
238
- else {
239
- this.bgColor = colorCode;
240
- }
241
- i += 5;
242
- continue;
243
- }
230
+ const code = Number.parseInt(parts[i] ?? "", 10);
231
+ if (Number.isNaN(code)) {
232
+ i++;
233
+ continue;
244
234
  }
245
- // Standard SGR codes
246
- switch (code) {
247
- case 0:
248
- this.reset();
249
- break;
250
- case 1:
251
- this.bold = true;
252
- break;
253
- case 2:
254
- this.dim = true;
255
- break;
256
- case 3:
257
- this.italic = true;
258
- break;
259
- case 4:
260
- this.underline = true;
261
- break;
262
- case 5:
263
- this.blink = true;
264
- break;
265
- case 7:
266
- this.inverse = true;
267
- break;
268
- case 8:
269
- this.hidden = true;
270
- break;
271
- case 9:
272
- this.strikethrough = true;
273
- break;
274
- case 21:
275
- this.bold = false;
276
- break; // Some terminals
277
- case 22:
278
- this.bold = false;
279
- this.dim = false;
280
- break;
281
- case 23:
282
- this.italic = false;
283
- break;
284
- case 24:
285
- this.underline = false;
286
- break;
287
- case 25:
288
- this.blink = false;
289
- break;
290
- case 27:
291
- this.inverse = false;
292
- break;
293
- case 28:
294
- this.hidden = false;
295
- break;
296
- case 29:
297
- this.strikethrough = false;
298
- break;
299
- case 39:
300
- this.fgColor = null;
301
- break; // Default fg
302
- case 49:
303
- this.bgColor = null;
304
- break; // Default bg
305
- default:
306
- // Standard foreground colors 30-37, 90-97
307
- if ((code >= 30 && code <= 37) || (code >= 90 && code <= 97)) {
308
- this.fgColor = String(code);
309
- }
310
- // Standard background colors 40-47, 100-107
311
- else if ((code >= 40 && code <= 47) || (code >= 100 && code <= 107)) {
312
- this.bgColor = String(code);
313
- }
314
- break;
235
+ const consumed = this.tryConsumeColorCode(parts, i, code);
236
+ if (consumed > 0) {
237
+ i += consumed;
238
+ continue;
315
239
  }
240
+ this.applyStandardCode(code);
316
241
  i++;
317
242
  }
318
243
  }
244
+ tryConsumeColorCode(parts, index, code) {
245
+ if (code !== 38 && code !== 48) {
246
+ return 0;
247
+ }
248
+ if (parts[index + 1] === "5" && parts[index + 2] !== undefined) {
249
+ const colorCode = `${parts[index]};${parts[index + 1]};${parts[index + 2]}`;
250
+ if (code === 38) {
251
+ this._colors.fg = colorCode;
252
+ }
253
+ else {
254
+ this._colors.bg = colorCode;
255
+ }
256
+ return 3;
257
+ }
258
+ if (parts[index + 1] === "2" && parts[index + 4] !== undefined) {
259
+ const colorCode = `${parts[index]};${parts[index + 1]};${parts[index + 2]};${parts[index + 3]};${parts[index + 4]}`;
260
+ if (code === 38) {
261
+ this._colors.fg = colorCode;
262
+ }
263
+ else {
264
+ this._colors.bg = colorCode;
265
+ }
266
+ return 5;
267
+ }
268
+ return 0;
269
+ }
270
+ applyStandardCode(code) {
271
+ switch (code) {
272
+ case 0:
273
+ this.reset();
274
+ return;
275
+ case 1:
276
+ this._bold = true;
277
+ return;
278
+ case 2:
279
+ this._dim = true;
280
+ return;
281
+ case 3:
282
+ this.italic = true;
283
+ return;
284
+ case 4:
285
+ this.underline = true;
286
+ return;
287
+ case 5:
288
+ this.blink = true;
289
+ return;
290
+ case 7:
291
+ this.inverse = true;
292
+ return;
293
+ case 8:
294
+ this.hidden = true;
295
+ return;
296
+ case 9:
297
+ this.strikethrough = true;
298
+ return;
299
+ case 21:
300
+ this._bold = false;
301
+ return;
302
+ case 22:
303
+ this._bold = false;
304
+ this._dim = false;
305
+ return;
306
+ case 23:
307
+ this.italic = false;
308
+ return;
309
+ case 24:
310
+ this.underline = false;
311
+ return;
312
+ case 25:
313
+ this.blink = false;
314
+ return;
315
+ case 27:
316
+ this.inverse = false;
317
+ return;
318
+ case 28:
319
+ this.hidden = false;
320
+ return;
321
+ case 29:
322
+ this.strikethrough = false;
323
+ return;
324
+ case 39:
325
+ this._colors.fg = null;
326
+ return;
327
+ case 49:
328
+ this._colors.bg = null;
329
+ return;
330
+ default:
331
+ if ((code >= 30 && code <= 37) || (code >= 90 && code <= 97)) {
332
+ this._colors.fg = String(code);
333
+ return;
334
+ }
335
+ if ((code >= 40 && code <= 47) || (code >= 100 && code <= 107)) {
336
+ this._colors.bg = String(code);
337
+ }
338
+ }
339
+ }
319
340
  reset() {
320
- this.bold = false;
321
- this.dim = false;
341
+ this._bold = false;
342
+ this._dim = false;
322
343
  this.italic = false;
323
344
  this.underline = false;
324
345
  this.blink = false;
325
346
  this.inverse = false;
326
347
  this.hidden = false;
327
348
  this.strikethrough = false;
328
- this.fgColor = null;
329
- this.bgColor = null;
349
+ this._colors.fg = null;
350
+ this._colors.bg = null;
330
351
  }
331
352
  /** Clear all state for reuse. */
332
353
  clear() {
@@ -334,9 +355,9 @@ class AnsiCodeTracker {
334
355
  }
335
356
  getActiveCodes() {
336
357
  const codes = [];
337
- if (this.bold)
358
+ if (this._bold)
338
359
  codes.push("1");
339
- if (this.dim)
360
+ if (this._dim)
340
361
  codes.push("2");
341
362
  if (this.italic)
342
363
  codes.push("3");
@@ -350,25 +371,25 @@ class AnsiCodeTracker {
350
371
  codes.push("8");
351
372
  if (this.strikethrough)
352
373
  codes.push("9");
353
- if (this.fgColor)
354
- codes.push(this.fgColor);
355
- if (this.bgColor)
356
- codes.push(this.bgColor);
374
+ if (this._colors.fg)
375
+ codes.push(this._colors.fg);
376
+ if (this._colors.bg)
377
+ codes.push(this._colors.bg);
357
378
  if (codes.length === 0)
358
379
  return "";
359
380
  return `\x1b[${codes.join(";")}m`;
360
381
  }
361
382
  hasActiveCodes() {
362
- return (this.bold ||
363
- this.dim ||
383
+ return (this._bold ||
384
+ this._dim ||
364
385
  this.italic ||
365
386
  this.underline ||
366
387
  this.blink ||
367
388
  this.inverse ||
368
389
  this.hidden ||
369
390
  this.strikethrough ||
370
- this.fgColor !== null ||
371
- this.bgColor !== null);
391
+ this._colors.fg !== null ||
392
+ this._colors.bg !== null);
372
393
  }
373
394
  /**
374
395
  * Get reset codes for attributes that need to be turned off at line end,
@@ -384,7 +405,7 @@ class AnsiCodeTracker {
384
405
  return "";
385
406
  }
386
407
  }
387
- function updateTrackerFromText(text, tracker) {
408
+ function mergeTextIntoTracker(text, tracker) {
388
409
  let i = 0;
389
410
  while (i < text.length) {
390
411
  const ansiResult = extractAnsiCode(text, i);
@@ -400,7 +421,7 @@ function updateTrackerFromText(text, tracker) {
400
421
  /**
401
422
  * Split text into words while keeping ANSI codes attached.
402
423
  */
403
- function splitIntoTokensWithAnsi(text) {
424
+ function tokenizeTextWithAnsi(text) {
404
425
  const tokens = [];
405
426
  let current = "";
406
427
  let pendingAnsi = ""; // ANSI codes waiting to be attached to next visible content
@@ -451,9 +472,7 @@ function splitIntoTokensWithAnsi(text) {
451
472
  * @returns Array of wrapped lines (NOT padded to width)
452
473
  */
453
474
  export class AnsiCodeManager {
454
- constructor() {
455
- this.tracker = new AnsiCodeTracker();
456
- }
475
+ tracker = new AnsiStateTracker();
457
476
  process(ansiCode) {
458
477
  this.tracker.process(ansiCode);
459
478
  }
@@ -470,6 +489,57 @@ export class TextWrapper {
470
489
  }
471
490
  }
472
491
  export const textWrapper = new TextWrapper();
492
+ const TokenWrapEngine = {
493
+ wrap(tokens, width, tracker) {
494
+ const wrapped = [];
495
+ let currentLine = "";
496
+ let currentVisibleLength = 0;
497
+ for (const token of tokens) {
498
+ const tokenVisibleLength = visibleWidth(token);
499
+ const isWhitespace = token.trim() === "";
500
+ // Token itself is too long - break it character by character
501
+ if (tokenVisibleLength > width && !isWhitespace) {
502
+ if (currentLine) {
503
+ const lineEndReset = tracker.getLineEndReset();
504
+ if (lineEndReset) {
505
+ currentLine += lineEndReset;
506
+ }
507
+ wrapped.push(currentLine);
508
+ currentLine = "";
509
+ currentVisibleLength = 0;
510
+ }
511
+ const broken = splitLongToken(token, width, tracker);
512
+ wrapped.push(...broken.slice(0, -1));
513
+ currentLine = broken[broken.length - 1];
514
+ currentVisibleLength = visibleWidth(currentLine);
515
+ continue;
516
+ }
517
+ const totalNeeded = currentVisibleLength + tokenVisibleLength;
518
+ if (totalNeeded > width && currentVisibleLength > 0) {
519
+ let lineToWrap = currentLine.trimEnd();
520
+ const lineEndReset = tracker.getLineEndReset();
521
+ if (lineEndReset) {
522
+ lineToWrap += lineEndReset;
523
+ }
524
+ wrapped.push(lineToWrap);
525
+ if (isWhitespace) {
526
+ currentLine = tracker.getActiveCodes();
527
+ currentVisibleLength = 0;
528
+ }
529
+ else {
530
+ currentLine = tracker.getActiveCodes() + token;
531
+ currentVisibleLength = tokenVisibleLength;
532
+ }
533
+ }
534
+ else {
535
+ currentLine += token;
536
+ currentVisibleLength += tokenVisibleLength;
537
+ }
538
+ mergeTextIntoTracker(token, tracker);
539
+ }
540
+ return { wrapped, currentLine, currentVisibleLength };
541
+ },
542
+ };
473
543
  export function wrapTextWithAnsi(text, width) {
474
544
  if (!text) {
475
545
  return [""];
@@ -478,17 +548,17 @@ export function wrapTextWithAnsi(text, width) {
478
548
  // Track ANSI state across lines so styles carry over after literal newlines
479
549
  const inputLines = text.split("\n");
480
550
  const result = [];
481
- const tracker = new AnsiCodeTracker();
551
+ const tracker = new AnsiStateTracker();
482
552
  for (const inputLine of inputLines) {
483
553
  // Prepend active ANSI codes from previous lines (except for first line)
484
554
  const prefix = result.length > 0 ? tracker.getActiveCodes() : "";
485
- result.push(...wrapSingleLine(prefix + inputLine, width));
555
+ result.push(...wrapLinePreservingAnsi(prefix + inputLine, width));
486
556
  // Update tracker with codes from this line for next iteration
487
- updateTrackerFromText(inputLine, tracker);
557
+ mergeTextIntoTracker(inputLine, tracker);
488
558
  }
489
559
  return result.length > 0 ? result : [""];
490
560
  }
491
- function wrapSingleLine(line, width) {
561
+ function wrapLinePreservingAnsi(line, width) {
492
562
  if (!line) {
493
563
  return [""];
494
564
  }
@@ -496,66 +566,15 @@ function wrapSingleLine(line, width) {
496
566
  if (visibleLength <= width) {
497
567
  return [line];
498
568
  }
499
- const wrapped = [];
500
- const tracker = new AnsiCodeTracker();
501
- const tokens = splitIntoTokensWithAnsi(line);
502
- let currentLine = "";
503
- let currentVisibleLength = 0;
504
- for (const token of tokens) {
505
- const tokenVisibleLength = visibleWidth(token);
506
- const isWhitespace = token.trim() === "";
507
- // Token itself is too long - break it character by character
508
- if (tokenVisibleLength > width && !isWhitespace) {
509
- if (currentLine) {
510
- // Add specific reset for underline only (preserves background)
511
- const lineEndReset = tracker.getLineEndReset();
512
- if (lineEndReset) {
513
- currentLine += lineEndReset;
514
- }
515
- wrapped.push(currentLine);
516
- currentLine = "";
517
- currentVisibleLength = 0;
518
- }
519
- // Break long token - breakLongWord handles its own resets
520
- const broken = breakLongWord(token, width, tracker);
521
- wrapped.push(...broken.slice(0, -1));
522
- currentLine = broken[broken.length - 1];
523
- currentVisibleLength = visibleWidth(currentLine);
524
- continue;
525
- }
526
- // Check if adding this token would exceed width
527
- const totalNeeded = currentVisibleLength + tokenVisibleLength;
528
- if (totalNeeded > width && currentVisibleLength > 0) {
529
- // Trim trailing whitespace, then add underline reset (not full reset, to preserve background)
530
- let lineToWrap = currentLine.trimEnd();
531
- const lineEndReset = tracker.getLineEndReset();
532
- if (lineEndReset) {
533
- lineToWrap += lineEndReset;
534
- }
535
- wrapped.push(lineToWrap);
536
- if (isWhitespace) {
537
- // Don't start new line with whitespace
538
- currentLine = tracker.getActiveCodes();
539
- currentVisibleLength = 0;
540
- }
541
- else {
542
- currentLine = tracker.getActiveCodes() + token;
543
- currentVisibleLength = tokenVisibleLength;
544
- }
545
- }
546
- else {
547
- // Add to current line
548
- currentLine += token;
549
- currentVisibleLength += tokenVisibleLength;
550
- }
551
- updateTrackerFromText(token, tracker);
552
- }
569
+ const tracker = new AnsiStateTracker();
570
+ const tokens = tokenizeTextWithAnsi(line);
571
+ const { wrapped, currentLine } = TokenWrapEngine.wrap(tokens, width, tracker);
553
572
  if (currentLine) {
554
573
  // No reset at end of final line - let caller handle it
555
574
  wrapped.push(currentLine);
556
575
  }
557
576
  // Trailing whitespace can cause lines to exceed the requested width
558
- return wrapped.length > 0 ? wrapped.map((line) => line.trimEnd()) : [""];
577
+ return wrapped.length > 0 ? wrapped.map((segmentLine) => segmentLine.trimEnd()) : [""];
559
578
  }
560
579
  const PUNCTUATION_REGEX = /[(){}[\]<>.,;:'"!?+\-=*/\\|&%^$#@~`]/;
561
580
  /**
@@ -570,7 +589,7 @@ export function isWhitespaceChar(char) {
570
589
  export function isPunctuationChar(char) {
571
590
  return PUNCTUATION_REGEX.test(char);
572
591
  }
573
- function breakLongWord(word, width, tracker) {
592
+ function splitLongToken(word, width, tracker) {
574
593
  const lines = [];
575
594
  let currentLine = tracker.getActiveCodes();
576
595
  let currentWidth = 0;
@@ -612,8 +631,8 @@ function breakLongWord(word, width, tracker) {
612
631
  // Skip empty graphemes to avoid issues with string-width calculation
613
632
  if (!grapheme)
614
633
  continue;
615
- const graphemeWidth = visibleWidth(grapheme);
616
- if (currentWidth + graphemeWidth > width) {
634
+ const clusterWidth = visibleWidth(grapheme);
635
+ if (currentWidth + clusterWidth > width) {
617
636
  // Add specific reset for underline only (preserves background)
618
637
  const lineEndReset = tracker.getLineEndReset();
619
638
  if (lineEndReset) {
@@ -624,7 +643,7 @@ function breakLongWord(word, width, tracker) {
624
643
  currentWidth = 0;
625
644
  }
626
645
  currentLine += grapheme;
627
- currentWidth += graphemeWidth;
646
+ currentWidth += clusterWidth;
628
647
  }
629
648
  if (currentLine) {
630
649
  // No reset at end of final segment - caller handles continuation
@@ -708,12 +727,12 @@ export function truncateToWidth(text, maxWidth, ellipsis = "...", pad = false) {
708
727
  // Skip empty graphemes to avoid issues with string-width calculation
709
728
  if (!grapheme)
710
729
  continue;
711
- const graphemeWidth = visibleWidth(grapheme);
712
- if (currentWidth + graphemeWidth > targetWidth) {
730
+ const clusterWidth = visibleWidth(grapheme);
731
+ if (currentWidth + clusterWidth > targetWidth) {
713
732
  break;
714
733
  }
715
734
  result += grapheme;
716
- currentWidth += graphemeWidth;
735
+ currentWidth += clusterWidth;
717
736
  }
718
737
  // Add reset code before ellipsis to prevent styling leaking into it
719
738
  const truncated = `${result}\x1b[0m${ellipsis}`;
@@ -750,7 +769,7 @@ export function sliceWithWidth(line, startCol, length, strict = false) {
750
769
  while (textEnd < line.length && !extractAnsiCode(line, textEnd))
751
770
  textEnd++;
752
771
  for (const { segment } of segmenter.segment(line.slice(i, textEnd))) {
753
- const w = graphemeWidth(segment);
772
+ const w = measureClusterWidth(segment);
754
773
  const inRange = currentCol >= startCol && currentCol < endCol;
755
774
  const fits = !strict || currentCol + w <= endCol;
756
775
  if (inRange && fits) {
@@ -772,7 +791,7 @@ export function sliceWithWidth(line, startCol, length, strict = false) {
772
791
  return { text: result, width: resultWidth };
773
792
  }
774
793
  // Pooled tracker instance for extractSegments (avoids allocation per call)
775
- const pooledStyleTracker = new AnsiCodeTracker();
794
+ const pooledStyleTracker = new AnsiStateTracker();
776
795
  /**
777
796
  * Extract "before" and "after" segments from a line in a single pass.
778
797
  * Used for overlay compositing where we need content before and after the overlay region.
@@ -806,7 +825,7 @@ export function extractSegments(line, beforeEnd, afterStart, afterLen, strictAft
806
825
  while (textEnd < line.length && !extractAnsiCode(line, textEnd))
807
826
  textEnd++;
808
827
  for (const { segment } of segmenter.segment(line.slice(i, textEnd))) {
809
- const w = graphemeWidth(segment);
828
+ const w = measureClusterWidth(segment);
810
829
  if (currentCol < beforeEnd) {
811
830
  if (pendingAnsiBefore) {
812
831
  before += pendingAnsiBefore;