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/keys.js CHANGED
@@ -34,17 +34,103 @@ export function setKittyProtocolActive(active) {
34
34
  export function isKittyProtocolActive() {
35
35
  return _kittyProtocolActive;
36
36
  }
37
- /**
38
- * Helper object for creating typed key identifiers with autocomplete.
39
- *
40
- * Usage:
41
- * - Key.escape, Key.enter, Key.tab, etc. for special keys
42
- * - Key.backtick, Key.comma, Key.period, etc. for symbol keys
43
- * - Key.ctrl("c"), Key.alt("x") for single modifier
44
- * - Key.ctrlShift("p"), Key.ctrlAlt("x") for combined modifiers
45
- */
46
- export const Key = {
47
- // Special keys
37
+ // =============================================================================
38
+ // Type-Safe Key Identifiers
39
+ // =============================================================================
40
+ const LETTER_VALUES = [
41
+ "a",
42
+ "b",
43
+ "c",
44
+ "d",
45
+ "e",
46
+ "f",
47
+ "g",
48
+ "h",
49
+ "i",
50
+ "j",
51
+ "k",
52
+ "l",
53
+ "m",
54
+ "n",
55
+ "o",
56
+ "p",
57
+ "q",
58
+ "r",
59
+ "s",
60
+ "t",
61
+ "u",
62
+ "v",
63
+ "w",
64
+ "x",
65
+ "y",
66
+ "z",
67
+ ];
68
+ const SYMBOL_VALUES = [
69
+ "`",
70
+ "-",
71
+ "=",
72
+ "[",
73
+ "]",
74
+ "\\",
75
+ ";",
76
+ "'",
77
+ ",",
78
+ ".",
79
+ "/",
80
+ "!",
81
+ "@",
82
+ "#",
83
+ "$",
84
+ "%",
85
+ "^",
86
+ "&",
87
+ "*",
88
+ "(",
89
+ ")",
90
+ "_",
91
+ "+",
92
+ "|",
93
+ "~",
94
+ "{",
95
+ "}",
96
+ ":",
97
+ "<",
98
+ ">",
99
+ "?",
100
+ ];
101
+ const SPECIAL_KEY_VALUES = [
102
+ "escape",
103
+ "esc",
104
+ "enter",
105
+ "return",
106
+ "tab",
107
+ "space",
108
+ "backspace",
109
+ "delete",
110
+ "insert",
111
+ "clear",
112
+ "home",
113
+ "end",
114
+ "pageUp",
115
+ "pageDown",
116
+ "up",
117
+ "down",
118
+ "left",
119
+ "right",
120
+ "f1",
121
+ "f2",
122
+ "f3",
123
+ "f4",
124
+ "f5",
125
+ "f6",
126
+ "f7",
127
+ "f8",
128
+ "f9",
129
+ "f10",
130
+ "f11",
131
+ "f12",
132
+ ];
133
+ const SPECIAL_KEY_LITERAL_MAP = {
48
134
  escape: "escape",
49
135
  esc: "esc",
50
136
  enter: "enter",
@@ -75,7 +161,8 @@ export const Key = {
75
161
  f10: "f10",
76
162
  f11: "f11",
77
163
  f12: "f12",
78
- // Symbol keys
164
+ };
165
+ const SYMBOL_KEY_LITERAL_MAP = {
79
166
  backtick: "`",
80
167
  hyphen: "-",
81
168
  equals: "=",
@@ -107,18 +194,28 @@ export const Key = {
107
194
  lessthan: "<",
108
195
  greaterthan: ">",
109
196
  question: "?",
110
- // Single modifiers
197
+ };
198
+ /**
199
+ * Helper object for creating typed key identifiers with autocomplete.
200
+ *
201
+ * Usage:
202
+ * - Key.escape, Key.enter, Key.tab, etc. for special keys
203
+ * - Key.backtick, Key.comma, Key.period, etc. for symbol keys
204
+ * - Key.ctrl("c"), Key.alt("x") for single modifier
205
+ * - Key.ctrlShift("p"), Key.ctrlAlt("x") for combined modifiers
206
+ */
207
+ export const Key = {
208
+ ...SPECIAL_KEY_LITERAL_MAP,
209
+ ...SYMBOL_KEY_LITERAL_MAP,
111
210
  ctrl: (key) => `ctrl+${key}`,
112
211
  shift: (key) => `shift+${key}`,
113
212
  alt: (key) => `alt+${key}`,
114
- // Combined modifiers
115
213
  ctrlShift: (key) => `ctrl+shift+${key}`,
116
214
  shiftCtrl: (key) => `shift+ctrl+${key}`,
117
215
  ctrlAlt: (key) => `ctrl+alt+${key}`,
118
216
  altCtrl: (key) => `alt+ctrl+${key}`,
119
217
  shiftAlt: (key) => `shift+alt+${key}`,
120
218
  altShift: (key) => `alt+shift+${key}`,
121
- // Triple modifiers
122
219
  ctrlShiftAlt: (key) => `ctrl+shift+alt+${key}`,
123
220
  };
124
221
  // =============================================================================
@@ -568,444 +665,429 @@ function parseKeyId(keyId) {
568
665
  alt: parts.includes("alt"),
569
666
  };
570
667
  }
571
- /**
572
- * Match input data against a key identifier string.
573
- *
574
- * Supported key identifiers:
575
- * - Single keys: "escape", "tab", "enter", "backspace", "delete", "home", "end", "space"
576
- * - Arrow keys: "up", "down", "left", "right"
577
- * - Ctrl combinations: "ctrl+c", "ctrl+z", etc.
578
- * - Shift combinations: "shift+tab", "shift+enter"
579
- * - Alt combinations: "alt+enter", "alt+backspace"
580
- * - Combined modifiers: "shift+ctrl+p", "ctrl+alt+x"
581
- *
582
- * Use the Key helper for autocomplete: Key.ctrl("c"), Key.escape, Key.ctrlShift("p")
583
- *
584
- * @param data - Raw input data from terminal
585
- * @param keyId - Key identifier (e.g., "ctrl+c", "escape", Key.ctrl("c"))
586
- */
587
- export function matchesKey(data, keyId) {
588
- const parsed = parseKeyId(keyId);
589
- if (!parsed)
590
- return false;
591
- const { key, ctrl, shift, alt } = parsed;
592
- let modifier = 0;
593
- if (shift)
594
- modifier |= MODIFIERS.shift;
595
- if (alt)
596
- modifier |= MODIFIERS.alt;
597
- if (ctrl)
598
- modifier |= MODIFIERS.ctrl;
599
- switch (key) {
600
- case "escape":
601
- case "esc":
602
- if (modifier !== 0)
603
- return false;
604
- return data === "\x1b" || matchesKittySequence(data, CODEPOINTS.escape, 0);
605
- case "space":
606
- if (!_kittyProtocolActive) {
607
- if (ctrl && !alt && !shift && data === "\x00") {
608
- return true;
609
- }
610
- if (alt && !ctrl && !shift && data === "\x1b ") {
611
- return true;
612
- }
613
- }
614
- if (modifier === 0) {
615
- return data === " " || matchesKittySequence(data, CODEPOINTS.space, 0);
616
- }
617
- return matchesKittySequence(data, CODEPOINTS.space, modifier);
618
- case "tab":
619
- if (shift && !ctrl && !alt) {
620
- return data === "\x1b[Z" || matchesKittySequence(data, CODEPOINTS.tab, MODIFIERS.shift);
621
- }
622
- if (modifier === 0) {
623
- return data === "\t" || matchesKittySequence(data, CODEPOINTS.tab, 0);
624
- }
625
- return matchesKittySequence(data, CODEPOINTS.tab, modifier);
626
- case "enter":
627
- case "return":
628
- if (shift && !ctrl && !alt) {
629
- // CSI u sequences (standard Kitty protocol)
630
- if (matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.shift) ||
631
- matchesKittySequence(data, CODEPOINTS.kpEnter, MODIFIERS.shift)) {
632
- return true;
633
- }
634
- // xterm modifyOtherKeys format (fallback when Kitty protocol not enabled)
635
- if (matchesModifyOtherKeys(data, CODEPOINTS.enter, MODIFIERS.shift)) {
636
- return true;
637
- }
638
- // When Kitty protocol is active, legacy sequences are custom terminal mappings
639
- // \x1b\r = Kitty's "map shift+enter send_text all \e\r"
640
- // \n = Ghostty's "keybind = shift+enter=text:\n"
641
- if (_kittyProtocolActive) {
642
- return data === "\x1b\r" || data === "\n";
643
- }
644
- return false;
645
- }
646
- if (alt && !ctrl && !shift) {
647
- // CSI u sequences (standard Kitty protocol)
648
- if (matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.alt) ||
649
- matchesKittySequence(data, CODEPOINTS.kpEnter, MODIFIERS.alt)) {
650
- return true;
668
+ class KeyMatchEngine {
669
+ specialKeyResolverRegistry;
670
+ constructor() {
671
+ this.specialKeyResolverRegistry = {
672
+ escape: (data, _decodedKeyId, modifierBits) => {
673
+ if (modifierBits !== 0)
674
+ return false;
675
+ return data === "\x1b" || matchesKittySequence(data, CODEPOINTS.escape, 0);
676
+ },
677
+ esc: (data, _decodedKeyId, modifierBits) => {
678
+ if (modifierBits !== 0)
679
+ return false;
680
+ return data === "\x1b" || matchesKittySequence(data, CODEPOINTS.escape, 0);
681
+ },
682
+ space: (data, decodedKeyId, modifierBits) => {
683
+ const { ctrl, shift, alt } = decodedKeyId;
684
+ if (!_kittyProtocolActive) {
685
+ if (ctrl && !alt && !shift && data === "\x00")
686
+ return true;
687
+ if (alt && !ctrl && !shift && data === "\x1b ")
688
+ return true;
651
689
  }
652
- // xterm modifyOtherKeys format (fallback when Kitty protocol not enabled)
653
- if (matchesModifyOtherKeys(data, CODEPOINTS.enter, MODIFIERS.alt)) {
654
- return true;
690
+ if (modifierBits === 0)
691
+ return data === " " || matchesKittySequence(data, CODEPOINTS.space, 0);
692
+ return matchesKittySequence(data, CODEPOINTS.space, modifierBits);
693
+ },
694
+ tab: (data, decodedKeyId, modifierBits) => {
695
+ const { ctrl, shift, alt } = decodedKeyId;
696
+ if (shift && !ctrl && !alt) {
697
+ return data === "\x1b[Z" || matchesKittySequence(data, CODEPOINTS.tab, MODIFIERS.shift);
655
698
  }
656
- // \x1b\r is alt+enter only in legacy mode (no Kitty protocol)
657
- // When Kitty protocol is active, alt+enter comes as CSI u sequence
658
- if (!_kittyProtocolActive) {
659
- return data === "\x1b\r";
699
+ if (modifierBits === 0)
700
+ return data === "\t" || matchesKittySequence(data, CODEPOINTS.tab, 0);
701
+ return matchesKittySequence(data, CODEPOINTS.tab, modifierBits);
702
+ },
703
+ enter: (data, decodedKeyId, modifierBits) => this.matchEnterLikeKey(data, decodedKeyId, modifierBits),
704
+ return: (data, decodedKeyId, modifierBits) => this.matchEnterLikeKey(data, decodedKeyId, modifierBits),
705
+ backspace: (data, decodedKeyId, modifierBits) => {
706
+ const { ctrl, shift, alt } = decodedKeyId;
707
+ if (alt && !ctrl && !shift) {
708
+ if (data === "\x1b\x7f" || data === "\x1b\b")
709
+ return true;
710
+ return matchesKittySequence(data, CODEPOINTS.backspace, MODIFIERS.alt);
660
711
  }
661
- return false;
662
- }
663
- if (modifier === 0) {
664
- return (data === "\r" ||
665
- (!_kittyProtocolActive && data === "\n") ||
666
- data === "\x1bOM" || // SS3 M (numpad enter in some terminals)
667
- matchesKittySequence(data, CODEPOINTS.enter, 0) ||
668
- matchesKittySequence(data, CODEPOINTS.kpEnter, 0));
669
- }
670
- return (matchesKittySequence(data, CODEPOINTS.enter, modifier) ||
671
- matchesKittySequence(data, CODEPOINTS.kpEnter, modifier));
672
- case "backspace":
673
- if (alt && !ctrl && !shift) {
674
- if (data === "\x1b\x7f" || data === "\x1b\b") {
675
- return true;
712
+ if (modifierBits === 0) {
713
+ return data === "\x7f" || data === "\x08" || matchesKittySequence(data, CODEPOINTS.backspace, 0);
676
714
  }
677
- return matchesKittySequence(data, CODEPOINTS.backspace, MODIFIERS.alt);
678
- }
679
- if (modifier === 0) {
680
- return data === "\x7f" || data === "\x08" || matchesKittySequence(data, CODEPOINTS.backspace, 0);
681
- }
682
- return matchesKittySequence(data, CODEPOINTS.backspace, modifier);
683
- case "insert":
684
- if (modifier === 0) {
685
- return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.insert) ||
686
- matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.insert, 0));
687
- }
688
- if (matchesLegacyModifierSequence(data, "insert", modifier)) {
689
- return true;
690
- }
691
- return matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.insert, modifier);
692
- case "delete":
693
- if (modifier === 0) {
694
- return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.delete) ||
695
- matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.delete, 0));
696
- }
697
- if (matchesLegacyModifierSequence(data, "delete", modifier)) {
698
- return true;
699
- }
700
- return matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.delete, modifier);
701
- case "clear":
702
- if (modifier === 0) {
703
- return matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.clear);
704
- }
705
- return matchesLegacyModifierSequence(data, "clear", modifier);
706
- case "home":
707
- if (modifier === 0) {
708
- return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.home) ||
709
- matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.home, 0));
710
- }
711
- if (matchesLegacyModifierSequence(data, "home", modifier)) {
712
- return true;
713
- }
714
- return matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.home, modifier);
715
- case "end":
716
- if (modifier === 0) {
717
- return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.end) ||
718
- matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.end, 0));
719
- }
720
- if (matchesLegacyModifierSequence(data, "end", modifier)) {
721
- return true;
722
- }
723
- return matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.end, modifier);
724
- case "pageup":
725
- if (modifier === 0) {
726
- return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.pageUp) ||
727
- matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.pageUp, 0));
728
- }
729
- if (matchesLegacyModifierSequence(data, "pageUp", modifier)) {
730
- return true;
731
- }
732
- return matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.pageUp, modifier);
733
- case "pagedown":
734
- if (modifier === 0) {
735
- return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.pageDown) ||
736
- matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.pageDown, 0));
737
- }
738
- if (matchesLegacyModifierSequence(data, "pageDown", modifier)) {
739
- return true;
740
- }
741
- return matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.pageDown, modifier);
742
- case "up":
743
- if (alt && !ctrl && !shift) {
744
- return data === "\x1bp" || matchesKittySequence(data, ARROW_CODEPOINTS.up, MODIFIERS.alt);
745
- }
746
- if (modifier === 0) {
747
- return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.up) ||
748
- matchesKittySequence(data, ARROW_CODEPOINTS.up, 0));
749
- }
750
- if (matchesLegacyModifierSequence(data, "up", modifier)) {
715
+ return matchesKittySequence(data, CODEPOINTS.backspace, modifierBits);
716
+ },
717
+ insert: (data, _decodedKeyId, modifierBits) => this.matchFunctionalKey(data, "insert", FUNCTIONAL_CODEPOINTS.insert, modifierBits),
718
+ delete: (data, _decodedKeyId, modifierBits) => this.matchFunctionalKey(data, "delete", FUNCTIONAL_CODEPOINTS.delete, modifierBits),
719
+ clear: (data, _decodedKeyId, modifierBits) => {
720
+ if (modifierBits === 0)
721
+ return matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.clear);
722
+ return matchesLegacyModifierSequence(data, "clear", modifierBits);
723
+ },
724
+ home: (data, _decodedKeyId, modifierBits) => this.matchFunctionalKey(data, "home", FUNCTIONAL_CODEPOINTS.home, modifierBits),
725
+ end: (data, _decodedKeyId, modifierBits) => this.matchFunctionalKey(data, "end", FUNCTIONAL_CODEPOINTS.end, modifierBits),
726
+ pageup: (data, _decodedKeyId, modifierBits) => this.matchFunctionalKey(data, "pageUp", FUNCTIONAL_CODEPOINTS.pageUp, modifierBits),
727
+ pagedown: (data, _decodedKeyId, modifierBits) => this.matchFunctionalKey(data, "pageDown", FUNCTIONAL_CODEPOINTS.pageDown, modifierBits),
728
+ up: (data, decodedKeyId, modifierBits) => this.matchArrowKey(data, "up", ARROW_CODEPOINTS.up, decodedKeyId, modifierBits),
729
+ down: (data, decodedKeyId, modifierBits) => this.matchArrowKey(data, "down", ARROW_CODEPOINTS.down, decodedKeyId, modifierBits),
730
+ left: (data, decodedKeyId, modifierBits) => this.matchLeftArrow(data, decodedKeyId, modifierBits),
731
+ right: (data, decodedKeyId, modifierBits) => this.matchRightArrow(data, decodedKeyId, modifierBits),
732
+ f1: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f1", modifierBits),
733
+ f2: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f2", modifierBits),
734
+ f3: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f3", modifierBits),
735
+ f4: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f4", modifierBits),
736
+ f5: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f5", modifierBits),
737
+ f6: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f6", modifierBits),
738
+ f7: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f7", modifierBits),
739
+ f8: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f8", modifierBits),
740
+ f9: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f9", modifierBits),
741
+ f10: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f10", modifierBits),
742
+ f11: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f11", modifierBits),
743
+ f12: (data, _decodedKeyId, modifierBits) => this.matchFunctionKey(data, "f12", modifierBits),
744
+ };
745
+ }
746
+ matches(data, keyId) {
747
+ const decodedKeyId = parseKeyId(keyId);
748
+ if (!decodedKeyId)
749
+ return false;
750
+ const modifierBits = this.computeModifierMask(decodedKeyId);
751
+ const specialKeyResolver = this.specialKeyResolverRegistry[decodedKeyId.key];
752
+ if (specialKeyResolver) {
753
+ return specialKeyResolver(data, decodedKeyId, modifierBits);
754
+ }
755
+ return this.matchPrintableKey(data, decodedKeyId, modifierBits);
756
+ }
757
+ computeModifierMask(decodedKeyId) {
758
+ let modifierBits = 0;
759
+ if (decodedKeyId.shift)
760
+ modifierBits |= MODIFIERS.shift;
761
+ if (decodedKeyId.alt)
762
+ modifierBits |= MODIFIERS.alt;
763
+ if (decodedKeyId.ctrl)
764
+ modifierBits |= MODIFIERS.ctrl;
765
+ return modifierBits;
766
+ }
767
+ matchFunctionKey(data, functionKey, modifierBits) {
768
+ if (modifierBits !== 0)
769
+ return false;
770
+ return matchesLegacySequence(data, LEGACY_KEY_SEQUENCES[functionKey]);
771
+ }
772
+ matchEnterLikeKey(data, decodedKeyId, modifierBits) {
773
+ const { ctrl, shift, alt } = decodedKeyId;
774
+ if (shift && !ctrl && !alt) {
775
+ if (matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.shift) ||
776
+ matchesKittySequence(data, CODEPOINTS.kpEnter, MODIFIERS.shift)) {
751
777
  return true;
752
778
  }
753
- return matchesKittySequence(data, ARROW_CODEPOINTS.up, modifier);
754
- case "down":
755
- if (alt && !ctrl && !shift) {
756
- return data === "\x1bn" || matchesKittySequence(data, ARROW_CODEPOINTS.down, MODIFIERS.alt);
757
- }
758
- if (modifier === 0) {
759
- return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.down) ||
760
- matchesKittySequence(data, ARROW_CODEPOINTS.down, 0));
761
- }
762
- if (matchesLegacyModifierSequence(data, "down", modifier)) {
779
+ if (matchesModifyOtherKeys(data, CODEPOINTS.enter, MODIFIERS.shift)) {
763
780
  return true;
764
781
  }
765
- return matchesKittySequence(data, ARROW_CODEPOINTS.down, modifier);
766
- case "left":
767
- if (alt && !ctrl && !shift) {
768
- return (data === "\x1b[1;3D" ||
769
- (!_kittyProtocolActive && data === "\x1bB") ||
770
- data === "\x1bb" ||
771
- matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.alt));
772
- }
773
- if (ctrl && !alt && !shift) {
774
- return (data === "\x1b[1;5D" ||
775
- matchesLegacyModifierSequence(data, "left", MODIFIERS.ctrl) ||
776
- matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.ctrl));
782
+ if (_kittyProtocolActive) {
783
+ return data === "\x1b\r" || data === "\n";
777
784
  }
778
- if (modifier === 0) {
779
- return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.left) ||
780
- matchesKittySequence(data, ARROW_CODEPOINTS.left, 0));
781
- }
782
- if (matchesLegacyModifierSequence(data, "left", modifier)) {
785
+ return false;
786
+ }
787
+ if (alt && !ctrl && !shift) {
788
+ if (matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.alt) ||
789
+ matchesKittySequence(data, CODEPOINTS.kpEnter, MODIFIERS.alt)) {
783
790
  return true;
784
791
  }
785
- return matchesKittySequence(data, ARROW_CODEPOINTS.left, modifier);
786
- case "right":
787
- if (alt && !ctrl && !shift) {
788
- return (data === "\x1b[1;3C" ||
789
- (!_kittyProtocolActive && data === "\x1bF") ||
790
- data === "\x1bf" ||
791
- matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.alt));
792
- }
793
- if (ctrl && !alt && !shift) {
794
- return (data === "\x1b[1;5C" ||
795
- matchesLegacyModifierSequence(data, "right", MODIFIERS.ctrl) ||
796
- matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.ctrl));
797
- }
798
- if (modifier === 0) {
799
- return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.right) ||
800
- matchesKittySequence(data, ARROW_CODEPOINTS.right, 0));
801
- }
802
- if (matchesLegacyModifierSequence(data, "right", modifier)) {
792
+ if (matchesModifyOtherKeys(data, CODEPOINTS.enter, MODIFIERS.alt)) {
803
793
  return true;
804
794
  }
805
- return matchesKittySequence(data, ARROW_CODEPOINTS.right, modifier);
806
- case "f1":
807
- case "f2":
808
- case "f3":
809
- case "f4":
810
- case "f5":
811
- case "f6":
812
- case "f7":
813
- case "f8":
814
- case "f9":
815
- case "f10":
816
- case "f11":
817
- case "f12": {
818
- if (modifier !== 0) {
819
- return false;
795
+ if (!_kittyProtocolActive) {
796
+ return data === "\x1b\r";
820
797
  }
821
- const functionKey = key;
822
- return matchesLegacySequence(data, LEGACY_KEY_SEQUENCES[functionKey]);
798
+ return false;
799
+ }
800
+ if (modifierBits === 0) {
801
+ return (data === "\r" ||
802
+ (!_kittyProtocolActive && data === "\n") ||
803
+ data === "\x1bOM" ||
804
+ matchesKittySequence(data, CODEPOINTS.enter, 0) ||
805
+ matchesKittySequence(data, CODEPOINTS.kpEnter, 0));
806
+ }
807
+ return (matchesKittySequence(data, CODEPOINTS.enter, modifierBits) ||
808
+ matchesKittySequence(data, CODEPOINTS.kpEnter, modifierBits));
809
+ }
810
+ matchFunctionalKey(data, legacyName, codepoint, modifierBits) {
811
+ if (modifierBits === 0) {
812
+ return matchesLegacySequence(data, LEGACY_KEY_SEQUENCES[legacyName]) || matchesKittySequence(data, codepoint, 0);
813
+ }
814
+ if (matchesLegacyModifierSequence(data, legacyName, modifierBits)) {
815
+ return true;
816
+ }
817
+ return matchesKittySequence(data, codepoint, modifierBits);
818
+ }
819
+ matchArrowKey(data, arrowName, codepoint, decodedKeyId, modifierBits) {
820
+ const { ctrl, shift, alt } = decodedKeyId;
821
+ if (alt && !ctrl && !shift) {
822
+ const altLegacy = arrowName === "up" ? "\x1bp" : "\x1bn";
823
+ return data === altLegacy || matchesKittySequence(data, codepoint, MODIFIERS.alt);
824
+ }
825
+ if (modifierBits === 0) {
826
+ return matchesLegacySequence(data, LEGACY_KEY_SEQUENCES[arrowName]) || matchesKittySequence(data, codepoint, 0);
827
+ }
828
+ if (matchesLegacyModifierSequence(data, arrowName, modifierBits)) {
829
+ return true;
830
+ }
831
+ return matchesKittySequence(data, codepoint, modifierBits);
832
+ }
833
+ matchLeftArrow(data, decodedKeyId, modifierBits) {
834
+ const { ctrl, shift, alt } = decodedKeyId;
835
+ if (alt && !ctrl && !shift) {
836
+ return (data === "\x1b[1;3D" ||
837
+ (!_kittyProtocolActive && data === "\x1bB") ||
838
+ data === "\x1bb" ||
839
+ matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.alt));
840
+ }
841
+ if (ctrl && !alt && !shift) {
842
+ return (data === "\x1b[1;5D" ||
843
+ matchesLegacyModifierSequence(data, "left", MODIFIERS.ctrl) ||
844
+ matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.ctrl));
845
+ }
846
+ if (modifierBits === 0) {
847
+ return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.left) ||
848
+ matchesKittySequence(data, ARROW_CODEPOINTS.left, 0));
849
+ }
850
+ if (matchesLegacyModifierSequence(data, "left", modifierBits)) {
851
+ return true;
823
852
  }
853
+ return matchesKittySequence(data, ARROW_CODEPOINTS.left, modifierBits);
824
854
  }
825
- // Handle single letter keys (a-z) and some symbols
826
- if (key.length === 1 && ((key >= "a" && key <= "z") || SYMBOL_KEYS.has(key))) {
855
+ matchRightArrow(data, decodedKeyId, modifierBits) {
856
+ const { ctrl, shift, alt } = decodedKeyId;
857
+ if (alt && !ctrl && !shift) {
858
+ return (data === "\x1b[1;3C" ||
859
+ (!_kittyProtocolActive && data === "\x1bF") ||
860
+ data === "\x1bf" ||
861
+ matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.alt));
862
+ }
863
+ if (ctrl && !alt && !shift) {
864
+ return (data === "\x1b[1;5C" ||
865
+ matchesLegacyModifierSequence(data, "right", MODIFIERS.ctrl) ||
866
+ matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.ctrl));
867
+ }
868
+ if (modifierBits === 0) {
869
+ return (matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.right) ||
870
+ matchesKittySequence(data, ARROW_CODEPOINTS.right, 0));
871
+ }
872
+ if (matchesLegacyModifierSequence(data, "right", modifierBits)) {
873
+ return true;
874
+ }
875
+ return matchesKittySequence(data, ARROW_CODEPOINTS.right, modifierBits);
876
+ }
877
+ matchPrintableKey(data, decodedKeyId, modifierBits) {
878
+ const { key, ctrl, shift, alt } = decodedKeyId;
879
+ if (!(key.length === 1 && ((key >= "a" && key <= "z") || SYMBOL_KEYS.has(key)))) {
880
+ return false;
881
+ }
827
882
  const codepoint = key.charCodeAt(0);
828
- const rawCtrl = rawCtrlChar(key);
829
- if (ctrl && alt && !shift && !_kittyProtocolActive && rawCtrl) {
830
- // Legacy: ctrl+alt+key is ESC followed by the control character
831
- return data === `\x1b${rawCtrl}`;
883
+ const controlCharacter = rawCtrlChar(key);
884
+ if (ctrl && alt && !shift && !_kittyProtocolActive && controlCharacter) {
885
+ return data === `\x1b${controlCharacter}`;
832
886
  }
833
887
  if (alt && !ctrl && !shift && !_kittyProtocolActive && key >= "a" && key <= "z") {
834
- // Legacy: alt+letter is ESC followed by the letter
835
- if (data === `\x1b${key}`)
888
+ if (data === `\x1b${key}`) {
836
889
  return true;
890
+ }
837
891
  }
838
892
  if (ctrl && !shift && !alt) {
839
- // Legacy: ctrl+key sends the control character
840
- if (rawCtrl && data === rawCtrl)
893
+ if (controlCharacter && data === controlCharacter) {
841
894
  return true;
895
+ }
842
896
  return matchesKittySequence(data, codepoint, MODIFIERS.ctrl);
843
897
  }
844
898
  if (ctrl && shift && !alt) {
845
899
  return matchesKittySequence(data, codepoint, MODIFIERS.shift + MODIFIERS.ctrl);
846
900
  }
847
901
  if (shift && !ctrl && !alt) {
848
- // Legacy: shift+letter produces uppercase
849
- if (data === key.toUpperCase())
902
+ if (data === key.toUpperCase()) {
850
903
  return true;
904
+ }
851
905
  return matchesKittySequence(data, codepoint, MODIFIERS.shift);
852
906
  }
853
- if (modifier !== 0) {
854
- return matchesKittySequence(data, codepoint, modifier);
907
+ if (modifierBits !== 0) {
908
+ return matchesKittySequence(data, codepoint, modifierBits);
855
909
  }
856
- // Check both raw char and Kitty sequence (needed for release events)
857
910
  return data === key || matchesKittySequence(data, codepoint, 0);
858
911
  }
859
- return false;
860
912
  }
861
- /**
862
- * Parse input data and return the key identifier if recognized.
863
- *
864
- * @param data - Raw input data from terminal
865
- * @returns Key identifier string (e.g., "ctrl+c") or undefined
866
- */
867
- export function parseKey(data) {
868
- const kitty = parseKittySequence(data);
869
- if (kitty) {
870
- const { codepoint, baseLayoutKey, modifier } = kitty;
871
- const mods = [];
872
- const effectiveMod = modifier & ~LOCK_MASK;
873
- if (effectiveMod & MODIFIERS.shift)
874
- mods.push("shift");
875
- if (effectiveMod & MODIFIERS.ctrl)
876
- mods.push("ctrl");
877
- if (effectiveMod & MODIFIERS.alt)
878
- mods.push("alt");
879
- // Prefer base layout key for consistent shortcut naming across keyboard layouts
880
- // This ensures Ctrl+С (Cyrillic) is reported as "ctrl+c" (Latin)
881
- const effectiveCodepoint = baseLayoutKey ?? codepoint;
882
- let keyName;
883
- if (effectiveCodepoint === CODEPOINTS.escape)
884
- keyName = "escape";
885
- else if (effectiveCodepoint === CODEPOINTS.tab)
886
- keyName = "tab";
887
- else if (effectiveCodepoint === CODEPOINTS.enter || effectiveCodepoint === CODEPOINTS.kpEnter)
888
- keyName = "enter";
889
- else if (effectiveCodepoint === CODEPOINTS.space)
890
- keyName = "space";
891
- else if (effectiveCodepoint === CODEPOINTS.backspace)
892
- keyName = "backspace";
893
- else if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.delete)
894
- keyName = "delete";
895
- else if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.insert)
896
- keyName = "insert";
897
- else if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.home)
898
- keyName = "home";
899
- else if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.end)
900
- keyName = "end";
901
- else if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.pageUp)
902
- keyName = "pageUp";
903
- else if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.pageDown)
904
- keyName = "pageDown";
905
- else if (effectiveCodepoint === ARROW_CODEPOINTS.up)
906
- keyName = "up";
907
- else if (effectiveCodepoint === ARROW_CODEPOINTS.down)
908
- keyName = "down";
909
- else if (effectiveCodepoint === ARROW_CODEPOINTS.left)
910
- keyName = "left";
911
- else if (effectiveCodepoint === ARROW_CODEPOINTS.right)
912
- keyName = "right";
913
- else if (effectiveCodepoint >= 97 && effectiveCodepoint <= 122)
914
- keyName = String.fromCharCode(effectiveCodepoint);
915
- else if (SYMBOL_KEYS.has(String.fromCharCode(effectiveCodepoint)))
916
- keyName = String.fromCharCode(effectiveCodepoint);
917
- if (keyName) {
918
- return mods.length > 0 ? `${mods.join("+")}+${keyName}` : keyName;
913
+ class KeyParseEngine {
914
+ legacyLiteralParseTable = {
915
+ "\x1b": "escape",
916
+ "\x1c": "ctrl+\\",
917
+ "\x1d": "ctrl+]",
918
+ "\x1f": "ctrl+-",
919
+ "\x1b\x1b": "ctrl+alt+[",
920
+ "\x1b\x1c": "ctrl+alt+\\",
921
+ "\x1b\x1d": "ctrl+alt+]",
922
+ "\x1b\x1f": "ctrl+alt+-",
923
+ "\t": "tab",
924
+ "\x00": "ctrl+space",
925
+ " ": "space",
926
+ "\x1b[Z": "shift+tab",
927
+ "\x1b[A": "up",
928
+ "\x1b[B": "down",
929
+ "\x1b[C": "right",
930
+ "\x1b[D": "left",
931
+ "\x1b[3~": "delete",
932
+ "\x1b[5~": "pageUp",
933
+ "\x1b[6~": "pageDown",
934
+ };
935
+ parse(data) {
936
+ const kittyDerivedKeyId = this.parseFromKitty(data);
937
+ if (kittyDerivedKeyId) {
938
+ return kittyDerivedKeyId;
919
939
  }
940
+ return this.parseFromLegacy(data);
920
941
  }
921
- // Mode-aware legacy sequences
922
- // When Kitty protocol is active, ambiguous sequences are interpreted as custom terminal mappings:
923
- // - \x1b\r = shift+enter (Kitty mapping), not alt+enter
924
- // - \n = shift+enter (Ghostty mapping)
925
- if (_kittyProtocolActive) {
926
- if (data === "\x1b\r" || data === "\n")
927
- return "shift+enter";
942
+ parseFromKitty(data) {
943
+ const parsedKitty = parseKittySequence(data);
944
+ if (!parsedKitty) {
945
+ return undefined;
946
+ }
947
+ const orderedModifiers = this.formatModifierNames(parsedKitty.modifier & ~LOCK_MASK);
948
+ const lookupCodepoint = parsedKitty.baseLayoutKey ?? parsedKitty.codepoint;
949
+ const keyName = this.resolveKeyName(lookupCodepoint);
950
+ if (!keyName)
951
+ return undefined;
952
+ return orderedModifiers.length > 0 ? `${orderedModifiers.join("+")}+${keyName}` : keyName;
928
953
  }
929
- const legacySequenceKeyId = LEGACY_SEQUENCE_KEY_IDS[data];
930
- if (legacySequenceKeyId)
931
- return legacySequenceKeyId;
932
- // Legacy sequences (used when Kitty protocol is not active, or for unambiguous sequences)
933
- if (data === "\x1b")
934
- return "escape";
935
- if (data === "\x1c")
936
- return "ctrl+\\";
937
- if (data === "\x1d")
938
- return "ctrl+]";
939
- if (data === "\x1f")
940
- return "ctrl+-";
941
- if (data === "\x1b\x1b")
942
- return "ctrl+alt+[";
943
- if (data === "\x1b\x1c")
944
- return "ctrl+alt+\\";
945
- if (data === "\x1b\x1d")
946
- return "ctrl+alt+]";
947
- if (data === "\x1b\x1f")
948
- return "ctrl+alt+-";
949
- if (data === "\t")
950
- return "tab";
951
- if (data === "\r" || (!_kittyProtocolActive && data === "\n") || data === "\x1bOM")
952
- return "enter";
953
- if (data === "\x00")
954
- return "ctrl+space";
955
- if (data === " ")
956
- return "space";
957
- if (data === "\x7f" || data === "\x08")
958
- return "backspace";
959
- if (data === "\x1b[Z")
960
- return "shift+tab";
961
- if (!_kittyProtocolActive && data === "\x1b\r")
962
- return "alt+enter";
963
- if (!_kittyProtocolActive && data === "\x1b ")
964
- return "alt+space";
965
- if (data === "\x1b\x7f" || data === "\x1b\b")
966
- return "alt+backspace";
967
- if (!_kittyProtocolActive && data === "\x1bB")
968
- return "alt+left";
969
- if (!_kittyProtocolActive && data === "\x1bF")
970
- return "alt+right";
971
- if (!_kittyProtocolActive && data.length === 2 && data[0] === "\x1b") {
972
- const code = data.charCodeAt(1);
973
- if (code >= 1 && code <= 26) {
974
- return `ctrl+alt+${String.fromCharCode(code + 96)}`;
975
- }
976
- // Legacy alt+letter (ESC followed by letter a-z)
977
- if (code >= 97 && code <= 122) {
978
- return `alt+${String.fromCharCode(code)}`;
954
+ parseFromLegacy(data) {
955
+ if (_kittyProtocolActive && (data === "\x1b\r" || data === "\n")) {
956
+ return "shift+enter";
979
957
  }
958
+ const mappedLegacyIdentifier = LEGACY_SEQUENCE_KEY_IDS[data];
959
+ if (mappedLegacyIdentifier) {
960
+ return mappedLegacyIdentifier;
961
+ }
962
+ if (data === "\r" || (!_kittyProtocolActive && data === "\n") || data === "\x1bOM") {
963
+ return "enter";
964
+ }
965
+ if (data === "\x7f" || data === "\x08") {
966
+ return "backspace";
967
+ }
968
+ if (!_kittyProtocolActive && data === "\x1b\r") {
969
+ return "alt+enter";
970
+ }
971
+ if (!_kittyProtocolActive && data === "\x1b ") {
972
+ return "alt+space";
973
+ }
974
+ if (data === "\x1b\x7f" || data === "\x1b\b") {
975
+ return "alt+backspace";
976
+ }
977
+ if (!_kittyProtocolActive && data === "\x1bB") {
978
+ return "alt+left";
979
+ }
980
+ if (!_kittyProtocolActive && data === "\x1bF") {
981
+ return "alt+right";
982
+ }
983
+ if (data === "\x1b[H" || data === "\x1bOH") {
984
+ return "home";
985
+ }
986
+ if (data === "\x1b[F" || data === "\x1bOF") {
987
+ return "end";
988
+ }
989
+ const exactMatch = this.legacyLiteralParseTable[data];
990
+ if (exactMatch) {
991
+ return exactMatch;
992
+ }
993
+ if (!_kittyProtocolActive && data.length === 2 && data[0] === "\x1b") {
994
+ const legacyCode = data.charCodeAt(1);
995
+ if (legacyCode >= 1 && legacyCode <= 26) {
996
+ return `ctrl+alt+${String.fromCharCode(legacyCode + 96)}`;
997
+ }
998
+ if (legacyCode >= 97 && legacyCode <= 122) {
999
+ return `alt+${String.fromCharCode(legacyCode)}`;
1000
+ }
1001
+ }
1002
+ if (data.length === 1) {
1003
+ const rawCode = data.charCodeAt(0);
1004
+ if (rawCode >= 1 && rawCode <= 26) {
1005
+ return `ctrl+${String.fromCharCode(rawCode + 96)}`;
1006
+ }
1007
+ if (rawCode >= 32 && rawCode <= 126) {
1008
+ return data;
1009
+ }
1010
+ }
1011
+ return undefined;
980
1012
  }
981
- if (data === "\x1b[A")
982
- return "up";
983
- if (data === "\x1b[B")
984
- return "down";
985
- if (data === "\x1b[C")
986
- return "right";
987
- if (data === "\x1b[D")
988
- return "left";
989
- if (data === "\x1b[H" || data === "\x1bOH")
990
- return "home";
991
- if (data === "\x1b[F" || data === "\x1bOF")
992
- return "end";
993
- if (data === "\x1b[3~")
994
- return "delete";
995
- if (data === "\x1b[5~")
996
- return "pageUp";
997
- if (data === "\x1b[6~")
998
- return "pageDown";
999
- // Raw Ctrl+letter
1000
- if (data.length === 1) {
1001
- const code = data.charCodeAt(0);
1002
- if (code >= 1 && code <= 26) {
1003
- return `ctrl+${String.fromCharCode(code + 96)}`;
1004
- }
1005
- if (code >= 32 && code <= 126) {
1006
- return data;
1013
+ resolveKeyName(codepoint) {
1014
+ if (codepoint === CODEPOINTS.escape)
1015
+ return "escape";
1016
+ if (codepoint === CODEPOINTS.tab)
1017
+ return "tab";
1018
+ if (codepoint === CODEPOINTS.enter || codepoint === CODEPOINTS.kpEnter)
1019
+ return "enter";
1020
+ if (codepoint === CODEPOINTS.space)
1021
+ return "space";
1022
+ if (codepoint === CODEPOINTS.backspace)
1023
+ return "backspace";
1024
+ if (codepoint === FUNCTIONAL_CODEPOINTS.delete)
1025
+ return "delete";
1026
+ if (codepoint === FUNCTIONAL_CODEPOINTS.insert)
1027
+ return "insert";
1028
+ if (codepoint === FUNCTIONAL_CODEPOINTS.home)
1029
+ return "home";
1030
+ if (codepoint === FUNCTIONAL_CODEPOINTS.end)
1031
+ return "end";
1032
+ if (codepoint === FUNCTIONAL_CODEPOINTS.pageUp)
1033
+ return "pageUp";
1034
+ if (codepoint === FUNCTIONAL_CODEPOINTS.pageDown)
1035
+ return "pageDown";
1036
+ if (codepoint === ARROW_CODEPOINTS.up)
1037
+ return "up";
1038
+ if (codepoint === ARROW_CODEPOINTS.down)
1039
+ return "down";
1040
+ if (codepoint === ARROW_CODEPOINTS.left)
1041
+ return "left";
1042
+ if (codepoint === ARROW_CODEPOINTS.right)
1043
+ return "right";
1044
+ if (codepoint >= 97 && codepoint <= 122)
1045
+ return String.fromCharCode(codepoint);
1046
+ const char = String.fromCharCode(codepoint);
1047
+ if (SYMBOL_KEYS.has(char)) {
1048
+ return char;
1007
1049
  }
1050
+ return undefined;
1008
1051
  }
1009
- return undefined;
1052
+ formatModifierNames(modifierBits) {
1053
+ const orderedModifiers = [];
1054
+ if (modifierBits & MODIFIERS.shift)
1055
+ orderedModifiers.push("shift");
1056
+ if (modifierBits & MODIFIERS.ctrl)
1057
+ orderedModifiers.push("ctrl");
1058
+ if (modifierBits & MODIFIERS.alt)
1059
+ orderedModifiers.push("alt");
1060
+ return orderedModifiers;
1061
+ }
1062
+ }
1063
+ const keyMatcherEngine = new KeyMatchEngine();
1064
+ const keyParserEngine = new KeyParseEngine();
1065
+ /**
1066
+ * Match input data against a key identifier string.
1067
+ *
1068
+ * Supported key identifiers:
1069
+ * - Single keys: "escape", "tab", "enter", "backspace", "delete", "home", "end", "space"
1070
+ * - Arrow keys: "up", "down", "left", "right"
1071
+ * - Ctrl combinations: "ctrl+c", "ctrl+z", etc.
1072
+ * - Shift combinations: "shift+tab", "shift+enter"
1073
+ * - Alt combinations: "alt+enter", "alt+backspace"
1074
+ * - Combined modifiers: "shift+ctrl+p", "ctrl+alt+x"
1075
+ *
1076
+ * Use the Key helper for autocomplete: Key.ctrl("c"), Key.escape, Key.ctrlShift("p")
1077
+ *
1078
+ * @param data - Raw input data from terminal
1079
+ * @param keyId - Key identifier (e.g., "ctrl+c", "escape", Key.ctrl("c"))
1080
+ */
1081
+ export function matchesKey(data, keyId) {
1082
+ return keyMatcherEngine.matches(data, keyId);
1083
+ }
1084
+ /**
1085
+ * Parse input data and return the key identifier if recognized.
1086
+ *
1087
+ * @param data - Raw input data from terminal
1088
+ * @returns Key identifier string (e.g., "ctrl+c") or undefined
1089
+ */
1090
+ export function parseKey(data) {
1091
+ return keyParserEngine.parse(data);
1010
1092
  }
1011
1093
  //# sourceMappingURL=keys.js.map