@elaraai/e3-ui-cli 1.0.72 → 1.0.73

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 (219) hide show
  1. package/README.md +46 -21
  2. package/dist/app/assets/{engine-BKZbmXkC-DmcCFcnb.js → engine-Bm-cIDd_-DwUdGcTZ.js} +1 -1
  3. package/dist/app/assets/{index-BJNWHnRv.js → index-mj-YVVN1.js} +91 -91
  4. package/dist/app/index.html +1 -1
  5. package/dist/cli.js +36 -5
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/tui.d.ts +84 -0
  8. package/dist/commands/tui.d.ts.map +1 -0
  9. package/dist/commands/tui.js +86 -0
  10. package/dist/commands/tui.js.map +1 -0
  11. package/dist/tui/api.d.ts +108 -0
  12. package/dist/tui/api.d.ts.map +1 -0
  13. package/dist/tui/api.js +130 -0
  14. package/dist/tui/api.js.map +1 -0
  15. package/dist/tui/app.d.ts +23 -0
  16. package/dist/tui/app.d.ts.map +1 -0
  17. package/dist/tui/app.js +241 -0
  18. package/dist/tui/app.js.map +1 -0
  19. package/dist/tui/controller.d.ts +116 -0
  20. package/dist/tui/controller.d.ts.map +1 -0
  21. package/dist/tui/controller.js +620 -0
  22. package/dist/tui/controller.js.map +1 -0
  23. package/dist/tui/data/dataflow.d.ts +68 -0
  24. package/dist/tui/data/dataflow.d.ts.map +1 -0
  25. package/dist/tui/data/dataflow.js +137 -0
  26. package/dist/tui/data/dataflow.js.map +1 -0
  27. package/dist/tui/data/dataset.d.ts +80 -0
  28. package/dist/tui/data/dataset.d.ts.map +1 -0
  29. package/dist/tui/data/dataset.js +297 -0
  30. package/dist/tui/data/dataset.js.map +1 -0
  31. package/dist/tui/data/edit-buffer.d.ts +74 -0
  32. package/dist/tui/data/edit-buffer.d.ts.map +1 -0
  33. package/dist/tui/data/edit-buffer.js +120 -0
  34. package/dist/tui/data/edit-buffer.js.map +1 -0
  35. package/dist/tui/data/feeds.d.ts +45 -0
  36. package/dist/tui/data/feeds.d.ts.map +1 -0
  37. package/dist/tui/data/feeds.js +318 -0
  38. package/dist/tui/data/feeds.js.map +1 -0
  39. package/dist/tui/data/logs.d.ts +68 -0
  40. package/dist/tui/data/logs.d.ts.map +1 -0
  41. package/dist/tui/data/logs.js +134 -0
  42. package/dist/tui/data/logs.js.map +1 -0
  43. package/dist/tui/input/commands.d.ts +159 -0
  44. package/dist/tui/input/commands.d.ts.map +1 -0
  45. package/dist/tui/input/commands.js +259 -0
  46. package/dist/tui/input/commands.js.map +1 -0
  47. package/dist/tui/input/completion.d.ts +63 -0
  48. package/dist/tui/input/completion.d.ts.map +1 -0
  49. package/dist/tui/input/completion.js +128 -0
  50. package/dist/tui/input/completion.js.map +1 -0
  51. package/dist/tui/input/keymap.d.ts +153 -0
  52. package/dist/tui/input/keymap.d.ts.map +1 -0
  53. package/dist/tui/input/keymap.js +206 -0
  54. package/dist/tui/input/keymap.js.map +1 -0
  55. package/dist/tui/input/mouse.d.ts +52 -0
  56. package/dist/tui/input/mouse.d.ts.map +1 -0
  57. package/dist/tui/input/mouse.js +55 -0
  58. package/dist/tui/input/mouse.js.map +1 -0
  59. package/dist/tui/lifecycle.d.ts +61 -0
  60. package/dist/tui/lifecycle.d.ts.map +1 -0
  61. package/dist/tui/lifecycle.js +99 -0
  62. package/dist/tui/lifecycle.js.map +1 -0
  63. package/dist/tui/model/catalogue.d.ts +28 -0
  64. package/dist/tui/model/catalogue.d.ts.map +1 -0
  65. package/dist/tui/model/catalogue.js +94 -0
  66. package/dist/tui/model/catalogue.js.map +1 -0
  67. package/dist/tui/model/help.d.ts +37 -0
  68. package/dist/tui/model/help.d.ts.map +1 -0
  69. package/dist/tui/model/help.js +210 -0
  70. package/dist/tui/model/help.js.map +1 -0
  71. package/dist/tui/model/index.d.ts +42 -0
  72. package/dist/tui/model/index.d.ts.map +1 -0
  73. package/dist/tui/model/index.js +50 -0
  74. package/dist/tui/model/index.js.map +1 -0
  75. package/dist/tui/model/status.d.ts +88 -0
  76. package/dist/tui/model/status.d.ts.map +1 -0
  77. package/dist/tui/model/status.js +137 -0
  78. package/dist/tui/model/status.js.map +1 -0
  79. package/dist/tui/model/tree.d.ts +112 -0
  80. package/dist/tui/model/tree.d.ts.map +1 -0
  81. package/dist/tui/model/tree.js +178 -0
  82. package/dist/tui/model/tree.js.map +1 -0
  83. package/dist/tui/model/types.d.ts +21 -0
  84. package/dist/tui/model/types.d.ts.map +1 -0
  85. package/dist/tui/model/types.js +46 -0
  86. package/dist/tui/model/types.js.map +1 -0
  87. package/dist/tui/render/glyphs.d.ts +122 -0
  88. package/dist/tui/render/glyphs.d.ts.map +1 -0
  89. package/dist/tui/render/glyphs.js +122 -0
  90. package/dist/tui/render/glyphs.js.map +1 -0
  91. package/dist/tui/render/layout.d.ts +145 -0
  92. package/dist/tui/render/layout.d.ts.map +1 -0
  93. package/dist/tui/render/layout.js +209 -0
  94. package/dist/tui/render/layout.js.map +1 -0
  95. package/dist/tui/render/text.d.ts +149 -0
  96. package/dist/tui/render/text.d.ts.map +1 -0
  97. package/dist/tui/render/text.js +288 -0
  98. package/dist/tui/render/text.js.map +1 -0
  99. package/dist/tui/render/theme.d.ts +88 -0
  100. package/dist/tui/render/theme.d.ts.map +1 -0
  101. package/dist/tui/render/theme.js +145 -0
  102. package/dist/tui/render/theme.js.map +1 -0
  103. package/dist/tui/session.d.ts +78 -0
  104. package/dist/tui/session.d.ts.map +1 -0
  105. package/dist/tui/session.js +237 -0
  106. package/dist/tui/session.js.map +1 -0
  107. package/dist/tui/state/actions.d.ts +584 -0
  108. package/dist/tui/state/actions.d.ts.map +1 -0
  109. package/dist/tui/state/actions.js +62 -0
  110. package/dist/tui/state/actions.js.map +1 -0
  111. package/dist/tui/state/persist.d.ts +114 -0
  112. package/dist/tui/state/persist.d.ts.map +1 -0
  113. package/dist/tui/state/persist.js +187 -0
  114. package/dist/tui/state/persist.js.map +1 -0
  115. package/dist/tui/state/poll.d.ts +99 -0
  116. package/dist/tui/state/poll.d.ts.map +1 -0
  117. package/dist/tui/state/poll.js +160 -0
  118. package/dist/tui/state/poll.js.map +1 -0
  119. package/dist/tui/state/reducer.d.ts +16 -0
  120. package/dist/tui/state/reducer.d.ts.map +1 -0
  121. package/dist/tui/state/reducer.js +363 -0
  122. package/dist/tui/state/reducer.js.map +1 -0
  123. package/dist/tui/state/store.d.ts +37 -0
  124. package/dist/tui/state/store.d.ts.map +1 -0
  125. package/dist/tui/state/store.js +84 -0
  126. package/dist/tui/state/store.js.map +1 -0
  127. package/dist/tui/suspend.d.ts +17 -0
  128. package/dist/tui/suspend.d.ts.map +1 -0
  129. package/dist/tui/suspend.js +33 -0
  130. package/dist/tui/suspend.js.map +1 -0
  131. package/dist/tui/ui/App.d.ts +41 -0
  132. package/dist/tui/ui/App.d.ts.map +1 -0
  133. package/dist/tui/ui/App.js +92 -0
  134. package/dist/tui/ui/App.js.map +1 -0
  135. package/dist/tui/ui/frame.d.ts +86 -0
  136. package/dist/tui/ui/frame.d.ts.map +1 -0
  137. package/dist/tui/ui/frame.js +42 -0
  138. package/dist/tui/ui/frame.js.map +1 -0
  139. package/dist/tui/ui/lines.d.ts +92 -0
  140. package/dist/tui/ui/lines.d.ts.map +1 -0
  141. package/dist/tui/ui/lines.js +94 -0
  142. package/dist/tui/ui/lines.js.map +1 -0
  143. package/dist/tui/ui/shell/chrome.d.ts +61 -0
  144. package/dist/tui/ui/shell/chrome.d.ts.map +1 -0
  145. package/dist/tui/ui/shell/chrome.js +272 -0
  146. package/dist/tui/ui/shell/chrome.js.map +1 -0
  147. package/dist/tui/ui/shell/widgets.d.ts +75 -0
  148. package/dist/tui/ui/shell/widgets.d.ts.map +1 -0
  149. package/dist/tui/ui/shell/widgets.js +160 -0
  150. package/dist/tui/ui/shell/widgets.js.map +1 -0
  151. package/dist/tui/ui/views/about.d.ts +20 -0
  152. package/dist/tui/ui/views/about.d.ts.map +1 -0
  153. package/dist/tui/ui/views/about.js +40 -0
  154. package/dist/tui/ui/views/about.js.map +1 -0
  155. package/dist/tui/ui/views/all.d.ts +17 -0
  156. package/dist/tui/ui/views/all.d.ts.map +1 -0
  157. package/dist/tui/ui/views/all.js +17 -0
  158. package/dist/tui/ui/views/all.js.map +1 -0
  159. package/dist/tui/ui/views/dashboard.d.ts +156 -0
  160. package/dist/tui/ui/views/dashboard.d.ts.map +1 -0
  161. package/dist/tui/ui/views/dashboard.js +599 -0
  162. package/dist/tui/ui/views/dashboard.js.map +1 -0
  163. package/dist/tui/ui/views/help.d.ts +17 -0
  164. package/dist/tui/ui/views/help.d.ts.map +1 -0
  165. package/dist/tui/ui/views/help.js +65 -0
  166. package/dist/tui/ui/views/help.js.map +1 -0
  167. package/dist/tui/ui/views/index.d.ts +42 -0
  168. package/dist/tui/ui/views/index.d.ts.map +1 -0
  169. package/dist/tui/ui/views/index.js +42 -0
  170. package/dist/tui/ui/views/index.js.map +1 -0
  171. package/dist/tui/ui/views/input.d.ts +6 -0
  172. package/dist/tui/ui/views/input.d.ts.map +1 -0
  173. package/dist/tui/ui/views/input.js +494 -0
  174. package/dist/tui/ui/views/input.js.map +1 -0
  175. package/dist/tui/ui/views/launch.d.ts +16 -0
  176. package/dist/tui/ui/views/launch.d.ts.map +1 -0
  177. package/dist/tui/ui/views/launch.js +43 -0
  178. package/dist/tui/ui/views/launch.js.map +1 -0
  179. package/dist/tui/ui/views/refusal.d.ts +20 -0
  180. package/dist/tui/ui/views/refusal.d.ts.map +1 -0
  181. package/dist/tui/ui/views/refusal.js +47 -0
  182. package/dist/tui/ui/views/refusal.js.map +1 -0
  183. package/dist/tui/ui/views/repos.d.ts +10 -0
  184. package/dist/tui/ui/views/repos.d.ts.map +1 -0
  185. package/dist/tui/ui/views/repos.js +93 -0
  186. package/dist/tui/ui/views/repos.js.map +1 -0
  187. package/dist/tui/ui/views/task.d.ts +17 -0
  188. package/dist/tui/ui/views/task.d.ts.map +1 -0
  189. package/dist/tui/ui/views/task.js +309 -0
  190. package/dist/tui/ui/views/task.js.map +1 -0
  191. package/dist/tui/ui/views/wordmark.d.ts +15 -0
  192. package/dist/tui/ui/views/wordmark.d.ts.map +1 -0
  193. package/dist/tui/ui/views/wordmark.js +50 -0
  194. package/dist/tui/ui/views/wordmark.js.map +1 -0
  195. package/dist/tui/ui/views/workspaces.d.ts +17 -0
  196. package/dist/tui/ui/views/workspaces.d.ts.map +1 -0
  197. package/dist/tui/ui/views/workspaces.js +127 -0
  198. package/dist/tui/ui/views/workspaces.js.map +1 -0
  199. package/dist/tui/ui/widgets/leaf-editor.d.ts +58 -0
  200. package/dist/tui/ui/widgets/leaf-editor.d.ts.map +1 -0
  201. package/dist/tui/ui/widgets/leaf-editor.js +119 -0
  202. package/dist/tui/ui/widgets/leaf-editor.js.map +1 -0
  203. package/dist/tui/ui/widgets/logs.d.ts +99 -0
  204. package/dist/tui/ui/widgets/logs.d.ts.map +1 -0
  205. package/dist/tui/ui/widgets/logs.js +291 -0
  206. package/dist/tui/ui/widgets/logs.js.map +1 -0
  207. package/dist/tui/ui/widgets/reads.d.ts +62 -0
  208. package/dist/tui/ui/widgets/reads.d.ts.map +1 -0
  209. package/dist/tui/ui/widgets/reads.js +122 -0
  210. package/dist/tui/ui/widgets/reads.js.map +1 -0
  211. package/dist/tui/ui/widgets/runs.d.ts +51 -0
  212. package/dist/tui/ui/widgets/runs.d.ts.map +1 -0
  213. package/dist/tui/ui/widgets/runs.js +86 -0
  214. package/dist/tui/ui/widgets/runs.js.map +1 -0
  215. package/dist/tui/ui/widgets/tree.d.ts +149 -0
  216. package/dist/tui/ui/widgets/tree.d.ts.map +1 -0
  217. package/dist/tui/ui/widgets/tree.js +584 -0
  218. package/dist/tui/ui/widgets/tree.js.map +1 -0
  219. package/package.json +22 -12
@@ -0,0 +1,241 @@
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 terminal UI entry — `runTui(options)`: detect the theme and glyphs,
7
+ * load the state file, create the store / feeds / controller, mount Ink on
8
+ * the alternate screen, open the session (the launch screen shows its
9
+ * steps), route to the first view, and exit cleanly on every path (quit,
10
+ * Ctrl-C, SIGTERM, a fatal error), stopping the embedded server and
11
+ * flushing the state file.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ import * as os from 'node:os';
16
+ import { createRequire } from 'node:module';
17
+ import { render } from 'ink';
18
+ import { createElement } from 'react';
19
+ import { describeError } from './api.js';
20
+ import { MOUSE_OFF, MOUSE_ON, mouseSupported } from './input/mouse.js';
21
+ import { App } from './ui/App.js';
22
+ import { createController } from './controller.js';
23
+ import { createFeeds } from './data/feeds.js';
24
+ import { createDebugLogger, describeTerminal, EXIT_SOFTWARE, fatalText, installLifecycle } from './lifecycle.js';
25
+ import { selectGlyphs } from './render/glyphs.js';
26
+ import { createTheme, detectColorLevel } from './render/theme.js';
27
+ import { initialState, taskView } from './state/actions.js';
28
+ import { createPersister, loadState, repoEntry, statePath } from './state/persist.js';
29
+ import { createStore, StoreContext } from './state/store.js';
30
+ import { openSession, SessionRefusal } from './session.js';
31
+ import { suspendTerminal } from './suspend.js';
32
+ import './ui/views/all.js';
33
+ const require = createRequire(import.meta.url);
34
+ const packageJson = require('../../package.json');
35
+ /**
36
+ * Runs the terminal UI and resolves with the process exit code.
37
+ *
38
+ * @param options - The resolved root-action options
39
+ * @returns The exit code
40
+ */
41
+ export async function runTui(options) {
42
+ const env = process.env;
43
+ const { log, file: debugFile } = createDebugLogger(env);
44
+ const glyphs = selectGlyphs({ ascii: options.ascii, env });
45
+ const level = detectColorLevel(env, process.stdout);
46
+ const theme = createTheme(level);
47
+ const stateFile = statePath(env, process.platform, os.homedir());
48
+ const loaded = loadState(stateFile);
49
+ const persist = createPersister(stateFile, loaded.state, { onError: (err) => log(`state write failed: ${describeError(err)}`) });
50
+ if (loaded.recoveredFrom !== undefined)
51
+ log(`state file was corrupt; moved to ${loaded.recoveredFrom}`);
52
+ const size = { columns: process.stdout.columns || 80, rows: process.stdout.rows || 24 };
53
+ const store = createStore(initialState(size, options.repo));
54
+ let session = null;
55
+ let instance = null;
56
+ let exitCode = 0;
57
+ let exited = false;
58
+ const feeds = createFeeds({ store, api: () => session?.api ?? null, log });
59
+ // Mouse reporting: on while the UI owns the screen, off on every exit
60
+ // path and around the login hand-over; never on for --no-mouse, a dumb
61
+ // terminal or a non-TTY.
62
+ const mouseWanted = options.mouse && mouseSupported(env, process.stdout);
63
+ let mouseActive = false;
64
+ const mouseOn = () => {
65
+ if (!mouseWanted || mouseActive)
66
+ return;
67
+ process.stdout.write(MOUSE_ON);
68
+ mouseActive = true;
69
+ store.dispatch({ type: 'mouse', enabled: true });
70
+ };
71
+ const mouseOff = () => {
72
+ if (!mouseActive)
73
+ return;
74
+ process.stdout.write(MOUSE_OFF);
75
+ mouseActive = false;
76
+ };
77
+ const exit = (code) => {
78
+ if (exited)
79
+ return;
80
+ exited = true;
81
+ exitCode = code;
82
+ mouseOff();
83
+ feeds.stop();
84
+ instance?.unmount();
85
+ };
86
+ const openTarget = async (target) => {
87
+ const previous = session;
88
+ session = null;
89
+ store.dispatch({ type: 'session', session: null });
90
+ store.dispatch({ type: 'data/reset' });
91
+ store.dispatch({ type: 'view/root', view: { kind: 'launch', target, step: 'starting' } });
92
+ if (previous !== null)
93
+ await previous.stop().catch(() => undefined);
94
+ await open(target);
95
+ };
96
+ const login = async (url) => {
97
+ // The device flow prints its code and URL and waits: hand the
98
+ // terminal over, run `e3 auth login` in this process, take it back.
99
+ const { createLoginCommand } = await import('@elaraai/e3-cli/internal');
100
+ mouseOff();
101
+ await suspendTerminal(async () => {
102
+ const command = createLoginCommand();
103
+ command.exitOverride();
104
+ try {
105
+ await command.parseAsync(['login', url], { from: 'user' });
106
+ }
107
+ catch (err) {
108
+ process.stderr.write(`${describeError(err)}\n`);
109
+ }
110
+ });
111
+ mouseOn();
112
+ await openTarget(url === session?.info.origin ? session.info.target : url);
113
+ };
114
+ const controller = createController({
115
+ store,
116
+ glyphs,
117
+ api: () => session?.api ?? null,
118
+ feeds,
119
+ persist,
120
+ exit,
121
+ openTarget,
122
+ login,
123
+ copy: (text) => {
124
+ if (!process.stdout.isTTY)
125
+ return false;
126
+ process.stdout.write(`\x1b]52;c;${Buffer.from(text, 'utf8').toString('base64')}\x07`);
127
+ return true;
128
+ },
129
+ now: () => Date.now(),
130
+ log,
131
+ });
132
+ const facts = () => {
133
+ const status = session?.status ?? null;
134
+ if (status === null)
135
+ return null;
136
+ return { objects: Number(status.objectCount), packages: Number(status.packageCount), workspaces: Number(status.workspaceCount) };
137
+ };
138
+ const removeLifecycle = installLifecycle({
139
+ onSignal: (signal) => {
140
+ log(`signal ${signal}`);
141
+ exit(signal === 'SIGINT' ? 130 : 0);
142
+ },
143
+ onFatal: (error) => {
144
+ log(`fatal: ${fatalText(error)}`);
145
+ mouseOff();
146
+ exit(EXIT_SOFTWARE);
147
+ process.stderr.write(`e3-ui: ${fatalText(error)}\n`);
148
+ if (debugFile !== null)
149
+ process.stderr.write(`(debug log: ${debugFile})\n`);
150
+ },
151
+ });
152
+ // Where the launch lands: --task / --input, else the workspace given, else
153
+ // the last used, else the only one, else the workspaces list.
154
+ const firstView = async (opened) => {
155
+ if (opened.info.kind === 'origin')
156
+ return { kind: 'repos', list: { sel: 0, top: 0 } };
157
+ store.dispatch({ type: 'view/launchStep', step: 'reading workspaces' });
158
+ const workspaces = await opened.api.workspaceList();
159
+ store.dispatch({ type: 'data/workspaces', workspaces });
160
+ store.dispatch({ type: 'view/launchStep', step: `reading ${workspaces.length} workspace${workspaces.length === 1 ? '' : 's'}` });
161
+ const remembered = persist.state.repos[opened.info.stateKey]?.workspace;
162
+ const candidates = [options.workspace, remembered, workspaces.length === 1 ? workspaces[0].name : undefined];
163
+ const ws = candidates.find(name => name !== undefined && workspaces.some(w => w.name === name));
164
+ if (ws === undefined) {
165
+ if (options.workspace !== undefined)
166
+ controller.toast(`no workspace ${options.workspace}`, 'warn');
167
+ return { kind: 'workspaces', list: { sel: 0, top: 0 } };
168
+ }
169
+ if (options.task !== undefined)
170
+ return taskView(ws, options.task);
171
+ if (options.input !== undefined)
172
+ return { kind: 'input', ws, name: options.input, tree: { sel: 0, top: 0, open: {}, baseDepth: undefined, match: null }, editing: null };
173
+ return { kind: 'dashboard', ws, list: { sel: 0, top: 0 } };
174
+ };
175
+ const open = async (target) => {
176
+ try {
177
+ const opened = await openSession(target, { onStep: (step) => store.dispatch({ type: 'view/launchStep', step }) });
178
+ if (exited) {
179
+ await opened.stop();
180
+ return;
181
+ }
182
+ session = opened;
183
+ store.dispatch({ type: 'session', session: opened.info });
184
+ persist.update(s => {
185
+ s.lastRepo = target;
186
+ repoEntry(s, opened.info.stateKey);
187
+ });
188
+ const view = await firstView(opened);
189
+ store.dispatch({ type: 'view/root', view });
190
+ if (view.kind === 'dashboard' || view.kind === 'task' || view.kind === 'input') {
191
+ persist.update(s => { repoEntry(s, opened.info.stateKey).workspace = view.ws; });
192
+ }
193
+ feeds.sync();
194
+ }
195
+ catch (err) {
196
+ if (err instanceof SessionRefusal) {
197
+ log(`refusal: ${err.message}`);
198
+ store.dispatch({ type: 'view/root', view: { kind: 'refusal', refusal: err.refusal } });
199
+ if (err.refusal.kind === 'not-logged-in') {
200
+ store.dispatch({ type: 'command/edit', text: `/login ${err.refusal.origin}` });
201
+ }
202
+ return;
203
+ }
204
+ log(`open failed: ${fatalText(err)}`);
205
+ store.dispatch({ type: 'view/root', view: { kind: 'refusal', refusal: { kind: 'error', message: describeError(err) } } });
206
+ }
207
+ };
208
+ const about = {
209
+ statePath: stateFile.replace(os.homedir(), '~'),
210
+ terminal: describeTerminal(env, size, level, mouseWanted, glyphs),
211
+ };
212
+ instance = render(createElement(StoreContext.Provider, { value: store }, createElement(App, { controller, theme, glyphs, version: packageJson.version, about, facts })), {
213
+ alternateScreen: true,
214
+ exitOnCtrlC: false,
215
+ patchConsole: true,
216
+ kittyKeyboard: { mode: 'auto' },
217
+ maxFps: 30,
218
+ });
219
+ mouseOn();
220
+ feeds.start();
221
+ void open(options.repo);
222
+ try {
223
+ await instance.waitUntilExit();
224
+ }
225
+ catch (err) {
226
+ log(`exited with error: ${fatalText(err)}`);
227
+ exitCode = EXIT_SOFTWARE;
228
+ process.stderr.write(`e3-ui: ${fatalText(err)}\n`);
229
+ }
230
+ finally {
231
+ exited = true;
232
+ mouseOff();
233
+ removeLifecycle();
234
+ feeds.stop();
235
+ persist.flush();
236
+ if (session !== null)
237
+ await session.stop().catch(() => undefined);
238
+ }
239
+ return exitCode;
240
+ }
241
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
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 controller — every key and every command lands here. It resolves
7
+ * keys through the keymap, drives the store, runs commands against the
8
+ * session's API, and owns the side effects (feeds, persistence, exit).
9
+ * Views stay pure; the frame specs drive this with the in-memory API.
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import type { Key } from 'ink';
14
+ import { type Api } from './api.js';
15
+ import { type Feeds } from './data/feeds.js';
16
+ import { type ParsedCommand } from './input/commands.js';
17
+ import { type KeyAction } from './input/keymap.js';
18
+ import { type MouseEvent } from './input/mouse.js';
19
+ import { type HitTarget } from './ui/frame.js';
20
+ import type { Glyphs } from './render/glyphs.js';
21
+ import type { Size } from './render/layout.js';
22
+ import type { Tone } from './render/theme.js';
23
+ import { type Action, type TaskTab, type TuiState, type View } from './state/actions.js';
24
+ import type { Persister } from './state/persist.js';
25
+ import type { Store } from './state/store.js';
26
+ /** What the controller acts through. */
27
+ export interface ControllerDeps {
28
+ store: Store;
29
+ glyphs: Glyphs;
30
+ /** The current session's API (null before a session opens). */
31
+ api: () => Api | null;
32
+ feeds: Feeds;
33
+ persist: Persister | null;
34
+ /** Ends the app with an exit code. */
35
+ exit: (code: number) => void;
36
+ /** Opens another repository (`/repo`, a refusal retry). */
37
+ openTarget: (target: string) => Promise<void>;
38
+ /** Runs the device-flow login for an origin (`/login`). */
39
+ login: (url: string) => Promise<void>;
40
+ /** Puts text on the clipboard (OSC 52); false when no terminal can take it. */
41
+ copy: (text: string) => boolean;
42
+ now: () => number;
43
+ /** The debug log. */
44
+ log: (line: string) => void;
45
+ }
46
+ /** Hooks later views register: what `⏎` opens on the current row, tree operations, and the like. */
47
+ export interface ViewHooks {
48
+ /** `⏎` / `→` on a list view. */
49
+ open?: (state: TuiState, controller: Controller) => void;
50
+ /** A tree operation on a tree view. */
51
+ tree?: (action: KeyAction, state: TuiState, controller: Controller) => boolean;
52
+ /** Every other key action a view handles (logs, editing). */
53
+ key?: (action: KeyAction, state: TuiState, controller: Controller) => boolean;
54
+ /** Commands a view handles (`/find`, `/goto`, `/save`, `/tag`, …); true when handled. */
55
+ command?: (command: ParsedCommand, state: TuiState, controller: Controller) => Promise<boolean>;
56
+ /** Variant tags `/tag` offers on the selected row. */
57
+ tags?: (state: TuiState) => string[] | undefined;
58
+ /** A click on one of the view's own hit targets (rows, twists, toolbars); true when handled. */
59
+ click?: (target: HitTarget, event: MouseEvent, state: TuiState, controller: Controller) => boolean;
60
+ /** The wheel (`delta` rows) or a thumb drag (`top`) over the view's pane; true when handled. */
61
+ scroll?: (to: {
62
+ delta: number;
63
+ } | {
64
+ top: number;
65
+ }, state: TuiState, controller: Controller) => boolean;
66
+ }
67
+ /**
68
+ * Registers a view's hooks (called by each view module on load).
69
+ *
70
+ * @param kind - The view kind
71
+ * @param viewHooks - The hooks
72
+ */
73
+ export declare function registerViewHooks(kind: string, viewHooks: ViewHooks): void;
74
+ /** The controller. */
75
+ export interface Controller {
76
+ /** Handles one Ink key event. */
77
+ onKey(input: string, key: Key): void;
78
+ /** Runs a command line (`/task forecast`, or a fuzzy jump). */
79
+ execute(text: string): Promise<void>;
80
+ /** Shows a toast for three seconds (with the tone's glyph, or `glyph`). */
81
+ toast(text: string, tone?: Tone, glyph?: string): void;
82
+ /** Replaces the view (or pushes it onto the history). */
83
+ navigate(view: View, push?: boolean): void;
84
+ /** Opens a task view. */
85
+ openTask(ws: string, task: string, tab?: TaskTab): void;
86
+ /** Opens an input view. */
87
+ openInput(ws: string, name: string): void;
88
+ /** Opens a workspace's dashboard as the new root. */
89
+ openWorkspace(ws: string): void;
90
+ /** Goes back one view. */
91
+ back(): void;
92
+ /** Quits (asking first while edits are pending). */
93
+ quit(force: boolean): void;
94
+ /** Records the terminal size. */
95
+ setSize(size: Size): void;
96
+ /** Records the output stream (mouse enable / disable). */
97
+ attachStdout(stdout: NodeJS.WriteStream): void;
98
+ /** Recomputes the completion list for the current box text. */
99
+ updateCompletion(): void;
100
+ /** The dependencies (for view hooks). */
101
+ readonly deps: ControllerDeps;
102
+ /** Dispatches an action. */
103
+ dispatch(action: Action): void;
104
+ /** The current state. */
105
+ state(): TuiState;
106
+ /** The current workspace, if the view has one. */
107
+ workspace(): string | null;
108
+ }
109
+ /**
110
+ * Creates the controller.
111
+ *
112
+ * @param deps - The dependencies
113
+ * @returns The controller
114
+ */
115
+ export declare function createController(deps: ControllerDeps): Controller;
116
+ //# sourceMappingURL=controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/tui/controller.ts"],"names":[],"mappings":"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"}