@glbgpt/cli 0.1.0-test.1

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 (173) hide show
  1. package/README.md +111 -0
  2. package/dist/src/auth/authClient.d.ts +32 -0
  3. package/dist/src/auth/authClient.js +88 -0
  4. package/dist/src/auth/authClient.js.map +1 -0
  5. package/dist/src/auth/credentialStore.d.ts +22 -0
  6. package/dist/src/auth/credentialStore.js +51 -0
  7. package/dist/src/auth/credentialStore.js.map +1 -0
  8. package/dist/src/auth/loginFlow.d.ts +30 -0
  9. package/dist/src/auth/loginFlow.js +43 -0
  10. package/dist/src/auth/loginFlow.js.map +1 -0
  11. package/dist/src/auth/loopbackServer.d.ts +41 -0
  12. package/dist/src/auth/loopbackServer.js +141 -0
  13. package/dist/src/auth/loopbackServer.js.map +1 -0
  14. package/dist/src/auth/token.d.ts +8 -0
  15. package/dist/src/auth/token.js +15 -0
  16. package/dist/src/auth/token.js.map +1 -0
  17. package/dist/src/commands/accountCommand.d.ts +2 -0
  18. package/dist/src/commands/accountCommand.js +56 -0
  19. package/dist/src/commands/accountCommand.js.map +1 -0
  20. package/dist/src/commands/configCommand.d.ts +4 -0
  21. package/dist/src/commands/configCommand.js +53 -0
  22. package/dist/src/commands/configCommand.js.map +1 -0
  23. package/dist/src/commands/execCommand.d.ts +32 -0
  24. package/dist/src/commands/execCommand.js +122 -0
  25. package/dist/src/commands/execCommand.js.map +1 -0
  26. package/dist/src/commands/loginCommand.d.ts +11 -0
  27. package/dist/src/commands/loginCommand.js +96 -0
  28. package/dist/src/commands/loginCommand.js.map +1 -0
  29. package/dist/src/commands/mediaCommand.d.ts +41 -0
  30. package/dist/src/commands/mediaCommand.js +277 -0
  31. package/dist/src/commands/mediaCommand.js.map +1 -0
  32. package/dist/src/config/configFile.d.ts +30 -0
  33. package/dist/src/config/configFile.js +54 -0
  34. package/dist/src/config/configFile.js.map +1 -0
  35. package/dist/src/config/env.d.ts +6 -0
  36. package/dist/src/config/env.js +24 -0
  37. package/dist/src/config/env.js.map +1 -0
  38. package/dist/src/config/paths.d.ts +6 -0
  39. package/dist/src/config/paths.js +16 -0
  40. package/dist/src/config/paths.js.map +1 -0
  41. package/dist/src/core/catalog.d.ts +49 -0
  42. package/dist/src/core/catalog.js +96 -0
  43. package/dist/src/core/catalog.js.map +1 -0
  44. package/dist/src/core/httpChatBackend.d.ts +31 -0
  45. package/dist/src/core/httpChatBackend.js +134 -0
  46. package/dist/src/core/httpChatBackend.js.map +1 -0
  47. package/dist/src/core/id.d.ts +2 -0
  48. package/dist/src/core/id.js +5 -0
  49. package/dist/src/core/id.js.map +1 -0
  50. package/dist/src/core/runChat.d.ts +28 -0
  51. package/dist/src/core/runChat.js +49 -0
  52. package/dist/src/core/runChat.js.map +1 -0
  53. package/dist/src/core/session.d.ts +44 -0
  54. package/dist/src/core/session.js +70 -0
  55. package/dist/src/core/session.js.map +1 -0
  56. package/dist/src/core/sessionStore.d.ts +39 -0
  57. package/dist/src/core/sessionStore.js +106 -0
  58. package/dist/src/core/sessionStore.js.map +1 -0
  59. package/dist/src/core/toolRegistry.d.ts +19 -0
  60. package/dist/src/core/toolRegistry.js +53 -0
  61. package/dist/src/core/toolRegistry.js.map +1 -0
  62. package/dist/src/core/tools/generateImage.d.ts +10 -0
  63. package/dist/src/core/tools/generateImage.js +34 -0
  64. package/dist/src/core/tools/generateImage.js.map +1 -0
  65. package/dist/src/core/turnLoop.d.ts +31 -0
  66. package/dist/src/core/turnLoop.js +155 -0
  67. package/dist/src/core/turnLoop.js.map +1 -0
  68. package/dist/src/core/types.d.ts +137 -0
  69. package/dist/src/core/types.js +9 -0
  70. package/dist/src/core/types.js.map +1 -0
  71. package/dist/src/exec/input.d.ts +35 -0
  72. package/dist/src/exec/input.js +85 -0
  73. package/dist/src/exec/input.js.map +1 -0
  74. package/dist/src/exec/output.d.ts +39 -0
  75. package/dist/src/exec/output.js +84 -0
  76. package/dist/src/exec/output.js.map +1 -0
  77. package/dist/src/index.d.ts +2 -0
  78. package/dist/src/index.js +253 -0
  79. package/dist/src/index.js.map +1 -0
  80. package/dist/src/mcp/server.d.ts +38 -0
  81. package/dist/src/mcp/server.js +99 -0
  82. package/dist/src/mcp/server.js.map +1 -0
  83. package/dist/src/media/aiApiClient.d.ts +53 -0
  84. package/dist/src/media/aiApiClient.js +97 -0
  85. package/dist/src/media/aiApiClient.js.map +1 -0
  86. package/dist/src/media/errors.d.ts +7 -0
  87. package/dist/src/media/errors.js +70 -0
  88. package/dist/src/media/errors.js.map +1 -0
  89. package/dist/src/media/executor.d.ts +50 -0
  90. package/dist/src/media/executor.js +55 -0
  91. package/dist/src/media/executor.js.map +1 -0
  92. package/dist/src/media/generateImageTool.d.ts +19 -0
  93. package/dist/src/media/generateImageTool.js +120 -0
  94. package/dist/src/media/generateImageTool.js.map +1 -0
  95. package/dist/src/media/manifest.d.ts +23 -0
  96. package/dist/src/media/manifest.js +558 -0
  97. package/dist/src/media/manifest.js.map +1 -0
  98. package/dist/src/media/resolution.d.ts +13 -0
  99. package/dist/src/media/resolution.js +42 -0
  100. package/dist/src/media/resolution.js.map +1 -0
  101. package/dist/src/media/taskLedger.d.ts +17 -0
  102. package/dist/src/media/taskLedger.js +44 -0
  103. package/dist/src/media/taskLedger.js.map +1 -0
  104. package/dist/src/media/taskManager.d.ts +52 -0
  105. package/dist/src/media/taskManager.js +130 -0
  106. package/dist/src/media/taskManager.js.map +1 -0
  107. package/dist/src/media/types.d.ts +80 -0
  108. package/dist/src/media/types.js +15 -0
  109. package/dist/src/media/types.js.map +1 -0
  110. package/dist/src/tui/App.d.ts +34 -0
  111. package/dist/src/tui/App.js +540 -0
  112. package/dist/src/tui/App.js.map +1 -0
  113. package/dist/src/tui/MultilineInput.d.ts +36 -0
  114. package/dist/src/tui/MultilineInput.js +221 -0
  115. package/dist/src/tui/MultilineInput.js.map +1 -0
  116. package/dist/src/tui/atPopup.d.ts +21 -0
  117. package/dist/src/tui/atPopup.js +55 -0
  118. package/dist/src/tui/atPopup.js.map +1 -0
  119. package/dist/src/tui/attachments.d.ts +24 -0
  120. package/dist/src/tui/attachments.js +91 -0
  121. package/dist/src/tui/attachments.js.map +1 -0
  122. package/dist/src/tui/branding.d.ts +22 -0
  123. package/dist/src/tui/branding.js +119 -0
  124. package/dist/src/tui/branding.js.map +1 -0
  125. package/dist/src/tui/chatController.d.ts +188 -0
  126. package/dist/src/tui/chatController.js +614 -0
  127. package/dist/src/tui/chatController.js.map +1 -0
  128. package/dist/src/tui/commands.d.ts +13 -0
  129. package/dist/src/tui/commands.js +22 -0
  130. package/dist/src/tui/commands.js.map +1 -0
  131. package/dist/src/tui/confirmationBridge.d.ts +23 -0
  132. package/dist/src/tui/confirmationBridge.js +47 -0
  133. package/dist/src/tui/confirmationBridge.js.map +1 -0
  134. package/dist/src/tui/inputHistory.d.ts +7 -0
  135. package/dist/src/tui/inputHistory.js +64 -0
  136. package/dist/src/tui/inputHistory.js.map +1 -0
  137. package/dist/src/tui/markdown.d.ts +1 -0
  138. package/dist/src/tui/markdown.js +143 -0
  139. package/dist/src/tui/markdown.js.map +1 -0
  140. package/dist/src/tui/models.d.ts +30 -0
  141. package/dist/src/tui/models.js +54 -0
  142. package/dist/src/tui/models.js.map +1 -0
  143. package/dist/src/tui/run.d.ts +29 -0
  144. package/dist/src/tui/run.js +212 -0
  145. package/dist/src/tui/run.js.map +1 -0
  146. package/dist/src/tui/slashMedia.d.ts +36 -0
  147. package/dist/src/tui/slashMedia.js +86 -0
  148. package/dist/src/tui/slashMedia.js.map +1 -0
  149. package/dist/src/tui/visualLines.d.ts +38 -0
  150. package/dist/src/tui/visualLines.js +110 -0
  151. package/dist/src/tui/visualLines.js.map +1 -0
  152. package/dist/src/util/clipboardImage.d.ts +6 -0
  153. package/dist/src/util/clipboardImage.js +69 -0
  154. package/dist/src/util/clipboardImage.js.map +1 -0
  155. package/dist/src/util/hyperlink.d.ts +10 -0
  156. package/dist/src/util/hyperlink.js +33 -0
  157. package/dist/src/util/hyperlink.js.map +1 -0
  158. package/dist/src/util/imageRef.d.ts +15 -0
  159. package/dist/src/util/imageRef.js +46 -0
  160. package/dist/src/util/imageRef.js.map +1 -0
  161. package/dist/src/util/inlineImage.d.ts +13 -0
  162. package/dist/src/util/inlineImage.js +56 -0
  163. package/dist/src/util/inlineImage.js.map +1 -0
  164. package/dist/src/util/openBrowser.d.ts +5 -0
  165. package/dist/src/util/openBrowser.js +23 -0
  166. package/dist/src/util/openBrowser.js.map +1 -0
  167. package/dist/src/util/retry.d.ts +43 -0
  168. package/dist/src/util/retry.js +116 -0
  169. package/dist/src/util/retry.js.map +1 -0
  170. package/dist/src/version.d.ts +6 -0
  171. package/dist/src/version.js +16 -0
  172. package/dist/src/version.js.map +1 -0
  173. package/package.json +45 -0
@@ -0,0 +1,614 @@
1
+ import { resolveAttachments } from './attachments.js';
2
+ import { parseSlashMedia } from './slashMedia.js';
3
+ import { availableModels } from '../media/manifest.js';
4
+ import { getChatModels } from './models.js';
5
+ import { SLASH_COMMANDS } from './commands.js';
6
+ import { Session } from '../core/session.js';
7
+ import { newId } from '../core/id.js';
8
+ // Generated from the single command source so /help can never drift from the popup.
9
+ const HELP_TEXT = [
10
+ 'Commands:',
11
+ ...SLASH_COMMANDS.map((c) => {
12
+ const left = `/${c.name}${c.args ? ` ${c.args}` : ''}`;
13
+ return ` ${left.padEnd(24)}${c.description}`;
14
+ }),
15
+ 'Attach images: @image (last generated) · @clipboard or Ctrl+V (clipboard) · @<path>.',
16
+ 'Type anything else to chat. The model replies in your language.',
17
+ ].join('\n');
18
+ /**
19
+ * Headless controller for the chat TUI: owns the view state and maps the engine's
20
+ * EngineEvent stream into a renderable timeline. Contains no Ink/React so it can be
21
+ * unit-tested deterministically; the Ink view is a thin layer over it.
22
+ */
23
+ export class ChatController {
24
+ session;
25
+ turnLoop;
26
+ extras;
27
+ state;
28
+ subscribers = new Set();
29
+ /** Index of the assistant item currently collecting deltas, or -1 if none is open. */
30
+ openAssistant = -1;
31
+ /** Abort controller for the in-flight turn (null when idle). */
32
+ turnAbort = null;
33
+ /** Serializes busy-time enqueues so rapid submits keep keystroke order. */
34
+ enqueueChain = Promise.resolve();
35
+ /** Output URL of the most recently completed generation (for `@image` attachments). */
36
+ lastMediaUrl;
37
+ /** Session start (for the exit summary). */
38
+ startedAt = Date.now();
39
+ constructor(session, turnLoop, extras = {}) {
40
+ this.session = session;
41
+ this.turnLoop = turnLoop;
42
+ this.extras = extras;
43
+ this.state = {
44
+ model: session.model,
45
+ items: [],
46
+ busy: false,
47
+ runningTasks: [],
48
+ queued: [],
49
+ sessionUsage: { promptTokens: 0, completionTokens: 0, turns: 0, mediaCreditsEstimated: 0, mediaSubmits: 0 },
50
+ };
51
+ }
52
+ getState() {
53
+ return this.state;
54
+ }
55
+ /**
56
+ * Timeline items safe to persist: a tool row still 'running' mid-turn has no outcome —
57
+ * persisting it would resurrect as a forever-spinning zombie on resume. The settled row
58
+ * re-persists when the turn ends.
59
+ */
60
+ getPersistableItems() {
61
+ return this.state.items.filter((it) => !(it.kind === 'tool' && it.status === 'running'));
62
+ }
63
+ /** The session currently being edited (swapped by `/new`); used for persistence. */
64
+ getSession() {
65
+ return this.session;
66
+ }
67
+ /**
68
+ * Restore the visible timeline on `resume`. Prefers the PERSISTED transcript (stored
69
+ * alongside the messages, Codex-rollout style); falls back to deriving it from the
70
+ * model messages for sessions saved before transcripts were persisted.
71
+ */
72
+ hydrateFromSession(persisted) {
73
+ this.openAssistant = -1;
74
+ const restored = restoreTimeline(persisted);
75
+ this.setState({ items: restored ?? timelineFromMessages(this.session.messages) });
76
+ // Rehydrate `@image` — restored media rows advertise "ask about it with @image", which
77
+ // must keep working after resume. The output URL lives in the background-task system
78
+ // notes; take the LAST one (most recent generation).
79
+ for (const m of this.session.messages) {
80
+ if (m.role !== 'system' || typeof m.content !== 'string')
81
+ continue;
82
+ const done = /Generation task \S+ completed\. Saved locally at .+?\. Output URL: (\S+)\./.exec(m.content);
83
+ if (done)
84
+ this.lastMediaUrl = done[1];
85
+ }
86
+ }
87
+ /** Subscribe to state changes. Returns an unsubscribe function. */
88
+ subscribe(cb) {
89
+ this.subscribers.add(cb);
90
+ return () => this.subscribers.delete(cb);
91
+ }
92
+ switchModel(model) {
93
+ this.session.switchModel(model);
94
+ this.setState({ model });
95
+ this.addItem({ kind: 'note', text: `Switched model to ${model}.` });
96
+ }
97
+ /** Start a fresh conversation (a new session id), keeping the current model. */
98
+ reset() {
99
+ // A new id so persistence writes a new file instead of overwriting the prior conversation.
100
+ this.session = new Session({ id: newId(), model: this.session.model });
101
+ this.openAssistant = -1;
102
+ this.setState({ items: [] });
103
+ }
104
+ showHelp() {
105
+ this.addItem({ kind: 'note', text: HELP_TEXT });
106
+ }
107
+ /** Track background generation tasks: progress updates the summary bar; completion hits the timeline. */
108
+ handleTaskEvent(e) {
109
+ if (e.type === 'task_progress') {
110
+ const rest = this.state.runningTasks.filter((t) => t.taskId !== e.taskId);
111
+ this.setState({
112
+ runningTasks: [...rest, { taskId: e.taskId, status: e.status, elapsedMs: e.elapsedMs }],
113
+ });
114
+ return;
115
+ }
116
+ const runningTasks = this.state.runningTasks.filter((t) => t.taskId !== e.taskId);
117
+ if (e.type === 'task_done') {
118
+ this.state = { ...this.state, runningTasks };
119
+ this.lastMediaUrl = e.outputUrl;
120
+ this.addItem({ kind: 'media', taskId: e.taskId, status: 'done', localPath: e.localPath });
121
+ // Tell the MODEL too — its context otherwise ends at "submitted, running in background",
122
+ // so a follow-up question would truthfully get "I can't see it".
123
+ this.session.addSystemNote(`[background task update] Generation task ${e.taskId} completed. ` +
124
+ `Saved locally at ${e.localPath}. Output URL: ${e.outputUrl}. ` +
125
+ `The user can attach it to a message with @image so you can view it.`);
126
+ }
127
+ else if (e.type === 'task_failed') {
128
+ this.state = { ...this.state, runningTasks };
129
+ this.addItem({ kind: 'media', taskId: e.taskId, status: 'failed', reason: e.reason });
130
+ this.session.addSystemNote(`[background task update] Generation task ${e.taskId} FAILED: ${e.reason}`);
131
+ }
132
+ }
133
+ /**
134
+ * `/image` / `/video`: run the same client tool the model uses, so the confirmation gate,
135
+ * ledger, background polling, and error mapping are identical to the natural-language path.
136
+ * `rest` accepts the CLI's flag syntax (`a cat --ar 16:9 --res 2K -m nano-banana-2 ...`).
137
+ */
138
+ async runMedia(kind, rest) {
139
+ const tool = this.extras.mediaTools?.[kind];
140
+ if (!tool) {
141
+ this.note(`/${kind} is not available (sign in with \`glbgpt login\` first).`);
142
+ return;
143
+ }
144
+ if (this.state.busy)
145
+ return;
146
+ const parsed = parseSlashMedia(rest);
147
+ if (!parsed.ok) {
148
+ this.note(parsed.error);
149
+ return;
150
+ }
151
+ const a = parsed.args;
152
+ const toolArgs = { prompt: a.prompt };
153
+ if (a.model)
154
+ toolArgs.model = a.model;
155
+ if (a.aspectRatio)
156
+ toolArgs.aspect_ratio = a.aspectRatio;
157
+ if (a.resolution)
158
+ toolArgs.resolution = a.resolution;
159
+ if (a.duration !== undefined)
160
+ toolArgs.duration = a.duration;
161
+ if (a.seed !== undefined)
162
+ toolArgs.seed = a.seed;
163
+ if (a.n !== undefined)
164
+ toolArgs.count = a.n;
165
+ if (a.negativePrompt)
166
+ toolArgs.negative_prompt = a.negativePrompt;
167
+ if (a.generateAudio !== undefined)
168
+ toolArgs.generate_audio = a.generateAudio;
169
+ const id = newId();
170
+ this.addItem({ kind: 'tool', id, name: tool.name, status: 'running' });
171
+ this.setState({ busy: true });
172
+ try {
173
+ const result = await tool.execute(toolArgs);
174
+ this.replaceItem(this.state.items.findIndex((i) => i.kind === 'tool' && i.id === id), (item) => (item.kind === 'tool' ? { ...item, status: 'done', result } : item));
175
+ this.recordMediaSubmit(result);
176
+ }
177
+ catch (err) {
178
+ this.addItem({ kind: 'error', text: err instanceof Error ? err.message : String(err) });
179
+ }
180
+ finally {
181
+ this.setState({ busy: false });
182
+ }
183
+ }
184
+ /** `/tasks`: running tasks plus recent history. */
185
+ async showTasks() {
186
+ const lines = [];
187
+ for (const t of this.state.runningTasks) {
188
+ lines.push(`⏳ ${t.taskId} · ${t.status} · ${Math.round(t.elapsedMs / 1000)}s`);
189
+ }
190
+ if (this.extras.listRecentTasks) {
191
+ try {
192
+ const recent = await this.extras.listRecentTasks();
193
+ for (const r of recent.slice(0, 5)) {
194
+ if (this.state.runningTasks.some((t) => t.taskId === r.taskId))
195
+ continue;
196
+ lines.push(` ${r.taskId} · ${r.model} · ${r.prompt.slice(0, 40)}`);
197
+ }
198
+ }
199
+ catch {
200
+ // Recent history is best-effort.
201
+ }
202
+ }
203
+ this.note(lines.length ? lines.join('\n') : 'No tasks yet. Try /image or /video.');
204
+ }
205
+ /** `/status`: session/model basics immediately, account line when it arrives. */
206
+ async showStatus() {
207
+ this.note([
208
+ `model: ${this.state.model}`,
209
+ `conversation: ${this.session.id} (${this.session.messages.length} messages)`,
210
+ `running tasks: ${this.state.runningTasks.length}`,
211
+ ].join('\n'));
212
+ if (this.extras.fetchAccountLine) {
213
+ try {
214
+ const line = await this.extras.fetchAccountLine();
215
+ if (line)
216
+ this.note(line);
217
+ }
218
+ catch {
219
+ // Account info is best-effort; the basics above are already shown.
220
+ }
221
+ }
222
+ }
223
+ /** `/models`: list chat + image/video models available (server-driven catalog applied). */
224
+ showModels() {
225
+ const chat = getChatModels().map((m) => {
226
+ // The baked-in fallback labels already carry an "id — " prefix; server labels don't.
227
+ const desc = m.label.startsWith(m.id) ? m.label.slice(m.id.length).replace(/^\s*[—-]\s*/, '') : m.label;
228
+ return ` ${m.id} — ${desc}`;
229
+ });
230
+ const image = availableModels().filter((m) => m.type === 'image').map((m) => ` ${m.id} — ${m.displayName}`);
231
+ const video = availableModels().filter((m) => m.type === 'video').map((m) => ` ${m.id} — ${m.displayName}`);
232
+ this.note([
233
+ `chat (${chat.length}) — /model to switch:`,
234
+ ...chat,
235
+ `image (${image.length}) — /image <prompt> -m <id>:`,
236
+ ...image,
237
+ `video (${video.length}) — /video <prompt> -m <id>:`,
238
+ ...video,
239
+ ].join('\n'));
240
+ }
241
+ /** `/account`: full account summary (email · plan · balance). */
242
+ async showAccount() {
243
+ if (!this.extras.fetchAccount) {
244
+ this.note('Account info is not available here.');
245
+ return;
246
+ }
247
+ try {
248
+ this.note(await this.extras.fetchAccount());
249
+ }
250
+ catch (err) {
251
+ this.note(err instanceof Error ? err.message : String(err));
252
+ }
253
+ }
254
+ /** `/transactions`: authoritative recent spend. */
255
+ async showTransactions() {
256
+ if (!this.extras.fetchTransactions) {
257
+ this.note('Transactions are not available here.');
258
+ return;
259
+ }
260
+ try {
261
+ this.note(await this.extras.fetchTransactions());
262
+ }
263
+ catch (err) {
264
+ this.note(err instanceof Error ? err.message : String(err));
265
+ }
266
+ }
267
+ /** `/login`: re-authenticate in place, hot-swapping the token everywhere. */
268
+ async reauth(mode) {
269
+ if (!this.extras.reauth) {
270
+ this.note('Sign-in is not available here. Run `glbgpt login` in a shell.');
271
+ return;
272
+ }
273
+ try {
274
+ this.note(await this.extras.reauth(mode));
275
+ }
276
+ catch (err) {
277
+ this.note(`Login failed: ${err instanceof Error ? err.message : String(err)}`);
278
+ }
279
+ }
280
+ /** `/logout`: clear stored credentials. */
281
+ async logout() {
282
+ if (!this.extras.logout) {
283
+ this.note('Sign-out is not available here.');
284
+ return;
285
+ }
286
+ try {
287
+ this.note(await this.extras.logout());
288
+ }
289
+ catch (err) {
290
+ this.note(err instanceof Error ? err.message : String(err));
291
+ }
292
+ }
293
+ /** `/resume`: swap in a previously saved session and rebuild the timeline. */
294
+ replaceSession(session, persistedTimeline) {
295
+ this.session = session;
296
+ this.openAssistant = -1;
297
+ this.setState({ model: session.model });
298
+ this.hydrateFromSession(persistedTimeline);
299
+ this.note(`Resumed conversation ${session.id}.`);
300
+ }
301
+ note(text) {
302
+ this.addItem({ kind: 'note', text });
303
+ }
304
+ /**
305
+ * Submit a user message and run one turn to completion, updating the timeline as events
306
+ * arrive. `displayText` (when given) is what the transcript shows — e.g. "[Image #1]"
307
+ * placeholders — while `text` carries the expanded form for attachment resolution.
308
+ *
309
+ * Attachments resolve at ENTER time (snapshot semantics — @clipboard reads the clipboard
310
+ * now, not minutes later when a queued message flushes), and the queue stores the RESOLVED
311
+ * content so pasted images survive queueing.
312
+ */
313
+ async submit(text, displayText) {
314
+ if (this.state.busy) {
315
+ // Don't drop input typed mid-turn (Claude Code behavior): queue it and send in order
316
+ // once the current turn finishes. Attachments resolve NOW (snapshot semantics — the
317
+ // clipboard/pasted temp file is read at Enter time, not minutes later at flush), and
318
+ // the chain keeps rapid enqueues in keystroke order even when resolution IO differs.
319
+ this.enqueueChain = this.enqueueChain.then(async () => {
320
+ const resolved = await this.resolveForSubmit(text, displayText);
321
+ if (!resolved)
322
+ return;
323
+ this.setState({ queued: [...this.state.queued, resolved] });
324
+ // The turn may have settled while we were resolving — flush now or the
325
+ // message would sit in the queue until the NEXT turn ends.
326
+ if (!this.state.busy)
327
+ this.flushQueued();
328
+ });
329
+ await this.enqueueChain;
330
+ return;
331
+ }
332
+ // Claim busy SYNCHRONOUSLY (before any await) — otherwise two rapid submits both pass
333
+ // the guard and run concurrent turns.
334
+ this.setState({ busy: true });
335
+ try {
336
+ const resolved = await this.resolveForSubmit(text, displayText);
337
+ if (!resolved)
338
+ return;
339
+ await this.runResolvedTurn(resolved);
340
+ }
341
+ finally {
342
+ this.setState({ busy: false });
343
+ this.flushQueued();
344
+ }
345
+ }
346
+ /** Resolve `@…` attachments into a queueable message; null → error already noted. */
347
+ async resolveForSubmit(text, displayText) {
348
+ // `@image` / `@path.png` references become multimodal content parts (vision).
349
+ const attachments = await resolveAttachments(text, {
350
+ lastMediaUrl: this.lastMediaUrl,
351
+ ...this.extras.attachmentIO,
352
+ });
353
+ if (attachments.kind === 'error') {
354
+ this.note(attachments.message);
355
+ return null;
356
+ }
357
+ const content = attachments.kind === 'parts' ? attachments.parts : text;
358
+ const display = (displayText ?? text) + (attachments.kind === 'parts' ? ' 📎' : '');
359
+ return { content, display };
360
+ }
361
+ /** Run one turn whose attachments are already resolved. Caller owns the busy flag. */
362
+ async runResolvedTurn(msg) {
363
+ try {
364
+ this.addItem({ kind: 'user', text: msg.display });
365
+ this.openAssistant = -1;
366
+ this.turnAbort = new AbortController();
367
+ await this.turnLoop.runTurn(this.session, msg.content, (event) => this.onEvent(event), {
368
+ signal: this.turnAbort.signal,
369
+ });
370
+ }
371
+ catch (err) {
372
+ this.addItem({ kind: 'error', text: err instanceof Error ? err.message : String(err) });
373
+ }
374
+ finally {
375
+ this.turnAbort = null;
376
+ this.openAssistant = -1;
377
+ }
378
+ }
379
+ /** Send the next queued (already-resolved) message, if any (runs after each turn settles). */
380
+ flushQueued() {
381
+ const [next, ...rest] = this.state.queued;
382
+ if (next === undefined)
383
+ return;
384
+ this.setState({ queued: rest, busy: true });
385
+ void this.runResolvedTurn(next).finally(() => {
386
+ this.setState({ busy: false });
387
+ this.flushQueued();
388
+ });
389
+ }
390
+ /** Accumulate the estimated cost of a submitted media task (estimates only, not the bill). */
391
+ recordMediaSubmit(result) {
392
+ if (!result || typeof result.task_id !== 'string' || typeof result.estimated_credits !== 'number')
393
+ return;
394
+ const u = this.state.sessionUsage;
395
+ this.setState({
396
+ sessionUsage: {
397
+ ...u,
398
+ mediaCreditsEstimated: u.mediaCreditsEstimated + result.estimated_credits,
399
+ mediaSubmits: u.mediaSubmits + 1,
400
+ },
401
+ });
402
+ }
403
+ /** `/cost`: session usage breakdown. Authoritative spend lives in `glbgpt account transactions`. */
404
+ showCost() {
405
+ const u = this.state.sessionUsage;
406
+ this.note([
407
+ `this session: ${u.turns} turn${u.turns === 1 ? '' : 's'} · ${u.promptTokens.toLocaleString()} in / ${u.completionTokens.toLocaleString()} out tokens`,
408
+ u.mediaSubmits > 0
409
+ ? `media: ${u.mediaSubmits} task${u.mediaSubmits === 1 ? '' : 's'} submitted · ~${u.mediaCreditsEstimated.toLocaleString()} credits (estimated)`
410
+ : 'media: none',
411
+ 'authoritative spend: `glbgpt account transactions`',
412
+ ].join('\n'));
413
+ }
414
+ /** Interrupt the in-flight turn (Esc). Partial output is kept; no-op when idle. */
415
+ interrupt() {
416
+ this.turnAbort?.abort();
417
+ }
418
+ onEvent(event) {
419
+ switch (event.type) {
420
+ case 'assistant_delta': {
421
+ if (this.openAssistant < 0) {
422
+ this.addItem({ kind: 'assistant', text: event.text });
423
+ this.openAssistant = this.state.items.length - 1;
424
+ }
425
+ else {
426
+ this.replaceItem(this.openAssistant, (item) => item.kind === 'assistant' ? { ...item, text: item.text + event.text } : item);
427
+ }
428
+ break;
429
+ }
430
+ case 'tool_call_begin': {
431
+ // Close any open assistant bubble so post-tool text starts a fresh one.
432
+ this.openAssistant = -1;
433
+ this.addItem({ kind: 'tool', id: event.id, name: event.name, status: 'running', args: event.args });
434
+ break;
435
+ }
436
+ case 'tool_call_end': {
437
+ const idx = this.state.items.findIndex((i) => i.kind === 'tool' && i.id === event.id);
438
+ if (idx >= 0) {
439
+ this.replaceItem(idx, (item) => item.kind === 'tool' ? { ...item, status: 'done', result: event.result } : item);
440
+ }
441
+ this.recordMediaSubmit(event.result);
442
+ break;
443
+ }
444
+ case 'usage': {
445
+ const u = this.state.sessionUsage;
446
+ this.setState({
447
+ sessionUsage: {
448
+ ...u,
449
+ promptTokens: u.promptTokens + event.promptTokens,
450
+ completionTokens: u.completionTokens + event.completionTokens,
451
+ },
452
+ });
453
+ break;
454
+ }
455
+ case 'turn_complete': {
456
+ this.openAssistant = -1;
457
+ this.setState({
458
+ sessionUsage: { ...this.state.sessionUsage, turns: this.state.sessionUsage.turns + 1 },
459
+ });
460
+ break;
461
+ }
462
+ case 'turn_interrupted': {
463
+ this.openAssistant = -1;
464
+ this.addItem({ kind: 'note', text: 'Interrupted (Esc).' });
465
+ break;
466
+ }
467
+ case 'error': {
468
+ this.openAssistant = -1;
469
+ this.addItem({ kind: 'error', text: event.message });
470
+ break;
471
+ }
472
+ }
473
+ }
474
+ addItem(item) {
475
+ this.state = { ...this.state, items: [...this.state.items, item] };
476
+ this.emit();
477
+ }
478
+ replaceItem(index, fn) {
479
+ const items = this.state.items.map((it, i) => (i === index ? fn(it) : it));
480
+ this.state = { ...this.state, items };
481
+ this.emit();
482
+ }
483
+ setState(partial) {
484
+ this.state = { ...this.state, ...partial };
485
+ this.emit();
486
+ }
487
+ emit() {
488
+ for (const cb of this.subscribers)
489
+ cb(this.state);
490
+ }
491
+ }
492
+ /**
493
+ * Validate one persisted transcript entry field-by-field — kind alone is not enough: a
494
+ * malformed item (missing text) would crash the renderer on /resume with no recovery path,
495
+ * and a persisted 'running' tool row (mid-turn save from an old build) would spin forever.
496
+ */
497
+ function restoreTimelineItem(it) {
498
+ if (typeof it !== 'object' || it === null)
499
+ return null;
500
+ const o = it;
501
+ switch (o.kind) {
502
+ case 'user':
503
+ case 'assistant':
504
+ case 'note':
505
+ case 'error':
506
+ return typeof o.text === 'string' ? { kind: o.kind, text: o.text } : null;
507
+ case 'tool':
508
+ if (typeof o.id !== 'string' || typeof o.name !== 'string')
509
+ return null;
510
+ return {
511
+ kind: 'tool',
512
+ id: o.id,
513
+ name: o.name,
514
+ status: 'done', // a persisted row is by definition settled
515
+ ...(typeof o.args === 'object' && o.args !== null ? { args: o.args } : {}),
516
+ ...(typeof o.result === 'object' && o.result !== null ? { result: o.result } : {}),
517
+ };
518
+ case 'media': {
519
+ if (typeof o.taskId !== 'string')
520
+ return null;
521
+ if (o.status === 'done' && typeof o.localPath === 'string') {
522
+ return { kind: 'media', taskId: o.taskId, status: 'done', localPath: o.localPath };
523
+ }
524
+ if (o.status === 'failed') {
525
+ return { kind: 'media', taskId: o.taskId, status: 'failed', reason: typeof o.reason === 'string' ? o.reason : 'unknown' };
526
+ }
527
+ return null;
528
+ }
529
+ default:
530
+ return null;
531
+ }
532
+ }
533
+ /** Validate a persisted transcript; returns null when absent/unusable (→ derive instead). */
534
+ function restoreTimeline(persisted) {
535
+ if (!persisted || persisted.length === 0)
536
+ return null;
537
+ const items = persisted.map(restoreTimelineItem).filter((it) => it !== null);
538
+ return items.length > 0 ? items : null;
539
+ }
540
+ /** Convert a stored message history into renderable timeline items (for resume). */
541
+ export function timelineFromMessages(messages) {
542
+ const items = [];
543
+ const toolIndexById = new Map();
544
+ for (const m of messages) {
545
+ if (m.role === 'system' && typeof m.content === 'string' && m.content.startsWith('[background task update]')) {
546
+ // Restore background-generation results into the visible timeline on resume —
547
+ // these live in the session only as system notes for the model.
548
+ const done = /Generation task (\S+) completed\. Saved locally at (.+?)\. Output URL: (\S+)\./.exec(m.content);
549
+ const failed = /Generation task (\S+) FAILED: ([\s\S]*)$/.exec(m.content);
550
+ if (done) {
551
+ items.push({ kind: 'media', taskId: done[1], status: 'done', localPath: done[2] });
552
+ }
553
+ else if (failed) {
554
+ items.push({ kind: 'media', taskId: failed[1], status: 'failed', reason: failed[2].trim() });
555
+ }
556
+ else {
557
+ items.push({ kind: 'note', text: m.content });
558
+ }
559
+ }
560
+ else if (m.role === 'user') {
561
+ items.push({ kind: 'user', text: contentToText(m.content) });
562
+ }
563
+ else if (m.role === 'assistant') {
564
+ if (m.content) {
565
+ items.push({ kind: 'assistant', text: contentToText(m.content) });
566
+ }
567
+ for (const tc of m.tool_calls ?? []) {
568
+ let args;
569
+ try {
570
+ args = tc.function.arguments ? JSON.parse(tc.function.arguments) : undefined;
571
+ }
572
+ catch {
573
+ args = undefined;
574
+ }
575
+ items.push({ kind: 'tool', id: tc.id, name: tc.function.name, status: 'done', args });
576
+ toolIndexById.set(tc.id, items.length - 1);
577
+ }
578
+ }
579
+ else if (m.role === 'tool' && m.tool_call_id) {
580
+ const idx = toolIndexById.get(m.tool_call_id);
581
+ if (idx !== undefined) {
582
+ const item = items[idx];
583
+ if (item.kind === 'tool') {
584
+ items[idx] = { ...item, result: parseToolResult(m.content) };
585
+ }
586
+ }
587
+ }
588
+ }
589
+ return items;
590
+ }
591
+ function parseToolResult(content) {
592
+ if (!content || typeof content !== 'string')
593
+ return {};
594
+ try {
595
+ return JSON.parse(content);
596
+ }
597
+ catch {
598
+ return { raw: content };
599
+ }
600
+ }
601
+ /** Flatten message content to display text; image parts render as a paperclip marker. */
602
+ function contentToText(content) {
603
+ if (typeof content === 'string')
604
+ return content;
605
+ if (!Array.isArray(content))
606
+ return '';
607
+ const text = content
608
+ .filter((p) => p.type === 'text')
609
+ .map((p) => p.text)
610
+ .join('');
611
+ const images = content.filter((p) => p.type === 'image_url').length;
612
+ return images > 0 ? `${text} 📎` : text;
613
+ }
614
+ //# sourceMappingURL=chatController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatController.js","sourceRoot":"","sources":["../../../src/tui/chatController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Slash command metadata — single source for the command popup (and future help surfaces).
3
+ * Order is display order: most-used first.
4
+ */
5
+ export interface SlashCommandInfo {
6
+ name: string;
7
+ /** Argument hint shown dimmed after the name ('' for argless commands). */
8
+ args: string;
9
+ description: string;
10
+ }
11
+ export declare const SLASH_COMMANDS: SlashCommandInfo[];
12
+ /** Commands whose name starts with the typed token (token excludes the leading '/'). */
13
+ export declare function filterCommands(token: string): SlashCommandInfo[];