@elaraai/e3-ui-cli 1.0.72 → 1.0.74

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 (220) hide show
  1. package/README.md +46 -21
  2. package/bin/e3-ui.mjs +6 -0
  3. package/dist/app/assets/{engine-BKZbmXkC-DmcCFcnb.js → engine-Bm-cIDd_-DwUdGcTZ.js} +1 -1
  4. package/dist/app/assets/{index-BJNWHnRv.js → index-mj-YVVN1.js} +91 -91
  5. package/dist/app/index.html +1 -1
  6. package/dist/cli.js +36 -5
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/tui.d.ts +84 -0
  9. package/dist/commands/tui.d.ts.map +1 -0
  10. package/dist/commands/tui.js +89 -0
  11. package/dist/commands/tui.js.map +1 -0
  12. package/dist/tui/api.d.ts +108 -0
  13. package/dist/tui/api.d.ts.map +1 -0
  14. package/dist/tui/api.js +130 -0
  15. package/dist/tui/api.js.map +1 -0
  16. package/dist/tui/app.d.ts +23 -0
  17. package/dist/tui/app.d.ts.map +1 -0
  18. package/dist/tui/app.js +244 -0
  19. package/dist/tui/app.js.map +1 -0
  20. package/dist/tui/controller.d.ts +116 -0
  21. package/dist/tui/controller.d.ts.map +1 -0
  22. package/dist/tui/controller.js +644 -0
  23. package/dist/tui/controller.js.map +1 -0
  24. package/dist/tui/data/dataflow.d.ts +68 -0
  25. package/dist/tui/data/dataflow.d.ts.map +1 -0
  26. package/dist/tui/data/dataflow.js +137 -0
  27. package/dist/tui/data/dataflow.js.map +1 -0
  28. package/dist/tui/data/dataset.d.ts +80 -0
  29. package/dist/tui/data/dataset.d.ts.map +1 -0
  30. package/dist/tui/data/dataset.js +297 -0
  31. package/dist/tui/data/dataset.js.map +1 -0
  32. package/dist/tui/data/edit-buffer.d.ts +74 -0
  33. package/dist/tui/data/edit-buffer.d.ts.map +1 -0
  34. package/dist/tui/data/edit-buffer.js +120 -0
  35. package/dist/tui/data/edit-buffer.js.map +1 -0
  36. package/dist/tui/data/feeds.d.ts +45 -0
  37. package/dist/tui/data/feeds.d.ts.map +1 -0
  38. package/dist/tui/data/feeds.js +318 -0
  39. package/dist/tui/data/feeds.js.map +1 -0
  40. package/dist/tui/data/logs.d.ts +68 -0
  41. package/dist/tui/data/logs.d.ts.map +1 -0
  42. package/dist/tui/data/logs.js +134 -0
  43. package/dist/tui/data/logs.js.map +1 -0
  44. package/dist/tui/input/commands.d.ts +159 -0
  45. package/dist/tui/input/commands.d.ts.map +1 -0
  46. package/dist/tui/input/commands.js +259 -0
  47. package/dist/tui/input/commands.js.map +1 -0
  48. package/dist/tui/input/completion.d.ts +63 -0
  49. package/dist/tui/input/completion.d.ts.map +1 -0
  50. package/dist/tui/input/completion.js +128 -0
  51. package/dist/tui/input/completion.js.map +1 -0
  52. package/dist/tui/input/keymap.d.ts +153 -0
  53. package/dist/tui/input/keymap.d.ts.map +1 -0
  54. package/dist/tui/input/keymap.js +206 -0
  55. package/dist/tui/input/keymap.js.map +1 -0
  56. package/dist/tui/input/mouse.d.ts +52 -0
  57. package/dist/tui/input/mouse.d.ts.map +1 -0
  58. package/dist/tui/input/mouse.js +55 -0
  59. package/dist/tui/input/mouse.js.map +1 -0
  60. package/dist/tui/lifecycle.d.ts +61 -0
  61. package/dist/tui/lifecycle.d.ts.map +1 -0
  62. package/dist/tui/lifecycle.js +99 -0
  63. package/dist/tui/lifecycle.js.map +1 -0
  64. package/dist/tui/model/catalogue.d.ts +28 -0
  65. package/dist/tui/model/catalogue.d.ts.map +1 -0
  66. package/dist/tui/model/catalogue.js +94 -0
  67. package/dist/tui/model/catalogue.js.map +1 -0
  68. package/dist/tui/model/help.d.ts +37 -0
  69. package/dist/tui/model/help.d.ts.map +1 -0
  70. package/dist/tui/model/help.js +210 -0
  71. package/dist/tui/model/help.js.map +1 -0
  72. package/dist/tui/model/index.d.ts +42 -0
  73. package/dist/tui/model/index.d.ts.map +1 -0
  74. package/dist/tui/model/index.js +50 -0
  75. package/dist/tui/model/index.js.map +1 -0
  76. package/dist/tui/model/status.d.ts +88 -0
  77. package/dist/tui/model/status.d.ts.map +1 -0
  78. package/dist/tui/model/status.js +137 -0
  79. package/dist/tui/model/status.js.map +1 -0
  80. package/dist/tui/model/tree.d.ts +126 -0
  81. package/dist/tui/model/tree.d.ts.map +1 -0
  82. package/dist/tui/model/tree.js +217 -0
  83. package/dist/tui/model/tree.js.map +1 -0
  84. package/dist/tui/model/types.d.ts +21 -0
  85. package/dist/tui/model/types.d.ts.map +1 -0
  86. package/dist/tui/model/types.js +46 -0
  87. package/dist/tui/model/types.js.map +1 -0
  88. package/dist/tui/render/glyphs.d.ts +122 -0
  89. package/dist/tui/render/glyphs.d.ts.map +1 -0
  90. package/dist/tui/render/glyphs.js +122 -0
  91. package/dist/tui/render/glyphs.js.map +1 -0
  92. package/dist/tui/render/layout.d.ts +145 -0
  93. package/dist/tui/render/layout.d.ts.map +1 -0
  94. package/dist/tui/render/layout.js +209 -0
  95. package/dist/tui/render/layout.js.map +1 -0
  96. package/dist/tui/render/text.d.ts +153 -0
  97. package/dist/tui/render/text.d.ts.map +1 -0
  98. package/dist/tui/render/text.js +320 -0
  99. package/dist/tui/render/text.js.map +1 -0
  100. package/dist/tui/render/theme.d.ts +88 -0
  101. package/dist/tui/render/theme.d.ts.map +1 -0
  102. package/dist/tui/render/theme.js +145 -0
  103. package/dist/tui/render/theme.js.map +1 -0
  104. package/dist/tui/session.d.ts +78 -0
  105. package/dist/tui/session.d.ts.map +1 -0
  106. package/dist/tui/session.js +237 -0
  107. package/dist/tui/session.js.map +1 -0
  108. package/dist/tui/state/actions.d.ts +584 -0
  109. package/dist/tui/state/actions.d.ts.map +1 -0
  110. package/dist/tui/state/actions.js +62 -0
  111. package/dist/tui/state/actions.js.map +1 -0
  112. package/dist/tui/state/persist.d.ts +114 -0
  113. package/dist/tui/state/persist.d.ts.map +1 -0
  114. package/dist/tui/state/persist.js +187 -0
  115. package/dist/tui/state/persist.js.map +1 -0
  116. package/dist/tui/state/poll.d.ts +99 -0
  117. package/dist/tui/state/poll.d.ts.map +1 -0
  118. package/dist/tui/state/poll.js +160 -0
  119. package/dist/tui/state/poll.js.map +1 -0
  120. package/dist/tui/state/reducer.d.ts +16 -0
  121. package/dist/tui/state/reducer.d.ts.map +1 -0
  122. package/dist/tui/state/reducer.js +363 -0
  123. package/dist/tui/state/reducer.js.map +1 -0
  124. package/dist/tui/state/store.d.ts +37 -0
  125. package/dist/tui/state/store.d.ts.map +1 -0
  126. package/dist/tui/state/store.js +84 -0
  127. package/dist/tui/state/store.js.map +1 -0
  128. package/dist/tui/suspend.d.ts +17 -0
  129. package/dist/tui/suspend.d.ts.map +1 -0
  130. package/dist/tui/suspend.js +33 -0
  131. package/dist/tui/suspend.js.map +1 -0
  132. package/dist/tui/ui/App.d.ts +44 -0
  133. package/dist/tui/ui/App.d.ts.map +1 -0
  134. package/dist/tui/ui/App.js +105 -0
  135. package/dist/tui/ui/App.js.map +1 -0
  136. package/dist/tui/ui/frame.d.ts +86 -0
  137. package/dist/tui/ui/frame.d.ts.map +1 -0
  138. package/dist/tui/ui/frame.js +42 -0
  139. package/dist/tui/ui/frame.js.map +1 -0
  140. package/dist/tui/ui/lines.d.ts +92 -0
  141. package/dist/tui/ui/lines.d.ts.map +1 -0
  142. package/dist/tui/ui/lines.js +94 -0
  143. package/dist/tui/ui/lines.js.map +1 -0
  144. package/dist/tui/ui/shell/chrome.d.ts +61 -0
  145. package/dist/tui/ui/shell/chrome.d.ts.map +1 -0
  146. package/dist/tui/ui/shell/chrome.js +272 -0
  147. package/dist/tui/ui/shell/chrome.js.map +1 -0
  148. package/dist/tui/ui/shell/widgets.d.ts +116 -0
  149. package/dist/tui/ui/shell/widgets.d.ts.map +1 -0
  150. package/dist/tui/ui/shell/widgets.js +183 -0
  151. package/dist/tui/ui/shell/widgets.js.map +1 -0
  152. package/dist/tui/ui/views/about.d.ts +20 -0
  153. package/dist/tui/ui/views/about.d.ts.map +1 -0
  154. package/dist/tui/ui/views/about.js +40 -0
  155. package/dist/tui/ui/views/about.js.map +1 -0
  156. package/dist/tui/ui/views/all.d.ts +17 -0
  157. package/dist/tui/ui/views/all.d.ts.map +1 -0
  158. package/dist/tui/ui/views/all.js +17 -0
  159. package/dist/tui/ui/views/all.js.map +1 -0
  160. package/dist/tui/ui/views/dashboard.d.ts +211 -0
  161. package/dist/tui/ui/views/dashboard.d.ts.map +1 -0
  162. package/dist/tui/ui/views/dashboard.js +651 -0
  163. package/dist/tui/ui/views/dashboard.js.map +1 -0
  164. package/dist/tui/ui/views/help.d.ts +17 -0
  165. package/dist/tui/ui/views/help.d.ts.map +1 -0
  166. package/dist/tui/ui/views/help.js +65 -0
  167. package/dist/tui/ui/views/help.js.map +1 -0
  168. package/dist/tui/ui/views/index.d.ts +42 -0
  169. package/dist/tui/ui/views/index.d.ts.map +1 -0
  170. package/dist/tui/ui/views/index.js +42 -0
  171. package/dist/tui/ui/views/index.js.map +1 -0
  172. package/dist/tui/ui/views/input.d.ts +6 -0
  173. package/dist/tui/ui/views/input.d.ts.map +1 -0
  174. package/dist/tui/ui/views/input.js +494 -0
  175. package/dist/tui/ui/views/input.js.map +1 -0
  176. package/dist/tui/ui/views/launch.d.ts +16 -0
  177. package/dist/tui/ui/views/launch.d.ts.map +1 -0
  178. package/dist/tui/ui/views/launch.js +43 -0
  179. package/dist/tui/ui/views/launch.js.map +1 -0
  180. package/dist/tui/ui/views/refusal.d.ts +20 -0
  181. package/dist/tui/ui/views/refusal.d.ts.map +1 -0
  182. package/dist/tui/ui/views/refusal.js +47 -0
  183. package/dist/tui/ui/views/refusal.js.map +1 -0
  184. package/dist/tui/ui/views/repos.d.ts +10 -0
  185. package/dist/tui/ui/views/repos.d.ts.map +1 -0
  186. package/dist/tui/ui/views/repos.js +93 -0
  187. package/dist/tui/ui/views/repos.js.map +1 -0
  188. package/dist/tui/ui/views/task.d.ts +17 -0
  189. package/dist/tui/ui/views/task.d.ts.map +1 -0
  190. package/dist/tui/ui/views/task.js +309 -0
  191. package/dist/tui/ui/views/task.js.map +1 -0
  192. package/dist/tui/ui/views/wordmark.d.ts +15 -0
  193. package/dist/tui/ui/views/wordmark.d.ts.map +1 -0
  194. package/dist/tui/ui/views/wordmark.js +50 -0
  195. package/dist/tui/ui/views/wordmark.js.map +1 -0
  196. package/dist/tui/ui/views/workspaces.d.ts +17 -0
  197. package/dist/tui/ui/views/workspaces.d.ts.map +1 -0
  198. package/dist/tui/ui/views/workspaces.js +127 -0
  199. package/dist/tui/ui/views/workspaces.js.map +1 -0
  200. package/dist/tui/ui/widgets/leaf-editor.d.ts +58 -0
  201. package/dist/tui/ui/widgets/leaf-editor.d.ts.map +1 -0
  202. package/dist/tui/ui/widgets/leaf-editor.js +119 -0
  203. package/dist/tui/ui/widgets/leaf-editor.js.map +1 -0
  204. package/dist/tui/ui/widgets/logs.d.ts +99 -0
  205. package/dist/tui/ui/widgets/logs.d.ts.map +1 -0
  206. package/dist/tui/ui/widgets/logs.js +291 -0
  207. package/dist/tui/ui/widgets/logs.js.map +1 -0
  208. package/dist/tui/ui/widgets/reads.d.ts +62 -0
  209. package/dist/tui/ui/widgets/reads.d.ts.map +1 -0
  210. package/dist/tui/ui/widgets/reads.js +122 -0
  211. package/dist/tui/ui/widgets/reads.js.map +1 -0
  212. package/dist/tui/ui/widgets/runs.d.ts +51 -0
  213. package/dist/tui/ui/widgets/runs.d.ts.map +1 -0
  214. package/dist/tui/ui/widgets/runs.js +86 -0
  215. package/dist/tui/ui/widgets/runs.js.map +1 -0
  216. package/dist/tui/ui/widgets/tree.d.ts +149 -0
  217. package/dist/tui/ui/widgets/tree.d.ts.map +1 -0
  218. package/dist/tui/ui/widgets/tree.js +584 -0
  219. package/dist/tui/ui/widgets/tree.js.map +1 -0
  220. package/package.json +22 -12
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * The keymap — `resolve(input, key, ctx)` turns one Ink key event into a
7
+ * semantic {@link KeyAction} by scope: the command box while editing, a
8
+ * leaf editor while editing, then the view's own keys (list / tree / logs /
9
+ * inputs), then the keys that work everywhere. Vim aliases (`j k h l`,
10
+ * `gg G`, `^u ^d`) ride along.
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ import type { Key } from 'ink';
15
+ /** Where the key lands. */
16
+ export type KeyScope = 'list' | 'tree' | 'logs' | 'none';
17
+ /** What the keymap needs to know. */
18
+ export interface KeyContext {
19
+ /** The command box mode. */
20
+ commandMode: 'idle' | 'edit' | 'confirm';
21
+ /** Whether a leaf editor is open. */
22
+ editingLeaf: boolean;
23
+ /** The view's primary scope. */
24
+ scope: KeyScope;
25
+ /** Whether the view is an editable input. */
26
+ editable: boolean;
27
+ /** Whether the view has numbered tabs. */
28
+ tabs: number;
29
+ /** A pending multi-key prefix (`g`). */
30
+ pendingKey: string | null;
31
+ }
32
+ /** A semantic key action. */
33
+ export type KeyAction = {
34
+ kind: 'move';
35
+ op: 'up' | 'down' | 'pageUp' | 'pageDown' | 'home' | 'end';
36
+ } | {
37
+ kind: 'open';
38
+ } | {
39
+ kind: 'back';
40
+ } | {
41
+ kind: 'quit';
42
+ } | {
43
+ kind: 'help';
44
+ } | {
45
+ kind: 'refresh';
46
+ } | {
47
+ kind: 'tab';
48
+ index: number;
49
+ } | {
50
+ kind: 'tab.cycle';
51
+ delta: 1 | -1;
52
+ } | {
53
+ kind: 'prefill';
54
+ text: string;
55
+ } | {
56
+ kind: 'type';
57
+ text: string;
58
+ } | {
59
+ kind: 'expand';
60
+ } | {
61
+ kind: 'collapse';
62
+ } | {
63
+ kind: 'toggle';
64
+ } | {
65
+ kind: 'collapseDeep';
66
+ } | {
67
+ kind: 'save';
68
+ } | {
69
+ kind: 'follow';
70
+ } | {
71
+ kind: 'next';
72
+ } | {
73
+ kind: 'prev';
74
+ } | {
75
+ kind: 'copy';
76
+ } | {
77
+ kind: 'edit';
78
+ } | {
79
+ kind: 'add';
80
+ } | {
81
+ kind: 'remove';
82
+ } | {
83
+ kind: 'tag';
84
+ } | {
85
+ kind: 'apply';
86
+ } | {
87
+ kind: 'discard';
88
+ } | {
89
+ kind: 'retry';
90
+ } | {
91
+ kind: 'pending';
92
+ key: string;
93
+ } | {
94
+ kind: 'paste';
95
+ text: string;
96
+ submit: boolean;
97
+ } | {
98
+ kind: 'cmd.submit';
99
+ } | {
100
+ kind: 'cmd.cancel';
101
+ } | {
102
+ kind: 'cmd.complete';
103
+ } | {
104
+ kind: 'cmd.up';
105
+ } | {
106
+ kind: 'cmd.down';
107
+ } | {
108
+ kind: 'cmd.left';
109
+ } | {
110
+ kind: 'cmd.right';
111
+ } | {
112
+ kind: 'cmd.home';
113
+ } | {
114
+ kind: 'cmd.end';
115
+ } | {
116
+ kind: 'cmd.backspace';
117
+ } | {
118
+ kind: 'cmd.delete';
119
+ } | {
120
+ kind: 'cmd.char';
121
+ text: string;
122
+ } | {
123
+ kind: 'leaf.submit';
124
+ } | {
125
+ kind: 'leaf.cancel';
126
+ } | {
127
+ kind: 'leaf.left';
128
+ } | {
129
+ kind: 'leaf.right';
130
+ } | {
131
+ kind: 'leaf.home';
132
+ } | {
133
+ kind: 'leaf.end';
134
+ } | {
135
+ kind: 'leaf.backspace';
136
+ } | {
137
+ kind: 'leaf.delete';
138
+ } | {
139
+ kind: 'leaf.char';
140
+ text: string;
141
+ } | {
142
+ kind: 'leaf.toggle';
143
+ };
144
+ /**
145
+ * Resolves one key event.
146
+ *
147
+ * @param input - Ink's `input` (the printable text, or `''` for special keys)
148
+ * @param key - Ink's `key` flags
149
+ * @param ctx - The context
150
+ * @returns The action, or null when the key means nothing here
151
+ */
152
+ export declare function resolve(input: string, key: Key, ctx: KeyContext): KeyAction | null;
153
+ //# sourceMappingURL=keymap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymap.d.ts","sourceRoot":"","sources":["../../../src/tui/input/keymap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /** Whether an input string is printable text (one or more characters, no controls). */
6
+ function isPrintable(input) {
7
+ if (input === '')
8
+ return false;
9
+ for (const ch of input) {
10
+ const cp = ch.codePointAt(0) ?? 0;
11
+ if (cp < 0x20 || (cp >= 0x7f && cp < 0xa0))
12
+ return false;
13
+ }
14
+ return true;
15
+ }
16
+ /**
17
+ * Resolves one key event.
18
+ *
19
+ * @param input - Ink's `input` (the printable text, or `''` for special keys)
20
+ * @param key - Ink's `key` flags
21
+ * @param ctx - The context
22
+ * @returns The action, or null when the key means nothing here
23
+ */
24
+ export function resolve(input, key, ctx) {
25
+ // Ctrl-C is always quit (we own Ctrl-C: exitOnCtrlC is off so a dirty
26
+ // input can confirm first).
27
+ if (key.ctrl && input === 'c')
28
+ return { kind: 'quit' };
29
+ // A paste (or a terminal delivering several keys in one chunk) arrives
30
+ // as one string: it is typed into the command box, and a trailing
31
+ // newline submits it.
32
+ if (input.length > 1 && !key.ctrl && !key.meta && !ctx.editingLeaf && ctx.commandMode !== 'confirm') {
33
+ const submit = /[\r\n]$/.test(input);
34
+ const text = input.replace(/[\r\n]+$/, '');
35
+ if (text !== '' && isPrintable(text))
36
+ return { kind: 'paste', text, submit };
37
+ }
38
+ if (ctx.commandMode === 'confirm') {
39
+ if (key.return)
40
+ return { kind: 'cmd.submit' };
41
+ if (key.escape)
42
+ return { kind: 'cmd.cancel' };
43
+ if (input === 'y' || input === 'Y')
44
+ return { kind: 'cmd.submit' };
45
+ if (input === 'n' || input === 'N')
46
+ return { kind: 'cmd.cancel' };
47
+ return null;
48
+ }
49
+ if (ctx.commandMode === 'edit') {
50
+ if (key.return)
51
+ return { kind: 'cmd.submit' };
52
+ if (key.escape)
53
+ return { kind: 'cmd.cancel' };
54
+ if (key.tab)
55
+ return { kind: 'cmd.complete' };
56
+ if (key.upArrow || (key.ctrl && input === 'p'))
57
+ return { kind: 'cmd.up' };
58
+ if (key.downArrow || (key.ctrl && input === 'n'))
59
+ return { kind: 'cmd.down' };
60
+ if (key.leftArrow)
61
+ return { kind: 'cmd.left' };
62
+ if (key.rightArrow)
63
+ return { kind: 'cmd.right' };
64
+ if (key.home || (key.ctrl && input === 'a'))
65
+ return { kind: 'cmd.home' };
66
+ if (key.end || (key.ctrl && input === 'e'))
67
+ return { kind: 'cmd.end' };
68
+ if (key.backspace)
69
+ return { kind: 'cmd.backspace' };
70
+ if (key.delete)
71
+ return { kind: 'cmd.delete' };
72
+ if (key.ctrl && input === 'u')
73
+ return { kind: 'cmd.cancel' };
74
+ if (!key.ctrl && !key.meta && isPrintable(input))
75
+ return { kind: 'cmd.char', text: input };
76
+ return null;
77
+ }
78
+ if (ctx.editingLeaf) {
79
+ if (key.return)
80
+ return { kind: 'leaf.submit' };
81
+ if (key.escape)
82
+ return { kind: 'leaf.cancel' };
83
+ if (key.leftArrow)
84
+ return { kind: 'leaf.left' };
85
+ if (key.rightArrow)
86
+ return { kind: 'leaf.right' };
87
+ if (key.home || (key.ctrl && input === 'a'))
88
+ return { kind: 'leaf.home' };
89
+ if (key.end || (key.ctrl && input === 'e'))
90
+ return { kind: 'leaf.end' };
91
+ if (key.backspace)
92
+ return { kind: 'leaf.backspace' };
93
+ if (key.delete)
94
+ return { kind: 'leaf.delete' };
95
+ if (input === ' ')
96
+ return { kind: 'leaf.toggle' };
97
+ if (!key.ctrl && !key.meta && isPrintable(input))
98
+ return { kind: 'leaf.char', text: input };
99
+ return null;
100
+ }
101
+ // -- everywhere ---------------------------------------------------------
102
+ if (key.escape || key.backspace)
103
+ return { kind: 'back' };
104
+ if (input === '?')
105
+ return { kind: 'help' };
106
+ if (input === 'q')
107
+ return { kind: 'quit' };
108
+ if (input === 'R')
109
+ return { kind: 'refresh' };
110
+ if (input === '/')
111
+ return { kind: 'type', text: '/' };
112
+ if (ctx.tabs > 0) {
113
+ if (/^[1-9]$/.test(input) && Number(input) <= ctx.tabs)
114
+ return { kind: 'tab', index: Number(input) - 1 };
115
+ // `tab` / `⇧tab` cycle the tabs everywhere; `←` / `→` only where no content claims the
116
+ // arrows (the help view, a log stream) — a tree expands / collapses, a list opens on `→`.
117
+ if (key.tab)
118
+ return { kind: 'tab.cycle', delta: key.shift ? -1 : 1 };
119
+ if (ctx.scope === 'none' || ctx.scope === 'logs') {
120
+ if (key.rightArrow)
121
+ return { kind: 'tab.cycle', delta: 1 };
122
+ if (key.leftArrow)
123
+ return { kind: 'tab.cycle', delta: -1 };
124
+ }
125
+ }
126
+ // -- pending prefixes (`gg`) --------------------------------------------
127
+ if (ctx.pendingKey === 'g') {
128
+ if (input === 'g')
129
+ return { kind: 'move', op: 'home' };
130
+ return null;
131
+ }
132
+ // -- lists / trees / logs -----------------------------------------------
133
+ if (ctx.scope !== 'none') {
134
+ if (key.upArrow || input === 'k')
135
+ return { kind: 'move', op: 'up' };
136
+ if (key.downArrow || input === 'j')
137
+ return { kind: 'move', op: 'down' };
138
+ if (key.pageUp || (key.ctrl && input === 'u'))
139
+ return { kind: 'move', op: 'pageUp' };
140
+ if (key.pageDown || (key.ctrl && input === 'd'))
141
+ return { kind: 'move', op: 'pageDown' };
142
+ if (key.home)
143
+ return { kind: 'move', op: 'home' };
144
+ if (key.end || input === 'G')
145
+ return { kind: 'move', op: 'end' };
146
+ if (input === 'g')
147
+ return { kind: 'pending', key: 'g' };
148
+ }
149
+ if (ctx.scope === 'tree') {
150
+ if (key.leftArrow && key.shift)
151
+ return { kind: 'collapseDeep' };
152
+ if (key.rightArrow || input === 'l')
153
+ return { kind: 'expand' };
154
+ if (key.leftArrow || input === 'h')
155
+ return { kind: 'collapse' };
156
+ if (key.return || input === ' ')
157
+ return ctx.editable ? { kind: 'apply' } : { kind: 'toggle' };
158
+ if (input === 's')
159
+ return { kind: 'save' };
160
+ if (input === 'n')
161
+ return { kind: 'next' };
162
+ if (input === 'N')
163
+ return { kind: 'prev' };
164
+ if (ctx.editable) {
165
+ if (input === 'e')
166
+ return { kind: 'edit' };
167
+ if (input === 'a')
168
+ return { kind: 'add' };
169
+ if (input === 'x')
170
+ return { kind: 'remove' };
171
+ if (input === 't')
172
+ return { kind: 'tag' };
173
+ }
174
+ }
175
+ if (ctx.scope === 'logs') {
176
+ if (input === 'F')
177
+ return { kind: 'follow' };
178
+ if (input === 's')
179
+ return { kind: 'save' };
180
+ if (input === 'c')
181
+ return { kind: 'copy' };
182
+ if (input === 'n')
183
+ return { kind: 'next' };
184
+ if (input === 'N')
185
+ return { kind: 'prev' };
186
+ }
187
+ if (ctx.scope === 'list') {
188
+ if (key.return)
189
+ return { kind: 'open' };
190
+ if (key.rightArrow || input === 'l')
191
+ return { kind: 'open' };
192
+ if (input === 'r' && !ctx.editable)
193
+ return { kind: 'prefill', text: '/run ' };
194
+ if (input === 'x' && !ctx.editable)
195
+ return { kind: 'prefill', text: '/stop' };
196
+ if (input === 'w')
197
+ return { kind: 'prefill', text: '/workspaces' };
198
+ }
199
+ if (input === 'r' && ctx.scope === 'none')
200
+ return { kind: 'retry' };
201
+ // -- anything else printable starts a fuzzy jump ------------------------
202
+ if (!key.ctrl && !key.meta && isPrintable(input) && input !== ' ')
203
+ return { kind: 'type', text: input };
204
+ return null;
205
+ }
206
+ //# sourceMappingURL=keymap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymap.js","sourceRoot":"","sources":["../../../src/tui/input/keymap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * SGR mouse reporting — the sequences (`ESC [ < b ; x ; y M|m`) Ink hands
7
+ * `useInput` intact (with the leading ESC stripped) once
8
+ * `?1000;1002;1006h` is on: presses, releases, drags, wheel ticks and the
9
+ * modifiers. `--no-mouse`, `TERM=dumb` and a non-TTY stdout keep the
10
+ * enable sequence unwritten; every exit path writes the disable one.
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ /** One mouse event, 0-based cells. */
15
+ export interface MouseEvent {
16
+ kind: 'press' | 'release' | 'drag' | 'move' | 'wheelUp' | 'wheelDown';
17
+ button: 'left' | 'middle' | 'right' | 'none';
18
+ x: number;
19
+ y: number;
20
+ shift: boolean;
21
+ alt: boolean;
22
+ ctrl: boolean;
23
+ }
24
+ /** Turns SGR reporting on (buttons, drags, SGR encoding). */
25
+ export declare const MOUSE_ON = "\u001B[?1000h\u001B[?1002h\u001B[?1006h";
26
+ /** Turns SGR reporting off (the reverse order). */
27
+ export declare const MOUSE_OFF = "\u001B[?1006l\u001B[?1002l\u001B[?1000l";
28
+ /**
29
+ * Whether an input chunk is one or more SGR mouse reports.
30
+ *
31
+ * @param input - Ink's `input`
32
+ * @returns `true` for mouse reports only
33
+ */
34
+ export declare function isMouseInput(input: string): boolean;
35
+ /**
36
+ * Parses the SGR mouse reports in an input chunk.
37
+ *
38
+ * @param input - Ink's `input` (one or more reports, ESC optional)
39
+ * @returns The events, in order
40
+ */
41
+ export declare function parseSgr(input: string): MouseEvent[];
42
+ /**
43
+ * Whether mouse reporting can be turned on for this terminal.
44
+ *
45
+ * @param env - The environment (`TERM`)
46
+ * @param stdout - The output stream
47
+ * @returns `true` for a TTY that is not `dumb`
48
+ */
49
+ export declare function mouseSupported(env: NodeJS.ProcessEnv, stdout: {
50
+ isTTY?: boolean | undefined;
51
+ }): boolean;
52
+ //# sourceMappingURL=mouse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mouse.d.ts","sourceRoot":"","sources":["../../../src/tui/input/mouse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACtE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC7C,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACjB;AAED,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,4CAAsC,CAAC;AAC5D,mDAAmD;AACnD,eAAO,MAAM,SAAS,4CAAsC,CAAC;AAK7D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAkBpD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GAAG,OAAO,CAEvG"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /** Turns SGR reporting on (buttons, drags, SGR encoding). */
6
+ export const MOUSE_ON = '\x1b[?1000h\x1b[?1002h\x1b[?1006h';
7
+ /** Turns SGR reporting off (the reverse order). */
8
+ export const MOUSE_OFF = '\x1b[?1006l\x1b[?1002l\x1b[?1000l';
9
+ const ONE = /\x1b?\[<(\d+);(\d+);(\d+)([mM])/g;
10
+ const ALL = /^(?:\x1b?\[<\d+;\d+;\d+[mM])+$/;
11
+ /**
12
+ * Whether an input chunk is one or more SGR mouse reports.
13
+ *
14
+ * @param input - Ink's `input`
15
+ * @returns `true` for mouse reports only
16
+ */
17
+ export function isMouseInput(input) {
18
+ return ALL.test(input);
19
+ }
20
+ /**
21
+ * Parses the SGR mouse reports in an input chunk.
22
+ *
23
+ * @param input - Ink's `input` (one or more reports, ESC optional)
24
+ * @returns The events, in order
25
+ */
26
+ export function parseSgr(input) {
27
+ const out = [];
28
+ for (const m of input.matchAll(ONE)) {
29
+ const code = Number(m[1]);
30
+ const x = Number(m[2]) - 1;
31
+ const y = Number(m[3]) - 1;
32
+ const release = m[4] === 'm';
33
+ const wheel = (code & 64) !== 0;
34
+ const motion = (code & 32) !== 0;
35
+ const low = code & 3;
36
+ const button = wheel ? 'none' : low === 0 ? 'left' : low === 1 ? 'middle' : low === 2 ? 'right' : 'none';
37
+ const kind = wheel ? (low === 0 ? 'wheelUp' : 'wheelDown')
38
+ : release ? 'release'
39
+ : motion ? (button === 'none' ? 'move' : 'drag')
40
+ : 'press';
41
+ out.push({ kind, button, x: Math.max(0, x), y: Math.max(0, y), shift: (code & 4) !== 0, alt: (code & 8) !== 0, ctrl: (code & 16) !== 0 });
42
+ }
43
+ return out;
44
+ }
45
+ /**
46
+ * Whether mouse reporting can be turned on for this terminal.
47
+ *
48
+ * @param env - The environment (`TERM`)
49
+ * @param stdout - The output stream
50
+ * @returns `true` for a TTY that is not `dumb`
51
+ */
52
+ export function mouseSupported(env, stdout) {
53
+ return stdout.isTTY === true && env['TERM'] !== 'dumb';
54
+ }
55
+ //# sourceMappingURL=mouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mouse.js","sourceRoot":"","sources":["../../../src/tui/input/mouse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,QAAQ,GAAG,mCAAmC,CAAC;AAC5D,mDAAmD;AACnD,MAAM,CAAC,MAAM,SAAS,GAAG,mCAAmC,CAAC;AAE7D,MAAM,GAAG,GAAG,kCAAkC,CAAC;AAC/C,MAAM,GAAG,GAAG,gCAAgC,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACtC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa;IAClC,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;QAC7B,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;QACrB,MAAM,MAAM,GAAyB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/H,MAAM,IAAI,GAAuB,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;YAC1E,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBACrB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;oBAChD,CAAC,CAAC,OAAO,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9I,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,GAAsB,EAAE,MAAuC;IAC1F,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /** The exit code for an unexpected failure (EX_SOFTWARE). */
6
+ export declare const EXIT_SOFTWARE = 70;
7
+ /** A line logger. */
8
+ export type Logger = (line: string) => void;
9
+ /**
10
+ * The debug logger: appends to `$XDG_STATE_HOME/e3-ui/debug.log` (beside
11
+ * the state file) when `E3_UI_DEBUG=1`, else a no-op.
12
+ *
13
+ * @param env - The environment
14
+ * @returns The logger and the log path (null when disabled)
15
+ */
16
+ export declare function createDebugLogger(env: NodeJS.ProcessEnv): {
17
+ log: Logger;
18
+ file: string | null;
19
+ };
20
+ /** What the handlers call. */
21
+ export interface LifecycleHooks {
22
+ /** A termination signal arrived: unmount and stop. */
23
+ onSignal: (signal: NodeJS.Signals) => void;
24
+ /** An unexpected error: the terminal is restored by the caller, then this reports it. */
25
+ onFatal: (error: unknown) => void;
26
+ }
27
+ /**
28
+ * Installs the process handlers.
29
+ *
30
+ * @param hooks - The callbacks
31
+ * @returns A function that removes them
32
+ */
33
+ export declare function installLifecycle(hooks: LifecycleHooks): () => void;
34
+ /**
35
+ * The stack (or message) of an unexpected error, for stderr after the
36
+ * terminal is restored.
37
+ *
38
+ * @param error - The error
39
+ * @returns The text
40
+ */
41
+ export declare function fatalText(error: unknown): string;
42
+ /**
43
+ * A one-line terminal description for the about view
44
+ * (`kitty 0.36 · 120×36 · truecolor · mouse ● · kitty keyboard ○`).
45
+ *
46
+ * @param env - The environment
47
+ * @param size - The terminal size
48
+ * @param colorLevel - The colour level
49
+ * @param mouse - Whether mouse reporting is on
50
+ * @param glyphs - The glyphs for the dots
51
+ * @returns The description
52
+ */
53
+ export declare function describeTerminal(env: NodeJS.ProcessEnv, size: {
54
+ columns: number;
55
+ rows: number;
56
+ }, colorLevel: number, mouse: boolean, glyphs: {
57
+ dot: string;
58
+ empty: string;
59
+ sep: string;
60
+ }): string;
61
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/tui/lifecycle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,6DAA6D;AAC7D,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,qBAAqB;AACrB,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAgB9F;AAED,8BAA8B;AAC9B,MAAM,WAAW,cAAc;IAC3B,sDAAsD;IACtD,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IAC3C,yFAAyF;IACzF,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,IAAI,CAalE;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGhD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC5B,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACvC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACpD,MAAM,CAMR"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Lifecycle — the process-level handlers the terminal UI installs:
7
+ * SIGINT / SIGTERM / SIGHUP unmount cleanly (Ctrl-C is a key while the
8
+ * UI runs, so SIGINT only arrives from outside), `uncaughtException` /
9
+ * `unhandledRejection` restore the terminal first, then print the stack
10
+ * and exit 70; and the `E3_UI_DEBUG=1` file logger, which never writes to
11
+ * stdout or stderr while the UI owns the screen.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ import * as fs from 'node:fs';
16
+ import * as path from 'node:path';
17
+ import * as os from 'node:os';
18
+ import { statePath } from './state/persist.js';
19
+ /** The exit code for an unexpected failure (EX_SOFTWARE). */
20
+ export const EXIT_SOFTWARE = 70;
21
+ /**
22
+ * The debug logger: appends to `$XDG_STATE_HOME/e3-ui/debug.log` (beside
23
+ * the state file) when `E3_UI_DEBUG=1`, else a no-op.
24
+ *
25
+ * @param env - The environment
26
+ * @returns The logger and the log path (null when disabled)
27
+ */
28
+ export function createDebugLogger(env) {
29
+ if (env['E3_UI_DEBUG'] !== '1')
30
+ return { log: () => undefined, file: null };
31
+ const file = path.join(path.dirname(statePath(env, process.platform, os.homedir())), 'debug.log');
32
+ let ready = false;
33
+ const log = (line) => {
34
+ try {
35
+ if (!ready) {
36
+ fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
37
+ ready = true;
38
+ }
39
+ fs.appendFileSync(file, `${new Date().toISOString()} ${line}\n`, { mode: 0o600 });
40
+ }
41
+ catch {
42
+ // The log must never take the UI down.
43
+ }
44
+ };
45
+ return { log, file };
46
+ }
47
+ /**
48
+ * Installs the process handlers.
49
+ *
50
+ * @param hooks - The callbacks
51
+ * @returns A function that removes them
52
+ */
53
+ export function installLifecycle(hooks) {
54
+ const signals = ['SIGINT', 'SIGTERM', 'SIGHUP'];
55
+ const onSignal = (signal) => hooks.onSignal(signal);
56
+ const onException = (error) => hooks.onFatal(error);
57
+ const onRejection = (reason) => hooks.onFatal(reason);
58
+ for (const signal of signals)
59
+ process.on(signal, onSignal);
60
+ process.on('uncaughtException', onException);
61
+ process.on('unhandledRejection', onRejection);
62
+ return () => {
63
+ for (const signal of signals)
64
+ process.off(signal, onSignal);
65
+ process.off('uncaughtException', onException);
66
+ process.off('unhandledRejection', onRejection);
67
+ };
68
+ }
69
+ /**
70
+ * The stack (or message) of an unexpected error, for stderr after the
71
+ * terminal is restored.
72
+ *
73
+ * @param error - The error
74
+ * @returns The text
75
+ */
76
+ export function fatalText(error) {
77
+ if (error instanceof Error)
78
+ return error.stack ?? `${error.name}: ${error.message}`;
79
+ return String(error);
80
+ }
81
+ /**
82
+ * A one-line terminal description for the about view
83
+ * (`kitty 0.36 · 120×36 · truecolor · mouse ● · kitty keyboard ○`).
84
+ *
85
+ * @param env - The environment
86
+ * @param size - The terminal size
87
+ * @param colorLevel - The colour level
88
+ * @param mouse - Whether mouse reporting is on
89
+ * @param glyphs - The glyphs for the dots
90
+ * @returns The description
91
+ */
92
+ export function describeTerminal(env, size, colorLevel, mouse, glyphs) {
93
+ const program = env['TERM_PROGRAM'] ?? env['TERMINAL_EMULATOR'] ?? (env['TERM'] === 'xterm-kitty' ? 'kitty' : env['TERM'] ?? 'terminal');
94
+ const version = env['TERM_PROGRAM_VERSION'] !== undefined ? ` ${env['TERM_PROGRAM_VERSION']}` : '';
95
+ const colour = colorLevel >= 3 ? 'truecolor' : colorLevel === 2 ? '256 colours' : colorLevel === 1 ? '16 colours' : 'no colour';
96
+ const on = (flag) => (flag ? glyphs.dot : glyphs.empty);
97
+ return `${program}${version} ${glyphs.sep} ${size.columns}×${size.rows} ${glyphs.sep} ${colour} ${glyphs.sep} mouse ${on(mouse)}`;
98
+ }
99
+ //# sourceMappingURL=lifecycle.js.map