@ggui-ai/cli 0.28.0 → 0.29.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 +10 -3
- package/dist/config-push.js +1 -1
- package/dist/internal/ggui-json.js +1 -1
- package/dist/local-cli-login-sdk.d.ts +18 -0
- package/dist/local-cli-login-sdk.d.ts.map +1 -0
- package/dist/local-cli-login-sdk.js +27 -0
- package/dist/mcp-backend.d.ts +8 -1
- package/dist/mcp-backend.d.ts.map +1 -1
- package/dist/mcp-backend.js +36 -10
- package/dist/persistent-stores.d.ts +13 -2
- package/dist/persistent-stores.d.ts.map +1 -1
- package/dist/persistent-stores.js +15 -5
- package/dist/provider-key-command.js +1 -1
- package/dist/serve-command.d.ts +1 -1
- package/dist/serve-command.d.ts.map +1 -1
- package/dist/serve-command.js +4 -2
- package/package.json +19 -19
package/dist/cli.js
CHANGED
|
@@ -27,7 +27,7 @@ import { buildSeedPool } from '@ggui-ai/mcp-server-handlers';
|
|
|
27
27
|
import { createThemeWriter } from './theme-writer.js';
|
|
28
28
|
import { createThemeFileUploader } from './theme-file-uploader.js';
|
|
29
29
|
import { getPersistentDir } from './paths.js';
|
|
30
|
-
import {
|
|
30
|
+
import { createPersistentVectorStores, layerPersistentSessionStores, } from './persistent-stores.js';
|
|
31
31
|
import { parseServeFlags, runServe, SERVE_HELP, } from './serve-command.js';
|
|
32
32
|
import { runLoginCommand } from './auth-login.js';
|
|
33
33
|
import { runLogoutCommand } from './auth-logout.js';
|
|
@@ -41,6 +41,7 @@ import { runCreateCommand } from './create-app-command.js';
|
|
|
41
41
|
import { runPushCommand } from './push-command.js';
|
|
42
42
|
import { runDeployCommand } from './deploy-command.js';
|
|
43
43
|
import { runProviderKeyCommand } from './provider-key-command.js';
|
|
44
|
+
import { localCliLoginSdkWarning } from './local-cli-login-sdk.js';
|
|
44
45
|
const HELP = `ggui — open CLI for the ggui protocol
|
|
45
46
|
|
|
46
47
|
Usage:
|
|
@@ -313,8 +314,8 @@ async function runServeCommand(args) {
|
|
|
313
314
|
}
|
|
314
315
|
if (!manifestDeclaresVectors && storage.vectors === undefined) {
|
|
315
316
|
try {
|
|
316
|
-
const vectors = await
|
|
317
|
-
storage = { ...storage, vectors };
|
|
317
|
+
const { vectors, index } = await createPersistentVectorStores(persistentDir);
|
|
318
|
+
storage = { ...storage, vectors, index };
|
|
318
319
|
}
|
|
319
320
|
catch (err) {
|
|
320
321
|
process.stderr.write(`ggui serve: persistent vector store unavailable — using in-memory `
|
|
@@ -622,6 +623,12 @@ async function runServeCommand(args) {
|
|
|
622
623
|
if (parsed.localCliLogin && generationBinding.provider !== 'anthropic') {
|
|
623
624
|
process.stderr.write(`ggui serve: --local-cli-login covers anthropic routes only; this server generates on ${generationBinding.provider}, so the flag has no effect.\n`);
|
|
624
625
|
}
|
|
626
|
+
else if (parsed.localCliLogin) {
|
|
627
|
+
// ggui#1951: the login route runs on an optional peer; say so at boot.
|
|
628
|
+
const sdkWarning = await localCliLoginSdkWarning();
|
|
629
|
+
if (sdkWarning !== undefined)
|
|
630
|
+
process.stderr.write(sdkWarning);
|
|
631
|
+
}
|
|
625
632
|
// Build seed pools from --seed-pool flags BEFORE composing the backend
|
|
626
633
|
// factory. `buildSeedPool` is async (reads + indexes the directory
|
|
627
634
|
// artifact) so it must run here in the async outer scope rather than
|
package/dist/config-push.js
CHANGED
|
@@ -10,7 +10,7 @@ import process from 'node:process';
|
|
|
10
10
|
import { dirname } from 'node:path';
|
|
11
11
|
import { appPublicEnvSchema, appThemeSchema, canonicalOverlayHash, LOOPBACK_HOST_RE, } from '@ggui-ai/protocol';
|
|
12
12
|
import { loadTheme, parseGguiJson } from '@ggui-ai/project-config/node';
|
|
13
|
-
import
|
|
13
|
+
import * as z from 'zod';
|
|
14
14
|
import { patchAppConfig } from './api-client.js';
|
|
15
15
|
import { findGguiJson, readGadgetsFromGguiJson, readGguiJson, } from './internal/ggui-json.js';
|
|
16
16
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import { existsSync, readFileSync, writeFileSync, } from 'node:fs';
|
|
18
18
|
import { dirname, join, resolve } from 'node:path';
|
|
19
19
|
import { strictGadgetDescriptorSchema, } from '@ggui-ai/protocol';
|
|
20
|
-
import
|
|
20
|
+
import * as z from 'zod';
|
|
21
21
|
/** Canonical filename — duplicated from `@ggui-ai/project-config` so
|
|
22
22
|
* this helper stays free of that dependency. The constant lives in one
|
|
23
23
|
* place per package; updates ride along on a project-config bump. */
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--local-cli-login` generates through the Claude Agent SDK, which
|
|
3
|
+
* `@ggui-ai/ui-gen` declares as an optional peer (ggui#1951): its
|
|
4
|
+
* native binary is about 300 MB, so a plain `@ggui-ai/cli` install
|
|
5
|
+
* does not carry it. `ggui serve` checks at boot and warns with the
|
|
6
|
+
* install lines, instead of letting the first generation on the login
|
|
7
|
+
* route be the one that finds out.
|
|
8
|
+
*
|
|
9
|
+
* A warning, not a refusal: the login route only runs when no Anthropic
|
|
10
|
+
* key resolves, so a server with a key never needs the SDK.
|
|
11
|
+
*/
|
|
12
|
+
import { ensureClaudeAgentSdk } from '@ggui-ai/ui-gen';
|
|
13
|
+
/**
|
|
14
|
+
* The boot warning for a missing SDK, or `undefined` when it loads.
|
|
15
|
+
* Any other load failure rejects unchanged. `check` is for tests.
|
|
16
|
+
*/
|
|
17
|
+
export declare function localCliLoginSdkWarning(check?: typeof ensureClaudeAgentSdk): Promise<string | undefined>;
|
|
18
|
+
//# sourceMappingURL=local-cli-login-sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-cli-login-sdk.d.ts","sourceRoot":"","sources":["../src/local-cli-login-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAA8B,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEnF;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,GAAE,OAAO,oBAA2C,GACxD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ7B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--local-cli-login` generates through the Claude Agent SDK, which
|
|
3
|
+
* `@ggui-ai/ui-gen` declares as an optional peer (ggui#1951): its
|
|
4
|
+
* native binary is about 300 MB, so a plain `@ggui-ai/cli` install
|
|
5
|
+
* does not carry it. `ggui serve` checks at boot and warns with the
|
|
6
|
+
* install lines, instead of letting the first generation on the login
|
|
7
|
+
* route be the one that finds out.
|
|
8
|
+
*
|
|
9
|
+
* A warning, not a refusal: the login route only runs when no Anthropic
|
|
10
|
+
* key resolves, so a server with a key never needs the SDK.
|
|
11
|
+
*/
|
|
12
|
+
import { ClaudeAgentSdkMissingError, ensureClaudeAgentSdk } from '@ggui-ai/ui-gen';
|
|
13
|
+
/**
|
|
14
|
+
* The boot warning for a missing SDK, or `undefined` when it loads.
|
|
15
|
+
* Any other load failure rejects unchanged. `check` is for tests.
|
|
16
|
+
*/
|
|
17
|
+
export async function localCliLoginSdkWarning(check = ensureClaudeAgentSdk) {
|
|
18
|
+
try {
|
|
19
|
+
await check();
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
if (!(err instanceof ClaudeAgentSdkMissingError))
|
|
24
|
+
throw err;
|
|
25
|
+
return `ggui serve: --local-cli-login generates through the Claude Agent SDK. ${err.message}\n`;
|
|
26
|
+
}
|
|
27
|
+
}
|
package/dist/mcp-backend.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type BlueprintProvider, type DiscoveredPrimitiveCatalog, type GadgetDescriptor, type GenerationDeps, type LoadedTheme, type McpServerMount, type McpUiDisplayMode, type OperatorConfig, type ResolvedStorageStores, type ShortCodeIndex, type ThemeFileUploader, type ThemeWriter } from "@ggui-ai/mcp-server";
|
|
2
|
-
import { type BlueprintPool } from "@ggui-ai/mcp-server-handlers/renders";
|
|
2
|
+
import { type BlueprintPool, type InstalledBlueprintsProvider } from "@ggui-ai/mcp-server-handlers/renders";
|
|
3
3
|
import type { ThemeConfig, UiManifest } from "@ggui-ai/project-config";
|
|
4
4
|
import type { UiRegistry } from "@ggui-ai/ui-registry";
|
|
5
5
|
import type { ServeBackend } from "./serve-command.js";
|
|
@@ -359,6 +359,13 @@ export interface BuildMcpServerBackendOptions {
|
|
|
359
359
|
*/
|
|
360
360
|
readonly defaultDisplayMode?: McpUiDisplayMode;
|
|
361
361
|
}
|
|
362
|
+
/**
|
|
363
|
+
* Await the install walks still in flight on `provider`, for at most
|
|
364
|
+
* `withinMs`. Resolves either way and never rejects (`drain()` never does);
|
|
365
|
+
* the timer is unref'd, so it never holds the process open on its own. No
|
|
366
|
+
* provider (no installed blueprints) resolves at once.
|
|
367
|
+
*/
|
|
368
|
+
export declare function drainWithin(provider: Pick<InstalledBlueprintsProvider, "drain"> | undefined, withinMs: number): Promise<void>;
|
|
362
369
|
/**
|
|
363
370
|
* Pick a free localhost TCP port by letting the OS assign one on a
|
|
364
371
|
* throwaway listener. Close the listener immediately and return the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-backend.d.ts","sourceRoot":"","sources":["../src/mcp-backend.ts"],"names":[],"mappings":"AA0CA,OAAO,EAQL,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"mcp-backend.d.ts","sourceRoot":"","sources":["../src/mcp-backend.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-backend.js
CHANGED
|
@@ -40,7 +40,7 @@ import { listThemes } from "@ggui-ai/design/themes";
|
|
|
40
40
|
import { compileUiOnDemand } from "@ggui-ai/dev-stack";
|
|
41
41
|
import { createLocalEmbeddingProvider } from "@ggui-ai/embedding-local";
|
|
42
42
|
import { RUNTIME_BUNDLE_URL_PATH } from "@ggui-ai/iframe-runtime/server";
|
|
43
|
-
import { createGguiServer, FileSystemCodeStore, FixedWindowRateLimiter, InMemoryAuthAdapter, InMemoryQuotaStore, InMemoryShortCodeIndex, selectEmailSenderFromEnv, } from "@ggui-ai/mcp-server";
|
|
43
|
+
import { createGguiServer, FileSystemCodeStore, FixedWindowRateLimiter, InMemoryAuthAdapter, InMemoryQuotaStore, InMemoryShortCodeIndex, selectEmailSenderFromEnv, DEFAULT_CLOSE_GRACE_MS, } from "@ggui-ai/mcp-server";
|
|
44
44
|
import { InMemoryAppMetadataStore, InMemoryBlueprintIndex, InMemoryVectorStore, } from "@ggui-ai/mcp-server-core/in-memory";
|
|
45
45
|
import { PlaintextFileProviderKeyStore } from "@ggui-ai/mcp-server-core/plaintext";
|
|
46
46
|
import { createInstalledBlueprintsProvider, createStderrCacheTraceSink, installedBlueprintIntent, setCacheTraceSink, } from "@ggui-ai/mcp-server-handlers/renders";
|
|
@@ -50,6 +50,23 @@ import { createServer as createNetServer } from "node:net";
|
|
|
50
50
|
import { join } from "node:path";
|
|
51
51
|
import { getCodeCacheDir, getCredentialsFile, getEmbeddingCacheDir } from "./paths.js";
|
|
52
52
|
import { readOrMintHexSecret } from "./persistent-secrets.js";
|
|
53
|
+
/**
|
|
54
|
+
* Await the install walks still in flight on `provider`, for at most
|
|
55
|
+
* `withinMs`. Resolves either way and never rejects (`drain()` never does);
|
|
56
|
+
* the timer is unref'd, so it never holds the process open on its own. No
|
|
57
|
+
* provider (no installed blueprints) resolves at once.
|
|
58
|
+
*/
|
|
59
|
+
export async function drainWithin(provider, withinMs) {
|
|
60
|
+
if (provider === undefined)
|
|
61
|
+
return;
|
|
62
|
+
let timer;
|
|
63
|
+
const elapsed = new Promise((resolve) => {
|
|
64
|
+
timer = setTimeout(resolve, withinMs);
|
|
65
|
+
timer.unref();
|
|
66
|
+
});
|
|
67
|
+
await Promise.race([provider.drain(), elapsed]);
|
|
68
|
+
clearTimeout(timer);
|
|
69
|
+
}
|
|
53
70
|
/**
|
|
54
71
|
* Pick a free localhost TCP port by letting the OS assign one on a
|
|
55
72
|
* throwaway listener. Close the listener immediately and return the
|
|
@@ -292,14 +309,14 @@ export function buildMcpServerBackend(opts) {
|
|
|
292
309
|
// here on the absent-storage path; threaded back as `vectors` to
|
|
293
310
|
// `createGguiServer` so server + provider share state.
|
|
294
311
|
const vectorStore = storage.vectors ?? new InMemoryVectorStore();
|
|
295
|
-
// Blueprint identity index
|
|
296
|
-
// provider deps and the server
|
|
297
|
-
//
|
|
298
|
-
//
|
|
299
|
-
//
|
|
300
|
-
//
|
|
301
|
-
//
|
|
302
|
-
const blueprintIndex = new InMemoryBlueprintIndex();
|
|
312
|
+
// Blueprint identity index, ONE instance for the install bridge's
|
|
313
|
+
// provider deps and the server (the server's ref-equality guard
|
|
314
|
+
// enforces this, same as `vectorStore`). It persists exactly when the
|
|
315
|
+
// vectors do: storage that persists vectors hands its index beside them
|
|
316
|
+
// (`storage.index`). An in-memory index over persistent vectors comes
|
|
317
|
+
// back empty after every restart, and the install walk then registers
|
|
318
|
+
// each installed blueprint again as a new row (ggui#1907).
|
|
319
|
+
const blueprintIndex = storage.index ?? new InMemoryBlueprintIndex();
|
|
303
320
|
// Construct the marketplace-install bridge BEFORE `createGguiServer`
|
|
304
321
|
// so we can fold it into `opts.generation.installedBlueprints` below.
|
|
305
322
|
// Per design lock (project_slices_5_6_7_plan.md), the provider
|
|
@@ -649,7 +666,16 @@ export function buildMcpServerBackend(opts) {
|
|
|
649
666
|
}
|
|
650
667
|
return addr.port;
|
|
651
668
|
},
|
|
652
|
-
close: () =>
|
|
669
|
+
close: async () => {
|
|
670
|
+
await server.close();
|
|
671
|
+
// A walk can outlive the request that started it, and a persistent
|
|
672
|
+
// index means one cut between a blueprint's vector write and its
|
|
673
|
+
// index write leaves a vector with no binding. Wait for the walks
|
|
674
|
+
// once no request can start a new one (the server is closed), for
|
|
675
|
+
// at most the server's own close grace: past it, the cut is what a
|
|
676
|
+
// stop without a drain would have done (ggui#1907).
|
|
677
|
+
await drainWithin(installedBlueprintsProvider, DEFAULT_CLOSE_GRACE_MS);
|
|
678
|
+
},
|
|
653
679
|
toolCount: server.toolCount,
|
|
654
680
|
serverName: "ggui-mcp-server",
|
|
655
681
|
serverVersion: opts.cliVersion,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { GguiSessionStore, GguiSessionStreamBuffer, VectorStore } from '@ggui-ai/mcp-server-core';
|
|
1
|
+
import type { BlueprintIndex, GguiSessionStore, GguiSessionStreamBuffer, VectorStore } from '@ggui-ai/mcp-server-core';
|
|
2
2
|
import type { ResolvedStorageStores } from '@ggui-ai/mcp-server';
|
|
3
3
|
/** The persistent session store and the live channel's stream buffer, opened together. */
|
|
4
4
|
export interface PersistentSessionStores {
|
|
@@ -26,7 +26,18 @@ export declare function createPersistentSessionStores(persistentDir: string): Pr
|
|
|
26
26
|
* unavailable; the caller falls back to the in-memory defaults.
|
|
27
27
|
*/
|
|
28
28
|
export declare function layerPersistentSessionStores(storage: ResolvedStorageStores, persistentDir: string): Promise<ResolvedStorageStores>;
|
|
29
|
-
|
|
29
|
+
/**
|
|
30
|
+
* `ggui serve`'s persistent layer for blueprints: the vector store and its
|
|
31
|
+
* blueprint identity index, in one `vectors.sqlite`, both or neither. An
|
|
32
|
+
* in-memory index beside persistent vectors comes back empty after every
|
|
33
|
+
* restart, and the install walk then registers each installed blueprint
|
|
34
|
+
* again as a new row (ggui#1907). Throws when SQLite is unavailable; the
|
|
35
|
+
* caller falls back to the in-memory defaults.
|
|
36
|
+
*/
|
|
37
|
+
export declare function createPersistentVectorStores(persistentDir: string): Promise<{
|
|
38
|
+
readonly vectors: VectorStore;
|
|
39
|
+
readonly index: BlueprintIndex;
|
|
40
|
+
}>;
|
|
30
41
|
/**
|
|
31
42
|
* Compute the auto-default `keysFile` path. Returns `undefined` when
|
|
32
43
|
* the caller wants ephemeral pairing (the operator already passed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistent-stores.d.ts","sourceRoot":"","sources":["../src/persistent-stores.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,0FAA0F;AAC1F,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC;CAChD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,6BAA6B,CACjD,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,uBAAuB,CAAC,CAalC;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,qBAAqB,EAC9B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,qBAAqB,CAAC,CAIhC;AAED,wBAAsB,
|
|
1
|
+
{"version":3,"file":"persistent-stores.d.ts","sourceRoot":"","sources":["../src/persistent-stores.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,0FAA0F;AAC1F,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC;CAChD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,6BAA6B,CACjD,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,uBAAuB,CAAC,CAalC;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,qBAAqB,EAC9B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,qBAAqB,CAAC,CAIhC;AAED;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAChD,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAAC,CAU5E;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
|
@@ -54,12 +54,22 @@ export async function layerPersistentSessionStores(storage, persistentDir) {
|
|
|
54
54
|
const { renderStore, streamBuffer } = await createPersistentSessionStores(persistentDir);
|
|
55
55
|
return { ...storage, renderStore, streamBuffer };
|
|
56
56
|
}
|
|
57
|
-
|
|
57
|
+
/**
|
|
58
|
+
* `ggui serve`'s persistent layer for blueprints: the vector store and its
|
|
59
|
+
* blueprint identity index, in one `vectors.sqlite`, both or neither. An
|
|
60
|
+
* in-memory index beside persistent vectors comes back empty after every
|
|
61
|
+
* restart, and the install walk then registers each installed blueprint
|
|
62
|
+
* again as a new row (ggui#1907). Throws when SQLite is unavailable; the
|
|
63
|
+
* caller falls back to the in-memory defaults.
|
|
64
|
+
*/
|
|
65
|
+
export async function createPersistentVectorStores(persistentDir) {
|
|
58
66
|
mkdirSync(persistentDir, { recursive: true });
|
|
59
|
-
const { SqliteVectorStore } = await import('@ggui-ai/mcp-server-core/sqlite');
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
67
|
+
const { SqliteBlueprintIndex, SqliteVectorStore } = await import('@ggui-ai/mcp-server-core/sqlite');
|
|
68
|
+
const filename = join(persistentDir, 'vectors.sqlite');
|
|
69
|
+
return {
|
|
70
|
+
vectors: new SqliteVectorStore({ filename }),
|
|
71
|
+
index: new SqliteBlueprintIndex({ filename }),
|
|
72
|
+
};
|
|
63
73
|
}
|
|
64
74
|
/**
|
|
65
75
|
* Compute the auto-default `keysFile` path. Returns `undefined` when
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
/* eslint-disable no-console */
|
|
12
12
|
import process from 'node:process';
|
|
13
13
|
import { parseAnyLlmRoute } from '@ggui-ai/protocol';
|
|
14
|
-
import
|
|
14
|
+
import * as z from 'zod';
|
|
15
15
|
import { setAppProviderKey } from './api-client.js';
|
|
16
16
|
import { findGguiJson, readGguiJson } from './internal/ggui-json.js';
|
|
17
17
|
// ─────────────────────────────────────────────────────────────────────────────
|
package/dist/serve-command.d.ts
CHANGED
|
@@ -554,5 +554,5 @@ export interface RunServeOptions {
|
|
|
554
554
|
* {@link describeServeBanner} / {@link describeAgentStatus}.
|
|
555
555
|
*/
|
|
556
556
|
export declare function runServe(opts: RunServeOptions): Promise<number>;
|
|
557
|
-
export declare const SERVE_HELP = "ggui serve \u2014 run the open self-hosted personal-mode app\n\nBoots the @ggui-ai/mcp-server binding with persistent defaults AND\n(by default) supervises your agent alongside it. The current MCP\nhandler surface is the blueprint-read family (search / list_featured\n/ render); more tools come online as @ggui-ai/mcp-server-handlers\ngrows.\n\nFirst-run bundle (all on by default):\n - Landing page at / \u2014 operator opens a browser and sees\n server identity + pair-code card.\n - Render viewer at /r/<code> \u2014 same-origin viewer for renders\n minted by ggui_render; same-origin\n HTTP-only cookie authenticates the\n live-channel /ws upgrade.\n - POST /pair + POST /admin/pair/init \u2014 pairing endpoint for MCP\n hosts and third-party clients.\n - Live-channel /ws \u2014 live render plane for MCP Apps\n iframes and the console.\n\nEmbedding hosts that want a different shape (no landing page, no\npairing, programmatic control) should compose createGguiServer()\ndirectly in code rather than invoking `ggui serve`.\n\nUsage:\n ggui serve [options]\n\nOptions:\n --port <n> Bind port (default: 6781, 0 = OS-assigned).\n --host <addr> Bind host (default: 127.0.0.1).\n --mcp-only Run just the MCP server; do not supervise an agent.\n --dev-allow-all Accept any non-empty bearer (incl. no bearer) as\n builder. Local-dev / tunnel smoke ONLY \u2014 never\n expose to the open internet.\n --public-demo Public-facing demo posture: same any-bearer auth\n as --dev-allow-all, plus per-IP rate limit on\n ggui_render (30 generations / 10 min) and a\n \"PUBLIC DEMO \u2014 operator pays\" banner. Mutually\n exclusive with --dev-allow-all.\n --multi-user Multi-user posture: switches the /settings LLM-\n keys gate from admin-token to auth-adapter so\n each authenticated end-user manages their OWN\n key plane (scope = userId/appId). kind:'builder'\n identities are rejected at the gate. Strict-auth\n only; mutually exclusive with --dev-allow-all\n and --public-demo. (Generation-time BYOK still\n resolves at the operator 'global' scope \u2014 a\n follow-up will thread per-user BYOK through\n ggui_render.)\n --local-cli-login Generate with the Claude login already on this\n machine (the one `claude` uses) when no\n ANTHROPIC_API_KEY is set, instead of an API key.\n Anthropic routes only; a real key always wins. Your\n Claude plan's terms and usage limits apply, and\n generation is about 2x slower (2.2x at the median)\n than with an API key. For your own use: refused with\n --multi-user and --public-demo.\n --public-base-url <u> Override the public base URL used to compose\n iframe-runtime + shortCode URLs. Set this to a\n tunnel URL (https://<random>.trycloudflare.com)\n when testing against a remote MCP host so URLs\n resolve from the host's perspective. Without\n this, URLs derive from --host:--port and only\n work from the same machine.\n --browser-origin <o> Allow pages at this origin past MCP-wire Origin\n validation (repeatable; env GGUI_BROWSER_ORIGINS,\n comma-separated). Pages on localhost need no\n entry. NOT authentication \u2014 /mcp still requires\n a bearer. Non-browser clients are unaffected.\n --oauth Mount OAuth 2.1 + PKCE + Dynamic Client\n Registration routes (.well-known/oauth-* +\n /oauth/{authorize,token,register}). Required\n for MCP custom-connector hosts (claude.ai,\n ChatGPT) whose Add Connector form has no field\n for a pre-shared bearer; OAuth lets them do\n a discovery \u2192 DCR \u2192 consent dance ending in\n the same paired bearer the strict-auth flow\n already mints. Pure-bearer clients (Claude\n Desktop with bearer in config) work without it.\n --admin-token <t> Pin the admin bearer that gates the console\n /keys plane (list / mint / revoke pairings +\n /admin-login route). Without this, the server\n mints a fresh ggui_admin_* token per boot and\n prints it on the banner. Pin a stable value\n when you want the bearer to survive restarts\n (e.g. paste once into a password manager).\n --ephemeral Disable cross-restart persistence. Without\n this flag, the HMAC secrets that sign MCP\n Apps bootstrap tokens and signed render URLs\n are read or minted under .ggui/persistent/\n (project-local if a ggui.json was resolved,\n else ~/.ggui/persistent/) so cached tokens\n survive a server restart. Pass this flag to\n keep restarts ephemeral (tests / CI / nuclear-\n revoke). Override the dir via GGUI_PERSISTENT_DIR.\n --seed-pool <dir> Load a read-only shared blueprint pool from a\n directory artifact (repeatable). Blueprints in it\n are reused by exact contract match, after your own.\n --help, -h Show this help.\n\nAgent runtime:\n The default boots your agent alongside MCP. The agent's entry file\n comes from ggui.json:\n\n { \"agent\": { \"entry\": \"./agent.ts\" } }\n\n Supported extensions: .js / .mjs / .cjs (node), .ts / .tsx / .mts\n (node --import=tsx). No ggui.json, or no agent.entry, falls back\n to MCP-only with a warning. Malformed ggui.json or a bad entry\n is a hard error.\n\n Agent crashes after startup are logged; the MCP server keeps\n running. No auto-restart \u2014 compose that with your own supervisor.\n\nPersistent storage (default-on; opt-out via --ephemeral):\n By default `ggui serve` writes a small bundle under .ggui/persistent/\n (project-local if a ggui.json was resolved, else ~/.ggui/persistent/)\n so cached MCP Apps tokens, shortCodes, renders,\n vectors, and paired bearers survive a restart \u2014 claude.ai chat-history\n revisits keep working.\n\n Bundle layout:\n\n .ggui/persistent/\n \u251C\u2500\u2500 ws-token-secret.hex (HMAC, 0600)\n \u251C\u2500\u2500 short-codes.sqlite (signed render-URL resolution)\n \u251C\u2500\u2500 sessions.sqlite (GguiSessionStore \u2014 renders + event history)\n \u251C\u2500\u2500 vectors.sqlite (RAG corpus)\n \u2514\u2500\u2500 keys.json (paired bearers)\n\n Override the dir with `GGUI_PERSISTENT_DIR`. Pass `--ephemeral` to\n skip the bundle entirely (tests, CI loops, nuclear-revoke).\n\n Explicit ggui.json#storage declarations always win \u2014 declare\n `{ \"renders\": { \"driver\": \"memory\" } }` to opt renders back to\n in-memory while keeping other surfaces persistent. Custom sqlite\n paths via ggui.json#storage are honored verbatim:\n\n {\n \"storage\": {\n \"renders\": { \"driver\": \"sqlite\", \"path\": \"./ggui-sessions.sqlite\" },\n \"vectors\": { \"driver\": \"sqlite\", \"path\": \"./ggui-vectors.sqlite\" },\n \"threads\": { \"driver\": \"sqlite\", \"path\": \"./ggui-threads.sqlite\" }\n }\n }\n\n Threads: the persistent-chat route family (/threads) is opt-in.\n Absent `storage.threads` leaves the routes unmounted \u2014 pairs\n with Portal's self-hosted origins only when declared. Driver\n semantics:\n - `driver: \"sqlite\"` \u2014 durable. Threads survive restart.\n /ggui/health reports `threads.durability: \"durable\"`;\n Portal hides its non-durable caveat.\n - `driver: \"memory\"` \u2014 routes mount but data is lost on\n restart. /ggui/health reports `threads.durability:\n \"ephemeral\"`; Portal shows its caveat.\n\n Paths resolve relative to the ggui.json directory. The sqlite\n driver needs `better-sqlite3` installed in your project.\n\nRecommended setups:\n\n Local-only smoke (no tunnel, no remote MCP host):\n ggui serve\n\n claude.ai custom connector (over a public tunnel):\n 1. Tunnel: cloudflared tunnel --url http://localhost:6781\n 2. ggui serve --oauth \\\n --public-base-url https://<tunnel>.trycloudflare.com\n 3. Note PAIR_CODE from boot. Visit the landing page (the public URL\n above), complete pairing, save the bearer.\n 4. claude.ai \u2192 Settings \u2192 Connectors \u2192 Add custom connector.\n URL: https://<tunnel>.trycloudflare.com/mcp\n Client ID / Secret: leave empty (server uses Dynamic Client\n Registration; no pre-shared secret needed).\n 5. Click Connect \u2192 claude.ai redirects you to a paste-key page.\n Paste the bearer from step 3. Done.\n\n Quick local-dev WITHOUT auth (NEVER over a public tunnel):\n ggui serve --dev-allow-all\n\nCurrent limits:\n - Strict-auth only: /mcp rejects any bearer that isn't pair-minted.\n The CLI pre-mints one pairing code on boot (printed as\n `PAIR_CODE <code>` and shown in the banner + on the landing\n page). Complete `POST /pair {code, deviceName}` to receive a\n bearer you can use with MCP. Embed @ggui-ai/mcp-server in your\n own entrypoint to inject a different AuthAdapter (OIDC, Cognito,\n etc.) for production.\n - Single-user: every request scopes to one `builder` app id.\n";
|
|
557
|
+
export declare const SERVE_HELP = "ggui serve \u2014 run the open self-hosted personal-mode app\n\nBoots the @ggui-ai/mcp-server binding with persistent defaults AND\n(by default) supervises your agent alongside it. The current MCP\nhandler surface is the blueprint-read family (search / list_featured\n/ render); more tools come online as @ggui-ai/mcp-server-handlers\ngrows.\n\nFirst-run bundle (all on by default):\n - Landing page at / \u2014 operator opens a browser and sees\n server identity + pair-code card.\n - Render viewer at /r/<code> \u2014 same-origin viewer for renders\n minted by ggui_render; same-origin\n HTTP-only cookie authenticates the\n live-channel /ws upgrade.\n - POST /pair + POST /admin/pair/init \u2014 pairing endpoint for MCP\n hosts and third-party clients.\n - Live-channel /ws \u2014 live render plane for MCP Apps\n iframes and the console.\n\nEmbedding hosts that want a different shape (no landing page, no\npairing, programmatic control) should compose createGguiServer()\ndirectly in code rather than invoking `ggui serve`.\n\nUsage:\n ggui serve [options]\n\nOptions:\n --port <n> Bind port (default: 6781, 0 = OS-assigned).\n --host <addr> Bind host (default: 127.0.0.1).\n --mcp-only Run just the MCP server; do not supervise an agent.\n --dev-allow-all Accept any non-empty bearer (incl. no bearer) as\n builder. Local-dev / tunnel smoke ONLY \u2014 never\n expose to the open internet.\n --public-demo Public-facing demo posture: same any-bearer auth\n as --dev-allow-all, plus per-IP rate limit on\n ggui_render (30 generations / 10 min) and a\n \"PUBLIC DEMO \u2014 operator pays\" banner. Mutually\n exclusive with --dev-allow-all.\n --multi-user Multi-user posture: switches the /settings LLM-\n keys gate from admin-token to auth-adapter so\n each authenticated end-user manages their OWN\n key plane (scope = userId/appId). kind:'builder'\n identities are rejected at the gate. Strict-auth\n only; mutually exclusive with --dev-allow-all\n and --public-demo. (Generation-time BYOK still\n resolves at the operator 'global' scope \u2014 a\n follow-up will thread per-user BYOK through\n ggui_render.)\n --local-cli-login Generate with the Claude login already on this\n machine (the one `claude` uses) when no\n ANTHROPIC_API_KEY is set, instead of an API key.\n Anthropic routes only; a real key always wins. Your\n Claude plan's terms and usage limits apply, and\n generation is about 2x slower (2.2x at the median)\n than with an API key. For your own use: refused with\n --multi-user and --public-demo. Needs\n @anthropic-ai/claude-agent-sdk installed beside\n ggui (not installed with it); boot says how.\n --public-base-url <u> Override the public base URL used to compose\n iframe-runtime + shortCode URLs. Set this to a\n tunnel URL (https://<random>.trycloudflare.com)\n when testing against a remote MCP host so URLs\n resolve from the host's perspective. Without\n this, URLs derive from --host:--port and only\n work from the same machine.\n --browser-origin <o> Allow pages at this origin past MCP-wire Origin\n validation (repeatable; env GGUI_BROWSER_ORIGINS,\n comma-separated). Pages on localhost need no\n entry. NOT authentication \u2014 /mcp still requires\n a bearer. Non-browser clients are unaffected.\n --oauth Mount OAuth 2.1 + PKCE + Dynamic Client\n Registration routes (.well-known/oauth-* +\n /oauth/{authorize,token,register}). Required\n for MCP custom-connector hosts (claude.ai,\n ChatGPT) whose Add Connector form has no field\n for a pre-shared bearer; OAuth lets them do\n a discovery \u2192 DCR \u2192 consent dance ending in\n the same paired bearer the strict-auth flow\n already mints. Pure-bearer clients (Claude\n Desktop with bearer in config) work without it.\n --admin-token <t> Pin the admin bearer that gates the console\n /keys plane (list / mint / revoke pairings +\n /admin-login route). Without this, the server\n mints a fresh ggui_admin_* token per boot and\n prints it on the banner. Pin a stable value\n when you want the bearer to survive restarts\n (e.g. paste once into a password manager).\n --ephemeral Disable cross-restart persistence. Without\n this flag, the HMAC secrets that sign MCP\n Apps bootstrap tokens and signed render URLs\n are read or minted under .ggui/persistent/\n (project-local if a ggui.json was resolved,\n else ~/.ggui/persistent/) so cached tokens\n survive a server restart. Pass this flag to\n keep restarts ephemeral (tests / CI / nuclear-\n revoke). Override the dir via GGUI_PERSISTENT_DIR.\n --seed-pool <dir> Load a read-only shared blueprint pool from a\n directory artifact (repeatable). Blueprints in it\n are reused by exact contract match, after your own.\n --help, -h Show this help.\n\nAgent runtime:\n The default boots your agent alongside MCP. The agent's entry file\n comes from ggui.json:\n\n { \"agent\": { \"entry\": \"./agent.ts\" } }\n\n Supported extensions: .js / .mjs / .cjs (node), .ts / .tsx / .mts\n (node --import=tsx). No ggui.json, or no agent.entry, falls back\n to MCP-only with a warning. Malformed ggui.json or a bad entry\n is a hard error.\n\n Agent crashes after startup are logged; the MCP server keeps\n running. No auto-restart \u2014 compose that with your own supervisor.\n\nPersistent storage (default-on; opt-out via --ephemeral):\n By default `ggui serve` writes a small bundle under .ggui/persistent/\n (project-local if a ggui.json was resolved, else ~/.ggui/persistent/)\n so cached MCP Apps tokens, shortCodes, renders,\n vectors, and paired bearers survive a restart \u2014 claude.ai chat-history\n revisits keep working.\n\n Bundle layout:\n\n .ggui/persistent/\n \u251C\u2500\u2500 ws-token-secret.hex (HMAC, 0600)\n \u251C\u2500\u2500 short-codes.sqlite (signed render-URL resolution)\n \u251C\u2500\u2500 sessions.sqlite (GguiSessionStore \u2014 renders + event history)\n \u251C\u2500\u2500 vectors.sqlite (blueprint cache \u2014 vectors + their identity index)\n \u2514\u2500\u2500 keys.json (paired bearers)\n\n Override the dir with `GGUI_PERSISTENT_DIR`. Pass `--ephemeral` to\n skip the bundle entirely (tests, CI loops, nuclear-revoke).\n\n Explicit ggui.json#storage declarations always win \u2014 declare\n `{ \"renders\": { \"driver\": \"memory\" } }` to opt renders back to\n in-memory while keeping other surfaces persistent. Custom sqlite\n paths via ggui.json#storage are honored verbatim:\n\n {\n \"storage\": {\n \"renders\": { \"driver\": \"sqlite\", \"path\": \"./ggui-sessions.sqlite\" },\n \"vectors\": { \"driver\": \"sqlite\", \"path\": \"./ggui-vectors.sqlite\" },\n \"threads\": { \"driver\": \"sqlite\", \"path\": \"./ggui-threads.sqlite\" }\n }\n }\n\n Threads: the persistent-chat route family (/threads) is opt-in.\n Absent `storage.threads` leaves the routes unmounted \u2014 pairs\n with Portal's self-hosted origins only when declared. Driver\n semantics:\n - `driver: \"sqlite\"` \u2014 durable. Threads survive restart.\n /ggui/health reports `threads.durability: \"durable\"`;\n Portal hides its non-durable caveat.\n - `driver: \"memory\"` \u2014 routes mount but data is lost on\n restart. /ggui/health reports `threads.durability:\n \"ephemeral\"`; Portal shows its caveat.\n\n Paths resolve relative to the ggui.json directory. The sqlite\n driver needs `better-sqlite3` installed in your project.\n\nRecommended setups:\n\n Local-only smoke (no tunnel, no remote MCP host):\n ggui serve\n\n claude.ai custom connector (over a public tunnel):\n 1. Tunnel: cloudflared tunnel --url http://localhost:6781\n 2. ggui serve --oauth \\\n --public-base-url https://<tunnel>.trycloudflare.com\n 3. Note PAIR_CODE from boot. Visit the landing page (the public URL\n above), complete pairing, save the bearer.\n 4. claude.ai \u2192 Settings \u2192 Connectors \u2192 Add custom connector.\n URL: https://<tunnel>.trycloudflare.com/mcp\n Client ID / Secret: leave empty (server uses Dynamic Client\n Registration; no pre-shared secret needed).\n 5. Click Connect \u2192 claude.ai redirects you to a paste-key page.\n Paste the bearer from step 3. Done.\n\n Quick local-dev WITHOUT auth (NEVER over a public tunnel):\n ggui serve --dev-allow-all\n\nCurrent limits:\n - Strict-auth only: /mcp rejects any bearer that isn't pair-minted.\n The CLI pre-mints one pairing code on boot (printed as\n `PAIR_CODE <code>` and shown in the banner + on the landing\n page). Complete `POST /pair {code, deviceName}` to receive a\n bearer you can use with MCP. Embed @ggui-ai/mcp-server in your\n own entrypoint to inject a different AuthAdapter (OIDC, Cognito,\n etc.) for production.\n - Single-user: every request scopes to one `builder` app id.\n";
|
|
558
558
|
//# sourceMappingURL=serve-command.d.ts.map
|
|
@@ -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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"}
|
package/dist/serve-command.js
CHANGED
|
@@ -534,7 +534,9 @@ Options:
|
|
|
534
534
|
Claude plan's terms and usage limits apply, and
|
|
535
535
|
generation is about 2x slower (2.2x at the median)
|
|
536
536
|
than with an API key. For your own use: refused with
|
|
537
|
-
--multi-user and --public-demo.
|
|
537
|
+
--multi-user and --public-demo. Needs
|
|
538
|
+
@anthropic-ai/claude-agent-sdk installed beside
|
|
539
|
+
ggui (not installed with it); boot says how.
|
|
538
540
|
--public-base-url <u> Override the public base URL used to compose
|
|
539
541
|
iframe-runtime + shortCode URLs. Set this to a
|
|
540
542
|
tunnel URL (https://<random>.trycloudflare.com)
|
|
@@ -605,7 +607,7 @@ Persistent storage (default-on; opt-out via --ephemeral):
|
|
|
605
607
|
├── ws-token-secret.hex (HMAC, 0600)
|
|
606
608
|
├── short-codes.sqlite (signed render-URL resolution)
|
|
607
609
|
├── sessions.sqlite (GguiSessionStore — renders + event history)
|
|
608
|
-
├── vectors.sqlite (
|
|
610
|
+
├── vectors.sqlite (blueprint cache — vectors + their identity index)
|
|
609
611
|
└── keys.json (paired bearers)
|
|
610
612
|
|
|
611
613
|
Override the dir with \`GGUI_PERSISTENT_DIR\`. Pass \`--ephemeral\` to
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ggui-ai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
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",
|
|
@@ -36,28 +36,28 @@
|
|
|
36
36
|
"@huggingface/transformers": "^3.0.0",
|
|
37
37
|
"@noble/hashes": "^1.6.0",
|
|
38
38
|
"esbuild": "^0.28.2",
|
|
39
|
-
"zod": "^4.
|
|
40
|
-
"@ggui-ai/
|
|
41
|
-
"@ggui-ai/
|
|
42
|
-
"@ggui-ai/
|
|
43
|
-
"@ggui-ai/
|
|
44
|
-
"@ggui-ai/
|
|
45
|
-
"@ggui-ai/
|
|
46
|
-
"@ggui-ai/mcp-server": "0.
|
|
47
|
-
"@ggui-ai/
|
|
48
|
-
"@ggui-ai/
|
|
49
|
-
"@ggui-ai/
|
|
50
|
-
"@ggui-ai/protocol": "0.
|
|
51
|
-
"@ggui-ai/
|
|
52
|
-
"@ggui-ai/iframe-runtime": "0.
|
|
53
|
-
"@ggui-ai/
|
|
54
|
-
"@ggui-ai/ui-
|
|
55
|
-
"@ggui-ai/ui-
|
|
39
|
+
"zod": "^4.6.6",
|
|
40
|
+
"@ggui-ai/dev-stack": "0.29.0",
|
|
41
|
+
"@ggui-ai/gadget-signing": "0.29.0",
|
|
42
|
+
"@ggui-ai/agent-runtime": "0.29.0",
|
|
43
|
+
"@ggui-ai/embedding-local": "0.29.0",
|
|
44
|
+
"@ggui-ai/artifact-manifest": "0.29.0",
|
|
45
|
+
"@ggui-ai/design": "0.29.0",
|
|
46
|
+
"@ggui-ai/mcp-server-handlers": "0.29.0",
|
|
47
|
+
"@ggui-ai/project-config": "0.29.0",
|
|
48
|
+
"@ggui-ai/preview-a2ui": "0.29.0",
|
|
49
|
+
"@ggui-ai/mcp-server-core": "0.29.0",
|
|
50
|
+
"@ggui-ai/protocol": "0.29.0",
|
|
51
|
+
"@ggui-ai/mcp-server": "0.29.0",
|
|
52
|
+
"@ggui-ai/iframe-runtime": "0.29.0",
|
|
53
|
+
"@ggui-ai/registry-core": "0.29.0",
|
|
54
|
+
"@ggui-ai/ui-registry": "0.29.0",
|
|
55
|
+
"@ggui-ai/ui-gen": "0.29.0"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@types/node": "^24.0.0",
|
|
59
59
|
"typescript": "^5.0.0",
|
|
60
|
-
"vitest": "^
|
|
60
|
+
"vitest": "^4.1.11"
|
|
61
61
|
},
|
|
62
62
|
"repository": {
|
|
63
63
|
"type": "git",
|