@visual-z/xeno 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +126 -34
  3. package/docs/app-server.md +84 -0
  4. package/docs/install.md +51 -13
  5. package/docs/providers.md +24 -3
  6. package/package.json +7 -5
  7. package/src/apps/app-server.ts +28 -0
  8. package/src/apps/approve.ts +3 -3
  9. package/src/apps/cli.ts +25 -10
  10. package/src/apps/commands.ts +45 -8
  11. package/src/apps/completions.ts +78 -22
  12. package/src/apps/control-transport.ts +89 -0
  13. package/src/apps/image-draft.ts +46 -0
  14. package/src/apps/model-catalog.ts +2 -1
  15. package/src/apps/project-trust.ts +2 -42
  16. package/src/apps/provider-connect.ts +346 -0
  17. package/src/apps/render.ts +22 -47
  18. package/src/apps/resources.ts +5 -2
  19. package/src/apps/shell.ts +333 -1542
  20. package/src/apps/startup-input.ts +45 -9
  21. package/src/apps/startup.ts +149 -94
  22. package/src/apps/ui/app.ts +1553 -0
  23. package/src/apps/ui/control-model.ts +26 -0
  24. package/src/apps/ui/extension-host.ts +194 -0
  25. package/src/apps/ui/image-cache.ts +78 -0
  26. package/src/apps/ui/palette.ts +88 -0
  27. package/src/apps/ui/project.ts +127 -0
  28. package/src/apps/ui/standalone.ts +146 -0
  29. package/src/apps/ui/status-model.ts +68 -0
  30. package/src/apps/ui/surface.ts +86 -0
  31. package/src/apps/ui/theme.ts +86 -0
  32. package/src/core/acceptance.ts +107 -0
  33. package/src/core/action-defaults.ts +47 -295
  34. package/src/core/benchmark.ts +2 -2
  35. package/src/core/branch-receipt.ts +24 -0
  36. package/src/core/checkpoints.ts +64 -0
  37. package/src/core/churn.ts +2 -0
  38. package/src/core/command-artifacts.ts +94 -0
  39. package/src/core/command-contract.ts +35 -0
  40. package/src/core/completion-action.ts +20 -0
  41. package/src/core/completion-review.ts +37 -21
  42. package/src/core/context-detail.ts +37 -0
  43. package/src/core/context-policy.ts +74 -1
  44. package/src/core/continuation.ts +17 -2
  45. package/src/core/control-protocol.ts +62 -0
  46. package/src/core/control-view.ts +42 -0
  47. package/src/core/derive.ts +29 -3
  48. package/src/core/draft-images.ts +56 -0
  49. package/src/core/environment.ts +145 -0
  50. package/src/core/evaluation-coverage.ts +74 -0
  51. package/src/core/event-validation.ts +81 -6
  52. package/src/core/events.ts +99 -3
  53. package/src/core/evidence-links.ts +7 -0
  54. package/src/core/evidence.ts +13 -3
  55. package/src/core/execution.ts +8 -2
  56. package/src/core/experiment.ts +133 -0
  57. package/src/core/export.ts +9 -0
  58. package/src/core/failure-recovery.ts +173 -0
  59. package/src/core/file-precondition.ts +72 -0
  60. package/src/core/handoff.ts +65 -4
  61. package/src/core/harness-diagnostics.ts +206 -0
  62. package/src/core/history-query.ts +38 -2
  63. package/src/core/history.ts +38 -1
  64. package/src/core/integration-health.ts +34 -0
  65. package/src/core/keymap.ts +8 -20
  66. package/src/core/model-picker.ts +64 -0
  67. package/src/core/native-eval.ts +25 -0
  68. package/src/core/note-guidance.ts +34 -0
  69. package/src/core/oauth-fields.ts +44 -0
  70. package/src/core/observation-view.ts +49 -8
  71. package/src/core/permissions.ts +24 -2
  72. package/src/core/process-receipt.ts +105 -0
  73. package/src/core/process-state.ts +37 -0
  74. package/src/core/program-status.ts +31 -0
  75. package/src/core/project.ts +70 -19
  76. package/src/core/prompt-policy.ts +37 -0
  77. package/src/core/query-eval-contract.ts +14 -0
  78. package/src/core/read-observation.ts +82 -0
  79. package/src/core/recovery-corpus.ts +17 -0
  80. package/src/core/recovery-evaluation.ts +60 -0
  81. package/src/core/recovery-sources.ts +74 -0
  82. package/src/core/request-progress.ts +87 -0
  83. package/src/core/request-state.ts +114 -0
  84. package/src/core/runtime-target.ts +94 -0
  85. package/src/core/search-observation.ts +97 -0
  86. package/src/core/session-tree.ts +147 -0
  87. package/src/core/settings.ts +33 -10
  88. package/src/core/skills.ts +44 -0
  89. package/src/core/sql-query.ts +211 -0
  90. package/src/core/theme.ts +36 -58
  91. package/src/core/tool-contract.ts +51 -2
  92. package/src/core/tool-discovery.ts +87 -0
  93. package/src/core/tool-failure.ts +60 -0
  94. package/src/core/tool-input.ts +6 -0
  95. package/src/core/tool-mode-protocol.ts +25 -0
  96. package/src/core/transcript.ts +19 -4
  97. package/src/core/trial-lifecycle.ts +14 -0
  98. package/src/core/tui-mode.ts +29 -0
  99. package/src/core/update-check.ts +97 -0
  100. package/src/core/version.ts +55 -0
  101. package/src/core/work-state.ts +49 -3
  102. package/src/core/working-set.ts +91 -0
  103. package/src/runtime/auth.ts +11 -4
  104. package/src/runtime/branch-jobs.ts +36 -0
  105. package/src/runtime/catalog.ts +13 -3
  106. package/src/runtime/clipboard.ts +15 -4
  107. package/src/runtime/command-artifacts.ts +64 -0
  108. package/src/runtime/control-connection.ts +104 -0
  109. package/src/runtime/environment-tools.ts +60 -0
  110. package/src/runtime/evidence-notes.ts +4 -2
  111. package/src/runtime/exec-sessions.ts +206 -61
  112. package/src/runtime/execution-control.ts +1 -0
  113. package/src/runtime/extension-ui.ts +22 -30
  114. package/src/runtime/extensions.ts +95 -16
  115. package/src/runtime/harness-comparison.ts +27 -7
  116. package/src/runtime/harness-eval.ts +462 -0
  117. package/src/runtime/history-cache.ts +57 -0
  118. package/src/runtime/history-tools.ts +62 -12
  119. package/src/runtime/integrations.ts +210 -0
  120. package/src/runtime/loop.ts +1088 -282
  121. package/src/runtime/model-discovery.ts +208 -0
  122. package/src/runtime/model.ts +9 -0
  123. package/src/runtime/native-eval-fixtures.ts +33 -0
  124. package/src/runtime/native-eval.ts +146 -0
  125. package/src/runtime/oauth.ts +80 -3
  126. package/src/runtime/pi-provider.ts +169 -12
  127. package/src/runtime/program-status.ts +38 -0
  128. package/src/runtime/provider-connect.ts +109 -0
  129. package/src/runtime/provider-presets.ts +87 -0
  130. package/src/runtime/provider-request.ts +13 -2
  131. package/src/runtime/provider.ts +23 -9
  132. package/src/runtime/query-eval-verifier.ts +28 -0
  133. package/src/runtime/recovery-coverage.ts +71 -0
  134. package/src/runtime/recovery-evidence.ts +76 -0
  135. package/src/runtime/recovery-fixtures.ts +116 -0
  136. package/src/runtime/runtime-target.ts +149 -0
  137. package/src/runtime/session-control.ts +198 -0
  138. package/src/runtime/tool-broker.ts +137 -0
  139. package/src/runtime/tool-discovery.ts +57 -0
  140. package/src/runtime/tool-mode-eval.ts +146 -0
  141. package/src/runtime/tool-queue.ts +77 -0
  142. package/src/runtime/tools.ts +628 -183
  143. package/src/runtime/trial-control.ts +45 -0
  144. package/src/runtime/update-check.ts +47 -0
  145. package/src/runtime/window-trial.ts +2 -1
  146. package/src/runtime/working-notes.ts +33 -3
  147. package/src/runtime/workspace-lifecycle.ts +97 -0
  148. package/src/store/acceptance.ts +15 -0
  149. package/src/store/checkpoint-history.ts +43 -0
  150. package/src/store/command-artifacts.ts +96 -0
  151. package/src/store/command.ts +65 -37
  152. package/src/store/file-checkpoints.ts +104 -0
  153. package/src/store/file-index.ts +13 -1
  154. package/src/store/git-checkpoints.ts +67 -0
  155. package/src/store/observations.ts +61 -20
  156. package/src/store/process-receipts.ts +34 -0
  157. package/src/store/query-source.ts +13 -8
  158. package/src/store/recovery.ts +2 -3
  159. package/src/store/replay.ts +16 -4
  160. package/src/store/runtime-target.ts +64 -0
  161. package/src/store/search.ts +171 -132
  162. package/src/store/session-archive.ts +4 -0
  163. package/src/store/source-cancellation.ts +6 -0
  164. package/src/store/update-cache.ts +36 -0
  165. package/src/store/workspace-observation.ts +113 -0
  166. package/src/tui/ansi-spans.ts +126 -0
  167. package/src/tui/style.ts +19 -16
  168. package/src/tui/ui/atomic-draft.ts +121 -0
  169. package/src/tui/ui/canvas.ts +96 -0
  170. package/src/tui/ui/colors.ts +70 -0
  171. package/src/tui/ui/composer.ts +200 -0
  172. package/src/tui/ui/control-panel.ts +23 -0
  173. package/src/tui/ui/dialog.ts +379 -0
  174. package/src/tui/ui/draft.ts +23 -0
  175. package/src/tui/ui/edge.ts +186 -0
  176. package/src/tui/ui/image-size.ts +40 -0
  177. package/src/tui/ui/ink.ts +210 -0
  178. package/src/tui/ui/items.ts +40 -0
  179. package/src/tui/ui/keys.ts +40 -0
  180. package/src/tui/ui/layout.ts +74 -0
  181. package/src/tui/ui/list-model.ts +86 -0
  182. package/src/tui/ui/list-view.ts +172 -0
  183. package/src/tui/ui/mascot.ts +67 -0
  184. package/src/tui/ui/messages.ts +518 -0
  185. package/src/tui/ui/motion.ts +28 -0
  186. package/src/tui/ui/paths.ts +10 -0
  187. package/src/tui/ui/pictures.ts +78 -0
  188. package/src/tui/ui/screen.ts +421 -0
  189. package/src/tui/ui/status.ts +279 -0
  190. package/src/tui/ui/styled.ts +85 -0
  191. package/src/tui/ui/testing.ts +5 -0
  192. package/src/tui/ui/tool-card.ts +150 -0
  193. package/src/apps/extension-ui.ts +0 -330
  194. package/src/apps/resource-browser.ts +0 -75
  195. package/src/apps/session-browser.ts +0 -113
  196. package/src/apps/session-picker.ts +0 -55
  197. package/src/tui/ansi.ts +0 -67
  198. package/src/tui/autocomplete.ts +0 -29
  199. package/src/tui/chat-viewport.ts +0 -47
  200. package/src/tui/complete.ts +0 -87
  201. package/src/tui/editor.ts +0 -940
  202. package/src/tui/host.ts +0 -264
  203. package/src/tui/input.ts +0 -75
  204. package/src/tui/keys.ts +0 -378
  205. package/src/tui/markdown.ts +0 -17
  206. package/src/tui/render.ts +0 -153
  207. package/src/tui/select.ts +0 -258
  208. package/src/tui/settings.ts +0 -44
  209. package/src/tui/statusline.ts +0 -162
  210. package/src/tui/system-theme.ts +0 -700
  211. package/src/tui/terminal.ts +0 -30
  212. package/src/tui/text.ts +0 -52
  213. package/src/tui/toolview.ts +0 -386
  214. package/src/tui/transcript.ts +0 -123
  215. package/src/tui/tree.ts +0 -471
  216. package/src/vendor/pi-tui/LICENSE.upstream +0 -21
  217. package/src/vendor/pi-tui/UPSTREAM.json +0 -50
  218. package/src/vendor/pi-tui/VENDOR.md +0 -25
  219. package/src/vendor/pi-tui/alt-screen-search.ts +0 -327
  220. package/src/vendor/pi-tui/autocomplete.ts +0 -860
  221. package/src/vendor/pi-tui/colors.ts +0 -367
  222. package/src/vendor/pi-tui/components/alt-screen-flash.ts +0 -51
  223. package/src/vendor/pi-tui/components/box.ts +0 -166
  224. package/src/vendor/pi-tui/components/cancellable-loader.ts +0 -40
  225. package/src/vendor/pi-tui/components/editor.ts +0 -2472
  226. package/src/vendor/pi-tui/components/h-stack.ts +0 -44
  227. package/src/vendor/pi-tui/components/image.ts +0 -127
  228. package/src/vendor/pi-tui/components/input.ts +0 -494
  229. package/src/vendor/pi-tui/components/loader.ts +0 -101
  230. package/src/vendor/pi-tui/components/markdown.ts +0 -1021
  231. package/src/vendor/pi-tui/components/mouse-region.ts +0 -33
  232. package/src/vendor/pi-tui/components/scroll-view.ts +0 -224
  233. package/src/vendor/pi-tui/components/select-list.ts +0 -273
  234. package/src/vendor/pi-tui/components/settings-list.ts +0 -328
  235. package/src/vendor/pi-tui/components/spacer.ts +0 -28
  236. package/src/vendor/pi-tui/components/stack.ts +0 -154
  237. package/src/vendor/pi-tui/components/text.ts +0 -107
  238. package/src/vendor/pi-tui/components/truncated-text.ts +0 -65
  239. package/src/vendor/pi-tui/components/v-stack.ts +0 -33
  240. package/src/vendor/pi-tui/editor-component.ts +0 -74
  241. package/src/vendor/pi-tui/fuzzy.ts +0 -138
  242. package/src/vendor/pi-tui/index.ts +0 -186
  243. package/src/vendor/pi-tui/keybindings.ts +0 -320
  244. package/src/vendor/pi-tui/keys.ts +0 -1401
  245. package/src/vendor/pi-tui/kill-ring.ts +0 -46
  246. package/src/vendor/pi-tui/latex.ts +0 -1506
  247. package/src/vendor/pi-tui/layout-node.ts +0 -51
  248. package/src/vendor/pi-tui/layout.ts +0 -449
  249. package/src/vendor/pi-tui/native/UPSTREAM.json +0 -23
  250. package/src/vendor/pi-tui/native/clipboard.h +0 -208
  251. package/src/vendor/pi-tui/native/darwin/README.md +0 -22
  252. package/src/vendor/pi-tui/native/darwin/build.sh +0 -69
  253. package/src/vendor/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-platform.node +0 -0
  254. package/src/vendor/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-platform.node +0 -0
  255. package/src/vendor/pi-tui/native/darwin/src/darwin-platform.m +0 -132
  256. package/src/vendor/pi-tui/native/linux/README.md +0 -23
  257. package/src/vendor/pi-tui/native/linux/build.sh +0 -65
  258. package/src/vendor/pi-tui/native/linux/prebuilds/linux-arm64/linux-platform-x11.node +0 -0
  259. package/src/vendor/pi-tui/native/linux/prebuilds/linux-x64/linux-platform-x11.node +0 -0
  260. package/src/vendor/pi-tui/native/linux/src/clipboard-worker.h +0 -70
  261. package/src/vendor/pi-tui/native/linux/src/linux-platform-x11.c +0 -274
  262. package/src/vendor/pi-tui/native/napi.h +0 -91
  263. package/src/vendor/pi-tui/native/win32/README.md +0 -31
  264. package/src/vendor/pi-tui/native/win32/build.mjs +0 -232
  265. package/src/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-platform.node +0 -0
  266. package/src/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-platform.node +0 -0
  267. package/src/vendor/pi-tui/native/win32/src/win32-platform.c +0 -241
  268. package/src/vendor/pi-tui/native-modifiers.ts +0 -13
  269. package/src/vendor/pi-tui/native-module-path.ts +0 -31
  270. package/src/vendor/pi-tui/native-platform.ts +0 -65
  271. package/src/vendor/pi-tui/oklab.ts +0 -233
  272. package/src/vendor/pi-tui/stdin-buffer.ts +0 -444
  273. package/src/vendor/pi-tui/terminal-colors.ts +0 -91
  274. package/src/vendor/pi-tui/terminal-image.ts +0 -731
  275. package/src/vendor/pi-tui/terminal.ts +0 -554
  276. package/src/vendor/pi-tui/tui-alt-screen.ts +0 -1750
  277. package/src/vendor/pi-tui/tui-main-screen.ts +0 -655
  278. package/src/vendor/pi-tui/tui.ts +0 -1493
  279. package/src/vendor/pi-tui/undo-stack.ts +0 -28
  280. package/src/vendor/pi-tui/utils.ts +0 -1385
  281. package/src/vendor/pi-tui/wheel-scroll.ts +0 -82
  282. package/src/vendor/pi-tui/word-navigation.ts +0 -117
@@ -1,320 +0,0 @@
1
- import { type KeyId, matchesKey } from "./keys.ts";
2
-
3
- /**
4
- * Global keybinding registry.
5
- * Downstream packages can add keybindings via declaration merging.
6
- */
7
- export interface Keybindings {
8
- // Editor navigation and editing
9
- "tui.editor.cursorUp": true;
10
- "tui.editor.cursorDown": true;
11
- "tui.editor.historyPrevious": true;
12
- "tui.editor.historyNext": true;
13
- "tui.editor.cursorLeft": true;
14
- "tui.editor.cursorRight": true;
15
- "tui.editor.cursorWordLeft": true;
16
- "tui.editor.cursorWordRight": true;
17
- "tui.editor.cursorLineStart": true;
18
- "tui.editor.cursorLineEnd": true;
19
- "tui.editor.jumpForward": true;
20
- "tui.editor.jumpBackward": true;
21
- "tui.editor.pageUp": true;
22
- "tui.editor.pageDown": true;
23
- "tui.editor.deleteCharBackward": true;
24
- "tui.editor.deleteCharForward": true;
25
- "tui.editor.deleteWordBackward": true;
26
- "tui.editor.deleteWordForward": true;
27
- "tui.editor.deleteToLineStart": true;
28
- "tui.editor.deleteToLineEnd": true;
29
- "tui.editor.yank": true;
30
- "tui.editor.yankPop": true;
31
- "tui.editor.undo": true;
32
- // Generic input actions
33
- "tui.input.newLine": true;
34
- "tui.input.submit": true;
35
- "tui.input.tab": true;
36
- "tui.input.copy": true;
37
- // Generic selection actions
38
- "tui.select.up": true;
39
- "tui.select.down": true;
40
- "tui.select.pageUp": true;
41
- "tui.select.pageDown": true;
42
- "tui.select.confirm": true;
43
- "tui.select.cancel": true;
44
- // Alternate-screen viewport navigation
45
- "tui.altScreen.pageUp": true;
46
- "tui.altScreen.pageDown": true;
47
- "tui.altScreen.halfPageUp": true;
48
- "tui.altScreen.halfPageDown": true;
49
- "tui.altScreen.lineUp": true;
50
- "tui.altScreen.lineDown": true;
51
- "tui.altScreen.previousPrompt": true;
52
- "tui.altScreen.nextPrompt": true;
53
- "tui.altScreen.search": true;
54
- "tui.altScreen.searchNext": true;
55
- "tui.altScreen.searchPrevious": true;
56
- "tui.altScreen.searchClose": true;
57
- "tui.altScreen.top": true;
58
- "tui.altScreen.bottom": true;
59
- }
60
-
61
- export type Keybinding = keyof Keybindings;
62
-
63
- export interface KeybindingDefinition {
64
- defaultKeys: KeyId | KeyId[];
65
- description?: string;
66
- }
67
-
68
- export type KeybindingDefinitions = Record<string, KeybindingDefinition>;
69
- export type KeybindingsConfig = Record<string, KeyId | KeyId[] | undefined>;
70
-
71
- export const TUI_KEYBINDINGS = {
72
- "tui.editor.cursorUp": { defaultKeys: "up", description: "Move cursor up" },
73
- "tui.editor.cursorDown": { defaultKeys: "down", description: "Move cursor down" },
74
- "tui.editor.historyPrevious": {
75
- defaultKeys: [],
76
- description: "Select previous prompt history entry",
77
- },
78
- "tui.editor.historyNext": {
79
- defaultKeys: [],
80
- description: "Select next prompt history entry",
81
- },
82
- "tui.editor.cursorLeft": {
83
- defaultKeys: ["left", "ctrl+b"],
84
- description: "Move cursor left",
85
- },
86
- "tui.editor.cursorRight": {
87
- defaultKeys: ["right", "ctrl+f"],
88
- description: "Move cursor right",
89
- },
90
- "tui.editor.cursorWordLeft": {
91
- defaultKeys: ["alt+left", "ctrl+left", "alt+b"],
92
- description: "Move cursor word left",
93
- },
94
- "tui.editor.cursorWordRight": {
95
- defaultKeys: ["alt+right", "ctrl+right", "alt+f"],
96
- description: "Move cursor word right",
97
- },
98
- "tui.editor.cursorLineStart": {
99
- defaultKeys: ["home", "ctrl+home", "ctrl+a"],
100
- description: "Move to line start",
101
- },
102
- "tui.editor.cursorLineEnd": {
103
- defaultKeys: ["end", "ctrl+end", "ctrl+e"],
104
- description: "Move to line end",
105
- },
106
- "tui.editor.jumpForward": {
107
- defaultKeys: "ctrl+]",
108
- description: "Jump forward to character",
109
- },
110
- "tui.editor.jumpBackward": {
111
- defaultKeys: "ctrl+alt+]",
112
- description: "Jump backward to character",
113
- },
114
- "tui.editor.pageUp": { defaultKeys: ["pageUp", "ctrl+pageUp"], description: "Page up" },
115
- "tui.editor.pageDown": { defaultKeys: ["pageDown", "ctrl+pageDown"], description: "Page down" },
116
- "tui.editor.deleteCharBackward": {
117
- defaultKeys: "backspace",
118
- description: "Delete character backward",
119
- },
120
- "tui.editor.deleteCharForward": {
121
- defaultKeys: ["delete", "ctrl+d"],
122
- description: "Delete character forward",
123
- },
124
- "tui.editor.deleteWordBackward": {
125
- defaultKeys: ["ctrl+w", "alt+backspace"],
126
- description: "Delete word backward",
127
- },
128
- "tui.editor.deleteWordForward": {
129
- defaultKeys: ["alt+d", "alt+delete"],
130
- description: "Delete word forward",
131
- },
132
- "tui.editor.deleteToLineStart": {
133
- defaultKeys: "ctrl+u",
134
- description: "Delete to line start",
135
- },
136
- "tui.editor.deleteToLineEnd": {
137
- defaultKeys: "ctrl+k",
138
- description: "Delete to line end",
139
- },
140
- "tui.editor.yank": { defaultKeys: "ctrl+y", description: "Yank" },
141
- "tui.editor.yankPop": { defaultKeys: "alt+y", description: "Yank pop" },
142
- "tui.editor.undo": { defaultKeys: "ctrl+-", description: "Undo" },
143
- "tui.input.newLine": { defaultKeys: ["shift+enter", "ctrl+j"], description: "Insert newline" },
144
- "tui.input.submit": { defaultKeys: "enter", description: "Submit input" },
145
- "tui.input.tab": { defaultKeys: "tab", description: "Tab / autocomplete" },
146
- "tui.input.copy": { defaultKeys: "ctrl+c", description: "Copy selection" },
147
- "tui.select.up": { defaultKeys: "up", description: "Move selection up" },
148
- "tui.select.down": { defaultKeys: "down", description: "Move selection down" },
149
- "tui.select.pageUp": { defaultKeys: "pageUp", description: "Selection page up" },
150
- "tui.select.pageDown": {
151
- defaultKeys: "pageDown",
152
- description: "Selection page down",
153
- },
154
- "tui.select.confirm": { defaultKeys: "enter", description: "Confirm selection" },
155
- "tui.select.cancel": {
156
- defaultKeys: ["escape", "ctrl+c"],
157
- description: "Cancel selection",
158
- },
159
- // These intentionally shadow the unmodified editor bindings in fullscreen mode.
160
- "tui.altScreen.pageUp": {
161
- defaultKeys: "pageUp",
162
- description: "Scroll viewport up one page",
163
- },
164
- "tui.altScreen.pageDown": {
165
- defaultKeys: "pageDown",
166
- description: "Scroll viewport down one page",
167
- },
168
- "tui.altScreen.halfPageUp": {
169
- defaultKeys: [],
170
- description: "Scroll viewport up half a page",
171
- },
172
- "tui.altScreen.halfPageDown": {
173
- defaultKeys: [],
174
- description: "Scroll viewport down half a page",
175
- },
176
- "tui.altScreen.lineUp": {
177
- defaultKeys: [],
178
- description: "Scroll viewport up one line",
179
- },
180
- "tui.altScreen.lineDown": {
181
- defaultKeys: [],
182
- description: "Scroll viewport down one line",
183
- },
184
- "tui.altScreen.previousPrompt": {
185
- defaultKeys: ["ctrl+shift+up", "ctrl+up"],
186
- description: "Jump to previous semantic prompt",
187
- },
188
- "tui.altScreen.nextPrompt": {
189
- defaultKeys: ["ctrl+shift+down", "ctrl+down"],
190
- description: "Jump to next semantic prompt",
191
- },
192
- "tui.altScreen.search": {
193
- defaultKeys: "ctrl+shift+f",
194
- description: "Search the primary scroll view",
195
- },
196
- "tui.altScreen.searchNext": {
197
- defaultKeys: ["enter", "ctrl+g"],
198
- description: "Select the next search match",
199
- },
200
- "tui.altScreen.searchPrevious": {
201
- defaultKeys: ["shift+enter", "ctrl+shift+g"],
202
- description: "Select the previous search match",
203
- },
204
- "tui.altScreen.searchClose": {
205
- defaultKeys: "escape",
206
- description: "Close transcript search",
207
- },
208
- "tui.altScreen.top": { defaultKeys: "home", description: "Scroll viewport to top" },
209
- "tui.altScreen.bottom": { defaultKeys: "end", description: "Scroll viewport to bottom" },
210
- } as const satisfies KeybindingDefinitions;
211
-
212
- export interface KeybindingConflict {
213
- key: KeyId;
214
- keybindings: string[];
215
- }
216
-
217
- function normalizeKeys(keys: KeyId | KeyId[] | undefined): KeyId[] {
218
- if (keys === undefined) return [];
219
- const keyList = Array.isArray(keys) ? keys : [keys];
220
- const seen = new Set<KeyId>();
221
- const result: KeyId[] = [];
222
- for (const key of keyList) {
223
- if (!seen.has(key)) {
224
- seen.add(key);
225
- result.push(key);
226
- }
227
- }
228
- return result;
229
- }
230
-
231
- export class KeybindingsManager {
232
- private definitions: KeybindingDefinitions;
233
- private userBindings: KeybindingsConfig;
234
- private keysById = new Map<Keybinding, KeyId[]>();
235
- private conflicts: KeybindingConflict[] = [];
236
-
237
- constructor(definitions: KeybindingDefinitions, userBindings: KeybindingsConfig = {}) {
238
- this.definitions = definitions;
239
- this.userBindings = userBindings;
240
- this.rebuild();
241
- }
242
-
243
- private rebuild(): void {
244
- this.keysById.clear();
245
- this.conflicts = [];
246
-
247
- const userClaims = new Map<KeyId, Set<Keybinding>>();
248
- for (const [keybinding, keys] of Object.entries(this.userBindings)) {
249
- if (!(keybinding in this.definitions)) continue;
250
- for (const key of normalizeKeys(keys)) {
251
- const claimants = userClaims.get(key) ?? new Set<Keybinding>();
252
- claimants.add(keybinding as Keybinding);
253
- userClaims.set(key, claimants);
254
- }
255
- }
256
-
257
- for (const [key, keybindings] of userClaims) {
258
- if (keybindings.size > 1) {
259
- this.conflicts.push({ key, keybindings: [...keybindings] });
260
- }
261
- }
262
-
263
- for (const [id, definition] of Object.entries(this.definitions)) {
264
- const userKeys = this.userBindings[id];
265
- const keys = userKeys === undefined ? normalizeKeys(definition.defaultKeys) : normalizeKeys(userKeys);
266
- this.keysById.set(id as Keybinding, keys);
267
- }
268
- }
269
-
270
- matches(data: string, keybinding: Keybinding): boolean {
271
- const keys = this.keysById.get(keybinding) ?? [];
272
- for (const key of keys) {
273
- if (matchesKey(data, key)) return true;
274
- }
275
- return false;
276
- }
277
-
278
- getKeys(keybinding: Keybinding): KeyId[] {
279
- return [...(this.keysById.get(keybinding) ?? [])];
280
- }
281
-
282
- getDefinition(keybinding: Keybinding): KeybindingDefinition {
283
- return this.definitions[keybinding];
284
- }
285
-
286
- getConflicts(): KeybindingConflict[] {
287
- return this.conflicts.map((conflict) => ({ ...conflict, keybindings: [...conflict.keybindings] }));
288
- }
289
-
290
- setUserBindings(userBindings: KeybindingsConfig): void {
291
- this.userBindings = userBindings;
292
- this.rebuild();
293
- }
294
-
295
- getUserBindings(): KeybindingsConfig {
296
- return { ...this.userBindings };
297
- }
298
-
299
- getResolvedBindings(): KeybindingsConfig {
300
- const resolved: KeybindingsConfig = {};
301
- for (const id of Object.keys(this.definitions)) {
302
- const keys = this.keysById.get(id as Keybinding) ?? [];
303
- resolved[id] = keys.length === 1 ? keys[0]! : [...keys];
304
- }
305
- return resolved;
306
- }
307
- }
308
-
309
- let globalKeybindings: KeybindingsManager | null = null;
310
-
311
- export function setKeybindings(keybindings: KeybindingsManager): void {
312
- globalKeybindings = keybindings;
313
- }
314
-
315
- export function getKeybindings(): KeybindingsManager {
316
- if (!globalKeybindings) {
317
- globalKeybindings = new KeybindingsManager(TUI_KEYBINDINGS);
318
- }
319
- return globalKeybindings;
320
- }