@elaraai/e3-ui-cli 1.0.71 → 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-hslJZfFw.js → engine-Bm-cIDd_-DwUdGcTZ.js} +1 -1
  3. package/dist/app/assets/{index-8USNHP31.js → index-mj-YVVN1.js} +92 -92
  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,92 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Copyright (c) 2025 Elara AI Pty Ltd
4
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
5
+ */
6
+ /**
7
+ * The Ink root — one column of exactly `rows` lines, each exactly
8
+ * `columns` cells, rendered from the store through the view router and the
9
+ * shell chrome. Keys go to the controller; the terminal size and the
10
+ * spinner drive re-renders.
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ import { useEffect, useMemo, useState } from 'react';
15
+ import { Box, Text, useApp, useInput, useStdout, useWindowSize } from 'ink';
16
+ import { registerSuspend } from '../suspend.js';
17
+ import { breakpoint, shellLayout } from '../render/layout.js';
18
+ import { toneColor } from '../render/theme.js';
19
+ import { useStore } from '../state/store.js';
20
+ import { layoutOf } from '../model/index.js';
21
+ import { completionHits, headerHits, renderFrame } from './shell/chrome.js';
22
+ import { setLastFrame } from './frame.js';
23
+ import { renderView } from './views/index.js';
24
+ import { fitLine } from './lines.js';
25
+ /** One rendered row. */
26
+ function Row({ line, theme }) {
27
+ return (_jsx(Text, { wrap: "truncate-end", children: line.map((span, i) => (_jsx(Text, { color: toneColor(theme, span.tone ?? 'plain'), bold: span.bold === true, dimColor: span.dim === true, inverse: span.inverse === true, children: span.text }, i))) }));
28
+ }
29
+ /** Whether the state animates (the spinner ticks). */
30
+ function animating(state) {
31
+ if (state.view.kind === 'launch')
32
+ return true;
33
+ const ws = state.view.kind === 'dashboard' || state.view.kind === 'task' || state.view.kind === 'input' ? state.view.ws : null;
34
+ if (ws === null)
35
+ return false;
36
+ const execution = state.data.execution[ws];
37
+ return execution?.state?.status.type === 'running' || execution?.settling === true;
38
+ }
39
+ /**
40
+ * The application.
41
+ *
42
+ * @param props - The controller, theme, glyphs and version
43
+ * @returns The frame
44
+ */
45
+ export function App(props) {
46
+ const { controller, theme, glyphs, version } = props;
47
+ const state = useStore(s => s);
48
+ const windowSize = useWindowSize();
49
+ const { stdout } = useStdout();
50
+ const size = props.size ?? windowSize;
51
+ useEffect(() => {
52
+ controller.setSize(size);
53
+ }, [controller, size.columns, size.rows]);
54
+ const [spinner, setSpinner] = useState(0);
55
+ const spinning = animating(state);
56
+ useEffect(() => {
57
+ if (!spinning)
58
+ return;
59
+ const timer = setInterval(() => setSpinner(s => s + 1), 120);
60
+ return () => clearInterval(timer);
61
+ }, [spinning]);
62
+ useInput((input, key) => {
63
+ controller.onKey(input, key);
64
+ });
65
+ useEffect(() => {
66
+ controller.attachStdout(stdout);
67
+ }, [controller, stdout]);
68
+ const { suspendTerminal } = useApp();
69
+ useEffect(() => {
70
+ registerSuspend((fn) => suspendTerminal(fn));
71
+ return () => registerSuspend(null);
72
+ }, [suspendTerminal]);
73
+ const now = props.now !== undefined ? props.now() : Date.now();
74
+ const lines = useMemo(() => {
75
+ const bp = breakpoint(size);
76
+ if (bp === 'refuse') {
77
+ return [fitLine([{ text: `terminal too small (${size.columns}×${size.rows}) — need 60×16`, tone: 'neg', bold: true }], Math.max(1, size.columns))];
78
+ }
79
+ const layout = state.size.columns === size.columns && state.size.rows === size.rows ? layoutOf(state) : shellLayout(size, { commit: false, completion: 0 });
80
+ const ctx = { layout, g: glyphs, theme, now, version, spinner, about: props.about };
81
+ const view = renderView(state, ctx, props.facts());
82
+ const hits = [
83
+ ...headerHits(state, ctx),
84
+ ...(view.hits ?? []).map(h => ({ ...h, row: h.row + layout.bodyTop })),
85
+ ...completionHits(state, ctx),
86
+ ];
87
+ setLastFrame({ layout, hits, pane: view.pane !== undefined ? { ...view.pane, top: view.pane.top + layout.bodyTop } : null });
88
+ return renderFrame(state, ctx, view.body, view.hints);
89
+ }, [state, size.columns, size.rows, glyphs, theme, now, version, spinner, props]);
90
+ return (_jsx(Box, { flexDirection: "column", width: size.columns, height: size.rows, children: lines.map((line, i) => _jsx(Row, { line: line, theme: theme }, i)) }));
91
+ }
92
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/tui/ui/App.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAqB,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAa,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAc,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAY,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,OAAO,EAA6C,MAAM,YAAY,CAAC;AAiBhF,wBAAwB;AACxB,SAAS,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAgC;IACtD,OAAO,CACH,KAAC,IAAI,IAAC,IAAI,EAAC,cAAc,YACpB,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACnB,KAAC,IAAI,IAED,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,EAC7C,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI,EACxB,QAAQ,EAAE,IAAI,CAAC,GAAG,KAAK,IAAI,EAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,YAE7B,IAAI,CAAC,IAAI,IANL,CAAC,CAOH,CACV,CAAC,GACC,CACV,CAAC;AACN,CAAC;AAED,sDAAsD;AACtD,SAAS,SAAS,CAAC,KAAe;IAC9B,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/H,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3C,OAAO,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AACvF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,KAAe;IAC/B,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,UAAU,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACX,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7D,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAAC;IACrC,SAAS,CAAC,GAAG,EAAE;QACX,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,OAAO,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAW,EAAE;QAC/B,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,uBAAuB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvJ,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5J,MAAM,GAAG,GAAc,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/F,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,GAAU;YAChB,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC;SAChC,CAAC;QACF,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7H,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAElF,OAAO,CACH,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,YAC7D,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAC,GAAG,IAAS,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAA3B,CAAC,CAA8B,CAAC,GAChE,CACT,CAAC;AACN,CAAC"}
@@ -0,0 +1,86 @@
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 last frame's geometry, for the mouse: which cells are rows, twists,
7
+ * tabs, crumbs, pills and completion rows (`hits`), and the scrolling
8
+ * pane under the body (`pane`) with its scrollbar column. Views publish
9
+ * body-relative rows with their lines; the App stores the absolute ones
10
+ * after each render; the controller hit-tests clicks against them.
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ import type { ShellLayout } from '../render/layout.js';
15
+ /** What a click on a cell does. */
16
+ export type HitTarget = {
17
+ kind: 'list';
18
+ index: number;
19
+ } | {
20
+ kind: 'dashboard';
21
+ index: number;
22
+ } | {
23
+ kind: 'tree';
24
+ flat: number;
25
+ twistX: number | null;
26
+ } | {
27
+ kind: 'tab';
28
+ index: number;
29
+ } | {
30
+ kind: 'toolbar';
31
+ action: 'expandAll' | 'collapseAll' | 'save';
32
+ } | {
33
+ kind: 'crumb';
34
+ index: number;
35
+ } | {
36
+ kind: 'pill';
37
+ pill: 'running' | 'dirty' | 'connection';
38
+ } | {
39
+ kind: 'completion';
40
+ index: number;
41
+ };
42
+ /** A clickable cell range on one row (`x1` exclusive). */
43
+ export interface Hit {
44
+ row: number;
45
+ x0: number;
46
+ x1: number;
47
+ target: HitTarget;
48
+ }
49
+ /** The scrolling pane: its rows, its extent, and where it is scrolled to. */
50
+ export interface Pane {
51
+ /** The first row of the pane (the scrollbar's `▲` sits there). */
52
+ top: number;
53
+ /** Rows the pane occupies (the scrollbar's `▼` sits on the last). */
54
+ rows: number;
55
+ total: number;
56
+ visible: number;
57
+ scrollTop: number;
58
+ }
59
+ /** The last frame's geometry. */
60
+ export interface FrameInfo {
61
+ layout: ShellLayout;
62
+ hits: Hit[];
63
+ pane: Pane | null;
64
+ }
65
+ /** Records the frame just rendered. */
66
+ export declare function setLastFrame(frame: FrameInfo): void;
67
+ /** The frame last rendered, if any. */
68
+ export declare function lastFrame(): FrameInfo | null;
69
+ /**
70
+ * The hit under a cell.
71
+ *
72
+ * @param frame - The frame
73
+ * @param x - The column
74
+ * @param y - The row
75
+ * @returns The target, or null
76
+ */
77
+ export declare function hitAt(frame: FrameInfo, x: number, y: number): HitTarget | null;
78
+ /**
79
+ * The scroll position a drag on the scrollbar track maps to.
80
+ *
81
+ * @param pane - The pane
82
+ * @param y - The row dragged to
83
+ * @returns The scroll top
84
+ */
85
+ export declare function paneTopFromRow(pane: Pane, y: number): number;
86
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../../src/tui/ui/frame.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,mCAAmC;AACnC,MAAM,MAAM,SAAS,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,aAAa,GAAG,MAAM,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C,0DAA0D;AAC1D,MAAM,WAAW,GAAG;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;CACrB;AAED,6EAA6E;AAC7E,MAAM,WAAW,IAAI;IACjB,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,iCAAiC;AACjC,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CACrB;AAID,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAEnD;AAED,uCAAuC;AACvC,wBAAgB,SAAS,IAAI,SAAS,GAAG,IAAI,CAE5C;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAK9E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5D"}
@@ -0,0 +1,42 @@
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
+ let last = null;
6
+ /** Records the frame just rendered. */
7
+ export function setLastFrame(frame) {
8
+ last = frame;
9
+ }
10
+ /** The frame last rendered, if any. */
11
+ export function lastFrame() {
12
+ return last;
13
+ }
14
+ /**
15
+ * The hit under a cell.
16
+ *
17
+ * @param frame - The frame
18
+ * @param x - The column
19
+ * @param y - The row
20
+ * @returns The target, or null
21
+ */
22
+ export function hitAt(frame, x, y) {
23
+ for (const hit of frame.hits) {
24
+ if (hit.row === y && x >= hit.x0 && x < hit.x1)
25
+ return hit.target;
26
+ }
27
+ return null;
28
+ }
29
+ /**
30
+ * The scroll position a drag on the scrollbar track maps to.
31
+ *
32
+ * @param pane - The pane
33
+ * @param y - The row dragged to
34
+ * @returns The scroll top
35
+ */
36
+ export function paneTopFromRow(pane, y) {
37
+ const track = Math.max(1, pane.rows - 2);
38
+ const pos = Math.max(0, Math.min(track - 1, y - (pane.top + 1)));
39
+ const max = Math.max(0, pane.total - pane.visible);
40
+ return Math.round((pos / Math.max(1, track - 1)) * max);
41
+ }
42
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../src/tui/ui/frame.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmDH,IAAI,IAAI,GAAqB,IAAI,CAAC;AAElC,uCAAuC;AACvC,MAAM,UAAU,YAAY,CAAC,KAAgB;IACzC,IAAI,GAAG,KAAK,CAAC;AACjB,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,SAAS;IACrB,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK,CAAC,KAAgB,EAAE,CAAS,EAAE,CAAS;IACxD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAU,EAAE,CAAS;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,92 @@
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
+ * Lines and spans — the unit every view renders. A `Line` is a list of
7
+ * styled spans that together fill exactly one terminal row; the shell pads
8
+ * or truncates each line to the frame width, so views never wrap and the
9
+ * scroll math stays exact.
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import type { Glyphs } from '../render/glyphs.js';
14
+ import type { Theme, Tone } from '../render/theme.js';
15
+ import type { ShellLayout } from '../render/layout.js';
16
+ /** One styled run of text. */
17
+ export interface Span {
18
+ text: string;
19
+ tone?: Tone | undefined;
20
+ bold?: boolean | undefined;
21
+ dim?: boolean | undefined;
22
+ inverse?: boolean | undefined;
23
+ }
24
+ /** One terminal row. */
25
+ export type Line = Span[];
26
+ /** What a renderer needs besides the state. */
27
+ export interface RenderCtx {
28
+ layout: ShellLayout;
29
+ g: Glyphs;
30
+ theme: Theme;
31
+ /** Epoch milliseconds of this frame. */
32
+ now: number;
33
+ /** The package version. */
34
+ version: string;
35
+ /** The spinner frame index. */
36
+ spinner: number;
37
+ /** The about view's facts. */
38
+ about: AboutInfo;
39
+ }
40
+ /** Facts the about view shows. */
41
+ export interface AboutInfo {
42
+ /** The state file path. */
43
+ statePath: string;
44
+ /** The terminal description (`kitty 0.36 · 120×36 · truecolor · mouse ● · kitty keyboard ●`). */
45
+ terminal: string;
46
+ }
47
+ /** A plain span. */
48
+ export declare const t: (text: string, tone?: Tone) => Span;
49
+ /** A bold span. */
50
+ export declare const b: (text: string, tone?: Tone) => Span;
51
+ /** A dim (muted) span. */
52
+ export declare const d: (text: string) => Span;
53
+ /** The cell width of a line. */
54
+ export declare function lineWidth(line: Line): number;
55
+ /**
56
+ * Fits a line to exactly `width` cells: spans past the width are cut (the
57
+ * last kept one ending in an ellipsis), a short line is padded.
58
+ *
59
+ * @param line - The line
60
+ * @param width - The row width
61
+ * @returns The fitted line
62
+ */
63
+ export declare function fitLine(line: Line, width: number): Line;
64
+ /**
65
+ * A line from plain text, padded to the width.
66
+ *
67
+ * @param text - The text
68
+ * @param width - The row width
69
+ * @param tone - An optional tone
70
+ * @returns The line
71
+ */
72
+ export declare function textLine(text: string, width: number, tone?: Tone): Line;
73
+ /** A blank line. */
74
+ export declare function blank(width: number): Line;
75
+ /** A full-width rule. */
76
+ export declare function rule(width: number, ch: string): Line;
77
+ /** Pads a list of lines to exactly `rows` rows, cutting extras. */
78
+ export declare function fitRows(lines: Line[], rows: number, width: number): Line[];
79
+ /** The text of a line (for tests and the debug log). */
80
+ export declare function lineText(line: Line): string;
81
+ /**
82
+ * Left- and right-aligned spans on one row, the left yielding.
83
+ *
84
+ * @param left - The left spans
85
+ * @param right - The right spans
86
+ * @param width - The row width
87
+ * @returns The composed line
88
+ */
89
+ export declare function lrLine(left: Line, right: Line, width: number): Line;
90
+ /** The glyph set of the context (a shorthand). */
91
+ export declare function glyphs(ctx: RenderCtx): Glyphs;
92
+ //# sourceMappingURL=lines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../../src/tui/ui/lines.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,8BAA8B;AAC9B,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACjC;AAED,wBAAwB;AACxB,MAAM,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC;AAE1B,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,KAAK,CAAC;IACb,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,KAAK,EAAE,SAAS,CAAC;CACpB;AAED,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACtB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,iGAAiG;IACjG,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,oBAAoB;AACpB,eAAO,MAAM,CAAC,GAAI,MAAM,MAAM,EAAE,OAAO,IAAI,KAAG,IAAwD,CAAC;AACvG,mBAAmB;AACnB,eAAO,MAAM,CAAC,GAAI,MAAM,MAAM,EAAE,OAAO,IAAI,KAAG,IAAoC,CAAC;AACnF,0BAA0B;AAC1B,eAAO,MAAM,CAAC,GAAI,MAAM,MAAM,KAAG,IAA6B,CAAC;AAE/D,gCAAgC;AAChC,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAI5C;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAgBvD;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAEvE;AAED,oBAAoB;AACpB,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,yBAAyB;AACzB,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAI1E;AAED,wDAAwD;AACxD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE3C;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKnE;AAED,kDAAkD;AAClD,wBAAgB,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAE7C"}
@@ -0,0 +1,94 @@
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 { displayWidth, padEnd, truncate } from '../render/text.js';
6
+ /** A plain span. */
7
+ export const t = (text, tone) => (tone === undefined ? { text } : { text, tone });
8
+ /** A bold span. */
9
+ export const b = (text, tone) => ({ text, tone, bold: true });
10
+ /** A dim (muted) span. */
11
+ export const d = (text) => ({ text, dim: true });
12
+ /** The cell width of a line. */
13
+ export function lineWidth(line) {
14
+ let w = 0;
15
+ for (const s of line)
16
+ w += displayWidth(s.text);
17
+ return w;
18
+ }
19
+ /**
20
+ * Fits a line to exactly `width` cells: spans past the width are cut (the
21
+ * last kept one ending in an ellipsis), a short line is padded.
22
+ *
23
+ * @param line - The line
24
+ * @param width - The row width
25
+ * @returns The fitted line
26
+ */
27
+ export function fitLine(line, width) {
28
+ const out = [];
29
+ let used = 0;
30
+ for (const span of line) {
31
+ if (used >= width)
32
+ break;
33
+ const w = displayWidth(span.text);
34
+ if (used + w <= width) {
35
+ out.push(span);
36
+ used += w;
37
+ continue;
38
+ }
39
+ out.push({ ...span, text: truncate(span.text, width - used) });
40
+ used = width;
41
+ }
42
+ if (used < width)
43
+ out.push({ text: ' '.repeat(width - used) });
44
+ return out;
45
+ }
46
+ /**
47
+ * A line from plain text, padded to the width.
48
+ *
49
+ * @param text - The text
50
+ * @param width - The row width
51
+ * @param tone - An optional tone
52
+ * @returns The line
53
+ */
54
+ export function textLine(text, width, tone) {
55
+ return [t(padEnd(text, width), tone)];
56
+ }
57
+ /** A blank line. */
58
+ export function blank(width) {
59
+ return [t(' '.repeat(width))];
60
+ }
61
+ /** A full-width rule. */
62
+ export function rule(width, ch) {
63
+ return [{ text: ch.repeat(width), tone: 'muted' }];
64
+ }
65
+ /** Pads a list of lines to exactly `rows` rows, cutting extras. */
66
+ export function fitRows(lines, rows, width) {
67
+ const out = lines.slice(0, rows).map(l => fitLine(l, width));
68
+ while (out.length < rows)
69
+ out.push(blank(width));
70
+ return out;
71
+ }
72
+ /** The text of a line (for tests and the debug log). */
73
+ export function lineText(line) {
74
+ return line.map(s => s.text).join('');
75
+ }
76
+ /**
77
+ * Left- and right-aligned spans on one row, the left yielding.
78
+ *
79
+ * @param left - The left spans
80
+ * @param right - The right spans
81
+ * @param width - The row width
82
+ * @returns The composed line
83
+ */
84
+ export function lrLine(left, right, width) {
85
+ const rightWidth = lineWidth(right);
86
+ const leftBudget = Math.max(0, width - rightWidth - 1);
87
+ const l = fitLine(left, leftBudget);
88
+ return [...l, t(' '), ...right];
89
+ }
90
+ /** The glyph set of the context (a shorthand). */
91
+ export function glyphs(ctx) {
92
+ return ctx.g;
93
+ }
94
+ //# sourceMappingURL=lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../../src/tui/ui/lines.ts"],"names":[],"mappings":"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"}
@@ -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
+ import type { TuiState } from '../../state/actions.js';
6
+ import { type Line, type RenderCtx } from '../lines.js';
7
+ import type { Hit } from '../frame.js';
8
+ /** The breadcrumb of a view. */
9
+ export declare function breadcrumb(state: TuiState, ctx: RenderCtx): string;
10
+ /** The header's pills: dirty, running, connection. */
11
+ export declare function pills(state: TuiState, ctx: RenderCtx): Line;
12
+ /** The header row: ` e3-ui <breadcrumb>` with the pills flush right. */
13
+ export declare function renderHeader(state: TuiState, ctx: RenderCtx): Line;
14
+ /**
15
+ * The clickable crumbs and pills of the header row (row 0).
16
+ *
17
+ * @param state - The store state
18
+ * @param ctx - The render context
19
+ * @returns The hits
20
+ */
21
+ export declare function headerHits(state: TuiState, ctx: RenderCtx): Hit[];
22
+ /**
23
+ * The clickable completion rows (absolute rows above the command box).
24
+ *
25
+ * @param state - The store state
26
+ * @param ctx - The render context
27
+ * @returns The hits
28
+ */
29
+ export declare function completionHits(state: TuiState, ctx: RenderCtx): Hit[];
30
+ /** The consequence line of what is typed (`run 6 tasks in main …`), and its keys. */
31
+ export declare function commandStatus(state: TuiState): {
32
+ text: string;
33
+ keys: string;
34
+ error: boolean;
35
+ };
36
+ /** The command box: a rule, the ` › …` line, a rule. */
37
+ export declare function renderCommandBox(state: TuiState, ctx: RenderCtx): Line[];
38
+ /** The completion rows above the command box. */
39
+ export declare function renderCompletion(state: TuiState, ctx: RenderCtx): Line[];
40
+ /** The commit bar (a dashed rule + the pending summary), when editing. */
41
+ export declare function renderCommitBar(state: TuiState, ctx: RenderCtx): Line[];
42
+ /** The hint row (the last row): the view's hints, or the toast when the box is busy. */
43
+ export declare function renderHintBar(state: TuiState, ctx: RenderCtx, hints: {
44
+ left: string;
45
+ right: string;
46
+ }): Line;
47
+ /**
48
+ * The whole frame: header, rule, body, commit bar, completion, command box,
49
+ * hint — exactly `rows` lines of exactly `columns` cells.
50
+ *
51
+ * @param state - The store state
52
+ * @param ctx - The render context
53
+ * @param body - The view's body lines
54
+ * @param hints - The view's hint row
55
+ * @returns The frame's lines
56
+ */
57
+ export declare function renderFrame(state: TuiState, ctx: RenderCtx, body: Line[], hints: {
58
+ left: string;
59
+ right: string;
60
+ }): Line[];
61
+ //# sourceMappingURL=chrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/shell/chrome.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,wBAAwB,CAAC;AAK7D,OAAO,EAA6D,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACnH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGvC,gCAAgC;AAChC,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,CAkBlE;AAED,sDAAsD;AACtD,wBAAgB,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAkB3D;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAIlE;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,CAqBjE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,CAKrE;AAUD,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CA0B7F;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,EAAE,CA+BxE;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,EAAE,CAwBxE;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,EAAE,CASvE;AAED,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS3G;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAAE,CAazH"}