@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,56 @@
1
+ import { AuthClient } from '../auth/authClient.js';
2
+ import { resolveToken } from '../auth/token.js';
3
+ import { apiBaseUrl } from '../config/env.js';
4
+ /**
5
+ * `glbgpt account [transactions]` — account summary and recent spend.
6
+ * Uses the shared account API (/user-api). All user-facing output is English.
7
+ */
8
+ async function requireToken() {
9
+ const token = await resolveToken();
10
+ if (!token) {
11
+ console.error('Not signed in. Run `glbgpt login` first (or set GLBGPT_TOKEN).');
12
+ process.exitCode = 1;
13
+ return null;
14
+ }
15
+ return token;
16
+ }
17
+ export async function runAccount() {
18
+ const token = await requireToken();
19
+ if (!token)
20
+ return;
21
+ try {
22
+ const info = await new AuthClient({ baseUrl: apiBaseUrl() }).userInfo(token);
23
+ console.log(`Account: ${info.email ?? '(unknown)'}`);
24
+ if (info.plan)
25
+ console.log(`Plan: ${info.plan}`);
26
+ if (info.balance !== undefined)
27
+ console.log(`Balance: ${info.balance} credits`);
28
+ console.error('\nRun `glbgpt account transactions` for recent spend.');
29
+ }
30
+ catch (err) {
31
+ console.error(err instanceof Error ? err.message : String(err));
32
+ process.exitCode = 1;
33
+ }
34
+ }
35
+ export async function runAccountTransactions() {
36
+ const token = await requireToken();
37
+ if (!token)
38
+ return;
39
+ try {
40
+ const bills = await new AuthClient({ baseUrl: apiBaseUrl() }).bills(token, 1, 20);
41
+ if (bills.length === 0) {
42
+ console.error('No transactions yet.');
43
+ return;
44
+ }
45
+ for (const b of bills) {
46
+ // cost is USD; show credits (1 credit ≈ $0.001) to match the generation estimates.
47
+ const credits = Math.round(b.cost * 1000);
48
+ console.log(`${(b.createdAt ?? '').padEnd(20)} ${String(credits).padStart(6)} cr ${b.model}`);
49
+ }
50
+ }
51
+ catch (err) {
52
+ console.error(err instanceof Error ? err.message : String(err));
53
+ process.exitCode = 1;
54
+ }
55
+ }
56
+ //# sourceMappingURL=accountCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountCommand.js","sourceRoot":"","sources":["../../../src/commands/accountCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;GAGG;AAEH,KAAK,UAAU,YAAY;IACzB,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,KAAK,IAAI,WAAW,EAAE,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,OAAO,UAAU,CAAC,CAAC;QACjF,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,mFAAmF;YACnF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function runConfigList(): Promise<void>;
2
+ export declare function runConfigGet(key: string): Promise<void>;
3
+ export declare function runConfigSet(key: string, value: string): Promise<void>;
4
+ export declare function runConfigUnset(key: string): Promise<void>;
@@ -0,0 +1,53 @@
1
+ import { CONFIG_KEYS, isConfigKey, readConfigSync, writeConfigValue } from '../config/configFile.js';
2
+ import { apiBaseUrl, webBaseUrl, lang } from '../config/env.js';
3
+ /**
4
+ * `glbgpt config list|get|set|unset` — persistent CLI settings.
5
+ *
6
+ * `list` shows the EFFECTIVE value per key (env override > file > default) and where it
7
+ * came from, so a user can always see why the CLI is talking to a given host.
8
+ */
9
+ function effective(key) {
10
+ const envName = CONFIG_KEYS[key].env;
11
+ const fromEnv = process.env[envName];
12
+ const stored = readConfigSync()[key];
13
+ const value = key === 'api-base-url' ? apiBaseUrl() : key === 'web-base-url' ? webBaseUrl() : lang();
14
+ return { value, source: fromEnv ? 'env' : stored ? 'config' : 'default' };
15
+ }
16
+ function badKey(key) {
17
+ console.error(`Unknown config key "${key}". Valid keys: ${Object.keys(CONFIG_KEYS).join(', ')}.`);
18
+ process.exitCode = 1;
19
+ }
20
+ export async function runConfigList() {
21
+ for (const key of Object.keys(CONFIG_KEYS)) {
22
+ const { value, source } = effective(key);
23
+ console.log(`${key} = ${value} (${source === 'env' ? `env ${CONFIG_KEYS[key].env}` : source})`);
24
+ }
25
+ console.error('\nSet with `glbgpt config set <key> <value>`; env vars override the stored value.');
26
+ }
27
+ export async function runConfigGet(key) {
28
+ if (!isConfigKey(key))
29
+ return badKey(key);
30
+ console.log(effective(key).value);
31
+ }
32
+ export async function runConfigSet(key, value) {
33
+ if (!isConfigKey(key))
34
+ return badKey(key);
35
+ if (!value.trim()) {
36
+ console.error('A non-empty value is required (use `config unset` to remove).');
37
+ process.exitCode = 1;
38
+ return;
39
+ }
40
+ await writeConfigValue(key, value.trim());
41
+ console.error(`Set ${key} = ${value.trim()}`);
42
+ const envName = CONFIG_KEYS[key].env;
43
+ if (process.env[envName]) {
44
+ console.error(`Note: the ${envName} env var is set and overrides this value in this shell.`);
45
+ }
46
+ }
47
+ export async function runConfigUnset(key) {
48
+ if (!isConfigKey(key))
49
+ return badKey(key);
50
+ await writeConfigValue(key, undefined);
51
+ console.error(`Unset ${key} (back to ${effective(key).source === 'env' ? 'the env override' : 'the default'}).`);
52
+ }
53
+ //# sourceMappingURL=configCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configCommand.js","sourceRoot":"","sources":["../../../src/commands/configCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type OutputSinks } from '../exec/output.js';
2
+ import type { ChatBackend } from '../core/types.js';
3
+ /** Flags parsed from the `exec` subcommand. */
4
+ export interface ExecOptions {
5
+ model?: string;
6
+ system?: string;
7
+ file?: string[];
8
+ /** Image references: local paths (inlined as data URLs) or http(s)/data URLs. */
9
+ image?: string[];
10
+ outputSchema?: string;
11
+ json?: boolean;
12
+ jsonl?: boolean;
13
+ outputLastMessage?: string;
14
+ }
15
+ /** Injectable dependencies (production defaults; overridden in tests). */
16
+ export interface ExecDeps {
17
+ backend?: ChatBackend;
18
+ sinks?: OutputSinks;
19
+ stdinIsTty?: boolean;
20
+ readStdin?: () => Promise<string>;
21
+ readFile?: (p: string) => Promise<string>;
22
+ /** Binary reader for --image local files (tests). */
23
+ readImage?: (p: string) => Promise<Buffer>;
24
+ writeFile?: (p: string, data: string) => Promise<void>;
25
+ resolveToken?: () => Promise<string | null>;
26
+ }
27
+ /**
28
+ * Run one non-interactive model call and render it per the chosen output mode.
29
+ * Returns the process exit code (0 success; 1 usage/auth/turn failure) rather than exiting,
30
+ * so the entry point owns `process.exitCode` and tests can assert it.
31
+ */
32
+ export declare function runExec(positional: string | undefined, opts: ExecOptions, deps?: ExecDeps): Promise<number>;
@@ -0,0 +1,122 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { HttpChatBackend } from '../core/httpChatBackend.js';
3
+ import { runChatTurn } from '../core/runChat.js';
4
+ import { resolveToken as defaultResolveToken } from '../auth/token.js';
5
+ import { apiBaseUrl } from '../config/env.js';
6
+ import { ensureCatalog } from '../core/catalog.js';
7
+ import { getDefaultChatModel, resolveChatModel } from '../tui/models.js';
8
+ import { UsageError, resolvePromptText, injectFiles, loadOutputSchema } from '../exec/input.js';
9
+ import { ExecOutput } from '../exec/output.js';
10
+ import { resolveImageRef, ImageRefError } from '../util/imageRef.js';
11
+ /**
12
+ * Run one non-interactive model call and render it per the chosen output mode.
13
+ * Returns the process exit code (0 success; 1 usage/auth/turn failure) rather than exiting,
14
+ * so the entry point owns `process.exitCode` and tests can assert it.
15
+ */
16
+ export async function runExec(positional, opts, deps = {}) {
17
+ const sinks = deps.sinks ?? {
18
+ out: (s) => process.stdout.write(s),
19
+ err: (s) => process.stderr.write(s),
20
+ };
21
+ if (opts.json && opts.jsonl) {
22
+ sinks.err('Use either --json or --jsonl, not both.\n');
23
+ return 1;
24
+ }
25
+ const mode = opts.jsonl ? 'jsonl' : opts.json ? 'json' : 'text';
26
+ // Server-driven catalog: cache applies immediately; if an explicit --model fails against a
27
+ // stale cache, wait for the background refresh once and retry (a newly-added model must not
28
+ // be rejected client-side just because this machine hasn't fetched the list yet).
29
+ const token = await (deps.resolveToken ?? defaultResolveToken)();
30
+ const { refreshed } = await ensureCatalog({ baseUrl: apiBaseUrl(), token });
31
+ let model;
32
+ try {
33
+ model = opts.model?.trim() ? resolveChatModel(opts.model.trim()) : getDefaultChatModel();
34
+ }
35
+ catch (err) {
36
+ await refreshed;
37
+ try {
38
+ model = resolveChatModel(opts.model.trim());
39
+ }
40
+ catch {
41
+ sinks.err(`${err instanceof Error ? err.message : String(err)}\n`);
42
+ return 1;
43
+ }
44
+ }
45
+ // 1. Assemble input. Any UsageError here is a caller/input error → exit 1, always on stderr.
46
+ let promptText;
47
+ let promptContent;
48
+ let responseFormat;
49
+ try {
50
+ promptText = await resolvePromptText({
51
+ positional,
52
+ stdinIsTty: deps.stdinIsTty ?? process.stdin.isTTY === true,
53
+ readStdin: deps.readStdin ?? readStdinAll,
54
+ });
55
+ promptText = await injectFiles(promptText, opts.file ?? [], deps.readFile);
56
+ promptContent = promptText;
57
+ if (opts.image && opts.image.length > 0) {
58
+ // --image: vision input. Local files inline as data URLs; URLs pass through.
59
+ const parts = [{ type: 'text', text: promptText }];
60
+ for (const ref of opts.image) {
61
+ try {
62
+ const url = await resolveImageRef(ref, deps.readImage);
63
+ parts.push({ type: 'image_url', image_url: { url } });
64
+ }
65
+ catch (err) {
66
+ if (err instanceof ImageRefError)
67
+ throw new UsageError(err.message);
68
+ throw err;
69
+ }
70
+ }
71
+ promptContent = parts;
72
+ }
73
+ if (opts.outputSchema) {
74
+ responseFormat = await loadOutputSchema(opts.outputSchema, deps.readFile);
75
+ }
76
+ }
77
+ catch (err) {
78
+ if (err instanceof UsageError) {
79
+ sinks.err(`${err.message}\n`);
80
+ return 1;
81
+ }
82
+ throw err;
83
+ }
84
+ // 2. Auth (token already resolved above for the catalog).
85
+ if (!token) {
86
+ sinks.err('Not signed in. Run `glbgpt login` first (or set GLBGPT_TOKEN).\n');
87
+ return 1;
88
+ }
89
+ // 3. Run one chat-only turn through the shared core, driving the output emitter live.
90
+ const backend = deps.backend ?? new HttpChatBackend({ baseUrl: apiBaseUrl(), token });
91
+ const output = new ExecOutput(mode, model, sinks);
92
+ output.start();
93
+ let result;
94
+ try {
95
+ result = await runChatTurn({ backend, model, prompt: promptContent, system: opts.system, responseFormat }, (event) => {
96
+ if (event.type === 'assistant_delta')
97
+ output.delta(event.text);
98
+ else if (event.type === 'usage')
99
+ output.usageEvent(event.promptTokens, event.completionTokens);
100
+ });
101
+ }
102
+ catch (err) {
103
+ output.finishError(err instanceof Error ? err.message : String(err));
104
+ return 1;
105
+ }
106
+ // 4. Write the last-message file on success only, then render the result.
107
+ if (opts.outputLastMessage) {
108
+ const write = deps.writeFile ?? ((p, data) => fs.writeFile(p, data));
109
+ await write(opts.outputLastMessage, result.content);
110
+ }
111
+ output.finishResult(result.structured);
112
+ return 0;
113
+ }
114
+ /** Read all of stdin as UTF-8. */
115
+ async function readStdinAll() {
116
+ const chunks = [];
117
+ for await (const chunk of process.stdin) {
118
+ chunks.push(Buffer.from(chunk));
119
+ }
120
+ return Buffer.concat(chunks).toString('utf8');
121
+ }
122
+ //# sourceMappingURL=execCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execCommand.js","sourceRoot":"","sources":["../../../src/commands/execCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `glbgpt login` — real dependency wiring for the login commands. Keeps orchestration logic
3
+ * in auth/loginFlow (unit-tested); this module handles I/O (browser, prompts, printing).
4
+ * All user-facing output is English.
5
+ */
6
+ export declare function runLogin(opts: {
7
+ noBrowser: boolean;
8
+ useCode: boolean;
9
+ }): Promise<void>;
10
+ export declare function runLogout(): Promise<void>;
11
+ export declare function runWhoami(): Promise<void>;
@@ -0,0 +1,96 @@
1
+ import readline from 'node:readline/promises';
2
+ import { stdin, stdout } from 'node:process';
3
+ import { AuthClient } from '../auth/authClient.js';
4
+ import { CredentialStore } from '../auth/credentialStore.js';
5
+ import { browserLogin, codeLogin } from '../auth/loginFlow.js';
6
+ import { openBrowser } from '../util/openBrowser.js';
7
+ import { apiBaseUrl, webBaseUrl, lang } from '../config/env.js';
8
+ /**
9
+ * `glbgpt login` — real dependency wiring for the login commands. Keeps orchestration logic
10
+ * in auth/loginFlow (unit-tested); this module handles I/O (browser, prompts, printing).
11
+ * All user-facing output is English.
12
+ */
13
+ export async function runLogin(opts) {
14
+ const authClient = new AuthClient({ baseUrl: apiBaseUrl() });
15
+ const credentialStore = new CredentialStore();
16
+ // On POSIX the credentials file is written 0600 in a 0700 dir; Windows ignores those mode
17
+ // bits, so the token is only as protected as the user profile. Warn once so it's not silent.
18
+ if (process.platform === 'win32') {
19
+ console.error(`Note: credentials are stored at ${credentialStore.location()} without file-permission protection on Windows.`);
20
+ }
21
+ try {
22
+ if (opts.useCode) {
23
+ const url = `${webBaseUrl().replace(/\/+$/, '')}/${lang()}/cli-auth?mode=code`;
24
+ console.error(`1. Open this page and authorize, then copy the code shown:\n ${url}`);
25
+ // Same residual-phishing warning as the browser path: a pasted code is a bearer secret.
26
+ console.error(' Only authorize if you started this login yourself. If someone gave you a code, do not paste it.');
27
+ const code = await prompt('2. Paste the code here: ');
28
+ if (!code.trim()) {
29
+ console.error('No code entered.');
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ const result = await codeLogin({ authClient, credentialStore }, code);
34
+ console.error(`Logged in${result.email ? ` as ${result.email}` : ''}.`);
35
+ return;
36
+ }
37
+ const result = await browserLogin({
38
+ webBaseUrl: webBaseUrl(),
39
+ lang: lang(),
40
+ authClient,
41
+ credentialStore,
42
+ openUrl: (url) => {
43
+ if (opts.noBrowser) {
44
+ console.error(`Open this URL to authorize:\n ${url}`);
45
+ console.error('Only authorize if you started this login yourself on a trusted device.');
46
+ }
47
+ else {
48
+ console.error(`Opening your browser to authorize…\n ${url}`);
49
+ console.error('Only authorize if you started this on this device.');
50
+ openBrowser(url);
51
+ }
52
+ },
53
+ });
54
+ console.error(`Logged in${result.email ? ` as ${result.email}` : ''}.`);
55
+ }
56
+ catch (err) {
57
+ console.error(`Login failed: ${err instanceof Error ? err.message : String(err)}`);
58
+ process.exitCode = 1;
59
+ }
60
+ }
61
+ export async function runLogout() {
62
+ const removed = await new CredentialStore().clear();
63
+ console.error(removed ? 'Signed out.' : 'You are not signed in.');
64
+ console.error('Note: this removes local credentials but does not revoke the token server-side.');
65
+ }
66
+ export async function runWhoami() {
67
+ const creds = await new CredentialStore().load();
68
+ if (!creds) {
69
+ console.error('Not signed in. Run `glbgpt login`.');
70
+ process.exitCode = 1;
71
+ return;
72
+ }
73
+ try {
74
+ const info = await new AuthClient({ baseUrl: apiBaseUrl() }).userInfo(creds.token);
75
+ const parts = [info.email ?? creds.email ?? '(unknown account)'];
76
+ if (info.plan)
77
+ parts.push(`plan: ${info.plan}`);
78
+ if (info.balance !== undefined)
79
+ parts.push(`balance: ${info.balance}`);
80
+ console.log(parts.join(' · '));
81
+ }
82
+ catch (err) {
83
+ console.error(`Signed in as ${creds.email ?? '(unknown)'}, but failed to refresh account info: ${err instanceof Error ? err.message : String(err)}`);
84
+ process.exitCode = 1;
85
+ }
86
+ }
87
+ async function prompt(question) {
88
+ const rl = readline.createInterface({ input: stdin, output: stdout });
89
+ try {
90
+ return await rl.question(question);
91
+ }
92
+ finally {
93
+ rl.close();
94
+ }
95
+ }
96
+ //# sourceMappingURL=loginCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loginCommand.js","sourceRoot":"","sources":["../../../src/commands/loginCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Top-level media commands: `image`, `model list|show`, `task list|show|download`.
3
+ *
4
+ * The command surface uses the shared GenerationExecutor with an auto-approving confirmer (the
5
+ * command itself is the authorization, contract §10): it prints the estimate, then submits, then
6
+ * blocks on the task and downloads. All user-facing output is English.
7
+ */
8
+ export interface ImageOptions {
9
+ model?: string;
10
+ aspectRatio?: string;
11
+ resolution?: string;
12
+ image?: string[];
13
+ count?: number;
14
+ seed?: number;
15
+ negativePrompt?: string;
16
+ out?: string;
17
+ estimate?: boolean;
18
+ detach?: boolean;
19
+ }
20
+ export interface VideoOptions {
21
+ model?: string;
22
+ aspectRatio?: string;
23
+ resolution?: string;
24
+ duration?: number;
25
+ audio?: boolean;
26
+ image?: string[];
27
+ startImage?: string;
28
+ endImage?: string;
29
+ out?: string;
30
+ estimate?: boolean;
31
+ detach?: boolean;
32
+ }
33
+ export declare function runImage(promptWords: string[], opts: ImageOptions): Promise<void>;
34
+ export declare function runVideo(promptWords: string[], opts: VideoOptions): Promise<void>;
35
+ export declare function runModelList(type?: string): Promise<void>;
36
+ export declare function runModelShow(id: string): Promise<void>;
37
+ export declare function runTaskList(): Promise<void>;
38
+ export declare function runTaskShow(idOrLast: string): Promise<void>;
39
+ /** `task wait <id|last>`: poll until the task reaches a terminal state, without downloading. */
40
+ export declare function runTaskWait(idOrLast: string, timeoutMs?: number): Promise<void>;
41
+ export declare function runTaskDownload(idOrLast: string, out?: string): Promise<void>;