@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,145 @@
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
+ * Detects the colour level of `stream` under `env`.
7
+ *
8
+ * @param env - The environment (`NO_COLOR`, `FORCE_COLOR`, `TERM`, `COLORTERM`)
9
+ * @param stream - The output stream
10
+ * @returns The level — `NO_COLOR` (non-empty) wins, then `FORCE_COLOR`
11
+ * (`0`–`3`, or any other value meaning 16 colours), then the stream's
12
+ * `getColorDepth()` (1 → 0, 4 → 1, 8 → 2, 24 → 3), then `COLORTERM` /
13
+ * `TERM` hints, else monochrome
14
+ */
15
+ export function detectColorLevel(env, stream) {
16
+ const noColor = env['NO_COLOR'];
17
+ if (noColor !== undefined && noColor !== '')
18
+ return 0;
19
+ const force = env['FORCE_COLOR'];
20
+ if (force !== undefined) {
21
+ if (force === '' || force === 'true')
22
+ return 1;
23
+ if (force === 'false')
24
+ return 0;
25
+ const n = Number(force);
26
+ if (n === 0)
27
+ return 0;
28
+ if (n === 1)
29
+ return 1;
30
+ if (n === 2)
31
+ return 2;
32
+ if (n >= 3)
33
+ return 3;
34
+ return 1;
35
+ }
36
+ if (typeof stream.getColorDepth === 'function') {
37
+ const depth = stream.getColorDepth(env);
38
+ if (depth >= 24)
39
+ return 3;
40
+ if (depth >= 8)
41
+ return 2;
42
+ if (depth >= 4)
43
+ return 1;
44
+ return 0;
45
+ }
46
+ if (env['COLORTERM'] === 'truecolor' || env['COLORTERM'] === '24bit')
47
+ return 3;
48
+ const term = env['TERM'] ?? '';
49
+ if (term.includes('256color'))
50
+ return 2;
51
+ if (term !== '' && term !== 'dumb')
52
+ return 1;
53
+ return 0;
54
+ }
55
+ /**
56
+ * Builds the theme for a colour level.
57
+ *
58
+ * @param level - The colour level
59
+ * @returns The theme — truecolor hex at 3, `ansi256(n)` at 2, the sixteen
60
+ * colour names at 1, and every token `undefined` at 0 (bold / dim /
61
+ * inverse carry the meaning)
62
+ */
63
+ export function createTheme(level) {
64
+ switch (level) {
65
+ case 3:
66
+ return {
67
+ level,
68
+ ink: undefined,
69
+ ink2: '#9aa5a7',
70
+ ink3: '#7d8a8c',
71
+ ink4: undefined,
72
+ brand: '#488e97',
73
+ brandTint: '#2f5c62',
74
+ pos: '#2f7a5b',
75
+ neg: '#b85a4a',
76
+ warn: '#b8862d',
77
+ info: '#3a7780',
78
+ rule: '#5f6b6d',
79
+ };
80
+ case 2:
81
+ return {
82
+ level,
83
+ ink: undefined,
84
+ ink2: 'ansi256(247)',
85
+ ink3: 'ansi256(244)',
86
+ ink4: undefined,
87
+ brand: 'ansi256(73)',
88
+ brandTint: 'ansi256(23)',
89
+ pos: 'ansi256(29)',
90
+ neg: 'ansi256(131)',
91
+ warn: 'ansi256(136)',
92
+ info: 'ansi256(30)',
93
+ rule: 'ansi256(240)',
94
+ };
95
+ case 1:
96
+ return {
97
+ level,
98
+ ink: undefined,
99
+ ink2: undefined,
100
+ ink3: undefined,
101
+ ink4: undefined,
102
+ brand: 'cyan',
103
+ brandTint: 'cyan',
104
+ pos: 'green',
105
+ neg: 'red',
106
+ warn: 'yellow',
107
+ info: 'blue',
108
+ rule: undefined,
109
+ };
110
+ default:
111
+ return {
112
+ level: 0,
113
+ ink: undefined,
114
+ ink2: undefined,
115
+ ink3: undefined,
116
+ ink4: undefined,
117
+ brand: undefined,
118
+ brandTint: undefined,
119
+ pos: undefined,
120
+ neg: undefined,
121
+ warn: undefined,
122
+ info: undefined,
123
+ rule: undefined,
124
+ };
125
+ }
126
+ }
127
+ /**
128
+ * The theme colour of a tone (`undefined` = the terminal default).
129
+ *
130
+ * @param theme - The theme
131
+ * @param tone - The tone
132
+ * @returns The Ink colour string, if any
133
+ */
134
+ export function toneColor(theme, tone) {
135
+ switch (tone) {
136
+ case 'pos': return theme.pos;
137
+ case 'neg': return theme.neg;
138
+ case 'warn': return theme.warn;
139
+ case 'info': return theme.info;
140
+ case 'brand': return theme.brand;
141
+ case 'muted': return theme.ink4;
142
+ default: return undefined;
143
+ }
144
+ }
145
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/tui/render/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
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 RepositoryStatus } from '@elaraai/e3-api-client';
6
+ import { type RepoServerHandle } from '../e3-server.js';
7
+ import { type Api } from './api.js';
8
+ import type { Refusal, SessionInfo } from './state/actions.js';
9
+ /** An open session. */
10
+ export interface Session {
11
+ info: SessionInfo;
12
+ api: Api;
13
+ /** The repository status fetched while opening (local / remote). */
14
+ status: RepositoryStatus | null;
15
+ /** Releases the session (stops the embedded server). */
16
+ stop(): Promise<void>;
17
+ }
18
+ /** Thrown by {@link openSession} when the target cannot be opened; carries the refusal screen. */
19
+ export declare class SessionRefusal extends Error {
20
+ readonly refusal: Refusal;
21
+ constructor(refusal: Refusal);
22
+ }
23
+ /** A one-line message for a refusal (logs, non-TTY). */
24
+ export declare function refusalMessage(refusal: Refusal): string;
25
+ /** How a target parses. */
26
+ export type Target = {
27
+ kind: 'local';
28
+ path: string;
29
+ } | {
30
+ kind: 'remote';
31
+ origin: string;
32
+ repo: string;
33
+ } | {
34
+ kind: 'origin';
35
+ origin: string;
36
+ };
37
+ /**
38
+ * Classifies a repository argument without touching the network: e3-cli's
39
+ * grammar for local paths and `https://host/repos/<repo>`, plus a bare
40
+ * `https://host` as an origin.
41
+ *
42
+ * @param target - The argument
43
+ * @returns The classification
44
+ * @throws {SessionRefusal} `not-repo` when a local path is not a repository
45
+ */
46
+ export declare function parseTarget(target: string): Target;
47
+ /** The label a target shows in the breadcrumb. */
48
+ export declare function targetLabel(target: Target): string;
49
+ /** The signed-in identity of a saved credential (its JWT's email or subject). */
50
+ export declare function identityOf(origin: string): string | null;
51
+ /** Options for {@link openSession}. */
52
+ export interface OpenSessionOptions {
53
+ /** Progress steps for the launch screen. */
54
+ onStep?: ((step: string) => void) | undefined;
55
+ /** Starts the embedded server (injectable for tests). */
56
+ startServer?: ((repoPath: string) => Promise<RepoServerHandle>) | undefined;
57
+ /** Resolves a remote token (injectable for tests). */
58
+ token?: ((origin: string) => Promise<string>) | undefined;
59
+ }
60
+ /**
61
+ * Opens a session.
62
+ *
63
+ * @param target - The repository argument
64
+ * @param options - Progress callback and injectable seams
65
+ * @returns The session
66
+ * @throws {SessionRefusal} With the refusal screen to show
67
+ */
68
+ export declare function openSession(target: string, options?: OpenSessionOptions): Promise<Session>;
69
+ /**
70
+ * Binds a repository on an origin session (`/repo <name>` in the repos view).
71
+ *
72
+ * @param session - The origin session
73
+ * @param repo - The repository name
74
+ * @returns A remote session over that repository
75
+ * @throws {SessionRefusal} When the repository does not exist
76
+ */
77
+ export declare function bindRepo(session: Session, repo: string, options?: OpenSessionOptions): Promise<Session>;
78
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/tui/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAA2C,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/D,uBAAuB;AACvB,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,GAAG,CAAC;IACT,oEAAoE;IACpE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,wDAAwD;IACxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,kGAAkG;AAClG,qBAAa,cAAe,SAAQ,KAAK;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO;gBAAhB,OAAO,EAAE,OAAO;CAIxC;AAED,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAOvD;AAED,2BAA2B;AAC3B,MAAM,MAAM,MAAM,GACZ;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBlD;AAED,kDAAkD;AAClD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxD;AAED,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IAC/B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,yDAAyD;IACzD,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,SAAS,CAAC;IAC5E,sDAAsD;IACtD,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;CAC7D;AAUD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqGpG;AAED;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjH"}
@@ -0,0 +1,237 @@
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
+ * Sessions — `openSession(target)` resolves a repository argument exactly
7
+ * as `e3` does (`parseRepoLocationSync` from `@elaraai/e3-cli/internal`),
8
+ * then binds an {@link Api}:
9
+ *
10
+ * - **local** — an embedded `@elaraai/e3-api-server` over the repository
11
+ * (`startRepoServer`, the same bootstrap `e3-ui shot --from-task` and the
12
+ * VS Code extension use); `repo = 'default'`; `stop()` on exit.
13
+ * - **remote** `https://host/repos/<repo>` — `getValidToken(origin)` now and
14
+ * **per request**, so a long session survives token expiry.
15
+ * - **bare origin** `https://host` — the repositories view; `/repo <name>`
16
+ * binds one.
17
+ *
18
+ * Refusals map to the three screens: not a repository (`repoGet` /
19
+ * `repoStatus` fail), not logged in (`getValidToken` throws — the box
20
+ * prefills `/login <origin>`), unreachable (the probe exhausts its retries).
21
+ *
22
+ * @packageDocumentation
23
+ */
24
+ import * as path from 'node:path';
25
+ import { parseRepoLocationSync, getValidToken, getCredential, decodeJwtPayload } from '@elaraai/e3-cli/internal';
26
+ import { repoStatus } from '@elaraai/e3-api-client';
27
+ import { startRepoServer } from '../e3-server.js';
28
+ import { createHttpApi, describeError, isApiCode } from './api.js';
29
+ /** Thrown by {@link openSession} when the target cannot be opened; carries the refusal screen. */
30
+ export class SessionRefusal extends Error {
31
+ refusal;
32
+ constructor(refusal) {
33
+ super(refusalMessage(refusal));
34
+ this.refusal = refusal;
35
+ this.name = 'SessionRefusal';
36
+ }
37
+ }
38
+ /** A one-line message for a refusal (logs, non-TTY). */
39
+ export function refusalMessage(refusal) {
40
+ switch (refusal.kind) {
41
+ case 'not-repo': return `${refusal.target} is not an e3 repository`;
42
+ case 'not-logged-in': return `not logged in to ${refusal.origin}`;
43
+ case 'unreachable': return `${refusal.url} is unreachable: ${refusal.error}`;
44
+ case 'error': return refusal.message;
45
+ }
46
+ }
47
+ /**
48
+ * Classifies a repository argument without touching the network: e3-cli's
49
+ * grammar for local paths and `https://host/repos/<repo>`, plus a bare
50
+ * `https://host` as an origin.
51
+ *
52
+ * @param target - The argument
53
+ * @returns The classification
54
+ * @throws {SessionRefusal} `not-repo` when a local path is not a repository
55
+ */
56
+ export function parseTarget(target) {
57
+ if (/^https?:\/\//.test(target)) {
58
+ const url = new URL(target);
59
+ if (/^\/repos\/[^/]+/.test(url.pathname)) {
60
+ const location = parseRepoLocationSync(target);
61
+ if (location.type === 'remote')
62
+ return { kind: 'remote', origin: location.baseUrl, repo: location.repo };
63
+ }
64
+ return { kind: 'origin', origin: url.origin };
65
+ }
66
+ try {
67
+ const location = parseRepoLocationSync(target);
68
+ if (location.type === 'local')
69
+ return { kind: 'local', path: location.path };
70
+ }
71
+ catch {
72
+ throw new SessionRefusal({ kind: 'not-repo', target: target === '.' ? path.resolve('.') : target });
73
+ }
74
+ throw new SessionRefusal({ kind: 'not-repo', target });
75
+ }
76
+ /** The label a target shows in the breadcrumb. */
77
+ export function targetLabel(target) {
78
+ switch (target.kind) {
79
+ case 'local': return path.basename(target.path) || target.path;
80
+ case 'remote': return target.repo;
81
+ case 'origin': return new URL(target.origin).host;
82
+ }
83
+ }
84
+ /** The signed-in identity of a saved credential (its JWT's email or subject). */
85
+ export function identityOf(origin) {
86
+ const credential = getCredential(origin);
87
+ if (credential === null)
88
+ return null;
89
+ try {
90
+ const payload = decodeJwtPayload(credential.accessToken);
91
+ const email = payload['email'];
92
+ const sub = payload['sub'];
93
+ return typeof email === 'string' ? email : typeof sub === 'string' ? sub : null;
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ /** The error text of a connection failure (`ECONNREFUSED`, `fetch failed`, …). */
100
+ function connectionError(err) {
101
+ const cause = err.cause;
102
+ if (cause?.code !== undefined)
103
+ return cause.code;
104
+ if (cause?.message !== undefined)
105
+ return cause.message;
106
+ return describeError(err);
107
+ }
108
+ /**
109
+ * Opens a session.
110
+ *
111
+ * @param target - The repository argument
112
+ * @param options - Progress callback and injectable seams
113
+ * @returns The session
114
+ * @throws {SessionRefusal} With the refusal screen to show
115
+ */
116
+ export async function openSession(target, options = {}) {
117
+ const parsed = parseTarget(target);
118
+ const step = options.onStep ?? (() => undefined);
119
+ if (parsed.kind === 'local') {
120
+ step('starting embedded e3 api server');
121
+ const start = options.startServer ?? startRepoServer;
122
+ let server;
123
+ try {
124
+ server = await start(parsed.path);
125
+ }
126
+ catch (err) {
127
+ throw new SessionRefusal({ kind: 'error', message: `could not start the embedded server: ${describeError(err)}` });
128
+ }
129
+ step(`embedded e3 api server · ${server.apiUrl.replace(/^https?:\/\//, '')}`);
130
+ const api = createHttpApi({ apiUrl: server.apiUrl, repo: server.repo, token: async () => null });
131
+ let status = null;
132
+ try {
133
+ status = await repoStatus(server.apiUrl, server.repo, { token: null });
134
+ }
135
+ catch {
136
+ await server.stop();
137
+ throw new SessionRefusal({ kind: 'not-repo', target: parsed.path });
138
+ }
139
+ return {
140
+ info: {
141
+ kind: 'local',
142
+ label: targetLabel(parsed),
143
+ repo: server.repo,
144
+ apiUrl: server.apiUrl,
145
+ path: parsed.path,
146
+ origin: null,
147
+ identity: null,
148
+ stateKey: parsed.path,
149
+ target,
150
+ },
151
+ api,
152
+ status,
153
+ stop: () => server.stop(),
154
+ };
155
+ }
156
+ const origin = parsed.origin;
157
+ const tokenOf = options.token ?? getValidToken;
158
+ step(`resolving the saved credential for ${origin}`);
159
+ let token;
160
+ try {
161
+ token = await tokenOf(origin);
162
+ }
163
+ catch {
164
+ throw new SessionRefusal({ kind: 'not-logged-in', origin, repo: parsed.kind === 'remote' ? parsed.repo : null });
165
+ }
166
+ const api = createHttpApi({ apiUrl: origin, repo: parsed.kind === 'remote' ? parsed.repo : null, token: () => tokenOf(origin) });
167
+ if (parsed.kind === 'remote') {
168
+ step(`reading ${origin}/repos/${parsed.repo}`);
169
+ let status;
170
+ try {
171
+ status = await repoStatus(origin, parsed.repo, { token });
172
+ }
173
+ catch (err) {
174
+ if (isApiCode(err, 'repository_not_found'))
175
+ throw new SessionRefusal({ kind: 'not-repo', target });
176
+ if (isApiCode(err, 'unauthorized') || err.name === 'AuthError') {
177
+ throw new SessionRefusal({ kind: 'not-logged-in', origin, repo: parsed.repo });
178
+ }
179
+ throw new SessionRefusal({ kind: 'unreachable', url: `${origin}/api/repos/${parsed.repo}/status`, error: connectionError(err), attempts: 4 });
180
+ }
181
+ return {
182
+ info: {
183
+ kind: 'remote',
184
+ label: targetLabel(parsed),
185
+ repo: parsed.repo,
186
+ apiUrl: origin,
187
+ path: null,
188
+ origin,
189
+ identity: identityOf(origin),
190
+ stateKey: `${origin}/repos/${parsed.repo}`,
191
+ target,
192
+ },
193
+ api,
194
+ status,
195
+ stop: async () => undefined,
196
+ };
197
+ }
198
+ step(`reading the repositories on ${origin}`);
199
+ try {
200
+ await api.repoList();
201
+ }
202
+ catch (err) {
203
+ if (err.name === 'AuthError')
204
+ throw new SessionRefusal({ kind: 'not-logged-in', origin, repo: null });
205
+ throw new SessionRefusal({ kind: 'unreachable', url: `${origin}/api/repos`, error: connectionError(err), attempts: 4 });
206
+ }
207
+ return {
208
+ info: {
209
+ kind: 'origin',
210
+ label: targetLabel(parsed),
211
+ repo: null,
212
+ apiUrl: origin,
213
+ path: null,
214
+ origin,
215
+ identity: identityOf(origin),
216
+ stateKey: origin,
217
+ target,
218
+ },
219
+ api,
220
+ status: null,
221
+ stop: async () => undefined,
222
+ };
223
+ }
224
+ /**
225
+ * Binds a repository on an origin session (`/repo <name>` in the repos view).
226
+ *
227
+ * @param session - The origin session
228
+ * @param repo - The repository name
229
+ * @returns A remote session over that repository
230
+ * @throws {SessionRefusal} When the repository does not exist
231
+ */
232
+ export async function bindRepo(session, repo, options = {}) {
233
+ if (session.info.origin === null)
234
+ throw new SessionRefusal({ kind: 'error', message: 'not an origin session' });
235
+ return openSession(`${session.info.origin}/repos/${repo}`, options);
236
+ }
237
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tui/session.ts"],"names":[],"mappings":"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"}