@ggui-ai/cli 0.27.0 → 0.28.0

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.
package/dist/cli.js CHANGED
@@ -17,9 +17,10 @@ import { buildAgentRuntime, describeTunnelSession, DEV_HELP, launchBrowser, open
17
17
  import { createNullTunnelProvider, discoverTunnelProvider, } from './tunnel-provider.js';
18
18
  import { ManifestBlueprintProvider, resolveStorageFromConfig, buildNoCredentialsGguiSession, } from '@ggui-ai/mcp-server';
19
19
  import { InMemoryBlueprintProvider } from '@ggui-ai/mcp-server-core/in-memory';
20
+ import { ZERO_CONFIG_ROUTE_BY_PROVIDER } from '@ggui-ai/protocol';
20
21
  import { createByokResolver } from './byok-resolver.js';
21
22
  import { isInstalledBlueprintPath } from './internal/artifact-install.js';
22
- import { DEFAULT_ROUTE_BY_PROVIDER, GENERATION_MODEL_ENV, describeGenerationBinding, probeGenerationBinding, resolveConfiguredRoute, } from './generation-probe.js';
23
+ import { GENERATION_MODEL_ENV, describeGenerationBinding, probeGenerationBinding, resolveConfiguredRoute, } from './generation-probe.js';
23
24
  import { buildMcpServerBackend, pickFreePort } from './mcp-backend.js';
24
25
  import { FileSystemSeedPoolSource } from './filesystem-seed-pool-source.js';
25
26
  import { buildSeedPool } from '@ggui-ai/mcp-server-handlers';
@@ -73,6 +74,8 @@ Commands:
73
74
  --port <n> Bind port (default: 6781, 0 = OS-assigned).
74
75
  --host <addr> Bind host (default: 127.0.0.1).
75
76
  --mcp-only Boot only MCP; skip agent supervision.
77
+ --no-console Serve no operator console: no admin token is
78
+ minted or printed (env GGUI_NO_CONSOLE=1).
76
79
 
77
80
  login Sign into ggui.ai (device flow). Tokens stored in
78
81
  ~/.ggui/auth.json.
@@ -502,6 +505,12 @@ async function runServeCommand(args) {
502
505
  // the card (key missing).
503
506
  const baseUrlForCard = parsed.publicBaseUrl ?? `http://${parsed.host}:${effectivePort}`;
504
507
  const settingsUrl = `${baseUrlForCard}/settings`;
508
+ // ggui#1167 — `--no-console` (or `GGUI_NO_CONSOLE=1` / `true`, the env twin a
509
+ // supervisor sets without touching argv): serve no operator console.
510
+ // Resolved before the key probe because the no-credentials card points
511
+ // at the console's `/settings`, which this mode does not serve.
512
+ const envNoConsole = process.env['GGUI_NO_CONSOLE']?.trim();
513
+ const noConsole = parsed.noConsole || envNoConsole === '1' || envNoConsole === 'true';
505
514
  // No-credentials cards live for an hour from mint — long enough for
506
515
  // the operator to follow the Connect-Claude link, paste a key, and
507
516
  // re-prompt before the persisted GguiSession is GC'd.
@@ -544,11 +553,12 @@ async function runServeCommand(args) {
544
553
  // fall back to an empty one so the generator has a valid
545
554
  // `blueprints` dep regardless of manifest state.
546
555
  const blueprintsForGen = blueprintProvider ?? new InMemoryBlueprintProvider();
547
- generationBinding = await probeGenerationBinding({
548
- resolver: createByokResolver({ localCliLogin: parsed.localCliLogin }),
549
- blueprints: blueprintsForGen,
550
- ...(configuredRoute ? { configuredRoute } : {}),
551
- onNoCredentials: (ctx, story) => {
556
+ // Without a console there is no `/settings` page for the card to link
557
+ // to, so under `--no-console` a key-less render fails with
558
+ // NO_CREDENTIALS instead (ggui#1167).
559
+ const onNoCredentials = noConsole
560
+ ? undefined
561
+ : (ctx, story) => {
552
562
  const nowEpochMs = Date.parse(story.nowIso);
553
563
  return buildNoCredentialsGguiSession({
554
564
  sessionId: story.sessionId,
@@ -558,7 +568,12 @@ async function runServeCommand(args) {
558
568
  expiresAt: nowEpochMs + NO_CREDENTIALS_CARD_TTL_MS,
559
569
  settingsUrl,
560
570
  });
561
- },
571
+ };
572
+ generationBinding = await probeGenerationBinding({
573
+ resolver: createByokResolver({ localCliLogin: parsed.localCliLogin }),
574
+ blueprints: blueprintsForGen,
575
+ ...(configuredRoute ? { configuredRoute } : {}),
576
+ ...(onNoCredentials ? { onNoCredentials } : {}),
562
577
  });
563
578
  }
564
579
  catch (err) {
@@ -590,13 +605,13 @@ async function runServeCommand(args) {
590
605
  ` {\n` +
591
606
  ` "schema": "1",\n` +
592
607
  ` "generation": {\n` +
593
- ` "model": "${generationBinding.provider}:${DEFAULT_ROUTE_BY_PROVIDER[generationBinding.provider].model}"\n` +
608
+ ` "model": "${generationBinding.provider}:${ZERO_CONFIG_ROUTE_BY_PROVIDER[generationBinding.provider].model}"\n` +
594
609
  ` }\n` +
595
610
  ` }\n` +
596
611
  `\n` +
597
612
  `Accepted forms:\n` +
598
- ` - canonical: "anthropic:claude-haiku-4-5-20251001"\n` +
599
- ` - LiteLLM: "anthropic/claude-haiku-4-5"\n` +
613
+ ` - canonical: "anthropic:claude-haiku-5-5"\n` +
614
+ ` - LiteLLM: "anthropic/claude-haiku-5-5"\n` +
600
615
  `\n` +
601
616
  `See docs/principles/model-string-convention.md.\n`);
602
617
  return 1;
@@ -636,6 +651,7 @@ async function runServeCommand(args) {
636
651
  host: parsed.host,
637
652
  mcpOnly: parsed.mcpOnly,
638
653
  devAllowAll: parsed.devAllowAll,
654
+ noConsole,
639
655
  withholdResultMeta: parsed.withholdResultMeta,
640
656
  publicDemo: parsed.publicDemo,
641
657
  multiUser: parsed.multiUser,
@@ -658,6 +674,7 @@ async function runServeCommand(args) {
658
674
  publicDemo: parsed.publicDemo,
659
675
  multiUser: parsed.multiUser,
660
676
  oauth: parsed.oauth,
677
+ ...(noConsole ? { noConsole: true } : {}),
661
678
  ...(parsed.publicBaseUrl !== undefined
662
679
  ? { publicBaseUrl: parsed.publicBaseUrl }
663
680
  : {}),
@@ -19,8 +19,9 @@
19
19
  * key via `/settings`, the resolver picks it up on the next
20
20
  * `ggui_render`.
21
21
  * 3. **No-key default** — when the boot scan finds nothing, we
22
- * STILL return a binding (provider=`anthropic`, model=
23
- * `claude-haiku-4-5`). Generation stays wired; the
22
+ * STILL return a binding: the Anthropic row of
23
+ * `ZERO_CONFIG_ROUTE_BY_PROVIDER` from `@ggui-ai/protocol`, which
24
+ * is the open-source default. Generation stays wired; the
24
25
  * no-credentials path now produces a Connect-Claude card
25
26
  * render via {@link GenerationDeps.onNoCredentials}
26
27
  * instead of the broken `codeReady:false` placeholder.
@@ -42,28 +43,6 @@
42
43
  */
43
44
  import type { BlueprintProvider, GenerationDeps, HandlerContext, LlmProvider, LlmRoute, GguiSession } from '@ggui-ai/mcp-server';
44
45
  import type { ByokKeyResolution, ByokResolver } from './byok-resolver.js';
45
- /**
46
- * Locked default model per provider for the OSS first-run path.
47
- *
48
- * These are the "sensible default for an operator who exported
49
- * `ANTHROPIC_API_KEY` without thinking about which model" — NOT
50
- * benchmark-tuned recommendations. A later slice wires
51
- * `ggui.json#generation.model` so operators can pick explicitly;
52
- * until then these keep the zero-config path honest.
53
- *
54
- * Notably absent: `bedrock`. AWS credentials flow through the SDK
55
- * chain, which the OSS BYOK resolver doesn't cover — the hosted runtime
56
- * binds Bedrock through its own `GenerationDeps` at the hosted
57
- * surface.
58
- */
59
- /**
60
- * Locked default route per provider, as a typed {@link LlmRoute}.
61
- * Model strings are bare wire-canonical IDs (registry KEY ==
62
- * what the provider's API expects on the wire) — there is no
63
- * transformation step downstream. `dispatchGeneration` sends
64
- * `route.model` verbatim.
65
- */
66
- export declare const DEFAULT_ROUTE_BY_PROVIDER: Readonly<Record<Exclude<LlmProvider, 'bedrock'>, LlmRoute>>;
67
46
  /**
68
47
  * Priority order for BYOK provider probing. The first provider
69
48
  * whose credentials resolve wins. Anthropic first is deliberate —
@@ -125,7 +104,7 @@ export interface ProbeGenerationBindingOptions {
125
104
  * - `configuredRoute.provider` becomes the boot-scan provider
126
105
  * (overriding the priority chain).
127
106
  * - `configuredRoute.model` is what flows to the dispatch path
128
- * (overriding `DEFAULT_ROUTE_BY_PROVIDER[provider]`).
107
+ * (overriding `ZERO_CONFIG_ROUTE_BY_PROVIDER[provider]` from `@ggui-ai/protocol`).
129
108
  *
130
109
  * Absent → fall back to today's behavior: walk the priority chain,
131
110
  * use the per-provider default. The CLI hard-fails BEFORE reaching
@@ -1 +1 @@
1
- {"version":3,"file":"generation-probe.d.ts","sourceRoot":"","sources":["../src/generation-probe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generation-probe.d.ts","sourceRoot":"","sources":["../src/generation-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,WAAW,EACX,QAAQ,EAGR,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACb,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,EAC1B,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,MAAM,4BAA4B,GACpC;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,UAAU,CAAA;CAAE,GACzF;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC9C,GAAG,4BAA4B,CAW/B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,kEAAkE;IAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC;IACpE;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC;IACpC;;;;;;;OAOG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,CACzB,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE;QACL,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,KACE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACvD;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACjD,qEAAqE;IACrE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,0FAA0F;IAC1F,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClD;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CA2F5B;AAiBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,iBAAiB,GACzB,MAAM,CAUR"}
@@ -1,32 +1,5 @@
1
- import { parseAnyLlmRoute } from '@ggui-ai/protocol';
1
+ import { parseAnyLlmRoute, ZERO_CONFIG_ROUTE_BY_PROVIDER } from '@ggui-ai/protocol';
2
2
  import { createUiGenerator } from '@ggui-ai/ui-gen';
3
- /**
4
- * Locked default model per provider for the OSS first-run path.
5
- *
6
- * These are the "sensible default for an operator who exported
7
- * `ANTHROPIC_API_KEY` without thinking about which model" — NOT
8
- * benchmark-tuned recommendations. A later slice wires
9
- * `ggui.json#generation.model` so operators can pick explicitly;
10
- * until then these keep the zero-config path honest.
11
- *
12
- * Notably absent: `bedrock`. AWS credentials flow through the SDK
13
- * chain, which the OSS BYOK resolver doesn't cover — the hosted runtime
14
- * binds Bedrock through its own `GenerationDeps` at the hosted
15
- * surface.
16
- */
17
- /**
18
- * Locked default route per provider, as a typed {@link LlmRoute}.
19
- * Model strings are bare wire-canonical IDs (registry KEY ==
20
- * what the provider's API expects on the wire) — there is no
21
- * transformation step downstream. `dispatchGeneration` sends
22
- * `route.model` verbatim.
23
- */
24
- export const DEFAULT_ROUTE_BY_PROVIDER = {
25
- anthropic: { provider: 'anthropic', model: 'claude-haiku-4-5-20251001' },
26
- openai: { provider: 'openai', model: 'gpt-5.6-luna' },
27
- google: { provider: 'google', model: 'gemini-3.5-flash-lite' },
28
- openrouter: { provider: 'openrouter', model: 'anthropic/claude-haiku-4.5' },
29
- };
30
3
  /**
31
4
  * Priority order for BYOK provider probing. The first provider
32
5
  * whose credentials resolve wins. Anthropic first is deliberate —
@@ -110,7 +83,7 @@ export async function probeGenerationBinding(opts) {
110
83
  const defaultProvider = configured && configured.provider !== 'bedrock'
111
84
  ? configured.provider
112
85
  : bootHit?.provider ?? 'anthropic';
113
- const defaultRoute = configured ?? DEFAULT_ROUTE_BY_PROVIDER[defaultProvider];
86
+ const defaultRoute = configured ?? ZERO_CONFIG_ROUTE_BY_PROVIDER[defaultProvider];
114
87
  const defaultModel = defaultRoute.model;
115
88
  // Full-harness wire-up: `createUiGenerator` runs the same
116
89
  // multi-turn coding agent + self-check loop the bench validates;
@@ -305,6 +305,13 @@ export interface BuildMcpServerBackendOptions {
305
305
  * Surface = `--admin-token <token>` CLI flag.
306
306
  */
307
307
  readonly adminToken?: string;
308
+ /**
309
+ * ggui#1167 — serve no operator console. The `console` option is not
310
+ * passed to `createGguiServer`, so no console route is mounted and no
311
+ * admin token is minted (`adminToken` is `null`). Surface =
312
+ * `--no-console` / `GGUI_NO_CONSOLE=1`.
313
+ */
314
+ readonly noConsole?: boolean;
308
315
  /**
309
316
  * Server-rendered public welcome page at `/`. Identifies who runs
310
317
  * the server (operator block, hidden when nothing configured)
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-backend.d.ts","sourceRoot":"","sources":["../src/mcp-backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-backend.d.ts","sourceRoot":"","sources":["../src/mcp-backend.ts"],"names":[],"mappings":"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"}
@@ -472,38 +472,44 @@ export function buildMcpServerBackend(opts) {
472
472
  // field; flag flips on `oauth: true` defaults (in-memory storage,
473
473
  // built-in paste-key consent page).
474
474
  ...(opts.oauth ? { oauth: true } : {}),
475
- console: {
476
- sessionCookie: true,
477
- ...(opts.adminToken !== undefined ? { adminToken: opts.adminToken } : {}),
478
- // First-run onboarding redirect. When neither the credentials
479
- // file (`~/.ggui/credentials.json`) nor any provider env var
480
- // (ANTHROPIC_API_KEY / OPENAI_API_KEY / GOOGLE_API_KEY /
481
- // OPENROUTER_API_KEY) is present, send `GET /` to the
482
- // **admin** onboarding flow — the operator running `ggui serve`
483
- // IS the admin on first-run, so they need the operator-key
484
- // plane (`/admin/llm-keys`) and the assistant-connection card
485
- // surfaced there. Cookie-gated end-user `/settings` is for a
486
- // *separate* user paired with the server later, not the
487
- // first-run operator. Once any key is configured, the next
488
- // visit serves the SPA normally. Scoped to the root path;
489
- // deep links bypass the redirect.
490
- landingRedirect: () => {
491
- try {
492
- const credsFileExists = existsSync(getCredentialsFile());
493
- const anyEnvKey = !!process.env.ANTHROPIC_API_KEY ||
494
- !!process.env.OPENAI_API_KEY ||
495
- !!process.env.GOOGLE_API_KEY ||
496
- !!process.env.OPENROUTER_API_KEY;
497
- if (!credsFileExists && !anyEnvKey) {
498
- return "/admin-login?next=%2Fadmin%2Fllm-keys";
499
- }
500
- return null;
501
- }
502
- catch {
503
- return null;
504
- }
505
- },
506
- },
475
+ // ggui#1167 — `--no-console` mounts no console and so mints no admin
476
+ // token: the server is an MCP endpoint only, with no operator bearer.
477
+ ...(opts.noConsole
478
+ ? {}
479
+ : {
480
+ console: {
481
+ sessionCookie: true,
482
+ ...(opts.adminToken !== undefined ? { adminToken: opts.adminToken } : {}),
483
+ // First-run onboarding redirect. When neither the credentials
484
+ // file (`~/.ggui/credentials.json`) nor any provider env var
485
+ // (ANTHROPIC_API_KEY / OPENAI_API_KEY / GOOGLE_API_KEY /
486
+ // OPENROUTER_API_KEY) is present, send `GET /` to the
487
+ // **admin** onboarding flow — the operator running `ggui serve`
488
+ // IS the admin on first-run, so they need the operator-key
489
+ // plane (`/admin/llm-keys`) and the assistant-connection card
490
+ // surfaced there. Cookie-gated end-user `/settings` is for a
491
+ // *separate* user paired with the server later, not the
492
+ // first-run operator. Once any key is configured, the next
493
+ // visit serves the SPA normally. Scoped to the root path;
494
+ // deep links bypass the redirect.
495
+ landingRedirect: () => {
496
+ try {
497
+ const credsFileExists = existsSync(getCredentialsFile());
498
+ const anyEnvKey = !!process.env.ANTHROPIC_API_KEY ||
499
+ !!process.env.OPENAI_API_KEY ||
500
+ !!process.env.GOOGLE_API_KEY ||
501
+ !!process.env.OPENROUTER_API_KEY;
502
+ if (!credsFileExists && !anyEnvKey) {
503
+ return "/admin-login?next=%2Fadmin%2Fllm-keys";
504
+ }
505
+ return null;
506
+ }
507
+ catch {
508
+ return null;
509
+ }
510
+ },
511
+ },
512
+ }),
507
513
  // Public welcome page at `/` — operator identification + public
508
514
  // deep-link surfaces + operator-login affordance. Resolved from
509
515
  // `ggui.json#operator` + `ggui.json#app.name` by serve-command.ts;
@@ -57,6 +57,16 @@ export interface ParsedServeFlags {
57
57
  * warning when this flag is set.
58
58
  */
59
59
  devAllowAll: boolean;
60
+ /**
61
+ * ggui#1167 — serve no operator console. No console routes are
62
+ * mounted and no console admin token is minted, so nothing prints an
63
+ * operator bearer (`admin token →`, `ADMIN_TOKEN`). For a server a
64
+ * tool launches as an MCP endpoint only, where nobody logs in to a
65
+ * console. Env twin: `GGUI_NO_CONSOLE=1`, resolved by the CLI.
66
+ * Independent of `--mcp-only`, which skips agent supervision and
67
+ * still serves the console.
68
+ */
69
+ noConsole: boolean;
60
70
  /**
61
71
  * Override the public base URL used to compose `mcpApps.wsUrl`
62
72
  * and `runtime.url`. Without this, the URLs derive from
@@ -356,6 +366,13 @@ export interface ServeBannerInputs {
356
366
  * returned null (no env var + no credentials-file entry).
357
367
  */
358
368
  readonly noLlmKey?: boolean;
369
+ /**
370
+ * ggui#1167 — the server serves no console (`--no-console`). The
371
+ * banner then advertises no landing page, and a key-less boot names
372
+ * only the env vars to export: there is no `/settings` page and no
373
+ * admin token to point at.
374
+ */
375
+ readonly noConsole?: boolean;
359
376
  /**
360
377
  * Embedding model id surfaced for the local RAG layer. When set,
361
378
  * the banner shows a `rag` line so operators see which model is
@@ -1 +1 @@
1
- {"version":3,"file":"serve-command.d.ts","sourceRoot":"","sources":["../src/serve-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve-command.d.ts","sourceRoot":"","sources":["../src/serve-command.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@ export function parseServeFlags(args) {
23
23
  host: DEFAULT_SERVE_HOST,
24
24
  mcpOnly: false,
25
25
  devAllowAll: false,
26
+ noConsole: false,
26
27
  withholdResultMeta: false,
27
28
  publicDemo: false,
28
29
  multiUser: false,
@@ -60,6 +61,10 @@ export function parseServeFlags(args) {
60
61
  out.mcpOnly = true;
61
62
  continue;
62
63
  }
64
+ if (arg === '--no-console') {
65
+ out.noConsole = true;
66
+ continue;
67
+ }
63
68
  if (arg === '--withhold-result-meta') {
64
69
  out.withholdResultMeta = true;
65
70
  continue;
@@ -214,7 +219,7 @@ export function describeServeBanner(input) {
214
219
  // signal that closes the first-run story. Landing page lives at `/`
215
220
  // by default when `ggui serve` is the entry point (see
216
221
  // `cli.ts::buildMcpServerBackend`).
217
- ` open → ${httpUrl}/`,
222
+ ...(input.noConsole ? [] : [` open → ${httpUrl}/`]),
218
223
  ` mcp → ${httpUrl}/mcp`,
219
224
  ` health → ${httpUrl}/ggui/health`,
220
225
  ` tools → ${input.toolCount} registered`,
@@ -241,7 +246,12 @@ export function describeServeBanner(input) {
241
246
  // both bearers are obvious in the boot banner.
242
247
  lines.push(` admin token → ${input.adminToken} (console /keys gate — paste at /admin-login)`);
243
248
  }
244
- if (input.noLlmKey) {
249
+ if (input.noLlmKey && input.noConsole) {
250
+ // ggui#1167 — no console, so no /settings page and no admin token:
251
+ // the only way to add a key is the environment.
252
+ lines.push(` ⚠ no LLM key configured. export ANTHROPIC_API_KEY /`, ` OPENAI_API_KEY / GOOGLE_API_KEY / OPENROUTER_API_KEY`, ` before re-running.`);
253
+ }
254
+ else if (input.noLlmKey) {
245
255
  // First-run nudge — without an LLM key, ggui_render falls back to
246
256
  // the Connect-Claude card and the iframe never bootstraps. Surface
247
257
  // the /settings URL alongside admin-token so the operator can paste
@@ -408,6 +418,7 @@ export async function runServe(opts) {
408
418
  : {}),
409
419
  ...(backend.adminToken ? { adminToken: backend.adminToken } : {}),
410
420
  ...(opts.noLlmKey ? { noLlmKey: true } : {}),
421
+ ...(opts.flags.noConsole ? { noConsole: true } : {}),
411
422
  ...(backend.embeddingModel ? { embeddingModel: backend.embeddingModel } : {}),
412
423
  ...(opts.flags.browserOrigins.length > 0
413
424
  ? { browserOrigins: opts.flags.browserOrigins }
@@ -419,12 +430,14 @@ export async function runServe(opts) {
419
430
  // to the admin onboarding flow at `/admin-login?next=/admin/llm-keys`,
420
431
  // so the URL bar lands on the right page without the CLI needing
421
432
  // to know which target to pick. Skipped for: `--no-open`, non-TTY
422
- // (CI / supervised / piped), `--mcp-only` (no UI surface to open).
433
+ // (CI / supervised / piped), `--mcp-only` (no UI surface to open),
434
+ // `--no-console` (no console to open, ggui#1167).
423
435
  // Errors are swallowed — the banner already shows the URL so the
424
436
  // operator can copy/paste if launchBrowser fails (xdg-open missing,
425
437
  // etc.).
426
438
  const shouldAutoOpenServe = !opts.flags.noOpen
427
439
  && !opts.flags.mcpOnly
440
+ && !opts.flags.noConsole
428
441
  && opts.stdout === process.stdout
429
442
  && process.stdout.isTTY === true;
430
443
  if (shouldAutoOpenServe) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ggui-ai/cli",
3
- "version": "0.27.0",
4
- "description": "The `ggui` CLI — run the ggui protocol locally: dev server, self-hosted MCP server, and gadget / blueprint authoring. End-to-end OSS and self-hosted workflows; no account required.",
3
+ "version": "0.28.0",
4
+ "description": "The `ggui` CLI — run the GGUI protocol locally: dev server, self-hosted MCP server, and gadget / blueprint authoring. End-to-end OSS and self-hosted workflows; no account required.",
5
5
  "keywords": [
6
6
  "ggui",
7
7
  "cli",
@@ -37,22 +37,22 @@
37
37
  "@noble/hashes": "^1.6.0",
38
38
  "esbuild": "^0.28.2",
39
39
  "zod": "^4.3.6",
40
- "@ggui-ai/agent-runtime": "0.27.0",
41
- "@ggui-ai/artifact-manifest": "0.27.0",
42
- "@ggui-ai/dev-stack": "0.27.0",
43
- "@ggui-ai/design": "0.27.0",
44
- "@ggui-ai/gadget-signing": "0.27.0",
45
- "@ggui-ai/mcp-server": "0.27.0",
46
- "@ggui-ai/project-config": "0.27.0",
47
- "@ggui-ai/preview-a2ui": "0.27.0",
48
- "@ggui-ai/protocol": "0.27.0",
49
- "@ggui-ai/registry-core": "0.27.0",
50
- "@ggui-ai/embedding-local": "0.27.0",
51
- "@ggui-ai/mcp-server-handlers": "0.27.0",
52
- "@ggui-ai/iframe-runtime": "0.27.0",
53
- "@ggui-ai/ui-gen": "0.27.0",
54
- "@ggui-ai/ui-registry": "0.27.0",
55
- "@ggui-ai/mcp-server-core": "0.27.0"
40
+ "@ggui-ai/agent-runtime": "0.28.0",
41
+ "@ggui-ai/artifact-manifest": "0.28.0",
42
+ "@ggui-ai/design": "0.28.0",
43
+ "@ggui-ai/gadget-signing": "0.28.0",
44
+ "@ggui-ai/dev-stack": "0.28.0",
45
+ "@ggui-ai/embedding-local": "0.28.0",
46
+ "@ggui-ai/mcp-server": "0.28.0",
47
+ "@ggui-ai/mcp-server-core": "0.28.0",
48
+ "@ggui-ai/mcp-server-handlers": "0.28.0",
49
+ "@ggui-ai/project-config": "0.28.0",
50
+ "@ggui-ai/protocol": "0.28.0",
51
+ "@ggui-ai/registry-core": "0.28.0",
52
+ "@ggui-ai/iframe-runtime": "0.28.0",
53
+ "@ggui-ai/preview-a2ui": "0.28.0",
54
+ "@ggui-ai/ui-gen": "0.28.0",
55
+ "@ggui-ai/ui-registry": "0.28.0"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/node": "^24.0.0",