@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,159 @@
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 command grammar — `parseCommand(text)` for everything the command
7
+ * box accepts, `describe(cmd, ctx)` for the consequence line the box shows
8
+ * before Enter, and `hotkeyToCommand` for the keys that prefill a command.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ /** A parsed command. */
13
+ export type ParsedCommand = {
14
+ name: 'task';
15
+ target: string;
16
+ } | {
17
+ name: 'input';
18
+ target: string;
19
+ } | {
20
+ name: 'dataset';
21
+ target: string;
22
+ } | {
23
+ name: 'workspace';
24
+ target: string;
25
+ } | {
26
+ name: 'workspaces';
27
+ } | {
28
+ name: 'repos';
29
+ } | {
30
+ name: 'repo';
31
+ target: string;
32
+ } | {
33
+ name: 'login';
34
+ url: string;
35
+ } | {
36
+ name: 'run';
37
+ force: boolean;
38
+ filter: string | undefined;
39
+ concurrency: number | undefined;
40
+ } | {
41
+ name: 'stop';
42
+ } | {
43
+ name: 'logs';
44
+ task: string;
45
+ stream: 'stdout' | 'stderr' | undefined;
46
+ } | {
47
+ name: 'runs';
48
+ task: string;
49
+ } | {
50
+ name: 'find';
51
+ query: string;
52
+ } | {
53
+ name: 'goto';
54
+ target: {
55
+ kind: 'row';
56
+ row: number;
57
+ } | {
58
+ kind: 'percent';
59
+ percent: number;
60
+ };
61
+ } | {
62
+ name: 'save';
63
+ file: string | undefined;
64
+ force: boolean;
65
+ } | {
66
+ name: 'refresh';
67
+ } | {
68
+ name: 'help';
69
+ } | {
70
+ name: 'about';
71
+ } | {
72
+ name: 'quit';
73
+ force: boolean;
74
+ } | {
75
+ name: 'tag';
76
+ tag: string;
77
+ } | {
78
+ name: 'add';
79
+ key: string | undefined;
80
+ } | {
81
+ name: 'remove';
82
+ force: boolean;
83
+ } | {
84
+ name: 'apply';
85
+ } | {
86
+ name: 'discard';
87
+ then: string | undefined;
88
+ } | {
89
+ name: 'reload';
90
+ };
91
+ export type CommandName = ParsedCommand['name'];
92
+ /** A parse failure. */
93
+ export interface ParseError {
94
+ error: string;
95
+ }
96
+ /** The result of {@link parseCommand}. */
97
+ export type ParseResult = {
98
+ ok: true;
99
+ command: ParsedCommand;
100
+ } | {
101
+ ok: false;
102
+ error: string;
103
+ };
104
+ /** Every command name, with its argument summary and one-line effect (the help view and completion). */
105
+ export declare const COMMANDS: readonly {
106
+ name: CommandName;
107
+ usage: string;
108
+ effect: string;
109
+ }[];
110
+ /** Splits a command line into words, honouring double quotes. */
111
+ export declare function splitWords(text: string): string[];
112
+ /** Whether a word is one of the command names. */
113
+ export declare function isCommandName(word: string): word is CommandName;
114
+ /**
115
+ * Parses a command line (with or without the leading `/`).
116
+ *
117
+ * @param text - The text in the command box
118
+ * @returns The parsed command, or the error to show
119
+ */
120
+ export declare function parseCommand(text: string): ParseResult;
121
+ /** What {@link describe} needs to spell a consequence. */
122
+ export interface DescribeContext {
123
+ /** The open workspace. */
124
+ workspace: string | null;
125
+ /** Tasks in the workspace. */
126
+ taskCount: number;
127
+ /** Whether a run is in progress. */
128
+ running: boolean;
129
+ /** The default concurrency. */
130
+ concurrency: number;
131
+ /** Pending edits. */
132
+ dirty: number;
133
+ }
134
+ /**
135
+ * The consequence line the command box shows for a parsed command
136
+ * (`run 6 tasks in main, ignoring the cache · concurrency 4`).
137
+ *
138
+ * @param command - The parsed command
139
+ * @param ctx - The context
140
+ * @returns The line, and the key hint (`⏎ run · esc`)
141
+ */
142
+ export declare function describe(command: ParsedCommand, ctx: DescribeContext): {
143
+ text: string;
144
+ keys: string;
145
+ };
146
+ /**
147
+ * The command a single-key hotkey prefills (`r` → `/run `, `x` → `/stop`,
148
+ * `w` → `/workspaces`, `s` → `/save`, `t` → `/tag `).
149
+ *
150
+ * @param key - The key
151
+ * @returns The command text, or undefined
152
+ */
153
+ export declare function hotkeyToCommand(key: string): string | undefined;
154
+ /** The flags `/run` accepts and their one-line hints, for the hint bar. */
155
+ export declare const RUN_FLAGS: readonly {
156
+ flag: string;
157
+ hint: string;
158
+ }[];
159
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/tui/input/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,259 @@
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
+ /** Every command name, with its argument summary and one-line effect (the help view and completion). */
6
+ export const COMMANDS = [
7
+ { name: 'task', usage: '/task <name>', effect: 'open a task' },
8
+ { name: 'input', usage: '/input <name>', effect: 'open an input' },
9
+ { name: 'dataset', usage: '/dataset <path>', effect: 'open a dataset by path' },
10
+ { name: 'workspace', usage: '/workspace <name>', effect: 'switch workspace' },
11
+ { name: 'workspaces', usage: '/workspaces', effect: 'list the workspaces' },
12
+ { name: 'repos', usage: '/repos', effect: 'list the repositories' },
13
+ { name: 'repo', usage: '/repo <path|url>', effect: 'open another repo' },
14
+ { name: 'login', usage: '/login <url>', effect: 'device-flow login' },
15
+ { name: 'run', usage: '/run [--force] [--filter g]', effect: 'run the dataflow' },
16
+ { name: 'stop', usage: '/stop', effect: 'cancel the dataflow' },
17
+ { name: 'logs', usage: '/logs <task> [stderr]', effect: 'open a task\'s stdout / stderr' },
18
+ { name: 'runs', usage: '/runs <task>', effect: 'open a task\'s runs' },
19
+ { name: 'find', usage: '/find <key|prefix|f1|f2>', effect: 'jump to key' },
20
+ { name: 'goto', usage: '/goto <row|N%>', effect: 'jump to row' },
21
+ { name: 'save', usage: '/save [file]', effect: 'write .beast2 / .log' },
22
+ { name: 'tag', usage: '/tag <name>', effect: 'switch a variant tag' },
23
+ { name: 'add', usage: '/add [key]', effect: 'add an item / entry' },
24
+ { name: 'remove', usage: '/remove', effect: 'remove the item' },
25
+ { name: 'apply', usage: '/apply', effect: 'apply pending edits' },
26
+ { name: 'discard', usage: '/discard', effect: 'discard pending edits' },
27
+ { name: 'refresh', usage: '/refresh', effect: 'poll everything now' },
28
+ { name: 'help', usage: '/help', effect: 'this help' },
29
+ { name: 'about', usage: '/about', effect: 'version · server · logo' },
30
+ { name: 'quit', usage: '/quit', effect: 'exit' },
31
+ ];
32
+ /** Splits a command line into words, honouring double quotes. */
33
+ export function splitWords(text) {
34
+ const words = [];
35
+ let current = '';
36
+ let quoted = false;
37
+ let had = false;
38
+ for (let i = 0; i < text.length; i++) {
39
+ const ch = text[i];
40
+ if (ch === '"') {
41
+ quoted = !quoted;
42
+ had = true;
43
+ continue;
44
+ }
45
+ if (!quoted && /\s/.test(ch)) {
46
+ if (current !== '' || had)
47
+ words.push(current);
48
+ current = '';
49
+ had = false;
50
+ continue;
51
+ }
52
+ current += ch;
53
+ }
54
+ if (current !== '' || had)
55
+ words.push(current);
56
+ return words;
57
+ }
58
+ /** Whether a word is one of the command names. */
59
+ export function isCommandName(word) {
60
+ return COMMANDS.some(c => c.name === word);
61
+ }
62
+ /**
63
+ * Parses a command line (with or without the leading `/`).
64
+ *
65
+ * @param text - The text in the command box
66
+ * @returns The parsed command, or the error to show
67
+ */
68
+ export function parseCommand(text) {
69
+ const trimmed = text.trim();
70
+ const body = trimmed.startsWith('/') ? trimmed.slice(1) : trimmed;
71
+ const words = splitWords(body);
72
+ const name = words[0] ?? '';
73
+ const args = words.slice(1);
74
+ const fail = (error) => ({ ok: false, error });
75
+ const need = (what) => fail(`${what} required — ${COMMANDS.find(c => c.name === name)?.usage ?? `/${name}`}`);
76
+ switch (name) {
77
+ case '':
78
+ return fail('type a command after /');
79
+ case 'task':
80
+ case 'input':
81
+ case 'dataset':
82
+ case 'workspace':
83
+ case 'repo': {
84
+ const target = args[0];
85
+ if (target === undefined)
86
+ return need(name === 'dataset' ? 'a path' : name === 'repo' ? 'a path or url' : 'a name');
87
+ return { ok: true, command: { name, target } };
88
+ }
89
+ case 'workspaces':
90
+ case 'repos':
91
+ case 'stop':
92
+ case 'refresh':
93
+ case 'help':
94
+ case 'about':
95
+ case 'apply':
96
+ case 'reload':
97
+ return { ok: true, command: { name } };
98
+ case 'discard':
99
+ return { ok: true, command: { name, then: args[0] === '--then' ? args.slice(1).join(' ') : undefined } };
100
+ case 'quit':
101
+ return { ok: true, command: { name, force: args.includes('--force') } };
102
+ case 'login': {
103
+ const url = args[0];
104
+ if (url === undefined)
105
+ return need('a server url');
106
+ if (!/^https?:\/\//.test(url))
107
+ return fail(`/login needs an http(s) url, got ${url}`);
108
+ return { ok: true, command: { name, url } };
109
+ }
110
+ case 'run': {
111
+ let force = false;
112
+ let filter;
113
+ let concurrency;
114
+ for (let i = 0; i < args.length; i++) {
115
+ const a = args[i];
116
+ if (a === '--force')
117
+ force = true;
118
+ else if (a === '--filter') {
119
+ filter = args[++i];
120
+ if (filter === undefined)
121
+ return fail('--filter needs a glob');
122
+ }
123
+ else if (a.startsWith('--filter='))
124
+ filter = a.slice('--filter='.length);
125
+ else if (a === '--concurrency' || a.startsWith('--concurrency=')) {
126
+ const raw = a === '--concurrency' ? args[++i] : a.slice('--concurrency='.length);
127
+ const n = Number(raw);
128
+ if (raw === undefined || !Number.isInteger(n) || n < 1)
129
+ return fail(`--concurrency must be a positive integer, got ${raw ?? '(nothing)'}`);
130
+ concurrency = n;
131
+ }
132
+ else
133
+ return fail(`unknown /run flag ${a} — /run [--force] [--filter <glob>] [--concurrency <n>]`);
134
+ }
135
+ return { ok: true, command: { name, force, filter, concurrency } };
136
+ }
137
+ case 'logs': {
138
+ const task = args[0];
139
+ if (task === undefined)
140
+ return need('a task');
141
+ const stream = args[1];
142
+ if (stream !== undefined && stream !== 'stdout' && stream !== 'stderr')
143
+ return fail(`stream must be stdout or stderr, got ${stream}`);
144
+ return { ok: true, command: { name, task, stream } };
145
+ }
146
+ case 'runs': {
147
+ const task = args[0];
148
+ if (task === undefined)
149
+ return need('a task');
150
+ return { ok: true, command: { name, task } };
151
+ }
152
+ case 'find': {
153
+ const query = body.slice(body.indexOf('find') + 4).trim();
154
+ if (query === '')
155
+ return need('a key, prefix or f1|f2 fields');
156
+ return { ok: true, command: { name, query } };
157
+ }
158
+ case 'goto': {
159
+ const target = args[0];
160
+ if (target === undefined)
161
+ return need('a row or N%');
162
+ if (target.endsWith('%')) {
163
+ const percent = Number(target.slice(0, -1));
164
+ if (!Number.isFinite(percent) || percent < 0 || percent > 100)
165
+ return fail(`/goto percent must be 0–100, got ${target}`);
166
+ return { ok: true, command: { name, target: { kind: 'percent', percent } } };
167
+ }
168
+ const row = Number(target.replace(/[,_]/g, ''));
169
+ if (!Number.isInteger(row) || row < 1)
170
+ return fail(`/goto needs a row number (1-based) or N%, got ${target}`);
171
+ return { ok: true, command: { name, target: { kind: 'row', row } } };
172
+ }
173
+ case 'save': {
174
+ const force = args.includes('--force');
175
+ const file = args.find(a => a !== '--force');
176
+ return { ok: true, command: { name, file, force } };
177
+ }
178
+ case 'tag': {
179
+ const tag = args[0];
180
+ if (tag === undefined)
181
+ return need('a tag');
182
+ return { ok: true, command: { name, tag } };
183
+ }
184
+ case 'add':
185
+ return { ok: true, command: { name, key: args[0] } };
186
+ case 'remove':
187
+ return { ok: true, command: { name, force: args.includes('--force') } };
188
+ default:
189
+ return fail(`unknown command /${name} — ? for help`);
190
+ }
191
+ }
192
+ /**
193
+ * The consequence line the command box shows for a parsed command
194
+ * (`run 6 tasks in main, ignoring the cache · concurrency 4`).
195
+ *
196
+ * @param command - The parsed command
197
+ * @param ctx - The context
198
+ * @returns The line, and the key hint (`⏎ run · esc`)
199
+ */
200
+ export function describe(command, ctx) {
201
+ const ws = ctx.workspace ?? '?';
202
+ switch (command.name) {
203
+ case 'run': {
204
+ const scope = command.filter !== undefined ? `tasks matching ${command.filter}` : `${ctx.taskCount} task${ctx.taskCount === 1 ? '' : 's'}`;
205
+ const cache = command.force ? ', ignoring the cache' : '';
206
+ const conc = command.concurrency ?? ctx.concurrency;
207
+ return { text: ctx.running ? 'a run is already in progress' : `run ${scope} in ${ws}${cache} · concurrency ${conc}`, keys: ctx.running ? 'esc' : '⏎ run · esc' };
208
+ }
209
+ case 'stop':
210
+ return { text: ctx.running ? `cancel the run in ${ws}` : 'no run in progress', keys: ctx.running ? '⏎ stop · esc' : 'esc' };
211
+ case 'task': return { text: `open task ${command.target}`, keys: '⏎ open · esc' };
212
+ case 'input': return { text: `open input ${command.target}`, keys: '⏎ open · esc' };
213
+ case 'dataset': return { text: `open dataset ${command.target}`, keys: '⏎ open · esc' };
214
+ case 'workspace': return { text: `switch to workspace ${command.target}`, keys: '⏎ switch · esc' };
215
+ case 'workspaces': return { text: 'list the workspaces', keys: '⏎ · esc' };
216
+ case 'repos': return { text: 'list the repositories', keys: '⏎ · esc' };
217
+ case 'repo': return { text: `open ${command.target}${ctx.dirty > 0 ? ` · ${ctx.dirty} unsaved edits are discarded` : ''}`, keys: '⏎ open · esc' };
218
+ case 'login': return { text: 'run the device-flow login', keys: '⏎ login · esc' };
219
+ case 'logs': return { text: `open ${command.task} ${command.stream ?? 'stdout'}`, keys: '⏎ open · esc' };
220
+ case 'runs': return { text: `open ${command.task} runs`, keys: '⏎ open · esc' };
221
+ case 'find': return { text: `find ${command.query}`, keys: '⏎ jump · esc' };
222
+ case 'goto': return { text: command.target.kind === 'row' ? `go to row ${command.target.row.toLocaleString()}` : `go to ${command.target.percent}%`, keys: '⏎ jump · esc' };
223
+ case 'save': return { text: `save${command.file !== undefined ? ` to ${command.file}` : ''}${command.force ? ' (overwrite)' : ''}`, keys: '⏎ save · esc' };
224
+ case 'refresh': return { text: 'poll every feed now', keys: '⏎ · esc' };
225
+ case 'help': return { text: 'open help', keys: '⏎ · esc' };
226
+ case 'about': return { text: 'about e3-ui', keys: '⏎ · esc' };
227
+ case 'quit': return { text: ctx.dirty > 0 && !command.force ? `quit with ${ctx.dirty} unsaved edit${ctx.dirty === 1 ? '' : 's'}` : 'quit', keys: '⏎ quit · esc' };
228
+ case 'tag': return { text: `switch to ${command.tag}`, keys: '⏎ · esc' };
229
+ case 'add': return { text: command.key !== undefined ? `add entry ${command.key}` : 'add an item', keys: '⏎ add · esc' };
230
+ case 'remove': return { text: 'remove the selected item', keys: '⏎ remove · esc' };
231
+ case 'apply': return { text: `apply ${ctx.dirty} pending edit${ctx.dirty === 1 ? '' : 's'}`, keys: '⏎ apply · esc' };
232
+ case 'discard': return { text: `discard ${ctx.dirty} pending edit${ctx.dirty === 1 ? '' : 's'}${command.then !== undefined ? ` then ${command.then}` : ''}`, keys: '⏎ discard · esc' };
233
+ case 'reload': return { text: 'reload the value and re-apply your edits', keys: '⏎ reload · esc' };
234
+ }
235
+ }
236
+ /**
237
+ * The command a single-key hotkey prefills (`r` → `/run `, `x` → `/stop`,
238
+ * `w` → `/workspaces`, `s` → `/save`, `t` → `/tag `).
239
+ *
240
+ * @param key - The key
241
+ * @returns The command text, or undefined
242
+ */
243
+ export function hotkeyToCommand(key) {
244
+ switch (key) {
245
+ case 'r': return '/run ';
246
+ case 'x': return '/stop';
247
+ case 'w': return '/workspaces';
248
+ case 's': return '/save';
249
+ case 't': return '/tag ';
250
+ default: return undefined;
251
+ }
252
+ }
253
+ /** The flags `/run` accepts and their one-line hints, for the hint bar. */
254
+ export const RUN_FLAGS = [
255
+ { flag: '--force', hint: 're-run everything' },
256
+ { flag: '--filter <glob>', hint: 'only matching tasks' },
257
+ { flag: '--concurrency <n>', hint: '' },
258
+ ];
259
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/tui/input/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
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
+ * Completion — `complete(text, catalogue)` turns what is typed in the
7
+ * command box into at most eight fuzzy-ranked candidates, each carrying its
8
+ * status, type and size so the list doubles as a status line. A leading `/`
9
+ * completes command names, then that command's arguments; anything else is
10
+ * a fuzzy jump across every workspace, task, input and dataset of the open
11
+ * repository.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ import type { Candidate } from '../state/actions.js';
16
+ /** Candidates shown at most. */
17
+ export declare const MAX_CANDIDATES = 8;
18
+ /** One thing that can be jumped to or named in a command. */
19
+ export interface CatalogueItem {
20
+ kind: 'task' | 'input' | 'dataset' | 'workspace' | 'repo';
21
+ name: string;
22
+ /** The workspace the item belongs to (tasks, inputs, datasets). */
23
+ workspace: string | null;
24
+ /** The status column (`● up-to-date`). */
25
+ status: string;
26
+ /** The type column (`Dict<String, Struct>`). */
27
+ type: string;
28
+ /** The detail column (`84.2 MB · 38.4s`). */
29
+ detail: string;
30
+ }
31
+ /** What completion draws from. */
32
+ export interface Catalogue {
33
+ items: CatalogueItem[];
34
+ /** Variant tags offered by `/tag` on the selected row, if any. */
35
+ tags?: string[] | undefined;
36
+ }
37
+ /**
38
+ * Fuzzy match score — higher is better, `null` when `pattern` is not a
39
+ * subsequence of `text`. Prefix and word-start matches rank first, then
40
+ * contiguous runs; shorter texts win ties.
41
+ *
42
+ * @param pattern - What was typed (case-insensitive)
43
+ * @param text - The candidate
44
+ * @returns The score, or null
45
+ */
46
+ export declare function fuzzyScore(pattern: string, text: string): number | null;
47
+ /**
48
+ * Completes the command box.
49
+ *
50
+ * @param text - The text in the box
51
+ * @param catalogue - The workspace catalogue
52
+ * @returns At most {@link MAX_CANDIDATES} candidates, best first (empty when nothing applies)
53
+ */
54
+ export declare function complete(text: string, catalogue: Catalogue): Candidate[];
55
+ /**
56
+ * The fuzzy jump across everything in the catalogue.
57
+ *
58
+ * @param text - What was typed (no leading `/`)
59
+ * @param catalogue - The workspace catalogue
60
+ * @returns At most {@link MAX_CANDIDATES} candidates
61
+ */
62
+ export declare function jump(text: string, catalogue: Catalogue): Candidate[];
63
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/tui/input/completion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,gCAAgC;AAChC,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBvE;AAkBD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,CA8CxE;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,CAQpE"}
@@ -0,0 +1,128 @@
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
+ import { COMMANDS, RUN_FLAGS, splitWords } from './commands.js';
6
+ /** Candidates shown at most. */
7
+ export const MAX_CANDIDATES = 8;
8
+ /**
9
+ * Fuzzy match score — higher is better, `null` when `pattern` is not a
10
+ * subsequence of `text`. Prefix and word-start matches rank first, then
11
+ * contiguous runs; shorter texts win ties.
12
+ *
13
+ * @param pattern - What was typed (case-insensitive)
14
+ * @param text - The candidate
15
+ * @returns The score, or null
16
+ */
17
+ export function fuzzyScore(pattern, text) {
18
+ const p = pattern.toLowerCase();
19
+ const t = text.toLowerCase();
20
+ if (p === '')
21
+ return 1000 - t.length;
22
+ // Prefix matches tie so the catalogue's own order decides (stable sort).
23
+ if (t.startsWith(p))
24
+ return 5000;
25
+ let score = 0;
26
+ let ti = 0;
27
+ let last = -2;
28
+ for (let pi = 0; pi < p.length; pi++) {
29
+ const idx = t.indexOf(p[pi], ti);
30
+ if (idx === -1)
31
+ return null;
32
+ if (idx === 0 || /[^a-z0-9]/.test(t[idx - 1]))
33
+ score += 30;
34
+ else if (idx === last + 1)
35
+ score += 20;
36
+ else
37
+ score += 5;
38
+ last = idx;
39
+ ti = idx + 1;
40
+ }
41
+ return 2000 + score - t.length;
42
+ }
43
+ function rank(pattern, items, text) {
44
+ return items
45
+ .map(item => ({ item, score: fuzzyScore(pattern, text(item)) }))
46
+ .filter((s) => s.score !== null)
47
+ .sort((a, b) => b.score - a.score)
48
+ .map(s => s.item);
49
+ }
50
+ function itemCandidate(command, item) {
51
+ return {
52
+ kind: item.kind,
53
+ insert: `/${command} ${item.name}`,
54
+ cells: [`/${command}`, item.name, item.status, item.type, item.detail],
55
+ };
56
+ }
57
+ /**
58
+ * Completes the command box.
59
+ *
60
+ * @param text - The text in the box
61
+ * @param catalogue - The workspace catalogue
62
+ * @returns At most {@link MAX_CANDIDATES} candidates, best first (empty when nothing applies)
63
+ */
64
+ export function complete(text, catalogue) {
65
+ if (text === '')
66
+ return [];
67
+ if (!text.startsWith('/'))
68
+ return jump(text, catalogue);
69
+ const body = text.slice(1);
70
+ const words = splitWords(body);
71
+ const typingName = !/\s/.test(body);
72
+ if (typingName) {
73
+ const name = words[0] ?? '';
74
+ return rank(name, [...COMMANDS], c => c.name)
75
+ .slice(0, MAX_CANDIDATES)
76
+ .map(c => ({ kind: 'command', insert: `/${c.name}${c.usage.includes(' ') ? ' ' : ''}`, cells: [`/${c.name}`, c.usage.replace(`/${c.name}`, '').trim(), c.effect] }));
77
+ }
78
+ const name = words[0] ?? '';
79
+ const partial = body.endsWith(' ') ? '' : (words[words.length - 1] ?? '');
80
+ const byKind = (kinds, command = name) => rank(partial, catalogue.items.filter(i => kinds.includes(i.kind)), i => i.name)
81
+ .slice(0, MAX_CANDIDATES)
82
+ .map(i => itemCandidate(command, i));
83
+ switch (name) {
84
+ case 'task':
85
+ case 'logs':
86
+ case 'runs':
87
+ return byKind(['task']);
88
+ case 'input':
89
+ return byKind(['input']);
90
+ case 'dataset':
91
+ return byKind(['dataset']);
92
+ case 'workspace':
93
+ return byKind(['workspace']);
94
+ case 'repo':
95
+ return byKind(['repo']);
96
+ case 'run': {
97
+ const used = new Set(words.slice(1));
98
+ return rank(partial, RUN_FLAGS.filter(f => !used.has(f.flag.split(' ')[0])), f => f.flag)
99
+ .filter(() => partial === '' || partial.startsWith('-'))
100
+ .map(f => ({ kind: 'flag', insert: `/run ${[...words.slice(1, body.endsWith(' ') ? undefined : -1), f.flag.split(' ')[0]].join(' ')} `, cells: ['/run', f.flag, f.hint] }));
101
+ }
102
+ case 'tag':
103
+ return rank(partial, catalogue.tags ?? [], t => t)
104
+ .slice(0, MAX_CANDIDATES)
105
+ .map(t => ({ kind: 'tag', insert: `/tag ${t}`, cells: ['/tag', t] }));
106
+ case 'logs2':
107
+ return [];
108
+ default:
109
+ return [];
110
+ }
111
+ }
112
+ /**
113
+ * The fuzzy jump across everything in the catalogue.
114
+ *
115
+ * @param text - What was typed (no leading `/`)
116
+ * @param catalogue - The workspace catalogue
117
+ * @returns At most {@link MAX_CANDIDATES} candidates
118
+ */
119
+ export function jump(text, catalogue) {
120
+ return rank(text, catalogue.items, i => i.name)
121
+ .slice(0, MAX_CANDIDATES)
122
+ .map(i => ({
123
+ kind: i.kind,
124
+ insert: `/${i.kind} ${i.name}`,
125
+ cells: [i.kind, i.name, i.workspace ?? '', [i.status, i.type, i.detail].filter(s => s !== '').join(' · ')],
126
+ }));
127
+ }
128
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/tui/input/completion.ts"],"names":[],"mappings":"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"}